diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index a12d3537..28d3f4e9 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -26,13 +26,13 @@ jobs: uses: actions/checkout@master - name: Install scarb - run: curl --proto '=https' --tlsv1.2 -sSf https://docs.swmansion.com/scarb/install.sh | sh -s -- -v 2.6.5 + run: curl --proto '=https' --tlsv1.2 -sSf https://docs.swmansion.com/scarb/install.sh | sh -s -- -v 2.8.2 - name: Install snfoundryup run: curl -L https://raw.githubusercontent.com/foundry-rs/starknet-foundry/master/scripts/install.sh | sh - name: Install snforge - run: snfoundryup -v 0.27.0 + run: snfoundryup -v 0.30.0 - name: Run snforge tests run: snforge test @@ -60,6 +60,10 @@ jobs: run: yarn next:check-types working-directory: ./packages/nextjs + - name: Run Next.js tests + run: yarn test run + working-directory: ./packages/nextjs + - name: Build Next.js project run: yarn build working-directory: ./packages/nextjs diff --git a/.tool-versions b/.tool-versions new file mode 100644 index 00000000..66f521a6 --- /dev/null +++ b/.tool-versions @@ -0,0 +1,3 @@ +scarb 2.8.2 +starknet-foundry 0.30.0 +starknet-devnet 0.2.0 diff --git a/README.md b/README.md index 107e8f7d..c27a7b1f 100644 --- a/README.md +++ b/README.md @@ -22,13 +22,25 @@ Before you begin, you need to install the following tools: - [asdf](https://asdf-vm.com/guide/getting-started.html) - [Cairo 1.0 extension for VSCode](https://marketplace.visualstudio.com/items?itemName=starkware.cairo1) +### Starknet-devnet version + +To ensure the proper functioning of scaffold-stark, your local `starknet-devnet` version must be `0.2.0`. To accomplish this, first check your local starknet-devnet version: + +```sh +starknet-devnet --version +``` + +If your local starknet-devnet version is not `0.2.0`, you need to install it. + +- Install Starknet-devnet `0.2.0` via `asdf` ([instructions](https://github.com/gianalarcon/asdf-starknet-devnet/blob/main/README.md)). + ### Compatible versions -- Starknet-devnet - v0.0.4 -- Scarb - v2.6.5 -- Snforge - v0.27.0 -- Cairo - v2.6.4 -- RPC - v0.7.0 +- Starknet-devnet - v0.2.0 +- Scarb - v2.8.2 +- Snforge - v0.30.0 +- Cairo - v2.8.2 +- RPC - v0.7.1 Make sure you have the compatible versions otherwise refer to [Scaffold-Stark Requirements](https://github.com/Scaffold-Stark/scaffold-stark-2?.tab=readme-ov-file#requirements) @@ -47,6 +59,8 @@ yarn install yarn chain ``` +> To run a fork : `yarn chain --fork-network [--fork-block ]` + > in a second terminal window, 🛰 deploy your contract (locally): ```sh diff --git a/package.json b/package.json index c0b68886..e2a37732 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ss-2", - "version": "0.2.10", + "version": "0.3.2", "author": "Q3 Labs", "license": "MIT", "private": true, @@ -21,6 +21,7 @@ "next:check-types": "yarn workspace @ss-2/nextjs check-types", "vercel": "yarn workspace @ss-2/nextjs vercel", "vercel:yolo": "yarn workspace @ss-2/nextjs vercel:yolo", + "test:nextjs": "yarn workspace @ss-2/nextjs test", "format": "yarn workspace @ss-2/nextjs format && yarn workspace @ss-2/snfoundry format", "format:check": "yarn workspace @ss-2/nextjs format:check && yarn workspace @ss-2/snfoundry format:check", "prepare": "husky" diff --git a/packages/nextjs/.env.example b/packages/nextjs/.env.example index 10cffdbc..a207edc1 100644 --- a/packages/nextjs/.env.example +++ b/packages/nextjs/.env.example @@ -1 +1 @@ -NEXT_PUBLIC_PROVIDER_URL=https://starknet-sepolia.public.blastapi.io/rpc/v0_7 \ No newline at end of file +NEXT_PUBLIC_PROVIDER_URL=https://starknet-sepolia.public.blastapi.io/rpc/v0_7 diff --git a/packages/nextjs/.gitignore b/packages/nextjs/.gitignore index fd3dbb57..00717d50 100644 --- a/packages/nextjs/.gitignore +++ b/packages/nextjs/.gitignore @@ -26,7 +26,8 @@ yarn-debug.log* yarn-error.log* # local env files -.env*.local +.env.local +.env # vercel .vercel diff --git a/packages/nextjs/app/configure/_components/DownloadContracts.tsx b/packages/nextjs/app/configure/_components/DownloadContracts.tsx new file mode 100644 index 00000000..528b521c --- /dev/null +++ b/packages/nextjs/app/configure/_components/DownloadContracts.tsx @@ -0,0 +1,177 @@ +"use client"; + +import { useProvider } from "@starknet-react/core"; +import React, { useState } from "react"; +import { useTargetNetwork } from "~~/hooks/scaffold-stark/useTargetNetwork"; +import configExternalContracts from "~~/contracts/configExternalContracts"; +import { deepMergeContracts } from "~~/utils/scaffold-stark/contract"; +import { ArrowDownTrayIcon } from "@heroicons/react/24/outline"; +import Link from "next/link"; + +export default function DownloadContracts() { + const { provider } = useProvider(); + const [address, setAddress] = useState(""); + + const { targetNetwork } = useTargetNetwork(); + const [symbol, setSymbol] = useState(""); + const handleInputChange: React.ChangeEventHandler = (e) => { + const value = e.target.value; + setSymbol(value); + }; + + const handleDownload = async () => { + if (!address) return; + try { + const [apiResponse, classHash] = await Promise.all([ + provider.getClassAt(address), + provider.getClassHashAt(address), + ]); + + const contractData = { + [targetNetwork.network]: { + [symbol]: { + address, + classHash, + abi: apiResponse.abi, + }, + }, + }; + const mergedPredeployedContracts = deepMergeContracts( + contractData, + configExternalContracts, + ); + + generateContractsFile(mergedPredeployedContracts); + } catch (error) { + console.error(error); + return; + } + }; + + const generateContractsFile = (contractsData: Object) => { + const generatedContractComment = `/** +* This file is autogenerated by Scaffold-Stark. +* You should not edit it manually or your changes might be overwritten. +*/`; + + const fileContent = JSON.stringify(contractsData, null, 2); + const configExternalContracts = `${generatedContractComment}\n\nconst configExternalContracts = ${fileContent} as const;\n\nexport default configExternalContracts;`; + + const blob = new Blob([configExternalContracts], { + type: "text/typescript", + }); + const url = URL.createObjectURL(blob); + const a = document.createElement("a"); + a.href = url; + a.download = "configExternalContracts.ts"; + a.click(); + URL.revokeObjectURL(url); + }; + + return ( +
+
+
+ Fetch Contract Configuration File from Contract Address +
+
+
+
Instructions
+

+ This tool allows you to fetch the ABI of a contract by entering + its address. It will download a configuration file that can be + used to replace or append to your local{" "} + predeployedContracts.ts{" "} + file, allowing you to debug in the{" "} + /debug page. +

+
    +
  1. + Enter the contract address and name within the designated input + fields. +
  2. +
  3. + Click the{" "} + + Download Contract File + {" "} + button. +
  4. +
  5. + The tool will fetch the ABI, address, and classHash from the + network and generate a configuration file. +
  6. +
  7. + Download the file and replace it to your local{" "} + + configExternalContracts.ts + {" "} + file. +
  8. +
  9. + Use the{" "} + + /debug + {" "} + page to interact with and test the contract using the scaffold + hooks. +
  10. +
+

+ Ensure that the format of the ABI matches the expected format in + your project before replacing the file. +

+
+
+ {targetNetwork && ( +
+
+ Network +
+ {targetNetwork.name} +
+ )} +
+
+ Contract +
+ +
+
+
+ Address +
+
+ setAddress(e.target.value)} + /> +
+ +
+
+
+
+
+ ); +} diff --git a/packages/nextjs/app/configure/page.tsx b/packages/nextjs/app/configure/page.tsx new file mode 100644 index 00000000..661e8c25 --- /dev/null +++ b/packages/nextjs/app/configure/page.tsx @@ -0,0 +1,18 @@ +import DownloadContracts from "./_components/DownloadContracts"; +import type { NextPage } from "next"; +import { getMetadata } from "~~/utils/scaffold-stark/getMetadata"; + +export const metadata = getMetadata({ + title: "Configure Contracts", + description: "Configure your deployed 🏗 Scaffold-Stark 2 contracts", +}); + +const Configure: NextPage = () => { + return ( + <> + + + ); +}; + +export default Configure; diff --git a/packages/nextjs/app/debug/_components/contract/ContractInput.tsx b/packages/nextjs/app/debug/_components/contract/ContractInput.tsx index 15c4d02b..9cde96ed 100644 --- a/packages/nextjs/app/debug/_components/contract/ContractInput.tsx +++ b/packages/nextjs/app/debug/_components/contract/ContractInput.tsx @@ -63,7 +63,15 @@ export const ContractInput = ({ isCairoBigInt(paramType.type) || isCairoU256(paramType.type) ) { - return ; + return ( + + setFormErrorMessage(errMessage) + } + /> + ); } else if (isCairoType(paramType.type)) { return ; } else { diff --git a/packages/nextjs/app/debug/_components/contract/DisplayVariable.tsx b/packages/nextjs/app/debug/_components/contract/DisplayVariable.tsx index c89c6566..d3f293ef 100644 --- a/packages/nextjs/app/debug/_components/contract/DisplayVariable.tsx +++ b/packages/nextjs/app/debug/_components/contract/DisplayVariable.tsx @@ -7,7 +7,7 @@ import { useAnimationConfig } from "~~/hooks/scaffold-stark"; import { AbiFunction } from "~~/utils/scaffold-stark/contract"; import { Abi } from "abi-wan-kanabi"; import { Address } from "@starknet-react/chains"; -import { useContractRead } from "@starknet-react/core"; +import { useReadContract } from "@starknet-react/core"; import { BlockNumber } from "starknet"; import { displayTxResult } from "./utilsDisplay"; import { useTheme } from "next-themes"; @@ -31,7 +31,8 @@ export const DisplayVariable = ({ isLoading, isFetching, refetch, - } = useContractRead({ + error, + } = useReadContract({ address: contractAddress, functionName: abiFunction.name, abi: [...abi], @@ -42,6 +43,14 @@ export const DisplayVariable = ({ const { resolvedTheme } = useTheme(); const isDarkMode = resolvedTheme === "dark"; + // error logging + useEffect(() => { + if (error) { + console.error(error?.message); + console.error(error.stack); + } + }, [error]); + useEffect(() => { refetch(); }, [refetch, refreshDisplayVariables]); diff --git a/packages/nextjs/app/debug/_components/contract/ReadOnlyFunctionForm.tsx b/packages/nextjs/app/debug/_components/contract/ReadOnlyFunctionForm.tsx index 3990bdc6..ea641a83 100644 --- a/packages/nextjs/app/debug/_components/contract/ReadOnlyFunctionForm.tsx +++ b/packages/nextjs/app/debug/_components/contract/ReadOnlyFunctionForm.tsx @@ -1,6 +1,6 @@ "use client"; -import { useState, useRef, useEffect, useCallback } from "react"; +import { useState, useRef, useEffect } from "react"; import { Abi } from "abi-wan-kanabi"; import { Address } from "@starknet-react/chains"; import { @@ -12,7 +12,7 @@ import { } from "~~/app/debug/_components/contract"; import { AbiFunction } from "~~/utils/scaffold-stark/contract"; import { BlockNumber } from "starknet"; -import { useContractRead } from "@starknet-react/core"; +import { useReadContract } from "@starknet-react/core"; import { ContractInput } from "./ContractInput"; type ReadOnlyFunctionFormProps = { @@ -33,16 +33,22 @@ export const ReadOnlyFunctionForm = ({ const [formErrorMessage, setFormErrorMessage] = useState(null); const lastForm = useRef(form); - const { isFetching, data, refetch } = useContractRead({ + const { isFetching, data, refetch, error } = useReadContract({ address: contractAddress, functionName: abiFunction.name, abi: [...abi], - args: inputValue ? inputValue.flat(Infinity) : [], - enabled: Boolean(inputValue), - parseArgs: false, + args: inputValue || [], + enabled: !!inputValue, blockIdentifier: "pending" as BlockNumber, }); + useEffect(() => { + if (error) { + console.error(error?.message); + console.error(error.stack); + } + }, [error]); + const transformedFunction = transformAbiFunction(abiFunction); const inputElements = transformedFunction.inputs.map((input, inputIndex) => { const key = getFunctionInputKey(abiFunction.name, input, inputIndex); @@ -59,14 +65,15 @@ export const ReadOnlyFunctionForm = ({ ); }); - const handleRead = useCallback(() => { - const newInputValue = getParsedContractFunctionArgs(form, false); + const handleRead = () => { + const newInputValue = getParsedContractFunctionArgs(form, false, true); + if (JSON.stringify(form) !== JSON.stringify(lastForm.current)) { setInputValue(newInputValue); lastForm.current = form; } refetch(); - }, [form, refetch]); + }; return (
diff --git a/packages/nextjs/app/debug/_components/contract/WriteOnlyFunctionForm.tsx b/packages/nextjs/app/debug/_components/contract/WriteOnlyFunctionForm.tsx index 6ac49769..a3276dbb 100644 --- a/packages/nextjs/app/debug/_components/contract/WriteOnlyFunctionForm.tsx +++ b/packages/nextjs/app/debug/_components/contract/WriteOnlyFunctionForm.tsx @@ -1,6 +1,6 @@ "use client"; -import { useEffect, useState } from "react"; +import { useEffect, useMemo, useState } from "react"; import { ContractInput, getFunctionInputKey, @@ -10,10 +10,9 @@ import { } from "~~/app/debug/_components/contract"; import { useTargetNetwork } from "~~/hooks/scaffold-stark/useTargetNetwork"; import { - useAccount, - useContractWrite, + useSendTransaction, useNetwork, - useWaitForTransaction, + useTransactionReceipt, } from "@starknet-react/core"; import { Abi } from "abi-wan-kanabi"; import { AbiFunction } from "~~/utils/scaffold-stark/contract"; @@ -21,6 +20,7 @@ import { Address } from "@starknet-react/chains"; import { InvokeTransactionReceiptResponse } from "starknet"; import { TxReceipt } from "./TxReceipt"; import { useTransactor } from "~~/hooks/scaffold-stark"; +import { useAccount } from "~~/hooks/useAccount"; type WriteOnlyFunctionFormProps = { abi: Abi; @@ -39,42 +39,49 @@ export const WriteOnlyFunctionForm = ({ getInitialFormState(abiFunction), ); const [formErrorMessage, setFormErrorMessage] = useState(null); - const { status: walletStatus } = useAccount(); + const { status: walletStatus, isConnected, account, chainId } = useAccount(); const { chain } = useNetwork(); const writeTxn = useTransactor(); const { targetNetwork } = useTargetNetwork(); - const writeDisabled = - !chain || - chain?.network !== targetNetwork.network || - walletStatus === "disconnected"; - // side effect to update error state when not connected - useEffect(() => { - setFormErrorMessage( - writeDisabled ? "Wallet not connected or in the wrong network" : null, - ); - }, [writeDisabled]); + const writeDisabled = useMemo( + () => + !chain || + chain?.network !== targetNetwork.network || + walletStatus === "disconnected", + [chain, targetNetwork.network, walletStatus], + ); const { data: result, isPending: isLoading, - writeAsync, - } = useContractWrite({ + sendAsync, + error, + } = useSendTransaction({ calls: [ { contractAddress, entrypoint: abiFunction.name, // use infinity to completely flatten array from n dimensions to 1 dimension + // writing in starknet next still needs rawArgs parsing, use v2 parsing calldata: getParsedContractFunctionArgs(form, false).flat(Infinity), }, ], }); + // side effect for error logging + useEffect(() => { + if (error) { + console.error(error?.message); + console.error(error.stack); + } + }, [error]); + const handleWrite = async () => { - if (writeAsync) { + if (sendAsync) { try { - const makeWriteWithParams = () => writeAsync(); + const makeWriteWithParams = () => sendAsync(); await writeTxn(makeWriteWithParams); onChange(); } catch (e: any) { @@ -92,7 +99,7 @@ export const WriteOnlyFunctionForm = ({ const [displayedTxResult, setDisplayedTxResult] = useState(); - const { data: txResult } = useWaitForTransaction({ + const { data: txResult } = useTransactionReceipt({ hash: result?.transaction_hash, }); useEffect(() => { @@ -120,6 +127,11 @@ export const WriteOnlyFunctionForm = ({ }); const zeroInputs = inputs.length === 0; + const errorMsg = (() => { + if (writeDisabled) return "Wallet not connected or on wrong network"; + return formErrorMessage; + })(); + return (
- ) : null} + ) : null} */}
  • diff --git a/packages/nextjs/components/scaffold-stark/CustomConnectButton/WrongNetworkDropdown.tsx b/packages/nextjs/components/scaffold-stark/CustomConnectButton/WrongNetworkDropdown.tsx index 2537f94d..a3d9dec6 100644 --- a/packages/nextjs/components/scaffold-stark/CustomConnectButton/WrongNetworkDropdown.tsx +++ b/packages/nextjs/components/scaffold-stark/CustomConnectButton/WrongNetworkDropdown.tsx @@ -17,11 +17,13 @@ export const WrongNetworkDropdown = () => { Wrong network +
      - + {/* TODO: reinstate if needed */} + {/* */}
    • - - - ) : chainId !== targetNetwork.id ? ( - - ) : ( + // effect to get chain id and address from account + useEffect(() => { + if (account) { + const getChainId = async () => { + const chainId = await account.channel.getChainId(); + setAccountChainId(BigInt(chainId as string)); + }; + + getChainId(); + } + }, [account]); + + if (status === "disconnected") + return ( + <> + + + + ); + + if (accountChainId !== targetNetwork.id) { + return ; + } + + return ( <>
      - + {chain.name}
      - + ); }; diff --git a/packages/nextjs/components/scaffold-stark/FaucetButton.tsx b/packages/nextjs/components/scaffold-stark/FaucetButton.tsx index 9b874ca2..9972456f 100644 --- a/packages/nextjs/components/scaffold-stark/FaucetButton.tsx +++ b/packages/nextjs/components/scaffold-stark/FaucetButton.tsx @@ -4,9 +4,9 @@ import { useState } from "react"; import { BanknotesIcon } from "@heroicons/react/24/outline"; import { mintEth } from "~~/services/web3/faucet"; import { Address, devnet } from "@starknet-react/chains"; -import { useAccount } from "@starknet-react/core"; import { useTargetNetwork } from "~~/hooks/scaffold-stark/useTargetNetwork"; import useScaffoldEthBalance from "~~/hooks/scaffold-stark/useScaffoldEthBalance"; +import { useAccount } from "~~/hooks/useAccount"; // Number of ETH faucet sends to an address const NUM_OF_ETH = "1"; diff --git a/packages/nextjs/components/scaffold-stark/Input/IntegerInput.tsx b/packages/nextjs/components/scaffold-stark/Input/IntegerInput.tsx index 38eee8e9..0c362711 100644 --- a/packages/nextjs/components/scaffold-stark/Input/IntegerInput.tsx +++ b/packages/nextjs/components/scaffold-stark/Input/IntegerInput.tsx @@ -9,6 +9,7 @@ import { parseEther } from "ethers"; type IntegerInputProps = CommonInputProps & { variant?: string; disableMultiplyBy1e18?: boolean; + onError?: (message: string | null) => void; }; export const IntegerInput = ({ @@ -19,6 +20,7 @@ export const IntegerInput = ({ disabled, variant = "core::integer::u256", disableMultiplyBy1e18 = false, + onError, }: IntegerInputProps) => { const [inputError, setInputError] = useState(false); const multiplyBy1e18 = useCallback(() => { @@ -32,8 +34,13 @@ export const IntegerInput = ({ }, [onChange, value, inputError]); useEffect(() => { - setInputError(!isValidInteger(variant, value)); - }, [value, variant]); + const isIntValid = isValidInteger(variant, value); + setInputError(!isIntValid); + if (onError) { + onError(null); + if (!isIntValid) onError("Invalid number input"); + } + }, [value, variant, onError]); return ( => "0x1234567"); + +// Mock the dependencies +vi.mock("../useTargetNetwork", () => ({ + useTargetNetwork: vi.fn(), +})); + +vi.mock("usehooks-ts", () => ({ + useIsMounted: vi.fn(), +})); + +vi.mock("starknet", () => ({ + RpcProvider: vi.fn().mockImplementation(() => ({ + getClassHashAt: mockGetClassHashAt, + })), +})); + +vi.mock("~~/utils/scaffold-stark/contract", () => ({ + // these are hoisted to the top, so the variable has to re-declared into the test suite + contracts: { + someNetwork: { + YourContract: { + address: + "0x6e0d97cfd6ad07cea15de51b1761b70cc648948fd183ce03cac9e3a1f8c7f26", + abi: [ + { + type: "impl", + name: "YourContractImpl", + interface_name: "contracts::YourContract::IYourContract", + }, + { + type: "struct", + name: "core::byte_array::ByteArray", + members: [ + { + name: "data", + type: "core::array::Array::", + }, + { + name: "pending_word", + type: "core::felt252", + }, + { + name: "pending_word_len", + type: "core::integer::u32", + }, + ], + }, + { + type: "struct", + name: "core::integer::u256", + members: [ + { + name: "low", + type: "core::integer::u128", + }, + { + name: "high", + type: "core::integer::u128", + }, + ], + }, + { + type: "enum", + name: "core::bool", + variants: [ + { + name: "False", + type: "()", + }, + { + name: "True", + type: "()", + }, + ], + }, + { + type: "interface", + name: "contracts::YourContract::IYourContract", + items: [ + { + type: "function", + name: "greeting", + inputs: [], + outputs: [ + { + type: "core::byte_array::ByteArray", + }, + ], + state_mutability: "view", + }, + { + type: "function", + name: "set_greeting", + inputs: [ + { + name: "new_greeting", + type: "core::byte_array::ByteArray", + }, + { + name: "amount_eth", + type: "core::integer::u256", + }, + ], + outputs: [], + state_mutability: "external", + }, + { + type: "function", + name: "withdraw", + inputs: [], + outputs: [], + state_mutability: "external", + }, + { + type: "function", + name: "premium", + inputs: [], + outputs: [ + { + type: "core::bool", + }, + ], + state_mutability: "view", + }, + ], + }, + { + type: "impl", + name: "OwnableImpl", + interface_name: "openzeppelin_access::ownable::interface::IOwnable", + }, + { + type: "interface", + name: "openzeppelin_access::ownable::interface::IOwnable", + items: [ + { + type: "function", + name: "owner", + inputs: [], + outputs: [ + { + type: "core::starknet::contract_address::ContractAddress", + }, + ], + state_mutability: "view", + }, + { + type: "function", + name: "transfer_ownership", + inputs: [ + { + name: "new_owner", + type: "core::starknet::contract_address::ContractAddress", + }, + ], + outputs: [], + state_mutability: "external", + }, + { + type: "function", + name: "renounce_ownership", + inputs: [], + outputs: [], + state_mutability: "external", + }, + ], + }, + { + type: "constructor", + name: "constructor", + inputs: [ + { + name: "owner", + type: "core::starknet::contract_address::ContractAddress", + }, + ], + }, + { + type: "event", + name: "openzeppelin_access::ownable::ownable::OwnableComponent::OwnershipTransferred", + kind: "struct", + members: [ + { + name: "previous_owner", + type: "core::starknet::contract_address::ContractAddress", + kind: "key", + }, + { + name: "new_owner", + type: "core::starknet::contract_address::ContractAddress", + kind: "key", + }, + ], + }, + { + type: "event", + name: "openzeppelin_access::ownable::ownable::OwnableComponent::OwnershipTransferStarted", + kind: "struct", + members: [ + { + name: "previous_owner", + type: "core::starknet::contract_address::ContractAddress", + kind: "key", + }, + { + name: "new_owner", + type: "core::starknet::contract_address::ContractAddress", + kind: "key", + }, + ], + }, + { + type: "event", + name: "openzeppelin_access::ownable::ownable::OwnableComponent::Event", + kind: "enum", + variants: [ + { + name: "OwnershipTransferred", + type: "openzeppelin_access::ownable::ownable::OwnableComponent::OwnershipTransferred", + kind: "nested", + }, + { + name: "OwnershipTransferStarted", + type: "openzeppelin_access::ownable::ownable::OwnableComponent::OwnershipTransferStarted", + kind: "nested", + }, + ], + }, + { + type: "event", + name: "contracts::YourContract::YourContract::GreetingChanged", + kind: "struct", + members: [ + { + name: "greeting_setter", + type: "core::starknet::contract_address::ContractAddress", + kind: "key", + }, + { + name: "new_greeting", + type: "core::byte_array::ByteArray", + kind: "key", + }, + { + name: "premium", + type: "core::bool", + kind: "data", + }, + { + name: "value", + type: "core::integer::u256", + kind: "data", + }, + ], + }, + { + type: "event", + name: "contracts::YourContract::YourContract::Event", + kind: "enum", + variants: [ + { + name: "OwnableEvent", + type: "openzeppelin_access::ownable::ownable::OwnableComponent::Event", + kind: "flat", + }, + { + name: "GreetingChanged", + type: "contracts::YourContract::YourContract::GreetingChanged", + kind: "nested", + }, + ], + }, + ], + classHash: + "0x15981f4687739d007cf4d6ec112dc72f2e46026c1d1e031ec698fb282d43399", + }, + }, + }, + ContractCodeStatus: { + LOADING: "loading", + DEPLOYED: "deployed", + NOT_FOUND: "not_found", + }, +})); + +describe("useDeployedContractInfo", () => { + const mockContracts = { + someNetwork: { + YourContract: { + address: + "0x6e0d97cfd6ad07cea15de51b1761b70cc648948fd183ce03cac9e3a1f8c7f26", + abi: [ + { + type: "impl", + name: "YourContractImpl", + interface_name: "contracts::YourContract::IYourContract", + }, + { + type: "struct", + name: "core::byte_array::ByteArray", + members: [ + { + name: "data", + type: "core::array::Array::", + }, + { + name: "pending_word", + type: "core::felt252", + }, + { + name: "pending_word_len", + type: "core::integer::u32", + }, + ], + }, + { + type: "struct", + name: "core::integer::u256", + members: [ + { + name: "low", + type: "core::integer::u128", + }, + { + name: "high", + type: "core::integer::u128", + }, + ], + }, + { + type: "enum", + name: "core::bool", + variants: [ + { + name: "False", + type: "()", + }, + { + name: "True", + type: "()", + }, + ], + }, + { + type: "interface", + name: "contracts::YourContract::IYourContract", + items: [ + { + type: "function", + name: "greeting", + inputs: [], + outputs: [ + { + type: "core::byte_array::ByteArray", + }, + ], + state_mutability: "view", + }, + { + type: "function", + name: "set_greeting", + inputs: [ + { + name: "new_greeting", + type: "core::byte_array::ByteArray", + }, + { + name: "amount_eth", + type: "core::integer::u256", + }, + ], + outputs: [], + state_mutability: "external", + }, + { + type: "function", + name: "withdraw", + inputs: [], + outputs: [], + state_mutability: "external", + }, + { + type: "function", + name: "premium", + inputs: [], + outputs: [ + { + type: "core::bool", + }, + ], + state_mutability: "view", + }, + ], + }, + { + type: "impl", + name: "OwnableImpl", + interface_name: "openzeppelin_access::ownable::interface::IOwnable", + }, + { + type: "interface", + name: "openzeppelin_access::ownable::interface::IOwnable", + items: [ + { + type: "function", + name: "owner", + inputs: [], + outputs: [ + { + type: "core::starknet::contract_address::ContractAddress", + }, + ], + state_mutability: "view", + }, + { + type: "function", + name: "transfer_ownership", + inputs: [ + { + name: "new_owner", + type: "core::starknet::contract_address::ContractAddress", + }, + ], + outputs: [], + state_mutability: "external", + }, + { + type: "function", + name: "renounce_ownership", + inputs: [], + outputs: [], + state_mutability: "external", + }, + ], + }, + { + type: "constructor", + name: "constructor", + inputs: [ + { + name: "owner", + type: "core::starknet::contract_address::ContractAddress", + }, + ], + }, + { + type: "event", + name: "openzeppelin_access::ownable::ownable::OwnableComponent::OwnershipTransferred", + kind: "struct", + members: [ + { + name: "previous_owner", + type: "core::starknet::contract_address::ContractAddress", + kind: "key", + }, + { + name: "new_owner", + type: "core::starknet::contract_address::ContractAddress", + kind: "key", + }, + ], + }, + { + type: "event", + name: "openzeppelin_access::ownable::ownable::OwnableComponent::OwnershipTransferStarted", + kind: "struct", + members: [ + { + name: "previous_owner", + type: "core::starknet::contract_address::ContractAddress", + kind: "key", + }, + { + name: "new_owner", + type: "core::starknet::contract_address::ContractAddress", + kind: "key", + }, + ], + }, + { + type: "event", + name: "openzeppelin_access::ownable::ownable::OwnableComponent::Event", + kind: "enum", + variants: [ + { + name: "OwnershipTransferred", + type: "openzeppelin_access::ownable::ownable::OwnableComponent::OwnershipTransferred", + kind: "nested", + }, + { + name: "OwnershipTransferStarted", + type: "openzeppelin_access::ownable::ownable::OwnableComponent::OwnershipTransferStarted", + kind: "nested", + }, + ], + }, + { + type: "event", + name: "contracts::YourContract::YourContract::GreetingChanged", + kind: "struct", + members: [ + { + name: "greeting_setter", + type: "core::starknet::contract_address::ContractAddress", + kind: "key", + }, + { + name: "new_greeting", + type: "core::byte_array::ByteArray", + kind: "key", + }, + { + name: "premium", + type: "core::bool", + kind: "data", + }, + { + name: "value", + type: "core::integer::u256", + kind: "data", + }, + ], + }, + { + type: "event", + name: "contracts::YourContract::YourContract::Event", + kind: "enum", + variants: [ + { + name: "OwnableEvent", + type: "openzeppelin_access::ownable::ownable::OwnableComponent::Event", + kind: "flat", + }, + { + name: "GreetingChanged", + type: "contracts::YourContract::YourContract::GreetingChanged", + kind: "nested", + }, + ], + }, + ], + classHash: + "0x15981f4687739d007cf4d6ec112dc72f2e46026c1d1e031ec698fb282d43399", + }, + }, + }; + + const mockIsMounted = vi.fn(); + const mockUseTargetNetwork = { + targetNetwork: { + network: "someNetwork", + rpcUrls: { + public: { + http: ["http://public-node-url"], + }, + }, + }, + }; + + beforeEach(() => { + vi.clearAllMocks(); + (useTargetNetwork as Mock).mockReturnValue(mockUseTargetNetwork); + (useIsMounted as Mock).mockReturnValue(mockIsMounted); + }); + + it("should initially set the status to LOADING", () => { + const { result } = renderHook(() => + //@ts-ignore using ts ignore so wont error in other devices + useDeployedContractInfo("YourContract"), + ); + + expect(result.current.isLoading).toBe(true); + expect(result.current.data).toBeUndefined(); + }); + + it("should set the status to NOT_FOUND if no deployed contract is found", async () => { + mockGetClassHashAt.mockImplementationOnce(async () => undefined); + mockIsMounted.mockReturnValue(true); + + const { result } = renderHook(() => + //@ts-ignore using ts ignore so wont error in other devices + useDeployedContractInfo("SomeContract"), + ); + + // Wait for the hook to update + await waitFor(() => { + expect(result.current.isLoading).toBe(false); + expect(result.current.data).toBeUndefined(); + }); + }); + + it("should set the status to DEPLOYED if the contract is found", async () => { + mockIsMounted.mockReturnValue(true); + + const { result } = renderHook(() => + //@ts-ignore using ts ignore so wont error in other devices + useDeployedContractInfo("YourContract"), + ); + + // Wait for the hook to update + act(async () => { + await waitFor(() => { + expect(result.current.isLoading).toBe(false); + expect(result.current.data?.address).toEqual( + mockContracts.someNetwork.YourContract.address, + ); + }); + }); + }); + + it("should not update status if component is unmounted", async () => { + mockIsMounted.mockReturnValue(false); // Simulate unmount + + const { result } = renderHook(() => + //@ts-ignore using ts ignore so wont error in other devices + useDeployedContractInfo("YourContract"), + ); + + // Wait for the hook to update + act(async () => { + await waitFor(() => { + expect(result.current.isLoading).toBe(true); + expect(result.current.data).toBeUndefined(); // Should not update the data + }); + }); + }); +}); diff --git a/packages/nextjs/hooks/scaffold-stark/__tests__/useOutsideClick.test.ts b/packages/nextjs/hooks/scaffold-stark/__tests__/useOutsideClick.test.ts new file mode 100644 index 00000000..12bf3489 --- /dev/null +++ b/packages/nextjs/hooks/scaffold-stark/__tests__/useOutsideClick.test.ts @@ -0,0 +1,64 @@ +import { renderHook } from "@testing-library/react"; +import { useOutsideClick } from "../useOutsideClick"; +import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; + +describe("useOutsideClick", () => { + let refElement: HTMLElement; + let callback: () => void; + + beforeEach(() => { + // Create a mock div element to be used as the ref + refElement = document.createElement("div"); + document.body.appendChild(refElement); + + // Create a mock callback function + callback = vi.fn(); + }); + + afterEach(() => { + document.body.removeChild(refElement); + vi.clearAllMocks(); + }); + + it("should call the callback when clicking outside the ref element", () => { + const ref = { current: refElement }; + renderHook(() => useOutsideClick(ref, callback)); + + // Simulate a click outside the element + const outsideElement = document.createElement("div"); + document.body.appendChild(outsideElement); + + outsideElement.click(); + + expect(callback).toHaveBeenCalledTimes(1); + + document.body.removeChild(outsideElement); + }); + + it("should not call the callback when clicking inside the ref element", () => { + const ref = { current: refElement }; + renderHook(() => useOutsideClick(ref, callback)); + + // Simulate a click inside the ref element + refElement.click(); + + expect(callback).not.toHaveBeenCalled(); + }); + + it("should remove event listener on unmount", () => { + const ref = { current: refElement }; + const { unmount } = renderHook(() => useOutsideClick(ref, callback)); + + const removeEventListenerSpy = vi.spyOn(document, "removeEventListener"); + + // Unmount the hook + unmount(); + + expect(removeEventListenerSpy).toHaveBeenCalledWith( + "click", + expect.any(Function), + ); + + removeEventListenerSpy.mockRestore(); + }); +}); diff --git a/packages/nextjs/hooks/scaffold-stark/useScaffoldContract.ts b/packages/nextjs/hooks/scaffold-stark/useScaffoldContract.ts index e2d0bad1..8ba5640b 100644 --- a/packages/nextjs/hooks/scaffold-stark/useScaffoldContract.ts +++ b/packages/nextjs/hooks/scaffold-stark/useScaffoldContract.ts @@ -3,7 +3,7 @@ import { useDeployedContractInfo } from "~~/hooks/scaffold-stark"; import { ContractName } from "~~/utils/scaffold-stark/contract"; import { useTargetNetwork } from "./useTargetNetwork"; import { Contract, RpcProvider } from "starknet"; -import { useAccount } from "@starknet-react/core"; +import { useAccount } from "~~/hooks/useAccount"; export const useScaffoldContract = ({ contractName, @@ -27,7 +27,7 @@ export const useScaffoldContract = ({ contract = new Contract( [...deployedContractData.abi], deployedContractData.address, - account || publicClient, + publicClient, ); } diff --git a/packages/nextjs/hooks/scaffold-stark/useScaffoldEthBalance.ts b/packages/nextjs/hooks/scaffold-stark/useScaffoldEthBalance.ts index 4f536102..1ec6cca3 100644 --- a/packages/nextjs/hooks/scaffold-stark/useScaffoldEthBalance.ts +++ b/packages/nextjs/hooks/scaffold-stark/useScaffoldEthBalance.ts @@ -1,6 +1,6 @@ import { Address } from "@starknet-react/chains"; import { useDeployedContractInfo } from "./useDeployedContractInfo"; -import { useContractRead } from "@starknet-react/core"; +import { useReadContract } from "@starknet-react/core"; import { BlockNumber } from "starknet"; import { Abi } from "abi-wan-kanabi"; import { formatUnits } from "ethers"; @@ -12,7 +12,7 @@ type UseScaffoldEthBalanceProps = { const useScaffoldEthBalance = ({ address }: UseScaffoldEthBalanceProps) => { const { data: deployedContract } = useDeployedContractInfo("Eth"); - const { data, ...props } = useContractRead({ + const { data, ...props } = useReadContract({ functionName: "balanceOf", address: deployedContract?.address, abi: deployedContract?.abi as Abi as any[], diff --git a/packages/nextjs/hooks/scaffold-stark/useScaffoldMultiWriteContract.ts b/packages/nextjs/hooks/scaffold-stark/useScaffoldMultiWriteContract.ts index 258ba1f4..16728c86 100644 --- a/packages/nextjs/hooks/scaffold-stark/useScaffoldMultiWriteContract.ts +++ b/packages/nextjs/hooks/scaffold-stark/useScaffoldMultiWriteContract.ts @@ -10,13 +10,14 @@ import { UseScaffoldArgsParam, UseScaffoldWriteConfig, } from "~~/utils/scaffold-stark/contract"; -import { useContractWrite, useNetwork } from "@starknet-react/core"; +import { useSendTransaction, useNetwork, Abi } from "@starknet-react/core"; import { InvocationsDetails } from "starknet"; import { notification } from "~~/utils/scaffold-stark"; import { useMemo } from "react"; import { useTransactor } from "./useTransactor"; export const useScaffoldMultiWriteContract = < + TAbi extends Abi, TContractName extends ContractName, TFunctionName extends ExtractAbiFunctionNamesScaffold< ContractAbi, @@ -26,12 +27,12 @@ export const useScaffoldMultiWriteContract = < calls, options, }: { - calls: Array>; + calls: Array>; options?: InvocationsDetails; }) => { const { targetNetwork } = useTargetNetwork(); const { chain } = useNetwork(); - const writeTx = useTransactor(); + const sendTxnWrapper = useTransactor(); const parsedCalls = useMemo(() => { if (calls) { @@ -52,8 +53,14 @@ export const useScaffoldMultiWriteContract = < contractAddress: contract?.address, entrypoint: functionName, calldata: - abiFunction && unParsedArgs - ? parseFunctionParams(abiFunction, unParsedArgs, false).flat() + abiFunction && unParsedArgs && contract + ? parseFunctionParams({ + abiFunction, + isRead: false, + inputs: unParsedArgs as any[], + isReadArgsParsing: false, + abi: contract.abi, + }).flat() : [], }; }); @@ -63,9 +70,8 @@ export const useScaffoldMultiWriteContract = < }, [calls]); // TODO add custom options - const wagmiContractWrite = useContractWrite({ + const sendTransactionInstance = useSendTransaction({ calls: parsedCalls, - options, }); const sendContractWriteTx = async () => { @@ -78,10 +84,10 @@ export const useScaffoldMultiWriteContract = < return; } - if (wagmiContractWrite.writeAsync) { + if (sendTransactionInstance.sendAsync) { try { // setIsMining(true); - return await writeTx(() => wagmiContractWrite.writeAsync()); + return await sendTxnWrapper(() => sendTransactionInstance.sendAsync()); } catch (e: any) { throw e; } finally { @@ -94,12 +100,13 @@ export const useScaffoldMultiWriteContract = < }; return { - ...wagmiContractWrite, - writeAsync: sendContractWriteTx, + ...sendTransactionInstance, + sendAsync: sendContractWriteTx, }; }; export function createContractCall< + TAbi extends Abi, TContractName extends ContractName, TFunctionName extends ExtractAbiFunctionNamesScaffold< ContractAbi, @@ -108,7 +115,7 @@ export function createContractCall< >( contractName: TContractName, functionName: TFunctionName, - args: UseScaffoldArgsParam["args"], + args: UseScaffoldArgsParam["args"], ) { return { contractName, functionName, args }; } diff --git a/packages/nextjs/hooks/scaffold-stark/useScaffoldReadContract.ts b/packages/nextjs/hooks/scaffold-stark/useScaffoldReadContract.ts index 53f14cc6..511b2c94 100644 --- a/packages/nextjs/hooks/scaffold-stark/useScaffoldReadContract.ts +++ b/packages/nextjs/hooks/scaffold-stark/useScaffoldReadContract.ts @@ -1,4 +1,4 @@ -import { useContractRead } from "@starknet-react/core"; +import { Abi, useReadContract } from "@starknet-react/core"; import { BlockNumber } from "starknet"; import { useDeployedContractInfo } from "~~/hooks/scaffold-stark"; import { @@ -10,6 +10,7 @@ import { } from "~~/utils/scaffold-stark/contract"; export const useScaffoldReadContract = < + TAbi extends Abi, TContractName extends ContractName, TFunctionName extends ExtractAbiFunctionNamesScaffold< ContractAbi, @@ -20,19 +21,20 @@ export const useScaffoldReadContract = < functionName, args, ...readConfig -}: UseScaffoldReadConfig) => { +}: UseScaffoldReadConfig) => { const { data: deployedContract } = useDeployedContractInfo(contractName); - return useContractRead({ + return useReadContract({ functionName, address: deployedContract?.address, abi: deployedContract?.abi, watch: true, - args: args ?? [], - enabled: true, + args, + enabled: + args && (!Array.isArray(args) || !args.some((arg) => arg === undefined)), blockIdentifier: "pending" as BlockNumber, ...(readConfig as any), - }) as Omit, "data"> & { + }) as Omit, "data"> & { data: AbiFunctionOutputs | undefined; }; }; diff --git a/packages/nextjs/hooks/scaffold-stark/useScaffoldStrkBalance.ts b/packages/nextjs/hooks/scaffold-stark/useScaffoldStrkBalance.ts index ac80b742..e917deae 100644 --- a/packages/nextjs/hooks/scaffold-stark/useScaffoldStrkBalance.ts +++ b/packages/nextjs/hooks/scaffold-stark/useScaffoldStrkBalance.ts @@ -1,6 +1,6 @@ import { Address } from "@starknet-react/chains"; import { useDeployedContractInfo } from "./useDeployedContractInfo"; -import { useContractRead } from "@starknet-react/core"; +import { useReadContract } from "@starknet-react/core"; import { BlockNumber } from "starknet"; import { Abi } from "abi-wan-kanabi"; import { formatUnits } from "ethers"; @@ -12,7 +12,7 @@ type UseScaffoldStrkBalanceProps = { const useScaffoldStrkBalance = ({ address }: UseScaffoldStrkBalanceProps) => { const { data: deployedContract } = useDeployedContractInfo("Strk"); - const { data, ...props } = useContractRead({ + const { data, ...props } = useReadContract({ functionName: "balanceOf", address: deployedContract?.address, abi: deployedContract?.abi as Abi as any[], diff --git a/packages/nextjs/hooks/scaffold-stark/useScaffoldWriteContract.ts b/packages/nextjs/hooks/scaffold-stark/useScaffoldWriteContract.ts index 13d409e3..1c082912 100644 --- a/packages/nextjs/hooks/scaffold-stark/useScaffoldWriteContract.ts +++ b/packages/nextjs/hooks/scaffold-stark/useScaffoldWriteContract.ts @@ -1,4 +1,4 @@ -import { useMemo } from "react"; +import { useEffect, useMemo } from "react"; import { useTargetNetwork } from "./useTargetNetwork"; import { useDeployedContractInfo, @@ -12,14 +12,15 @@ import { parseFunctionParams, UseScaffoldWriteConfig, } from "~~/utils/scaffold-stark/contract"; -import { useContractWrite, useNetwork } from "@starknet-react/core"; +import { useSendTransaction, useNetwork, Abi } from "@starknet-react/core"; import { notification } from "~~/utils/scaffold-stark"; type UpdatedArgs = Parameters< - ReturnType["writeAsync"] + ReturnType["sendAsync"] >[0]; export const useScaffoldWriteContract = < + TAbi extends Abi, TContractName extends ContractName, TFunctionName extends ExtractAbiFunctionNamesScaffold< ContractAbi, @@ -29,11 +30,10 @@ export const useScaffoldWriteContract = < contractName, functionName, args, - options, -}: UseScaffoldWriteConfig) => { +}: UseScaffoldWriteConfig) => { const { data: deployedContractData } = useDeployedContractInfo(contractName); const { chain } = useNetwork(); - const writeTx = useTransactor(); + const sendTxnWrapper = useTransactor(); const { targetNetwork } = useTargetNetwork(); const abiFunction = useMemo( @@ -46,13 +46,20 @@ export const useScaffoldWriteContract = < ); const parsedParams = useMemo(() => { - if (args && abiFunction) { - return parseFunctionParams(abiFunction, args as any[], false).flat(); + if (args && abiFunction && deployedContractData) { + const parsed = parseFunctionParams({ + abiFunction, + abi: deployedContractData.abi, + inputs: args as any[], + isRead: false, + isReadArgsParsing: false, + }).flat(Infinity); + return parsed; } return []; - }, [args, abiFunction]); + }, [args, abiFunction, deployedContractData]); - const wagmiContractWrite = useContractWrite({ + const sendTransactionInstance = useSendTransaction({ calls: deployedContractData ? [ { @@ -62,16 +69,17 @@ export const useScaffoldWriteContract = < }, ] : [], - options, }); - const sendContractWriteTx = async ({ - args: newArgs, - options: newOptions, - }: { - args?: UseScaffoldWriteConfig["args"]; - options?: UseScaffoldWriteConfig["options"]; - } & UpdatedArgs = {}) => { + const sendContractWriteTx = async (params?: { + args?: UseScaffoldWriteConfig["args"]; + }) => { + // if no args supplied, use the one supplied from hook + let newArgs = params?.args; + if (!newArgs) { + newArgs = args; + } + if (!deployedContractData) { console.error( "Target Contract is not deployed, did you forget to run `yarn deploy`?", @@ -88,8 +96,14 @@ export const useScaffoldWriteContract = < } let newParsedParams = - newArgs && abiFunction - ? parseFunctionParams(abiFunction, newArgs as any[], false).flat() + newArgs && abiFunction && deployedContractData + ? parseFunctionParams({ + abiFunction, + abi: deployedContractData.abi, + inputs: args as any[], + isRead: false, + isReadArgsParsing: false, + }).flat(Infinity) : parsedParams; const newCalls = [ { @@ -99,14 +113,11 @@ export const useScaffoldWriteContract = < }, ]; - if (wagmiContractWrite.writeAsync) { + if (sendTransactionInstance.sendAsync) { try { // setIsMining(true); - return await writeTx(() => - wagmiContractWrite.writeAsync({ - calls: newCalls as any[], - options: newOptions ?? options, - }), + return await sendTxnWrapper(() => + sendTransactionInstance.sendAsync(newCalls as any[]), ); } catch (e: any) { throw e; @@ -120,7 +131,7 @@ export const useScaffoldWriteContract = < }; return { - ...wagmiContractWrite, - writeAsync: sendContractWriteTx, + ...sendTransactionInstance, + sendAsync: sendContractWriteTx, }; }; diff --git a/packages/nextjs/hooks/scaffold-stark/useTargetNetwork.ts b/packages/nextjs/hooks/scaffold-stark/useTargetNetwork.ts index d8becf43..ec32bd94 100644 --- a/packages/nextjs/hooks/scaffold-stark/useTargetNetwork.ts +++ b/packages/nextjs/hooks/scaffold-stark/useTargetNetwork.ts @@ -1,5 +1,5 @@ import { useEffect } from "react"; -import { useAccount } from "@starknet-react/core"; +import { useAccount } from "~~/hooks/useAccount"; import scaffoldConfig from "~~/scaffold.config"; import { useGlobalState } from "~~/services/store/store"; import { ChainWithAttributes } from "~~/utils/scaffold-stark"; diff --git a/packages/nextjs/hooks/scaffold-stark/useTransactor.tsx b/packages/nextjs/hooks/scaffold-stark/useTransactor.tsx index a78a21ad..082b7ca5 100644 --- a/packages/nextjs/hooks/scaffold-stark/useTransactor.tsx +++ b/packages/nextjs/hooks/scaffold-stark/useTransactor.tsx @@ -1,4 +1,4 @@ -import { useAccount } from "@starknet-react/core"; +import { useAccount } from "~~/hooks/useAccount"; import { AccountInterface, InvokeFunctionResponse, @@ -48,7 +48,7 @@ export const useTransactor = ( _walletClient?: AccountInterface, ): TransactionFunc => { let walletClient = _walletClient; - const { account } = useAccount(); + const { account, address, status } = useAccount(); const { targetNetwork } = useTargetNetwork(); if (walletClient === undefined && account) { walletClient = account; @@ -67,11 +67,6 @@ export const useTransactor = ( | undefined = undefined; try { const networkId = await walletClient.getChainId(); - // Get full transaction from public client - const publicClient = new RpcProvider({ - nodeUrl: targetNetwork.rpcUrls.public.http[0], - }); - notificationId = notification.loading( , ); @@ -88,6 +83,7 @@ export const useTransactor = ( } else { throw new Error("Incorrect transaction passed to transactor"); } + notification.remove(notificationId); const blockExplorerTxURL = networkId diff --git a/packages/nextjs/hooks/useAccount.ts b/packages/nextjs/hooks/useAccount.ts new file mode 100644 index 00000000..10c734b0 --- /dev/null +++ b/packages/nextjs/hooks/useAccount.ts @@ -0,0 +1,32 @@ +import { + UseAccountResult, + useAccount as useStarknetReactAccount, +} from "@starknet-react/core"; +import { useEffect, useState } from "react"; + +/** + * Wrapper around starknet react's useAccount hook to address issues + * @returns {UseAccountResult} + */ +export function useAccount(): UseAccountResult { + const { account, ...rest } = useStarknetReactAccount(); + const [accountChainId, setAccountChainId] = useState(0n); + + // effect to get chain id and address from account + useEffect(() => { + if (account) { + const getChainId = async () => { + const chainId = await account.channel.getChainId(); + setAccountChainId(BigInt(chainId as string)); + }; + + getChainId(); + } + }, [account]); + + return { + account, + ...rest, + chainId: accountChainId, + } as UseAccountResult; +} diff --git a/packages/nextjs/hooks/useConditionalStarkProfile.tsx b/packages/nextjs/hooks/useConditionalStarkProfile.tsx index 90ea4f23..e13b3933 100644 --- a/packages/nextjs/hooks/useConditionalStarkProfile.tsx +++ b/packages/nextjs/hooks/useConditionalStarkProfile.tsx @@ -2,7 +2,7 @@ import { useStarkProfile } from "@starknet-react/core"; import * as chains from "@starknet-react/chains"; import scaffoldConfig from "~~/scaffold.config"; -const useConditionalStarkProfile = (address: string | undefined) => { +const useConditionalStarkProfile = (address: chains.Address | undefined) => { const shouldUseProfile = scaffoldConfig.targetNetworks[0].id !== chains.devnet.id; // Conditional hooks are not recommended, but in this case, it's the best approach to avoid issues on devnet. diff --git a/packages/nextjs/package.json b/packages/nextjs/package.json index ca1b082a..1ceae600 100644 --- a/packages/nextjs/package.json +++ b/packages/nextjs/package.json @@ -11,20 +11,23 @@ "vercel": "vercel", "vercel:yolo": "vercel --build-env NEXT_PUBLIC_IGNORE_BUILD_ERROR=true", "format": "prettier --write .", - "format:check": "prettier --check ." + "format:check": "prettier --check .", + "test": "vitest" }, "dependencies": { "@heroicons/react": "^2.1.3", "@next/font": "^14.2.1", "@radix-ui/react-icons": "1.3.0", "@radix-ui/themes": "2.0.3", - "@starknet-react/chains": "^0.1.7", - "@starknet-react/core": "^2.8.2", + "@starknet-io/types-js": "^0.7.7", + "@starknet-react/chains": "^3.0.0", + "@starknet-react/core": "^3.0.0", + "@starknet-react/typescript-config": "0.0.0", "abi-wan-kanabi": "^2.2.2", "blo": "^1.1.1", "daisyui": "^4.7.3", "ethers": "^6.12.0", - "get-starknet-core": "^3.3.0", + "get-starknet-core": "^4.0.0", "next": "14.1.3", "next-themes": "^0.2.1", "nprogress": "^0.2.0", @@ -33,23 +36,30 @@ "react-copy-to-clipboard": "^5.1.0", "react-dom": "^18", "react-hot-toast": "^2.4.1", - "starknet": "6.7.0", + "starknet": "6.12.1", "type-fest": "^4.6.0", "usehooks-ts": "^2.13.0", "zustand": "^4.1.2" }, "devDependencies": { + "@testing-library/dom": "^10.4.0", + "@testing-library/react": "^16.0.1", "@types/node": "^20", "@types/nprogress": "^0", "@types/react": "^18", "@types/react-copy-to-clipboard": "^5.0.4", "@types/react-dom": "^18", + "@vitejs/plugin-react": "^4.3.1", + "@vitest/coverage-istanbul": "^2.1.1", + "@vitest/coverage-v8": "^2.1.1", "autoprefixer": "^10.0.1", "eslint": "^8", "eslint-config-next": "14.1.3", + "jsdom": "^25.0.1", "postcss": "^8", "tailwindcss": "^3.3.0", "typescript": "^5", - "vercel": "^33.7.1" + "vercel": "^33.7.1", + "vitest": "^2.1.1" } } diff --git a/packages/nextjs/public/debug-image.png b/packages/nextjs/public/debug-image.png deleted file mode 100644 index e6795e8a..00000000 Binary files a/packages/nextjs/public/debug-image.png and /dev/null differ diff --git a/packages/nextjs/scaffold.config.ts b/packages/nextjs/scaffold.config.ts index ee79a8fc..fac39e12 100644 --- a/packages/nextjs/scaffold.config.ts +++ b/packages/nextjs/scaffold.config.ts @@ -9,7 +9,7 @@ export type ScaffoldConfig = { }; const scaffoldConfig = { - targetNetworks: [chains.devnet], + targetNetworks: [chains.sepolia], // Only show the Burner Wallet when running on devnet onlyLocalBurnerWallet: false, rpcProviderUrl: process.env.NEXT_PUBLIC_PROVIDER_URL || "", diff --git a/packages/nextjs/services/web3/stark-burner/BurnerConnector.ts b/packages/nextjs/services/web3/stark-burner/BurnerConnector.ts index 1f9e675c..acad0a58 100644 --- a/packages/nextjs/services/web3/stark-burner/BurnerConnector.ts +++ b/packages/nextjs/services/web3/stark-burner/BurnerConnector.ts @@ -1,5 +1,17 @@ -import { InjectedConnector, starknetChainId } from "@starknet-react/core"; -import { Account, AccountInterface, RpcProvider } from "starknet"; +import { + InjectedConnector, + UserRejectedRequestError, + starknetChainId, +} from "@starknet-react/core"; +import { + Account, + AccountInterface, + Call, + CallData, + RpcProvider, + byteArray, + uint256, +} from "starknet"; import { ConnectorData, ConnectorIcons, @@ -7,6 +19,11 @@ import { import { Chain, devnet } from "@starknet-react/chains"; import scaffoldConfig from "~~/scaffold.config"; import { BurnerAccount, burnerAccounts } from "~~/utils/devnetAccounts"; +import { + RequestFnCall, + RpcMessage, + RpcTypeToMessageMap, +} from "@starknet-io/types-js"; export const burnerWalletId = "burner-wallet"; export const burnerWalletName = "Burner Wallet"; @@ -46,6 +63,7 @@ export class BurnerConnector extends InjectedConnector { }), this.burnerAccount.accountAddress, this.burnerAccount.privateKey, + "1", ), ); } @@ -69,6 +87,39 @@ export class BurnerConnector extends InjectedConnector { return Promise.resolve((await this.account()).address !== ""); } + async request( + call: RequestFnCall, + ): Promise { + if (call.params && "calls" in call.params) { + let compiledCalls = call.params.calls; + try { + // TODO : starknet connector uses "emtrypoint" instead of "entry_point" + // TODO : starknet connector uses "contract_address" instead of "contractAddress" + compiledCalls.forEach((element) => { + //@ts-ignore + element.calldata = CallData.compile(element.calldata); + //@ts-ignore + element.contractAddress = element.contract_address; + //@ts-ignore + element.entrypoint = element.entry_point; + // element.calldata.__compiled__ = true; + }); + + return await ( + await this.account() + ) + //@ts-ignore + .execute(compiledCalls, { + version: "0x3", + }); + } catch (e) { + throw e; + } + } + + return await super.request(call); + } + async connect(): Promise { return Promise.resolve({ account: (await this.account()).address, diff --git a/packages/nextjs/tailwind.config.ts b/packages/nextjs/tailwind.config.ts index 57d606ca..f4788515 100644 --- a/packages/nextjs/tailwind.config.ts +++ b/packages/nextjs/tailwind.config.ts @@ -124,6 +124,9 @@ module.exports = { ".link:hover": { opacity: "80%", }, + ".contract-content": { + background: "white", + }, }, }, { @@ -196,6 +199,10 @@ module.exports = { ".link:hover": { opacity: "80%", }, + ".contract-content": { + background: + "linear-gradient(113.34deg, rgba(43, 34, 67, 0.6) 20.48%, rgba(37, 55, 81, 0.6) 99.67%)", + }, }, }, ], diff --git a/packages/nextjs/utils/Constants.ts b/packages/nextjs/utils/Constants.ts new file mode 100644 index 00000000..5f66e76e --- /dev/null +++ b/packages/nextjs/utils/Constants.ts @@ -0,0 +1,283 @@ +// Eth +const universalEthAddress = + "0x49D36570D4E46F48E99674BD3FCC84644DDD6B96F7C741B1562B82F9E004DC7" as const; + +const devnetEthClassHash = + "0x046ded64ae2dead6448e247234bab192a9c483644395b66f2155f2614e5804b0" as const; + +const sepoliaMainnetEthClassHash = + "0x07f3777c99f3700505ea966676aac4a0d692c2a9f5e667f4c606b51ca1dd3420" as const; + +// Strk +const universalStrkAddress = + "0x04718f5a0fc34cc1af16a1cdee98ffb20c31f5cd61d6ab07201858f4287c938d" as const; + +const sepoliaMainnetStrkClassHash = + "0x04ad3c1dc8413453db314497945b6903e1c766495a1e60492d44da9c2a986e4b" as const; + +const devnetStrkClassHash = + "0x046ded64ae2dead6448e247234bab192a9c483644395b66f2155f2614e5804b0" as const; + +const universalErc20Abi = [ + { + type: "impl", + name: "ERC20Impl", + interface_name: "openzeppelin::token::erc20::interface::IERC20", + }, + { + name: "openzeppelin::token::erc20::interface::IERC20", + type: "interface", + items: [ + { + name: "name", + type: "function", + inputs: [], + outputs: [ + { + type: "core::felt252", + }, + ], + state_mutability: "view", + }, + { + name: "symbol", + type: "function", + inputs: [], + outputs: [ + { + type: "core::felt252", + }, + ], + state_mutability: "view", + }, + { + name: "decimals", + type: "function", + inputs: [], + outputs: [ + { + type: "core::integer::u8", + }, + ], + state_mutability: "view", + }, + { + name: "total_supply", + type: "function", + inputs: [], + outputs: [ + { + type: "core::integer::u256", + }, + ], + state_mutability: "view", + }, + { + name: "balance_of", + type: "function", + inputs: [ + { + name: "account", + type: "core::starknet::contract_address::ContractAddress", + }, + ], + outputs: [ + { + type: "core::integer::u256", + }, + ], + state_mutability: "view", + }, + { + name: "allowance", + type: "function", + inputs: [ + { + name: "owner", + type: "core::starknet::contract_address::ContractAddress", + }, + { + name: "spender", + type: "core::starknet::contract_address::ContractAddress", + }, + ], + outputs: [ + { + type: "core::integer::u256", + }, + ], + state_mutability: "view", + }, + { + name: "transfer", + type: "function", + inputs: [ + { + name: "recipient", + type: "core::starknet::contract_address::ContractAddress", + }, + { + name: "amount", + type: "core::integer::u256", + }, + ], + outputs: [ + { + type: "core::bool", + }, + ], + state_mutability: "external", + }, + { + name: "transfer_from", + type: "function", + inputs: [ + { + name: "sender", + type: "core::starknet::contract_address::ContractAddress", + }, + { + name: "recipient", + type: "core::starknet::contract_address::ContractAddress", + }, + { + name: "amount", + type: "core::integer::u256", + }, + ], + outputs: [ + { + type: "core::bool", + }, + ], + state_mutability: "external", + }, + { + name: "approve", + type: "function", + inputs: [ + { + name: "spender", + type: "core::starknet::contract_address::ContractAddress", + }, + { + name: "amount", + type: "core::integer::u256", + }, + ], + outputs: [ + { + type: "core::bool", + }, + ], + state_mutability: "external", + }, + ], + }, + { + name: "ERC20CamelOnlyImpl", + type: "impl", + interface_name: "openzeppelin::token::erc20::interface::IERC20CamelOnly", + }, + { + type: "interface", + name: "openzeppelin::token::erc20::interface::IERC20CamelOnly", + items: [ + { + name: "totalSupply", + type: "function", + inputs: [], + outputs: [ + { + type: "core::integer::u256", + }, + ], + state_mutability: "view", + }, + { + name: "balanceOf", + type: "function", + inputs: [ + { + name: "account", + type: "core::starknet::contract_address::ContractAddress", + }, + ], + outputs: [ + { + type: "core::integer::u256", + }, + ], + state_mutability: "view", + }, + { + name: "transferFrom", + type: "function", + inputs: [ + { + name: "sender", + type: "core::starknet::contract_address::ContractAddress", + }, + { + name: "recipient", + type: "core::starknet::contract_address::ContractAddress", + }, + { + name: "amount", + type: "core::integer::u256", + }, + ], + outputs: [ + { + type: "core::bool", + }, + ], + state_mutability: "external", + }, + ], + }, + { + kind: "struct", + name: "openzeppelin::token::erc20_v070::erc20::ERC20::Transfer", + type: "event", + members: [ + { + kind: "data", + name: "from", + type: "core::starknet::contract_address::ContractAddress", + }, + { + kind: "data", + name: "to", + type: "core::starknet::contract_address::ContractAddress", + }, + { + kind: "data", + name: "value", + type: "core::integer::u256", + }, + ], + }, + { + kind: "enum", + name: "openzeppelin::token::erc20_v070::erc20::ERC20::Event", + type: "event", + variants: [ + { + kind: "nested", + name: "Transfer", + type: "openzeppelin::token::erc20_v070::erc20::ERC20::Transfer", + }, + ], + }, +] as const; + +export { + devnetEthClassHash, + devnetStrkClassHash, + universalEthAddress, + sepoliaMainnetEthClassHash, + universalStrkAddress, + sepoliaMainnetStrkClassHash, + universalErc20Abi, +}; diff --git a/packages/nextjs/utils/scaffold-stark/common.ts b/packages/nextjs/utils/scaffold-stark/common.ts index a3f5e35e..6ca08c31 100644 --- a/packages/nextjs/utils/scaffold-stark/common.ts +++ b/packages/nextjs/utils/scaffold-stark/common.ts @@ -1,7 +1,7 @@ // To be used in JSON.stringify when a field might be bigint // https://wagmi.sh/react/faq#bigint-serialization import { Address } from "@starknet-react/chains"; -import { validateAndParseAddress } from "starknet"; +import { getChecksumAddress, validateAndParseAddress } from "starknet"; export const replacer = (_key: string, value: unknown) => { if ( @@ -9,7 +9,7 @@ export const replacer = (_key: string, value: unknown) => { (typeof value !== "object" || typeof value === null) && value.toString().length >= 76 ) { - return validateAndParseAddress(value.toString()); + return getChecksumAddress(`0x${BigInt(value.toString()).toString(16)}`); } else if (typeof value === "bigint") { return value.toString(); } @@ -25,3 +25,12 @@ export function isAddress(address: string): address is Address { export function feltToHex(feltBigInt: bigint) { return `0x${feltBigInt.toString(16)}`; } + +export function isJsonString(str: string) { + try { + JSON.parse(str); + return true; + } catch (e) { + return false; + } +} diff --git a/packages/nextjs/utils/scaffold-stark/contract.ts b/packages/nextjs/utils/scaffold-stark/contract.ts index 4f4d0890..6a8fb479 100644 --- a/packages/nextjs/utils/scaffold-stark/contract.ts +++ b/packages/nextjs/utils/scaffold-stark/contract.ts @@ -1,6 +1,7 @@ import scaffoldConfig from "~~/scaffold.config"; import deployedContractsData from "~~/contracts/deployedContracts"; import predeployedContracts from "~~/contracts/predeployedContracts"; +import configExternalContracts from "~~/contracts/configExternalContracts"; import type { Abi, ExtractAbiEventNames, @@ -8,21 +9,23 @@ import type { ExtractArgs, } from "abi-wan-kanabi/dist/kanabi"; import { - UseContractReadProps, - UseContractWriteProps, + UseReadContractProps, + UseSendTransactionProps, } from "@starknet-react/core"; import { Address } from "@starknet-react/chains"; import { + CairoCustomEnum, CairoOption, CairoOptionVariant, CairoResult, CairoResultVariant, + getChecksumAddress, uint256, validateAndParseAddress, } from "starknet"; import { byteArray } from "starknet"; import type { MergeDeepRecord } from "type-fest/source/merge-deep"; -import { feltToHex } from "~~/utils/scaffold-stark/common"; +import { feltToHex, isJsonString } from "~~/utils/scaffold-stark/common"; import { isCairoArray, isCairoBigInt, @@ -35,6 +38,7 @@ import { isCairoOption, isCairoResult, isCairoTuple, + isCairoType, isCairoU256, parseGenericType, } from "~~/utils/scaffold-stark/types"; @@ -72,7 +76,7 @@ export type GenericContractsDeclaration = { }; }; -const deepMergeContracts = < +export const deepMergeContracts = < L extends Record, E extends Record, >( @@ -100,9 +104,14 @@ const deepMergeContracts = < >; }; +const mergedPredeployedContracts = deepMergeContracts( + predeployedContracts, + configExternalContracts, +); + const contractsData = deepMergeContracts( deployedContractsData, - predeployedContracts, + mergedPredeployedContracts, ); type IsContractDeclarationMissing = typeof contractsData extends { @@ -160,9 +169,12 @@ export type AbiEnum = { variants: readonly AbiParameter[]; }; -export const contracts = contractsData as GenericContractsDeclaration | null; +// TODO: resolve type properly +export const contracts = + contractsData as unknown as GenericContractsDeclaration | null; export type UseScaffoldWriteConfig< + TAbi extends Abi, TContractName extends ContractName, TFunctionName extends ExtractAbiFunctionNamesScaffold< ContractAbi, @@ -171,17 +183,17 @@ export type UseScaffoldWriteConfig< > = { contractName: TContractName; } & IsContractDeclarationMissing< - Partial & { + Partial & { functionName: string; args: any[]; }, { functionName: TFunctionName; } & Omit< - UseContractWriteProps, + UseSendTransactionProps, "chainId" | "abi" | "address" | "functionName" | "mode" > & - UseScaffoldArgsParam + UseScaffoldArgsParam >; type InferContractAbi = TContract extends { abi: infer TAbi } @@ -266,20 +278,21 @@ export type ExtractAbiFunctionScaffold< } >; +// let emerson = singleFunction extends listOfFunctions ? true : false; + export type UseScaffoldArgsParam< + TAbi extends Abi, TContractName extends ContractName, - TFunctionName extends ExtractAbiFunctionNamesScaffold< - ContractAbi - >, + TFunctionName extends ExtractAbiFunctionNamesScaffold, > = TFunctionName extends ExtractAbiFunctionNamesWithInputsScaffold< - ContractAbi + ContractAbi > ? { args: OptionalTupple< UnionToIntersection< ExtractArgs< - ContractAbi, + TAbi, ExtractAbiFunctionScaffold< ContractAbi, TFunctionName @@ -288,23 +301,26 @@ export type UseScaffoldArgsParam< > >; } - : { - args?: never; - }; + : { args?: any[] }; export type UseScaffoldReadConfig< + TAbi extends Abi, TContractName extends ContractName, TFunctionName extends ExtractAbiFunctionNamesScaffold< - ContractAbi + ContractAbi, + "view" >, > = { contractName: TContractName; } & IsContractDeclarationMissing< - Partial, + Partial>, { functionName: TFunctionName; - } & UseScaffoldArgsParam & - Omit + } & Omit< + UseReadContractProps, + "chainId" | "abi" | "address" | "functionName" | "args" + > & + UseScaffoldArgsParam >; export type AbiFunctionOutputs< @@ -380,11 +396,19 @@ export function getFunctionsByStateMutability( } // TODO: in the future when param decoding is standarized in wallets argent and braavos we can return the object -// TODO : starknet react makes an input validation so we need to return objects for function reads -function tryParsingParamReturnValues(fn: (x: any) => {}, param: any) { +// new starknet react hooks (v3) doesnt use raw parse +function tryParsingParamReturnValues( + fn: (x: any) => {}, + param: any, + isReadArgsParsing: boolean, +) { try { const objectValue = fn(param); - if (typeof objectValue === "object" && objectValue !== null) { + if ( + typeof objectValue === "object" && + objectValue !== null && + !isReadArgsParsing + ) { // handle empty array return Object.values(objectValue).map((value) => { if (Array.isArray(value) && value.length === 0) return "0x0"; @@ -406,223 +430,346 @@ function tryParsingParamReturnObject(fn: (x: any) => {}, param: any) { } } -//@ts-ignore -export function parseParamWithType( - paramType: string, - param: any, - isRead: boolean, -) { - if (isRead) { - if (isCairoTuple(paramType)) { - return objectToCairoTuple(param, paramType); - } else if (isCairoArray(paramType)) { - return tryParsingParamReturnObject((param) => { - const genericType = parseGenericType(paramType)[0]; - return genericType - ? //@ts-ignore - param.map((item) => parseParamWithType(genericType, item, isRead)) - : param; - }, param); - } else if (isCairoOption(paramType)) { - //@ts-ignore - return tryParsingParamReturnObject((x) => { - const option = x as CairoOption; - return option.isNone() - ? "None" - : `Some(${parseParamWithType(paramType.split("<").pop()!, option.unwrap(), isRead)})`; - }, param); - } else if (isCairoResult(paramType)) { - //@ts-ignore - return tryParsingParamReturnObject((x) => { - const result = x as CairoResult; - const [ok, error] = parseGenericType(paramType); - return result.isOk() - ? `Ok(${parseParamWithType(ok, result.unwrap(), isRead)})` - : `Err(${parseParamWithType(error, result.unwrap(), isRead)})`; - }, param); - } else if (isCairoU256(paramType)) { - return tryParsingParamReturnObject(uint256.uint256ToBN, param); - } else if (isCairoByteArray(paramType)) { - return tryParsingParamReturnObject(byteArray.stringFromByteArray, param); - } else if (isCairoContractAddress(paramType)) { - return tryParsingParamReturnObject(validateAndParseAddress, param); - } else if (isCairoFelt(paramType)) { - return feltToHex(param); - } else if (isCairoBool(paramType)) { - return typeof param === "boolean" - ? param - : (param as string).startsWith("0x0") - ? "false" - : "true"; - } else if (isCairoBytes31(paramType)) { - return tryParsingParamReturnObject( - (x: bigint) => `0x${x.toString(16)}`, - param, - ); - } else if (isCairoInt(paramType)) { - return tryParsingParamReturnObject( - (x) => (typeof x === "bigint" ? Number(x) : parseInt(x, 16)), - param, - ); - } else if (isCairoBigInt(paramType)) { - return tryParsingParamReturnObject((x) => BigInt(x), param); - } else { - return tryParsingParamReturnObject((x) => x, param); - } - } else { - if (isCairoTuple(paramType)) { - return tryParsingParamReturnValues( - (x) => stringToObjectTuple(x, paramType), - param, - ); - } else if (isCairoArray(paramType)) { +const decodeParamsWithType = (paramType: string, param: any): unknown => { + const isRead = true; + if (isCairoTuple(paramType)) { + return objectToCairoTuple(param, paramType); + } else if (isCairoArray(paramType)) { + return tryParsingParamReturnObject((param) => { const genericType = parseGenericType(paramType)[0]; + return genericType + ? // @ts-expect-error item type is unknown + param.map((item) => parseParamWithType(genericType, item, isRead)) + : param; + }, param); + } else if (isCairoOption(paramType)) { + return tryParsingParamReturnObject((x) => { + const option = x as CairoOption; + return option.isNone() + ? "None" + : `Some(${parseParamWithType(paramType.split("<").pop()!, option.unwrap(), isRead)})`; + }, param); + } else if (isCairoResult(paramType)) { + return tryParsingParamReturnObject((x) => { + const result = x as CairoResult; + const [ok, error] = parseGenericType(paramType); + return result.isOk() + ? `Ok(${parseParamWithType(ok, result.unwrap(), isRead)})` + : `Err(${parseParamWithType(error, result.unwrap(), isRead)})`; + }, param); + } else if (isCairoContractAddress(paramType)) { + return tryParsingParamReturnObject( + getChecksumAddress, + `0x${param.toString(16)}`, + ); + } else if (isCairoU256(paramType)) { + return tryParsingParamReturnObject(uint256.uint256ToBN, param); + } else if (isCairoByteArray(paramType)) { + return tryParsingParamReturnObject(byteArray.stringFromByteArray, param); + } else if (isCairoFelt(paramType)) { + return feltToHex(param); + } else if (isCairoBool(paramType)) { + return typeof param === "boolean" + ? param + : (param as string).startsWith("0x0") + ? "false" + : "true"; + } else if (isCairoBytes31(paramType)) { + return tryParsingParamReturnObject( + (x: bigint) => `0x${x.toString(16)}`, + param, + ); + } else if (isCairoInt(paramType)) { + return tryParsingParamReturnObject( + (x) => (typeof x === "bigint" ? Number(x) : parseInt(x, 16)), + param, + ); + } else if (isCairoBigInt(paramType)) { + return tryParsingParamReturnObject((x) => BigInt(x), param); + } else { + return tryParsingParamReturnObject((x) => x, param); + } +}; - // if we have to process string - if (typeof param === "string") { - const tokens = param.split(","); - if (genericType) { - //@ts-ignore - return [ - tokens.length, - ...tokens - //@ts-ignore - .map((item) => - parseParamWithType(genericType, item.trim(), isRead), - ), - ]; - } else { - return param; - } - } - - // if we have to process array - else if (Array.isArray(param)) { - if (genericType) { - //@ts-ignore - return [ - param.length, - ...param - //@ts-ignore - .map((item) => parseParamWithType(genericType, item, isRead)), - ]; - } else { - return param; - } +const encodeParamsWithType = ( + paramType: string = "", + param: any, + isReadArgsParsing: boolean, +): unknown => { + if (isCairoTuple(paramType)) { + return tryParsingParamReturnValues( + (x) => stringToObjectTuple(x, paramType, isReadArgsParsing), + param, + isReadArgsParsing, + ); + } else if (isCairoArray(paramType)) { + const genericType = parseGenericType(paramType)[0]; + + // if we have to process string + if (typeof param === "string") { + const tokens = param.split(","); + const encodedArray = []; + if (genericType) { + if (!isReadArgsParsing) encodedArray.push(tokens.length); + + encodedArray.push( + ...tokens.map((item) => + encodeParamsWithType( + genericType, + typeof item === "string" ? item.trim() : item, + isReadArgsParsing, + ), + ), + ); + + return encodedArray; + } else { + return param; } + } - // fallback - else { + // if we have to process array + else if (Array.isArray(param)) { + if (genericType) { + const encodedArray = []; + if (!isReadArgsParsing) encodedArray.push(param.length); + + encodedArray.push( + ...param.map((item) => + encodeParamsWithType( + genericType, + typeof item === "string" ? item.trim() : item, + isReadArgsParsing, + ), + ), + ); + + return encodedArray; + } else { return param; } - } else if (isCairoOption(paramType)) { - if (param === "None") { - return new CairoOption(CairoOptionVariant.None); - } - const type = parseGenericType(paramType); - const parsedParam = param.slice(5, param.length - 1); - //@ts-ignore - const parsedValue = parseParamWithType( - type as string, - parsedParam, - isRead, - ); - return new CairoOption(CairoOptionVariant.Some, parsedValue); - } else if (isCairoU256(paramType)) { - return tryParsingParamReturnValues(uint256.bnToUint256, param); - } else if (isCairoFelt(paramType)) { + } + + // fallback + else { return param; - } else if (isCairoByteArray(paramType)) { - return tryParsingParamReturnValues(byteArray.byteArrayFromString, param); - } else if (isCairoContractAddress(paramType)) { - return tryParsingParamReturnValues(validateAndParseAddress, param); - } else if (isCairoBool(paramType)) { - return param == "false" ? "0x0" : "0x1"; - } else if (isCairoResult(paramType)) { - if (param) { - const variantType = - param.variant.Ok && param.variant.Ok.value - ? param.variant.Ok - : param.variant.Err; - const variantValue = variantType.value; - - const resultVariant = - variantType === param.variant.Ok && param.variant.Ok.value - ? CairoResultVariant.Ok - : CairoResultVariant.Err; - const valueType: any = isCairoU256(variantType.type) - ? uint256.bnToUint256(variantValue) - : isCairoByteArray(variantType.type) - ? byteArray.byteArrayFromString(variantValue) - : parseParamWithType(variantType.type, variantValue, false); - - return new CairoResult(resultVariant, valueType); - } - } else { - try { - if (typeof param.variant == "object" && param.variant !== null) { - const parsedVariant = Object.keys(param.variant).reduce( - (acc, key) => { - if ( - param.variant[key].value === "" || - param.variant[key].value === undefined - ) { - acc[key] = undefined; - return acc; - } - - acc[key] = parseParamWithType( - param.variant[key].type, - param.variant[key].value, - false, - ); + } + } else if (isCairoOption(paramType)) { + if (param === "None") { + return new CairoOption(CairoOptionVariant.None); + } + const type = parseGenericType(paramType); + const parsedParam = param.slice(5, param.length - 1); + const parsedValue = encodeParamsWithType( + type as string, + parsedParam, + isReadArgsParsing, + ); + return new CairoOption(CairoOptionVariant.Some, parsedValue); + } else if (isCairoU256(paramType)) { + return tryParsingParamReturnValues( + uint256.bnToUint256, + param, + isReadArgsParsing, + ); + } else if (isCairoFelt(paramType)) { + return param; + } else if (isCairoByteArray(paramType)) { + // starknet react next version only needs raw strings + if (isReadArgsParsing) return param; + + return tryParsingParamReturnValues( + byteArray.byteArrayFromString, + param, + isReadArgsParsing, + ); + } else if (isCairoContractAddress(paramType)) { + return tryParsingParamReturnValues( + validateAndParseAddress, + param, + isReadArgsParsing, + ); + } else if (isCairoBool(paramType)) { + return param == "false" ? "0x0" : "0x1"; + } else if (isCairoResult(paramType)) { + if (param) { + const variantType = + param.variant.Ok && param.variant.Ok.value + ? param.variant.Ok + : param.variant.Err; + const variantValue = variantType.value; + + const resultVariant = + variantType === param.variant.Ok && param.variant.Ok.value + ? CairoResultVariant.Ok + : CairoResultVariant.Err; + const valueType: any = encodeParamsWithType( + variantType.type, + variantValue, + isReadArgsParsing, + ); + + return new CairoResult(resultVariant, valueType); + } + } else { + try { + // custom enum encoding + if (param?.variant && typeof param.variant == "object") { + const parsedVariant = Object.keys(param.variant).reduce( + (acc, key) => { + if ( + param.variant[key].value === "" || + param.variant[key].value === undefined + ) { + acc[key] = undefined; return acc; - }, - {} as Record, - ); + } + + acc[key] = encodeParamsWithType( + param.variant[key].type, + param.variant[key].value, + isReadArgsParsing, + ); + return acc; + }, + {} as Record, + ); - const isDevnet = - scaffoldConfig.targetNetworks[0].network.toString() === "devnet"; + const isDevnet = + scaffoldConfig.targetNetworks[0].network.toString() === "devnet"; - const encodedCustomEnum = - encodeCustomEnumWithParsedVariants(parsedVariant); + if (isReadArgsParsing) return new CairoCustomEnum(parsedVariant); - return Object.values(parsedVariant).length > 0 - ? isDevnet - ? encodedCustomEnum - : [[encodedCustomEnum]] - : undefined; - } else { - return Object.keys(param).reduce((acc, key) => { - const parsed = parseParamWithType( + const encodedCustomEnum = + encodeCustomEnumWithParsedVariants(parsedVariant); + + return Object.values(parsedVariant).length > 0 + ? isDevnet + ? encodedCustomEnum + : [[encodedCustomEnum]] + : undefined; + } + + // encode to object (v3) + else if (!!isReadArgsParsing) { + return Object.keys(param).reduce( + (acc, key) => { + const parsed = encodeParamsWithType( param[key].type, param[key].value, - false, + isReadArgsParsing, ); if (parsed !== undefined && parsed !== "") { - if (Array.isArray(parsed)) { - acc.push(...parsed); - } else { - acc.push(parsed); - } + acc[key] = parsed; } return acc; - }, [] as any[]); - } - } catch (err) { - //console.log(err); - return param; + }, + {} as Record, + ); } + + // encode to rawargs + else { + return Object.keys(param).reduce((acc, key) => { + const parsed = encodeParamsWithType( + param[key].type, + param[key].value, + isReadArgsParsing, + ); + + if (parsed !== undefined && parsed !== "") { + if (Array.isArray(parsed)) { + acc.push(...parsed); + } else { + acc.push(parsed); + } + } + return acc; + }, [] as any[]); + } + } catch (err: any) { + console.error(err.stack); + return param; } } +}; + +export function parseParamWithType( + paramType: string, + param: any, + isRead: boolean, + isReadArgsParsing?: boolean, +): any { + if (isRead) return decodeParamsWithType(paramType, param); + return encodeParamsWithType(paramType, param, !!isReadArgsParsing); } -export function parseFunctionParams( - abiFunction: AbiFunction, - inputs: any[], +export function deepParseValues( + value: any, isRead: boolean, -) { + keyAndType?: any, + isReadArgsParsing?: boolean, +): any { + if (keyAndType) { + return parseParamWithType(keyAndType, value, isRead, isReadArgsParsing); + } + if (typeof value === "string") { + if (isJsonString(value)) { + const parsed = JSON.parse(value); + return deepParseValues(parsed, isRead, null, isReadArgsParsing); + } else { + // It's a string but not a JSON string, return as is + return value; + } + } else if (Array.isArray(value)) { + // If it's an array, recursively parse each element + return value.map((element) => + deepParseValues(element, isRead, null, isReadArgsParsing), + ); + } else if (typeof value === "object" && value !== null) { + // If it's an object, recursively parse each value + return Object.entries(value).reduce((acc: any, [key, val]) => { + acc[key] = deepParseValues(val, isRead, key, isReadArgsParsing); + return acc; + }, {}); + } + + // Handle boolean values represented as strings + if ( + value === "true" || + value === "1" || + value === "0x1" || + value === "0x01" || + value === "0x0001" + ) { + return true; + } else if ( + value === "false" || + value === "0" || + value === "0x0" || + value === "0x00" || + value === "0x0000" + ) { + return false; + } + + return value; +} + +export function parseFunctionParams({ + abiFunction, + abi, + inputs, + isRead, + isReadArgsParsing = false, +}: { + abiFunction: AbiFunction; + abi: Abi; + inputs: any[]; + isRead: boolean; + isReadArgsParsing?: boolean; +}) { let parsedInputs: any[] = []; //check inputs length @@ -630,13 +777,94 @@ export function parseFunctionParams( return inputs; } - inputs.forEach((input, idx) => { - const paramType = abiFunction.inputs[idx].type; - parsedInputs.push(parseParamWithType(paramType, input, isRead)); + const formattedInputs = formatInputForParsing({ + abi, + abiFunction, + args: inputs, + }); + + console.debug({ formattedInputs }); + + formattedInputs.forEach((inputItem) => { + const { type: inputType, value: inputValue } = inputItem; + + parsedInputs.push( + parseParamWithType(inputType, inputValue, isRead, !!isReadArgsParsing), + ); }); + return parsedInputs; } +// helper to correctly map out types to values +function formatInputForParsing({ + abi, + abiFunction, + args, +}: { + abi: Abi; + abiFunction: AbiFunction; + args: any[]; +}) { + const _formatInput = ( + arg: any, + index: number, + inputsOrMembers: AbiParameter[], + ) => { + const { type: inputType } = inputsOrMembers[index]; + + // terminate at Cairo primitives + if ( + isCairoType(inputType) || + isCairoArray(inputType) || + isCairoTuple(inputType) + ) { + return { type: inputType, value: arg }; + } + + // object parsing + // find struct definition in abi + const structDef = abi.find((item) => item.name === inputType); + const { type: structType, name: structName } = structDef as + | AbiStruct + | AbiEnum; + + // enums + if (structType === "enum") { + const { variants } = structDef as AbiEnum; + const argKeys = Object.keys(arg); + const formattedEntries = argKeys.map((argKey, argIndex): any => { + // get the value + const structValue = arg[argKey]; + return [ + argKey, + _formatInput(structValue, argIndex, variants as AbiParameter[]), + ]; + }); + return { type: structName, value: { variant: Object.fromEntries } }; + } + + const { members } = structDef as AbiStruct; + const argKeys = Object.keys(arg); + const formattedEntries = argKeys.map((argKey, argIndex): any => { + // get the value + const structValue = arg[argKey]; + return [ + argKey, + _formatInput(structValue, argIndex, members as AbiParameter[]), + ]; + }); + return { + type: structName, + value: Object.fromEntries(formattedEntries), + }; + }; + + return args.map((arg, index) => + _formatInput(arg, index, abiFunction.inputs as AbiParameter[]), + ); +} + function parseTuple(value: string): string[] { const values: string[] = []; let depth = 0; @@ -674,7 +902,7 @@ function objectToCairoTuple(obj: { [key: number]: any }, type: string): string { const index = parseInt(key, 10); const value = obj[index]; const valueType = types[index]; - return parseParamWithType(valueType, value, true); + return decodeParamsWithType(valueType, value); }) .join(","); @@ -684,13 +912,14 @@ function objectToCairoTuple(obj: { [key: number]: any }, type: string): string { function stringToObjectTuple( tupleString: string, paramType: string, + isReadArgsParsing?: boolean, ): { [key: number]: any } { const values = parseTuple(tupleString); const types = parseTuple(paramType); const obj: { [key: number]: any } = {}; values.forEach((value, index) => { - obj[index] = parseParamWithType(types[index], value, false); + obj[index] = encodeParamsWithType(types[index], value, !!isReadArgsParsing); }); return obj; diff --git a/packages/nextjs/utils/scaffold-stark/fetchPriceFromCoingecko.ts b/packages/nextjs/utils/scaffold-stark/fetchPriceFromCoingecko.ts index 801258b6..5c2679ed 100644 --- a/packages/nextjs/utils/scaffold-stark/fetchPriceFromCoingecko.ts +++ b/packages/nextjs/utils/scaffold-stark/fetchPriceFromCoingecko.ts @@ -13,7 +13,6 @@ export const fetchPriceFromCoingecko = async ( // Check cache first if (priceCache[symbol] !== undefined) { - console.log(`Returning cached price for ${symbol}`); return priceCache[symbol]; } @@ -37,7 +36,6 @@ const updatePriceCache = async ( const data = await response.json(); const price = symbol === "ETH" ? data.ethereum.usd : data.starknet.usd; priceCache[symbol] = price; - console.log(`Price updated for ${symbol}: ${price}`); return price; } catch (error) { console.error( diff --git a/packages/nextjs/vitest.config.ts b/packages/nextjs/vitest.config.ts new file mode 100644 index 00000000..9c594e04 --- /dev/null +++ b/packages/nextjs/vitest.config.ts @@ -0,0 +1,15 @@ +import { defineConfig } from "vitest/config"; +import react from "@vitejs/plugin-react"; +import path from "path"; + +export default defineConfig({ + plugins: [react()], + test: { + environment: "jsdom", + }, + resolve: { + alias: { + "~~": path.resolve(__dirname, "./"), + }, + }, +}); diff --git a/packages/snfoundry/.env.example b/packages/snfoundry/.env.example index 430eac5c..a1f9ac80 100644 --- a/packages/snfoundry/.env.example +++ b/packages/snfoundry/.env.example @@ -4,7 +4,7 @@ # ## last staknet devnet account address # ACCOUNT_ADDRESS_DEVNET=0x4b3f4ba8c00a02b66142a4b1dd41a4dfab4f92650922a3280977b0f03c75ee1 -## Sepolia +## Sepolia PRIVATE_KEY_SEPOLIA= RPC_URL_SEPOLIA=https://starknet-sepolia.public.blastapi.io/rpc/v0_7 ACCOUNT_ADDRESS_SEPOLIA= \ No newline at end of file diff --git a/packages/snfoundry/contracts/Scarb.lock b/packages/snfoundry/contracts/Scarb.lock index 96ff4695..ddd9fd8e 100644 --- a/packages/snfoundry/contracts/Scarb.lock +++ b/packages/snfoundry/contracts/Scarb.lock @@ -5,16 +5,76 @@ version = 1 name = "contracts" version = "0.2.0" dependencies = [ - "openzeppelin", + "openzeppelin_access", + "openzeppelin_token", + "openzeppelin_utils", "snforge_std", ] [[package]] -name = "openzeppelin" -version = "0.14.0" -source = "git+https://github.com/OpenZeppelin/cairo-contracts.git?tag=v0.14.0#f091c4f51ddeb10297db984acae965328c5a4e5b" +name = "openzeppelin_access" +version = "0.17.0" +source = "registry+https://scarbs.xyz/" +checksum = "sha256:541bb8fdf1ad17fe0d275b00acb9f0d7f56ea5534741e21535ac3fda2c600281" +dependencies = [ + "openzeppelin_introspection", + "openzeppelin_utils", +] + +[[package]] +name = "openzeppelin_account" +version = "0.17.0" +source = "registry+https://scarbs.xyz/" +checksum = "sha256:c4e11609fdd1f4c3d3004cd1468711bd2ea664739c9e59a4b270567fe4c23ee3" +dependencies = [ + "openzeppelin_introspection", + "openzeppelin_utils", +] + +[[package]] +name = "openzeppelin_governance" +version = "0.17.0" +source = "registry+https://scarbs.xyz/" +checksum = "sha256:b7e0142d88d69a8c367aea8c9dc7f659f27372551efc23f39a0cf71a189c1302" +dependencies = [ + "openzeppelin_access", + "openzeppelin_introspection", +] + +[[package]] +name = "openzeppelin_introspection" +version = "0.17.0" +source = "registry+https://scarbs.xyz/" +checksum = "sha256:892433a4a1ea0fc9cf7cdb01e06ddc2782182abcc188e4ea5dd480906d006cf8" + +[[package]] +name = "openzeppelin_token" +version = "0.17.0" +source = "registry+https://scarbs.xyz/" +checksum = "sha256:77997a7e217b69674c34b402dc0c7b2210540db66a56087572679c31896eaabb" +dependencies = [ + "openzeppelin_account", + "openzeppelin_governance", + "openzeppelin_introspection", +] + +[[package]] +name = "openzeppelin_utils" +version = "0.17.0" +source = "registry+https://scarbs.xyz/" +checksum = "sha256:36d93e353f42fd6b824abcd8b4b51c3f5d02c893c5f886ae81403b0368aa5fde" + +[[package]] +name = "snforge_scarb_plugin" +version = "0.2.0" +source = "registry+https://scarbs.xyz/" +checksum = "sha256:2e4ce3ebe3f49548bd26908391b5d78537a765d827df0d96c32aeb88941d0d67" [[package]] name = "snforge_std" -version = "0.27.0" -source = "git+https://github.com/foundry-rs/starknet-foundry?tag=v0.27.0#2d99b7c00678ef0363881ee0273550c44a9263de" +version = "0.30.0" +source = "registry+https://scarbs.xyz/" +checksum = "sha256:2f3c4846881813ac0f5d1460981249c9f5e2a6831e752beedf9b70975495b4ec" +dependencies = [ + "snforge_scarb_plugin", +] diff --git a/packages/snfoundry/contracts/Scarb.toml b/packages/snfoundry/contracts/Scarb.toml index 623c1b3f..471f54d0 100644 --- a/packages/snfoundry/contracts/Scarb.toml +++ b/packages/snfoundry/contracts/Scarb.toml @@ -6,9 +6,15 @@ edition = "2023_11" # See more keys and their definitions at https://docs.swmansion.com/scarb/docs/reference/manifest.html [dependencies] -starknet = "2.6.4" -openzeppelin = { git = "https://github.com/OpenZeppelin/cairo-contracts.git", tag = "v0.14.0" } -snforge_std = { git = "https://github.com/foundry-rs/starknet-foundry", tag = "v0.27.0" } +starknet = "2.8.2" +# Change to just "openzeppelin" to use full features +openzeppelin_access = "0.17.0" +openzeppelin_token = "0.17.0" + +[dev-dependencies] +openzeppelin_utils = "0.17.0" +snforge_std = "0.30.0" + [[target.starknet-contract]] casm = true diff --git a/packages/snfoundry/contracts/src/YourContract.cairo b/packages/snfoundry/contracts/src/YourContract.cairo index 21e18509..a6b37854 100644 --- a/packages/snfoundry/contracts/src/YourContract.cairo +++ b/packages/snfoundry/contracts/src/YourContract.cairo @@ -1,15 +1,16 @@ #[starknet::interface] pub trait IYourContract { - fn gretting(self: @TContractState) -> ByteArray; - fn set_gretting(ref self: TContractState, new_greeting: ByteArray, amount_eth: u256); + fn greeting(self: @TContractState) -> ByteArray; + fn set_greeting(ref self: TContractState, new_greeting: ByteArray, amount_eth: u256); fn withdraw(ref self: TContractState); fn premium(self: @TContractState) -> bool; } #[starknet::contract] mod YourContract { - use openzeppelin::access::ownable::OwnableComponent; - use openzeppelin::token::erc20::interface::{IERC20CamelDispatcher, IERC20CamelDispatcherTrait}; + use openzeppelin_access::ownable::OwnableComponent; + use openzeppelin_token::erc20::interface::{IERC20CamelDispatcher, IERC20CamelDispatcherTrait}; + use starknet::storage::Map; use starknet::{ContractAddress, contract_address_const}; use starknet::{get_caller_address, get_contract_address}; use super::{IYourContract}; @@ -47,7 +48,7 @@ mod YourContract { greeting: ByteArray, premium: bool, total_counter: u256, - user_gretting_counter: LegacyMap, + user_greeting_counter: Map, #[substorage(v0)] ownable: OwnableComponent::Storage, } @@ -62,17 +63,18 @@ mod YourContract { #[abi(embed_v0)] impl YourContractImpl of IYourContract { - fn gretting(self: @ContractState) -> ByteArray { + fn greeting(self: @ContractState) -> ByteArray { self.greeting.read() } - fn set_gretting(ref self: ContractState, new_greeting: ByteArray, amount_eth: u256) { + fn set_greeting(ref self: ContractState, new_greeting: ByteArray, amount_eth: u256) { self.greeting.write(new_greeting); self.total_counter.write(self.total_counter.read() + 1); - let user_counter = self.user_gretting_counter.read(get_caller_address()); - self.user_gretting_counter.write(get_caller_address(), user_counter + 1); + let user_counter = self.user_greeting_counter.read(get_caller_address()); + self.user_greeting_counter.write(get_caller_address(), user_counter + 1); if amount_eth > 0 { - // In `Debug Contract` or UI implementation call `approve` on ETH contract before invoke fn set_gretting() + // In `Debug Contract` or UI implementation call `approve` on ETH contract before + // invoke fn set_greeting() self .eth_token .read() diff --git a/packages/snfoundry/contracts/src/test/TestContract.cairo b/packages/snfoundry/contracts/src/test/TestContract.cairo index 8b137891..170dc237 100644 --- a/packages/snfoundry/contracts/src/test/TestContract.cairo +++ b/packages/snfoundry/contracts/src/test/TestContract.cairo @@ -1 +1,18 @@ +use openzeppelin_utils::serde::SerializedAppend; +use snforge_std::{declare, ContractClassTrait, DeclareResultTrait}; +use starknet::{ContractAddress, contract_address_const}; +fn OWNER() -> ContractAddress { + contract_address_const::<'OWNER'>() +} + +fn deploy_contract(name: ByteArray) -> ContractAddress { + let contract = declare(name).unwrap().contract_class(); + let mut calldata = array![]; + calldata.append_serde(OWNER()); + let (contract_address, _) = contract.deploy(@calldata).unwrap(); + contract_address +} + +#[test] +fn test_deployment_values() {} diff --git a/packages/snfoundry/package.json b/packages/snfoundry/package.json index 06aa5cc1..6a6ffb60 100644 --- a/packages/snfoundry/package.json +++ b/packages/snfoundry/package.json @@ -27,7 +27,7 @@ "dotenv": "^16.3.1", "envfile": "^6.18.0", "prettier": "^2.8.8", - "starknet": "6.7.0", + "starknet": "6.12.1", "toml": "^3.0.0", "tslib": "^2.6.2" } diff --git a/packages/snfoundry/scripts-ts/deploy-contract.ts b/packages/snfoundry/scripts-ts/deploy-contract.ts index dd9ed7c6..0dfa018d 100644 --- a/packages/snfoundry/scripts-ts/deploy-contract.ts +++ b/packages/snfoundry/scripts-ts/deploy-contract.ts @@ -10,13 +10,16 @@ import { extractContractHashes, DeclareContractPayload, UniversalDetails, + isSierra, } from "starknet"; import { DeployContractParams, Network } from "./types"; import { green, red, yellow } from "./helpers/colorize-log"; +import { getTxVersion } from "./helpers/fees"; interface Arguments { network: string; reset: boolean; + fee?: string; [x: string]: unknown; _: (string | number)[]; $0: string; @@ -34,10 +37,18 @@ const argv = yargs(process.argv.slice(2)) description: "Reset deployments", default: false, }) + .option("fee", { + type: "string", + description: "Specify the fee token", + demandOption: false, + choices: ["eth", "strk"], + default: "eth", + }) .parseSync() as Arguments; const networkName: string = argv.network; const resetDeployments: boolean = argv.reset; +const feeToken: string = argv.fee; let deployments = {}; let deployCalls = []; @@ -53,7 +64,16 @@ const declareIfNot_NotWait = async ( await provider.getClassByHash(declareContractPayload.classHash); } catch (error) { try { - const { transaction_hash } = await deployer.declare(payload, options); + const isSierraContract = isSierra(payload.contract); + const txVersion = await getTxVersion( + networks[networkName], + feeToken, + isSierraContract + ); + const { transaction_hash } = await deployer.declare(payload, { + ...options, + version: txVersion, + }); if (networkName === "sepolia" || networkName === "mainnet") { await provider.waitForTransaction(transaction_hash); } @@ -233,7 +253,11 @@ const executeDeployCalls = async (options?: UniversalDetails) => { } try { - let { transaction_hash } = await deployer.execute(deployCalls, options); + const txVersion = await getTxVersion(networks[networkName], feeToken); + let { transaction_hash } = await deployer.execute(deployCalls, { + ...options, + version: txVersion, + }); console.log(green("Deploy Calls Executed at "), transaction_hash); if (networkName === "sepolia" || networkName === "mainnet") { await provider.waitForTransaction(transaction_hash); @@ -252,6 +276,7 @@ const executeDeployCalls = async (options?: UniversalDetails) => { } } }; + const loadExistingDeployments = () => { const networkPath = path.resolve( __dirname, diff --git a/packages/snfoundry/scripts-ts/helpers/deploy-wrapper.ts b/packages/snfoundry/scripts-ts/helpers/deploy-wrapper.ts index 60ecb945..7584c5c0 100644 --- a/packages/snfoundry/scripts-ts/helpers/deploy-wrapper.ts +++ b/packages/snfoundry/scripts-ts/helpers/deploy-wrapper.ts @@ -7,18 +7,20 @@ interface CommandLineOptions { $0: string; // The script name or path is under the `$0` key network?: string; // The --network option reset?: boolean; + fee?: string; } const argv = yargs(process.argv.slice(2)) .options({ network: { type: "string" }, reset: { type: "boolean", default: false }, + fee: { type: "string", choices: ["eth", "strk"], default: "eth" }, }) .parseSync() as CommandLineOptions; // Set the NETWORK environment variable based on the --network argument process.env.NETWORK = argv.network || "devnet"; - +process.env.FEE_TOKEN = argv.fee || "eth"; // Set the RESET environment variable based on the --reset flag // Execute the deploy script @@ -26,6 +28,8 @@ execSync( "cd contracts && scarb build && ts-node ../scripts-ts/deploy.ts" + " --network " + process.env.NETWORK + + " --fee " + + process.env.FEE_TOKEN + (argv.reset ? " --reset" : "") + " && ts-node ../scripts-ts/helpers/parse-deployments.ts" + " && cd ..", diff --git a/packages/snfoundry/scripts-ts/helpers/fees.ts b/packages/snfoundry/scripts-ts/helpers/fees.ts new file mode 100644 index 00000000..9a6dd8c1 --- /dev/null +++ b/packages/snfoundry/scripts-ts/helpers/fees.ts @@ -0,0 +1,122 @@ +import { + CairoContract, + CompiledSierra, + Contract, + Provider, + uint256, + Abi, +} from "starknet"; +import { red, yellow } from "./colorize-log"; +import { Network } from "../types"; +import { isString } from "util"; + +export const erc20ABI = [ + { + inputs: [ + { + name: "account", + type: "felt", + }, + ], + name: "balanceOf", + outputs: [ + { + name: "balance", + type: "Uint256", + }, + ], + stateMutability: "view", + type: "function", + }, +] satisfies Abi; + +//function to decide preferred token for fee payment +export async function getTxVersion( + network: Network, + feeToken: string, + isSierra?: boolean +) { + const { feeToken: feeTokenOptions, provider, deployer } = network; + + //check the specified feeToken + const specifiedToken = feeTokenOptions.find( + (token) => token.name === feeToken + ); + if (specifiedToken) { + const balance = await getBalance( + deployer.address, + provider, + specifiedToken.address + ); + if (balance > 0n) { + console.log(yellow(`Using ${feeToken.toUpperCase()} as fee token`)); + return getTxVersionFromFeeToken(feeToken, isSierra); + } + console.log( + red(`${feeToken.toUpperCase()} balance is zero, trying other options`) + ); + } + + // Check other options + for (const token of feeTokenOptions) { + if (token.name !== feeToken) { + const balance = await getBalance( + deployer.address, + provider, + token.address + ); + if (balance > 0n) { + console.log(yellow(`Using ${token.name.toUpperCase()} as fee token`)); + return getTxVersionFromFeeToken(token.name, isSierra); + } + console.log( + red(`${token.name.toUpperCase()} balance is zero, trying next option`) + ); + } + } + + console.error( + red( + "Error: Unable to find a fee token with sufficient balance. Please fund your wallet first." + ) + ); + throw new Error("No fee token with balance found"); +} + +export async function getBalance( + account: string, + provider: Provider, + tokenAddress: string +): Promise { + try { + const contract = new Contract(erc20ABI, tokenAddress, provider); + const { balance } = await contract.balanceOf(account); + return uint256.uint256ToBN(balance); + } catch (error) { + console.error("Error fetching balance:", error); + return 0n; + } +} + +function getTxVersionFromFeeToken(feeToken: string, isSierra?: boolean) { + return feeToken === "strk" + ? TransactionVersion.V3 + : isSierra + ? TransactionVersion.V2 + : TransactionVersion.V1; +} + +/** + * V_ Transaction versions HexString + * F_ Fee Transaction Versions HexString (2 ** 128 + TRANSACTION_VERSION) + */ +export enum TransactionVersion { + V0 = "0x0", + V1 = "0x1", + V2 = "0x2", + V3 = "0x3", + F0 = "0x100000000000000000000000000000000", + F1 = "0x100000000000000000000000000000001", + F2 = "0x100000000000000000000000000000002", + F3 = "0x100000000000000000000000000000003", +} diff --git a/packages/snfoundry/scripts-ts/helpers/networks.ts b/packages/snfoundry/scripts-ts/helpers/networks.ts index 215367a7..d424f178 100644 --- a/packages/snfoundry/scripts-ts/helpers/networks.ts +++ b/packages/snfoundry/scripts-ts/helpers/networks.ts @@ -20,6 +20,11 @@ const deployerDevnet = PRIVATE_KEY_DEVNET && new Account(providerDevnet, ACCOUNT_ADDRESS_DEVNET, PRIVATE_KEY_DEVNET, "1"); +const ETH_TOKEN_ADDRESS_DEVNET = + "0x49D36570D4E46F48E99674BD3FCC84644DDD6B96F7C741B1562B82F9E004DC7"; +const STRK_TOKEN_ADDRESS_DEVNET = + "0x04718f5a0fc34cc1af16a1cdee98ffb20c31f5cd61d6ab07201858f4287c938d"; + // sepolia const providerSepolia = process.env.RPC_URL_SEPOLIA && @@ -34,6 +39,11 @@ const deployerSepolia = "1" ); +const ETH_TOKEN_ADDRESS = + "0x049d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7"; +const STRK_TOKEN_ADDRESS = + "0x04718f5a0fc34cc1af16a1cdee98ffb20c31f5cd61d6ab07201858f4287c938d"; + // mainnet const providerMainnet = process.env.RPC_URL_MAINNET && @@ -48,8 +58,35 @@ const deployerMainnet = "1" ); +const feeTokenOptions = { + devnet: [ + { name: "eth", address: ETH_TOKEN_ADDRESS_DEVNET }, + { name: "strk", address: STRK_TOKEN_ADDRESS_DEVNET }, + ], + mainnet: [ + { name: "eth", address: ETH_TOKEN_ADDRESS }, + { name: "strk", address: STRK_TOKEN_ADDRESS }, + ], + sepolia: [ + { name: "eth", address: ETH_TOKEN_ADDRESS }, + { name: "strk", address: STRK_TOKEN_ADDRESS }, + ], +}; + export const networks: Networks = { - devnet: { provider: providerDevnet, deployer: deployerDevnet }, - sepolia: { provider: providerSepolia, deployer: deployerSepolia }, - mainnet: { provider: providerMainnet, deployer: deployerMainnet }, + devnet: { + provider: providerDevnet, + deployer: deployerDevnet, + feeToken: feeTokenOptions.devnet, + }, + sepolia: { + provider: providerSepolia, + deployer: deployerSepolia, + feeToken: feeTokenOptions.sepolia, + }, + mainnet: { + provider: providerMainnet, + deployer: deployerMainnet, + feeToken: feeTokenOptions.mainnet, + }, }; diff --git a/packages/snfoundry/scripts-ts/types.ts b/packages/snfoundry/scripts-ts/types.ts index eabc5c9f..d839f902 100644 --- a/packages/snfoundry/scripts-ts/types.ts +++ b/packages/snfoundry/scripts-ts/types.ts @@ -5,6 +5,7 @@ export type Networks = Record<"devnet" | "sepolia" | "mainnet", Network>; export type Network = { provider: RpcProvider; deployer: Account; + feeToken: { name: string; address: string }[]; }; export type DeployContractParams = { @@ -12,4 +13,4 @@ export type DeployContractParams = { contractName?: string; constructorArgs?: RawArgs; options?: UniversalDetails; -}; +}; \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index 8a1f742a..f1f8dce3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5,6 +5,13 @@ __metadata: version: 6 cacheKey: 8 +"@adraffy/ens-normalize@npm:1.10.0": + version: 1.10.0 + resolution: "@adraffy/ens-normalize@npm:1.10.0" + checksum: af0540f963a2632da2bbc37e36ea6593dcfc607b937857133791781e246d47f870d5e3d21fa70d5cfe94e772c284588c81ea3f5b7f4ea8fbb824369444e4dbcb + languageName: node + linkType: hard + "@adraffy/ens-normalize@npm:1.10.1": version: 1.10.1 resolution: "@adraffy/ens-normalize@npm:1.10.1" @@ -19,12 +26,248 @@ __metadata: languageName: node linkType: hard -"@babel/runtime@npm:^7.13.10": - version: 7.25.0 - resolution: "@babel/runtime@npm:7.25.0" +"@ampproject/remapping@npm:^2.2.0, @ampproject/remapping@npm:^2.3.0": + version: 2.3.0 + resolution: "@ampproject/remapping@npm:2.3.0" + dependencies: + "@jridgewell/gen-mapping": ^0.3.5 + "@jridgewell/trace-mapping": ^0.3.24 + checksum: d3ad7b89d973df059c4e8e6d7c972cbeb1bb2f18f002a3bd04ae0707da214cb06cc06929b65aa2313b9347463df2914772298bae8b1d7973f246bb3f2ab3e8f0 + languageName: node + linkType: hard + +"@babel/code-frame@npm:^7.10.4, @babel/code-frame@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/code-frame@npm:7.24.7" + dependencies: + "@babel/highlight": ^7.24.7 + picocolors: ^1.0.0 + checksum: 830e62cd38775fdf84d612544251ce773d544a8e63df667728cc9e0126eeef14c6ebda79be0f0bc307e8318316b7f58c27ce86702e0a1f5c321d842eb38ffda4 + languageName: node + linkType: hard + +"@babel/compat-data@npm:^7.25.2": + version: 7.25.4 + resolution: "@babel/compat-data@npm:7.25.4" + checksum: b12a91d27c3731a4b0bdc9312a50b1911f41f7f728aaf0d4b32486e2257fd2cb2d3ea1a295e98449600c48f2c7883a3196ca77cda1cef7d97a10c2e83d037974 + languageName: node + linkType: hard + +"@babel/core@npm:^7.23.9, @babel/core@npm:^7.24.5": + version: 7.25.2 + resolution: "@babel/core@npm:7.25.2" + dependencies: + "@ampproject/remapping": ^2.2.0 + "@babel/code-frame": ^7.24.7 + "@babel/generator": ^7.25.0 + "@babel/helper-compilation-targets": ^7.25.2 + "@babel/helper-module-transforms": ^7.25.2 + "@babel/helpers": ^7.25.0 + "@babel/parser": ^7.25.0 + "@babel/template": ^7.25.0 + "@babel/traverse": ^7.25.2 + "@babel/types": ^7.25.2 + convert-source-map: ^2.0.0 + debug: ^4.1.0 + gensync: ^1.0.0-beta.2 + json5: ^2.2.3 + semver: ^6.3.1 + checksum: 9a1ef604a7eb62195f70f9370cec45472a08114e3934e3eaaedee8fd754edf0730e62347c7b4b5e67d743ce57b5bb8cf3b92459482ca94d06e06246ef021390a + languageName: node + linkType: hard + +"@babel/generator@npm:^7.25.0, @babel/generator@npm:^7.25.6": + version: 7.25.6 + resolution: "@babel/generator@npm:7.25.6" + dependencies: + "@babel/types": ^7.25.6 + "@jridgewell/gen-mapping": ^0.3.5 + "@jridgewell/trace-mapping": ^0.3.25 + jsesc: ^2.5.1 + checksum: b55975cd664f5602304d868bb34f4ee3bed6f5c7ce8132cd92ff27a46a53a119def28a182d91992e86f75db904f63094a81247703c4dc96e4db0c03fd04bcd68 + languageName: node + linkType: hard + +"@babel/helper-compilation-targets@npm:^7.25.2": + version: 7.25.2 + resolution: "@babel/helper-compilation-targets@npm:7.25.2" + dependencies: + "@babel/compat-data": ^7.25.2 + "@babel/helper-validator-option": ^7.24.8 + browserslist: ^4.23.1 + lru-cache: ^5.1.1 + semver: ^6.3.1 + checksum: aed33c5496cb9db4b5e2d44e26bf8bc474074cc7f7bb5ebe1d4a20fdeb362cb3ba9e1596ca18c7484bcd6e5c3a155ab975e420d520c0ae60df81f9de04d0fd16 + languageName: node + linkType: hard + +"@babel/helper-module-imports@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/helper-module-imports@npm:7.24.7" + dependencies: + "@babel/traverse": ^7.24.7 + "@babel/types": ^7.24.7 + checksum: 8ac15d96d262b8940bc469052a048e06430bba1296369be695fabdf6799f201dd0b00151762b56012a218464e706bc033f27c07f6cec20c6f8f5fd6543c67054 + languageName: node + linkType: hard + +"@babel/helper-module-transforms@npm:^7.25.2": + version: 7.25.2 + resolution: "@babel/helper-module-transforms@npm:7.25.2" + dependencies: + "@babel/helper-module-imports": ^7.24.7 + "@babel/helper-simple-access": ^7.24.7 + "@babel/helper-validator-identifier": ^7.24.7 + "@babel/traverse": ^7.25.2 + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 282d4e3308df6746289e46e9c39a0870819630af5f84d632559171e4fae6045684d771a65f62df3d569e88ccf81dc2def78b8338a449ae3a94bb421aa14fc367 + languageName: node + linkType: hard + +"@babel/helper-plugin-utils@npm:^7.24.7": + version: 7.24.8 + resolution: "@babel/helper-plugin-utils@npm:7.24.8" + checksum: 73b1a83ba8bcee21dc94de2eb7323207391715e4369fd55844bb15cf13e3df6f3d13a40786d990e6370bf0f571d94fc31f70dec96c1d1002058258c35ca3767a + languageName: node + linkType: hard + +"@babel/helper-simple-access@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/helper-simple-access@npm:7.24.7" + dependencies: + "@babel/traverse": ^7.24.7 + "@babel/types": ^7.24.7 + checksum: ddbf55f9dea1900213f2a1a8500fabfd21c5a20f44dcfa957e4b0d8638c730f88751c77f678644f754f1a1dc73f4eb8b766c300deb45a9daad000e4247957819 + languageName: node + linkType: hard + +"@babel/helper-string-parser@npm:^7.24.8": + version: 7.24.8 + resolution: "@babel/helper-string-parser@npm:7.24.8" + checksum: 39b03c5119216883878655b149148dc4d2e284791e969b19467a9411fccaa33f7a713add98f4db5ed519535f70ad273cdadfd2eb54d47ebbdeac5083351328ce + languageName: node + linkType: hard + +"@babel/helper-validator-identifier@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/helper-validator-identifier@npm:7.24.7" + checksum: 6799ab117cefc0ecd35cd0b40ead320c621a298ecac88686a14cffceaac89d80cdb3c178f969861bf5fa5e4f766648f9161ea0752ecfe080d8e89e3147270257 + languageName: node + linkType: hard + +"@babel/helper-validator-option@npm:^7.24.8": + version: 7.24.8 + resolution: "@babel/helper-validator-option@npm:7.24.8" + checksum: a52442dfa74be6719c0608fee3225bd0493c4057459f3014681ea1a4643cd38b68ff477fe867c4b356da7330d085f247f0724d300582fa4ab9a02efaf34d107c + languageName: node + linkType: hard + +"@babel/helpers@npm:^7.25.0": + version: 7.25.6 + resolution: "@babel/helpers@npm:7.25.6" + dependencies: + "@babel/template": ^7.25.0 + "@babel/types": ^7.25.6 + checksum: 5a548999db82049a5f7ac6de57576b4ed0d386ce07d058151698836ed411eae6230db12535487caeebb68a2ffc964491e8aead62364a5132ab0ae20e8b68e19f + languageName: node + linkType: hard + +"@babel/highlight@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/highlight@npm:7.24.7" + dependencies: + "@babel/helper-validator-identifier": ^7.24.7 + chalk: ^2.4.2 + js-tokens: ^4.0.0 + picocolors: ^1.0.0 + checksum: 5cd3a89f143671c4ac129960024ba678b669e6fc673ce078030f5175002d1d3d52bc10b22c5b916a6faf644b5028e9a4bd2bb264d053d9b05b6a98690f1d46f1 + languageName: node + linkType: hard + +"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.23.9, @babel/parser@npm:^7.25.0, @babel/parser@npm:^7.25.4, @babel/parser@npm:^7.25.6": + version: 7.25.6 + resolution: "@babel/parser@npm:7.25.6" + dependencies: + "@babel/types": ^7.25.6 + bin: + parser: ./bin/babel-parser.js + checksum: 85b237ded09ee43cc984493c35f3b1ff8a83e8dbbb8026b8132e692db6567acc5a1659ec928e4baa25499ddd840d7dae9dee3062be7108fe23ec5f94a8066b1e + languageName: node + linkType: hard + +"@babel/plugin-transform-react-jsx-self@npm:^7.24.5": + version: 7.24.7 + resolution: "@babel/plugin-transform-react-jsx-self@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": ^7.24.7 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 2d72c33664e614031b8a03fc2d4cfd185e99efb1d681cbde4b0b4ab379864b31d83ee923509892f6d94b2c5893c309f0217d33bcda3e470ed42297f958138381 + languageName: node + linkType: hard + +"@babel/plugin-transform-react-jsx-source@npm:^7.24.1": + version: 7.24.7 + resolution: "@babel/plugin-transform-react-jsx-source@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": ^7.24.7 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: c9afcb2259dd124a2de76f8a578589c18bd2f24dbcf78fe02b53c5cbc20c493c4618369604720e4e699b52be10ba0751b97140e1ef8bc8f0de0a935280e9d5b7 + languageName: node + linkType: hard + +"@babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.13.10": + version: 7.25.6 + resolution: "@babel/runtime@npm:7.25.6" dependencies: regenerator-runtime: ^0.14.0 - checksum: 4a2a374a58eb01aaa65c5762606e90b3a1f448e0c637d42278b6cc0b42a9f5399b5f381ba9f237ee087da2860d14dd2d1de7bddcbe18be6a3cafba97e44bed64 + checksum: ee1a69d3ac7802803f5ee6a96e652b78b8addc28c6a38c725a4ad7d61a059d9e6cb9f6550ed2f63cce67a1bd82e0b1ef66a1079d895be6bfb536a5cfbd9ccc32 + languageName: node + linkType: hard + +"@babel/template@npm:^7.25.0": + version: 7.25.0 + resolution: "@babel/template@npm:7.25.0" + dependencies: + "@babel/code-frame": ^7.24.7 + "@babel/parser": ^7.25.0 + "@babel/types": ^7.25.0 + checksum: 3f2db568718756d0daf2a16927b78f00c425046b654cd30b450006f2e84bdccaf0cbe6dc04994aa1f5f6a4398da2f11f3640a4d3ee31722e43539c4c919c817b + languageName: node + linkType: hard + +"@babel/traverse@npm:^7.24.7, @babel/traverse@npm:^7.25.2": + version: 7.25.6 + resolution: "@babel/traverse@npm:7.25.6" + dependencies: + "@babel/code-frame": ^7.24.7 + "@babel/generator": ^7.25.6 + "@babel/parser": ^7.25.6 + "@babel/template": ^7.25.0 + "@babel/types": ^7.25.6 + debug: ^4.3.1 + globals: ^11.1.0 + checksum: 11ee47269aa4356f2d6633a05b9af73405b5ed72c09378daf644289b686ef852035a6ac9aa410f601991993c6bbf72006795b5478283b78eb1ca77874ada7737 + languageName: node + linkType: hard + +"@babel/types@npm:^7.0.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.24.7, @babel/types@npm:^7.25.0, @babel/types@npm:^7.25.2, @babel/types@npm:^7.25.4, @babel/types@npm:^7.25.6": + version: 7.25.6 + resolution: "@babel/types@npm:7.25.6" + dependencies: + "@babel/helper-string-parser": ^7.24.8 + "@babel/helper-validator-identifier": ^7.24.7 + to-fast-properties: ^2.0.0 + checksum: 9b2f84ff3f874ad05b0b9bf06862c56f478b65781801f82296b4cc01bee39e79c20a7c0a06959fed0ee582c8267e1cb21638318655c5e070b0287242a844d1c9 + languageName: node + linkType: hard + +"@bcoe/v8-coverage@npm:^0.2.3": + version: 0.2.3 + resolution: "@bcoe/v8-coverage@npm:0.2.3" + checksum: 850f9305536d0f2bd13e9e0881cb5f02e4f93fad1189f7b2d4bebf694e3206924eadee1068130d43c11b750efcc9405f88a8e42ef098b6d75239c0f047de1a27 languageName: node linkType: hard @@ -74,6 +317,167 @@ __metadata: languageName: node linkType: hard +"@esbuild/aix-ppc64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/aix-ppc64@npm:0.21.5" + conditions: os=aix & cpu=ppc64 + languageName: node + linkType: hard + +"@esbuild/android-arm64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/android-arm64@npm:0.21.5" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/android-arm@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/android-arm@npm:0.21.5" + conditions: os=android & cpu=arm + languageName: node + linkType: hard + +"@esbuild/android-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/android-x64@npm:0.21.5" + conditions: os=android & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/darwin-arm64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/darwin-arm64@npm:0.21.5" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/darwin-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/darwin-x64@npm:0.21.5" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/freebsd-arm64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/freebsd-arm64@npm:0.21.5" + conditions: os=freebsd & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/freebsd-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/freebsd-x64@npm:0.21.5" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/linux-arm64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-arm64@npm:0.21.5" + conditions: os=linux & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/linux-arm@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-arm@npm:0.21.5" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"@esbuild/linux-ia32@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-ia32@npm:0.21.5" + conditions: os=linux & cpu=ia32 + languageName: node + linkType: hard + +"@esbuild/linux-loong64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-loong64@npm:0.21.5" + conditions: os=linux & cpu=loong64 + languageName: node + linkType: hard + +"@esbuild/linux-mips64el@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-mips64el@npm:0.21.5" + conditions: os=linux & cpu=mips64el + languageName: node + linkType: hard + +"@esbuild/linux-ppc64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-ppc64@npm:0.21.5" + conditions: os=linux & cpu=ppc64 + languageName: node + linkType: hard + +"@esbuild/linux-riscv64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-riscv64@npm:0.21.5" + conditions: os=linux & cpu=riscv64 + languageName: node + linkType: hard + +"@esbuild/linux-s390x@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-s390x@npm:0.21.5" + conditions: os=linux & cpu=s390x + languageName: node + linkType: hard + +"@esbuild/linux-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-x64@npm:0.21.5" + conditions: os=linux & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/netbsd-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/netbsd-x64@npm:0.21.5" + conditions: os=netbsd & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/openbsd-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/openbsd-x64@npm:0.21.5" + conditions: os=openbsd & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/sunos-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/sunos-x64@npm:0.21.5" + conditions: os=sunos & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/win32-arm64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/win32-arm64@npm:0.21.5" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/win32-ia32@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/win32-ia32@npm:0.21.5" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + +"@esbuild/win32-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/win32-x64@npm:0.21.5" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + "@eslint-community/eslint-utils@npm:^4.2.0, @eslint-community/eslint-utils@npm:^4.4.0": version: 4.4.0 resolution: "@eslint-community/eslint-utils@npm:4.4.0" @@ -86,9 +490,9 @@ __metadata: linkType: hard "@eslint-community/regexpp@npm:^4.10.0, @eslint-community/regexpp@npm:^4.6.1": - version: 4.11.0 - resolution: "@eslint-community/regexpp@npm:4.11.0" - checksum: 97d2fe46690b69417a551bd19a3dc53b6d9590d2295c43cc4c4e44e64131af541e2f4a44d5c12e87de990403654d3dae9d33600081f3a2f0386b368abc9111ec + version: 4.11.1 + resolution: "@eslint-community/regexpp@npm:4.11.1" + checksum: 6986685529d30e33c2640973c3d8e7ddd31bef3cc8cb10ad54ddc1dea12680779a2c23a45562aa1462c488137a3570e672d122fac7da22d82294382d915cec70 languageName: node linkType: hard @@ -109,10 +513,10 @@ __metadata: languageName: node linkType: hard -"@eslint/js@npm:8.57.0": - version: 8.57.0 - resolution: "@eslint/js@npm:8.57.0" - checksum: 315dc65b0e9893e2bff139bddace7ea601ad77ed47b4550e73da8c9c2d2766c7a575c3cddf17ef85b8fd6a36ff34f91729d0dcca56e73ca887c10df91a41b0bb +"@eslint/js@npm:8.57.1": + version: 8.57.1 + resolution: "@eslint/js@npm:8.57.1" + checksum: 2afb77454c06e8316793d2e8e79a0154854d35e6782a1217da274ca60b5044d2c69d6091155234ed0551a1e408f86f09dd4ece02752c59568fa403e60611e880 languageName: node linkType: hard @@ -124,40 +528,40 @@ __metadata: linkType: hard "@floating-ui/core@npm:^1.6.0": - version: 1.6.5 - resolution: "@floating-ui/core@npm:1.6.5" + version: 1.6.8 + resolution: "@floating-ui/core@npm:1.6.8" dependencies: - "@floating-ui/utils": ^0.2.5 - checksum: 8e6c62a6e9223fba9afbcaca8afe408788a2bc8ab1b2f5734a26d5b02d4017a2baffc7176a938a610fd243e6a983ada605f259b35c88813e2230dd29906a78fd + "@floating-ui/utils": ^0.2.8 + checksum: 82faa6ea9d57e466779324e51308d6d49c098fb9d184a08d9bb7f4fad83f08cc070fc491f8d56f0cad44a16215fb43f9f829524288413e6c33afcb17303698de languageName: node linkType: hard "@floating-ui/dom@npm:^1.0.0": - version: 1.6.8 - resolution: "@floating-ui/dom@npm:1.6.8" + version: 1.6.11 + resolution: "@floating-ui/dom@npm:1.6.11" dependencies: "@floating-ui/core": ^1.6.0 - "@floating-ui/utils": ^0.2.5 - checksum: bab6954bdde69afeaf8dbbf335818fe710c6eae1c62856ae1e09fa6abdc056bf5995e053638b76fa6661b8384c363ca2af874ab0448c3f6943808f4f8f77f3ea + "@floating-ui/utils": ^0.2.8 + checksum: d6413759abd06a541edfad829c45313f930310fe76a3322e74a00eb655e283db33fe3e65b5265c4072eb54db7447e11225acd355a9a02cabd1d1b0d5fc8fc21d languageName: node linkType: hard "@floating-ui/react-dom@npm:^2.0.0": - version: 2.1.1 - resolution: "@floating-ui/react-dom@npm:2.1.1" + version: 2.1.2 + resolution: "@floating-ui/react-dom@npm:2.1.2" dependencies: "@floating-ui/dom": ^1.0.0 peerDependencies: react: ">=16.8.0" react-dom: ">=16.8.0" - checksum: 6d1a023e6b0a3f298117223d8cdb0a4767f24469d193181da7002f692b756ccafb1e9756c242fa0c072f8ab8a5710ea7cf5cf2a6e92278d1fcd6f0fc0586c27c + checksum: 25bb031686e23062ed4222a8946e76b3f9021d40a48437bd747233c4964a766204b8a55f34fa8b259839af96e60db7c6e3714d81f1de06914294f90e86ffbc48 languageName: node linkType: hard -"@floating-ui/utils@npm:^0.2.5": - version: 0.2.5 - resolution: "@floating-ui/utils@npm:0.2.5" - checksum: 32834fe0fec5ee89187f8defd0b10813d725dab7dc6ed1545ded6655630bac5d438f0c991d019d675585e118846f12391236fc2886a5c73a57576e7de3eca3f9 +"@floating-ui/utils@npm:^0.2.8": + version: 0.2.8 + resolution: "@floating-ui/utils@npm:0.2.8" + checksum: deb98bba017c4e073c7ad5740d4dec33a4d3e0942d412e677ac0504f3dade15a68fc6fd164d43c93c0bb0bcc5dc5015c1f4080dfb1a6161140fe660624f7c875 languageName: node linkType: hard @@ -170,14 +574,14 @@ __metadata: languageName: node linkType: hard -"@humanwhocodes/config-array@npm:^0.11.14": - version: 0.11.14 - resolution: "@humanwhocodes/config-array@npm:0.11.14" +"@humanwhocodes/config-array@npm:^0.13.0": + version: 0.13.0 + resolution: "@humanwhocodes/config-array@npm:0.13.0" dependencies: - "@humanwhocodes/object-schema": ^2.0.2 + "@humanwhocodes/object-schema": ^2.0.3 debug: ^4.3.1 minimatch: ^3.0.5 - checksum: 861ccce9eaea5de19546653bccf75bf09fe878bc39c3aab00aeee2d2a0e654516adad38dd1098aab5e3af0145bbcbf3f309bdf4d964f8dab9dcd5834ae4c02f2 + checksum: eae69ff9134025dd2924f0b430eb324981494be26f0fddd267a33c28711c4db643242cf9fddf7dadb9d16c96b54b2d2c073e60a56477df86e0173149313bd5d6 languageName: node linkType: hard @@ -188,7 +592,7 @@ __metadata: languageName: node linkType: hard -"@humanwhocodes/object-schema@npm:^2.0.2": +"@humanwhocodes/object-schema@npm:^2.0.3": version: 2.0.3 resolution: "@humanwhocodes/object-schema@npm:2.0.3" checksum: d3b78f6c5831888c6ecc899df0d03bcc25d46f3ad26a11d7ea52944dc36a35ef543fad965322174238d677a43d5c694434f6607532cff7077062513ad7022631 @@ -209,7 +613,14 @@ __metadata: languageName: node linkType: hard -"@jridgewell/gen-mapping@npm:^0.3.2": +"@istanbuljs/schema@npm:^0.1.2, @istanbuljs/schema@npm:^0.1.3": + version: 0.1.3 + resolution: "@istanbuljs/schema@npm:0.1.3" + checksum: 5282759d961d61350f33d9118d16bcaed914ebf8061a52f4fa474b2cb08720c9c81d165e13b82f2e5a8a212cc5af482f0c6fc1ac27b9e067e5394c9a6ed186c9 + languageName: node + linkType: hard + +"@jridgewell/gen-mapping@npm:^0.3.2, @jridgewell/gen-mapping@npm:^0.3.5": version: 0.3.5 resolution: "@jridgewell/gen-mapping@npm:0.3.5" dependencies: @@ -234,7 +645,7 @@ __metadata: languageName: node linkType: hard -"@jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.14": +"@jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.14, @jridgewell/sourcemap-codec@npm:^1.5.0": version: 1.5.0 resolution: "@jridgewell/sourcemap-codec@npm:1.5.0" checksum: 05df4f2538b3b0f998ea4c1cd34574d0feba216fa5d4ccaef0187d12abf82eafe6021cec8b49f9bb4d90f2ba4582ccc581e72986a5fcf4176ae0cfeb04cf52ec @@ -251,7 +662,7 @@ __metadata: languageName: node linkType: hard -"@jridgewell/trace-mapping@npm:^0.3.24": +"@jridgewell/trace-mapping@npm:^0.3.23, @jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.25": version: 0.3.25 resolution: "@jridgewell/trace-mapping@npm:0.3.25" dependencies: @@ -280,22 +691,6 @@ __metadata: languageName: node linkType: hard -"@module-federation/runtime@npm:^0.1.2": - version: 0.1.21 - resolution: "@module-federation/runtime@npm:0.1.21" - dependencies: - "@module-federation/sdk": 0.1.21 - checksum: ce4de8515b54f1cd07a3c7c4cbd35fea163294b9fb24be10827872f3ebb62cd5c289f3602efe4149d963282739f79b51947afa039ee6f36be7f66dea83d590fc - languageName: node - linkType: hard - -"@module-federation/sdk@npm:0.1.21": - version: 0.1.21 - resolution: "@module-federation/sdk@npm:0.1.21" - checksum: 6856dcfe2ef5ae939890b82010aaad911fa6c4330a05f290ae054c316c9b532d3691456a1f9e176fe05f1df2d6f2d8c7e0c842ca5648a0fd7abf270e44ed9ecb - languageName: node - linkType: hard - "@next/env@npm:14.1.3": version: 14.1.3 resolution: "@next/env@npm:14.1.3" @@ -313,11 +708,11 @@ __metadata: linkType: hard "@next/font@npm:^14.2.1": - version: 14.2.4 - resolution: "@next/font@npm:14.2.4" + version: 14.2.13 + resolution: "@next/font@npm:14.2.13" peerDependencies: next: "*" - checksum: ee04b899b2e7b9c82c63874bb6f3daba53a1295749322e0e54761a16c7dae1d58b497c3f73776f12c9fd2aee22fa2702a3081692383f93d003d7725130ce1ab2 + checksum: ba768da0727bcfc2ad41926f2a65aa1dbe59f2e726cbdda1dfa09ac75c4e8cceaa7290de02f111a2d867b58747392ca35aa061e27bddb981c6b2f8ffb4519f95 languageName: node linkType: hard @@ -393,6 +788,24 @@ __metadata: languageName: node linkType: hard +"@noble/curves@npm:1.4.0": + version: 1.4.0 + resolution: "@noble/curves@npm:1.4.0" + dependencies: + "@noble/hashes": 1.4.0 + checksum: 0014ff561d16e98da4a57e2310a4015e4bdab3b1e1eafcd18d3f9b955c29c3501452ca5d702fddf8ca92d570bbeadfbe53fe16ebbd81a319c414f739154bb26b + languageName: node + linkType: hard + +"@noble/curves@npm:^1.4.0": + version: 1.6.0 + resolution: "@noble/curves@npm:1.6.0" + dependencies: + "@noble/hashes": 1.5.0 + checksum: 258f3feb2a6098cf35521562ecb7d452fd728e8a008ff9f1ef435184f9d0c782ceb8f7b7fa8df3317c3be7a19f53995ee124cd05c8080b130bd42e3cb072f24d + languageName: node + linkType: hard + "@noble/curves@npm:~1.3.0": version: 1.3.0 resolution: "@noble/curves@npm:1.3.0" @@ -425,13 +838,20 @@ __metadata: languageName: node linkType: hard -"@noble/hashes@npm:1.4.0": +"@noble/hashes@npm:1.4.0, @noble/hashes@npm:~1.4.0": version: 1.4.0 resolution: "@noble/hashes@npm:1.4.0" checksum: 8ba816ae26c90764b8c42493eea383716396096c5f7ba6bea559993194f49d80a73c081f315f4c367e51bd2d5891700bcdfa816b421d24ab45b41cb03e4f3342 languageName: node linkType: hard +"@noble/hashes@npm:1.5.0, @noble/hashes@npm:^1.4.0, @noble/hashes@npm:~1.5.0": + version: 1.5.0 + resolution: "@noble/hashes@npm:1.5.0" + checksum: 9cc031d5c888c455bfeef76af649b87f75380a4511405baea633c1e4912fd84aff7b61e99716f0231d244c9cfeda1fafd7d718963e6a0c674ed705e9b1b4f76b + languageName: node + linkType: hard + "@nodelib/fs.scandir@npm:2.1.5": version: 2.1.5 resolution: "@nodelib/fs.scandir@npm:2.1.5" @@ -459,6 +879,13 @@ __metadata: languageName: node linkType: hard +"@nolyfill/is-core-module@npm:1.0.39": + version: 1.0.39 + resolution: "@nolyfill/is-core-module@npm:1.0.39" + checksum: 0d6e098b871eca71d875651288e1f0fa770a63478b0b50479c99dc760c64175a56b5b04f58d5581bbcc6b552b8191ab415eada093d8df9597ab3423c8cac1815 + languageName: node + linkType: hard + "@npmcli/agent@npm:^2.0.0": version: 2.2.2 resolution: "@npmcli/agent@npm:2.2.2" @@ -1640,6 +2067,125 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-android-arm-eabi@npm:4.22.4": + version: 4.22.4 + resolution: "@rollup/rollup-android-arm-eabi@npm:4.22.4" + conditions: os=android & cpu=arm + languageName: node + linkType: hard + +"@rollup/rollup-android-arm64@npm:4.22.4": + version: 4.22.4 + resolution: "@rollup/rollup-android-arm64@npm:4.22.4" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + +"@rollup/rollup-darwin-arm64@npm:4.22.4": + version: 4.22.4 + resolution: "@rollup/rollup-darwin-arm64@npm:4.22.4" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@rollup/rollup-darwin-x64@npm:4.22.4": + version: 4.22.4 + resolution: "@rollup/rollup-darwin-x64@npm:4.22.4" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@rollup/rollup-linux-arm-gnueabihf@npm:4.22.4": + version: 4.22.4 + resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.22.4" + conditions: os=linux & cpu=arm & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-arm-musleabihf@npm:4.22.4": + version: 4.22.4 + resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.22.4" + conditions: os=linux & cpu=arm & libc=musl + languageName: node + linkType: hard + +"@rollup/rollup-linux-arm64-gnu@npm:4.22.4": + version: 4.22.4 + resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.22.4" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-arm64-musl@npm:4.22.4": + version: 4.22.4 + resolution: "@rollup/rollup-linux-arm64-musl@npm:4.22.4" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"@rollup/rollup-linux-powerpc64le-gnu@npm:4.22.4": + version: 4.22.4 + resolution: "@rollup/rollup-linux-powerpc64le-gnu@npm:4.22.4" + conditions: os=linux & cpu=ppc64 & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-riscv64-gnu@npm:4.22.4": + version: 4.22.4 + resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.22.4" + conditions: os=linux & cpu=riscv64 & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-s390x-gnu@npm:4.22.4": + version: 4.22.4 + resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.22.4" + conditions: os=linux & cpu=s390x & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-x64-gnu@npm:4.22.4": + version: 4.22.4 + resolution: "@rollup/rollup-linux-x64-gnu@npm:4.22.4" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-x64-musl@npm:4.22.4": + version: 4.22.4 + resolution: "@rollup/rollup-linux-x64-musl@npm:4.22.4" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"@rollup/rollup-win32-arm64-msvc@npm:4.22.4": + version: 4.22.4 + resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.22.4" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@rollup/rollup-win32-ia32-msvc@npm:4.22.4": + version: 4.22.4 + resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.22.4" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + +"@rollup/rollup-win32-x64-msvc@npm:4.22.4": + version: 4.22.4 + resolution: "@rollup/rollup-win32-x64-msvc@npm:4.22.4" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"@rtsao/scc@npm:^1.1.0": + version: 1.1.0 + resolution: "@rtsao/scc@npm:1.1.0" + checksum: 17d04adf404e04c1e61391ed97bca5117d4c2767a76ae3e879390d6dec7b317fcae68afbf9e98badee075d0b64fa60f287729c4942021b4d19cd01db77385c01 + languageName: node + linkType: hard + "@rushstack/eslint-patch@npm:^1.3.3": version: 1.10.4 resolution: "@rushstack/eslint-patch@npm:1.10.4" @@ -1647,10 +2193,31 @@ __metadata: languageName: node linkType: hard -"@scure/base@npm:~1.1.3": - version: 1.1.7 - resolution: "@scure/base@npm:1.1.7" - checksum: d9084be9a2f27971df1684af9e40bb750e86f549345e1bb3227fb61673c0c83569c92c1cb0a4ddccb32650b39d3cd3c145603b926ba751c9bc60c27317549b20 +"@scure/base@npm:~1.1.3, @scure/base@npm:~1.1.6, @scure/base@npm:~1.1.8": + version: 1.1.9 + resolution: "@scure/base@npm:1.1.9" + checksum: 120820a37dfe9dfe4cab2b7b7460552d08e67dee8057ed5354eb68d8e3440890ae983ce3bee957d2b45684950b454a2b6d71d5ee77c1fd3fddc022e2a510337f + languageName: node + linkType: hard + +"@scure/bip32@npm:1.4.0": + version: 1.4.0 + resolution: "@scure/bip32@npm:1.4.0" + dependencies: + "@noble/curves": ~1.4.0 + "@noble/hashes": ~1.4.0 + "@scure/base": ~1.1.6 + checksum: eff491651cbf2bea8784936de75af5fc020fc1bbb9bcb26b2cfeefbd1fb2440ebfaf30c0733ca11c0ae1e272a2ef4c3c34ba5c9fb3e1091c3285a4272045b0c6 + languageName: node + linkType: hard + +"@scure/bip39@npm:1.4.0": + version: 1.4.0 + resolution: "@scure/bip39@npm:1.4.0" + dependencies: + "@noble/hashes": ~1.5.0 + "@scure/base": ~1.1.8 + checksum: 211f2c01361993bfe54c0e4949f290224381457c7f76d7cd51d6a983f3f4b6b9f85adfd0e623977d777ed80417a5fe729eb19dd34e657147810a0e58a8e7b9e0 languageName: node linkType: hard @@ -1679,13 +2246,20 @@ __metadata: "@next/font": ^14.2.1 "@radix-ui/react-icons": 1.3.0 "@radix-ui/themes": 2.0.3 - "@starknet-react/chains": ^0.1.7 - "@starknet-react/core": ^2.8.2 + "@starknet-io/types-js": ^0.7.7 + "@starknet-react/chains": ^3.0.0 + "@starknet-react/core": ^3.0.0 + "@starknet-react/typescript-config": 0.0.0 + "@testing-library/dom": ^10.4.0 + "@testing-library/react": ^16.0.1 "@types/node": ^20 "@types/nprogress": ^0 "@types/react": ^18 "@types/react-copy-to-clipboard": ^5.0.4 "@types/react-dom": ^18 + "@vitejs/plugin-react": ^4.3.1 + "@vitest/coverage-istanbul": ^2.1.1 + "@vitest/coverage-v8": ^2.1.1 abi-wan-kanabi: ^2.2.2 autoprefixer: ^10.0.1 blo: ^1.1.1 @@ -1693,7 +2267,8 @@ __metadata: eslint: ^8 eslint-config-next: 14.1.3 ethers: ^6.12.0 - get-starknet-core: ^3.3.0 + get-starknet-core: ^4.0.0 + jsdom: ^25.0.1 next: 14.1.3 next-themes: ^0.2.1 nprogress: ^0.2.0 @@ -1703,12 +2278,13 @@ __metadata: react-copy-to-clipboard: ^5.1.0 react-dom: ^18 react-hot-toast: ^2.4.1 - starknet: 6.7.0 + starknet: 6.12.1 tailwindcss: ^3.3.0 type-fest: ^4.6.0 typescript: ^5 usehooks-ts: ^2.13.0 vercel: ^33.7.1 + vitest: ^2.1.1 zustand: ^4.1.2 languageName: unknown linkType: soft @@ -1725,7 +2301,7 @@ __metadata: globals: ^15.8.0 prettier: ^2.8.8 shx: ^0.3.4 - starknet: 6.7.0 + starknet: 6.12.1 toml: ^3.0.0 ts-node: ^10.9.2 tslib: ^2.6.2 @@ -1735,27 +2311,42 @@ __metadata: languageName: unknown linkType: soft -"@starknet-react/chains@npm:^0.1.7": - version: 0.1.7 - resolution: "@starknet-react/chains@npm:0.1.7" - checksum: 3bd919813740e650e3e3a60811bd8f10f5941b773ea01097e1346fa75e485ef5fd28cc7a7c37db2f95d18c24b4d028d0f5ce59e392ff5c09c8b34e85cbe2cc12 +"@starknet-io/types-js@npm:^0.7.7, starknet-types-07@npm:@starknet-io/types-js@^0.7.7": + version: 0.7.7 + resolution: "@starknet-io/types-js@npm:0.7.7" + checksum: e5355042b06f96a19ee02a07cc12e321a636d0c7eaa605f85363775b036303a82896e6bcb2b244f97b125c83ae691f0fc162a5167e9866152a3b2108a9e28402 languageName: node linkType: hard -"@starknet-react/core@npm:^2.8.2": - version: 2.8.3 - resolution: "@starknet-react/core@npm:2.8.3" +"@starknet-react/chains@npm:^3.0.0": + version: 3.0.0 + resolution: "@starknet-react/chains@npm:3.0.0" + checksum: 1022682ba9d539cb9b08c44efa0fb246c7fa31956b21eb68f40b6c33a679f36748616930a839f2155a123adea5de989ae17431b315d4107bbfd425d6d96a8a31 + languageName: node + linkType: hard + +"@starknet-react/core@npm:^3.0.0": + version: 3.0.0 + resolution: "@starknet-react/core@npm:3.0.0" dependencies: - "@starknet-react/chains": ^0.1.7 - "@tanstack/react-query": ^5.0.1 + "@starknet-io/types-js": ^0.7.7 + "@starknet-react/chains": ^3.0.0 + "@tanstack/react-query": ^5.25.0 eventemitter3: ^5.0.1 - immutable: ^4.3.4 - zod: ^3.22.2 + viem: ^2.19.1 + zod: ^3.22.4 peerDependencies: - get-starknet-core: ^3.2.0 + get-starknet-core: ^4.0.0 react: ^18.0 - starknet: ^5.25.0 - checksum: 0c5a42168f4a61d11988beea4adaf97884676cca4bdef1efe51e14145b211e96e1eb201e71c7d61cd5a97d7baaa6fe8d1239884a2dff753d6a87ed60812ad073 + starknet: ^6.11.0 + checksum: 7fe460751d006a79f456ad5c9d3debb51c34ee3308955cad484850d1a6b7f4cbf9ee2ab545c59b747364eba5a718f48b84352911c84995e398d694aa86b93103 + languageName: node + linkType: hard + +"@starknet-react/typescript-config@npm:0.0.0": + version: 0.0.0 + resolution: "@starknet-react/typescript-config@npm:0.0.0" + checksum: d56a63d1c5529fda9fa4f892b160a49ebc6c7616a1f719e9992638c98af959c2c30f58912c01f311eba28f5bac36f7aa19bb6c6e11ac1e645ba4e9ec66a801ab languageName: node linkType: hard @@ -1768,21 +2359,57 @@ __metadata: languageName: node linkType: hard -"@tanstack/query-core@npm:5.51.15": - version: 5.51.15 - resolution: "@tanstack/query-core@npm:5.51.15" - checksum: 701ff98cf88de872b0bf7271904f66ed41e3f268189bb2f016a83f770b263c7cd3d5067b681fde0b08006fb2a327aacd143cb49a4bc567b679a3ecfb069d13b3 +"@tanstack/query-core@npm:5.56.2": + version: 5.56.2 + resolution: "@tanstack/query-core@npm:5.56.2" + checksum: e78430464de89fd2543155449391415983c7cdcd1ff2bb86da019414204b6800e2405e341db88000b36a101d3619ee7e94e90da1fa5497b2e021c5765924a64c + languageName: node + linkType: hard + +"@tanstack/react-query@npm:^5.25.0": + version: 5.56.2 + resolution: "@tanstack/react-query@npm:5.56.2" + dependencies: + "@tanstack/query-core": 5.56.2 + peerDependencies: + react: ^18 || ^19 + checksum: 7819a3a316c95df41844bd6e3435511594c3762320c21ee1ef2205ede18a87faae4556ff84d52b36ba17c99540b9554e72a5acf0c225481bdaf107ea79ace815 + languageName: node + linkType: hard + +"@testing-library/dom@npm:^10.4.0": + version: 10.4.0 + resolution: "@testing-library/dom@npm:10.4.0" + dependencies: + "@babel/code-frame": ^7.10.4 + "@babel/runtime": ^7.12.5 + "@types/aria-query": ^5.0.1 + aria-query: 5.3.0 + chalk: ^4.1.0 + dom-accessibility-api: ^0.5.9 + lz-string: ^1.5.0 + pretty-format: ^27.0.2 + checksum: bb128b90be0c8cd78c5f5e67aa45f53de614cc048a2b50b230e736ec710805ac6c73375af354b83c74d710b3928d52b83a273a4cb89de4eb3efe49e91e706837 languageName: node linkType: hard -"@tanstack/react-query@npm:^5.0.1": - version: 5.51.15 - resolution: "@tanstack/react-query@npm:5.51.15" +"@testing-library/react@npm:^16.0.1": + version: 16.0.1 + resolution: "@testing-library/react@npm:16.0.1" dependencies: - "@tanstack/query-core": 5.51.15 + "@babel/runtime": ^7.12.5 peerDependencies: + "@testing-library/dom": ^10.0.0 + "@types/react": ^18.0.0 + "@types/react-dom": ^18.0.0 react: ^18.0.0 - checksum: 44c9c083fc8e5c05a92a6cd5afabd9ce5745484c398f9d231fdd885356e33903cf47521c5c0f760e66fcc57ae4448fb1979ef0cd0873b54ea76470bdcba65021 + react-dom: ^18.0.0 + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 1837db473ea018cf2b5d0cbfffb7a30d0d759e5a7f23aad431441c77bcc3d2533250cd003a61878fd908267df47404cedcb5914f12d79e413002c659652b37fd languageName: node linkType: hard @@ -1833,6 +2460,68 @@ __metadata: languageName: node linkType: hard +"@types/aria-query@npm:^5.0.1": + version: 5.0.4 + resolution: "@types/aria-query@npm:5.0.4" + checksum: ad8b87e4ad64255db5f0a73bc2b4da9b146c38a3a8ab4d9306154334e0fc67ae64e76bfa298eebd1e71830591fb15987e5de7111bdb36a2221bdc379e3415fb0 + languageName: node + linkType: hard + +"@types/babel__core@npm:^7.20.5": + version: 7.20.5 + resolution: "@types/babel__core@npm:7.20.5" + dependencies: + "@babel/parser": ^7.20.7 + "@babel/types": ^7.20.7 + "@types/babel__generator": "*" + "@types/babel__template": "*" + "@types/babel__traverse": "*" + checksum: a3226f7930b635ee7a5e72c8d51a357e799d19cbf9d445710fa39ab13804f79ab1a54b72ea7d8e504659c7dfc50675db974b526142c754398d7413aa4bc30845 + languageName: node + linkType: hard + +"@types/babel__generator@npm:*": + version: 7.6.8 + resolution: "@types/babel__generator@npm:7.6.8" + dependencies: + "@babel/types": ^7.0.0 + checksum: 5b332ea336a2efffbdeedb92b6781949b73498606ddd4205462f7d96dafd45ff3618770b41de04c4881e333dd84388bfb8afbdf6f2764cbd98be550d85c6bb48 + languageName: node + linkType: hard + +"@types/babel__template@npm:*": + version: 7.4.4 + resolution: "@types/babel__template@npm:7.4.4" + dependencies: + "@babel/parser": ^7.1.0 + "@babel/types": ^7.0.0 + checksum: d7a02d2a9b67e822694d8e6a7ddb8f2b71a1d6962dfd266554d2513eefbb205b33ca71a0d163b1caea3981ccf849211f9964d8bd0727124d18ace45aa6c9ae29 + languageName: node + linkType: hard + +"@types/babel__traverse@npm:*": + version: 7.20.6 + resolution: "@types/babel__traverse@npm:7.20.6" + dependencies: + "@babel/types": ^7.20.7 + checksum: 2bdc65eb62232c2d5c1086adeb0c31e7980e6fd7e50a3483b4a724a1a1029c84d9cb59749cf8de612f9afa2bc14c85b8f50e64e21f8a4398fa77eb9059a4283c + languageName: node + linkType: hard + +"@types/estree@npm:1.0.5": + version: 1.0.5 + resolution: "@types/estree@npm:1.0.5" + checksum: dd8b5bed28e6213b7acd0fb665a84e693554d850b0df423ac8076cc3ad5823a6bc26b0251d080bdc545af83179ede51dd3f6fa78cad2c46ed1f29624ddf3e41a + languageName: node + linkType: hard + +"@types/estree@npm:^1.0.0": + version: 1.0.6 + resolution: "@types/estree@npm:1.0.6" + checksum: 8825d6e729e16445d9a1dd2fb1db2edc5ed400799064cd4d028150701031af012ba30d6d03fe9df40f4d7a437d0de6d2b256020152b7b09bde9f2e420afdffd9 + languageName: node + linkType: hard + "@types/json-schema@npm:^7.0.6": version: 7.0.15 resolution: "@types/json-schema@npm:7.0.15" @@ -1862,11 +2551,11 @@ __metadata: linkType: hard "@types/node@npm:^20": - version: 20.14.12 - resolution: "@types/node@npm:20.14.12" + version: 20.16.9 + resolution: "@types/node@npm:20.16.9" dependencies: - undici-types: ~5.26.4 - checksum: 1dd493d9e27da43fc374b17cf4b956dbd1dfe20ecf4749408a1db046c79b5a39261a2aa7a3f59b79fd1b5632b861ba72837779d812e0d3b6cf5b22f1650fe722 + undici-types: ~6.19.2 + checksum: 2f0a248cc0ad7e3cdb03c2ff50a3f6c7337c3d0b387a9c4d8a341ee3b3a3ec25846ffd22ca2670a0543d62ec098ece0f1013a441a63e3ed81de1ec8f38ec108e languageName: node linkType: hard @@ -1885,9 +2574,9 @@ __metadata: linkType: hard "@types/prop-types@npm:*": - version: 15.7.12 - resolution: "@types/prop-types@npm:15.7.12" - checksum: ac16cc3d0a84431ffa5cfdf89579ad1e2269549f32ce0c769321fdd078f84db4fbe1b461ed5a1a496caf09e637c0e367d600c541435716a55b1d9713f5035dfe + version: 15.7.13 + resolution: "@types/prop-types@npm:15.7.13" + checksum: 8935cad87c683c665d09a055919d617fe951cb3b2d5c00544e3a913f861a2bd8d2145b51c9aa6d2457d19f3107ab40784c40205e757232f6a80cc8b1c815513c languageName: node linkType: hard @@ -1910,12 +2599,12 @@ __metadata: linkType: hard "@types/react@npm:*, @types/react@npm:^18": - version: 18.3.3 - resolution: "@types/react@npm:18.3.3" + version: 18.3.9 + resolution: "@types/react@npm:18.3.9" dependencies: "@types/prop-types": "*" csstype: ^3.0.2 - checksum: c63d6a78163244e2022b01ef79b0baec4fe4da3475dc4a90bb8accefad35ef0c43560fd0312e5974f92a0f1108aa4d669ac72d73d66396aa060ea03b5d2e3873 + checksum: ac8c7cf6f9c5c2ecef790f3db6f98c672fdec0884f4e4730777fd18823207231cdd1d2e4673f473ef17a096c73c87bff309e83b026fb2602ba068371f0dc54fe languageName: node linkType: hard @@ -1927,23 +2616,23 @@ __metadata: linkType: hard "@types/yargs@npm:^17.0.32": - version: 17.0.32 - resolution: "@types/yargs@npm:17.0.32" + version: 17.0.33 + resolution: "@types/yargs@npm:17.0.33" dependencies: "@types/yargs-parser": "*" - checksum: 4505bdebe8716ff383640c6e928f855b5d337cb3c68c81f7249fc6b983d0aa48de3eee26062b84f37e0d75a5797bc745e0c6e76f42f81771252a758c638f36ba + checksum: ee013f257472ab643cb0584cf3e1ff9b0c44bca1c9ba662395300a7f1a6c55fa9d41bd40ddff42d99f5d95febb3907c9ff600fbcb92dadbec22c6a76de7e1236 languageName: node linkType: hard -"@typescript-eslint/eslint-plugin@npm:7.17.0": - version: 7.17.0 - resolution: "@typescript-eslint/eslint-plugin@npm:7.17.0" +"@typescript-eslint/eslint-plugin@npm:7.18.0": + version: 7.18.0 + resolution: "@typescript-eslint/eslint-plugin@npm:7.18.0" dependencies: "@eslint-community/regexpp": ^4.10.0 - "@typescript-eslint/scope-manager": 7.17.0 - "@typescript-eslint/type-utils": 7.17.0 - "@typescript-eslint/utils": 7.17.0 - "@typescript-eslint/visitor-keys": 7.17.0 + "@typescript-eslint/scope-manager": 7.18.0 + "@typescript-eslint/type-utils": 7.18.0 + "@typescript-eslint/utils": 7.18.0 + "@typescript-eslint/visitor-keys": 7.18.0 graphemer: ^1.4.0 ignore: ^5.3.1 natural-compare: ^1.4.0 @@ -1954,25 +2643,25 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: edb0abd0113020e47f6fb0833c1b0fe3dcd45420b6ecbdd141331ead05f69cfa09e790ed469e4ecfb70c05e0fb882c61d409b639edc82cf9046a7fe3c986f544 + checksum: dfcf150628ca2d4ccdfc20b46b0eae075c2f16ef5e70d9d2f0d746acf4c69a09f962b93befee01a529f14bbeb3e817b5aba287d7dd0edc23396bc5ed1f448c3d languageName: node linkType: hard -"@typescript-eslint/parser@npm:7.17.0": - version: 7.17.0 - resolution: "@typescript-eslint/parser@npm:7.17.0" +"@typescript-eslint/parser@npm:7.18.0": + version: 7.18.0 + resolution: "@typescript-eslint/parser@npm:7.18.0" dependencies: - "@typescript-eslint/scope-manager": 7.17.0 - "@typescript-eslint/types": 7.17.0 - "@typescript-eslint/typescript-estree": 7.17.0 - "@typescript-eslint/visitor-keys": 7.17.0 + "@typescript-eslint/scope-manager": 7.18.0 + "@typescript-eslint/types": 7.18.0 + "@typescript-eslint/typescript-estree": 7.18.0 + "@typescript-eslint/visitor-keys": 7.18.0 debug: ^4.3.4 peerDependencies: eslint: ^8.56.0 peerDependenciesMeta: typescript: optional: true - checksum: f0525317af174b5547d0a7ed8eadbbb7bbc1da9e9ab86882ed616b0ffb053170818a48cab2aaa627001ee991ee559630fbe5ad632b3df7cdf4a2b1b07a571907 + checksum: 132b56ac3b2d90b588d61d005a70f6af322860974225b60201cbf45abf7304d67b7d8a6f0ade1c188ac4e339884e78d6dcd450417f1481998f9ddd155bab0801 languageName: node linkType: hard @@ -2004,22 +2693,22 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/scope-manager@npm:7.17.0": - version: 7.17.0 - resolution: "@typescript-eslint/scope-manager@npm:7.17.0" +"@typescript-eslint/scope-manager@npm:7.18.0": + version: 7.18.0 + resolution: "@typescript-eslint/scope-manager@npm:7.18.0" dependencies: - "@typescript-eslint/types": 7.17.0 - "@typescript-eslint/visitor-keys": 7.17.0 - checksum: 0cb77db6243455b47947df693d9b16f8e2b07e14994d755918dcc98693dba97036806d8f80a12bbd5c82f61883d134dd42d25880f20448c1e2376a9d873f9ef8 + "@typescript-eslint/types": 7.18.0 + "@typescript-eslint/visitor-keys": 7.18.0 + checksum: b982c6ac13d8c86bb3b949c6b4e465f3f60557c2ccf4cc229799827d462df56b9e4d3eaed7711d79b875422fc3d71ec1ebcb5195db72134d07c619e3c5506b57 languageName: node linkType: hard -"@typescript-eslint/type-utils@npm:7.17.0": - version: 7.17.0 - resolution: "@typescript-eslint/type-utils@npm:7.17.0" +"@typescript-eslint/type-utils@npm:7.18.0": + version: 7.18.0 + resolution: "@typescript-eslint/type-utils@npm:7.18.0" dependencies: - "@typescript-eslint/typescript-estree": 7.17.0 - "@typescript-eslint/utils": 7.17.0 + "@typescript-eslint/typescript-estree": 7.18.0 + "@typescript-eslint/utils": 7.18.0 debug: ^4.3.4 ts-api-utils: ^1.3.0 peerDependencies: @@ -2027,7 +2716,7 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 357a32d75f449cb9112ee9a23644b79c3eada8b023bd2508489cdc97e0a834ab2937712fb95a2aedd3cfb801d9b973280899ab696938908c480af240a22a36ba + checksum: 68fd5df5146c1a08cde20d59b4b919acab06a1b06194fe4f7ba1b928674880249890785fbbc97394142f2ef5cff5a7fba9b8a940449e7d5605306505348e38bc languageName: node linkType: hard @@ -2038,10 +2727,10 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/types@npm:7.17.0": - version: 7.17.0 - resolution: "@typescript-eslint/types@npm:7.17.0" - checksum: efd4fadf8f3f2496d813338f873564b903fbaaff53f3ce496159c76d49e01f6e2dbbf037f5e7318d0292cca7b6191c8f8462fa31cba1b5c50a11676bbb5df9ba +"@typescript-eslint/types@npm:7.18.0": + version: 7.18.0 + resolution: "@typescript-eslint/types@npm:7.18.0" + checksum: 7df2750cd146a0acd2d843208d69f153b458e024bbe12aab9e441ad2c56f47de3ddfeb329c4d1ea0079e2577fea4b8c1c1ce15315a8d49044586b04fedfe7a4d languageName: node linkType: hard @@ -2064,12 +2753,12 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:7.17.0": - version: 7.17.0 - resolution: "@typescript-eslint/typescript-estree@npm:7.17.0" +"@typescript-eslint/typescript-estree@npm:7.18.0": + version: 7.18.0 + resolution: "@typescript-eslint/typescript-estree@npm:7.18.0" dependencies: - "@typescript-eslint/types": 7.17.0 - "@typescript-eslint/visitor-keys": 7.17.0 + "@typescript-eslint/types": 7.18.0 + "@typescript-eslint/visitor-keys": 7.18.0 debug: ^4.3.4 globby: ^11.1.0 is-glob: ^4.0.3 @@ -2079,21 +2768,21 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 0f7a7618431c94603c742d1bcb1cb3a5aa646a6ebb3adff89b35db1fe014f9a060d550e6ca5f0ab152615ae129e8a0f84020dda56cd2d2c73386f657dccf7e34 + checksum: c82d22ec9654973944f779eb4eb94c52f4a6eafaccce2f0231ff7757313f3a0d0256c3252f6dfe6d43f57171d09656478acb49a629a9d0c193fb959bc3f36116 languageName: node linkType: hard -"@typescript-eslint/utils@npm:7.17.0": - version: 7.17.0 - resolution: "@typescript-eslint/utils@npm:7.17.0" +"@typescript-eslint/utils@npm:7.18.0": + version: 7.18.0 + resolution: "@typescript-eslint/utils@npm:7.18.0" dependencies: "@eslint-community/eslint-utils": ^4.4.0 - "@typescript-eslint/scope-manager": 7.17.0 - "@typescript-eslint/types": 7.17.0 - "@typescript-eslint/typescript-estree": 7.17.0 + "@typescript-eslint/scope-manager": 7.18.0 + "@typescript-eslint/types": 7.18.0 + "@typescript-eslint/typescript-estree": 7.18.0 peerDependencies: eslint: ^8.56.0 - checksum: 8371f9d2c81f0364e5f61bd538d89027add9584b1fa965f812a2d878ce1e8e6bc4a9e2d9584f5d07d066062dde6c55b09da4e80f9e6ddfd83d93af57d772f946 + checksum: 751dbc816dab8454b7dc6b26a56671dbec08e3f4ef94c2661ce1c0fc48fa2d05a64e03efe24cba2c22d03ba943cd3c5c7a5e1b7b03bbb446728aec1c640bd767 languageName: node linkType: hard @@ -2107,13 +2796,13 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:7.17.0": - version: 7.17.0 - resolution: "@typescript-eslint/visitor-keys@npm:7.17.0" +"@typescript-eslint/visitor-keys@npm:7.18.0": + version: 7.18.0 + resolution: "@typescript-eslint/visitor-keys@npm:7.18.0" dependencies: - "@typescript-eslint/types": 7.17.0 + "@typescript-eslint/types": 7.18.0 eslint-visitor-keys: ^3.4.3 - checksum: fae45049d06c15473784fc442271a9ebab1d1139246d47f185645a64407669c85c7519ef083886d74c921e34fcc68889f35caa858b345469d8bb26eb9f26728e + checksum: 6e806a7cdb424c5498ea187a5a11d0fef7e4602a631be413e7d521e5aec1ab46ba00c76cfb18020adaa0a8c9802354a163bfa0deb74baa7d555526c7517bb158 languageName: node linkType: hard @@ -2338,6 +3027,149 @@ __metadata: languageName: node linkType: hard +"@vitejs/plugin-react@npm:^4.3.1": + version: 4.3.1 + resolution: "@vitejs/plugin-react@npm:4.3.1" + dependencies: + "@babel/core": ^7.24.5 + "@babel/plugin-transform-react-jsx-self": ^7.24.5 + "@babel/plugin-transform-react-jsx-source": ^7.24.1 + "@types/babel__core": ^7.20.5 + react-refresh: ^0.14.2 + peerDependencies: + vite: ^4.2.0 || ^5.0.0 + checksum: 57872e0193c7e545c5ef4852cbe1adf17a6b35406a2aba4b3acce06c173a9dabbf6ff4c72701abc11bb3cbe24a056f5054f39018f7034c9aa57133a3a7770237 + languageName: node + linkType: hard + +"@vitest/coverage-istanbul@npm:^2.1.1": + version: 2.1.1 + resolution: "@vitest/coverage-istanbul@npm:2.1.1" + dependencies: + "@istanbuljs/schema": ^0.1.3 + debug: ^4.3.6 + istanbul-lib-coverage: ^3.2.2 + istanbul-lib-instrument: ^6.0.3 + istanbul-lib-report: ^3.0.1 + istanbul-lib-source-maps: ^5.0.6 + istanbul-reports: ^3.1.7 + magicast: ^0.3.4 + test-exclude: ^7.0.1 + tinyrainbow: ^1.2.0 + peerDependencies: + vitest: 2.1.1 + checksum: 263bcc557b80bfdf15e7089c4a03529546aa6c513dc6d760b4b95897daf7db860740bb5866fdc326eb1fb01310d49719a441f164d35266fd8541ee8309e14bed + languageName: node + linkType: hard + +"@vitest/coverage-v8@npm:^2.1.1": + version: 2.1.1 + resolution: "@vitest/coverage-v8@npm:2.1.1" + dependencies: + "@ampproject/remapping": ^2.3.0 + "@bcoe/v8-coverage": ^0.2.3 + debug: ^4.3.6 + istanbul-lib-coverage: ^3.2.2 + istanbul-lib-report: ^3.0.1 + istanbul-lib-source-maps: ^5.0.6 + istanbul-reports: ^3.1.7 + magic-string: ^0.30.11 + magicast: ^0.3.4 + std-env: ^3.7.0 + test-exclude: ^7.0.1 + tinyrainbow: ^1.2.0 + peerDependencies: + "@vitest/browser": 2.1.1 + vitest: 2.1.1 + peerDependenciesMeta: + "@vitest/browser": + optional: true + checksum: c209212c59a2b6c44542bd1f404bc1060107d812f38f33f0f8958fedefb0e5287030db909dbccc63eb6fad12daa80985316895ebac8d04c5640a42eba4a80f7d + languageName: node + linkType: hard + +"@vitest/expect@npm:2.1.1": + version: 2.1.1 + resolution: "@vitest/expect@npm:2.1.1" + dependencies: + "@vitest/spy": 2.1.1 + "@vitest/utils": 2.1.1 + chai: ^5.1.1 + tinyrainbow: ^1.2.0 + checksum: d86bdd36c6968ca2745767e1bc03db4f69cc193534f6d92a4a1f4e12166b37b9184cfd35d1ff06a9ffce1c5bf906b3640cbdf8ff2d345a0594a0094aa39c9d1a + languageName: node + linkType: hard + +"@vitest/mocker@npm:2.1.1": + version: 2.1.1 + resolution: "@vitest/mocker@npm:2.1.1" + dependencies: + "@vitest/spy": ^2.1.0-beta.1 + estree-walker: ^3.0.3 + magic-string: ^0.30.11 + peerDependencies: + "@vitest/spy": 2.1.1 + msw: ^2.3.5 + vite: ^5.0.0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + checksum: d797428efe30d7b1e2183a3827e2423a70183053f570a5872a5533974c21fb5390e5db9b33fc42484bd68ed5d9342c7a0be52b79799eb21d7714fbed2bde2a7e + languageName: node + linkType: hard + +"@vitest/pretty-format@npm:2.1.1, @vitest/pretty-format@npm:^2.1.1": + version: 2.1.1 + resolution: "@vitest/pretty-format@npm:2.1.1" + dependencies: + tinyrainbow: ^1.2.0 + checksum: acc327b4d097719adf01762c22fa6aa59536cef916b7f1e1cbb91179f513ac056aaf023ba07fd86966a241c3157ee8a9c99b52f6899ee61bc1028c7f0117ca14 + languageName: node + linkType: hard + +"@vitest/runner@npm:2.1.1": + version: 2.1.1 + resolution: "@vitest/runner@npm:2.1.1" + dependencies: + "@vitest/utils": 2.1.1 + pathe: ^1.1.2 + checksum: b2c82fc364574bb61475c4197c7facff179d199d6ee2fbe297518255686c301606edf9180ead050d112bb5f12901ba6d86405bf8d3ea3dd5b10cedc46f4d1beb + languageName: node + linkType: hard + +"@vitest/snapshot@npm:2.1.1": + version: 2.1.1 + resolution: "@vitest/snapshot@npm:2.1.1" + dependencies: + "@vitest/pretty-format": 2.1.1 + magic-string: ^0.30.11 + pathe: ^1.1.2 + checksum: d913fa14430d02e38d9c6a14326658be4ce871c8df82f9aa2f33f7c7ac6ab1a341a7b43585d72e8e159482578567865beffe561da218a18ee10110ce9008e0e5 + languageName: node + linkType: hard + +"@vitest/spy@npm:2.1.1, @vitest/spy@npm:^2.1.0-beta.1": + version: 2.1.1 + resolution: "@vitest/spy@npm:2.1.1" + dependencies: + tinyspy: ^3.0.0 + checksum: 87d680dc905b80ced10a5ae8a019772b6b31b7cd928a21ae7043cd06b163ff39eee37dbb3a8033d80e1496200b2990aa13600fccae9b3bf234a65485a4f3f71b + languageName: node + linkType: hard + +"@vitest/utils@npm:2.1.1": + version: 2.1.1 + resolution: "@vitest/utils@npm:2.1.1" + dependencies: + "@vitest/pretty-format": 2.1.1 + loupe: ^3.1.1 + tinyrainbow: ^1.2.0 + checksum: 13ffb30e17fcdcb8bc0c3c64db5eca9b670da4f80fd6bab4a9d387f6a534886fb447e45274db44375703d909aab9ebe123accd8d7159f90a8c9852e7f758e420 + languageName: node + linkType: hard + "abbrev@npm:1": version: 1.1.1 resolution: "abbrev@npm:1.1.1" @@ -2353,8 +3185,8 @@ __metadata: linkType: hard "abi-wan-kanabi@npm:^2.2.2": - version: 2.2.2 - resolution: "abi-wan-kanabi@npm:2.2.2" + version: 2.2.3 + resolution: "abi-wan-kanabi@npm:2.2.3" dependencies: ansicolors: ^0.3.2 cardinal: ^2.1.1 @@ -2362,7 +3194,22 @@ __metadata: yargs: ^17.7.2 bin: generate: dist/generate.js - checksum: 4cf69171887c243a4b5857653f791f3b2042eba93a7326fe03120355cb9f0e29944b91650f96ad739bffad7d8ec9d88c71eeb0debe57df3cd905a1b7c9c2c4a8 + checksum: b1b4bb9a8e721dcab643d47db532814e2b71a3148544495326aea52f60d594d14d1e05b8b9d33b2aed39a083acbc928b589f029ac0b0dde070972c3ba54ad292 + languageName: node + linkType: hard + +"abitype@npm:1.0.5": + version: 1.0.5 + resolution: "abitype@npm:1.0.5" + peerDependencies: + typescript: ">=5.0.4" + zod: ^3 >=3.22.0 + peerDependenciesMeta: + typescript: + optional: true + zod: + optional: true + checksum: 4a4865926e5e8e33e4fab0081a106ce4f627db30b4052fbc449e4707aea6d34d805d46c8d6d0a72234bdd9a2b4900993591515fc299bc57d393181c70dc0c19e languageName: node linkType: hard @@ -2385,11 +3232,11 @@ __metadata: linkType: hard "acorn-walk@npm:^8.1.1": - version: 8.3.3 - resolution: "acorn-walk@npm:8.3.3" + version: 8.3.4 + resolution: "acorn-walk@npm:8.3.4" dependencies: acorn: ^8.11.0 - checksum: 0f09d351fc30b69b2b9982bf33dc30f3d35a34e030e5f1ed3c49fc4e3814a192bf3101e4c30912a0595410f5e91bb70ddba011ea73398b3ecbfe41c7334c6dd0 + checksum: 4ff03f42323e7cf90f1683e08606b0f460e1e6ac263d2730e3df91c7665b6f64e696db6ea27ee4bed18c2599569be61f28a8399fa170c611161a348c402ca19c languageName: node linkType: hard @@ -2469,9 +3316,18 @@ __metadata: linkType: hard "ansi-regex@npm:^6.0.1": - version: 6.0.1 - resolution: "ansi-regex@npm:6.0.1" - checksum: 1ff8b7667cded1de4fa2c9ae283e979fc87036864317da86a2e546725f96406746411d0d85e87a2d12fa5abd715d90006de7fa4fa0477c92321ad3b4c7d4e169 + version: 6.1.0 + resolution: "ansi-regex@npm:6.1.0" + checksum: 495834a53b0856c02acd40446f7130cb0f8284f4a39afdab20d5dc42b2e198b1196119fe887beed8f9055c4ff2055e3b2f6d4641d0be018cdfb64fedf6fc1aac + languageName: node + linkType: hard + +"ansi-styles@npm:^3.2.1": + version: 3.2.1 + resolution: "ansi-styles@npm:3.2.1" + dependencies: + color-convert: ^1.9.0 + checksum: d85ade01c10e5dd77b6c89f34ed7531da5830d2cb5882c645f330079975b716438cd7ebb81d0d6e6b4f9c577f19ae41ab55f07f19786b02f9dfd9e0377395665 languageName: node linkType: hard @@ -2484,6 +3340,13 @@ __metadata: languageName: node linkType: hard +"ansi-styles@npm:^5.0.0": + version: 5.2.0 + resolution: "ansi-styles@npm:5.2.0" + checksum: d7f4e97ce0623aea6bc0d90dcd28881ee04cba06c570b97fd3391bd7a268eedfd9d5e2dd4fdcbdd82b8105df5faf6f24aaedc08eaf3da898e702db5948f63469 + languageName: node + linkType: hard + "ansi-styles@npm:^6.1.0": version: 6.2.1 resolution: "ansi-styles@npm:6.2.1" @@ -2569,6 +3432,15 @@ __metadata: languageName: node linkType: hard +"aria-query@npm:5.3.0": + version: 5.3.0 + resolution: "aria-query@npm:5.3.0" + dependencies: + dequal: ^2.0.3 + checksum: 305bd73c76756117b59aba121d08f413c7ff5e80fa1b98e217a3443fcddb9a232ee790e24e432b59ae7625aebcf4c47cb01c2cac872994f0b426f5bdfcd96ba9 + languageName: node + linkType: hard + "aria-query@npm:~5.1.3": version: 5.1.3 resolution: "aria-query@npm:5.1.3" @@ -2588,7 +3460,7 @@ __metadata: languageName: node linkType: hard -"array-includes@npm:^3.1.6, array-includes@npm:^3.1.7, array-includes@npm:^3.1.8": +"array-includes@npm:^3.1.6, array-includes@npm:^3.1.8": version: 3.1.8 resolution: "array-includes@npm:3.1.8" dependencies: @@ -2623,7 +3495,7 @@ __metadata: languageName: node linkType: hard -"array.prototype.findlastindex@npm:^1.2.3": +"array.prototype.findlastindex@npm:^1.2.5": version: 1.2.5 resolution: "array.prototype.findlastindex@npm:1.2.5" dependencies: @@ -2690,6 +3562,13 @@ __metadata: languageName: node linkType: hard +"assertion-error@npm:^2.0.1": + version: 2.0.1 + resolution: "assertion-error@npm:2.0.1" + checksum: a0789dd882211b87116e81e2648ccb7f60340b34f19877dd020b39ebb4714e475eb943e14ba3e22201c221ef6645b7bfe10297e76b6ac95b48a9898c1211ce66 + languageName: node + linkType: hard + "ast-types-flow@npm:^0.0.8": version: 0.0.8 resolution: "ast-types-flow@npm:0.0.8" @@ -2725,21 +3604,28 @@ __metadata: languageName: node linkType: hard +"asynckit@npm:^0.4.0": + version: 0.4.0 + resolution: "asynckit@npm:0.4.0" + checksum: 7b78c451df768adba04e2d02e63e2d0bf3b07adcd6e42b4cf665cb7ce899bedd344c69a1dcbce355b5f972d597b25aaa1c1742b52cffd9caccb22f348114f6be + languageName: node + linkType: hard + "autoprefixer@npm:^10.0.1": - version: 10.4.19 - resolution: "autoprefixer@npm:10.4.19" + version: 10.4.20 + resolution: "autoprefixer@npm:10.4.20" dependencies: - browserslist: ^4.23.0 - caniuse-lite: ^1.0.30001599 + browserslist: ^4.23.3 + caniuse-lite: ^1.0.30001646 fraction.js: ^4.3.7 normalize-range: ^0.1.2 - picocolors: ^1.0.0 + picocolors: ^1.0.1 postcss-value-parser: ^4.2.0 peerDependencies: postcss: ^8.1.0 bin: autoprefixer: bin/autoprefixer - checksum: 3a4bc5bace05e057396dca2b306503efc175e90e8f2abf5472d3130b72da1d54d97c0ee05df21bf04fe66a7df93fd8c8ec0f1aca72a165f4701a02531abcbf11 + checksum: 187cec2ec356631932b212f76dc64f4419c117fdb2fb9eeeb40867d38ba5ca5ba734e6ceefc9e3af4eec8258e60accdf5cbf2b7708798598fde35cdc3de562d6 languageName: node linkType: hard @@ -2752,19 +3638,17 @@ __metadata: languageName: node linkType: hard -"axe-core@npm:^4.9.1": - version: 4.9.1 - resolution: "axe-core@npm:4.9.1" - checksum: 41d9227871781f96c2952e2a777fca73624959dd0e98864f6d82806a77602f82b4fc490852082a7e524d8cd864e50d8b4d9931819b4a150112981d8c932110c5 +"axe-core@npm:^4.10.0": + version: 4.10.0 + resolution: "axe-core@npm:4.10.0" + checksum: 7eca827fd8d98d7e4b561df65437be608155c613d8f262ae9e4a6ade02c156c7362dcbc3f71b4b526edce686f7c686280236bcff1d6725e2ef8327def72a8c41 languageName: node linkType: hard -"axobject-query@npm:~3.1.1": - version: 3.1.1 - resolution: "axobject-query@npm:3.1.1" - dependencies: - deep-equal: ^2.0.5 - checksum: c12a5da10dc7bab75e1cda9b6a3b5fcf10eba426ddf1a17b71ef65a434ed707ede7d1c4f013ba1609e970bc8c0cddac01365080d376204314e9b294719acd8a5 +"axobject-query@npm:^4.1.0": + version: 4.1.0 + resolution: "axobject-query@npm:4.1.0" + checksum: 7d1e87bf0aa7ae7a76cd39ab627b7c48fda3dc40181303d9adce4ba1d5b5ce73b5e5403ee6626ec8e91090448c887294d6144e24b6741a976f5be9347e3ae1df languageName: node linkType: hard @@ -2826,17 +3710,17 @@ __metadata: languageName: node linkType: hard -"browserslist@npm:^4.23.0": - version: 4.23.2 - resolution: "browserslist@npm:4.23.2" +"browserslist@npm:^4.23.1, browserslist@npm:^4.23.3": + version: 4.24.0 + resolution: "browserslist@npm:4.24.0" dependencies: - caniuse-lite: ^1.0.30001640 - electron-to-chromium: ^1.4.820 - node-releases: ^2.0.14 + caniuse-lite: ^1.0.30001663 + electron-to-chromium: ^1.5.28 + node-releases: ^2.0.18 update-browserslist-db: ^1.1.0 bin: browserslist: cli.js - checksum: 8212af37f6ca6355da191cf2d4ad49bd0b82854888b9a7e103638fada70d38cbe36d28feeeaa98344cb15d9128f9f74bcc8ce1bfc9011b5fd14381c1c6fb542c + checksum: de200d3eb8d6ed819dad99719099a28fb6ebeb88016a5ac42fbdc11607e910c236a84ca1b0bbf232477d4b88ab64e8ab6aa67557cdd40a73ca9c2834f92ccce0 languageName: node linkType: hard @@ -2863,6 +3747,13 @@ __metadata: languageName: node linkType: hard +"cac@npm:^6.7.14": + version: 6.7.14 + resolution: "cac@npm:6.7.14" + checksum: 45a2496a9443abbe7f52a49b22fbe51b1905eff46e03fd5e6c98e3f85077be3f8949685a1849b1a9cd2bc3e5567dfebcf64f01ce01847baf918f1b37c839791a + languageName: node + linkType: hard + "cacache@npm:^18.0.0": version: 18.0.4 resolution: "cacache@npm:18.0.4" @@ -2910,10 +3801,10 @@ __metadata: languageName: node linkType: hard -"caniuse-lite@npm:^1.0.30001579, caniuse-lite@npm:^1.0.30001599, caniuse-lite@npm:^1.0.30001640": - version: 1.0.30001643 - resolution: "caniuse-lite@npm:1.0.30001643" - checksum: e39991c13a0fd8f5c2aa99c9128188e4c4e9d6a203c3da6270c36285460ef152c5e9410ee4db560aa723904668946afe50541dce9636ab5e61434ba71dc22955 +"caniuse-lite@npm:^1.0.30001579, caniuse-lite@npm:^1.0.30001646, caniuse-lite@npm:^1.0.30001663": + version: 1.0.30001664 + resolution: "caniuse-lite@npm:1.0.30001664" + checksum: cee25b4ea8a84779b7c9a60c1f9e304f6d99b79ef622b25fbc7873b4e55e8722a1091dd6c8b77bd7723e9f26a84b4a820a50a864989dd477e7ee51dc30461dca languageName: node linkType: hard @@ -2929,7 +3820,31 @@ __metadata: languageName: node linkType: hard -"chalk@npm:^4.0.0": +"chai@npm:^5.1.1": + version: 5.1.1 + resolution: "chai@npm:5.1.1" + dependencies: + assertion-error: ^2.0.1 + check-error: ^2.1.1 + deep-eql: ^5.0.1 + loupe: ^3.1.0 + pathval: ^2.0.0 + checksum: 1e0a5e1b5febdfa8ceb97b9aff608286861ecb86533863119b2f39f07c08fb59f3c1791ab554947f009b9d71d509b9e4e734fb12133cb81f231c2c2ee7c1e738 + languageName: node + linkType: hard + +"chalk@npm:^2.4.2": + version: 2.4.2 + resolution: "chalk@npm:2.4.2" + dependencies: + ansi-styles: ^3.2.1 + escape-string-regexp: ^1.0.5 + supports-color: ^5.3.0 + checksum: ec3661d38fe77f681200f878edbd9448821924e0f93a9cefc0e26a33b145f1027a2084bf19967160d11e1f03bfe4eaffcabf5493b89098b2782c3fe0b03d80c2 + languageName: node + linkType: hard + +"chalk@npm:^4.0.0, chalk@npm:^4.1.0": version: 4.1.2 resolution: "chalk@npm:4.1.2" dependencies: @@ -2939,6 +3854,13 @@ __metadata: languageName: node linkType: hard +"check-error@npm:^2.1.1": + version: 2.1.1 + resolution: "check-error@npm:2.1.1" + checksum: d785ed17b1d4a4796b6e75c765a9a290098cf52ff9728ce0756e8ffd4293d2e419dd30c67200aee34202463b474306913f2fcfaf1890641026d9fc6966fea27a + languageName: node + linkType: hard + "chokidar@npm:3.3.1": version: 3.3.1 resolution: "chokidar@npm:3.3.1" @@ -3037,6 +3959,15 @@ __metadata: languageName: node linkType: hard +"color-convert@npm:^1.9.0": + version: 1.9.3 + resolution: "color-convert@npm:1.9.3" + dependencies: + color-name: 1.1.3 + checksum: fd7a64a17cde98fb923b1dd05c5f2e6f7aefda1b60d67e8d449f9328b4e53b228a428fd38bfeaeb2db2ff6b6503a776a996150b80cdf224062af08a5c8a3a203 + languageName: node + linkType: hard + "color-convert@npm:^2.0.1": version: 2.0.1 resolution: "color-convert@npm:2.0.1" @@ -3046,6 +3977,13 @@ __metadata: languageName: node linkType: hard +"color-name@npm:1.1.3": + version: 1.1.3 + resolution: "color-name@npm:1.1.3" + checksum: 09c5d3e33d2105850153b14466501f2bfb30324a2f76568a408763a3b7433b0e50e5b4ab1947868e65cb101bb7cb75029553f2c333b6d4b8138a73fcc133d69d + languageName: node + linkType: hard + "color-name@npm:~1.1.4": version: 1.1.4 resolution: "color-name@npm:1.1.4" @@ -3062,6 +4000,15 @@ __metadata: languageName: node linkType: hard +"combined-stream@npm:^1.0.8": + version: 1.0.8 + resolution: "combined-stream@npm:1.0.8" + dependencies: + delayed-stream: ~1.0.0 + checksum: 49fa4aeb4916567e33ea81d088f6584749fc90c7abec76fd516bf1c5aa5c79f3584b5ba3de6b86d26ddd64bae5329c4c7479343250cfe71c75bb366eae53bb7c + languageName: node + linkType: hard + "commander@npm:^4.0.0": version: 4.1.1 resolution: "commander@npm:4.1.1" @@ -3097,6 +4044,13 @@ __metadata: languageName: node linkType: hard +"convert-source-map@npm:^2.0.0": + version: 2.0.0 + resolution: "convert-source-map@npm:2.0.0" + checksum: 63ae9933be5a2b8d4509daca5124e20c14d023c820258e484e32dc324d34c2754e71297c94a05784064ad27615037ef677e3f0c00469fb55f409d2bb21261035 + languageName: node + linkType: hard + "copy-to-clipboard@npm:^3.3.1": version: 3.3.3 resolution: "copy-to-clipboard@npm:3.3.3" @@ -3143,6 +4097,15 @@ __metadata: languageName: node linkType: hard +"cssstyle@npm:^4.1.0": + version: 4.1.0 + resolution: "cssstyle@npm:4.1.0" + dependencies: + rrweb-cssom: ^0.7.1 + checksum: a8f5746430c42347e76dc830548f3a296882e42a90af188ae44e4c1a4131aec246b0b6c8562e3e6e4fa0ff14aeee5cd14a0e2fe5a7105dcf39f98eb70d16b634 + languageName: node + linkType: hard + "csstype@npm:^3.0.2": version: 3.1.3 resolution: "csstype@npm:3.1.3" @@ -3176,6 +4139,16 @@ __metadata: languageName: node linkType: hard +"data-urls@npm:^5.0.0": + version: 5.0.0 + resolution: "data-urls@npm:5.0.0" + dependencies: + whatwg-mimetype: ^4.0.0 + whatwg-url: ^14.0.0 + checksum: 5c40568c31b02641a70204ff233bc4e42d33717485d074244a98661e5f2a1e80e38fe05a5755dfaf2ee549f2ab509d6a3af2a85f4b2ad2c984e5d176695eaf46 + languageName: node + linkType: hard + "data-view-buffer@npm:^1.0.1": version: 1.0.1 resolution: "data-view-buffer@npm:1.0.1" @@ -3209,15 +4182,15 @@ __metadata: languageName: node linkType: hard -"debug@npm:4, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.4": - version: 4.3.6 - resolution: "debug@npm:4.3.6" +"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.4, debug@npm:^4.3.5, debug@npm:^4.3.6": + version: 4.3.7 + resolution: "debug@npm:4.3.7" dependencies: - ms: 2.1.2 + ms: ^2.1.3 peerDependenciesMeta: supports-color: optional: true - checksum: 1630b748dea3c581295e02137a9f5cbe2c1d85fea35c1e6597a65ca2b16a6fce68cec61b299d480787ef310ba927dc8c92d3061faba0ad06c6a724672f66be7f + checksum: 822d74e209cd910ef0802d261b150314bbcf36c582ccdbb3e70f0894823c17e49a50d3e66d96b633524263975ca16b6a833f3e3b7e030c157169a5fabac63160 languageName: node linkType: hard @@ -3239,6 +4212,20 @@ __metadata: languageName: node linkType: hard +"decimal.js@npm:^10.4.3": + version: 10.4.3 + resolution: "decimal.js@npm:10.4.3" + checksum: 796404dcfa9d1dbfdc48870229d57f788b48c21c603c3f6554a1c17c10195fc1024de338b0cf9e1efe0c7c167eeb18f04548979bcc5fdfabebb7cc0ae3287bae + languageName: node + linkType: hard + +"deep-eql@npm:^5.0.1": + version: 5.0.2 + resolution: "deep-eql@npm:5.0.2" + checksum: 6aaaadb4c19cbce42e26b2bbe5bd92875f599d2602635dc97f0294bae48da79e89470aedee05f449e0ca8c65e9fd7e7872624d1933a1db02713d99c2ca8d1f24 + languageName: node + linkType: hard + "deep-equal@npm:^2.0.5": version: 2.2.3 resolution: "deep-equal@npm:2.2.3" @@ -3294,6 +4281,13 @@ __metadata: languageName: node linkType: hard +"delayed-stream@npm:~1.0.0": + version: 1.0.0 + resolution: "delayed-stream@npm:1.0.0" + checksum: 46fe6e83e2cb1d85ba50bd52803c68be9bd953282fa7096f51fc29edd5d67ff84ff753c51966061e5ba7cb5e47ef6d36a91924eddb7f3f3483b1c560f77a0020 + languageName: node + linkType: hard + "delegates@npm:^1.0.0": version: 1.0.0 resolution: "delegates@npm:1.0.0" @@ -3308,6 +4302,13 @@ __metadata: languageName: node linkType: hard +"dequal@npm:^2.0.3": + version: 2.0.3 + resolution: "dequal@npm:2.0.3" + checksum: 8679b850e1a3d0ebbc46ee780d5df7b478c23f335887464023a631d1b9af051ad4a6595a44220f9ff8ff95a8ddccf019b5ad778a976fd7bbf77383d36f412f90 + languageName: node + linkType: hard + "detect-libc@npm:^2.0.0": version: 2.0.3 resolution: "detect-libc@npm:2.0.3" @@ -3370,6 +4371,13 @@ __metadata: languageName: node linkType: hard +"dom-accessibility-api@npm:^0.5.9": + version: 0.5.16 + resolution: "dom-accessibility-api@npm:0.5.16" + checksum: 005eb283caef57fc1adec4d5df4dd49189b628f2f575af45decb210e04d634459e3f1ee64f18b41e2dcf200c844bc1d9279d80807e686a30d69a4756151ad248 + languageName: node + linkType: hard + "dotenv@npm:^16.3.1": version: 16.4.5 resolution: "dotenv@npm:16.4.5" @@ -3403,10 +4411,10 @@ __metadata: languageName: node linkType: hard -"electron-to-chromium@npm:^1.4.820": - version: 1.5.2 - resolution: "electron-to-chromium@npm:1.5.2" - checksum: 530a9a4dc4aa0220abf564be49b7090470eac6e9a03acb667deadaf139c7f65466b4540ff5699677f9370f2a05619e89fc089f81603d36d33dc5acc75f12171e +"electron-to-chromium@npm:^1.5.28": + version: 1.5.29 + resolution: "electron-to-chromium@npm:1.5.29" + checksum: c1de62aaea88c9b3ba32f8f2703b9d77a81633099a8f61365eaf9855d36e72189dcd99b9c3b8b2804afa403ac2ce0b00c23affa6f19d17b04ce0076f66a546b6 languageName: node linkType: hard @@ -3451,7 +4459,7 @@ __metadata: languageName: node linkType: hard -"enhanced-resolve@npm:^5.12.0": +"enhanced-resolve@npm:^5.15.0": version: 5.17.1 resolution: "enhanced-resolve@npm:5.17.1" dependencies: @@ -3461,6 +4469,13 @@ __metadata: languageName: node linkType: hard +"entities@npm:^4.4.0": + version: 4.5.0 + resolution: "entities@npm:4.5.0" + checksum: 853f8ebd5b425d350bffa97dd6958143179a5938352ccae092c62d1267c4e392a039be1bae7d51b6e4ffad25f51f9617531fedf5237f15df302ccfb452cbf2d7 + languageName: node + linkType: hard + "env-paths@npm:^2.2.0": version: 2.2.1 resolution: "env-paths@npm:2.2.1" @@ -3851,10 +4866,97 @@ __metadata: languageName: node linkType: hard +"esbuild@npm:^0.21.3": + version: 0.21.5 + resolution: "esbuild@npm:0.21.5" + dependencies: + "@esbuild/aix-ppc64": 0.21.5 + "@esbuild/android-arm": 0.21.5 + "@esbuild/android-arm64": 0.21.5 + "@esbuild/android-x64": 0.21.5 + "@esbuild/darwin-arm64": 0.21.5 + "@esbuild/darwin-x64": 0.21.5 + "@esbuild/freebsd-arm64": 0.21.5 + "@esbuild/freebsd-x64": 0.21.5 + "@esbuild/linux-arm": 0.21.5 + "@esbuild/linux-arm64": 0.21.5 + "@esbuild/linux-ia32": 0.21.5 + "@esbuild/linux-loong64": 0.21.5 + "@esbuild/linux-mips64el": 0.21.5 + "@esbuild/linux-ppc64": 0.21.5 + "@esbuild/linux-riscv64": 0.21.5 + "@esbuild/linux-s390x": 0.21.5 + "@esbuild/linux-x64": 0.21.5 + "@esbuild/netbsd-x64": 0.21.5 + "@esbuild/openbsd-x64": 0.21.5 + "@esbuild/sunos-x64": 0.21.5 + "@esbuild/win32-arm64": 0.21.5 + "@esbuild/win32-ia32": 0.21.5 + "@esbuild/win32-x64": 0.21.5 + dependenciesMeta: + "@esbuild/aix-ppc64": + optional: true + "@esbuild/android-arm": + optional: true + "@esbuild/android-arm64": + optional: true + "@esbuild/android-x64": + optional: true + "@esbuild/darwin-arm64": + optional: true + "@esbuild/darwin-x64": + optional: true + "@esbuild/freebsd-arm64": + optional: true + "@esbuild/freebsd-x64": + optional: true + "@esbuild/linux-arm": + optional: true + "@esbuild/linux-arm64": + optional: true + "@esbuild/linux-ia32": + optional: true + "@esbuild/linux-loong64": + optional: true + "@esbuild/linux-mips64el": + optional: true + "@esbuild/linux-ppc64": + optional: true + "@esbuild/linux-riscv64": + optional: true + "@esbuild/linux-s390x": + optional: true + "@esbuild/linux-x64": + optional: true + "@esbuild/netbsd-x64": + optional: true + "@esbuild/openbsd-x64": + optional: true + "@esbuild/sunos-x64": + optional: true + "@esbuild/win32-arm64": + optional: true + "@esbuild/win32-ia32": + optional: true + "@esbuild/win32-x64": + optional: true + bin: + esbuild: bin/esbuild + checksum: 2911c7b50b23a9df59a7d6d4cdd3a4f85855787f374dce751148dbb13305e0ce7e880dde1608c2ab7a927fc6cec3587b80995f7fc87a64b455f8b70b55fd8ec1 + languageName: node + linkType: hard + "escalade@npm:^3.1.1, escalade@npm:^3.1.2": - version: 3.1.2 - resolution: "escalade@npm:3.1.2" - checksum: 1ec0977aa2772075493002bdbd549d595ff6e9393b1cb0d7d6fcaf78c750da0c158f180938365486f75cb69fba20294351caddfce1b46552a7b6c3cde52eaa02 + version: 3.2.0 + resolution: "escalade@npm:3.2.0" + checksum: 47b029c83de01b0d17ad99ed766347b974b0d628e848de404018f3abee728e987da0d2d370ad4574aa3d5b5bfc368754fd085d69a30f8e75903486ec4b5b709e + languageName: node + linkType: hard + +"escape-string-regexp@npm:^1.0.5": + version: 1.0.5 + resolution: "escape-string-regexp@npm:1.0.5" + checksum: 6092fda75c63b110c706b6a9bfde8a612ad595b628f0bd2147eea1d3406723020810e591effc7db1da91d80a71a737a313567c5abb3813e8d9c71f4aa595b410 languageName: node linkType: hard @@ -3900,72 +5002,80 @@ __metadata: linkType: hard "eslint-import-resolver-typescript@npm:^3.5.2": - version: 3.6.1 - resolution: "eslint-import-resolver-typescript@npm:3.6.1" - dependencies: - debug: ^4.3.4 - enhanced-resolve: ^5.12.0 - eslint-module-utils: ^2.7.4 - fast-glob: ^3.3.1 - get-tsconfig: ^4.5.0 - is-core-module: ^2.11.0 + version: 3.6.3 + resolution: "eslint-import-resolver-typescript@npm:3.6.3" + dependencies: + "@nolyfill/is-core-module": 1.0.39 + debug: ^4.3.5 + enhanced-resolve: ^5.15.0 + eslint-module-utils: ^2.8.1 + fast-glob: ^3.3.2 + get-tsconfig: ^4.7.5 + is-bun-module: ^1.0.2 is-glob: ^4.0.3 peerDependencies: eslint: "*" eslint-plugin-import: "*" - checksum: 454fa0646533050fb57f13d27daf8c71f51b0bb9156d6a461290ccb8576d892209fcc6702a89553f3f5ea8e5b407395ca2e5de169a952c953685f1f7c46b4496 + eslint-plugin-import-x: "*" + peerDependenciesMeta: + eslint-plugin-import: + optional: true + eslint-plugin-import-x: + optional: true + checksum: 1ed0cab4f3852de1b14ea6978e76c27694b253a289c2030a35847ba8ab6ac4258d513877f83ea7bc265f746d570240a6348b11d77cc9cd77589749ad86a32234 languageName: node linkType: hard -"eslint-module-utils@npm:^2.7.4, eslint-module-utils@npm:^2.8.0": - version: 2.8.1 - resolution: "eslint-module-utils@npm:2.8.1" +"eslint-module-utils@npm:^2.8.1, eslint-module-utils@npm:^2.9.0": + version: 2.11.1 + resolution: "eslint-module-utils@npm:2.11.1" dependencies: debug: ^3.2.7 peerDependenciesMeta: eslint: optional: true - checksum: 3cecd99b6baf45ffc269167da0f95dcb75e5aa67b93d73a3bab63e2a7eedd9cdd6f188eed048e2f57c1b77db82c9cbf2adac20b512fa70e597d863dd3720170d + checksum: 9602122625c05c971c98edfe54075c3147bdeb388375e5f8df55e62dfd894b042dc0eedba97347effba2ca458237edadd88fbc0d015f195c42853d6dc23697a1 languageName: node linkType: hard "eslint-plugin-import@npm:^2.28.1": - version: 2.29.1 - resolution: "eslint-plugin-import@npm:2.29.1" + version: 2.30.0 + resolution: "eslint-plugin-import@npm:2.30.0" dependencies: - array-includes: ^3.1.7 - array.prototype.findlastindex: ^1.2.3 + "@rtsao/scc": ^1.1.0 + array-includes: ^3.1.8 + array.prototype.findlastindex: ^1.2.5 array.prototype.flat: ^1.3.2 array.prototype.flatmap: ^1.3.2 debug: ^3.2.7 doctrine: ^2.1.0 eslint-import-resolver-node: ^0.3.9 - eslint-module-utils: ^2.8.0 - hasown: ^2.0.0 - is-core-module: ^2.13.1 + eslint-module-utils: ^2.9.0 + hasown: ^2.0.2 + is-core-module: ^2.15.1 is-glob: ^4.0.3 minimatch: ^3.1.2 - object.fromentries: ^2.0.7 - object.groupby: ^1.0.1 - object.values: ^1.1.7 + object.fromentries: ^2.0.8 + object.groupby: ^1.0.3 + object.values: ^1.2.0 semver: ^6.3.1 tsconfig-paths: ^3.15.0 peerDependencies: eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 - checksum: e65159aef808136d26d029b71c8c6e4cb5c628e65e5de77f1eb4c13a379315ae55c9c3afa847f43f4ff9df7e54515c77ffc6489c6a6f81f7dd7359267577468c + checksum: 0ec1ad69c0d22f15bc4a49ee97ae757e4adfc3181996f2c4a1ed4d5028bd99bab38e7623e58ef4477ba1db8425f441e4e986367125273efa4c5f7ad2c4467a9a languageName: node linkType: hard "eslint-plugin-jsx-a11y@npm:^6.7.1": - version: 6.9.0 - resolution: "eslint-plugin-jsx-a11y@npm:6.9.0" + version: 6.10.0 + resolution: "eslint-plugin-jsx-a11y@npm:6.10.0" dependencies: aria-query: ~5.1.3 array-includes: ^3.1.8 array.prototype.flatmap: ^1.3.2 ast-types-flow: ^0.0.8 - axe-core: ^4.9.1 - axobject-query: ~3.1.1 + axe-core: ^4.10.0 + axobject-query: ^4.1.0 damerau-levenshtein: ^1.0.8 emoji-regex: ^9.2.2 es-iterator-helpers: ^1.0.19 @@ -3977,8 +5087,8 @@ __metadata: safe-regex-test: ^1.0.3 string.prototype.includes: ^2.0.0 peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 - checksum: 122cbd22bbd8c3e4a37f386ec183ada63a4ecfa7af7d40cd8a110777ac5ad5ff542f60644596a9e2582ed138a1cc6d96c5d5ca934105e29d5245d6c951ebc3ef + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9 + checksum: 1009deca12ddbe3624586bc5fc3534ca98d00a5841a2563cb6abd9339b984f0a99075dc2a703a517f4087eb84d659c87e60beda17645883de2ba1d86f2b20c96 languageName: node linkType: hard @@ -3992,8 +5102,8 @@ __metadata: linkType: hard "eslint-plugin-react@npm:^7.33.2": - version: 7.35.0 - resolution: "eslint-plugin-react@npm:7.35.0" + version: 7.36.1 + resolution: "eslint-plugin-react@npm:7.36.1" dependencies: array-includes: ^3.1.8 array.prototype.findlast: ^1.2.5 @@ -4015,7 +5125,7 @@ __metadata: string.prototype.repeat: ^1.0.0 peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 - checksum: cd4d3c0567e947964643dda5fc80147e058d75f06bac47c3f086ff0cd6156286c669d98e685e3834997c4043f3922b90e6374b6c3658f22abd025dbd41acc23f + checksum: bf3be414f3d639200a7d91feeaa6beec3397feed93ab22eaecef44dda37ecbd01812ed1720c72a9861fb276d3543cea69a834a66f64de3d878796fef4f4bf129 languageName: node linkType: hard @@ -4037,14 +5147,14 @@ __metadata: linkType: hard "eslint@npm:^8": - version: 8.57.0 - resolution: "eslint@npm:8.57.0" + version: 8.57.1 + resolution: "eslint@npm:8.57.1" dependencies: "@eslint-community/eslint-utils": ^4.2.0 "@eslint-community/regexpp": ^4.6.1 "@eslint/eslintrc": ^2.1.4 - "@eslint/js": 8.57.0 - "@humanwhocodes/config-array": ^0.11.14 + "@eslint/js": 8.57.1 + "@humanwhocodes/config-array": ^0.13.0 "@humanwhocodes/module-importer": ^1.0.1 "@nodelib/fs.walk": ^1.2.8 "@ungap/structured-clone": ^1.2.0 @@ -4080,7 +5190,7 @@ __metadata: text-table: ^0.2.0 bin: eslint: bin/eslint.js - checksum: 3a48d7ff85ab420a8447e9810d8087aea5b1df9ef68c9151732b478de698389ee656fd895635b5f2871c89ee5a2652b3f343d11e9db6f8486880374ebc74a2d9 + checksum: e2489bb7f86dd2011967759a09164e65744ef7688c310bc990612fc26953f34cc391872807486b15c06833bdff737726a23e9b4cdba5de144c311377dc41d91b languageName: node linkType: hard @@ -4137,6 +5247,15 @@ __metadata: languageName: node linkType: hard +"estree-walker@npm:^3.0.3": + version: 3.0.3 + resolution: "estree-walker@npm:3.0.3" + dependencies: + "@types/estree": ^1.0.0 + checksum: a65728d5727b71de172c5df323385755a16c0fdab8234dc756c3854cfee343261ddfbb72a809a5660fac8c75d960bb3e21aa898c2d7e9b19bb298482ca58a3af + languageName: node + linkType: hard + "esutils@npm:^2.0.2": version: 2.0.3 resolution: "esutils@npm:2.0.3" @@ -4212,7 +5331,7 @@ __metadata: languageName: node linkType: hard -"fast-glob@npm:^3.2.7, fast-glob@npm:^3.2.9, fast-glob@npm:^3.3.0, fast-glob@npm:^3.3.1": +"fast-glob@npm:^3.2.7, fast-glob@npm:^3.2.9, fast-glob@npm:^3.3.0, fast-glob@npm:^3.3.2": version: 3.3.2 resolution: "fast-glob@npm:3.3.2" dependencies: @@ -4337,12 +5456,23 @@ __metadata: linkType: hard "foreground-child@npm:^3.1.0": - version: 3.2.1 - resolution: "foreground-child@npm:3.2.1" + version: 3.3.0 + resolution: "foreground-child@npm:3.3.0" dependencies: cross-spawn: ^7.0.0 signal-exit: ^4.0.1 - checksum: 3e2e844d6003c96d70affe8ae98d7eaaba269a868c14d997620c088340a8775cd5d2d9043e6ceebae1928d8d9a874911c4d664b9a267e8995945df20337aebc0 + checksum: 1989698488f725b05b26bc9afc8a08f08ec41807cd7b92ad85d96004ddf8243fd3e79486b8348c64a3011ae5cc2c9f0936af989e1f28339805d8bc178a75b451 + languageName: node + linkType: hard + +"form-data@npm:^4.0.0": + version: 4.0.0 + resolution: "form-data@npm:4.0.0" + dependencies: + asynckit: ^0.4.0 + combined-stream: ^1.0.8 + mime-types: ^2.1.12 + checksum: 01135bf8675f9d5c61ff18e2e2932f719ca4de964e3be90ef4c36aacfc7b9cb2fceb5eca0b7e0190e3383fe51c5b37f4cb80b62ca06a99aaabfcfd6ac7c9328c languageName: node linkType: hard @@ -4430,7 +5560,7 @@ __metadata: languageName: node linkType: hard -"fsevents@npm:~2.3.2": +"fsevents@npm:~2.3.2, fsevents@npm:~2.3.3": version: 2.3.3 resolution: "fsevents@npm:2.3.3" dependencies: @@ -4449,7 +5579,7 @@ __metadata: languageName: node linkType: hard -"fsevents@patch:fsevents@~2.3.2#~builtin": +"fsevents@patch:fsevents@~2.3.2#~builtin, fsevents@patch:fsevents@~2.3.3#~builtin": version: 2.3.3 resolution: "fsevents@patch:fsevents@npm%3A2.3.3#~builtin::version=2.3.3&hash=18f3a7" dependencies: @@ -4465,7 +5595,7 @@ __metadata: languageName: node linkType: hard -"function.prototype.name@npm:^1.1.5, function.prototype.name@npm:^1.1.6": +"function.prototype.name@npm:^1.1.6": version: 1.1.6 resolution: "function.prototype.name@npm:1.1.6" dependencies: @@ -4508,6 +5638,13 @@ __metadata: languageName: node linkType: hard +"gensync@npm:^1.0.0-beta.2": + version: 1.0.0-beta.2 + resolution: "gensync@npm:1.0.0-beta.2" + checksum: a7437e58c6be12aa6c90f7730eac7fa9833dc78872b4ad2963d2031b00a3367a93f98aec75f9aaac7220848e4026d67a8655e870b24f20a543d103c0d65952ec + languageName: node + linkType: hard + "get-caller-file@npm:^2.0.5": version: 2.0.5 resolution: "get-caller-file@npm:2.0.5" @@ -4515,6 +5652,13 @@ __metadata: languageName: node linkType: hard +"get-func-name@npm:^2.0.1": + version: 2.0.2 + resolution: "get-func-name@npm:2.0.2" + checksum: 3f62f4c23647de9d46e6f76d2b3eafe58933a9b3830c60669e4180d6c601ce1b4aa310ba8366143f55e52b139f992087a9f0647274e8745621fa2af7e0acf13b + languageName: node + linkType: hard + "get-intrinsic@npm:^1.1.3, get-intrinsic@npm:^1.2.1, get-intrinsic@npm:^1.2.2, get-intrinsic@npm:^1.2.3, get-intrinsic@npm:^1.2.4": version: 1.2.4 resolution: "get-intrinsic@npm:1.2.4" @@ -4535,17 +5679,12 @@ __metadata: languageName: node linkType: hard -"get-starknet-core@npm:^3.3.0": - version: 3.3.2 - resolution: "get-starknet-core@npm:3.3.2" +"get-starknet-core@npm:^4.0.0": + version: 4.0.0 + resolution: "get-starknet-core@npm:4.0.0" dependencies: - "@module-federation/runtime": ^0.1.2 - peerDependencies: - starknet: ^5.18.0 - peerDependenciesMeta: - starknet: - optional: false - checksum: 822429e33f7b6fb4745fdd5c0177a2d117c7881e8eabc785dddf4e4fe3e74df46d1df85ea738028645dcf048d13571bf769cdf02f8b0c4bda7fddb4244e07369 + "@starknet-io/types-js": ^0.7.7 + checksum: 06e4be1be945d8fb7ad3f0d77a5e92c2854ce43cae8091a9f9b5f3cc74d42cf7188de9e544d497f92c0cad316d6d0abc110520629987815be2aed26d0b9ab871 languageName: node linkType: hard @@ -4569,12 +5708,12 @@ __metadata: languageName: node linkType: hard -"get-tsconfig@npm:^4.5.0": - version: 4.7.6 - resolution: "get-tsconfig@npm:4.7.6" +"get-tsconfig@npm:^4.7.5": + version: 4.8.1 + resolution: "get-tsconfig@npm:4.8.1" dependencies: resolve-pkg-maps: ^1.0.0 - checksum: ebfd86f0b356cde98e2a7afe63b58d92e02b8e413ff95551933d277702bf725386ee82c5c0092fe45fb2ba60002340c94ee70777b3220bbfeca83ab45dda1544 + checksum: 12df01672e691d2ff6db8cf7fed1ddfef90ed94a5f3d822c63c147a26742026d582acd86afcd6f65db67d809625d17dd7f9d34f4d3f38f69bc2f48e19b2bdd5b languageName: node linkType: hard @@ -4611,7 +5750,7 @@ __metadata: languageName: node linkType: hard -"glob@npm:^10.2.2, glob@npm:^10.3.10": +"glob@npm:^10.2.2, glob@npm:^10.3.10, glob@npm:^10.4.1": version: 10.4.5 resolution: "glob@npm:10.4.5" dependencies: @@ -4641,6 +5780,13 @@ __metadata: languageName: node linkType: hard +"globals@npm:^11.1.0": + version: 11.12.0 + resolution: "globals@npm:11.12.0" + checksum: 67051a45eca3db904aee189dfc7cd53c20c7d881679c93f6146ddd4c9f4ab2268e68a919df740d39c71f4445d2b38ee360fc234428baea1dbdfe68bbcb46979e + languageName: node + linkType: hard + "globals@npm:^13.19.0": version: 13.24.0 resolution: "globals@npm:13.24.0" @@ -4651,9 +5797,9 @@ __metadata: linkType: hard "globals@npm:^15.8.0": - version: 15.8.0 - resolution: "globals@npm:15.8.0" - checksum: 92d0522c47226ca12f6fd8938df04b37852d812cc5a84e31890d919497f102a818d2081570bc08c2dd6353cd8b2699e7180bc468abbbec8c858a19e0fa53aeb8 + version: 15.9.0 + resolution: "globals@npm:15.9.0" + checksum: 32c4470ffcc26db3ddbc579ddf968b74c26462d1a268039980c2fa2e107090fd442a7a7445d953dc4ee874f68846e713066c5a8e63d146fd9349cd1fc5a6f63d languageName: node linkType: hard @@ -4720,6 +5866,13 @@ __metadata: languageName: node linkType: hard +"has-flag@npm:^3.0.0": + version: 3.0.0 + resolution: "has-flag@npm:3.0.0" + checksum: 4a15638b454bf086c8148979aae044dd6e39d63904cd452d970374fa6a87623423da485dfb814e7be882e05c096a7ccf1ebd48e7e7501d0208d8384ff4dea73b + languageName: node + linkType: hard + "has-flag@npm:^4.0.0": version: 4.0.0 resolution: "has-flag@npm:4.0.0" @@ -4775,6 +5928,22 @@ __metadata: languageName: node linkType: hard +"html-encoding-sniffer@npm:^4.0.0": + version: 4.0.0 + resolution: "html-encoding-sniffer@npm:4.0.0" + dependencies: + whatwg-encoding: ^3.1.1 + checksum: 3339b71dab2723f3159a56acf541ae90a408ce2d11169f00fe7e0c4663d31d6398c8a4408b504b4eec157444e47b084df09b3cb039c816660f0dd04846b8957d + languageName: node + linkType: hard + +"html-escaper@npm:^2.0.0": + version: 2.0.2 + resolution: "html-escaper@npm:2.0.2" + checksum: d2df2da3ad40ca9ee3a39c5cc6475ef67c8f83c234475f24d8e9ce0dc80a2c82df8e1d6fa78ddd1e9022a586ea1bd247a615e80a5cd9273d90111ddda7d9e974 + languageName: node + linkType: hard + "http-cache-semantics@npm:^4.1.1": version: 4.1.1 resolution: "http-cache-semantics@npm:4.1.1" @@ -4805,7 +5974,7 @@ __metadata: languageName: node linkType: hard -"http-proxy-agent@npm:^7.0.0": +"http-proxy-agent@npm:^7.0.0, http-proxy-agent@npm:^7.0.2": version: 7.0.2 resolution: "http-proxy-agent@npm:7.0.2" dependencies: @@ -4825,7 +5994,7 @@ __metadata: languageName: node linkType: hard -"https-proxy-agent@npm:^7.0.1": +"https-proxy-agent@npm:^7.0.1, https-proxy-agent@npm:^7.0.5": version: 7.0.5 resolution: "https-proxy-agent@npm:7.0.5" dependencies: @@ -4843,11 +6012,11 @@ __metadata: linkType: hard "husky@npm:^9.0.11": - version: 9.1.3 - resolution: "husky@npm:9.1.3" + version: 9.1.6 + resolution: "husky@npm:9.1.6" bin: husky: bin.js - checksum: 81103f34c8a796f5510c73c4d88af09671d9b559b0dd75975cc0891f24697d7076b6b57c8de03348f03c08da08246d254e6565f841f1c894cab91c23695c3ac6 + checksum: 421ccd8850378231aaefd70dbe9e4f1549b84ffe3a6897f93a202242bbc04e48bd498169aef43849411105d9fcf7c192b757d42661e28d06b934a609a4eb8771 languageName: node linkType: hard @@ -4860,7 +6029,7 @@ __metadata: languageName: node linkType: hard -"iconv-lite@npm:^0.6.2": +"iconv-lite@npm:0.6.3, iconv-lite@npm:^0.6.2": version: 0.6.3 resolution: "iconv-lite@npm:0.6.3" dependencies: @@ -4870,16 +6039,9 @@ __metadata: linkType: hard "ignore@npm:^5.2.0, ignore@npm:^5.3.1": - version: 5.3.1 - resolution: "ignore@npm:5.3.1" - checksum: 71d7bb4c1dbe020f915fd881108cbe85a0db3d636a0ea3ba911393c53946711d13a9b1143c7e70db06d571a5822c0a324a6bcde5c9904e7ca5047f01f1bf8cd3 - languageName: node - linkType: hard - -"immutable@npm:^4.3.4": - version: 4.3.7 - resolution: "immutable@npm:4.3.7" - checksum: 1c50eb053bb300796551604afff554066f041aa8e15926cf98f6d11d9736b62ad12531c06515dd96375258653878b4736f8051cd20b640f5f976d09fa640e3ec + version: 5.3.2 + resolution: "ignore@npm:5.3.2" + checksum: 2acfd32a573260ea522ea0bfeff880af426d68f6831f973129e2ba7363f422923cf53aab62f8369cbf4667c7b25b6f8a3761b34ecdb284ea18e87a5262a865be languageName: node linkType: hard @@ -5025,6 +6187,15 @@ __metadata: languageName: node linkType: hard +"is-bun-module@npm:^1.0.2": + version: 1.2.1 + resolution: "is-bun-module@npm:1.2.1" + dependencies: + semver: ^7.6.3 + checksum: 1c2cbcf1a76991add1b640d2d7fe09848e8697a76f96e1289dff44133a48c97f5dc601d4a66d3f3a86217a77178d72d33d10d0c9e14194e58e70ec8df3eae41a + languageName: node + linkType: hard + "is-callable@npm:^1.1.3, is-callable@npm:^1.1.4, is-callable@npm:^1.2.7": version: 1.2.7 resolution: "is-callable@npm:1.2.7" @@ -5032,12 +6203,12 @@ __metadata: languageName: node linkType: hard -"is-core-module@npm:^2.11.0, is-core-module@npm:^2.13.0, is-core-module@npm:^2.13.1": - version: 2.15.0 - resolution: "is-core-module@npm:2.15.0" +"is-core-module@npm:^2.13.0, is-core-module@npm:^2.15.1": + version: 2.15.1 + resolution: "is-core-module@npm:2.15.1" dependencies: hasown: ^2.0.2 - checksum: a9f7a52707c9b59d7164094d183bda892514fc3ba3139f245219c7abe7f6e8d3e2cdcf861f52a891a467f785f1dfa5d549f73b0ee715f4ba56e8882d335ea585 + checksum: df134c168115690724b62018c37b2f5bba0d5745fa16960b329c5a00883a8bea6a5632fdb1e3efcce237c201826ba09f93197b7cd95577ea56b0df335be23633 languageName: node linkType: hard @@ -5144,6 +6315,13 @@ __metadata: languageName: node linkType: hard +"is-potential-custom-element-name@npm:^1.0.1": + version: 1.0.1 + resolution: "is-potential-custom-element-name@npm:1.0.1" + checksum: ced7bbbb6433a5b684af581872afe0e1767e2d1146b2207ca0068a648fb5cab9d898495d1ac0583524faaf24ca98176a7d9876363097c2d14fee6dd324f3a1ab + languageName: node + linkType: hard + "is-regex@npm:^1.1.4": version: 1.1.4 resolution: "is-regex@npm:1.1.4" @@ -5268,6 +6446,67 @@ __metadata: languageName: node linkType: hard +"isows@npm:1.0.4": + version: 1.0.4 + resolution: "isows@npm:1.0.4" + peerDependencies: + ws: "*" + checksum: a3ee62e3d6216abb3adeeb2a551fe2e7835eac87b05a6ecc3e7739259bf5f8e83290501f49e26137390c8093f207fc3378d4a7653aab76ad7bbab4b2dba9c5b9 + languageName: node + linkType: hard + +"istanbul-lib-coverage@npm:^3.0.0, istanbul-lib-coverage@npm:^3.2.0, istanbul-lib-coverage@npm:^3.2.2": + version: 3.2.2 + resolution: "istanbul-lib-coverage@npm:3.2.2" + checksum: 2367407a8d13982d8f7a859a35e7f8dd5d8f75aae4bb5484ede3a9ea1b426dc245aff28b976a2af48ee759fdd9be374ce2bd2669b644f31e76c5f46a2e29a831 + languageName: node + linkType: hard + +"istanbul-lib-instrument@npm:^6.0.3": + version: 6.0.3 + resolution: "istanbul-lib-instrument@npm:6.0.3" + dependencies: + "@babel/core": ^7.23.9 + "@babel/parser": ^7.23.9 + "@istanbuljs/schema": ^0.1.3 + istanbul-lib-coverage: ^3.2.0 + semver: ^7.5.4 + checksum: 74104c60c65c4fa0e97cc76f039226c356123893929f067bfad5f86fe839e08f5d680354a68fead3bc9c1e2f3fa6f3f53cded70778e821d911e851d349f3545a + languageName: node + linkType: hard + +"istanbul-lib-report@npm:^3.0.0, istanbul-lib-report@npm:^3.0.1": + version: 3.0.1 + resolution: "istanbul-lib-report@npm:3.0.1" + dependencies: + istanbul-lib-coverage: ^3.0.0 + make-dir: ^4.0.0 + supports-color: ^7.1.0 + checksum: fd17a1b879e7faf9bb1dc8f80b2a16e9f5b7b8498fe6ed580a618c34df0bfe53d2abd35bf8a0a00e628fb7405462576427c7df20bbe4148d19c14b431c974b21 + languageName: node + linkType: hard + +"istanbul-lib-source-maps@npm:^5.0.6": + version: 5.0.6 + resolution: "istanbul-lib-source-maps@npm:5.0.6" + dependencies: + "@jridgewell/trace-mapping": ^0.3.23 + debug: ^4.1.1 + istanbul-lib-coverage: ^3.0.0 + checksum: 8dd6f2c1e2ecaacabeef8dc9ab52c4ed0a6036310002cf7f46ea6f3a5fb041da8076f5350e6a6be4c60cd4f231c51c73e042044afaf44820d857d92ecfb8ab6c + languageName: node + linkType: hard + +"istanbul-reports@npm:^3.1.7": + version: 3.1.7 + resolution: "istanbul-reports@npm:3.1.7" + dependencies: + html-escaper: ^2.0.0 + istanbul-lib-report: ^3.0.0 + checksum: 2072db6e07bfbb4d0eb30e2700250636182398c1af811aea5032acb219d2080f7586923c09fa194029efd6b92361afb3dcbe1ebcc3ee6651d13340f7c6c4ed95 + languageName: node + linkType: hard + "iterator.prototype@npm:^1.1.2": version: 1.1.2 resolution: "iterator.prototype@npm:1.1.2" @@ -5316,7 +6555,7 @@ __metadata: languageName: node linkType: hard -"js-tokens@npm:^3.0.0 || ^4.0.0": +"js-tokens@npm:^3.0.0 || ^4.0.0, js-tokens@npm:^4.0.0": version: 4.0.0 resolution: "js-tokens@npm:4.0.0" checksum: 8a95213a5a77deb6cbe94d86340e8d9ace2b93bc367790b260101d2f36a2eaf4e4e22d9fa9cf459b38af3a32fb4190e638024cf82ec95ef708680e405ea7cc78 @@ -5341,6 +6580,49 @@ __metadata: languageName: node linkType: hard +"jsdom@npm:^25.0.1": + version: 25.0.1 + resolution: "jsdom@npm:25.0.1" + dependencies: + cssstyle: ^4.1.0 + data-urls: ^5.0.0 + decimal.js: ^10.4.3 + form-data: ^4.0.0 + html-encoding-sniffer: ^4.0.0 + http-proxy-agent: ^7.0.2 + https-proxy-agent: ^7.0.5 + is-potential-custom-element-name: ^1.0.1 + nwsapi: ^2.2.12 + parse5: ^7.1.2 + rrweb-cssom: ^0.7.1 + saxes: ^6.0.0 + symbol-tree: ^3.2.4 + tough-cookie: ^5.0.0 + w3c-xmlserializer: ^5.0.0 + webidl-conversions: ^7.0.0 + whatwg-encoding: ^3.1.1 + whatwg-mimetype: ^4.0.0 + whatwg-url: ^14.0.0 + ws: ^8.18.0 + xml-name-validator: ^5.0.0 + peerDependencies: + canvas: ^2.11.2 + peerDependenciesMeta: + canvas: + optional: true + checksum: b637d28445d570014195b3c77d06e54ef69d1f807eaf61388cb470e4d9227244e7fe2e0c32b6df03ac4fe35f746d7c721672d9136ecebb49d2e61a04ab9628e0 + languageName: node + linkType: hard + +"jsesc@npm:^2.5.1": + version: 2.5.2 + resolution: "jsesc@npm:2.5.2" + bin: + jsesc: bin/jsesc + checksum: 4dc190771129e12023f729ce20e1e0bfceac84d73a85bc3119f7f938843fe25a4aeccb54b6494dce26fcf263d815f5f31acdefac7cc9329efb8422a4f4d9fa9d + languageName: node + linkType: hard + "json-buffer@npm:3.0.1": version: 3.0.1 resolution: "json-buffer@npm:3.0.1" @@ -5390,6 +6672,15 @@ __metadata: languageName: node linkType: hard +"json5@npm:^2.2.3": + version: 2.2.3 + resolution: "json5@npm:2.2.3" + bin: + json5: lib/cli.js + checksum: 2a7436a93393830bce797d4626275152e37e877b265e94ca69c99e3d20c2b9dab021279146a39cdb700e71b2dd32a4cebd1514cd57cee102b1af906ce5040349 + languageName: node + linkType: hard + "jsonfile@npm:^4.0.0": version: 4.0.0 resolution: "jsonfile@npm:4.0.0" @@ -5518,9 +6809,18 @@ __metadata: linkType: hard "lossless-json@npm:^4.0.1": - version: 4.0.1 - resolution: "lossless-json@npm:4.0.1" - checksum: 41e89f5b7800cf5f863776542c82d8a19a696e5537865699d5ee062726d069561f7b857e838195496f2a43afe64a7dce475be5a2565822881f39feb0eda5d218 + version: 4.0.2 + resolution: "lossless-json@npm:4.0.2" + checksum: 8a5520275ffb3ddc9310cb714c9bc85102e784fb3fc7cb039be0c2ffedd5da5f06094fffda93db2181d204b51c2591c534aedf2d74b828a7a0bae12babe8363a + languageName: node + linkType: hard + +"loupe@npm:^3.1.0, loupe@npm:^3.1.1": + version: 3.1.1 + resolution: "loupe@npm:3.1.1" + dependencies: + get-func-name: ^2.0.1 + checksum: c7efa6bc6d71f25ca03eb13c9a069e35ed86799e308ca27a7a3eff8cdf9500e7c22d1f2411468d154a8e960e91e5e685e0c6c83e96db748f177c1adf30811153 languageName: node linkType: hard @@ -5531,6 +6831,15 @@ __metadata: languageName: node linkType: hard +"lru-cache@npm:^5.1.1": + version: 5.1.1 + resolution: "lru-cache@npm:5.1.1" + dependencies: + yallist: ^3.0.2 + checksum: c154ae1cbb0c2206d1501a0e94df349653c92c8cbb25236d7e85190bcaf4567a03ac6eb43166fabfa36fd35623694da7233e88d9601fbf411a9a481d85dbd2cb + languageName: node + linkType: hard + "lru-cache@npm:^6.0.0": version: 6.0.0 resolution: "lru-cache@npm:6.0.0" @@ -5540,6 +6849,35 @@ __metadata: languageName: node linkType: hard +"lz-string@npm:^1.5.0": + version: 1.5.0 + resolution: "lz-string@npm:1.5.0" + bin: + lz-string: bin/bin.js + checksum: 1ee98b4580246fd90dd54da6e346fb1caefcf05f677c686d9af237a157fdea3fd7c83a4bc58f858cd5b10a34d27afe0fdcbd0505a47e0590726a873dc8b8f65d + languageName: node + linkType: hard + +"magic-string@npm:^0.30.11": + version: 0.30.11 + resolution: "magic-string@npm:0.30.11" + dependencies: + "@jridgewell/sourcemap-codec": ^1.5.0 + checksum: e041649453c9a3f31d2e731fc10e38604d50e20d3585cd48bc7713a6e2e1a3ad3012105929ca15750d59d0a3f1904405e4b95a23b7e69dc256db3c277a73a3ca + languageName: node + linkType: hard + +"magicast@npm:^0.3.4": + version: 0.3.5 + resolution: "magicast@npm:0.3.5" + dependencies: + "@babel/parser": ^7.25.4 + "@babel/types": ^7.25.4 + source-map-js: ^1.2.0 + checksum: 668f07ade907a44bccfc9a9321588473f6d5fa25329aa26b9ad9a3bf87cc2e6f9c482cbdd3e33c0b9ab9b79c065630c599cc055a12f881c8c924ee0d7282cdce + languageName: node + linkType: hard + "make-dir@npm:^3.1.0": version: 3.1.0 resolution: "make-dir@npm:3.1.0" @@ -5549,6 +6887,15 @@ __metadata: languageName: node linkType: hard +"make-dir@npm:^4.0.0": + version: 4.0.0 + resolution: "make-dir@npm:4.0.0" + dependencies: + semver: ^7.5.3 + checksum: bf0731a2dd3aab4db6f3de1585cea0b746bb73eb5a02e3d8d72757e376e64e6ada190b1eddcde5b2f24a81b688a9897efd5018737d05e02e2a671dda9cff8a8a + languageName: node + linkType: hard + "make-error@npm:^1.1.1": version: 1.3.6 resolution: "make-error@npm:1.3.6" @@ -5603,13 +6950,29 @@ __metadata: languageName: node linkType: hard -"micromatch@npm:^4.0.2, micromatch@npm:^4.0.4, micromatch@npm:^4.0.5": - version: 4.0.7 - resolution: "micromatch@npm:4.0.7" +"micromatch@npm:^4.0.2, micromatch@npm:^4.0.4, micromatch@npm:^4.0.5": + version: 4.0.8 + resolution: "micromatch@npm:4.0.8" + dependencies: + braces: ^3.0.3 + picomatch: ^2.3.1 + checksum: 79920eb634e6f400b464a954fcfa589c4e7c7143209488e44baf627f9affc8b1e306f41f4f0deedde97e69cb725920879462d3e750ab3bd3c1aed675bb3a8966 + languageName: node + linkType: hard + +"mime-db@npm:1.52.0": + version: 1.52.0 + resolution: "mime-db@npm:1.52.0" + checksum: 0d99a03585f8b39d68182803b12ac601d9c01abfa28ec56204fa330bc9f3d1c5e14beb049bafadb3dbdf646dfb94b87e24d4ec7b31b7279ef906a8ea9b6a513f + languageName: node + linkType: hard + +"mime-types@npm:^2.1.12": + version: 2.1.35 + resolution: "mime-types@npm:2.1.35" dependencies: - braces: ^3.0.3 - picomatch: ^2.3.1 - checksum: 3cde047d70ad80cf60c787b77198d680db3b8c25b23feb01de5e2652205d9c19f43bd81882f69a0fd1f0cde6a7a122d774998aad3271ddb1b8accf8a0f480cf7 + mime-db: 1.52.0 + checksum: 89a5b7f1def9f3af5dad6496c5ed50191ae4331cc5389d7c521c8ad28d5fdad2d06fd81baf38fed813dc4e46bb55c8145bb0ff406330818c9cf712fb2e9b3836 languageName: node linkType: hard @@ -5791,14 +7154,7 @@ __metadata: languageName: node linkType: hard -"ms@npm:2.1.2": - version: 2.1.2 - resolution: "ms@npm:2.1.2" - checksum: 673cdb2c3133eb050c745908d8ce632ed2c02d85640e2edb3ace856a2266a813b30c613569bf3354fdf4ea7d1a1494add3bfa95e2713baa27d0c2c71fc44f58f - languageName: node - linkType: hard - -"ms@npm:^2.1.1": +"ms@npm:^2.1.1, ms@npm:^2.1.3": version: 2.1.3 resolution: "ms@npm:2.1.3" checksum: aa92de608021b242401676e35cfa5aa42dd70cbdc082b916da7fb925c542173e36bce97ea3e804923fe92c0ad991434e4a38327e15a1b5b5f945d66df615ae6d @@ -5948,13 +7304,13 @@ __metadata: linkType: hard "node-gyp-build@npm:^4.2.2": - version: 4.8.1 - resolution: "node-gyp-build@npm:4.8.1" + version: 4.8.2 + resolution: "node-gyp-build@npm:4.8.2" bin: node-gyp-build: bin.js node-gyp-build-optional: optional.js node-gyp-build-test: build-test.js - checksum: fe6e95da6f4608c1a98655f6bf2fe4e8dd9c877cd13256056a8acaf585cc7f98718823fe9366be11b78c2f332d5a184b00cf07a4af96c9d8fea45f640c019f98 + checksum: 1a57bba8c4c193f808bd8ad1484d4ebdd8106dd9f04a3e82554dc716e3a2d87d7e369e9503c145e0e6a7e2c663fec0d8aaf52bd8156342ec7fc388195f37824e languageName: node linkType: hard @@ -5978,7 +7334,7 @@ __metadata: languageName: node linkType: hard -"node-releases@npm:^2.0.14": +"node-releases@npm:^2.0.18": version: 2.0.18 resolution: "node-releases@npm:2.0.18" checksum: ef55a3d853e1269a6d6279b7692cd6ff3e40bc74947945101138745bfdc9a5edabfe72cb19a31a8e45752e1910c4c65c77d931866af6357f242b172b7283f5b3 @@ -6049,6 +7405,13 @@ __metadata: languageName: node linkType: hard +"nwsapi@npm:^2.2.12": + version: 2.2.12 + resolution: "nwsapi@npm:2.2.12" + checksum: 4dbce7ecbcf336eef1edcbb5161cbceea95863e63a16d9bcec8e81cbb260bdab3d07e6c7b58354d465dc803eef6d0ea4fb20220a80fa148ae65f18d56df81799 + languageName: node + linkType: hard + "object-assign@npm:^4.0.1, object-assign@npm:^4.1.1": version: 4.1.1 resolution: "object-assign@npm:4.1.1" @@ -6110,7 +7473,7 @@ __metadata: languageName: node linkType: hard -"object.fromentries@npm:^2.0.7, object.fromentries@npm:^2.0.8": +"object.fromentries@npm:^2.0.8": version: 2.0.8 resolution: "object.fromentries@npm:2.0.8" dependencies: @@ -6122,7 +7485,7 @@ __metadata: languageName: node linkType: hard -"object.groupby@npm:^1.0.1": +"object.groupby@npm:^1.0.3": version: 1.0.3 resolution: "object.groupby@npm:1.0.3" dependencies: @@ -6133,7 +7496,7 @@ __metadata: languageName: node linkType: hard -"object.values@npm:^1.1.6, object.values@npm:^1.1.7, object.values@npm:^1.2.0": +"object.values@npm:^1.1.6, object.values@npm:^1.2.0": version: 1.2.0 resolution: "object.values@npm:1.2.0" dependencies: @@ -6256,6 +7619,15 @@ __metadata: languageName: node linkType: hard +"parse5@npm:^7.1.2": + version: 7.1.2 + resolution: "parse5@npm:7.1.2" + dependencies: + entities: ^4.4.0 + checksum: 59465dd05eb4c5ec87b76173d1c596e152a10e290b7abcda1aecf0f33be49646ea74840c69af975d7887543ea45564801736356c568d6b5e71792fd0f4055713 + languageName: node + linkType: hard + "path-browserify@npm:^1.0.1": version: 1.0.1 resolution: "path-browserify@npm:1.0.1" @@ -6326,11 +7698,11 @@ __metadata: linkType: hard "path-to-regexp@npm:^1.0.0": - version: 1.8.0 - resolution: "path-to-regexp@npm:1.8.0" + version: 1.9.0 + resolution: "path-to-regexp@npm:1.9.0" dependencies: isarray: 0.0.1 - checksum: 709f6f083c0552514ef4780cb2e7e4cf49b0cc89a97439f2b7cc69a608982b7690fb5d1720a7473a59806508fc2dae0be751ba49f495ecf89fd8fbc62abccbcd + checksum: 5b2ac9cab2a9f82effd30a35164b20998b18d99d96608281dd2cab6e66c0e4536187970369b185ab21d3815da1ecb7dcb2d5f97a4bf0ee6e31a9612299fca147 languageName: node linkType: hard @@ -6341,6 +7713,20 @@ __metadata: languageName: node linkType: hard +"pathe@npm:^1.1.2": + version: 1.1.2 + resolution: "pathe@npm:1.1.2" + checksum: ec5f778d9790e7b9ffc3e4c1df39a5bb1ce94657a4e3ad830c1276491ca9d79f189f47609884671db173400256b005f4955f7952f52a2aeb5834ad5fb4faf134 + languageName: node + linkType: hard + +"pathval@npm:^2.0.0": + version: 2.0.0 + resolution: "pathval@npm:2.0.0" + checksum: 682b6a6289de7990909effef7dae9aa7bb6218c0426727bccf66a35b34e7bfbc65615270c5e44e3c9557a5cb44b1b9ef47fc3cb18bce6ad3ba92bcd28467ed7d + languageName: node + linkType: hard + "pend@npm:~1.2.0": version: 1.2.0 resolution: "pend@npm:1.2.0" @@ -6355,10 +7741,10 @@ __metadata: languageName: node linkType: hard -"picocolors@npm:^1, picocolors@npm:^1.0.0, picocolors@npm:^1.0.1": - version: 1.0.1 - resolution: "picocolors@npm:1.0.1" - checksum: fa68166d1f56009fc02a34cdfd112b0dd3cf1ef57667ac57281f714065558c01828cdf4f18600ad6851cbe0093952ed0660b1e0156bddf2184b6aaf5817553a5 +"picocolors@npm:^1, picocolors@npm:^1.0.0, picocolors@npm:^1.0.1, picocolors@npm:^1.1.0": + version: 1.1.0 + resolution: "picocolors@npm:1.1.0" + checksum: a64d653d3a188119ff45781dfcdaeedd7625583f45280aea33fcb032c7a0d3959f2368f9b192ad5e8aade75b74dbd954ffe3106c158509a45e4c18ab379a2acd languageName: node linkType: hard @@ -6453,12 +7839,12 @@ __metadata: linkType: hard "postcss-selector-parser@npm:^6.0.11, postcss-selector-parser@npm:^6.1.1": - version: 6.1.1 - resolution: "postcss-selector-parser@npm:6.1.1" + version: 6.1.2 + resolution: "postcss-selector-parser@npm:6.1.2" dependencies: cssesc: ^3.0.0 util-deprecate: ^1.0.2 - checksum: 1c6a5adfc3c19c6e1e7d94f8addb89a5166fcca72c41f11713043d381ecbe82ce66360c5524e904e17b54f7fc9e6a077994ff31238a456bc7320c3e02e88d92e + checksum: ce9440fc42a5419d103f4c7c1847cb75488f3ac9cbe81093b408ee9701193a509f664b4d10a2b4d82c694ee7495e022f8f482d254f92b7ffd9ed9dea696c6f84 languageName: node linkType: hard @@ -6480,14 +7866,14 @@ __metadata: languageName: node linkType: hard -"postcss@npm:^8, postcss@npm:^8.4.23, postcss@npm:^8.4.38": - version: 8.4.40 - resolution: "postcss@npm:8.4.40" +"postcss@npm:^8, postcss@npm:^8.4.23, postcss@npm:^8.4.38, postcss@npm:^8.4.43": + version: 8.4.47 + resolution: "postcss@npm:8.4.47" dependencies: nanoid: ^3.3.7 - picocolors: ^1.0.1 - source-map-js: ^1.2.0 - checksum: afd0cc49d2169dcd96c0f17e155c5d75de048956306a3017f1cfa6a7d66b941592245bed20f7796ceeccb2d8967749b623be2c7b010a74f67ea10fb5bdb8ba28 + picocolors: ^1.1.0 + source-map-js: ^1.2.1 + checksum: f78440a9d8f97431dd2ab1ab8e1de64f12f3eff38a3d8d4a33919b96c381046a314658d2de213a5fa5eb296b656de76a3ec269fdea27f16d5ab465b916a0f52c languageName: node linkType: hard @@ -6516,6 +7902,17 @@ __metadata: languageName: node linkType: hard +"pretty-format@npm:^27.0.2": + version: 27.5.1 + resolution: "pretty-format@npm:27.5.1" + dependencies: + ansi-regex: ^5.0.1 + ansi-styles: ^5.0.0 + react-is: ^17.0.1 + checksum: cf610cffcb793885d16f184a62162f2dd0df31642d9a18edf4ca298e909a8fe80bdbf556d5c9573992c102ce8bf948691da91bf9739bee0ffb6e79c8a8a6e088 + languageName: node + linkType: hard + "pretty-ms@npm:7.0.1": version: 7.0.1 resolution: "pretty-ms@npm:7.0.1" @@ -6568,16 +7965,16 @@ __metadata: linkType: hard "pump@npm:^3.0.0": - version: 3.0.0 - resolution: "pump@npm:3.0.0" + version: 3.0.2 + resolution: "pump@npm:3.0.2" dependencies: end-of-stream: ^1.1.0 once: ^1.3.1 - checksum: e42e9229fba14732593a718b04cb5e1cfef8254544870997e0ecd9732b189a48e1256e4e5478148ecb47c8511dca2b09eae56b4d0aad8009e6fac8072923cfc9 + checksum: e0c4216874b96bd25ddf31a0b61a5613e26cc7afa32379217cf39d3915b0509def3565f5f6968fafdad2894c8bbdbd67d340e84f3634b2a29b950cffb6442d9f languageName: node linkType: hard -"punycode@npm:^2.1.0, punycode@npm:^2.1.1": +"punycode@npm:^2.1.0, punycode@npm:^2.1.1, punycode@npm:^2.3.1": version: 2.3.1 resolution: "punycode@npm:2.3.1" checksum: bb0a0ceedca4c3c57a9b981b90601579058903c62be23c5e8e843d2c2d4148a3ecf029d5133486fb0e1822b098ba8bba09e89d6b21742d02fa26bda6441a6fb2 @@ -6585,11 +7982,11 @@ __metadata: linkType: hard "qrcode.react@npm:^3.1.0": - version: 3.1.0 - resolution: "qrcode.react@npm:3.1.0" + version: 3.2.0 + resolution: "qrcode.react@npm:3.2.0" peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 - checksum: 94a2942ecf83f461d869adb20305ae663c6d1abe93ef2c72442b07d756ce70cf6deb6fd588dc5b382b48c6991cfde1dfd5ac9b814c1461e71d5edb2d945e67fc + checksum: 55d020ca482d57e8d73ee9e2e18f152184fd3d7d2d0742ae54ec58c5a3bab08b242a648585178d7fc91877fc75d6fbad7a35fb51bc4bddd4374e1de450ca78e7 languageName: node linkType: hard @@ -6662,6 +8059,20 @@ __metadata: languageName: node linkType: hard +"react-is@npm:^17.0.1": + version: 17.0.2 + resolution: "react-is@npm:17.0.2" + checksum: 9d6d111d8990dc98bc5402c1266a808b0459b5d54830bbea24c12d908b536df7883f268a7868cfaedde3dd9d4e0d574db456f84d2e6df9c4526f99bb4b5344d8 + languageName: node + linkType: hard + +"react-refresh@npm:^0.14.2": + version: 0.14.2 + resolution: "react-refresh@npm:0.14.2" + checksum: d80db4bd40a36dab79010dc8aa317a5b931f960c0d83c4f3b81f0552cbcf7f29e115b84bb7908ec6a1eb67720fff7023084eff73ece8a7ddc694882478464382 + languageName: node + linkType: hard + "react-remove-scroll-bar@npm:^2.3.4": version: 2.3.6 resolution: "react-remove-scroll-bar@npm:2.3.6" @@ -6932,6 +8343,76 @@ __metadata: languageName: node linkType: hard +"rollup@npm:^4.20.0": + version: 4.22.4 + resolution: "rollup@npm:4.22.4" + dependencies: + "@rollup/rollup-android-arm-eabi": 4.22.4 + "@rollup/rollup-android-arm64": 4.22.4 + "@rollup/rollup-darwin-arm64": 4.22.4 + "@rollup/rollup-darwin-x64": 4.22.4 + "@rollup/rollup-linux-arm-gnueabihf": 4.22.4 + "@rollup/rollup-linux-arm-musleabihf": 4.22.4 + "@rollup/rollup-linux-arm64-gnu": 4.22.4 + "@rollup/rollup-linux-arm64-musl": 4.22.4 + "@rollup/rollup-linux-powerpc64le-gnu": 4.22.4 + "@rollup/rollup-linux-riscv64-gnu": 4.22.4 + "@rollup/rollup-linux-s390x-gnu": 4.22.4 + "@rollup/rollup-linux-x64-gnu": 4.22.4 + "@rollup/rollup-linux-x64-musl": 4.22.4 + "@rollup/rollup-win32-arm64-msvc": 4.22.4 + "@rollup/rollup-win32-ia32-msvc": 4.22.4 + "@rollup/rollup-win32-x64-msvc": 4.22.4 + "@types/estree": 1.0.5 + fsevents: ~2.3.2 + dependenciesMeta: + "@rollup/rollup-android-arm-eabi": + optional: true + "@rollup/rollup-android-arm64": + optional: true + "@rollup/rollup-darwin-arm64": + optional: true + "@rollup/rollup-darwin-x64": + optional: true + "@rollup/rollup-linux-arm-gnueabihf": + optional: true + "@rollup/rollup-linux-arm-musleabihf": + optional: true + "@rollup/rollup-linux-arm64-gnu": + optional: true + "@rollup/rollup-linux-arm64-musl": + optional: true + "@rollup/rollup-linux-powerpc64le-gnu": + optional: true + "@rollup/rollup-linux-riscv64-gnu": + optional: true + "@rollup/rollup-linux-s390x-gnu": + optional: true + "@rollup/rollup-linux-x64-gnu": + optional: true + "@rollup/rollup-linux-x64-musl": + optional: true + "@rollup/rollup-win32-arm64-msvc": + optional: true + "@rollup/rollup-win32-ia32-msvc": + optional: true + "@rollup/rollup-win32-x64-msvc": + optional: true + fsevents: + optional: true + bin: + rollup: dist/bin/rollup + checksum: b093b518deb1fd0c0455eef746abe9efa3a2cd7e2b65a4ace9e8fa5d60b3d6da2406816de2c6c1d553609f22cf730f1c5839a05a1ff60003c504486172238d1a + languageName: node + linkType: hard + +"rrweb-cssom@npm:^0.7.1": + version: 0.7.1 + resolution: "rrweb-cssom@npm:0.7.1" + checksum: 62e410ddbaaba6abc196c3bbfa8de4952e0a134d9f2b454ee293039bf9931322d806e14d52ed122a5c2bd332a868b9da2e99358fb6232c33758b5ede86d992c8 + languageName: node + linkType: hard + "run-parallel@npm:^1.1.9": version: 1.2.0 resolution: "run-parallel@npm:1.2.0" @@ -6978,6 +8459,15 @@ __metadata: languageName: node linkType: hard +"saxes@npm:^6.0.0": + version: 6.0.0 + resolution: "saxes@npm:6.0.0" + dependencies: + xmlchars: ^2.2.0 + checksum: d3fa3e2aaf6c65ed52ee993aff1891fc47d5e47d515164b5449cbf5da2cbdc396137e55590472e64c5c436c14ae64a8a03c29b9e7389fc6f14035cf4e982ef3b + languageName: node + linkType: hard + "scheduler@npm:^0.23.2": version: 0.23.2 resolution: "scheduler@npm:0.23.2" @@ -7007,7 +8497,7 @@ __metadata: languageName: node linkType: hard -"semver@npm:^7.3.5, semver@npm:^7.5.4, semver@npm:^7.6.0": +"semver@npm:^7.3.5, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:^7.6.0, semver@npm:^7.6.3": version: 7.6.3 resolution: "semver@npm:7.6.3" bin: @@ -7024,9 +8514,9 @@ __metadata: linkType: hard "set-cookie-parser@npm:^2.4.8": - version: 2.6.0 - resolution: "set-cookie-parser@npm:2.6.0" - checksum: bf11ebc594c53d84588f1b4c04f1b8ce14e0498b1c011b3d76b5c6d5aac481bbc3f7c5260ec4ce99bdc1d9aed19f9fc315e73166a36ca74d0f12349a73f6bdc9 + version: 2.7.0 + resolution: "set-cookie-parser@npm:2.7.0" + checksum: 1eed43d7b284b727b4e7d35e324a74c493469265488b0c8f464f5224186e7dbbdd1cb35c8822053581f807a10b930a628144041ad453db06548945c61d5a834f languageName: node linkType: hard @@ -7116,6 +8606,13 @@ __metadata: languageName: node linkType: hard +"siginfo@npm:^2.0.0": + version: 2.0.0 + resolution: "siginfo@npm:2.0.0" + checksum: 8aa5a98640ca09fe00d74416eca97551b3e42991614a3d1b824b115fc1401543650914f651ab1311518177e4d297e80b953f4cd4cd7ea1eabe824e8f2091de01 + languageName: node + linkType: hard + "signal-exit@npm:4.0.2": version: 4.0.2 resolution: "signal-exit@npm:4.0.2" @@ -7172,10 +8669,10 @@ __metadata: languageName: node linkType: hard -"source-map-js@npm:^1.0.2, source-map-js@npm:^1.2.0": - version: 1.2.0 - resolution: "source-map-js@npm:1.2.0" - checksum: 791a43306d9223792e84293b00458bf102a8946e7188f3db0e4e22d8d530b5f80a4ce468eb5ec0bf585443ad55ebbd630bf379c98db0b1f317fd902500217f97 +"source-map-js@npm:^1.0.2, source-map-js@npm:^1.2.0, source-map-js@npm:^1.2.1": + version: 1.2.1 + resolution: "source-map-js@npm:1.2.1" + checksum: 4eb0cd997cdf228bc253bcaff9340afeb706176e64868ecd20efbe6efea931465f43955612346d6b7318789e5265bdc419bc7669c1cebe3db0eb255f57efa76b languageName: node linkType: hard @@ -7207,18 +8704,19 @@ __metadata: languageName: node linkType: hard -"starknet-types@npm:^0.0.4": - version: 0.0.4 - resolution: "starknet-types@npm:0.0.4" - checksum: a83d306830696ea875b8b07541db47e515a4ddb7bfce0cf5555cce12c8ce0e697b984762720c7f27761dc4114b4e5d3f81006e82fc45e52b052afe8fc86240fa +"stackback@npm:0.0.2": + version: 0.0.2 + resolution: "stackback@npm:0.0.2" + checksum: 2d4dc4e64e2db796de4a3c856d5943daccdfa3dd092e452a1ce059c81e9a9c29e0b9badba91b43ef0d5ff5c04ee62feb3bcc559a804e16faf447bac2d883aa99 languageName: node linkType: hard -"starknet@npm:6.7.0": - version: 6.7.0 - resolution: "starknet@npm:6.7.0" +"starknet@npm:6.12.1": + version: 6.12.1 + resolution: "starknet@npm:6.12.1" dependencies: "@noble/curves": ~1.4.0 + "@noble/hashes": ^1.4.0 "@scure/base": ~1.1.3 "@scure/starknet": ~1.0.0 abi-wan-kanabi: ^2.2.2 @@ -7226,10 +8724,10 @@ __metadata: isomorphic-fetch: ^3.0.0 lossless-json: ^4.0.1 pako: ^2.0.4 - starknet-types: ^0.0.4 + starknet-types-07: "npm:@starknet-io/types-js@^0.7.7" ts-mixer: ^6.0.3 url-join: ^4.0.1 - checksum: 3c4abda7bab3008c8f98728c4b23a47a2dc97b876c6a33a824da77907b63611fde2df22298aa4c512e3c81e3fe005dd7e288969f18b00299e6eae450a147769d + checksum: 58afeddde1e2fb0d8caae0cb615bd0b3d0aed04d27465af0607f77247731bbf7d1e4b2f0a99ff596e53175abfadf5d08353f4b838f96038f7a88b706c6bd0bb6 languageName: node linkType: hard @@ -7247,6 +8745,13 @@ __metadata: languageName: node linkType: hard +"std-env@npm:^3.7.0": + version: 3.7.0 + resolution: "std-env@npm:3.7.0" + checksum: 4f489d13ff2ab838c9acd4ed6b786b51aa52ecacdfeaefe9275fcb220ff2ac80c6e95674723508fd29850a694569563a8caaaea738eb82ca16429b3a0b50e510 + languageName: node + linkType: hard + "stop-iteration-iterator@npm:^1.0.0": version: 1.0.0 resolution: "stop-iteration-iterator@npm:1.0.0" @@ -7461,6 +8966,15 @@ __metadata: languageName: node linkType: hard +"supports-color@npm:^5.3.0": + version: 5.5.0 + resolution: "supports-color@npm:5.5.0" + dependencies: + has-flag: ^3.0.0 + checksum: 95f6f4ba5afdf92f495b5a912d4abee8dcba766ae719b975c56c084f5004845f6f5a5f7769f52d53f40e21952a6d87411bafe34af4a01e65f9926002e38e1dac + languageName: node + linkType: hard + "supports-color@npm:^7.1.0": version: 7.2.0 resolution: "supports-color@npm:7.2.0" @@ -7477,9 +8991,16 @@ __metadata: languageName: node linkType: hard +"symbol-tree@npm:^3.2.4": + version: 3.2.4 + resolution: "symbol-tree@npm:3.2.4" + checksum: 6e8fc7e1486b8b54bea91199d9535bb72f10842e40c79e882fc94fb7b14b89866adf2fd79efa5ebb5b658bc07fb459ccce5ac0e99ef3d72f474e74aaf284029d + languageName: node + linkType: hard + "tailwindcss@npm:^3.3.0": - version: 3.4.7 - resolution: "tailwindcss@npm:3.4.7" + version: 3.4.13 + resolution: "tailwindcss@npm:3.4.13" dependencies: "@alloc/quick-lru": ^5.2.0 arg: ^5.0.2 @@ -7506,7 +9027,7 @@ __metadata: bin: tailwind: lib/cli.js tailwindcss: lib/cli.js - checksum: 9c769ab5ddcd4aaf99a9798f89dab5816e801fd6b5cab352b54ebfaeb2b53dd322604e6dfbcb70633c3bae17c9432cebcdbe85ca5ca6d261ec674f8d1b11e29c + checksum: 0e85717b4276b884c3ba762a72fececcf6c27f54fe4deb660e22b7f278f33e6f806af4e4c4fad27e8de74fa28872cea75fe121b5751ef861cb2cc423a2fc8fc4 languageName: node linkType: hard @@ -7546,6 +9067,17 @@ __metadata: languageName: node linkType: hard +"test-exclude@npm:^7.0.1": + version: 7.0.1 + resolution: "test-exclude@npm:7.0.1" + dependencies: + "@istanbuljs/schema": ^0.1.2 + glob: ^10.4.1 + minimatch: ^9.0.4 + checksum: e5a49a054bf2da74467dd8149b202166e36275c0dc2c9585f7d34de99c6d055d2287ac8d2a8e4c27c59b893acbc671af3fa869e8069a58ad117250e9c01c726b + languageName: node + linkType: hard + "text-table@npm:^0.2.0": version: 0.2.0 resolution: "text-table@npm:0.2.0" @@ -7580,6 +9112,66 @@ __metadata: languageName: node linkType: hard +"tinybench@npm:^2.9.0": + version: 2.9.0 + resolution: "tinybench@npm:2.9.0" + checksum: 1ab00d7dfe0d1f127cbf00822bacd9024f7a50a3ecd1f354a8168e0b7d2b53a639a24414e707c27879d1adc0f5153141d51d76ebd7b4d37fe245e742e5d91fe8 + languageName: node + linkType: hard + +"tinyexec@npm:^0.3.0": + version: 0.3.0 + resolution: "tinyexec@npm:0.3.0" + checksum: e55473d249b8fc94bc5b1461d8e368dfe0ba23dcfca4f9069fe25418b17772e50110a1d33cd7ac8ff26456e5b609e0528cce7660e35246fad9b00bd094f3f444 + languageName: node + linkType: hard + +"tinypool@npm:^1.0.0": + version: 1.0.1 + resolution: "tinypool@npm:1.0.1" + checksum: 5cd6b8cbccd9b88d461f400c9599e69f66563ddf75a2b8ab6b48250481f1b254d180a68ee735f379fa6eb88f11c3b1814735bb1f3306b1a860bf6d8f08074d6b + languageName: node + linkType: hard + +"tinyrainbow@npm:^1.2.0": + version: 1.2.0 + resolution: "tinyrainbow@npm:1.2.0" + checksum: d1e2cb5400032c0092be00e4a3da5450bea8b4fad58bfb5d3c58ca37ff5c5e252f7fcfb9af247914854af79c46014add9d1042fe044358c305a129ed55c8be35 + languageName: node + linkType: hard + +"tinyspy@npm:^3.0.0": + version: 3.0.2 + resolution: "tinyspy@npm:3.0.2" + checksum: 5db671b2ff5cd309de650c8c4761ca945459d7204afb1776db9a04fb4efa28a75f08517a8620c01ee32a577748802231ad92f7d5b194dc003ee7f987a2a06337 + languageName: node + linkType: hard + +"tldts-core@npm:^6.1.47": + version: 6.1.47 + resolution: "tldts-core@npm:6.1.47" + checksum: c0a003dcc0d5f6432bc5646f41243244480408f225b160c2ca9c8906fd1c159905af7c9000ee75cda2ba8e5db38cdeffcb9de66d7f078d987a4a5a491fec5ac8 + languageName: node + linkType: hard + +"tldts@npm:^6.1.32": + version: 6.1.47 + resolution: "tldts@npm:6.1.47" + dependencies: + tldts-core: ^6.1.47 + bin: + tldts: bin/cli.js + checksum: dbea62f39c0523428d94fd36098ea845bc509b23e2712e4f2c520da1a89a1abda7ea294226d5a6e9ab321f139c8d932e72535f40dfe3c9a42d23a5d3ac6d29c2 + languageName: node + linkType: hard + +"to-fast-properties@npm:^2.0.0": + version: 2.0.0 + resolution: "to-fast-properties@npm:2.0.0" + checksum: be2de62fe58ead94e3e592680052683b1ec986c72d589e7b21e5697f8744cdbf48c266fa72f6c15932894c10187b5f54573a3bcf7da0bfd964d5caf23d436168 + languageName: node + linkType: hard + "to-regex-range@npm:^5.0.1": version: 5.0.1 resolution: "to-regex-range@npm:5.0.1" @@ -7622,6 +9214,24 @@ __metadata: languageName: node linkType: hard +"tough-cookie@npm:^5.0.0": + version: 5.0.0 + resolution: "tough-cookie@npm:5.0.0" + dependencies: + tldts: ^6.1.32 + checksum: 774f6c939c96f74b5847361f7e11e0d69383681d21a35a2d37a20956638e614ec521782d2d20bcb32b58638ff337bba87cc72fb72c987bd02ea0fdfc93994cdb + languageName: node + linkType: hard + +"tr46@npm:^5.0.0": + version: 5.0.0 + resolution: "tr46@npm:5.0.0" + dependencies: + punycode: ^2.3.1 + checksum: 8d8b021f8e17675ebf9e672c224b6b6cfdb0d5b92141349e9665c14a2501c54a298d11264bbb0b17b447581e1e83d4fc3c038c929f3d210e3964d4be47460288 + languageName: node + linkType: hard + "tr46@npm:~0.0.3": version: 0.0.3 resolution: "tr46@npm:0.0.3" @@ -7774,9 +9384,9 @@ __metadata: linkType: hard "tslib@npm:^2.0.0, tslib@npm:^2.1.0, tslib@npm:^2.4.0, tslib@npm:^2.6.2": - version: 2.6.3 - resolution: "tslib@npm:2.6.3" - checksum: 74fce0e100f1ebd95b8995fbbd0e6c91bdd8f4c35c00d4da62e285a3363aaa534de40a80db30ecfd388ed7c313c42d930ee0eaf108e8114214b180eec3dbe6f5 + version: 2.7.0 + resolution: "tslib@npm:2.7.0" + checksum: 1606d5c89f88d466889def78653f3aab0f88692e80bb2066d090ca6112ae250ec1cfa9dbfaab0d17b60da15a4186e8ec4d893801c67896b277c17374e36e1d28 languageName: node linkType: hard @@ -7797,9 +9407,9 @@ __metadata: linkType: hard "type-fest@npm:^4.6.0": - version: 4.23.0 - resolution: "type-fest@npm:4.23.0" - checksum: 75466563be2d3d116a0b70ffe76a7f72947e3350ceacbc8509a7d841670dddc2fbb008109f0307888137794cf25681fd50f65bf8873bcdc17bc7ac8912c70114 + version: 4.26.1 + resolution: "type-fest@npm:4.26.1" + checksum: 7188db3bca82afa62c69a8043fb7c5eb74e63c45e7e28efb986da1629d844286f7181bc5a8185f38989fffff0d6c96be66fd13529b01932d1b6ebe725181d31a languageName: node linkType: hard @@ -7856,18 +9466,18 @@ __metadata: linkType: hard "typescript-eslint@npm:^7.16.1": - version: 7.17.0 - resolution: "typescript-eslint@npm:7.17.0" + version: 7.18.0 + resolution: "typescript-eslint@npm:7.18.0" dependencies: - "@typescript-eslint/eslint-plugin": 7.17.0 - "@typescript-eslint/parser": 7.17.0 - "@typescript-eslint/utils": 7.17.0 + "@typescript-eslint/eslint-plugin": 7.18.0 + "@typescript-eslint/parser": 7.18.0 + "@typescript-eslint/utils": 7.18.0 peerDependencies: eslint: ^8.56.0 peerDependenciesMeta: typescript: optional: true - checksum: 8584e21e78e9051da3fd71ae77a11f18eae10923c1f3b4e37b0f09c6d4738ffbf812026f62be86ecdbe973f1c26ac341173c69053ba6f278f54f33d99429b8fe + checksum: 68f263821c593d77cd607940a1a411edea6dcc528a0f5047be402c4a8cd612e8c7642b5c41ee6cb89c884ad83676658f7adb9ea688e550415938c84701d8ac93 languageName: node linkType: hard @@ -7882,12 +9492,12 @@ __metadata: linkType: hard "typescript@npm:^5": - version: 5.5.4 - resolution: "typescript@npm:5.5.4" + version: 5.6.2 + resolution: "typescript@npm:5.6.2" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: b309040f3a1cd91c68a5a58af6b9fdd4e849b8c42d837b2c2e73f9a4f96a98c4f1ed398a9aab576ee0a4748f5690cf594e6b99dbe61de7839da748c41e6d6ca8 + checksum: 48777e1dabd9044519f56cd012b0296e3b72bafe12b7e8e34222751d45c67e0eba5387ecdaa6c14a53871a29361127798df6dc8d1d35643a0a47cb0b1c65a33a languageName: node linkType: hard @@ -7902,12 +9512,12 @@ __metadata: linkType: hard "typescript@patch:typescript@^5#~builtin": - version: 5.5.4 - resolution: "typescript@patch:typescript@npm%3A5.5.4#~builtin::version=5.5.4&hash=a1c5e5" + version: 5.6.2 + resolution: "typescript@patch:typescript@npm%3A5.6.2#~builtin::version=5.6.2&hash=a1c5e5" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: fc52962f31a5bcb716d4213bef516885e4f01f30cea797a831205fc9ef12b405a40561c40eae3127ab85ba1548e7df49df2bcdee6b84a94bfbe3a0d7eff16b14 + checksum: c084ee1ab865f108c787e6233a5f63c126c482c0c8e87ec998ac5288a2ad54b603e1ea8b8b272355823b833eb31b9fabb99e8c6152283e1cb47e3a76bd6faf6c languageName: node linkType: hard @@ -7930,10 +9540,10 @@ __metadata: languageName: node linkType: hard -"undici-types@npm:~5.26.4": - version: 5.26.5 - resolution: "undici-types@npm:5.26.5" - checksum: 3192ef6f3fd5df652f2dc1cd782b49d6ff14dc98e5dced492aa8a8c65425227da5da6aafe22523c67f035a272c599bb89cfe803c1db6311e44bed3042fc25487 +"undici-types@npm:~6.19.2": + version: 6.19.8 + resolution: "undici-types@npm:6.19.8" + checksum: de51f1b447d22571cf155dfe14ff6d12c5bdaec237c765085b439c38ca8518fc360e88c70f99469162bf2e14188a7b0bcb06e1ed2dc031042b984b0bb9544017 languageName: node linkType: hard @@ -8063,12 +9673,12 @@ __metadata: languageName: node linkType: hard -"use-sync-external-store@npm:1.2.0": - version: 1.2.0 - resolution: "use-sync-external-store@npm:1.2.0" +"use-sync-external-store@npm:1.2.2": + version: 1.2.2 + resolution: "use-sync-external-store@npm:1.2.2" peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 - checksum: 5c639e0f8da3521d605f59ce5be9e094ca772bd44a4ce7322b055a6f58eeed8dda3c94cabd90c7a41fb6fa852210092008afe48f7038792fd47501f33299116a + checksum: fe07c071c4da3645f112c38c0e57beb479a8838616ff4e92598256ecce527f2888c08febc7f9b2f0ce2f0e18540ba3cde41eb2035e4fafcb4f52955037098a81 languageName: node linkType: hard @@ -8129,6 +9739,143 @@ __metadata: languageName: node linkType: hard +"viem@npm:^2.19.1": + version: 2.21.15 + resolution: "viem@npm:2.21.15" + dependencies: + "@adraffy/ens-normalize": 1.10.0 + "@noble/curves": 1.4.0 + "@noble/hashes": 1.4.0 + "@scure/bip32": 1.4.0 + "@scure/bip39": 1.4.0 + abitype: 1.0.5 + isows: 1.0.4 + webauthn-p256: 0.0.5 + ws: 8.17.1 + peerDependencies: + typescript: ">=5.0.4" + peerDependenciesMeta: + typescript: + optional: true + checksum: d617c4d21c9418a0c583fb29d607d5106fb215574bed5f683dcd9e89ad42967e7c24476ebe8f443f50e9cab9a60d324167b907d10d7c8143320125b6302956fb + languageName: node + linkType: hard + +"vite-node@npm:2.1.1": + version: 2.1.1 + resolution: "vite-node@npm:2.1.1" + dependencies: + cac: ^6.7.14 + debug: ^4.3.6 + pathe: ^1.1.2 + vite: ^5.0.0 + bin: + vite-node: vite-node.mjs + checksum: b44cad7c82d2101ab9e6f3c90f27fed879c0bc8001493ca138d38984795b27393ecaef904a4d8d70abb0f7215b8eb05de15be6cc261134ca7c72d23017571551 + languageName: node + linkType: hard + +"vite@npm:^5.0.0": + version: 5.4.8 + resolution: "vite@npm:5.4.8" + dependencies: + esbuild: ^0.21.3 + fsevents: ~2.3.3 + postcss: ^8.4.43 + rollup: ^4.20.0 + peerDependencies: + "@types/node": ^18.0.0 || >=20.0.0 + less: "*" + lightningcss: ^1.21.0 + sass: "*" + sass-embedded: "*" + stylus: "*" + sugarss: "*" + terser: ^5.4.0 + dependenciesMeta: + fsevents: + optional: true + peerDependenciesMeta: + "@types/node": + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + bin: + vite: bin/vite.js + checksum: b5686ff76a60d53092dc13a5c1e5627165226b8e3da7736931adf87bbe58d383bca386383cea134750108c2d42750c916db3f2314ac90a9477d693950145f140 + languageName: node + linkType: hard + +"vitest@npm:^2.1.1": + version: 2.1.1 + resolution: "vitest@npm:2.1.1" + dependencies: + "@vitest/expect": 2.1.1 + "@vitest/mocker": 2.1.1 + "@vitest/pretty-format": ^2.1.1 + "@vitest/runner": 2.1.1 + "@vitest/snapshot": 2.1.1 + "@vitest/spy": 2.1.1 + "@vitest/utils": 2.1.1 + chai: ^5.1.1 + debug: ^4.3.6 + magic-string: ^0.30.11 + pathe: ^1.1.2 + std-env: ^3.7.0 + tinybench: ^2.9.0 + tinyexec: ^0.3.0 + tinypool: ^1.0.0 + tinyrainbow: ^1.2.0 + vite: ^5.0.0 + vite-node: 2.1.1 + why-is-node-running: ^2.3.0 + peerDependencies: + "@edge-runtime/vm": "*" + "@types/node": ^18.0.0 || >=20.0.0 + "@vitest/browser": 2.1.1 + "@vitest/ui": 2.1.1 + happy-dom: "*" + jsdom: "*" + peerDependenciesMeta: + "@edge-runtime/vm": + optional: true + "@types/node": + optional: true + "@vitest/browser": + optional: true + "@vitest/ui": + optional: true + happy-dom: + optional: true + jsdom: + optional: true + bin: + vitest: vitest.mjs + checksum: cf8e2ff098464287729ef62da83b016ed1398642959ef947669401316a70c12d6a4de9b8962220b3fc133f88ce2c153c5c3944f4ad6d360d5bca8cfa2cec0243 + languageName: node + linkType: hard + +"w3c-xmlserializer@npm:^5.0.0": + version: 5.0.0 + resolution: "w3c-xmlserializer@npm:5.0.0" + dependencies: + xml-name-validator: ^5.0.0 + checksum: 593acc1fdab3f3207ec39d851e6df0f3fa41a36b5809b0ace364c7a6d92e351938c53424a7618ce8e0fbaffee8be2e8e070a5734d05ee54666a8bdf1a376cc40 + languageName: node + linkType: hard + "web-vitals@npm:0.2.4": version: 0.2.4 resolution: "web-vitals@npm:0.2.4" @@ -8136,6 +9883,16 @@ __metadata: languageName: node linkType: hard +"webauthn-p256@npm:0.0.5": + version: 0.0.5 + resolution: "webauthn-p256@npm:0.0.5" + dependencies: + "@noble/curves": ^1.4.0 + "@noble/hashes": ^1.4.0 + checksum: 2837188d1e6d947c87c5728374fb6aec96387cb766f78e7a04d5903774264feb278d68a639748f09997f591e5278796c662bb5c4e8b8286b0f22254694023584 + languageName: node + linkType: hard + "webidl-conversions@npm:^3.0.0": version: 3.0.1 resolution: "webidl-conversions@npm:3.0.1" @@ -8143,6 +9900,22 @@ __metadata: languageName: node linkType: hard +"webidl-conversions@npm:^7.0.0": + version: 7.0.0 + resolution: "webidl-conversions@npm:7.0.0" + checksum: f05588567a2a76428515333eff87200fae6c83c3948a7482ebb109562971e77ef6dc49749afa58abb993391227c5697b3ecca52018793e0cb4620a48f10bd21b + languageName: node + linkType: hard + +"whatwg-encoding@npm:^3.1.1": + version: 3.1.1 + resolution: "whatwg-encoding@npm:3.1.1" + dependencies: + iconv-lite: 0.6.3 + checksum: f75a61422421d991e4aec775645705beaf99a16a88294d68404866f65e92441698a4f5b9fa11dd609017b132d7b286c3c1534e2de5b3e800333856325b549e3c + languageName: node + linkType: hard + "whatwg-fetch@npm:^3.4.1": version: 3.6.20 resolution: "whatwg-fetch@npm:3.6.20" @@ -8150,6 +9923,23 @@ __metadata: languageName: node linkType: hard +"whatwg-mimetype@npm:^4.0.0": + version: 4.0.0 + resolution: "whatwg-mimetype@npm:4.0.0" + checksum: f97edd4b4ee7e46a379f3fb0e745de29fe8b839307cc774300fd49059fcdd560d38cb8fe21eae5575b8f39b022f23477cc66e40b0355c2851ce84760339cef30 + languageName: node + linkType: hard + +"whatwg-url@npm:^14.0.0": + version: 14.0.0 + resolution: "whatwg-url@npm:14.0.0" + dependencies: + tr46: ^5.0.0 + webidl-conversions: ^7.0.0 + checksum: 4b5887e50f786583bead70916413e67a381d2126899b9eb5c67ce664bba1e7ec07cdff791404581ce73c6190d83c359c9ca1d50711631217905db3877dec075c + languageName: node + linkType: hard + "whatwg-url@npm:^5.0.0": version: 5.0.0 resolution: "whatwg-url@npm:5.0.0" @@ -8174,11 +9964,11 @@ __metadata: linkType: hard "which-builtin-type@npm:^1.1.3": - version: 1.1.3 - resolution: "which-builtin-type@npm:1.1.3" + version: 1.1.4 + resolution: "which-builtin-type@npm:1.1.4" dependencies: - function.prototype.name: ^1.1.5 - has-tostringtag: ^1.0.0 + function.prototype.name: ^1.1.6 + has-tostringtag: ^1.0.2 is-async-function: ^2.0.0 is-date-object: ^1.0.5 is-finalizationregistry: ^1.0.2 @@ -8187,13 +9977,13 @@ __metadata: is-weakref: ^1.0.2 isarray: ^2.0.5 which-boxed-primitive: ^1.0.2 - which-collection: ^1.0.1 - which-typed-array: ^1.1.9 - checksum: 43730f7d8660ff9e33d1d3f9f9451c4784265ee7bf222babc35e61674a11a08e1c2925019d6c03154fcaaca4541df43abe35d2720843b9b4cbcebdcc31408f36 + which-collection: ^1.0.2 + which-typed-array: ^1.1.15 + checksum: 1f413025250072534de2a2ee25139a24d477512b532b05c85fb9aa05aef04c6e1ca8e2668acf971b777e602721dbdec4b9d6a4f37c6b9ff8f026ad030352707f languageName: node linkType: hard -"which-collection@npm:^1.0.1": +"which-collection@npm:^1.0.1, which-collection@npm:^1.0.2": version: 1.0.2 resolution: "which-collection@npm:1.0.2" dependencies: @@ -8205,7 +9995,7 @@ __metadata: languageName: node linkType: hard -"which-typed-array@npm:^1.1.13, which-typed-array@npm:^1.1.14, which-typed-array@npm:^1.1.15, which-typed-array@npm:^1.1.9": +"which-typed-array@npm:^1.1.13, which-typed-array@npm:^1.1.14, which-typed-array@npm:^1.1.15": version: 1.1.15 resolution: "which-typed-array@npm:1.1.15" dependencies: @@ -8240,6 +10030,18 @@ __metadata: languageName: node linkType: hard +"why-is-node-running@npm:^2.3.0": + version: 2.3.0 + resolution: "why-is-node-running@npm:2.3.0" + dependencies: + siginfo: ^2.0.0 + stackback: 0.0.2 + bin: + why-is-node-running: cli.js + checksum: 58ebbf406e243ace97083027f0df7ff4c2108baf2595bb29317718ef207cc7a8104e41b711ff65d6fa354f25daa8756b67f2f04931a4fd6ba9d13ae8197496fb + languageName: node + linkType: hard + "wide-align@npm:^1.1.2": version: 1.1.5 resolution: "wide-align@npm:1.1.5" @@ -8300,6 +10102,21 @@ __metadata: languageName: node linkType: hard +"ws@npm:^8.18.0": + version: 8.18.0 + resolution: "ws@npm:8.18.0" + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ">=5.0.2" + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + checksum: 91d4d35bc99ff6df483bdf029b9ea4bfd7af1f16fc91231a96777a63d263e1eabf486e13a2353970efc534f9faa43bdbf9ee76525af22f4752cbc5ebda333975 + languageName: node + linkType: hard + "xdg-app-paths@npm:5.1.0": version: 5.1.0 resolution: "xdg-app-paths@npm:5.1.0" @@ -8318,6 +10135,20 @@ __metadata: languageName: node linkType: hard +"xml-name-validator@npm:^5.0.0": + version: 5.0.0 + resolution: "xml-name-validator@npm:5.0.0" + checksum: 86effcc7026f437701252fcc308b877b4bc045989049cfc79b0cc112cb365cf7b009f4041fab9fb7cd1795498722c3e9fe9651afc66dfa794c16628a639a4c45 + languageName: node + linkType: hard + +"xmlchars@npm:^2.2.0": + version: 2.2.0 + resolution: "xmlchars@npm:2.2.0" + checksum: 8c70ac94070ccca03f47a81fcce3b271bd1f37a591bf5424e787ae313fcb9c212f5f6786e1fa82076a2c632c0141552babcd85698c437506dfa6ae2d58723062 + languageName: node + linkType: hard + "y18n@npm:^5.0.5": version: 5.0.8 resolution: "y18n@npm:5.0.8" @@ -8325,7 +10156,7 @@ __metadata: languageName: node linkType: hard -"yallist@npm:^3.0.0, yallist@npm:^3.1.1": +"yallist@npm:^3.0.0, yallist@npm:^3.0.2, yallist@npm:^3.1.1": version: 3.1.1 resolution: "yallist@npm:3.1.1" checksum: 48f7bb00dc19fc635a13a39fe547f527b10c9290e7b3e836b9a8f1ca04d4d342e85714416b3c2ab74949c9c66f9cebb0473e6bc353b79035356103b47641285d @@ -8340,11 +10171,11 @@ __metadata: linkType: hard "yaml@npm:^2.3.4": - version: 2.5.0 - resolution: "yaml@npm:2.5.0" + version: 2.5.1 + resolution: "yaml@npm:2.5.1" bin: yaml: bin.mjs - checksum: a116dca5c61641d9bf1f1016c6e71daeb1ed4915f5930ed237d45ab7a605aa5d92c332ff64879a6cd088cabede008c778774e3060ffeb4cd617d28088e4b2d83 + checksum: 31275223863fbd0b47ba9d2b248fbdf085db8d899e4ca43fff8a3a009497c5741084da6871d11f40e555d61360951c4c910b98216c1325d2c94753c0036d8172 languageName: node linkType: hard @@ -8413,7 +10244,7 @@ __metadata: languageName: node linkType: hard -"zod@npm:^3.22.2": +"zod@npm:^3.22.4": version: 3.23.8 resolution: "zod@npm:3.23.8" checksum: 15949ff82118f59c893dacd9d3c766d02b6fa2e71cf474d5aa888570c469dbf5446ac5ad562bb035bf7ac9650da94f290655c194f4a6de3e766f43febd432c5c @@ -8421,10 +10252,10 @@ __metadata: linkType: hard "zustand@npm:^4.1.2": - version: 4.5.4 - resolution: "zustand@npm:4.5.4" + version: 4.5.5 + resolution: "zustand@npm:4.5.5" dependencies: - use-sync-external-store: 1.2.0 + use-sync-external-store: 1.2.2 peerDependencies: "@types/react": ">=16.8" immer: ">=9.0.6" @@ -8436,6 +10267,6 @@ __metadata: optional: true react: optional: true - checksum: 8e824aea8b5232f9a719c6d33e016272a0dae8c69a0980a3e2aefbcf2a89379b343af1f2dace340f45f788ec8d8a55a56d037c53498b3b05b91e985d26cae047 + checksum: 654e47959970bc66bbf2ae80fced7e556dd488e9ee54eb678330cb036ecc7184f4b8c2cae273be28022533622c54ab6339bf3fe30d19236367c5c251b6c6679a languageName: node linkType: hard