diff --git a/.changeset/fifty-months-brake.md b/.changeset/fifty-months-brake.md new file mode 100644 index 00000000..5a761d70 --- /dev/null +++ b/.changeset/fifty-months-brake.md @@ -0,0 +1,5 @@ +--- +"@delvtech/council-cli": patch +--- + +Updated and improved the CLI diff --git a/.husky/pre-commit b/.husky/pre-commit deleted file mode 100755 index 25d22357..00000000 --- a/.husky/pre-commit +++ /dev/null @@ -1,4 +0,0 @@ -#!/usr/bin/env sh -. "$(dirname "$0")/_/husky.sh" - -npx lint-staged \ No newline at end of file diff --git a/.nvmrc b/.nvmrc index 2edeafb0..8fdd954d 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -20 \ No newline at end of file +22 \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json index 0ae5d428..cb89910f 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,27 +1,20 @@ { - "eslint.workingDirectories": [ - "./apps/council-ui" - ], - "dotenv.enableAutocloaking": false, - "json.schemas": [ - { - "fileMatch": [ - "*.deployments.json" - ], - "url": "./packages/council-deploy/src/deployments/deployments.schema.json" - } - ], - "markdown.extension.toc.levels": "2..6", - "cSpell.words": [ - "abitype", - "calldatas", - "Delegators", - "delvtech", - "merkle", - "Timelock", - "tsup", - "typecheck", - "unvested", - "Viem" - ] -} \ No newline at end of file + "eslint.workingDirectories": ["./apps/council-ui"], + "markdown.extension.toc.levels": "2..6", + "cSpell.words": [ + "abitype", + "calldatas", + "delegators", + "delvtech", + "keccak", + "linea", + "merkle", + "signale", + "timelock", + "tsup", + "typecheck", + "unvested", + "viem", + "wagmi" + ] +} diff --git a/apps/.eslintrc b/apps/.eslintrc deleted file mode 100644 index bfe638b3..00000000 --- a/apps/.eslintrc +++ /dev/null @@ -1,5 +0,0 @@ -{ - // fallback eslint config to prevent lint-staged from failing when packages - // don't contain an eslint config. Instead, we'll just ignore them. - "ignorePatterns": ["**/*"] -} diff --git a/apps/council-sdk-starter/.env.example b/apps/council-sdk-starter/.env.example deleted file mode 100644 index 884bbeb7..00000000 --- a/apps/council-sdk-starter/.env.example +++ /dev/null @@ -1,2 +0,0 @@ -RPC_URL= -WALLET_PRIVATE_KEY= diff --git a/apps/council-sdk-starter/README.md b/apps/council-sdk-starter/README.md deleted file mode 100644 index 2f3b2d62..00000000 --- a/apps/council-sdk-starter/README.md +++ /dev/null @@ -1,56 +0,0 @@ -# council-sdk-starter - -A reference project with example scripts using the council sdk. - -- [Installation](#installation) -- [Getting started](#getting-started) - - [Environment](#environment) - - [Starting](#starting) - - [Get Proposal Results](#get-proposal-results) - - [Get GSC Members](#get-gsc-members) - - [Create a Proposal](#create-a-proposal) - - [Building](#building) - -## Installation - -The Council SDK isn't currently available as a stand alone package but can be installed within the council monorepo. - -1. Clone the council-monorepo. -2. Add `"@council/sdk": "*"` to the app or package's package.json. -3. Run install: `yarn`. - -## Getting started - -### Environment - -Create your own `.env`. An example template is included in the project in `.env.example`. Provide an RPC url and a private key to sign and pay for transactions. - -### Starting - -Multiple example scripts are included in [`src/scripts`](src/scripts). Each one has a corresponding npm script to run it. - -#### Get Proposal Results - -``` -yarn workspace council-sdk-start getProposalResults -``` - -#### Get GSC Members - -``` -yarn workspace council-sdk-start getGSCMembers -``` - -#### Create a Proposal - -_Caution! this will require paying gas._ - -``` -yarn workspace council-sdk-start createProposal -``` - -### Building - -```bash -yarn workspace council-sdk-starter build -``` diff --git a/apps/council-sdk-starter/package.json b/apps/council-sdk-starter/package.json deleted file mode 100644 index ef9f0934..00000000 --- a/apps/council-sdk-starter/package.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "name": "council-sdk-starter", - "version": "0.0.4", - "description": "Boilerplate to get started using the council-sdk fast!", - "license": "MIT", - "private": true, - "type": "module", - "scripts": { - "createProposal": "tesm-node -r dotenv/config src/scripts/createProposal.ts", - "executeProposal": "tesm-node -r dotenv/config src/scripts/executeProposal.ts", - "setLockDuration": "tesm-node -r dotenv/config src/scripts/setLockDuration.ts", - "changeVaultStatus": "tesm-node -r dotenv/config src/scripts/changeVaultStatus.ts", - "getGSCMembers": "tesm-node -r dotenv/config ./src/scripts/getGSCMembers.ts", - "getProposalResults": "tesm-node -r dotenv/config src/scripts/getProposalResults.ts", - "dev": "tesm-node -r dotenv/config src/scripts/dev.ts", - "typecheck": "tsc --noEmit" - }, - "dependencies": { - "@delvtech/council-viem": "^0.1.0", - "viem": "^2.16.2" - }, - "devDependencies": { - "@council/tsconfig": "*", - "@types/node": "^20.11.19", - "dotenv": "^16.4.5", - "tesm-node": "^1.3.1", - "ts-node": "^10.9.2", - "typescript": "^5.3.3" - } -} diff --git a/apps/council-sdk-starter/src/client.ts b/apps/council-sdk-starter/src/client.ts deleted file mode 100644 index d1075462..00000000 --- a/apps/council-sdk-starter/src/client.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { - PublicClient, - createPublicClient, - createWalletClient, - http, -} from "viem"; -import { privateKeyToAccount } from "viem/accounts"; - -export const publicClient: PublicClient = createPublicClient({ - transport: http(process.env.RPC_URL), -}); - -export const walletClient = - process.env.WALLET_PRIVATE_KEY && - createWalletClient({ - account: privateKeyToAccount( - process.env.WALLET_PRIVATE_KEY as `0x${string}`, - ), - transport: http(process.env.RPC_URL), - }); diff --git a/apps/council-sdk-starter/src/index.ts b/apps/council-sdk-starter/src/index.ts deleted file mode 100644 index 41f4ab17..00000000 --- a/apps/council-sdk-starter/src/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from "./scripts/createProposal"; -export * from "./scripts/getGSCMembers"; -export * from "./scripts/getProposalResults"; diff --git a/apps/council-sdk-starter/src/scripts/changeVaultStatus.ts b/apps/council-sdk-starter/src/scripts/changeVaultStatus.ts deleted file mode 100644 index 1c800043..00000000 --- a/apps/council-sdk-starter/src/scripts/changeVaultStatus.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { ReadWriteCouncil } from "@delvtech/council-viem"; -import { publicClient, walletClient } from "src/client"; - -// wrap the script in an async function so we can await promises -export async function changeVaultStatus(): Promise { - if (!walletClient) { - throw new Error( - "Wallet client not available. Ensure the WALLET_PRIVATE_KEY environment variable is set.", - ); - } - - // create a ReadWriteCouncil instance - const council = new ReadWriteCouncil({ publicClient, walletClient }); - - // Create a ReadWriteCoreVoting instance. - const coreVoting = council.coreVoting({ - address: "0x", // <-- replace with the CoreVoting contract address - }); - - const hash = await coreVoting.changeVaultStatus({ - vault: "0x", // <-- replace with the vault address - isValid: true, - }); - - console.log(`Submitted! (${hash})`); - - process.exit(); -} - -changeVaultStatus(); diff --git a/apps/council-sdk-starter/src/scripts/createProposal.ts b/apps/council-sdk-starter/src/scripts/createProposal.ts deleted file mode 100644 index 4ec8bab8..00000000 --- a/apps/council-sdk-starter/src/scripts/createProposal.ts +++ /dev/null @@ -1,78 +0,0 @@ -import { ReadWriteCouncil } from "@delvtech/council-viem"; -import { publicClient, walletClient } from "src/client"; - -// approx 90 days in blocks assuming 12 seconds a block -const FOURTEEN_DAYS_IN_BLOCKS = (14n * 24n * 60n * 60n) / 12n; - -// wrap the script in an async function so we can await promises -export async function createProposal(): Promise { - if (!walletClient) { - throw new Error( - "Wallet client not available. Ensure the WALLET_PRIVATE_KEY environment variable is set.", - ); - } - - // create a ReadWriteCouncil instance - const council = new ReadWriteCouncil({ publicClient, walletClient }); - - // create model instances - const lockingVault = council.lockingVault("0x"); // <-- replace with the LockingVault contract address - const vestingVault = council.vestingVault("0x"); // <-- replace with the VestingVault contract address - const coreVoting = council.coreVoting({ - address: "0x", // <-- replace with the CoreVoting contract address - vaults: [lockingVault, vestingVault], - }); - - // prep arguments - - // the vaults that will be used to cast the first vote - const vaults = []; - const account = (await walletClient.getAddresses())[0]; - - // trying to create a proposal with vaults you have no power in will throw an - // uninitialized error. - const lockingVaultVotingPower = await lockingVault.getVotingPower({ - account, - }); - if (lockingVaultVotingPower > 0n) { - vaults.push(lockingVault); - } - const vestingVaultVotingPower = await vestingVault.getVotingPower({ - account, - }); - if (vestingVaultVotingPower > 0) { - vaults.push(vestingVault); - } - - // the target contract addresses for the proposal - const targets = [coreVoting.address]; - - // the proposed calls datas to send to the targets - const calldatas = [ - coreVoting.contract.encodeFunctionData("setDefaultQuorum", { - quorum: 100n, - }), - ]; - - const currentBlock = await publicClient.getBlockNumber(); - - // the block number after which the proposal can no longer be executed - const lastCall = currentBlock + FOURTEEN_DAYS_IN_BLOCKS; - - // the ballot to cast for the first vote - const ballot = "yes"; - - const hash = await coreVoting.createProposal({ - ballot, - calldatas, - lastCall, - targets, - vaults, - }); - - console.log(hash); - - process.exit(); -} - -createProposal(); diff --git a/apps/council-sdk-starter/src/scripts/executeProposal.ts b/apps/council-sdk-starter/src/scripts/executeProposal.ts deleted file mode 100644 index 16a091b3..00000000 --- a/apps/council-sdk-starter/src/scripts/executeProposal.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { ReadWriteCouncil } from "@delvtech/council-viem"; -import { publicClient, walletClient } from "src/client"; - -// wrap the script in an async function so we can await promises -export async function getProposalResults(): Promise { - if (!walletClient) { - throw new Error( - "Wallet client not available. Ensure the WALLET_PRIVATE_KEY environment variable is set.", - ); - } - - // create a ReadWriteCouncil instance - const council = new ReadWriteCouncil({ publicClient, walletClient }); - - // Create a ReadWriteCoreVoting instance. - const coreVoting = council.coreVoting({ - address: "0x", // <-- replace with the CoreVoting contract address - }); - - // get the proposal to be executed - const proposal = await coreVoting.getProposal({ id: 0n }); - - const hash = await proposal?.execute(); - - console.log(`Execution transaction submitted! (${hash})`); - - process.exit(); -} - -getProposalResults(); diff --git a/apps/council-sdk-starter/src/scripts/getGSCMembers.ts b/apps/council-sdk-starter/src/scripts/getGSCMembers.ts deleted file mode 100644 index 9ff22d92..00000000 --- a/apps/council-sdk-starter/src/scripts/getGSCMembers.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { ReadWriteCouncil } from "@delvtech/council-viem"; -import { publicClient, walletClient } from "src/client"; - -// wrap the script in an async function so we can await promises -export async function getGSCMembers(): Promise { - if (!walletClient) { - throw new Error( - "Wallet client not available. Ensure the WALLET_PRIVATE_KEY environment variable is set.", - ); - } - - // create a ReadWriteCouncil instance - const council = new ReadWriteCouncil({ publicClient, walletClient }); - - // create a ReadGscVault instance - const gscVault = council.gscVault("0x"); // <-- replace with the LockingVault contract address - - // get all members - const members = await gscVault.getMembers(); - - // create an array of member stat objects - const memberStats = []; - for (const member of members) { - console.log("fetching", member.address); - - // get the voting vaults that were used to prove the member meets the - // minimum voting power requirement - const votingPowerVaults = await gscVault.getMemberVaults({ - account: member.address, - }); - - memberStats.push({ - address: member.address, - joinDate: await gscVault.getJoinDate({ account: member.address }), - votingPower: await member.getVotingPower({ vaults: votingPowerVaults }), - }); - } - - console.table(memberStats); - - process.exit(); -} - -getGSCMembers(); diff --git a/apps/council-sdk-starter/src/scripts/getProposalResults.ts b/apps/council-sdk-starter/src/scripts/getProposalResults.ts deleted file mode 100644 index 48714378..00000000 --- a/apps/council-sdk-starter/src/scripts/getProposalResults.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { ReadWriteCouncil, VoteResults } from "@delvtech/council-viem"; -import { publicClient, walletClient } from "src/client"; - -// wrap the script in an async function so we can await promises -export async function getProposalResults(): Promise { - if (!walletClient) { - throw new Error( - "Wallet client not available. Ensure the WALLET_PRIVATE_KEY environment variable is set.", - ); - } - - // create a ReadWriteCouncil instance - const council = new ReadWriteCouncil({ publicClient, walletClient }); - - // Create a ReadWriteCoreVoting instance. - const coreVoting = council.coreVoting({ - address: "0x", // <-- replace with the CoreVoting contract address - }); - - // get all proposals - const proposals = await coreVoting.getProposals(); - - // get results for all proposals and key them by id in a new object - const resultsByProposalId: Record = {}; - for (const proposal of proposals) { - resultsByProposalId[Number(proposal.id)] = await proposal.getResults(); - } - - console.table(resultsByProposalId); - - process.exit(); -} - -getProposalResults(); diff --git a/apps/council-sdk-starter/src/scripts/setLockDuration.ts b/apps/council-sdk-starter/src/scripts/setLockDuration.ts deleted file mode 100644 index db193376..00000000 --- a/apps/council-sdk-starter/src/scripts/setLockDuration.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { ReadWriteCouncil } from "@delvtech/council-viem"; -import { publicClient, walletClient } from "src/client"; - -// wrap the script in an async function so we can await promises -export async function setLockDuration(): Promise { - if (!walletClient) { - throw new Error( - "Wallet client not available. Ensure the WALLET_PRIVATE_KEY environment variable is set.", - ); - } - - // create a ReadWriteCouncil instance - const council = new ReadWriteCouncil({ publicClient, walletClient }); - - // Create a ReadWriteCoreVoting instance. - const coreVoting = council.coreVoting({ - address: "0x", // <-- replace with the CoreVoting contract address - }); - - const hash = await coreVoting.setLockDuration({ - blocks: 0n, // <-- replace with the number of blocks to lock - }); - - console.log(`Submitted! (${hash})`); - - process.exit(); -} - -setLockDuration(); diff --git a/apps/council-sdk-starter/tsconfig.json b/apps/council-sdk-starter/tsconfig.json deleted file mode 100644 index 6af24742..00000000 --- a/apps/council-sdk-starter/tsconfig.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "extends": "@council/tsconfig/base.json", - "include": ["src"], - "exclude": ["node_modules"], - "compilerOptions": { - "rootDir": ".", - "baseUrl": ".", - "resolveJsonModule": true, - "module": "ESNext", - "target": "ESNext", - "moduleResolution": "bundler" - } -} diff --git a/apps/council-ui/.env.sample b/apps/council-ui/.env.sample index b728fdb8..23b5882e 100644 --- a/apps/council-ui/.env.sample +++ b/apps/council-ui/.env.sample @@ -8,7 +8,7 @@ NEXT_PUBLIC_GOERLI_RPC_URL= # path, ie: `/council-monorepo` for a github repo called council-monorepo. # NEXT_PUBLIC_COUNCIL_UI_BASE_PATH= -# If running a local node, use this instead of the alchemy id +# If running a local node NEXT_PUBLIC_LOCAL_RPC_URL=http://127.0.0.1:8545 # WalletConnect integration w/ RainbowKit diff --git a/apps/council-ui/.gitignore b/apps/council-ui/.gitignore index 1ae13b9a..94f2cc88 100644 --- a/apps/council-ui/.gitignore +++ b/apps/council-ui/.gitignore @@ -3,3 +3,6 @@ out # WalletConnect domain verification code public/.well-known/walletconnect.txt + +tsconfig.tsbuildinfo +deployments \ No newline at end of file diff --git a/apps/council-ui/package.json b/apps/council-ui/package.json index 1764c65b..23d84538 100644 --- a/apps/council-ui/package.json +++ b/apps/council-ui/package.json @@ -9,54 +9,57 @@ "export": "next export", "start": "next start", "lint": "next lint", - "typecheck": "tsc --noEmit" + "typecheck": "tsc --noEmit", + "typecheck:watch": "tsc --noEmit --watch" }, "dependencies": { - "@delvtech/council-artifacts": "^0.1.0", - "@delvtech/council-viem": "^0.1.0", - "@ensdomains/ensjs": "^3.4.4", - "@heroicons/react": "^2.1.1", + "@delvtech/council-js": "^0.0.0", + "@delvtech/drift": "^0.6.0", + "@delvtech/drift-viem": "^0.6.0", + "@delvtech/fixed-point-wasm": "^0.0.8", + "@ensdomains/ensjs": "^4.0.2", + "@heroicons/react": "^2.2.0", "@metamask/jazzicon": "^2.0.0", - "@pushprotocol/restapi": "^1.6.7", - "@rainbow-me/rainbowkit": "^2.0.2", - "@tailwindcss/line-clamp": "^0.4.4", - "@tanstack/react-query": "^5.22.2", - "assert-never": "^1.2.1", + "@pushprotocol/restapi": "^1.7.30", + "@rainbow-me/rainbowkit": "^2.2.3", + "@tanstack/react-query": "^5.66.0", + "assert-never": "^1.4.0", "classnames": "^2.5.1", "d3-format": "^3.1.0", - "daisyui": "^4.7.2", - "date-fns": "^3.3.1", - "ethers": "^6.11.1", - "fuse.js": "^7.0.0", - "listr2": "^8.0.2", + "daisyui": "^4.12.23", + "date-fns": "^4.1.0", + "ethers": "^6.13.5", + "fuse.js": "^7.1.0", + "listr2": "^8.2.5", "lodash.chunk": "^4.2.0", "next": "13.0.0", "react": "18.2.0", "react-dom": "18.2.0", - "react-hot-toast": "^2.4.1", - "react-loading-skeleton": "^3.4.0", - "react-tooltip": "^5.26.0", - "viem": "^2.16.2", - "wagmi": "^2.5.11" + "react-hot-toast": "^2.5.2", + "react-loading-skeleton": "^3.5.0", + "react-tooltip": "^5.28.0", + "viem": "^2.23.7", + "wagmi": "^2.14.12" }, "devDependencies": { - "@babel/core": "^7.23.9", + "@babel/core": "^7.26.8", "@council/eslint-config": "*", "@council/tsconfig": "*", - "@tailwindcss/typography": "^0.5.10", - "@tanstack/eslint-plugin-query": "^5.20.1", + "@tailwindcss/line-clamp": "^0.4.4", + "@tailwindcss/typography": "^0.5.16", + "@tanstack/eslint-plugin-query": "^5.66.1", "@types/d3-format": "^3.0.4", "@types/lodash.chunk": "^4.2.9", - "@types/node": "^20.11.19", - "@types/react": "18.2.57", - "autoprefixer": "^10.4.17", + "@types/node": "^22.13.1", + "@types/react": "^18.2.57", + "autoprefixer": "^10.4.20", "eslint": "8.56.0", "eslint-config-next": "^14.1.0", - "eslint-plugin-react": "^7.33.2", - "eslint-plugin-tailwindcss": "^3.14.3", + "eslint-plugin-react": "^7.37.4", + "eslint-plugin-tailwindcss": "^3.18.0", "next-transpile-modules": "10.0.1", - "postcss": "^8.4.35", - "tailwindcss": "^3.4.1", - "typescript": "^5.3.3" + "postcss": "^8.5.3", + "tailwindcss": "^3.4.17", + "typescript": "^5.8.2" } } diff --git a/apps/council-ui/pages/voters/index.tsx b/apps/council-ui/pages/voters/index.tsx deleted file mode 100644 index 77b9af6f..00000000 --- a/apps/council-ui/pages/voters/index.tsx +++ /dev/null @@ -1,205 +0,0 @@ -import { - ReadVotingVault, - VoterPowerBreakdown, - VoterWithPower, -} from "@delvtech/council-viem"; -import { useQuery, UseQueryResult } from "@tanstack/react-query"; -import { ReactElement, useMemo, useState } from "react"; -import { ErrorMessage } from "src/ui/base/error/ErrorMessage"; -import { Page } from "src/ui/base/Page"; -import { useReadCoreVoting } from "src/ui/council/hooks/useReadCoreVoting"; -import { useSupportedChainId } from "src/ui/network/hooks/useSupportedChainId"; -import { useReadGscVault } from "src/ui/vaults/gscVault/hooks/useReadGscVault"; -import { GSCOnlyToggle } from "src/ui/voters/GscOnlyToggle"; -import { useVotersSearch } from "src/ui/voters/hooks/useVotersSearch"; -import { VoterRowData } from "src/ui/voters/types"; -import { VoterList } from "src/ui/voters/VoterList/VoterList"; -import { VoterListSkeleton } from "src/ui/voters/VoterList/VoterListSkeleton"; -import { getBulkEnsRecords } from "src/utils/getBulkEnsRecords"; -import { usePublicClient } from "wagmi"; - -const DEFAULT_LIST_SIZE = 100; - -export default function VotersPage(): ReactElement { - const { data: voters, status, error } = useVoterPageData(); - const { results, search } = useVotersSearch(voters); - const [listSize, setListSize] = useState(DEFAULT_LIST_SIZE); - const [gscOnly, setGscOnly] = useState(false); - - const filteredResults = useMemo(() => { - if (gscOnly) { - return results.filter(({ isGSCMember }) => isGSCMember); - } - return results; - }, [gscOnly, results]); - - if (status === "error") { - return ; - } - - return ( - -
-
-

Voters

-

- Voters are accounts that currently have voting power. You can search - by partial keywords using ENS names or addresses. -

-
- -
- search(e.target.value as string)} - disabled={status !== "success"} - /> - -
- - {status === "success" ? ( - setListSize(newSize)} - /> - ) : ( - - )} -
-
- ); -} - -export function useVoterPageData(): UseQueryResult { - const coreVoting = useReadCoreVoting(); - const gscVault = useReadGscVault(); - const chainId = useSupportedChainId(); - const publicClient = usePublicClient(); - - return useQuery({ - queryKey: ["voter-list-page", chainId], - queryFn: async () => { - const voterPowerBreakdowns: VoterPowerBreakdown[] = []; - - for (const vault of coreVoting.vaults) { - if (hasVotingPowerBreakdown(vault)) { - const breakdown = await vault.getVotingPowerBreakdown(); - voterPowerBreakdowns.push(...breakdown); - } - } - - const mergedBreakdowns = mergeVoterPowerBreakdowns(voterPowerBreakdowns); - - const gscMembers = (await gscVault?.getVoters()) || []; - const gscMemberAddresses = gscMembers.map(({ address }) => address); - const ensRecords = await getBulkEnsRecords( - voterPowerBreakdowns.map(({ voter }) => voter.address), - publicClient, - ); - - console.log({ - ensRecords, - }); - - return mergedBreakdowns.map( - ({ voter, votingPower, votingPowerByDelegator }) => { - return { - address: voter.address, - ensName: ensRecords[voter.address], - votingPower, - numberOfDelegators: votingPowerByDelegator.length, - isGSCMember: gscMemberAddresses.includes(voter.address), - }; - }, - ); - }, - - // This is an expensive query and do not want to refetch. - refetchOnWindowFocus: false, - staleTime: Infinity, - }); -} - -function hasVotingPowerBreakdown( - vault: ReadVotingVault, -): vault is ReadVotingVault & { - getVotingPowerBreakdown: () => Promise; -} { - return ( - "getVotingPowerBreakdown" in vault && - typeof vault.getVotingPowerBreakdown === "function" - ); -} - -// TODO: This was a method on the old Voting Contract type, but depended on -// vaults having an optional method. It seems like a combined voter list would -// be a common use case, so this might still belong in the SDK somewhere. -function mergeVoterPowerBreakdowns( - breakdowns: VoterPowerBreakdown[], -): VoterPowerBreakdown[] { - // create a temp object to merge unique addresses - const breakdownsByVoter: Record< - `0x${string}`, - VoterWithPower & { - fromDelegators: bigint; - byDelegator: Record<`0x${string}`, VoterWithPower>; - } - > = {}; - - for (const { - voter, - votingPower, - votingPowerByDelegator, - votingPowerFromAllDelegators, - } of breakdowns) { - const breakdown = breakdownsByVoter[voter.address]; - - if (!breakdown) { - // Add a breakdown for this voter in the unique list - breakdownsByVoter[voter.address] = { - voter, - votingPower, - fromDelegators: votingPowerFromAllDelegators, - // key delegators by their address - byDelegator: Object.fromEntries( - votingPowerByDelegator.map((delegatorWithPower) => [ - delegatorWithPower.voter.address, - delegatorWithPower, - ]), - ), - }; - } else { - // if a breakdown for this voter already exists, then merge with the - // current one. - breakdown.votingPower += votingPower; - breakdown.fromDelegators += votingPowerFromAllDelegators; - - for (const delegatorWithPower of votingPowerByDelegator) { - if (!breakdown.byDelegator[delegatorWithPower.voter.address]) { - // Add the delegator with power to the breakdown in the unique list - breakdown.byDelegator[delegatorWithPower.voter.address] = - delegatorWithPower; - } else { - breakdown.byDelegator[delegatorWithPower.voter.address].votingPower += - delegatorWithPower.votingPower; - } - } - } - } - - return Object.values(breakdownsByVoter).map( - ({ voter, votingPower, fromDelegators, byDelegator }) => ({ - voter, - votingPower, - votingPowerFromAllDelegators: fromDelegators, - votingPowerByDelegator: Object.values(byDelegator), - }), - ); -} diff --git a/apps/council-ui/postcss.config.js b/apps/council-ui/postcss.config.js index 12a703d9..33ad091d 100644 --- a/apps/council-ui/postcss.config.js +++ b/apps/council-ui/postcss.config.js @@ -3,4 +3,4 @@ module.exports = { tailwindcss: {}, autoprefixer: {}, }, -}; +} diff --git a/apps/council-ui/src/config/council.config.ts b/apps/council-ui/src/config/council.config.ts index c0028494..5976d553 100644 --- a/apps/council-ui/src/config/council.config.ts +++ b/apps/council-ui/src/config/council.config.ts @@ -1,12 +1,12 @@ -import { CouncilConfig } from "src/config/CouncilConfig"; import { goerliCouncilConfig } from "src/config/goerli"; import { localhostCouncilConfig } from "src/config/localhost"; import { mainnetCouncilConfig } from "src/config/mainnet"; +import { CouncilConfig } from "src/config/types"; -export type SupportedChainId = 1 | 5 | 1337; +export const councilConfigs = [ + mainnetCouncilConfig, + goerliCouncilConfig, + localhostCouncilConfig, +] satisfies CouncilConfig[]; -export const councilConfigs: Record = { - 1: mainnetCouncilConfig, - 5: goerliCouncilConfig, - 1337: localhostCouncilConfig, -}; +export type SupportedChainId = (typeof councilConfigs)[number]["chainId"]; diff --git a/apps/council-ui/src/config/goerli.ts b/apps/council-ui/src/config/goerli.ts index 7397445c..95f4d652 100644 --- a/apps/council-ui/src/config/goerli.ts +++ b/apps/council-ui/src/config/goerli.ts @@ -1,6 +1,6 @@ -import { CouncilConfig } from "src/config/CouncilConfig"; +import { CouncilConfig } from "src/config/types"; -export const goerliCouncilConfig: CouncilConfig = { +export const goerliCouncilConfig = { version: "", chainId: 5, timelock: { @@ -50,12 +50,14 @@ export const goerliCouncilConfig: CouncilConfig = { name: "GSC", address: "0xd3f84fc6f50e421502e9f8e36b519E0D156BE6C8", descriptionURL: "https://moreinfo.com", - vault: { - name: "GSC Vault", - address: "0xCFb73f8D5D29e5d936AdF86A8A739AE12b882E8D", - type: "GSCVault", - descriptionURL: "https://moreinfo.com", - }, + vaults: [ + { + name: "GSC Vault", + address: "0xCFb73f8D5D29e5d936AdF86A8A739AE12b882E8D", + type: "GSCVault", + descriptionURL: "https://moreinfo.com", + }, + ], proposals: { 0: { descriptionURL: "", targets: [], calldatas: [] }, 1: { descriptionURL: "", targets: [], calldatas: [] }, @@ -74,4 +76,4 @@ export const goerliCouncilConfig: CouncilConfig = { channel: "0xbAE1338219a9BDDB38d38B77094e833995B703E2", env: "staging", }, -}; +} as const satisfies CouncilConfig; diff --git a/apps/council-ui/src/config/localhost.ts b/apps/council-ui/src/config/localhost.ts index 504a9f21..6376d68c 100644 --- a/apps/council-ui/src/config/localhost.ts +++ b/apps/council-ui/src/config/localhost.ts @@ -1,40 +1,26 @@ -import { CouncilConfig } from "src/config/CouncilConfig"; +import { CouncilConfig } from "src/config/types"; -export const localhostCouncilConfig: CouncilConfig = { +const wallet = "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"; + +export const localhostCouncilConfig = { version: "", - chainId: 1337, - timelock: { - address: "0xDc64a140Aa3E981100a9becA4E685f962f0cF6C9", - }, + chainId: 31337, coreVoting: { name: "Core Voting", - address: "0xe7f1725e7734ce288f8367e1bb143e90bb3f0512", + address: "0xa513e6e4b8f2a923d98304ec87f64353c4d5c853", descriptionURL: "https://moreinfo.com", vaults: [ { name: "Locking Vault", - address: "0xcf7ed3acca5a467e9e704c703e8d87f634fb0fc9", - type: "LockingVault", - descriptionURL: "https://moreinfo.com", - }, - { - name: "Locking Vault 2", - address: "0x959922be3caee4b8cd9a407cc3ac1c251c2007b1", + address: "0x8a791620dd6260079bf849dc5567adc3f2fdc318", type: "LockingVault", descriptionURL: "https://moreinfo.com", }, - { - name: "Vesting Vault", - address: "0x59b670e9fa9d0a427751af201d676719a970857b", - type: "VestingVault", - descriptionURL: "https://moreinfo.com", - }, ], proposals: {}, }, +} as const satisfies CouncilConfig; - airdrop: { - address: "0x0165878a594ca255338adfa4d48449f69242eb8f", - baseDataURL: "/api/airdrop", - }, -}; +// 0xa51c1fc2f0d1a1b8494ed1fe312d7c3a78ed91c0 +// 0x0dcd1bf9a1b36ce34237eeafef220932846bcd82 +// 0x341a7b42000000000000000000000000610178da211fef7d417bc0e6fed39f05609ad7880000000000000000000000000000000000000000000000000000000000000001 diff --git a/apps/council-ui/src/config/mainnet.ts b/apps/council-ui/src/config/mainnet.ts index 65b7da73..a5b4fd80 100644 --- a/apps/council-ui/src/config/mainnet.ts +++ b/apps/council-ui/src/config/mainnet.ts @@ -1,287 +1,30 @@ -import { CouncilConfig } from "src/config/CouncilConfig"; +import { CouncilConfig } from "src/config/types"; -export const mainnetCouncilConfig: CouncilConfig = { +export const mainnetCouncilConfig = { version: "", chainId: 1, - timelock: { - address: "0x81758f3361A769016eae4844072FA6d7f828a651", - }, coreVoting: { name: "Core Voting", - address: "0xEaCD577C3F6c44C3ffA398baaD97aE12CDCFed4a", + address: "0xdf66ab853fc112ec955531bd76e9079db30a0e27", descriptionURL: "https://moreinfo.com", vaults: [ { - name: "Locking Vault", - sentenceSummary: - "Deposit tokens in exchange for voting power, which can then be delegated.", - paragraphSummary: - "Allows users to deposit their tokens in exchange for voting power, which can also be delegated to a different user.", - address: "0x02Bd4A3b1b95b01F2Aa61655415A5d3EAAcaafdD", + name: "Locking Vault 2", + address: "0x7c4bda48bd4c9ac4fbcc60deeb66bf80d35705f0", type: "LockingVault", - descriptionURL: - "https://docs-delv.gitbook.io/element-developer-docs/governance-council/council-protocol-smart-contracts/voting-vaults/locking-vault", + descriptionURL: "", }, { - name: "Vesting Vault", - address: "0x6De73946eab234F1EE61256F10067D713aF0e37A", - sentenceSummary: - "Allows vesting tokens to have voting power in proportion to a DAO-defined multiplier.", - paragraphSummary: - "Allows locked / vesting positions to still have voting power in the governance system by using a defined multiplier for the vested tokens over unvested.", - type: "VestingVault", - descriptionURL: - "https://docs-delv.gitbook.io/element-developer-docs/governance-council/council-protocol-smart-contracts/voting-vaults/vesting-vault", - }, - ], - proposals: { - 0: { + name: "Locking Vault 1", + address: "0xdb259fa7d7f9f68ae3ffc3c748516ba9567a7576", + type: "LockingVault", descriptionURL: "", - targets: [], - calldatas: [], - }, - 1: { - descriptionURL: - "https://snapshot.org/#/elfi.eth/proposal/0x46785a4b78a9d03aeb5cdeb1c3ca4ae02cf9e5aca508e59bef405d16a7c8b4a6", - targets: [], - calldatas: [], - title: "EGP-2: Increase GSC quorum threshold", - sentenceSummary: "Increase the current GSC quroum threshold to 3.", - paragraphSummary: - "As of today (April 28, 2022) there has only been one delegate (myself) who has proven their membership to the GSC on-chain. In roughly five days I will be able to pass votes by myself with no further approval because the current quroum threshold on the GSC is one. I believe that no one person should be able to govern the GSC by themselves, and thus I am proposing to effectively lock the GSC until two other delegates join the GSC. Three was chosen as a starting point for one reason, to break a tie. As more delegates join, I'm sure this value will gradually increase but for the time being, a threshold of three will be adequate to ensure some level of participation.", - }, - 2: { - descriptionURL: - "https://snapshot.org/#/elfi.eth/proposal/0x132d4d3e0580349d938d22c844ce088ba2e5f394fc28b41f2927856746b125d7", - targets: [], - calldatas: [], - title: "(Invalid) EGP-15: Element Fixed Borrow Protocol Grant Proposal", - sentenceSummary: - "Component is proposing a 274,414.06 ELFI voting token grant to build a fixed borrow protocol on top of Element Finance and for building the YTC tool.", - paragraphSummary: - "The proceeds of this grant will enable us to build a protocol offering competitive, low-cost, fixed-rate borrowing on Compound Finance and Aave. Component has been an active contributor to Element Finance since early 2021 and will continue to launch new integrations for fixed rates on Element Finance. This grant ensures a long term relationship where Component will be part of growing, generating revenue and decentralizing the Element DAO.", - }, - 3: { - descriptionURL: - "https://snapshot.org/#/elfi.eth/proposal/0x132d4d3e0580349d938d22c844ce088ba2e5f394fc28b41f2927856746b125d7", - targets: [], - calldatas: [], - title: "EGP-15: Element Fixed Borrow Protocol Grant Proposal", - sentenceSummary: - "Component is proposing a 274,414.06 ELFI voting token grant to build a fixed borrow protocol on top of Element Finance and for building the YTC tool.", - paragraphSummary: - "The proceeds of this grant will enable us to build a protocol offering competitive, low-cost, fixed-rate borrowing on Compound Finance and Aave. Component has been an active contributor to Element Finance since early 2021 and will continue to launch new integrations for fixed rates on Element Finance. This grant ensures a long term relationship where Component will be part of growing, generating revenue and decentralizing the Element DAO.", - }, - 4: { - descriptionURL: - "https://snapshot.org/#/elfi.eth/proposal/0xcedbf99283b0dc2c32184cc04a66839ff483621ee661da75a421931297ac7788", - targets: [], - calldatas: [], - title: - "EGP-22: Removal of Non-Contributor Grants from the Vesting Vault", - sentenceSummary: - "Removing the Element Finance team-allocated token grants for those who left Element Finance before their vesting cliffs, for team members who partially vested, or for team members who left before the vesting dates were reached.", - paragraphSummary: - "This proposal formalizes a solution for the removal/reclaiming of Element Finance team members-allocated token grants who departed prior to reaching the vesting vault smart contract-defined vesting cliffs, partially vested, and/or before the vesting dates were reached.", - }, - 5: { - descriptionURL: - "https://snapshot.org/#/elfi.eth/proposal/0x7c35f280e01513b65fe0a3f2abdf2d8cd28eb019c14ad732b1cf25386a52a451", - targets: [], - calldatas: [], - title: - "EGP-23: Convert timestamps to blocknumbers in Deployed Vesting Vault", - sentenceSummary: - "Fix an identified bug within the deployed Vesting Vault Contract regarding the token grant configurations for core contributors, advisors, and investors.", - paragraphSummary: - "It was identified that the grants in the Vesting vault contract were misconfigured during deployment last March 31, 2022. The time in which the grants will start vesting was set up using Unix time stamps in seconds instead of block numbers. The contract expects block numbers as the threshold when funds will start dispersing. The difference between block numbers and time stamps is on an order of magnitude. This has caused all grants to not start until the year ~2630.", - }, - 6: { - descriptionURL: - "https://snapshot.org/#/elfi.eth/proposal/0x0bebfeaada03ab21c52917ff5f0347fa29ce7a45a0a55a48b5382bf02963331f", - targets: [], - calldatas: [], - title: - "EGP-24: Reclaim (Clawback) unclaimed voting rights that have been distributed", - sentenceSummary: - "Reclaim the unclaimed voting rights (ELFI) from the initial distribution event and direct it back to the DAO Treasury.", - paragraphSummary: - "On March 31st, 2022 the Element Labs team distributed voting rights to various different parties, users, and individuals deemed qualified to participate in the DAO operations and voting of the newly formed Element DAO. Close to a year later, a decent % of the distributed voting rights have still not been claimed and utilized as intended. This proposal is to suggest that the unclaimed voting rights ought to be reclaimed by the Element DAO to be re-distributed into the right hands via grants, participants, DAO contributors, liquidity programs, rewards, bounties, etc.", - }, - 7: { - descriptionURL: - "https://snapshot.org/#/elfi.eth/proposal/0xea38eff160c02bd3bce89830ac1e866dc6f5e47ac36f9ede504f30a5661a5c21", - targets: [], - calldatas: [], - title: "EGP-21: Enable the transferability of ELFI", - sentenceSummary: - "Enable the transferability of ELFI by unlocking the voting vaults where the delegated ELFI tokens are currently locked in.", - paragraphSummary: - "This EGP is focused on enabling the transferability of ELFI to allow for the changing of hands of voters. It has been close to 1 year since the release of ELFI, and sufficient (necessary) progress has been made in the development of the DAO. Now is the time for all of the participants within the DAO and the users outside of the DAO looking in to be given the ability to freely choose how they want to express their form of participation.", - }, - 8: { - descriptionURL: - "https://snapshot.org/#/elfi.eth/proposal/0x38b141145f27e23753978ebe8987059c49986579d1b7dcbe1a6d6f8743bff8f7", - targets: [], - calldatas: [], - title: - "EGP-5: Enable Temporary Protocol Incentives for Liquidity Providers", - sentenceSummary: - "Enable protocol incentives to keep TVL in the protocol, and increase network distribution to more users prior to ELFI unlock.", - paragraphSummary: - "Discussing a fair short term incentive program before enabling transferability of ELFI. As Element’s vaults begin to expire, the necessity of incentivizing rollover is getting more and more important to help retain liquidity in the protocol. The fixed income markets require liquidity to create the opportunity for fixed rate purchasers to earn a fixed rate with minimal slippage.", - }, - 9: { - descriptionURL: - "https://snapshot.org/#/elfi.eth/proposal/0x38b141145f27e23753978ebe8987059c49986579d1b7dcbe1a6d6f8743bff8f7", - targets: [], - calldatas: [], - title: "Technical Correction of Core Voting Proposal 8 (EGP-5)", - sentenceSummary: - "This proposal fixes the technical error of the prior proposal, EGP-5.", - paragraphSummary: - "This proposal fixes the technical error of the prior proposal, EGP-5. The ELFI token has 18 decimals, which was not accounted for in Proposal 8. Thus, despite the success of the onchain vote, the retroactive incentives of EGP-5 could not be sent to the reward contract.", - }, - 10: { - descriptionURL: - "https://docs.google.com/document/d/1tutU6ZzIvOCv3CcdCzUJ_PbPMIUM-xu3gAhQ0qkV1Z0/edit", - targets: [], - calldatas: [], - title: "EGP16-2: Begin unwinding of the main treasury", - sentenceSummary: - "This PR is the follow-up from the approved Snapshot proposal, targeting the unwinding of the main treasury.", - paragraphSummary: - "The main treasury holds approx. 192,000 USDC in assets wound up in Yearn positions. These assets come from affiliate fees via Yearn. A separate proposal manages the unwinding of the GSC treasury, which contains about 60,000 USDC. Following this proposal, two more will be necessary to unwind CRV positions and to consolidate assets into USDC, DAI, and ETH.", }, - 11: { - targets: [], - calldatas: [], - title: - "EGP28: Security Fix for Discovered Vulnerability in the Locking Vault", - sentenceSummary: - "EGP-28 is being proposed in response to a bug disclosure from the Immunefi bug bounty program related to the LockingVault.", - paragraphSummary: - "This proposal includes a solution to fix the ability for exploit to the LockingVault. For security purposes, this proposal won’t include the specific details of the proposal solution until the fix has been implemented. Once the proposal has been executed, a full report will be published revealing the bug report, the fix (including the technical solution), and a call to action for governance process improvement in the case that another situation like this occurs in the future.", - }, - 12: { - targets: [], - calldatas: [], - title: - "EGP27: The Removal of Non-Contributor Grants from the Vesting Vault", - sentenceSummary: - "EGP-27 is being proposed to remove the DELV (formerly Element Finance) team-allocated token grants for those who left DELV before their vesting cliffs, reduce existing grants for Team Members who partially vested, or for Team Members who left before the vesting dates were reached.", - paragraphSummary: - "This proposal formalizes a solution for the removal/reclaiming of DELV Team Members-allocated token grants who departed prior to reaching the vesting vault smart contract-defined vesting cliffs, partially vested, and/or before the vesting dates were reached.\n\n These DELV team-allocated token grants were distributed during the governance launch of Element DAO on March 31 of 2022. The vesting cliff was defined as one year from the launch date and the token vesting schedule defined was as three years after the launch date.", - }, - 13: { - targets: [], - calldatas: [], - title: "EGP-16: Main Treasury - 1", - sentenceSummary: "Revised proposal to unwind the main treasury.", - paragraphSummary: - "The main treasury holds approx. 192,000 USDC in assets wound up in Yearn positions. These assets come from affiliate fees via Yearn. A separate proposal manages the unwinding of the GSC treasury, which contains about 60,000 USDC. Following this proposal, two more will be necessary to unwind CRV positions and to consolidate assets into USDC, DAI, and ETH.", - }, - 14: { - targets: [], - calldatas: [], - title: "EGP-16: Main Treasury - 2", - sentenceSummary: "Revised proposal to unwind the main treasury.", - paragraphSummary: - "The main treasury holds approx. 192,000 USDC in assets wound up in Yearn positions. These assets come from affiliate fees via Yearn. A separate proposal manages the unwinding of the GSC treasury, which contains about 60,000 USDC. Following this proposal, two more will be necessary to unwind CRV positions and to consolidate assets into USDC, DAI, and ETH.", - }, - }, - }, - gscVoting: { - name: "GSC", - address: "0x40309f197e7f94B555904DF0f788a3F48cF326aB", - descriptionURL: "https://moreinfo.com", - vault: { - name: "GSC Vault", - address: "0xcA870E8aa4FCEa85b5f0c6F4209C8CBA9265B940", - type: "GSCVault", - - sentenceSummary: - "The Governance Steering Council (GSC) vault gives one vote to each member that has reached an established threshold of delegated voting power defined by the DAO.", - paragraphSummary: - "The Governance Steering Council (GSC) vault gives one vote to each member that has reached an established threshold of delegated voting power defined by the DAO. Council members can create, vote, and execute proposals if the GSC quorum is met, with quorum set by the DAO.", - descriptionURL: - "https://docs-delv.gitbook.io/element-developer-docs/governance-council/council-protocol-smart-contracts/voting-vaults/governance-steering-council-gsc-vault", - }, - proposals: { - 0: { - descriptionURL: - "https://docs.google.com/document/d/17tR4ZjibQyfAma3QfklA0FTA4n6S3lGEXXWMzT75K-k/edit", - targets: [], - calldatas: [], - title: "(Invalid) EGP16-1: Unwind GSC Treasury", - sentenceSummary: - "This PR follows on from the approved snapshot proposal to unwind the GSC and main treasury, currently living in a gnosis safe, transferring the unwound assets to the main treasury.", - paragraphSummary: - "The GSC treasury is a gnosis safe currently containing 24 different assets in balancer pools. These assets came from protocol fees traded on the Element protocol. In order to unwind the assets, the LP positions are withdrawn from the Balancer pools. After withdrawal, principal tokens are redeemed through the Element protocol. Once redeemed, the base assets are transferred and consolidated to the main treasury.", - }, - 1: { - descriptionURL: - "https://docs.google.com/document/d/17tR4ZjibQyfAma3QfklA0FTA4n6S3lGEXXWMzT75K-k/edit", - targets: [], - calldatas: [], - title: "EGP16-1: Unwind GSC Treasury", - sentenceSummary: - "This PR follows on from the approved snapshot proposal to unwind the GSC and main treasury, currently living in a gnosis safe, transferring the unwound assets to the main treasury.", - paragraphSummary: - "The GSC treasury is a gnosis safe currently containing 24 different assets in balancer pools. These assets came from protocol fees traded on the Element protocol. In order to unwind the assets, the LP positions are withdrawn from the Balancer pools. After withdrawal, principal tokens are redeemed through the Element protocol. Once redeemed, the base assets are transferred and consolidated to the main treasury.", - }, - 2: { - descriptionURL: - "https://docs.google.com/document/d/17tR4ZjibQyfAma3QfklA0FTA4n6S3lGEXXWMzT75K-k/edit", - targets: [], - calldatas: [], - title: "EGP-16: GSC-1", - sentenceSummary: - "Revised proposal to unwind the GSC treasury, transferring the unwound assets to the main treasury.", - paragraphSummary: - "The GSC treasury is a gnosis safe currently containing 24 different assets in balancer pools. These assets came from protocol fees traded on the Element protocol. In order to unwind the assets, the LP positions are withdrawn from the Balancer pools. After withdrawal, principal tokens are redeemed through the Element protocol. Once redeemed, the base assets are transferred and consolidated to the main treasury.", - }, - 3: { - descriptionURL: - "https://docs.google.com/document/d/17tR4ZjibQyfAma3QfklA0FTA4n6S3lGEXXWMzT75K-k/edit", - targets: [], - calldatas: [], - title: "EGP-16: GSC-2", - sentenceSummary: - "Revised proposal to unwind the GSC treasury, transferring the unwound assets to the main treasury.", - paragraphSummary: - "The GSC treasury is a gnosis safe currently containing 24 different assets in balancer pools. These assets came from protocol fees traded on the Element protocol. In order to unwind the assets, the LP positions are withdrawn from the Balancer pools. After withdrawal, principal tokens are redeemed through the Element protocol. Once redeemed, the base assets are transferred and consolidated to the main treasury.", - }, - 4: { - descriptionURL: - "https://docs.google.com/document/d/17tR4ZjibQyfAma3QfklA0FTA4n6S3lGEXXWMzT75K-k/edit", - targets: [], - calldatas: [], - title: "EGP-16: GSC-3", - sentenceSummary: - "Revised proposal to unwind the GSC treasury, transferring the unwound assets to the main treasury.", - paragraphSummary: - "The GSC treasury is a gnosis safe currently containing 24 different assets in balancer pools. These assets came from protocol fees traded on the Element protocol. In order to unwind the assets, the LP positions are withdrawn from the Balancer pools. After withdrawal, principal tokens are redeemed through the Element protocol. Once redeemed, the base assets are transferred and consolidated to the main treasury.", - }, - 5: { - descriptionURL: - "https://docs.google.com/document/d/17tR4ZjibQyfAma3QfklA0FTA4n6S3lGEXXWMzT75K-k/edit", - targets: [], - calldatas: [], - title: "EGP-16: GSC-4", - sentenceSummary: - "Revised proposal to unwind the GSC treasury, transferring the unwound assets to the main treasury.", - paragraphSummary: - "The GSC treasury is a gnosis safe currently containing 24 different assets in balancer pools. These assets came from protocol fees traded on the Element protocol. In order to unwind the assets, the LP positions are withdrawn from the Balancer pools. After withdrawal, principal tokens are redeemed through the Element protocol. Once redeemed, the base assets are transferred and consolidated to the main treasury.", - }, - }, + ], + proposals: {}, }, +} as const satisfies CouncilConfig; - /** - * Optional Push integration - */ - push: { - channel: "0x349da2A6825284E9E181D46D664b95aecE86da56", - env: "prod", - }, -}; +// 0x1e53bea57dd5dda7bff1a1180a2f64a5c9e222f5 +// 0x27f7785b17c6b4d034094a1b16bc928bd697f386 +// 0x341a7b4200000000000000000000000027f7785b17c6b4d034094a1b16bc928bd697f3860000000000000000000000000000000000000000000000000000000000000001 diff --git a/apps/council-ui/src/config/CouncilConfig.ts b/apps/council-ui/src/config/types.ts similarity index 81% rename from apps/council-ui/src/config/CouncilConfig.ts rename to apps/council-ui/src/config/types.ts index 7c6df908..0e31b583 100644 --- a/apps/council-ui/src/config/CouncilConfig.ts +++ b/apps/council-ui/src/config/types.ts @@ -1,3 +1,4 @@ +import { Address } from "@delvtech/drift"; import { ENV } from "@pushprotocol/restapi/src/lib/constants"; export interface CouncilConfig { @@ -10,9 +11,9 @@ export interface CouncilConfig { * The chain id where the contracts are deployed */ chainId: number; - timelock: ContractConfig; - coreVoting: CoreVotingContractConfig; + coreVoting: VotingContractConfig; gscVoting?: GscVotingContractConfig; + timelock?: ContractConfig; airdrop?: AirdropConfig; /** @@ -23,21 +24,23 @@ export interface CouncilConfig { } export interface ContractConfig { - address: `0x${string}`; + address: Address; } -export interface BaseVotingContractConfig extends ContractConfig { +export interface VotingContractConfig extends ContractConfig { name: string; descriptionURL: string; - proposals: Record; -} - -export interface CoreVotingContractConfig extends BaseVotingContractConfig { + proposals: { + [proposalId: string]: ProposalConfig; + }; vaults: VaultConfig[]; } -export interface GscVotingContractConfig extends BaseVotingContractConfig { - vault: VaultConfig; +/** + * A GSC Voting Contract with a single vault for membership. + */ +export interface GscVotingContractConfig extends VotingContractConfig { + vaults: [VaultConfig & { type: "GSCVault" }]; } export interface VaultConfig extends ContractConfig { @@ -46,7 +49,7 @@ export interface VaultConfig extends ContractConfig { | "FrozenLockingVault" | "VestingVault" | "GSCVault" - | string; + | (string & {}); name: string; /** * A short one-liner to show below the vault name. diff --git a/apps/council-ui/src/config/utils/getCouncilConfig.ts b/apps/council-ui/src/config/utils/getCouncilConfig.ts new file mode 100644 index 00000000..41499d61 --- /dev/null +++ b/apps/council-ui/src/config/utils/getCouncilConfig.ts @@ -0,0 +1,10 @@ +import { councilConfigs, SupportedChainId } from "src/config/council.config"; +import { CouncilConfig } from "src/config/types"; + +export function getCouncilConfig(chainId: SupportedChainId) { + return councilConfigs.find( + (config) => config.chainId === chainId, + // Safe to cast since the `SupportedChainId` type only includes configured + // chain IDs. + ) as CouncilConfig; +} diff --git a/apps/council-ui/src/config/utils/getGscVaultConfig.ts b/apps/council-ui/src/config/utils/getGscVaultConfig.ts new file mode 100644 index 00000000..972ec895 --- /dev/null +++ b/apps/council-ui/src/config/utils/getGscVaultConfig.ts @@ -0,0 +1,26 @@ +import { SupportedChainId } from "src/config/council.config"; +import { VaultConfig } from "src/config/types"; +import { getCouncilConfig } from "src/config/utils/getCouncilConfig"; + +export function getGscVaultConfig({ + chainId, +}: { + chainId: SupportedChainId; +}): ExtendedGscVaultConfig | undefined { + const { gscVoting } = getCouncilConfig(chainId); + const vaultConfig = gscVoting?.vaults[0]; + if (vaultConfig) { + return { + ...vaultConfig, + chainId, + type: "GSCVault", + isGsc: true, + }; + } +} + +export type ExtendedGscVaultConfig = VaultConfig & { + chainId: SupportedChainId; + type: "GSCVault"; + isGsc: true; +}; diff --git a/apps/council-ui/src/config/utils/getProposalConfig.ts b/apps/council-ui/src/config/utils/getProposalConfig.ts new file mode 100644 index 00000000..596f5f22 --- /dev/null +++ b/apps/council-ui/src/config/utils/getProposalConfig.ts @@ -0,0 +1,37 @@ +import { Address } from "@delvtech/drift"; +import { SupportedChainId } from "src/config/council.config"; +import { ProposalConfig } from "src/config/types"; +import { getVotingContractConfig } from "src/config/utils/getVotingContractConfig"; + +export function getProposalConfig({ + chainId, + votingContract, + id, +}: { + chainId: SupportedChainId; + votingContract: Address; + id: bigint; +}): ExtendedProposalConfig | undefined { + const votingContractConfig = getVotingContractConfig({ + chainId, + address: votingContract, + }); + + if (!votingContractConfig) { + return; + } + + const foundProposal = votingContractConfig.proposals[id.toString()]; + if (foundProposal) { + return { + ...foundProposal, + votingContract, + chainId, + }; + } +} + +export type ExtendedProposalConfig = ProposalConfig & { + votingContract: Address; + chainId: SupportedChainId; +}; diff --git a/apps/council-ui/src/config/utils/getVaultConfig.ts b/apps/council-ui/src/config/utils/getVaultConfig.ts new file mode 100644 index 00000000..54284127 --- /dev/null +++ b/apps/council-ui/src/config/utils/getVaultConfig.ts @@ -0,0 +1,40 @@ +import { Address } from "@delvtech/drift"; +import { SupportedChainId } from "src/config/council.config"; +import { VaultConfig } from "src/config/types"; +import { getCouncilConfig } from "src/config/utils/getCouncilConfig"; + +export function getVaultConfig({ + address, + chainId, +}: { + address: Address; + chainId: SupportedChainId; +}): ExtendedVaultConfig | undefined { + const { coreVoting, gscVoting } = getCouncilConfig(chainId); + + if (address === gscVoting?.vaults[0].address) { + return { + ...gscVoting.vaults[0], + isGsc: true, + chainId, + }; + } + + const foundCoreVotingVault = coreVoting.vaults.find( + (vault) => vault.address === address, + ); + if (foundCoreVotingVault) { + return ( + foundCoreVotingVault && { + ...foundCoreVotingVault, + isGsc: false, + chainId, + } + ); + } +} + +export type ExtendedVaultConfig = VaultConfig & { + chainId: SupportedChainId; + isGsc: boolean; +}; diff --git a/apps/council-ui/src/config/utils/getVotingContractConfig.ts b/apps/council-ui/src/config/utils/getVotingContractConfig.ts new file mode 100644 index 00000000..08e609b3 --- /dev/null +++ b/apps/council-ui/src/config/utils/getVotingContractConfig.ts @@ -0,0 +1,38 @@ +import { Address } from "@delvtech/drift"; +import { SupportedChainId } from "src/config/council.config"; +import { + GscVotingContractConfig, + VotingContractConfig, +} from "src/config/types"; +import { getCouncilConfig } from "src/config/utils/getCouncilConfig"; + +export function getVotingContractConfig({ + chainId, + address, +}: { + chainId: SupportedChainId; + address: Address; +}): ExtendedVotingContractConfig | undefined { + const { coreVoting, gscVoting } = getCouncilConfig(chainId); + if (coreVoting.address === address) { + return { + ...coreVoting, + isGsc: false, + chainId, + }; + } + if (gscVoting?.address === address) { + return { + ...gscVoting, + isGsc: true, + chainId, + }; + } +} + +export type ExtendedVotingContractConfig = ( + | (VotingContractConfig & { isGsc: false }) + | (GscVotingContractConfig & { isGsc: true }) +) & { + chainId: SupportedChainId; +}; diff --git a/apps/council-ui/src/lib/councilSdk.ts b/apps/council-ui/src/lib/councilSdk.ts deleted file mode 100644 index aa14c4b6..00000000 --- a/apps/council-ui/src/lib/councilSdk.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { createLruSimpleCache } from "@delvtech/council-viem"; - -export const sdkCache = createLruSimpleCache({ max: 500 }); diff --git a/apps/council-ui/src/lib/drift.ts b/apps/council-ui/src/lib/drift.ts new file mode 100644 index 00000000..655b5a02 --- /dev/null +++ b/apps/council-ui/src/lib/drift.ts @@ -0,0 +1,21 @@ +import { createDrift, LruStore } from "@delvtech/drift"; +import { viemAdapter } from "@delvtech/drift-viem"; +import { getPublicClient, GetPublicClientParameters } from "@wagmi/core"; +import { wagmiConfig } from "src/lib/wagmi"; + +// 1 minute TTL to match the queryClient's staleTime +export const driftStore = new LruStore({ max: 500, ttl: 60_000 }); + +export function getDrift(params?: GetPublicClientParameters) { + const publicClient = getPublicClient(wagmiConfig, params); + + if (!publicClient) { + throw new Error("No public client found"); + } + + return createDrift({ + adapter: viemAdapter({ publicClient }), + store: driftStore, + chainId: publicClient.chain.id, + }); +} diff --git a/apps/council-ui/src/lib/rainbowKit.ts b/apps/council-ui/src/lib/rainbowKit.ts deleted file mode 100644 index 7c73990f..00000000 --- a/apps/council-ui/src/lib/rainbowKit.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { getDefaultConfig } from "@rainbow-me/rainbowkit"; -import { - injectedWallet, - metaMaskWallet, - rainbowWallet, - safeWallet, - walletConnectWallet, -} from "@rainbow-me/rainbowkit/wallets"; -import { chains, transports } from "src/lib/wagmi"; - -const walletConnectId = process.env.NEXT_PUBLIC_WALLET_CONNECT_PROJECT_ID; -const wallets = [injectedWallet, safeWallet, rainbowWallet, metaMaskWallet]; - -// WalletConnect -if (walletConnectId) { - wallets.push(walletConnectWallet); -} else if (process.env.NODE_ENV === "development") { - console.warn( - "Missing WalletConnect project ID. Set the NEXT_PUBLIC_WALLET_CONNECT_PROJECT_ID variable in your environment to use WalletConnect.", - ); -} - -export const wagmiConfig = getDefaultConfig({ - appName: "Council", - projectId: walletConnectId || "0", - chains: chains as any, - transports, - wallets: [ - { - groupName: "Wallets", - wallets, - }, - ], -}); diff --git a/apps/council-ui/src/lib/reactQuery.ts b/apps/council-ui/src/lib/reactQuery.ts index c5cd083a..a870f894 100644 --- a/apps/council-ui/src/lib/reactQuery.ts +++ b/apps/council-ui/src/lib/reactQuery.ts @@ -1,3 +1,10 @@ import { QueryClient } from "@tanstack/react-query"; -export const reactQueryClient = new QueryClient(); +export const queryClient = new QueryClient({ + defaultOptions: { + queries: { + retry: false, + staleTime: 60_000, + }, + }, +}); diff --git a/apps/council-ui/src/lib/wagmi.ts b/apps/council-ui/src/lib/wagmi.ts index c63d227e..e0e9b009 100644 --- a/apps/council-ui/src/lib/wagmi.ts +++ b/apps/council-ui/src/lib/wagmi.ts @@ -1,23 +1,90 @@ -import { councilConfigs } from "src/config/council.config"; +import { getDefaultConfig } from "@rainbow-me/rainbowkit"; +import { + injectedWallet, + metaMaskWallet, + rainbowWallet, + safeWallet, + walletConnectWallet, +} from "@rainbow-me/rainbowkit/wallets"; +import { SupportedChainId } from "src/config/council.config"; +import { HttpTransport } from "viem"; import { http } from "wagmi"; -import { goerli, hardhat, localhost, mainnet } from "wagmi/chains"; +import { anvil, Chain, goerli, mainnet } from "wagmi/chains"; -const configuredChainIds = Object.keys(councilConfigs); +export const chains: { + [ChainId in SupportedChainId]: Chain & { id: ChainId }; +} = { + 1: mainnet, + 5: goerli, + 31337: anvil, +}; -const allChains = [mainnet, goerli, hardhat, localhost]; -const rpcUrlsByChainId: Record = { - 1: process.env.NEXT_PUBLIC_MAINNET_RPC_URL, - 5: process.env.NEXT_PUBLIC_GOERLI_RPC_URL, - 1337: process.env.NEXT_PUBLIC_LOCAL_RPC_URL, - 31337: process.env.NEXT_PUBLIC_LOCAL_RPC_URL, +export const transports: Record = { + 1: http(process.env.NEXT_PUBLIC_MAINNET_RPC_URL), + 5: http(process.env.NEXT_PUBLIC_GOERLI_RPC_URL), + 31337: http(process.env.NEXT_PUBLIC_LOCAL_RPC_URL), }; -export const chains = Object.values(allChains).filter(({ id }) => - configuredChainIds.includes(String(id)), -); +const wallets = [injectedWallet, safeWallet, rainbowWallet, metaMaskWallet]; +const walletConnectId = process.env.NEXT_PUBLIC_WALLET_CONNECT_PROJECT_ID; + +if (walletConnectId) { + wallets.push(walletConnectWallet); +} else if (process.env.NODE_ENV === "development") { + console.warn( + "Missing WalletConnect project ID. Set the NEXT_PUBLIC_WALLET_CONNECT_PROJECT_ID variable in your environment to use WalletConnect.", + ); +} + +export const wagmiConfig = getDefaultConfig({ + appName: "Council", + projectId: walletConnectId || "0", + chains: Object.values(chains) as [Chain, ...Chain[]], + transports, + wallets: [ + { + groupName: "Wallets", + wallets, + }, + ], +}); + +declare module "wagmi" { + interface Register { + config: typeof wagmiConfig; + } +} + +import { BaseError as BaseViemError, DecodeErrorResultReturnType } from "viem"; + +/** + * Parses an viem/wagmi error to get a displayable string + * @param error - error object + * @returns parsed error string + */ +export function parseError({ error }: { error: any }): string { + let message: string = error.message ?? "An unknown error occurred"; + if (error instanceof BaseViemError) { + if (error.details) { + message = error.details; + } else if (error.shortMessage) { + message = error.shortMessage; + const cause = error.cause as + | { data?: DecodeErrorResultReturnType } + | undefined; + // if its not generic error, append custom error name and its args to message + if (cause?.data && cause.data?.errorName !== "Error") { + const customErrorArgs = cause.data.args?.toString() ?? ""; + message = `${message.replace(/reverted\.$/, "reverted with following reason:")}\n${ + cause.data.errorName + }(${customErrorArgs})`; + } + } else if (error.message) { + message = error.message; + } else if (error.name) { + message = error.name; + } + } -export const transports = Object.fromEntries( - chains.map(({ id }) => { - return [id, http(rpcUrlsByChainId[id])]; - }), -); + return message; +} diff --git a/apps/council-ui/pages/404.tsx b/apps/council-ui/src/pages/404.tsx similarity index 100% rename from apps/council-ui/pages/404.tsx rename to apps/council-ui/src/pages/404.tsx diff --git a/apps/council-ui/pages/_app.tsx b/apps/council-ui/src/pages/_app.tsx similarity index 92% rename from apps/council-ui/pages/_app.tsx rename to apps/council-ui/src/pages/_app.tsx index 2a7f0605..b92b8f08 100644 --- a/apps/council-ui/pages/_app.tsx +++ b/apps/council-ui/src/pages/_app.tsx @@ -10,7 +10,7 @@ import "react-loading-skeleton/dist/skeleton.css"; // https://nextjs.org/docs/messages/react-hydration-error errors // In production the app will be build using next export which is client-side rendering based. // Although for the development server we have to turn off SSR manually. -const DynamicApp = dynamic(() => import("../src/ui/app"), { +const DynamicApp = dynamic(() => import("../ui/app"), { ssr: false, }); diff --git a/apps/council-ui/pages/airdrop/index.tsx b/apps/council-ui/src/pages/airdrop/index.tsx similarity index 92% rename from apps/council-ui/pages/airdrop/index.tsx rename to apps/council-ui/src/pages/airdrop/index.tsx index 658c830a..2e69041d 100644 --- a/apps/council-ui/pages/airdrop/index.tsx +++ b/apps/council-ui/src/pages/airdrop/index.tsx @@ -6,11 +6,11 @@ import ConfirmClaimStep from "src/ui/airdrop/ConfirmClaimStep"; import ConfirmDepositStep from "src/ui/airdrop/ConfirmDepositStep"; import DepositOrClaimStep from "src/ui/airdrop/DepositOrClaimStep"; import DepositStep from "src/ui/airdrop/DepositStep"; -import { useAirdropVault } from "src/ui/airdrop/hooks/useAirdropLockingVault"; +import { useAirdropVault } from "src/ui/airdrop/hooks/useAirdropVault"; import { useClaimAirdrop } from "src/ui/airdrop/hooks/useClaimAirdrop"; import { useClaimAndDelegateAirdrop } from "src/ui/airdrop/hooks/useClaimAndDelegateAirdrop"; import { useClaimableAirdropAmount } from "src/ui/airdrop/hooks/useClaimableAirdropAmount"; -import useRouterSteps from "src/ui/router/hooks/useRouterSteps"; +import useRouterSteps from "src/ui/router/useRouterSteps"; import { useDelegate } from "src/ui/vaults/lockingVault/hooks/useDelegate"; import { zeroAddress } from "viem"; import { useAccount } from "wagmi"; @@ -32,13 +32,12 @@ export default function AirdropPage(): ReactElement { const [delegateAddress, setDelegateAddress] = useState(); // Determine if the user needs to choose a delegate - const { airdropVault } = useAirdropVault(); - const { delegate: currentDelegate } = useDelegate({ - account: recipientAddress as `0x${string}`, - vault: airdropVault, + const { data: airdropVault } = useAirdropVault(); + const { data: currentDelegate } = useDelegate({ + voter: recipientAddress as `0x${string}`, + vault: airdropVault?.address, }); - const needsDelegate = - currentDelegate && currentDelegate.address === zeroAddress; + const needsDelegate = currentDelegate === zeroAddress; // Set the recipient and delegate addresses to the connected wallet if they // haven't been set yet @@ -48,7 +47,7 @@ export default function AirdropPage(): ReactElement { setDelegateAddress((previousValue) => previousValue || account.address); }, [account.address]); - const { claimableAmount } = useClaimableAirdropAmount(); + const { data: claimableAmount } = useClaimableAirdropAmount(); const { claimAirdrop } = useClaimAirdrop(); const { claimAndDelegateAirdrop } = useClaimAndDelegateAirdrop(); @@ -114,7 +113,7 @@ export default function AirdropPage(): ReactElement { claimAndDelegateAirdrop ? () => claimAndDelegateAirdrop({ - recipient: recipientAddress as `0x${string}`, + destination: recipientAddress as `0x${string}`, delegate: delegateAddress as `0x${string}`, }) : undefined diff --git a/apps/council-ui/pages/api/airdrop/[address].ts b/apps/council-ui/src/pages/api/airdrop/[address].ts similarity index 100% rename from apps/council-ui/pages/api/airdrop/[address].ts rename to apps/council-ui/src/pages/api/airdrop/[address].ts diff --git a/apps/council-ui/pages/api/airdrop/sample-merkle-rewards-tree.json b/apps/council-ui/src/pages/api/airdrop/sample-merkle-rewards-tree.json similarity index 100% rename from apps/council-ui/pages/api/airdrop/sample-merkle-rewards-tree.json rename to apps/council-ui/src/pages/api/airdrop/sample-merkle-rewards-tree.json diff --git a/apps/council-ui/pages/index.tsx b/apps/council-ui/src/pages/index.tsx similarity index 100% rename from apps/council-ui/pages/index.tsx rename to apps/council-ui/src/pages/index.tsx diff --git a/apps/council-ui/pages/profile/index.tsx b/apps/council-ui/src/pages/profile/index.tsx similarity index 100% rename from apps/council-ui/pages/profile/index.tsx rename to apps/council-ui/src/pages/profile/index.tsx diff --git a/apps/council-ui/pages/proposals/details.tsx b/apps/council-ui/src/pages/proposals/details.tsx similarity index 50% rename from apps/council-ui/pages/proposals/details.tsx rename to apps/council-ui/src/pages/proposals/details.tsx index bc093a77..2c956203 100644 --- a/apps/council-ui/pages/proposals/details.tsx +++ b/apps/council-ui/src/pages/proposals/details.tsx @@ -1,68 +1,59 @@ -import { Ballot, ReadVote } from "@delvtech/council-viem"; +import { ProposalStatus, Vote } from "@delvtech/council-js"; +import { Address, Hash, Transaction } from "@delvtech/drift"; import { QueryStatus, useQuery } from "@tanstack/react-query"; import { useRouter } from "next/router"; import { ReactElement, useMemo, useState } from "react"; import Skeleton from "react-loading-skeleton"; +import { getVotingContractConfig } from "src/config/utils/getVotingContractConfig"; import { Routes } from "src/routes"; import { Breadcrumbs } from "src/ui/base/Breadcrumbs"; import { Page } from "src/ui/base/Page"; import ExternalLink from "src/ui/base/links/ExternalLink"; -import { getBlockDate } from "src/ui/base/utils/getBlockDate"; -import { useCouncilConfig } from "src/ui/config/hooks/useCouncilConfig"; -import { useReadCoreVoting } from "src/ui/council/hooks/useReadCoreVoting"; -import { useReadGscVoting } from "src/ui/council/hooks/useReadGscVoting"; +import { useReadCouncil } from "src/ui/council/useReadCouncil"; +import { useSupportedChainId } from "src/ui/network/useSupportedChainId"; import { ProposalStatsRow } from "src/ui/proposals/ProposalStatsRow/ProposalStatsRow"; import { ProposalStatsRowSkeleton } from "src/ui/proposals/ProposalStatsRow/ProposalStatsRowSkeleton"; import { Quorum } from "src/ui/proposals/Quorum/Quorum"; import { QuorumBarSkeleton } from "src/ui/proposals/Quorum/QuorumSkeleton"; import { VotingActivityTable } from "src/ui/proposals/VotingActivityTable/VotingActivityTable"; import { VotingActivityTableSkeleton } from "src/ui/proposals/VotingActivityTable/VotingActivityTableSkeleton"; -import { useReadProposal } from "src/ui/proposals/hooks/useReadProposal"; import { useGscMembers } from "src/ui/vaults/gscVault/hooks/useGscMembers"; import { GSCOnlyToggle } from "src/ui/voters/GscOnlyToggle"; import { ProposalVoting } from "src/ui/voting/ProposalVoting"; import { ProposalVotingSkeleton } from "src/ui/voting/ProposalVotingSkeleton"; import { EnsRecords, getBulkEnsRecords } from "src/utils/getBulkEnsRecords"; -import { ProposalStatus, getProposalStatus } from "src/utils/getProposalStatus"; -import { useAccount, usePublicClient } from "wagmi"; -export default function ProposalPage(): ReactElement { +export default function ProposalPage(): ReactElement | null { const { query, replace } = useRouter(); - const { id: idParam, votingContract: votingContractAddressParam } = query; - - const id = BigInt((idParam as string) || 0); - const votingContractAddress = votingContractAddressParam as `0x${string}`; - - const account = useAccount(); - - const coreVoting = useReadCoreVoting(); - const gscVoting = useReadGscVoting(); - const usedCoreVoting = - votingContractAddress === gscVoting?.address ? gscVoting : coreVoting; + const votingContractAddress = query.votingContract as Address; + const id = BigInt((query.id as string) || 0); const { data, status } = useProposalDetailsPageData( votingContractAddress, id, - account.address, ); + const { gscMembers } = useGscMembers(); - // voting activity filtering + // filter votes by GSC members const [gscOnly, setGscOnly] = useState(false); const filteredVotes = useMemo(() => { if (data?.votes && gscOnly && gscMembers) { - return dedupeVotes(data.votes).filter(({ voter }) => - gscMembers.some((member) => member.address === voter.address), + return dedupeVotes(data.votes)?.filter(({ voter }) => + gscMembers.includes(voter), ); } return dedupeVotes(data?.votes); }, [data, gscOnly, gscMembers]); - // Redirect to proposals page if the voting contract is not found. - if (!usedCoreVoting) { + const votingContractConfig = getVotingContractConfig({ + chainId: useSupportedChainId(), + address: votingContractAddress, + }); + + if (!votingContractConfig) { replace("/proposals"); - // Returning empty fragment is to remove the undefined type from the query params. - return <>; + return null; } const proposalTitle = data?.title ?? `Proposal ${id}`; @@ -110,14 +101,15 @@ export default function ProposalPage(): ReactElement { {data ? ( @@ -155,7 +147,7 @@ export default function ProposalPage(): ReactElement { voterEnsRecords={data.voterEnsRecords} // The GSC voting contract does not count voting power, you either // can or cannot vote and the voting power will always be 1 wei. - showVotingPower={!data.isGsc} + showVotingPower={!votingContractConfig.isGsc} /> ) : ( @@ -167,9 +159,8 @@ export default function ProposalPage(): ReactElement { {data ? ( ) : ( @@ -181,124 +172,98 @@ export default function ProposalPage(): ReactElement { } interface ProposalDetailsPageData { - proposalExists: boolean; - isGsc: boolean; status: ProposalStatus; - isActive: boolean; - votes?: ReadVote[]; + votes?: Vote[]; voterEnsRecords: EnsRecords; - createdAtBlock: bigint; currentQuorum: bigint; - createdTransactionHash?: `0x${string}`; - votingContractName?: string; + createTransactionHash?: Hash; requiredQuorum?: bigint; - createdBy?: `0x${string}`; - createdAtDate?: Date; - endsAtDate?: Date; - unlockedAtDate?: Date; - lastCallDate?: Date; - accountBallot?: Ballot; + createdBy?: Address; + votingEndsBlock?: bigint; + unlockBlock?: bigint; + lastCallBlock?: bigint; descriptionURL?: string; title?: string; paragraphSummary?: string; - executedTransactionHash?: `0x${string}`; + executeTransactionHash?: Hash; } function useProposalDetailsPageData( - coreVotingAddress?: `0x${string}`, + coreVotingAddress?: Address, id?: bigint, - account?: `0x${string}`, ): { - // proposalExists: boolean; data: ProposalDetailsPageData | undefined; status: QueryStatus; } { - const gscVoting = useReadGscVoting(); - const config = useCouncilConfig(); - const client = usePublicClient(); - const { proposal } = useReadProposal({ - id, - coreVoting: coreVotingAddress, - }); - - const isGsc = coreVotingAddress === gscVoting?.address; - const votingConfig = isGsc ? config.gscVoting : config.coreVoting; - const votingContractName = votingConfig?.name; - - const enabled = !!proposal; + const chainId = useSupportedChainId(); + const council = useReadCouncil(); + const enabled = !!council && !!coreVotingAddress && id !== undefined; const { data, status } = useQuery({ - queryKey: ["proposalDetailsPage", coreVotingAddress, String(proposal?.id)], + queryKey: [ + "proposalDetailsPage", + coreVotingAddress, + id?.toString(), + chainId, + ], enabled, queryFn: enabled ? async (): Promise => { - const createdTransaction = await proposal.getCreatedTransaction(); - const createdAtDate = proposal.created - ? await getBlockDate(proposal.created, client) - : undefined; - - const endsAtDate = proposal.expiration - ? await getBlockDate(proposal.expiration, client) - : undefined; + const coreVoting = council.coreVoting(coreVotingAddress); + const proposal = await coreVoting.getProposal(id); + const [ + // Status + status, + votes, + results, - const unlockedAtBlock = await proposal.getUnlockBlock(); - const unlockedAtDate = unlockedAtBlock - ? await getBlockDate(unlockedAtBlock, client) - : undefined; + // Events + createEvents, + executedEvents, + ] = await Promise.all([ + // Status + proposal.status ?? coreVoting.getProposalStatus(id), + coreVoting.getVotes({ proposalId: id }), + coreVoting.getProposalVotingPower(id), - const lastCallBlock = await proposal.getLastCallBlock(); - const lastCallDate = lastCallBlock - ? await getBlockDate(lastCallBlock, client) - : undefined; + // Events + coreVoting.getProposalCreations(), + proposal.status === "executed" + ? coreVoting.getProposalExecutions() + : undefined, + ]); - const votes = await proposal.getVotes(); - const voterEnsRecords = await getBulkEnsRecords( - Array.from(new Set(votes?.map(({ voter }) => voter.address))), - client, + const createEvent = createEvents.find( + ({ proposalId }) => proposalId === id, ); + let createTransaction: Transaction | undefined = undefined; + if (createEvent) { + createTransaction = await council.drift.getTransaction({ + hash: createEvent.transactionHash, + }); + } - const isExecuted = await proposal.getIsExecuted(); - const currentQuorum = await proposal.getCurrentQuorum(); - const requiredQuorum = await proposal.getRequiredQuorum(); - const results = await proposal.getResults(); - const isActive = await proposal.getIsActive(); - const createdBy = await proposal.getCreatedBy(); - - const accountBallot = account - ? (await proposal.getVote({ account }))?.ballot - : undefined; + const executedEvent = executedEvents?.find( + ({ proposalId }) => proposalId === id, + ); - const proposalConfig = votingConfig?.proposals[String(id)]; - const executedTransaction = await proposal.getExecutedTransaction(); + const voterEnsRecords = await getBulkEnsRecords( + Array.from(new Set(votes?.map(({ voter }) => voter))), + chainId, + ); return { - proposalExists: !!proposal, - isGsc, - votingContractName, - status: getProposalStatus({ - isExecuted, - lastCallDate, - currentQuorum, - requiredQuorum, - results, - }), - isActive: isActive ?? false, - currentQuorum, - requiredQuorum, - createdAtBlock: proposal.created, - createdBy: createdBy?.address, - createdAtDate, - endsAtDate, - unlockedAtDate, - lastCallDate, + unlockBlock: proposal.unlockBlock, + votingEndsBlock: proposal.expirationBlock, + lastCallBlock: proposal.lastCallBlock, + status, votes, voterEnsRecords, - createdTransactionHash: createdTransaction?.hash, - accountBallot, - descriptionURL: proposalConfig?.descriptionURL, - paragraphSummary: proposalConfig?.paragraphSummary, - title: proposalConfig?.title, - executedTransactionHash: executedTransaction?.hash, + currentQuorum: results.total, + requiredQuorum: proposal.requiredQuorum, + createdBy: createTransaction?.from, + createTransactionHash: createEvent?.transactionHash, + executeTransactionHash: executedEvent?.transactionHash, }; // return "ProposalDetailsPageData"; } @@ -313,18 +278,13 @@ function useProposalDetailsPageData( } /** - * Dedupe a list of votes by only keeping the latest instance. + * Dedupe a list of votes by only keeping the latest instance of each voter. */ -// TODO: This function breaks the build when only the generic signature is used. -// The overload signature fixes the build and maintains a strong return type. -function dedupeVotes(votes: T): T; -function dedupeVotes(votes: ReadVote[] | undefined): ReadVote[] | undefined { - if (!votes) { - return votes; - } - const byVoterAddress: Record = {}; +function dedupeVotes(votes: Vote[] | undefined): Vote[] | undefined { + if (!votes) return; + const voteMap = new Map(); for (const vote of votes) { - byVoterAddress[vote.voter.address] = vote; + voteMap.set(vote.voter, vote); } - return Object.values(byVoterAddress); + return Array.from(voteMap.values()); } diff --git a/apps/council-ui/pages/proposals/index.tsx b/apps/council-ui/src/pages/proposals/index.tsx similarity index 51% rename from apps/council-ui/pages/proposals/index.tsx rename to apps/council-ui/src/pages/proposals/index.tsx index 2aa54a2b..dd123b86 100644 --- a/apps/council-ui/pages/proposals/index.tsx +++ b/apps/council-ui/src/pages/proposals/index.tsx @@ -1,20 +1,19 @@ import { useQuery, UseQueryResult } from "@tanstack/react-query"; import assertNever from "assert-never"; import { ReactElement } from "react"; +import { getProposalConfig } from "src/config/utils/getProposalConfig"; import { ExternalInfoCard } from "src/ui/base/information/ExternalInfoCard"; import { Page } from "src/ui/base/Page"; import { getBlockDate } from "src/ui/base/utils/getBlockDate"; -import { useCouncilConfig } from "src/ui/config/hooks/useCouncilConfig"; -import { useReadCoreVoting } from "src/ui/council/hooks/useReadCoreVoting"; -import { useReadGscVoting } from "src/ui/council/hooks/useReadGscVoting"; -import { useSupportedChainId } from "src/ui/network/hooks/useSupportedChainId"; +import { useCouncilConfig } from "src/ui/config/useCouncilConfig"; +import { useReadCouncil } from "src/ui/council/useReadCouncil"; +import { useSupportedChainId } from "src/ui/network/useSupportedChainId"; import { ProposalRowData, ProposalsTable, } from "src/ui/proposals/ProposalTable/ProposalsTable"; import { ProposalsTableSkeleton } from "src/ui/proposals/ProposalTable/ProposalsTableSkeleton"; -import { getProposalStatus } from "src/utils/getProposalStatus"; -import { useAccount, usePublicClient } from "wagmi"; +import { useAccount } from "wagmi"; export default function ProposalsPage(): ReactElement { const { address } = useAccount(); @@ -72,70 +71,64 @@ export default function ProposalsPage(): ReactElement { function useProposalsPageData( account: `0x${string}` | undefined, ): UseQueryResult { - const coreVoting = useReadCoreVoting(); - const gscVoting = useReadGscVoting(); const chainId = useSupportedChainId(); const config = useCouncilConfig(); - const client = usePublicClient(); + const council = useReadCouncil(); + const enabled = !!council; return useQuery({ queryKey: ["proposalsPage", account, chainId], - queryFn: async (): Promise => { - let allProposals = await coreVoting.getProposals(); - - if (gscVoting) { - const gscProposals = await gscVoting.getProposals(); - allProposals = [...allProposals, ...gscProposals]; - } - - return await Promise.all( - allProposals.map(async (proposal) => { - const vote = account - ? await proposal.getVote({ account }) - : undefined; - - const currentQuorum = await proposal.getCurrentQuorum(); - - const requiredQuorum = await proposal.getRequiredQuorum(); - const isExecuted = await proposal.getIsExecuted(); - const results = await proposal.getResults(); - - const lastCall = await proposal.getLastCallBlock(); - const lastCallDate = lastCall - ? await getBlockDate(lastCall, client) + enabled, + queryFn: enabled + ? async (): Promise => { + const generalVoting = council.coreVoting(config.coreVoting.address); + const gscVoting = config.gscVoting + ? council.coreVoting(config.gscVoting.address) : undefined; - const createdDate = await getBlockDate(proposal.created, client); - const votingEnds = await getBlockDate(proposal.expiration, client); - - const status = getProposalStatus({ - isExecuted, - currentQuorum, - lastCallDate, - requiredQuorum, - results, - }); - - const isGsc = proposal.coreVoting.address === gscVoting?.address; - const proposalConfig = isGsc - ? config.gscVoting?.proposals[String(proposal.id)] - : config.coreVoting.proposals[String(proposal.id)]; - - const result: ProposalRowData = { - status, - coreVotingAddress: proposal.coreVoting.address, - votingContractName: proposal.coreVoting.name, - id: proposal.id, - created: createdDate, - votingEnds, - currentQuorum, - ballot: vote && vote.power > BigInt(0) ? vote.ballot : undefined, - sentenceSummary: proposalConfig?.sentenceSummary, - title: proposalConfig?.title, - }; - return result; - }), - ); - }, + const [generalProposals, gscProposals] = await Promise.all([ + generalVoting.getProposalCreations(), + gscVoting?.getProposalCreations(), + ]); + + const allProposals = generalProposals.concat(gscProposals || []); + + return await Promise.all( + allProposals.map( + async ({ coreVotingAddress, proposalId, expirationBlock }) => { + const proposalConfig = getProposalConfig({ + votingContract: coreVotingAddress, + id: proposalId, + chainId, + }); + + const votingContract = council.coreVoting(coreVotingAddress); + const [votingEnds, status, vote] = await Promise.all([ + getBlockDate(expirationBlock, chainId), + votingContract.getProposalStatus(proposalId), + account + ? await votingContract.getVote({ + proposalId: proposalId, + voter: account, + }) + : undefined, + ]); + + const result: ProposalRowData = { + id: proposalId, + title: proposalConfig?.title, + sentenceSummary: proposalConfig?.sentenceSummary, + status, + ballot: vote?.votingPower ? vote.ballot : undefined, + votingEnds, + votingContract, + }; + + return result; + }, + ), + ); + } + : undefined, }); } diff --git a/apps/council-ui/pages/vaults/details.tsx b/apps/council-ui/src/pages/vaults/details.tsx similarity index 82% rename from apps/council-ui/pages/vaults/details.tsx rename to apps/council-ui/src/pages/vaults/details.tsx index 5e2aa48b..3fed185d 100644 --- a/apps/council-ui/pages/vaults/details.tsx +++ b/apps/council-ui/src/pages/vaults/details.tsx @@ -1,10 +1,11 @@ import { useRouter } from "next/router"; import { ReactElement } from "react"; +import { getVaultConfig } from "src/config/utils/getVaultConfig"; import { Page } from "src/ui/base/Page"; -import { useVaultConfig } from "src/ui/config/hooks/useVaultConfig"; +import { useSupportedChainId } from "src/ui/network/useSupportedChainId"; import { FrozenLockingVaultDetails } from "src/ui/vaults/frozenLockingVault/FrozenLockingVaultDetails"; import { GenericVaultDetails } from "src/ui/vaults/genericVault/GenericVaultDetails"; -import { GscVaultDetails } from "src/ui/vaults/gscVault/GSCVaultDetails"; +import { GscVaultDetails } from "src/ui/vaults/gscVault/GscVaultDetails"; import { LockingVaultDetails } from "src/ui/vaults/lockingVault/LockingVaultDetails"; import { VestingVaultDetails } from "src/ui/vaults/vestingVault/VestingVaultDetails"; // import { VestingVaultDetails } from"src/ui/vaults/vestingVault/VestingVaultDetails"; @@ -12,8 +13,8 @@ import { VestingVaultDetails } from "src/ui/vaults/vestingVault/VestingVaultDeta export default function VaultPage(): ReactElement { const { query, replace } = useRouter(); const address = query.address as `0x${string}` | undefined; - - const vaultConfig = useVaultConfig(address); + const chainId = useSupportedChainId(); + const vaultConfig = address && getVaultConfig({ address, chainId }); if (!address || !vaultConfig) { replace("/vaults"); diff --git a/apps/council-ui/pages/vaults/index.tsx b/apps/council-ui/src/pages/vaults/index.tsx similarity index 55% rename from apps/council-ui/pages/vaults/index.tsx rename to apps/council-ui/src/pages/vaults/index.tsx index 7e9fc60c..3a57a3b1 100644 --- a/apps/council-ui/pages/vaults/index.tsx +++ b/apps/council-ui/src/pages/vaults/index.tsx @@ -1,21 +1,22 @@ -import { ReadLockingVault, ReadVestingVault } from "@delvtech/council-viem"; import { useQuery, UseQueryResult } from "@tanstack/react-query"; import { ReactElement } from "react"; import { ExternalInfoCard } from "src/ui/base/information/ExternalInfoCard"; import { Page } from "src/ui/base/Page"; -import { useCouncilConfig } from "src/ui/config/hooks/useCouncilConfig"; -import { useReadCoreVoting } from "src/ui/council/hooks/useReadCoreVoting"; -import { useReadGscVoting } from "src/ui/council/hooks/useReadGscVoting"; +import { useCouncilConfig } from "src/ui/config/useCouncilConfig"; +import { useReadCouncil } from "src/ui/council/useReadCouncil"; +import { useSupportedChainId } from "src/ui/network/useSupportedChainId"; import { GenericVaultCard, GenericVaultCardSkeleton, } from "src/ui/vaults/GenericVaultCard"; -import { GSCVaultPreviewCard } from "src/ui/vaults/gscVault/GscVaultPreviewCard"; +import { GscVaultPreviewCard } from "src/ui/vaults/gscVault/GscVaultPreviewCard"; +import { getVotingPower } from "src/utils/vaults/getVotingPower"; import { useAccount } from "wagmi"; export default function VaultsPage(): ReactElement { const { address } = useAccount(); - const { data, status } = useVaultsPageData(address); + const { data, status, error } = useVaultsPageData(address); + console.log({ data, status, error }); return ( @@ -35,7 +36,7 @@ export default function VaultsPage(): ReactElement { switch (vault.name) { case "GSC Vault": return ( - @@ -84,60 +85,71 @@ export default function VaultsPage(): ReactElement { interface VaultData { address: `0x${string}`; name: string; - tvp: bigint | undefined; - votingPower: bigint | undefined; - sentenceSummary: string | undefined; + tvp?: bigint; + votingPower?: bigint; + sentenceSummary?: string; } function useVaultsPageData( account: `0x${string}` | undefined, ): UseQueryResult { - const coreVoting = useReadCoreVoting(); - const gscVoting = useReadGscVoting(); + const chainId = useSupportedChainId(); + const council = useReadCouncil(); const config = useCouncilConfig(); + const enabled = !!council; return useQuery({ queryKey: ["vaultsPage", account], - queryFn: async (): Promise => { - const data: VaultData[] = []; + enabled, + queryFn: enabled + ? async (): Promise => { + const vaultDataRequests: Promise[] = + config.coreVoting.vaults.map( + async ({ address, name, type, sentenceSummary }) => { + let tvp: bigint | Promise = 0n; + switch (type) { + case "LockingVault": + case "FrozenLockingVault": + tvp = council.lockingVault(address).getTotalVotingPower(); + break; + case "VestingVault": + tvp = council.vestingVault(address).getTotalVotingPower(); + break; + } - // core voting vaults - for (const vault of coreVoting.vaults) { - const vaultConfig = config.coreVoting.vaults.find( - ({ address }) => address === vault.address, - ); + let accountVotingPower = account + ? getVotingPower({ + chainId, + vault: address, + voter: account, + }) + : 0n; - let tvp: bigint | undefined = undefined; - if ( - vault instanceof ReadLockingVault || - vault instanceof ReadVestingVault - ) { - tvp = await vault.getTotalVotingPower(); - } + return Promise.all([tvp, accountVotingPower]).then( + ([tvp, votingPower]) => ({ + address, + name, + tvp, + votingPower, + sentenceSummary, + }), + ); + }, + ); - data.push({ - address: vault.address, - name: vaultConfig?.name || vault.name, - tvp, - votingPower: account && (await vault.getVotingPower({ account })), - sentenceSummary: vaultConfig?.sentenceSummary, - }); - } + if (config.gscVoting) { + const vaultConfig = config.gscVoting.vaults[0]; + vaultDataRequests.push( + Promise.resolve({ + address: vaultConfig.address, + name: vaultConfig.name, + sentenceSummary: vaultConfig.sentenceSummary, + }), + ); + } - // gsc vault - if (gscVoting) { - for (const vault of gscVoting.vaults) { - data.push({ - address: vault.address, - name: config.gscVoting!.vault.name, - tvp: undefined, - votingPower: account && (await vault.getVotingPower({ account })), - sentenceSummary: config.gscVoting!.vault.sentenceSummary, - }); + return Promise.all(vaultDataRequests); } - } - - return data; - }, + : undefined, }); } diff --git a/apps/council-ui/pages/voters/details.tsx b/apps/council-ui/src/pages/voters/details.tsx similarity index 55% rename from apps/council-ui/pages/voters/details.tsx rename to apps/council-ui/src/pages/voters/details.tsx index f13b18f8..cc586235 100644 --- a/apps/council-ui/pages/voters/details.tsx +++ b/apps/council-ui/src/pages/voters/details.tsx @@ -1,4 +1,5 @@ -import { ReadVote, ReadVotingVault } from "@delvtech/council-viem"; +import { Vote } from "@delvtech/council-js"; +import { fixed } from "@delvtech/fixed-point-wasm"; import { useQuery, UseQueryResult } from "@tanstack/react-query"; import { useRouter } from "next/router"; import { ReactElement } from "react"; @@ -8,11 +9,10 @@ import { Breadcrumbs } from "src/ui/base/Breadcrumbs"; import { ErrorMessage } from "src/ui/base/error/ErrorMessage"; import { useDisplayName } from "src/ui/base/formatting/useDisplayName"; import { Page } from "src/ui/base/Page"; -import { asyncFilter } from "src/ui/base/utils/asyncFilter"; -import { useReadCoreVoting } from "src/ui/council/hooks/useReadCoreVoting"; +import { useCouncilConfig } from "src/ui/config/useCouncilConfig"; +import { useReadCouncil } from "src/ui/council/useReadCouncil"; import { AddressWithEtherscan } from "src/ui/ens/AdddressWithEtherscan"; -import { useSupportedChainId } from "src/ui/network/hooks/useSupportedChainId"; -import { useGscStatus } from "src/ui/vaults/gscVault/hooks/useGscStatus"; +import { useSupportedChainId } from "src/ui/network/useSupportedChainId"; import { VoterStatsRowSkeleton } from "src/ui/voters/skeletons/VoterStatsRowSkeleton"; import { VoterStatsRow } from "src/ui/voters/VoterStatsRow"; import { VoterVaultsList } from "src/ui/voters/VoterVaultsList"; @@ -20,16 +20,19 @@ import { VoterVaultsListSkeleton } from "src/ui/voters/VoterVaultsListSkeleton"; import { VotingHistoryTableSkeleton } from "src/ui/voters/VotingHistorySkeleton"; import { VotingHistoryTable } from "src/ui/voters/VotingHistoryTable"; import { makeEtherscanAddressURL } from "src/utils/etherscan/makeEtherscanAddressURL"; -import { GscStatus } from "src/utils/gscVault/types"; +import { getTotalVotingPower } from "src/utils/vaults/getTotalVotingPower"; +import { getVotingPower } from "src/utils/vaults/getVotingPower"; +import { getGscStatus } from "src/utils/vaults/gsc/getGscStatus"; +import { GscStatus } from "src/utils/vaults/gsc/types"; import { getAddress } from "viem"; -import { useEnsName } from "wagmi"; +import { useEnsName, usePublicClient } from "wagmi"; export default function VoterPage(): ReactElement { const { query } = useRouter(); const { address: account } = query as { address: `0x${string}` | undefined }; - const coreVoting = useReadCoreVoting(); - const { data, status } = useVoterData(account); + const { data, status, error } = useVoterData(account); const displayName = useDisplayName(account); + const config = useCouncilConfig(); if (!account) { return ( @@ -38,7 +41,7 @@ export default function VoterPage(): ReactElement { } const numVotingVaults = - coreVoting.vaults.length + + config.coreVoting.vaults.length + (["Member", "Idle"].includes(data?.gscStatus as string) ? 1 : 0); return ( @@ -57,7 +60,7 @@ export default function VoterPage(): ReactElement { proposalsCreated={data.proposalsCreated} proposalsVoted={data.votingHistory.length} votingPower={data.votingPower} - percentOfTVP={data.percentOfTVP} + percentOfTVP={data.percentOfTvp} /> ) : ( @@ -85,7 +88,10 @@ export default function VoterPage(): ReactElement { {status === "success" ? (
- +
) : ( @@ -142,68 +148,99 @@ function VoterHeader({ address }: VoterHeaderProps) { interface VoterData { gscStatus: GscStatus | undefined; proposalsCreated: number; - votingHistory: ReadVote[]; + votingHistory: Vote[]; votingPower: bigint; - percentOfTVP: number; + percentOfTvp: number; } export function useVoterData( account: `0x${string}` | undefined, ): UseQueryResult { - const coreVoting = useReadCoreVoting(); - const { gscStatus } = useGscStatus(account); + const chainId = useSupportedChainId(); + const council = useReadCouncil(); + const config = useCouncilConfig(); + const publicClient = usePublicClient(); + const enabled = !!account && !!council && !!publicClient; - const queryEnabled = !!account && !!gscStatus; return useQuery({ - queryKey: ["voter-details", account, gscStatus], - enabled: queryEnabled, - queryFn: queryEnabled + queryKey: ["voter-details", chainId, account], + refetchOnWindowFocus: false, + enabled, + queryFn: enabled ? async (): Promise => { - // display voting history in reverse chronological order, ie: most - // recent proposals first - // TODO: Where does GSC Voting history fit in this? - const votingHistory = [ - ...(await coreVoting.getVotes({ account })), - ].reverse(); - - const votingPower = await coreVoting.getVotingPower({ account }); + const coreVoting = council.coreVoting(config.coreVoting.address); + const voterData: VoterData = { + gscStatus: undefined, + proposalsCreated: 0, + votingHistory: [], + votingPower: 0n, + percentOfTvp: 0, + }; let tvp = 0n; + // Single list of promises to be awaited in parallel. This allows viem + // to batch the requests. + const promises: Promise[] = []; + + promises.push( + // GSC status + (async () => { + voterData.gscStatus = await getGscStatus({ + account, + chainId, + }); + })(), + + // Votes + (async () => { + const votes = await coreVoting.getVotes({ voter: account }); + voterData.votingHistory = votes.reverse(); + })(), + ); - for (const vault of coreVoting.vaults) { - if (hasTotalVotingPower(vault)) { - tvp += await vault.getTotalVotingPower(); - } + // Proposals created + const coreVotingProposals = await coreVoting.getProposalCreations(); + for (const { transactionHash } of coreVotingProposals) { + promises.push( + (async () => { + const createTransaction = await council.drift.getTransaction({ + hash: transactionHash, + }); + if (createTransaction.from === account) { + voterData.proposalsCreated++; + } + })(), + ); } - const coreVotingProposals = await coreVoting.getProposals(); - const proposalsCreatedByAddress = await asyncFilter( - coreVotingProposals, - async (proposal) => { - const createdBy = await proposal.getCreatedBy(); - return createdBy?.address === account; - }, - ); + // Voting power and TVP + for (const vault of config.coreVoting.vaults) { + promises.push( + (async () => { + const vaultVotingPower = await getVotingPower({ + chainId, + vault: vault.address, + voter: account, + }); + voterData.votingPower += vaultVotingPower; + })(), + (async () => { + const vaultTvp = await getTotalVotingPower({ vault, council }); + if (vaultTvp) { + tvp += vaultTvp; + } + })(), + ); + } - return { - votingHistory, - votingPower, - percentOfTVP: +((Number(votingPower) / Number(tvp)) * 100).toFixed( - 1, - ), - gscStatus, - proposalsCreated: proposalsCreatedByAddress.length, - }; + await Promise.all(promises); + + voterData.percentOfTvp = fixed(voterData.votingPower) + .div(tvp) + .mul(100, 0) + .toNumber(); + + return voterData; } : undefined, - refetchOnWindowFocus: false, }); } - -function hasTotalVotingPower( - vault: ReadVotingVault, -): vault is ReadVotingVault & { getTotalVotingPower: () => Promise } { - return ( - "getTotalVotingPower" in vault && - typeof vault.getTotalVotingPower === "function" - ); -} diff --git a/apps/council-ui/src/pages/voters/index.tsx b/apps/council-ui/src/pages/voters/index.tsx new file mode 100644 index 00000000..ae39ef3e --- /dev/null +++ b/apps/council-ui/src/pages/voters/index.tsx @@ -0,0 +1,136 @@ +import { + mergeVotingPowerBreakdowns, + VotingPowerBreakdown, +} from "@delvtech/council-js"; +import { Address } from "@delvtech/drift"; +import { useQuery, UseQueryResult } from "@tanstack/react-query"; +import { ReactElement, useMemo, useState } from "react"; +import { ErrorMessage } from "src/ui/base/error/ErrorMessage"; +import { Page } from "src/ui/base/Page"; +import { useCouncilConfig } from "src/ui/config/useCouncilConfig"; +import { useReadCouncil } from "src/ui/council/useReadCouncil"; +import { useSupportedChainId } from "src/ui/network/useSupportedChainId"; +import { GSCOnlyToggle } from "src/ui/voters/GscOnlyToggle"; +import { useSearchVoters } from "src/ui/voters/hooks/useVotersSearch"; +import { VoterRowData } from "src/ui/voters/types"; +import { VoterList } from "src/ui/voters/VoterList/VoterList"; +import { VoterListSkeleton } from "src/ui/voters/VoterList/VoterListSkeleton"; +import { getBulkEnsRecords } from "src/utils/getBulkEnsRecords"; + +const DEFAULT_LIST_SIZE = 100; + +export default function VotersPage(): ReactElement { + const { data: voters, status, error } = useVoterPageData(); + const { results, search } = useSearchVoters(voters); + const [listSize, setListSize] = useState(DEFAULT_LIST_SIZE); + const [gscOnly, setGscOnly] = useState(false); + + const filteredResults = useMemo(() => { + if (gscOnly) { + return results.filter(({ isGSCMember }) => isGSCMember); + } + return results; + }, [gscOnly, results]); + + if (status === "error") { + return ; + } + + return ( + +
+
+

Voters

+

+ Voters are accounts that currently have voting power. You can search + by partial keywords using ENS names or addresses. +

+
+ +
+ search(e.target.value as string)} + disabled={status !== "success"} + /> + +
+ + {status === "success" ? ( + setListSize(newSize)} + /> + ) : ( + + )} +
+
+ ); +} + +export function useVoterPageData(): UseQueryResult { + const chainId = useSupportedChainId(); + const config = useCouncilConfig(); + const council = useReadCouncil(); + const enabled = !!council; + + return useQuery({ + queryKey: ["voter-list-page", chainId], + // This is an expensive query and do not want to refetch. + refetchOnWindowFocus: false, + staleTime: Infinity, + enabled, + queryFn: enabled + ? async () => { + const powerBreakdownPromises: Promise[] = []; + + for (const { address, type } of config.coreVoting.vaults) { + switch (type) { + case "LockingVault": + case "FrozenLockingVault": + powerBreakdownPromises.push( + council.lockingVault(address).getVotingPowerBreakdown(), + ); + case "VestingVault": + powerBreakdownPromises.push( + council.vestingVault(address).getVotingPowerBreakdown(), + ); + } + } + + const powerBreakdowns = await Promise.all(powerBreakdownPromises); + const mergedBreakdowns = mergeVotingPowerBreakdowns( + powerBreakdowns.flat(), + ); + const ensRecords = await getBulkEnsRecords( + mergedBreakdowns.map(({ voter }) => voter), + chainId, + ); + + let gscMembers: Address[] | undefined; + if (config.gscVoting) { + const { address } = config.gscVoting.vaults[0]; + gscMembers = await council.gscVault(address).getMembers(); + } + + return mergedBreakdowns.map(({ voter, votingPower, delegators }) => { + return { + address: voter, + ensName: ensRecords[voter], + votingPower, + numberOfDelegators: delegators.length, + isGSCMember: gscMembers?.includes(voter), + }; + }); + } + : undefined, + }); +} diff --git a/apps/council-ui/src/styles/globals.css b/apps/council-ui/src/styles/globals.css index b5c61c95..bd6213e1 100644 --- a/apps/council-ui/src/styles/globals.css +++ b/apps/council-ui/src/styles/globals.css @@ -1,3 +1,3 @@ @tailwind base; @tailwind components; -@tailwind utilities; +@tailwind utilities; \ No newline at end of file diff --git a/apps/council-ui/src/ui/airdrop/ConfirmClaimStep.tsx b/apps/council-ui/src/ui/airdrop/ConfirmClaimStep.tsx index beae3757..ef0a8434 100644 --- a/apps/council-ui/src/ui/airdrop/ConfirmClaimStep.tsx +++ b/apps/council-ui/src/ui/airdrop/ConfirmClaimStep.tsx @@ -3,7 +3,7 @@ import { ReactElement } from "react"; import Skeleton from "react-loading-skeleton"; import { formatBalance } from "src/ui/base/formatting/formatBalance"; import { useDisplayName } from "src/ui/base/formatting/useDisplayName"; -import { useTokenSymbol } from "src/ui/token/hooks/useTokenSymbol"; +import { useTokenSymbol } from "src/ui/token/useTokenSymbol"; import { useAirdropToken } from "./hooks/useAirdropToken"; import { useClaimableAirdropAmount } from "./hooks/useClaimableAirdropAmount"; @@ -18,9 +18,9 @@ export default function ConfirmClaimStep({ onBack, onConfirm, }: ConfirmClaimStepProps): ReactElement { - const { claimableAmountFormatted } = useClaimableAirdropAmount(); - const { airdropToken } = useAirdropToken(); - const { symbol } = useTokenSymbol(airdropToken?.address); + const { data: claimableAmountFormatted } = useClaimableAirdropAmount(); + const { data: airdropToken } = useAirdropToken(); + const { data: symbol } = useTokenSymbol(airdropToken?.address); const displayName = useDisplayName(recipient); return ( @@ -38,7 +38,7 @@ export default function ConfirmClaimStep({
To
-
{displayName}
+
{displayName}
diff --git a/apps/council-ui/src/ui/airdrop/ConfirmDepositStep.tsx b/apps/council-ui/src/ui/airdrop/ConfirmDepositStep.tsx index e493c079..2cae15ac 100644 --- a/apps/council-ui/src/ui/airdrop/ConfirmDepositStep.tsx +++ b/apps/council-ui/src/ui/airdrop/ConfirmDepositStep.tsx @@ -3,7 +3,7 @@ import { ReactElement } from "react"; import Skeleton from "react-loading-skeleton"; import { formatBalance } from "src/ui/base/formatting/formatBalance"; import { useDisplayName } from "src/ui/base/formatting/useDisplayName"; -import { useTokenSymbol } from "src/ui/token/hooks/useTokenSymbol"; +import { useTokenSymbol } from "src/ui/token/useTokenSymbol"; import { useAirdropToken } from "./hooks/useAirdropToken"; import { useClaimableAirdropAmount } from "./hooks/useClaimableAirdropAmount"; @@ -20,9 +20,9 @@ export default function ConfirmDepositStep({ onBack, onConfirm, }: ConfirmDepositStepProps): ReactElement { - const { claimableAmountFormatted } = useClaimableAirdropAmount(); - const { airdropToken } = useAirdropToken(); - const { symbol } = useTokenSymbol(airdropToken); + const { data: claimableAmountFormatted } = useClaimableAirdropAmount(); + const { data: airdropToken } = useAirdropToken(); + const { data: symbol } = useTokenSymbol(airdropToken?.address); const displayName = useDisplayName(account); const delegateDisplayName = useDisplayName(delegate); @@ -42,12 +42,12 @@ export default function ConfirmDepositStep({
Credited To
-
{displayName}
+
{displayName}
{delegate && (
Voting power delegated to
-
{delegateDisplayName}
+
{delegateDisplayName}
)} diff --git a/apps/council-ui/src/ui/airdrop/DepositOrClaimStep.tsx b/apps/council-ui/src/ui/airdrop/DepositOrClaimStep.tsx index ac5ddeef..c34f8dc0 100644 --- a/apps/council-ui/src/ui/airdrop/DepositOrClaimStep.tsx +++ b/apps/council-ui/src/ui/airdrop/DepositOrClaimStep.tsx @@ -5,7 +5,7 @@ import { useAirdropToken } from "src/ui/airdrop/hooks/useAirdropToken"; import { useClaimableAirdropAmount } from "src/ui/airdrop/hooks/useClaimableAirdropAmount"; import { formatBalance } from "src/ui/base/formatting/formatBalance"; import { AirdropIcon } from "src/ui/base/svg/24/AirdropIcon"; -import { useTokenSymbol } from "src/ui/token/hooks/useTokenSymbol"; +import { useTokenSymbol } from "src/ui/token/useTokenSymbol"; interface DepositOrClaimStepProps { onDeposit: (() => void) | undefined; @@ -16,9 +16,9 @@ export default function DepositOrClaimStep({ onDeposit, onClaim, }: DepositOrClaimStepProps): ReactElement { - const { claimableAmountFormatted } = useClaimableAirdropAmount(); - const { airdropToken } = useAirdropToken(); - const { symbol } = useTokenSymbol(airdropToken); + const { data: claimableAmountFormatted } = useClaimableAirdropAmount(); + const { data: airdropToken } = useAirdropToken(); + const { data: symbol } = useTokenSymbol(airdropToken?.address); return ( <> diff --git a/apps/council-ui/src/ui/airdrop/hooks/useAirdropData.ts b/apps/council-ui/src/ui/airdrop/hooks/useAirdropData.ts index 8ecf9bd2..833b6b0e 100644 --- a/apps/council-ui/src/ui/airdrop/hooks/useAirdropData.ts +++ b/apps/council-ui/src/ui/airdrop/hooks/useAirdropData.ts @@ -1,5 +1,5 @@ -import { QueryStatus, useQuery } from "@tanstack/react-query"; -import { useSupportedChainId } from "src/ui/network/hooks/useSupportedChainId"; +import { useQuery } from "@tanstack/react-query"; +import { SupportedChainId } from "src/config/council.config"; import { AirdropData, getAirdropData } from "src/utils/getAirdropData"; import { useAccount } from "wagmi"; @@ -7,28 +7,19 @@ import { useAccount } from "wagmi"; * Fetch the data needed to claim an airdrop for the connected wallet address. * If the address doesn't have an airdrop, `airdropData` will be `undefined`. */ -export function useAirdropData(): { - airdropData: AirdropData | undefined; - status: QueryStatus; -} { +export function useAirdropData({ + chainId, +}: { chainId?: SupportedChainId } = {}) { const { address } = useAccount(); - const chainId = useSupportedChainId(); - const enabled = !!address && !!chainId; - - const { data, status } = useQuery({ + return useQuery({ queryKey: ["useAirdropData", address, chainId], enabled, queryFn: enabled ? async () => { - const data = await getAirdropData(address, chainId); + const data = await getAirdropData({ account: address, chainId }); return data || null; } : undefined, }); - - return { - airdropData: data || undefined, - status, - }; } diff --git a/apps/council-ui/src/ui/airdrop/hooks/useAirdropLockingVault.ts b/apps/council-ui/src/ui/airdrop/hooks/useAirdropLockingVault.ts deleted file mode 100644 index 25ef47f3..00000000 --- a/apps/council-ui/src/ui/airdrop/hooks/useAirdropLockingVault.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { ReadLockingVault } from "@delvtech/council-viem"; -import { QueryStatus, useQuery } from "@tanstack/react-query"; -import { useReadAirdrop } from "src/ui/airdrop/hooks/useReadAirdrop"; - -/** - * Fetch the locking vault for the configured airdrop. - */ -export function useAirdropVault(): { - airdropVault: ReadLockingVault | undefined; - status: QueryStatus; -} { - const airdrop = useReadAirdrop(); - - const { data, status } = useQuery({ - queryKey: ["useAirdropLockingVault"], - enabled: !!airdrop, - queryFn: !!airdrop ? () => airdrop.getLockingVault() : undefined, - }); - - return { - airdropVault: data, - status, - }; -} diff --git a/apps/council-ui/src/ui/airdrop/hooks/useAirdropToken.ts b/apps/council-ui/src/ui/airdrop/hooks/useAirdropToken.ts index 7dbab790..8328ffac 100644 --- a/apps/council-ui/src/ui/airdrop/hooks/useAirdropToken.ts +++ b/apps/council-ui/src/ui/airdrop/hooks/useAirdropToken.ts @@ -1,24 +1,22 @@ -import { ReadToken } from "@delvtech/council-viem"; -import { QueryStatus, useQuery } from "@tanstack/react-query"; -import { useReadAirdrop } from "src/ui/airdrop/hooks/useReadAirdrop"; +import { useQuery } from "@tanstack/react-query"; +import { SupportedChainId } from "src/config/council.config"; +import { useCouncilConfig } from "src/ui/config/useCouncilConfig"; +import { useReadCouncil } from "src/ui/council/useReadCouncil"; /** * Fetch the token for the configured airdrop. */ -export function useAirdropToken(): { - airdropToken: ReadToken | undefined; - status: QueryStatus; -} { - const airdrop = useReadAirdrop(); - - const { data, status } = useQuery({ +export function useAirdropToken({ + chainId, +}: { chainId?: SupportedChainId } = {}) { + const { airdrop } = useCouncilConfig(chainId); + const council = useReadCouncil({ chainId }); + const enabled = !!airdrop && !!council; + return useQuery({ queryKey: ["airdropToken", airdrop?.address], - enabled: !!airdrop, - queryFn: !!airdrop ? () => airdrop.getToken() : undefined, + enabled, + queryFn: enabled + ? () => council.airdrop(airdrop.address).getToken() + : undefined, }); - - return { - airdropToken: data, - status, - }; } diff --git a/apps/council-ui/src/ui/airdrop/hooks/useAirdropVault.ts b/apps/council-ui/src/ui/airdrop/hooks/useAirdropVault.ts new file mode 100644 index 00000000..ea37b741 --- /dev/null +++ b/apps/council-ui/src/ui/airdrop/hooks/useAirdropVault.ts @@ -0,0 +1,22 @@ +import { useQuery } from "@tanstack/react-query"; +import { SupportedChainId } from "src/config/council.config"; +import { useCouncilConfig } from "src/ui/config/useCouncilConfig"; +import { useReadCouncil } from "src/ui/council/useReadCouncil"; + +/** + * Fetch the locking vault for the configured airdrop. + */ +export function useAirdropVault({ + chainId, +}: { chainId?: SupportedChainId } = {}) { + const { airdrop } = useCouncilConfig(chainId); + const council = useReadCouncil({ chainId }); + const enabled = !!airdrop && !!council; + return useQuery({ + queryKey: ["airdropVault", chainId], + enabled, + queryFn: !!enabled + ? () => council.airdrop(airdrop.address).getLockingVault() + : undefined, + }); +} diff --git a/apps/council-ui/src/ui/airdrop/hooks/useClaimAirdrop.ts b/apps/council-ui/src/ui/airdrop/hooks/useClaimAirdrop.ts index 3f9cce41..cfcf0270 100644 --- a/apps/council-ui/src/ui/airdrop/hooks/useClaimAirdrop.ts +++ b/apps/council-ui/src/ui/airdrop/hooks/useClaimAirdrop.ts @@ -1,6 +1,6 @@ import { MutationStatus } from "@tanstack/react-query"; import { useReadWriteAirdrop } from "src/ui/airdrop/hooks/useReadWriteAirdrop"; -import { useWrite } from "src/ui/contract/hooks/useWrite"; +import { useWrite } from "src/ui/contract/useWrite"; import { useAirdropData } from "./useAirdropData"; import { useClaimableAirdropAmount } from "./useClaimableAirdropAmount"; @@ -14,8 +14,8 @@ export function useClaimAirdrop(): { status: MutationStatus; } { const airdrop = useReadWriteAirdrop(); - const { airdropData } = useAirdropData(); - const { claimableAmount } = useClaimableAirdropAmount(); + const { data: airdropData } = useAirdropData(); + const { data: claimableAmount } = useClaimableAirdropAmount(); const enabled = !!airdrop && !!claimableAmount && !!airdropData; @@ -23,18 +23,18 @@ export function useClaimAirdrop(): { pendingMessage: "Claiming airdrop...", successMessage: "Airdrop claimed!", errorMessage: "Failed to claim airdrop.", - writeFn: ({ recipient }: ClaimOptions) => { - if (!enabled) { - throw new Error("No claimable airdrop found"); - } - - return airdrop.claim({ - amount: claimableAmount, - merkleProof: airdropData.proof, - recipient, - totalGrant: airdropData.amount, - }); - }, + writeFn: enabled + ? ({ recipient }: ClaimOptions) => { + return airdrop.claim({ + args: { + amount: claimableAmount, + merkleProof: airdropData.proof, + recipient, + totalGrant: airdropData.amount, + }, + }); + } + : undefined, }); return { diff --git a/apps/council-ui/src/ui/airdrop/hooks/useClaimAndDelegateAirdrop.ts b/apps/council-ui/src/ui/airdrop/hooks/useClaimAndDelegateAirdrop.ts index a5ccc04c..3db511e8 100644 --- a/apps/council-ui/src/ui/airdrop/hooks/useClaimAndDelegateAirdrop.ts +++ b/apps/council-ui/src/ui/airdrop/hooks/useClaimAndDelegateAirdrop.ts @@ -1,12 +1,12 @@ import { MutationStatus } from "@tanstack/react-query"; import { useReadWriteAirdrop } from "src/ui/airdrop/hooks/useReadWriteAirdrop"; -import { useWrite } from "src/ui/contract/hooks/useWrite"; +import { useWrite } from "src/ui/contract/useWrite"; import { useAirdropData } from "./useAirdropData"; import { useClaimableAirdropAmount } from "./useClaimableAirdropAmount"; interface ClaimAndDelegateOptions { delegate: `0x${string}`; - recipient: `0x${string}`; + destination: `0x${string}`; } export function useClaimAndDelegateAirdrop(): { @@ -17,8 +17,8 @@ export function useClaimAndDelegateAirdrop(): { status: MutationStatus; } { const airdrop = useReadWriteAirdrop(); - const { airdropData } = useAirdropData(); - const { claimableAmount } = useClaimableAirdropAmount(); + const { data: airdropData } = useAirdropData(); + const { data: claimableAmount } = useClaimableAirdropAmount(); const enabled = !!airdrop && !!claimableAmount && !!airdropData; @@ -26,19 +26,19 @@ export function useClaimAndDelegateAirdrop(): { pendingMessage: "Claiming and delegating airdrop...", successMessage: "Airdrop claimed and delegated!", errorMessage: "Failed to claim and delegate airdrop.", - writeFn: ({ delegate, recipient }: ClaimAndDelegateOptions) => { - if (!enabled) { - throw new Error("No claimable airdrop found"); - } - - return airdrop.claimAndDelegate({ - amount: claimableAmount, - delegate, - merkleProof: airdropData.proof, - recipient, - totalGrant: airdropData.amount, - }); - }, + writeFn: enabled + ? ({ delegate, destination }: ClaimAndDelegateOptions) => { + return airdrop.claimAndDelegate({ + args: { + amount: claimableAmount, + delegate, + merkleProof: airdropData.proof, + destination, + totalGrant: airdropData.amount, + }, + }); + } + : undefined, }); return { diff --git a/apps/council-ui/src/ui/airdrop/hooks/useClaimableAirdropAmount.ts b/apps/council-ui/src/ui/airdrop/hooks/useClaimableAirdropAmount.ts index 2944987a..5f26ea6b 100644 --- a/apps/council-ui/src/ui/airdrop/hooks/useClaimableAirdropAmount.ts +++ b/apps/council-ui/src/ui/airdrop/hooks/useClaimableAirdropAmount.ts @@ -1,55 +1,38 @@ -import { QueryStatus, useQuery } from "@tanstack/react-query"; -import { useReadAirdrop } from "src/ui/airdrop/hooks/useReadAirdrop"; -import { useTokenDecimals } from "src/ui/token/hooks/useTokenDecimals"; -import { formatUnits } from "viem"; +import { useQuery } from "@tanstack/react-query"; +import { SupportedChainId } from "src/config/council.config"; +import { useCouncilConfig } from "src/ui/config/useCouncilConfig"; +import { useReadCouncil } from "src/ui/council/useReadCouncil"; +import { useSupportedChainId } from "src/ui/network/useSupportedChainId"; import { useAccount } from "wagmi"; import { useAirdropData } from "./useAirdropData"; -import { useAirdropToken } from "./useAirdropToken"; /** * Fetch the amount that can still be claimed from the configured airdrop by the * connected wallet address. */ -export function useClaimableAirdropAmount(): { - claimableAmount: bigint; - claimableAmountFormatted: `${number}`; - status: QueryStatus; -} { - const airdrop = useReadAirdrop(); +export function useClaimableAirdropAmount({ + chainId, +}: { chainId?: SupportedChainId } = {}) { + chainId = useSupportedChainId(chainId); + const { airdrop } = useCouncilConfig(chainId); const { address: account } = useAccount(); - const { airdropData, status: dataStatus } = useAirdropData(); - const { airdropToken } = useAirdropToken(); - const { decimals } = useTokenDecimals(airdropToken); + const { data, status: dataStatus } = useAirdropData({ chainId }); + const council = useReadCouncil({ chainId }); - const enabled = !!airdrop && !!account && dataStatus === "success"; + const enabled = + !!council && !!data && !!airdrop && !!account && dataStatus === "success"; - const { data, status } = useQuery({ - queryKey: [ - "useClaimableAirdropAmount", - airdrop?.address, - account, - airdropData, - ], + return useQuery({ + queryKey: ["useClaimableAirdropAmount", airdrop?.address, account, chainId], enabled, - queryFn: enabled - ? async () => { - if (!airdropData || !airdropData.amount) { - return 0n; - } - const claimed = await airdrop.getClaimedAmount({ account }); - return airdropData.amount - claimed; - } - : undefined, + queryFn: async () => { + if (!enabled || !data.amount) { + return 0; + } + const claimed = await council + .airdrop(airdrop.address) + .getClaimedAmount(account); + return data.amount - claimed; + }, }); - - const claimableAmountFormatted = - data !== undefined && decimals !== undefined - ? formatUnits(data, decimals) - : "0"; - - return { - claimableAmount: data ?? 0n, - claimableAmountFormatted: claimableAmountFormatted as `${number}`, - status, - }; } diff --git a/apps/council-ui/src/ui/airdrop/hooks/useReadAirdrop.ts b/apps/council-ui/src/ui/airdrop/hooks/useReadAirdrop.ts index 776755a5..5e27fcff 100644 --- a/apps/council-ui/src/ui/airdrop/hooks/useReadAirdrop.ts +++ b/apps/council-ui/src/ui/airdrop/hooks/useReadAirdrop.ts @@ -1,17 +1,16 @@ -import { ReadAirdrop } from "@delvtech/council-viem"; import { useMemo } from "react"; -import { useCouncilConfig } from "src/ui/config/hooks/useCouncilConfig"; -import { useReadCouncil } from "src/ui/council/hooks/useReadCouncil"; +import { useCouncilConfig } from "src/ui/config/useCouncilConfig"; +import { useReadCouncil } from "src/ui/council/useReadCouncil"; /** * Use a ReadAirdrop instance for configured airdrop. */ -export function useReadAirdrop(): ReadAirdrop | undefined { +export function useReadAirdrop() { const { airdrop } = useCouncilConfig(); const council = useReadCouncil(); return useMemo( - () => airdrop && council.airdrop(airdrop.address), + () => airdrop && council?.airdrop(airdrop.address), [council, airdrop], ); } diff --git a/apps/council-ui/src/ui/airdrop/hooks/useReadWriteAirdrop.ts b/apps/council-ui/src/ui/airdrop/hooks/useReadWriteAirdrop.ts index fd46a082..540ce82e 100644 --- a/apps/council-ui/src/ui/airdrop/hooks/useReadWriteAirdrop.ts +++ b/apps/council-ui/src/ui/airdrop/hooks/useReadWriteAirdrop.ts @@ -1,14 +1,19 @@ -import { ReadWriteAirdrop } from "@delvtech/council-viem"; +import { ReadWriteAirdrop } from "@delvtech/council-js"; import { useMemo } from "react"; -import { useCouncilConfig } from "src/ui/config/hooks/useCouncilConfig"; -import { useReadWriteCouncil } from "src/ui/council/hooks/useReadWriteCouncil"; +import { SupportedChainId } from "src/config/council.config"; +import { useCouncilConfig } from "src/ui/config/useCouncilConfig"; +import { useReadWriteCouncil } from "src/ui/council/useReadWriteCouncil"; /** * Use a ReadWriteAirdrop instance for configured airdrop. */ -export function useReadWriteAirdrop(): ReadWriteAirdrop | undefined { - const { airdrop } = useCouncilConfig(); - const council = useReadWriteCouncil(); +export function useReadWriteAirdrop({ + chainId, +}: { + chainId?: SupportedChainId; +} = {}): ReadWriteAirdrop | undefined { + const { airdrop } = useCouncilConfig(chainId); + const council = useReadWriteCouncil({ chainId }); return useMemo( () => airdrop && council?.airdrop(airdrop.address), diff --git a/apps/council-ui/src/ui/app.tsx b/apps/council-ui/src/ui/app.tsx index 7b874579..02fe73f8 100644 --- a/apps/council-ui/src/ui/app.tsx +++ b/apps/council-ui/src/ui/app.tsx @@ -4,8 +4,8 @@ import type { AppProps } from "next/app"; import { ReactElement } from "react"; import { Toaster } from "react-hot-toast"; import { councilConfigs } from "src/config/council.config"; -import { wagmiConfig } from "src/lib/rainbowKit"; -import { reactQueryClient } from "src/lib/reactQuery"; +import { queryClient } from "src/lib/reactQuery"; +import { wagmiConfig } from "src/lib/wagmi"; import { Navigation } from "src/ui/navigation/Navigation"; import { WagmiProvider } from "wagmi"; @@ -14,7 +14,7 @@ console.log(councilConfigs); function App({ Component, pageProps }: AppProps): ReactElement { return ( - + diff --git a/apps/council-ui/src/ui/base/Stat.tsx b/apps/council-ui/src/ui/base/Stat.tsx index 9473ffb4..e8ddb7dc 100644 --- a/apps/council-ui/src/ui/base/Stat.tsx +++ b/apps/council-ui/src/ui/base/Stat.tsx @@ -1,18 +1,16 @@ import { ReactElement, ReactNode } from "react"; interface StatProps { - label: ReactNode; + label?: ReactNode; value: ReactNode; - - // TODO: Add `labelTooltip: string` if we ever need it } export function Stat({ label, value }: StatProps): ReactElement { return (
-
{label}
-
{value}
+ {label &&
{label}
} +
{value}
); diff --git a/apps/council-ui/src/ui/base/forms/Input.tsx b/apps/council-ui/src/ui/base/forms/Input.tsx index 62b1221d..bc8fccc8 100644 --- a/apps/council-ui/src/ui/base/forms/Input.tsx +++ b/apps/council-ui/src/ui/base/forms/Input.tsx @@ -1,10 +1,10 @@ -import { ReactElement, ReactNode } from "react"; +import { ChangeEvent, ReactElement, ReactNode } from "react"; export interface InputProps { disabled?: boolean; id?: string; infoText?: ReactNode; - onChange: (value: string) => void; + onChange: (value: string, event: ChangeEvent) => void; placeholder?: string; value: string | number; } @@ -18,19 +18,19 @@ export function Input({ value, }: InputProps): ReactElement { return ( -
+
onChange(target.value)} + onChange={(e) => onChange(e.target.value, e)} disabled={disabled} /> {infoText && ( diff --git a/apps/council-ui/src/ui/base/forms/NumericInput.tsx b/apps/council-ui/src/ui/base/forms/NumericInput.tsx index 78070ecb..7a53f40d 100644 --- a/apps/council-ui/src/ui/base/forms/NumericInput.tsx +++ b/apps/council-ui/src/ui/base/forms/NumericInput.tsx @@ -1,35 +1,57 @@ -import { ReactElement } from "react"; +import { Replace } from "@delvtech/drift"; +import { fixed, parseFixed } from "@delvtech/fixed-point-wasm"; +import { ReactElement, useState } from "react"; import { Input, InputProps } from "src/ui/base/forms/Input"; -export interface NumericInputProps extends InputProps { - maxButtonValue?: string | number; - decimals?: number; -} +export type NumericInputProps = Replace< + InputProps, + { + value: bigint; + onChange: (value: bigint) => void; + maxButtonValue?: bigint; + decimals?: number; + } +>; export function NumericInput({ value, onChange, - id, - infoText, - placeholder, + placeholder = "0.0", maxButtonValue, decimals, disabled, + ...rest }: NumericInputProps): ReactElement { + const [stringValue, setStringValue] = useState( + value > 0n ? fixed(value, decimals).format() : "", + ); + const fixedValue = parseFixed(stringValue, decimals); + const displayValue = + fixedValue.eq(value, decimals) && fixedValue.gte(0n) + ? stringValue + : fixed(value, decimals).format(); + return (
onChange(numberString(newValue, decimals))} - id={id} - infoText={infoText} + value={displayValue} + onChange={(newValue, e) => { + e.preventDefault(); + try { + const parsed = parseFixed(newValue, decimals); + if (parsed.gte(0n)) { + setStringValue(newValue); + onChange(parsed.bigint); + } + } catch {} + }} placeholder={placeholder} + {...rest} /> {typeof maxButtonValue !== "undefined" && ( + } + /> + ) : ( + unlockDate && + status === "active" && ( + + ) )} - {lastCallAtDate && status !== "EXECUTED" && ( + {lastCallDate && !["unknown", "failed", "executed"].includes(status) && ( )} diff --git a/apps/council-ui/src/ui/proposals/ProposalTable/ProposalsTable.tsx b/apps/council-ui/src/ui/proposals/ProposalTable/ProposalsTable.tsx index 604c2085..9dc6f8a5 100644 --- a/apps/council-ui/src/ui/proposals/ProposalTable/ProposalsTable.tsx +++ b/apps/council-ui/src/ui/proposals/ProposalTable/ProposalsTable.tsx @@ -1,4 +1,4 @@ -import { Ballot } from "@delvtech/council-viem"; +import { Ballot, ProposalStatus, ReadCoreVoting } from "@delvtech/council-js"; import { ChevronRightIcon } from "@heroicons/react/24/outline"; import classNames from "classnames"; import Link from "next/link"; @@ -9,20 +9,17 @@ import { SortOptions, SortableGridTable, } from "src/ui/base/tables/SortableGridTable"; +import { useCouncilConfig } from "src/ui/config/useCouncilConfig"; import { tooltipByStatus } from "src/ui/proposals/tooltips"; import FormattedBallot from "src/ui/voting/FormattedBallot"; import { formatTimeLeft } from "src/utils/formatTimeLeft"; -import { ProposalStatus } from "src/utils/getProposalStatus"; import { useAccount } from "wagmi"; export interface ProposalRowData { status: ProposalStatus; ballot: Ballot | undefined; - created: Date | undefined; - currentQuorum: bigint; id: bigint; - coreVotingAddress: `0x${string}`; - votingContractName: string; + votingContract: ReadCoreVoting; votingEnds: Date | undefined; sentenceSummary?: string; title?: string; @@ -34,6 +31,7 @@ interface ProposalsTableProps { export function ProposalsTable({ rowData }: ProposalsTableProps): ReactElement { const { address: account } = useAccount(); + const config = useCouncilConfig(); const [sortOptions, setSortOptions] = useState>({ direction: "DESC", key: "votingEnds", @@ -44,6 +42,11 @@ export function ProposalsTable({ rowData }: ProposalsTableProps): ReactElement { [sortOptions, rowData], ); + const contractNamesByAddress = { + [config.coreVoting.address]: config.coreVoting.name, + [config.gscVoting?.address || "0x"]: config.gscVoting?.name || "Unknown", + }; + return ( <> {/* Desktop */} @@ -67,46 +70,48 @@ export function ProposalsTable({ rowData }: ProposalsTableProps): ReactElement { ]} rows={sortedData.map( ({ - status, - ballot, id, - coreVotingAddress: votingContractAddress, - votingContractName, - votingEnds, - sentenceSummary, title, - }) => ({ - href: makeProposalURL(votingContractAddress, id), - cells: [ - - {title ?? `${votingContractName} Proposal ${id}`} - {sentenceSummary && ( -

- {sentenceSummary.length > 80 - ? `${sentenceSummary.slice(0, 80)}\u2026` // unicode for horizontal ellipses - : sentenceSummary} -

- )} -
, - - votingEnds ? formatTimeLeft(votingEnds) : unknown, - - , - - ballot ? ( - - ) : account ? ( - Not voted - ) : ( - Not connected - ), - - , - ], - }), + sentenceSummary, + status, + votingEnds, + ballot, + votingContract, + }) => { + return { + href: makeProposalURL(votingContract.address, id), + cells: [ + + {title ?? + `${contractNamesByAddress[votingContract.address]} Proposal ${id}`} + {sentenceSummary && ( +

+ {sentenceSummary.length > 80 + ? `${sentenceSummary.slice(0, 80)}\u2026` // unicode for horizontal ellipses + : sentenceSummary} +

+ )} +
, + + votingEnds ? formatTimeLeft(votingEnds) : unknown, + + , + + ballot ? ( + + ) : account ? ( + Not voted + ) : ( + Not connected + ), + + , + ], + }; + }, )} />
@@ -114,31 +119,24 @@ export function ProposalsTable({ rowData }: ProposalsTableProps): ReactElement { {/* Mobile */}
{!sortedData.length ? ( -
+

Nothing to show.

) : ( sortedData.map( ( - { - status, - ballot, - id, - coreVotingAddress: votingContractAddress, - votingContractName, - sentenceSummary, - title, - }, + { status, ballot, id, votingContract, sentenceSummary, title }, i, ) => (

- {title ?? `${votingContractName} Proposal ${id}`} + {title ?? + `${contractNamesByAddress[votingContract.address]} Proposal ${id}`}

{sentenceSummary && (

@@ -147,12 +145,12 @@ export function ProposalsTable({ rowData }: ProposalsTableProps): ReactElement { : sentenceSummary}

)} -
-
+
+
Status
-
+
Your Ballot {ballot ? ( @@ -179,29 +177,35 @@ function sortProposalRowData( { direction = "DESC", key = "votingEnds" }: SortOptions, data: ProposalRowData[], ) { - if (key === "status") { - if (direction === "ASC") { - return data.slice().sort((a, b) => (b.status >= a.status ? 1 : -1)); - } else { - return data.slice().sort((a, b) => (a.status >= b.status ? 1 : -1)); - } - } - // safe to assume the desired sort field is voting ends column - // since there are only two sortable columns. - else { - if (direction === "ASC") { - return data.slice().sort((a, b) => { - const aTime = a.votingEnds ? a.votingEnds.getTime() : 0; - const bTime = b.votingEnds ? b.votingEnds.getTime() : 0; - return aTime - bTime; - }); - } else { - return data.slice().sort((a, b) => { - const aTime = a.votingEnds ? a.votingEnds.getTime() : 0; - const bTime = b.votingEnds ? b.votingEnds.getTime() : 0; - return bTime - aTime; - }); - } + switch (key) { + case "status": + switch (direction) { + case "ASC": + return data.slice().sort((a, b) => (b.status >= a.status ? 1 : -1)); + + case "DESC": + return data.slice().sort((a, b) => (a.status >= b.status ? 1 : -1)); + } + + case "votingEnds": + switch (direction) { + case "ASC": + return data.slice().sort((a, b) => { + const aTime = a.votingEnds ? a.votingEnds.getTime() : 0; + const bTime = b.votingEnds ? b.votingEnds.getTime() : 0; + return aTime - bTime; + }); + + case "DESC": + return data.slice().sort((a, b) => { + const aTime = a.votingEnds ? a.votingEnds.getTime() : 0; + const bTime = b.votingEnds ? b.votingEnds.getTime() : 0; + return bTime - aTime; + }); + } + + default: + return data; } } @@ -210,10 +214,10 @@ function StatusBadge({ status }: { status: ProposalStatus }) {
{status} diff --git a/apps/council-ui/src/ui/proposals/Quorum/Quorum.tsx b/apps/council-ui/src/ui/proposals/Quorum/Quorum.tsx index b66faf05..0d8dffa4 100644 --- a/apps/council-ui/src/ui/proposals/Quorum/Quorum.tsx +++ b/apps/council-ui/src/ui/proposals/Quorum/Quorum.tsx @@ -1,9 +1,9 @@ +import { ProposalStatus } from "@delvtech/council-js"; import classNames from "classnames"; import { ReactElement } from "react"; import { Tooltip } from "src/ui/base/Tooltip"; import { formatVotingPower } from "src/ui/base/formatting/formatVotingPower"; import { tooltipByStatus } from "src/ui/proposals/tooltips"; -import { ProposalStatus } from "src/utils/getProposalStatus"; interface QuorumProps { current: bigint; @@ -23,10 +23,10 @@ export function Quorum({
{status} @@ -41,7 +41,7 @@ export function Quorum({ status={status} /> - {status === "EXECUTED" ? ( + {status === "executed" ? (

Quorum met

) : required ? (
@@ -67,7 +67,7 @@ function QuorumBar({ requiredQuorum, status, }: QuorumBarProps): ReactElement { - if (status === "EXECUTED") { + if (status === "executed") { return ( ; } return ( Unknown
; - } - - const yesPercent = (yes / resultsTotal) * 100n; - const maybePercent = (maybe / resultsTotal) * 100n; - - return ( - - - - - - ); -} diff --git a/apps/council-ui/src/ui/proposals/VotingActivityTable/VotingActivityTable.tsx b/apps/council-ui/src/ui/proposals/VotingActivityTable/VotingActivityTable.tsx index 95a2eec2..943725b1 100644 --- a/apps/council-ui/src/ui/proposals/VotingActivityTable/VotingActivityTable.tsx +++ b/apps/council-ui/src/ui/proposals/VotingActivityTable/VotingActivityTable.tsx @@ -1,4 +1,4 @@ -import { Ballot, ReadVote } from "@delvtech/council-viem"; +import { Ballot, Vote } from "@delvtech/council-js"; import { ReactElement, ReactNode, useMemo, useState } from "react"; import { makeVoterURL } from "src/routes"; import { formatVotingPower } from "src/ui/base/formatting/formatVotingPower"; @@ -14,7 +14,7 @@ import { EnsRecords } from "src/utils/getBulkEnsRecords"; type SortField = "votingPower" | "ballot"; interface VotingActivityTableProps { - votes: ReadVote[]; + votes: Vote[]; voterEnsRecords: EnsRecords; /** * Whether to show the voting power used by each voter. @@ -67,20 +67,20 @@ export function VotingActivityTable({ } onSort={setSortOptions} cols={cols} - rows={sortedData.map(({ voter, power, ballot }, i) => { + rows={sortedData.map(({ voter, votingPower, ballot }, i) => { const cells: ReactNode[] = [ , ]; if (showVotingPower) { - cells.push(formatVotingPower(power)); + cells.push(formatVotingPower(votingPower)); } cells.push(); return { - href: makeVoterURL(voter.address), + href: makeVoterURL(voter), cells, }; })} @@ -96,29 +96,26 @@ const ballotSortIndexes: Record = { no: 0, }; -function sortVotes( - { key, direction }: SortOptions, - data: ReadVote[], -) { +function sortVotes({ key, direction }: SortOptions, data: Vote[]) { switch (key) { case "votingPower": if (direction === "ASC") { - return data.slice().sort((a, b) => (a.power >= b.power ? 1 : -1)); - } - return data.slice().sort((a, b) => (b.power >= a.power ? 1 : -1)); - case "ballot": - if (direction === "ASC") { - return data - .slice() - .sort( - (a, b) => ballotSortIndexes[a.ballot] - ballotSortIndexes[b.ballot], - ); + return data.toSorted((a, b) => + a.votingPower >= b.votingPower ? 1 : -1, + ); } return data .slice() - .sort( - (a, b) => ballotSortIndexes[b.ballot] - ballotSortIndexes[a.ballot], + .sort((a, b) => (b.votingPower >= a.votingPower ? 1 : -1)); + case "ballot": + if (direction === "ASC") { + return data.toSorted( + (a, b) => ballotSortIndexes[a.ballot] - ballotSortIndexes[b.ballot], ); + } + return data.toSorted( + (a, b) => ballotSortIndexes[b.ballot] - ballotSortIndexes[a.ballot], + ); default: return data; } diff --git a/apps/council-ui/src/ui/proposals/hooks/useExecuteProposal.ts b/apps/council-ui/src/ui/proposals/hooks/useExecuteProposal.ts new file mode 100644 index 00000000..4c60c006 --- /dev/null +++ b/apps/council-ui/src/ui/proposals/hooks/useExecuteProposal.ts @@ -0,0 +1,32 @@ +import { Address } from "@delvtech/drift"; +import { SupportedChainId } from "src/config/council.config"; +import { useWrite } from "src/ui/contract/useWrite"; +import { useReadWriteCouncil } from "src/ui/council/useReadWriteCouncil"; + +export interface useExecuteProposalOptions { + votingContract: Address; + proposalId: bigint; + chainId?: SupportedChainId; +} + +export function useExecuteProposal({ + votingContract, + proposalId, + chainId, +}: useExecuteProposalOptions) { + const council = useReadWriteCouncil({ chainId }); + const enabled = !!council; + + return useWrite({ + pendingMessage: "Executing proposal...", + successMessage: "Proposal executed!", + errorMessage: "Failed to execute proposal.", + writeFn: enabled + ? async () => { + return council.coreVoting(votingContract).executeProposal({ + args: { proposalId }, + }); + } + : undefined, + }); +} diff --git a/apps/council-ui/src/ui/proposals/hooks/useFilterVotesByGSCOnlyEffect.ts b/apps/council-ui/src/ui/proposals/hooks/useFilterVotesByGSCOnlyEffect.ts deleted file mode 100644 index c2bbb365..00000000 --- a/apps/council-ui/src/ui/proposals/hooks/useFilterVotesByGSCOnlyEffect.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { ReadVote } from "@delvtech/council-viem"; -import { useEffect } from "react"; -import { asyncFilter } from "src/ui/base/utils/asyncFilter"; -import { useReadGscVault } from "src/ui/vaults/gscVault/hooks/useReadGscVault"; - -export function useFilterVotesByGSCOnlyEffect( - votes: ReadVote[], - gscOnly: boolean, - setFilteredVotes: (votes: ReadVote[]) => void, -): void { - const gscVault = useReadGscVault(); - - return useEffect(() => { - if (gscOnly && gscVault) { - asyncFilter(votes, ({ voter }) => - gscVault.getIsMember({ - account: voter, - }), - ).then((filteredVotes) => setFilteredVotes(filteredVotes)); - } else { - // reset filter - setFilteredVotes(votes); - } - }, [gscOnly, gscVault]); -} diff --git a/apps/council-ui/src/ui/proposals/hooks/useProposal.ts b/apps/council-ui/src/ui/proposals/hooks/useProposal.ts new file mode 100644 index 00000000..4d2bae1a --- /dev/null +++ b/apps/council-ui/src/ui/proposals/hooks/useProposal.ts @@ -0,0 +1,31 @@ +import { Address } from "@delvtech/drift"; +import { useQuery } from "@tanstack/react-query"; +import { SupportedChainId } from "src/config/council.config"; +import { useReadCouncil } from "src/ui/council/useReadCouncil"; +import { useSupportedChainId } from "src/ui/network/useSupportedChainId"; + +interface UseProposalCreationOptions { + votingContract: Address; + proposalId: bigint; + chainId?: SupportedChainId; +} + +/** + * Get a proposal by its id. + */ +export default function useProposal({ + votingContract, + proposalId, + chainId, +}: UseProposalCreationOptions) { + chainId = useSupportedChainId(chainId); + const council = useReadCouncil({ chainId }); + const enabled = !!chainId && !!council; + return useQuery({ + queryKey: ["proposal", chainId, votingContract, proposalId.toString()], + enabled, + queryFn: enabled + ? () => council.coreVoting(votingContract).getProposal(proposalId) + : undefined, + }); +} diff --git a/apps/council-ui/src/ui/proposals/hooks/useProposalCreation.ts b/apps/council-ui/src/ui/proposals/hooks/useProposalCreation.ts new file mode 100644 index 00000000..04bd1495 --- /dev/null +++ b/apps/council-ui/src/ui/proposals/hooks/useProposalCreation.ts @@ -0,0 +1,36 @@ +import { Address } from "@delvtech/drift"; +import { useQuery } from "@tanstack/react-query"; +import { SupportedChainId } from "src/config/council.config"; +import { useSupportedChainId } from "src/ui/network/useSupportedChainId"; +import { useReadCouncil } from "src/ui/council/useReadCouncil"; + +interface UseProposalCreationOptions { + votingContract: Address; + proposalId: bigint; + chainId?: SupportedChainId; +} + +/** + * Get the proposal creation event for a given proposal id. + */ +export default function useProposalCreation({ + votingContract, + proposalId, + chainId, +}: UseProposalCreationOptions) { + chainId = useSupportedChainId(chainId); + const council = useReadCouncil({ chainId }); + const enabled = !!chainId && !!council; + return useQuery({ + queryKey: ["proposalCreation", chainId, votingContract, proposalId], + enabled, + queryFn: enabled + ? async () => { + const createEvents = await council + .coreVoting(votingContract) + .getProposalCreations(); + return createEvents.find((event) => event.proposalId === proposalId); + } + : undefined, + }); +} diff --git a/apps/council-ui/src/ui/proposals/hooks/useReadProposal.ts b/apps/council-ui/src/ui/proposals/hooks/useReadProposal.ts deleted file mode 100644 index 90ca2bd8..00000000 --- a/apps/council-ui/src/ui/proposals/hooks/useReadProposal.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { - ReadCoreVoting, - ReadProposal, - ReadVotingVault, -} from "@delvtech/council-viem"; -import { QueryStatus, useQuery } from "@tanstack/react-query"; -import { useCouncilConfig } from "src/ui/config/hooks/useCouncilConfig"; -import { useReadCouncil } from "src/ui/council/hooks/useReadCouncil"; - -export interface UseReadProposalOptions { - id: bigint | undefined; - coreVoting?: ReadCoreVoting | `0x${string}`; - vaults?: (ReadVotingVault | `0x${string}`)[]; -} - -interface UseReadProposalResult { - proposal: ReadProposal | undefined; - status: QueryStatus; -} - -/** - * Use a ReadProposal instance for a given proposal id and core voting address. - * Defaults to the coreVoting from the council config. - */ -export function useReadProposal({ - id, - coreVoting, - vaults, -}: UseReadProposalOptions): UseReadProposalResult { - const council = useReadCouncil(); - const { coreVoting: configuredCoreVoting, gscVoting } = useCouncilConfig(); - - let coreVotingAddressToUse = - typeof coreVoting === "string" ? coreVoting : coreVoting?.address; - if (!coreVotingAddressToUse) { - coreVotingAddressToUse = configuredCoreVoting.address; - } - const isConfiguredCoreVoting = - coreVotingAddressToUse === configuredCoreVoting.address; - const isConfiguredGscVoting = coreVotingAddressToUse === gscVoting?.address; - - let vaultsToUse = vaults; - if (!vaultsToUse && isConfiguredCoreVoting) { - vaultsToUse = configuredCoreVoting.vaults.map(({ address }) => address); - } else if (!vaultsToUse && isConfiguredGscVoting) { - vaultsToUse = [gscVoting.vault.address]; - } - - const enabled = id !== undefined && !!coreVotingAddressToUse; - - const { data, status } = useQuery({ - queryKey: ["proposal", String(id), coreVotingAddressToUse, vaultsToUse], - enabled, - queryFn: enabled - ? () => - council - .coreVoting({ - address: coreVotingAddressToUse!, - vaults: vaultsToUse, - }) - .getProposal({ id }) - : undefined, - }); - - return { - proposal: data, - status, - }; -} diff --git a/apps/council-ui/src/ui/proposals/hooks/useReadWriteProposal.ts b/apps/council-ui/src/ui/proposals/hooks/useReadWriteProposal.ts deleted file mode 100644 index d5a5669b..00000000 --- a/apps/council-ui/src/ui/proposals/hooks/useReadWriteProposal.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { - ReadVotingVault, - ReadWriteCoreVoting, - ReadWriteProposal, -} from "@delvtech/council-viem"; -import { QueryStatus, useQuery } from "@tanstack/react-query"; -import { useCouncilConfig } from "src/ui/config/hooks/useCouncilConfig"; -import { useReadWriteCouncil } from "src/ui/council/hooks/useReadWriteCouncil"; - -export interface UseReadWriteProposalOptions { - id: bigint; - coreVoting?: ReadWriteCoreVoting | `0x${string}`; - vaults?: (ReadVotingVault | `0x${string}`)[]; -} - -interface UseReadWriteProposalResult { - proposal: ReadWriteProposal | undefined; - status: QueryStatus; -} - -/** - * Use a ReadWriteProposal instance for a given proposal id and core voting - * address. Defaults to the coreVoting from the council config. - */ -export function useReadProposal({ - id, - coreVoting, - vaults, -}: UseReadWriteProposalOptions): UseReadWriteProposalResult { - const council = useReadWriteCouncil(); - const { coreVoting: configuredCoreVoting, gscVoting } = useCouncilConfig(); - - let coreVotingAddressToUse = - typeof coreVoting === "string" ? coreVoting : coreVoting?.address; - if (!coreVotingAddressToUse) { - coreVotingAddressToUse = configuredCoreVoting.address; - } - const isConfiguredCoreVoting = - coreVotingAddressToUse === configuredCoreVoting.address; - const isConfiguredGscVoting = coreVotingAddressToUse === gscVoting?.address; - - let vaultsToUse = vaults; - if (!vaultsToUse && isConfiguredCoreVoting) { - vaultsToUse = configuredCoreVoting.vaults.map(({ address }) => address); - } else if (!vaultsToUse && isConfiguredGscVoting) { - vaultsToUse = [gscVoting.vault.address]; - } - - const enabled = !!coreVotingAddressToUse; - - const { data, status } = useQuery({ - queryKey: ["proposal", id, coreVotingAddressToUse, vaultsToUse], - enabled, - queryFn: enabled - ? () => - council - ?.coreVoting({ - address: coreVotingAddressToUse!, - vaults: vaultsToUse, - }) - .getProposal({ id }) - : undefined, - }); - - return { - proposal: data, - status, - }; -} diff --git a/apps/council-ui/src/ui/proposals/hooks/useVoteResults.ts b/apps/council-ui/src/ui/proposals/hooks/useVoteResults.ts deleted file mode 100644 index 08fe67cd..00000000 --- a/apps/council-ui/src/ui/proposals/hooks/useVoteResults.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { ReadVote, VoteResults } from "@delvtech/council-viem"; -import { QueryStatus, useQuery } from "@tanstack/react-query"; - -type VoteResultsFormatted = { - [K in keyof VoteResults]: string; -}; - -export function useVoteResults({ proposal }: ReadVote): { - voteResults: VoteResults | undefined; - voteResultsFormatted: VoteResultsFormatted | undefined; - status: QueryStatus; -} { - const { data, status } = useQuery({ - queryKey: [proposal.coreVoting.address, proposal.id], - queryFn: () => proposal.getResults(), - }); - - const formattedResults = - data && - Object.fromEntries( - Object.entries(data).map(([key, value]) => [key, String(value)]), - ); - - return { - voteResults: data, - voteResultsFormatted: formattedResults as VoteResultsFormatted | undefined, - status, - }; -} diff --git a/apps/council-ui/src/ui/proposals/tooltips.ts b/apps/council-ui/src/ui/proposals/tooltips.ts index 014348e8..9d8adb9a 100644 --- a/apps/council-ui/src/ui/proposals/tooltips.ts +++ b/apps/council-ui/src/ui/proposals/tooltips.ts @@ -1,19 +1,11 @@ -import { ProposalStatus } from "src/utils/getProposalStatus"; - -export const EXECUTED_STATUS = "This proposal passed and was executed."; -export const EXPIRED_STATUS = - "This proposal garnered sufficient 'Yes' votes to pass, but was not executed prior to the deadline (i.e., last call)."; -export const FAILED_STATUS = - "This proposal did not meet quorum and/or failed to pass."; -export const IN_PROGRESS_STATUS = - "This proposal is currently active and either awaiting more votes or execution."; -export const UNKNOWN_STATUS = - "This proposal is missing information regarding its status."; +import { ProposalStatus } from "@delvtech/council-js"; export const tooltipByStatus: Record = { - EXECUTED: EXECUTED_STATUS, - EXPIRED: EXPIRED_STATUS, - FAILED: FAILED_STATUS, - "IN PROGRESS": IN_PROGRESS_STATUS, - UNKNOWN: UNKNOWN_STATUS, + executed: "This proposal passed and was executed.", + expired: + "This proposal garnered sufficient 'Yes' votes to pass, but was not executed prior to the deadline (i.e., last call).", + failed: "This proposal did not meet quorum and/or failed to pass.", + active: + "This proposal is currently active and either awaiting more votes or execution.", + unknown: "This proposal is missing information regarding its status.", }; diff --git a/apps/council-ui/src/ui/proposals/types.ts b/apps/council-ui/src/ui/proposals/types.ts deleted file mode 100644 index cda8d69e..00000000 --- a/apps/council-ui/src/ui/proposals/types.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Ballot } from "@delvtech/council-viem"; - -export interface ProposalRowData { - votingContractName: string; - votingContractAddress: string; - id: number; - created: Date | null; - votingEnds: Date | null; - currentQuorum: string; - requiredQuorum: string | null; - ballot: Ballot | null; -} diff --git a/apps/council-ui/src/ui/push/usePushSubscribe.ts b/apps/council-ui/src/ui/push/usePushSubscribe.ts index e5f616ba..7f9f3aa7 100644 --- a/apps/council-ui/src/ui/push/usePushSubscribe.ts +++ b/apps/council-ui/src/ui/push/usePushSubscribe.ts @@ -1,25 +1,25 @@ import * as PushAPI from "@pushprotocol/restapi"; import { SubscribeOptionsType } from "@pushprotocol/restapi/src/lib/channels"; -import { useCallback, useEffect, useState } from "react"; - import { ENV } from "@pushprotocol/restapi/src/lib/constants"; -import { councilConfigs } from "src/config/council.config"; -import { useSupportedChainId } from "src/ui/network/hooks/useSupportedChainId"; +import { useCallback, useEffect, useState } from "react"; +import { useCouncilConfig } from "src/ui/config/useCouncilConfig"; +import { useSupportedChainId } from "src/ui/network/useSupportedChainId"; import { useAccount, useSignTypedData } from "wagmi"; import { UsePushSubscribeType } from "./types"; export function usePushSubscribe(): UsePushSubscribeType { const { address } = useAccount(); const chainId = useSupportedChainId(); + const config = useCouncilConfig(); const [loading, setLoading] = useState(false); const [isSubscribed, setIsSubscribed] = useState(false); - const config = councilConfigs[chainId].push || {}; - const isConfigured = !!councilConfigs[chainId].push; + const pushConfig = config.push || {}; + const isConfigured = !!config.push; const isUserSubscribed = useCallback( async function () { - const { env, channel } = config; + const { env, channel } = pushConfig; const userSubscriptions = address && (await PushAPI.user.getSubscriptions({ @@ -65,7 +65,7 @@ export function usePushSubscribe(): UsePushSubscribeType { } function generatePayload(): SubscribeOptionsType { - const { env, channel } = config; + const { env, channel } = pushConfig; const payload: SubscribeOptionsType = { signer: { _signTypedData } as any, channelAddress: `eip155:${chainId}:${channel}`, // channel address in CAIP diff --git a/apps/council-ui/src/ui/router/hooks/useParams.ts b/apps/council-ui/src/ui/router/useParams.ts similarity index 100% rename from apps/council-ui/src/ui/router/hooks/useParams.ts rename to apps/council-ui/src/ui/router/useParams.ts diff --git a/apps/council-ui/src/ui/router/hooks/useRouterSteps.ts b/apps/council-ui/src/ui/router/useRouterSteps.ts similarity index 99% rename from apps/council-ui/src/ui/router/hooks/useRouterSteps.ts rename to apps/council-ui/src/ui/router/useRouterSteps.ts index 1ef3e26f..cddf2545 100644 --- a/apps/council-ui/src/ui/router/hooks/useRouterSteps.ts +++ b/apps/council-ui/src/ui/router/useRouterSteps.ts @@ -8,7 +8,7 @@ import { useRef, useState, } from "react"; -import { useParams } from "src/ui/router/hooks/useParams"; +import { useParams } from "src/ui/router/useParams"; export type StepPosition = "behind" | "current" | "adjacent" | "ahead"; diff --git a/apps/council-ui/src/ui/token/hooks/useTokenDecimals.ts b/apps/council-ui/src/ui/token/hooks/useTokenDecimals.ts deleted file mode 100644 index db196bb6..00000000 --- a/apps/council-ui/src/ui/token/hooks/useTokenDecimals.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { ReadToken } from "@delvtech/council-viem"; -import { QueryStatus, useQuery } from "@tanstack/react-query"; -import { useReadCouncil } from "src/ui/council/hooks/useReadCouncil"; -import { useSupportedChainId } from "src/ui/network/hooks/useSupportedChainId"; - -/** - * Fetch the token decimals for the given token address. - * @param token - The ReadToken or token address to fetch the decimals for - */ -export function useTokenDecimals( - token: ReadToken | `0x${string}` | undefined, -): { - decimals: number | undefined; - status: QueryStatus; -} { - const chainId = useSupportedChainId(); - const council = useReadCouncil(); - const tokenInstance = - typeof token === "string" ? council.token(token) : token; - - const { data, status } = useQuery({ - queryKey: ["useTokenName", chainId, token], - enabled: !!tokenInstance, - queryFn: !!tokenInstance ? () => tokenInstance.getDecimals() : undefined, - }); - - return { - decimals: data, - status, - }; -} diff --git a/apps/council-ui/src/ui/token/hooks/useTokenName.ts b/apps/council-ui/src/ui/token/hooks/useTokenName.ts deleted file mode 100644 index 60a3d49a..00000000 --- a/apps/council-ui/src/ui/token/hooks/useTokenName.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { ReadToken } from "@delvtech/council-viem"; -import { QueryStatus, useQuery } from "@tanstack/react-query"; -import { useReadCouncil } from "src/ui/council/hooks/useReadCouncil"; -import { useSupportedChainId } from "src/ui/network/hooks/useSupportedChainId"; - -/** - * Fetch the token name for the given token address. - * @param token - A ReadToken or the token address to fetch the name for - */ -export function useTokenName(token: ReadToken | `0x${string}` | undefined): { - name: string | undefined; - status: QueryStatus; -} { - const chainId = useSupportedChainId(); - const council = useReadCouncil(); - const tokenInstance = - typeof token === "string" ? council.token(token) : token; - - const { data, status } = useQuery({ - queryKey: ["useTokenName", chainId, token], - enabled: !!tokenInstance, - queryFn: !!tokenInstance ? () => tokenInstance.getName() : undefined, - }); - - return { - name: data, - status, - }; -} diff --git a/apps/council-ui/src/ui/token/hooks/useTokenSymbol.ts b/apps/council-ui/src/ui/token/hooks/useTokenSymbol.ts deleted file mode 100644 index 378e2c8a..00000000 --- a/apps/council-ui/src/ui/token/hooks/useTokenSymbol.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { ReadToken } from "@delvtech/council-viem"; -import { QueryStatus, useQuery } from "@tanstack/react-query"; -import { useReadCouncil } from "src/ui/council/hooks/useReadCouncil"; -import { useSupportedChainId } from "src/ui/network/hooks/useSupportedChainId"; - -/** - * Fetch the token symbol for the given token address. - * @param tokenAddress - The ReadToken or token address to fetch the symbol for - */ -export function useTokenSymbol(token: ReadToken | `0x${string}` | undefined): { - symbol: string | undefined; - status: QueryStatus; -} { - const chainId = useSupportedChainId(); - const council = useReadCouncil(); - const tokenInstance = - typeof token === "string" ? council.token(token) : token; - - const { data, status } = useQuery({ - queryKey: ["useTokenSymbol", chainId, token], - enabled: !!tokenInstance, - queryFn: !!tokenInstance ? () => tokenInstance.getSymbol() : undefined, - }); - - return { - symbol: data, - status, - }; -} diff --git a/apps/council-ui/src/ui/token/useTokenSymbol.ts b/apps/council-ui/src/ui/token/useTokenSymbol.ts new file mode 100644 index 00000000..7d026f88 --- /dev/null +++ b/apps/council-ui/src/ui/token/useTokenSymbol.ts @@ -0,0 +1,21 @@ +import { Address } from "@delvtech/drift"; +import { useQuery } from "@tanstack/react-query"; +import { useReadCouncil } from "src/ui/council/useReadCouncil"; +import { useSupportedChainId } from "src/ui/network/useSupportedChainId"; + +/** + * Fetch the token symbol for the given token address. + * @param tokenAddress - The ReadToken or token address to fetch the symbol for + */ +export function useTokenSymbol(tokenAddress: Address | undefined) { + const chainId = useSupportedChainId(); + const council = useReadCouncil(); + const enabled = !!tokenAddress && !!council; + return useQuery({ + queryKey: ["useTokenSymbol", chainId, tokenAddress], + enabled, + queryFn: enabled + ? () => council.token(tokenAddress).getSymbol() + : undefined, + }); +} diff --git a/apps/council-ui/src/ui/vaults/DelegatorListModal.tsx b/apps/council-ui/src/ui/vaults/DelegatorListModal.tsx index 508eef18..f51d78ff 100644 --- a/apps/council-ui/src/ui/vaults/DelegatorListModal.tsx +++ b/apps/council-ui/src/ui/vaults/DelegatorListModal.tsx @@ -1,4 +1,4 @@ -import { VoterWithPower } from "@delvtech/council-viem"; +import { VoterWithPower } from "@delvtech/council-js"; import { ReactElement } from "react"; import { formatAddress } from "src/ui/base/formatting/formatAddress"; import { WalletIcon } from "src/ui/base/WalletIcon"; diff --git a/apps/council-ui/src/ui/vaults/DepositAndWithdrawForm.tsx b/apps/council-ui/src/ui/vaults/DepositAndWithdrawForm.tsx index 647c21b0..19c3fe02 100644 --- a/apps/council-ui/src/ui/vaults/DepositAndWithdrawForm.tsx +++ b/apps/council-ui/src/ui/vaults/DepositAndWithdrawForm.tsx @@ -1,9 +1,8 @@ +import { fixed } from "@delvtech/fixed-point-wasm"; import assertNever from "assert-never"; import classNames from "classnames"; import { ReactElement, useState } from "react"; -import { formatBalance } from "src/ui/base/formatting/formatBalance"; import { NumericInput } from "src/ui/base/forms/NumericInput"; -import { formatUnits, parseUnits } from "viem"; interface DepositAndWithdrawFormProps { symbol: string; @@ -29,11 +28,9 @@ export function DepositAndWithdrawForm({ disabled = false, }: DepositAndWithdrawFormProps): ReactElement { const [activeTab, setActiveTab] = useState<"deposit" | "withdraw">("deposit"); - const [depositAmount, setDepositAmount] = useState(""); - const [withdrawAmount, setWithdrawAmount] = useState(""); - const isApproved = allowance >= parseUnits(depositAmount, decimals); - const balanceFormatted = formatUnits(balance, decimals); - const depositedBalanceFormatted = formatUnits(depositedBalance, decimals); + const [depositAmount, setDepositAmount] = useState(0n); + const [withdrawAmount, setWithdrawAmount] = useState(0n); + const isApproved = allowance >= depositAmount; return (
@@ -64,15 +61,17 @@ export function DepositAndWithdrawForm({ return ( <> Balance:{" "} - {formatBalance(balanceFormatted, 4)} {symbol} + {fixed(balance, decimals).format({ decimals: 4 })}{" "} + {symbol} } @@ -81,9 +80,7 @@ export function DepositAndWithdrawForm({ {isApproved ? ( diff --git a/apps/council-ui/src/ui/vaults/gscVault/GscVaultDetails.tsx b/apps/council-ui/src/ui/vaults/gscVault/GscVaultDetails.tsx new file mode 100644 index 00000000..592506fe --- /dev/null +++ b/apps/council-ui/src/ui/vaults/gscVault/GscVaultDetails.tsx @@ -0,0 +1,146 @@ +import { Address } from "@delvtech/drift"; +import { useQuery, UseQueryResult } from "@tanstack/react-query"; +import { ReactElement } from "react"; +import { getVaultConfig } from "src/config/utils/getVaultConfig"; +import { ErrorMessage } from "src/ui/base/error/ErrorMessage"; +import { useCouncilConfig } from "src/ui/config/useCouncilConfig"; +import { useReadCouncil } from "src/ui/council/useReadCouncil"; +import { useSupportedChainId } from "src/ui/network/useSupportedChainId"; +import { + GscMemberInfo, + GscMembersTable, +} from "src/ui/vaults/gscVault/GscMembersTable"; +import { GSCVaultsStatsRow } from "src/ui/vaults/gscVault/GscVaultStatsRow"; +import { VaultDetails } from "src/ui/vaults/VaultDetails/VaultDetails"; +import { VaultDetailsSkeleton } from "src/ui/vaults/VaultDetails/VaultDetailsSkeleton"; +import { VaultHeader } from "src/ui/vaults/VaultHeader"; +import { getBulkEnsRecords } from "src/utils/getBulkEnsRecords"; +import { getVotingPower } from "src/utils/vaults/getVotingPower"; +import { getGscStatus } from "src/utils/vaults/gsc/getGscStatus"; +import { GscStatus } from "src/utils/vaults/gsc/types"; +import { useAccount } from "wagmi"; + +interface GscVaultDetailsProps { + address: `0x${string}`; +} + +export function GscVaultDetails({ + address, +}: GscVaultDetailsProps): ReactElement { + const { address: account } = useAccount(); + const { data, status, error } = useGscVaultDetailsData({ + vaultAddress: address, + account, + }); + const chainId = useSupportedChainId(); + const vaultConfig = getVaultConfig({ address, chainId }); + const name = vaultConfig?.name || "Vesing Vault"; + + if (status === "error") { + return ; + } + + if (status !== "success") { + return ; + } + + return ( + + } + statsRow={ + + } + actions={ +
+ +
+ } + /> + ); +} + +interface GSCVaultDetailsData { + gscStatus: GscStatus; + members: GscMemberInfo[]; + requiredVotingPower: bigint; +} + +function useGscVaultDetailsData({ + vaultAddress, + account, +}: { + vaultAddress: `0x${string}`; + account: `0x${string}` | undefined; +}): UseQueryResult { + const chainId = useSupportedChainId(); + const council = useReadCouncil(); + const config = useCouncilConfig(); + const enabled = !!council; + + return useQuery({ + queryKey: ["useGscVaultDetails", chainId, vaultAddress, account], + enabled, + queryFn: enabled + ? async (): Promise => { + const gscVault = council?.gscVault(vaultAddress); + + const [members, requiredVotingPower, gscStatus] = await Promise.all([ + gscVault.getMembers(), + gscVault.getRequiredVotingPower(), + getGscStatus({ account, chainId }), + , + ]); + + const memberVaults = await Promise.all( + members.map(async (member) => { + const qualifyingVaults = await gscVault.getMemberVaults(member); + return { member, qualifyingVaults }; + }), + ); + + const [memberENSNames, ...memberVotingPowers] = await Promise.all([ + getBulkEnsRecords(members, chainId), + ...memberVaults + .map(({ member, qualifyingVaults }) => + qualifyingVaults.map(async (vault) => { + const votingPower = await getVotingPower({ + chainId, + vault: vault.address, + voter: member, + }); + return { member, votingPower }; + }), + ) + .flat(), + ]); + + const memberInfoByAddress: Record = {}; + for (const { member, votingPower } of memberVotingPowers) { + memberInfoByAddress[member] ||= { + member, + ensName: memberENSNames[member], + qualifyingVotingPower: 0n, + }; + memberInfoByAddress[member].qualifyingVotingPower += votingPower; + } + + return { + members: Object.values(memberInfoByAddress), + requiredVotingPower, + gscStatus, + }; + } + : undefined, + }); +} diff --git a/apps/council-ui/src/ui/vaults/gscVault/GscVaultPreviewCard.tsx b/apps/council-ui/src/ui/vaults/gscVault/GscVaultPreviewCard.tsx index b7fef8dd..9430a37a 100644 --- a/apps/council-ui/src/ui/vaults/gscVault/GscVaultPreviewCard.tsx +++ b/apps/council-ui/src/ui/vaults/gscVault/GscVaultPreviewCard.tsx @@ -2,33 +2,32 @@ import { QueryStatus } from "@tanstack/react-query"; import assertNever from "assert-never"; import Link from "next/link"; import { ReactElement } from "react"; +import { getGscVaultConfig } from "src/config/utils/getGscVaultConfig"; import { makeVaultURL } from "src/routes"; import { Address } from "src/ui/base/Address"; import { DefinitionTooltip } from "src/ui/base/Tooltip"; -import { useCouncilConfig } from "src/ui/config/hooks/useCouncilConfig"; +import { useSupportedChainId } from "src/ui/network/useSupportedChainId"; import { GenericVaultCardSkeleton } from "src/ui/vaults/GenericVaultCard"; import { useGscStatus } from "src/ui/vaults/gscVault/hooks/useGscStatus"; import { useAccount } from "wagmi"; import { useGscMembers } from "./hooks/useGscMembers"; -interface GSCVaultPreviewCardProps { +interface GscVaultPreviewCardProps { vaultAddress: `0x${string}`; } -export function GSCVaultPreviewCard({ +export function GscVaultPreviewCard({ vaultAddress, -}: GSCVaultPreviewCardProps): ReactElement { +}: GscVaultPreviewCardProps): ReactElement { const { address: account } = useAccount(); + const chainId = useSupportedChainId(); + const vaultConfig = getGscVaultConfig({ chainId }); + const name = vaultConfig?.name; + const sentenceSummary = vaultConfig?.sentenceSummary; - // config - const config = useCouncilConfig(); - const name = config.gscVoting?.vault.name; - const sentenceSummary = config.gscVoting?.vault.sentenceSummary; - - // members and status const { gscMembers, status: gscMembersQueryStatus } = useGscMembers(); const { - gscStatus: connectedAccountMembershipStatus, + data: connectedAccountMembershipStatus, status: gscStatusQueryStatus, } = useGscStatus(account); @@ -48,10 +47,10 @@ export function GSCVaultPreviewCard({ case "success": { return ( -
+
-

{name}

+

{name}

{/* Description */} diff --git a/apps/council-ui/src/ui/vaults/gscVault/GscVaultProfileCard.tsx b/apps/council-ui/src/ui/vaults/gscVault/GscVaultProfileCard.tsx index f0e68550..9eec619f 100644 --- a/apps/council-ui/src/ui/vaults/gscVault/GscVaultProfileCard.tsx +++ b/apps/council-ui/src/ui/vaults/gscVault/GscVaultProfileCard.tsx @@ -1,14 +1,14 @@ import { useQuery } from "@tanstack/react-query"; import { ReactElement } from "react"; +import { getGscVaultConfig } from "src/config/utils/getGscVaultConfig"; import { formatVotingPower } from "src/ui/base/formatting/formatVotingPower"; -import { useCouncilConfig } from "src/ui/config/hooks/useCouncilConfig"; -import { useReadCoreVoting } from "src/ui/council/hooks/useReadCoreVoting"; +import { useReadCouncil } from "src/ui/council/useReadCouncil"; +import { useSupportedChainId } from "src/ui/network/useSupportedChainId"; import { VaultProfileCard } from "src/ui/vaults/VaultProfileCard"; import { VaultProfileCardSkeleton } from "src/ui/vaults/VaultProfileCardSkeleton"; -import { useGscStatus } from "src/ui/vaults/gscVault/hooks/useGscStatus"; import { useKickGscMember } from "src/ui/vaults/gscVault/hooks/useKickGscMember"; -import { getIsGscMember } from "src/utils/gscVault/getGscStatus"; -import { useReadGscVault } from "./hooks/useReadGscVault"; +import { getVotingPower } from "src/utils/vaults/getVotingPower"; +import { getGscStatus, isGscMember } from "src/utils/vaults/gsc/getGscStatus"; interface GSCVaultProfileCardProps { address: `0x${string}`; @@ -20,13 +20,11 @@ export function GSCVaultProfileCard({ profileAddress, }: GSCVaultProfileCardProps): ReactElement { const { data } = useGSCVaultProfileCardData(address, profileAddress); + const chainId = useSupportedChainId(); + const vaultConfig = getGscVaultConfig({ chainId }); + const name = vaultConfig?.name || "GSC Vault"; - // config - const config = useCouncilConfig(); - const name = config.gscVoting?.vault?.name || "GSC Vault"; - - // kick transaction - const { kickGscMember } = useKickGscMember(); + const { write: kickGscMember } = useKickGscMember(); if (!data) { return ; @@ -61,7 +59,7 @@ export function GSCVaultProfileCard({ text: "Kick Member", disabled: !gscStatus || - !getIsGscMember(gscStatus) || + !isGscMember(gscStatus) || !isBelowThreshold || !kickGscMember, onClick: () => kickGscMember?.(profileAddress), @@ -74,10 +72,9 @@ function useGSCVaultProfileCardData( vaultAddress: `0x${string}`, account: `0x${string}`, ) { - const coreVoting = useReadCoreVoting(); - const gscVault = useReadGscVault(); - const { gscStatus } = useGscStatus(account); - const enabled = !!gscVault; + const chainId = useSupportedChainId(); + const council = useReadCouncil(); + const enabled = !!council; return useQuery({ queryKey: [ @@ -87,16 +84,34 @@ function useGSCVaultProfileCardData( enabled, queryFn: enabled ? async () => { - const qualifyingVotingPower = await coreVoting.getVotingPower({ - account, - }); - const requiredVotingPower = await gscVault.getRequiredVotingPower(); - const isBelowThreshold = qualifyingVotingPower < requiredVotingPower; + const gscVault = council?.gscVault(vaultAddress); + + const [requiredVotingPower, qualifyingVaults, gscStatus] = + await Promise.all([ + gscVault.getRequiredVotingPower(), + gscVault.getMemberVaults(account), + getGscStatus({ account, chainId }), + ]); + + const votingPowers = await Promise.all( + qualifyingVaults.map(({ address }) => + getVotingPower({ + chainId, + vault: address, + voter: account, + }), + ), + ); + + const qualifyingVotingPower = votingPowers.reduce( + (total, vaultPower) => total + vaultPower, + 0n, + ); return { - isBelowThreshold, requiredVotingPower, qualifyingVotingPower, + isBelowThreshold: qualifyingVotingPower < requiredVotingPower, gscStatus, }; } diff --git a/apps/council-ui/src/ui/vaults/gscVault/GscVaultStatsRow.tsx b/apps/council-ui/src/ui/vaults/gscVault/GscVaultStatsRow.tsx index 14f77a2b..f72c13e5 100644 --- a/apps/council-ui/src/ui/vaults/gscVault/GscVaultStatsRow.tsx +++ b/apps/council-ui/src/ui/vaults/gscVault/GscVaultStatsRow.tsx @@ -2,26 +2,24 @@ import { ReactElement } from "react"; import { Stat } from "src/ui/base/Stat"; import { DefinitionTooltip } from "src/ui/base/Tooltip"; import { formatVotingPower } from "src/ui/base/formatting/formatVotingPower"; -import { GscStatus } from "src/utils/gscVault/types"; +import { GscStatus } from "src/utils/vaults/gsc/types"; import { GscMembershipStatusStat } from "./GscMembershipStatusStat"; interface GSCVaultStatsRowProps { accountMembership: GscStatus; membersCount: number; requiredVotingPower: bigint; - onJoin?: () => void; } export function GSCVaultsStatsRow({ accountMembership, membersCount, requiredVotingPower, - onJoin, }: GSCVaultStatsRowProps): ReactElement { return (
{accountMembership && ( - + )} {membersCount >= 0 && ( diff --git a/apps/council-ui/src/ui/vaults/gscVault/hooks/useGscMembers.ts b/apps/council-ui/src/ui/vaults/gscVault/hooks/useGscMembers.ts index b6d80acb..5ef6ab4e 100644 --- a/apps/council-ui/src/ui/vaults/gscVault/hooks/useGscMembers.ts +++ b/apps/council-ui/src/ui/vaults/gscVault/hooks/useGscMembers.ts @@ -1,9 +1,9 @@ -import { ReadVoter } from "@delvtech/council-viem"; +import { Address } from "@delvtech/drift"; import { QueryStatus, useQuery } from "@tanstack/react-query"; import { useReadGscVault } from "./useReadGscVault"; export function useGscMembers(): { - gscMembers: ReadVoter[] | undefined; + gscMembers: Address[] | undefined; status: QueryStatus; } { const gscVault = useReadGscVault(); @@ -12,7 +12,9 @@ export function useGscMembers(): { const { data, status } = useQuery({ queryKey: ["gsc-gsc-members", gscVault?.address], enabled, - queryFn: enabled ? async () => gscVault?.getMembers() : undefined, + queryFn: () => { + return enabled ? gscVault.getMembers() : []; + }, }); return { diff --git a/apps/council-ui/src/ui/vaults/gscVault/hooks/useGscStatus.ts b/apps/council-ui/src/ui/vaults/gscVault/hooks/useGscStatus.ts index 51d22cba..959a19d7 100644 --- a/apps/council-ui/src/ui/vaults/gscVault/hooks/useGscStatus.ts +++ b/apps/council-ui/src/ui/vaults/gscVault/hooks/useGscStatus.ts @@ -1,28 +1,11 @@ -import { QueryStatus, useQuery } from "@tanstack/react-query"; -import { useReadCoreVoting } from "src/ui/council/hooks/useReadCoreVoting"; -import { useReadGscVault } from "src/ui/vaults/gscVault/hooks/useReadGscVault"; -import { getGscStatus } from "src/utils/gscVault/getGscStatus"; -import { GscStatus } from "src/utils/gscVault/types"; +import { useQuery } from "@tanstack/react-query"; +import { useSupportedChainId } from "src/ui/network/useSupportedChainId"; +import { getGscStatus } from "src/utils/vaults/gsc/getGscStatus"; -export function useGscStatus(account: `0x${string}` | undefined): { - gscStatus: GscStatus | undefined; - status: QueryStatus; -} { - const coreVoting = useReadCoreVoting(); - const gscVault = useReadGscVault(); - - const { data, status } = useQuery({ +export function useGscStatus(account: `0x${string}` | undefined) { + const chainId = useSupportedChainId(); + return useQuery({ queryKey: ["gsc-status", account], - queryFn: () => - getGscStatus({ - account, - qualifyingVaults: coreVoting.vaults, - gscVault, - }), + queryFn: () => getGscStatus({ account, chainId }), }); - - return { - gscStatus: data, - status, - }; } diff --git a/apps/council-ui/src/ui/vaults/gscVault/hooks/useIsGscMember.ts b/apps/council-ui/src/ui/vaults/gscVault/hooks/useIsGscMember.ts index 2d5ddd82..73addffc 100644 --- a/apps/council-ui/src/ui/vaults/gscVault/hooks/useIsGscMember.ts +++ b/apps/council-ui/src/ui/vaults/gscVault/hooks/useIsGscMember.ts @@ -1,4 +1,4 @@ -import { QueryStatus, useQuery } from "@tanstack/react-query"; +import { useQuery } from "@tanstack/react-query"; import { useReadGscVault } from "./useReadGscVault"; /** @@ -6,23 +6,12 @@ import { useReadGscVault } from "./useReadGscVault"; * lookup, but just checking if someone is a member is cheap. Prefer this * instead of the heavier useGSCStatus hook whenever possible. */ -export function useIsGscMember(account: `0x${string}` | undefined): { - isGscMember: boolean | undefined; - status: QueryStatus; -} { +export function useIsGscMember(account: `0x${string}` | undefined) { const gscVault = useReadGscVault(); const enabled = !!account; - - const { data, status } = useQuery({ + return useQuery({ queryKey: ["useIsGSCMember", account], enabled: enabled, - queryFn: enabled - ? async () => gscVault?.getIsMember({ account }) - : undefined, + queryFn: enabled ? async () => !!gscVault?.getIsMember(account) : undefined, }); - - return { - isGscMember: data, - status, - }; } diff --git a/apps/council-ui/src/ui/vaults/gscVault/hooks/useJoinGsc.ts b/apps/council-ui/src/ui/vaults/gscVault/hooks/useJoinGsc.ts index d4d497b8..615daf52 100644 --- a/apps/council-ui/src/ui/vaults/gscVault/hooks/useJoinGsc.ts +++ b/apps/council-ui/src/ui/vaults/gscVault/hooks/useJoinGsc.ts @@ -1,7 +1,6 @@ -import { getVaultsWithPower } from "@delvtech/council-core"; import { MutationStatus } from "@tanstack/react-query"; -import { useWrite } from "src/ui/contract/hooks/useWrite"; -import { useReadCoreVoting } from "src/ui/council/hooks/useReadCoreVoting"; +import { useCouncilConfig } from "src/ui/config/useCouncilConfig"; +import { useWrite } from "src/ui/contract/useWrite"; import { useAccount } from "wagmi"; import { useReadWriteGscVault } from "./useReadWriteGscVault"; @@ -11,25 +10,20 @@ export function useJoinGsc(): { transactionHash: `0x${string}` | undefined; } { const { address } = useAccount(); - const coreVoting = useReadCoreVoting(); + const config = useCouncilConfig(); const gscVault = useReadWriteGscVault(); - const enabled = !!address && !!coreVoting && !!gscVault; + const enabled = !!address && !!gscVault; const { write, status, transactionHash } = useWrite({ pendingMessage: "Joining GSC...", successMessage: "GSC joined!", errorMessage: "Failed to join GSC.", - writeFn: async () => { - if (!enabled) { - throw new Error("GSC Vault not found"); - } - - // collect the vaults that the signer has voting power in. We can only use - // those vaults when calling GSCVault.join - const vaults = await getVaultsWithPower(address, coreVoting.vaults); - - return gscVault.join({ vaults }); - }, + writeFn: enabled + ? async () => { + const vaults = config.coreVoting.vaults.map(({ address }) => address); + return gscVault.join({ args: { vaults } }); + } + : undefined, }); return { diff --git a/apps/council-ui/src/ui/vaults/gscVault/hooks/useKickGscMember.ts b/apps/council-ui/src/ui/vaults/gscVault/hooks/useKickGscMember.ts index b2b37813..d10f2d73 100644 --- a/apps/council-ui/src/ui/vaults/gscVault/hooks/useKickGscMember.ts +++ b/apps/council-ui/src/ui/vaults/gscVault/hooks/useKickGscMember.ts @@ -1,31 +1,18 @@ -import { MutationStatus } from "@tanstack/react-query"; -import { useWrite } from "src/ui/contract/hooks/useWrite"; +import { Address } from "@delvtech/drift"; +import { useWrite } from "src/ui/contract/useWrite"; import { useReadWriteGscVault } from "./useReadWriteGscVault"; -export function useKickGscMember(): { - kickGscMember: ((account: `0x${string}`) => void) | undefined; - status: MutationStatus; - transactionHash: `0x${string}` | undefined; -} { +export function useKickGscMember() { const gscVault = useReadWriteGscVault(); const enabled = !!gscVault; - - const { write, status, transactionHash } = useWrite({ + return useWrite({ pendingMessage: "Kicking GSC member...", successMessage: "GSC member kicked!", errorMessage: "Failed to kick GSC member.", - writeFn: async (account: `0x${string}`) => { - if (!enabled) { - throw new Error("GSC Vault not found"); - } - - return gscVault.kick({ account }); - }, + writeFn: enabled + ? async (member: Address) => { + return gscVault.kick({ args: { member } }); + } + : undefined, }); - - return { - kickGscMember: enabled ? write : undefined, - status, - transactionHash, - }; } diff --git a/apps/council-ui/src/ui/vaults/gscVault/hooks/useReadGscVault.ts b/apps/council-ui/src/ui/vaults/gscVault/hooks/useReadGscVault.ts index 3980f86c..1db07d00 100644 --- a/apps/council-ui/src/ui/vaults/gscVault/hooks/useReadGscVault.ts +++ b/apps/council-ui/src/ui/vaults/gscVault/hooks/useReadGscVault.ts @@ -1,17 +1,16 @@ -import { ReadGscVault } from "@delvtech/council-viem"; import { useMemo } from "react"; -import { useCouncilConfig } from "src/ui/config/hooks/useCouncilConfig"; -import { useReadCouncil } from "src/ui/council/hooks/useReadCouncil"; +import { useCouncilConfig } from "src/ui/config/useCouncilConfig"; +import { useReadCouncil } from "src/ui/council/useReadCouncil"; /** * Use a ReadGscVault instance for configured GSC vault. */ -export function useReadGscVault(): ReadGscVault | undefined { +export function useReadGscVault() { const { gscVoting } = useCouncilConfig(); const council = useReadCouncil(); return useMemo( - () => gscVoting && council.gscVault(gscVoting.vault.address), + () => gscVoting && council?.gscVault(gscVoting.vaults[0].address), [council, gscVoting], ); } diff --git a/apps/council-ui/src/ui/vaults/gscVault/hooks/useReadWriteGscVault.ts b/apps/council-ui/src/ui/vaults/gscVault/hooks/useReadWriteGscVault.ts index 0ad1c7fe..6dcc943d 100644 --- a/apps/council-ui/src/ui/vaults/gscVault/hooks/useReadWriteGscVault.ts +++ b/apps/council-ui/src/ui/vaults/gscVault/hooks/useReadWriteGscVault.ts @@ -1,7 +1,7 @@ -import { ReadWriteGscVault } from "@delvtech/council-viem"; +import { ReadWriteGscVault } from "@delvtech/council-js"; import { useMemo } from "react"; -import { useCouncilConfig } from "src/ui/config/hooks/useCouncilConfig"; -import { useReadWriteCouncil } from "src/ui/council/hooks/useReadWriteCouncil"; +import { useCouncilConfig } from "src/ui/config/useCouncilConfig"; +import { useReadWriteCouncil } from "src/ui/council/useReadWriteCouncil"; /** * Use a ReadWriteGscVault instance for configured GSC vault. @@ -11,7 +11,7 @@ export function useReadWriteGscVault(): ReadWriteGscVault | undefined { const council = useReadWriteCouncil(); return useMemo( - () => gscVoting && council?.gscVault(gscVoting.vault.address), + () => gscVoting && council?.gscVault(gscVoting.vaults[0].address), [council, gscVoting], ); } diff --git a/apps/council-ui/src/ui/vaults/hooks/useDelegatesByVault.ts b/apps/council-ui/src/ui/vaults/hooks/useDelegatesByVault.ts index a2ec0394..7755e5d0 100644 --- a/apps/council-ui/src/ui/vaults/hooks/useDelegatesByVault.ts +++ b/apps/council-ui/src/ui/vaults/hooks/useDelegatesByVault.ts @@ -1,21 +1,12 @@ -import { - BlockLike, - ReadLockingVault, - ReadVestingVault, - ReadVoter, - ReadVotingVault, -} from "@delvtech/council-viem"; -import { QueryStatus, useQuery } from "@tanstack/react-query"; -import { useCouncilConfig } from "src/ui/config/hooks/useCouncilConfig"; -import { useReadCoreVoting } from "src/ui/council/hooks/useReadCoreVoting"; -import { useReadCouncil } from "src/ui/council/hooks/useReadCouncil"; -import { useSupportedChainId } from "src/ui/network/hooks/useSupportedChainId"; -import { useAccount } from "wagmi"; +import { Address } from "@delvtech/drift"; +import { useQuery } from "@tanstack/react-query"; +import { getVaultConfig } from "src/config/utils/getVaultConfig"; +import { useSupportedChainId } from "src/ui/network/useSupportedChainId"; +import { useReadCouncil } from "src/ui/council/useReadCouncil"; interface UseDelegatesByVaultOptions { - vaults?: (ReadVotingVault | `0x${string}`)[]; - account?: `0x${string}`; - atBlock?: BlockLike; + account: Address | undefined; + vaults?: Address[]; } /** @@ -24,72 +15,44 @@ interface UseDelegatesByVaultOptions { * connected account will be used. */ export function useDelegatesByVault({ - vaults: _vaults, account, - atBlock, -}: UseDelegatesByVaultOptions = {}): { - delegatesByVault: Record<`0x${string}`, ReadVoter> | undefined; - status: QueryStatus; -} { + vaults = [], +}: UseDelegatesByVaultOptions) { const chainId = useSupportedChainId(); - const vaultConfigs = useCouncilConfig().coreVoting.vaults; const council = useReadCouncil(); - const coreVoting = useReadCoreVoting(); + const enabled = !!account && !!council; - const { address: connectedAccount } = useAccount(); - const accountToUse = account ?? connectedAccount; - - const enabled = !!accountToUse; - - const { data, status } = useQuery({ - queryKey: ["delegates-by-vault", accountToUse, chainId], + return useQuery({ + queryKey: ["delegates-by-vault", account, chainId, ...vaults], enabled, queryFn: enabled ? async () => { - const delegatesByVault: Record<`0x${string}`, ReadVoter> = {}; - - const vaults = - _vaults?.map((vault) => - typeof vault === "string" ? council.votingVault(vault) : vault, - ) || coreVoting.vaults; - - for (const vault of vaults) { - const config = vaultConfigs.find( - ({ address }) => address === vault.address, - ); - - let typedDelegationVault: - | ReadLockingVault - | ReadVestingVault - | undefined; - - switch (config?.type) { - case "FrozenLockingVault": - case "LockingVault": - case "VestingVault": - typedDelegationVault = vault as ReadVestingVault; - break; - case "GSCVault": - // GSCVault does not have delegation, do nothing - default: - } - - if (typedDelegationVault) { - const delegate = await typedDelegationVault.getDelegate({ - account: accountToUse, - atBlock, - }); - delegatesByVault[vault.address] = delegate; - } - } + const delegatesByVault: { + [vault: Address]: Address; + } = {}; + + await Promise.all( + vaults.map(async (vault) => { + const config = getVaultConfig({ address: vault, chainId }); + switch (config?.type) { + case "FrozenLockingVault": + case "LockingVault": + delegatesByVault[vault] = await council + .lockingVault(vault) + .getDelegate(account); + break; + case "VestingVault": + delegatesByVault[vault] = await council + .vestingVault(vault) + .getDelegate(account); + break; + default: + } + }), + ); return delegatesByVault; } : undefined, }); - - return { - delegatesByVault: data, - status, - }; } diff --git a/apps/council-ui/src/ui/vaults/hooks/useVaultVotingPower.ts b/apps/council-ui/src/ui/vaults/hooks/useVaultVotingPower.ts index b17020a0..b82c6e10 100644 --- a/apps/council-ui/src/ui/vaults/hooks/useVaultVotingPower.ts +++ b/apps/council-ui/src/ui/vaults/hooks/useVaultVotingPower.ts @@ -1,13 +1,13 @@ -import { BlockLike } from "@delvtech/council-viem"; -import { QueryStatus, useQuery } from "@tanstack/react-query"; -import { useReadCouncil } from "src/ui/council/hooks/useReadCouncil"; -import { formatEther } from "viem"; +import { Address, RangeBlock } from "@delvtech/drift"; +import { useQuery } from "@tanstack/react-query"; +import { useSupportedChainId } from "src/ui/network/useSupportedChainId"; +import { getVotingPower } from "src/utils/vaults/getVotingPower"; import { useAccount } from "wagmi"; interface UseVaultVotingPowerOptions { - vaultAddress: `0x${string}`; - account?: `0x${string}`; - atBlock?: BlockLike; + vaultAddress: Address; + account?: Address; + block?: RangeBlock; } /** @@ -19,35 +19,23 @@ interface UseVaultVotingPowerOptions { export function useVaultVotingPower({ vaultAddress, account, - atBlock, -}: UseVaultVotingPowerOptions): { - votingPower: bigint | undefined; - votingPowerFormatted: string | undefined; - status: QueryStatus; -} { - const council = useReadCouncil(); + block, +}: UseVaultVotingPowerOptions) { const { address: connectedAccount } = useAccount(); const accountToUse = account ?? connectedAccount; - const enabled = !!accountToUse; - - const { data, status } = useQuery({ + const chainId = useSupportedChainId(); + return useQuery({ queryKey: ["vaultVotingPower", vaultAddress, account], enabled, queryFn: enabled ? () => - council - .votingVault(vaultAddress) - .getVotingPower({ account: accountToUse, atBlock }) + getVotingPower({ + chainId, + vault: vaultAddress, + voter: accountToUse, + block, + }) : undefined, }); - - return { - votingPower: data, - /** - * All voting power is formatted as a string with 18 decimal places. - */ - votingPowerFormatted: data !== undefined ? formatEther(data) : undefined, - status, - }; } diff --git a/apps/council-ui/src/ui/vaults/hooks/useVotingPower.ts b/apps/council-ui/src/ui/vaults/hooks/useVotingPower.ts index 1097de3b..d2398cda 100644 --- a/apps/council-ui/src/ui/vaults/hooks/useVotingPower.ts +++ b/apps/council-ui/src/ui/vaults/hooks/useVotingPower.ts @@ -1,58 +1,66 @@ -import { BlockLike } from "@delvtech/council-viem"; -import { QueryStatus, useQuery } from "@tanstack/react-query"; -import { formatEther } from "ethers"; -import { useReadCoreVoting } from "src/ui/council/hooks/useReadCoreVoting"; -import { useSupportedChainId } from "src/ui/network/hooks/useSupportedChainId"; -import { useAccount } from "wagmi"; +import { Address, RangeBlock } from "@delvtech/drift"; +import { useQuery } from "@tanstack/react-query"; +import { SupportedChainId } from "src/config/council.config"; +import { VotingContractConfig } from "src/config/types"; +import { useReadCouncil } from "src/ui/council/useReadCouncil"; +import { useSupportedChainId } from "src/ui/network/useSupportedChainId"; +import { getVotingPower } from "src/utils/vaults/getVotingPower"; interface UseVotingPowerOptions { - account?: `0x${string}` | undefined; - atBlock?: BlockLike; + votingContract: VotingContractConfig; + account: Address | undefined; + block?: RangeBlock; + chainId?: SupportedChainId; } /** - * Get the voting power of a wallet in all configured - * vaults. - * @param account The account to get voting power for. If not provided, the - * connected account will be used. + * Get the voting power of an account in all vaults configured for a voting + * contract. */ -export function useVotingPower({ +export default function useVotingPower({ + chainId, + votingContract, account, - atBlock, -}: UseVotingPowerOptions = {}): { - votingPower: bigint | undefined; - votingPowerFormatted: string | undefined; - status: QueryStatus; -} { - const chainId = useSupportedChainId(); - const coreVoting = useReadCoreVoting(); - const { address: connectedAccount } = useAccount(); - const accountToUse = account ?? connectedAccount; - - const enabled = !!accountToUse; - - const { data, status } = useQuery({ - queryKey: ["votingPower", account, chainId], + block, +}: UseVotingPowerOptions) { + chainId = useSupportedChainId(chainId); + const council = useReadCouncil({ chainId }); + const enabled = !!account && !!chainId && !!council; + return useQuery({ + queryKey: [ + "votingPower", + chainId, + votingContract.address, + account, + block?.toString(), + ], enabled, queryFn: enabled - ? () => - Promise.all( - coreVoting.vaults.map(({ getVotingPower }) => - getVotingPower({ account: accountToUse, atBlock }), - ), - ) - : undefined, - }); + ? async () => { + let totalVotingPower = 0n; + const vaultPowers = await Promise.all( + votingContract.vaults.map(async (vault) => { + const votingPower = await getVotingPower({ + chainId, + vault: vault.address, + voter: account, + block, + }); + totalVotingPower += votingPower; - const votingPower = data?.reduce((a, b) => a + b, 0n); + return { + vaultName: vault.name, + vaultAddress: vault.address, + votingPower, + }; + }), + ); - return { - votingPower, - /** - * All voting power is formatted as a string with 18 decimal places. - */ - votingPowerFormatted: - votingPower !== undefined ? formatEther(votingPower) : undefined, - status, - }; + return { + vaultPowers, + totalVotingPower, + }; + } + : undefined, + }); } diff --git a/apps/council-ui/src/ui/vaults/hooks/useVotingPowerByVault.ts b/apps/council-ui/src/ui/vaults/hooks/useVotingPowerByVault.ts deleted file mode 100644 index 25f1e520..00000000 --- a/apps/council-ui/src/ui/vaults/hooks/useVotingPowerByVault.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { BlockLike, ReadVotingVault } from "@delvtech/council-core"; -import { FetchStatus, QueryStatus, useQuery } from "@tanstack/react-query"; -import { useCouncilConfig } from "src/ui/config/hooks/useCouncilConfig"; -import { useReadCouncil } from "src/ui/council/hooks/useReadCouncil"; -import { useSupportedChainId } from "src/ui/network/hooks/useSupportedChainId"; -import { formatEther } from "viem"; -import { useAccount } from "wagmi"; - -interface UseVotingPowerByVaultOptions { - vaults: (ReadVotingVault | `0x${string}`)[]; - account?: `0x${string}`; - atBlock?: BlockLike; -} - -/** - * Get the voting power of a wallet in all configured vaults. - * @param account The account to get voting power for. If not provided, the - * connected account will be used. - */ -export default function useVotingPowerByVault({ - vaults: _vaults, - account, - atBlock, -}: UseVotingPowerByVaultOptions): { - votingPowerByVault: - | { - name: string; - address: `0x${string}`; - votingPower: bigint; - votingPowerFormatted: string; - }[] - | undefined; - status: QueryStatus; - fetchStatus: FetchStatus; -} { - const chainId = useSupportedChainId(); - const council = useReadCouncil(); - const config = useCouncilConfig(); - - const vaults = _vaults.map((vault) => - typeof vault === "string" ? council.votingVault(vault) : vault, - ); - - const { address: connectedAccount } = useAccount(); - const accountToUse = account ?? connectedAccount; - - const enabled = !!accountToUse; - - const { data, status, fetchStatus } = useQuery({ - queryKey: ["votingPowerByVault", account, chainId, Number(atBlock)], - enabled, - queryFn: enabled - ? async () => { - return Promise.all( - vaults.map(async (vault) => { - let name = vault.name; - - if (vault.address === config.gscVoting?.vault.address) { - name = config.gscVoting?.vault.name; - } - - const vaultConfig = config.coreVoting.vaults.find( - ({ address }) => address === vault.address, - ); - - if (vaultConfig) { - name = vaultConfig.name; - } - - const votingPower = await vault.getVotingPower({ - account: accountToUse, - atBlock, - }); - - return { - name, - address: vault.address, - votingPower, - /** - * All voting power is formatted as a string with 18 decimal places. - */ - votingPowerFormatted: formatEther(votingPower), - }; - }), - ); - } - : undefined, - }); - - return { - votingPowerByVault: data, - status, - fetchStatus, - }; -} diff --git a/apps/council-ui/src/ui/vaults/lockingVault/LockingVaultDetails.tsx b/apps/council-ui/src/ui/vaults/lockingVault/LockingVaultDetails.tsx index a5d9d741..76fd3637 100644 --- a/apps/council-ui/src/ui/vaults/lockingVault/LockingVaultDetails.tsx +++ b/apps/council-ui/src/ui/vaults/lockingVault/LockingVaultDetails.tsx @@ -1,11 +1,10 @@ import { useQuery, UseQueryResult } from "@tanstack/react-query"; import { ReactElement } from "react"; +import { getVaultConfig } from "src/config/utils/getVaultConfig"; import { ErrorMessage } from "src/ui/base/error/ErrorMessage"; import { makeTransactionErrorToast } from "src/ui/base/toast/makeTransactionErrorToast"; -import { useVaultConfig } from "src/ui/config/hooks/useVaultConfig"; -import { useReadCouncil } from "src/ui/council/hooks/useReadCouncil"; -import { useSupportedChainId } from "src/ui/network/hooks/useSupportedChainId"; - +import { useReadCouncil } from "src/ui/council/useReadCouncil"; +import { useSupportedChainId } from "src/ui/network/useSupportedChainId"; import { ChangeDelegateForm } from "src/ui/vaults/ChangeDelegateForm"; import { DepositAndWithdrawForm } from "src/ui/vaults/DepositAndWithdrawForm"; import { useApprove } from "src/ui/vaults/lockingVault/hooks/useApprove"; @@ -16,6 +15,7 @@ import { LockingVaultStatsRow } from "src/ui/vaults/lockingVault/LockingVaultSta import { VaultDetails } from "src/ui/vaults/VaultDetails/VaultDetails"; import { VaultDetailsSkeleton } from "src/ui/vaults/VaultDetails/VaultDetailsSkeleton"; import { VaultHeader } from "src/ui/vaults/VaultHeader"; +import { getVotingPower } from "src/utils/vaults/getVotingPower"; import { isAddress } from "viem"; import { useAccount, usePublicClient } from "wagmi"; @@ -26,15 +26,18 @@ interface LockingVaultDetailsProps { export function LockingVaultDetails({ address, }: LockingVaultDetailsProps): ReactElement { + const publicClient = usePublicClient(); const { address: account } = useAccount(); - const chainId = useSupportedChainId(); const { data, status, error } = useLockingVaultDetailsData(address, account); - const publicClient = usePublicClient(); + const chainId = useSupportedChainId(); + const vaultConfig = getVaultConfig({ address, chainId }); + const name = vaultConfig?.name || "Locking Vault"; - const { changeDelegate, status: changeDelegateStatus } = useChangeDelegate(); - const { deposit, status: depositStatus } = useDeposit(); - const { withdraw, status: withdrawStatus } = useWithdraw(); - const { approve, status: approveStatus } = useApprove(); + const { write: changeDelegate, status: changeDelegateStatus } = + useChangeDelegate(); + const { write: deposit, status: depositStatus } = useDeposit(); + const { write: withdraw, status: withdrawStatus } = useWithdraw(); + const { write: approve, status: approveStatus } = useApprove(); const isTransacting = [ changeDelegateStatus, @@ -63,7 +66,7 @@ export function LockingVaultDetails({ ); return; } - return changeDelegate?.({ + changeDelegate?.({ newDelegate: delegateAddress as `0x${string}`, vaultAddress: address, }); @@ -71,10 +74,10 @@ export function LockingVaultDetails({ return ( + } statsRow={ approve?.(address)} - onDeposit={(amount) => + onDeposit={(amount) => { deposit?.({ amount, vaultAddress: address, - }) - } + }); + }} onWithdraw={(amount) => withdraw?.({ amount, vaultAddress: address, }) } - decimals={data.decimals} + decimals={data.tokenDecimals} /> { + const chainId = useSupportedChainId(); const council = useReadCouncil(); - const vaultConfig = useVaultConfig(address); + const enabled = !!council; return useQuery({ - queryKey: ["lockingVaultDetails", address, account, vaultConfig], - queryFn: async (): Promise => { - const lockingVault = council.lockingVault(address); - const token = await lockingVault.getToken(); - const delegate = account - ? await lockingVault.getDelegate({ account }) - : undefined; - const accountVotingPower = account - ? await lockingVault.getVotingPower({ account }) - : 0n; + queryKey: ["lockingVaultDetails", address, account], + enabled, + queryFn: enabled + ? async (): Promise => { + const lockingVault = council.lockingVault(address); - return { - accountVotingPower, + const [token, voters, accountVotingPower, delegate, delegators] = + await Promise.all([ + lockingVault.getToken(), + lockingVault.getVoters(), + account + ? getVotingPower({ + chainId, + vault: address, + voter: account, + }) + : 0n, + account ? lockingVault.getDelegate(account) : undefined, + account ? lockingVault.getDelegatorsTo(account) : [], + ]); - tokenAddress: token.address, - tokenSymbol: await token.getSymbol(), - tokenBalance: account ? await token.getBalanceOf({ account }) : 0n, - tokenAllowance: account - ? await token.getAllowance({ - owner: account, - spender: address, - }) - : 0n, - depositedBalance: account - ? await lockingVault.getDepositedBalance({ account }) - : 0n, + const [ + tokenSymbol, + tokenDecimals, + tokenBalance, + tokenAllowance, + depositedBalance, + ] = await Promise.all([ + token.getSymbol(), + token.getDecimals(), + account ? token.getBalanceOf(account) : 0n, + account + ? token.getAllowance({ + owner: account, + spender: address, + }) + : 0n, + account ? lockingVault.getBalanceOf(account) : 0n, + ]); - delegate: delegate?.address, - descriptionURL: vaultConfig?.descriptionURL, - paragraphSummary: vaultConfig?.paragraphSummary, - name: vaultConfig?.name, - participants: (await lockingVault.getVoters()).length, - delegatedToAccount: account - ? (await lockingVault.getDelegatorsTo({ account })).length - : 0, - decimals: await token.getDecimals(), - }; - }, + return { + participants: voters.length, + accountVotingPower, + delegate, + delegatedToAccount: delegators.length, + tokenAddress: token.address, + tokenSymbol, + tokenDecimals, + tokenBalance, + tokenAllowance, + depositedBalance, + }; + } + : undefined, }); } diff --git a/apps/council-ui/src/ui/vaults/lockingVault/LockingVaultStatsRow.tsx b/apps/council-ui/src/ui/vaults/lockingVault/LockingVaultStatsRow.tsx index e13a2392..cf537671 100644 --- a/apps/council-ui/src/ui/vaults/lockingVault/LockingVaultStatsRow.tsx +++ b/apps/council-ui/src/ui/vaults/lockingVault/LockingVaultStatsRow.tsx @@ -3,7 +3,7 @@ import { Stat } from "src/ui/base/Stat"; import { DefinitionTooltip } from "src/ui/base/Tooltip"; import { formatVotingPower } from "src/ui/base/formatting/formatVotingPower"; import ExternalLink from "src/ui/base/links/ExternalLink"; -import { useSupportedChainId } from "src/ui/network/hooks/useSupportedChainId"; +import { useSupportedChainId } from "src/ui/network/useSupportedChainId"; import { PARTICIPANTS_TIP, WALLETS_DELEGATED_TIP, diff --git a/apps/council-ui/src/ui/vaults/lockingVault/LockingVaultsProfileCard.tsx b/apps/council-ui/src/ui/vaults/lockingVault/LockingVaultsProfileCard.tsx index bfdfed32..482d9eac 100644 --- a/apps/council-ui/src/ui/vaults/lockingVault/LockingVaultsProfileCard.tsx +++ b/apps/council-ui/src/ui/vaults/lockingVault/LockingVaultsProfileCard.tsx @@ -1,16 +1,16 @@ -import { VoterPowerBreakdown } from "@delvtech/council-viem"; import { BuildingLibraryIcon } from "@heroicons/react/20/solid"; import { useQuery } from "@tanstack/react-query"; import Link from "next/link"; import { ReactElement } from "react"; +import { getVaultConfig } from "src/config/utils/getVaultConfig"; import { makeVoterURL } from "src/routes"; import { Tooltip } from "src/ui/base/Tooltip"; import { WalletIcon } from "src/ui/base/WalletIcon"; import { formatUnitsBalance } from "src/ui/base/formatting/formatUnitsBalance"; import { formatVotingPower } from "src/ui/base/formatting/formatVotingPower"; import { useDisplayName } from "src/ui/base/formatting/useDisplayName"; -import { useVaultConfig } from "src/ui/config/hooks/useVaultConfig"; -import { useReadCouncil } from "src/ui/council/hooks/useReadCouncil"; +import { useSupportedChainId } from "src/ui/network/useSupportedChainId"; +import { useReadCouncil } from "src/ui/council/useReadCouncil"; import { DelegatorListModal } from "src/ui/vaults/DelegatorListModal"; import { VaultProfileCard } from "src/ui/vaults/VaultProfileCard"; import { VaultProfileCardSkeleton } from "src/ui/vaults/VaultProfileCardSkeleton"; @@ -29,22 +29,20 @@ export function LockingVaultProfileCard({ address, profileAddress, }: LockingVaultProfileCardProps): ReactElement { - // data const { data } = useLockingVaultProfileCardData(address, profileAddress); const profileName = useDisplayName(profileAddress); - const delegateName = useDisplayName(data?.delegate.address); + const delegateName = useDisplayName(data?.delegate); + const chainId = useSupportedChainId(); + const config = getVaultConfig({ address, chainId }); + const name = config?.name || "Locking Vault"; + const { address: account } = useAccount(); - const { delegate: accountDelegate } = useDelegate({ - account, + const { data: accountDelegate } = useDelegate({ + voter: account, vault: address, }); - // config - const config = useVaultConfig(address); - const name = config?.name || "Locking Vault"; - - // delegate transaction - const { changeDelegate } = useChangeDelegate(); + const { write: changeDelegate } = useChangeDelegate(); if (!data) { return ; @@ -55,7 +53,7 @@ export function LockingVaultProfileCard({ tokenSymbol, votingPowerBreakdown, delegate, - delegateIsGSCMember, + delegateIsGscMember: delegateIsGSCMember, decimals, } = data || {}; @@ -83,18 +81,14 @@ export function LockingVaultProfileCard({ { label: "Current Delegate", value: - delegate.address === zeroAddress ? ( + delegate === zeroAddress ? ( "None" ) : ( - + {delegateName} {delegateIsGSCMember && ( @@ -106,17 +100,17 @@ export function LockingVaultProfileCard({ }, { label: "# of Delegators", - value: votingPowerBreakdown?.votingPowerByDelegator.length ? ( + value: votingPowerBreakdown?.delegators.length ? ( <> @@ -128,8 +122,7 @@ export function LockingVaultProfileCard({ ]} button={{ text: "Delegate", - disabled: - !changeDelegate || accountDelegate?.address === profileAddress, + disabled: !changeDelegate || accountDelegate === profileAddress, onClick: () => changeDelegate!({ vaultAddress: address, @@ -146,33 +139,41 @@ function useLockingVaultProfileCardData( ) { const council = useReadCouncil(); const gscVault = useReadGscVault(); + const enabled = !!council; + return useQuery({ queryKey: ["locking-vault-profile-card", address, profileAddress], - queryFn: async () => { - const lockingVault = council.lockingVault(address); - const votingPowerBreakdowns = await lockingVault.getVotingPowerBreakdown({ - account: profileAddress, - }); + enabled, + queryFn: enabled + ? async () => { + const lockingVault = council.lockingVault(address); + + const [token, balance, delegate, [votingPowerBreakdown]] = + await Promise.all([ + lockingVault.getToken(), + lockingVault.getBalanceOf(profileAddress), + lockingVault.getDelegate(profileAddress), + lockingVault.getVotingPowerBreakdown({ + voter: profileAddress, + }), + ]); - const token = await lockingVault.getToken(); - const delegate = await lockingVault.getDelegate({ - account: profileAddress, - }); + const [decimals, tokenSymbol, delegateIsGscMember] = + await Promise.all([ + token.getDecimals(), + token.getSymbol(), + gscVault?.getIsMember(delegate), + ]); - return { - balance: await lockingVault.getDepositedBalance({ - account: profileAddress, - }), - decimals: await token.getDecimals(), - tokenSymbol: await token.getSymbol(), - votingPowerBreakdown: votingPowerBreakdowns[0] as - | VoterPowerBreakdown - | undefined, - delegate, - delegateIsGSCMember: - gscVault && - (await gscVault.getIsMember({ account: delegate.address })), - }; - }, + return { + balance, + decimals, + tokenSymbol, + votingPowerBreakdown, + delegate, + delegateIsGscMember, + }; + } + : undefined, }); } diff --git a/apps/council-ui/src/ui/vaults/lockingVault/hooks/useApprove.ts b/apps/council-ui/src/ui/vaults/lockingVault/hooks/useApprove.ts index 5e2171d4..ff8653fc 100644 --- a/apps/council-ui/src/ui/vaults/lockingVault/hooks/useApprove.ts +++ b/apps/council-ui/src/ui/vaults/lockingVault/hooks/useApprove.ts @@ -1,41 +1,24 @@ -import { MutationStatus } from "@tanstack/react-query"; -import { useWrite } from "src/ui/contract/hooks/useWrite"; -import { useReadWriteCouncil } from "src/ui/council/hooks/useReadWriteCouncil"; +import { useWrite } from "src/ui/contract/useWrite"; +import { useReadWriteCouncil } from "src/ui/council/useReadWriteCouncil"; import { maxUint256 } from "viem"; -import { useAccount } from "wagmi"; -export function useApprove(): { - approve: ((vaultAddress: `0x${string}`) => void) | undefined; - status: MutationStatus; - transactionHash: `0x${string}` | undefined; -} { +export function useApprove() { const council = useReadWriteCouncil(); - const { address } = useAccount(); - const enabled = !!council && !!address; - - const { status, transactionHash, write } = useWrite({ + const enabled = !!council; + return useWrite({ pendingMessage: "Approving...", successMessage: "Approved!", errorMessage: "Failed to approve.", - writeFn: async (vaultAddress: `0x${string}`) => { - if (!enabled) { - throw new Error( - "Connection to council not available. Check your wallet connection.", - ); - } - - const token = await council.lockingVault(vaultAddress).getToken(); - return token.approve({ - amount: maxUint256, - owner: address, - spender: vaultAddress, - }); - }, + writeFn: enabled + ? async (vaultAddress: `0x${string}`) => { + const token = await council.lockingVault(vaultAddress).getToken(); + return token.approve({ + args: { + amount: maxUint256, + spender: vaultAddress, + }, + }); + } + : undefined, }); - - return { - approve: enabled ? write : undefined, - status, - transactionHash, - }; } diff --git a/apps/council-ui/src/ui/vaults/lockingVault/hooks/useChangeDelegate.ts b/apps/council-ui/src/ui/vaults/lockingVault/hooks/useChangeDelegate.ts index 413c13c6..5f5dd93f 100644 --- a/apps/council-ui/src/ui/vaults/lockingVault/hooks/useChangeDelegate.ts +++ b/apps/council-ui/src/ui/vaults/lockingVault/hooks/useChangeDelegate.ts @@ -1,43 +1,28 @@ -import { MutationStatus } from "@tanstack/react-query"; -import { useWrite } from "src/ui/contract/hooks/useWrite"; -import { useReadWriteCouncil } from "src/ui/council/hooks/useReadWriteCouncil"; +import { Address } from "@delvtech/drift"; +import { useWrite } from "src/ui/contract/useWrite"; +import { useReadWriteCouncil } from "src/ui/council/useReadWriteCouncil"; export interface ChangeDelegateOptions { - vaultAddress: `0x${string}`; - newDelegate: `0x${string}`; + vaultAddress: Address; + newDelegate: Address; } -export function useChangeDelegate(): { - changeDelegate: ((options: ChangeDelegateOptions) => void) | undefined; - status: MutationStatus; - transactionHash: `0x${string}` | undefined; -} { +export function useChangeDelegate() { const council = useReadWriteCouncil(); const enabled = !!council; - - const { write, status, transactionHash } = useWrite({ + return useWrite({ pendingMessage: "Changing delegate...", successMessage: "Delegate changed!", errorMessage: "Failed to change delegate.", - writeFn: ({ - newDelegate, - vaultAddress, - }: ChangeDelegateOptions): Promise<`0x${string}`> => { - if (!enabled) { - throw new Error( - "Connection to council not available. Check your wallet connection.", - ); - } - - return council - .lockingVault(vaultAddress) - .changeDelegate({ delegate: newDelegate }); - }, + writeFn: enabled + ? ({ + newDelegate, + vaultAddress, + }: ChangeDelegateOptions): Promise
=> { + return council + .lockingVault(vaultAddress) + .changeDelegate({ args: { newDelegate } }); + } + : undefined, }); - - return { - changeDelegate: enabled ? write : undefined, - status, - transactionHash, - }; } diff --git a/apps/council-ui/src/ui/vaults/lockingVault/hooks/useDelegate.ts b/apps/council-ui/src/ui/vaults/lockingVault/hooks/useDelegate.ts index 4b988554..1977be27 100644 --- a/apps/council-ui/src/ui/vaults/lockingVault/hooks/useDelegate.ts +++ b/apps/council-ui/src/ui/vaults/lockingVault/hooks/useDelegate.ts @@ -1,38 +1,22 @@ -import { ReadLockingVault, ReadVoter } from "@delvtech/council-viem"; -import { QueryStatus, useQuery } from "@tanstack/react-query"; -import { useReadCouncil } from "src/ui/council/hooks/useReadCouncil"; +import { Address } from "@delvtech/drift"; +import { useQuery } from "@tanstack/react-query"; +import { SupportedChainId } from "src/config/council.config"; +import { useReadCouncil } from "src/ui/council/useReadCouncil"; interface UseDelegateOptions { - vault: ReadLockingVault | `0x${string}` | undefined; - account: `0x${string}` | undefined; + vault: Address | undefined; + voter: Address | undefined; + chainId?: SupportedChainId; } -interface DelegateResult { - delegate: ReadVoter; - status: QueryStatus; -} - -export function useDelegate({ - vault, - account, -}: UseDelegateOptions): DelegateResult { - const council = useReadCouncil(); - const enabled = !!vault && !!account; - - const { data, status } = useQuery({ - queryKey: ["delegate", vault, account], +export function useDelegate({ vault, voter, chainId }: UseDelegateOptions) { + const council = useReadCouncil({ chainId }); + const enabled = !!vault && !!voter && !!council; + return useQuery({ + queryKey: ["useDelegate", vault, voter, chainId], enabled, queryFn: enabled - ? () => { - const _vault = - typeof vault === "string" ? council.lockingVault(vault) : vault; - return _vault.getDelegate({ account }); - } + ? () => council.lockingVault(vault).getDelegate(voter) : undefined, }); - - return { - delegate: data as ReadVoter, - status, - }; } diff --git a/apps/council-ui/src/ui/vaults/lockingVault/hooks/useDeposit.ts b/apps/council-ui/src/ui/vaults/lockingVault/hooks/useDeposit.ts index 9b476a26..7974313a 100644 --- a/apps/council-ui/src/ui/vaults/lockingVault/hooks/useDeposit.ts +++ b/apps/council-ui/src/ui/vaults/lockingVault/hooks/useDeposit.ts @@ -1,46 +1,33 @@ -import { MutationStatus } from "@tanstack/react-query"; -import { useWrite } from "src/ui/contract/hooks/useWrite"; -import { useReadWriteCouncil } from "src/ui/council/hooks/useReadWriteCouncil"; +import { Address } from "@delvtech/drift"; +import { useWrite } from "src/ui/contract/useWrite"; +import { useReadWriteCouncil } from "src/ui/council/useReadWriteCouncil"; export interface DepositOptions { - vaultAddress: `0x${string}`; + vaultAddress: Address; amount: bigint; - account?: `0x${string}`; + account?: Address; } -export function useDeposit(): { - deposit: ((options: DepositOptions) => void) | undefined; - status: MutationStatus; - transactionHash: `0x${string}` | undefined; -} { +export function useDeposit() { const council = useReadWriteCouncil(); const enabled = !!council; - - const { write, status, transactionHash } = useWrite({ + return useWrite({ pendingMessage: "Depositing...", successMessage: "Deposited!", errorMessage: "Failed to deposit.", - writeFn: ({ - vaultAddress, - amount, - account, - }: DepositOptions): Promise<`0x${string}`> => { - if (!enabled) { - throw new Error( - "Connection to council not available. Check your wallet connection.", - ); - } - - return council.lockingVault(vaultAddress).deposit({ - account, - amount, - }); - }, + writeFn: enabled + ? ({ + vaultAddress, + amount, + account, + }: DepositOptions): Promise<`0x${string}`> => { + return council.lockingVault(vaultAddress).deposit({ + args: { + account, + amount, + }, + }); + } + : undefined, }); - - return { - deposit: enabled ? write : undefined, - status, - transactionHash, - }; } diff --git a/apps/council-ui/src/ui/vaults/lockingVault/hooks/useWithdraw.ts b/apps/council-ui/src/ui/vaults/lockingVault/hooks/useWithdraw.ts index 7e0959a4..cce1db54 100644 --- a/apps/council-ui/src/ui/vaults/lockingVault/hooks/useWithdraw.ts +++ b/apps/council-ui/src/ui/vaults/lockingVault/hooks/useWithdraw.ts @@ -1,43 +1,30 @@ -import { MutationStatus } from "@tanstack/react-query"; -import { useWrite } from "src/ui/contract/hooks/useWrite"; -import { useReadWriteCouncil } from "src/ui/council/hooks/useReadWriteCouncil"; +import { useWrite } from "src/ui/contract/useWrite"; +import { useReadWriteCouncil } from "src/ui/council/useReadWriteCouncil"; export interface WithdrawOptions { vaultAddress: `0x${string}`; amount: bigint; } -export function useWithdraw(): { - withdraw: ((options: WithdrawOptions) => void) | undefined; - status: MutationStatus; - transactionHash: `0x${string}` | undefined; -} { +export function useWithdraw() { const council = useReadWriteCouncil(); const enabled = !!council; - - const { write, status, transactionHash } = useWrite({ + return useWrite({ pendingMessage: "Withdrawing...", successMessage: "Withdrawn!", errorMessage: "Failed to withdraw.", - writeFn: ({ - vaultAddress, - amount, - }: WithdrawOptions): Promise<`0x${string}`> => { - if (!enabled) { - throw new Error( - "Connection to council not available. Check your wallet connection.", - ); - } + writeFn: enabled + ? ({ vaultAddress, amount }: WithdrawOptions): Promise<`0x${string}`> => { + if (!enabled) { + throw new Error( + "Connection to council not available. Check your wallet connection.", + ); + } - return council.lockingVault(vaultAddress).withdraw({ - amount, - }); - }, + return council.lockingVault(vaultAddress).withdraw({ + args: { amount }, + }); + } + : undefined, }); - - return { - withdraw: enabled ? write : undefined, - status, - transactionHash, - }; } diff --git a/apps/council-ui/src/ui/vaults/vestingVault/VestingVaultDetails.tsx b/apps/council-ui/src/ui/vaults/vestingVault/VestingVaultDetails.tsx index 1ab5d758..a9eee1fc 100644 --- a/apps/council-ui/src/ui/vaults/vestingVault/VestingVaultDetails.tsx +++ b/apps/council-ui/src/ui/vaults/vestingVault/VestingVaultDetails.tsx @@ -1,9 +1,10 @@ import { useQuery, UseQueryResult } from "@tanstack/react-query"; import { ReactElement } from "react"; +import { getVaultConfig } from "src/config/utils/getVaultConfig"; import { ErrorMessage } from "src/ui/base/error/ErrorMessage"; import { getBlockDate } from "src/ui/base/utils/getBlockDate"; -import { useVaultConfig } from "src/ui/config/hooks/useVaultConfig"; -import { useReadCouncil } from "src/ui/council/hooks/useReadCouncil"; +import { useReadCouncil } from "src/ui/council/useReadCouncil"; +import { useSupportedChainId } from "src/ui/network/useSupportedChainId"; import { ChangeDelegateForm } from "src/ui/vaults/ChangeDelegateForm"; import { VaultDetails } from "src/ui/vaults/VaultDetails/VaultDetails"; import { VaultDetailsSkeleton } from "src/ui/vaults/VaultDetails/VaultDetailsSkeleton"; @@ -11,10 +12,12 @@ import { VaultHeader } from "src/ui/vaults/VaultHeader"; import { GrantCard } from "src/ui/vaults/vestingVault/GrantCard"; import { useChangeDelegate } from "src/ui/vaults/vestingVault/hooks/useChangeDelegate"; import { VestingVaultStatsRow } from "src/ui/vaults/vestingVault/VestingVaultStatsRow"; -import { useAccount, usePublicClient } from "wagmi"; +import { getVotingPower } from "src/utils/vaults/getVotingPower"; +import { Address } from "viem"; +import { useAccount } from "wagmi"; interface VestingVaultDetailsProps { - address: `0x${string}`; + address: Address; } export function VestingVaultDetails({ @@ -22,7 +25,11 @@ export function VestingVaultDetails({ }: VestingVaultDetailsProps): ReactElement { const { address: account } = useAccount(); const { data, status, error } = useVestingVaultDetailsData(address, account); - const { changeDelegate } = useChangeDelegate(); + const chainId = useSupportedChainId(); + const vaultConfig = getVaultConfig({ address, chainId }); + const name = vaultConfig?.name || "Vesting Vault"; + + const { write: changeDelegate } = useChangeDelegate(); if (status === "error") { return ; @@ -33,10 +40,10 @@ export function VestingVaultDetails({ } return ( + } statsRow={ { + const chainId = useSupportedChainId(); const council = useReadCouncil(); - const vaultConfig = useVaultConfig(address); - const publicClient = usePublicClient(); + const enabled = !!council; return useQuery({ queryKey: ["vestingVaultDetails", address, account], - queryFn: async (): Promise => { - const vestingVault = council.vestingVault(address); - const token = await vestingVault.getToken(); - const grant = account - ? await vestingVault.getGrant({ account }) - : undefined; - const accountVotingPower = account - ? await vestingVault.getVotingPower({ account }) - : 0n; + enabled, + queryFn: enabled + ? async (): Promise => { + const vestingVault = council.vestingVault(address); + + const [ + token, + voters, + unvestedMultiplier, + grant, + delegate, + delegators, + accountVotingPower, + ] = await Promise.all([ + vestingVault.getToken(), + vestingVault.getVoters(), + vestingVault.getUnvestedMultiplier(), + account ? vestingVault.getGrant(account) : undefined, + account ? vestingVault.getDelegate(account) : undefined, + account ? vestingVault.getDelegatorsTo(account) : [], + account + ? getVotingPower({ + chainId, + vault: address, + voter: account, + }) + : 0n, + ]); + + const [tokenSymbol, tokenDecimals, unlockDate, expirationDate] = + await Promise.all([ + token.getSymbol(), + token.getDecimals(), + grant ? await getBlockDate(grant.cliffBlock, chainId) : undefined, + grant + ? await getBlockDate(grant.expirationBlock, chainId) + : undefined, + ]); - return { - tokenAddress: token.address, - tokenSymbol: await token.getSymbol(), - decimals: await token.getDecimals(), - grantBalance: grant?.allocation || 0n, - grantBalanceWithdrawn: grant?.withdrawn || 0n, - paragraphSummary: vaultConfig?.paragraphSummary, - unlockDate: grant - ? await getBlockDate(grant.cliff, publicClient) - : undefined, - expirationDate: grant - ? await getBlockDate(grant.expiration, publicClient) - : undefined, - delegate: account - ? (await vestingVault.getDelegate({ account })).address - : undefined, - descriptionURL: vaultConfig?.descriptionURL, - name: vaultConfig?.name, - accountVotingPower, - unvestedMultiplier: await vestingVault.getUnvestedMultiplier(), - participants: (await vestingVault.getVoters()).length, - delegatedToAccount: account - ? (await vestingVault.getDelegatorsTo({ account })).length - : 0, - }; - }, + return { + participants: voters.length, + unvestedMultiplier, + grantBalance: grant?.allocation || 0n, + grantBalanceWithdrawn: grant?.withdrawn || 0n, + accountVotingPower, + delegate, + delegatedToAccount: delegators.length, + tokenAddress: token.address, + tokenSymbol, + tokenDecimals, + unlockDate, + expirationDate, + }; + } + : undefined, }); } diff --git a/apps/council-ui/src/ui/vaults/vestingVault/VestingVaultProfileCard.tsx b/apps/council-ui/src/ui/vaults/vestingVault/VestingVaultProfileCard.tsx index 94f3ce44..c66299c0 100644 --- a/apps/council-ui/src/ui/vaults/vestingVault/VestingVaultProfileCard.tsx +++ b/apps/council-ui/src/ui/vaults/vestingVault/VestingVaultProfileCard.tsx @@ -1,16 +1,17 @@ -import { VoterPowerBreakdown } from "@delvtech/council-viem"; +import { Address } from "@delvtech/drift"; import { BuildingLibraryIcon } from "@heroicons/react/20/solid"; import { useQuery } from "@tanstack/react-query"; import Link from "next/link"; import { ReactElement } from "react"; +import { getVaultConfig } from "src/config/utils/getVaultConfig"; import { makeVoterURL } from "src/routes"; import { Tooltip } from "src/ui/base/Tooltip"; import { WalletIcon } from "src/ui/base/WalletIcon"; import { formatUnitsBalance } from "src/ui/base/formatting/formatUnitsBalance"; import { formatVotingPower } from "src/ui/base/formatting/formatVotingPower"; import { useDisplayName } from "src/ui/base/formatting/useDisplayName"; -import { useVaultConfig } from "src/ui/config/hooks/useVaultConfig"; -import { useReadCouncil } from "src/ui/council/hooks/useReadCouncil"; +import { useSupportedChainId } from "src/ui/network/useSupportedChainId"; +import { useReadCouncil } from "src/ui/council/useReadCouncil"; import { DelegatorListModal } from "src/ui/vaults/DelegatorListModal"; import { VaultProfileCard } from "src/ui/vaults/VaultProfileCard"; import { VaultProfileCardSkeleton } from "src/ui/vaults/VaultProfileCardSkeleton"; @@ -29,22 +30,20 @@ export function VestingVaultProfileCard({ address, profileAddress, }: VestingVaultProfileCardProps): ReactElement { - // data const { data } = useVestingVaultProfileCardData(address, profileAddress); const profileName = useDisplayName(profileAddress); - const delegateName = useDisplayName(data?.delegate.address); + const delegateName = useDisplayName(data?.delegate); + const chainId = useSupportedChainId(); + const config = getVaultConfig({ address, chainId }); + const name = config?.name || "Vesting Vault"; + const { address: account } = useAccount(); - const { delegate: accountDelegate } = useDelegate({ + const { data: accountDelegate } = useDelegate({ vault: address, account, }); - // config - const config = useVaultConfig(address); - const name = config?.name || "Vesting Vault"; - - // delegate transaction - const { changeDelegate } = useChangeDelegate(); + const { write: changeDelegate } = useChangeDelegate(); if (!data) { return ; @@ -56,7 +55,7 @@ export function VestingVaultProfileCard({ tokenSymbol, votingPowerBreakdown, delegate, - delegateIsGSCMember, + delegateIsGscMember: delegateIsGSCMember, } = data || {}; return ( @@ -80,18 +79,14 @@ export function VestingVaultProfileCard({ { label: "Current Delegate", value: - delegate.address === zeroAddress ? ( + delegate === zeroAddress ? ( "None" ) : ( - + {delegateName} {delegateIsGSCMember && ( @@ -103,17 +98,17 @@ export function VestingVaultProfileCard({ }, { label: "# of Delegators", - value: votingPowerBreakdown?.votingPowerByDelegator.length ? ( + value: votingPowerBreakdown?.delegators.length ? ( <> @@ -125,8 +120,7 @@ export function VestingVaultProfileCard({ ]} button={{ text: "Delegate", - disabled: - !changeDelegate || accountDelegate?.address === profileAddress, + disabled: !changeDelegate || accountDelegate === profileAddress, onClick: () => changeDelegate!({ vaultAddress: address, @@ -138,41 +132,46 @@ export function VestingVaultProfileCard({ } function useVestingVaultProfileCardData( - address: `0x${string}`, - profileAddress: `0x${string}`, + address: Address, + profileAddress: Address, ) { const council = useReadCouncil(); const gscVault = useReadGscVault(); + const enabled = !!council; + return useQuery({ queryKey: ["vesting-vault-profile-card", address, profileAddress], - queryFn: async () => { - const vestingVault = council.vestingVault(address); - const votingPowerBreakdowns = await vestingVault.getVotingPowerBreakdown({ - account: profileAddress, - }); + enabled, + queryFn: enabled + ? async () => { + const vestingVault = council.vestingVault(address); - // FIXME: This isn't properly typed. evm-client isn't deriving the - // component types correctly. - const grant = await vestingVault.getGrant({ account: profileAddress }); - const token = await vestingVault.getToken(); - const delegate = await vestingVault.getDelegate({ - account: profileAddress, - }); + const [token, grant, delegate, [votingPowerBreakdown]] = + await Promise.all([ + vestingVault.getToken(), + vestingVault.getGrant(profileAddress), + vestingVault.getDelegate(profileAddress), + vestingVault.getVotingPowerBreakdown({ + voter: profileAddress, + }), + ]); - grant; + const [decimals, tokenSymbol, delegateIsGscMember] = + await Promise.all([ + token.getDecimals(), + token.getSymbol(), + gscVault?.getIsMember(delegate), + ]); - return { - grantSize: grant.allocation, - decimals: await token.getDecimals(), - tokenSymbol: await token.getSymbol(), - votingPowerBreakdown: votingPowerBreakdowns[0] as - | VoterPowerBreakdown - | undefined, - delegate, - delegateIsGSCMember: - gscVault && - (await gscVault.getIsMember({ account: delegate.address })), - }; - }, + return { + grantSize: grant.allocation, + decimals, + tokenSymbol, + votingPowerBreakdown, + delegate, + delegateIsGscMember, + }; + } + : undefined, }); } diff --git a/apps/council-ui/src/ui/vaults/vestingVault/VestingVaultStatsRow.tsx b/apps/council-ui/src/ui/vaults/vestingVault/VestingVaultStatsRow.tsx index abff9046..19be3204 100644 --- a/apps/council-ui/src/ui/vaults/vestingVault/VestingVaultStatsRow.tsx +++ b/apps/council-ui/src/ui/vaults/vestingVault/VestingVaultStatsRow.tsx @@ -3,7 +3,7 @@ import { Stat } from "src/ui/base/Stat"; import { DefinitionTooltip } from "src/ui/base/Tooltip"; import { formatVotingPower } from "src/ui/base/formatting/formatVotingPower"; import ExternalLink from "src/ui/base/links/ExternalLink"; -import { useSupportedChainId } from "src/ui/network/hooks/useSupportedChainId"; +import { useSupportedChainId } from "src/ui/network/useSupportedChainId"; import { PARTICIPANTS_TIP, WALLETS_DELEGATED_TIP, diff --git a/apps/council-ui/src/ui/vaults/vestingVault/hooks/useChangeDelegate.ts b/apps/council-ui/src/ui/vaults/vestingVault/hooks/useChangeDelegate.ts index 192a90e1..c9629799 100644 --- a/apps/council-ui/src/ui/vaults/vestingVault/hooks/useChangeDelegate.ts +++ b/apps/council-ui/src/ui/vaults/vestingVault/hooks/useChangeDelegate.ts @@ -1,43 +1,24 @@ -import { MutationStatus } from "@tanstack/react-query"; -import { useWrite } from "src/ui/contract/hooks/useWrite"; -import { useReadWriteCouncil } from "src/ui/council/hooks/useReadWriteCouncil"; +import { useWrite } from "src/ui/contract/useWrite"; +import { useReadWriteCouncil } from "src/ui/council/useReadWriteCouncil"; export interface ChangeDelegateOptions { vaultAddress: `0x${string}`; newDelegate: `0x${string}`; } -export function useChangeDelegate(): { - changeDelegate: ((options: ChangeDelegateOptions) => void) | undefined; - status: MutationStatus; - transactionHash: `0x${string}` | undefined; -} { +export function useChangeDelegate() { const council = useReadWriteCouncil(); const enabled = !!council; - - const { write, status, transactionHash } = useWrite({ + return useWrite({ pendingMessage: "Changing delegate...", successMessage: "Delegate changed!", errorMessage: "Failed to change delegate.", - writeFn: ({ - newDelegate, - vaultAddress, - }: ChangeDelegateOptions): Promise<`0x${string}`> => { - if (!enabled) { - throw new Error( - "Connection to council not available. Check your wallet connection.", - ); - } - - return council - .vestingVault(vaultAddress) - .changeDelegate({ delegate: newDelegate }); - }, + writeFn: enabled + ? ({ newDelegate, vaultAddress }: ChangeDelegateOptions) => { + return council + .vestingVault(vaultAddress) + .changeDelegate({ args: { newDelegate } }); + } + : undefined, }); - - return { - changeDelegate: enabled ? write : undefined, - status, - transactionHash, - }; } diff --git a/apps/council-ui/src/ui/vaults/vestingVault/hooks/useClaimGrant.ts b/apps/council-ui/src/ui/vaults/vestingVault/hooks/useClaimGrant.ts index 3fe6d3c6..0f67b705 100644 --- a/apps/council-ui/src/ui/vaults/vestingVault/hooks/useClaimGrant.ts +++ b/apps/council-ui/src/ui/vaults/vestingVault/hooks/useClaimGrant.ts @@ -1,6 +1,6 @@ import { MutationStatus } from "@tanstack/react-query"; -import { useWrite } from "src/ui/contract/hooks/useWrite"; -import { useReadWriteCouncil } from "src/ui/council/hooks/useReadWriteCouncil"; +import { useWrite } from "src/ui/contract/useWrite"; +import { useReadWriteCouncil } from "src/ui/council/useReadWriteCouncil"; export function useClaimGrant(): { claimGrant: ((vaultAddress: `0x${string}`) => void) | undefined; diff --git a/apps/council-ui/src/ui/vaults/vestingVault/hooks/useDelegate.ts b/apps/council-ui/src/ui/vaults/vestingVault/hooks/useDelegate.ts index b48f4913..feb11e7f 100644 --- a/apps/council-ui/src/ui/vaults/vestingVault/hooks/useDelegate.ts +++ b/apps/council-ui/src/ui/vaults/vestingVault/hooks/useDelegate.ts @@ -1,38 +1,25 @@ -import { ReadVestingVault, ReadVoter } from "@delvtech/council-viem"; -import { QueryStatus, useQuery } from "@tanstack/react-query"; -import { useReadCouncil } from "src/ui/council/hooks/useReadCouncil"; +import { Address } from "@delvtech/drift"; +import { useQuery } from "@tanstack/react-query"; +import { useReadCouncil } from "src/ui/council/useReadCouncil"; interface UseDelegateOptions { - vault: ReadVestingVault | `0x${string}` | undefined; - account: `0x${string}` | undefined; + vault: Address; + account: Address | undefined; } -interface DelegateResult { - delegate: ReadVoter; - status: QueryStatus; -} - -export function useDelegate({ - vault, - account, -}: UseDelegateOptions): DelegateResult { +export function useDelegate({ vault, account }: UseDelegateOptions) { const council = useReadCouncil(); - const enabled = !!vault && !!account; + const enabled = !!account && !!council; - const { data, status } = useQuery({ + return useQuery({ queryKey: ["delegate", vault, account], enabled, queryFn: enabled ? () => { const _vault = typeof vault === "string" ? council.vestingVault(vault) : vault; - return _vault.getDelegate({ account }); + return _vault.getDelegate(account); } : undefined, }); - - return { - delegate: data as ReadVoter, - status, - }; } diff --git a/apps/council-ui/src/ui/voters/VoterAddress.tsx b/apps/council-ui/src/ui/voters/VoterAddress.tsx index 4d7c00bd..980165ce 100644 --- a/apps/council-ui/src/ui/voters/VoterAddress.tsx +++ b/apps/council-ui/src/ui/voters/VoterAddress.tsx @@ -4,10 +4,10 @@ import { ReactElement } from "react"; import { Tooltip } from "src/ui/base/Tooltip"; import { WalletIcon } from "src/ui/base/WalletIcon"; import { formatAddress } from "src/ui/base/formatting/formatAddress"; -import { useCouncilConfig } from "src/ui/config/hooks/useCouncilConfig"; -import { useReadCoreVoting } from "src/ui/council/hooks/useReadCoreVoting"; +import { useCouncilConfig } from "src/ui/config/useCouncilConfig"; import { useIsGscMember } from "src/ui/vaults/gscVault/hooks/useIsGscMember"; import { useDelegatesByVault } from "src/ui/vaults/hooks/useDelegatesByVault"; +import { useAccount } from "wagmi"; interface VoterAddressProps { address: `0x${string}`; @@ -27,20 +27,18 @@ export function VoterAddress({ className, iconSize, }: VoterAddressProps): ReactElement { - const { isGscMember } = useIsGscMember(address); - const coreVotingVaults = useReadCoreVoting(); - const { delegatesByVault } = useDelegatesByVault({ - vaults: coreVotingVaults.vaults, - }); + const { data: isGscMember } = useIsGscMember(address); const config = useCouncilConfig(); + const { address: account } = useAccount(); + const { data: delegatesByVault } = useDelegatesByVault({ account }); const allVaults = config.coreVoting.vaults.slice(); if (config.gscVoting) { - allVaults.push(config.gscVoting.vault); + allVaults.push(config.gscVoting.vaults[0]); } - const vaultNames = allVaults + const delegateVaultNames = allVaults .map((vaultConfig) => { - if (delegatesByVault?.[vaultConfig.address]?.address === address) { + if (delegatesByVault?.[vaultConfig.address] === address) { return vaultConfig.name; } }) @@ -61,7 +59,7 @@ export function VoterAddress({ )} - {vaultNames.map((vaultName) => { + {delegateVaultNames.map((vaultName) => { return ( diff --git a/apps/council-ui/src/ui/voters/VoterList/VoterList.tsx b/apps/council-ui/src/ui/voters/VoterList/VoterList.tsx index f379870c..90bce40c 100644 --- a/apps/council-ui/src/ui/voters/VoterList/VoterList.tsx +++ b/apps/council-ui/src/ui/voters/VoterList/VoterList.tsx @@ -9,6 +9,7 @@ import { import { useDelegatesByVault } from "src/ui/vaults/hooks/useDelegatesByVault"; import { VoterRowData } from "src/ui/voters/types"; import { VoterAddress } from "src/ui/voters/VoterAddress"; +import { useAccount } from "wagmi"; type SortField = "numberOfDelegators" | "votingPower"; @@ -27,11 +28,13 @@ export function VoterList({ key: "votingPower", direction: "DESC", }); - - const { delegatesByVault = {} } = useDelegatesByVault(); + const { address: account } = useAccount(); + const { data: delegatesByVault = {} } = useDelegatesByVault({ + account, + }); // Memoized to prevent invalidating sortedVoters on every render. const delegateAddresses = useMemo( - () => Object.values(delegatesByVault).map(({ address }) => address), + () => Object.values(delegatesByVault), [delegatesByVault], ); diff --git a/apps/council-ui/src/ui/voters/VoterStatsRow.tsx b/apps/council-ui/src/ui/voters/VoterStatsRow.tsx index 9ada987c..981bdc04 100644 --- a/apps/council-ui/src/ui/voters/VoterStatsRow.tsx +++ b/apps/council-ui/src/ui/voters/VoterStatsRow.tsx @@ -2,7 +2,7 @@ import { ReactElement } from "react"; import { Stat } from "src/ui/base/Stat"; import { DefinitionTooltip } from "src/ui/base/Tooltip"; import { formatVotingPower } from "src/ui/base/formatting/formatVotingPower"; -import { GscStatus } from "src/utils/gscVault/types"; +import { GscStatus } from "src/utils/vaults/gsc/types"; interface VoterStatsRowProps { gscStatus: GscStatus | undefined; diff --git a/apps/council-ui/src/ui/voters/VoterVaultsList.tsx b/apps/council-ui/src/ui/voters/VoterVaultsList.tsx index 3d9897a1..5507f081 100644 --- a/apps/council-ui/src/ui/voters/VoterVaultsList.tsx +++ b/apps/council-ui/src/ui/voters/VoterVaultsList.tsx @@ -2,8 +2,9 @@ import { useQuery, UseQueryResult } from "@tanstack/react-query"; import { ReactElement } from "react"; import { formatAddress } from "src/ui/base/formatting/formatAddress"; import { formatVotingPower } from "src/ui/base/formatting/formatVotingPower"; -import { useCouncilConfig } from "src/ui/config/hooks/useCouncilConfig"; -import { useReadCoreVoting } from "src/ui/council/hooks/useReadCoreVoting"; +import { useCouncilConfig } from "src/ui/config/useCouncilConfig"; +import { useReadCouncil } from "src/ui/council/useReadCouncil"; +import { useSupportedChainId } from "src/ui/network/useSupportedChainId"; import { GSCVaultProfileCard } from "src/ui/vaults/gscVault/GscVaultProfileCard"; import { useReadGscVault } from "src/ui/vaults/gscVault/hooks/useReadGscVault"; import { useVaultVotingPower } from "src/ui/vaults/hooks/useVaultVotingPower"; @@ -11,7 +12,7 @@ import { LockingVaultProfileCard } from "src/ui/vaults/lockingVault/LockingVault import { VaultProfileCard } from "src/ui/vaults/VaultProfileCard"; import { VaultProfileCardSkeleton } from "src/ui/vaults/VaultProfileCardSkeleton"; import { VestingVaultProfileCard } from "src/ui/vaults/vestingVault/VestingVaultProfileCard"; -import { getIsGscEligible } from "src/utils/gscVault/getIsGscEligible"; +import { getIsGscEligible } from "src/utils/vaults/gsc/getIsGscEligible"; interface VoterVaultsListProps { account: `0x${string}`; @@ -20,7 +21,6 @@ interface VoterVaultsListProps { export function VoterVaultsList({ account, }: VoterVaultsListProps): ReactElement { - const coreVoting = useReadCoreVoting(); const config = useCouncilConfig(); const gscVault = useReadGscVault(); const { data: isGSCRelevant } = useIsGSCRelevant(account); @@ -28,7 +28,7 @@ export function VoterVaultsList({ return (
{/* core voting vaults */} - {coreVoting.vaults.map((vault) => { + {config.coreVoting.vaults.map((vault) => { const vaultConfig = config.coreVoting.vaults.find( (v) => v.address === vault.address, ); @@ -77,21 +77,23 @@ export function VoterVaultsList({ * are either a member or eligible. */ function useIsGSCRelevant(account: `0x${string}`): UseQueryResult { + const chainId = useSupportedChainId(); const gscVault = useReadGscVault(); - const coreVoting = useReadCoreVoting(); + const coreVoting = useReadCouncil(); + const enabled = !!account && !!gscVault && !!coreVoting; + return useQuery({ queryKey: ["is-gsc-relevant", account], queryFn: async () => { if (!gscVault) { return false; } - if (await gscVault.getIsMember({ account })) { + if (await gscVault.getIsMember(account)) { return true; } return getIsGscEligible({ account, - gscVault, - qualifyingVaults: coreVoting.vaults, + chainId, }); }, }); @@ -106,7 +108,7 @@ function DefaultVaultProfileCard({ address, profileAddress, }: DefaultVaultProfileCardProps) { - const { votingPower } = useVaultVotingPower({ + const { data: votingPower } = useVaultVotingPower({ vaultAddress: address, account: profileAddress, }); diff --git a/apps/council-ui/src/ui/voters/VotersListCompact.tsx b/apps/council-ui/src/ui/voters/VotersListCompact.tsx index 5442acd3..d92a0613 100644 --- a/apps/council-ui/src/ui/voters/VotersListCompact.tsx +++ b/apps/council-ui/src/ui/voters/VotersListCompact.tsx @@ -1,4 +1,4 @@ -import { VoterWithPower } from "@delvtech/council-viem"; +import { VoterWithPower } from "@delvtech/council-js"; import { ReactElement, useMemo, useState } from "react"; import { makeVoterURL } from "src/routes"; import { formatVotingPower } from "src/ui/base/formatting/formatVotingPower"; @@ -6,7 +6,7 @@ import { SortOptions, SortableGridTable, } from "src/ui/base/tables/SortableGridTable"; -import { useBulkEnsRecords } from "src/ui/ens/hooks/useBulkEnsRecords"; +import { useBulkEnsRecords } from "src/ui/ens/useBulkEnsRecords"; import { VoterAddress } from "src/ui/voters/VoterAddress"; interface VotersListCompactProps { @@ -44,7 +44,7 @@ export function VotersListCompact({ }, [sortOptions, voters]); const { data: ensRecords } = useBulkEnsRecords( - voters.map(({ voter }) => voter.address), + voters.map(({ voter }) => voter), ); return ( @@ -63,12 +63,12 @@ export function VotersListCompact({ onSort={setSortOptions} rows={sortedVoters.map(({ voter, votingPower }) => { return { - href: makeVoterURL(voter.address), + href: makeVoterURL(voter), cells: [ , formatVotingPower(votingPower, 0), ], diff --git a/apps/council-ui/src/ui/voters/VotingHistoryTable.tsx b/apps/council-ui/src/ui/voters/VotingHistoryTable.tsx index 909d503c..b977a5c4 100644 --- a/apps/council-ui/src/ui/voters/VotingHistoryTable.tsx +++ b/apps/council-ui/src/ui/voters/VotingHistoryTable.tsx @@ -1,21 +1,24 @@ -import { ReadVote } from "@delvtech/council-viem"; +import { Vote } from "@delvtech/council-js"; import { ReactElement } from "react"; -import { councilConfigs } from "src/config/council.config"; +import { VotingContractConfig } from "src/config/types"; +import { getProposalConfig } from "src/config/utils/getProposalConfig"; import { makeProposalURL } from "src/routes"; import { formatVotingPower } from "src/ui/base/formatting/formatVotingPower"; import { GridTableHeader } from "src/ui/base/tables/GridTableHeader"; import { GridTableRowLink } from "src/ui/base/tables/GridTableRowLink"; -import { useSupportedChainId } from "src/ui/network/hooks/useSupportedChainId"; +import { useSupportedChainId } from "src/ui/network/useSupportedChainId"; import FormattedBallot from "src/ui/voting/FormattedBallot"; interface VotingHistoryTableProps { - history: ReadVote[]; + votingContract: VotingContractConfig; + votes: Vote[]; } export function VotingHistoryTable({ - history, + votingContract, + votes, }: VotingHistoryTableProps): ReactElement { - if (history.length === 0) { + if (votes.length === 0) { return

No voting history for this account.

; } @@ -26,26 +29,34 @@ export function VotingHistoryTable({ Voting Power Vote - {history.map((vote, i) => ( - + {votes.map((vote, i) => ( + ))}
); } -function VoteHistoryRow({ vote }: { vote: ReadVote }): ReactElement { +function VoteHistoryRow({ + votingContract, + vote, +}: { + votingContract: VotingContractConfig; + vote: Vote; +}): ReactElement { const chainId = useSupportedChainId(); - const proposalsConfig = councilConfigs[chainId].coreVoting.proposals; - const proposal = vote.proposal; - const coreVoting = proposal.coreVoting; - const sentenceSummary = proposalsConfig[String(proposal.id)]?.sentenceSummary; + const proposalConfig = getProposalConfig({ + chainId, + votingContract: votingContract.address, + id: vote.proposalId, + }); + const sentenceSummary = proposalConfig?.sentenceSummary; return ( - {coreVoting.name} Proposal {String(proposal.id)} + {votingContract.name} Proposal {String(vote.proposalId)} {sentenceSummary && (

{sentenceSummary.length > 80 @@ -54,7 +65,7 @@ function VoteHistoryRow({ vote }: { vote: ReadVote }): ReactElement {

)}
- {formatVotingPower(vote.power)} + {formatVotingPower(vote.votingPower)} diff --git a/apps/council-ui/src/ui/voters/hooks/useVoterStats.ts b/apps/council-ui/src/ui/voters/hooks/useVoterStats.ts deleted file mode 100644 index 50b85e4c..00000000 --- a/apps/council-ui/src/ui/voters/hooks/useVoterStats.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { ReadVote } from "@delvtech/council-viem"; -import { QueryStatus, useQuery } from "@tanstack/react-query"; -import { useReadCoreVoting } from "src/ui/council/hooks/useReadCoreVoting"; -import { useReadCouncil } from "src/ui/council/hooks/useReadCouncil"; -import { useGscStatus } from "src/ui/vaults/gscVault/hooks/useGscStatus"; -import { GscStatus } from "src/utils/gscVault/types"; - -interface VoterStatistics { - votingHistory: ReadVote[]; - votingPower: bigint; - gscStatus: GscStatus | undefined; -} - -export function useVoterStats(address: `0x${string}` | undefined): { - data: VoterStatistics | undefined; - status: QueryStatus; -} { - const coreVoting = useReadCoreVoting(); - const council = useReadCouncil(); - const { gscStatus } = useGscStatus(address); - - const enabled = !!address; - - const { data, status } = useQuery({ - queryKey: ["voter-stats", address], - enabled, - queryFn: enabled - ? async () => { - const voter = council.voter(address); - const votingHistory = await voter.getVotes({ coreVoting }); - const votingPower = await coreVoting.getVotingPower({ - account: voter, - }); - - return { - votingHistory: votingHistory, - votingPower, - gscStatus: gscStatus, - }; - } - : undefined, - refetchOnWindowFocus: false, - refetchOnMount: false, - }); - - return { data, status }; -} diff --git a/apps/council-ui/src/ui/voters/hooks/useVotersSearch.ts b/apps/council-ui/src/ui/voters/hooks/useVotersSearch.ts index 2ec150a0..4f299e8b 100644 --- a/apps/council-ui/src/ui/voters/hooks/useVotersSearch.ts +++ b/apps/council-ui/src/ui/voters/hooks/useVotersSearch.ts @@ -2,7 +2,7 @@ import Fuse from "fuse.js"; import { useEffect, useMemo, useRef, useState } from "react"; import { VoterRowData } from "src/ui/voters/types"; -const voterSearchFuseOptions = { +const fuseOptions = { threshold: 0.3, isCaseSensitive: false, ignoreLocation: true, @@ -15,7 +15,7 @@ interface VoterSearch { search: (i: string) => void; } -export function useVotersSearch( +export function useSearchVoters( voters: VoterRowData[] | undefined, ): VoterSearch { const [input, setInput] = useState(""); @@ -30,7 +30,7 @@ export function useVotersSearch( if (!input) { return voters || []; } - const fuse = new Fuse(voters || [], voterSearchFuseOptions); + const fuse = new Fuse(voters || [], fuseOptions); if (searchCache.current[input]) { return searchCache.current[input]; diff --git a/apps/council-ui/src/ui/voters/types.ts b/apps/council-ui/src/ui/voters/types.ts index 527df866..57272e17 100644 --- a/apps/council-ui/src/ui/voters/types.ts +++ b/apps/council-ui/src/ui/voters/types.ts @@ -1,5 +1,7 @@ +import { Address } from "@delvtech/drift"; + export interface VoterRowData { - address: `0x${string}`; + address: Address; ensName: string | null; votingPower: bigint; numberOfDelegators: number; diff --git a/apps/council-ui/src/ui/voting/FormattedBallot.tsx b/apps/council-ui/src/ui/voting/FormattedBallot.tsx index b090fae5..07215fa7 100644 --- a/apps/council-ui/src/ui/voting/FormattedBallot.tsx +++ b/apps/council-ui/src/ui/voting/FormattedBallot.tsx @@ -1,4 +1,4 @@ -import { Ballot } from "@delvtech/council-viem"; +import { Ballot } from "@delvtech/council-js"; import assertNever from "assert-never"; import { ReactElement } from "react"; @@ -11,10 +11,10 @@ export default function FormattedBallot({ }: FormattedBallotProps): ReactElement { switch (ballot) { case "yes": - return

YES

; + return

YES

; case "no": - return

NO

; + return

NO

; case "maybe": return

ABSTAIN

; diff --git a/apps/council-ui/src/ui/voting/ProposalVoting.tsx b/apps/council-ui/src/ui/voting/ProposalVoting.tsx index 55891c11..345fa508 100644 --- a/apps/council-ui/src/ui/voting/ProposalVoting.tsx +++ b/apps/council-ui/src/ui/voting/ProposalVoting.tsx @@ -1,59 +1,64 @@ -import { Ballot, ReadVotingVault } from "@delvtech/council-viem"; +import { Ballot } from "@delvtech/council-js"; import classNames from "classnames"; import Link from "next/link"; import { ReactElement } from "react"; +import { ExtendedVotingContractConfig } from "src/config/utils/getVotingContractConfig"; import { makeVaultURL } from "src/routes"; import { formatVotingPower } from "src/ui/base/formatting/formatVotingPower"; -import { useReadProposal } from "src/ui/proposals/hooks/useReadProposal"; -import useVotingPowerByVault from "src/ui/vaults/hooks/useVotingPowerByVault"; +import useProposal from "src/ui/proposals/hooks/useProposal"; +import useVotingPower from "src/ui/vaults/hooks/useVotingPower"; import { ProposalVotingSkeleton } from "src/ui/voting/ProposalVotingSkeleton"; import { useSubmitVote } from "src/ui/voting/hooks/useSubmitVote"; import { useVote } from "src/ui/voting/hooks/useVote"; import { useAccount } from "wagmi"; interface ProposalVotingProps { - coreVotingAddress: `0x${string}`; + votingContract: ExtendedVotingContractConfig; proposalId: bigint; - vaults: (ReadVotingVault | `0x${string}`)[]; } export function ProposalVoting({ - coreVotingAddress, + votingContract, proposalId, - vaults, }: ProposalVotingProps): ReactElement { - const isConnected = useAccount().isConnected; - const { proposal } = useReadProposal({ - id: proposalId, - coreVoting: coreVotingAddress, + const account = useAccount(); + + const { data: proposal, status: proposalStatus } = useProposal({ + chainId: votingContract.chainId, + votingContract: votingContract.address, + proposalId, }); - const { votingPowerByVault, status, fetchStatus } = useVotingPowerByVault({ - vaults, - atBlock: proposal?.created, + const { + data: votingPower, + status, + fetchStatus, + } = useVotingPower({ + chainId: votingContract.chainId, + votingContract, + account: account?.address, + block: proposal?.createdBlock, + }); + + const { data: vote } = useVote({ + chainId: votingContract.chainId, + votingContract: votingContract.address, + proposalId, + account: account?.address, }); - const totalVotingPower = votingPowerByVault?.reduce( - (total, vault) => total + vault.votingPower, - 0n, - ); - const { vote } = useVote({ + const { write: submitVote, status: submitVoteStatus } = useSubmitVote({ proposalId, - coreVotingAddress, + votingContract: votingContract.address, + vaults: votingContract.vaults.map((vault) => vault.address) ?? [], + chainId: votingContract.chainId, }); - const { submitVote, status: submitVoteStatus } = useSubmitVote(); function handleVote(ballot: Ballot) { - submitVote?.({ - proposalId, - coreVotingAddress, - ballot, - vaults, - }); + submitVote?.(ballot); } - const disabled = - !isConnected || !submitVote || submitVoteStatus === "pending"; + const disabled = !submitVote || submitVoteStatus === "pending"; return fetchStatus === "fetching" ? ( @@ -64,23 +69,25 @@ export function ProposalVoting({

Voting Power

- {votingPowerByVault?.map((vault) => ( -
- -

{vault.name}

- -

{formatVotingPower(vault.votingPower)}

-
- ))} + {votingPower?.vaultPowers.map( + ({ vaultAddress, votingPower, vaultName }) => ( +
+ +

{vaultName}

+ +

{formatVotingPower(votingPower)}

+
+ ), + )}

Total Voting Power

- {formatVotingPower(totalVotingPower ?? 0)} + {formatVotingPower(votingPower?.totalVotingPower ?? 0)}

diff --git a/apps/council-ui/src/ui/voting/hooks/useSubmitVote.ts b/apps/council-ui/src/ui/voting/hooks/useSubmitVote.ts index 1a689b4b..48158d36 100644 --- a/apps/council-ui/src/ui/voting/hooks/useSubmitVote.ts +++ b/apps/council-ui/src/ui/voting/hooks/useSubmitVote.ts @@ -1,57 +1,42 @@ -import { Ballot, ReadVotingVault } from "@delvtech/council-viem"; -import { MutationStatus } from "@tanstack/react-query"; -import { useWrite } from "src/ui/contract/hooks/useWrite"; -import { useReadWriteCouncil } from "src/ui/council/hooks/useReadWriteCouncil"; +import { Ballot } from "@delvtech/council-js"; +import { Address, Bytes } from "@delvtech/drift"; +import { SupportedChainId } from "src/config/council.config"; +import { useWrite } from "src/ui/contract/useWrite"; +import { useReadWriteCouncil } from "src/ui/council/useReadWriteCouncil"; -interface SubmitVoteOptions { - coreVotingAddress: `0x${string}`; +export interface useSubmitVoteOptions { + votingContract: Address; proposalId: bigint; - ballot: Ballot; - vaults: (ReadVotingVault | `0x${string}`)[]; + vaults: Address[]; + extraVaultData?: Bytes[]; + chainId?: SupportedChainId; } -export function useSubmitVote(): { - submitVote: ((options: SubmitVoteOptions) => void) | undefined; - transactionHash: `0x${string}` | undefined; - status: MutationStatus; -} { - const council = useReadWriteCouncil(); +export function useSubmitVote({ + chainId, + votingContract, + proposalId, + extraVaultData, + vaults, +}: useSubmitVoteOptions) { + const council = useReadWriteCouncil({ chainId }); const enabled = !!council; - const { write, status, transactionHash } = useWrite({ + return useWrite({ pendingMessage: "Submitting vote...", successMessage: "Vote submitted!", errorMessage: "Failed to submit vote.", - writeFn: async ({ - coreVotingAddress, - proposalId, - ballot, - vaults, - }: SubmitVoteOptions) => { - if (!enabled) { - throw new Error( - "Connection to council not available. Check your wallet connection.", - ); - } - - const coreVoting = council.coreVoting({ address: coreVotingAddress }); - const proposal = await coreVoting.getProposal({ - id: proposalId, - }); - - if (!proposal) { - throw new Error( - `Attempted to vote on proposal ${proposalId} from ${coreVotingAddress}, but it does not exist.`, - ); - } - - return proposal.vote({ ballot, vaults }); - }, + writeFn: enabled + ? async (ballot: Ballot) => { + return council.coreVoting(votingContract).vote({ + args: { + proposalId, + ballot, + vaults, + extraVaultData, + }, + }); + } + : undefined, }); - - return { - submitVote: enabled ? write : undefined, - transactionHash, - status, - }; } diff --git a/apps/council-ui/src/ui/voting/hooks/useVote.ts b/apps/council-ui/src/ui/voting/hooks/useVote.ts index 138c96e2..8079fc25 100644 --- a/apps/council-ui/src/ui/voting/hooks/useVote.ts +++ b/apps/council-ui/src/ui/voting/hooks/useVote.ts @@ -1,47 +1,35 @@ -import { ReadVote, ReadVoter } from "@delvtech/council-viem"; -import { QueryStatus, useQuery } from "@tanstack/react-query"; -import { useReadCouncil } from "src/ui/council/hooks/useReadCouncil"; -import { useAccount } from "wagmi"; +import { Address } from "@delvtech/drift"; +import { useQuery } from "@tanstack/react-query"; +import { SupportedChainId } from "src/config/council.config"; +import { useReadCouncil } from "src/ui/council/useReadCouncil"; +import { useSupportedChainId } from "src/ui/network/useSupportedChainId"; interface UseVoteOptions { - coreVotingAddress: `0x${string}`; + votingContract: Address; proposalId: bigint; - account?: ReadVoter | `0x${string}`; + account: Address | undefined; + chainId?: SupportedChainId; } export function useVote({ - coreVotingAddress, + votingContract, proposalId, account, -}: UseVoteOptions): { - vote: ReadVote | undefined; - status: QueryStatus; -} { - const council = useReadCouncil(); - const { address: connectedAccount } = useAccount(); - - let accountToUse = account || connectedAccount; - if (typeof accountToUse === "string") { - accountToUse = council.voter(accountToUse); - } - - const enabled = !!accountToUse; - - const { data, status } = useQuery({ - queryKey: ["vote", String(proposalId), accountToUse], + chainId, +}: UseVoteOptions) { + chainId = useSupportedChainId(chainId); + const council = useReadCouncil({ chainId }); + const enabled = !!account && !!chainId && !!council; + return useQuery({ + queryKey: ["vote", chainId, votingContract, account, chainId], enabled, queryFn: enabled ? async () => { - const account = accountToUse!; - return council - .coreVoting({ address: coreVotingAddress }) - .getVote({ account, proposalId }); + const vote = await council + .coreVoting(votingContract) + .getVote({ proposalId, voter: account }); + return vote || null; } : undefined, }); - - return { - vote: data, - status: status, - }; } diff --git a/apps/council-ui/src/utils/council/getCouncil.ts b/apps/council-ui/src/utils/council/getCouncil.ts new file mode 100644 index 00000000..42cdaa4b --- /dev/null +++ b/apps/council-ui/src/utils/council/getCouncil.ts @@ -0,0 +1,9 @@ +import { createCouncil } from "@delvtech/council-js"; +import { SupportedChainId } from "src/config/council.config"; +import { getDrift } from "src/lib/drift"; + +export function getCouncil(chainId: SupportedChainId) { + return createCouncil({ + drift: getDrift({ chainId }), + }); +} diff --git a/apps/council-ui/src/utils/etherscan/makeEtherscanAddressURL.ts b/apps/council-ui/src/utils/etherscan/makeEtherscanAddressURL.ts index 49249e9b..7b320425 100644 --- a/apps/council-ui/src/utils/etherscan/makeEtherscanAddressURL.ts +++ b/apps/council-ui/src/utils/etherscan/makeEtherscanAddressURL.ts @@ -10,7 +10,7 @@ export function makeEtherscanAddressURL( return `https://etherscan.io/address/${address}`; case 5: return `https://goerli.etherscan.io/address/${address}`; - case 1337: + case 31337: return `#`; default: assertNever(chainId); diff --git a/apps/council-ui/src/utils/etherscan/makeEtherscanTransactionURL.ts b/apps/council-ui/src/utils/etherscan/makeEtherscanTransactionURL.ts index ee2b7598..04124ea0 100644 --- a/apps/council-ui/src/utils/etherscan/makeEtherscanTransactionURL.ts +++ b/apps/council-ui/src/utils/etherscan/makeEtherscanTransactionURL.ts @@ -10,7 +10,7 @@ export function makeEtherscanTransactionURL( return `https://etherscan.io/tx/${transactionHash}`; case 5: return `https://goerli.etherscan.io/tx/${transactionHash}`; - case 1337: + case 31337: return `#`; default: assertNever(chainId); diff --git a/apps/council-ui/src/utils/getAirdropData.ts b/apps/council-ui/src/utils/getAirdropData.ts index 8ff62c49..d49afd2d 100644 --- a/apps/council-ui/src/utils/getAirdropData.ts +++ b/apps/council-ui/src/utils/getAirdropData.ts @@ -1,4 +1,5 @@ -import { councilConfigs, SupportedChainId } from "src/config/council.config"; +import { SupportedChainId } from "src/config/council.config"; +import { getCouncilConfig } from "src/config/utils/getCouncilConfig"; export interface AirdropData { amount: bigint; @@ -8,19 +9,30 @@ export interface AirdropData { /** * Fetch the data needed to claim an airdrop for the given address. */ -export async function getAirdropData( - address: string, - chainId: SupportedChainId, -): Promise { - let baseDataURL = councilConfigs[chainId]?.airdrop?.baseDataURL; +export async function getAirdropData({ + account, + chainId, +}: { + account: string; + chainId?: SupportedChainId; +}): Promise { + if (!chainId) { + return undefined; + } + + const config = getCouncilConfig(chainId).airdrop; + + if (!config) { + return undefined; + } + + let baseDataURL = config.baseDataURL ?? ""; // Ensure the base URL has a trailing slash - if (baseDataURL && !baseDataURL.endsWith("/")) { + if (!baseDataURL.endsWith("/")) { baseDataURL += "/"; } - let dataURL: URL | undefined; - // Construct the full URL to fetch the airdrop data from // for example: // baseDataURL = "https://cdn.io/airdrop/" @@ -30,11 +42,9 @@ export async function getAirdropData( // baseDataURL = "/api/airdrop" // address = "0x123..." // dataURL = "/api/airdrop/0x123..." - if (address && baseDataURL) { - dataURL = new URL(`${baseDataURL}${address}`, window.location.origin); - } + const dataURL = new URL(`${baseDataURL}${account}`, window.location.origin); - const data = await fetch(dataURL as URL) + const data = await fetch(dataURL) .then(async (res) => { // Assume that a 404 means the address doesn't have an airdrop if (res.status === 404) { @@ -45,7 +55,7 @@ export async function getAirdropData( // the response and assume the address doesn't have an airdrop if (!res.ok) { console.warn( - `Failed to fetch airdrop data for address ${address}:\n${await res.text()}`, + `Failed to fetch airdrop data for address ${account}:\n${await res.text()}`, ); return undefined; } @@ -54,7 +64,7 @@ export async function getAirdropData( }) .catch((err) => { console.warn( - `Failed to fetch airdrop data for address ${address}:\n${err}`, + `Failed to fetch airdrop data for address ${account}:\n${err}`, ); return undefined; }); @@ -66,7 +76,7 @@ export async function getAirdropData( // Throw an error if the data doesn't match the expected format if (!isAirdropData(data)) { throw new Error( - `Invalid airdrop data for address ${address}:\n${JSON.stringify( + `Invalid airdrop data for address ${account}:\n${JSON.stringify( data, null, 2, diff --git a/apps/council-ui/src/utils/getBulkEnsRecords.ts b/apps/council-ui/src/utils/getBulkEnsRecords.ts index b7c92f9b..707f25bd 100644 --- a/apps/council-ui/src/utils/getBulkEnsRecords.ts +++ b/apps/council-ui/src/utils/getBulkEnsRecords.ts @@ -1,58 +1,60 @@ +import { Address } from "@delvtech/drift"; import { - UnsupportedNetworkError, createEnsPublicClient, + EnsPublicClient, + UnsupportedChainError, } from "@ensdomains/ensjs"; import { getName } from "@ensdomains/ensjs/public"; import chunk from "lodash.chunk"; +import { SupportedChainId } from "src/config/council.config"; import { chains, transports } from "src/lib/wagmi"; -import { PublicClient } from "viem"; -import { UsePublicClientReturnType } from "wagmi"; -export type EnsRecords = Record; +export type EnsRecords = Record; /** * Fetches ENS names in bulk using MultiCall. * Some addresses may not get resolved if the gas limit of the chunk was reached. * This size can be tweaked the options. - * @param {Array} addresses - An array of addresses. - * @param {providers.Provider} addresses - Ethers provider. - * @returns {Record} A record of addresses to ens name. The name is nullable. */ export async function getBulkEnsRecords( addresses: `0x${string}`[], - client: PublicClient | UsePublicClientReturnType, + chainId: SupportedChainId, options?: { chunkSize?: number }, ): Promise { - let chain: any = client?.chain || chains[0]; + const chain = chains[chainId]; + const transport = transports[chain.id]; + // TODO @ryangoree: Remove this once tested // ensjs is currently incompatible with viem v2. There's a PR to fix this // here: https://github.com/ensdomains/ensjs-v3/pull/175. // Until then, we have to manually patch the chain definition for mainnet to // look like the one ensjs expects. - if (chain.id === 1) { - chain = { - ...chain, - network: "homestead", - contracts: { - ...chain.contracts, - ensUniversalResolver: { - address: "0xc0497E381f536Be9ce14B0dD3817cBcAe57d2F62", - blockCreated: 16966585, - }, - }, - }; - } + // if (chain.id === 1) { + // chain = { + // ...chain, + // network: "homestead", + // contracts: { + // ...chain.contracts, + // ensUniversalResolver: { + // address: "0xc0497E381f536Be9ce14B0dD3817cBcAe57d2F62", + // blockCreated: 16966585, + // }, + // }, + // }; + // } - let ensClient: ReturnType; + let ensClient: EnsPublicClient; try { ensClient = createEnsPublicClient({ - chain: chain, - transport: transports[chain.id], - }) as ReturnType; + chain: chain as any, + transport, + }) as EnsPublicClient; } catch (error) { - // Not every network is supported by ENS, so we return null for all addresses - if (error instanceof UnsupportedNetworkError) { - return Object.fromEntries(addresses.map((address) => [address, null])); + // Not every chain is supported by ENS, so we return undefined for all addresses + if (error instanceof UnsupportedChainError) { + return Object.fromEntries( + addresses.map((address) => [address, undefined]), + ); } } @@ -61,26 +63,28 @@ export async function getBulkEnsRecords( // fetch each paginated request const chunkedResults = await Promise.all( - chunkedAddresses.map(async (chunk): Promise<[string, string | null][]> => { - // batch call of ens names using MultiCall - const batch = await ensClient.ensBatch( - ...chunk.map((address) => { - return getName.batch({ - address, - }); - }), - ); + chunkedAddresses.map( + async (chunk): Promise<[string, string | undefined][]> => { + // batch call of ens names using MultiCall + const batch = await ensClient.ensBatch( + ...chunk.map((address) => { + return getName.batch({ + address, + }); + }), + ); - // batch may not exist if gas limited was reached when reading - // TODO @cashd: investigate why certain addresses require more gas to read than others, by 10x deviation. - if (batch) { - return chunk.map((address, i) => { - return [address, batch[i]?.name ?? null]; - }); - } + // batch may not exist if gas limited was reached when reading + // TODO @cashd: investigate why certain addresses require more gas to read than others, by 10x deviation. + if (batch) { + return chunk.map((address, i) => { + return [address, batch[i]?.name ?? undefined]; + }); + } - return chunk.map((address) => [address, null]); - }), + return chunk.map((address) => [address, undefined]); + }, + ), ); // construct the record diff --git a/apps/council-ui/src/utils/getProposalStatus.ts b/apps/council-ui/src/utils/getProposalStatus.ts deleted file mode 100644 index e459ea0a..00000000 --- a/apps/council-ui/src/utils/getProposalStatus.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { VoteResults } from "@delvtech/council-viem"; - -export type ProposalStatus = - | "UNKNOWN" - | "IN PROGRESS" - | "EXPIRED" - | "FAILED" - | "EXECUTED"; - -export interface GetProposalStatusOptions { - lastCallDate: Date | undefined; - requiredQuorum: bigint | undefined; - currentQuorum?: bigint; - isExecuted?: boolean; - results?: VoteResults; -} - -export function getProposalStatus({ - lastCallDate, - requiredQuorum, - currentQuorum = 0n, - isExecuted = false, - results = { - yes: 0n, - no: 0n, - maybe: 0n, - }, -}: GetProposalStatusOptions): ProposalStatus { - if (isExecuted) { - return "EXECUTED"; - } - - if (!lastCallDate || !requiredQuorum) { - return "UNKNOWN"; - } - - if (new Date() > lastCallDate) { - if (currentQuorum >= requiredQuorum && results.yes > results.no) { - return "EXPIRED"; - } else { - return "FAILED"; - } - } - - return "IN PROGRESS"; -} diff --git a/apps/council-ui/src/utils/gscVault/getGscMembers.ts b/apps/council-ui/src/utils/gscVault/getGscMembers.ts deleted file mode 100644 index 061154fc..00000000 --- a/apps/council-ui/src/utils/gscVault/getGscMembers.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { - ReadGscVault, - ReadVoter, - ReadVotingVault, -} from "@delvtech/council-viem"; -import { getBulkEnsRecords } from "src/utils/getBulkEnsRecords"; -import { PublicClient } from "viem"; - -export interface GscMemberInfo { - member: ReadVoter; - qualifyingVotingPower: bigint; - ensName: string | null; -} - -export async function getGscMembers({ - client, - approvedVaults, - gscVault, -}: { - gscVault: ReadGscVault; - approvedVaults: (ReadVotingVault | `0x${string}`)[]; - client: PublicClient; -}): Promise { - const members = await gscVault.getVoters(); - - // TODO: Why did we do this again? Won't this hide kickable members? - // GSC Members must have enough qualifying voting power in the - // coreVoting approved vaults to be in good standing. - const membersQualifyingVotingPower = await Promise.all( - members.map((member) => - member.getVotingPower({ - vaults: approvedVaults, - }), - ), - ); - - const memberENSNames = await getBulkEnsRecords( - members.map((member) => member.address), - client, - ); - - const membersWithQualifyingVotePowerAndEnsRecord = members.map( - (member, i) => { - const qualifyingVotingPower = membersQualifyingVotingPower[i]; - const ensName = memberENSNames[member.address]; - return { - member, - qualifyingVotingPower, - ensName, - }; - }, - ); - - return membersWithQualifyingVotePowerAndEnsRecord; -} diff --git a/apps/council-ui/src/utils/gscVault/getGscStatus.ts b/apps/council-ui/src/utils/gscVault/getGscStatus.ts deleted file mode 100644 index 33eb8ea7..00000000 --- a/apps/council-ui/src/utils/gscVault/getGscStatus.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { - ReadGscVault, - ReadVoter, - ReadVotingVault, -} from "@delvtech/council-viem"; -import { getIsGscEligible } from "src/utils/gscVault/getIsGscEligible"; -import { GscStatus } from "src/utils/gscVault/types"; - -interface GetGscStatusOptions { - qualifyingVaults: ReadVotingVault[]; - gscVault?: ReadGscVault; - account?: `0x${string}` | ReadVoter; -} - -/** - * Get a specific GSC status for a voter. This method makes multiple calls for - * multiple different scenarios. Prefer more specific methods over this one for - * inferring specific information like whether the voter is a member or - * eligible. - */ -export async function getGscStatus({ - qualifyingVaults, - gscVault, - account, -}: GetGscStatusOptions): Promise { - if (!gscVault || !account) { - return "N/A"; - } - - if (await gscVault.getIsIdle({ account })) { - return "Idle"; - } - - if (await gscVault.getIsMember({ account })) { - return "Member"; - } - - const eligible = await getIsGscEligible({ - account: account, - gscVault, - qualifyingVaults, - }); - - return eligible ? "Eligible" : "Ineligible"; -} - -export function getIsGscMember(voterGSCStatus: GscStatus): boolean { - // "Idle" means you're a member that has recently joined and are currently in - // your idleDuration phase. - return voterGSCStatus === "Member" || voterGSCStatus === "Idle"; -} diff --git a/apps/council-ui/src/utils/gscVault/getIsGscEligible.ts b/apps/council-ui/src/utils/gscVault/getIsGscEligible.ts deleted file mode 100644 index 80c45ca6..00000000 --- a/apps/council-ui/src/utils/gscVault/getIsGscEligible.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { - ReadGscVault, - ReadVoter, - ReadVotingVault, -} from "@delvtech/council-viem"; - -interface GetIsGscEligibleOptions { - account: `0x${string}` | ReadVoter; - qualifyingVaults: ReadVotingVault[]; - gscVault?: ReadGscVault; -} - -export async function getIsGscEligible({ - account, - qualifyingVaults, - gscVault, -}: GetIsGscEligibleOptions): Promise { - if (!gscVault) { - return false; - } - - let qualifyingVotingPower = 0n; - for (const vault of qualifyingVaults) { - qualifyingVotingPower += await vault.getVotingPower({ account }); - } - - const requiredVotingPower = await gscVault.getRequiredVotingPower(); - if (qualifyingVotingPower > requiredVotingPower) { - return true; - } - - return false; -} diff --git a/apps/council-ui/src/utils/vaults/getTotalVotingPower.ts b/apps/council-ui/src/utils/vaults/getTotalVotingPower.ts new file mode 100644 index 00000000..7790bd71 --- /dev/null +++ b/apps/council-ui/src/utils/vaults/getTotalVotingPower.ts @@ -0,0 +1,19 @@ +import { ReadCouncil } from "@delvtech/council-js"; +import { VaultConfig } from "src/config/types"; + +export async function getTotalVotingPower({ + vault, + council, +}: { + vault: VaultConfig; + council: ReadCouncil; +}): Promise { + switch (vault.type) { + case "LockingVault": + case "FrozenLockingVault": + return council.lockingVault(vault.address).getTotalVotingPower(); + + case "VestingVault": + return council.vestingVault(vault.address).getTotalVotingPower(); + } +} diff --git a/apps/council-ui/src/utils/vaults/getVotingPower.ts b/apps/council-ui/src/utils/vaults/getVotingPower.ts new file mode 100644 index 00000000..6512678f --- /dev/null +++ b/apps/council-ui/src/utils/vaults/getVotingPower.ts @@ -0,0 +1,28 @@ +import type { ReadVotingVault } from "@delvtech/council-js"; +import { Address, RangeBlock } from "@delvtech/drift"; +import { SupportedChainId } from "src/config/council.config"; +import { getCouncil } from "src/utils/council/getCouncil"; + +/** + * A wrapper around the {@linkcode ReadVotingVault.getVotingPower} method which + * returns `0n` if the call fails. This is needed because Wagmi doesn't decode + * the `uninitialized` error which is thrown when the voter has no data in the + * vault, so the SDK doesn't handle it. + */ +export function getVotingPower({ + voter, + vault, + chainId, + block, +}: { + voter: Address; + vault: Address; + chainId: SupportedChainId; + block?: RangeBlock; +}): Promise { + const council = getCouncil(chainId); + return council + .votingVault(vault) + .getVotingPower({ voter, block }) + .catch(() => 0n); +} diff --git a/apps/council-ui/src/utils/vaults/gsc/getGscStatus.ts b/apps/council-ui/src/utils/vaults/gsc/getGscStatus.ts new file mode 100644 index 00000000..a0f32019 --- /dev/null +++ b/apps/council-ui/src/utils/vaults/gsc/getGscStatus.ts @@ -0,0 +1,53 @@ +import { Address } from "@delvtech/drift"; +import { SupportedChainId } from "src/config/council.config"; +import { getCouncilConfig } from "src/config/utils/getCouncilConfig"; +import { getCouncil } from "src/utils/council/getCouncil"; +import { getIsGscEligible } from "src/utils/vaults/gsc/getIsGscEligible"; +import { GscStatus } from "src/utils/vaults/gsc/types"; + +interface GetGscStatusOptions { + account: Address | undefined; + chainId: SupportedChainId; +} + +/** + * Get a specific GSC status for a voter. This method makes multiple calls for + * multiple different scenarios. Prefer more specific methods over this one for + * inferring specific information like whether the voter is a member or + * eligible. + */ +export async function getGscStatus({ + account, + chainId, +}: GetGscStatusOptions): Promise { + const { gscVoting } = getCouncilConfig(chainId); + + if (!gscVoting || !account) { + return "N/A"; + } + + const council = getCouncil(chainId); + const gscVaultAddress = gscVoting.vaults[0].address; + const gscVault = council.gscVault(gscVaultAddress); + + if (await gscVault.getIsIdle(account)) { + return "Idle"; + } + + if (await gscVault.getIsMember(account)) { + return "Member"; + } + + const eligible = await getIsGscEligible({ + account, + chainId, + }); + + return eligible ? "Eligible" : "Ineligible"; +} + +export function isGscMember(voterGscStatus: GscStatus): boolean { + // "Idle" means you're a member that has recently joined and are currently in + // your idleDuration phase. + return voterGscStatus === "Member" || voterGscStatus === "Idle"; +} diff --git a/apps/council-ui/src/utils/vaults/gsc/getIsGscEligible.ts b/apps/council-ui/src/utils/vaults/gsc/getIsGscEligible.ts new file mode 100644 index 00000000..ccc519fd --- /dev/null +++ b/apps/council-ui/src/utils/vaults/gsc/getIsGscEligible.ts @@ -0,0 +1,50 @@ +import { Address } from "@delvtech/drift"; +import { SupportedChainId } from "src/config/council.config"; +import { getCouncilConfig } from "src/config/utils/getCouncilConfig"; +import { getCouncil } from "src/utils/council/getCouncil"; +import { getVotingPower } from "src/utils/vaults/getVotingPower"; + +interface GetIsGscEligibleOptions { + account: Address | undefined; + chainId: SupportedChainId; +} + +export async function getIsGscEligible({ + account, + chainId, +}: GetIsGscEligibleOptions): Promise { + const { coreVoting, gscVoting } = getCouncilConfig(chainId); + + if (!gscVoting || !account) { + return false; + } + + const council = getCouncil(chainId); + const gscVaultAddress = gscVoting.vaults[0].address; + const gscVault = council.gscVault(gscVaultAddress); + const approvedVaults = coreVoting.vaults.map(({ address }) => + council.votingVault(address), + ); + + const [requiredVotingPower, ...vaultVotingPowers] = await Promise.all([ + gscVault.getRequiredVotingPower(), + ...approvedVaults.map((vault) => + getVotingPower({ + chainId, + vault: vault.address, + voter: account, + }), + ), + ]); + + const qualifyingVotingPower = vaultVotingPowers.reduce( + (total, votingPower) => total + votingPower, + 0n, + ); + + if (qualifyingVotingPower > requiredVotingPower) { + return true; + } + + return false; +} diff --git a/apps/council-ui/src/utils/gscVault/types.ts b/apps/council-ui/src/utils/vaults/gsc/types.ts similarity index 100% rename from apps/council-ui/src/utils/gscVault/types.ts rename to apps/council-ui/src/utils/vaults/gsc/types.ts diff --git a/apps/council-ui/tailwind.config.cjs b/apps/council-ui/tailwind.config.cjs index 97c018e3..47835566 100644 --- a/apps/council-ui/tailwind.config.cjs +++ b/apps/council-ui/tailwind.config.cjs @@ -1,6 +1,6 @@ /** @type {import('tailwindcss').Config} */ module.exports = { - content: ["./pages/**/*.{js,ts,jsx,tsx}", "./src/ui/**/*.{js,ts,jsx,tsx}"], + content: ["./src/{pages,ui}/**/*.{js,ts,jsx,tsx}"], theme: { extend: {}, }, diff --git a/apps/council-ui/tsconfig.tsbuildinfo b/apps/council-ui/tsconfig.tsbuildinfo deleted file mode 100644 index e25ee354..00000000 --- a/apps/council-ui/tsconfig.tsbuildinfo +++ /dev/null @@ -1 +0,0 @@ -{"program":{"fileNames":["../../node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/typescript/lib/lib.es2021.d.ts","../../node_modules/typescript/lib/lib.es2022.d.ts","../../node_modules/typescript/lib/lib.es2023.d.ts","../../node_modules/typescript/lib/lib.esnext.d.ts","../../node_modules/typescript/lib/lib.dom.d.ts","../../node_modules/typescript/lib/lib.dom.iterable.d.ts","../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/typescript/lib/lib.es2021.promise.d.ts","../../node_modules/typescript/lib/lib.es2021.string.d.ts","../../node_modules/typescript/lib/lib.es2021.weakref.d.ts","../../node_modules/typescript/lib/lib.es2021.intl.d.ts","../../node_modules/typescript/lib/lib.es2022.array.d.ts","../../node_modules/typescript/lib/lib.es2022.error.d.ts","../../node_modules/typescript/lib/lib.es2022.intl.d.ts","../../node_modules/typescript/lib/lib.es2022.object.d.ts","../../node_modules/typescript/lib/lib.es2022.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2022.string.d.ts","../../node_modules/typescript/lib/lib.es2022.regexp.d.ts","../../node_modules/typescript/lib/lib.es2023.array.d.ts","../../node_modules/typescript/lib/lib.es2023.collection.d.ts","../../node_modules/typescript/lib/lib.esnext.intl.d.ts","../../node_modules/typescript/lib/lib.esnext.disposable.d.ts","../../node_modules/typescript/lib/lib.esnext.decorators.d.ts","../../node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../../node_modules/next/dist/styled-jsx/types/css.d.ts","../../node_modules/@types/react/global.d.ts","../../node_modules/csstype/index.d.ts","../../node_modules/@types/prop-types/index.d.ts","../../node_modules/@types/scheduler/tracing.d.ts","../../node_modules/@types/react/index.d.ts","../../node_modules/next/dist/styled-jsx/types/index.d.ts","../../node_modules/next/dist/styled-jsx/types/macro.d.ts","../../node_modules/next/dist/styled-jsx/types/style.d.ts","../../node_modules/next/dist/styled-jsx/types/global.d.ts","../../node_modules/next/dist/shared/lib/amp.d.ts","../../node_modules/next/amp.d.ts","./node_modules/@types/node/assert.d.ts","./node_modules/@types/node/assert/strict.d.ts","../../node_modules/buffer/index.d.ts","../../node_modules/undici-types/header.d.ts","../../node_modules/undici-types/readable.d.ts","../../node_modules/undici-types/file.d.ts","../../node_modules/undici-types/fetch.d.ts","../../node_modules/undici-types/formdata.d.ts","../../node_modules/undici-types/connector.d.ts","../../node_modules/undici-types/client.d.ts","../../node_modules/undici-types/errors.d.ts","../../node_modules/undici-types/dispatcher.d.ts","../../node_modules/undici-types/global-dispatcher.d.ts","../../node_modules/undici-types/global-origin.d.ts","../../node_modules/undici-types/pool-stats.d.ts","../../node_modules/undici-types/pool.d.ts","../../node_modules/undici-types/handlers.d.ts","../../node_modules/undici-types/balanced-pool.d.ts","../../node_modules/undici-types/agent.d.ts","../../node_modules/undici-types/mock-interceptor.d.ts","../../node_modules/undici-types/mock-agent.d.ts","../../node_modules/undici-types/mock-client.d.ts","../../node_modules/undici-types/mock-pool.d.ts","../../node_modules/undici-types/mock-errors.d.ts","../../node_modules/undici-types/proxy-agent.d.ts","../../node_modules/undici-types/api.d.ts","../../node_modules/undici-types/cookies.d.ts","../../node_modules/undici-types/patch.d.ts","../../node_modules/undici-types/filereader.d.ts","../../node_modules/undici-types/diagnostics-channel.d.ts","../../node_modules/undici-types/websocket.d.ts","../../node_modules/undici-types/content-type.d.ts","../../node_modules/undici-types/cache.d.ts","../../node_modules/undici-types/interceptors.d.ts","../../node_modules/undici-types/index.d.ts","./node_modules/@types/node/globals.d.ts","./node_modules/@types/node/async_hooks.d.ts","./node_modules/@types/node/buffer.d.ts","./node_modules/@types/node/child_process.d.ts","./node_modules/@types/node/cluster.d.ts","./node_modules/@types/node/console.d.ts","./node_modules/@types/node/constants.d.ts","./node_modules/@types/node/crypto.d.ts","./node_modules/@types/node/dgram.d.ts","./node_modules/@types/node/diagnostics_channel.d.ts","./node_modules/@types/node/dns.d.ts","./node_modules/@types/node/dns/promises.d.ts","./node_modules/@types/node/domain.d.ts","./node_modules/@types/node/dom-events.d.ts","./node_modules/@types/node/events.d.ts","./node_modules/@types/node/fs.d.ts","./node_modules/@types/node/fs/promises.d.ts","./node_modules/@types/node/http.d.ts","./node_modules/@types/node/http2.d.ts","./node_modules/@types/node/https.d.ts","./node_modules/@types/node/inspector.d.ts","./node_modules/@types/node/module.d.ts","./node_modules/@types/node/net.d.ts","./node_modules/@types/node/os.d.ts","./node_modules/@types/node/path.d.ts","./node_modules/@types/node/perf_hooks.d.ts","./node_modules/@types/node/process.d.ts","./node_modules/@types/node/punycode.d.ts","./node_modules/@types/node/querystring.d.ts","./node_modules/@types/node/readline.d.ts","./node_modules/@types/node/readline/promises.d.ts","./node_modules/@types/node/repl.d.ts","./node_modules/@types/node/stream.d.ts","./node_modules/@types/node/stream/promises.d.ts","./node_modules/@types/node/stream/consumers.d.ts","./node_modules/@types/node/stream/web.d.ts","./node_modules/@types/node/string_decoder.d.ts","./node_modules/@types/node/test.d.ts","./node_modules/@types/node/timers.d.ts","./node_modules/@types/node/timers/promises.d.ts","./node_modules/@types/node/tls.d.ts","./node_modules/@types/node/trace_events.d.ts","./node_modules/@types/node/tty.d.ts","./node_modules/@types/node/url.d.ts","./node_modules/@types/node/util.d.ts","./node_modules/@types/node/v8.d.ts","./node_modules/@types/node/vm.d.ts","./node_modules/@types/node/wasi.d.ts","./node_modules/@types/node/worker_threads.d.ts","./node_modules/@types/node/zlib.d.ts","./node_modules/@types/node/globals.global.d.ts","./node_modules/@types/node/index.d.ts","../../node_modules/next/dist/server/get-page-files.d.ts","../../node_modules/@types/react-dom/index.d.ts","../../node_modules/next/dist/compiled/webpack/webpack.d.ts","../../node_modules/next/dist/server/config.d.ts","../../node_modules/next/dist/lib/load-custom-routes.d.ts","../../node_modules/next/dist/shared/lib/image-config.d.ts","../../node_modules/next/dist/build/webpack/plugins/subresource-integrity-plugin.d.ts","../../node_modules/next/dist/server/config-shared.d.ts","../../node_modules/next/dist/server/base-http/index.d.ts","../../node_modules/next/dist/server/api-utils/index.d.ts","../../node_modules/next/dist/server/initialize-require-hook.d.ts","../../node_modules/next/dist/shared/lib/router/utils/route-regex.d.ts","../../node_modules/next/dist/shared/lib/router/utils/route-matcher.d.ts","../../node_modules/next/dist/server/body-streams.d.ts","../../node_modules/next/dist/server/request-meta.d.ts","../../node_modules/next/dist/server/router.d.ts","../../node_modules/next/dist/build/analysis/get-page-static-info.d.ts","../../node_modules/next/dist/build/webpack/loaders/get-module-build-info.d.ts","../../node_modules/next/dist/build/webpack/plugins/middleware-plugin.d.ts","../../node_modules/next/dist/server/render-result.d.ts","../../node_modules/next/dist/server/web/next-url.d.ts","../../node_modules/next/dist/server/web/spec-extension/cookies.d.ts","../../node_modules/next/dist/server/web/spec-extension/request.d.ts","../../node_modules/next/dist/server/web/spec-extension/fetch-event.d.ts","../../node_modules/next/dist/server/web/spec-extension/response.d.ts","../../node_modules/next/dist/server/web/types.d.ts","../../node_modules/next/dist/build/index.d.ts","../../node_modules/next/dist/build/webpack/plugins/pages-manifest-plugin.d.ts","../../node_modules/next/dist/server/send-payload/revalidate-headers.d.ts","../../node_modules/next/dist/server/send-payload/index.d.ts","../../node_modules/next/dist/server/base-http/node.d.ts","../../node_modules/next/dist/server/font-utils.d.ts","../../node_modules/next/dist/server/load-components.d.ts","../../node_modules/next/dist/build/webpack/plugins/font-loader-manifest-plugin.d.ts","../../node_modules/next/dist/server/render.d.ts","../../node_modules/next/dist/shared/lib/router/utils/parse-url.d.ts","../../node_modules/next/dist/shared/lib/router/utils/middleware-route-matcher.d.ts","../../node_modules/next/dist/server/response-cache/types.d.ts","../../node_modules/next/dist/server/response-cache/index.d.ts","../../node_modules/next/dist/server/base-server.d.ts","../../node_modules/next/dist/server/image-optimizer.d.ts","../../node_modules/next/dist/server/next-server.d.ts","../../node_modules/next/dist/server/dev/static-paths-worker.d.ts","../../node_modules/next/dist/server/dev/next-dev-server.d.ts","../../node_modules/next/dist/server/next.d.ts","../../node_modules/next/types/index.d.ts","../../node_modules/next/dist/shared/lib/html-context.d.ts","../../node_modules/@next/env/types/index.d.ts","../../node_modules/next/dist/shared/lib/mitt.d.ts","../../node_modules/next/dist/client/with-router.d.ts","../../node_modules/next/dist/client/router.d.ts","../../node_modules/next/dist/client/route-loader.d.ts","../../node_modules/next/dist/client/page-loader.d.ts","../../node_modules/next/dist/shared/lib/router/router.d.ts","../../node_modules/next/dist/shared/lib/constants.d.ts","../../node_modules/next/dist/shared/lib/utils.d.ts","../../node_modules/next/dist/pages/_app.d.ts","../../node_modules/next/app.d.ts","../../node_modules/next/dist/shared/lib/runtime-config.d.ts","../../node_modules/next/config.d.ts","../../node_modules/next/dist/pages/_document.d.ts","../../node_modules/next/document.d.ts","../../node_modules/next/dist/shared/lib/dynamic.d.ts","../../node_modules/next/dynamic.d.ts","../../node_modules/next/dist/pages/_error.d.ts","../../node_modules/next/error.d.ts","../../node_modules/next/dist/shared/lib/head.d.ts","../../node_modules/next/head.d.ts","../../node_modules/next/dist/client/image.d.ts","../../node_modules/next/image.d.ts","../../node_modules/next/dist/client/link.d.ts","../../node_modules/next/link.d.ts","../../node_modules/next/router.d.ts","../../node_modules/next/dist/client/script.d.ts","../../node_modules/next/script.d.ts","../../node_modules/next/dist/server/web/spec-extension/user-agent.d.ts","../../node_modules/next/dist/compiled/@edge-runtime/primitives/url.d.ts","../../node_modules/next/server.d.ts","../../node_modules/next/types/global.d.ts","../../node_modules/next/index.d.ts","../../node_modules/next/image-types/global.d.ts","./next-env.d.ts","./pages/api/airdrop/sample-merkle-rewards-tree.json","./pages/api/airdrop/[address].ts","./src/routes.ts","./src/@types/@metamask/jazzicon.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/constants.d.ts","./src/config/councilconfig.ts","./src/config/goerli.ts","./src/config/localhost.ts","./src/config/mainnet.ts","./src/config/council.config.ts","../../node_modules/abitype/dist/types/register.d.ts","../../node_modules/abitype/dist/types/types.d.ts","../../node_modules/abitype/dist/types/abi.d.ts","../../node_modules/abitype/dist/types/errors.d.ts","../../node_modules/abitype/dist/types/narrow.d.ts","../../node_modules/abitype/dist/types/utils.d.ts","../../node_modules/abitype/dist/types/human-readable/types/signatures.d.ts","../../node_modules/abitype/dist/types/human-readable/formatabiparameter.d.ts","../../node_modules/abitype/dist/types/human-readable/formatabiparameters.d.ts","../../node_modules/abitype/dist/types/human-readable/formatabiitem.d.ts","../../node_modules/abitype/dist/types/human-readable/formatabi.d.ts","../../node_modules/abitype/dist/types/human-readable/types/utils.d.ts","../../node_modules/abitype/dist/types/human-readable/types/structs.d.ts","../../node_modules/abitype/dist/types/human-readable/parseabi.d.ts","../../node_modules/abitype/dist/types/human-readable/parseabiitem.d.ts","../../node_modules/abitype/dist/types/human-readable/parseabiparameter.d.ts","../../node_modules/abitype/dist/types/human-readable/parseabiparameters.d.ts","../../node_modules/abitype/dist/types/human-readable/errors/abiitem.d.ts","../../node_modules/abitype/dist/types/human-readable/errors/abiparameter.d.ts","../../node_modules/abitype/dist/types/human-readable/errors/signature.d.ts","../../node_modules/abitype/dist/types/human-readable/errors/splitparameters.d.ts","../../node_modules/abitype/dist/types/human-readable/errors/struct.d.ts","../../node_modules/abitype/dist/types/exports/index.d.ts","../../packages/council-core/dist/factory-e69mw3fm.d.ts","../../packages/council-core/dist/model.d.ts","../../packages/council-core/dist/blocktoreadoptions-teupdtba.d.ts","../../packages/council-core/dist/readwritetoken-jkj7qa5l.d.ts","../../packages/council-core/dist/voter-wtdyv2z0.d.ts","../../packages/council-core/dist/readwritelockingvault-hfkk_dpo.d.ts","../../packages/council-core/dist/airdrop.d.ts","../../packages/council-core/dist/vaults.d.ts","../../packages/council-core/dist/voting--xx0ttjt.d.ts","../../packages/council-core/dist/council.d.ts","../../packages/council-core/dist/errors.d.ts","../../packages/council-core/dist/contract.d.ts","../../packages/council-core/dist/token.d.ts","../../packages/council-core/dist/utils.d.ts","../../packages/council-core/dist/index.d.ts","../../node_modules/viem/node_modules/abitype/dist/types/register.d.ts","../../node_modules/viem/node_modules/abitype/dist/types/types.d.ts","../../node_modules/viem/node_modules/abitype/dist/types/abi.d.ts","../../node_modules/viem/node_modules/abitype/dist/types/errors.d.ts","../../node_modules/viem/node_modules/abitype/dist/types/narrow.d.ts","../../node_modules/viem/node_modules/abitype/dist/types/utils.d.ts","../../node_modules/viem/node_modules/abitype/dist/types/human-readable/types/signatures.d.ts","../../node_modules/viem/node_modules/abitype/dist/types/human-readable/formatabiparameter.d.ts","../../node_modules/viem/node_modules/abitype/dist/types/human-readable/formatabiparameters.d.ts","../../node_modules/viem/node_modules/abitype/dist/types/human-readable/formatabiitem.d.ts","../../node_modules/viem/node_modules/abitype/dist/types/human-readable/formatabi.d.ts","../../node_modules/viem/node_modules/abitype/dist/types/human-readable/types/utils.d.ts","../../node_modules/viem/node_modules/abitype/dist/types/human-readable/types/structs.d.ts","../../node_modules/viem/node_modules/abitype/dist/types/human-readable/parseabi.d.ts","../../node_modules/viem/node_modules/abitype/dist/types/human-readable/parseabiitem.d.ts","../../node_modules/viem/node_modules/abitype/dist/types/human-readable/parseabiparameter.d.ts","../../node_modules/viem/node_modules/abitype/dist/types/human-readable/parseabiparameters.d.ts","../../node_modules/viem/node_modules/abitype/dist/types/human-readable/errors/abiitem.d.ts","../../node_modules/viem/node_modules/abitype/dist/types/human-readable/errors/abiparameter.d.ts","../../node_modules/viem/node_modules/abitype/dist/types/human-readable/errors/signature.d.ts","../../node_modules/viem/node_modules/abitype/dist/types/human-readable/errors/splitparameters.d.ts","../../node_modules/viem/node_modules/abitype/dist/types/human-readable/errors/struct.d.ts","../../node_modules/viem/node_modules/abitype/dist/types/exports/index.d.ts","../../node_modules/viem/_types/types/utils.d.ts","../../node_modules/@scure/bip32/lib/index.d.ts","../../node_modules/viem/_types/types/account.d.ts","../../node_modules/viem/_types/types/misc.d.ts","../../node_modules/viem/_types/types/eip4844.d.ts","../../node_modules/viem/_types/types/fee.d.ts","../../node_modules/viem/_types/types/kzg.d.ts","../../node_modules/viem/_types/types/contract.d.ts","../../node_modules/viem/_types/types/log.d.ts","../../node_modules/viem/_types/types/transaction.d.ts","../../node_modules/viem/_types/types/typeddata.d.ts","../../node_modules/viem/_types/errors/utils.d.ts","../../node_modules/viem/_types/accounts/utils/parseaccount.d.ts","../../node_modules/viem/_types/types/withdrawal.d.ts","../../node_modules/viem/_types/types/block.d.ts","../../node_modules/viem/_types/types/proof.d.ts","../../node_modules/viem/_types/types/rpc.d.ts","../../node_modules/viem/_types/types/eip1193.d.ts","../../node_modules/viem/_types/clients/transports/createtransport.d.ts","../../node_modules/viem/_types/errors/base.d.ts","../../node_modules/viem/_types/errors/fee.d.ts","../../node_modules/viem/_types/types/stateoverride.d.ts","../../node_modules/viem/_types/errors/request.d.ts","../../node_modules/viem/_types/errors/rpc.d.ts","../../node_modules/viem/_types/utils/promise/createbatchscheduler.d.ts","../../node_modules/viem/_types/utils/promise/withretry.d.ts","../../node_modules/viem/_types/utils/rpc/socket.d.ts","../../node_modules/viem/_types/utils/buildrequest.d.ts","../../node_modules/viem/_types/errors/encoding.d.ts","../../node_modules/viem/_types/errors/data.d.ts","../../node_modules/viem/_types/utils/data/pad.d.ts","../../node_modules/viem/_types/utils/data/ishex.d.ts","../../node_modules/viem/_types/utils/data/size.d.ts","../../node_modules/viem/_types/utils/data/trim.d.ts","../../node_modules/viem/_types/utils/encoding/tobytes.d.ts","../../node_modules/viem/_types/utils/encoding/fromhex.d.ts","../../node_modules/viem/_types/utils/encoding/tohex.d.ts","../../node_modules/viem/_types/errors/estimategas.d.ts","../../node_modules/viem/_types/utils/hash/keccak256.d.ts","../../node_modules/viem/_types/errors/transaction.d.ts","../../node_modules/viem/_types/utils/transaction/gettransactiontype.d.ts","../../node_modules/viem/_types/utils/blob/blobstocommitments.d.ts","../../node_modules/viem/_types/utils/blob/blobstoproofs.d.ts","../../node_modules/viem/_types/utils/hash/sha256.d.ts","../../node_modules/viem/_types/utils/blob/commitmenttoversionedhash.d.ts","../../node_modules/viem/_types/utils/blob/commitmentstoversionedhashes.d.ts","../../node_modules/viem/_types/errors/blob.d.ts","../../node_modules/viem/_types/errors/cursor.d.ts","../../node_modules/viem/_types/utils/cursor.d.ts","../../node_modules/viem/_types/utils/blob/toblobs.d.ts","../../node_modules/viem/_types/utils/blob/toblobsidecars.d.ts","../../node_modules/viem/_types/utils/data/concat.d.ts","../../node_modules/viem/_types/utils/encoding/torlp.d.ts","../../node_modules/viem/_types/errors/address.d.ts","../../node_modules/viem/_types/errors/chain.d.ts","../../node_modules/viem/_types/errors/node.d.ts","../../node_modules/viem/_types/utils/lru.d.ts","../../node_modules/viem/_types/utils/address/isaddress.d.ts","../../node_modules/viem/_types/utils/transaction/asserttransaction.d.ts","../../node_modules/viem/_types/utils/transaction/serializeaccesslist.d.ts","../../node_modules/viem/_types/utils/transaction/serializetransaction.d.ts","../../node_modules/viem/_types/accounts/utils/sign.d.ts","../../node_modules/viem/_types/accounts/utils/signtransaction.d.ts","../../node_modules/viem/_types/utils/chain/assertcurrentchain.d.ts","../../node_modules/viem/_types/utils/errors/gettransactionerror.d.ts","../../node_modules/viem/_types/utils/formatters/formatter.d.ts","../../node_modules/viem/_types/utils/formatters/transactionrequest.d.ts","../../node_modules/viem/_types/utils/transaction/assertrequest.d.ts","../../node_modules/viem/_types/actions/public/getchainid.d.ts","../../node_modules/viem/_types/actions/wallet/sendrawtransaction.d.ts","../../node_modules/viem/_types/actions/wallet/sendtransaction.d.ts","../../node_modules/viem/_types/utils/errors/getnodeerror.d.ts","../../node_modules/viem/_types/utils/errors/getestimategaserror.d.ts","../../node_modules/viem/_types/actions/public/estimategas.d.ts","../../node_modules/viem/_types/errors/block.d.ts","../../node_modules/viem/_types/utils/formatters/transaction.d.ts","../../node_modules/viem/_types/utils/formatters/block.d.ts","../../node_modules/viem/_types/actions/public/getblock.d.ts","../../node_modules/viem/_types/actions/public/gettransactioncount.d.ts","../../node_modules/viem/_types/errors/account.d.ts","../../node_modules/viem/_types/actions/wallet/preparetransactionrequest.d.ts","../../node_modules/viem/_types/actions/public/getgasprice.d.ts","../../node_modules/viem/_types/actions/public/estimatemaxpriorityfeepergas.d.ts","../../node_modules/viem/_types/actions/public/estimatefeespergas.d.ts","../../node_modules/viem/_types/types/chain.d.ts","../../node_modules/viem/_types/errors/abi.d.ts","../../node_modules/viem/_types/utils/data/slice.d.ts","../../node_modules/viem/_types/utils/hash/hashsignature.d.ts","../../node_modules/viem/_types/utils/hash/normalizesignature.d.ts","../../node_modules/viem/_types/utils/hash/tosignature.d.ts","../../node_modules/viem/_types/utils/hash/tosignaturehash.d.ts","../../node_modules/viem/_types/utils/hash/tofunctionselector.d.ts","../../node_modules/viem/_types/utils/address/getaddress.d.ts","../../node_modules/viem/_types/utils/encoding/frombytes.d.ts","../../node_modules/viem/_types/utils/abi/decodeabiparameters.d.ts","../../node_modules/viem/_types/utils/abi/formatabiitem.d.ts","../../node_modules/viem/_types/utils/abi/decodeerrorresult.d.ts","../../node_modules/viem/_types/errors/contract.d.ts","../../node_modules/viem/_types/utils/abi/getabiitem.d.ts","../../node_modules/viem/_types/utils/abi/decodefunctionresult.d.ts","../../node_modules/viem/_types/utils/abi/encodeabiparameters.d.ts","../../node_modules/viem/_types/utils/abi/encodedeploydata.d.ts","../../node_modules/viem/_types/utils/abi/encodefunctiondata.d.ts","../../node_modules/viem/_types/utils/chain/getchaincontractaddress.d.ts","../../node_modules/viem/_types/utils/errors/getcallerror.d.ts","../../node_modules/viem/_types/errors/stateoverride.d.ts","../../node_modules/viem/_types/utils/stateoverride.d.ts","../../node_modules/viem/_types/actions/public/call.d.ts","../../node_modules/viem/_types/errors/ccip.d.ts","../../node_modules/viem/_types/utils/ccip.d.ts","../../node_modules/viem/_types/utils/ens/encodedlabeltolabelhash.d.ts","../../node_modules/viem/_types/utils/ens/namehash.d.ts","../../node_modules/viem/_types/utils/ens/encodelabelhash.d.ts","../../node_modules/viem/_types/utils/ens/labelhash.d.ts","../../node_modules/viem/_types/utils/ens/packettobytes.d.ts","../../node_modules/viem/_types/utils/errors/getcontracterror.d.ts","../../node_modules/viem/_types/actions/public/readcontract.d.ts","../../node_modules/viem/_types/actions/ens/getensaddress.d.ts","../../node_modules/viem/_types/types/ens.d.ts","../../node_modules/viem/_types/errors/ens.d.ts","../../node_modules/viem/_types/utils/ens/avatar/utils.d.ts","../../node_modules/viem/_types/utils/ens/avatar/parseavatarrecord.d.ts","../../node_modules/viem/_types/actions/ens/getenstext.d.ts","../../node_modules/viem/_types/actions/ens/getensavatar.d.ts","../../node_modules/viem/_types/actions/ens/getensname.d.ts","../../node_modules/viem/_types/actions/ens/getensresolver.d.ts","../../node_modules/viem/_types/types/filter.d.ts","../../node_modules/viem/_types/actions/public/createblockfilter.d.ts","../../node_modules/viem/_types/errors/log.d.ts","../../node_modules/viem/_types/utils/hash/toeventselector.d.ts","../../node_modules/viem/_types/utils/abi/encodeeventtopics.d.ts","../../node_modules/viem/_types/actions/public/createcontracteventfilter.d.ts","../../node_modules/viem/_types/actions/public/createeventfilter.d.ts","../../node_modules/viem/_types/actions/public/creatependingtransactionfilter.d.ts","../../node_modules/viem/_types/actions/public/estimatecontractgas.d.ts","../../node_modules/viem/_types/actions/public/getbalance.d.ts","../../node_modules/viem/_types/actions/public/getblobbasefee.d.ts","../../node_modules/viem/_types/utils/promise/withcache.d.ts","../../node_modules/viem/_types/actions/public/getblocknumber.d.ts","../../node_modules/viem/_types/actions/public/getblocktransactioncount.d.ts","../../node_modules/viem/_types/actions/public/getcode.d.ts","../../node_modules/viem/_types/utils/abi/decodeeventlog.d.ts","../../node_modules/viem/_types/utils/formatters/log.d.ts","../../node_modules/viem/_types/actions/public/getlogs.d.ts","../../node_modules/viem/_types/actions/public/getcontractevents.d.ts","../../node_modules/viem/_types/errors/eip712.d.ts","../../node_modules/viem/_types/actions/public/geteip712domain.d.ts","../../node_modules/viem/_types/utils/formatters/feehistory.d.ts","../../node_modules/viem/_types/actions/public/getfeehistory.d.ts","../../node_modules/viem/_types/actions/public/getfilterchanges.d.ts","../../node_modules/viem/_types/actions/public/getfilterlogs.d.ts","../../node_modules/viem/_types/utils/formatters/proof.d.ts","../../node_modules/viem/_types/actions/public/getproof.d.ts","../../node_modules/viem/_types/actions/public/getstorageat.d.ts","../../node_modules/viem/_types/actions/public/gettransaction.d.ts","../../node_modules/viem/_types/utils/formatters/transactionreceipt.d.ts","../../node_modules/viem/_types/actions/public/gettransactionconfirmations.d.ts","../../node_modules/viem/_types/actions/public/gettransactionreceipt.d.ts","../../node_modules/viem/_types/types/multicall.d.ts","../../node_modules/viem/_types/actions/public/multicall.d.ts","../../node_modules/viem/_types/actions/wallet/writecontract.d.ts","../../node_modules/viem/_types/actions/public/simulatecontract.d.ts","../../node_modules/viem/_types/actions/public/uninstallfilter.d.ts","../../node_modules/viem/_types/utils/signature/hashmessage.d.ts","../../node_modules/viem/_types/utils/data/isbytesequal.d.ts","../../node_modules/viem/_types/actions/public/verifyhash.d.ts","../../node_modules/viem/_types/actions/public/verifymessage.d.ts","../../node_modules/viem/_types/utils/typeddata.d.ts","../../node_modules/viem/_types/utils/signature/hashtypeddata.d.ts","../../node_modules/viem/_types/actions/public/verifytypeddata.d.ts","../../node_modules/viem/_types/utils/observe.d.ts","../../node_modules/viem/_types/clients/transports/fallback.d.ts","../../node_modules/viem/_types/types/transport.d.ts","../../node_modules/viem/_types/utils/poll.d.ts","../../node_modules/viem/_types/actions/public/watchblocknumber.d.ts","../../node_modules/viem/_types/actions/public/waitfortransactionreceipt.d.ts","../../node_modules/viem/_types/utils/stringify.d.ts","../../node_modules/viem/_types/actions/public/watchblocks.d.ts","../../node_modules/viem/_types/actions/public/watchcontractevent.d.ts","../../node_modules/viem/_types/actions/public/watchevent.d.ts","../../node_modules/viem/_types/actions/public/watchpendingtransactions.d.ts","../../node_modules/viem/_types/utils/siwe/types.d.ts","../../node_modules/viem/_types/utils/siwe/validatesiwemessage.d.ts","../../node_modules/viem/_types/actions/siwe/verifysiwemessage.d.ts","../../node_modules/viem/_types/clients/decorators/public.d.ts","../../node_modules/viem/_types/actions/wallet/addchain.d.ts","../../node_modules/viem/_types/actions/wallet/deploycontract.d.ts","../../node_modules/viem/_types/actions/wallet/getaddresses.d.ts","../../node_modules/viem/_types/actions/wallet/getpermissions.d.ts","../../node_modules/viem/_types/actions/wallet/requestaddresses.d.ts","../../node_modules/viem/_types/actions/wallet/requestpermissions.d.ts","../../node_modules/viem/_types/utils/signature/serializesignature.d.ts","../../node_modules/viem/_types/accounts/utils/signmessage.d.ts","../../node_modules/viem/_types/actions/wallet/signmessage.d.ts","../../node_modules/viem/_types/actions/wallet/signtransaction.d.ts","../../node_modules/viem/_types/accounts/utils/signtypeddata.d.ts","../../node_modules/viem/_types/actions/wallet/signtypeddata.d.ts","../../node_modules/viem/_types/actions/wallet/switchchain.d.ts","../../node_modules/viem/_types/actions/wallet/watchasset.d.ts","../../node_modules/viem/_types/clients/decorators/wallet.d.ts","../../node_modules/viem/_types/clients/createclient.d.ts","../../node_modules/viem/_types/utils/noncemanager.d.ts","../../node_modules/viem/_types/accounts/types.d.ts","../../node_modules/viem/_types/actions/getcontract.d.ts","../../node_modules/viem/_types/actions/test/dumpstate.d.ts","../../node_modules/viem/_types/actions/test/getautomine.d.ts","../../node_modules/viem/_types/actions/test/gettxpoolcontent.d.ts","../../node_modules/viem/_types/actions/test/gettxpoolstatus.d.ts","../../node_modules/viem/_types/actions/test/impersonateaccount.d.ts","../../node_modules/viem/_types/actions/test/increasetime.d.ts","../../node_modules/viem/_types/actions/test/inspecttxpool.d.ts","../../node_modules/viem/_types/actions/test/loadstate.d.ts","../../node_modules/viem/_types/actions/test/mine.d.ts","../../node_modules/viem/_types/actions/test/reset.d.ts","../../node_modules/viem/_types/actions/test/revert.d.ts","../../node_modules/viem/_types/actions/test/sendunsignedtransaction.d.ts","../../node_modules/viem/_types/actions/test/setbalance.d.ts","../../node_modules/viem/_types/actions/test/setblockgaslimit.d.ts","../../node_modules/viem/_types/actions/test/setblocktimestampinterval.d.ts","../../node_modules/viem/_types/actions/test/setcode.d.ts","../../node_modules/viem/_types/actions/test/setcoinbase.d.ts","../../node_modules/viem/_types/actions/test/setintervalmining.d.ts","../../node_modules/viem/_types/actions/test/setmingasprice.d.ts","../../node_modules/viem/_types/actions/test/setnextblockbasefeepergas.d.ts","../../node_modules/viem/_types/actions/test/setnextblocktimestamp.d.ts","../../node_modules/viem/_types/actions/test/setnonce.d.ts","../../node_modules/viem/_types/actions/test/setstorageat.d.ts","../../node_modules/viem/_types/actions/test/stopimpersonatingaccount.d.ts","../../node_modules/viem/_types/clients/decorators/test.d.ts","../../node_modules/viem/_types/clients/createtestclient.d.ts","../../node_modules/viem/_types/actions/test/droptransaction.d.ts","../../node_modules/viem/_types/actions/test/snapshot.d.ts","../../node_modules/viem/_types/actions/test/removeblocktimestampinterval.d.ts","../../node_modules/viem/_types/actions/test/setautomine.d.ts","../../node_modules/viem/_types/actions/test/setloggingenabled.d.ts","../../node_modules/viem/_types/actions/test/setrpcurl.d.ts","../../node_modules/viem/_types/clients/transports/custom.d.ts","../../node_modules/viem/_types/errors/transport.d.ts","../../node_modules/viem/_types/utils/promise/withtimeout.d.ts","../../node_modules/viem/_types/utils/rpc/http.d.ts","../../node_modules/viem/_types/clients/transports/http.d.ts","../../node_modules/viem/_types/clients/createpublicclient.d.ts","../../node_modules/viem/_types/clients/createwalletclient.d.ts","../../node_modules/viem/_types/utils/rpc/websocket.d.ts","../../node_modules/viem/_types/clients/transports/websocket.d.ts","../../node_modules/viem/_types/constants/abis.d.ts","../../node_modules/viem/_types/constants/address.d.ts","../../node_modules/viem/_types/constants/unit.d.ts","../../node_modules/viem/_types/constants/number.d.ts","../../node_modules/viem/_types/constants/bytes.d.ts","../../node_modules/viem/_types/constants/strings.d.ts","../../node_modules/viem/_types/utils/abi/decodedeploydata.d.ts","../../node_modules/viem/_types/utils/abi/decodefunctiondata.d.ts","../../node_modules/viem/_types/utils/abi/encodeerrorresult.d.ts","../../node_modules/viem/_types/utils/abi/prepareencodefunctiondata.d.ts","../../node_modules/viem/_types/utils/abi/encodefunctionresult.d.ts","../../node_modules/viem/_types/utils/abi/parseeventlogs.d.ts","../../node_modules/viem/_types/utils/data/isbytes.d.ts","../../node_modules/viem/_types/utils/address/getcontractaddress.d.ts","../../node_modules/viem/_types/utils/transaction/getserializedtransactiontype.d.ts","../../node_modules/viem/_types/utils/signature/compactsignaturetosignature.d.ts","../../node_modules/viem/_types/utils/signature/parsecompactsignature.d.ts","../../node_modules/viem/_types/utils/signature/parsesignature.d.ts","../../node_modules/viem/_types/utils/signature/recoveraddress.d.ts","../../node_modules/viem/_types/utils/signature/recovermessageaddress.d.ts","../../node_modules/viem/_types/utils/signature/recoverpublickey.d.ts","../../node_modules/viem/_types/utils/signature/recovertransactionaddress.d.ts","../../node_modules/viem/_types/utils/signature/recovertypeddataaddress.d.ts","../../node_modules/viem/_types/utils/signature/signaturetocompactsignature.d.ts","../../node_modules/viem/_types/utils/signature/serializecompactsignature.d.ts","../../node_modules/viem/_types/utils/address/isaddressequal.d.ts","../../node_modules/viem/_types/utils/signature/verifymessage.d.ts","../../node_modules/viem/_types/utils/signature/verifytypeddata.d.ts","../../node_modules/viem/_types/utils/signature/iserc6492signature.d.ts","../../node_modules/viem/_types/utils/signature/parseerc6492signature.d.ts","../../node_modules/viem/_types/utils/signature/serializeerc6492signature.d.ts","../../node_modules/viem/_types/utils/blob/sidecarstoversionedhashes.d.ts","../../node_modules/viem/_types/utils/blob/fromblobs.d.ts","../../node_modules/viem/_types/utils/kzg/definekzg.d.ts","../../node_modules/viem/_types/utils/kzg/setupkzg.d.ts","../../node_modules/viem/_types/utils/chain/definechain.d.ts","../../node_modules/viem/_types/utils/chain/extractchain.d.ts","../../node_modules/viem/_types/utils/abi/encodepacked.d.ts","../../node_modules/viem/_types/utils/unit/formatunits.d.ts","../../node_modules/viem/_types/utils/unit/formatether.d.ts","../../node_modules/viem/_types/utils/unit/formatgwei.d.ts","../../node_modules/viem/_types/utils/encoding/fromrlp.d.ts","../../node_modules/viem/_types/utils/hash/toeventsignature.d.ts","../../node_modules/viem/_types/utils/hash/tofunctionsignature.d.ts","../../node_modules/viem/_types/utils/hash/toeventhash.d.ts","../../node_modules/viem/_types/utils/hash/tofunctionhash.d.ts","../../node_modules/viem/_types/utils/signature/toprefixedmessage.d.ts","../../node_modules/viem/_types/utils/hash/ishash.d.ts","../../node_modules/viem/_types/utils/hash/ripemd160.d.ts","../../node_modules/viem/_types/utils/unit/parseunits.d.ts","../../node_modules/viem/_types/utils/unit/parseether.d.ts","../../node_modules/viem/_types/utils/unit/parsegwei.d.ts","../../node_modules/viem/_types/utils/transaction/parsetransaction.d.ts","../../node_modules/viem/_types/index.d.ts","../../node_modules/lru-cache/dist/commonjs/index.d.ts","../../node_modules/@delvtech/evm-client/dist/simplecache-zkwlopyg.d.ts","../../node_modules/@delvtech/evm-client/dist/cache.d.ts","../../node_modules/@delvtech/evm-client/dist/block-d7itlnye.d.ts","../../node_modules/@delvtech/evm-client/dist/contract-cmbx8slj.d.ts","../../node_modules/@delvtech/evm-client/dist/contract.d.ts","../../node_modules/@delvtech/evm-client/dist/errors.d.ts","../../node_modules/@delvtech/evm-client/dist/network.d.ts","../../node_modules/@delvtech/evm-client-viem/dist/index.d.ts","../../packages/council-core/dist/proposal.d.ts","../../packages/council-core/dist/vote.d.ts","../../packages/council-core/dist/voter.d.ts","../../packages/council-core/dist/voting.d.ts","../../packages/council-viem/dist/index.d.ts","./src/lib/councilsdk.ts","../../node_modules/@vanilla-extract/css/dist/vanilla-extract-css.cjs.d.ts","../../node_modules/@vanilla-extract/sprinkles/dist/vanilla-extract-sprinkles.cjs.d.ts","../../node_modules/@rainbow-me/rainbowkit/dist/css/reset.css.d.ts","../../node_modules/@rainbow-me/rainbowkit/dist/css/sprinkles.css.d.ts","../../node_modules/@rainbow-me/rainbowkit/dist/components/rainbowkitprovider/authenticationcontext.d.ts","../../node_modules/@rainbow-me/rainbowkit/dist/components/connectbutton/connectbuttonrenderer.d.ts","../../node_modules/@rainbow-me/rainbowkit/dist/components/connectbutton/connectbutton.d.ts","../../node_modules/mipd/dist/types/register.d.ts","../../node_modules/mipd/dist/types/types.d.ts","../../node_modules/mipd/dist/types/store.d.ts","../../node_modules/mipd/dist/types/utils.d.ts","../../node_modules/mipd/dist/types/index.d.ts","../../node_modules/@wagmi/core/node_modules/zustand/vanilla.d.ts","../../node_modules/@wagmi/core/dist/types/createemitter.d.ts","../../node_modules/@wagmi/core/dist/types/types/utils.d.ts","../../node_modules/@wagmi/core/dist/types/createstorage.d.ts","../../node_modules/@wagmi/core/dist/types/connectors/createconnector.d.ts","../../node_modules/@wagmi/core/dist/types/createconfig.d.ts","../../node_modules/@wagmi/core/dist/types/types/properties.d.ts","../../node_modules/@wagmi/core/dist/types/actions/call.d.ts","../../node_modules/@wagmi/core/dist/types/errors/base.d.ts","../../node_modules/@wagmi/core/dist/types/errors/config.d.ts","../../node_modules/@wagmi/core/dist/types/actions/connect.d.ts","../../node_modules/@wagmi/core/dist/types/actions/disconnect.d.ts","../../node_modules/viem/_types/actions/index.d.ts","../../node_modules/@wagmi/core/dist/types/types/chain.d.ts","../../node_modules/@wagmi/core/dist/types/actions/getconnectorclient.d.ts","../../node_modules/@wagmi/core/dist/types/actions/estimategas.d.ts","../../node_modules/@wagmi/core/dist/types/types/unit.d.ts","../../node_modules/@wagmi/core/dist/types/actions/estimatefeespergas.d.ts","../../node_modules/@wagmi/core/dist/types/actions/estimatemaxpriorityfeepergas.d.ts","../../node_modules/@wagmi/core/dist/types/actions/getaccount.d.ts","../../node_modules/@wagmi/core/dist/types/actions/getbalance.d.ts","../../node_modules/@wagmi/core/dist/types/actions/getblock.d.ts","../../node_modules/@wagmi/core/dist/types/actions/getblocknumber.d.ts","../../node_modules/@wagmi/core/dist/types/actions/getblocktransactioncount.d.ts","../../node_modules/@wagmi/core/dist/types/actions/getbytecode.d.ts","../../node_modules/@wagmi/core/dist/types/actions/getchainid.d.ts","../../node_modules/@wagmi/core/dist/types/actions/getchains.d.ts","../../node_modules/@wagmi/core/dist/types/actions/getclient.d.ts","../../node_modules/@wagmi/core/dist/types/actions/getconnections.d.ts","../../node_modules/@wagmi/core/dist/types/actions/getconnectors.d.ts","../../node_modules/@wagmi/core/dist/types/actions/getensaddress.d.ts","../../node_modules/@wagmi/core/dist/types/actions/getensavatar.d.ts","../../node_modules/@wagmi/core/dist/types/actions/getensname.d.ts","../../node_modules/@wagmi/core/dist/types/actions/getensresolver.d.ts","../../node_modules/@wagmi/core/dist/types/actions/getenstext.d.ts","../../node_modules/@wagmi/core/dist/types/actions/getfeehistory.d.ts","../../node_modules/@wagmi/core/dist/types/actions/getgasprice.d.ts","../../node_modules/@wagmi/core/dist/types/actions/getproof.d.ts","../../node_modules/@wagmi/core/dist/types/actions/getpublicclient.d.ts","../../node_modules/@wagmi/core/dist/types/actions/getstorageat.d.ts","../../node_modules/@wagmi/core/dist/types/actions/multicall.d.ts","../../node_modules/@wagmi/core/dist/types/actions/readcontract.d.ts","../../node_modules/@wagmi/core/dist/types/actions/readcontracts.d.ts","../../node_modules/@wagmi/core/dist/types/actions/gettoken.d.ts","../../node_modules/@wagmi/core/dist/types/actions/gettransaction.d.ts","../../node_modules/@wagmi/core/dist/types/actions/gettransactionconfirmations.d.ts","../../node_modules/@wagmi/core/dist/types/actions/gettransactioncount.d.ts","../../node_modules/@wagmi/core/dist/types/actions/gettransactionreceipt.d.ts","../../node_modules/@wagmi/core/dist/types/actions/getwalletclient.d.ts","../../node_modules/@wagmi/core/dist/types/actions/preparetransactionrequest.d.ts","../../node_modules/@wagmi/core/dist/types/actions/reconnect.d.ts","../../node_modules/@wagmi/core/dist/types/actions/sendtransaction.d.ts","../../node_modules/@wagmi/core/dist/types/actions/signmessage.d.ts","../../node_modules/@wagmi/core/dist/types/actions/signtypeddata.d.ts","../../node_modules/@wagmi/core/dist/types/actions/simulatecontract.d.ts","../../node_modules/@wagmi/core/dist/types/actions/switchaccount.d.ts","../../node_modules/@wagmi/core/dist/types/errors/connector.d.ts","../../node_modules/@wagmi/core/dist/types/actions/switchchain.d.ts","../../node_modules/@wagmi/core/dist/types/actions/verifymessage.d.ts","../../node_modules/@wagmi/core/dist/types/actions/verifytypeddata.d.ts","../../node_modules/@wagmi/core/dist/types/actions/watchaccount.d.ts","../../node_modules/@wagmi/core/dist/types/actions/watchblocks.d.ts","../../node_modules/@wagmi/core/dist/types/actions/watchblocknumber.d.ts","../../node_modules/@wagmi/core/dist/types/actions/watchchainid.d.ts","../../node_modules/@wagmi/core/dist/types/actions/watchclient.d.ts","../../node_modules/@wagmi/core/dist/types/actions/watchconnections.d.ts","../../node_modules/@wagmi/core/dist/types/actions/watchconnectors.d.ts","../../node_modules/@wagmi/core/dist/types/actions/watchcontractevent.d.ts","../../node_modules/@wagmi/core/dist/types/actions/watchpendingtransactions.d.ts","../../node_modules/@wagmi/core/dist/types/actions/watchpublicclient.d.ts","../../node_modules/@wagmi/core/dist/types/actions/waitfortransactionreceipt.d.ts","../../node_modules/@wagmi/core/dist/types/actions/writecontract.d.ts","../../node_modules/@wagmi/core/dist/types/connectors/injected.d.ts","../../node_modules/@wagmi/core/dist/types/connectors/mock.d.ts","../../node_modules/@wagmi/core/dist/types/hydrate.d.ts","../../node_modules/@wagmi/core/dist/types/transports/connector.d.ts","../../node_modules/@wagmi/core/dist/types/transports/fallback.d.ts","../../node_modules/@wagmi/core/dist/types/types/register.d.ts","../../node_modules/@wagmi/core/dist/types/utils/cookie.d.ts","../../node_modules/@wagmi/core/dist/types/utils/deepequal.d.ts","../../node_modules/@wagmi/core/dist/types/utils/deserialize.d.ts","../../node_modules/@wagmi/core/dist/types/utils/normalizechainid.d.ts","../../node_modules/@wagmi/core/dist/types/utils/serialize.d.ts","../../node_modules/@wagmi/core/dist/types/version.d.ts","../../node_modules/@wagmi/core/dist/types/exports/index.d.ts","../../node_modules/wagmi/dist/types/hydrate.d.ts","../../node_modules/wagmi/dist/types/context.d.ts","../../node_modules/wagmi/dist/types/errors/base.d.ts","../../node_modules/wagmi/dist/types/errors/context.d.ts","../../node_modules/@tanstack/query-core/build/legacy/removable.d.ts","../../node_modules/@tanstack/query-core/build/legacy/subscribable.d.ts","../../node_modules/@tanstack/query-core/build/legacy/queryclient-ho-z40sw.d.ts","../../node_modules/@tanstack/query-core/build/legacy/queriesobserver.d.ts","../../node_modules/@tanstack/query-core/build/legacy/infinitequeryobserver.d.ts","../../node_modules/@tanstack/query-core/build/legacy/notifymanager.d.ts","../../node_modules/@tanstack/query-core/build/legacy/focusmanager.d.ts","../../node_modules/@tanstack/query-core/build/legacy/onlinemanager.d.ts","../../node_modules/@tanstack/query-core/build/legacy/hydration.d.ts","../../node_modules/@tanstack/query-core/build/legacy/index.d.ts","../../node_modules/@tanstack/react-query/build/legacy/types.d.ts","../../node_modules/@tanstack/react-query/build/legacy/usequeries.d.ts","../../node_modules/@tanstack/react-query/build/legacy/queryoptions.d.ts","../../node_modules/@tanstack/react-query/build/legacy/usequery.d.ts","../../node_modules/@tanstack/react-query/build/legacy/usesuspensequery.d.ts","../../node_modules/@tanstack/react-query/build/legacy/usesuspenseinfinitequery.d.ts","../../node_modules/@tanstack/react-query/build/legacy/usesuspensequeries.d.ts","../../node_modules/@tanstack/react-query/build/legacy/infinitequeryoptions.d.ts","../../node_modules/@tanstack/react-query/build/legacy/queryclientprovider.d.ts","../../node_modules/@types/react/jsx-runtime.d.ts","../../node_modules/@tanstack/react-query/build/legacy/queryerrorresetboundary.d.ts","../../node_modules/@tanstack/react-query/build/legacy/hydrationboundary.d.ts","../../node_modules/@tanstack/react-query/build/legacy/useisfetching.d.ts","../../node_modules/@tanstack/react-query/build/legacy/usemutationstate.d.ts","../../node_modules/@tanstack/react-query/build/legacy/usemutation.d.ts","../../node_modules/@tanstack/react-query/build/legacy/useinfinitequery.d.ts","../../node_modules/@tanstack/react-query/build/legacy/isrestoring.d.ts","../../node_modules/@tanstack/react-query/build/legacy/index.d.ts","../../node_modules/@wagmi/core/dist/types/actions/watchchains.d.ts","../../node_modules/@wagmi/core/dist/types/utils/uid.d.ts","../../node_modules/@wagmi/core/dist/types/exports/internal.d.ts","../../node_modules/wagmi/dist/types/utils/query.d.ts","../../node_modules/wagmi/dist/types/types/properties.d.ts","../../node_modules/wagmi/dist/types/hooks/useaccount.d.ts","../../node_modules/wagmi/dist/types/hooks/useaccounteffect.d.ts","../../node_modules/@wagmi/core/dist/types/query/call.d.ts","../../node_modules/@wagmi/core/dist/types/query/types.d.ts","../../node_modules/@wagmi/core/dist/types/query/connect.d.ts","../../node_modules/@wagmi/core/dist/types/query/disconnect.d.ts","../../node_modules/@wagmi/core/dist/types/query/estimatefeespergas.d.ts","../../node_modules/@wagmi/core/dist/types/query/estimategas.d.ts","../../node_modules/@wagmi/core/dist/types/query/estimatemaxpriorityfeepergas.d.ts","../../node_modules/@wagmi/core/dist/types/query/getbalance.d.ts","../../node_modules/@wagmi/core/dist/types/query/getblock.d.ts","../../node_modules/@wagmi/core/dist/types/query/getblocknumber.d.ts","../../node_modules/@wagmi/core/dist/types/query/getblocktransactioncount.d.ts","../../node_modules/@wagmi/core/dist/types/query/getbytecode.d.ts","../../node_modules/@wagmi/core/dist/types/query/getconnectorclient.d.ts","../../node_modules/@wagmi/core/dist/types/query/getensaddress.d.ts","../../node_modules/@wagmi/core/dist/types/query/getensavatar.d.ts","../../node_modules/@wagmi/core/dist/types/query/getensname.d.ts","../../node_modules/@wagmi/core/dist/types/query/getensresolver.d.ts","../../node_modules/@wagmi/core/dist/types/query/getenstext.d.ts","../../node_modules/@wagmi/core/dist/types/query/getfeehistory.d.ts","../../node_modules/@wagmi/core/dist/types/query/getgasprice.d.ts","../../node_modules/@wagmi/core/dist/types/query/getproof.d.ts","../../node_modules/@wagmi/core/dist/types/query/getstorageat.d.ts","../../node_modules/@wagmi/core/dist/types/query/gettoken.d.ts","../../node_modules/viem/_types/chains/definitions/acala.d.ts","../../node_modules/viem/_types/chains/definitions/ancient8.d.ts","../../node_modules/viem/_types/chains/definitions/ancient8sepolia.d.ts","../../node_modules/viem/_types/chains/definitions/anvil.d.ts","../../node_modules/viem/_types/chains/definitions/apextestnet.d.ts","../../node_modules/viem/_types/chains/definitions/arbitrum.d.ts","../../node_modules/viem/_types/chains/definitions/arbitrumgoerli.d.ts","../../node_modules/viem/_types/chains/definitions/arbitrumnova.d.ts","../../node_modules/viem/_types/chains/definitions/astar.d.ts","../../node_modules/viem/_types/chains/definitions/astarzkevm.d.ts","../../node_modules/viem/_types/chains/definitions/astarzkyoto.d.ts","../../node_modules/viem/_types/chains/definitions/arbitrumsepolia.d.ts","../../node_modules/viem/_types/chains/definitions/areonnetwork.d.ts","../../node_modules/viem/_types/chains/definitions/areonnetworktestnet.d.ts","../../node_modules/viem/_types/chains/definitions/aurora.d.ts","../../node_modules/viem/_types/chains/definitions/auroratestnet.d.ts","../../node_modules/viem/_types/chains/definitions/auroria.d.ts","../../node_modules/viem/_types/chains/definitions/avalanche.d.ts","../../node_modules/viem/_types/chains/definitions/avalanchefuji.d.ts","../../node_modules/viem/_types/chains/definitions/bahamut.d.ts","../../node_modules/viem/_types/chains/definitions/base.d.ts","../../node_modules/viem/_types/chains/definitions/basegoerli.d.ts","../../node_modules/viem/_types/chains/definitions/basesepolia.d.ts","../../node_modules/viem/_types/chains/definitions/beam.d.ts","../../node_modules/viem/_types/chains/definitions/beamtestnet.d.ts","../../node_modules/viem/_types/chains/definitions/bearnetworkchainmainnet.d.ts","../../node_modules/viem/_types/chains/definitions/bearnetworkchaintestnet.d.ts","../../node_modules/viem/_types/chains/definitions/berachaintestnet.d.ts","../../node_modules/viem/_types/chains/definitions/berachaintestnetbartio.d.ts","../../node_modules/viem/_types/chains/definitions/bevmmainnet.d.ts","../../node_modules/viem/_types/chains/definitions/bitkub.d.ts","../../node_modules/viem/_types/chains/definitions/bitkubtestnet.d.ts","../../node_modules/viem/_types/chains/definitions/bittorrent.d.ts","../../node_modules/viem/_types/chains/definitions/bittorrenttestnet.d.ts","../../node_modules/viem/_types/chains/definitions/blast.d.ts","../../node_modules/viem/_types/chains/definitions/blastsepolia.d.ts","../../node_modules/viem/_types/chains/definitions/bob.d.ts","../../node_modules/viem/_types/chains/definitions/boba.d.ts","../../node_modules/viem/_types/chains/definitions/bronos.d.ts","../../node_modules/viem/_types/chains/definitions/bronostestnet.d.ts","../../node_modules/viem/_types/chains/definitions/bsc.d.ts","../../node_modules/viem/_types/chains/definitions/bsctestnet.d.ts","../../node_modules/viem/_types/chains/definitions/bscgreenfield.d.ts","../../node_modules/viem/_types/chains/definitions/btr.d.ts","../../node_modules/viem/_types/chains/definitions/btrtestnet.d.ts","../../node_modules/viem/_types/chains/definitions/bxn.d.ts","../../node_modules/viem/_types/chains/definitions/bxntestnet.d.ts","../../node_modules/viem/_types/chains/definitions/canto.d.ts","../../node_modules/viem/_types/celo/types.d.ts","../../node_modules/viem/_types/celo/serializers.d.ts","../../node_modules/viem/_types/chains/definitions/celo.d.ts","../../node_modules/viem/_types/chains/definitions/celoalfajores.d.ts","../../node_modules/viem/_types/chains/definitions/chiliz.d.ts","../../node_modules/viem/_types/chains/definitions/classic.d.ts","../../node_modules/viem/_types/chains/definitions/confluxespace.d.ts","../../node_modules/viem/_types/chains/definitions/confluxespacetestnet.d.ts","../../node_modules/viem/_types/chains/definitions/coredao.d.ts","../../node_modules/viem/_types/chains/definitions/cronos.d.ts","../../node_modules/viem/_types/chains/definitions/cronostestnet.d.ts","../../node_modules/viem/_types/chains/definitions/crossbell.d.ts","../../node_modules/viem/_types/chains/definitions/cyber.d.ts","../../node_modules/viem/_types/chains/definitions/cybertestnet.d.ts","../../node_modules/viem/_types/chains/definitions/darwinia.d.ts","../../node_modules/viem/_types/chains/definitions/dchain.d.ts","../../node_modules/viem/_types/chains/definitions/dchaintestnet.d.ts","../../node_modules/viem/_types/chains/definitions/defichainevm.d.ts","../../node_modules/viem/_types/chains/definitions/defichainevmtestnet.d.ts","../../node_modules/viem/_types/chains/definitions/degen.d.ts","../../node_modules/viem/_types/chains/definitions/dfk.d.ts","../../node_modules/viem/_types/chains/definitions/dodochaintestnet.d.ts","../../node_modules/viem/_types/chains/definitions/dogechain.d.ts","../../node_modules/viem/_types/chains/definitions/dreyerxmainnet.d.ts","../../node_modules/viem/_types/chains/definitions/edgeless.d.ts","../../node_modules/viem/_types/chains/definitions/edgelesstestnet.d.ts","../../node_modules/viem/_types/chains/definitions/edgeware.d.ts","../../node_modules/viem/_types/chains/definitions/edgewaretestnet.d.ts","../../node_modules/viem/_types/chains/definitions/eon.d.ts","../../node_modules/viem/_types/chains/definitions/eos.d.ts","../../node_modules/viem/_types/chains/definitions/eostestnet.d.ts","../../node_modules/viem/_types/chains/definitions/etherlinktestnet.d.ts","../../node_modules/viem/_types/chains/definitions/evmos.d.ts","../../node_modules/viem/_types/chains/definitions/evmostestnet.d.ts","../../node_modules/viem/_types/chains/definitions/ekta.d.ts","../../node_modules/viem/_types/chains/definitions/ektatestnet.d.ts","../../node_modules/viem/_types/chains/definitions/fantom.d.ts","../../node_modules/viem/_types/chains/definitions/fantomsonictestnet.d.ts","../../node_modules/viem/_types/chains/definitions/fantomtestnet.d.ts","../../node_modules/viem/_types/chains/definitions/fibo.d.ts","../../node_modules/viem/_types/chains/definitions/filecoin.d.ts","../../node_modules/viem/_types/chains/definitions/filecoincalibration.d.ts","../../node_modules/viem/_types/chains/definitions/filecoinhyperspace.d.ts","../../node_modules/viem/_types/chains/definitions/flare.d.ts","../../node_modules/viem/_types/chains/definitions/flaretestnet.d.ts","../../node_modules/viem/_types/chains/definitions/flowpreviewnet.d.ts","../../node_modules/viem/_types/chains/definitions/flowmainnet.d.ts","../../node_modules/viem/_types/chains/definitions/flowtestnet.d.ts","../../node_modules/viem/_types/chains/definitions/foundry.d.ts","../../node_modules/viem/_types/chains/definitions/fraxtal.d.ts","../../node_modules/viem/_types/chains/definitions/fraxtaltestnet.d.ts","../../node_modules/viem/_types/chains/definitions/funkisepolia.d.ts","../../node_modules/viem/_types/chains/definitions/fuse.d.ts","../../node_modules/viem/_types/chains/definitions/fusesparknet.d.ts","../../node_modules/viem/_types/chains/definitions/iotex.d.ts","../../node_modules/viem/_types/chains/definitions/iotextestnet.d.ts","../../node_modules/viem/_types/chains/definitions/jbc.d.ts","../../node_modules/viem/_types/chains/definitions/jbctestnet.d.ts","../../node_modules/viem/_types/chains/definitions/karura.d.ts","../../node_modules/viem/_types/chains/definitions/gobi.d.ts","../../node_modules/viem/_types/chains/definitions/goerli.d.ts","../../node_modules/viem/_types/chains/definitions/gnosis.d.ts","../../node_modules/viem/_types/chains/definitions/gnosischiado.d.ts","../../node_modules/viem/_types/chains/definitions/ham.d.ts","../../node_modules/viem/_types/chains/definitions/hardhat.d.ts","../../node_modules/viem/_types/chains/definitions/harmonyone.d.ts","../../node_modules/viem/_types/chains/definitions/haqqmainnet.d.ts","../../node_modules/viem/_types/chains/definitions/haqqtestedge2.d.ts","../../node_modules/viem/_types/chains/definitions/hedera.d.ts","../../node_modules/viem/_types/chains/definitions/hederatestnet.d.ts","../../node_modules/viem/_types/chains/definitions/hederapreviewnet.d.ts","../../node_modules/viem/_types/chains/definitions/holesky.d.ts","../../node_modules/viem/_types/chains/definitions/immutablezkevm.d.ts","../../node_modules/viem/_types/chains/definitions/immutablezkevmtestnet.d.ts","../../node_modules/viem/_types/chains/definitions/inevm.d.ts","../../node_modules/viem/_types/chains/definitions/kakarotsepolia.d.ts","../../node_modules/viem/_types/chains/definitions/kava.d.ts","../../node_modules/viem/_types/chains/definitions/kavatestnet.d.ts","../../node_modules/viem/_types/chains/definitions/kcc.d.ts","../../node_modules/viem/_types/chains/definitions/klaytn.d.ts","../../node_modules/viem/_types/chains/definitions/klaytnbaobab.d.ts","../../node_modules/viem/_types/chains/definitions/kroma.d.ts","../../node_modules/viem/_types/chains/definitions/kromasepolia.d.ts","../../node_modules/viem/_types/chains/definitions/l3x.d.ts","../../node_modules/viem/_types/chains/definitions/l3xtestnet.d.ts","../../node_modules/viem/_types/chains/definitions/lightlinkpegasus.d.ts","../../node_modules/viem/_types/chains/definitions/lightlinkphoenix.d.ts","../../node_modules/viem/_types/chains/definitions/linea.d.ts","../../node_modules/viem/_types/chains/definitions/lineagoerli.d.ts","../../node_modules/viem/_types/chains/definitions/lineasepolia.d.ts","../../node_modules/viem/_types/chains/definitions/lineatestnet.d.ts","../../node_modules/viem/_types/zksync/types/fee.d.ts","../../node_modules/viem/_types/zksync/types/log.d.ts","../../node_modules/viem/_types/zksync/types/transaction.d.ts","../../node_modules/viem/_types/zksync/types/eip712.d.ts","../../node_modules/viem/_types/zksync/types/chain.d.ts","../../node_modules/viem/_types/zksync/types/contract.d.ts","../../node_modules/viem/_types/zksync/errors/bytecode.d.ts","../../node_modules/viem/_types/zksync/utils/hashbytecode.d.ts","../../node_modules/viem/_types/zksync/utils/abi/encodedeploydata.d.ts","../../node_modules/viem/_types/zksync/actions/sendeip712transaction.d.ts","../../node_modules/viem/_types/zksync/actions/deploycontract.d.ts","../../node_modules/viem/_types/zksync/types/block.d.ts","../../node_modules/viem/_types/zksync/types/proof.d.ts","../../node_modules/viem/_types/zksync/types/eip1193.d.ts","../../node_modules/viem/_types/zksync/actions/estimatefee.d.ts","../../node_modules/viem/_types/zksync/actions/getallbalances.d.ts","../../node_modules/viem/_types/zksync/actions/getblockdetails.d.ts","../../node_modules/viem/_types/zksync/actions/getdefaultbridgeaddresses.d.ts","../../node_modules/viem/_types/zksync/actions/getbridgehubcontractaddress.d.ts","../../node_modules/viem/_types/zksync/actions/getl1allowance.d.ts","../../node_modules/viem/_types/zksync/actions/getl1balance.d.ts","../../node_modules/viem/_types/zksync/actions/getl1batchblockrange.d.ts","../../node_modules/viem/_types/zksync/actions/getl1batchdetails.d.ts","../../node_modules/viem/_types/zksync/actions/getl1batchnumber.d.ts","../../node_modules/viem/_types/zksync/actions/getl1chainid.d.ts","../../node_modules/@scure/bip39/wordlists/czech.d.ts","../../node_modules/@scure/bip39/wordlists/english.d.ts","../../node_modules/@scure/bip39/wordlists/french.d.ts","../../node_modules/@scure/bip39/wordlists/italian.d.ts","../../node_modules/@scure/bip39/wordlists/japanese.d.ts","../../node_modules/@scure/bip39/wordlists/korean.d.ts","../../node_modules/@scure/bip39/wordlists/simplified-chinese.d.ts","../../node_modules/@scure/bip39/wordlists/spanish.d.ts","../../node_modules/@scure/bip39/wordlists/traditional-chinese.d.ts","../../node_modules/viem/_types/accounts/generatemnemonic.d.ts","../../node_modules/viem/_types/accounts/generateprivatekey.d.ts","../../node_modules/viem/_types/accounts/toaccount.d.ts","../../node_modules/viem/_types/accounts/utils/publickeytoaddress.d.ts","../../node_modules/viem/_types/accounts/privatekeytoaccount.d.ts","../../node_modules/viem/_types/accounts/hdkeytoaccount.d.ts","../../node_modules/viem/_types/accounts/mnemonictoaccount.d.ts","../../node_modules/viem/_types/accounts/utils/privatekeytoaddress.d.ts","../../node_modules/viem/_types/accounts/index.d.ts","../../node_modules/viem/_types/zksync/errors/token-is-eth.d.ts","../../node_modules/viem/_types/zksync/actions/getl1tokenbalance.d.ts","../../node_modules/viem/_types/zksync/actions/getlogproof.d.ts","../../node_modules/viem/_types/zksync/actions/getmaincontractaddress.d.ts","../../node_modules/viem/_types/zksync/actions/getrawblocktransactions.d.ts","../../node_modules/viem/_types/zksync/actions/gettestnetpaymasteraddress.d.ts","../../node_modules/viem/_types/zksync/actions/gettransactiondetails.d.ts","../../node_modules/viem/_types/zksync/actions/sendtransaction.d.ts","../../node_modules/viem/_types/zksync/actions/signeip712transaction.d.ts","../../node_modules/viem/_types/zksync/actions/signtransaction.d.ts","../../node_modules/viem/_types/zksync/serializers.d.ts","../../node_modules/viem/_types/chains/definitions/zksync.d.ts","../../node_modules/viem/_types/chains/definitions/zksynctestnet.d.ts","../../node_modules/viem/_types/chains/definitions/zksyncsepoliatestnet.d.ts","../../node_modules/viem/_types/zksync/chains.d.ts","../../node_modules/viem/_types/zksync/chainconfig.d.ts","../../node_modules/viem/_types/zksync/decorators/eip712.d.ts","../../node_modules/viem/_types/zksync/decorators/publicl1.d.ts","../../node_modules/viem/_types/zksync/actions/estimategasl1tol2.d.ts","../../node_modules/viem/_types/zksync/actions/getbasetokenl1address.d.ts","../../node_modules/viem/_types/zksync/decorators/publicl2.d.ts","../../node_modules/viem/_types/zksync/utils/paymaster/getapprovalbasedpaymasterinput.d.ts","../../node_modules/viem/_types/zksync/utils/paymaster/getgeneralpaymasterinput.d.ts","../../node_modules/viem/_types/zksync/index.d.ts","../../node_modules/viem/_types/chains/definitions/lisk.d.ts","../../node_modules/viem/_types/chains/definitions/lisksepolia.d.ts","../../node_modules/viem/_types/chains/definitions/localhost.d.ts","../../node_modules/viem/_types/chains/definitions/lukso.d.ts","../../node_modules/viem/_types/chains/definitions/luksotestnet.d.ts","../../node_modules/viem/_types/chains/definitions/lycan.d.ts","../../node_modules/viem/_types/chains/definitions/mainnet.d.ts","../../node_modules/viem/_types/chains/definitions/mandala.d.ts","../../node_modules/viem/_types/chains/definitions/manta.d.ts","../../node_modules/viem/_types/chains/definitions/mantasepoliatestnet.d.ts","../../node_modules/viem/_types/chains/definitions/mantatestnet.d.ts","../../node_modules/viem/_types/chains/definitions/mantle.d.ts","../../node_modules/viem/_types/chains/definitions/mantlesepoliatestnet.d.ts","../../node_modules/viem/_types/chains/definitions/mantletestnet.d.ts","../../node_modules/viem/_types/chains/definitions/merlin.d.ts","../../node_modules/viem/_types/chains/definitions/metachain.d.ts","../../node_modules/viem/_types/chains/definitions/metachainistanbul.d.ts","../../node_modules/viem/_types/chains/definitions/metall2.d.ts","../../node_modules/viem/_types/chains/definitions/meter.d.ts","../../node_modules/viem/_types/chains/definitions/metertestnet.d.ts","../../node_modules/viem/_types/chains/definitions/metis.d.ts","../../node_modules/viem/_types/chains/definitions/metisgoerli.d.ts","../../node_modules/viem/_types/chains/definitions/mev.d.ts","../../node_modules/viem/_types/chains/definitions/mevtestnet.d.ts","../../node_modules/viem/_types/chains/definitions/mintsepoliatestnet.d.ts","../../node_modules/viem/_types/chains/definitions/mode.d.ts","../../node_modules/viem/_types/chains/definitions/modetestnet.d.ts","../../node_modules/viem/_types/chains/definitions/moonbasealpha.d.ts","../../node_modules/viem/_types/chains/definitions/moonbeam.d.ts","../../node_modules/viem/_types/chains/definitions/moonbeamdev.d.ts","../../node_modules/viem/_types/chains/definitions/moonriver.d.ts","../../node_modules/viem/_types/chains/definitions/morphsepolia.d.ts","../../node_modules/viem/_types/chains/definitions/nautilus.d.ts","../../node_modules/viem/_types/chains/definitions/neondevnet.d.ts","../../node_modules/viem/_types/chains/definitions/neonmainnet.d.ts","../../node_modules/viem/_types/chains/definitions/nexi.d.ts","../../node_modules/viem/_types/chains/definitions/nexilix.d.ts","../../node_modules/viem/_types/chains/definitions/oasys.d.ts","../../node_modules/viem/_types/chains/definitions/oasistestnet.d.ts","../../node_modules/viem/_types/chains/definitions/okc.d.ts","../../node_modules/viem/_types/chains/definitions/optimism.d.ts","../../node_modules/viem/_types/chains/definitions/optimismgoerli.d.ts","../../node_modules/viem/_types/chains/definitions/optimismsepolia.d.ts","../../node_modules/viem/_types/chains/definitions/opbnb.d.ts","../../node_modules/viem/_types/chains/definitions/opbnbtestnet.d.ts","../../node_modules/viem/_types/chains/definitions/oortmainnetdev.d.ts","../../node_modules/viem/_types/chains/definitions/otimdevnet.d.ts","../../node_modules/viem/_types/chains/definitions/palm.d.ts","../../node_modules/viem/_types/chains/definitions/palmtestnet.d.ts","../../node_modules/viem/_types/chains/definitions/playfialbireo.d.ts","../../node_modules/viem/_types/chains/definitions/pgn.d.ts","../../node_modules/viem/_types/chains/definitions/pgntestnet.d.ts","../../node_modules/viem/_types/chains/definitions/phoenix.d.ts","../../node_modules/viem/_types/chains/definitions/plinga.d.ts","../../node_modules/viem/_types/chains/definitions/plumetestnet.d.ts","../../node_modules/viem/_types/chains/definitions/polygon.d.ts","../../node_modules/viem/_types/chains/definitions/polygonamoy.d.ts","../../node_modules/viem/_types/chains/definitions/polygonmumbai.d.ts","../../node_modules/viem/_types/chains/definitions/polygonzkevm.d.ts","../../node_modules/viem/_types/chains/definitions/polygonzkevmcardona.d.ts","../../node_modules/viem/_types/chains/definitions/polygonzkevmtestnet.d.ts","../../node_modules/viem/_types/chains/definitions/pulsechain.d.ts","../../node_modules/viem/_types/chains/definitions/pulsechainv4.d.ts","../../node_modules/viem/_types/chains/definitions/qmainnet.d.ts","../../node_modules/viem/_types/chains/definitions/qtestnet.d.ts","../../node_modules/viem/_types/chains/definitions/redbellytestnet.d.ts","../../node_modules/viem/_types/chains/definitions/redstone.d.ts","../../node_modules/viem/_types/chains/definitions/reyanetwork.d.ts","../../node_modules/viem/_types/chains/definitions/rollux.d.ts","../../node_modules/viem/_types/chains/definitions/rolluxtestnet.d.ts","../../node_modules/viem/_types/chains/definitions/ronin.d.ts","../../node_modules/viem/_types/chains/definitions/rootstock.d.ts","../../node_modules/viem/_types/chains/definitions/rootstocktestnet.d.ts","../../node_modules/viem/_types/chains/definitions/rss3.d.ts","../../node_modules/viem/_types/chains/definitions/rss3sepolia.d.ts","../../node_modules/viem/_types/chains/definitions/saigon.d.ts","../../node_modules/viem/_types/chains/definitions/sapphire.d.ts","../../node_modules/viem/_types/chains/definitions/sapphiretestnet.d.ts","../../node_modules/viem/_types/chains/definitions/satoshivm.d.ts","../../node_modules/viem/_types/chains/definitions/satoshivmtestnet.d.ts","../../node_modules/viem/_types/chains/definitions/scroll.d.ts","../../node_modules/viem/_types/chains/definitions/scrollsepolia.d.ts","../../node_modules/viem/_types/chains/definitions/sei.d.ts","../../node_modules/viem/_types/chains/definitions/seidevnet.d.ts","../../node_modules/viem/_types/chains/definitions/sepolia.d.ts","../../node_modules/viem/_types/chains/definitions/shimmer.d.ts","../../node_modules/viem/_types/chains/definitions/shimmertestnet.d.ts","../../node_modules/viem/_types/chains/definitions/skale/brawl.d.ts","../../node_modules/viem/_types/chains/definitions/skale/calypso.d.ts","../../node_modules/viem/_types/chains/definitions/skale/calypsotestnet.d.ts","../../node_modules/viem/_types/chains/definitions/skale/cryptoblades.d.ts","../../node_modules/viem/_types/chains/definitions/skale/cryptocolosseum.d.ts","../../node_modules/viem/_types/chains/definitions/skale/europa.d.ts","../../node_modules/viem/_types/chains/definitions/skale/europatestnet.d.ts","../../node_modules/viem/_types/chains/definitions/skale/exorde.d.ts","../../node_modules/viem/_types/chains/definitions/skale/humanprotocol.d.ts","../../node_modules/viem/_types/chains/definitions/skale/nebula.d.ts","../../node_modules/viem/_types/chains/definitions/skale/nebulatestnet.d.ts","../../node_modules/viem/_types/chains/definitions/skale/razor.d.ts","../../node_modules/viem/_types/chains/definitions/skale/titan.d.ts","../../node_modules/viem/_types/chains/definitions/skale/titantestnet.d.ts","../../node_modules/viem/_types/chains/definitions/songbird.d.ts","../../node_modules/viem/_types/chains/definitions/songbirdtestnet.d.ts","../../node_modules/viem/_types/chains/definitions/spicy.d.ts","../../node_modules/viem/_types/chains/definitions/shardeumsphinx.d.ts","../../node_modules/viem/_types/chains/definitions/shibarium.d.ts","../../node_modules/viem/_types/chains/definitions/stratis.d.ts","../../node_modules/viem/_types/chains/definitions/syscoin.d.ts","../../node_modules/viem/_types/chains/definitions/syscointestnet.d.ts","../../node_modules/viem/_types/chains/definitions/taraxa.d.ts","../../node_modules/viem/_types/chains/definitions/taiko.d.ts","../../node_modules/viem/_types/chains/definitions/taikohekla.d.ts","../../node_modules/viem/_types/chains/definitions/taikojolnir.d.ts","../../node_modules/viem/_types/chains/definitions/taikokatla.d.ts","../../node_modules/viem/_types/chains/definitions/taikotestnetsepolia.d.ts","../../node_modules/viem/_types/chains/definitions/taraxatestnet.d.ts","../../node_modules/viem/_types/chains/definitions/telcointestnet.d.ts","../../node_modules/viem/_types/chains/definitions/telos.d.ts","../../node_modules/viem/_types/chains/definitions/telostestnet.d.ts","../../node_modules/viem/_types/chains/definitions/tenet.d.ts","../../node_modules/viem/_types/chains/definitions/thaichain.d.ts","../../node_modules/viem/_types/chains/definitions/thundertestnet.d.ts","../../node_modules/viem/_types/chains/definitions/vechain.d.ts","../../node_modules/viem/_types/chains/definitions/wanchain.d.ts","../../node_modules/viem/_types/chains/definitions/wanchaintestnet.d.ts","../../node_modules/viem/_types/chains/definitions/wemix.d.ts","../../node_modules/viem/_types/chains/definitions/wemixtestnet.d.ts","../../node_modules/viem/_types/chains/definitions/xlayertestnet.d.ts","../../node_modules/viem/_types/chains/definitions/xlayer.d.ts","../../node_modules/viem/_types/chains/definitions/xai.d.ts","../../node_modules/viem/_types/chains/definitions/xaitestnet.d.ts","../../node_modules/viem/_types/chains/definitions/xdc.d.ts","../../node_modules/viem/_types/chains/definitions/xdctestnet.d.ts","../../node_modules/viem/_types/chains/definitions/yooldoverse.d.ts","../../node_modules/viem/_types/chains/definitions/yooldoversetestnet.d.ts","../../node_modules/viem/_types/chains/definitions/zetachain.d.ts","../../node_modules/viem/_types/chains/definitions/zetachainathenstestnet.d.ts","../../node_modules/viem/_types/chains/definitions/zhejiang.d.ts","../../node_modules/viem/_types/chains/definitions/zilliqa.d.ts","../../node_modules/viem/_types/chains/definitions/zilliqatestnet.d.ts","../../node_modules/viem/_types/chains/definitions/zkfair.d.ts","../../node_modules/viem/_types/chains/definitions/zkfairtestnet.d.ts","../../node_modules/viem/_types/chains/definitions/zksyncinmemorynode.d.ts","../../node_modules/viem/_types/chains/definitions/zksynclocalnode.d.ts","../../node_modules/viem/_types/chains/definitions/zora.d.ts","../../node_modules/viem/_types/chains/definitions/zorasepolia.d.ts","../../node_modules/viem/_types/chains/definitions/zoratestnet.d.ts","../../node_modules/viem/_types/chains/definitions/zircuittestnet.d.ts","../../node_modules/viem/_types/op-stack/types/transaction.d.ts","../../node_modules/viem/_types/op-stack/types/block.d.ts","../../node_modules/viem/_types/op-stack/serializers.d.ts","../../node_modules/viem/_types/chains/index.d.ts","../../node_modules/@wagmi/core/dist/types/query/gettransaction.d.ts","../../node_modules/@wagmi/core/dist/types/query/gettransactionconfirmations.d.ts","../../node_modules/@wagmi/core/dist/types/query/gettransactioncount.d.ts","../../node_modules/@wagmi/core/dist/types/query/gettransactionreceipt.d.ts","../../node_modules/@wagmi/core/dist/types/query/getwalletclient.d.ts","../../node_modules/@wagmi/core/dist/types/query/infinitereadcontracts.d.ts","../../node_modules/@wagmi/core/dist/types/query/preparetransactionrequest.d.ts","../../node_modules/@wagmi/core/dist/types/query/readcontract.d.ts","../../node_modules/@wagmi/core/dist/types/query/readcontracts.d.ts","../../node_modules/@wagmi/core/dist/types/query/reconnect.d.ts","../../node_modules/@wagmi/core/dist/types/query/sendtransaction.d.ts","../../node_modules/@wagmi/core/dist/types/query/signmessage.d.ts","../../node_modules/@wagmi/core/dist/types/query/signtypeddata.d.ts","../../node_modules/@wagmi/core/dist/types/query/switchaccount.d.ts","../../node_modules/@wagmi/core/dist/types/query/simulatecontract.d.ts","../../node_modules/@wagmi/core/dist/types/query/switchchain.d.ts","../../node_modules/@wagmi/core/dist/types/query/verifymessage.d.ts","../../node_modules/@wagmi/core/dist/types/query/verifytypeddata.d.ts","../../node_modules/@wagmi/core/dist/types/query/waitfortransactionreceipt.d.ts","../../node_modules/@wagmi/core/dist/types/query/writecontract.d.ts","../../node_modules/@wagmi/core/dist/types/query/utils.d.ts","../../node_modules/@wagmi/core/dist/types/exports/query.d.ts","../../node_modules/wagmi/dist/types/hooks/usebalance.d.ts","../../node_modules/wagmi/dist/types/hooks/usewatchblocks.d.ts","../../node_modules/wagmi/dist/types/hooks/useblock.d.ts","../../node_modules/wagmi/dist/types/hooks/usewatchblocknumber.d.ts","../../node_modules/wagmi/dist/types/hooks/useblocknumber.d.ts","../../node_modules/wagmi/dist/types/hooks/useblocktransactioncount.d.ts","../../node_modules/wagmi/dist/types/hooks/usebytecode.d.ts","../../node_modules/wagmi/dist/types/hooks/usecall.d.ts","../../node_modules/wagmi/dist/types/hooks/usechainid.d.ts","../../node_modules/wagmi/dist/types/hooks/usechains.d.ts","../../node_modules/wagmi/dist/types/hooks/useclient.d.ts","../../node_modules/wagmi/dist/types/hooks/useconfig.d.ts","../../node_modules/wagmi/dist/types/hooks/useconnect.d.ts","../../node_modules/wagmi/dist/types/hooks/useconnections.d.ts","../../node_modules/wagmi/dist/types/hooks/useconnectors.d.ts","../../node_modules/wagmi/dist/types/hooks/useconnectorclient.d.ts","../../node_modules/wagmi/dist/types/hooks/usedisconnect.d.ts","../../node_modules/wagmi/dist/types/hooks/useensaddress.d.ts","../../node_modules/wagmi/dist/types/hooks/useensavatar.d.ts","../../node_modules/wagmi/dist/types/hooks/useensname.d.ts","../../node_modules/wagmi/dist/types/hooks/useensresolver.d.ts","../../node_modules/wagmi/dist/types/hooks/useenstext.d.ts","../../node_modules/wagmi/dist/types/hooks/useestimatefeespergas.d.ts","../../node_modules/wagmi/dist/types/hooks/useestimategas.d.ts","../../node_modules/wagmi/dist/types/hooks/useestimatemaxpriorityfeepergas.d.ts","../../node_modules/wagmi/dist/types/hooks/usefeehistory.d.ts","../../node_modules/wagmi/dist/types/hooks/usegasprice.d.ts","../../node_modules/wagmi/dist/types/exports/query.d.ts","../../node_modules/wagmi/dist/types/hooks/useinfinitereadcontracts.d.ts","../../node_modules/wagmi/dist/types/hooks/usepreparetransactionrequest.d.ts","../../node_modules/wagmi/dist/types/hooks/useproof.d.ts","../../node_modules/wagmi/dist/types/hooks/usepublicclient.d.ts","../../node_modules/wagmi/dist/types/hooks/usereadcontract.d.ts","../../node_modules/wagmi/dist/types/hooks/usereadcontracts.d.ts","../../node_modules/wagmi/dist/types/hooks/usereconnect.d.ts","../../node_modules/wagmi/dist/types/hooks/usesendtransaction.d.ts","../../node_modules/wagmi/dist/types/hooks/usesignmessage.d.ts","../../node_modules/wagmi/dist/types/hooks/usesigntypeddata.d.ts","../../node_modules/wagmi/dist/types/hooks/usesimulatecontract.d.ts","../../node_modules/wagmi/dist/types/hooks/usestorageat.d.ts","../../node_modules/wagmi/dist/types/hooks/useswitchaccount.d.ts","../../node_modules/wagmi/dist/types/hooks/useswitchchain.d.ts","../../node_modules/wagmi/dist/types/hooks/usetoken.d.ts","../../node_modules/wagmi/dist/types/hooks/usetransaction.d.ts","../../node_modules/wagmi/dist/types/hooks/usetransactionconfirmations.d.ts","../../node_modules/wagmi/dist/types/hooks/usetransactioncount.d.ts","../../node_modules/wagmi/dist/types/hooks/usetransactionreceipt.d.ts","../../node_modules/wagmi/dist/types/hooks/useverifymessage.d.ts","../../node_modules/wagmi/dist/types/hooks/useverifytypeddata.d.ts","../../node_modules/wagmi/dist/types/hooks/usewalletclient.d.ts","../../node_modules/wagmi/dist/types/hooks/usewaitfortransactionreceipt.d.ts","../../node_modules/wagmi/dist/types/hooks/usewatchcontractevent.d.ts","../../node_modules/wagmi/dist/types/hooks/usewatchpendingtransactions.d.ts","../../node_modules/wagmi/dist/types/hooks/usewritecontract.d.ts","../../node_modules/wagmi/dist/types/version.d.ts","../../node_modules/wagmi/dist/types/exports/index.d.ts","../../node_modules/@coinbase/wallet-sdk/dist/assets/wallet-logo.d.ts","../../node_modules/eventemitter3/index.d.ts","../../node_modules/@coinbase/wallet-sdk/dist/core/type.d.ts","../../node_modules/@coinbase/wallet-sdk/dist/lib/scopedlocalstorage.d.ts","../../node_modules/@coinbase/wallet-sdk/dist/core/error/constants.d.ts","../../node_modules/@coinbase/wallet-sdk/dist/core/error/errors.d.ts","../../node_modules/@coinbase/wallet-sdk/dist/core/error/utils.d.ts","../../node_modules/@coinbase/wallet-sdk/dist/core/error/serialize.d.ts","../../node_modules/@coinbase/wallet-sdk/dist/core/error/index.d.ts","../../node_modules/@coinbase/wallet-sdk/dist/provider/jsonrpc.d.ts","../../node_modules/@coinbase/wallet-sdk/dist/relay/session.d.ts","../../node_modules/@types/bn.js/index.d.ts","../../node_modules/@coinbase/wallet-sdk/dist/relay/walletlink/type/ethereumtransactionparams.d.ts","../../node_modules/@coinbase/wallet-sdk/dist/relay/walletlink/type/web3method.d.ts","../../node_modules/@coinbase/wallet-sdk/dist/relay/walletlink/type/web3request.d.ts","../../node_modules/@coinbase/wallet-sdk/dist/relay/walletlink/type/web3response.d.ts","../../node_modules/@coinbase/wallet-sdk/dist/relay/relayabstract.d.ts","../../node_modules/@coinbase/wallet-sdk/dist/relay/relayeventmanager.d.ts","../../node_modules/@coinbase/wallet-sdk/dist/relay/walletlink/type/servermessage.d.ts","../../node_modules/@coinbase/wallet-sdk/dist/relay/walletlink/connection/walletlinkwebsocket.d.ts","../../node_modules/@coinbase/wallet-sdk/dist/relay/walletlink/type/walletlinkeventdata.d.ts","../../node_modules/@coinbase/wallet-sdk/dist/provider/diagnosticlogger.d.ts","../../node_modules/@coinbase/wallet-sdk/dist/provider/web3provider.d.ts","../../node_modules/@coinbase/wallet-sdk/dist/provider/coinbasewalletprovider.d.ts","../../node_modules/@coinbase/wallet-sdk/dist/relay/relayui.d.ts","../../node_modules/@coinbase/wallet-sdk/dist/coinbasewalletsdk.d.ts","../../node_modules/@coinbase/wallet-sdk/dist/index.d.ts","../../node_modules/@wagmi/connectors/dist/types/coinbasewallet.d.ts","../../node_modules/@metamask/providers/node_modules/@metamask/safe-event-emitter/index.d.ts","../../node_modules/json-rpc-engine/node_modules/@metamask/safe-event-emitter/index.d.ts","../../node_modules/json-rpc-engine/dist/jsonrpcengine.d.ts","../../node_modules/json-rpc-engine/dist/idremapmiddleware.d.ts","../../node_modules/json-rpc-engine/dist/createasyncmiddleware.d.ts","../../node_modules/json-rpc-engine/dist/createscaffoldmiddleware.d.ts","../../node_modules/json-rpc-engine/dist/getuniqueid.d.ts","../../node_modules/json-rpc-engine/dist/mergemiddleware.d.ts","../../node_modules/json-rpc-engine/dist/index.d.ts","../../node_modules/@metamask/providers/dist/utils.d.ts","../../node_modules/@metamask/providers/dist/baseprovider.d.ts","../../node_modules/@metamask/providers/dist/streamprovider.d.ts","../../node_modules/@metamask/providers/dist/extension-provider/createexternalextensionprovider.d.ts","../../node_modules/@metamask/providers/dist/metamaskinpageprovider.d.ts","../../node_modules/@metamask/providers/dist/initializeinpageprovider.d.ts","../../node_modules/@metamask/providers/dist/shimweb3.d.ts","../../node_modules/@metamask/providers/dist/index.d.ts","../../node_modules/@metamask/sdk-communication-layer/dist/browser/es/src/types/communicationlayerpreference.d.ts","../../node_modules/@metamask/sdk-communication-layer/dist/browser/es/src/types/originatorinfo.d.ts","../../node_modules/@metamask/sdk-communication-layer/dist/browser/es/src/types/trackingevent.d.ts","../../node_modules/@metamask/sdk-communication-layer/dist/browser/es/src/analytics.d.ts","../../node_modules/@metamask/sdk-communication-layer/dist/browser/es/src/ecies.d.ts","../../node_modules/eventemitter2/eventemitter2.d.ts","../../node_modules/@metamask/sdk-communication-layer/dist/browser/es/src/types/autoconnectoptions.d.ts","../../node_modules/@metamask/sdk-communication-layer/dist/browser/es/src/types/channelconfig.d.ts","../../node_modules/@socket.io/component-emitter/index.d.ts","../../node_modules/engine.io-parser/build/esm/commons.d.ts","../../node_modules/engine.io-parser/build/esm/encodepacket.d.ts","../../node_modules/engine.io-parser/build/esm/decodepacket.d.ts","../../node_modules/engine.io-parser/build/esm/index.d.ts","../../node_modules/engine.io-client/build/esm/transport.d.ts","../../node_modules/engine.io-client/build/esm/socket.d.ts","../../node_modules/engine.io-client/build/esm/transports/polling.d.ts","../../node_modules/engine.io-client/build/esm/transports/websocket.d.ts","../../node_modules/engine.io-client/build/esm/transports/webtransport.d.ts","../../node_modules/engine.io-client/build/esm/transports/index.d.ts","../../node_modules/engine.io-client/build/esm/util.d.ts","../../node_modules/engine.io-client/build/esm/contrib/parseuri.d.ts","../../node_modules/engine.io-client/build/esm/transports/websocket-constructor.d.ts","../../node_modules/engine.io-client/build/esm/index.d.ts","../../node_modules/socket.io-parser/build/esm/index.d.ts","../../node_modules/socket.io-client/build/esm/socket.d.ts","../../node_modules/socket.io-client/build/esm/manager.d.ts","../../node_modules/socket.io-client/build/esm/index.d.ts","../../node_modules/@metamask/sdk-communication-layer/dist/browser/es/src/types/keyexchangemessagetype.d.ts","../../node_modules/@metamask/sdk-communication-layer/dist/browser/es/src/types/messagetype.d.ts","../../node_modules/@metamask/sdk-communication-layer/dist/browser/es/src/types/walletinfo.d.ts","../../node_modules/@metamask/sdk-communication-layer/dist/browser/es/src/types/communicationlayermessage.d.ts","../../node_modules/@metamask/sdk-communication-layer/dist/browser/es/src/types/keyinfo.d.ts","../../node_modules/@metamask/sdk-communication-layer/dist/browser/es/src/types/loggingoptions.d.ts","../../node_modules/@metamask/sdk-communication-layer/dist/browser/es/src/keyexchange.d.ts","../../node_modules/@metamask/sdk-communication-layer/dist/browser/es/src/types/channel.d.ts","../../node_modules/@metamask/sdk-communication-layer/dist/browser/es/src/types/connecttochanneloptions.d.ts","../../node_modules/@metamask/sdk-communication-layer/dist/browser/es/src/types/disconnectoptions.d.ts","../../node_modules/@metamask/sdk-communication-layer/dist/browser/es/src/socketservice.d.ts","../../node_modules/@metamask/sdk-communication-layer/dist/browser/es/src/types/communicationlayer.d.ts","../../node_modules/@metamask/sdk-communication-layer/dist/browser/es/src/types/connectionstatus.d.ts","../../node_modules/@metamask/sdk-communication-layer/dist/browser/es/src/types/dappmetadata.d.ts","../../node_modules/@metamask/sdk-communication-layer/dist/browser/es/src/types/platformtype.d.ts","../../node_modules/@metamask/sdk-communication-layer/dist/browser/es/src/types/servicestatus.d.ts","../../node_modules/@metamask/sdk-communication-layer/dist/browser/es/src/types/storagemanager.d.ts","../../node_modules/@metamask/sdk-communication-layer/dist/browser/es/src/remotecommunication.d.ts","../../node_modules/@metamask/sdk-communication-layer/dist/browser/es/src/config.d.ts","../../node_modules/@metamask/sdk-communication-layer/dist/browser/es/src/types/autoconnecttype.d.ts","../../node_modules/@metamask/sdk-communication-layer/dist/browser/es/src/types/eventtype.d.ts","../../node_modules/@metamask/sdk-communication-layer/dist/browser/es/src/index.d.ts","../../node_modules/react-native-webview/lib/webviewtypes.d.ts","../../node_modules/react-native-webview/index.d.ts","../../node_modules/@metamask/sdk/dist/browser/es/src/provider/sdkprovider.d.ts","../../node_modules/i18next/index.d.ts","../../node_modules/@metamask/sdk/dist/browser/es/src/services/providerservice.d.ts","../../node_modules/@metamask/sdk/dist/browser/es/src/types/wakelockstatus.d.ts","../../node_modules/@metamask/sdk/dist/browser/es/src/platform/wakelockmanager.d.ts","../../node_modules/@metamask/sdk/dist/browser/es/src/platform/platfformmanager.d.ts","../../node_modules/@metamask/sdk/dist/browser/es/src/platform/metamaskinstaller.d.ts","../../node_modules/@metamask/sdk/dist/browser/es/src/services/analytics.d.ts","../../node_modules/@metamask/sdk/dist/browser/es/src/services/metamasksdk/initializermanager/setupreadonlyrpcproviders.d.ts","../../node_modules/@metamask/sdk/dist/browser/es/src/types/sdkloggingoptions.d.ts","../../node_modules/@metamask/sdk/dist/browser/es/src/services/remoteconnection/remoteconnection.d.ts","../../node_modules/@metamask/sdk/dist/browser/es/src/services/remoteconnection/index.d.ts","../../node_modules/@metamask/sdk/dist/browser/es/src/types/sdkuioptions.d.ts","../../node_modules/@metamask/sdk/dist/browser/es/src/sdk.d.ts","../../node_modules/@metamask/sdk/dist/browser/es/src/types/providerupdatetype.d.ts","../../node_modules/@metamask/sdk/dist/browser/es/src/index.d.ts","../../node_modules/@wagmi/connectors/dist/types/metamask.d.ts","../../node_modules/@safe-global/safe-gateway-typescript-sdk/dist/types/common.d.ts","../../node_modules/@safe-global/safe-gateway-typescript-sdk/dist/types/human-description.d.ts","../../node_modules/@safe-global/safe-gateway-typescript-sdk/dist/types/transactions.d.ts","../../node_modules/@safe-global/safe-gateway-typescript-sdk/dist/types/safe-info.d.ts","../../node_modules/@safe-global/safe-gateway-typescript-sdk/dist/types/chains.d.ts","../../node_modules/@safe-global/safe-gateway-typescript-sdk/dist/types/safe-apps.d.ts","../../node_modules/@safe-global/safe-gateway-typescript-sdk/dist/types/decoded-data.d.ts","../../node_modules/@safe-global/safe-gateway-typescript-sdk/dist/types/master-copies.d.ts","../../node_modules/@safe-global/safe-gateway-typescript-sdk/dist/types/safe-messages.d.ts","../../node_modules/@safe-global/safe-gateway-typescript-sdk/dist/types/delegates.d.ts","../../node_modules/@safe-global/safe-gateway-typescript-sdk/dist/types/notifications.d.ts","../../node_modules/@safe-global/safe-gateway-typescript-sdk/dist/types/api.d.ts","../../node_modules/@safe-global/safe-gateway-typescript-sdk/dist/index.d.ts","../../node_modules/@safe-global/safe-apps-sdk/dist/src/types/sdk.d.ts","../../node_modules/@safe-global/safe-apps-sdk/dist/src/eth/constants.d.ts","../../node_modules/@safe-global/safe-apps-sdk/dist/src/types/rpc.d.ts","../../node_modules/@safe-global/safe-apps-sdk/dist/src/types/gateway.d.ts","../../node_modules/@safe-global/safe-apps-sdk/dist/src/communication/methods.d.ts","../../node_modules/@safe-global/safe-apps-sdk/dist/src/types/permissions.d.ts","../../node_modules/@safe-global/safe-apps-sdk/dist/src/types/messaging.d.ts","../../node_modules/@safe-global/safe-apps-sdk/dist/src/types/index.d.ts","../../node_modules/@safe-global/safe-apps-sdk/dist/src/txs/index.d.ts","../../node_modules/@safe-global/safe-apps-sdk/dist/src/eth/index.d.ts","../../node_modules/@safe-global/safe-apps-sdk/dist/src/safe/index.d.ts","../../node_modules/@safe-global/safe-apps-sdk/dist/src/wallet/index.d.ts","../../node_modules/@safe-global/safe-apps-sdk/dist/src/sdk.d.ts","../../node_modules/@safe-global/safe-apps-sdk/dist/src/communication/messageformatter.d.ts","../../node_modules/@safe-global/safe-apps-sdk/dist/src/utils.d.ts","../../node_modules/@safe-global/safe-apps-sdk/dist/src/index.d.ts","../../node_modules/@safe-global/safe-apps-provider/dist/types.d.ts","../../node_modules/@safe-global/safe-apps-provider/dist/provider.d.ts","../../node_modules/@safe-global/safe-apps-provider/dist/index.d.ts","../../node_modules/@wagmi/connectors/dist/types/safe.d.ts","../../node_modules/@walletconnect/keyvaluestorage/dist/types/shared/types.d.ts","../../node_modules/@walletconnect/keyvaluestorage/dist/types/shared/utils.d.ts","../../node_modules/@walletconnect/keyvaluestorage/dist/types/shared/index.d.ts","../../node_modules/@walletconnect/keyvaluestorage/dist/types/node-js/index.d.ts","../../node_modules/@walletconnect/keyvaluestorage/dist/types/index.d.ts","../../node_modules/@walletconnect/events/dist/cjs/events.d.ts","../../node_modules/@walletconnect/events/dist/cjs/index.d.ts","../../node_modules/@walletconnect/heartbeat/dist/cjs/types/heartbeat.d.ts","../../node_modules/@walletconnect/heartbeat/dist/cjs/types/index.d.ts","../../node_modules/@walletconnect/heartbeat/dist/cjs/heartbeat.d.ts","../../node_modules/@walletconnect/heartbeat/dist/cjs/constants/heartbeat.d.ts","../../node_modules/@walletconnect/heartbeat/dist/cjs/constants/index.d.ts","../../node_modules/@walletconnect/heartbeat/dist/cjs/index.d.ts","../../node_modules/@walletconnect/jsonrpc-types/dist/cjs/jsonrpc.d.ts","../../node_modules/@walletconnect/jsonrpc-types/dist/cjs/misc.d.ts","../../node_modules/@walletconnect/jsonrpc-types/dist/cjs/provider.d.ts","../../node_modules/@walletconnect/jsonrpc-types/dist/cjs/validator.d.ts","../../node_modules/@walletconnect/jsonrpc-types/dist/cjs/index.d.ts","../../node_modules/pino-std-serializers/index.d.ts","../../node_modules/sonic-boom/types/index.d.ts","../../node_modules/pino/pino.d.ts","../../node_modules/@walletconnect/logger/dist/cjs/constants.d.ts","../../node_modules/@walletconnect/logger/dist/cjs/utils.d.ts","../../node_modules/@walletconnect/logger/dist/cjs/index.d.ts","../../node_modules/@walletconnect/types/dist/types/core/keychain.d.ts","../../node_modules/@walletconnect/types/dist/types/core/crypto.d.ts","../../node_modules/@walletconnect/types/dist/types/core/messages.d.ts","../../node_modules/@walletconnect/types/dist/types/core/publisher.d.ts","../../node_modules/@walletconnect/types/dist/types/core/subscriber.d.ts","../../node_modules/@walletconnect/types/dist/types/core/relayer.d.ts","../../node_modules/@walletconnect/types/dist/types/core/history.d.ts","../../node_modules/@walletconnect/types/dist/types/core/expirer.d.ts","../../node_modules/@walletconnect/types/dist/types/core/store.d.ts","../../node_modules/@walletconnect/types/dist/types/core/pairing.d.ts","../../node_modules/@walletconnect/types/dist/types/core/verify.d.ts","../../node_modules/@walletconnect/types/dist/types/core/echo.d.ts","../../node_modules/@walletconnect/types/dist/types/core/core.d.ts","../../node_modules/@walletconnect/types/dist/types/core/index.d.ts","../../node_modules/@walletconnect/types/dist/types/sign-client/proposal.d.ts","../../node_modules/@walletconnect/types/dist/types/sign-client/session.d.ts","../../node_modules/@walletconnect/types/dist/types/sign-client/jsonrpc.d.ts","../../node_modules/@walletconnect/types/dist/types/sign-client/pendingrequest.d.ts","../../node_modules/@walletconnect/types/dist/types/sign-client/engine.d.ts","../../node_modules/@walletconnect/types/dist/types/sign-client/client.d.ts","../../node_modules/@walletconnect/types/dist/types/sign-client/index.d.ts","../../node_modules/@walletconnect/types/dist/types/index.d.ts","../../node_modules/@walletconnect/ethereum-provider/dist/types/types.d.ts","../../node_modules/@walletconnect/sign-client/dist/types/client.d.ts","../../node_modules/@walletconnect/core/dist/types/core.d.ts","../../node_modules/@walletconnect/core/dist/types/constants/core.d.ts","../../node_modules/@walletconnect/core/dist/types/constants/crypto.d.ts","../../node_modules/@walletconnect/core/dist/types/constants/keychain.d.ts","../../node_modules/@walletconnect/core/dist/types/constants/messages.d.ts","../../node_modules/@walletconnect/core/dist/types/constants/publisher.d.ts","../../node_modules/@walletconnect/core/dist/types/constants/relayer.d.ts","../../node_modules/@walletconnect/core/dist/types/constants/store.d.ts","../../node_modules/@walletconnect/core/dist/types/constants/subscriber.d.ts","../../node_modules/@walletconnect/core/dist/types/constants/pairing.d.ts","../../node_modules/@walletconnect/core/dist/types/constants/history.d.ts","../../node_modules/@walletconnect/core/dist/types/constants/expirer.d.ts","../../node_modules/@walletconnect/core/dist/types/constants/verify.d.ts","../../node_modules/@walletconnect/core/dist/types/constants/echo.d.ts","../../node_modules/@walletconnect/core/dist/types/constants/index.d.ts","../../node_modules/@walletconnect/core/dist/types/controllers/crypto.d.ts","../../node_modules/@walletconnect/core/dist/types/controllers/messages.d.ts","../../node_modules/@walletconnect/jsonrpc-utils/dist/cjs/constants.d.ts","../../node_modules/@walletconnect/jsonrpc-utils/dist/cjs/types.d.ts","../../node_modules/@walletconnect/jsonrpc-utils/dist/cjs/error.d.ts","../../node_modules/@walletconnect/environment/dist/cjs/crypto.d.ts","../../node_modules/@walletconnect/environment/dist/cjs/env.d.ts","../../node_modules/@walletconnect/environment/dist/cjs/index.d.ts","../../node_modules/@walletconnect/jsonrpc-utils/dist/cjs/env.d.ts","../../node_modules/@walletconnect/jsonrpc-utils/dist/cjs/format.d.ts","../../node_modules/@walletconnect/jsonrpc-utils/dist/cjs/routing.d.ts","../../node_modules/@walletconnect/jsonrpc-utils/dist/cjs/url.d.ts","../../node_modules/@walletconnect/jsonrpc-utils/dist/cjs/validators.d.ts","../../node_modules/@walletconnect/jsonrpc-utils/dist/cjs/index.d.ts","../../node_modules/@walletconnect/relay-api/dist/cjs/types.d.ts","../../node_modules/@walletconnect/relay-api/dist/cjs/parsers.d.ts","../../node_modules/@walletconnect/relay-api/dist/cjs/jsonrpc.d.ts","../../node_modules/@walletconnect/relay-api/dist/cjs/validators.d.ts","../../node_modules/@walletconnect/relay-api/dist/cjs/index.d.ts","../../node_modules/@walletconnect/core/dist/types/controllers/relayer.d.ts","../../node_modules/@walletconnect/core/dist/types/controllers/store.d.ts","../../node_modules/@walletconnect/core/dist/types/controllers/topicmap.d.ts","../../node_modules/@walletconnect/core/dist/types/controllers/subscriber.d.ts","../../node_modules/@walletconnect/core/dist/types/controllers/keychain.d.ts","../../node_modules/@walletconnect/core/dist/types/controllers/pairing.d.ts","../../node_modules/@walletconnect/core/dist/types/controllers/history.d.ts","../../node_modules/@walletconnect/core/dist/types/controllers/expirer.d.ts","../../node_modules/@walletconnect/core/dist/types/controllers/verify.d.ts","../../node_modules/@walletconnect/core/dist/types/controllers/echo.d.ts","../../node_modules/@walletconnect/core/dist/types/controllers/index.d.ts","../../node_modules/@walletconnect/core/dist/types/index.d.ts","../../node_modules/@walletconnect/sign-client/dist/types/controllers/session.d.ts","../../node_modules/@walletconnect/sign-client/dist/types/constants/client.d.ts","../../node_modules/@walletconnect/sign-client/dist/types/constants/history.d.ts","../../node_modules/@walletconnect/sign-client/dist/types/constants/proposal.d.ts","../../node_modules/@walletconnect/sign-client/dist/types/constants/session.d.ts","../../node_modules/@walletconnect/sign-client/dist/types/constants/engine.d.ts","../../node_modules/@walletconnect/sign-client/dist/types/constants/pendingrequest.d.ts","../../node_modules/@walletconnect/sign-client/dist/types/constants/verify.d.ts","../../node_modules/@walletconnect/sign-client/dist/types/constants/index.d.ts","../../node_modules/@walletconnect/sign-client/dist/types/index.d.ts","../../node_modules/@walletconnect/jsonrpc-provider/dist/cjs/provider.d.ts","../../node_modules/@walletconnect/jsonrpc-provider/dist/cjs/index.d.ts","../../node_modules/@walletconnect/universal-provider/dist/types/types/misc.d.ts","../../node_modules/@walletconnect/universal-provider/dist/types/types/providers.d.ts","../../node_modules/@walletconnect/universal-provider/dist/types/types/index.d.ts","../../node_modules/@walletconnect/universal-provider/dist/types/universalprovider.d.ts","../../node_modules/@walletconnect/universal-provider/dist/types/index.d.ts","../../node_modules/@walletconnect/ethereum-provider/dist/types/ethereumprovider.d.ts","../../node_modules/@walletconnect/ethereum-provider/dist/types/constants/rpc.d.ts","../../node_modules/@walletconnect/ethereum-provider/dist/types/index.d.ts","../../node_modules/@wagmi/connectors/dist/types/walletconnect.d.ts","../../node_modules/@wagmi/connectors/dist/types/version.d.ts","../../node_modules/@wagmi/connectors/dist/types/exports/index.d.ts","../../node_modules/wagmi/dist/types/exports/connectors.d.ts","../../node_modules/@rainbow-me/rainbowkit/dist/wallets/walletconnectors/coinbasewallet/coinbasewallet.d.ts","../../node_modules/@rainbow-me/rainbowkit/dist/wallets/walletconnectors/walletconnectwallet/walletconnectwallet.d.ts","../../node_modules/@rainbow-me/rainbowkit/dist/wallets/wallet.d.ts","../../node_modules/@rainbow-me/rainbowkit/dist/wallets/usewalletconnectors.d.ts","../../node_modules/@rainbow-me/rainbowkit/dist/components/walletbutton/walletbuttonrenderer.d.ts","../../node_modules/@rainbow-me/rainbowkit/dist/components/walletbutton/walletbutton.d.ts","../../node_modules/wagmi/dist/types/exports/chains.d.ts","../../node_modules/@rainbow-me/rainbowkit/dist/locales/i18n.d.ts","../../node_modules/@rainbow-me/rainbowkit/dist/locales/index.d.ts","../../node_modules/@rainbow-me/rainbowkit/dist/components/rainbowkitprovider/appcontext.d.ts","../../node_modules/@rainbow-me/rainbowkit/dist/components/rainbowkitprovider/avatarcontext.d.ts","../../node_modules/@rainbow-me/rainbowkit/dist/components/rainbowkitprovider/modalsizecontext.d.ts","../../node_modules/@rainbow-me/rainbowkit/dist/components/rainbowkitprovider/rainbowkitprovider.d.ts","../../node_modules/@rainbow-me/rainbowkit/dist/components/rainbowkitprovider/rainbowkitchaincontext.d.ts","../../node_modules/@rainbow-me/rainbowkit/dist/config/getdefaultconfig.d.ts","../../node_modules/@rainbow-me/rainbowkit/dist/wallets/connectorsforwallets.d.ts","../../node_modules/@rainbow-me/rainbowkit/dist/wallets/getdefaultwallets.d.ts","../../node_modules/@rainbow-me/rainbowkit/dist/wallets/getwalletconnectconnector.d.ts","../../node_modules/@rainbow-me/rainbowkit/dist/components/rainbowkitprovider/modalcontext.d.ts","../../node_modules/@rainbow-me/rainbowkit/dist/transactions/transactionstore.d.ts","../../node_modules/@rainbow-me/rainbowkit/dist/transactions/useaddrecenttransaction.d.ts","../../node_modules/@rainbow-me/rainbowkit/dist/themes/basetheme.d.ts","../../node_modules/@rainbow-me/rainbowkit/dist/themes/lighttheme.d.ts","../../node_modules/@rainbow-me/rainbowkit/dist/themes/darktheme.d.ts","../../node_modules/@rainbow-me/rainbowkit/dist/themes/midnighttheme.d.ts","../../node_modules/@rainbow-me/rainbowkit/dist/css/cssstringfromtheme.d.ts","../../node_modules/@rainbow-me/rainbowkit/dist/css/cssobjectfromtheme.d.ts","../../node_modules/@rainbow-me/rainbowkit/dist/components/connectoptions/desktopoptions.d.ts","../../node_modules/@rainbow-me/rainbowkit/dist/components/connectoptions/mobileoptions.d.ts","../../node_modules/@rainbow-me/rainbowkit/dist/__private__/index.d.ts","../../node_modules/@rainbow-me/rainbowkit/dist/index.d.ts","../../node_modules/@rainbow-me/rainbowkit/dist/wallets/walletconnectors/argentwallet/argentwallet.d.ts","../../node_modules/@rainbow-me/rainbowkit/dist/wallets/walletconnectors/bifrostwallet/bifrostwallet.d.ts","../../node_modules/@rainbow-me/rainbowkit/dist/wallets/walletconnectors/bitgetwallet/bitgetwallet.d.ts","../../node_modules/@rainbow-me/rainbowkit/dist/wallets/walletconnectors/bitskiwallet/bitskiwallet.d.ts","../../node_modules/@rainbow-me/rainbowkit/dist/wallets/walletconnectors/bloomwallet/bloomwallet.d.ts","../../node_modules/@rainbow-me/rainbowkit/dist/wallets/walletconnectors/bravewallet/bravewallet.d.ts","../../node_modules/@rainbow-me/rainbowkit/dist/wallets/walletconnectors/clvwallet/clvwallet.d.ts","../../node_modules/@rainbow-me/rainbowkit/dist/wallets/walletconnectors/coin98wallet/coin98wallet.d.ts","../../node_modules/@rainbow-me/rainbowkit/dist/wallets/walletconnectors/corewallet/corewallet.d.ts","../../node_modules/@rainbow-me/rainbowkit/dist/wallets/walletconnectors/dawnwallet/dawnwallet.d.ts","../../node_modules/@rainbow-me/rainbowkit/dist/wallets/walletconnectors/desigwallet/desigwallet.d.ts","../../node_modules/@rainbow-me/rainbowkit/dist/wallets/walletconnectors/enkryptwallet/enkryptwallet.d.ts","../../node_modules/@rainbow-me/rainbowkit/dist/wallets/walletconnectors/foxwallet/foxwallet.d.ts","../../node_modules/@rainbow-me/rainbowkit/dist/wallets/walletconnectors/framewallet/framewallet.d.ts","../../node_modules/@rainbow-me/rainbowkit/dist/wallets/walletconnectors/frontierwallet/frontierwallet.d.ts","../../node_modules/@rainbow-me/rainbowkit/dist/wallets/walletconnectors/imtokenwallet/imtokenwallet.d.ts","../../node_modules/@rainbow-me/rainbowkit/dist/wallets/walletconnectors/injectedwallet/injectedwallet.d.ts","../../node_modules/@rainbow-me/rainbowkit/dist/wallets/walletconnectors/kresuswallet/kresuswallet.d.ts","../../node_modules/@rainbow-me/rainbowkit/dist/wallets/walletconnectors/ledgerwallet/ledgerwallet.d.ts","../../node_modules/@rainbow-me/rainbowkit/dist/wallets/walletconnectors/metamaskwallet/metamaskwallet.d.ts","../../node_modules/@rainbow-me/rainbowkit/dist/wallets/walletconnectors/mewwallet/mewwallet.d.ts","../../node_modules/@rainbow-me/rainbowkit/dist/wallets/walletconnectors/oktowallet/oktowallet.d.ts","../../node_modules/@rainbow-me/rainbowkit/dist/wallets/walletconnectors/okxwallet/okxwallet.d.ts","../../node_modules/@rainbow-me/rainbowkit/dist/wallets/walletconnectors/omniwallet/omniwallet.d.ts","../../node_modules/@rainbow-me/rainbowkit/dist/wallets/walletconnectors/onekeywallet/onekeywallet.d.ts","../../node_modules/@rainbow-me/rainbowkit/dist/wallets/walletconnectors/phantomwallet/phantomwallet.d.ts","../../node_modules/@rainbow-me/rainbowkit/dist/wallets/walletconnectors/rabbywallet/rabbywallet.d.ts","../../node_modules/@rainbow-me/rainbowkit/dist/wallets/walletconnectors/rainbowwallet/rainbowwallet.d.ts","../../node_modules/@rainbow-me/rainbowkit/dist/wallets/walletconnectors/ramperwallet/ramperwallet.d.ts","../../node_modules/@rainbow-me/rainbowkit/dist/wallets/walletconnectors/roninwallet/roninwallet.d.ts","../../node_modules/@rainbow-me/rainbowkit/dist/wallets/walletconnectors/safewallet/safewallet.d.ts","../../node_modules/@rainbow-me/rainbowkit/dist/wallets/walletconnectors/safeheronwallet/safeheronwallet.d.ts","../../node_modules/@rainbow-me/rainbowkit/dist/wallets/walletconnectors/safepalwallet/safepalwallet.d.ts","../../node_modules/@rainbow-me/rainbowkit/dist/wallets/walletconnectors/subwallet/subwallet.d.ts","../../node_modules/@rainbow-me/rainbowkit/dist/wallets/walletconnectors/tahowallet/tahowallet.d.ts","../../node_modules/@rainbow-me/rainbowkit/dist/wallets/walletconnectors/talismanwallet/talismanwallet.d.ts","../../node_modules/@rainbow-me/rainbowkit/dist/wallets/walletconnectors/tokenpocketwallet/tokenpocketwallet.d.ts","../../node_modules/@rainbow-me/rainbowkit/dist/wallets/walletconnectors/tokenarywallet/tokenarywallet.d.ts","../../node_modules/@rainbow-me/rainbowkit/dist/wallets/walletconnectors/trustwallet/trustwallet.d.ts","../../node_modules/@rainbow-me/rainbowkit/dist/wallets/walletconnectors/uniswapwallet/uniswapwallet.d.ts","../../node_modules/@rainbow-me/rainbowkit/dist/wallets/walletconnectors/xdefiwallet/xdefiwallet.d.ts","../../node_modules/@rainbow-me/rainbowkit/dist/wallets/walletconnectors/zealwallet/zealwallet.d.ts","../../node_modules/@rainbow-me/rainbowkit/dist/wallets/walletconnectors/zerionwallet/zerionwallet.d.ts","../../node_modules/@rainbow-me/rainbowkit/dist/wallets/walletconnectors/index.d.ts","./src/lib/wagmi.ts","./src/lib/rainbowkit.ts","./src/lib/reactquery.ts","./src/ui/network/hooks/usesupportedchainid.ts","./src/utils/getairdropdata.ts","./src/ui/airdrop/hooks/useairdropdata.ts","./src/ui/config/hooks/usecouncilconfig.ts","./src/ui/council/hooks/usereadcouncil.ts","./src/ui/airdrop/hooks/usereadairdrop.ts","./src/ui/airdrop/hooks/useairdroplockingvault.ts","./src/ui/airdrop/hooks/useairdroptoken.ts","./src/ui/council/hooks/usereadwritecouncil.ts","./src/ui/airdrop/hooks/usereadwriteairdrop.ts","../../node_modules/@heroicons/react/20/solid/academiccapicon.d.ts","../../node_modules/@heroicons/react/20/solid/adjustmentshorizontalicon.d.ts","../../node_modules/@heroicons/react/20/solid/adjustmentsverticalicon.d.ts","../../node_modules/@heroicons/react/20/solid/archiveboxarrowdownicon.d.ts","../../node_modules/@heroicons/react/20/solid/archiveboxxmarkicon.d.ts","../../node_modules/@heroicons/react/20/solid/archiveboxicon.d.ts","../../node_modules/@heroicons/react/20/solid/arrowdowncircleicon.d.ts","../../node_modules/@heroicons/react/20/solid/arrowdownlefticon.d.ts","../../node_modules/@heroicons/react/20/solid/arrowdownonsquarestackicon.d.ts","../../node_modules/@heroicons/react/20/solid/arrowdownonsquareicon.d.ts","../../node_modules/@heroicons/react/20/solid/arrowdownrighticon.d.ts","../../node_modules/@heroicons/react/20/solid/arrowdowntrayicon.d.ts","../../node_modules/@heroicons/react/20/solid/arrowdownicon.d.ts","../../node_modules/@heroicons/react/20/solid/arrowleftcircleicon.d.ts","../../node_modules/@heroicons/react/20/solid/arrowleftendonrectangleicon.d.ts","../../node_modules/@heroicons/react/20/solid/arrowleftonrectangleicon.d.ts","../../node_modules/@heroicons/react/20/solid/arrowleftstartonrectangleicon.d.ts","../../node_modules/@heroicons/react/20/solid/arrowlefticon.d.ts","../../node_modules/@heroicons/react/20/solid/arrowlongdownicon.d.ts","../../node_modules/@heroicons/react/20/solid/arrowlonglefticon.d.ts","../../node_modules/@heroicons/react/20/solid/arrowlongrighticon.d.ts","../../node_modules/@heroicons/react/20/solid/arrowlongupicon.d.ts","../../node_modules/@heroicons/react/20/solid/arrowpathroundedsquareicon.d.ts","../../node_modules/@heroicons/react/20/solid/arrowpathicon.d.ts","../../node_modules/@heroicons/react/20/solid/arrowrightcircleicon.d.ts","../../node_modules/@heroicons/react/20/solid/arrowrightendonrectangleicon.d.ts","../../node_modules/@heroicons/react/20/solid/arrowrightonrectangleicon.d.ts","../../node_modules/@heroicons/react/20/solid/arrowrightstartonrectangleicon.d.ts","../../node_modules/@heroicons/react/20/solid/arrowrighticon.d.ts","../../node_modules/@heroicons/react/20/solid/arrowsmalldownicon.d.ts","../../node_modules/@heroicons/react/20/solid/arrowsmalllefticon.d.ts","../../node_modules/@heroicons/react/20/solid/arrowsmallrighticon.d.ts","../../node_modules/@heroicons/react/20/solid/arrowsmallupicon.d.ts","../../node_modules/@heroicons/react/20/solid/arrowtoprightonsquareicon.d.ts","../../node_modules/@heroicons/react/20/solid/arrowtrendingdownicon.d.ts","../../node_modules/@heroicons/react/20/solid/arrowtrendingupicon.d.ts","../../node_modules/@heroicons/react/20/solid/arrowupcircleicon.d.ts","../../node_modules/@heroicons/react/20/solid/arrowuplefticon.d.ts","../../node_modules/@heroicons/react/20/solid/arrowuponsquarestackicon.d.ts","../../node_modules/@heroicons/react/20/solid/arrowuponsquareicon.d.ts","../../node_modules/@heroicons/react/20/solid/arrowuprighticon.d.ts","../../node_modules/@heroicons/react/20/solid/arrowuptrayicon.d.ts","../../node_modules/@heroicons/react/20/solid/arrowupicon.d.ts","../../node_modules/@heroicons/react/20/solid/arrowuturndownicon.d.ts","../../node_modules/@heroicons/react/20/solid/arrowuturnlefticon.d.ts","../../node_modules/@heroicons/react/20/solid/arrowuturnrighticon.d.ts","../../node_modules/@heroicons/react/20/solid/arrowuturnupicon.d.ts","../../node_modules/@heroicons/react/20/solid/arrowspointinginicon.d.ts","../../node_modules/@heroicons/react/20/solid/arrowspointingouticon.d.ts","../../node_modules/@heroicons/react/20/solid/arrowsrightlefticon.d.ts","../../node_modules/@heroicons/react/20/solid/arrowsupdownicon.d.ts","../../node_modules/@heroicons/react/20/solid/atsymbolicon.d.ts","../../node_modules/@heroicons/react/20/solid/backspaceicon.d.ts","../../node_modules/@heroicons/react/20/solid/backwardicon.d.ts","../../node_modules/@heroicons/react/20/solid/banknotesicon.d.ts","../../node_modules/@heroicons/react/20/solid/bars2icon.d.ts","../../node_modules/@heroicons/react/20/solid/bars3bottomlefticon.d.ts","../../node_modules/@heroicons/react/20/solid/bars3bottomrighticon.d.ts","../../node_modules/@heroicons/react/20/solid/bars3centerlefticon.d.ts","../../node_modules/@heroicons/react/20/solid/bars3icon.d.ts","../../node_modules/@heroicons/react/20/solid/bars4icon.d.ts","../../node_modules/@heroicons/react/20/solid/barsarrowdownicon.d.ts","../../node_modules/@heroicons/react/20/solid/barsarrowupicon.d.ts","../../node_modules/@heroicons/react/20/solid/battery0icon.d.ts","../../node_modules/@heroicons/react/20/solid/battery100icon.d.ts","../../node_modules/@heroicons/react/20/solid/battery50icon.d.ts","../../node_modules/@heroicons/react/20/solid/beakericon.d.ts","../../node_modules/@heroicons/react/20/solid/bellalerticon.d.ts","../../node_modules/@heroicons/react/20/solid/bellslashicon.d.ts","../../node_modules/@heroicons/react/20/solid/bellsnoozeicon.d.ts","../../node_modules/@heroicons/react/20/solid/bellicon.d.ts","../../node_modules/@heroicons/react/20/solid/boltslashicon.d.ts","../../node_modules/@heroicons/react/20/solid/bolticon.d.ts","../../node_modules/@heroicons/react/20/solid/bookopenicon.d.ts","../../node_modules/@heroicons/react/20/solid/bookmarkslashicon.d.ts","../../node_modules/@heroicons/react/20/solid/bookmarksquareicon.d.ts","../../node_modules/@heroicons/react/20/solid/bookmarkicon.d.ts","../../node_modules/@heroicons/react/20/solid/briefcaseicon.d.ts","../../node_modules/@heroicons/react/20/solid/buganticon.d.ts","../../node_modules/@heroicons/react/20/solid/buildinglibraryicon.d.ts","../../node_modules/@heroicons/react/20/solid/buildingoffice2icon.d.ts","../../node_modules/@heroicons/react/20/solid/buildingofficeicon.d.ts","../../node_modules/@heroicons/react/20/solid/buildingstorefronticon.d.ts","../../node_modules/@heroicons/react/20/solid/cakeicon.d.ts","../../node_modules/@heroicons/react/20/solid/calculatoricon.d.ts","../../node_modules/@heroicons/react/20/solid/calendardaysicon.d.ts","../../node_modules/@heroicons/react/20/solid/calendaricon.d.ts","../../node_modules/@heroicons/react/20/solid/cameraicon.d.ts","../../node_modules/@heroicons/react/20/solid/chartbarsquareicon.d.ts","../../node_modules/@heroicons/react/20/solid/chartbaricon.d.ts","../../node_modules/@heroicons/react/20/solid/chartpieicon.d.ts","../../node_modules/@heroicons/react/20/solid/chatbubblebottomcentertexticon.d.ts","../../node_modules/@heroicons/react/20/solid/chatbubblebottomcentericon.d.ts","../../node_modules/@heroicons/react/20/solid/chatbubbleleftellipsisicon.d.ts","../../node_modules/@heroicons/react/20/solid/chatbubbleleftrighticon.d.ts","../../node_modules/@heroicons/react/20/solid/chatbubblelefticon.d.ts","../../node_modules/@heroicons/react/20/solid/chatbubbleovalleftellipsisicon.d.ts","../../node_modules/@heroicons/react/20/solid/chatbubbleovallefticon.d.ts","../../node_modules/@heroicons/react/20/solid/checkbadgeicon.d.ts","../../node_modules/@heroicons/react/20/solid/checkcircleicon.d.ts","../../node_modules/@heroicons/react/20/solid/checkicon.d.ts","../../node_modules/@heroicons/react/20/solid/chevrondoubledownicon.d.ts","../../node_modules/@heroicons/react/20/solid/chevrondoublelefticon.d.ts","../../node_modules/@heroicons/react/20/solid/chevrondoublerighticon.d.ts","../../node_modules/@heroicons/react/20/solid/chevrondoubleupicon.d.ts","../../node_modules/@heroicons/react/20/solid/chevrondownicon.d.ts","../../node_modules/@heroicons/react/20/solid/chevronlefticon.d.ts","../../node_modules/@heroicons/react/20/solid/chevronrighticon.d.ts","../../node_modules/@heroicons/react/20/solid/chevronupdownicon.d.ts","../../node_modules/@heroicons/react/20/solid/chevronupicon.d.ts","../../node_modules/@heroicons/react/20/solid/circlestackicon.d.ts","../../node_modules/@heroicons/react/20/solid/clipboarddocumentcheckicon.d.ts","../../node_modules/@heroicons/react/20/solid/clipboarddocumentlisticon.d.ts","../../node_modules/@heroicons/react/20/solid/clipboarddocumenticon.d.ts","../../node_modules/@heroicons/react/20/solid/clipboardicon.d.ts","../../node_modules/@heroicons/react/20/solid/clockicon.d.ts","../../node_modules/@heroicons/react/20/solid/cloudarrowdownicon.d.ts","../../node_modules/@heroicons/react/20/solid/cloudarrowupicon.d.ts","../../node_modules/@heroicons/react/20/solid/cloudicon.d.ts","../../node_modules/@heroicons/react/20/solid/codebracketsquareicon.d.ts","../../node_modules/@heroicons/react/20/solid/codebracketicon.d.ts","../../node_modules/@heroicons/react/20/solid/cog6toothicon.d.ts","../../node_modules/@heroicons/react/20/solid/cog8toothicon.d.ts","../../node_modules/@heroicons/react/20/solid/cogicon.d.ts","../../node_modules/@heroicons/react/20/solid/commandlineicon.d.ts","../../node_modules/@heroicons/react/20/solid/computerdesktopicon.d.ts","../../node_modules/@heroicons/react/20/solid/cpuchipicon.d.ts","../../node_modules/@heroicons/react/20/solid/creditcardicon.d.ts","../../node_modules/@heroicons/react/20/solid/cubetransparenticon.d.ts","../../node_modules/@heroicons/react/20/solid/cubeicon.d.ts","../../node_modules/@heroicons/react/20/solid/currencybangladeshiicon.d.ts","../../node_modules/@heroicons/react/20/solid/currencydollaricon.d.ts","../../node_modules/@heroicons/react/20/solid/currencyeuroicon.d.ts","../../node_modules/@heroicons/react/20/solid/currencypoundicon.d.ts","../../node_modules/@heroicons/react/20/solid/currencyrupeeicon.d.ts","../../node_modules/@heroicons/react/20/solid/currencyyenicon.d.ts","../../node_modules/@heroicons/react/20/solid/cursorarrowraysicon.d.ts","../../node_modules/@heroicons/react/20/solid/cursorarrowrippleicon.d.ts","../../node_modules/@heroicons/react/20/solid/devicephonemobileicon.d.ts","../../node_modules/@heroicons/react/20/solid/devicetableticon.d.ts","../../node_modules/@heroicons/react/20/solid/documentarrowdownicon.d.ts","../../node_modules/@heroicons/react/20/solid/documentarrowupicon.d.ts","../../node_modules/@heroicons/react/20/solid/documentchartbaricon.d.ts","../../node_modules/@heroicons/react/20/solid/documentcheckicon.d.ts","../../node_modules/@heroicons/react/20/solid/documentduplicateicon.d.ts","../../node_modules/@heroicons/react/20/solid/documentmagnifyingglassicon.d.ts","../../node_modules/@heroicons/react/20/solid/documentminusicon.d.ts","../../node_modules/@heroicons/react/20/solid/documentplusicon.d.ts","../../node_modules/@heroicons/react/20/solid/documenttexticon.d.ts","../../node_modules/@heroicons/react/20/solid/documenticon.d.ts","../../node_modules/@heroicons/react/20/solid/ellipsishorizontalcircleicon.d.ts","../../node_modules/@heroicons/react/20/solid/ellipsishorizontalicon.d.ts","../../node_modules/@heroicons/react/20/solid/ellipsisverticalicon.d.ts","../../node_modules/@heroicons/react/20/solid/envelopeopenicon.d.ts","../../node_modules/@heroicons/react/20/solid/envelopeicon.d.ts","../../node_modules/@heroicons/react/20/solid/exclamationcircleicon.d.ts","../../node_modules/@heroicons/react/20/solid/exclamationtriangleicon.d.ts","../../node_modules/@heroicons/react/20/solid/eyedroppericon.d.ts","../../node_modules/@heroicons/react/20/solid/eyeslashicon.d.ts","../../node_modules/@heroicons/react/20/solid/eyeicon.d.ts","../../node_modules/@heroicons/react/20/solid/facefrownicon.d.ts","../../node_modules/@heroicons/react/20/solid/facesmileicon.d.ts","../../node_modules/@heroicons/react/20/solid/filmicon.d.ts","../../node_modules/@heroicons/react/20/solid/fingerprinticon.d.ts","../../node_modules/@heroicons/react/20/solid/fireicon.d.ts","../../node_modules/@heroicons/react/20/solid/flagicon.d.ts","../../node_modules/@heroicons/react/20/solid/folderarrowdownicon.d.ts","../../node_modules/@heroicons/react/20/solid/folderminusicon.d.ts","../../node_modules/@heroicons/react/20/solid/folderopenicon.d.ts","../../node_modules/@heroicons/react/20/solid/folderplusicon.d.ts","../../node_modules/@heroicons/react/20/solid/foldericon.d.ts","../../node_modules/@heroicons/react/20/solid/forwardicon.d.ts","../../node_modules/@heroicons/react/20/solid/funnelicon.d.ts","../../node_modules/@heroicons/react/20/solid/gificon.d.ts","../../node_modules/@heroicons/react/20/solid/gifttopicon.d.ts","../../node_modules/@heroicons/react/20/solid/gifticon.d.ts","../../node_modules/@heroicons/react/20/solid/globealticon.d.ts","../../node_modules/@heroicons/react/20/solid/globeamericasicon.d.ts","../../node_modules/@heroicons/react/20/solid/globeasiaaustraliaicon.d.ts","../../node_modules/@heroicons/react/20/solid/globeeuropeafricaicon.d.ts","../../node_modules/@heroicons/react/20/solid/handraisedicon.d.ts","../../node_modules/@heroicons/react/20/solid/handthumbdownicon.d.ts","../../node_modules/@heroicons/react/20/solid/handthumbupicon.d.ts","../../node_modules/@heroicons/react/20/solid/hashtagicon.d.ts","../../node_modules/@heroicons/react/20/solid/hearticon.d.ts","../../node_modules/@heroicons/react/20/solid/homemodernicon.d.ts","../../node_modules/@heroicons/react/20/solid/homeicon.d.ts","../../node_modules/@heroicons/react/20/solid/identificationicon.d.ts","../../node_modules/@heroicons/react/20/solid/inboxarrowdownicon.d.ts","../../node_modules/@heroicons/react/20/solid/inboxstackicon.d.ts","../../node_modules/@heroicons/react/20/solid/inboxicon.d.ts","../../node_modules/@heroicons/react/20/solid/informationcircleicon.d.ts","../../node_modules/@heroicons/react/20/solid/keyicon.d.ts","../../node_modules/@heroicons/react/20/solid/languageicon.d.ts","../../node_modules/@heroicons/react/20/solid/lifebuoyicon.d.ts","../../node_modules/@heroicons/react/20/solid/lightbulbicon.d.ts","../../node_modules/@heroicons/react/20/solid/linkicon.d.ts","../../node_modules/@heroicons/react/20/solid/listbulleticon.d.ts","../../node_modules/@heroicons/react/20/solid/lockclosedicon.d.ts","../../node_modules/@heroicons/react/20/solid/lockopenicon.d.ts","../../node_modules/@heroicons/react/20/solid/magnifyingglasscircleicon.d.ts","../../node_modules/@heroicons/react/20/solid/magnifyingglassminusicon.d.ts","../../node_modules/@heroicons/react/20/solid/magnifyingglassplusicon.d.ts","../../node_modules/@heroicons/react/20/solid/magnifyingglassicon.d.ts","../../node_modules/@heroicons/react/20/solid/mappinicon.d.ts","../../node_modules/@heroicons/react/20/solid/mapicon.d.ts","../../node_modules/@heroicons/react/20/solid/megaphoneicon.d.ts","../../node_modules/@heroicons/react/20/solid/microphoneicon.d.ts","../../node_modules/@heroicons/react/20/solid/minuscircleicon.d.ts","../../node_modules/@heroicons/react/20/solid/minussmallicon.d.ts","../../node_modules/@heroicons/react/20/solid/minusicon.d.ts","../../node_modules/@heroicons/react/20/solid/moonicon.d.ts","../../node_modules/@heroicons/react/20/solid/musicalnoteicon.d.ts","../../node_modules/@heroicons/react/20/solid/newspapericon.d.ts","../../node_modules/@heroicons/react/20/solid/nosymbolicon.d.ts","../../node_modules/@heroicons/react/20/solid/paintbrushicon.d.ts","../../node_modules/@heroicons/react/20/solid/paperairplaneicon.d.ts","../../node_modules/@heroicons/react/20/solid/paperclipicon.d.ts","../../node_modules/@heroicons/react/20/solid/pausecircleicon.d.ts","../../node_modules/@heroicons/react/20/solid/pauseicon.d.ts","../../node_modules/@heroicons/react/20/solid/pencilsquareicon.d.ts","../../node_modules/@heroicons/react/20/solid/pencilicon.d.ts","../../node_modules/@heroicons/react/20/solid/phonearrowdownlefticon.d.ts","../../node_modules/@heroicons/react/20/solid/phonearrowuprighticon.d.ts","../../node_modules/@heroicons/react/20/solid/phonexmarkicon.d.ts","../../node_modules/@heroicons/react/20/solid/phoneicon.d.ts","../../node_modules/@heroicons/react/20/solid/photoicon.d.ts","../../node_modules/@heroicons/react/20/solid/playcircleicon.d.ts","../../node_modules/@heroicons/react/20/solid/playpauseicon.d.ts","../../node_modules/@heroicons/react/20/solid/playicon.d.ts","../../node_modules/@heroicons/react/20/solid/pluscircleicon.d.ts","../../node_modules/@heroicons/react/20/solid/plussmallicon.d.ts","../../node_modules/@heroicons/react/20/solid/plusicon.d.ts","../../node_modules/@heroicons/react/20/solid/powericon.d.ts","../../node_modules/@heroicons/react/20/solid/presentationchartbaricon.d.ts","../../node_modules/@heroicons/react/20/solid/presentationchartlineicon.d.ts","../../node_modules/@heroicons/react/20/solid/printericon.d.ts","../../node_modules/@heroicons/react/20/solid/puzzlepieceicon.d.ts","../../node_modules/@heroicons/react/20/solid/qrcodeicon.d.ts","../../node_modules/@heroicons/react/20/solid/questionmarkcircleicon.d.ts","../../node_modules/@heroicons/react/20/solid/queuelisticon.d.ts","../../node_modules/@heroicons/react/20/solid/radioicon.d.ts","../../node_modules/@heroicons/react/20/solid/receiptpercenticon.d.ts","../../node_modules/@heroicons/react/20/solid/receiptrefundicon.d.ts","../../node_modules/@heroicons/react/20/solid/rectanglegroupicon.d.ts","../../node_modules/@heroicons/react/20/solid/rectanglestackicon.d.ts","../../node_modules/@heroicons/react/20/solid/rocketlaunchicon.d.ts","../../node_modules/@heroicons/react/20/solid/rssicon.d.ts","../../node_modules/@heroicons/react/20/solid/scaleicon.d.ts","../../node_modules/@heroicons/react/20/solid/scissorsicon.d.ts","../../node_modules/@heroicons/react/20/solid/serverstackicon.d.ts","../../node_modules/@heroicons/react/20/solid/servericon.d.ts","../../node_modules/@heroicons/react/20/solid/shareicon.d.ts","../../node_modules/@heroicons/react/20/solid/shieldcheckicon.d.ts","../../node_modules/@heroicons/react/20/solid/shieldexclamationicon.d.ts","../../node_modules/@heroicons/react/20/solid/shoppingbagicon.d.ts","../../node_modules/@heroicons/react/20/solid/shoppingcarticon.d.ts","../../node_modules/@heroicons/react/20/solid/signalslashicon.d.ts","../../node_modules/@heroicons/react/20/solid/signalicon.d.ts","../../node_modules/@heroicons/react/20/solid/sparklesicon.d.ts","../../node_modules/@heroicons/react/20/solid/speakerwaveicon.d.ts","../../node_modules/@heroicons/react/20/solid/speakerxmarkicon.d.ts","../../node_modules/@heroicons/react/20/solid/square2stackicon.d.ts","../../node_modules/@heroicons/react/20/solid/square3stack3dicon.d.ts","../../node_modules/@heroicons/react/20/solid/squares2x2icon.d.ts","../../node_modules/@heroicons/react/20/solid/squaresplusicon.d.ts","../../node_modules/@heroicons/react/20/solid/staricon.d.ts","../../node_modules/@heroicons/react/20/solid/stopcircleicon.d.ts","../../node_modules/@heroicons/react/20/solid/stopicon.d.ts","../../node_modules/@heroicons/react/20/solid/sunicon.d.ts","../../node_modules/@heroicons/react/20/solid/swatchicon.d.ts","../../node_modules/@heroicons/react/20/solid/tablecellsicon.d.ts","../../node_modules/@heroicons/react/20/solid/tagicon.d.ts","../../node_modules/@heroicons/react/20/solid/ticketicon.d.ts","../../node_modules/@heroicons/react/20/solid/trashicon.d.ts","../../node_modules/@heroicons/react/20/solid/trophyicon.d.ts","../../node_modules/@heroicons/react/20/solid/truckicon.d.ts","../../node_modules/@heroicons/react/20/solid/tvicon.d.ts","../../node_modules/@heroicons/react/20/solid/usercircleicon.d.ts","../../node_modules/@heroicons/react/20/solid/usergroupicon.d.ts","../../node_modules/@heroicons/react/20/solid/userminusicon.d.ts","../../node_modules/@heroicons/react/20/solid/userplusicon.d.ts","../../node_modules/@heroicons/react/20/solid/usericon.d.ts","../../node_modules/@heroicons/react/20/solid/usersicon.d.ts","../../node_modules/@heroicons/react/20/solid/variableicon.d.ts","../../node_modules/@heroicons/react/20/solid/videocameraslashicon.d.ts","../../node_modules/@heroicons/react/20/solid/videocameraicon.d.ts","../../node_modules/@heroicons/react/20/solid/viewcolumnsicon.d.ts","../../node_modules/@heroicons/react/20/solid/viewfindercircleicon.d.ts","../../node_modules/@heroicons/react/20/solid/walleticon.d.ts","../../node_modules/@heroicons/react/20/solid/wifiicon.d.ts","../../node_modules/@heroicons/react/20/solid/windowicon.d.ts","../../node_modules/@heroicons/react/20/solid/wrenchscrewdrivericon.d.ts","../../node_modules/@heroicons/react/20/solid/wrenchicon.d.ts","../../node_modules/@heroicons/react/20/solid/xcircleicon.d.ts","../../node_modules/@heroicons/react/20/solid/xmarkicon.d.ts","../../node_modules/@heroicons/react/20/solid/index.d.ts","../../node_modules/goober/goober.d.ts","../../node_modules/react-hot-toast/dist/index.d.ts","../../node_modules/assert-never/index.d.ts","./src/utils/etherscan/makeetherscantransactionurl.ts","./src/ui/base/toast/maketransactionerrortoast.tsx","./src/ui/base/toast/maketransactionsubmittedtoast.tsx","./src/ui/base/toast/maketransactionsuccesstoast.tsx","./src/ui/contract/hooks/usewrite.ts","./src/ui/token/hooks/usetokendecimals.ts","./src/ui/airdrop/hooks/useclaimableairdropamount.ts","./src/ui/airdrop/hooks/useclaimairdrop.ts","./src/ui/airdrop/hooks/useclaimanddelegateairdrop.ts","./src/ui/base/imgsrc.ts","./src/ui/base/formatting/commify.ts","./src/ui/base/formatting/formataddress.ts","../../node_modules/@types/d3-format/index.d.ts","./src/ui/base/formatting/formatbalance.ts","./src/ui/base/formatting/formatunitsbalance.ts","./src/ui/base/formatting/formatvotingpower.ts","./src/ui/base/formatting/usedisplayname.ts","./src/ui/base/sorting/types.ts","./src/ui/base/utils/asyncfilter.ts","./src/ui/base/utils/getblockdate.ts","./src/ui/config/hooks/usevaultconfig.ts","./src/ui/council/hooks/usereadcorevoting.ts","./src/ui/council/hooks/usereadgscvoting.ts","./src/ui/council/hooks/usereadwritecorevoting.ts","./src/ui/council/hooks/usereadwritegscvoting.ts","../../node_modules/@ensdomains/ensjs/dist/types/types.d.ts","../../node_modules/@ensdomains/ensjs/dist/types/contracts/consts.d.ts","../../node_modules/@ensdomains/ensjs/dist/types/utils/generatefunction.d.ts","../../node_modules/@ensdomains/ensjs/dist/types/functions/public/batch.d.ts","../../node_modules/@ensdomains/ensjs/dist/types/functions/public/_getabi.d.ts","../../node_modules/@ensdomains/ensjs/dist/types/functions/public/getabirecord.d.ts","../../node_modules/@ensdomains/ensjs/dist/types/functions/public/_getaddr.d.ts","../../node_modules/@ensdomains/ensjs/dist/types/functions/public/getaddressrecord.d.ts","../../node_modules/@ensdomains/ensjs/dist/types/functions/public/getavailable.d.ts","../../node_modules/@ensdomains/content-hash/dist/types/map.d.ts","../../node_modules/@ensdomains/content-hash/dist/types/helpers.d.ts","../../node_modules/@ensdomains/content-hash/dist/types/index.d.ts","../../node_modules/@ensdomains/ensjs/dist/types/utils/contenthash.d.ts","../../node_modules/@ensdomains/ensjs/dist/types/functions/public/_getcontenthash.d.ts","../../node_modules/@ensdomains/ensjs/dist/types/functions/public/getcontenthashrecord.d.ts","../../node_modules/@ensdomains/ensjs/dist/types/functions/public/getexpiry.d.ts","../../node_modules/@ensdomains/ensjs/dist/types/functions/public/getname.d.ts","../../node_modules/@ensdomains/ensjs/dist/types/utils/ownerfromcontract.d.ts","../../node_modules/@ensdomains/ensjs/dist/types/functions/public/getowner.d.ts","../../node_modules/@ensdomains/ensjs/dist/types/functions/public/getprice.d.ts","../../node_modules/@ensdomains/ensjs/dist/types/functions/public/getrecords.d.ts","../../node_modules/@ensdomains/ensjs/dist/types/functions/public/getresolver.d.ts","../../node_modules/@ensdomains/ensjs/dist/types/functions/public/_gettext.d.ts","../../node_modules/@ensdomains/ensjs/dist/types/functions/public/gettextrecord.d.ts","../../node_modules/@ensdomains/ensjs/dist/types/utils/fuses.d.ts","../../node_modules/@ensdomains/ensjs/dist/types/functions/public/getwrapperdata.d.ts","../../node_modules/@ensdomains/ensjs/dist/types/functions/public/getwrappername.d.ts","../../node_modules/@ensdomains/ensjs/dist/types/clients/decorators/public.d.ts","../../node_modules/@ensdomains/ensjs/dist/types/functions/subgraph/getdecodedname.d.ts","../../node_modules/@ensdomains/ensjs/dist/types/functions/subgraph/events.d.ts","../../node_modules/@ensdomains/ensjs/dist/types/functions/subgraph/getnamehistory.d.ts","../../node_modules/@ensdomains/ensjs/dist/types/functions/subgraph/fragments.d.ts","../../node_modules/@ensdomains/ensjs/dist/types/functions/subgraph/utils.d.ts","../../node_modules/@ensdomains/ensjs/dist/types/functions/subgraph/getnamesforaddress.d.ts","../../node_modules/@ensdomains/ensjs/dist/types/functions/subgraph/getsubgraphrecords.d.ts","../../node_modules/@ensdomains/ensjs/dist/types/functions/subgraph/getsubgraphregistrant.d.ts","../../node_modules/@ensdomains/ensjs/dist/types/functions/subgraph/getsubnames.d.ts","../../node_modules/@ensdomains/ensjs/dist/types/clients/decorators/subgraph.d.ts","../../node_modules/@ensdomains/ensjs/dist/types/functions/wallet/clearrecords.d.ts","../../node_modules/@ensdomains/ensjs/dist/types/utils/encoders/encodeabi.d.ts","../../node_modules/@ensdomains/ensjs/dist/types/utils/encoders/encodesetaddr.d.ts","../../node_modules/@ensdomains/ensjs/dist/types/utils/encoders/encodesettext.d.ts","../../node_modules/@ensdomains/ensjs/dist/types/utils/generaterecordcallarray.d.ts","../../node_modules/@ensdomains/ensjs/dist/types/utils/registerhelpers.d.ts","../../node_modules/@ensdomains/ensjs/dist/types/functions/wallet/commitname.d.ts","../../node_modules/@ensdomains/ensjs/dist/types/functions/wallet/createsubname.d.ts","../../node_modules/@ensdomains/ensjs/dist/types/functions/wallet/deletesubname.d.ts","../../node_modules/@ensdomains/ensjs/dist/types/functions/wallet/registername.d.ts","../../node_modules/@ensdomains/ensjs/dist/types/functions/wallet/renewnames.d.ts","../../node_modules/@ensdomains/ensjs/dist/types/functions/wallet/setabirecord.d.ts","../../node_modules/@ensdomains/ensjs/dist/types/functions/wallet/setaddressrecord.d.ts","../../node_modules/@ensdomains/ensjs/dist/types/functions/wallet/setchildfuses.d.ts","../../node_modules/@ensdomains/ensjs/dist/types/functions/wallet/setcontenthashrecord.d.ts","../../node_modules/@ensdomains/ensjs/dist/types/functions/wallet/setfuses.d.ts","../../node_modules/@ensdomains/ensjs/dist/types/functions/wallet/setprimaryname.d.ts","../../node_modules/@ensdomains/ensjs/dist/types/functions/wallet/setrecords.d.ts","../../node_modules/@ensdomains/ensjs/dist/types/functions/wallet/setresolver.d.ts","../../node_modules/@ensdomains/ensjs/dist/types/functions/wallet/settextrecord.d.ts","../../node_modules/@ensdomains/ensjs/dist/types/functions/wallet/transfername.d.ts","../../node_modules/@ensdomains/ensjs/dist/types/functions/wallet/unwrapname.d.ts","../../node_modules/@ensdomains/ensjs/dist/types/functions/wallet/wrapname.d.ts","../../node_modules/@ensdomains/ensjs/dist/types/clients/decorators/wallet.d.ts","../../node_modules/@ensdomains/ensjs/dist/types/functions/public/getsupportedinterfaces.d.ts","../../node_modules/@ensdomains/ensjs/dist/types/functions/public/multicallwrapper.d.ts","../../node_modules/@ensdomains/ensjs/dist/types/functions/public/universalwrapper.d.ts","../../node_modules/@ensdomains/ensjs/dist/types/public.d.ts","../../node_modules/graphql-request/build/esm/helpers.d.ts","../../node_modules/graphql/version.d.ts","../../node_modules/graphql/jsutils/maybe.d.ts","../../node_modules/graphql/language/source.d.ts","../../node_modules/graphql/jsutils/objmap.d.ts","../../node_modules/graphql/jsutils/path.d.ts","../../node_modules/graphql/jsutils/promiseorvalue.d.ts","../../node_modules/graphql/language/kinds.d.ts","../../node_modules/graphql/language/tokenkind.d.ts","../../node_modules/graphql/language/ast.d.ts","../../node_modules/graphql/language/location.d.ts","../../node_modules/graphql/error/graphqlerror.d.ts","../../node_modules/graphql/language/directivelocation.d.ts","../../node_modules/graphql/type/directives.d.ts","../../node_modules/graphql/type/schema.d.ts","../../node_modules/graphql/type/definition.d.ts","../../node_modules/graphql/execution/execute.d.ts","../../node_modules/graphql/graphql.d.ts","../../node_modules/graphql/type/scalars.d.ts","../../node_modules/graphql/type/introspection.d.ts","../../node_modules/graphql/type/validate.d.ts","../../node_modules/graphql/type/assertname.d.ts","../../node_modules/graphql/type/index.d.ts","../../node_modules/graphql/language/printlocation.d.ts","../../node_modules/graphql/language/lexer.d.ts","../../node_modules/graphql/language/parser.d.ts","../../node_modules/graphql/language/printer.d.ts","../../node_modules/graphql/language/visitor.d.ts","../../node_modules/graphql/language/predicates.d.ts","../../node_modules/graphql/language/index.d.ts","../../node_modules/graphql/execution/subscribe.d.ts","../../node_modules/graphql/execution/values.d.ts","../../node_modules/graphql/execution/index.d.ts","../../node_modules/graphql/subscription/index.d.ts","../../node_modules/graphql/utilities/typeinfo.d.ts","../../node_modules/graphql/validation/validationcontext.d.ts","../../node_modules/graphql/validation/validate.d.ts","../../node_modules/graphql/validation/specifiedrules.d.ts","../../node_modules/graphql/validation/rules/executabledefinitionsrule.d.ts","../../node_modules/graphql/validation/rules/fieldsoncorrecttyperule.d.ts","../../node_modules/graphql/validation/rules/fragmentsoncompositetypesrule.d.ts","../../node_modules/graphql/validation/rules/knownargumentnamesrule.d.ts","../../node_modules/graphql/validation/rules/knowndirectivesrule.d.ts","../../node_modules/graphql/validation/rules/knownfragmentnamesrule.d.ts","../../node_modules/graphql/validation/rules/knowntypenamesrule.d.ts","../../node_modules/graphql/validation/rules/loneanonymousoperationrule.d.ts","../../node_modules/graphql/validation/rules/nofragmentcyclesrule.d.ts","../../node_modules/graphql/validation/rules/noundefinedvariablesrule.d.ts","../../node_modules/graphql/validation/rules/nounusedfragmentsrule.d.ts","../../node_modules/graphql/validation/rules/nounusedvariablesrule.d.ts","../../node_modules/graphql/validation/rules/overlappingfieldscanbemergedrule.d.ts","../../node_modules/graphql/validation/rules/possiblefragmentspreadsrule.d.ts","../../node_modules/graphql/validation/rules/providedrequiredargumentsrule.d.ts","../../node_modules/graphql/validation/rules/scalarleafsrule.d.ts","../../node_modules/graphql/validation/rules/singlefieldsubscriptionsrule.d.ts","../../node_modules/graphql/validation/rules/uniqueargumentnamesrule.d.ts","../../node_modules/graphql/validation/rules/uniquedirectivesperlocationrule.d.ts","../../node_modules/graphql/validation/rules/uniquefragmentnamesrule.d.ts","../../node_modules/graphql/validation/rules/uniqueinputfieldnamesrule.d.ts","../../node_modules/graphql/validation/rules/uniqueoperationnamesrule.d.ts","../../node_modules/graphql/validation/rules/uniquevariablenamesrule.d.ts","../../node_modules/graphql/validation/rules/valuesofcorrecttyperule.d.ts","../../node_modules/graphql/validation/rules/variablesareinputtypesrule.d.ts","../../node_modules/graphql/validation/rules/variablesinallowedpositionrule.d.ts","../../node_modules/graphql/validation/rules/loneschemadefinitionrule.d.ts","../../node_modules/graphql/validation/rules/uniqueoperationtypesrule.d.ts","../../node_modules/graphql/validation/rules/uniquetypenamesrule.d.ts","../../node_modules/graphql/validation/rules/uniqueenumvaluenamesrule.d.ts","../../node_modules/graphql/validation/rules/uniquefielddefinitionnamesrule.d.ts","../../node_modules/graphql/validation/rules/uniqueargumentdefinitionnamesrule.d.ts","../../node_modules/graphql/validation/rules/uniquedirectivenamesrule.d.ts","../../node_modules/graphql/validation/rules/possibletypeextensionsrule.d.ts","../../node_modules/graphql/validation/rules/custom/nodeprecatedcustomrule.d.ts","../../node_modules/graphql/validation/rules/custom/noschemaintrospectioncustomrule.d.ts","../../node_modules/graphql/validation/index.d.ts","../../node_modules/graphql/error/syntaxerror.d.ts","../../node_modules/graphql/error/locatederror.d.ts","../../node_modules/graphql/error/index.d.ts","../../node_modules/graphql/utilities/getintrospectionquery.d.ts","../../node_modules/graphql/utilities/getoperationast.d.ts","../../node_modules/graphql/utilities/getoperationroottype.d.ts","../../node_modules/graphql/utilities/introspectionfromschema.d.ts","../../node_modules/graphql/utilities/buildclientschema.d.ts","../../node_modules/graphql/utilities/buildastschema.d.ts","../../node_modules/graphql/utilities/extendschema.d.ts","../../node_modules/graphql/utilities/lexicographicsortschema.d.ts","../../node_modules/graphql/utilities/printschema.d.ts","../../node_modules/graphql/utilities/typefromast.d.ts","../../node_modules/graphql/utilities/valuefromast.d.ts","../../node_modules/graphql/utilities/valuefromastuntyped.d.ts","../../node_modules/graphql/utilities/astfromvalue.d.ts","../../node_modules/graphql/utilities/coerceinputvalue.d.ts","../../node_modules/graphql/utilities/concatast.d.ts","../../node_modules/graphql/utilities/separateoperations.d.ts","../../node_modules/graphql/utilities/stripignoredcharacters.d.ts","../../node_modules/graphql/utilities/typecomparators.d.ts","../../node_modules/graphql/utilities/assertvalidname.d.ts","../../node_modules/graphql/utilities/findbreakingchanges.d.ts","../../node_modules/graphql/utilities/typedquerydocumentnode.d.ts","../../node_modules/graphql/utilities/index.d.ts","../../node_modules/graphql/index.d.ts","../../node_modules/@graphql-typed-document-node/core/typings/index.d.ts","../../node_modules/cross-fetch/index.d.ts","../../node_modules/graphql-request/build/esm/types.d.ts","../../node_modules/graphql-request/build/esm/graphql-ws.d.ts","../../node_modules/graphql-request/build/esm/resolverequestdocument.d.ts","../../node_modules/graphql-request/build/esm/index.d.ts","../../node_modules/@ensdomains/ensjs/dist/types/functions/subgraph/client.d.ts","../../node_modules/@ensdomains/ensjs/dist/types/subgraph.d.ts","../../node_modules/@ensdomains/ensjs/dist/types/clients/public.d.ts","../../node_modules/@ensdomains/ensjs/dist/types/clients/subgraph.d.ts","../../node_modules/@ensdomains/ensjs/dist/types/functions/dns/types.d.ts","../../node_modules/@ensdomains/ensjs/dist/types/utils/dns/misc.d.ts","../../node_modules/@ensdomains/ensjs/dist/types/utils/dns/getdnstxtrecords.d.ts","../../node_modules/@ensdomains/ensjs/dist/types/utils/encoders/encodeclearrecords.d.ts","../../node_modules/@ensdomains/ensjs/dist/types/utils/encoders/encodesetabi.d.ts","../../node_modules/@ensdomains/ensjs/dist/types/utils/encoders/encodesetcontenthash.d.ts","../../node_modules/@ensdomains/ensjs/dist/types/utils/consts.d.ts","../../node_modules/@ensdomains/ensjs/dist/types/utils/format.d.ts","../../node_modules/@ensdomains/ensjs/dist/types/utils/hexencodedname.d.ts","../../node_modules/@ensdomains/ensjs/dist/types/utils/labels.d.ts","../../node_modules/@ensdomains/ensjs/dist/types/utils/makesafesecondsdate.d.ts","../../node_modules/@ensdomains/ensjs/node_modules/@adraffy/ens-normalize/dist/index.d.ts","../../node_modules/@ensdomains/ensjs/dist/types/utils/normalise.d.ts","../../node_modules/@ensdomains/ensjs/dist/types/utils/validation.d.ts","../../node_modules/@ensdomains/ensjs/dist/types/utils/wrapper.d.ts","../../node_modules/@ensdomains/ensjs/dist/types/utils/generatesupportedcontenttypes.d.ts","../../node_modules/@ensdomains/ensjs/dist/types/utils/index.d.ts","../../node_modules/@ensdomains/ensjs/dist/types/wallet.d.ts","../../node_modules/@ensdomains/ensjs/dist/types/clients/wallet.d.ts","../../node_modules/@ensdomains/ensjs/dist/types/contracts/addenscontracts.d.ts","../../node_modules/@ensdomains/ensjs/dist/types/errors/base.d.ts","../../node_modules/@ensdomains/ensjs/dist/types/errors/contracts.d.ts","../../node_modules/@ensdomains/ensjs/dist/types/errors/dns.d.ts","../../node_modules/@ensdomains/ensjs/dist/types/errors/general.d.ts","../../node_modules/@ensdomains/ensjs/dist/types/errors/public.d.ts","../../node_modules/@ensdomains/ensjs/dist/types/errors/subgraph.d.ts","../../node_modules/@ensdomains/ensjs/dist/types/errors/utils.d.ts","../../node_modules/@ensdomains/ensjs/dist/types/index.d.ts","../../node_modules/@types/lodash/common/common.d.ts","../../node_modules/@types/lodash/common/array.d.ts","../../node_modules/@types/lodash/common/collection.d.ts","../../node_modules/@types/lodash/common/date.d.ts","../../node_modules/@types/lodash/common/function.d.ts","../../node_modules/@types/lodash/common/lang.d.ts","../../node_modules/@types/lodash/common/math.d.ts","../../node_modules/@types/lodash/common/number.d.ts","../../node_modules/@types/lodash/common/object.d.ts","../../node_modules/@types/lodash/common/seq.d.ts","../../node_modules/@types/lodash/common/string.d.ts","../../node_modules/@types/lodash/common/util.d.ts","../../node_modules/@types/lodash/index.d.ts","../../node_modules/@types/lodash.chunk/index.d.ts","./src/utils/getbulkensrecords.ts","./src/ui/ens/hooks/usebulkensrecords.ts","./src/utils/getproposalstatus.ts","./src/ui/proposals/tooltips.ts","./src/ui/proposals/types.ts","./src/ui/vaults/gscvault/hooks/usereadgscvault.ts","./src/ui/proposals/hooks/usefiltervotesbygsconlyeffect.ts","./src/ui/proposals/hooks/usereadproposal.ts","./src/ui/proposals/hooks/usereadwriteproposal.ts","./src/ui/proposals/hooks/usevoteresults.ts","../../node_modules/ethers/lib.commonjs/_version.d.ts","../../node_modules/ethers/lib.commonjs/utils/base58.d.ts","../../node_modules/ethers/lib.commonjs/utils/data.d.ts","../../node_modules/ethers/lib.commonjs/utils/base64.d.ts","../../node_modules/ethers/lib.commonjs/address/address.d.ts","../../node_modules/ethers/lib.commonjs/address/contract-address.d.ts","../../node_modules/ethers/lib.commonjs/address/checks.d.ts","../../node_modules/ethers/lib.commonjs/address/index.d.ts","../../node_modules/ethers/lib.commonjs/crypto/hmac.d.ts","../../node_modules/ethers/lib.commonjs/crypto/keccak.d.ts","../../node_modules/ethers/lib.commonjs/crypto/ripemd160.d.ts","../../node_modules/ethers/lib.commonjs/crypto/pbkdf2.d.ts","../../node_modules/ethers/lib.commonjs/crypto/random.d.ts","../../node_modules/ethers/lib.commonjs/crypto/scrypt.d.ts","../../node_modules/ethers/lib.commonjs/crypto/sha2.d.ts","../../node_modules/ethers/lib.commonjs/crypto/signature.d.ts","../../node_modules/ethers/lib.commonjs/crypto/signing-key.d.ts","../../node_modules/ethers/lib.commonjs/crypto/index.d.ts","../../node_modules/ethers/lib.commonjs/transaction/accesslist.d.ts","../../node_modules/ethers/lib.commonjs/transaction/address.d.ts","../../node_modules/ethers/lib.commonjs/transaction/transaction.d.ts","../../node_modules/ethers/lib.commonjs/transaction/index.d.ts","../../node_modules/ethers/lib.commonjs/providers/contracts.d.ts","../../node_modules/ethers/lib.commonjs/utils/fetch.d.ts","../../node_modules/ethers/lib.commonjs/providers/plugins-network.d.ts","../../node_modules/ethers/lib.commonjs/providers/network.d.ts","../../node_modules/ethers/lib.commonjs/providers/formatting.d.ts","../../node_modules/ethers/lib.commonjs/providers/provider.d.ts","../../node_modules/ethers/lib.commonjs/providers/ens-resolver.d.ts","../../node_modules/ethers/lib.commonjs/providers/abstract-provider.d.ts","../../node_modules/ethers/lib.commonjs/hash/id.d.ts","../../node_modules/ethers/lib.commonjs/hash/namehash.d.ts","../../node_modules/ethers/lib.commonjs/hash/message.d.ts","../../node_modules/ethers/lib.commonjs/hash/solidity.d.ts","../../node_modules/ethers/lib.commonjs/hash/typed-data.d.ts","../../node_modules/ethers/lib.commonjs/hash/index.d.ts","../../node_modules/ethers/lib.commonjs/providers/signer.d.ts","../../node_modules/ethers/lib.commonjs/providers/abstract-signer.d.ts","../../node_modules/ethers/lib.commonjs/providers/community.d.ts","../../node_modules/ethers/lib.commonjs/providers/provider-jsonrpc.d.ts","../../node_modules/ethers/lib.commonjs/providers/provider-socket.d.ts","../../node_modules/ethers/lib.commonjs/providers/provider-websocket.d.ts","../../node_modules/ethers/lib.commonjs/providers/default-provider.d.ts","../../node_modules/ethers/lib.commonjs/providers/signer-noncemanager.d.ts","../../node_modules/ethers/lib.commonjs/providers/provider-fallback.d.ts","../../node_modules/ethers/lib.commonjs/providers/provider-browser.d.ts","../../node_modules/ethers/lib.commonjs/providers/provider-alchemy.d.ts","../../node_modules/ethers/lib.commonjs/providers/provider-ankr.d.ts","../../node_modules/ethers/lib.commonjs/providers/provider-cloudflare.d.ts","../../node_modules/ethers/lib.commonjs/contract/types.d.ts","../../node_modules/ethers/lib.commonjs/contract/wrappers.d.ts","../../node_modules/ethers/lib.commonjs/contract/contract.d.ts","../../node_modules/ethers/lib.commonjs/contract/factory.d.ts","../../node_modules/ethers/lib.commonjs/contract/index.d.ts","../../node_modules/ethers/lib.commonjs/providers/provider-etherscan.d.ts","../../node_modules/ethers/lib.commonjs/providers/provider-infura.d.ts","../../node_modules/ethers/lib.commonjs/providers/provider-pocket.d.ts","../../node_modules/ethers/lib.commonjs/providers/provider-quicknode.d.ts","../../node_modules/ethers/lib.commonjs/providers/provider-ipcsocket.d.ts","../../node_modules/ethers/lib.commonjs/providers/index.d.ts","../../node_modules/ethers/lib.commonjs/utils/errors.d.ts","../../node_modules/ethers/lib.commonjs/utils/events.d.ts","../../node_modules/ethers/lib.commonjs/utils/fixednumber.d.ts","../../node_modules/ethers/lib.commonjs/utils/maths.d.ts","../../node_modules/ethers/lib.commonjs/utils/properties.d.ts","../../node_modules/ethers/lib.commonjs/utils/rlp-decode.d.ts","../../node_modules/ethers/lib.commonjs/utils/rlp.d.ts","../../node_modules/ethers/lib.commonjs/utils/rlp-encode.d.ts","../../node_modules/ethers/lib.commonjs/utils/units.d.ts","../../node_modules/ethers/lib.commonjs/utils/utf8.d.ts","../../node_modules/ethers/lib.commonjs/utils/uuid.d.ts","../../node_modules/ethers/lib.commonjs/utils/index.d.ts","../../node_modules/ethers/lib.commonjs/abi/coders/abstract-coder.d.ts","../../node_modules/ethers/lib.commonjs/abi/fragments.d.ts","../../node_modules/ethers/lib.commonjs/abi/abi-coder.d.ts","../../node_modules/ethers/lib.commonjs/abi/bytes32.d.ts","../../node_modules/ethers/lib.commonjs/abi/typed.d.ts","../../node_modules/ethers/lib.commonjs/abi/interface.d.ts","../../node_modules/ethers/lib.commonjs/abi/index.d.ts","../../node_modules/ethers/lib.commonjs/constants/addresses.d.ts","../../node_modules/ethers/lib.commonjs/constants/hashes.d.ts","../../node_modules/ethers/lib.commonjs/constants/numbers.d.ts","../../node_modules/ethers/lib.commonjs/constants/strings.d.ts","../../node_modules/ethers/lib.commonjs/constants/index.d.ts","../../node_modules/ethers/lib.commonjs/wallet/base-wallet.d.ts","../../node_modules/ethers/lib.commonjs/wordlists/wordlist.d.ts","../../node_modules/ethers/lib.commonjs/wordlists/wordlist-owl.d.ts","../../node_modules/ethers/lib.commonjs/wordlists/lang-en.d.ts","../../node_modules/ethers/lib.commonjs/wordlists/wordlist-owla.d.ts","../../node_modules/ethers/lib.commonjs/wordlists/wordlists.d.ts","../../node_modules/ethers/lib.commonjs/wordlists/index.d.ts","../../node_modules/ethers/lib.commonjs/wallet/mnemonic.d.ts","../../node_modules/ethers/lib.commonjs/wallet/hdwallet.d.ts","../../node_modules/ethers/lib.commonjs/wallet/json-crowdsale.d.ts","../../node_modules/ethers/lib.commonjs/wallet/json-keystore.d.ts","../../node_modules/ethers/lib.commonjs/wallet/wallet.d.ts","../../node_modules/ethers/lib.commonjs/wallet/index.d.ts","../../node_modules/ethers/lib.commonjs/ethers.d.ts","../../node_modules/ethers/lib.commonjs/index.d.ts","./src/ui/push/types.ts","../../node_modules/@pushprotocol/restapi/src/lib/config.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/alias/getaliasinfo.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/alias/index.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/channels/getchannel.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/channels/getdelegates.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/channels/search.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/payloads/constants.d.ts","../../node_modules/@ethereumjs/util/dist/constants.d.ts","../../node_modules/@ethereumjs/util/dist/units.d.ts","../../node_modules/@ethereumjs/util/dist/address.d.ts","../../node_modules/@ethereumjs/util/dist/bytes.d.ts","../../node_modules/@ethereumjs/util/dist/types.d.ts","../../node_modules/@ethereumjs/util/dist/account.d.ts","../../node_modules/@ethereumjs/util/dist/withdrawal.d.ts","../../node_modules/@ethereumjs/util/dist/signature.d.ts","../../node_modules/@ethereumjs/util/dist/encoding.d.ts","../../node_modules/@ethereumjs/util/dist/asynceventemitter.d.ts","../../node_modules/@ethereumjs/util/dist/internal.d.ts","../../node_modules/@ethereumjs/util/dist/lock.d.ts","../../node_modules/@ethereumjs/util/dist/provider.d.ts","../../node_modules/@ethereumjs/util/dist/index.d.ts","../../node_modules/@pushprotocol/restapi/node_modules/@metamask/eth-sig-util/dist/personal-sign.d.ts","../../node_modules/@pushprotocol/restapi/node_modules/@metamask/eth-sig-util/dist/sign-typed-data.d.ts","../../node_modules/@pushprotocol/restapi/node_modules/@metamask/eth-sig-util/dist/encryption.d.ts","../../node_modules/@pushprotocol/restapi/node_modules/@metamask/eth-sig-util/dist/utils.d.ts","../../node_modules/@pushprotocol/restapi/node_modules/@metamask/eth-sig-util/dist/index.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/types/messagetypes.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/pushstream/pushstreamtypes.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/types/videotypes.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/types/index.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/channels/subscribe.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/channels/unsubscribe.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/channels/_getsubscribers.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/channels/getsubscribers.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/channels/subscribev2.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/channels/unsubscribev2.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/channels/index.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/chat/helpers/aes.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/chat/helpers/pgp.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/chat/helpers/user.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/chat/helpers/crypto.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/chat/helpers/service.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/chat/helpers/inbox.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/chat/helpers/payloadhelper.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/chat/updategroupmembers.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/chat/helpers/validator.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/chat/helpers/group.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/chat/helpers/wallet.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/chat/helpers/index.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/user/profile.updateuser.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/user/createuser.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/user/getfeeds.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/user/getsubscriptions.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/user/getuser.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/user/getdelegations.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/user/getusersbatch.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/user/upgradeuser.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/user/decryptauth.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/user/createuserwithprofile.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/user/getfeedsperchannel.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/user/auth.updateuser.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/user/index.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/utils/parseapi.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/utils/index.d.ts","../../node_modules/axios/index.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/payloads/sendnotifications.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/payloads/index.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/chat/chats.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/chat/chat.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/chat/requests.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/chat/send.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/chat/conversationhash.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/chat/approverequest.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/chat/historicalmessages.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/chat/latestmessage.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/helpers/crypto.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/chat/creategroup.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/chat/creategroupv2.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/chat/updategroup.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/chat/getgroup.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/chat/getgroupbyname.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/chat/addmembers.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/chat/addadmins.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/chat/removemembers.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/chat/removeadmins.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/chat/getgroupaccess.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/chat/searchgroups.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/chat/rejectrequest.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/chat/getgroupmemberstatus.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/chat/getgroupmembers.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/chat/getgroupinfo.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/chat/getgroupmembercount.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/chat/getgroupmemberspublickeys.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/chat/modifyrole.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/chat/getchatinfo.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/chat/index.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/space/helpers/getplainaddress.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/space/spaces.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/space/trending.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/space/get.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/space/info.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/space/create.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/space/update_out.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/space/addspeakers.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/space/removespeakers.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/space/addlisteners.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/space/removelisteners.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/space/approve.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/space/requests.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/space/getaccess.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/space/search.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/space/spacefeed.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/video/video.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/video/helpers/sendvideocallnotification.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/video/index.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/space/update.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/space/start.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/space/invitetopromote.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/space/acceptpromotioninvite.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/space/connectinvitee.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/space/rejectpromotioninvite.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/space/requesttobepromoted.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/space/acceptpromotionrequest.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/space/rejectpromotionrequest.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/space/connectpromotor.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/space/join.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/space/leave.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/space/stop.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/space/initialize.d.ts","../../node_modules/video-stream-merger/dist/index.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/space/broadcastraisedhand.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/space/onreceivemetamessage.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/space/onjoinlistener.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/space/space.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/space/index.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/pushstream/pushstream.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/pushapi/pushapitypes.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/constantsv2.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/pushnotification/pushnotificationtypes.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/pushapi/chat.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/pushapi/profile.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/pushapi/encryption.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/pushnotification/pushnotificationbase.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/pushnotification/delegate.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/pushnotification/alias.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/pushnotification/channel.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/pushnotification/notification.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/video/videov2.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/pushapi/video.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/pushapi/pushapi.d.ts","../../node_modules/@pushprotocol/restapi/src/lib/index.d.ts","../../node_modules/@pushprotocol/restapi/src/index.d.ts","./src/ui/push/usepushsubscribe.ts","./src/ui/router/hooks/useparams.ts","./src/ui/router/hooks/useroutersteps.ts","./src/ui/token/hooks/usetokenname.ts","./src/ui/token/hooks/usetokensymbol.ts","./src/ui/vaults/tooltips.ts","./src/ui/vaults/gscvault/hooks/usegscmembers.ts","./src/utils/gscvault/getisgsceligible.ts","./src/utils/gscvault/types.ts","./src/utils/gscvault/getgscstatus.ts","./src/ui/vaults/gscvault/hooks/usegscstatus.ts","./src/ui/vaults/gscvault/hooks/useisgscmember.ts","./src/ui/vaults/gscvault/hooks/usereadwritegscvault.ts","./src/ui/vaults/gscvault/hooks/usejoingsc.ts","./src/ui/vaults/gscvault/hooks/usekickgscmember.ts","./src/ui/vaults/hooks/usedelegatesbyvault.ts","./src/ui/vaults/hooks/usevaultvotingpower.ts","./src/ui/vaults/hooks/usevotingpower.ts","./src/ui/vaults/hooks/usevotingpowerbyvault.ts","./src/ui/vaults/lockingvault/hooks/useapprove.ts","./src/ui/vaults/lockingvault/hooks/usechangedelegate.ts","./src/ui/vaults/lockingvault/hooks/usedelegate.ts","./src/ui/vaults/lockingvault/hooks/usedeposit.ts","./src/ui/vaults/lockingvault/hooks/usewithdraw.ts","./src/ui/vaults/vestingvault/hooks/usechangedelegate.ts","./src/ui/vaults/vestingvault/hooks/useclaimgrant.ts","./src/ui/vaults/vestingvault/hooks/usedelegate.ts","./src/ui/voters/types.ts","./src/ui/voters/hooks/usevoterstats.ts","../../node_modules/fuse.js/dist/fuse.d.ts","./src/ui/voters/hooks/usevoterssearch.ts","./src/ui/voting/hooks/usesubmitvote.ts","./src/ui/voting/hooks/usevote.ts","../../node_modules/date-fns/locale/types.d.ts","../../node_modules/date-fns/fp/types.d.ts","../../node_modules/date-fns/types.d.ts","../../node_modules/date-fns/add.d.ts","../../node_modules/date-fns/addbusinessdays.d.ts","../../node_modules/date-fns/adddays.d.ts","../../node_modules/date-fns/addhours.d.ts","../../node_modules/date-fns/addisoweekyears.d.ts","../../node_modules/date-fns/addmilliseconds.d.ts","../../node_modules/date-fns/addminutes.d.ts","../../node_modules/date-fns/addmonths.d.ts","../../node_modules/date-fns/addquarters.d.ts","../../node_modules/date-fns/addseconds.d.ts","../../node_modules/date-fns/addweeks.d.ts","../../node_modules/date-fns/addyears.d.ts","../../node_modules/date-fns/areintervalsoverlapping.d.ts","../../node_modules/date-fns/clamp.d.ts","../../node_modules/date-fns/closestindexto.d.ts","../../node_modules/date-fns/closestto.d.ts","../../node_modules/date-fns/compareasc.d.ts","../../node_modules/date-fns/comparedesc.d.ts","../../node_modules/date-fns/constructfrom.d.ts","../../node_modules/date-fns/daystoweeks.d.ts","../../node_modules/date-fns/differenceinbusinessdays.d.ts","../../node_modules/date-fns/differenceincalendardays.d.ts","../../node_modules/date-fns/differenceincalendarisoweekyears.d.ts","../../node_modules/date-fns/differenceincalendarisoweeks.d.ts","../../node_modules/date-fns/differenceincalendarmonths.d.ts","../../node_modules/date-fns/differenceincalendarquarters.d.ts","../../node_modules/date-fns/differenceincalendarweeks.d.ts","../../node_modules/date-fns/differenceincalendaryears.d.ts","../../node_modules/date-fns/differenceindays.d.ts","../../node_modules/date-fns/differenceinhours.d.ts","../../node_modules/date-fns/differenceinisoweekyears.d.ts","../../node_modules/date-fns/differenceinmilliseconds.d.ts","../../node_modules/date-fns/differenceinminutes.d.ts","../../node_modules/date-fns/differenceinmonths.d.ts","../../node_modules/date-fns/differenceinquarters.d.ts","../../node_modules/date-fns/differenceinseconds.d.ts","../../node_modules/date-fns/differenceinweeks.d.ts","../../node_modules/date-fns/differenceinyears.d.ts","../../node_modules/date-fns/eachdayofinterval.d.ts","../../node_modules/date-fns/eachhourofinterval.d.ts","../../node_modules/date-fns/eachminuteofinterval.d.ts","../../node_modules/date-fns/eachmonthofinterval.d.ts","../../node_modules/date-fns/eachquarterofinterval.d.ts","../../node_modules/date-fns/eachweekofinterval.d.ts","../../node_modules/date-fns/eachweekendofinterval.d.ts","../../node_modules/date-fns/eachweekendofmonth.d.ts","../../node_modules/date-fns/eachweekendofyear.d.ts","../../node_modules/date-fns/eachyearofinterval.d.ts","../../node_modules/date-fns/endofday.d.ts","../../node_modules/date-fns/endofdecade.d.ts","../../node_modules/date-fns/endofhour.d.ts","../../node_modules/date-fns/endofisoweek.d.ts","../../node_modules/date-fns/endofisoweekyear.d.ts","../../node_modules/date-fns/endofminute.d.ts","../../node_modules/date-fns/endofmonth.d.ts","../../node_modules/date-fns/endofquarter.d.ts","../../node_modules/date-fns/endofsecond.d.ts","../../node_modules/date-fns/endoftoday.d.ts","../../node_modules/date-fns/endoftomorrow.d.ts","../../node_modules/date-fns/endofweek.d.ts","../../node_modules/date-fns/endofyear.d.ts","../../node_modules/date-fns/endofyesterday.d.ts","../../node_modules/date-fns/_lib/format/formatters.d.ts","../../node_modules/date-fns/_lib/format/longformatters.d.ts","../../node_modules/date-fns/format.d.ts","../../node_modules/date-fns/formatdistance.d.ts","../../node_modules/date-fns/formatdistancestrict.d.ts","../../node_modules/date-fns/formatdistancetonow.d.ts","../../node_modules/date-fns/formatdistancetonowstrict.d.ts","../../node_modules/date-fns/formatduration.d.ts","../../node_modules/date-fns/formatiso.d.ts","../../node_modules/date-fns/formatiso9075.d.ts","../../node_modules/date-fns/formatisoduration.d.ts","../../node_modules/date-fns/formatrfc3339.d.ts","../../node_modules/date-fns/formatrfc7231.d.ts","../../node_modules/date-fns/formatrelative.d.ts","../../node_modules/date-fns/fromunixtime.d.ts","../../node_modules/date-fns/getdate.d.ts","../../node_modules/date-fns/getday.d.ts","../../node_modules/date-fns/getdayofyear.d.ts","../../node_modules/date-fns/getdaysinmonth.d.ts","../../node_modules/date-fns/getdaysinyear.d.ts","../../node_modules/date-fns/getdecade.d.ts","../../node_modules/date-fns/_lib/defaultoptions.d.ts","../../node_modules/date-fns/getdefaultoptions.d.ts","../../node_modules/date-fns/gethours.d.ts","../../node_modules/date-fns/getisoday.d.ts","../../node_modules/date-fns/getisoweek.d.ts","../../node_modules/date-fns/getisoweekyear.d.ts","../../node_modules/date-fns/getisoweeksinyear.d.ts","../../node_modules/date-fns/getmilliseconds.d.ts","../../node_modules/date-fns/getminutes.d.ts","../../node_modules/date-fns/getmonth.d.ts","../../node_modules/date-fns/getoverlappingdaysinintervals.d.ts","../../node_modules/date-fns/getquarter.d.ts","../../node_modules/date-fns/getseconds.d.ts","../../node_modules/date-fns/gettime.d.ts","../../node_modules/date-fns/getunixtime.d.ts","../../node_modules/date-fns/getweek.d.ts","../../node_modules/date-fns/getweekofmonth.d.ts","../../node_modules/date-fns/getweekyear.d.ts","../../node_modules/date-fns/getweeksinmonth.d.ts","../../node_modules/date-fns/getyear.d.ts","../../node_modules/date-fns/hourstomilliseconds.d.ts","../../node_modules/date-fns/hourstominutes.d.ts","../../node_modules/date-fns/hourstoseconds.d.ts","../../node_modules/date-fns/interval.d.ts","../../node_modules/date-fns/intervaltoduration.d.ts","../../node_modules/date-fns/intlformat.d.ts","../../node_modules/date-fns/intlformatdistance.d.ts","../../node_modules/date-fns/isafter.d.ts","../../node_modules/date-fns/isbefore.d.ts","../../node_modules/date-fns/isdate.d.ts","../../node_modules/date-fns/isequal.d.ts","../../node_modules/date-fns/isexists.d.ts","../../node_modules/date-fns/isfirstdayofmonth.d.ts","../../node_modules/date-fns/isfriday.d.ts","../../node_modules/date-fns/isfuture.d.ts","../../node_modules/date-fns/islastdayofmonth.d.ts","../../node_modules/date-fns/isleapyear.d.ts","../../node_modules/date-fns/ismatch.d.ts","../../node_modules/date-fns/ismonday.d.ts","../../node_modules/date-fns/ispast.d.ts","../../node_modules/date-fns/issameday.d.ts","../../node_modules/date-fns/issamehour.d.ts","../../node_modules/date-fns/issameisoweek.d.ts","../../node_modules/date-fns/issameisoweekyear.d.ts","../../node_modules/date-fns/issameminute.d.ts","../../node_modules/date-fns/issamemonth.d.ts","../../node_modules/date-fns/issamequarter.d.ts","../../node_modules/date-fns/issamesecond.d.ts","../../node_modules/date-fns/issameweek.d.ts","../../node_modules/date-fns/issameyear.d.ts","../../node_modules/date-fns/issaturday.d.ts","../../node_modules/date-fns/issunday.d.ts","../../node_modules/date-fns/isthishour.d.ts","../../node_modules/date-fns/isthisisoweek.d.ts","../../node_modules/date-fns/isthisminute.d.ts","../../node_modules/date-fns/isthismonth.d.ts","../../node_modules/date-fns/isthisquarter.d.ts","../../node_modules/date-fns/isthissecond.d.ts","../../node_modules/date-fns/isthisweek.d.ts","../../node_modules/date-fns/isthisyear.d.ts","../../node_modules/date-fns/isthursday.d.ts","../../node_modules/date-fns/istoday.d.ts","../../node_modules/date-fns/istomorrow.d.ts","../../node_modules/date-fns/istuesday.d.ts","../../node_modules/date-fns/isvalid.d.ts","../../node_modules/date-fns/iswednesday.d.ts","../../node_modules/date-fns/isweekend.d.ts","../../node_modules/date-fns/iswithininterval.d.ts","../../node_modules/date-fns/isyesterday.d.ts","../../node_modules/date-fns/lastdayofdecade.d.ts","../../node_modules/date-fns/lastdayofisoweek.d.ts","../../node_modules/date-fns/lastdayofisoweekyear.d.ts","../../node_modules/date-fns/lastdayofmonth.d.ts","../../node_modules/date-fns/lastdayofquarter.d.ts","../../node_modules/date-fns/lastdayofweek.d.ts","../../node_modules/date-fns/lastdayofyear.d.ts","../../node_modules/date-fns/_lib/format/lightformatters.d.ts","../../node_modules/date-fns/lightformat.d.ts","../../node_modules/date-fns/max.d.ts","../../node_modules/date-fns/milliseconds.d.ts","../../node_modules/date-fns/millisecondstohours.d.ts","../../node_modules/date-fns/millisecondstominutes.d.ts","../../node_modules/date-fns/millisecondstoseconds.d.ts","../../node_modules/date-fns/min.d.ts","../../node_modules/date-fns/minutestohours.d.ts","../../node_modules/date-fns/minutestomilliseconds.d.ts","../../node_modules/date-fns/minutestoseconds.d.ts","../../node_modules/date-fns/monthstoquarters.d.ts","../../node_modules/date-fns/monthstoyears.d.ts","../../node_modules/date-fns/nextday.d.ts","../../node_modules/date-fns/nextfriday.d.ts","../../node_modules/date-fns/nextmonday.d.ts","../../node_modules/date-fns/nextsaturday.d.ts","../../node_modules/date-fns/nextsunday.d.ts","../../node_modules/date-fns/nextthursday.d.ts","../../node_modules/date-fns/nexttuesday.d.ts","../../node_modules/date-fns/nextwednesday.d.ts","../../node_modules/date-fns/parse/_lib/types.d.ts","../../node_modules/date-fns/parse/_lib/setter.d.ts","../../node_modules/date-fns/parse/_lib/parser.d.ts","../../node_modules/date-fns/parse/_lib/parsers.d.ts","../../node_modules/date-fns/parse.d.ts","../../node_modules/date-fns/parseiso.d.ts","../../node_modules/date-fns/parsejson.d.ts","../../node_modules/date-fns/previousday.d.ts","../../node_modules/date-fns/previousfriday.d.ts","../../node_modules/date-fns/previousmonday.d.ts","../../node_modules/date-fns/previoussaturday.d.ts","../../node_modules/date-fns/previoussunday.d.ts","../../node_modules/date-fns/previousthursday.d.ts","../../node_modules/date-fns/previoustuesday.d.ts","../../node_modules/date-fns/previouswednesday.d.ts","../../node_modules/date-fns/quarterstomonths.d.ts","../../node_modules/date-fns/quarterstoyears.d.ts","../../node_modules/date-fns/roundtonearestminutes.d.ts","../../node_modules/date-fns/secondstohours.d.ts","../../node_modules/date-fns/secondstomilliseconds.d.ts","../../node_modules/date-fns/secondstominutes.d.ts","../../node_modules/date-fns/set.d.ts","../../node_modules/date-fns/setdate.d.ts","../../node_modules/date-fns/setday.d.ts","../../node_modules/date-fns/setdayofyear.d.ts","../../node_modules/date-fns/setdefaultoptions.d.ts","../../node_modules/date-fns/sethours.d.ts","../../node_modules/date-fns/setisoday.d.ts","../../node_modules/date-fns/setisoweek.d.ts","../../node_modules/date-fns/setisoweekyear.d.ts","../../node_modules/date-fns/setmilliseconds.d.ts","../../node_modules/date-fns/setminutes.d.ts","../../node_modules/date-fns/setmonth.d.ts","../../node_modules/date-fns/setquarter.d.ts","../../node_modules/date-fns/setseconds.d.ts","../../node_modules/date-fns/setweek.d.ts","../../node_modules/date-fns/setweekyear.d.ts","../../node_modules/date-fns/setyear.d.ts","../../node_modules/date-fns/startofday.d.ts","../../node_modules/date-fns/startofdecade.d.ts","../../node_modules/date-fns/startofhour.d.ts","../../node_modules/date-fns/startofisoweek.d.ts","../../node_modules/date-fns/startofisoweekyear.d.ts","../../node_modules/date-fns/startofminute.d.ts","../../node_modules/date-fns/startofmonth.d.ts","../../node_modules/date-fns/startofquarter.d.ts","../../node_modules/date-fns/startofsecond.d.ts","../../node_modules/date-fns/startoftoday.d.ts","../../node_modules/date-fns/startoftomorrow.d.ts","../../node_modules/date-fns/startofweek.d.ts","../../node_modules/date-fns/startofweekyear.d.ts","../../node_modules/date-fns/startofyear.d.ts","../../node_modules/date-fns/startofyesterday.d.ts","../../node_modules/date-fns/sub.d.ts","../../node_modules/date-fns/subbusinessdays.d.ts","../../node_modules/date-fns/subdays.d.ts","../../node_modules/date-fns/subhours.d.ts","../../node_modules/date-fns/subisoweekyears.d.ts","../../node_modules/date-fns/submilliseconds.d.ts","../../node_modules/date-fns/subminutes.d.ts","../../node_modules/date-fns/submonths.d.ts","../../node_modules/date-fns/subquarters.d.ts","../../node_modules/date-fns/subseconds.d.ts","../../node_modules/date-fns/subweeks.d.ts","../../node_modules/date-fns/subyears.d.ts","../../node_modules/date-fns/todate.d.ts","../../node_modules/date-fns/transpose.d.ts","../../node_modules/date-fns/weekstodays.d.ts","../../node_modules/date-fns/yearstodays.d.ts","../../node_modules/date-fns/yearstomonths.d.ts","../../node_modules/date-fns/yearstoquarters.d.ts","../../node_modules/date-fns/index.d.ts","./src/utils/formattimeleft.ts","./src/utils/etherscan/makeetherscanaddressurl.ts","./src/utils/gscvault/getgscmembers.ts","./pages/404.tsx","../../node_modules/classnames/index.d.ts","./src/ui/base/svg/20/airdropicon.tsx","./src/ui/base/svg/pushlogo.tsx","../../node_modules/react-tooltip/dist/react-tooltip.d.ts","./src/ui/base/tooltip.tsx","./src/ui/network/hooks/usewrongnetworkeffect.tsx","./src/ui/navigation/navigation.tsx","./src/ui/app.tsx","./pages/_app.tsx","./pages/index.tsx","./src/ui/airdrop/claimstep.tsx","../../node_modules/react-loading-skeleton/dist/skeletonstyleprops.d.ts","../../node_modules/react-loading-skeleton/dist/skeleton.d.ts","../../node_modules/react-loading-skeleton/dist/skeletontheme.d.ts","../../node_modules/react-loading-skeleton/dist/index.d.ts","./src/ui/airdrop/confirmclaimstep.tsx","./src/ui/airdrop/confirmdepositstep.tsx","./src/ui/base/svg/24/airdropicon.tsx","./src/ui/airdrop/depositorclaimstep.tsx","./src/ui/airdrop/depositstep.tsx","./pages/airdrop/index.tsx","./src/ui/base/page.tsx","./pages/profile/index.tsx","./src/ui/base/breadcrumbs.tsx","./src/ui/base/svg/externallink.tsx","./src/ui/base/links/externallink.tsx","./src/ui/base/stat.tsx","./src/ui/base/walleticon.tsx","./src/ui/base/address.tsx","./src/ui/ens/adddresswithetherscan.tsx","./src/ui/voters/voteraddress.tsx","./src/ui/proposals/proposalstatsrow/proposalstatsrow.tsx","./src/ui/proposals/proposalstatsrow/proposalstatsrowskeleton.tsx","./src/ui/proposals/quorum/quorum.tsx","./src/ui/proposals/quorum/quorumskeleton.tsx","./src/ui/base/sorting/sortdirectionstatus.tsx","./src/ui/base/tables/gridtableheader.tsx","./src/ui/base/tables/gridtablerow.tsx","./src/ui/base/tables/gridtablerowlink.tsx","./src/ui/base/tables/sortablegridtable.tsx","./src/ui/voting/formattedballot.tsx","./src/ui/proposals/votingactivitytable/votingactivitytable.tsx","./src/ui/proposals/votingactivitytable/votingactivitytableskeleton.tsx","./src/ui/voters/gsconlytoggle.tsx","./src/ui/voting/proposalvotingskeleton.tsx","./src/ui/voting/proposalvoting.tsx","./pages/proposals/details.tsx","./src/ui/base/information/externalinfocard.tsx","../../node_modules/@heroicons/react/24/outline/academiccapicon.d.ts","../../node_modules/@heroicons/react/24/outline/adjustmentshorizontalicon.d.ts","../../node_modules/@heroicons/react/24/outline/adjustmentsverticalicon.d.ts","../../node_modules/@heroicons/react/24/outline/archiveboxarrowdownicon.d.ts","../../node_modules/@heroicons/react/24/outline/archiveboxxmarkicon.d.ts","../../node_modules/@heroicons/react/24/outline/archiveboxicon.d.ts","../../node_modules/@heroicons/react/24/outline/arrowdowncircleicon.d.ts","../../node_modules/@heroicons/react/24/outline/arrowdownlefticon.d.ts","../../node_modules/@heroicons/react/24/outline/arrowdownonsquarestackicon.d.ts","../../node_modules/@heroicons/react/24/outline/arrowdownonsquareicon.d.ts","../../node_modules/@heroicons/react/24/outline/arrowdownrighticon.d.ts","../../node_modules/@heroicons/react/24/outline/arrowdowntrayicon.d.ts","../../node_modules/@heroicons/react/24/outline/arrowdownicon.d.ts","../../node_modules/@heroicons/react/24/outline/arrowleftcircleicon.d.ts","../../node_modules/@heroicons/react/24/outline/arrowleftendonrectangleicon.d.ts","../../node_modules/@heroicons/react/24/outline/arrowleftonrectangleicon.d.ts","../../node_modules/@heroicons/react/24/outline/arrowleftstartonrectangleicon.d.ts","../../node_modules/@heroicons/react/24/outline/arrowlefticon.d.ts","../../node_modules/@heroicons/react/24/outline/arrowlongdownicon.d.ts","../../node_modules/@heroicons/react/24/outline/arrowlonglefticon.d.ts","../../node_modules/@heroicons/react/24/outline/arrowlongrighticon.d.ts","../../node_modules/@heroicons/react/24/outline/arrowlongupicon.d.ts","../../node_modules/@heroicons/react/24/outline/arrowpathroundedsquareicon.d.ts","../../node_modules/@heroicons/react/24/outline/arrowpathicon.d.ts","../../node_modules/@heroicons/react/24/outline/arrowrightcircleicon.d.ts","../../node_modules/@heroicons/react/24/outline/arrowrightendonrectangleicon.d.ts","../../node_modules/@heroicons/react/24/outline/arrowrightonrectangleicon.d.ts","../../node_modules/@heroicons/react/24/outline/arrowrightstartonrectangleicon.d.ts","../../node_modules/@heroicons/react/24/outline/arrowrighticon.d.ts","../../node_modules/@heroicons/react/24/outline/arrowsmalldownicon.d.ts","../../node_modules/@heroicons/react/24/outline/arrowsmalllefticon.d.ts","../../node_modules/@heroicons/react/24/outline/arrowsmallrighticon.d.ts","../../node_modules/@heroicons/react/24/outline/arrowsmallupicon.d.ts","../../node_modules/@heroicons/react/24/outline/arrowtoprightonsquareicon.d.ts","../../node_modules/@heroicons/react/24/outline/arrowtrendingdownicon.d.ts","../../node_modules/@heroicons/react/24/outline/arrowtrendingupicon.d.ts","../../node_modules/@heroicons/react/24/outline/arrowupcircleicon.d.ts","../../node_modules/@heroicons/react/24/outline/arrowuplefticon.d.ts","../../node_modules/@heroicons/react/24/outline/arrowuponsquarestackicon.d.ts","../../node_modules/@heroicons/react/24/outline/arrowuponsquareicon.d.ts","../../node_modules/@heroicons/react/24/outline/arrowuprighticon.d.ts","../../node_modules/@heroicons/react/24/outline/arrowuptrayicon.d.ts","../../node_modules/@heroicons/react/24/outline/arrowupicon.d.ts","../../node_modules/@heroicons/react/24/outline/arrowuturndownicon.d.ts","../../node_modules/@heroicons/react/24/outline/arrowuturnlefticon.d.ts","../../node_modules/@heroicons/react/24/outline/arrowuturnrighticon.d.ts","../../node_modules/@heroicons/react/24/outline/arrowuturnupicon.d.ts","../../node_modules/@heroicons/react/24/outline/arrowspointinginicon.d.ts","../../node_modules/@heroicons/react/24/outline/arrowspointingouticon.d.ts","../../node_modules/@heroicons/react/24/outline/arrowsrightlefticon.d.ts","../../node_modules/@heroicons/react/24/outline/arrowsupdownicon.d.ts","../../node_modules/@heroicons/react/24/outline/atsymbolicon.d.ts","../../node_modules/@heroicons/react/24/outline/backspaceicon.d.ts","../../node_modules/@heroicons/react/24/outline/backwardicon.d.ts","../../node_modules/@heroicons/react/24/outline/banknotesicon.d.ts","../../node_modules/@heroicons/react/24/outline/bars2icon.d.ts","../../node_modules/@heroicons/react/24/outline/bars3bottomlefticon.d.ts","../../node_modules/@heroicons/react/24/outline/bars3bottomrighticon.d.ts","../../node_modules/@heroicons/react/24/outline/bars3centerlefticon.d.ts","../../node_modules/@heroicons/react/24/outline/bars3icon.d.ts","../../node_modules/@heroicons/react/24/outline/bars4icon.d.ts","../../node_modules/@heroicons/react/24/outline/barsarrowdownicon.d.ts","../../node_modules/@heroicons/react/24/outline/barsarrowupicon.d.ts","../../node_modules/@heroicons/react/24/outline/battery0icon.d.ts","../../node_modules/@heroicons/react/24/outline/battery100icon.d.ts","../../node_modules/@heroicons/react/24/outline/battery50icon.d.ts","../../node_modules/@heroicons/react/24/outline/beakericon.d.ts","../../node_modules/@heroicons/react/24/outline/bellalerticon.d.ts","../../node_modules/@heroicons/react/24/outline/bellslashicon.d.ts","../../node_modules/@heroicons/react/24/outline/bellsnoozeicon.d.ts","../../node_modules/@heroicons/react/24/outline/bellicon.d.ts","../../node_modules/@heroicons/react/24/outline/boltslashicon.d.ts","../../node_modules/@heroicons/react/24/outline/bolticon.d.ts","../../node_modules/@heroicons/react/24/outline/bookopenicon.d.ts","../../node_modules/@heroicons/react/24/outline/bookmarkslashicon.d.ts","../../node_modules/@heroicons/react/24/outline/bookmarksquareicon.d.ts","../../node_modules/@heroicons/react/24/outline/bookmarkicon.d.ts","../../node_modules/@heroicons/react/24/outline/briefcaseicon.d.ts","../../node_modules/@heroicons/react/24/outline/buganticon.d.ts","../../node_modules/@heroicons/react/24/outline/buildinglibraryicon.d.ts","../../node_modules/@heroicons/react/24/outline/buildingoffice2icon.d.ts","../../node_modules/@heroicons/react/24/outline/buildingofficeicon.d.ts","../../node_modules/@heroicons/react/24/outline/buildingstorefronticon.d.ts","../../node_modules/@heroicons/react/24/outline/cakeicon.d.ts","../../node_modules/@heroicons/react/24/outline/calculatoricon.d.ts","../../node_modules/@heroicons/react/24/outline/calendardaysicon.d.ts","../../node_modules/@heroicons/react/24/outline/calendaricon.d.ts","../../node_modules/@heroicons/react/24/outline/cameraicon.d.ts","../../node_modules/@heroicons/react/24/outline/chartbarsquareicon.d.ts","../../node_modules/@heroicons/react/24/outline/chartbaricon.d.ts","../../node_modules/@heroicons/react/24/outline/chartpieicon.d.ts","../../node_modules/@heroicons/react/24/outline/chatbubblebottomcentertexticon.d.ts","../../node_modules/@heroicons/react/24/outline/chatbubblebottomcentericon.d.ts","../../node_modules/@heroicons/react/24/outline/chatbubbleleftellipsisicon.d.ts","../../node_modules/@heroicons/react/24/outline/chatbubbleleftrighticon.d.ts","../../node_modules/@heroicons/react/24/outline/chatbubblelefticon.d.ts","../../node_modules/@heroicons/react/24/outline/chatbubbleovalleftellipsisicon.d.ts","../../node_modules/@heroicons/react/24/outline/chatbubbleovallefticon.d.ts","../../node_modules/@heroicons/react/24/outline/checkbadgeicon.d.ts","../../node_modules/@heroicons/react/24/outline/checkcircleicon.d.ts","../../node_modules/@heroicons/react/24/outline/checkicon.d.ts","../../node_modules/@heroicons/react/24/outline/chevrondoubledownicon.d.ts","../../node_modules/@heroicons/react/24/outline/chevrondoublelefticon.d.ts","../../node_modules/@heroicons/react/24/outline/chevrondoublerighticon.d.ts","../../node_modules/@heroicons/react/24/outline/chevrondoubleupicon.d.ts","../../node_modules/@heroicons/react/24/outline/chevrondownicon.d.ts","../../node_modules/@heroicons/react/24/outline/chevronlefticon.d.ts","../../node_modules/@heroicons/react/24/outline/chevronrighticon.d.ts","../../node_modules/@heroicons/react/24/outline/chevronupdownicon.d.ts","../../node_modules/@heroicons/react/24/outline/chevronupicon.d.ts","../../node_modules/@heroicons/react/24/outline/circlestackicon.d.ts","../../node_modules/@heroicons/react/24/outline/clipboarddocumentcheckicon.d.ts","../../node_modules/@heroicons/react/24/outline/clipboarddocumentlisticon.d.ts","../../node_modules/@heroicons/react/24/outline/clipboarddocumenticon.d.ts","../../node_modules/@heroicons/react/24/outline/clipboardicon.d.ts","../../node_modules/@heroicons/react/24/outline/clockicon.d.ts","../../node_modules/@heroicons/react/24/outline/cloudarrowdownicon.d.ts","../../node_modules/@heroicons/react/24/outline/cloudarrowupicon.d.ts","../../node_modules/@heroicons/react/24/outline/cloudicon.d.ts","../../node_modules/@heroicons/react/24/outline/codebracketsquareicon.d.ts","../../node_modules/@heroicons/react/24/outline/codebracketicon.d.ts","../../node_modules/@heroicons/react/24/outline/cog6toothicon.d.ts","../../node_modules/@heroicons/react/24/outline/cog8toothicon.d.ts","../../node_modules/@heroicons/react/24/outline/cogicon.d.ts","../../node_modules/@heroicons/react/24/outline/commandlineicon.d.ts","../../node_modules/@heroicons/react/24/outline/computerdesktopicon.d.ts","../../node_modules/@heroicons/react/24/outline/cpuchipicon.d.ts","../../node_modules/@heroicons/react/24/outline/creditcardicon.d.ts","../../node_modules/@heroicons/react/24/outline/cubetransparenticon.d.ts","../../node_modules/@heroicons/react/24/outline/cubeicon.d.ts","../../node_modules/@heroicons/react/24/outline/currencybangladeshiicon.d.ts","../../node_modules/@heroicons/react/24/outline/currencydollaricon.d.ts","../../node_modules/@heroicons/react/24/outline/currencyeuroicon.d.ts","../../node_modules/@heroicons/react/24/outline/currencypoundicon.d.ts","../../node_modules/@heroicons/react/24/outline/currencyrupeeicon.d.ts","../../node_modules/@heroicons/react/24/outline/currencyyenicon.d.ts","../../node_modules/@heroicons/react/24/outline/cursorarrowraysicon.d.ts","../../node_modules/@heroicons/react/24/outline/cursorarrowrippleicon.d.ts","../../node_modules/@heroicons/react/24/outline/devicephonemobileicon.d.ts","../../node_modules/@heroicons/react/24/outline/devicetableticon.d.ts","../../node_modules/@heroicons/react/24/outline/documentarrowdownicon.d.ts","../../node_modules/@heroicons/react/24/outline/documentarrowupicon.d.ts","../../node_modules/@heroicons/react/24/outline/documentchartbaricon.d.ts","../../node_modules/@heroicons/react/24/outline/documentcheckicon.d.ts","../../node_modules/@heroicons/react/24/outline/documentduplicateicon.d.ts","../../node_modules/@heroicons/react/24/outline/documentmagnifyingglassicon.d.ts","../../node_modules/@heroicons/react/24/outline/documentminusicon.d.ts","../../node_modules/@heroicons/react/24/outline/documentplusicon.d.ts","../../node_modules/@heroicons/react/24/outline/documenttexticon.d.ts","../../node_modules/@heroicons/react/24/outline/documenticon.d.ts","../../node_modules/@heroicons/react/24/outline/ellipsishorizontalcircleicon.d.ts","../../node_modules/@heroicons/react/24/outline/ellipsishorizontalicon.d.ts","../../node_modules/@heroicons/react/24/outline/ellipsisverticalicon.d.ts","../../node_modules/@heroicons/react/24/outline/envelopeopenicon.d.ts","../../node_modules/@heroicons/react/24/outline/envelopeicon.d.ts","../../node_modules/@heroicons/react/24/outline/exclamationcircleicon.d.ts","../../node_modules/@heroicons/react/24/outline/exclamationtriangleicon.d.ts","../../node_modules/@heroicons/react/24/outline/eyedroppericon.d.ts","../../node_modules/@heroicons/react/24/outline/eyeslashicon.d.ts","../../node_modules/@heroicons/react/24/outline/eyeicon.d.ts","../../node_modules/@heroicons/react/24/outline/facefrownicon.d.ts","../../node_modules/@heroicons/react/24/outline/facesmileicon.d.ts","../../node_modules/@heroicons/react/24/outline/filmicon.d.ts","../../node_modules/@heroicons/react/24/outline/fingerprinticon.d.ts","../../node_modules/@heroicons/react/24/outline/fireicon.d.ts","../../node_modules/@heroicons/react/24/outline/flagicon.d.ts","../../node_modules/@heroicons/react/24/outline/folderarrowdownicon.d.ts","../../node_modules/@heroicons/react/24/outline/folderminusicon.d.ts","../../node_modules/@heroicons/react/24/outline/folderopenicon.d.ts","../../node_modules/@heroicons/react/24/outline/folderplusicon.d.ts","../../node_modules/@heroicons/react/24/outline/foldericon.d.ts","../../node_modules/@heroicons/react/24/outline/forwardicon.d.ts","../../node_modules/@heroicons/react/24/outline/funnelicon.d.ts","../../node_modules/@heroicons/react/24/outline/gificon.d.ts","../../node_modules/@heroicons/react/24/outline/gifttopicon.d.ts","../../node_modules/@heroicons/react/24/outline/gifticon.d.ts","../../node_modules/@heroicons/react/24/outline/globealticon.d.ts","../../node_modules/@heroicons/react/24/outline/globeamericasicon.d.ts","../../node_modules/@heroicons/react/24/outline/globeasiaaustraliaicon.d.ts","../../node_modules/@heroicons/react/24/outline/globeeuropeafricaicon.d.ts","../../node_modules/@heroicons/react/24/outline/handraisedicon.d.ts","../../node_modules/@heroicons/react/24/outline/handthumbdownicon.d.ts","../../node_modules/@heroicons/react/24/outline/handthumbupicon.d.ts","../../node_modules/@heroicons/react/24/outline/hashtagicon.d.ts","../../node_modules/@heroicons/react/24/outline/hearticon.d.ts","../../node_modules/@heroicons/react/24/outline/homemodernicon.d.ts","../../node_modules/@heroicons/react/24/outline/homeicon.d.ts","../../node_modules/@heroicons/react/24/outline/identificationicon.d.ts","../../node_modules/@heroicons/react/24/outline/inboxarrowdownicon.d.ts","../../node_modules/@heroicons/react/24/outline/inboxstackicon.d.ts","../../node_modules/@heroicons/react/24/outline/inboxicon.d.ts","../../node_modules/@heroicons/react/24/outline/informationcircleicon.d.ts","../../node_modules/@heroicons/react/24/outline/keyicon.d.ts","../../node_modules/@heroicons/react/24/outline/languageicon.d.ts","../../node_modules/@heroicons/react/24/outline/lifebuoyicon.d.ts","../../node_modules/@heroicons/react/24/outline/lightbulbicon.d.ts","../../node_modules/@heroicons/react/24/outline/linkicon.d.ts","../../node_modules/@heroicons/react/24/outline/listbulleticon.d.ts","../../node_modules/@heroicons/react/24/outline/lockclosedicon.d.ts","../../node_modules/@heroicons/react/24/outline/lockopenicon.d.ts","../../node_modules/@heroicons/react/24/outline/magnifyingglasscircleicon.d.ts","../../node_modules/@heroicons/react/24/outline/magnifyingglassminusicon.d.ts","../../node_modules/@heroicons/react/24/outline/magnifyingglassplusicon.d.ts","../../node_modules/@heroicons/react/24/outline/magnifyingglassicon.d.ts","../../node_modules/@heroicons/react/24/outline/mappinicon.d.ts","../../node_modules/@heroicons/react/24/outline/mapicon.d.ts","../../node_modules/@heroicons/react/24/outline/megaphoneicon.d.ts","../../node_modules/@heroicons/react/24/outline/microphoneicon.d.ts","../../node_modules/@heroicons/react/24/outline/minuscircleicon.d.ts","../../node_modules/@heroicons/react/24/outline/minussmallicon.d.ts","../../node_modules/@heroicons/react/24/outline/minusicon.d.ts","../../node_modules/@heroicons/react/24/outline/moonicon.d.ts","../../node_modules/@heroicons/react/24/outline/musicalnoteicon.d.ts","../../node_modules/@heroicons/react/24/outline/newspapericon.d.ts","../../node_modules/@heroicons/react/24/outline/nosymbolicon.d.ts","../../node_modules/@heroicons/react/24/outline/paintbrushicon.d.ts","../../node_modules/@heroicons/react/24/outline/paperairplaneicon.d.ts","../../node_modules/@heroicons/react/24/outline/paperclipicon.d.ts","../../node_modules/@heroicons/react/24/outline/pausecircleicon.d.ts","../../node_modules/@heroicons/react/24/outline/pauseicon.d.ts","../../node_modules/@heroicons/react/24/outline/pencilsquareicon.d.ts","../../node_modules/@heroicons/react/24/outline/pencilicon.d.ts","../../node_modules/@heroicons/react/24/outline/phonearrowdownlefticon.d.ts","../../node_modules/@heroicons/react/24/outline/phonearrowuprighticon.d.ts","../../node_modules/@heroicons/react/24/outline/phonexmarkicon.d.ts","../../node_modules/@heroicons/react/24/outline/phoneicon.d.ts","../../node_modules/@heroicons/react/24/outline/photoicon.d.ts","../../node_modules/@heroicons/react/24/outline/playcircleicon.d.ts","../../node_modules/@heroicons/react/24/outline/playpauseicon.d.ts","../../node_modules/@heroicons/react/24/outline/playicon.d.ts","../../node_modules/@heroicons/react/24/outline/pluscircleicon.d.ts","../../node_modules/@heroicons/react/24/outline/plussmallicon.d.ts","../../node_modules/@heroicons/react/24/outline/plusicon.d.ts","../../node_modules/@heroicons/react/24/outline/powericon.d.ts","../../node_modules/@heroicons/react/24/outline/presentationchartbaricon.d.ts","../../node_modules/@heroicons/react/24/outline/presentationchartlineicon.d.ts","../../node_modules/@heroicons/react/24/outline/printericon.d.ts","../../node_modules/@heroicons/react/24/outline/puzzlepieceicon.d.ts","../../node_modules/@heroicons/react/24/outline/qrcodeicon.d.ts","../../node_modules/@heroicons/react/24/outline/questionmarkcircleicon.d.ts","../../node_modules/@heroicons/react/24/outline/queuelisticon.d.ts","../../node_modules/@heroicons/react/24/outline/radioicon.d.ts","../../node_modules/@heroicons/react/24/outline/receiptpercenticon.d.ts","../../node_modules/@heroicons/react/24/outline/receiptrefundicon.d.ts","../../node_modules/@heroicons/react/24/outline/rectanglegroupicon.d.ts","../../node_modules/@heroicons/react/24/outline/rectanglestackicon.d.ts","../../node_modules/@heroicons/react/24/outline/rocketlaunchicon.d.ts","../../node_modules/@heroicons/react/24/outline/rssicon.d.ts","../../node_modules/@heroicons/react/24/outline/scaleicon.d.ts","../../node_modules/@heroicons/react/24/outline/scissorsicon.d.ts","../../node_modules/@heroicons/react/24/outline/serverstackicon.d.ts","../../node_modules/@heroicons/react/24/outline/servericon.d.ts","../../node_modules/@heroicons/react/24/outline/shareicon.d.ts","../../node_modules/@heroicons/react/24/outline/shieldcheckicon.d.ts","../../node_modules/@heroicons/react/24/outline/shieldexclamationicon.d.ts","../../node_modules/@heroicons/react/24/outline/shoppingbagicon.d.ts","../../node_modules/@heroicons/react/24/outline/shoppingcarticon.d.ts","../../node_modules/@heroicons/react/24/outline/signalslashicon.d.ts","../../node_modules/@heroicons/react/24/outline/signalicon.d.ts","../../node_modules/@heroicons/react/24/outline/sparklesicon.d.ts","../../node_modules/@heroicons/react/24/outline/speakerwaveicon.d.ts","../../node_modules/@heroicons/react/24/outline/speakerxmarkicon.d.ts","../../node_modules/@heroicons/react/24/outline/square2stackicon.d.ts","../../node_modules/@heroicons/react/24/outline/square3stack3dicon.d.ts","../../node_modules/@heroicons/react/24/outline/squares2x2icon.d.ts","../../node_modules/@heroicons/react/24/outline/squaresplusicon.d.ts","../../node_modules/@heroicons/react/24/outline/staricon.d.ts","../../node_modules/@heroicons/react/24/outline/stopcircleicon.d.ts","../../node_modules/@heroicons/react/24/outline/stopicon.d.ts","../../node_modules/@heroicons/react/24/outline/sunicon.d.ts","../../node_modules/@heroicons/react/24/outline/swatchicon.d.ts","../../node_modules/@heroicons/react/24/outline/tablecellsicon.d.ts","../../node_modules/@heroicons/react/24/outline/tagicon.d.ts","../../node_modules/@heroicons/react/24/outline/ticketicon.d.ts","../../node_modules/@heroicons/react/24/outline/trashicon.d.ts","../../node_modules/@heroicons/react/24/outline/trophyicon.d.ts","../../node_modules/@heroicons/react/24/outline/truckicon.d.ts","../../node_modules/@heroicons/react/24/outline/tvicon.d.ts","../../node_modules/@heroicons/react/24/outline/usercircleicon.d.ts","../../node_modules/@heroicons/react/24/outline/usergroupicon.d.ts","../../node_modules/@heroicons/react/24/outline/userminusicon.d.ts","../../node_modules/@heroicons/react/24/outline/userplusicon.d.ts","../../node_modules/@heroicons/react/24/outline/usericon.d.ts","../../node_modules/@heroicons/react/24/outline/usersicon.d.ts","../../node_modules/@heroicons/react/24/outline/variableicon.d.ts","../../node_modules/@heroicons/react/24/outline/videocameraslashicon.d.ts","../../node_modules/@heroicons/react/24/outline/videocameraicon.d.ts","../../node_modules/@heroicons/react/24/outline/viewcolumnsicon.d.ts","../../node_modules/@heroicons/react/24/outline/viewfindercircleicon.d.ts","../../node_modules/@heroicons/react/24/outline/walleticon.d.ts","../../node_modules/@heroicons/react/24/outline/wifiicon.d.ts","../../node_modules/@heroicons/react/24/outline/windowicon.d.ts","../../node_modules/@heroicons/react/24/outline/wrenchscrewdrivericon.d.ts","../../node_modules/@heroicons/react/24/outline/wrenchicon.d.ts","../../node_modules/@heroicons/react/24/outline/xcircleicon.d.ts","../../node_modules/@heroicons/react/24/outline/xmarkicon.d.ts","../../node_modules/@heroicons/react/24/outline/index.d.ts","./src/ui/proposals/proposaltable/proposalstable.tsx","./src/ui/proposals/proposaltable/proposalstableskeleton.tsx","./pages/proposals/index.tsx","./src/ui/base/error/errormessage.tsx","./src/ui/base/forms/input.tsx","../../node_modules/viem/_types/utils/ens/normalize.d.ts","../../node_modules/viem/_types/ens/index.d.ts","./src/ui/vaults/changedelegateform.tsx","./src/ui/vaults/lockingvault/lockingvaultstatsrow.tsx","./src/ui/vaults/vaultdetails/vaultdetails.tsx","./src/ui/vaults/vaultdetails/vaultdetailsskeleton.tsx","./src/ui/vaults/vaultheader.tsx","./src/ui/vaults/frozenlockingvault/frozenlockingvaultdetails.tsx","./src/ui/vaults/genericvault/genericvaultstatsrow.tsx","./src/ui/vaults/genericvault/genericvaultdetails.tsx","./src/ui/vaults/gscvault/gscmemberstableheader.tsx","./src/ui/vaults/gscvault/gscmemberstable.tsx","./src/ui/vaults/gscvault/gscmembershipstatusstat.tsx","./src/ui/vaults/gscvault/gscvaultstatsrow.tsx","./src/ui/vaults/gscvault/gscvaultdetails.tsx","./src/ui/base/forms/numericinput.tsx","./src/ui/vaults/depositandwithdrawform.tsx","./src/ui/vaults/lockingvault/lockingvaultdetails.tsx","./src/ui/vaults/vestingvault/grantcard.tsx","./src/ui/vaults/vestingvault/vestingvaultstatsrow.tsx","./src/ui/vaults/vestingvault/vestingvaultdetails.tsx","./pages/vaults/details.tsx","./src/ui/vaults/genericvaultcard.tsx","./src/ui/vaults/gscvault/gscvaultpreviewcard.tsx","./pages/vaults/index.tsx","./src/ui/voters/skeletons/voterstatsrowskeleton.tsx","./src/ui/voters/voterstatsrow.tsx","./src/ui/vaults/vaultprofilecard.tsx","./src/ui/vaults/vaultprofilecardskeleton.tsx","./src/ui/vaults/gscvault/gscvaultprofilecard.tsx","./src/ui/voters/voterslistcompact.tsx","./src/ui/vaults/delegatorlistmodal.tsx","./src/ui/vaults/lockingvault/lockingvaultsprofilecard.tsx","./src/ui/vaults/vestingvault/vestingvaultprofilecard.tsx","./src/ui/voters/votervaultslist.tsx","./src/ui/voters/votervaultslistskeleton.tsx","./src/ui/voters/votinghistoryskeleton.tsx","./src/ui/voters/votinghistorytable.tsx","./pages/voters/details.tsx","./src/ui/voters/voterlist/voterlist.tsx","./src/ui/voters/voterlist/voterlistskeleton.tsx","./pages/voters/index.tsx","./src/ui/base/progress.tsx","./src/ui/base/svg/chevrondown.tsx","./src/ui/base/svg/chevronright.tsx","./src/ui/base/svg/downarrow.tsx","./src/ui/base/svg/uparrow.tsx","./src/ui/proposals/voteresultsbar/voteresultbar.tsx","../../node_modules/@babel/types/lib/index.d.ts","../../node_modules/@types/babel__generator/index.d.ts","../../node_modules/@babel/parser/typings/babel-parser.d.ts","../../node_modules/@types/babel__template/index.d.ts","../../node_modules/@types/babel__traverse/index.d.ts","../../node_modules/@types/babel__core/index.d.ts","../../node_modules/@types/big.js/index.d.ts","../../node_modules/@types/har-format/index.d.ts","../../node_modules/@types/chrome/har-format/index.d.ts","../../node_modules/@types/filewriter/index.d.ts","../../node_modules/@types/filesystem/index.d.ts","../../node_modules/@types/chrome/index.d.ts","../../node_modules/@types/cli-table/index.d.ts","../../node_modules/@types/ms/index.d.ts","../../node_modules/@types/debug/index.d.ts","../../node_modules/@types/dom-screen-wake-lock/index.d.ts","../../node_modules/@types/estree/index.d.ts","../../node_modules/@types/json-schema/index.d.ts","../../node_modules/@types/json5/index.d.ts","../../node_modules/@types/lodash.ismatch/index.d.ts","../../node_modules/@types/lru-cache/index.d.ts","../../node_modules/@types/minimist/index.d.ts","../../node_modules/@types/normalize-package-data/index.d.ts","../../node_modules/@types/parse-json/index.d.ts","../../node_modules/@types/pbkdf2/index.d.ts","../../node_modules/kleur/kleur.d.ts","../../node_modules/@types/prompts/index.d.ts","../../node_modules/@types/readable-stream/node_modules/safe-buffer/index.d.ts","../../node_modules/@types/readable-stream/index.d.ts","../../node_modules/@types/scheduler/index.d.ts","../../node_modules/@types/secp256k1/index.d.ts","../../node_modules/@types/semver/classes/semver.d.ts","../../node_modules/@types/semver/functions/parse.d.ts","../../node_modules/@types/semver/functions/valid.d.ts","../../node_modules/@types/semver/functions/clean.d.ts","../../node_modules/@types/semver/functions/inc.d.ts","../../node_modules/@types/semver/functions/diff.d.ts","../../node_modules/@types/semver/functions/major.d.ts","../../node_modules/@types/semver/functions/minor.d.ts","../../node_modules/@types/semver/functions/patch.d.ts","../../node_modules/@types/semver/functions/prerelease.d.ts","../../node_modules/@types/semver/functions/compare.d.ts","../../node_modules/@types/semver/functions/rcompare.d.ts","../../node_modules/@types/semver/functions/compare-loose.d.ts","../../node_modules/@types/semver/functions/compare-build.d.ts","../../node_modules/@types/semver/functions/sort.d.ts","../../node_modules/@types/semver/functions/rsort.d.ts","../../node_modules/@types/semver/functions/gt.d.ts","../../node_modules/@types/semver/functions/lt.d.ts","../../node_modules/@types/semver/functions/eq.d.ts","../../node_modules/@types/semver/functions/neq.d.ts","../../node_modules/@types/semver/functions/gte.d.ts","../../node_modules/@types/semver/functions/lte.d.ts","../../node_modules/@types/semver/functions/cmp.d.ts","../../node_modules/@types/semver/functions/coerce.d.ts","../../node_modules/@types/semver/classes/comparator.d.ts","../../node_modules/@types/semver/classes/range.d.ts","../../node_modules/@types/semver/functions/satisfies.d.ts","../../node_modules/@types/semver/ranges/max-satisfying.d.ts","../../node_modules/@types/semver/ranges/min-satisfying.d.ts","../../node_modules/@types/semver/ranges/to-comparators.d.ts","../../node_modules/@types/semver/ranges/min-version.d.ts","../../node_modules/@types/semver/ranges/valid.d.ts","../../node_modules/@types/semver/ranges/outside.d.ts","../../node_modules/@types/semver/ranges/gtr.d.ts","../../node_modules/@types/semver/ranges/ltr.d.ts","../../node_modules/@types/semver/ranges/intersects.d.ts","../../node_modules/@types/semver/ranges/simplify.d.ts","../../node_modules/@types/semver/ranges/subset.d.ts","../../node_modules/@types/semver/internals/identifiers.d.ts","../../node_modules/@types/semver/index.d.ts","../../node_modules/@types/signale/index.d.ts","../../node_modules/@types/trusted-types/lib/index.d.ts","../../node_modules/@types/trusted-types/index.d.ts"],"fileInfos":[{"version":"f33e5332b24c3773e930e212cbb8b6867c8ba3ec4492064ea78e55a524d57450","affectsGlobalScope":true},"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","26f2f787e82c4222710f3b676b4d83eb5ad0a72fa7b746f03449e7a026ce5073","9a68c0c07ae2fa71b44384a839b7b8d81662a236d4b9ac30916718f7510b1b2d","5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","5514e54f17d6d74ecefedc73c504eadffdeda79c7ea205cf9febead32d45c4bc","1c0cdb8dc619bc549c3e5020643e7cf7ae7940058e8c7e5aefa5871b6d86f44b","bed7b7ba0eb5a160b69af72814b4dde371968e40b6c5e73d3a9f7bee407d158c",{"version":"21e41a76098aa7a191028256e52a726baafd45a925ea5cf0222eb430c96c1d83","affectsGlobalScope":true},{"version":"35299ae4a62086698444a5aaee27fc7aa377c68cbb90b441c9ace246ffd05c97","affectsGlobalScope":true},{"version":"138fb588d26538783b78d1e3b2c2cc12d55840b97bf5e08bca7f7a174fbe2f17","affectsGlobalScope":true},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true},{"version":"4443e68b35f3332f753eacc66a04ac1d2053b8b035a0e0ac1d455392b5e243b3","affectsGlobalScope":true},{"version":"bc47685641087c015972a3f072480889f0d6c65515f12bd85222f49a98952ed7","affectsGlobalScope":true},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true},{"version":"93495ff27b8746f55d19fcbcdbaccc99fd95f19d057aed1bd2c0cafe1335fbf0","affectsGlobalScope":true},{"version":"6fc23bb8c3965964be8c597310a2878b53a0306edb71d4b5a4dfe760186bcc01","affectsGlobalScope":true},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true},{"version":"bb42a7797d996412ecdc5b2787720de477103a0b2e53058569069a0e2bae6c7e","affectsGlobalScope":true},{"version":"4738f2420687fd85629c9efb470793bb753709c2379e5f85bc1815d875ceadcd","affectsGlobalScope":true},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true},{"version":"9fc46429fbe091ac5ad2608c657201eb68b6f1b8341bd6d670047d32ed0a88fa","affectsGlobalScope":true},{"version":"61c37c1de663cf4171e1192466e52c7a382afa58da01b1dc75058f032ddf0839","affectsGlobalScope":true},{"version":"b541a838a13f9234aba650a825393ffc2292dc0fc87681a5d81ef0c96d281e7a","affectsGlobalScope":true},{"version":"e0275cd0e42990dc3a16f0b7c8bca3efe87f1c8ad404f80c6db1c7c0b828c59f","affectsGlobalScope":true},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true},{"version":"49ed889be54031e1044af0ad2c603d627b8bda8b50c1a68435fe85583901d072","affectsGlobalScope":true},{"version":"e93d098658ce4f0c8a0779e6cab91d0259efb88a318137f686ad76f8410ca270","affectsGlobalScope":true},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true},{"version":"bf14a426dbbf1022d11bd08d6b8e709a2e9d246f0c6c1032f3b2edb9a902adbe","affectsGlobalScope":true},{"version":"ec0104fee478075cb5171e5f4e3f23add8e02d845ae0165bfa3f1099241fa2aa","affectsGlobalScope":true},{"version":"2b72d528b2e2fe3c57889ca7baef5e13a56c957b946906d03767c642f386bbc3","affectsGlobalScope":true},{"version":"acae90d417bee324b1372813b5a00829d31c7eb670d299cd7f8f9a648ac05688","affectsGlobalScope":true},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true},{"version":"51e547984877a62227042850456de71a5c45e7fe86b7c975c6e68896c86fa23b","affectsGlobalScope":true},{"version":"62a4966981264d1f04c44eb0f4b5bdc3d81c1a54725608861e44755aa24ad6a5","affectsGlobalScope":true},{"version":"4fa6ed14e98aa80b91f61b9805c653ee82af3502dc21c9da5268d3857772ca05","affectsGlobalScope":true},{"version":"e6633e05da3ff36e6da2ec170d0d03ccf33de50ca4dc6f5aeecb572cedd162fb","affectsGlobalScope":true},{"version":"86a34c7a13de9cabc43161348f663624b56871ed80986e41d214932ddd8d6719","affectsGlobalScope":true},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true},{"version":"caccc56c72713969e1cfe5c3d44e5bab151544d9d2b373d7dbe5a1e4166652be","affectsGlobalScope":true},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true},{"version":"50d53ccd31f6667aff66e3d62adf948879a3a16f05d89882d1188084ee415bbc","affectsGlobalScope":true},{"version":"08a58483392df5fcc1db57d782e87734f77ae9eab42516028acbfe46f29a3ef7","affectsGlobalScope":true},{"version":"436aaf437562f276ec2ddbee2f2cdedac7664c1e4c1d2c36839ddd582eeb3d0a","affectsGlobalScope":true},{"version":"13f6e6380c78e15e140243dc4be2fa546c287c6d61f4729bc2dd7cf449605471","affectsGlobalScope":true},{"version":"4350e5922fecd4bedda2964d69c213a1436349d0b8d260dd902795f5b94dc74b","affectsGlobalScope":true},{"version":"d4b1d2c51d058fc21ec2629fff7a76249dec2e36e12960ea056e3ef89174080f","affectsGlobalScope":true},{"version":"33358442698bb565130f52ba79bfd3d4d484ac85fe33f3cb1759c54d18201393","affectsGlobalScope":true},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true},"0990a7576222f248f0a3b888adcb7389f957928ce2afb1cd5128169086ff4d29",{"version":"55461596dc873b866911ef4e640fae4c39da7ac1fbc7ef5e649cb2f2fb42c349","affectsGlobalScope":true},"8a8eb4ebffd85e589a1cc7c178e291626c359543403d58c9cd22b81fab5b1fb9","9ed09d4538e25fc79cefc5e7b5bfbae0464f06d2984f19da009f85d13656c211","b1bf87add0ccfb88472cd4c6013853d823a7efb791c10bb7a11679526be91eda",{"version":"0de73e448e607dec354286f002bee5f679808902c586313ecfd0d102a07ff19b","affectsGlobalScope":true},"cc69795d9954ee4ad57545b10c7bf1a7260d990231b1685c147ea71a6faa265c","54bd71c625e111b058159fc737c8f9a7170acfdb63cdb9a178558fb70e9fa9e9","1b61d259de5350f8b1e5db06290d31eaebebc6baafd5f79d314b5af9256d7153","57194e1f007f3f2cbef26fa299d4c6b21f4623a2eddc63dfeef79e38e187a36e","0f6666b58e9276ac3a38fdc80993d19208442d6027ab885580d93aec76b4ef00","05fd364b8ef02fb1e174fbac8b825bdb1e5a36a016997c8e421f5fab0a6da0a0","efc7d584a33fe3422847783d228f315c4cd1afe74bd7cf8e3f0e4c1125129fef","7394959e5a741b185456e1ef5d64599c36c60a323207450991e7a42e08911419","4967529644e391115ca5592184d4b63980569adf60ee685f968fd59ab1557188","5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","7180c03fd3cb6e22f911ce9ba0f8a7008b1a6ddbe88ccf16a9c8140ef9ac1686","25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","54cb85a47d760da1c13c00add10d26b5118280d44d58e6908d8e89abbd9d7725","3e4825171442666d31c845aeb47fcd34b62e14041bb353ae2b874285d78482aa","c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","a967bfe3ad4e62243eb604bf956101e4c740f5921277c60debaf325c1320bf88","e9775e97ac4877aebf963a0289c81abe76d1ec9a2a7778dbe637e5151f25c5f3","471e1da5a78350bc55ef8cef24eb3aca6174143c281b8b214ca2beda51f5e04a","cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","db3435f3525cd785bf21ec6769bf8da7e8a776be1a99e2e7efb5f244a2ef5fee","c3b170c45fc031db31f782e612adf7314b167e60439d304b49e704010e7bafe5","40383ebef22b943d503c6ce2cb2e060282936b952a01bea5f9f493d5fb487cc7","4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","3a84b7cb891141824bd00ef8a50b6a44596aded4075da937f180c90e362fe5f6","13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","33203609eba548914dc83ddf6cadbc0bcb6e8ef89f6d648ca0908ae887f9fcc5","0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","e53a3c2a9f624d90f24bf4588aacd223e7bec1b9d0d479b68d2f4a9e6011147f","339dc5265ee5ed92e536a93a04c4ebbc2128f45eeec6ed29f379e0085283542c","9f0a92164925aa37d4a5d9dd3e0134cff8177208dba55fd2310cd74beea40ee2","8bfdb79bf1a9d435ec48d9372dc93291161f152c0865b81fc0b2694aedb4578d","2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","d32275be3546f252e3ad33976caf8c5e842c09cb87d468cb40d5f4cf092d1acc","4a0c3504813a3289f7fb1115db13967c8e004aa8e4f8a9021b95285502221bd1",{"version":"a14ed46fa3f5ffc7a8336b497cd07b45c2084213aaca933a22443fcb2eef0d07","affectsGlobalScope":true},"cce1f5f86974c1e916ec4a8cab6eec9aa8e31e8148845bf07fbaa8e1d97b1a2c",{"version":"e2eb1ce13a9c0fa7ab62c63909d81973ef4b707292667c64f1e25e6e53fa7afa","affectsGlobalScope":true},"16d74fe4d8e183344d3beb15d48b123c5980ff32ff0cc8c3b96614ddcdf9b239","7b43160a49cf2c6082da0465876c4a0b164e160b81187caeb0a6ca7a281e85ba",{"version":"41fb2a1c108fbf46609ce5a451b7ec78eb9b5ada95fd5b94643e4b26397de0b3","affectsGlobalScope":true},"a40826e8476694e90da94aa008283a7de50d1dafd37beada623863f1901cb7fb",{"version":"a1d2988ad9d2aef7b9915a22b5e52c165c83a878f2851c35621409046bbe3c05","affectsGlobalScope":true},"bd3f5d05b6b5e4bfcea7739a45f3ffb4a7f4a3442ba7baf93e0200799285b8f1","4c775c2fccabf49483c03cd5e3673f87c1ffb6079d98e7b81089c3def79e29c6","8806ae97308ef26363bd7ec8071bca4d07fb575f905ee3d8a91aff226df6d618","af5bf1db6f1804fb0069039ae77a05d60133c77a2158d9635ea27b6bb2828a8f","b7fe70be794e13d1b7940e318b8770cd1fb3eced7707805318a2e3aaac2c3e9e",{"version":"2c71199d1fc83bf17636ad5bf63a945633406b7b94887612bba4ef027c662b3e","affectsGlobalScope":true},{"version":"7ae9dc7dbb58cd843065639707815df85c044babaa0947116f97bdb824d07204","affectsGlobalScope":true},"fe1fd6afdfe77976d4c702f3746c05fb05a7e566845c890e0e970fe9376d6a90","313a0b063f5188037db113509de1b934a0e286f14e9479af24fada241435e707","f1ace2d2f98429e007d017c7a445efad2aaebf8233135abdb2c88b8c0fef91ab","87ef1a23caa071b07157c72077fa42b86d30568f9dc9e31eed24d5d14fc30ba8","396a8939b5e177542bdf9b5262b4eee85d29851b2d57681fa9d7eae30e225830","21773f5ac69ddf5a05636ba1f50b5239f4f2d27e4420db147fc2f76a5ae598ac",{"version":"ea455cc68871b049bcecd9f56d4cf27b852d6dafd5e3b54468ca87cc11604e4d","affectsGlobalScope":true},"c07146dbbbd8b347241b5df250a51e48f2d7bef19b1e187b1a3f20c849988ff1","45b1053e691c5af9bfe85060a3e1542835f8d84a7e6e2e77ca305251eda0cb3c","0f05c06ff6196958d76b865ae17245b52d8fe01773626ac3c43214a2458ea7b7",{"version":"ae5507fc333d637dec9f37c6b3f4d423105421ea2820a64818de55db85214d66","affectsGlobalScope":true},{"version":"0666f4c99b8688c7be5956df8fecf5d1779d3b22f8f2a88258ae7072c7b6026f","affectsGlobalScope":true},"8abd0566d2854c4bd1c5e48e05df5c74927187f1541e6770001d9637ac41542e","54e854615c4eafbdd3fd7688bd02a3aafd0ccf0e87c98f79d3e9109f047ce6b8","d8dba11dc34d50cb4202de5effa9a1b296d7a2f4a029eec871f894bddfb6430d","8b71dd18e7e63b6f991b511a201fad7c3bf8d1e0dd98acb5e3d844f335a73634","01d8e1419c84affad359cc240b2b551fb9812b450b4d3d456b64cda8102d4f60","8221b00f271cf7f535a8eeec03b0f80f0929c7a16116e2d2df089b41066de69b","269929a24b2816343a178008ac9ae9248304d92a8ba8e233055e0ed6dbe6ef71","93452d394fdd1dc551ec62f5042366f011a00d342d36d50793b3529bfc9bd633","7424817d5eb498771e6d1808d726ec38f75d2eaf3fa359edd5c0c540c52725c1","9a9634296cca836c3308923ba7aa094fa6ed76bb1e366d8ddcf5c65888ab1024",{"version":"bddce945d552a963c9733db106b17a25474eefcab7fc990157a2134ef55d4954","affectsGlobalScope":true},{"version":"7052b7b0c3829df3b4985bab2fd74531074b4835d5a7b263b75c82f0916ad62f","affectsGlobalScope":true},"aa34c3aa493d1c699601027c441b9664547c3024f9dbab1639df7701d63d18fa","4b55240c2a03b2c71e98a7fc528b16136faa762211c92e781a01c37821915ea6","7c651f8dce91a927ab62925e73f190763574c46098f2b11fb8ddc1b147a6709a","7440ab60f4cb031812940cc38166b8bb6fbf2540cfe599f87c41c08011f0c1df",{"version":"94c086dff8dbc5998749326bc69b520e8e4273fb5b7b58b50e0210e0885dfcde","affectsGlobalScope":true},{"version":"f5b5dc128973498b75f52b1b8c2d5f8629869104899733ae485100c2309b4c12","affectsGlobalScope":true},"ebe5facd12fd7745cda5f4bc3319f91fb29dc1f96e57e9c6f8b260a7cc5b67ee","79bad8541d5779c85e82a9fb119c1fe06af77a71cc40f869d62ad379473d4b75","37dc027f781c75f0f546e329cfac7cf92a6b289f42458f47a9adc25e516b6839",{"version":"629d20681ca284d9e38c0a019f647108f5fe02f9c59ac164d56f5694fc3faf4d","affectsGlobalScope":true},"e7dbf5716d76846c7522e910896c5747b6df1abd538fee8f5291bdc843461795",{"version":"ab9b9a36e5284fd8d3bf2f7d5fcbc60052f25f27e4d20954782099282c60d23e","affectsGlobalScope":true},"b510d0a18e3db42ac9765d26711083ec1e8b4e21caaca6dc4d25ae6e8623f447","30a1b56068b3820c91a055425a6af2294f8ef2bb10a59dcda413f6437093620d","7ac7ef12f7ece6464d83d2d56fea727260fb954fdd51a967e94f97b8595b714b","db6d2d9daad8a6d83f281af12ce4355a20b9a3e71b82b9f57cddcca0a8964a96","0f7b4c2c48436006fc94df653f6432e095da3131cf321a513ea68ec9571b0711","db44a9cf9f31a941eecd1d17f24183b4969e82689d6aa1d9ed35b6e2d0508f1d","dbe7db9a8a34bb2538505d52d7c24e3ea7cecb751a0b43347a4a9e1f5ae1aa5c","39a3fc61a65aee8c90cd81bb2c9b508be6c5cc745cd40eaed95954a07c11bb82","0f257b598bd4f895200b1fd51d1b2ae19d919b2ba67f8e607c97d90917d41e28","3150ee51540bdf0d4e0ccb05de6f905962dc3505bd28b7385c6924f7d9eeba11","2302818e3723d16f85c3d75de67247a1bacc23f5399b8235fde025737a6cc5b8","8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881","6b54d9dc8b614a8112eeea74a5cfc3a6d45e67007d2da94ec96cbcec1bfe6c06","98e00fba67d4b527de2929778f96c7f9453fbbb8c50968ff096dddd29057450b","9f6caa8495de09a303e6290a3ee15650dbcc75af637449b8fc249ca2d2094004","139c4f4b86b2f19fb58ad7043d68032729ae50dc0fad52825e0466becd9c79eb","bdb623139ccff120e0991a3c533cd119762060dfa231d7635f32a86a08964953","a9fce023afbedf58e7c9f0ef02369dc383da4a88fea20c28a914fa3ca766f9cb","22082ac39501b626f8b4322d6bd6fb0424de438777b141f663286cf8bd048398","5b91caf2fc71c4d9bff1d7ed098324b8e02b4bd35de3467725500ffb9a413ee9","cfe1714064aa842b413125bb353c4625ce313fb0318f84e1015ad74c8f1c91f3","61716ffc5c1011548c0691798dbf9e5f4bebebddc3b7da3b83e93615c7cbb265","85cc7ba47f064d73b53d98e5384dad6e88809b8c0ecbf155846203d8736e99bb","be5dfb4c5c1bdfb0d853370c0de9a995cb39eef0f277d645a7f43caaea423d18","58902668adae2e5eb67efbccb4048afa02308fa684f1a4e4c7d47668ecf58c1b","4be84d7e81af25a039e6c30f6defd188b9bc06573ea98e3f2aa5ce4057d75e10","11206290b4d52fa4a2ce697aef740ebb4514c58ac73a7c792e5b241b24d03c1b","837acd3f64bcd556da76827c292e82ad812170d880a490a7deb3f2de0ffa7c9a","5e19d1888ba7d67fa01640154e32378896a8f3198cb227035afef565dd7e1588","17937316a2f7f362dd6375251a9ce9e4960cfdc0aa7ba6cbd00656f7ab92334b","575bc12d93a33c09e803375cd99a77f50c9272d01abe26d5de27af637c7427a3","39a9af32c7cfa9f1f96c5c8599b3e0ff5285edb41247272880aefe0daee5a43a","9b9a846c90d84dce215990a86a8b5ee7ad24ed7bac50d20d095de5d5627b212f","79832350f1a38cab037218ccbc04d5425b0d2cd330bc821db216f3e813457127","11bf67658477b5f9cf859f106e39be5ee8c5f5f63126bb839aedc9c559433e52","cc0edde838d15c6d272b7b610caf73803efc4e5974ab2079a22beb7b5f27f646","6e5f5cee603d67ee1ba6120815497909b73399842254fc1e77a0d5cdc51d8c9c","f6404e7837b96da3ea4d38c4f1a3812c96c9dcdf264e93d5bdb199f983a3ef4b","1522479a2030ec866313d58f524bc725b7725dbaa49de13eadcc147bf1e89b2f","1d5b8dfb36cd7234b297aeb66435f37ddb7579b1ef5e94a13e195d51b09c92cd","ba494d7138817c9f7191ac268846ed843712df6826e82f19a204e9c7679c2c6c","8fae4fda317704c959727cfc9036cfebdfce4c5861a28d95d11608c16281ebe0","14673a2f4d79e0ddcdbe69e5dce548930f0fe31cd59558b0b764340eae2bc3be","2c94dc2a39a7992b055d9c9d15c82a81a80b0f93c8c9ff2b69ea84c4337ce83a","de272271e31c1c401a7d2b94fe45fe8bff508d4208a58b7c75a492b2eebcb5a3","5cab8fa167ee711e4dfcd22ed632c60be36bd49dc6eea8cfdd3613c59d00c43d",{"version":"2b5066ef922ddf619ada31b6ea182b1e2b0e948037622a9e638c8f17dd3836ac","affectsGlobalScope":true},"04a29c45b12f113812c7dcebdc2e8558f0775c70d35042f93616300b6b3550ec","00357bb70a10782936bbfdf7c87ad632e5c2694b6714224ea0995299db1885ed","2766dee26ea113e9b491b7842cb44df57c4d79b17057b42607e09fc174bd411d","cb4047ce260c2f4585b2d592d04a1d9a9c2a1ba32679a688523ec314a977989a","0511c61c22d677da1b6bab4d3844aead1d7e27028d2f0ed1ed315e0860ed5357",{"version":"b4610d904ab939109aa8bcee6f795de8da780b6b4a4d8ff2ff9d2e3b699f55b7","affectsGlobalScope":true},{"version":"8b20e6ed022d1615533cacba5ff84521a86e86e98ef79318415235d64858a0e9","affectsGlobalScope":true},{"version":"9d74eeaed76fa9a15e04fd3797062148b70f069712287bf612e9615edb8b2c7d","affectsGlobalScope":true},"9d8afb814ba99a7492e0144a54bfe392be64b0b374079c72e2e3f0fd3fed93c4","63310b45c497d313cd4e473e5c2d9163f71df0462460cf675907b66af92a2680","06dfd2ebf571b3df2cc23a70f031417eb77f7702f0ce727cec99a296242d6929","65c24a8baa2cca1de069a0ba9fba82a173690f52d7e2d0f1f7542d59d5eb4db0","b7fff2d004c5879cae335db8f954eb1d61242d9f2d28515e67902032723caeab","8303df69e9d100e3df8f2d67ec77348cb6494dc406356fdd9b56e61aa7c3c758","8de50542d92f9ac659c30ead0a97e9c107dd3404a3b4fd4bf3504589a026221a","4545c1a1ceca170d5d83452dd7c4994644c35cf676a671412601689d9a62da35","7e3327a4bd457a8949d15cc317b76fc394732519b09facac6836a726b58f277e","a2d648d333cf67b9aeac5d81a1a379d563a8ffa91ddd61c6179f68de724260ff","c3a905a7fa93ca648349e934fb19356cf7b40e48d65658de3e0c77d67696fd40","a3f41ed1b4f2fc3049394b945a68ae4fdefd49fa1739c32f149d32c0545d67f5","c2489c80994d62e5b51370a6f02f537db4c37af5f914fcb5b2755b81f1906cae","47699512e6d8bebf7be488182427189f999affe3addc1c87c882d36b7f2d0b0e","b24b3b6eb34fa0375274f5d294091d5ab4cf822e117bca371acb55a7a6a132aa","42c686ce08bf5576ed178f4a6a62d1b580d941334fb53bdff7054e0980f2dc75","a7bd5c1cfbac493102a53624e92076c14caaeb18dd9c5d15a3965792042c942c","cdf21eee8007e339b1b9945abf4a7b44930b1d695cc528459e68a3adc39a622e","1d079c37fa53e3c21ed3fa214a27507bda9991f2a41458705b19ed8c2b61173d","26a451bf3a5f87ebaaa7694c5b664c3d9cec296f3fa8b797b872aee0f302b3a0","5835a6e0d7cd2738e56b671af0e561e7c1b4fb77751383672f4b009f4e161d70","c0eeaaa67c85c3bb6c52b629ebbfd3b2292dc67e8c0ffda2fc6cd2f78dc471e6","4b7f74b772140395e7af67c4841be1ab867c11b3b82a51b1aeb692822b76c872",{"version":"b57b61d9a3f3e4243d1bc307a14f7e678057a86710f2c30ec0cd254a55f36948","affectsGlobalScope":true},{"version":"4303e97019b0af715ba7bc53f45ce9eeafb0c46ccb216500d2b0de203ffdf818","affectsGlobalScope":true},"9c00f78ac4e60d1c34d0fb415df6b2fea5f6eea200076dff4d782256a4c2802d","79d056984a8964d3917c7587067447d7565d9da696fcf6ecaa5e8437a214f04e","9269d492817e359123ac64c8205e5d05dab63d71a3a7a229e68b5d9a0e8150bf",{"version":"1b9f6a2444025a7ec4e81829fcfbd6fa577c761c73d35a69ab10f82be37e1f50","signature":"38f4ea3f6bb3761b50b9fc2a0e2ee0083557aaced9a3436baf71bbef092f05ed"},{"version":"73958cc542b12acce174bf1f746e596f4c24bcf6e9b84af80809ad6e2c4e4c98","signature":"a247001355e6d5ab80ef4cb22fd4ae23bee8bd19dcf9950c6b0105886e0de7f7"},{"version":"f4a42c7c4e9a524ddeb5b5677e1e6ef91d0a2fd87e40a2a8e038732dbe6432e4","signature":"92e2c6492ca0074585d9c17def21ab4b8ba4f3aae88c31f02fd8df0401eda5ac"},"52cddb17b9ef7f8ce601d6d7d8d78ad67db773d6d8bf1b9fbbb619291a4e0a6d","6f8c3899cfff19de41c9ce664f5706aa87be5ef065d7588e47d7b45c16533b61",{"version":"46117ad906cb34049acee1418ed6950ee28ea731436a03db2d939eb7fbf79e37","signature":"cf6a7511aba050d3e2433d1f45d793cb61c5f79e40b9f4f2ccc297caa4266b87"},{"version":"25a423696efa9e3ce8822b4fbf537008bc1cf13a9000e3781fcfa7985150bbdd","signature":"9d59432d9e89c9b9cf1cb6b660c7d1a474d65e180e0ddfd5d9a9959ca4ebf454"},{"version":"e195f764d445051afd806a17b34a7549ab40430c46e468e2620a7794be80dbe9","signature":"50d55061c0cd4974f453abea0e1a9f0be318323f7c225e725ff784f510f1da73"},{"version":"8d24aa4c49de2039cb06fee5aa651784b660a88547a42cc07a7e699503a79d6d","signature":"d4c221f551431cc2d7a211d248cf166ff688182f36d6c6208d46939723ce252a"},{"version":"3eb988013ebef9cce8cc6888b404f241a512a157a6ee62b552cdcc28496f642e","signature":"f5e585a32f802c35ea2743e69e244c583e930a208ddd021417e411e10797f77b"},"e445925e0fd83eb686ed51fb51938e41a1989c972c2b987a04d258b2af504861","1a726b2c0314984bab9e7382180edc5f872319b4e3d5c6aff08d110879a09f48","be8e983df34b389c930466fb29ad63fc3ead5c329a0858ea7c0243de191a2d72","63634c0855e639ea7f609613d799bbb0dc774ec9f3242bc272c5567dc5ccd485","b1ab57574d7e456b1e6b54fc9d130e49c491c66b74aa4bf59541b11f3d93a592","fab164d6d6ed0a34f26ea0df13452cd1f32eaf2c91edf0d1e9ffb42e2effdeae","f92d63831e5b8ad4363867601c7391199a62c9c15e6a0d8b6495d3050b9cf056","17fd55c3a4308d80ebeeeae1ee0e6d00a774529f9e8d1bcd1ff36af7b2d0c22b","89c66198a7db1a95a5a1120573334d9963eed7678e51b6b84eee0e0ae612c5f6","7e7f1c8a81e97afd21ffbbed1d06139bd0070059f1073a6067b668d31d6b317d","12add8b9d557be5e629d76ab6ec73ecc4ea2e0c77df1c47ec1da89cab2be5dbd","e78dc861b240b78ecfd349c43e29ca4c4e85ac024d6734e97f65f1f84a4c4d65","cb14ca1f254df0344f717d3e5a832736377410cfd786a0ba59aba8e76849197d","f5742eccfdeaa904e6e7618b9cacb5b4669465718fcb10cb45d0cd071fc0ec84","e54fbc8f58130c95e75dc512fccd01d3df18ab6db1f1075f5210e084590b2961","1a2108b91af6f1ca36724cc5bd6938a654fff4810edcab5663ad952b677862fb","a69bf85101e61d32dbeb1d9bfe8f9f733494af634df01d3c1bc54c6649d928d9","d364c8df7d52199f5d011b4ded96f36dd114b984f5ee2e50ffe7d30ac1ab4bba","408f9eb3c7a3533bf5f07e0cde110a5ee0702864795ee6727792520fe60320b6","ba79eb15c36ff23e352ef608ceb7f9f0f278b15ad42512c05eedbe78f228e0e4","4cd233c6af471432253a67ae4f3b43c85e58a71418d98c3e162a1dac975c68f6","aa77c7d8ddc961e8192bcaa92da140e1205f8aee78bfadead5f52b8844d7d05c","37e37d3a525a207efab5458069fd9a27a174d2dc3af729702c81729ca03a349f","ddef65bbdcd582d09098e5a1d30713f3fcd11536538ac3fb31bc106c7b27e294","c81fcbffcc0fedc1d13e75cb0a6f897b86e8b96fcf9e82dce3d597af8fc28fc9","cbfb793a9680617b82860537015a75b09778b3f053587c1e4939374bf1aabd1c","986d9d14073c312cfe0f6556ebb9c9e3973a1f3a443443d5a6c72a2146341cdb","bf200fe45efe9cd57629ef5830b46d44da8cd18a2fea52c912c5fa68b4e40d34","98b5c8cd3b3058fa7eacb61ee41c7af5a1bbdde7f634ef51157eba52fcce1007","4188d80d82cb442136602e2d7ed403954254d7ac78419a3f897014e647a3ee38","24f42f023351f47fd42bff379bdf6e71f0d535a4c35c64748ccee1d9b6946879","31e3f643eaccf4dd54b857b40668cc30616dc8b085bcb3459054de42bd921427","baa65ce30f54ea93e02f9645fb0b53f9ac2da8010bb05b0a642b44ad9f0ff034","0b9c5f5d0b1e847f8cb7b3dcc64aea20b44859b4c9fb45ec687d25194db6564c","b12e5d36f173977850819d560d919f4a98cf4a47e0aacb222ea823c486a303c8","9d8b3e23e9ed0e53f4abea14aee4afca9fc742ed228c4dd68873bf965e443f25","2d15a09f35152f87d8ff6a37eeda01fe2374dcb87cd517b3253241cd4734c7f6","6efbdc401bdd68c7ce653e3c4eb6383f981283680477c8ddc729d6539ebd9876","b166e33cf8226ac8781899da244397e77e5b6528271339ce26ece0c2c7242d7f","a623d5cf7925e72dbf4602862499564389c7c3dc0ce049733cc0ec756a846667","36937caeca5fa1cf0156ceaf2adf79314e9e56562e2bbc10e959841cc814f44b","63634c0855e639ea7f609613d799bbb0dc774ec9f3242bc272c5567dc5ccd485","592f06c425ab27b4bafec624ef5b153cbdde9ac58f7113100a2da1c4309d1309","19c8ab51b4b07c529d95cd4d5c8d100a68dca247ec83a5097d35106fd8a7acca","bec1d0ac62cee9b4d1ea8b64c4798c59c1726668b76d06b68a206e0cb0ac76a6","fb4f06b2af9ee4b2d2be8c964b0a8f6dd260be9048488ffcf04eb5c0fcb8bf61","f185055f36d76e2df5eeb87ae1148a25a125be2bff2095e1bd39c1c7ce85a640","948a56ec8bfbbf20ad2496f49f451cfeb878cfcd6156032c0769b603f3ed8f18","979fdebc12d30becce6a15e68d99bc8a2a470a8dcf0898ac9e2d241a7e531940","83021ba252c1386af9eb279d277f94159588195c9bcc540a63c28b6945ebd33c","989e9060e220ff86025044ba3c867a83512a655b7cf6253b2bd682192debf390","8b1feb568c859feb59236e9723b7a86e2ff8f9a8f2012366ffd1798164dc2798","8fab988b0129e674afc0bc0e95329b4052cf027f5d5b5b3e6e92d055b5ba88ef","4fe56d524ab24c225668803c1792945053e648b4e8fa4e50fa35594495b56732","2652931b8f7dca9a57f21aeb25b5d46851dcf17e4d5ed54b9b57d5d26e647680","d364c8df7d52199f5d011b4ded96f36dd114b984f5ee2e50ffe7d30ac1ab4bba","408f9eb3c7a3533bf5f07e0cde110a5ee0702864795ee6727792520fe60320b6","ba79eb15c36ff23e352ef608ceb7f9f0f278b15ad42512c05eedbe78f228e0e4","4cd233c6af471432253a67ae4f3b43c85e58a71418d98c3e162a1dac975c68f6","aa77c7d8ddc961e8192bcaa92da140e1205f8aee78bfadead5f52b8844d7d05c","37e37d3a525a207efab5458069fd9a27a174d2dc3af729702c81729ca03a349f","742e55d7322d66692787e297aefb5a858f416a56ffc8d257ae5175cc86458eb8","e34b123b5031f7625e989c64cbaffa0e83b4f24c5b828bdbcad8e4c62730d9cb","9ab8c44cbab7968bae65355272ab10a2a999da0e93c6266d8b08d75ff7875717","48c022acf7a664fc81a3296858f08e2f70fdd57404f2ccc88bb951dc94311939","007dfb1f314277f6e211fec9c5f62fd182e3bb76f1fe1f165228a259ae0b91b8","a6aa3bd9c165acb07db158897587581d7b081ce4271579b720a94f95c8c487d5","904714e49891cc1e136cf104f4bc9adfc846be9bd28ac55e101145a0d8103b30","77707cc46b38d100d13da0590946d3842dc6c9499b01d379d1ada2d6068038d3","de1658bb847172b0af0ae080174513af21425364af9603d043482d492aef3186","5cb565ef9a1ddb3c31dc9d0b69320b926e4bbd6cd217f756ea011ec18b178054","504ffacc3312189dad74385206715390bd98e424aff384f67b21331bd16cf7e3","d59a6f62f52d41368b371ff1dcdacef0fbc0cc1cf723acec3a2d303d4b2a7bb9","f5861a6a8acf7e0415a30f9ce7151110206a412f849ca3a343b2f19db12f08e4","b9c9c9352d6606fe440735ccad134563017fc5aff8dcd418c58f778437339f06","2e9b01f21026b5dccee99a96822d66784c712c8d6d0b704b1d3f941fb3f50159","dfd69062a5fedfb37361f0da33d5f98e23f0b466ba49ba3694b4be3258a07e01","f2dbfdd571390ea0d58d73553c0dcfd0c65cd5de305a68774066d17854c67714","e63f55425a3f2daae4bfb52acb692d71c09ca6f3adeeddd18755bad6cfc92bde","d0c159d304bf4fa619aef88442903507033f2828e71444247a54092806314143","164347927b2eaad7dafa01c4268c6884802a690a4dddabcde24226aa152b49df","2e0bf302697c27360a0e02489e4086149eba7e6e1d292140d9fcec0fa7d1c130","48ff4dab14889a41f5b0b94aacb853b96f8778888167625a42ba7a45250a15b7","fb91c18b518f80275dd38a88987e27af901f5466ba5e10f8ae97c855cae5686b","77bdbaa60f9c09cacefc2b4d66a4947b338d26445f4e6f44ce99c393f5afa66a","9d6eb5b6a83fb13e39cf0dc367bd2c93d5b3e9151d6f0c658272bc6f8637bc48","6b7de806897d8442574ecf803ce30853158684b55569ae3e6be1c1b9267069d8","fdf5f54d0094325e7d6ec70ad24811c3f46e3816c4c839a3674085267865b951","40273b09b5738abd52321b86f426893ef84f9da766f2206207c4d9bd6c5b7f35","11a2fc001a1001badd5299db7b34f4abb97de1f42d9acdba386e54d36125d8cc","a3c31ebd8cf594b895fb29574920a0b7e14d66efc41dfe1bb5ad5314a23a565a","ddc39b9c961b8f60e24ffd5b5d2694aeb3a22ab919d759af9edd99f348119ceb","f4377e81d50af3f689cc5dd2005be3b79dfbbcb3f5a0301c843e8daf1cc9ddda","e2ef2006aa0a9b806063cb510989bafad85e71f21cd7e25783b8876203594dc7","67b359bc54fd9ab018ddda5811b1a1371da9f2ed5ed4bcda3ee4710c34a3a170","0f9bfdd25e2e13e6adf81d98a2909fe1a7ade6cdcd380bc7c9a259effaf3c295","aee3294985929388ce1df1149772c2c52400701f98fd61494391f157ae629e77","f26ba893d9cda649365c19c9929d53ba069d829caa98dea1ad3c90374704cf54","b671aba1c5ebdc31185c56a733d0766af92027a0c02b783eaac7cf0f68aae40f","52365986f0e040b736ea703bd39392172b0eb7062467362e2ecba42bc690703e","45838ed95cd44a5c26676b86701e25b5b9476ac4dd8e409ffb2c5c2d914d3415","3b779284bd374b128d63e3683e277f1213a02c3db376ce9a6e799915dae0ba8a","0d7db9b74a017be10aa36509dd2ae4499260381aabc6772feef677fa16f3a1f4","e59ef219cec3c3faab54d5cb12222a04d3e095c84abf94088920c1584832ce43","262a347fdadbfb51267a6a63093a35f2239e3fb8ddfd1cb9bfcb64e966fa15a4","99ea681335aa97ba7618ac3db69a2e2da87da7faf8a39f822030ec4db96ca023","d7169a2b449d5b8e309edd84624649d04b746be48fe93b2e69bb7a85653b1e97","1bdf28ec59ec9b10a947ea6ccd8413bb4bada0497d0fdf1f6c02efc29e143fd3","d5442a1d527f1068e221e7dde37d15b71f792aea7d79929f61dba9c22dbed20c","665222ab0b8547fa189b3b4bef8598ca271e552339f871fcd4d7e86f979b8145","d72479ce8210c21451cadef350179fbf3729c0e29005aca2d7e0c6ad031a4afa","d0e0354d3d4ac41cb7a67c10ca59652f8cba9eeb0929fcc878e492691f73d02a","8b7e0ff30162a768576a794a0c578f956532bc7218760973ec60f0f224b4bfa0","2748451f1cb5d1594fec48577685ef0cdefea02fea292873b9ab74aa47ff57ad","7d2a91972cf0b99c270664c74021d9533b1f229719e0e5b3939d5430eaa976a1","7a2a5bd1aa0e02669fd92be8fb0dfbc8d9f53e663e737b649a35b598ac966a44","51da4ebc5fa566e81460e1dbdb0438ac591745bc960921d6188133df610aa131","72bfff3c2e5d04586176ce37855637826e76b8b4422cbb842740b1d49a138432","d7aeffb82f803488ad4f918929a3a980e387c64c395ea793f6167c9704d4502a","e90c29fa1237855da188129b9de446585fe8a94fea12e6bd6625217f95c11787","887a73b0167b36d4aed6d2549b19c4bcc6f2f50248b20d4d10ee2a10ef0516e8","132f4ccc0951ab3674c802cb9cb1c37ef4d4a5b76cb4cd9a11b1acf83debe2a8","3e0e8e0746be5d4383bdb76c1839c9c9fcc3eba9a46faefba6d7f7f02a03232f","62c9a85d5dc9da38e54f1d802b7b62b82170f3a4571e3c992f1db09f60dce051","1c7dde9d6e45e71504fd8ba6a9c29db164e7a8040bc1782c2a80a3098d0a86c8","cba008b7f9f3e3d610f95b7eb3dcd664a4b8786bd7c5cf48530e6acd036ec501","88889dde7bcd0833596ea0a498a83a187c3380b57d230b4631e5ce61c0a5df9c","0257c8563f1f13040c4f1980b79a51a9d7046dd60c5aa7bd52a7967a1597d88c","639e7fd024205c3c4af58bb193c1d7790618fcb8b70e9b15068c647ab729ee3a","16481071673dfbc333ef3e49e950b734f9f2b2a7febb9de0ab12afa818508cd4","8d739a4a3b3afb1809d4169313943c4ea1bdbaca81e2a9090668977bb576c399","b088128c5d4dfb1f631748cd1bfcb851a4353c6194a0987d4045ba8ca21d529f","e6f70e3c94d2b1d7c5112ad6df2dd7c2ae5dc81bc89510bbdd4478614cf80594","146e5c86d78b4a7ff6dcaf9835b3a6a639dd414d21a30c69df5183bca5596d15","9362f50c1b8f6afb0031b258ed78e395b4bef9ba9095906e0b8003f3df459f03","6806a8f9b9262f3383ee54ea3afc3758fa42bac784508ebe23944b5f95d21d1b","115095bea9eb2f83b95587b6003244f42ea9fba1441db7ed729a84871ee06b67","b997d28f044c3f26fcd64e042d0ecb79ba5437a97ebf4bbfb78bfc76b1a7913a","074dfa13329b8c107529dfd958cb10167b4a048babfdf34db11f5fd36b5c319d","86d05775f017d31d49a91a447b80e8fafe8b712e733b2f0f4dbb6e6227a7cc93","38ea47f31a7f49087f0c46e10efc1ca61fd0ea64f952d5f1fb6abf78066b917e","b246af56600189dc59e32fba96ae116c59ce2246f814a75c3777091d2ae10abd","1b4f81a0a3b12ac745cfa0b4f7284d1598b3bf77f0e4055f4bccde31fd271f1c","1a176b3032ec0fab791c658844c3c1d3df8fbe985b194858c8b31d736781942a","e8957ac616d196b7b30ec28059ea6975a83bdc8c36a576357bb7e268b335e15c","8f237a7e4a784207960e92ec924fb6036703bbf1867f3eda5ad175d50b312a2c","50f7d8a7c9bee0c81923182be8f929ffd96ef0e7efe38e2dc06baee15a2f844f","8dca0dfcdcc95af084dec1ab5c33ae65df4d4c548c88dd191d24b17c2b2ffd7c","a582c8844a6809984a681db3997068d5d8144bee3f889c5240c559c5502c165a","e0494aecf0482850786831665c0f976125882c17084022efc6f8a51443b3a7f4","ede7ecc62da0236596749292448b282d9c5e846c95e107d6e87720204b792250","557981373fbd676739d62fb4aa7b601a639bfb39f7b563ab2c9a2350aa5d7298","078045f76bc547eeae562dde79c81e2565be6fecbdbbc4bfbd03fd16cfcad523","04783d0830346173973d5283d10b91fd7d6c1c0aaacd93a95455ddedaac4fc0d","114bcf10cd1c7a7769b2f8a762e4c8ae10ff07502cb28ad983ba2ea36e645198","68fb5ab416f7ac79a990387119ccce0c652139011d570a7d420274fd9d74dd3b","131906682a56016d19849546fc5f9e0076b4e35bc2c5af362d79a50998215d4d","05b2d05d9566a3454c37340c68041dce2604b7917ae6bdde8c41348a586c2e2d","66fcc787347fef5504b967524f90d09466bd32a0fe2624b5d6531ddce58191f5","fa2d827d435777dbfc4a41a70d836b6a401bea8f77903cc22f939425f9da0b8b","8a59602dc83ec951feaf5cb7125393d3ebe38914c921e07ca0383a63857435d8","3264f10b7d24238299f6f5c28810ff5ef9fea2fafec3268729825a32c6be4217","6f2a826f77810913e18a6a5ac87e5783f600961d4d7bc20315db13f69e2280de","14e3d141c66a44d32beff51678ba0abd236e18c520b12678a73936e78955cae2","bcc4218ae8d2f99608412f5917a663c7c764da0dd63be12d01ec49bf0148fe70","4136928c1cc5825cd17ecce5ae4a1671cf0047679e452d4886cfb33e74fed5c7","1f46af1889b1e14ebc8b3cac43d6f039ddb811dce35567aa71508ec18544fb84","546b944e81166843668e7b7a1153ccd1e565834ffc29e1df38aa6d26de9e1c81","94b865af737ccbd7d7597998b99700df0e2c66e79bfdfb52db24e80067e8de31","12cce61b40e5eac404ca2086f5460f18c7450c715c4a93c5964a8be14131f5a0","d71b9ed4f3606256e4c00424a4b3d34949f13efb7e0ad6ff190e1e5af21ea617","f5dcef5516ecd8836256359ed4b9c6bb8c73fcce697d1c343b11ee8e7fd15a8a","e55a68bbc963c9520f0492892d642fa145d34a351d483cd144a11e3346c18cfb","da14f80dc904a20fe5a98009f117d8f977ad6d50fdab685e75d6b38322ea56cb","ca90e5e191954b9b8c43ed5d5bc787107c071315c4acaae515e7d918e8814e15","8ef0c5c7cba59cbccd0ac5e17ec42dc4a8250cd267f9cdb08a4dcb1a099068ad","63ed74c721b55f614bef2b233b03c7e56377b0e38ea16f1dc3fc57a06ce2ca8e","57b3caa3ba40034d9b19cfc8f24259745b58d7f50d091b5b7dfd6f4e820e5399","fa38196f1b83a928d4ecb8a22c01a6695cbb0e4b200fbc2900d9fd25ff30a604","1f142b1a6a8b7b29da43a88c8a5f6bbad28f7cf1b67457596ab6d71bed584e8a","64191887cce455c7a33e6aedb861f133a5ee37d7b3539cc865893a442150ebdb","7850b6277b735a81331a1b37b5f638cc279fb6a3c11f2fb65c4441a162d53630","9193e4633f26850ad7dd55b3575043e0b7de6dd91bed552b48343df389728101","86a32c16539e2f8d7f3e78ddd17af62b30b3ae6bdcc4458bd1a0042e48c26c04","6e5c043e2848b98d5bf4409b2554139e92c1d0b986dae41815a3ec1f35da3251","d0952846062dee6ccee5bd9039c44fc97ca64ac088a7bf1ca4bac3466acb148d","2551f07cc76e42872cef2981cd36a7ccc3965b15f2e6029fb31ec96218a63444","eb792bd583bbeaec79db15076f10d825e5f2730b54cce32bad98d6353be5100e","0242617a0ca16cdfa6fcbbfd1d2ebbc2de1a674a0dd534cac88b04ef6b1d9fc4","458b06caf4fe713468ab73f26b21d201d2f31fd6dcd86fe3af6da656e003b92f","498b8e59b7659c0ce11ce3323bd0d23c923e21c7290e5bd96ce0f3ca639fb4fe","740bf9b794f8fcecb6c3761598372f16a7835dddb4c163a21ae0c7f472dc6bd3","918c7a2e80f564d465106d86db514172fff4134b589802117631c14fe43b4fe2","bafb601434c3a7dc64809b0595981fefac316eea3bd9038b86b8e41e477165e4","558e5d5e8359f47f7750db037105de483b58ac8b2e6a53a4905e200d6d662426","3f2a3b143fafe71c581c13fc479dba5b0b7ff34993f87b9085d87575b53fc993","34ac5aa0d11f8ac4835f6d8cca884df256cd8d73ebe880e79b607e8ef4ef4563","f597800b0301f41012f08c23f280e9c91e33bcad06aa965f1a03188f787d8496","9f44df038333fc49052df3cd802f6fbd782bc65c6b4825d00dd73795dab6500a","2e8f406c1cffabb8065455866e5a0495e970fbb2bf05aab9d8dd46eeb0493786","8660f41f506714e20894d7591cc3637ff9104c53d0b4ef5c8c5eb0607ee0f87d","96ed49a92edb4ab4c83086b753baecd347b6c7d3dce85fbb587e9df199c85cab","981af6a24b8e1531dd933ff6df096a7a50dfd79f24c5e5be1134b684465a807d","d3b51ab522194f5ffd145f57fc2b2017e35d11593a8a5468fd3da7767dba0d57","6ca526ca04837783abfee27810a8da8d1d3064ca7a05ddb1c887f6c99ccd528a","b0bdd8c96fd293bd615f6278679edebf2c34c28083c3dd0e3e0a86338502bc75","f68fc1dd8a1adff66bade5f44396d2d6b1d60737512424c26757f51df7c4fe4d","d34648e4d5c8ccbcb2f5ccb5fa039e3be364ec95b0ef3a3750891e204c4bc3cf","367ef08f1d0de5ec4d4786cb8a1b8a17abf395bb0c5f8d151ec10fb66a2ce50e","d103aea8af49efb04acc350e0626e262ad4ec1fad25a2bfc401bbec0b54be98d","0abeb52bb15cf5b15037235020c43a59ab3208e2d360069716c95d9978564512","c1ce25385855348b959eec1cd4a7e23da82cfec28dfb7ea2e05ac179552a7c8f","4ea2003d86a9c68928ef069ce548c3e6ae35cbcb34184a71f1c566dde2160cf8","c60b2c6f796dfd4cee580e3f2aeaeead73228c8ed845c7000c0f58e3d13838a9","9c31089b886aecf8da26d3303fa880b9cb054b97825f92d82eb9a887e1e701a8","a2be28a0c474dbeb1cc28f2e6bf694624fabab89666765f6eef28304ff0da850","d634f163e9656e77ee3d7cc951ae008b18ee52f19e4f5ebfd3ea9af944a0d439","1ca0e4b260964b7823bbfb853de6b034358bb8255b26ddedd4b0d4c465c8d879","b8cdf49676dc1daa92c941bb2a369e83c44f269cb2569a033c824ed28b4629ff","d32021e805cf7d44e3b616acf4a4be17c4f7304f7460dd6790251b7713bb2661","2b881659708008e1c27269e1eb8dc476af0c2ab2f1fbf50f6e5f8cb6758d8b1f","efa8e58b059d69896c0e77df50a8fa97469e31b404265925d1685aab21093a12","93cab5cc3670661df372b8570dbd4da8885e18d10601e293a4d483dfbf57c2ce","0458207418024b0dc2ba21237624a667aefa5dc5d2a6dcca8412ca0f034acf84","6ebac5cb257a168e095ae88b552cfa0fd795f7dc62068ab27baf7fcabab45a98","e6a983cd47050921af05988b1d868cae48d23652ebedb6967d04fb139cb4fdfb","27c4cf9e01ca48696bcb1e41ad2a98dc4fd6e82fba5682316524b04d5f3904ca","fbe7088f040996591ea7ad7d4290a930492558df6e92b51dd295ba0561cb825e","ce18bf2256a88ac05869a1131a314f07f43c7a0e0675cc1e8000adc318b3f823","d200f8bd221c7061842d034c34f1fb2943973528c394a8ac9dfbbfecc9daa1d6","58ed0a6574485bcf18d4d775084258ed49f7b92ac9f8735488d19ab14bc6db88","d141dd54b82a971d6f0e3138f8933f92f4330f150423b435b58a5e4fb131ca84","e6a214b21397bc966e36b92e7ba2986f33d2f68c9c194935937b0455f3b71c29","32888728728f1b99e45ac0738b1dd272ce3bd43436d4b9135917eacdf6a9c7de","fafcbbf841b79d844085151eaf9e7604eb2525afa643703313b0a90157d21732","0dec6421ca6c43248380dc050b147bd6d5b7560c5f73d130798c012f18fed9b2","2e9e3156a2eb8042af3099cc9dbcb8a9c070ee09611281a7ef04e19363208f35","204ef1918267feb2040caad874caebd9bbf4f018367517750eeae16d880b0698","81de5a1ba1264fe9b3611ae17cfd2ed66442807aa309672b2af6a8cc6b73f78b","c4117a326ced8cc18ed60273de14f4c5e78a53cf2c59092f6278a8afca8d9ced","7f622db03a4d34fe6aafbec10a21c610413e191c2a4a66372174315246ce87fc","7f8aea1ea572ae30f5bf272e51e596455c314ef1d6dcc6de4866c447c211a411","743e3303fed6823026dba4b34833ee6b59779678fd7daf64e1e9049114016b1a","7caae0b58bdfbedfbdd1a2f5b41779a08cbf62d62f7be63cd70cc71fb97165a0","b611b2a0b82dc6e520bc8c6698c0bf4481aba89c4923450f0753c062e4754c7e","4aaaad476b431855a38894b184b850d5d482bf71aae06948e016bf0381c223f7","1d8abcd0e86e7161c41961aaaccc6b7736f4d967755f72562d22fa4fe2cdc5d1","b1ae559a876cc54bbf319cccb4de11341916f78d58b2a9a5fc605d9f73b5111e","327bd64d00f77cddf09dc714ff99e50dee0f1daf9cc42a161e6f431967e784be","194ef24b89f71f57cea2c9aeaf9d7e95b68bd9356f432fa0bc1f52a13ac0173d","03a5c9f608043f8284d2aee7b8e592cf67deaafe8e61e3bbc8743856a1c22379","db8dbc0366bc37b9248edbe95563c735a64ee088b1b9852878007c965b1c8fa3","76aa5a5aaf462c3632f5e28c73b68dbe9b5482d114cc6bb30e53c410df810b25","2925a21d4671aef763dcc44c3cb098733f76e8ac41bf4e5f62edf7c120fa4f39","b3b6a9ad94202db0532deeb98a5537e5e071fe4456e260d86b54c5a610206c67","a1db108ada140d6a6fe10ef81f73caa7e98e69c9c54295c2d29a52e235b1cf5c","6ebc4fbab6775c278b35bf05878e356ae143fb3a9c2b5d53991a6bcb390da3f6","be789dbab62f36a20dcb50cf0e67d0ef6b3e3cac17bc0aa9bb30bbe51756ea63","db83bffab4b2111ddfdb7ae0d966acb5f43ffb52bfd88913c2b0a64dccefb778","13fe1c28d73d9999d577a7aeb74c01d74e828f4decf007c683d646f439b38a3b","966f1e39c88f4cc26205adb66e6fe1c80802b91a2c04a3517b1a881431cbe834","4091c43b763549c33d662afe79d75c078622bef954d4a473eca6aef8c251c169","175cdf7e9b2d7178e5b73a4f3dea1f02abe320f6585ee8a6c16991c92e4220e8","b8b14dec07154d7fb21f9861fadfcddf106fc542ebcc2e91e65a05c16b5685ec","016b362c5eac3b7b50092ef6d91de958e5969fe49e3a1895f89a4e4e5e52bac7","6c001c24121698daddb92a89be73d5dc1c609c802f0632b6980d0ba242052755","71f4c174a3cb45ac502cae970df6583e54023f7cbf4d4a61fc6380cdbc4b84f6","8b3ad2f91aa958cd0002ed7a5e0d21b7e1aa9b89e0dc09b007db80b917c7fcf8","83b70f5af2f91cdd41de414ff1525daaa3a340b7f2543000a78b03375de5c8d1","4fc769ebb3f66e3563d4f32a275f0a3a8d73f0ca9d92eb54c35b89e02d62a228","e5d4145dde23f54fb2094948be8f1dfea78d0311ff7dd4162f6eed2754464903","f367d161fddcc21773c0ee482a7d6e36636262a18218564495ea71e58c9f3726","576974bcccfca88086ea2ccf6314a0bfcc7c53bca41f936578d67c08d4106af5","f2110740f07903d703a287e731d9a620fa1950ea561b311e3a737d4ecde0ef9e","16adcb77d3a37fd2d795e10ee7348ed4d63b9fb8a366424c058464e3baed00c1","4e6877f1d84c2fb6a238e710c1312cc4c6f163b2beb9680ef5c3f03f40b6a6ed","5ec19be5a8971d431fe3cc400ac6871fe277249a89f1c2414d21f5fc59d5f935","63b51b357fd6fc54a7275b6e35ded46d2905de6fde71640e8760c6fbaefef658","ae2ebc6348191392502c7d0f2a9af7d8792478cf666c36ab32823f3475f2adc4","cb90c9b9a98da562cb80e080104df0951c0594ac720a0f94dbbd0aa40e40c0af","8a934941c373215a11514d35b86eb937374a7522bf687ea30ab7125ab5db68d7","97d06780fd17e57c2318ea990180006717cde80a4c8f609bb16ca02932c2a2b6","072f0812286f563febc5a47e2a2d7e4921e1491018180c7087132fcf947c0c88","662dd05fa195a43480ad3f5481dca3fc832a03834caf3e7ced4dffe2962b7669","67b7b30a7212a96842eb4507a3bfcae342ccff738077efa07f64ad1264f1e3d2","26f0d4ee4506cb192b08ea69190a3d2700b9e7d2d279cf4f0b9eefd99148a08e","c9e7a7dee15579295eb362b2d607a5875e1a579b63204d529b5d3fa56fd0a0ca","8d846c2c8c9ee88751b262da9f3c15cfc4c580bd83d70a1341ba330f260b82bb","d5ce86e1489e2818a06869733186c88368424e8cc8bfa6a3f7e1643acbeb8a1b","a09abc1573501ffe5912f0df8061599ecc77f0b7176b56898940e602ec4d2c5a","90805f9a9d127d00f13f1a1760bae9d4b12f186a6baa9046aa4ef56f5e65c302","9622bc0e09b0b17f33ba668c3735cc4c8944ce31570c25765926f030aa07102a","2d0c96ac42ed9a55c08c4248962a658c668abec3041b16d1bb09260d4db97457","5f16a4cd457642bb969bc08cccb878dfc0f4710a49071cfea8a5e3fe3868deda","a34c35fa22c0a239de442a33d211ba5647d5003523d95cb7308f7881caccd3f6","81d1b275416ac184f33884a9df96a208ad3d8156ca20d8af09c488314f698da8","320b8f4b2c9a0e18fd4dddbcb2d27419b9d8473e11f6f207142b4321a2a87e49","5e840e3cec27b382972cbcbdc4fed63acf47d342a9ba4e556fb1b8d73f168164","86b7e0f835e2d550541c27e03abf5270a42f5876e1e915568289142b317a0ffd","6f4f5fa4f5ca493ff51d1dcefc8daa2fa7c66310a2ce4b031aa6ccdcbb8769ac","ff880b9eecf2e8c256238b351fed6c9c564ad5df1855b2aa5c328bde58a30b40","0e07fb22607b2eda1883d4521080a5a29ef90714c1ae598e53eae0b94bf1bd10","52cb5d5beedcff01d5b851653cfdbe9a8e8e953a8462a357e71d93eee3ed760b","ba6d810e67aef7d6ed15cdd8223d5a207a111077c88d99ce7af5fe959a079803","f987eff1de08d6fb57b24ff89751bfb006ca652b68d4c2fd948f96ad052aaed6","081d80042c1055759a17dd51e9113ea204597da04232113cad32252f4a47e1e1","28fd437971a6b991d536074d50574e345168b2e9678e98e49e3630404dc2162b","c9aae0fa87ddc03601e3bb1d7d7a32ba337219039b30c9e9c86ade440c44641d","9334b283bedfcd488ccb33b3e942905c86fa163e919653a5379eb8f28a2d5f7d","f3f62eb4cf38d86cc7f56d0879b49656a21f2eef4fd0acef3936889327d7f256","e32c5cb1819686336a2101f31b91c2e8e06f8f8311abd1195c203b81b62247b0","683734687779547527b05fdcef60947f6fc51758185d788531e9ac7bde84fd6f","1df375435c44c94f1bce343de4ff81b8c82e644d6b33a801bc6cf4beceb76b71","fed5b5c20508c5f84a929161f452dbf769cc2d2ee1371b94ddc2feb418a0cf70","76755db046290dad61362d95c03b440a0feaf507edfb5744304c7f98c81faccc","e73e1c203a0502e2a451f2b60196dd8643106c3dcfc7c38e79f1b384b82e35df","7150b4a18287da2e25c68a12bd0cff78f6141a2425a27431a10cd4a91cb9626b","37cb746941c787283cc81c372ac56b9d1b7cf50d62376aa68ab6a80a4db55828","78b758d401e53f5319bc143ebdc7714ebe0f1e94fc3906d5e93816e5736bf299","ce50872ae30242ed1ce2ddb9d9226c85f17098e901bc456cfc365887ab553127","4f36fdf826fa2c2624974331c90656dfe3ea4c18ed7e420dcaa728429a8d7d69","77b463688f41048f449fa30b45393b81fd6dfe3eb71f7734c1a6d580373b6a12","b6ccce9156aa85ca2e836bc572d4697800739ab008b0a6ae9bfa0361b8baa04c","07dcca6e9f155b79d087216735842ab1f7c020ce41f095507afdffecbac06a03","0b59bc43ab08b3bb00a8a4978683c872fe4c6c3206bc68316ff7a3cbe70d75b0","1fab3bc9db401033ed6ef6dca9114b3a0a875b475b6c1b2ce52efddf3c4fa130","269b37626ed3fc5d6aff2b3103bfecdb86ab69e5fe28933b63a17ac83a547ede","e05f14953944c6b7f9c8a51c5739cad11e7ea4e441fd5659cbc3a5ebdc28bcfb","98fe9a0d3adc98c4aadc97a5bcb8c9589525e16e82e6714333e0315d1ff40a12","941c51312144ba38e2d86c081d212bc1f22f64eeb1dc342a1c7aeaaece7a7770","8d204669e89ac66eb2fa93e17daf42dc9fa33b3d865158327819df72f4fa3f1f","4f66c595621f6dd5c693d12c122def1c9eac9c48ace86deeb7c1a0fe54d63c61","1686e8b2a3bca066aafbb9bea2ac249e7205af7e6b878955741c66b3a4eaba63","f974c4abba2e7ae62cc358c6c1589df489406ef517a48355cbcc5f09cf11d8a8","949ab063079fbbcbf8a96c093b9cc465f83fd2ce49f4558492d6f95065cb201d","2d1c8bc1708e58c9aa73d71f89dc69d45fd00ed42841d022bbffa467c88464f4","89d288fd11aa644cadb1874dda742142148c53d727a4a6d7e0f7566bce765332","33cb723eea3ced280f163fa717045e233b801081a64509d4d59b47620fde9ef5","8c357660e14e4ae047c44211f7d024d48eacf3d5ad6ac805095a436a4d3e268c","e67731d353b0f48ec4c7b1cee2358e2b7b6ea56c86775f2f3c07029b73b8bf06","e2eccdc38e22cc3882939c7fca91570a8379112c03f6206986e0bd78afeed21c","58a60f1ff614a331f5de62b4a629b5f41066430f7b72f65ec27f0cf841403c9e","bade739298ee5cd485966b3f2812cd94ed23be0bd8991624bde84db9e41e4240","cba42369d4619e16ededa913a20727307f0017ea58a6ef628eddddb38a63bb0b","e8ac4073fe7b469e55e1fc7b1540363d5a99b507839135fc97cfe5f2d0e36595","0f45169be3f2e0eb418bb1d5d480aa8fca7375af0b6e51dfccc3afbf77d9ef12","25699fd6154aa1d8ad42dd7739ebe65e15277c0f44d15ce6826cc43bde4ea5bf","d4fabc6a3e3110ed60c84e9ec6712265afe268601f3462198b57aa4359745c33","802353808bbaf39f8ce455fc7c459d39f13a2fefcf6f18a78c9ea0c61be089eb","a057b62631a72f836a8faa37332f03324b9610bf1bd7781fd6f93be063cd10f5","76c5f9421476e8762a83f970028b5b7e9ac13fade254d40c04c188f87be8fd7b","6378e4cad97066c62bf7bdd7fb6e2310f6a43cdf7aba950a2d37b4b0772c0554","3b6fddf2afbdf36f7bb869ccdeaffac8d53759e527e3425a6b8df4dca616d1fd","e88588861f78985ee212de6a72e45b445e5e04286b4ce1eb1d28d72bb781e269","7da9909a1c3eed728b11012b8032c4b1316e50912572f6408e8ab5e2b55706ff","3d594041401ac69433c4a2ee492d356db4706adddd4f8201e7e5f542e58173b2","806aa43416ea1f5265e1cf94168fd4902348762aa8114dc53c131cff9f87b5ec","f27757e22127417f5daddd0ad4be81d5a743c95576d8c957ce39ef02a6cc1ec0","a609394a2e8215a7357c7c2f174c75a47d5c2b5469712b66937badd1ecbff86b","f80d089e2ffb0267ec558f138f2aa2e91a062a1db75f004f87d26ac17c3a25f1","0cfa8b466d3a09233752da79d842afeeeaa23c8198f0121fc955de1f05153682","36b86c077f56ed25c301ead4d208045efcea857fb9bbbcbe1e6bcaaa56b26dca","a5fa8fe7b6ab722507fdf659b95eb6a77e1dc89863f77c9eb18c444d875dcc7e","ad7a7f006232b0d57f11b7b9e1d2b24a05f3180d65d7f4117a9a888f50a28528","01e86a199f76899e9e35af81a3297ab735f4440d3f2011d8313f4d51c19dc9fc","1cc565d9448f048b10fe3f52dc47a4305f1409280daa86f55e4ecd97adafc8dd","06e1fba1c3fcade5c817e7623e66d77f82b9ebedbf4d545e04c6ed5db9b1357b","a721310423251de2b840b9c87fd51dcad47dfdd691a3e38c761be645ffbd1e7c","fa48fad11388885216177b9f75031783db320f6eb911d0153afb485e4204ff7a","0193ecfcc614ead367024bd5154de992e7af0a163c10fba0dd12f4a95e8a80a3","a180c94d4925a098e4b86176394186731066aa4b1d3ba9acf4680057e0968adb","11621258148a50d968f71386ff8311427f4708546279d086a0638c166602f6fb","04c5bac33aa7aa275ebbe815eb64ba782110c58500b3ea888020a63e73e23558","84c5f616b217dacdc81578e10b73e3722d59a5bb9b2f7d07a96680aa52cb3612",{"version":"0c7ae8e07ab19f2ef2ac8f8471d70e42f32037a96109a81f722e1fe5f0daeff9","signature":"2a100bd2fb116fbc7844e138e74af24b063f0cc66156572e7b22cf87cdafc5b5"},"03ab57204ff0fda13992adcf4ed17bbcdc11af712c50b2592021b0196a6bc383","6a7080d70f733b293a4d0e879c81197451f9ab23863e66085e05c85121ba865f","8f3b64ba4734099ff9c1ad7c4ce8a347e098cfcfe81508fdc2c75a33bcaf2f5f","35efdde73bf668a330b44432c3870d211f072db5f4400382b950f31584009914","929a84f039407e4bd040ecfc2f1fa5ac25c6d0c1de88c1d7072a9d0d64c040dd","22e0a8afc953e0774363ab3a0c7b5aae5966d5588465151e63af22116ab597f2","70f7ce71d8228238f9335246c627547b3c704506d88d2998cc6dfd5b8d5f1613","0c3760145d2b665ea36eabb8d7162763ab093f0424fbc73aa2aa4b6b5c1dd9f0","36514b9d6235dc5a4b193534e1fe684598a639f67192e3a49153515cbc801137","0ad8461b1910fb07d9eaf7420e27303d2edf93ee9649dc804bb4d801d849ab9f","d647b6fed9a8b3182d671d3be443093fd79fc59d5f5cdf44ec207de86e1952aa","6dca2876dc41d61f89e8330c156a75ea6bd3171e9c7ace061f3fd4884f43ae84","44d3810b6d2227703f3dafbc353a6b80913d1681c52e3eaab04a38ebf7eb8553","0f4a2d6bc0ef8d88c96bc873847e758c10cfb67e9171b3e101f40119433249c8","9d7d11e287b081860b7808ab7682b6f7044dcf7d6087bb50725556b5e43dc85d","c7909c9a840961d69fd2514aaeb04eb7e1fa90b49d178369234ff99bc7ae27a6","e8103d79b5d6c375b60e306a520a5cbe698de192d75516f678335946b113251c","81c4a06d1ccdca3053b37363364421ea85e61345e86cf02b8d10e0c646875431","3b21780cc1a4c040eda8cb7845b7b0ce402d5e2713ac6168eb8feecb0c97556e","1fa9e656f89e0f2ab9bcbb4618132707133feb3602114c950ad89ef73c165027","313392dfbb1dcb2d10d4affcf54a065eb6b17ccc6717f029bd9fad6091dc9dbe","03a9018bb7bd81ea1988e39653c6377a83107e0be253644c0225867fa208361e","d4f80760f89fd3059822d035e82b8d0cc67d50e9b5702515489a52549da25199","3374afd97c5ded3fe6a41642680aee7a4640a656e7ce6bccefb55e4ccccb7cbf","d4764de1ebf30ba70ebf021adee3d85c6a9be132a50484f84951a77cb4c2dd20","d48861bfc1a4c30a2df3187fe5ef00ed1b4ff4a75285e33e85425b21322a2d21","69b718b2e32a6a00475934dd65f287c03e106786856468374a0b9040307d32d9","d312579f2b4f5fccacecc36f1dead089669d1bf13f311815d86178a5c05f1f88","1dd406069f82a68c74d888ed189109bafc9c37a05f2013d368ee4f47e4f26285","a49e9336ec0d7b6403821b24e317aa9f7bc895a4ca389da651dab50b83fdb665","a22ceb0a3e06042b97892a14b67ffe00804a579bba6f3db53132100ca9f84535","70c769c86fd759fe9ef56555eaa437134713cf4112d6198ac52f1bf11ba96784","d222848dc7025a1b8f9a61510c3c9c4e7eea58282949adb4913d1e348b242939","418f3639caee452dab9e8408e205555b565db0f1e7ac9aea928904cce70cc1e5","4d59a526bb12fb32a77362ab0acf28810f0792f0ae268402a67a8a8cfac7b3dc","392be2a05eae0e32da6964be2187629fa583e8b510da796540edbbf1bf7e8e04","beb69dd98b6da76af50994b1e1f9bd17cfd42b5d38eff2334291398d41544ae8","25739d2906a529b99a08fe326336333b72a1eb81b3177506ebbef455a1c89147","e7c7524dde3a5ba3d7acff85a7eeeca9952659f274b9fec18eae7ffccf5abb36","a3c35d5bf59dae9cf2a2bb3e12f97bb1be8b1dcbbe6ec63fe42c0b5ce1f06444","802b49126ab09fa554e69b7dacc30af5efacd73218132ccfca5c2a48b90e4823","2ea4dcba48ac6edd5a22ffc18a79c48cc87abaa63bae38f265537b3f454e45c8","9a6761df52e2766a7299241916636b0e52edd92ba1f3bd8b4f168855c01c8f12","9a538110372bdf558e29dd7e04572abc722c9cc24881c325752c0bc7a862805b","0dd2376a473d02e744688de6bab88ba9197a0fb461e481aba37107978cb31b71","42d3eef29c158b33ef006712d3cf315d0508e9e3b3bfa669fefbdc0b3936828a","7c932fad06372b77845cf061156e7c1859d72d4b9307ca01e2f0da270acf3764","fab113f2e7eb6e5fdba608274091af843a1b2db4a9d4489da0a9f6043f0025a7","970050c149f896566b4b3efa6a2ece24b79b38b5297dc816c5561f6103db2283","5ce32ef9695727ad4b94c835d20f423901ebf8e6651a97e7e38c330c6da5098c","109d623b29757a8d2a3e8c33da5b7860655b843ce44760f4d6a12b49e7ab8a3b","a372d5f73f3621d38d59ca9c5181e10974865504787de3f2759b234983623bae","7702a38af57c0eaee643d90b8e44195ee902cc2bbd1f10c783a5410b0707e13b","05a33cee388b853d95b0c1807e9a2e038c324717f86b3c381623f8510d9b4515","b4f575877e06d394efc07f6a6a06cfe5f5bb3f5678fa1019f6db60007495a8e9","95991e4d3f5be4db7f3295d2a3915126ea9c87cfd73fece4071ebbcc049ed944","304ef1c5556d8fd61e434e82b82d75580486dcb6990dcfbe3ef09097c0b11196","bb935a566a98082e85d431d06d29b80e2eb87c02715935d399172ecc60e499ba","f477e46e803d9c207e7cb7181a20daf0bed50f6e046dcd41cf5673b80482bd51","93b43b29b2b8ef98559a115b35754886b94a384bd7d8a1cfd2b4543e4c5b98f5","3f2c76a79abcfb07070c6faf4928615ed05b756a9041bbb139f488d33e19303b","26da6cb6ac3c9d27ab95194bbc4d19d0edaac8b966262aeffed020e2df5f9a04","918ad5500c141967301378047eaefdee6cc27bfcc5d176b09ea6c5b4f2011ff5","146789c70dfae438806e43eecb3f4e65f6c30a329fadf4ce7382ebe5a69d2ba4","f7144f81b7aee35190394c5c8767a563cc1f1543049525a9465bca9a7a64bbad","d7abf8b3cf37b12e08f040922fb0f8a05156765f14aa47c38666801585454370","a7db9094fbed6c29c941d84488644e09ca3cb8605699e4e98762cf3860bdc6ca","7ea9ffc4978dfafe98abdb2787725b06dd4c28efc54ff0ccb0fba09e9a2b3630","47cad7cd9585773a187af8148cd203adb20a4e73a4fa0da62a56563139d93fcd","33c4229bca22ad860045fc54a04d4e85ad64ae4c1f31665cb6fb32fdd3c62894","7bd71c41027709ee2facb0bd1c884da8d2132dbbfc3cff0c7eaf7e378b4b76ee","f0c5c39d9faf5fd7566810e7d13c02a510e6bd4c845146d20e160893646f7aa4","6b4ca1a679a574010cf53d29c4425ce9df0b58dfcf93e40e6fce89abe004a81d","9901842dd345d22bfaa251f619dba71423b46d50b4dcf04e9b428c3ef52ca543","c93da4869087e11e0de8bdb1ca7539418d7cee99cef370ce561db3d4e47e532a","220f571a276a1f9baf8a36c53851b57b16d12e32adf2169c9150fd50a7526ea6","fefb50fe0d4d6b6e4bcbc4cfeaa8b65d442c1945b7bf1f827f27f0a260d47021","1f16068b1f3165887bd1bf7d8272ea9c018c8569ca269d0301644537d9355063","993c284e3d1c56829301daf9eb94fd0e25d7207fc4de0facf5b438fd276feed9","3d36e5b16a6e32eb11055a5b64bd1519560ad5f478f7d40160f6892bd96d0390","6b1d5d02996c41decbddaa8011fe7376484af1adef7b3338793937ce2b228734","934dbb447b29f93aa1d9adc4c49fdd14ea634ce011e78648f5a0ef571ae6c138","10e0383c6a19cefee5ef2f980ddd93f07e9a62aebf05481681484dc8f751fe78","0932c8214f6dbabced6c48bd1e91fb0116ee5e6873bd8a47be8359dc74f662c9","3a34ca134466cfd64b6d0ca059c211bc1458b19dc5709337a1260a2c72d37c44","3ca3869668475a0b8ad403b595182031cfbe95308e985359111786d7c8e16fa4","89dec148610b76fac04d51f4b0f5b977fa160c7ef4fdb2b4789dafdb16ffeb1c","e5705e7a3c51b73022883c03b4c9faa6c6fdaf44f5116cbc38f46c9cc756e985","b4cec22d7a89061fc64d76c1b5f0f94adbacd85ae7810e0263c0472a8f0da7c4","fc6e8f45a4b1c76c21404d6ecb03be3fa3c575ac8ec36e2681d74847eba9fbb2","f5c163097ae931e3c13f2afbfd828e3029f1d25c5e822f4e71b79e9bdbcf9418","fb772e9c6a4a89e297f8515c37cb7226046034292d02bf498c1dbc03935f6ea0","be5aba2a5142997a6c577a89bf3fbbf4b0ee44b26e1da161248e2cebdb102809","0a3d3f62036b265a50335e8ce469a6f33f200e3b81a85ae0dc321fbe5b45bff9","7461af4d2de785a4f7d8d85f506d22db3f588cc2c7a7d1271cdeabb2c8bf9d23","7960a16f9bf14df4dbf1f9deae14175b11b2e722f9ab3b9d86f370b0e2804c36","6b24b01b38d13c59862ba37e38182c2baf67e7766a397473dab2ab4e183e67dc","5079f20c77658d32e5636e30ebf16c1e69e4afce0fe5ace02fedef00a0b17bd7","e0b59853db571177a4f5a3afd2f8ad4e5c6adf0dc47165bbcb9a575fbc24cc40","b9c0d581de28aff00aa6a82ea36d5dbcae002ff038ff2d97fa12291fa1cd2a05","05d42c71f16333d844515306acd3668297569aa097b802632334c017737b2466","9971931daaf18158fc38266e838d56eb5d9d1f13360b1181bb4735a05f534c03","408ae1a99c21dd9f62fa113df3909ca9f84114110449adf967cd9ae9b809f7c6","dc112cd07d3ccfe5f6319ae82ebe75c27adcd972df9d49d486462b6242385f7a","f89ffe9c1f745b5c65126a6d8c558e4c7298b8d59b55daace5e439001c46655f","949b76c92841565d361f98171bcbc638dc153060a5c37935a621a794e2c8edf2","ba3910bc59a961a41e472b03a41619b52af09da77aa3ce374aaa3fa52e8878e6","fa5e8b1d74cad3bfd55476b25cb6d48acf466c32193277443bdd3dedff4d94bf","853b8bdb5da8c8e5d31e4d715a8057d8e96059d6774b13545c3616ed216b890c","870e6766d30448eac5dd4e6fae45d117f3ccfe771cf768f73af6b1ff7c301bc4","6106057ad2d78c9d1b3767e0b4a18b121168260c77211640abbec5aa324f5947","7ccbc656a4ab3c284ce4f594ad18fd35407883d82a82ffc7bcb0a2ab3c571a6d","0ea9c6aa6745232eae8eb0b8c8364e8eb22678a3655e79847021913cecc8abbf","4d23a91996d19986a5ad1350629026405aefe9af2d3893273f3faee9a99367cf","a29b97d7ba3d133826be2bbf36f72fbc78bc2fc03ba9f3c7d92314088d6367d0","4b3049a2c849f0217ff4def308637931661461c329e4cf36aeb31db34c4c0c64","174b64363af0d3d9788584094f0f5a4fac30c869b536bb6bad9e7c3c9dce4c1d","ac22510bc0c10f9526dd60e4c32a66668003dc222ae85bc69c8a2c0d678f6a69","f2262b21500c189c692adba77be32c9955fad569d72264ff9ccb7b2ac7a821a4","c2bb322d35d4edfdeb478906ad7f9cadc6e26f23ba746d518cae976f5f6c6ff5","2879a055439b6c0c0132a1467120a0f85b56b5d735c973ad235acd958b1b5345","6f728f0b2b0d9a9bf29c2a403431fcc39b0f6c8073b5b387dafc92d41cacbd5d","41ef0dfb6f473caf1d3bf85f49c4e4aa75cda9b1458b3f95ad8b36d648ffd88c","facde2bec0f59cf92f4635ece51b2c3fa2d0a3bbb67458d24af61e7e6b8f003c","1d4b3189bd500012b62bf7401c2e14cc5abb9b041b0c938240560cc94a78abe7","f919471289119d2e8f71aba81869b01f30f790e8322cf5aa7e7dee8c8dadd00a","96b49ae0ef88b7ae8953174e457770b3b83052d7f367c698a62fae10c8253a97","e9bc0db0144701fab1e98c4d595a293c7c840d209b389144142f0adbc36b5ec2","0d6a8503fbebd4eb886ba7963afa475bbf5b5d1efcfd389a896ea576d5804fb4","eb0b8ae9c181a4a54fd189f54485507a164217b32139a4359883b8be0d52856b","42d6c5429b3dc33b6a705470481106b74ed24819820c7f583cedba5cc62c8ce9","9487de768209d70b90f69ee60fc3eaf5709ffd67c26e5de2f915cf028f0c54be","ed352a45cdbd42c1b1a0c2bd7f2017e120a1c76371e6986cbaaf3d7207580543","3e8171a4d6ad2800074366cce7d166af957ed6ca5562c375299b52e3b76e23be","5c31eb0468e83f68c496359c7f989e18c2acb1c12abea051f01a16ea11ec8157","8195f48493294b88b317f017d727a1758f630d73e1d38f615d5f229d0d89fe59","b49a69cdd833de959c58eab795c8dbbe850a6017b9855fed073343bb566a500a","e6147cb975e2e3053cab809408e63788476de44310cdfd44bdbd4ee25ec810df","17a5f8cb0b6bfab9d09bf401b7e5a487265a2cd090ed381c8628d6dd33a70509","a84edccefa137f2ff19ea6c6b243c6ed5bb659dda066b5ea97f096e19d616d60","14b039e4b9166b96c2a00e9cc15fe687ce2d3942d373d5170ba24a9ecc3b6a1a","4be72884fe99b425fa0b2dd382edd422e63a96f31bb044eaf20c5a10fc3a4d1a","5d1526cd11e0a3c691be00a6bd0553e9979aa7b8a0db0f2e6f4882a1607404a8","3951174697ca1632dd73c69502e191f631569c1d0bdeb46424e6dd5008d1ab4f","ee234d26604b724acdafc43c22b2d5655a8d282bf467ec7fe54aed16fa850b0b","996f7615a76697331bb47a4f0851d7310554d8fb30b30b0bdb5f72c8c49110d0","b86951c3fb0592dc172b4e16245659e4863b930c6c585ae002b582d1b4deed65","3c7a386e1622e6cf2510b1abab4e0fb7388d5bbb453ea1198804132da373876d","6c1773c19d7351c908536e53e4d10c9ebceebfe11bf8879a857642b8510d047f","f3fca6fe29354b1dc37b87eb8b6f9e91e63d13f4ecbc6abcd51aadc61d06fde8","0ea60607256a3bf639d5544a273e4388c334ccd5997aa05b529c2d4fcb08db6c","576aa0f1b40d4f74c35b6b260922772000a921d35588d691d026097e54c451d8","bf815ecc9a93f8a965edf5be0de4ce3e8806fe79719597010b3bb9e2fae17643","6bb94c5fec1e4a351073d7eac97dc581fc48305d42e4089aa7f836c80a3935a0","28749d9c8489bfed71ef3fa5e62b10ab5e554cdb3bf265cf6d5d6c29f4098a10","4f97438d5dec6ee008f0d1b058868b1894e78d8b244a551c1d54b84e3d9cd2a3","d908e6ceaaff60746ee799da770fa1bd6a45cb5d0acd96418f25028b551c0c8e","f35682ee386f539654f412ac3d5675a35b97e3051893ce33d5c2eb39bf1a2314","70ff411a9cb67cd136d085e7697fa62feb67e776ddcd41ed09551d79a65a571c","a2b338a69b14474a73a25d8710ccc124223c2d76dbe9ecee05fefb1530f87a90","ad7b4ed0d5a3ed2dcbdeaeceb7a14e0b07ded6b6bf6bbf2f00b1ab7805b00dcf","4e12461d1e43622b64062ad3f5fbe1ba013910101010f3de6c753c7f8d53e713","e4a9424c3d5b6d730963399e34f7fdfafc44ec1721ea70890cb6dcf9f459718c","6fef9b3e1ea5d8fec6e2c538609844ca5cc7d44d58acefde8936f6655a07cb6e","f6f870bc6c1394c2c1d8d890fe910a3d09417efee22f065d180b585099d1c4ff","28a28c08d7d3157c2d029d7f7f3ddc69a5a83a8acfc54b28782328a7844c166f","18a8abde35b377eee2b2a5e93329e8215ddafa0764f8291fee330483c91b62f4","bad7fb63b18489e3045b5137ffb3d5d659a67b8fd2cff94c26c5374c5582dc42","6593bb569fc7532be1530f017b86f33772c8bd00c63f02d52ad544368ef12ff5","6f371b08175f93d391b01f632bd7e9cca8b23356f4ea4a27dfaf4fc9fd823424","341216c77ef6c00ba9aaf13d3055b9b199e5d18c5a1bdb0bad567e0c7aad2d28","498c7f4ae5d8931232da96d9b5b8ad64abda28b41b36d5f2147329523e74b5a5","663fdf733a9d26fc5cbca361908344eb14deb56144233c807f5da880dd19cb07","ced70a7977b9c0e0e04d0ef6aa7a5a53a1d110f8d7e43b046823c9bdf394a922","cd3d03f6b14ff877aca67fe588055560b5923a6a37fbd66cf445ee4ef95ac9a9","606f89cfd575441b75269f0f26badd74426f5f4d2fd5ac861474b01fb0a995ed","2bfce430f236159a74e39fafe3e0d3be71dd8a344b2572fc259fa910fae32b2a","72929be2547e9f922a27c5f95ba35de49f79d0acd04e60c585bb0d31b0203c33","5578a4c7f47286cbcb5080e4a0e99241f97a50721c8dda4336b278b4a7bdc677","cde6b7e9b9e2e3823a035de8d67c7735837c171f43687f652bf3d75ae56f4c5d","87fdc57a4d5f4dc332a5b06b803ec9d2bec112029d8361143ad9768b8577decd","dbfb09bc9609b1a2cc34e3b4e08f1df06406bb53e4a9784b98d3389a9ad84813","d698705dd184b0e5f2d9790bd0f27e67195e5c7630b798fc34775ed7c9c6685c","e80dbdee6c32301ed896305390139d9b8cac50ce209c9338ad67e0b7052d98bc","633ac720698a274455019149663bd25239577c23037f972dbb7f7360ea51b5e8","e260f4e72b40400720d2e35635e5e89c473141195a9204460cfae2432b273c2a","5d930825c959accb0955b130f20e9e01b4c8b09ce7c7ab739cbbc24ab5112372","4d48aff007511df1a38d7bd5896520e2224ea61835a6929e81bf83bf09328887","31d14bdfe1e4c5153bba3e9c397c88927d052a5bc4c9efe725829914812f2b3a","e2b16a8e66f46977f8da284ad138abbb346e77437ac04494e2f01cdc1a17ca18","f56566eacd2b6a0816f58821423602ce3310ffd48aaeba9124be906589940f4f","0053bf8edb6afb3dfefde45a02e34037dc70b7e6ee8dac2a3a10ca814799e9dd","d1c93abb0554b105d9d94853af8297859a2d288f657dea521eb6d7d7d5a213f4","ed1ce3d3f504d95e7aa321814de915434a4ad702560672b426336034ee676dd5","53b644e2840d5687ca8b6ff0f46d6b3a5bcf89fb3acffc5761677f716352b34c","80c0257e4a2a128d5009e38319c0ac67e5d69ea9fb9ff0c2caa71a6cf111ef39","7eeecdaa6738ba6566e20d8ecdd965ede29074de17b0004a673d392f7ea04e09","ba2d65415c7f48a8fbf7c1c2319274500067f15892bb2510f171a96e2548504b","8175a896722cd3aa7127c1cea3db73def421e03716911f9cf69ec5e38bc91270","f4a98f447de76f85ebe3fb1892c600130f54d9cb7a327d692bead60aa7fd9047","8af88c55ace61b0323e2b9b5571246039350b9d74688eb655f593e634d9f3ee2","2279bf7aaa3a6786a3ef2eba8b54093f305aaddcfaf485ce420d7ce96e107cdd","bd0ac01880195304f2f4298f5bb1a30f0264d5c7f501aec39bde71da4e22dc98","46d02f2a476f83c9c1fa60126c4d0e73220a9f4dd99a510e0e91df1f887039e6","031730e278bbb8d953507b9eb3cba401b5a28e09c2b3a91dfa14ca862f4e5c0a","c9eefa06aaade0c3304183e2d6319aca993368289799e85a99613f9c20a4cd6f","465adb5b84d841dd61e052bfd8f8747218033b5ab1f4ce1d57d8c640b4bdb457","6ef929a099d39c5237e661d63a3ae06b919ef09495f3c69ea57dbf5083a24104","7fea48060651351ad5d802d9099d0fa707461413b6ac66567b413a09a6ccef5f","febdc0b38427fda29f71ef5204f365c12ccb5895ddd895be831e7bd8aa790701","9a5de106262815cd1507bcf4fe3f7325ebb620cae1919cec8ddbbdd810e8e91c","41af27c981ce1b33e2c238114856ccab567df87d9361059ec26ce0ce07d31a27","4e60dd8e0f0b037b73e5fc1aa697d55605016941e8fe3143ffb6600144b06101","404c37201c859df60523d1d8b3195bcbe83980326138c9bd117121a178d0015e","f95d4f41127150162b5575fa2dd0e208f0cf2bedf7edfdbcb2761da78c11f69f","bde501a069ed46cd42559c5bdf25c0c1abe579833704e80f2e35e2f93e621426","a867b3e7b84b0469f7ec5becfb358f54a32816d053973deced971301d1e92fcc","52cfb23d08dcc07172abc2e8bb2f9dde1ecd963f0905b6e887a5a647a54eb157","8a5e78f8cfdea314b7f5625fec95566babd81f6697f3193e5e9821a3808c3bf8","fdaaf282f31e8c67b4c20e986d01cf6371d16fd65ac61c2cd3115f366cfb0e2e","b9d9d194ab2ed44e9d16eecfc64f539e35d80bcff68996e3f87608051c8e9a85","2b41fe654112af410c5d15628529a4dfe47fc4e5f20150961106deabf3c0ecdc","a2333dcb170e668ce54ce1c2c5b617feb6327b2da433db93a6adb534421365c7","388ef0443f151384dcfc423810c3a1ce34e8b59c6571c32cb2cc887abbcf8869","9dc0a90b589dc7d148b2c1caf1638c4fd528ecc5f512b547b9f5a6fc7c8db976","e192812528d7df1583c342c1f1973a3302f5e608085b0882070f57c232042325","9e48f6ae4ac767ed9b9dfdb863262187573d9756ef9704be1cf18be8c85e89be","ef42749bcc63502ec1e4c60ff865bbf5acc5f4cfc3ccf9d0b76ba3826608d87b","f2ec6d5dd11dd7c9e9bff1527ab322c3b49511fea71aab5eb3424f0bea7f11c5","a44be5eb6d4d3df54be712a4638d9dc346a6eca7580f2520a140786006a266ba","dd5b4290e8c0433da7aaad25a8eacaa8cca3c9454ae5d97cc78ac47a093ac4bf","78826d1123b805a1d359f9aec67352d7dc5d35c7690bbd6a2f10eadbc37d9d14","fad408bcb14aeed2bac5680d29003c661e81ef09442ba13167c91e5107059608","62250a24b8e28e93fa66771c97fd360bb318dee4c7862456e460749057a8bffe","e7be4059eec22d8608f7cc54b0168d8b5d31cc64cf11189993bd8e5cff69d1af","20fdee24a1d6ae1d61b6199db97d362cb5b0b485e065d29803e43457c73bd923","bbe3c1583966d043fb50061266849ba0d06b8517dba0655282d2e5792a8c5186","363e3dc1e33ed77902a13c512a3e92b6882fd4eb5c78db60dc0110432fc4a0e7","770caf1cb2aa505de7e11a66cc0aabad5913096ad7d1dabac8fa39f24e9f4ddb","484a5469df56ca97dfdcd7e4e63d939ca780d296e8d44efb54f8337fd9b9239f","be83d3083bd3ebda25f3038b5ad51445caa6b14cddd9a58398e0c0c163c2e47a","a3b91ebb0b478a1266c70baa05624aaac927515634646831cba6736e6726ca4f","75ed0a29dca86bfbac1cd7bb78f87a1be1eef2114b8c116698731adad371eb4e","7b28c7251f92b913d5bc0cff95500eacf3b94856cbd3cdef6eac5d5a00712830","6dd60955644e2a573f8b792942624b110d4bb028cf89ccc794acfe568eb2b4a2","06531c5508aae3aa316378ba6f580308c4d646b44df7d2442548ab7f513c44ff","49016449f31b881d43f96d3bb5589c3d78169140c5401d3ae414f8ad4504058a","f74b4ea05400c25895aec2918cedf535d4f13645049e6811e8fdd98fdf83c719","4ac21a29b124e89309708d94dd85ebe60e07da436d951dc2b19bebf359ad279c","85e3b61f4081e3d3ad243b6296a16eb567f7e84d5ed20bc06f99b9ded922e87b","776be4ac4ff673bb97d28794b314f54f54be54c827e9d40f37e1b4a921defe9b","31570ab4bde95f521f01f7d0e40e0b99418a8f80e9bad2d15449183dcfb9edf8","048f2c2744fc0080a9ffcba534d2a1fc32a7510a00ce0bb826ef7ba9ebd93f0d","b28d13b89b1ee545f1d7045358c56b69342ee3db9c1591e272d7ca5d47ae0e8f","736c3dcb798bfdf1c4b5c6342212e1ebb3210b8be602a8f820c6a1e411adad81","552ccec8b93a9a2b7aee816811370aa37836a4683a5d6c657258dededd6f3b6f","f19bbdfe35a9e088731ebb4dbb613a9506895872695ab0b52d7a9d602b119096","c7f14471690cc7c76d6c694502c4da842bf1a71ab437a5e72dacab6b763f5ade","777cc404d6e65da0372613445613a340ff6b40deb7aca4960fde3319e42e266d","018cc1352eeae34f5a3a9090f07120df979475f127b076936b28b0a238d4f59d","9494f8c2c4f1b951574459aa5579241c439a12b8ffddea4886f3a9f71a2c2cd2","a905aa7295a4e8dd42058ec2616d35a0c3a37b78dec80476ff4c7146f8bdaa3d","6a4f773ea491b0120bd9f5f98b0bd6a2aac7a8e17265d3d20cd69822c269f411","080f79baea6088a40d1a7730986c9f965db704a063c9a548f40141e9b75f31a1","5c386e2316b66ea594ffcc3cba5801422ebf1c87fd6a9bfd529cedf4fbbca0ff","d03072ee7c4b99522bf1e30cde473d9175ccf1774961ddb36a131ff09283da42","57adf501e3fa990dc798c22ac2b60537fc4637dea7a0ef247a73df1afd174412","61df1bc39df93c771f3146883940ef138597a418913675e814a5be5545d6f3c8","5ee2ea2f035d5ff82a11c75bdf82b1e09d1496ea3e33b616aa14e4f665555fe5","9c6f1de8b0efce510c420d940068ab10b64108afc1dbc5943801bf3c5c3aefc5","05612aae309e75d06b785096ed43ffec27e2b124ee279235090386ecd64c6bd4","e6827af855c4b88198a1e8750fe09d9486a12065b08c7fc1c9f77753b25f2f60","8b0a19c2c8203f7b913f090ee9c1ac8d893375a8bf31046fcefc5954d4479779","e3189afc4dd766715772aea2a09ddd401b9b6ad399968a3263f09ca702e3ad5d","30ef48ddb661e76a5451ddbc3d141c19f8952c2a140a4bebcedb63b7cd1c557a","9ec170c87f890292d1b41b7b28b8b85a4491ae6c3fc4bf4dd2afeae4ae6f915e","ceebc37ec9d9f90c4089b252e624a5222cfb1218547d01c2ccafae6cde4d6b28","8589eaf1ba90c383d8ca84c23f95c9bd712abc0b1a701bc1c27acd262d594667","0ae3efb6d9b789a09ef94ec35e53956331176b8b4ca4526fcc1279e7037a1742","bf0a9ade285ca358422992bf4245fe36def47e937f815506bbbacc0cb0919f11","dd42ab89d97eafbe413a53d909f5df09f22e01f84231571d94b5e1ce3a50501f","dfc188bedd3bcf06c131bb87ccf89be3a1b3a37be301b55fd1062a8bf48d8787","2e21e7883ba7e5d5520e9e55a014758a87ae6c3470026fc51e949c0ecfcf4f79","1ad030c56017b5203b222a1be723bd46336e988f5ef7d2027b5ebf76ac709e73","6e309d95c939e25c1a335d9d18f78e113fcc2c1c88fc3b74ff8fc8850f46a184","3880c7e6f129b687d3d9c87ad24c207f1f1e95544b501a032d18728c463ddc6b","c96bd89644ace3f04e06ce7ba1d7efd3aaa3ca319aae801a7b01fc10d635c144","ef5c83b6e6e6b6e2bb4fc8272784f0e32f6544e60fbd5f8783a928bedc29ad25","c8a671e53e532b01b0781cfbff07b64e3df3fc1bd8b88a61b3da3be6e6e552e0","c9826e33440d3b03aab49a6e48f1bad66ed299b4baa2cb61bb09025fe1d693d3","d093042e5fba251ae66f7fadd6d1f85da3b21c60f18ac530fbdf9f05674bef3c","e1feddafde414a7023d0d86fbfd16aefd892906a8f5bda773d3b8b1f52ead585","77bf8468412ed4efa3aab890eb4a9d23a5658c252aeae685d45df0dacb660759","299454a009dff2c3534f42af8b918c2c2ee18c4592ccbacd4ba3e50d2e59ca0a","5385166e52100619e19f252a8f71764b1441ef1c46dbcd96195d485107b309fb","f50840dce370e9c582dce164180ac057fe571a567ce23ad5f59c5264da914986","d0fbfd6c2fc4c1163898d5a978a23111c157190e7797ce6bda451db1345442f3","b24f3e10494a0a508ffb2ea5f788ac43049eece2665fe9bd7d6dfa8b982482d9","d152235c53b89cd076e8ae50ef310f7289029f6d8f129bcd74eccda04d13957e","53e87489a506b88ca369fb452f5fc0c6e7157519e11ab94e11171203aa98b4f6","c6ab71807edf57e1378dd30b20578b4a9e5efb5f2731981920d33f5c8f7985d7","a3d03537719d60ee7222b06a75ee51de22d870b44effb055606deb2b8065f1be","8ac670da056f936dcc4fee1ebfb86006cdd6e2166598ecfc3a6178495d37a6bd","605a38b8b8c6e7d836794fbf2703fe0505d50dfcba748724694e06a925ddf00b","dc0532364f44e3ca13736b9da49a4a435c135176941c288db4fca52b9af53b93","a52c856e4cfefe03772d13dff6497fd2a5ca15eac90a3fcbcbc4afbebec4328e","ecc929de767c53128db78df56911329269d3163a721523c2125461ae58169f79","a5a9da5327c5d5f6718741010300829e928cba9c720055ba57713da42970013c","f443e7259759b4d3ea41d6a70d23a712bdc51e345a90fcc3ce2cdc54ffe6eadc","2d1365acf83854907aba1825d9ae49b702924d6a3aa627c0dd8af17825772e9b","5bf7ef0ca70f94ca85408568c529a469c53a5dbc4722286a03ff530b92467590","3a737b03a15c29ad0b22857fb2bc2cfb33342077dac2c675eedc0327ccabcce9","7c1648e4fb0135c464b2c257f3461aae3cf46c041b7e338c60511748d1abdc37","37b60286ee9342c273a3d8ee2d127ffa79519b529e532af596c465185a0e2b6f","a94d0c432b0a0c131c8a2b384182a3d33f68db830fbfb7760256996d2a22703b","cae380f0d5e1311a68ce6cf071474b4c94baf992812e817d76aaee989a6d9f65","2039d5ac44fbe0e4576a0dfdf5483c3ec1e42016211aaadfd91e28927ad74642","d727de15e13133aa60800df3f99e97228c3ac9d2d9fbc9c9849b9e73930157d4","122b6c21422557472171c36d6b4889f8d682158e767d33ea3a85fe94e072e2a1","b8c65f0d1d2175577c2697e9005fe714b0d1f7b684eae00b0235c75a5abee929","6a634d1cf3cd65de2fe1807deb231210809cc2d46083410fe47cde1250130c4d","d38bb2f3b22028690830ec74a0f15d2f15fc4370b8c98aa112919ff942761e33","bf91b2a68d779328e382e2d40c524dd9c8860044d4ce9ae33d8ff639044279c9","6a1197b37f8f406bfb74528ca1fb90659c6d1a251d472b1c65affb5c6a6ba5f8","6a1197b37f8f406bfb74528ca1fb90659c6d1a251d472b1c65affb5c6a6ba5f8","6a1197b37f8f406bfb74528ca1fb90659c6d1a251d472b1c65affb5c6a6ba5f8","6a1197b37f8f406bfb74528ca1fb90659c6d1a251d472b1c65affb5c6a6ba5f8","6a1197b37f8f406bfb74528ca1fb90659c6d1a251d472b1c65affb5c6a6ba5f8","6a1197b37f8f406bfb74528ca1fb90659c6d1a251d472b1c65affb5c6a6ba5f8","6a1197b37f8f406bfb74528ca1fb90659c6d1a251d472b1c65affb5c6a6ba5f8","6a1197b37f8f406bfb74528ca1fb90659c6d1a251d472b1c65affb5c6a6ba5f8","6a1197b37f8f406bfb74528ca1fb90659c6d1a251d472b1c65affb5c6a6ba5f8","045fe6d9e971df69d53ed8f1551e60c4849b0529e407e5960b31096418fa8346","0974c0312c1fe25e56e8030b1830ce8bc071a973714ac6f2409894addc346fcd","63c039eddcaf06c52df165075bca499e87bc7b82e40b29630540de7502c9b6a4","3493d3ac411c6977f391ab438a9940c3a8e06dc04b7e2d84e0571a30aa224314","ead0270ec6f9d7e429bee4acdd221196d58225911e66ad514890710296cf0d32","0feee6a4ec2ca4ce1072d0bf3a9839094b5a651decd598b2fa79bcdee647fb16","4e4083524cab1d20ee9c4fa6adab75c0f987e1b2f1adbd8c3f094195a77b43ac","4e1949bcfbde9ae075bff5b15ce1d3a401624840cefdbabdd6516004b93b821d","e07ae97ff6066c38a5ab0b3d614c5d72ac5287b2cd7428df7279fb73a56b2dec","1b71cbfab9d9159a4234c3ed1fccf29a8a60ea8a30e223672f73798457524372","b1f029e0cc842d8a3a23e5fa79002b45cdaccb5a180b6be4562825dc5e5f4a78","b2d7f8094f8955e902ac51781bcc1d53f3a22b0986440c27521596dc14463647","e33f4372cea9bc92faa32b5048820244e7e18ffdca2e7ad92de447b9cbb9838b","6916207fa20ed1e0b604670a10875f4658e82713eed42089ead787482a4264d5","93c73b7e8f24a8bbd7a7c83b2d761dfa0c746d50a3d3b8547316506a5e4d46f0","e05f1bd0eca39a6f378f3063a6116524fb74a89f40052ebeb4cf7481dc34c525","78be4eb91c49f4808c7c58ef1067591bb5ea2bbb90a09c541655dcb0586db746","b926e886ae50c3dee3da889a9f219174b4408838cc883311d46699836798173e","d25fe9e615b9b052699f41467921d9c840e260253d77ecc2eea665c40b2037b5","20a0eb9372cfc78117a752220f1d2c0c1eaf4e5bde6f4c4e332dcf515e678fdf","dd0d466b8fc266d34a56aaa40f31b61b12d35b1a112de5c8da4446101cb95ccf","37ec787986634349af6762b22a3d916d07d2275d58c2c0abd494e33adbbae5ab","ee18966fab7cd59306bef9439d483d5b9bc1a653b6ee3bfeccba73ff744fe34f","fea9468f1ae2ee25828e64addc02e728ecd44ed247962398d8fdb75ce93fec16","ad91e424104edf079fe2d6058c698675a2a922041dbc6f7b95dbab94864bdc95","2448fe53fd7a24b6a5d0d281da97c5ffda4fdf7fecd708ac45650a423b3d5ae0","5cce579d0062236979f7ec5683a5a9b910f406d72a88efdd157bc54289b18c03","1f34f9ba66845e7089c78e4da51f3379ffa1ba2a2a8965487c34da4584773430","1510061e833f0efe9d0f04f033a933db465a84aa0386672f897c2cde9494182c","8963bf65ecd74db8a7b272221e708a7cb94090883bd6e9fd8a3c19e500b565dd","8179cac9bdb147e7d4c8edae27b03b7b7559c4618eab3490623f3dda0abd44cc","89aa5bd1d65bfe9953495e3d7ac119c7474d1a2d8ab1e91784d92d2fb382f820","3359d7e0e49715cfbb45cc414fd5ba255006d40d9c98799f6c2643af9dc57fab","eff6b28c5cf451adeb20f16c05b8c8f86de4cbaf35f1c0102cca4efaf204e6c8","78025e1571cd2e2a5bf8f52b045bf6bbaf418af445fa953357e4db99c744218c","c08b1647d1145acd66a3230cefec23b9f0907d5b55dbd71c490bf6a78038d772","87681f97a2780cb88fa2634345f3a5f1b01fd8e16c0a6c26c3a1746240ef493f","7110aadcfa354b782ef9649110dd0f4a0c677f543f91302bae188502ac54f793","2e77554d07e292ff958a1b015621efa9d9e14624b5301492861f2cbeb1377db3","56e7fb84b0ae116103d585685d10fa66d63d872844f9fa60a9021cf489fbae51","fdd055afc50b24d4e8d5af48b554e47355db398ba05a61813cddbc7d52bb2dff","5bc9f9140c93edc4a24045c587ea86ae4d42af9a56d898b9b6424faa3d1efcb4","efbf5d71ff8d7e8e44e8affbd38ad02d378bf3860a1045b07fa5aeb25f2f7c8e","af115712cf2cd1bd4dfe531fe37928eec17ea734bd15a059d5e1680cbc85261e","d4ddb4f5600410fc09b765bce8c0845c6f9e624e236ba381ab6ebccb15bdd98e","d611b6951978237408da2748af90e3136129a566dd27ffe069ea475ea3862cc2","c51bf5a13799664b21874691e50848a0234260566f10d8132a66695c930fb8c4","9fa51c0a0c6962612e977572609f8106e23526221e014d455fd90b8bf2353240","154ce96210f12397426c91a5b26d95e4268268d3db6bba734e3cd2d947468eff","b3f4ce36396a2b637dd264c08aea2b05daf881d231b623279d64dd03bcdd9e03","aba0ecc2124ba41409a38e901821aee35ea00f47089b54d92463ee953bfe5279","16b03491dd55d3e8e45dac62add81ffb755a3b0b6f801bea5dd124d3ac08ffd4","386d34847269cebd0bfef61cc96fe103028a7369ea7162760c9e33f926272ff9","a728e0f2886a8e03458cd0742d2b8fed0dcf750780bf00a52c4dc6df824b1f45","b840905c0dea39d0e29808149a4b29bcf96318fcf38fcaa614bfdb7ca3b700e0","d772418ab27ce8e754ca3910889abd5d9c188d7449bc94ea86467cfd8749fe0c","2c9901bb8ceec303822b64b51a6d0ae19031782d729442da91ff5329453f5b2e","a28fa5d47ac753c63ce589c7bae4220e93a8ea8baf28dd2abe5ac7554224f3a7","821124846f9f49dcf79be5a47154b1610827b89a47b777506c3787e1b9a702aa","002f7029728dc434e9192b4eb1e2b3ae100b858a9d7ae0958c76877c817e3290","07f3c8e4b852a4acf3662dfc7dc076020f41031ad8497ecfb73a1a83bfb1c936","6c3470ffb0cafc01cee5308ce6bd6ebef413416c74a3b2ffed641d484764aa1a","7a72f996c8d8ee584cb9702460ea6b974d0213a39b6a626459c3d3a7063a773a","c2df2abcbda132e02887f2d09f311a5ea640cfc59ba5442e27b695a2493cc612","7b0de4b4df7d9ab307bbc3f95cc0fc19a714217a2f98be95215bfed55079d01a","c42ec15fbd34c46bb6d763d9b0cb40864e4f2f19ac500cb9cec6219d46eac4d4","a25657f0be4969581dd14b2edb28650da6d6415de34066de339cf644e6301101","bd2e8035c505179b59bcf44d70b809d9ab2a03adfd49e7b32cd581a843a9f47a","3d085c371f504c9168889e697d3654d39f84ab6b348850906bb0244a5b9bd3f1","a2208ac41e43ed7619138c68de285641a7eec1f2c32c9cbeebd1bf47a390a4ce","14a766a8730b8ce71fe984942a69c2940eb05d351f387efcb749ba57bb01993c","1b58353731993737772c663ddc2209b41aa76ad1d884827b2be51c4db3f2be9f","9b45c1693933e438c4be9e1233fe498e556f162e8b3ca78cc689a1bd5c0d7875","4dddbb1b181299678aea6ea74fe5688eec2578539eb9aefb8837ba6de71c0c6a","233c63253581c9993034d64e4c393ba7a3d2c8190f135bd39ecc7663b526785a","4de43720cfa689af70e56cd09c90acdd79c7825cddd2eb0c56fcf4c03c21a946","da40b900458196f1269fe5aa40064d2e398645a6bb0ee5f62476f4c247965c3a","87177bad7f043bebc2ddae648e38dad725270656f0c835ea36845b851eeebd8c","9dcae408b531e8d550ebdbf09b618416aceab40044254e56563a392211179439","bf98d0e54baba7e0af0a34339db2ff1dd4f400da7a167f3a473ffa3acc619c92","cf30cde052145b2858685f2fab379fe80fd64e8636aca9c5b1c4ee2f96713526","31ada8edd648ab13b4f7e830080a1e6297d6bed43ef5236b57a62d90345e7bf7","ff3baa1674a14a3fe6b4658da812644c3237b7292b6194aba444af05b0554259","e5cb4ba961229da30e4caeb5ed487ec5eda94bd81294816880b5a12f3717c057","a5b9b79691b4008eee280e140bb83c24d32bd1a003c4d53dd4289fec44a00321","dbffb2548839ab75466d7ca4197a4c9aa49149490b19be8b68326554e3fde348","02c1b72150eb9f28520e8458fa018ed43a81d3830c8a4e3b2115cf722708a402","f1318c4c6a496737f82c00f43ec1116630562efe13513d011ee057b940218e75","522d16fbbb3fb074091625c9f0167169b28e965f075d15024d75b73c03a80a05","b5422ceb0645912bb706cac98fddcdffda4c81beb0da86ec99383a4eb66f0ad5","6fd4281c7166fab2645f8f161fd679db2bc7fe49b2a0e4d7566dcd34cab54424","44ac7386319fd76de59a4004d8b78e5ef37fd0468e8a75fdecc8087eccf892c5","ed32fd09356da7ba5f68d9788ca4878f5f05bf4df82a8a3dd9bcc1f0898381ac","e0ecd8c2af22c776c18047d0cc5765a810abc96304ad294d581e7a887a67e6fb","878b1c23c854436f8551d33fc1a36978cdf5503dd240486d4c64d2a9669ee331","ae14e86c2809ae90de0e8b7ed0eb54d68b8471dc41f50a3c52de979a863b5079","aaaac5d08887be8bf56ccd76db12cadfa30f32ffefb607342937f626f9ac4563","78035735c1c8a26feaeabc945d35b3bc5c23e056c38fecf6e4d3ee289de252fb","fd67286f70079c1ed91d8e7c9e396de31eb62ff84d857b78122538057edd424f","b3bbc048601adb759c1974906e61063271a9d46ce38c3c6930cac61d39fb381a","3e106323405b4783b3236605b63fcf049f3fb1ebb4cf1656c471cd35046881d8","a29111e1d7e0690c62bb31c7c95a97bbbed8479c819ca7e66da7f4c03c166043","e3015435c319bf4e964926892508771b478e70d3664f8f7b182c54bea773c89f","baf6cef2809c6582ee234da49aa284af89e61823c5c6e63d81eb2290b9bbc595","0be98766bd5531b42a53b8a092446635a917e30133474d39c782c8ffdc693199","3b69359ba306f2d0d3a25c18e4ee2745f518052f46b41db89f590dbe7c602064","8d9c635e9cb5515e5ba2fcff1fce4576c6ce041b761f722a57aab82a3ffc2513","1d5a1e2539b579c3ae3f984c209d418b909b33e08efb31ac6fa3a40306b6dd63","a060a50dcf320caeb51ec9dbb272e00e0cea72440cc8299c6b04b68d21571bb1","c89a56040907ad3ae64cee7c2519fb9f1ecc0d94ac3b7cb5a48b490b49a302d7","85e168556c3bf7bb75d77ea116f70051efc7f5971d5352c549b71ed5ff6603b9","0f17a0b396a26555bb6f0bedf64a8c009103b0b4621ac37a2edd3e9a2235818a","09b007312cc877777f4a05abd9b8c53a89add96ad57eac7345f5d754a9d6cec9","ab5b842a566062d73eacc73d24cc96da5b0ac3328f68887dd1e452d95ed4c70a","b2964a60a05566e7382c1c3cd7db1f0b7df494ce7c62466fd0c637ef779968f4","38e2f34951c0bb35dd0b8028884dd412a5c3446f2f6b6db5c9160be0347077c3","1685b20ebfb75d769f004510625fde870117f657077de4b52e37a3d16fbf2f67","95d65abefe26ac678fc47b6d9a5d9f50ef0930427299f0c164d16da810546801","8ac177a7f72bc0be23449b155c3485fc7da54618dc7f53c6add0abdc384c6db5","4c06d46227f84cdae71dd520c600606eab4620e9c510a7bf93e6bc5b4120d9ce","eabdf7f5f895dd08b222e35fe108c0dafdced696c20621cd45df33179ab0c437","4fb171631071b9785279b60fd512623511d33bab647b6426406f611360feb905","54742ae92778405cfc8315410608b0d04b7372335414b9179b368732c9988210","870673d84069b5d1926a7f77504da6f74d9a3eb719c5bab33a2fbebd0115dc5a","ba7df40d97ff325d8e6d248b3714ee95f3e2f656ace297e3107dc1f36225f165","ac4fe22c6f8340eda7bb0b537c0b91372375c20c5895c2e0cbba339a0a73d0f5","1fe74afc8142cb70377f3e896d6216db24e5c42a7f2576d2a1ac96db45ac4578","79e66a2795b8d470accb32079bb8fddbded23967031ccd2ca8f30de4fa56f003","020f15176c4446bdde4013c73408753ff4a087708adc254dd62a7deba24078a4","f28afeef8b32bee9f5a0882cb31ea1d23cf6a179e6d9208ad243598f69b0c5bc","1db9951d7675caff69261a34282f3ebc3c275f94f7ac2baf5fce82ba7713ebdf","6f05beab428715fe6107a8b043151911e55034bc29490557eea9fe9912ba5c9a","b797c5eb1d4be0116fc8a55cece85d4b67e74b7d0c3ddad7cd349a0be9a92efd","4d21d61fe091fa9b1ece281280f83150f4a2284caeecd5b3850a411932aa8e2e","134e41a27d49ff662669fa7c2f9116bba994df2b065c12c8bd96c527f02c01a4","f54ff6fe7de75e53e7f3b2b0040454b13a4861f9f787f6ddadb16572fbf29d66","6875f14758cab28e639d8f1626031a88f216567ce5a4072582604bce97abfb35","c53d11ad41d1670bf9011fbbe7a2b2e99d297e939c45e0db3fbd9bf5a824a9ea","cd265809d8abdea56997d389c75a94cfab8580d238e5f5bc39d85bb02ec14894","0bcd9d0c167097b0be6e57d44654faf21e2a5dc561518aa629da0abcb49d7e80","acf44277c0f54c9f233c025f2872378454ce8f56256f319989469e712ee445de","8c775c3831a5d6633bac9e265c4bbf421204aab88e69ca749d00eba392a7ff8e","8003ff32bfe54e4c7d1ae84affe9b8a28bdd52d45893c21897676edda00a9d6e","d70c9737520b5cdc63e4cfbcebdd8f73f2ac357c12976fb20f06fe49fa833650","c52f1ab7b022a3e928cf5dc4850820dcbb83cecbe02308b568a93f5b7d555895","bf9b77520fa210ee0d05804fa5d9c4c06e3099366af693d8e186a9db1157a663","13df603383b2346c7e6fcfe0687e367feb7013a136c9c00ee9758f3eb260da2b","916535d43e72e12e57c324cc6093e91df68e443d739b9a5e24f18b4c07062c4b","45ce248abbd9006b05190aac8f0122638a803d47bc07d33c260c275d61290bd5","da46dc955624b71e1aee63d56dac6e600b3f167a4da4fb0c9f198a8b71cb30b5","853bb9e3ffaea142abcceba7ac8cc4c05c63498f12e09134cccf4604bfe383a5","dc68f30555d819d117d7d4bea99d384d927961233d1cf69915cf5ce98648eef9","74e6022f20345666696e3331129e5b39e856eced5336f1e0dae07ca5d20f8d5d","20f6cf10ed4189adf13701e085c542c976c884f6f4c9444067a72c9ab34577a6","50fcb4fb212f475724181e8ad0a4bf3425f19be78488a80c27f7a2b6e31d7b5f","ac6dedfbb4dd03b8db4dfc717ffab65379b4daefca86100d6dd0299d08108d09","89cea9ae987e5b0d1c361801782de9f4fd0e0aa61b191cd462e514409299992c","b0cc616e2bf7864f5358a0ca6afb85fdf7c6f4c57cda34001c76120cc979a19e","4b9082f7b734d5e1b1a076a65adbd4c141d3cb15a2d90d6a10e7a9f9b3bd4731","b5a801615680396de25de09816327f7b5e8390a6819e2a3f0bd277cb38366318","da1f759e7bfb8d2eb67f1bb34dc72cf5be6b462fadd35b13cf725c666577b767","da3463a59276127a299c93c9c15e8f827c58174e8a03fd78080cf93875880cff","e0b295085373f57e4d63a19e5822777e80062718e9d0ba306fc76a5039b711da","80eeba0676111609a4053ffd4380271d27fc4315db06814551f4cabd972281ce","695a15ceeca660ec7cfd539f342d202925e7d26ef360a7655306891e3b470a2b","4abbc89afcc3814832c59362eff44b1df1242b4e47004d28a8eaa4e3ae737769","0651b797a3d39f99df84a9f03ab0055e7a663720dce953e05076f0c317e05979","9de9724243e570c65ea86427227c5022ff530079f5e1208ea8eb3ad9521e4a1c","f45fa1ac54db0878e96c496de32e58cb1a6b590cea77f6899b7bc4be9e4e36c0","064352b9dbd14b745464fe33e9eb8a52a21ebe1bc6d587ff9c0e0b0191f7c8ab","44e14ad24ed4e1896b58e3c1d6193fc0610cc6e21a92f3c9a8ac67bc978b6976","f3272bc2f0277affeacad3c93171dcd4bc7c538575383c4df580cf642b83737a","d07e40df8180c6a7e476278249f0ecc3879311508d438c07090dc10154d5ddf5","2060373eebe2418bef703d590b16a46efb759eb9e2c74ad4549acdc7b5d36274","7e847db598a3d530154ab56cf948dcfd2ba28a3110d4f9d089664dd5a1181ad2","7dd50e1270967b5b76b98bead3b5590eb536e300359010ccd4a609024af8ee28","ea8dd645f1a59ace5f011b2fb65b64065f953118575481f194acfef027f6ad42","e0b3ceadfb5db4cfdac101beca32b13a753ea1d3fc25444d961bbfe3f58407d3","8f9256a731a1529657224fc797145ac02590fe4c6071ac7d93bf5d091188f6c8","a8cb033b0946d2c86704052b67b09a4ecf2a9a50c59d967280e796552186029b","6e29a435124698a08221af5035643e5f976c144c64ad24f673d5d99d3657f9df","0553cf08e8b399ee08c2f50e136262b64384438d55e5b8bc372f82012cff2b9d","cc6a95b1f37c54bd9dffdf47fc38c9a81f2f0117653ac0d17fed8fc30ea6ff51","276132064abee78fbe14e125167898774bd0a98e2ad22c924b8833cc12385b92","ede79b1e60f324119802ad5d24c8953ffc51453e46a9ee4487cb2013e2b29f84","128d3b01d7891cc9d857bfba313d247e405370d7c1523383f25b7fa5e2430b88","96f7f259b7f9f5b5a252a33934a6e74a823c122e41c9c4c7128992f243b3931e","454e8e851bff00d627bfd2205461262871d4f834b80e449e79837fa2ad90cc18","8733875ff1b16216825b07935bebd50459d8fb506d3714cac7db4a561459267c","7464154004c9af0849cd99d27bcdea1a20a8f85ab0dd7ef12dc8895ae6c0c805","d2d05d3190c3087886fe2797fe4428daf8fe202a633db4ead50f036877624a63","b56b284e9909c5c95690146439e94be78862c5dd425393c9ad459272286e8d5e","7b1f69419d2debbbb06da00cb638efa32467599b503927e3d7081679621dac69","e71b7a090bfd080ea3e90d8dfec63f70a79137436d8e26d0ba23f16f7131fe00","8541a0bc04ac59e8197fc0286f83268a4f9fa274aa5a4a359aafcdce1af866c3","e20f9c57e1d2d5f5407af278ca1f4a6fe5e939d1913a35486c3a78a168bcefb8","058be565ba2690e1573ad6f2b5f5e7ba8a255c846571ed7659f0a216178d50bd","0ecefd86b57a841a84e6cb92db146ff6dc64ff96388ada2654ae485215ecac32","89fbe00ce088f3a533c3ef21fe55d6d66ba377808b4607ff6866d09be0ac2661","87c98e1e69241f2dadbe979884bf5101f405557867d34aab3cc0e06493d786e0","582a86128ba53a2d686ad86c10fc25eaee13c4eb71232c10ec973b3f9be2b9f1","909710baf107ef944d27eb57e31f1eb5e584e252540aa47cf744ee6c49f5e622","c3e7459d390ccb99ede756fd153e307ae2ff6f69cee8a95739daf93af2177b6a","158ff34d85c7de6cdd6b91d741818fc2115b3da2da46b8d41c6ccaf937bd7caf","87d96f1bc5fbb3defe903dd550bb709849429f923137b8f261538101423fb0dd","d1300bee452fdffbad145ef6799bf93c7ecbbac3ba6916c550e4170818dfc74e","45bc16015548d7276facd5409c5edb4181f4b9419abcdd54f24ab98234820f7a","14418a0b5488a6f1a5cd7b1b38607b365957094adc9b8737e22e0e6821cdf936","25b99d4ac663bbc27a20e58d2351f4369aef41172180be343e8777aad214f0e3","0482767ebc9c6948b4d14140a6a82bbde9393633965339fa0712f244de25f9bd","a45b334a89b936a8bc8d6dae32b30210f80b1d1982a6313250b45c68817b6a49","271b3d5eaff8cd4415d38a2b1daa2cdfe1d242ed89fdbadf9dc9041987562ae4","b71e366c3919dd457b0f7ffb0171119dadd60d198162a1434f8c8a64bd5ef27d","2b6d176e56ff3ace8b516def639b11b3385786cfcbb8acdb1eb929f568b7297c","328f887f58fe66011faf950e5298d34262a138ba4f6a5aba607dedf811bbd0b2","4d9a6f4b9e2ac247731c11f8e4e129db0bf29b8f9a2882f48ce4d0b17ad22cdc","f728bce8893f6d544284aafe09a420b7ef10534f17223d50e557e374fd5473b5","0ef4b0eba30734d398bb804391576afae123640fd8a82c83a1f94084bc39f9ad","c7f6ef00a6c20c5277b2cdb904ff0f8398660a8016312cfd141f867d0ed4b34d","5f3c0bfc7fdbf789e4c3ad7a396727ab29df29ecf802a9596f4676e09c61159f","6faec03971a5bf4f1997585f8de68d7ad36d9eb037c40cebd817fc7216c11ea9","726380ea45254b7681d0ed90f0ba647feb5de48a4d53661a9d3e3ea579dee3d9","d369e828648066d6e539f944e837d7a18ef1afa379e3bc260e43f8b3de63883a","409d62c8a387ee443e9cfa97b070e290d2dcbf391c3e0402973982f8fb8df4ec","16f0fb8ba3180733cf92bb830edbcbcff012e20f05133f494277d96d0d6830de","84cec5817d1db3042ccf192c6587199f4c2b17a96ad3a26c554e8b89f2d23289","63cc11fb894168e67488afb96a8b10d28a181bc1616141a514969382d0556ba6","1ed148e92ea7bbef362b2a81e659d316e6f1b198d85db5b272cecbcf49798ee4","6dc9a83201e4ee37027a02e72227204d17d516969f40e644f49831b27905b7ae","006d199f073601aaf609d5b0aaeeea9451f57cf95eaa1d4f05fe382942e00c42","d14d6f4c38978e20f088e2c784762f33c34769cf72f1c5e3f38d81a4be1ec030","019e96dcaa86a339ae3b0211062f82f66a8aac3d4c81c2f468c2efbdd954aeb8","eab9174de09c96a77763908f146b3e8bf4124df719fcc7a8b17c55ea82bdfce2","5205ecf7c5434a72f7e217aaf85b3bfa003f26d4ab8a954efcdab2df206e6529","37bf5d672990edb3dbd1c7c57f4c447708c54cbf4af27782c69e674e2e3be5db","47ef9c77b36c3ba839049a31a398f4905c7f487afa2ef982a7ab0f2e660cbd18","e74edf4192317731e85e2ce50599fc9a7a3e9dfd55f152d3c74d4128557a29c5","e40104b13f35bdb411e53c9149ac13aa6e320523b8550828621f138a8cf01e5d","13e2140907e42723ae54b92f61a1b312b6ef870a057adfc61881714ddbf41c48","760147bc71297612a88c2df0861560b7868419f92295ad66920133b2c16613e1","34a7bf1339338154c66f1756a110240a7ccc84c93dd92efd4123de9349a10664","7eb1cc1ce2d19e979994af126288a91dcdc46557678c0fc6ec84d7e1a6f08503","1991f56c2ebc8cbaec217c48fe1ce5b389699d3fb0a60621c1595f0595be24ad","833fffaf0251f39e4f8db7433361855902e18cf876057c102a32256d6bb537f9","ce0ae06699d416fe8032f060bd19bee58df40faac5271a4a96ceb5ef8025b87b","5264fa05fac55f4395e79249a03e738ee4960b7691622ad4f944291611abcaa3","9cb152073a04d6ad2713fc9e4d9b59e0cabdd5a699706b68e11d44cbb68e7401","1859a6a53642d74edcfd41b822e63e7d9548252307318cb126d682bbaaedaa33","fe3a6e3f74a39b0a38f40a49cd10ffd4627d04bd65494fe4eb58678d4050f6d1","ba6dc5916fb7ea7308f3fe4e649188193483455c43bf0e4275ba51a727615d75","14f02503933159ff8962bec0f44529cb246c4eae0feaefa17416b425f54b18af","c71bde203989c75a82256b158c67376b2a0035f2d625a2391b4c97e35c6d5133","6b64879fe2d9146ce0e7ed100c5cb40b534074831b9e7bd0f966eceff7231699","b3495dda6a698fe2351ba671cacc5457826d8eff7e800f11797f93290335ad41","0b2daaeed9d54163d8d3b2aa94858f4186c188871e90fe22c3905d1caf8b2e97","795707fa3a6a87f11227a0a7ceefab5728c4a5bcc9ecc9e48af837903f815d74","b955fb6d69808fc1fc29efd82e56cd4ead04d3263746c746faa1cae0e3659e65","429288215d36ebd0e9e02e858f2b10e65056cb193c11b868bc0c4e6cd3489950","5c2f9e93907186cb834eddb919c2494b408136728893bbd7119baf51593a4620","8c83c2597130b25f28ec1383b27287bb3640085cb3d77043f36a63a57deea7ef","3a4f36ead5ba0d6981b33e49d39e25f54333cf6a62af732f43ae57056bad951e","4097796518d3b69d17df9b85422d650c7963ad26575ad42132c8689d96a03acd","c7fb4cad507951907607f36acbb1ae9b46427eceefa54afa5505c81ae3c1ff2c","b658c35020517a6a4b531eb4953cb71c20df7ec7c178a56842a8bb349924b1bd","27679e96d1bd38c5938178aaf4abe8627493090b63d6bae2ce8436e6a87ebe4d","734997b41710ba3c422e7ebec66638048fb186ea3d455b9a1bf93fc514be8ce5","21cfd01ca3bbace027f4e1407926a77668c878ba422daa6259b3667ec74bc081","9d4ddfe3c00aa97416d3532e6daa9219793c7127d5e9253f9dd28db922e0c96a","659cf6c1bf89781d08c1312f14c559a1ab424fd3f14647fe6352fb1319a94922","1bae6a80c5acb58cdf89f1038fabe51e441c876635ed9de40774b8de0c89f5ce","181f23b8778b1ae86c5a950de6428c2a60f79431910109d538ed5d5a63821cad","16334558218724324e8b2b13a6115cfeecfb83f9948b66165e7fd046cfe5b0b4","acc51f71d876493164ab3b10ab9bf5c649875dfe2719c3ed6ce31eb3e0d6f288","a73eae6035f3eade262870a642416fcc58f6a7a6ac9d57e067119ca25a51fcea","8aceb205dcc6f814ad99635baf1e40b6e01d06d3fe27b72fd766c6d0b8c0c600","9e9d0d16188e9686d899099b074fd4396147b0fd1bec5e47097a578b53ef47c7","8b224bac26fa90deb3df080ab07ce5b731ea5bcbbe8f7a635bfe9995173f60d1","c5863946c67a824024f75fc7b5002f3bcddd57531c0bbedb2e6f3823048b0870","f537042263ae3379364f4617cb463f1124865145aa5fb9f7c0d22fb81d287025","0fd2f21c02c6492d8feed980d85951238350af938eddd4d066b402e1c3cefbd5","eb8943c33f96d7f63e6c5edddf3f0f5590dbf0d1a82acb2c5aadbcaa52246b6d","30b20e543590d0eed2efd5ebb5b01dd93e6e80e2dbd9553c0ab3baf486666aa7","b4bcaedcf34efce0b1b67b792ee368203c4a4cf381343e807adb780bdca1ee3e","59fcb430bdb10b60c4a562c121646eb21c152af280ee59bcc3d20683c9287377","ef4626e2dcd9d132f1ee10f67be0326f48b61c0f7146c72d435cd2788cc3c402","20a37f152285990381271e0d28e194c672b8d277cd3150ad2218ef4c34907d9f","dc442c4ab1ddb22237b0e5141053516387c45aadd749127234d35a2c1ac7db9e","6a89cb8d575a4ee4ba98d7f89960cd2dee497c250dc58a084d2a4dc665cb53ae","e6b4665398876480ab0f62caed721562e8c63ff69f6c4980b5b90bb6c6b0b496",{"version":"7344c32ee78025dca5273f64cb84c85b0f1ffffda078aa687d746f003471ba90","affectsGlobalScope":true},"e51484e32c1a4224b2248c3e9f31b164fb32055ae493452ee27881b8a0945dc1","fcc8beef29f39f09b1d9c9f99c42f9fed605ab1c28d2a630185f732b9ba53763","fcc8beef29f39f09b1d9c9f99c42f9fed605ab1c28d2a630185f732b9ba53763","1d5668ff0ffdec359095705f8d497038fcbafa813f6f52c2f87f38f97dcdebaf","8f35afdb6572cb18d8537091ffb30713b1526d59bbcd6d29b90135c5843bbe1e","b4cf53283551f96aef7aab951cc012e97ba375010a84704f73ce993719a2f74d","d32d0c35b3bfc9b7a6044a1ffecce2f16dc91df7df168d08660741f6b2afaab0","644922d8a9c4abf0f3eaed9c20b6ba2add883f2807fb561347aaa911429ac1bf","9e30da338acc86b465dcbbb48f2da3e0e1e540ef51fb7b963581237858a59f31","cd06191458fbcd8aae23d0e0df35a080b55c6e1f88d6cb268c46c2c608a900c7","03934de7281fb1b29f3264b7640b99761ca282ca5ee6102e218b94397e05ac8f","17d5d1c685fefd84bfe89e4e9ba314568db34dad26924d71233a37ca5e62859b","461a7997c7f35aee26749653012674567807db158f4d162160204cd5fdd6bae1","b9571b69959fbfe69f2f890407c13e712638d89983ff8023281e112ec81e2d9a","055a0fab26ec6b6af2264eca4e0ebd5cb9921f6afba99a86d061378a7883ab70","1c76c9a1e746c421a9276d70ca2e60956c46d051bb640b4d1f7d9af7ad6c6dcc","496aaa1fda9fc368d8acac5434f53e10a662798157c56fc000360264fa305d63","4f1a26b035e20c756bd8560f752813b35ff0f6c9e00bd5a372ba3c7521d0bf84","ab884b58e04fe8f651b41cedd7b87ffcf25cf1abcf8f4186f4ad7297fd5f97d5","7936c78ed1cf735775e53048bd4790f67bce4888cc17cea6014a3a70d2959734","a46c9704577e63cebdf9ebf53c343b90e4ef2a124696636be272204a51d928b1","10de94618a8d3f3557826a707d9da6cbdec42904acc7534c275aa90ad3cd92b6","c90d168667458d1d760fe529470fa8e486c995ab75e6efc99a36cd81dad3b67f","452234c0b8169349b658a4b5e2b271608879b3914fcc325735ed21b9cb88d58d","a2017ed5f373c69897024ea9c892b352efcd6b42fa5eaffccd156fa1212745e2","4b505e20a8ce6b5dcf400ad0fac45a68e806b897c2f2c00cda9a2c0d46d3d173","14ecfc29e0c44ad4c5e50f9b597492cd8f45a2a635db8b5fe911a5da83e26cf8","bd93a3a1fabff2b95fe9442989cafdda76c3c8949ae1fc4bc75a92d04396d9e2","02ed2766d79a00719ac3cc77851d54bd7197c1b12085ea12126bc2a65068223e","4b84373e192b7e0f8569b65eb16857098a6ee279b75d49223db2a751fdd7efde","dd09ed0a4684004b9481d58d53b53ec24e00c1cd2aa5fd515764819fb239d630","7c37569e586a3276ae7cbc405c9f1c51efdf3f603cc8b76dd2196d1b01c2f9d0","bef359bd6998f4ce186f7450ec3fbd9cf47ee3097d75c26828b6d985c843a48d","696a04758e6c58966e18bb99a64292017fac57f0ba5482e1bc0b617be850b12e","46fe6faf3d6907bb675b5c37df15b6021b9ca1e4f91b25ccc422630b4c1568e3","c45a995ea8fd0d701c3e013dcf7a106809d9b1517c7115ade3f58d4196bd350c","0332891c6714ceea22d919677ba76e7875f4be1104dc1c2a19b9359b7a2e08e4","38a217719a1e847d3b56f0e513075f07740ea536a838c332d02b2ce4288f23be","d51809d133c78da34a13a1b4267e29afb0d979f50acbeb4321e10d74380beeea","68745f37d24b1b5800c45d0c5c00abfcbb031f9be0bcecdafd29405667397abe","fccc4725f7937821ed7744c796c090963929da13a497a05a58ba478d1c1442ef","7537e0e842b0da6682fd234989bac6c8a2fe146520225b142c75f39fb31b2549","29b531d00f444dac2e3479c2def9654fb71a2c0df68aaa7f134a6fed897412f9","60fbce4fe62a585d67228f8c1e43e7f1e5493519ac7f3d0fb383d95c1f690a1b","ec680627cfcc2c14c92a3771593020cd6ef28b20ac2c11595c788c22e5ed8825","baa76e88310b7c17a2ecfcaaf71f1e8851a05c2ca9677ede20e6aa552433ab74","a78939a5e506a5ad80952abaa114d8cb3ebff8b44d78264dd4e2a1b44e33a513","4203181f1c1ba620814585e93d908b79685f053407cd6f80e4c03e0f24f0cb6a","ba886f3b114384a98944ceebf202b91b80796a621bef21234d0b15848f0d88cb","ab43326dbc670b95546e82370aa9a5fc4e74fc26bd957f9d92e307f8f1038248","cb76c9f437a827420a9b8de4a8b928e13c4b846e4d4c134d40f167682bcba381","937861ac75dca790635035e2ff8367f41a38b55e79c4408470ebc0be23fadf18","7b05d6980e722e7635570394e13aeb10aee2d80c1a84f4cce690b40da73a0ad6","888d3a998e1bac2ca8b56e1d8b69ba1ecbf3cc8ba3f44af30937fe1584d1f317","67299dc8693cb640ee6f3c1c0ca177fc6c955387d76069d3187ddfbe831af61f","fb7b0ea0fa69884e099141bd59c29ec276b7f3a527c52a0cf790946c0171ea23","e3595608d75a0baa5a8c725cdfbeea3db443e93220bc4b5e96298b86bd18bf5d","e8f7d5a6afb073c1c2b429bd7b902c919f9127e69b11736abe59485a254d2e39","7e8c4c9afd9f75b38633d7cf1703a7df3b91f11d4944ae52fe25529e13df25a6","e180b1198f3be36b90a6942029dec78250882bd74e8e0b82267cc7d086430aab","f212d052b6247ce6f2158862a31a483450c3dd158faf7e4784890dc8a4e0a413","1a0d230df5a36f488d740d0775aefb650a14f0b7bb9a904d3688c0ba1674cea0","d4edf705d3100b1b503c35ab4bde3fb0d3c047f1c0d8c36867fe264f7bf8d55b","ecd449ea5c78eae5d35085e182cd19f150608fd57a8cafc9fda546d717df4aa9","3d9a0cce3139ec3338fe054d28ba3c262e298a24b673c93436ce988011b4d05f","edbd3a40c9a8d72c4c562347bb0aac97156b5aa135e9cb299201f9d4b35c4735","5f4531a7f835dd9a761fa997f496757b7265098a315fe0d615a99ba171c8164d","24c97750177bca07b982ca6e881d223d774fe98602d0c088b99f5fb92504e7e6","5e8a53c5421aa32e34b6ffc8abc9d933811cc9c49bd283dd7e773cbc178b2cf9","d3a56fd8bdceee9cd4382f84e50c9efcb3fc37149be25ce2b336f3b254858e09","3d9241250ff79102e2eee92162852175846a82f759d53b1ed989cca72bca4f08","6888cd42feb2c2cdc981a53a67c80b592a3428f0ad2376910755034b8c8e0fad","f76661e9cc46eea38c297c7c6c8944e8080fcb6df9216830c499fdb57a9c5747","6130e2e272482f8e1141e63eb2d00fc7d339ee0280313c55abca017145414e41","ebe20b4333eaea785fd71889e2600178db581a161916d1cfd66eaf68730b9b71","314466fd53d678f04602b670042893eba7bfbc82a96280243c4fc8160c8b1d22","9b3eccaca13a2de5809fc5f3479b79965f2716b60204c5d22c75dd51bbd14846","fd5d0b4718f438069e0e6acf41226370d1ecea1c749446e96e39ea2e93eb6614","6a496d225a1e8640f2f416996206f8f75e40a9e8218c97b4ac1f68e2d051e290","e731eaf3779c4fe0738a5c45acc5fa3e5e90e726ee7d85be82eeca9ca94082a2","92c4211e8112893387dcda584c61bf040635341f484ac1ea464519aeba925812","f31ea0388a117d3695b9f99fa8ddbe594c90b9083e0e22477256b6b3abfe7db3","cd7fe3ac8ca36dd1b07e1516fb053b51958eb231e6a0cf46c92616c1d07eab4e","deceee831c0176b38c8e12f33c896b80ac729ab2cc9cad11e763064b0c740cad",{"version":"563a3efff52d1074432dacdb897effe689829f0348504b7aecf4350f9023cacd","affectsGlobalScope":true},"b8e32efd94c7db5de828d621358f2eb20776ee48e57ab6160a4c96fb71ab6b3b","db544fcb7d0224dc857ca00b2db6b567e4c87173a9e565333e05e827747d3e68","fecb5388cc0848298df6239787ef6991afd2c6a56cb71c075de852c4b635ac67","ff3ee8e3a8812f24f48f5b637bafd12e00eeefa8207f81b36d01ae5ea9d4588f","5a494fc44870eaf5e5d484506d1625b586c3619cdd7884071d02399f821665d4","961850ad47be0f9a0c707a013f93e9840f898c83b78a99d77fa799facf18e989","867c3c22fa8055e3ae6005d2317e54e430aa4499f34b9d3ada6a98a3a03caf08","2c501b735db4c7f155821c401d1b2ec139d0c2039d49123c297b38322e1661ee","1b9bce1a26c77a55ca98231de2140eb6d8c1a03cde4f2a89357d437861506a60","60d5de4a036980f0f2e3610b0a6bfea3431d6a2e3533c25e44bdbd0b9d83aae7","fa350a5eed359b6811f02cd057a9accd5a1e35a8ca35322a3a2d4e96b6361740","fd5ee42b8f915a44d29b787ff6357eecc52d7cbfa4d7a0dbfd8ecf02245e0f95","4565c1f76f63b08c1cd451258d23985073c96e4c1ab0818fc6f6531941337794","7bb4122fb5c3b73417521ef49c162fd12f2be188e06477614b82184c5235762b","46e6262e758b1e8012018344cce0b458f6701e43147ecdc689f6058b10775ef2","53f043dd85e09b6c58f9f62ca253a3297c33481a347b3edb9c9fb30bef51aea2","778f50e082c3dfc4eb24b18996167098ddc00697ea78fe6430b1e6939a10ed86","f50aeb9f44ba0611ca5482b8907d1b626c47c8d21a4a7dffec027875c5e2e39c","ffbc4e41590daeeb816d09dae40f3501eb784576f87d71533b1e032e8fef37c9","32dadc047a8ac7ac4554620d4ef69ee3182534f8e5e7bd67b20af96a53d5154d","75df00f150da38eec49d2d92f4be5b226b73ee2bf32486aa4dd764ccfc3a4ac8","5bc8b682a1023014f85ba9ed86af826f6bd89d71ec0537055ddfe0dd50db9901","21f8cafbfd9c4f494b53807686d6cf26032fddad15872095b399863b6ca96574","cfc025582cabbe689b20b310fa259480ccb8002d1478fc0078ce06514c9619e1","8b715eb42a268a1706ece58afda6579a019b3f054b09abd83732945bdfd0ad7c","b4fc31e2cace0117359bb7ef567d76a32ee65e239a1c421138feba48c8278edb","ef32d1331b46f32d8661a86b2f19f2bc4ae02374dd933dae1301eeb7af17362a","68c4dc753ef949fcc9711d5c19fc60d8b7ac5a5f601b5b11e0fdf0b0e04fdc2b","d74aafe0316d36b464a04e97d8c034012872a0ca594b96461397124b875d0496","28bc2b4b62bd4ba96d663484489dcdd795102eba5c6e49b7500284fb1b9d40ce","6609e5d290d7ec5d5f0f49a9c48a08aeab8908beb4131720ebbb6c7a55df61a8","a0b04ea6ec4aaba417fce6ac08d29536cf9dde0640bace0630986becef0f53d1","39c52261600e58ac4d0d3c0ef84b2b771af1679d4d1ed232553de09acedad89f","a4dcedfc593283ccd46b224827752bbdb1f44033efd0829b7aad6ff8106594cc","2fbdeb74aab13b6e1808c1ec521bc524faf37f0bd71ecee6dd9582a499a7aa0c","ea686f733cb76a3ab518d5f4e69c179c1697f2f17a3d19b36b750fef2a710e42","c91fc6fc29c22817970568c6d62e4e10df1d193b709102fd4b0309051493befa","f97a3745ef4fdf4f0d12233183ee4519ef14cc2c81f1a12079e21ff920c1e673","0d11aac159f2fe901c37e7710941ddc879b5749434840ca4c347626fb6edf8f0","62e5ed4676c53751c8b2cde9b509fcb5ae2d933f8868c98ea5a0b9090d629e97","670186fb4fa0a2ea24cdb1db08bfddc132e3e9a9795f11f2c4e68dcc42c16db1","6c8fe55f2ab4ff573c192f43bf4ddc04db5ff7ffabccc569980db46b12402aee","6ba11a29797cbd8f2641dede6342ad1437c8a27d6aaaca6cecf8bebc3e5c2cfd","33a1157a264ef155864c43aa9ee6988b86f6989fd46acd7173741718e645acf6","6570e44c92f351ec2ef171fdc3973e3022f5a412da08ce557def22d8e7143683","6ba11a29797cbd8f2641dede6342ad1437c8a27d6aaaca6cecf8bebc3e5c2cfd","f3b74a770a3426788d100b988db3d39c6441414eec35a2efa48e4faf19ed7c08","4dec8b4e273a23d48fe8b90c3b23e11140b196637106a1e6251f095e98483109","62e5ed4676c53751c8b2cde9b509fcb5ae2d933f8868c98ea5a0b9090d629e97","3f5067eda9b22893f6d04b7fbf423e07238b5ca04802cff742504b78a8d0de63","6fa003fa22011673e5f0618654b2b29f32306d170110c4e801de397c2270db0a","27f1dda1bfd96b94220de04e225c67f1d232e07097db0b973027df1ed9e8a35a","679d7df22bf42d8761ef3f8acdac6d305384fa11df7d222de32c939405abda22","172f31b538f6e3f70c2d001d665d5a46c4b043f707ba822b4d906d59bd9c229d","7af025cf1b7afde27e5deb448d9517a5f1ba47a02523b7ab93501a218695b5c6","db148f3dec84e638fd672b2ff3826fd0c2e57e0c3c3ff306d1800766ad89313c","ad11263137bab9662497c8d5a09fcecae0f5d84e791d1079ee988a0f226cf726","e35fef205376d6a3eb91308eb737ab9d03717f77d361fe34a69bc8d1800c76d8","1c697d5571b23e58c638327b0959ab8ce7a3a1192f3fa5847c545e8a35a88b81","f5c930992a2ea87d96ffc5c17f964501d10160136e4bdf8281446b0c4481b079","8b8ae4783419c0cbba56335ae9af63181593d876a542d61a823a887a5b3fc713","a5cc00517576130211ef4b1a05c9968592774f5e67b6db3b2f935edd34886220","2c02593e8570e02aff42533da041deecfa0f52c115bc9031f9eec37a90995153","1e82684bfd260833f90219907c17251dd5c5f6d92a71eb005cd550eb42224607","091e3045270bd0b0b12765940128af773344d085621395001c2e4649c0c33c67","f0d56ec8d982bcb82230aa47b0d2747b6ccc8be1b439f4f3e24b20021ac12f30","c1f143281fa2178579eaef19ebe393a0270cac3fafb71a5ec521f149e872c26f","f8a229fb7b268e10480dda6181693678f57ee8b4216ac47ae0f54bf20f01ed72","6dcf86d8b2b6a6f9e2059b39d576ead37d55abd3cc9b67305b07974ece62c364","f60bbf96db27dd73d32ca5c0ccbe03c8f72aba2b87760ac96ac15b57c2d9ceb0","7ad7e739715eafbf8fcb3814b4ec4856ef55e0bbf2f614eeb68199fa3f2d4da0","f01e37e255b2afc08accfcf3a84f8d3c6f2747d1f49e71287a81ca2386c0c9c1","6dcb7cbb7930c7ecdfe9fb820c9cad7c34384e884c74fd345a51063df70e586b","450904f66cd4c251f97208f0be4db89cacb7a1d0f14eb50b808a9ba7a13c8a0f","5ebe4b473dbffcfab4d01b124d62bafc19b15e060b21820f6b9d6d3c732f7852","aa44780a5dfa9df4f2524332299f01115f5281e9c8bf1a2e1cac2a5b81e5beff","d03f27224746abc875b58c6e63b939ad88c54de8b0f0fa63ad731fb806b743fa","f999d004d73a4c0d3587fc5448eef49f9d1915e0218d94573c5ce1f1747167af","611d8477b3b7d62795f9958337eccb9a298a7a13bd1f0827f7351853e06a0943","7f4d7d3426e39f1be70dc80fe6bb73134591aa355026500d811a8365cfceb429","44cbb0793a8d5bfe9d83689fdb00fd3006ee6ab9f53e08f1f37a97915f526ba4","544b8b4579e2948e5634d077e943a2ab0da94009c7386f37d3a213cf25910753","93f004b26b2266547d832d063f9d6a0a9659118e63b1dff209cf57df02512d99","57603b6783f49fa2aaddbd38a52e14bdcae2cd8f82f2d27e883b3d01f4137283","368f93346276f218181aef3e3f6209f0420aede864eef3f4054dd80373d01f95","7a3cbb4281154ea358de672d3f2f62b19c1002d2c01b225cf6f5f090c17a6364","ce9f2d650cd422bc0853fa358dd0f639cf90b17136f35d1b6efb022d80176cd0","c71865cfd9b17e4cf0d76e2655e024f749d2e3972bcd2783a41f8f234d7ce638","de37d8c94824b218de4da433498755ae9a623751374bcf3471550bbac13c5f72","61f7793c2af361a28fec685805b69e73cf3d09b2709d644c0605e5a045e6fd7b","6fca3d52e9da91755a7a1969eda0be7dfd7e8dff957a506aa1e1ccc07d6496f9","e8c3680bbb156e878fb2677f06618335b29d17202ce35837895e5258501ffd2e","ac0f6ceacec4521a0963c317a3339820ca9107c04e54d50cfca0d3fa17610f5f","b3a84d29e1a7c24840e889e072c77407f9172e937e621407a897eabe60728a57","d62d364c794422ed8c47010b055b583e2f2091a94c304132e69e46fc153478c5","eba8332b8783cea122bf028bf6783970e49f631f95355ff1292686d0bd60c277","19644d9cb88159cb62093bb84a9201f37dc6c8a8325136364dfeeaf3d8db9342","d4d98bb95e40df66eb0e734dacadebb0222595008c9dd31ed0f52fef580d8693","79bdbcf55efccead17851d99746d729cc6d79148ebc87905d80ff9c3e07a6e9a","621ba043ce3c7cf5d0a4c2659ef21288c2670ecd272f0b87e89129ab9428feae","0158ce9b6ae7812448bf2e0b0c38f88fdc43347490a30912381502eec6615edb","713172e888625f466e005c0e2665212c76e4bfb1df5997075fec868c3262a3bb","757604e7fd60306cd65493335f56784e18ff0dadf0c5531f828aa452aab0916f","644d24d013f27b64205d8e6141b22b516deef6d6e46629f83668dc82f97c1015","bcf7013edaf631bccc853d45126adf6bd0dd4bf1664ac543308633e31956df5b","615365470b35097606ab4a2486fbe0e2f48e0877d30c8c27e980147d9aea8058","a3c5c10d92886a209f1626b3846bbdfdd0d53b3c3b543826ebacc4053d2aa656","66d128495fc2e689a3ea72e8c52ae93e3c59f9832a474db9ee080c8ea21003a8","cb97fc6b34b4269f5e321a887aa9defa0748e3a28c9d2fba829512269098bac0","f86eca71288dc7fcf2770db4cbf6776a5c82a8a2a15398a987fe4ddbe1212e6d","53064df23afe68d9c04365aa3fdf6066d9167da0d3aefdddda8afef7bce740e5","c2c17ff4a5b485668090317372d65176918f7b5d47f9569fc9dd858a0c6bcfee","e45ddf28c1cd9b336426ce0865b31cedfaf487817b72d24907a7147aa5a9bd21","f29f86b22364494500af4f9f40995a50df3723ce59f64a7431c812a4247d874b","705f065a0f7acbaff9725203c4970f9c255ebf735a8bdbd8bb2704d7a813acc1","75db6ed890802f38745a1037f034acf45e1efdade4c1cc50769ea7e32f112a91","b81528a46f226c140c29681167b138af6408805cbd18a5b28ca86ac9654ff298","41156f841d4dd6bf13b69b37125e41287fc6030573ec9c0b263a78fe3ed9e21c","ca24c45bc6bd44387a1e95e1696e4cd2c1b191fafe4f3b25b8cd5aab52d0a93f","da1bcc4e13420dc54cf52a643d71c72c78c853ee33c1a76a3793ee363c743614","7cf17f5fb9b7f080ca615ce156767b33ca3440fec9a791e74ed35e503a2ad7fa","e5d5ca7e185123a790032342b02739659e777f9cc3f5af5dd9653dfac0df3dee","4136d06896b2c9b49275c82e56dee7372a221fa9ea41c2d9fb5660ecad907bea","ae9aefa43ea32f638c324f44ecd841620fb4e7e87a18ef21a9ab55cb2c5d7ee0","a6de4e80b822fbeb662c2f1b1217030326c84eac84d91434c5e45e9a4c51870c","b247803c6b8b7b045667cfd3769a956a82bcd240975992ec33dac6b221f5b1f3","88ff614f8c58574e5096c97606cf31f923c458066070a61e15141b8d05c8cc4b","0a52850c4373899c7dbb7e61adc536cfbedd780cc65fe33f16d570a5d684ffb7","271162f20c22eb92be5f26c33103730d76ead864ed3640c004b4562c82266cd4","1924013723279a9bdf3cdcae2178ebbedda0d8787deb6c45c8ed56fe309aa696","ac0f6ceacec4521a0963c317a3339820ca9107c04e54d50cfca0d3fa17610f5f","217289604fd2f435f5c215b25f4798c1a37383b5b0e5878c408cb11fffe7eb52","37f169778c80d8828a3e80b1c8d1ffa50a74b0c753e2fbdf9781005a307a1be2","40b58e2a31cb1aebafc800d8d1fc123c2706b93fc121d8e39fe89c9aeb3fe5d1","2079ecaa463ee8fd946b7f20682d4db7e0c10455e60e71fc2f987e68974e5e8e","f705f92d29877a70c7898745bf0e30a958e7bf35ce740ae4753743c136e0f8a0","6907d63ee7aaee241d05233950896bb521dc2895b52aace06499ef449208fd53","fe0712e84dabf398523e6c5d06784270853cb839d0de4655758698102acee8b4","d5da393a9df4e647c5c4c94813b7d288f48563f1966511e744cc664e7426df94","d533627c219e154700a5b929f7e1b07529e3c2da2ebb313c27848fbeee2e18b8","db19ab08deee31dce6fe7901716649f4d2790dbee4ad9357374308d78e928eb4","1aa03008fc2a9cf47538182365763214a29e062793e33ef099bc9d92d75cecac","a05baba0f8cd9acdbab41d22f3cb79fc757f241acd9e6d9ccd4e5c144b7e479d","99e5ce0b6d30d94c9612b01b95e088f6e23ebd0cfa4f5445ea8cfdff300c509d","5e64ad86e1e74c23af0ee2139c0e73415c30ef68a78142121193060addcc4309","dab0f4d396246644d86b8a6148cb5377d025d518b14b2b3d09b1fc9c9a55eb82","f964606361c9133fe5f298c873bd0bf8584c74b8e5b0209955bc2c516d73ca16","8a9cee03ca1d9c15ccf5d342a599147546fec40e93e80e458b9d0a47877c4e2c","825f48cce9d110c551cb0c510ebd2afe671b64d8bd63d85c7cd9ee4426df4feb","a38db2be6407e3da89ba45ab27281e0c5f241199167d4d3e3854d6f738605340","810ce8897eac96def7f2ffc64034caa41e520c7320fa164807daa76478898448","fa9e38160bfc54bf2d39e215da092b74a66103e56568eda31820cb9c21bc1795","33893d5f52beb2c98bcfca8659dc8d7dbd46bf28ba1cfe05a110ca376c1def82","e3f43c9d6cf8c35c7205342ff0daf3b16bc559bfeb049d9185b7202d41609a25","ca459f2aa18dfd686f8b1e111a9081da411d6d66c44989357d175cbe102e5010","06084f1b118ecbabdbad8ab4784572da95295bafaec097e80cee3cd4990fd22b","624d9dc24731a98770a4da065b9a80b43f103d869c6905b9fbed339a3bbc029c","2283297ec18e23fff9ad8c4c8f48bbcc9c72b5bef40ea98fd83f45d4c1d09e80","0ca6bf573a7647bf9630b36d06864574d2b62db7c9374528a4c244511478c520","8947a64d63a899cee11747ae37cf49f9f65567215c3150ca4c528f2b3a673619","9826bded5ed73c32b3588017e1ea2dfd98ec51808c86981123ff23c3cbf2bc4b","5f76314a4fb5f1c9b6c77b3dc8fdc7f890145178af0a5c8b49bd967f8c102be0","d943a0f1dc7752827b373e18fe954e575890d435db903d474cfc069362d41f1b","ac3da07bf983117f079c6da49a5889c752db40e57d1f3a2fe5f8f7a8015fb0ea","3cc82b01950c76fca2c6c315819ddee0503b1fc623b2e9582acb9daab126fe60","998becb7949d5fd82d04c09385c6491726d1d85f40178092192ea76e879972b1","0fe07f08b111cd0f8678e08bd0ced76ed5adb0f9d05a75854cf05b685e0ecfea","3eba548a4ec3cab217d012c3fccb6eed26d726a2a3dd7c5377da68db34619894","9e6854f538607248a02356c2513c0bda73a5de2b39002b6375cb63fc5c0c7f3a","03a84b39aa5fdb26fe8f04ed166f4ce6a0f43d98552cf6bc97b9fa71f8a5b004","5ce2899fd842ec0a6511834cb3f6921ee8dce1b0df3474f70df18e231902a039","729d60f099644f5eae049e4edd921440acaa68e0f9934bc32d2dd28c1e17c6bf","f9f2f91d24b1678c0ba9c040d35ef3929baa347c710bd31328c6b5a8e8d79f31","eb33db5f522b6f3a1371435dc65e0b711fa35dbdc5d019f3e5a7148a86c6ae0e","adc4c05f38dafe2105dabf7c0ac16bf03f1437e3d54d553e99f5de82867270b0","e5aee8f9fc8d315163280377d27f4f765da3c807a4caa5f157eb61f55a1fcdd3","e7ef3ef99e0b4320166c78b432a69b31c2294f5fe06022fafafcdaec119e745b","9cc944f06bec0eb02f78c1b1980c8b236c9beb510cbd6006f55fffc9aaadc943","496b4c9da73439338a44bafa58eeeb8246056d9d73da48ccec91a72f892d8729","38c53f578c83ca4e2c50675e5363c54bb8195f20f7f26c06dcda2515465e9d8e","80aa73eb65d4900a6b068ac06d26ad64b01ec67d3f7eb65b6596ee71f48cf3b2","437955b4309ce45a83b16f7c2497cd6141bb537327d59712fc591f1d1c4df07f","45c7955bfaf7d69080990da8b2d6d607ab9ef5f5f5ac89d41062190896ef23d4","bc8ae2ca9ecf87d3eb18986f2d6c5d7e0ee505ed73ae1c258927e205fa2a4f19","0366f693be6b1842bc815da17b7dd8e847e9415812aae2b867fe0a1d77cb3b2a","312dee6cc61d0c59ade8454573ebe991422dafd4b4168da060878032fe4fd021","80f2f46f5597aa9231691015f7cc76e85f3dae06f8673e193573da4754a09596","dea582bbc97a9a9104b44d8f6a1a88ef9b3d829cb00d192b7a0ed89ac742c7bf","8555f44e88be371d79abc966a56ab121fa364eb57c58071d1d10620a00ce39fe","b4ac29a495cdb133f638536b965bdbfad048ee9332057d24f3890070831ae269","c61c2442ebca46f3c5b3a5e48f612339c16103654d25b70806c99ac32b15a05d","a812963ac94fb5b9ed2ffa4852038a1b2a6ac2d5d86223d89b243e1e45434eb2","870d8974edd499ed172f0e39fcc3290938c1f46bb17e6bdae27dc42a1a55116f","6418c7d7bbd752876b266fdadbc620556821fd42af8a1628196a625da17c2f45","bec9f6339736935b0f35273999b3dc388006b3be0b2847296e90d2bb288bbbd2","f442b03a07b3a01ed23123bff9aacbee2c90d67babfec702e1792b820198a3e4","6ea893565c2fd0a59d623a56dc686e58b9daf3a4b08d1857cd6747e2669e2f1e","4315e4336e414381dc3a8e3bcd684051c1dbbaa2d5bd46a35f83d1e9bcd72cde","e5f775b6acce93aea5439182aabb84109b223fe3b1cc28f59b1500049c404038","4a46a8fbdf357ad39c166621f56d6da8bb1929ac955de8c63ca0fa60897059bc","8511de5f4005b15938e212209664da0fac4eed134cf1a5ad79028c75fdc0d1d1","f96971033e8f640608f9a05b515b6877a64f0cbfd43b6beb1d67ab10546d3bd0","665446a38358b26f19b010edcf9431803142a2a447f8bfa6246c3ea1ac44514b","db0750d554251c97a911ed187d3ef8d031e66c727376462824fc21bd3c65efa2","7ca4d28996db19a7ea90aca2944035689958fe5344e2a7da49656d9dbce73880","0abb96b0c9d47148e4586a70748edd1443c338c78d7e416a3fbe32ca97734ede","2f999c6e1e6245a3850ec73ae6007fa0d7f19159affe622d2c652c5f4b79916f","2e2de9f3062162e444726f4de587f5e5761f46501931e19e44eec34b09b09c77","b1d73bf4ccf28dba1494eae442c846c3f34633b2a4d0e322334ab0aa671997ae","65f90844e1b4c277a53118f98ffdd32195acfc1cc1d5e76992aa523b53c2209c","679f37e56cbe24cb17f799db30e73667e3e8207f49cb90040ab0adb3cd710acc","854fd71887f8c9444bf761f3332a0f8888c4fb0f072474e02a3cf61bb1f43b72","f6409952cf6983f49f397d5c791a6946fdaada20ca573939612f1b4e8fcc9411","b89b3d731ed94ca407c535328277a70012661421fa497e0eb6f662966c98c0c6","09cc747adf5d8710bcfb26eaee37b1b1c8903f02e3e540f86f3813bd1937c1f7","6f3f5d7c3362cb27ff68785d392b0a8c882f3717409b1d0a8f8577ceaa1d4563","1b1b48bc24587dbd802f28a3ce27969af3609c6d5b36baa5f88349cb10d842a5","ee860231f54b988583a1ab882cf7476d276f2f407bd70203f897889e98019c4b","605aa4c537c4d51199e6740d20989990f4c11f658529c49d0138eb545170adcc","ea07794608a7632f5d6306412a7636f0b41ecf3ae3b43fffbd506c569e7c78a9","81679538ffb5422ea684f76e2fe49992a83ba8527174702acf64d3a206f4ce3c","d0002daeb9d3e6af94c2e246b78c7147106a319e06e2084ad8a3f1e99fe1bb97","cacab9fa6b96583432a37aae032d109655da16ab60c5a06b95a4d091df71766d","a60cb224ff4d922bfd6cbfaca3815038641a529c83e5f450da3f98330b523fcd","49274b6a2dcb051bdec7924f41adc2c35be30fcab29acea5d674ceff68b50c2f","0e95e8bbcdafdaac77d9145af5323916fb9c6c0a19ae1e8d75b83c184bdb28e1","ce21e8304d949b8e54f5a6d5cb3006bd7d34548e62c4ecdc5368bf2c0697321d",{"version":"c89decd78221eeb0fdf549eeb2f802f24dcbe7037ba0048aa4fc28a9c11937c0","signature":"2d128bc1b19af420a969dd8cf2cf424449b2c52dda2099fa7b46582efab49a69"},{"version":"71c495cfae097220c40ca34bbb0cf52af21192970649d203201d1700b52a2bbd","signature":"16523e036ab18ea22cf88371d03a660b1f75041738491bb2c4f52da348361ea5"},{"version":"cb60b140f1762598142e4b9f2e26bb11d9bf5e8c42ff433f910d22b85ed0b8a0","signature":"a0a5a245582a984377ec04d21dfe7e455b9e04f13418188eb8ee449b8db40bfd"},{"version":"ad2bcdf6e8c9bb04411ddde06ae388b984e0d0f0148c5b047a94c18b9dfa4637","signature":"d32efe8829197b43e68e5575a057f7377c237e1e3310b3ad4da72960ae211c25"},{"version":"62b57c388f5055adec5828a6a4ad07dcf4823ce546a740baf29b8499301a079d","signature":"a1b9ab4e5df652bb89e05aecb78049c00930202952f4be9d4475e53e61fb0768"},{"version":"1e1212d980291e444554c03f7af4037e4639b6a704ba6937c670fbbaeb97424e","signature":"cf7c1b5bd7bbb10d2748ea7932f936604f7f9347847e7c389f96620527d527a3"},{"version":"65cbcaa11e0eb7d19a2462235bf4a68c6df9d25420a514ac10899ef6fc8041fc","signature":"7626f26725bc350317a8e2b89dbe9edd37e990a00e56a27daf01b2f01abb4958"},{"version":"0dd6d9e7a0d45fca415cdf1fdf3c8e43e0831c4157fa7684b6d36ab8e739f2c3","signature":"773937839e32fc149142f1bda1d6d1afa30436455e5c0cbfa0dd1c959b9eda6d"},{"version":"90c557eeeb2f53e5449c626398f8e6d5f1fbe0c8b857cc4c931ea3fdc3021e00","signature":"ba66b2f12e37076e85c3acc68eadec1ddec85984634605757d3e68189d61c724"},{"version":"bc1a7e18d472040beddf2464791e3549019a604a442a3deecb36e2f8082e3492","signature":"713b7ccc4a7429350af9b2295002af01c70add0d3238212c4dfcab697276bdff"},{"version":"5a0bfa4ce6e7635758fd24f6c136f9b1bc6983a22c8b88a9e63303b53f1945e2","signature":"c2a6077378521c1e2549c31110a15e63f2e7a3d793066e55326fd22abe54fc26"},{"version":"3ad6c777cc4ad03edcf7d822dcdccaebeb9f95f76b84aedef0fb60311b155f31","signature":"04e4b24a05e2b2f7c9d04a647ae31a7e5cd03f3aadd54938be6a738942825611"},{"version":"1a9c5bd21e9b05324061af2bcb03dc672c593d5053b3a1336c7aea952fcba6d4","signature":"3e889ceb863d935afafcb48bec3c00075bd6c3ffb76e7b65bd532cb73cd44f2a"},"c8e857b6224783e90301f09988fb3c237fe24f4ebf04778d0cbe8147a26fffe7","df33f22efcbdd885a1ea377b014e0c1dfbe2e42d184d85b26ea38db8ee7834c4","f400febd2140549f95c47b2b9a45841c495dfeb51cc1639950fa307cd06a7213","7048016c91c6203433420b9e16db56eec9c3f5d5a1301398e9907ac1fed63b58","a4234645829a455706bf2d7b85642ee3c96bfe1cfddc9918e25bac9ce2062465","9ff2d17592dec933b2b9e423fab8b8bc20feed486f16d35c75edd77c061de6e3","fe9fc5b80b53a1982fe8fc0f14a002941b471213717536987d0cf4093a0c90a0","4921f21de15ba1e7d1d5c83cf17466d30d4371bc9acf0c2c98015ebc646702ef","f728f13a2965aacfb75807a27837509c2ab20a4bb7b0c9242e9b5ca2e5576d22","c340ac804b0c549d62956f78a877dda3b150e79954be0673e1fc55f4a415f118","2bfe95f5f0ea1a7928d7495c4f3df92cdc7b24872f50b4584e90350255181839","9dfe677f6d3a486eebe1101b4cf6d4ec1c4f9ee24cc5b5391f27b1a519c926f7","2766c9a60df883b515c418a938f3c8fd932241c89aba12aedf418e02a73017ce","394967bc5f7707312a95cd7da0e5b30b736b7ab2f25817a8fea2d73b9398d102","014a4afcc1674f40c7d77ca215e68bb3b0a254c2c925bcaa9932b6fb8f1ccd4e","f816538db9388ac17bd354cf38d52da6c01d9a83f0589b3ff579af80cff0c8c6","d2e0c04dce50f51b98ee32fd461dfa6e416a4b703c3d6d7e7fb7e68eca57a8de","a8995e0a2eae0cdcd287dca4cf468ea640a270967ed32678d6fbf89e9f56d76d","b151ad192b8e11b5ca8234d589abd2ae9c3fc229cdbe2651e9599f104fe5aa6b","c37f352ab276b3cd4117f29e4cc70ed8ac911f3d63758ca45202a1a052fa9d00","c97ffd10ec4e8d2ae3da391ca8a7ff71b745594588acc5d5bdef9c6da3e221bc","74c373c562b48a0bde3ee68ac563403883b81cabe15c5ada4642a559cbd5d04e","d42fe36f52e0ae09274753ed0fdedb32c42c2ad6ad247c81e6bd9982d1762004","87f162804c7a5615d3ea9bdb2c828cd1d1f8378d5e2a9c3be1bd45c12f1fc1a5","ccb92f285e2f3a3462262945fa59506aebe6ec569e9fec223d45d41c7c6cd447","04e45000cf1381e6a84196aa01ca811ab192ca0a09debacc9e75dcfc6777bae1","566007f48fa4cc7d29e4cb5cce9c315ccd52b72300d2d45ab0c639889e42d455","4c2f8fb8a8f4afce6e05b9c554c012eb50147084933d78f7d218108740afd803","6f72b3ebad0276cfcc7291fd2aefd1fbbd229487ec1acbbad03e798e8760e02e","096681898d7131c1183f164ccfec478d99a9efa3744a1b6617116bc6713ed7be","2c9626288e967ebb03ec2bc27ea504f6f829b1686f65b86fd5074d53e0160d70","4de35fb3800a92324c59c1d2ed28a4dc1284d507d27ef2eed680c2f9ebb32cd2","4c3cccf01f76ca4292746b6dfebd6df4382eb7a05315724116feacecf952f106","492d1d21f79a8fa084e9dfd8fab89247301a49f1a0c12765b99c30a0ad8629ff","69872cabf40dd4399939184cd7c5e47da62a9df811d3f56d193a437817a85b21","19d00382e69115eeb1214d9b865030b61ec14f1bd5e91fb6e2b75acf5a6bef80","2f0a5a8ef5c6f5866d3caf04151422d05e64765ee250a7e9defc62908cfe73af","79726fbe0854724f5bc3f16d4e40c0b320bbaa7a6296d1d782d70909f3b3a2eb","6d391889910947acbe7d110271463ef74e7f65ae372d355756b1a6b0a987168d","b3dadc705ad865a3acd5b40561ac0dcbce38fa28872ecb903eb586bd64cfa8b6","8181adc6c7145eb6b2596249f3a2e1ff2fa7ebc604e73fe583f98c4b40916d6a","dc84bb520982504eb30b09b870b32be8eccff2cd9beb963efd6a78971ae104b6","bafdca74b47f54e116a9f2d589d39f1c677c777198b96a677a2d2f628b43c8f5","9ccc168fc7cb696b5f60f216c72881db1f6c2d8e39eadd6c68130711f8eddd19","6187a2dae6a9d910f272bfae324625437343f43a6ff48a28a5c5dd5e9cfc2d5f","f063f87a44b1e92948bd5ef6db5b8cadef75218126e75ff02df83196e2b43c4b","333df4996910e46b00aa9b7c8be938f6c5c99bfbf3a306596e56af9fff485acb","deaf2e9bfb510a40e9413d5e940f96bf5a98a144b4e09a0e512efe12bfe10e9b","de2395fb1d7aa90b75e52395ca02441e3a5ec66aa4283fb9ced22e05c8591159","64be79c9e846ee074b3a6fb3becdbb7ac2b0386e1e1c680e43984ec8e2c2bbb9","9c09e723f7747efc123e19f0ced5f3e144bbc3f40a6e1644a8c23437c4e3527f","36fc129c8e3ad288656ea0e9ba0112728c7ec9507c75c6a3bce6d66f821a31d5","3771470dde36546305e0431b0f107e2175d94e11f09b116611156f134364127e","18c6715ca6b4304a314ff9adb864bd9266fc73813efd33d2992a7c6a8c6e7f73","90cde8ac2173d2008c51996e52db2113e7a277718689f59cd3507f934ced2ac2","69d01aac664fe15d1f3135885cd9652cca6d7d3591787124ae88c6264140f4b1","55ab3dd3c8452b12f9097653247c83d49530b7ea5fe2cb9ef887434e366aee8c","abd2ce77050bfd6da9017f3e4d7661e11f5dc1c5323b780587829c49fcac0d26","d9dfcbbd2f1229ce6216cb36c23d106487a66f44d72e68fd9b6cb21186b360cd","244abd05ca8a96a813bf46ddb76c46675427dd3a13434d06d55e477021a876ef","5298f6656d93b1e49cf9c7828306b8aefc0aa39ac56c0a1226f1d4fba50a2019","93268ed85b0177943983c9e62986795dcb4db5226732883e43c6008a24078d7f","843fa59ad0b6b285865b336b2cbc71cdc471e0076a43d773d580cb8ba2d7030d","aa2d452401748a5b296bf6c362b9788418b0ab09ee35f87a89ba6b3daa929872","a4ef3c3f6f0aadacac6b21320d0d5d77236360e755183802e307afd38f1cbcc9","853b1daed2861381ddda861a0450ce031c280d04caec035cc7433872643871c6","1058ed9becf0c63ba0a5f56caaafbfd0bf79edf2159c2f2f2fe39a423ae548ae","8b6eab9a4a523909ee1c698a10d332c544aa1fb363f482fe60f79c4d59ca2662","f2b2c244b10a8e87192b8730ed5b413623bf9ea59f2bf7322545da5ae6eae54b","92bbeada67d476b858679032b2c7b260b65dbccc42a27d0084953767d1a8cf46","545afad55926e207ac8bdd9b44bb68f0bbffc5314e1f3889d4a9ad020ea10445","e76a7e0b4f2f08e2bef00eacc036515b176020ab6b0313380dd7a5bd557a17f0","fabd983e4148e2dce2a817c8c5cdbbc9cf7540445c2126a88f4bf9c3e29562b2","a80c5c5bab0eb6cc1b3276ac276e5b618ead5de62ec8b0e419ea5259af0a9355","d8cf5ded7dd2d5ce6c4e77f4e72e3e1d74bb953940a93d3291fb79158e1afc6e","bdb10c13a7ababaae91932d0957ef01cd8a789979cd0b606a2106d198848b16c","0fd3f9fed4dd35b1b07c18b4c3f612b7542c91835ad8a26e0e83d905709543dc","441b5f5ac4619df9dbf436ecdb9f0bbaacf8696e6fdb2f81c6f5b1db76f5a1c0","5d2284728400ee7b4fd1acd69e48d649d4056916cc70950a0000e5d70a32a750","27ef186120f9e7ee90686aa7ad5163eb5c7f4cdeb19bb87850c4a5fe4b8e05e8","4f1f9e056e0c9d23031367b4c7e7eedffb3e1ed58e64befc90749ca4dd9363ee","2b0ccf76bcf10f61612135f951a74327ea0a2d5a80f397b767e0e0b08cdac265","4e42e643f05a7fa69581a1a697a1cf967d9b2657dd9dd66e59d90500ec053ba0","0ea8485dc0bb7d2a258a93b16305e17fb5be9f877a9df88de7023a9821c537ab","5c221ba5333b775cef94d4a30076cc30730cceba649e9d30c5a7224a698c8825","d83e8f0c10477fb4a7729a51aaad853cee81e0e332581dd2244da09e5526b5ff","c8933a5b693306696e78315dca1fa57f6f5493fed44cd90aa2d4a4d354dd6516","af8e2bf3df20cd2e6b8d744dd83499e174609d0c88864af3f30cd43671e719f5","4186fd8b51535399c7ad1edc08f9c4ebb2a9e8e327b131cc1f950c5dfbb0c358","b92965f503f55830702062f9e0832fabfbded49ff28728686a6fd84aa32f454d","172dbc7933ff46ba3b2efe8b5c7828fd4f0d45c08755df8200213b6055d57f2e","89e2ec7ed42725f89fa537c38f20144782bec6c5710e467a46a647647c8255cf","5165882999957fa041e423a4fb64627dcb310bf50183af70a6ee8e10a584b0c3","390997d64e1e5721fa807aa9e05c97086f58627170d9a7ed84b127126a3e5202","00cf8ed9b47860a5f8cc0a65d7a41f85a7026f68162057728abc9249943a8629","fc8b086c99f6d721eae8125a96833e0ba1762d00b80aad1d55c7a8b59d007466","ff72c74ccdc5570c4a75a93e605a5586596444d96048d52c72f322da183c556d","b8755448066177191edcd0b7e19e7fe44d69ed6dc97b16a420b7aa9070e2b850","822a0c843f492ad2dc815080f24d4ddac4817a9df0de8cd35830e88fbbafbbe4","467865324b9f66a1b8f68d9350c5aa0e749eec499e4863fe017b16ea8bcaccdf","863bd77d5546877e19594759a901cc7b75da8d27336d4351e54413ec12032d09","a17a62c94da321c0bf2315c35033e313daf1298a75aa43a01a4daf6937980c01","851271a09d3c2db3eab80d64beb468d775a9818df06a826ba58925c900231ccb","da2c95cd1f0f9cc19f3dd599b4c8fb0930eccb78a5c73f683e7ea98262d2f55e","e40d3ca85fb1362763067506784635aa28863640cf7cf9be9e8c1c521c0fbbd5","77a2f84e19aca9d03efdf0c484aba8daad3fd23c70b72e63aca78fadf71b448d","00c5b6248c69e66729e5c4acb239db849b1497d7eb111fed3eba979432461ebf","8e13abf75e9394f3a4b1d0b3f99468e15f4c7e2115153d2a1ca3c0de035bad1c","07097dab1c068118806fecb8544aba3cca30965d0864b1998af1bee326a9990c","c490ca6eb9149c28e4f2def6acb1bc058d160edb40fd249cf2a70c206a8cfecc","7c9aab9a76abba65aa6389e41707d57ea0288dac9a8b6359465dcb462d2cfaa1","97fbe30fd1b61b26f807ae1c78b681b0999af71cd9604c08a1d45e44690ca0c2","ef91bf45a3d149db0b9e4e612ed1400c35f6a3d2a09669d1441add612d5f16b8","dacebdc0353168f259724bccfd273b892e883baf36cf3dee21cf4178f3ef9ea0","5416fb031a72377c3c17faa2041428a5f19f9d46a70b645dda6e3293fd0ca8ce","95611472fd03e0992070caa3a5387133e76a079719994d237947f6bcf67f9bca","6141d19bfa7698f362e84460856ace80a1eac3eab1956b188427988f4cd8e750","1acded787e1fc09fd56c004d3ba5b719916c06b61976338a92a2f04ec05cba5c","8fb0d41cd90f47b9148e4a474fb03484d9af1735871321a2f57f456e40a7e319","a25cd4cf54bcdd109dd46274e2369fc1cad6d74350b5642441d2b9eef515c3bf","af4b9f16e50a0ae803745150e4c091e86ab95f3dac649286af28505258f7a189","3d209a6c3c53366b3bcb72dcf04a7ceda57362cae6ac47dbb783321934a0c5ad","4766770027d93a5ad1d4cc880cce405b4c6f67c64303ab34b347d6428eb783f2","43d2bec085f0fab54d7b9dfa3f5c5ce65e30da6a19d82ed37d1d41867682f86e","e5efb9781a0ef18d60cbb8afa261489efd260d87642c095cacba0b09b2684fcf","775ca7538a2f9bc674ebe5f3cb8aa8fa346ef4c1faec4c5b13b4784a744854dc","c0037c7c6fb8031f7047a1ccdb381762862b48429e9ab07bac8fc35fc5b5dd14","af4db63c6e4d55df1ad7f3dabdde31bc30555debf1cd6b79ea65a36c52bf199c","d291ffc234a58061b8192f74422f2e51fb87f6d10e82c30a555bccf9641b3e38","6d683695e9765b29165bb0823f88755211d48949f0b95a9a4236802afddf41e1","8fcd568ba937d867544cd8e726f35a515690ad041387fdebc93d820c8720e08c","81a0ff507ece65e130c1dd870ba79b8337c1fd345db7b154a2749282c994d2d5","64e2ffc72047548fa3c04095abb9dab48e2eaac169161fd2ed3564dea0c67e57","b525d2fc6b694512a877219ebba25d5fa244f99253a5bbe6c6421f8d71b1c806","d695f0d65f5fba0e275cf7801399575c272b86e7bf8e70133f8fc03517305b1d","0836f15e5e7dcad64fd50d49a39267da34371d1c2b803b38dffcfabcd2ff604e","56eff313f885482d44e4aa7cefdd55f7d0d92a91c1ddf9cd73c533abc36f4dff","022ff6b725f6ab95b1c4d229893b3047002a9c1fab6798c8fe63797ec1e63dc5","5e64d04301aa6ae6bf0f3435d07804889342873ab2875a16c827db9e6543002d","0b8c3effe0c65129d493be140da1a83eb61a1e83481d441dd2bc359a926b453e","068db2994f5926e888462b0852ada2c24f2cb50028f034f475407957ca51c6cd","59106b469557319ad26f40f054861be3fd2cf09911c3b66df280b9340a1d9caf","69e8e2dc21b0636f671485867555439facd68ee9e234fc9190c3b42e7f1a74e9","5fb0c0cae187f6554769cd4ff36575ddbc43078a4fdf9b17a5c0c25dfa9a9f2b","b19badf31df455f10cf44fda9f6a0e0b42d6e970ac122b66c5da5d683fa270d4","71b6fe5c85eb877c3e3ed2f142b95a69f97905c34f11fc6d9052a4317e7f6bae","bd55536c0f989f59af6ca66cbc8121485f978f4e07c3df1688623c5f898058c6","dcb868c613ccd06b1a3ff56ee235e5987820c0c8bbd77fedc9af4dcfdd4c54bf","f3d1b3cd130e3cd67fe8e06256deb5d678243c6976ea498c81a48e542efb7529","772b881836efbdceb7ae8d3ae038f14ec83444397d8429b866312dcd78714dde","314d516eb3bf1eda07e898935edcbd1e74739493c8ad444e82181f8a020eef2c","8cfced8e57c64563f91e90a76a6df2d8f934c90a425327a9ed5393bc88c27d97","67bd754a8775c81794c9fc84b1a1e9fca44a402fa7d93fcdad4ba2d37737d929","5128e32c57068eb09d5189eb68681ca7d0e5e4b0cdedecbef9c67689f0970876","7fcdedd29146e5a2a6c86eda652f8485a1eeda1b8646825bbf729023f6ea6013","671f5e3a931c2737f8dfa43b34c4a320eca27fc6584ecef890ddd7374cee5cb7","ff213315eebd3ff05e01b383f704d79d8139aad5cb0d6a13c082f2e29625adbc","83ed351a10ef17b7811d3c06fc2775e36b6911278326d55da8d1eef8ff2f29df","2f5f146f1d6c04cf89ae0e9b4cf2b064b2ce4319ba6a5bf18ab8fb29db1cfd1a","7fc2b96a8465725bf774bd490c383edd5ee3dfe0d38c13551d082cae2de4041e","9eaeb6696e4218cb5bded9ee27c3e95589ad4af1fd4b97ccdca43eadd62c94d5","fd580a99cb9bb84288da00eea67dce300bdef06d4da2a727c0fc466d2922dca2","b82809d4468b6ba4d72437adaab7ca273547c59974e954c48f655a4b1bdca429","c6455d4ed4f7337bcb885c61372c7d9b03991995ed73e29023bad502d1336f0a","b5e6f0491b5a2002eb9b1146165cf915ee58e0fddf7f2adb5f2aa4bc44b4fb83","f534aef095a62fb82f57768fc52995d3e58d95e0a1671b0256a4704802aee818","cdc6f1d471882782cdac7442dbdad65aede5f749c09799a84918bd916eb6d6db","2475197472c609662f09660e3964a86aa355cea0e671653656800690bb508b7c","b4067760d0447747d82b6848b640168d656d0b916c3add2ec94c3c4dea92fc9f","c6c591a17f9c0c2821baf15f775f5c7d6dd4a0786365ee9c182d7a97e38ad96a","ede44ddf9d274a859e9f1f34333d5f0e8cf2167c3265f81d5280d37b872b4552","6317aba53c9152998bb1f8bd593f55730084d05c00c774ff72a3aa4d687a6dbb","26f1bd15980b19d925be98afde3918a6a181435b87e9b7c70d15726ecbfff0e5","57af4faf6847adff5048f82929b9a7d44619d482f571534539ae96a59bb29d3a","874770f851ac64a93aaddfb86a2f901f158711911fee14a98a67fe32533ee48b","3d933e519ad9cc8cf811124f50d0bc14223cdea9f17adf155f11d190ceb2a6c8","d5dfce61a7bf994d2cb711af824efa4de9afa5854d34e6725b9c69d925b6b2dc","f77d1e10417bf43f8fa5d18916935f342d4d443e371206ede7239faaf9abbbb8","c94e0b8815b72ba924c6b8aa666b25903d949a7ab0d38ed84e4bf65da3d06a3b","15db84e660fdcd8468f23973ab83c31d7fd28bdddb30b0aed16cfa051aafe900","b273c241dd08c6276fd35be413c64508ae50f847fa052bf7781799b51da8e9e9","3bc0bbef6d7fb63002fe80167db350b9677cfce5872c0cc7ecec42ba8248ded6","4880c6a85442934b81f3b1a92cb6b43df36f8c1b56b6822eb8cbc8c10c438462","1bfdd8c1710a3d1654746ca17f512f4a162968a28e1be1a3a1fdd2a8e5bf385f","5405aedafdf272dde53b89036199aaed20d81ddc5ec4bea0cb1ab40232fff3fe","db2ee45168db78cc83a4368546e0959318374d7256cbd5fa5692a430d5830a59","49993b0eaa14d6db6c334ef0e8b1440c06fee2a21ffd4dea64178880bd3d45a2","fb9d9dc0a51cb4014d0e5d5f230ec06ffc4eb6caae6eecfe82ea672b7f3c6967","84f44079a0793547d3a629feb8f37d8ef6d07cb5bb5fdeefd887f89e9be871f6","295c5ec088a1bfc286e8dbdc9807958588979988cd7a74ad32be774a6f6ea512","f15129c62ed04410ac0a3326ae6fa5ef7229bbb1b0cbfa252b5c558505a38253","4bf500d9a554d43cb9133d60f1b3f58ca98b0f794486d1377f3effc551b40faf","8c95fe5a655ea1c78f0335f8da58e70d98e72fe915987c3b61c6df49d6e276d1","4bd434d3055d1b4588f9d7522d44c43611341de7227db9718a700703c608e822","935507b695f420fddff2d41ddc12ff3935931a3f26d6aa65afbb276bfdf51cb4","e851c14c9dbe365592f5084c76d4b801e2f80302f82cebbe7c2b86095b3ae08a","40b3e953e9ea51a86a1e5b60a2355eeb780f2f8ce895ece252910d3e0a033a16","0264b432aace8398f174e819a0fc4dc196d5aed49ae65aae071fc2ec8e6dc029","3b29bb23855a1924264c3a30b5c73b00c52a57c2ffb5f91c48c9572e71048f19","8b9b2e76db07d8926bcc432c9bdfb38af390568951b39fe122d8251b954f9ed2","96e85c6fa102741a25418ab2c8f740c994e27ea86fd6518a17ec01a84b64dd5c","9525b28a4fa959c8d8c7d6815f842f78c67b40def9160afdced5c9daf14cd4a8","0e59a6944a52f52138315b6658fb1d217fa017b7abec12006c491d51e07fb56d","cfa8acfeb9d68702aa6249b7295ca73ea598e441f014cd4184b6e2a3ea9a275c","21b0c616f61cd6699135a34a500f7df30022abf9358ba612f10668ea3c988e00","9ad1d0b171f7bb9f484ad156e97f0d8e760a5fee13e342831669c7b2d1137a30","7ccadd4ba126bb2c0564bfb85ddd7d084aa5f2880cc2d0149fbe183fd5ceb6d1","ebbde5a8a356a1547ac6ecdfba7547036a5ada116011cb96634c32df1cf69084","e703eded767e3a944ac1f7c58c201a0821da1d68c88d6ba94bb985a347c53e42","99953f3f1f9deae755b97ed3f43ce2bee2ae1324c21c1e5fa9285c0fe7b5077f","2afd452bfa6ebaacbead1ca5d8ab6eda3064d1ea7df60f2f8a2e8e69b40259e9","dae0f3382477d65621b86a085bdb0caabf49e6980e9f50ee1506b7466c4d678d","e5793b3f4cbd73c841790264db591d3abe9bd09128302a2901fedd2353ab24d5","41ed74193a13f64a53705a83e243235920fd58d4b115b4a9f5d122362cda7662","478e31b207faa7110b04f6a406240f26b06243eb2d2cff3234c3fc8dd075bf6c","3ef0c5634d9aabee346f9ba056c1c5d977f2e811f6d13c082614c9062cd4b624","1ddb49c7f8fc4b9e4da2d5ddca91b4e2763fe7d17aa79940bd60406f3e2739bd","d5b01eab562dc40986a5ceb908519dc7f02a7ded2bcb74318317a75714dbc54c","b19ef44e991aa150a19a9f84be1fd1c4d86496241300fd904216762246700623","87df6cf2565a88dae3ec50e403e9ef6b434ad3e34d922fe11924299018b38e58","9d999d30b52fb0b916f7a64c468f6d5c7a994e0c1ef74d363562e9bda3cb8b99","9b1b05f88ded21046391276ff60d2d987bf160d77b40399e07b7bdbfe2e38b31","3c80bf6873eb3b95cd590aab8eb1612f0f7cef6a30b3f49535844f7cecd99351","da367ede4ebd5ff4cb1cf9e6bc8eb35848b23c57c22c53360e53dc772c7be8f9","4337acbd8896efb7e7d8d6e0eca78607fc7c1a9ad2bb228240f13f97b3492f1f","505c7800f8195961302dee715870b7212bdfb667e5e47de76447151dd35a40f1","cf5a3eed6cd493d198b0c1eacf70486d8bd527fc411d57660caf2c93b5ea0fb6","900e344adae3c65076c9ba4ee1a77c6db19fb0c7e54d7ce23c28ff8d272cba26","bcc5186a38d1eecf60b2c4d1e3eb9abd8ab91cb492f384a9d2ed7bcda2abd0d5","0ec1b41954fea9def7d9d87e0f3beea2ba3ec5b7beb769f308cfe32ad2968669","51189c085256f11da13b22792f1d7c928f8a8e9d9b6c7b38e956e72a51ef8219","504f509e23f2ab3a8018533925c034a340fbce4af9e77a1f71a8ddffbe0c19fa","635c049483e13e1dc8bee72dde300c40d350046cff59b202d41a12ec8c733d27","7fd8d5f70ea745e1a0338de7aaacd9bd6ff086ce6de75dcf91749c77d1e23831","78d2a7795bfd2be490937e8b01968a0acca8a6bdf5933570bc013806049d4175","db49833b6e9aa54b535076f40615349a7465005367a787b50ba7b92421e26442","6a936fc917de40c44ca81331ee7d7a71dc30ae1895871e7be7b6ed85d96cc41f","bdd2a764cf87c4ab1efd7084597d1ca4ba17f6b6496553095ecca5a14b5d4278","ddef8e6676fd572ee3de174ad28df05c7b3803542d7318482b8f98779ff25612","34eae3bc7f5bfb515d2ec163ccd4b63fdb73ad7f66564707686d84f42a8b7c35","d240d106cf9bc3c0efdb323d807b944ce16ac5d837ecef5b75f1e66d606b2a72","639d5a26be297431e0bcc9f71f969fd7d84319fc03b5e1c672ea10fb0094c616","770c3e6367c2802c027c0b1f86928f288e11ad77ac2f454d7f682460eab30a0c","c9dd2760e0419a059cf733c38ef5d44eeca3fc647f9c201d88656e5040f5a3a7","16766b8f3d1bba66ac8167e6407be6c490d4462e802f67c140b1174869db5b67","f9267391788ac81ca54dfae32c5d86e99a19abaee9b172b2f8d98a3c2b578a2f","92441638c0fa88072ef9f7b296a30e806bac70219ce2736ef33c8941259d9b70","8774efbaf39f9ea3a0ff5b1c662c224babee5abb3d754796278e30eb2e51ae3c","e634b47a7d3f9468572a7c9af1fe2f52687ee1afb23ba5568205a7a4c55662ef","1cbef47ee169c717a1ef7ea91b15582c61ac721fd5f5671de95c3df9f026db9a","0db0ee49f803c9b901dfe06be9c8fb6a1c05f98664ca34c68e0da575eae76f2b","4b745fcadf040899979b6b26e24aca6d2fa2bbe52a919d67f717bfe0339354a3","bc57f3550b3fd3b7d31b9a278d0b491dd45d170e37c4046a3105fdea9ebe5f89","b5f7093d62a228669dd56edd0bcb86a0cf0b46db4816a3967b4632503c21b93c","4d70bbb1f35f345b2c2e1b5c9b8174d5397bba76ffef12656bca16ce9a1830d3","a004fc80aa8f78dfb1d47b0e098fe646e759311c276b6b27404f5e356528f22d","c8933d9afe6c5ee7ecbeec5aa01f6b37d3c2be2f7dd203ee75ee4850164007cb","b1129b38f1eea70951ece3ccd1cc3e1d094379b64d3958ba8ce55b0ec0083434","b2bb10f992cfd1cf831eb005311a80f7f28bc14cfac5883f17e75f758d1354e1","149288ae23bb3b31ffe5cfb7eea669fc6872e41901d60be932af2581601fc70f","01a0fd262c8fdc6c91078255c4fe2f8602fd4fe4c753b2eae88537585b21dddf","deb69e6754a61784daadc35b318544b0aa69048ebfb142073c62b7f46bb1d5d0","60eef77c9b5cec20516907628f849845975a8137773ddb0bcb53fc2ea7d28870","67bcdcbd8cece34ae28180c636908af1b118fa9603d0d4b7dea877156d4de519","5a1c2cee26d1f8d9bb15b334f5b2df7de27a3944bff9ccf71d3b69c588612bda","a04d60b205af1f28461f3d2f5a8222ec2d8af54d436bc53a0460756e07e4207d","14c85d4debb2e0c8939f81b85cb9ab4543f70c8fe53be5fb5caf1192677c8ca4","c507cdc9757c048620ff08a85b9cf6278598eb1738d729fdbfa1e387a35e639a","4a4807c3096f49a463476742e3b5d23ccf0e087e43c017891c332ae5b8ad667d","0cec41f583efa1f1033a4d546d926ee949756f19040bb65807c5a3ab6f3b8449","73b1eda15491d4f3052d6fac202190e76d6453fce832034bd29901cb198448b9","08c66989383183f3d7c43346617c8f466bef28f1e3eb4da829316d548cdbdf80","1f283476bbeaa589fe644fe6ba9da223baf118ecd4756863deae7362b246aff3","0a8f91ace4d1803eb2a50079c9e233fb262b0027d19aa250eb7ecbf6319e52d6","65bab52912be03b374ab591d73ee40aff3a465ac20bc0f2024b4c80ac5ce8397","6a647bf0620a4a7777527c688c62636a503e8b4d5e680037503066dd2af6d0dd","f1466e4d708815280c849956a506e132b7dc243907b9c8e07d52862e32dfcd91","cb4b99f8e47f57df841c95fcb1afc28488a2b5442e3524f6261e611b86105331","473d9ca5b242db0471d418336f410922eadd290679914f37ef21ee26dbeee2b4","2ffeb6ad0b074d1cfa3dc9671dad062b08129d1e8a8988b727dd2ce9fd4298d8","fa1d4332a68d84300895af592811f65f5f1d725ed0664f17d5c215a63408b6b4","7a09768c36d8b7d8e44b6085031712559362b28a54f133b803bed19408676cdf","f0b807278b2619fbe0acb9833bd285acabbf31da3592da949f4668a2e4bcbcf0","bc6419ca69c35169941d9d0f7a15c483a82ac601c3448257f29a1123bc2399e1","45f530610645ca6e25621ce8e7b3cf6c28cd5988871bc68b3772488bd8e45c25","2d3e715ca71765b491ae8bd76257e8ccfe97201c605dadc4e6532bb62e4f6eee","c519419c11e61347181ba3b77e8d560d8cc7614b6231cacefe206b41474792d4","24823640771cf82865c3b1cb48a8a88119b69e56aef594171cc0570f35f60b8a","30398045bda704d03d23e78a37095aa56e69ab2dd8bb7304b15df9e183b9800a","9a816fe54ea736ecf02b6865c10157724cdb5ba3f57ead02d9216b2dd4bd0d5f","a67582f2933f5b6faebba3484c99e78b529aa016369b768021726e400c93ddb8","96cd7367cc076d36d9f10cbe34b91e94467caf9b64a7a0fe1c4f6c8287e0a1b5","17c7be2c601e4b7e6292932997e491ff874418bef9ee6137e69ea6ef497e0e5d","eb7ed3b69718cf40c1ab8ce9a0e917819e0ef0b7480ba2890cddbb94a1386b10","7a7cec0720ee6d20e08fa9def697b149a94db1763bbec6e1ab5da8d7726ebddc","c024677c477a9dd20e7aba894c2f3e6ef81c4076af932a7fc00c210543cd53bc","ec67ae56b7943bea6c0363b474048559ed90a3d1ebc660453f041d45e223122c","e84626067725d75771368f7f33a6b8898cfcff1190f4e9bde24c48f9fa818993","f3ba20ed94c93bf36db218afaba8d7b8f0c2db22948fc3e4fcb2d28d86046c23","1183b4555c6bf2b06466da0cfd2a460d4bbd7b158f925e129d07c18ec181ea9a",{"version":"5169d45fe9ecf2ce59192033a4e25c64433063ac2ef05cb17f0465b74f156e5b","signature":"b9af00e8142cb2e0fba332fdee86a77208b1f96a6072a64ac67d10f605ccd7a2"},{"version":"f3a34b2aa0cf3703067de577407980f470774ff3c3ebb53fea93297c2c844470","signature":"48e28f89363e043bbcf4c186fb28035a4aa27d8bdb8c676775540c4e77da3ff6"},{"version":"9a6202e559b06ec9f7678ceff49fc1bed512517261b581a1a3df791299c5ccde","signature":"54f2189e640a7022ddf8f5c914f7be6c03cacea767e2400db1c1f4f6738fc81e"},{"version":"7ee30a70f95d72c239beddf0f037d6948a28d63721f9ec7930796a3e740c359e","signature":"afaa4be93c45bb6877b01b89688fc34303488296eaab34cbe09ee5c2b9ba983a"},{"version":"73872a49f810630c8bc2306f5016cf6b512d224fbb44a4813150cfef3f70296b","signature":"a0c743891b61af4e310db202862f6e35e033cd6d8eb5a53aae52538fc78aa958"},{"version":"075f071c17f448cfe48c460ed634bda0986620f30f5724044c16a5d9a9500cb2","signature":"b5962c3410ee3541786042e55c892f84212f96a4b935b053de2df349c20127b8"},{"version":"7f18ecbf17f77ae6b5a931d5bc60fff464ef35772284184204ee43e726ccd039","signature":"c9a3c0856fe7d542ab10a001bb9c1cee127373dfd5a32a99373b7258bbc56172"},{"version":"f6311bcec2fd18487e6e0efd9f7d657c45e1780183ed9acda074d03b0e0cf28e","signature":"e9bf8c11a4888be05ad9653ec784cc79c253cf83f1af099d7868d481001c2535"},{"version":"aac9f0cfc531f545d713565e37c9773639511058fe29a9bd08f91f828ef7b8b2","signature":"232b42941ca16a2026c86b4f8b356ba4e4087e0679f7062bf2d6ae0c2fa4ed85"},{"version":"6c8d8a4d8249b00290e6844ead971bf28fb1deffc5962dbd6f3251fc12bdace1","signature":"1e5089a9707620b337d003384ef898e6ef4741f2017386a073fc9dcb6cc1f53e"},{"version":"2543aa7efe3f83cbb92bdc51cbae8ec71251b93ce98036ffcb75b9be73914786","signature":"2e2b5d0b712929a21a44a1c2c642c96471d7e464c85c74450135881c370e6b1c"},{"version":"15718225d3f00a523e3288ea559e04b6ae6be7d449bcc8cf933f6c0aafb57c61","signature":"6e2576b37b39f1f97433456032c97940363910f9443419505e5c38386a5014e9"},"189266dd5f90a981910c70d7dfa05e2bca901a4f8a2680d7030c3abbfb5b1e23",{"version":"80125f59bccc6e2239ecdde884d533f7ed6e2649f15568c0fa6994ea2c5312d7","signature":"c9fca20c3d2d378c55ad98d18d974866d7b8658fee6e54547654fd2118b0a387"},{"version":"b2c8881036f60a961694f2a4ac64f99c5929f2c552a3d412ac2debf5f4eee9ea","signature":"f72fc6b5fdb73b9c3ed88d2ceecde8bd5ce71ad357f8e2ccb8ddcbb710617400"},{"version":"1ac5223528b18c054d6f467a0e8320f9861eadd5e988f27c588e972bbce1afe4","signature":"0656e19024c38a89a9663b8992382984a72a3dc16e149f185adbcd86767b42b8"},{"version":"4d0ee8ca034f3da7b143ebd476c854fbf326c3018d18309c5344f1aaed062ef8","signature":"671b1de2a3dc117c207dd851f297d523517e21085bd9b5bd2dc79f602a236868"},"c0951f4f6de296d84250efb862f7a55de1de07ed9e2dbd9400f8f5af32ceec6e",{"version":"bb2f627a4710181b672dd000751dcf84f7f56447709d9a51d59eeb17fe2eb89b","signature":"05fc5063ad0dde2b17fd8fef7931a071db9f5c3e86d551097b2ad942b1becf64"},{"version":"6fb82c5e989c3118db13369cdec272d8732ac2019b9245c80bfd442520754c27","signature":"4aa1557c587d9c8d31a104790a1b3a4e49dbfcac2df37102cc30e14279555f88"},{"version":"c8c394abbbd08dafb67f530c98dbb70ae5828bee0ce8df40bde3501c1c151579","signature":"bf5bd5ed3422b2b7c2a9c366430f80b339230258d6235bf2f337e8cbc8b2557e"},{"version":"6c0cdd2cb4d34dec62f6e3384bc1d41dd9884a12915433e248e82b02deae4040","signature":"1fda0f1b693091ea4d320dd4886c969a743d9ecb5337d32af4ab530bb0b36be8"},{"version":"e51c9666eeb063bbd48ac9da3b054fcd02d4a8beabf91385136cc933e0dede0e","signature":"06afa2209a6ca196e45d5604070cc7438086fe990afb76f88a6b8910d8ffd452"},{"version":"076478b5ae8c757a30e50d6b18247ec07d5dc59a2b4713db28b47d79247a8061","signature":"88a52034e5775059536f2ee556ae1e78621a76bdcecd4d52bad11f1b281e4adf"},{"version":"57d7f816a5386dc3e46f70045d83be87b1886a3cb42fc7c1c033ad80ca97055c","signature":"c3ab5175100dc8ddfb424307bf2c041e63e35c556274aa9f8e5857d41aa7acb8"},"8087d5bbb33b99652a7ab81fbf7f44a95c472cabad13c7b0c359e2c4e92acb20","4462e64439586fa3c04666ad552c782f40eb91e0449cbca5970b17e24779eada","bf6ab949a21a76c941b33daba997e55356185dc9df14c44627dd0b81291f6769","1240207af1ae4f111ba3401b1f74ef70e2144dab80f7587031e1dc6e0cc3ff2c","c8fa11e44c9a89efd1cf96978b1332008eb076283f14bfb501fdbc4bc51ff682","704ed75cfc1b493a4b58fe77944cca74f4bc770744ea1a115a3e92cafea7c785","6fc2c5f88aed9511a354feac33d991ff71895bfb28192ce7a7dd8e98e658c7df","4ab459e4af1f23f07bc065fb950bcb08e60e94813bfbed7653c74693fa6c89bf","dd945cebc4fd2c769f9dece499cb394b3139af300e5a50415ef0cd69787df4ca","49df3b0bdf612ee8a8fe140e0f0726a79c4ae4c1c3e88fc7104d95e568143f0c","a12f766ea3cea22091abbabbfb036dd769e138bdd841c568000b3309c5120819","e0e1987960434400d972824708d0321b17357c2727de7c34da21c32c16edd6c6","5be16dead8e0dfebb103eb684c8289663b1433f2e103dffa9df9bb1cf42b3f6c","c7cc5ef6c9c9d9a7e031629bc969c4f02dbd1b86cd712179ded51acba045193f","61001741fb532ef380514d0b8d1efdabdb0fc9b3f203a305083e85944c31efab","143ff32e36a67403b792a9f898666df1d20085cb99c37852685563a863500c3e","a719308e77a49590b448d31a003380afce1cac68b7487cdea530e46251835d14","5934fbf254d989c5ea1867d665a325b755e16a0666f61a66f005724124cd89d3","ff65c6d7099713f4bc85efee3d0a970e1a75b8dca2085d52a841cd411b15afd5","17b0ae96ab6fabf3be24fcd5dfba6af5467473c422b77fa4e0f01aecaa9fa268","f0c830a2347615f3d9313bc6e6c8104f6561cccec64cbe2009b38e6e5cbb09c6","424e7cc96d600aac53717f07dcb49222b8514f61c6138b6897f9081fa5d15782","7ca619bc8cad3dbe952fc0f8d538279d773ebb2dffd69f0dc0d529254c25fd4d","b3713889e2a5ff74b21fcc6d702c19d5b500c44dd719dd6a4b8de876aad26402","b3d5daf319b049b326a6943b27fb815516be6d8f650d349353611242a640b11e","a5348b389d300b1b81eb6f694ff8b4a9d59bec5be58bfad91f0a3065c1a7d472","e1606f6f9b21f460f6c9e49233d965f6b5fd5c11c6dce8ab707673da6c2dcb51","5d20e4111e6f5053bba05b22fe9a59e199b3cb9432440251dba4dc000334d698","cd6ed63b5e8e8953722d219adebf7455587eb41d3cb9862a0228e7b3895a2bc0","91e270e453f44468f5c261334e2ee861f12dafcaa3067cb9c74119a5378fbf30","7142cf79b160600971683c8ac781f47fda18679be19fcaba62375345ebcb0588","2111fc00c9e38489bad5288ade2705976a694e79b16815c0755d0ba51c57a99d","e593cec5bd5792ce955a16744dca2fd9f5c4c081c7ed28d039002abf30b3d5fd","1aa5a4f29b89868499d2ad15dab74cc31caebddc348c2b0e08f200720c0531b6","f3333fceb2473d81b27ab9aeb0a2d93a4cf4a347fb682eb708df2a15dd3b7753","26a42c405a199c1fbe1e59e17b8b01c473fce219bbb60fcb5eef7618b4421305","67fb79a21aa9a3746a640d33211a9e8a723421da259c2b30cb30c3bdfedb64cc","44f6f69d78e12f103c0be0788b67ea29092f29fadfb2129c192cb1ad08ecec2b","28b1bee846d2ce041eb44f0ad2f0308376ff04a59f6e303da4f03eaf29e6ca1a","6220a68feca506953a38f09a4bebe128c1caa76d291d8249d2d898eeb1902b66","3f2a55d23da0dc9078a9b92be1174a23f641b974356b1a2dc6a42d2b8a41003a","bdb02f34f0b36a86409bdff3fe363c917b3d27f0c315869756c7cc07358a029c","d6e21f5e5c67716ce4b86bbd139bfea56627c7d67af45753c8b4c70889dcbacf","ed68fd2cf5ab6639fd5fad6ae5a42f1f444f237bd4d025386fb13f36c41577a7","61ea7c2e39d7006b2f3271a4eafe1ce75fe38e8c2427b92a21d2fe20cbf40f3c","910501415c9b698aa3803474a39b373eb9259d37c35ddd6acaebf56616fb25c7","bbd9c3adf0c1dc9c296d6d67e8d7e377bf64ecc42d2751c1b6bc3f7038ef3b24","71db1aeac4ee42ccfc6aad825f5cc0cdf8e5ca5c8444c1a37a3bf34825aee64b","7f9c6c1a18c449b70017a5975c2a28d5ed62aaa931cbba39a1b669ff7756982c","d8901853ca9c479339f03ee59419186e3dbd39328c9a1e32a73d0beefb42f336","ab7bb5dba3fe401248362cc14112d795e79abd3b0e7f9422e9ffd0344cd2fc20","f601b641cef407810ae0d7dbd7bb717fa110595fec0e5830e4f57346ab6ab408","21c72dec7df96d192a3559439232e452e9d75e92275d739dd1879a53d70084cd","fc9851cbf213bc89add00ad98a56b89a880432c8fe8ea4293b86fd1b06213dcc","9e0bd5e0ca2125b38334fc057c606b9609f560d51367a565c9dcbfd00796e2fb","8e9e3caf31415d2c04d341ece890ff955c3d45ace5ac6e9d4044e834e7112e46","00d9e51c0ead63336eadd43d41b986f165e702bfedfdc271d1b9cb7d100487b4","e5bf8eaa4adcdc67a8c6ce07bd7bf7b948acf56f5fb74eec1f8019d73eb3ff90","c35b4a086108301febca3e0b664bd256133c3c2b588872a6b84c289ccf223ef3","bc7eb1d552227982af0c6fb722e1937d732ba22db4eb1102777841597a768ce1","72ccb55f0bfeded8a2b5e4908b72092c5d0d2152333d2fc29cbb9a54ba4b5f56","7a02b819f2dd16941b648447af0f25818752a51ca03c00ee9bdcaa7b3eb6498c","00d1edf1b83c202908048c3548eed81c548c588a9482bd9c1a5b25a65f2042f7","da3ccdf75c259f58c5127d0d923bc2f170652a6db58f6e16eca774a533d17f88","1b127d9000a7da654dd80c7d845cbe95c1f7f5593686341803d215d62a3357e1","b06a99bb36a4608e707962e049d8ef61202a89640066647736af8e2766d834c2","71d935259abb0db19ec610c606246202d8f9d9431dd64aa39f6513b6cb1a1a0d","78647004e18e4c16b8a2e8345fca9267573d1c5a29e11ddfee71858fd077ef6e","0804044cd0488cb7212ddbc1d0f8e1a5bd32970335dbfc613052304a1b0318f9","b725acb041d2a18fde8f46c48a1408418489c4aa222f559b1ef47bf267cb4be0","85084ae98c1d319e38ef99b1216d3372a9afd7a368022c01c3351b339d52cb58","898ec2410fae172e0a9416448b0838bed286322a5c0c8959e8e39400cd4c5697","692345a43bac37c507fa7065c554258435ab821bbe4fb44b513a70063e932b45","cddd50d7bd9d7fddda91a576db9f61655d1a55e2d870f154485812f6e39d4c15","0539583b089247b73a21eb4a5f7e43208a129df6300d6b829dc1039b79b6c8c4","7aba43bc7764fcd02232382c780c3e99ef8dbfdac3c58605a0b3781fab3d8044","522edc786ed48304671b935cf7d3ed63acc6636ab9888c6e130b97a6aea92b46","1e1ed5600d80406a10428e349af8b6f09949cd5054043ea8588903e8f9e8d705","de21641eb8edcbc08dd0db4ee70eea907cd07fe72267340b5571c92647f10a77","a53039ba614075aeb702271701981babbd0d4f4dcbf319ddee4c08fb8196cc7a","6758f7b72fa4d38f4f4b865516d3d031795c947a45cc24f2cfba43c91446d678","da679a5bb46df3c6d84f637f09e6689d6c2d07e907ea16adc161e4529a4954d6","dc1a664c33f6ddd2791569999db2b3a476e52c5eeb5474768ffa542b136d78c0","bdf7abbd7df4f29b3e0728684c790e80590b69d92ed8d3bf8e66d4bd713941fe","8decb32fc5d44b403b46c3bb4741188df4fbc3c66d6c65669000c5c9cd506523","4beaf337ee755b8c6115ff8a17e22ceab986b588722a52c776b8834af64e0f38","c26dd198f2793bbdcc55103823a2767d6223a7fdb92486c18b86deaf63208354","93551b302a808f226f0846ad8012354f2d53d6dedc33b540d6ca69836781a574","f0ff1c010d5046af3874d3b4df746c6f3921e4b3fbdec61dee0792fc0cb36ccd","778b684ebc6b006fcffeab77d25b34bf6e400100e0ec0c76056e165c6399ab05","463851fa993af55fb0296e0d6afa27407ef91bf6917098dd665aba1200d250c7","67c6de7a9c490bda48eb401bea93904b6bbfc60e47427e887e6a3da6195540be","be8f369f8d7e887eab87a3e4e41f1afcf61bf06056801383152aa83bda1f6a72","352bfb5f3a9d8a9c2464ad2dc0b2dc56a8212650a541fb550739c286dd341de1","a5aae636d9afdacb22d98e4242487436d8296e5a345348325ccc68481fe1b690","d007c769e33e72e51286b816d82cd7c3a280cba714e7f958691155068bd7150a","764150c107451d2fd5b6de305cff0a9dcecf799e08e6f14b5a6748724db46d8a","b04cf223c338c09285010f5308b980ee6d8bfa203824ed2537516f15e92e8c43","4b387f208d1e468193a45a51005b1ed5b666010fc22a15dc1baf4234078b636e","70441eda704feffd132be0c1541f2c7f6bbaafce25cb9b54b181e26af3068e79","d1addb12403afea87a1603121396261a45190886c486c88e1a5d456be17c2049","15d43873064dc8787ca1e4c39149be59183c404d48a8cd5a0ea019bb5fdf8d58","ea4b5d319625203a5a96897b057fddf6017d0f9a902c16060466fe69cc007243","3d06897c536b4aad2b2b015d529270439f2cadd89ca2ff7bd8898ee84898dd88","ab01d8fcb89fae8eda22075153053fefac69f7d9571a389632099e7a53f1922d","bac0ec1f4c61abc7c54ccebb0f739acb0cdbc22b1b19c91854dc142019492961","566b0806f9016fa067b7fecf3951fcc295c30127e5141223393bde16ad04aa4a","8e801abfeda45b1b93e599750a0a8d25074d30d4cc01e3563e56c0ff70edeb68","902997f91b09620835afd88e292eb217fbd55d01706b82b9a014ff408f357559","a3727a926e697919fb59407938bd8573964b3bf543413b685996a47df5645863","83f36c0792d352f641a213ee547d21ea02084a148355aa26b6ef82c4f61c1280","dce7d69c17a438554c11bbf930dec2bee5b62184c0494d74da336daee088ab69","1e8f2cda9735002728017933c54ccea7ebee94b9c68a59a4aac1c9a58aa7da7d","e327a2b222cf9e5c93d7c1ed6468ece2e7b9d738e5da04897f1a99f49d42cca1","65165246b59654ec4e1501dd87927a0ef95d57359709e00e95d1154ad8443bc7","f1bacba19e2fa2eb26c499e36b5ab93d6764f2dba44be3816f12d2bc9ac9a35b","bce38da5fd851520d0cb4d1e6c3c04968cec2faa674ed321c118e97e59872edc","3398f46037f21fb6c33560ceca257259bd6d2ea03737179b61ea9e17cbe07455","6e14fc6c27cb2cb203fe1727bb3a923588f0be8c2604673ad9f879182548daca","12b9bcf8395d33837f301a8e6d545a24dfff80db9e32f8e8e6cf4b11671bb442","04295cc38689e32a4ea194c954ea6604e6afb6f1c102104f74737cb8cf744422","7418f434c136734b23f634e711cf44613ca4c74e63a5ae7429acaee46c7024c8","27d40290b7caba1c04468f2b53cf7112f247f8acdd7c20589cd7decf9f762ad0","2608b8b83639baf3f07316df29202eead703102f1a7e32f74a1b18cf1eee54b5","c93657567a39bd589effe89e863aaadbc339675fca6805ae4d97eafbcce0a05d","909d5db5b3b19f03dfb4a8f1d00cf41d2f679857c28775faf1f10794cbbe9db9","e4504bffce13574bab83ab900b843590d85a0fd38faab7eff83d84ec55de4aff","8ab707f3c833fc1e8a51106b8746c8bc0ce125083ea6200ad881625ae35ce11e","730ddc2386276ac66312edbcc60853fedbb1608a99cb0b1ff82ebf26911dba1f","c1b3fa201aa037110c43c05ea97800eb66fea3f2ecc5f07c6fd47f2b6b5b21d2","636b44188dc6eb326fd566085e6c1c6035b71f839d62c343c299a35888c6f0a9","3b2105bf9823b53c269cabb38011c5a71360c8daabc618fec03102c9514d230c","f96e63eb56e736304c3aef6c745b9fe93db235ddd1fec10b45319c479de1a432","acb4f3cee79f38ceba975e7ee3114eb5cd96ccc02742b0a4c7478b4619f87cd6","cfc85d17c1493b6217bad9052a8edc332d1fde81a919228edab33c14aa762939","eebda441c4486c26de7a8a7343ebbc361d2b0109abff34c2471e45e34a93020a","727b4b8eb62dd98fa4e3a0937172c1a0041eb715b9071c3de96dad597deddcab","708e2a347a1b9868ccdb48f3e43647c6eccec47b8591b220afcafc9e7eeb3784","6bb598e2d45a170f302f113a5b68e518c8d7661ae3b59baf076be9120afa4813","c28e058db8fed2c81d324546f53d2a7aaefff380cbe70f924276dbad89acd7d1","ebe8f07bb402102c5a764b0f8e34bd92d6f50bd7ac61a2452e76b80e02f9bb4b","826a98cb79deab45ccc4e5a8b90fa64510b2169781a7cbb83c4a0a8867f4cc58","618189f94a473b7fdc5cb5ba8b94d146a0d58834cd77cd24d56995f41643ccd5","5baadaca408128671536b3cb77fea44330e169ada70ce50b902c8d992fe64cf1","a4cc469f3561ea3edc57e091f4c9dcaf7485a70d3836be23a6945db46f0acd0b","91b0965538a5eaafa8c09cf9f62b46d6125aa1b3c0e0629dce871f5f41413f90","2978e33a00b4b5fb98337c5e473ab7337030b2f69d1480eccef0290814af0d51","ba71e9777cb5460e3278f0934fd6354041cb25853feca542312807ce1f18e611","608dbaf8c8bb64f4024013e73d7107c16dba4664999a8c6e58f3e71545e48f66","61937cefd7f4d6fa76013d33d5a3c5f9b0fc382e90da34790764a0d17d6277fb","af7db74826f455bfef6a55a188eb6659fd85fdc16f720a89a515c48724ee4c42","d6ce98a960f1b99a72de771fb0ba773cb202c656b8483f22d47d01d68f59ea86","2a47dc4a362214f31689870f809c7d62024afb4297a37b22cb86f679c4d04088","42d907ac511459d7c4828ee4f3f81cc331a08dc98d7b3cb98e3ff5797c095d2e","63d010bff70619e0cdf7900e954a7e188d3175461182f887b869c312a77ecfbd","1452816d619e636de512ca98546aafb9a48382d570af1473f0432a9178c4b1ff","9e3e3932fe16b9288ec8c948048aef4edf1295b09a5412630d63f4a42265370e","8bdba132259883bac06056f7bacd29a4dcf07e3f14ce89edb022fe9b78dcf9b3","5a5406107d9949d83e1225273bcee1f559bb5588942907d923165d83251a0e37","ca0ca4ca5ad4772161ee2a99741d616fea780d777549ba9f05f4a24493ab44e1","e7ee7be996db0d7cce41a85e4cae3a5fc86cf26501ad94e0a20f8b6c1c55b2d4","72263ae386d6a49392a03bde2f88660625da1eca5df8d95120d8ccf507483d20","b498375d015f01585269588b6221008aae6f0c0dc53ead8796ace64bdfcf62ea","c37aa3657fa4d1e7d22565ae609b1370c6b92bafb8c92b914403d45f0e610ddc","34534c0ead52cc753bdfdd486430ef67f615ace54a4c0e5a3652b4116af84d6d","a1079b54643537f75fa4f4bb963d787a302bddbe3a6001c4b0a524b746e6a9de","7fc9b18b6aafa8a1fc1441670c6c9da63e3d7942c7f451300c48bafd988545e9","83b5f5f5bdbf7f37b8ffc003abf6afee35a318871c990ad4d69d822f38d77840",{"version":"409cf8770fbb9f099124e9ca744282ebfd85df2fd3650ae05c4ee3d03af66714","affectsGlobalScope":true},"46b5711b3a1e3eee3da2ff5f8981d605cfcf0cec44a213b788dd45f0499b32ba","014d7bd427bb1f5912d8f48d9a11a9855845a8e81eaf07f222cf2e5960d808d1","7cf2db1eeb50a39114392fd00a490003169661ff0d6a7ab41dd9173aa2fd0b14","3011361fe8435b664a609f949d167c1595f6c8cfff9eceefea8793307a41c3ff","9b0c9cc24ca338a4957ac4e7f7fade98968f41ba55d385844ea0f6aaa73d567c","79161643ea9adc73b7ddbedb66aa58dcef6150dd7e1865e78a221bbf3026a31c","e07d383419f05f6beaf73ca299b16b9d3f5defcf87aba39a6a3c3fcacc071a51","b34e7eb2c8d638d17ae7329a9ec62572da60146c4dd9ea76c5e6e05371ee9099","cac9438490bf2024962ccf8a4e9d29a3f80111ba1b444e216fbb54bd00c0a525","3f40862649975f94f2ce8c11ff3258f853ed922ca81546190b6d1b22dd044880","35bda302c53f73c09468fbe09671ec99e454979c98743ef2ce46bf461d83f390","cf145ba33c3730135d080edc84e10366c0665fcdf9aada6d1a6b1e618227d2a2","4d5db4978ebb2ed88e235e86b3aa9c3d27fbf8eb12916f5f67b9237b21742872","daf955101ff3c7d8f5e7cb83a666dfe3bd87a8f2ae6b58673fd74b3c52499dba","fc84563ed57b25a4421f1b7cc02e0ce629c3d28841352ec6fe28ae81bd6f4a94","ae459705ab821ef238624f6b23d6eeb637e583d26f4727a084be8150432332f9","ebeddad6246de8075f8adadd2c3741c5cc7038259cc813f9470a207059976703","fdfad1e7fe95ca10f3d28bd851f46d57f440aa65b98c18bb9af7b38f8ad82aac","3e35e12cf2ef7507c548c4ad77e44ccb198cd119388d3d267abe2dece04e5bc7","a91c58522fe7acfff02c414509b9cbbcb2512d764c4f76d5daddb88d924abf31","5ce61e9c1afaa1afea4f05c587f82b36992b100dc7cd76d8372b97632da1e3ae","f47eeee0c26ca6f53d1bdd4b2f3f0f67217ebe063f2cfc6a3d63e32a1321df59","4548e38d4ff86832f5d56b418fe5bbd827c7b386a4cdff71fe8b9cd45d35d24e","b3730a1d7d6f79094e449dcd1b803d7170076d49621e59b09668116d35767a61","0849f49af466cc2674ce7dbc808ca50cf95f430eef1aa5a31569988c8f8f450d","809f96d40cba81fdaf112774d17d5fa8032d2475e946c87c853bb0e9410d6be4","ea65af71bedb56ff6092f6f6be07908baecd5613904f1364c6156ec7df006d8f","04fadbe9b9ac5a3e4a9fed1f371d064071987ba8aa323d3af1caedbb58650cd9","6cfb5b2d165052ee597441208c17e98d901f91df9cd21e59538ddec76b1db757","dcc381d0128549913e595e60102af1b5d5f481a8d04c294a66f1aacdd5d3d90d","f2c5defba85686ec477ecf71f90c3364ebe6cbc6cf488db2dd574ec66a5b63fa","e7bbac51b9fe7038caafb43bbfcb9f38f35e0b6fb8b13b1bc14cce27ec0d0d27","2b249176c908ddbdc74ac352822b26eb3b1157f74276dcfda4e46dbe83680470","00511314da8c81e43ec4b4a7baffc4a8153363f9edfc5258bb896c6477d9f1c6","a2536559b3d2341cd8021ca0f23a942f826e9b9033eae77ef3eefd4e8cd872ca","94f4dd1ba51153dc1ce9094a366e009fa52d218e56d04623f68d11be47df1d3b","b8442e9db28157344d1bc5d8a5a256f1692de213f0c0ddeb84359834015a008c","458111fc89d11d2151277c822dfdc1a28fa5b6b2493cf942e37d4cd0a6ee5f22","da2b6356b84a40111aaecb18304ea4e4fcb43d70efb1c13ca7d7a906445ee0d3","187119ff4f9553676a884e296089e131e8cc01691c546273b1d0089c3533ce42","febf0b2de54781102b00f61653b21377390a048fbf5262718c91860d11ff34a6","6f294731b495c65ecf46a5694f0082954b961cf05463bea823f8014098eaffa0","0aaef8cded245bf5036a7a40b65622dd6c4da71f7a35343112edbe112b348a1e","00baffbe8a2f2e4875367479489b5d43b5fc1429ecb4a4cc98cfc3009095f52a","68a0d0c508e1b6d8d23a519a8a0a3303dc5baa4849ca049f21e5bad41945e3fc","3c92b6dfd43cc1c2485d9eba5ff0b74a19bb8725b692773ef1d66dac48cda4bd","b03afe4bec768ae333582915146f48b161e567a81b5ebc31c4d78af089770ac9","df996e25faa505f85aeb294d15ebe61b399cf1d1e49959cdfaf2cc0815c203f9","4f6a12044ee6f458db11964153830abbc499e73d065c51c329ec97407f4b13dd","a6a2ed5ba265ec3f2b119ae52b53d3235c4574fcb6f4407220c46814bc2c67e4",{"version":"07dbeffd03db66403029fffb4400e6eda52916f4b44a1605ae9cace276846af6","signature":"c3e60fbffed4d5d7a2256df1fa3085637be58892f2b5b6314b1bc6dcd281ff87"},{"version":"0682ff698db1932d5493ecc053de92f2eaf2bfd82f160baf8e0bb0c29b2dbfda","signature":"85d3cff5ab2135c2b2300e87bbc19e4ddb578b193d5e8a108e92d4d0cbf2bafd"},{"version":"03f48a4350ff5434caa79fcce5dc0bd6ed5cf87e120cb6e8d826f4586084b5b1","signature":"c2ae566fc3245df31dd9f68c79a46bfcccb0574f0b2eb282a8c8c836587a274e"},{"version":"c3a4b8421d8ddfcc759c5b3c63a874b5918e3b4fa232f72073b15d0e4252c613","signature":"e017e4374081540b01fbd045c5c286a1c6335bde9c38100e6d4d44bf78d96e02"},{"version":"bb05bcb4b18b95f430056bb6072d189a57faa2f0ef525ae06cc46199037137be","signature":"32a185abeb27a702159c0801f1a3b2eda5099b9cc4cd7e1734a58532a16d757a"},{"version":"b8fd4d749ce5088a3f0f8a26ae8bcf9200932351a7e66e102d7b4df1aada5f37","signature":"606163d7f01b7f92d451b7359e5a9823b5b16ed4d634480a334606e7e2508779"},{"version":"f72a11c4cdc6b47d865a85e9ebc4a160688eb1fa5d7bea8ad15ccc91c1c12c33","signature":"05a396fd006c6d669eeba004067867225861b80449d90b008945ccf758dfebba"},{"version":"004f5d47ab216062e369ffceadba23b9e8aed7eaca6059fcefca6ba408541cef","signature":"7b37490cda56a0861ffdb6daabaa62c0b226d32c4f7ab675b3b1af5f66e9d8a5"},{"version":"77055884e0d50b41a8c589ca15d1af1bcc94ac1ef432a488f08a368d11223dba","signature":"bdfb6333c10724f044c73a7588446e1dfa8411ddb9006580f0ed81936b78ae8d"},{"version":"9476bae5e91505a3f59465d60d15d678e7e581595c7b20abad544147dfc0beea","signature":"979feb342fec7222959d5be2a041319c530299d9ddfe34ba5d93973056cf2be2"},"cbd8f7cbc0832353a1db0c80ffe50f4d623bcf992faac71b4aef9e0aa6f4f33e","643b5be3fb728581cdb973f3937606d4925a5270d367a38366e4ddc6b30ba688","f7b9aaeace9a3837c47fad74de94ba117751951904a6cb6f6a2340ca3a5052d2","b59a8f409202638d6530f1e9746035717925f196f8350ef188535d6b6f07ac30","10752162e9a90e7f4e6f92d096706911e209f5e6026bb0fe788b9979bf0c807b","91010341cfcb3809686aefe12ceaa794087fcd0c7d4d72fc81d567535c51f7b9","a5fa720bdcd335d6f01999c7f4c93fb00447782db3c2fad005cc775b1b37b684","e11b02953d2bf012fc8828336030f51c88c1f5b6774b3faef11a24e41fc07e94","18282a2d197d5d3b187d6cfe784b0bfeb36dc3caed79d24705c284506c6a7937","bc7f372120474ef5e195f4c5627aa9136af9dfc52c3e81f5404641f3eb921b20","c897edb7e0074c2cb1a118ad1f144d4095a76e13023c1c9d31499a97f0943c6d","5123f400963c1ae260ba78bd27826dd5ada91cc3df088a913fb709906c2f0fed","f6c69d4211c1c0dc144101b7d564eec8992315a5b652108ab44e617fdfb64a9f","3a0b914cd5a33a695925999bc0e20988f625ff92224224a60356531cc248324b","3b9ef4448417e777778007a2abbfb171fbb400c4012560331330c89a8fd08599","f7ecd4552cad04f600bd64a8cb309bf0696c6108285e85a57a8a5355467920ee","80ae4448e40828f253d49dd0cba14ddaa948c4988d54d6bbd558015c4727f1f7","36ccd9bc1c33bf3cce297133d37acfc376d89ea0aff3111cf1792498ae5732d4","a5bb15e8903456dedd2a0c6c7f29b520b75a02fc44b36248fbac98e8b3106f2e","6d2e4114ccd05fb0cd657cfb73419eeb7e1464446aabfe4e652d4ad460c1fd1a","75bfc0660c35679e226d48b1cb965dd1db0bfd9bf909bd0ebbb4b12def245990","e105df3cca78dba5eeaa930b6424db4a5522ec3a2267976b99e4d7e5b07a14d3","8827ca3cd0a35d4a2da2b460620586a68dc0681b19f08559bc382f453ae0a915","5c56eea87bcede67b8df6a08185aaa023080fe74f21e7d262e5e0c5885ea6747","2a6140dea5f4014fbf2c301bcefcac865d9b5354ccc09865b309ec25b170eb24","62fbeac38ecc6d7b5ffe8b9c10c60a519963c8bc5a06d7260446a45fe920c01f","6fda2c4f612f20946eed480c8f9cde7e49d9b802cd21c1ab7da12e5cd7668eb4","5e80af83a1656a75463158d92af55d0bc8330e56e298aa6046f38d99358c6c75","07f4d70ce55d31a014c2377d7b6677c5a848ec2e74199f134ae6e55e33615746","de706bc5dc39777c43af80be05194372febc0bc2dd42d4b9ee3cf0433a672416","c0a7ac0e0b21d67124311e0a70138df950cfa22360ae582c5d7b95a9a31f3436","c39a02bcdde4e5cf742febb47995c209f651249aa3f339d8981b47eb157dbc7f","3b63f1706adba31dd86669c3745ce127e1d80b83b1376942a5ae3653089b526f","d93c86ac706e8a3eb5c4fd2c3965d793c192438b44b21f94a422029d037113cd","c775b9469b2cbb895386691568a08c5f07e011d79531c79cb65f89355d324339","cfa66f842c639b28c9d54ef1b95730f05d3751dd98aa1edab898e6c75ccaac9a","a0564e9ad75067bfcf0dce1cfe4bfbc7dd6b191c985723e45be69c47f43fe268","faf27ee80055fc9f216a481466dae366ff96bf2d2e3205e82cc5f19e26532aaa","60258fd6c811627dabb45bc71ca506554d1595e8c23b929c69cc4050298e834a","fc8503a9751c177608cde9bc81482fcfd85e5eb53bd75e4d5bf2fbdd2ca1dd44","b21157929842b9593200c73299fffde810be1b6c2554437e319db0025ecd53ae","cb929086d0d062bb948a1726e87c604db6387d885a846838a4da40e006c51deb","3cbac82bc20612cf73e32281ab8c5e70e1ab9fed9caf53f274b3e832ab120e35","2a5c6f30ace32a85b24dec0f03525ed0a40190104be5876bd9107f92cca0166b","4d752856defdcbb39e2915429f85a92aac94406eb1bdef2855b908dde5bc013b","4254985dc24b816ed4b91c06a355a996f7f90d461ac98fd6da00ecc83d6d38d8","582b351f25eef563f77ef70c1af74b6c7ada78610e8bbbd8b84be1a52a698a37","d7781fc81737645eeef3b7107c6796f95fb4791cb1a908b1f0254117b2536477","156d4829532c7d26f824ab7bb26b1eced1bfaf5711d426e95357004c43f40d98","c500c79e0c7b0aef46656f76d49625c38c7bdbea8f63dc1005a2d2982cc1f4d4","8c04e9d03324f465d5fb381371c06799cd06234f2aa83bdf4318cb9728132b80","616102e59c37f0f84d209b865f84fb186a29bb0bf112bd975be097113f854b89","a14590df3ef464f8a9dff9514df70c7aeff05c999f447e761ec13b8158a6cab0","98cbb6e3aa1b6610e7234ff6afa723b9cb52caf19ecb67cf1d96b04aa72b8f88","ba08623d1c065954e5c517748ee630c087c00a0c242d478cf51795d1b15bca7a","d3736e3a1c8a591e1c49b7da2feab976c341ecd5efb55069efaa2682df1fb0c4","d388e40b946609b83a5df1a1d12a0ea77168ee2407f28eac6958d6638a3fbf69","83e8adc1946281f15747109c98bd6af5ce3853f3693263419707510b704b70e5","64fb32566d6ac361bdff2fafb937b67ee96b0f4b0ea835c2164620ec2ad8ea09","c104df1c62fea409a804de20560224b7f6e5b162c44d0738584287b5be305d16","b0b8ac2d71ea2251f4f513c7d644db07a46446a6e4bccbcc23ccbefbe9ac3ac4","c7cae4f5befd90da675906c456cc35244edad7cdcedb51fb8f94d576f2b52e5e","757767485a9b48e58684d16a3a22471b061d2cc10919a60abeec94e643bb0027","66ef9bd718776792705d01be029559b4f13c7978727dc364318fde5645d26abc","c4e720b6dd8053526bedd57807a9914e45bb2ffbda801145a086b93cf1cda6d5","1dc465a4431aaa00bb80452b26aa7e7ec33aca666e4256c271bdf04f18fef54d","ea5916d20a81cc0fd49bd783fce0837b690f2d39e456d979bc4b912cb89ceefc","dccc0a4cbe7cbabcf629ef783d3226ed28649f1215eb577a2e2cdb1129347a37","add54a06a7a910f6ed0195282144d58f24e375b7d16bd4a5c5b9d91bb4b5e184","dc03aa8332b32c2d7cd0f4f72b4a8cc61bbc2806eb18fa841ec3de56b8e806a6","dd56e1c623e5b14260b6d817f4f26d6cc63c77f5bf55321306d118617fc20c7d","d4cb93b91ab77070c8baebdcc5c951954ee219900795cc7e34aaef6be0081a2b","b4052a34cd6dce67a4e8214b17f5aab5de9f70bdb02516a47ac9dd89a9cbb09b","468ae10766f12f7da66f93402a7faf88b8a229e66c6b88429b4bb175796aadb6","219b5d42961185874397f62f12d64e74e0825d260054984e0248010de538015e","27b5570022c0f24a093c0718de58a4f2d2b4124df0f7ff9b9786874c84c8af27","ad37fb454bd70dd332bb8b5047fbc0cf00ddfc48972d969a8530ab44998b7e70","265bdbd67761e88d8be1d91a21ec53bb8915e769a71bdc3f0e1e48fdda0a4c6e","817e174de32fb2f0d55d835c184c1248877c639885fcaed66bab759ff8be1b59","ea76d1231ea876a2a352eae09d90ae6ef20126052e0adfdc691437d624ebcc47","0961671995b68a718e081179cfa23c89410b97031880cf0fea203f702193385a","b6592f9a1102da83ba752d678e5e94af9443bf1ab70666f2f756ba1a85b8adfc","d1c933acc6c2847d38c7a29c3d154ef5a6b51e2ad728f682e47717524683e563","44380b6f061bbb7d7b81b3d9973c9a18b176e456eee4316a56c9e2932df77bfd","f6e2eefc6ebbb202d08fb7510178696fd33b4775949b317993e10e35003765f8","32d5ec19fbe22a610e11aa721d9947c1249e59a5b8e68f864d954f68795982d1","e1fa85a34e9710a03fb4e68a8b318b50cde979325a874a311c0429be2e9a6380","998c9ae7ae683f16a68d9204b8dea071377d886ed649f7da777dce408ede67b7","e02fe9a276b87b4c10c56cbcee81f8c6437d21a0a68eeb705e23105c3620677e","d56bc539844eceaaae11714c214add744ace0227da77c91e62d8c3cd0ee78964","9199f6ead2ae205b4a0efe8b427706b7b9856f2fb51587ca25e9161cfee2b163","120a62730ef5b8b61b4a82005c421506d0bf4f5a2fbe84b88149c79c894900da","a416bc9f1759ba773f21c21d20295cdc9976c37db7fae118d11108de8c8b37da","faf92d569360b567c70c11b08aadd997fb2ca1847687f370eaea8eda19f807f2","38e878406954753d87c2b0db8b5146da5abb86c44139526cba2046cc70fbd1d4","c500d215a2e0490d77f0f926507adac154bfc5cfcb855ffdbe2c600e67fbf36f","6a22003e006988f31654d8bf884208ff753d64bcb980a89e4c5eb933bf446d09","17b09f5900194fdc2c97567c651cab6a831ec904ba120058e61819de3f0b4a85","7f02dfc714a76c78325cdfbc138b57531103490dc9d88affdb3f4a54fdd879a0",{"version":"ee4fe837b01845571c9fe922c5f8ad6231668dc05a32743a09510116bf7e54f4","signature":"88c287f1cc69d8de04bbfddd436cbf00184813fd0ee95073880c8051ce1d9b8a"},"e10109b2fb19ad2766368970d4cfc5d3923abefbd3881c4bfc201fc01297be14","1e38c4135a667d98e621d9f55b02bcc49b95db79c9e4527623aeeb8418427bf0","db3c97fb5188202af1c5ac4f0181028b8f7f6cc72eeb0bc67fa61ea7a4ea457b","f90f99b3e055b25972d8c85ab8f1995cb15201729cc3bde0951bf4bea6251258","25a2c45f9b33fbbdc09a06a99dc75bba46b99fd10aeec96cdaa0605714acafa4","f6bb75a625f3d02056ce8df8c619deb912f6d73209d0b4031ed9ccff1fc665f2","45b5dca7b90bfa9b09922367bdf3009c594266c42f688f4c5e498a65d577d4a9","016990463a717488f46aeba06125b987d0d7c77dc09d27d47ea2760f1af7f4da","692c448209a6699a345b5318ae2fc0612ee95c52812f0abf81dc902260ce572f","6ba92d2209defae5551c58f024665ad2fd965f03dd80e17b1bb1cee57ebd706a","d50fc26add4a7d835a29482544e4605558f3706fe14e191b1009ce70f76dadf0","39eb436d0226a590cc35f84b7bffae0fd613e2c4c83124be83969726df8cf269","e7dbb1423e552557b09a125be1c6772c94c169677146e3eaee95e6d1fc6851c8","aa184f01f3f0b540bddf441dc658bd472a59d519da188a2f048acb365e8ca77a","49798c9e2d9624bbc01cdf8371171b64a4eead49fef2853b69fe1bc2e7c75207","c7fb2b8c48f3a20faad1673b23366f24992afaf7d3854190e51d72e0dcad5bc8","c0a48e69d2a824fcf1fdd6ec59604e280c56998ac7a7e3a8514823db1de68cdd","4e78c87355f7e4fd9524d7582a14bf72771aeee33acb73a848de8bf2e44d8831","ff00f23ec0c6c986df2778657ef18073548634b31757bd496902cd00c183ae96","6c3351c0361b6fa16a3379508e2c4114cba7ad6d6bfcc0d5b2fb9f02aa2f83c4","69071e42231f3b87f71b076904875bdef914f01c3017eb6a39a33694e437b5e0","e87de5e2e71fe0513d6fbd5951a5f8e35595243bbb88fe00b6b2d9383f62fe59","ff437a7b69f75b6a8611c2dc51271b53639d3a799248134903e08bf686cd5e3b","7cd0fabd9e9ae5a8faabc2f70d6d9ddd89c65719a30917eacdae9049c16e8a16","800e87a8170f04ca3239738398c58fa1e8f79b10f0a9dea00beb13c1cc9480d7","0c58b5a414a48f68bfea86556a22f505bac4ce0e67ddd5e40e387a4641ce2b78","e11e853253b819e112e952590d8ba479e0c574643a5022bb965b8535fc6b3687","1472535c9fe8885a14bfcf35a16112a16ae1f8658d6d467eaaca385f6c0d2d7d","ab33a4468fcf72816e9a4da923dfc3d5b4cb28e1d7247c9754abe3361c349d8a","88e329b0ebbad95cfb30e250d43ea7106c74478b01b90dfa8566634a88c80b42","f1ef943f99da792b2a4d25d006912b4887f8946311131d2434ec2d37513400b3","691858819848725281aa792e759b0e62b8061f5797d34fee392939187445cbf4","50ea24a44b524c6b7c1b58b574314b9925c7bd0a6f0258378c48359c219e8e6e","d6865f78878468d3d989dfff23fa43b2da6c906f794915e33f1143877aafa78f","c3b01d1a70e389a4b72e331e1658859a1fcec1023f45eb76ecb832d7af2c1309","3eabf57233a620f4acdaac83deeae89652c9d51ef69e294be65ad34fcdca1ec3","d5cbfc7464b59c5f7fbdf5ed4d1719e4e1da443558f3dfa214c16c43fa31a26d","fb6cfb7a9eeb9fdae8aef1a2c48d9c553773d2bb7814592ca948232463d628ff","c56dd68b35c8350b111dd56dae32b530ec07b11d7fb66e1f01512ec123e4fb46","ba391046d535811c2410d65c36e4f2daa4cae44af0f3161c417580e01123e83d","7bd2f6ddcef0674407549b0d70ae91cf38a8c9a3618474e6fc46f056de7966e7","7f5af6d968ec85e3ff6dbc079d71967dfe249c6598df858ab5e777fae489cb06","b0c73f30d7e33ed7927204a075facb5e5a76772e2e93b2eb286a1c7b53b06565","bd66a8bfd746d13579fd314e09d45a4f042ad77c1374c3e2bbcb38c82f1b30a6","9d112130ff2fd933a97cfd5429a057f330cc50b596351e5d1654295eace452d3","3f77b95137e02ac95f9f354cc6986ab0c47de67eb178371abb81b292055f03f8","bff8f7185d1819effacf3f5b1160fab5bbfb19ed8d99f4b2f8b4d716f97b1f0b","ed8777deeaab755346976fdddfe7929de0267410a30cec96964138fd20fde6aa","61580d76f83640619e64dba68c2b4d81ef94992b3f476c521f9428f2f3e72c2c","ababf4a669aa490cfab273d58e60b35a57fec1ab0904d0192d726f65769ac07f","a92597a260d35ae11484b70b36517aaee1eadcd73c8bd53d5406514403f2b3a1","b7aded3230fcdf256231ae7e39e8cbd9ab8d7677d6abf56a0263877221a319a7","2ecec681873e914f52d12ef097a4315dc7fa91845e368721f6baf65d2ff5b11e","c0273a5c1c642d1c6530f0102f9b8abea88a1b69343532fa3bb1037197c14565","090e8ea96dbcd2cb4006806d25f4f4084b75a153ec11700bea1a3100087568fb","0d6dd4916f10f0632654ef2e84a295b5ef7ab27483911d7e5247f8eb75ca5e19","af91ac76a7b99154f3abb50ce0e747ed52ef81e188f0220e95c7ff0a52aac711","45ffc2b83a234945f0979ee3649b96bbbafb60a99283ec1a0000e9cca3d16050","e20aade44449d066fff04421d5ddd9a69982ccb9eb6bc64ea0f961a75e0c13cf","1be9951411a4a9eb5586e0edc15ec3f2523e99c3de616275d2f75c0b478400fd","62a30ec20aa6889d3243b469e3a4fd1079683b03c472e74155b5bf4ba641f15c","73a0fff1a6d144b0097e9a278b56c554eff113895cd7e6161cc0885fe4d3e9b1","aa6d5ce41346f21494bb57d098f871c7583ce022a95c3a4ac9b92f24c2adc0c4","f73bc6e479b94e002e3544e5ace0abfe4ec9378fbeff5efcefbf7cbf23de68f5","d88dc05fd345b7a4e1816bbfd2dd087eefa9b9e36096818c2348f5b246971125","b3f0b4552088a5aa21b8a4f03d61325bf30a07f68ff6d9be748e74c5b0d017af","ca3e4a3944b7ecc2f90fa2eedbcf092e21fbc1069f6b98a15254ca95c984b4a3","5fe8038a5c59737d70ad207605597f460821f0d0792a7b8ab718ad495951f94f","285ec6762d671dbd76ac0d6a756b1a5064d853037b317c9ce702d62a681a5f01","dbc5a2478294dd514f77e13ded4bc6de08109c1e19fb2958961cf589060a2fb0","e078310a8cc50985bcd34116905ae32f7e04ff0c700fce8ace03d75a9eb4345f","bb84b046ded6e7be5f3c093df9ebfc34ccad8350f6f3f1ad27573f858c74ef27","b160a9c4527b7e8672f19a403b5dfe528d9b5d2e1ee4989f3328011f3e797607","1590bf64962cca433c22108bfd9afa73a8cf11173d69613735a96034f4269112","c907111f1468eb19f5a9a1bf306095be2b006687b7ca6656ce59c54288c6c174","708bef392bd5332e1f92f391a1e6aca07def7981348b37d943a403363c0e518c","22ceb25632885c38ba36bc87b51c0cde0c5d36b40e7614c9adfe259e8d50021c","345f6a3240775e4c3ea576ea7843b95d50af39a0de61133f6861b713e4e1df3c","c19ce6e27efe8013e4e6b6555353ee15e4b573e3ec22088c6b189ee6344cfe30","64f6b32bcae33ae0a3771ba75fecc4de7a74e07e7c4bb18a90bd5806815c9602","c2b6b0ab8c676e44a83aceb1085ee472880634bbcce977aee1d9b917804c259b","d1bd7873f4f18d200facf18eb9c9b45f24eb590e9c96de1f691fb5b0b02f3400","f5a522c8455f705fa14a45222a48b2ff4ffb0920751e75557d5a4756343bf1b7","7cdaef9c718f220768dc711e3286757eb593071267a016910aa78134e0a7a9be","4c7926985d7533e1b6348c8180b8deb8a3a1b80483269fb298683dc2576ece92","a9f036e7be00a342aee3edb3aa60b4d8a2b007521f4981bb98f7bd21bea20d39","f4ebaa09c30cb71ba8cb259711febda9030112e1cb26fba5fd2d0a75cc12250b","78ce2eb9b583d37cfe3a9eaa801ded67949f046b2d01c0cbea42da8e62c09645","5743c19d590d129d899c9f2f6cd5ee49c1a7c9bc232dd13415c1101a9b631b8f","97910d251ed7cecffad048115d4ea480ced12358803af8c4430adfe5f53982a4","4172c64e5bedbcb4aa47b2d7da3ed927f5003bd95832d8ad59ea8306f75a2643","37639853b2b59b38a775d8f8448cbb77cf045350a0d5236cc55f41b8cdc43142","104c31ad6ca0ba8157285fb13a279dd2231088525e40d0694159c35f858bd632","0beb6f018abf850de6f49a763296d980fc4bd5f4645eedb3b1e160bae2bb4684","29ba72feb476e26e6e0e9505829541c37ad5dd1f185288091e2d1e069f26e1db","474e6ada254ec947663fbc8120d93c3f698f96a38eb3ab2ab599c40d100bbc5f","b539611adca3004e48dba382cd51d27668b3836bc3c0eb3193862c1e986a56da","7df18a22be953d701c27c86e30f00c17439fb143600de70ccea270ad01a2785d","1d1221e27e72ca24c8e5a30d9c6cbcae3f5d7607ced78ec6d92bf0ce56e3020e","7f881b33a574c06db136a20cd11d3ee3c63c5e191fc052f3241fd39aae2c3ccf","1bc4a0fce9cd92a71f422d32bed628d4bd62b8b3178288c36dc7f38704503a88","64487cfc338b2d7bfd39ddc5484ce89d054cfc973e74dbb7bc101eaff0153c00","a0348e6f66e33291f485446b6d5fc286a9b70d1c44c83af622a015a0c8f7194c","09c210ec157c92fcf23602ccdc411545d39831ee6e8e737e8272349373034a3d","861b7f4b1352b72bdef1a8f9c282e32fee24a885ee87e01e876949155f10a1d4","edb9c5a1d0f95195a7033aaf470c17b09a796b5823b4ec95034bd60697519892","f7dcb07bb1815c81dfc2b7a2c82a27664e5bd455fd4cab64a7973484a2f1e172","a3388847df62712042c086e2685f2727eb0b38d20f2bdef03ba567b1e9e70441","39fddc73be6c76abf03f6a7c26699ef97cb9b83f2523b07250c2bddc00007e74","31e9eead2db22b077ade37882fe76ebea7e2196a61658e20d824a5c2a75bd189","814bb39d3e151b4ca31dfa77d668d0380dd608d1fbcdff046c000eac07aef271","22d6810d00231262263faccf568e49b987b6f1d5e5e22a0656db6e6277d6a116","d4557cb456b5227d3dc444b1339d463c1cc3bb6b8ef25fc91fd3496bb7ab5aea","e5ce899e2c88e237eed21676f55e9daab0a46299377f1d81b088ae7bc01d959b","daa852d9710a4f51af8ddb7aede9d41d5b7ba6cebbfc050e080c04b22a1d3469","12cf3e5cda4d491be241bc086fa9c7c4afdc1dce6fd0d4ebadf2340d7d5d11c5","3ea72cfe856e51e87d05a2066af9bd848e987926183536567fcc68d7009d5c79","b423354789f56a5a2d6639cd9a95eeee45d2718e41b75918aecf75db4e25cb5b","8dfc4453c60b63639b61c8503488e5b78821c1be2c18b531c9ad820ee89daea9","ab321a778f66f68309a1dbae9a27fdd0aba4c9b0ae5883a9a25b6c98108b198a","611b0de5d8402f9824b1da82687e124303bd1f61adb8ae1a45ab7701945b5a36","5c1c84db98313fdf8a8243aa1823ef527b2f482c3b1a2359dc60e0c0b2d5bf78","b62b57994bdde2d7fa963c5747ce43758e441666e0af492d8e78e0e999188a48","1ccc6f3bffd6f34133d56aa3eb3f1b6de3aebc6e56716f6174d4c28653a7bef9","803feabfc584cb01c0ea32f573b4eb05b4f67b95768a90a9a1025f2e4558d66c","76434004d2bf79c13ab8476933b7bf06ee7eaed0adf8d501f2f3c2d2c9ef11f2","db86c71c7bedf5552e4eef07596b6cf442a1119561306bb4929a4af5ec548973","b6b3b813557a622c5f24bb68fc989a0e5aa38356b10c11487e51d0ba71381b82","c448b78eba58b3a461594ef10f6e6de154567b96e0f7250d1f0678882158f41d",{"version":"a64d3ec5203c3088d9397f50ccc4c316c121b52284c3505f45e75d86771e8e35","affectsGlobalScope":true},"226a5095ee2d2e621e328a753d707e07b640085cbdcf8cdeb68c4cccf324acc2","0f6edf593ac57d9fcd2df79aa98df03f1133998669ae78f03290efa7704d5e72","d93b3d8541068451cf02a5f8244a0ff0eb48aac0684467066cb70e0f9de3166d","36f01486d020436d9de33d14fdf403bc54d7186230934779e78d4c3229e1aa06","5da1da335b076751302664587d09c4c0170e95ef263419d42c7398ec2d3b1748","5f1d13d3ac3a7ec98c2df79bcac802913e6722c64a14c67d978036fb7f083b7a","9244669c18daad0a0592bb339cccbdcdb018e2d85f7ca5bbf06fe99605f72064","9e2ed9f1a2e4f244ccddc9feb69b98fc79751b3130497b763bd60cd0fb482c48","1168f4f0e29385be1fa8de60bcfaf7b1921c9cd226bed000d4c39eddae1c53b6","520d56c25e04511526d7e6b10d359f0848f93fc9e89814f8bd0b79800b28b443","435c30548bb06fea6c97991840cf412d6a70de3808846b4eb820bb90a85790b1","a22eb15f2c09743a8d7b85ad605d22891b015cb8c0f199a224b0f6c6441e43dc","f2429914fbe15fc40bccacb8861f9f905ceb1a9749619fc0c32a0bdf73ce38c7","c043b2f987cb8eda4b9e7d6a71a83bc145998fa35da06a98f8f7919334d1c273","fb104374d1ac44581dd7ac23e131c41c21fe1193928b5eb339819e3aa2657cf6","cd5fea6aa841586b23e805a27aecdae5fe5223497689634d50f2430fd0880bc8","7d88c946e6eac23c167986643eed81ce6c45c3cc06378f5c2e6309dcdabfce3b","734b3c3d2d1eebdea55e2f339e97697b8bb501c6d56bc8a57732b0bce318fa38","8d0885b4a7d37c42f49d5e005467c96a200de3e8d96e7c61513bd0583b6130b0","90770a06b136431c10e35362789e5827dfaa9e5ba1fa5c24ceb94a3d8d08f83d","05a0dfe6ab803856f31949bef7903556a1e03fb91726645050b66e688ecb3645","6f308b141358ac799edc3e83e887441852205dc1348310d30b62c69438b93ca0",{"version":"6033bc3f16919910fae1fb3ec1f2161299b56a7ffdf253d044ece356912898d9","signature":"80c861ab215b7fdcdd802dad1d024ed3d5690af928bc433e10b96b994502a4e6"},{"version":"282fb7bff2f03df1228cfeb5bb980b2b984ea093ece3ad9fde4aa1b849473108","signature":"7749acf43eb7cb8cb07f1ef535df828015683933668d0243d804ed670578e511"},{"version":"bfd33f713bc4271c7aff9b281f63e419d847ce3f4b02dec05fbcb877b85026b8","signature":"4ae57f7e595a7adce18cb0ba38979aabad175df7ac3d2feaec4f9f69b77e1934"},{"version":"acb1a14c8e864de9308c46bef66f2937501a884749bf1163feeb59d3bc6260e2","signature":"e12f0cda95faf80cf9be93ab9ce0d347495c2b6cbb84eaf7f51ee30c1a147441"},{"version":"ae5ca1a5fefad83a00e6980153e4be0978ef02d3d22b92819e0492523c052d0a","signature":"b81570beaf3646a2096f574116915bc73edb33d68d483f4e6af85b044804eff0"},{"version":"e9d83acd89e8ea5062d6e8b55c0d4e4d51155066667141b0d0f1ce32a091821a","signature":"1cdc17ac6efaac85da356915b26085302dd0b2e8f21ac6bafb128bc06fe3f91c"},{"version":"d17503725542606ed3981e9d72d30d20eafb853986debbc378c3828daafc4bae","signature":"f48da2213650ea8548b1322afe5151551cc3bf4f51dc1c2bd0bb286b333ba2cc"},{"version":"e47b278c564dec4893dabd1baadbabf50cff315eea774c72a961e26379aad99f","signature":"98b6f1be787861d4f0e08fd980a14d85e69e57f4521beb2413311baf04215b42"},"8b5f7adf0494c19f8d60f65b60c948e99b0a914e55262fe9ebe2a77198664789",{"version":"b928d19e75c5524c44affec274426c432c4f261ee194d53ba56bc69bd947281f","signature":"27cbd9d22bb4a5bedc47adf1040da59facf850ba8cb6ae95d41c6625962f7ffc"},{"version":"9cef58abb85b113aaeadafc54f450db0fafbce2d4acb0d1856bffea6f2243e6c","signature":"e0cdee7eb6faac8c4069bbe363f3645e1279e880cf393e5477649c7e8a18228c"},{"version":"918852a9e2d3b3cdb590a580b9f37a12357dbd47833c5869026eb5b0da01770f","signature":"cbf8517bbf917ac20184b92990861ac89552f91c9e3f4bdf504ea0d7c11a5e6e"},{"version":"af5b128ff2215beb58c5c90749723629c7536512e2f47e1a3b8c27d848fa8e8a","signature":"40b863f417a59f1c0492d2914e4799714718cbaa4c4d74c180bc4929e85d79c7"},{"version":"30ce8415b842bf2acf8e01098870a877edbea9c14bea35d7d5d2c1ab19d343af","signature":"f72bc3986a7de60a488e18fc6b972a287927055e770ee851a2b2120aa1a04591"},{"version":"715189e4df8e6818cc762dd5669ba699730fd4788c87dfe18af05e6621418d99","signature":"a7422b4158e6578f34e59f4b74cd0fcab776a0295bb26a09be310c3b4f6b7bec"},{"version":"0f409eefbc22c59bc85c9f275a266bf3d5be375654ed8559c297f8de4fa45719","signature":"ee2a6b51a85e57410f6f6d443476cdc9758ff1fee63f9f355d77f81235fb476d"},{"version":"3fb0ae2ab4433d0af258d99e8882ec263c82441627aee48cdc628865c4317be9","signature":"192379c1948a9601ee383a43f15a24473adc80503f841e5343bc8d19b20ebede"},{"version":"8ba3da6f2f59d82776a0da22d7818fb3c56aebe1ef7d591b95ed839da1fa16b9","signature":"e44747a32ca02263efba02a26e1556ae6c5076828d8b56b8c76bc8166ff02be5"},{"version":"b217c91602ececef1c006c73cbe69e46a06dbbf87a681b26affaed99d0e03237","signature":"c231911dc4d4d60cd36fb52781f922ec22d965d59a17141175cd05c67d081bc0"},{"version":"6f140e1f69be32f36725aa41776f8e1ec7231fdd9f3105074eb9114c8e5a4d0b","signature":"09783e7099ad9edede8333d4b9dce23e76aca7e7cd0c4268ea31253b42cf7f3a"},{"version":"a6a0780c33f92bba1bd20b6a151db03b92cf6302d8e90c7274b1b0ca0697207b","signature":"e1ef5c22930f4f47ed59aed16588870c8ce4f2a7cca5b360485836d832b2f209"},{"version":"9fa171bc464c329cfbe315deda3f2a3bedf3d3bf55b285b6fba204491ba18c18","signature":"3dbec8621a649e13b32f31d465498af7fd4521f07e45a88f08be4364c512b008"},{"version":"c7a6e3befd66f09bcbcd7e0c82dca31582971f5cfe30c1a095b923d4678c4543","signature":"d5d1e61f1f84b3518b80043c4acc05b4af5b04d391ceb469efe49dfe2e206c8f"},{"version":"46ddbf49e330f978d030526895b48f154c1306ad92c6f9be71bea0b9ba65a220","signature":"6b6485358224232f461ef9f61de122f77efcb8f464bbd77f65e34f05c42bf171"},{"version":"8765b1a79a797fbbaa38cc026d03c19b888af150e3f0c6f9cfd14fceb747a328","signature":"e1ef5c22930f4f47ed59aed16588870c8ce4f2a7cca5b360485836d832b2f209"},{"version":"8e8e22a783c4825f08e91a78ce56535d511b4db843e25aa4966865c2ef22bff4","signature":"3a754c2204c316ee1bd4f5269835ada87461188c36ed820d573458a444e9388a"},{"version":"beb312b566dd17ae51fa848d29804042ff067702582b7f54ccaf0acc591ed5d7","signature":"20b4ea748aa3c8389d500a019042a820fa48cdcf9dc1f3fd202159947042cd4d"},{"version":"3d2c95e973eeb7abfa256590b52c436a17b00467cf15e255d8d6b0ee4260c7ec","signature":"16864b133dc6fc1b2bf1fc23f9ad0b847ed0cb32a17a6bb4e904f137b5f2d484"},{"version":"02f33ae21f2d850fb3ce0f5869818aeb85af9ce64c3b25a51d4856020d706e97","signature":"d22e2f9921062478ae2ff4733247e1ab2c01c04011bbb05dfc8af1360dfe4ccc"},"65229613ce93f729db13a5552dc5e1b07534efab92a7bf408f22ad05725376c6",{"version":"cd0d12299972e694ba0a316dbad7640a525d6dc03147686caa758b43291e428e","signature":"b19fbc5b896761d986fff9e05095d8484206bf1cf1361ba7b1ec4e653f7d741e"},{"version":"72a3b99c626ae2f62515cd0a5da9d1d940acb6bc580caae88dd641bc33e718a9","signature":"ce858ed48c4cce31d5863b806787974ec4aa3c66a9ff9065c5b4727962aad4a1"},{"version":"0d7314d3bbe898021b644eeefeed8803e05ed271ec02d0823d1a1a3c8b6cc015","signature":"c5d44260b53d52cf7a8a24552497ef214e2253ce52ce4d169d206433b306ec70"},"f4e8f4151c3490cf7b68c685aabe901cbab19f962aaa2f118a97550e22689a76","799003c0ab928582fca04977f47b8d85b43a8de610f4eef0ad2d069fbb9f9399","0a5b2bcdaf846f5dd0542cccd782c7736bf81d1df41b6f0aa8cc2d7c4b2d2310","a0bd46d587005aad4819980f6cf2dbcd80ebf584ed1a946202326a27158ba70e","07fcbb61a71bd69a92a5bbde69e60654666cf966b5675c2010c3bf9f436f056a","88b2eb23d36692162f2bf1e50577ebcde26de017260473e03ed9a0e61e2726a4","23ffbd8c0e20a697d2ea5a0cf7513fb6e42c955a7648f021da12541728f62182","43fba5fc019a4ce721a6f53ddb97fdc34c55049cfb793bc544d5c864ee5560b9","f4e12292c9a7663a13d152195019711c427c552eb0fa02705e0f61370cd5547a","c127ebf14d1b59d1604865008fb072865c5ca52277621f566092fe1f42ce0954","def638da26d84825a312113a20649d3086861de7c06a18ea13121278702976fd","fbaf86f8ba11298dea2727ce0da84b4ab6ae6c265e1919d44aff7d9b2bbc578a","c1010caaeaca8e420c6e040c2e822dbe18702459c93a7d2d5de38597d477b8cd","e1f0d8392efd9d71f2644eb97d3f33d90827e30ea8051d93b6f92bb11dff520a","085211167559ca307d4053bb8d2298d5ad83cbc3d2ae9bb4c8435a4cabf59369","55fc49198d8a85a73cdb79e596d9381cfdc9de93c32c77d42e661c1c1e7268ef","6a53fb3df8dd32ed1a65502ca30aeae19cfe80990e78ba68162d6cb2a7fed129","b5dcc18d7902597a5584a43c1146ca4fe0295ceb5125f724c1348f6a851dd6ed","0c6b0f3fbe6eb6a3805170b3766a341118c92ed7b6d1f193b9f35aa82f594846","60eaadb36cf157c5cae9c40e84fa367d04f52a150db3920dbe35139780739143","4680a32b1098c49dc87881329af1e68af9af94e051e1b9e19fed555a786f6ce6","5117f2f78e1d9133802a22b33f2250ca44e75230d095e1133feb479b93b66312","caa57157e7bdb8d5f1efe56826fb84a6c8f22a1927bba7fa21fd54e2a44ccba2","6b74700abfe4a9b88be957fd8e373cfd998efb1a5f6ad122da49a92997e183ad","9ef1342f193bd8bae86c64e450c3ac468ef08652110355e1f3cdd45362eb95c4","6853c91662c36a2bf4c8371a87177c819007c76a23c293ef3f686ce9157ae4c8","9be1c5dabce43380d13fc621100676b03d420b5687b08d1288f479bee68ab7a8","8996d218010896712678e6a0337d8ef8b81c1066ab76f637dd8253f0d6ff838d","a15603bf387fc45defe28a68f405a6c29105e135c4e8538eeb6d0a1ef5b69a81","84e2532e4d42949a2775cdd8bb7b2b97370dd6ddb683d0c199b21bf6978b152d","22bf5f19f620db3b8392cfece44bdd587cdbed80ba39c88a53697d427135bf37","23ebbd8d484d07e1c1d8783169c20570ed8409966b28f6be6cf8e970d76ef491","18b6fa2c778cad6489f2febf76433453f5e2432ec3535f2d45ae7d803b93cc17","609d0d7419999cf44529e6ba687e2944b2fc7ad2570d278fd4e6b1683c075149","249cf421b8878a3fe948d9c02f6b0bae65491b3bb974c2ffc612341406fa78ff","b4aa22522d653428c8148ddbf1dcc1fb3a3471e15eb1964429a67c390d8c7f38","30b2cee905b1848b61c7d28082ebfa2675dd5545c0d25d1c093ce21a905cdccc","0a2a2eed4137368735205de97c245f2a685af1a7f1bf8d636b918a0ee4ff4326","69f342ce86706aa2835a62898e93ea7a1f21b1d89c70845da69371441bb6cd56","b5ab4282affcfd860dd1cc3201653f591509a586d110f8e5b1b010508ba79b2c","d396233f6cd3edf0d33c2fbfc84ded029c3ea4a05af3c94d09d31a367cced111","bc41a726c817624a5136ae893d7aac7c4dc93c771e8d243a670324bccf39b02b","710728600e4b3197f834c4dd1956443be787d2e647a72f190bf6519f235aaadd","a45097e01ef30ba26640fed365376ab3ccd5faf97d03f20daff3355a7e60286a","763cbb7c22199f43fd5c2b1566af5ba96bf7366f125dd31a038a2291cbc89254","031933bf279b7563e11100b5e1746397caf3a278596796a87bc0db23cf68dc9e","a4a54c1f58fc6e25a82e2c0f651bf680058bd7f72cfb2d43b85ee0ab5fe2e87e","9613d789b6f1037f2523a8f70e1b736f1da4566b470593da062be5c9e13dac57","0d2a320763a0c9c71493f8f1069971018c8720a6e7e5a8f10c26b6de79aa2f7d","817e0df27a237a268dc16e5acffc19f9a74467093af7a0ba164ee927007a4d25","43102521b5ca50ff1865188c3c60790feaed94dc9262b25d4adec4dbc76f9035","f99947f8d873b960b0115e506ef9c43f4e40c2071b1d20375564538af4a6023b","c1e5ad5ca89d18d2a36d25e8ec105623648cf35615825e202c7d8295a49d61ab","2b6c9cb81da4e0a2e32a58230e8c0dec49fc5b345efb7f7a3648b98956be4b13","99e34af3ede50062dcc826a1c3ce2d45562060dfd0f29f8066381a6ef548bf2a","49f5c2a23ea5fc4b2cdb4426f09d1c8b83f8409fa2af13ef38845cc9b9d4bc3d","e935227675144b64ecde3489e4a5e242eeb25fdd6b7464b8c21ad1f7a0faa88b","b42e6bbe88dc79c2d6dc5605fb9c15184e70f64bdd7b8d4069b802b90ce86df6","b9cd712399fdc00fdae07e96c9b39c3cb311e2a8a5425f1bd583f13cab35e44b","5a978550ae131b7fef441d67372fd972abab98ea9fdb9fa266e8bdc89edcb8d6","4f287919cfc1d26420db9f0457cd5c8780b1ef0a9f949570936abe48d3a43d91","496b23b2fd07e614bc01d90dd4388996cb18cd5f3a612d98201e9f683e58ad2e","dcfbe42824f37c5fb6dc7b9427ef2500791ec0d30825ecb614f15b8d5bf5a667","390124ad2361b46bf01851d25e331cd7eed355d04451d8b2a4aa985c9de4f8ce","14d94f17772c3a58eda01b6603490983d845ee2012cd643f7497b4e22566aacb","03ef2386c683707ce741a1c30cb126e8c51a908aa0acc01c3471fafb9baaacd5","66a372e03c41d2d5e920df5282dadcec2acae4c629cb51cab850825d2a144cea","5b48ba9a30a93176a93c87f9e0abf26a9df457eeb808928009439ca578b56f27","4707625392316d3c16edbd0716f4ac310e8ff5d346d58f4d01a2b7e0533a23df","154d58a4b2d9c552dc864ea39c223d66efd0ed2dd8b55bd13db5225d14322915","6a830433fa072931b4ea3eb9aa5fa7d283f470080586a27bfe69837a0f12de9a","d25e930e181f4f69b2b128514538f2abb54ef1d48a046ad776ac6f1cda885a72","0259b4c21bc93b52ca82c755f97fc90481072bcc44a8010131b2ea7326cf03fe","bea43a13a1104a640da0cb049db85c6993f484a6cc03660496b97824719ecc91","0224239d61fe66d4900544d912b2e11c2cca24b4707d53fdb94b874a01e29f48","2bce8fd2d16a9432110bbe0ba1e663fd02f7d8b8968cd10178ea7bc306c4a5df","9c4ad63738346873d685e5c086acbf41199e7022eff5b72bb668931e9ca42404","cfb6329bf8ce324e83fe4bbdee537d866a0d5328246f149a0958b75d033de409","efc3816f19ea87a7050c84271ea3d3aad9631a517c168013c4f4b6724c287ce0","f99f6737336140047e8dd4ade3859f08331aa4b17bc2bd5f156a25c54e0febbc","12a2b25c7c9c05c8994adf193e65749926acfcc076381f7166c2f709a97bdf0a","0f93a3fdd517c1e45218cd0027c1d6b82237e379dc6b66d693aab1fe74c82e81","03c753da0bee80ad0d0f1819b9b42dfe9bf9f436664caf15325aa426246fd891","18f5bf1dae429c451f20171427c9e3223fade4346af4dfd817725cbeb247a09d","a4eece5fab202e840dd84f7239e511017a8162edb8fc8b54ff2851c5c844125c","c4a94af483a63bf947d89f97553a55df5107c605ec8a26f0b9b8bdcc14bd6d89","19de2915ccebc0a1482c2337b34cb178d446def2493bf775c4018a4ea355adb8","9be8fc03c8b5392cd17d40fd61063d73f08d0ee3457ecf075dcb3768ae1427bd","3b568b63f0e8b3873629a4d7a918dce4266ad41461004ab979f8dcdfd13532bb","a5e5223c775fe30d606b8aaa521953c925d5ad176a531c2b69437d2461aaabbd","8cbf41d2d1ce8ac2066783ae00613c33feef07493796f638e30beaf892e4354a","e22ad737718160df198cd428f18da707177d0467934cecdeed4be6e067b0c619","15bf5ed8cb7c1a1e1db53fa9b45bc1a1c73c0497735343a8d0c59fdb596a3744","791fce84bce8b6948e4f23422d9cbbd7d08c74b3f91cca12dcae83d96079798b","8a2619c8e24305f6b9700b35af178394b995dcb28690a57a71cca87ee7e709ae","ae0d84470bd762cb83671e46b2894fab2fbeef798b5f2258b83c116abf30e791","8c9cecaaa9caba9a8caa47f46dcf24b524b27899b286d8edcc75a81b370d2ba3","2b7a82692ecc877c5379df9653902e23f2d0d0bc9f210ec3cf9e47be54413c5c","e2ad09c011cf9d7ee128875406bef787eeb504659495f42656a0098c15fe646c","eb518567ea6b0b2623f9a6d37c364e1b1ac9d8b508d79e558f64ac05c17e2685","630a48fb8f6b07161588e0aee3f9d301c59c97e1532c884118f89368baf4073b","14736c608aa46120f8d6d0bc5e0721b46b927bc7eba20e479600571935f27062","7574803692d2230db13205a7749b9c3587dccaccdf9e76f003f9e08078bb6d09","f3cc1588e666651c51353b1728460bee8acbc6e0f36be8c025eaaf292dca525d","0d4ea8a20527dcf3ad6cf1bd188b8ad4e449df174fad09b9e540ed81080af834","aa82876d59912d25becff5a79ed7341af04c71bfeb2221cc0417bc34531125e2","6f4b0389f439adc84cba35d45428668eabcfbdd351ba17e459d414ca51ab8eb8","d5dd33d15fbb07668c264b38065ac542a07a7650af4917727bbc09b58570e862","7d90202d0212e9cdc91a20bfddf04a539c89f09fe1d64db3343546fa2eb37e71","1a5d073c95a3a4480b17d2fa7fd41862a9df0cb2afaee86834b13649e96bdb45","2092495a5b3116c760527a690c4529748f2d8b126cdd5f56b2ce2230b48aba3f","fb0490525f0727aa81ac36518e4b6e62f3f8e6220251fe9003ad988f61ef739d","931eda51b5977f7f3fa7a0d9afde01cfd8b0cc1df0bb66dcf8c2cf6e7090384e","b084a412374bdd124048c52c4e8a82d64f3adec6c0a9ad5ecbb7317636039b0f","11199daa694c3ced3cc2a382a3fa7bd64e95eb40f9bbc3979fc8fb43f5ba38cc","2c86f279d7db3c024de0f21cd9c8c2c972972f842357016bfbbd86955723b223","dfb53b9d748df3e140b0fddb75f74d21d7623e800bb1f233817a1a2118d4bb24","8cfc293b33082003cacbf7856b8b5e2d6dd3bde46abbd575b0c935dc83af4844","7730c538d6d35efe95d2c0d246b1371565b13037e893178033360b4c9d2ac863","b256694544b0d45495942720852d9597116979d52f2b53c559fda31f635c60df","794e8831c68cc471671430ee0998397ea7a62c3b706b30304efdc3eaff77545a","9cfc1b227477e31988e3fb18d26b6988618f4a5da9b7da6bc3df7fc12fb2602e","264a292b6024567dd901fdabbf3239a8742bea426432cdbda4cf390b224188e1","f1556a28bb8e33862dcfa9da7e6f1dca0b149faf433fe6a50153ae76f3362db1","1d321aea1c6a77b2a44e02e5c2aeff290e3f1675ead1a86652b6d77f5fea2b32","4910efc2ce1f96d6e71a9e7c9437812ffae5764b33ab3831c614663f62294124","e3ceab51a36e8b34ab787af1a7cf02b9312b6651bac67c750579b3f05af646c1","baf9f145bcee1b765bed6e79fd45e1ff0ca297a81315944de81eb5d6fff2d13d","2afd62362b83db93cd20de22489fe4d46c6f51822069802620589a51ccad4b99","9f0cd9bd4ab608123b88328c78814738cbdee620f29258b89ef8cd923f07ff9c","801186c9e765583c825f28dab63a7ad12db5609e36dc6d9acbdc97d23888a463","96c515141c6135ccd6fb655fb9e3500074a9216ba956fb685dc8edc33f689594","416af6d65fc76c9ced6795f255cb1096c9d7947bede75b82289732b74d902784","a280c68b128ebba35fb044965d67895201c2f83b6b28281bb8b023ade68bf665","6fa118f15723b099a41d3beea98ed059bcd1b3eda708acf98c5eff0c7e88832f","dcbf582243e20ea50d283f28f4f64e9990b4ed4a608757e996160c63cff6aa99","efa432d8fd562529c4e9f859fd936676dd8fef5d3b4bedb06f754e4740056ea9","a59b66720b2ccf2e0150fafb49e8da8dabdf4e1be36244a4ccd92f5bd18e1e9e","c657fb1ec3b727d6a14a24c71ea20c41cb7d26a503e8e41b726bb919eb964534","50d6d3174868f6e974355bf8e8db8c8b3fcf059315282a0c359ecf799d95514a","86bf79091014a1424fc55122caa47f08622b721a4d614b97dd620e3037711541","7a63313dff3a57f824a926e49a7262f7bd14e0e833cf45fa5af6da25286769c2","36dcaeffe1a1aed1cb84d4feba32895bf442795170edccc874fa32232b2354e5","686c6962d04d90edafc174aa5940acb9c9db8949c8d425131c01d796cf9a3aef","2b1dbc3d5762d6865744b6e7be94b8b9004097698c37e93e06983e42dd8fe93b","eb5e8f74826bdf3a6a0644d37a0f48133f8ad0b5298cc2c574102868542ba4eb","c6a82a9673ba517cf04dd0803513257d0adf101aed2e3b162a54d840c9a1a3b2","fc9f0f415abaa323efcecc4a4e0b6763bfe576e32043546d44f1de6541b6399b","2c4d772ac7ac56a44deef82903364eb7c78dd7bc997701123df0ce4639fe39bb","9369ef11eed17c1c223fdea9c0fa39e83f3722914ef390b1448db3d71620c93a","aa84130dbc9049bba6095f87932138698f53259b642635f6c9e92dd0ddc7512c","084ceadd21efabd4b58667dca00d4f644306099151d2ee18cd28a395855b8009","b9503e29f06c99b352b7cae052da19e3599fa42899509d32b23a27c9bb5bebf6","75188920fe6ccc14070fe9a65c036049f1141d968c627b623d4a897ec3587e15","e2e1df7f45013d2b34f8d08e6ae5a9339724b0ea251b5445fcca3e170e640105","af06feb5d18a6ea11c088b683bdb571800d1f76b98d848eecdf41e5ec8f317fd","0596af52b95e0c8adc2c07f49f109d746b164739c5866fa8bb394dd6329a3725","c3365d08fe7a1ccc3b8e8638edc30123007f3241b4604e2585b9f14422ab97d8","a7a3d96b04bb0ec8cb7d2669767c4756f97dd70d08548f9e6522dde4de8e8a03","745e960e885a4ba04c872225cbb44bd67a7490d169ceaefab7c0dfc444768676","0b1ce1768cde3535493a9daf99e3bbb8c7dcc3a7f9d8cd358cb846af71ce5cdf","48b9603f6e8a7c94b727277592a089f94261baa64e6c9d18165da0481663a69e","3c20a3bb0c50c819419f44aa55acc58476dad4754a16884cef06012d02b0722f","4dc64902cb86e677a928293593658fbf53388f9a30d2b934140c70a7267b07ec","cb4fd56539a61d163ea9befe6b0292c32aa68a104c1f68f61416f1bc769bcfba","0d852bdc2b72b22393a8eebe374ee3efe3e0d44e630037b5e1b6087985388e62","b6c9a2deefb6a57ff68d2a38d33c34407b9939487fc9ee9f32ba3ecf2987a88a","f6b371377bab3018dac2bca63e27502ecbd5d06f708ad7e312658d3b5315d948","faa72893e85cb8ebb1dafde6b427e5204e60bb5f3ee6576bb64c01db1f255bc8","95b7ed47b31a6eaddcdd853ee0871f2bb61e39ce36a01d03dfafb83766f6c10c","19287d6b76288c2814f1633bdd68d2b76748757ffd355e73e41151644e4773d6","fc4e6ec7dade5f9d422b153c5d8f6ad074bd9cc4e280415b7dc58fb5c52b5df1","3aea973106e1184db82d8880f0ca134388b6cbc420f7309d1c8947b842886349","765e278c464923da94dda7c2b281ece92f58981642421ae097862effe2bd30fa","de260bed7f7d25593f59e859bd7c7f8c6e6bb87e8686a0fcafa3774cb5ca02d8","d95c4eaad4df9e564859f0c74a177fa0b2e5f8a155939b52580566ab6b311c3f","7192a6d17bfa06e83ba14287907b7c671bef9b7111c146f59c6ea753cfc736b9","5156d3d392db5d77e1e2f3ea723c0a8bd3ca8acffe3b754b10c84b12f55a6e10","a6494e7833ee04386a9f0c686726f7cb05f52f6e069d9293475ccb1e791ee0da","d9af0c89a310256851238f509a22aa1071a464d35dc22ea8c2a0bae42dd81bc5","291642a66e55e6ca38b029bc6921c7301f5c7b7acf21ae588a5f352e6c1f6d58","43cd7c37298b051d1ce0307d94105bcd792c6c7e017282c9d13f1097c27408e8","e00d8cce6e2e627654e49c543b582568ad0bf27c1d4ad1018d26aff78d7599df","ed13354f0d96fb6d5878655b1fead51722b54875e91d5e53ef16de5b71a0e278","fcb934d0fcdee06a8571bd90aa3a63aa288c784b3ebcecfe7ae90d3104d321f4","af682dfabe85688289b420d939020a10eb61f0120e393d53c127f1968b3e9f66","0dca04006bf13f72240c6a6a502df9c0b49c41c3cab2be75e81e9b592dcd4ea8","7dc0b5e3d7be8e1f451f0545448c2eaa02683f230797d24434b36f9820d5a641","247af61cdc3f4ec7876b9e993a2ecdd069e10934ff790c9cee5811842bff49eb","4be8c2c63d5cd1381081d90021ddfaef106881df4129eddeeaba906f2d0f75d0","012f621d6eb28172afb1b2dc23898d8bc74cf35a6d76b63e5581aa8e50fa71b3","3a561fa91097e4580c5349ce72e69d247c31c11d29f39e1d0bd3716042ff2c0b","bc9981a79dda3badea61d716d368a280c370267e900f43321f828495f4fef23c","2ed3b93d55aea416d7be8d49fe25016430caab0fe64c87d641e4c2c551130d17","3d66dfc31dd26092c3663d9623b6fc5cec90878606941a19e2b884c4eacd1a24","6916c678060af14a8ce8d78a1929d84184e9507fba7ab75142c1bcb646e1c789","3eea74afae095028597b3954bde69390f568afc66d457f64fff56e416ea47811","549fb2d19deb7d7cae64922918ddddf190109508cc6c7c47033478f7359556d2","e7023afc677a74f03f8ccb567532fe9eedd1f5241ee74be7b75ac2336514f6f6","ff55505622eac7d104b9ab9570f4cc67166ba47dd8f3badfb85605d55dd6bdc9","4e28697d4f51ac81022d6b939e7c53a3d9b70f9ace3b63715471c256a293ef39","f57e6707d035ab89a03797d34faef37deefd3dd90aa17d90de2f33dce46a2c56","cc8b559b2cf9380ca72922c64576a43f000275c72042b2af2415ce0fb88d7077","1a337ca294c428ba8f2eb01e887b28d080ee4a4307ae87e02e468b1d26af4a74","310fe80ff40a158c2de408efbe9de11e249c53d2de5e33ca32798e6f3fbc8822","d6ce96c7bb34945c1d444101f44e0f8ba0bba8ab7587a6cc009a9934b538c335","1b10a2715917601939a9288d49beccd45b591723256495b229569cd67bbe48a8","7498dfdeed2e003ec49cdf726ff6c293002d1d7fdadbc398ce8aafe6d0688de7","8492306a4864a1dc6fc7e0cc0de0ae9279cbd37f3aae3e9dc1065afcdc83dddc","9c86abbc4fd0248f56abc12aaecd76854517389af405d5ec2eb187fdb00a606f","9ffd906f14f8b059d6b95d6640920f530507e596e548f7a595da58ab66e3ce76","1884bccc10ce40adca470c2c371c1c938b36824f169c56f7f43d860416ca0a4c","986b55b4f920c99d77c1845f2542df6f746cb5adc9ab93eb1545a7e6ef37590d","cd00906068b81fbd8a22d021580ac505e272844408174520fafed0ae00627a5d","69fab68a769c17a52a24b868aeb644f3ee14abaa5064115f575ddd59231105ce","414fbe3458b12691d238a402c3038ed764b406360259619c05eca52c46499f93","93f7871380478bc6acf02ad9f3dc7da0c21997caebbe782eb93a11b7bd06a46d","d00279ab020713264f570d5181c89ca362b7de8abddf96733de86bce0eca082c","f7db473f1d5d2a124f14886ac9dbfeccfbb94a98bbe1610a47c30c2933afa279","f44cf6c6d608ef925831e550b19841b5d71bd87195bd346604ff05644fb0d29c","154f23902d7a3fcdace4c20b654da7355fee4b7f807d1f77d6c9a24a8756013a","562f4f3c75a497d3ad7709381f850bb8c7646a9c6e94fdf8e91928e23d155411","4583380b676ee59b70a9696b42acfa986cd5f32430f37672e04f31f40b05df74","ad0a13f35a0d88803979f8ea9050ad7441e09d21a509abf2f303e18c1267af17","ba9781c718ab3d09cbde1216029072698d2da6135f0d2f856ba387d6caceb13e","d7c597c14698ba5fc8010076afa426f029b2d8edabb5073270c070cc645ba638","bd2afc69cf1d85cd950a99813bc7eff007d8afa496e7c2142a845cd1181d0474","558b462b23ea186d094dbff158d652acd58c0988c9fd53af81a8903412aa5901","0e984ae642a15973d652fd7b0d2712a284787d0d7a1db99aa49af0121e47f1df","0ad53ee208a23eef2a5cb3d85f2a9dc1019fd5e69179c4b0c02dc56c40d611c4","7a6898b26947bd356f33f4efef3eb23e61174d85dca19f41a8780d6bb4bfb405","9fe30349d26f34e85209fb06340bac34177f7eae3d6bb69dc12cd179d2c13ddf","d568c51d2c4360fd407445e39f4d86891dba04083402602bf5f24fd3969cacbb","b2483a924349ec835f4d778dd6787447a2f8bfbb651164851bff29d5b3d990a6","aae66889332cff4b2f7586c5c8758abc394d8d1c48f9b04b0c257e58f629d285","0f86c85130c64d6dbe6a9090bb3df71c4b0987bce4a08afe1ac4ece597655b9c","0ce28ad2671baed24517e1c1f4f2a986029137635bce788ee8fb542f002ac5b8","cd12e4fe77d24db98d66049360a4269299bcfb9dc3a1b47078ab1b4afac394cb","1589e5ac394b2b2e64264da3e1798d0e103b4f408f5bae1527d9e706f98269c7","ff8181aa0fde5ec2d737aecc5ebaa9e881379041f13e5ce1745620e17f78dcf9","0b2e54504b568c08df1e7db11c105786742866ba51e20486ab9b2286637d268f","bc1ffc3a2dca8ee715571739be3ec74d079e60505e1d0d2446e4978f6c75ba5c","770a40373470dff27b3f7022937ea2668a0854d7977c9d22073e1c62af537727","a0f8ce72cb02247a112ce4a2fa0f122478a8e99c90a5e6b676b41a68b1891ad2","6e957ea18b2bf951cf3995d115ad9bfa439e8d891aeb1afc901d793202c0b90d","a1c65bd78725f9172b5846c3c58ddf4bcbb43a30ab19e951f0102552fbfd3d5d","04718c7325e7df4bac9a6d026a0a2bd5a8b54501f274aaf93a03b5d1d0635bd1","405205f932d4e0ce688a380fa3150b1c7ff60e7fc89909e11a33eab7af240edb","566fc1a6616a522f8b45082032a33e6d37ff7df3f7d4d63c3cce9017d0345178","3b699b08db04559803b85aa0809748e61427b3d831f77834b8206e9f2ed20c93","b27242dd3af2a5548d0c7231db7da63d6373636d6c4e72d9b616adaa2acef7e1","a663d70127199ba958d51e5deb8b67915ac722ced56468d81bfd8a2f2b6d1ea7","072bfd97fc61c894ef260723f43a416d49ebd8b703696f647c8322671c598873","e70875232f5d5528f1650dd6f5c94a5bed344ecf04bdbb998f7f78a3c1317d02","436fadda2dc3ec71b67a7dba35368909e488a354dad08e6428ec91ca9b9a3c0d",{"version":"72bdf97739ff49b69ae76dde0fc9e9b1d03bfec559deb61b3bdb78f159623090","signature":"9e85302a4462b9884da9850f498a442137a6f7f490045f45a70420a234008060"},{"version":"9386cfe075835b846bcfe6a0210371bba13376777d70a4fd6a6f0c88abfdb7e8","signature":"ef6f6ebf63438bfb23ee1efa6ecf53925e475096bddefabf9332ddd0287d0591"},{"version":"f8abb02154a998c3aec3386d1a105be0a72b404dbcf1b8b9fdc22b24dd3f405b","signature":"d24e4b35b4d631eb087da7dc34356371790f2535546cf4ea38d1ee72b3c3a438"},{"version":"c67bcf2267f4e2665f28f1b109d33ed223ef29165acab8bff9e51f2f0bfcbe07","signature":"2352ae2575f0f17d52305e120b0312c68851354d59d87f9f1957c6b527c1dd21"},"1dfdec0ec9c299625d20c5cb8f96e2a801c81d91669c6245f520e8734a92fb3d",{"version":"9f930418c338235b6e389a7cc0b13e8b7dabf8d824c17d2e4faaf74541940049","signature":"b10d175e3cbf949c16e894fe50f8e3e525c85363dfe835b79c4240e44e6a27dd"},{"version":"2d15ab00dd0971d270204bf957211fef1189d0fb75a65f0fea2dfd8931e989d7","signature":"9677d00cc1a3148b5952cee8893810be2d5cca6a6c595ffc7cfb139078581a18"},"ca33a8dd3b61ef200b947cf33da0fb3dff1e7416d086f637058d0f7dd1b9e67e",{"version":"24a9a217b017bd605a51769f2de6f836d8aa46c5f68489120f98c682365d6364","signature":"7d0543b90f5718c942001e871062e5ab6412c8d7b9991fd18430a232d29fc7e0"},{"version":"b24303930315a56487ee0981acf624cf3fd45d0bce42c0cc780b05a20a633d24","signature":"ad432111ee82a4dee17aedf22eea91e8f916c77f4a85473332c434da4a96b79e"},{"version":"dccc6979ffb717d2dc762b850e876dc21bd721fb5530f169566e16f6e9b9a794","signature":"35af55035a30a89b78337cc25ca19ebc269171539c8cfeb3e57c53433982602c"},{"version":"15761c72f7af63f39a6c3800724b0198f2d4d089a3fd314045c2118eef50eb8e","signature":"e02e5474a7df6bb25513313ea2a68afea52489a191cdfc84f5d9e598a989c4e8"},{"version":"d104cb762e3925e1359483daf4df168e792d8c57d425918a573c3aae08c405d5","signature":"9f67e28913c84c293fedaa7bf303a6a7de920a80f1eb2dab921963c02d745b24"},{"version":"e9e19f770b4712f9d63408fe78ef6ae2d5667adf19fcd164c1adb9b84e7b79e4","signature":"c947f031d9dfd78025b0db2c795555938b9458fe95f3c9677f033741529c12fd"},{"version":"c4de48f153a555b22b87ecc1a2065ebad9537b700985215729f5578c1392c9b8","signature":"09ae2866e45af7f42b0b4586d5bb15a888ba98bb6885d47d3f0c471d8cd2268b"},"09f1e753f6368bec733febb8824b5f7a1b27ed7c7ff043618ed358ac785bc295","8959e66e910640d77ba2acc979c3ddcb2eb7f567d39ae96527b7751a6fdbb274","367f3f82b900fd94db7f73952a0710f472ef97941c4e754fe9c9201899d886fd","6bfe4ba1992264f5a1644d67965983f297f876b121062cace8482faca8eadda8",{"version":"1454a0322b6067715b79225097640f02bf1fec09a5c413ad97ca8a1741d570ee","signature":"e5d75c0a3d21234956e576c6926a847e4b01c91c7e4b26858bc3fb79ccc2da49"},{"version":"d0a1c9e5eb0a5417e74fd71c54d1dcff17fdd11d2f70eec067a9a078b9dd8a28","signature":"fe8c1143e39ea5702bfd8135dedc600fc20b7fd3826493cd6301c8f9b77ac224"},{"version":"3add7441c91e2ead72ce62775a36743dff6cc6be0b26b73382852548c3680447","signature":"b10d175e3cbf949c16e894fe50f8e3e525c85363dfe835b79c4240e44e6a27dd"},{"version":"d39dfbca32748496c59200e72afa6253fe0b9bd91b39e73d9eefc7cf2dbde5ae","signature":"8177ba1ebd46a561aa20dfffa4d0fb390aa2b7c31c9daada5ea9378367039f60"},{"version":"f6ed69dab3599309a2dff6b78ae366d0823a00165f0c851ad7e2d4e996e63fe1","signature":"736a3680e8d8e46fd3bef0957c77c27b471c59e2d6ad8d63d3253eec275c7245"},{"version":"c4329df1cd1e31cee176e918cbd3d01038614aa629e8bdcd7ed02ce9e56a9566","signature":"99dd259fb99dc4703c3134e5d8dadc50b16aa8d3fa452a7d3af28c856259d2d6"},{"version":"3f69ebaf2365e091ba7b96a39d05d000a42ac5c92699465ade806e5d07e436f7","signature":"af908bc261f69ca5afb1cccd2cd1d1c81e2decab92f10ebc48f588554299f5bc"},{"version":"5a50854cf16fef5e8508fa77812dd786b9aa79668a1d8efe1e2577e42e2b6bcd","signature":"f8b1186ce24d304f3fa897430f13e902aad04a34871c2956a97d2286cc0999bb"},{"version":"150fb8a8ed6a3737e006fd8bb0fd501b8eac7dc19df5d7ff7bebedfdd57dfba1","signature":"267507ded1226d23353ea90ab1a4f9cc9266acf7ce73d8fa7f0970d8ae4c943d"},{"version":"deb2a609c6e203559fb3f573de0ccfa6e20f4ddcca2f7502586319ca6da46464","signature":"41ba3fef28d17e4c9b75d380f0ed7b093949cf8ad48d51c17ab8a2dc1f0fa702"},{"version":"22360133bf15095dd4b911c9161042a35cbace2c0402b62912c7b912630e4ec1","signature":"2042bec94ecf7ef5d6f0bf0eb3d52e488cda09ff2ff007d444884748faa8bf96"},{"version":"d329cc8965a603d749306f494ca92c19b4ad25956564e947583080872f9eb9d5","signature":"68fc8b0696a7c98de3952aa96375e2648ef5ae4403ea961cd1555bd1314821b2"},{"version":"52b089fbc3aa52f59a0e12ff0093977ddf2077582636e07b4400e4f4bd3ea43c","signature":"30c4cdd3a8543d42d7e660ed0d9d8b3fe0f564b1fce40dc01dd7012b48434a6e"},{"version":"3ffe0d9afdd18a7b2d4834d0dadfe6ba1a75ef16790a2fc93fe2a6435862eb69","signature":"c9d961f4aa7cc80e462dd343f0a981d7b2d36d1f8f4c73226a84643c1f490f02"},{"version":"124af5deaf474c2130770170ad46a92f9ec3da6823735c49ec93abf2fa6db686","signature":"cd6836f87ab95879a0726a3056836531aefce32aea3eca822fdfae12c85d6eb7"},{"version":"33f3b8474c8797b35eee6d2080b6253467bfdb0eaa27b197ffab10986b71de0c","signature":"5e38c35de6cc4e109a718be2c79960c1c4125bdb81aed19191a4b8e7b2e58b93"},{"version":"109dd4e452566823892415524500827727ba356c8d3cdb03ce9580549eaefb0b","signature":"73ae19a7b1008d90ee467589b4c12ee63d76e4fa620c408c560a9945c062f1c0"},{"version":"57015d39746737fd5f1244e1714c410d51aa02ee6e12c1c3612ff230c7b30582","signature":"2ede83731625dcaa13b1464bba80a07efbeb43ad7c43b98c8b014adcbcdba064"},{"version":"de46ed93e957c900ebbaf13fc0a2622b6cbccaad8de5c226cc4c9ece08f14515","signature":"d1b7b01112007874a31e337b701083bc487cd7ebff9091deba369d34f6e562c0"},{"version":"eca9a2473d17b9e02af6097e6c799649d50995ee56704f4d11f74bb9be38e4ec","signature":"35bfc9dfda5d28e2b643127f8e8465d2e76d37392adc64dc77ab6463ea3ca8ec"},{"version":"5a5fea74edaefd566e75c25c5a5d7133345b868519102314fd3cc6ea025916f9","signature":"e52eef43baa457705d746c0b4af2a3b89e64eb716018c907ca89df0cf8eb8009"},{"version":"73b8ead78025f3d8cb02a8683640b2cb954399e8d3fd561dc0dd248f81ac0c37","signature":"d9fc6bbfc80cb3fd872717b2d330f830deacbfb51c3a9f5a2d37e142c0252114"},{"version":"ab12bf3ce9acb9021895fdaecfcac783d728cf66618f44a6b08100376ebca49b","signature":"fe3108b42d31cc33ec7fc80aac9b1defbf73cf27bd9f06a7c64e9670c2510abe"},{"version":"2fc1b92100ca81bf18235c51d46dbc09f27cffce3455c4f68571d8ccd9741ffb","signature":"77321bb12df4a3554a32e257daec26ea666040f2d58dc88e1975f1f313c15226"},{"version":"ce231b76857437d6c5b94401788b67388dabe15019ad1d6ca692b5de1ef9841b","signature":"a6ef92367f977a1364f7ddefbdb5d34362a31aaaeeb293e1d41d867bbe48a6b7"},{"version":"0aaaa7f5734a72cb98e9af48783dee6c8fefccaaa6f020ae4e21094e05807dcf","signature":"e9bfb4407d6ab567772afb333ab9fb51133383695ffce9baaca939ae0138507e"},{"version":"e1f3ed084bed904d21263aa8cd70dd51f4c710d2fd211c12d61f8fcb743c8f93","signature":"3ffae44e1175210847967941ac15a58a1cb2aa24d556ad71032736d4e5dc195a"},{"version":"9685ee50d943e946b9c16f4c06cd9202ca9037a9674f3b35070aad0126c6c0c3","signature":"2519707b9e5b59430cbc7e76f861591c19c604f9fe4b5caca6aedb46989af89a"},{"version":"7dbb8dadf62eb66b2e0cca85977c9b522648fe4ff0c20fed721bc7782753ccf4","signature":"c0795df19c107634f47f9656674fd91e9669a52c116a630f8dbd0edb825f8fe9"},{"version":"d6234945bd36c04b0cf8454d0e11958f8c00ae1dc7cf6767dfbb02e753bf307b","signature":"d0050d4a78c037d04cc9b23097d959f1d4ca01bdd8c36f55efbd84d4c8248617"},{"version":"c6a7819a9b80283fe86f0d3d1453d837b56d1a73a59ac4c201de6e6f161de8e1","signature":"0c354c7c595d3b634c153fcbbaf5cb6034789687d98ce415b4d569d1affdf638"},{"version":"7fd7bca9ae242ff1ed5df38c77bf6017cf6e96ca01c789c21888d6e2dda40a2c","signature":"dbdc937689e606dd4e48c2d5262b11dd9ed1766771af3d44b0aa72b0253a2f61"},{"version":"f77bb1a539a64fda8f800b9bb0ad1d4a3b57c7fcce20632674e0218319b19058","signature":"73f47b1f6ccb8bf76c1b21dda99ed524450a2d72111d54f2dd930cb11bbb9928"},"c8e857b6224783e90301f09988fb3c237fe24f4ebf04778d0cbe8147a26fffe7","df33f22efcbdd885a1ea377b014e0c1dfbe2e42d184d85b26ea38db8ee7834c4","f400febd2140549f95c47b2b9a45841c495dfeb51cc1639950fa307cd06a7213","7048016c91c6203433420b9e16db56eec9c3f5d5a1301398e9907ac1fed63b58","a4234645829a455706bf2d7b85642ee3c96bfe1cfddc9918e25bac9ce2062465","9ff2d17592dec933b2b9e423fab8b8bc20feed486f16d35c75edd77c061de6e3","fe9fc5b80b53a1982fe8fc0f14a002941b471213717536987d0cf4093a0c90a0","4921f21de15ba1e7d1d5c83cf17466d30d4371bc9acf0c2c98015ebc646702ef","f728f13a2965aacfb75807a27837509c2ab20a4bb7b0c9242e9b5ca2e5576d22","c340ac804b0c549d62956f78a877dda3b150e79954be0673e1fc55f4a415f118","2bfe95f5f0ea1a7928d7495c4f3df92cdc7b24872f50b4584e90350255181839","9dfe677f6d3a486eebe1101b4cf6d4ec1c4f9ee24cc5b5391f27b1a519c926f7","2766c9a60df883b515c418a938f3c8fd932241c89aba12aedf418e02a73017ce","394967bc5f7707312a95cd7da0e5b30b736b7ab2f25817a8fea2d73b9398d102","014a4afcc1674f40c7d77ca215e68bb3b0a254c2c925bcaa9932b6fb8f1ccd4e","f816538db9388ac17bd354cf38d52da6c01d9a83f0589b3ff579af80cff0c8c6","d2e0c04dce50f51b98ee32fd461dfa6e416a4b703c3d6d7e7fb7e68eca57a8de","a8995e0a2eae0cdcd287dca4cf468ea640a270967ed32678d6fbf89e9f56d76d","b151ad192b8e11b5ca8234d589abd2ae9c3fc229cdbe2651e9599f104fe5aa6b","c37f352ab276b3cd4117f29e4cc70ed8ac911f3d63758ca45202a1a052fa9d00","c97ffd10ec4e8d2ae3da391ca8a7ff71b745594588acc5d5bdef9c6da3e221bc","74c373c562b48a0bde3ee68ac563403883b81cabe15c5ada4642a559cbd5d04e","d42fe36f52e0ae09274753ed0fdedb32c42c2ad6ad247c81e6bd9982d1762004","87f162804c7a5615d3ea9bdb2c828cd1d1f8378d5e2a9c3be1bd45c12f1fc1a5","ccb92f285e2f3a3462262945fa59506aebe6ec569e9fec223d45d41c7c6cd447","04e45000cf1381e6a84196aa01ca811ab192ca0a09debacc9e75dcfc6777bae1","566007f48fa4cc7d29e4cb5cce9c315ccd52b72300d2d45ab0c639889e42d455","4c2f8fb8a8f4afce6e05b9c554c012eb50147084933d78f7d218108740afd803","6f72b3ebad0276cfcc7291fd2aefd1fbbd229487ec1acbbad03e798e8760e02e","096681898d7131c1183f164ccfec478d99a9efa3744a1b6617116bc6713ed7be","2c9626288e967ebb03ec2bc27ea504f6f829b1686f65b86fd5074d53e0160d70","4de35fb3800a92324c59c1d2ed28a4dc1284d507d27ef2eed680c2f9ebb32cd2","4c3cccf01f76ca4292746b6dfebd6df4382eb7a05315724116feacecf952f106","492d1d21f79a8fa084e9dfd8fab89247301a49f1a0c12765b99c30a0ad8629ff","69872cabf40dd4399939184cd7c5e47da62a9df811d3f56d193a437817a85b21","19d00382e69115eeb1214d9b865030b61ec14f1bd5e91fb6e2b75acf5a6bef80","2f0a5a8ef5c6f5866d3caf04151422d05e64765ee250a7e9defc62908cfe73af","79726fbe0854724f5bc3f16d4e40c0b320bbaa7a6296d1d782d70909f3b3a2eb","6d391889910947acbe7d110271463ef74e7f65ae372d355756b1a6b0a987168d","b3dadc705ad865a3acd5b40561ac0dcbce38fa28872ecb903eb586bd64cfa8b6","8181adc6c7145eb6b2596249f3a2e1ff2fa7ebc604e73fe583f98c4b40916d6a","dc84bb520982504eb30b09b870b32be8eccff2cd9beb963efd6a78971ae104b6","bafdca74b47f54e116a9f2d589d39f1c677c777198b96a677a2d2f628b43c8f5","9ccc168fc7cb696b5f60f216c72881db1f6c2d8e39eadd6c68130711f8eddd19","6187a2dae6a9d910f272bfae324625437343f43a6ff48a28a5c5dd5e9cfc2d5f","f063f87a44b1e92948bd5ef6db5b8cadef75218126e75ff02df83196e2b43c4b","333df4996910e46b00aa9b7c8be938f6c5c99bfbf3a306596e56af9fff485acb","deaf2e9bfb510a40e9413d5e940f96bf5a98a144b4e09a0e512efe12bfe10e9b","de2395fb1d7aa90b75e52395ca02441e3a5ec66aa4283fb9ced22e05c8591159","64be79c9e846ee074b3a6fb3becdbb7ac2b0386e1e1c680e43984ec8e2c2bbb9","9c09e723f7747efc123e19f0ced5f3e144bbc3f40a6e1644a8c23437c4e3527f","36fc129c8e3ad288656ea0e9ba0112728c7ec9507c75c6a3bce6d66f821a31d5","3771470dde36546305e0431b0f107e2175d94e11f09b116611156f134364127e","18c6715ca6b4304a314ff9adb864bd9266fc73813efd33d2992a7c6a8c6e7f73","90cde8ac2173d2008c51996e52db2113e7a277718689f59cd3507f934ced2ac2","69d01aac664fe15d1f3135885cd9652cca6d7d3591787124ae88c6264140f4b1","55ab3dd3c8452b12f9097653247c83d49530b7ea5fe2cb9ef887434e366aee8c","abd2ce77050bfd6da9017f3e4d7661e11f5dc1c5323b780587829c49fcac0d26","d9dfcbbd2f1229ce6216cb36c23d106487a66f44d72e68fd9b6cb21186b360cd","244abd05ca8a96a813bf46ddb76c46675427dd3a13434d06d55e477021a876ef","5298f6656d93b1e49cf9c7828306b8aefc0aa39ac56c0a1226f1d4fba50a2019","93268ed85b0177943983c9e62986795dcb4db5226732883e43c6008a24078d7f","843fa59ad0b6b285865b336b2cbc71cdc471e0076a43d773d580cb8ba2d7030d","aa2d452401748a5b296bf6c362b9788418b0ab09ee35f87a89ba6b3daa929872","a4ef3c3f6f0aadacac6b21320d0d5d77236360e755183802e307afd38f1cbcc9","853b1daed2861381ddda861a0450ce031c280d04caec035cc7433872643871c6","1058ed9becf0c63ba0a5f56caaafbfd0bf79edf2159c2f2f2fe39a423ae548ae","8b6eab9a4a523909ee1c698a10d332c544aa1fb363f482fe60f79c4d59ca2662","f2b2c244b10a8e87192b8730ed5b413623bf9ea59f2bf7322545da5ae6eae54b","92bbeada67d476b858679032b2c7b260b65dbccc42a27d0084953767d1a8cf46","545afad55926e207ac8bdd9b44bb68f0bbffc5314e1f3889d4a9ad020ea10445","e76a7e0b4f2f08e2bef00eacc036515b176020ab6b0313380dd7a5bd557a17f0","fabd983e4148e2dce2a817c8c5cdbbc9cf7540445c2126a88f4bf9c3e29562b2","a80c5c5bab0eb6cc1b3276ac276e5b618ead5de62ec8b0e419ea5259af0a9355","d8cf5ded7dd2d5ce6c4e77f4e72e3e1d74bb953940a93d3291fb79158e1afc6e","bdb10c13a7ababaae91932d0957ef01cd8a789979cd0b606a2106d198848b16c","0fd3f9fed4dd35b1b07c18b4c3f612b7542c91835ad8a26e0e83d905709543dc","441b5f5ac4619df9dbf436ecdb9f0bbaacf8696e6fdb2f81c6f5b1db76f5a1c0","5d2284728400ee7b4fd1acd69e48d649d4056916cc70950a0000e5d70a32a750","27ef186120f9e7ee90686aa7ad5163eb5c7f4cdeb19bb87850c4a5fe4b8e05e8","4f1f9e056e0c9d23031367b4c7e7eedffb3e1ed58e64befc90749ca4dd9363ee","2b0ccf76bcf10f61612135f951a74327ea0a2d5a80f397b767e0e0b08cdac265","4e42e643f05a7fa69581a1a697a1cf967d9b2657dd9dd66e59d90500ec053ba0","0ea8485dc0bb7d2a258a93b16305e17fb5be9f877a9df88de7023a9821c537ab","5c221ba5333b775cef94d4a30076cc30730cceba649e9d30c5a7224a698c8825","d83e8f0c10477fb4a7729a51aaad853cee81e0e332581dd2244da09e5526b5ff","c8933a5b693306696e78315dca1fa57f6f5493fed44cd90aa2d4a4d354dd6516","af8e2bf3df20cd2e6b8d744dd83499e174609d0c88864af3f30cd43671e719f5","4186fd8b51535399c7ad1edc08f9c4ebb2a9e8e327b131cc1f950c5dfbb0c358","b92965f503f55830702062f9e0832fabfbded49ff28728686a6fd84aa32f454d","172dbc7933ff46ba3b2efe8b5c7828fd4f0d45c08755df8200213b6055d57f2e","89e2ec7ed42725f89fa537c38f20144782bec6c5710e467a46a647647c8255cf","5165882999957fa041e423a4fb64627dcb310bf50183af70a6ee8e10a584b0c3","390997d64e1e5721fa807aa9e05c97086f58627170d9a7ed84b127126a3e5202","00cf8ed9b47860a5f8cc0a65d7a41f85a7026f68162057728abc9249943a8629","fc8b086c99f6d721eae8125a96833e0ba1762d00b80aad1d55c7a8b59d007466","ff72c74ccdc5570c4a75a93e605a5586596444d96048d52c72f322da183c556d","b8755448066177191edcd0b7e19e7fe44d69ed6dc97b16a420b7aa9070e2b850","822a0c843f492ad2dc815080f24d4ddac4817a9df0de8cd35830e88fbbafbbe4","467865324b9f66a1b8f68d9350c5aa0e749eec499e4863fe017b16ea8bcaccdf","863bd77d5546877e19594759a901cc7b75da8d27336d4351e54413ec12032d09","a17a62c94da321c0bf2315c35033e313daf1298a75aa43a01a4daf6937980c01","851271a09d3c2db3eab80d64beb468d775a9818df06a826ba58925c900231ccb","da2c95cd1f0f9cc19f3dd599b4c8fb0930eccb78a5c73f683e7ea98262d2f55e","e40d3ca85fb1362763067506784635aa28863640cf7cf9be9e8c1c521c0fbbd5","77a2f84e19aca9d03efdf0c484aba8daad3fd23c70b72e63aca78fadf71b448d","00c5b6248c69e66729e5c4acb239db849b1497d7eb111fed3eba979432461ebf","8e13abf75e9394f3a4b1d0b3f99468e15f4c7e2115153d2a1ca3c0de035bad1c","07097dab1c068118806fecb8544aba3cca30965d0864b1998af1bee326a9990c","c490ca6eb9149c28e4f2def6acb1bc058d160edb40fd249cf2a70c206a8cfecc","7c9aab9a76abba65aa6389e41707d57ea0288dac9a8b6359465dcb462d2cfaa1","97fbe30fd1b61b26f807ae1c78b681b0999af71cd9604c08a1d45e44690ca0c2","ef91bf45a3d149db0b9e4e612ed1400c35f6a3d2a09669d1441add612d5f16b8","dacebdc0353168f259724bccfd273b892e883baf36cf3dee21cf4178f3ef9ea0","5416fb031a72377c3c17faa2041428a5f19f9d46a70b645dda6e3293fd0ca8ce","95611472fd03e0992070caa3a5387133e76a079719994d237947f6bcf67f9bca","6141d19bfa7698f362e84460856ace80a1eac3eab1956b188427988f4cd8e750","1acded787e1fc09fd56c004d3ba5b719916c06b61976338a92a2f04ec05cba5c","8fb0d41cd90f47b9148e4a474fb03484d9af1735871321a2f57f456e40a7e319","a25cd4cf54bcdd109dd46274e2369fc1cad6d74350b5642441d2b9eef515c3bf","af4b9f16e50a0ae803745150e4c091e86ab95f3dac649286af28505258f7a189","3d209a6c3c53366b3bcb72dcf04a7ceda57362cae6ac47dbb783321934a0c5ad","4766770027d93a5ad1d4cc880cce405b4c6f67c64303ab34b347d6428eb783f2","43d2bec085f0fab54d7b9dfa3f5c5ce65e30da6a19d82ed37d1d41867682f86e","e5efb9781a0ef18d60cbb8afa261489efd260d87642c095cacba0b09b2684fcf","775ca7538a2f9bc674ebe5f3cb8aa8fa346ef4c1faec4c5b13b4784a744854dc","c0037c7c6fb8031f7047a1ccdb381762862b48429e9ab07bac8fc35fc5b5dd14","af4db63c6e4d55df1ad7f3dabdde31bc30555debf1cd6b79ea65a36c52bf199c","d291ffc234a58061b8192f74422f2e51fb87f6d10e82c30a555bccf9641b3e38","6d683695e9765b29165bb0823f88755211d48949f0b95a9a4236802afddf41e1","8fcd568ba937d867544cd8e726f35a515690ad041387fdebc93d820c8720e08c","81a0ff507ece65e130c1dd870ba79b8337c1fd345db7b154a2749282c994d2d5","64e2ffc72047548fa3c04095abb9dab48e2eaac169161fd2ed3564dea0c67e57","b525d2fc6b694512a877219ebba25d5fa244f99253a5bbe6c6421f8d71b1c806","d695f0d65f5fba0e275cf7801399575c272b86e7bf8e70133f8fc03517305b1d","0836f15e5e7dcad64fd50d49a39267da34371d1c2b803b38dffcfabcd2ff604e","56eff313f885482d44e4aa7cefdd55f7d0d92a91c1ddf9cd73c533abc36f4dff","022ff6b725f6ab95b1c4d229893b3047002a9c1fab6798c8fe63797ec1e63dc5","5e64d04301aa6ae6bf0f3435d07804889342873ab2875a16c827db9e6543002d","0b8c3effe0c65129d493be140da1a83eb61a1e83481d441dd2bc359a926b453e","068db2994f5926e888462b0852ada2c24f2cb50028f034f475407957ca51c6cd","59106b469557319ad26f40f054861be3fd2cf09911c3b66df280b9340a1d9caf","69e8e2dc21b0636f671485867555439facd68ee9e234fc9190c3b42e7f1a74e9","5fb0c0cae187f6554769cd4ff36575ddbc43078a4fdf9b17a5c0c25dfa9a9f2b","b19badf31df455f10cf44fda9f6a0e0b42d6e970ac122b66c5da5d683fa270d4","71b6fe5c85eb877c3e3ed2f142b95a69f97905c34f11fc6d9052a4317e7f6bae","bd55536c0f989f59af6ca66cbc8121485f978f4e07c3df1688623c5f898058c6","dcb868c613ccd06b1a3ff56ee235e5987820c0c8bbd77fedc9af4dcfdd4c54bf","f3d1b3cd130e3cd67fe8e06256deb5d678243c6976ea498c81a48e542efb7529","772b881836efbdceb7ae8d3ae038f14ec83444397d8429b866312dcd78714dde","314d516eb3bf1eda07e898935edcbd1e74739493c8ad444e82181f8a020eef2c","8cfced8e57c64563f91e90a76a6df2d8f934c90a425327a9ed5393bc88c27d97","67bd754a8775c81794c9fc84b1a1e9fca44a402fa7d93fcdad4ba2d37737d929","5128e32c57068eb09d5189eb68681ca7d0e5e4b0cdedecbef9c67689f0970876","7fcdedd29146e5a2a6c86eda652f8485a1eeda1b8646825bbf729023f6ea6013","671f5e3a931c2737f8dfa43b34c4a320eca27fc6584ecef890ddd7374cee5cb7","ff213315eebd3ff05e01b383f704d79d8139aad5cb0d6a13c082f2e29625adbc","83ed351a10ef17b7811d3c06fc2775e36b6911278326d55da8d1eef8ff2f29df","2f5f146f1d6c04cf89ae0e9b4cf2b064b2ce4319ba6a5bf18ab8fb29db1cfd1a","7fc2b96a8465725bf774bd490c383edd5ee3dfe0d38c13551d082cae2de4041e","9eaeb6696e4218cb5bded9ee27c3e95589ad4af1fd4b97ccdca43eadd62c94d5","fd580a99cb9bb84288da00eea67dce300bdef06d4da2a727c0fc466d2922dca2","b82809d4468b6ba4d72437adaab7ca273547c59974e954c48f655a4b1bdca429","c6455d4ed4f7337bcb885c61372c7d9b03991995ed73e29023bad502d1336f0a","b5e6f0491b5a2002eb9b1146165cf915ee58e0fddf7f2adb5f2aa4bc44b4fb83","f534aef095a62fb82f57768fc52995d3e58d95e0a1671b0256a4704802aee818","cdc6f1d471882782cdac7442dbdad65aede5f749c09799a84918bd916eb6d6db","2475197472c609662f09660e3964a86aa355cea0e671653656800690bb508b7c","b4067760d0447747d82b6848b640168d656d0b916c3add2ec94c3c4dea92fc9f","c6c591a17f9c0c2821baf15f775f5c7d6dd4a0786365ee9c182d7a97e38ad96a","ede44ddf9d274a859e9f1f34333d5f0e8cf2167c3265f81d5280d37b872b4552","6317aba53c9152998bb1f8bd593f55730084d05c00c774ff72a3aa4d687a6dbb","26f1bd15980b19d925be98afde3918a6a181435b87e9b7c70d15726ecbfff0e5","57af4faf6847adff5048f82929b9a7d44619d482f571534539ae96a59bb29d3a","874770f851ac64a93aaddfb86a2f901f158711911fee14a98a67fe32533ee48b","3d933e519ad9cc8cf811124f50d0bc14223cdea9f17adf155f11d190ceb2a6c8","d5dfce61a7bf994d2cb711af824efa4de9afa5854d34e6725b9c69d925b6b2dc","f77d1e10417bf43f8fa5d18916935f342d4d443e371206ede7239faaf9abbbb8","c94e0b8815b72ba924c6b8aa666b25903d949a7ab0d38ed84e4bf65da3d06a3b","15db84e660fdcd8468f23973ab83c31d7fd28bdddb30b0aed16cfa051aafe900","b273c241dd08c6276fd35be413c64508ae50f847fa052bf7781799b51da8e9e9","3bc0bbef6d7fb63002fe80167db350b9677cfce5872c0cc7ecec42ba8248ded6","4880c6a85442934b81f3b1a92cb6b43df36f8c1b56b6822eb8cbc8c10c438462","1bfdd8c1710a3d1654746ca17f512f4a162968a28e1be1a3a1fdd2a8e5bf385f","5405aedafdf272dde53b89036199aaed20d81ddc5ec4bea0cb1ab40232fff3fe","db2ee45168db78cc83a4368546e0959318374d7256cbd5fa5692a430d5830a59","49993b0eaa14d6db6c334ef0e8b1440c06fee2a21ffd4dea64178880bd3d45a2","fb9d9dc0a51cb4014d0e5d5f230ec06ffc4eb6caae6eecfe82ea672b7f3c6967","84f44079a0793547d3a629feb8f37d8ef6d07cb5bb5fdeefd887f89e9be871f6","295c5ec088a1bfc286e8dbdc9807958588979988cd7a74ad32be774a6f6ea512","f15129c62ed04410ac0a3326ae6fa5ef7229bbb1b0cbfa252b5c558505a38253","4bf500d9a554d43cb9133d60f1b3f58ca98b0f794486d1377f3effc551b40faf","8c95fe5a655ea1c78f0335f8da58e70d98e72fe915987c3b61c6df49d6e276d1","4bd434d3055d1b4588f9d7522d44c43611341de7227db9718a700703c608e822","935507b695f420fddff2d41ddc12ff3935931a3f26d6aa65afbb276bfdf51cb4","e851c14c9dbe365592f5084c76d4b801e2f80302f82cebbe7c2b86095b3ae08a","40b3e953e9ea51a86a1e5b60a2355eeb780f2f8ce895ece252910d3e0a033a16","0264b432aace8398f174e819a0fc4dc196d5aed49ae65aae071fc2ec8e6dc029","3b29bb23855a1924264c3a30b5c73b00c52a57c2ffb5f91c48c9572e71048f19","8b9b2e76db07d8926bcc432c9bdfb38af390568951b39fe122d8251b954f9ed2","96e85c6fa102741a25418ab2c8f740c994e27ea86fd6518a17ec01a84b64dd5c","9525b28a4fa959c8d8c7d6815f842f78c67b40def9160afdced5c9daf14cd4a8","0e59a6944a52f52138315b6658fb1d217fa017b7abec12006c491d51e07fb56d","cfa8acfeb9d68702aa6249b7295ca73ea598e441f014cd4184b6e2a3ea9a275c","21b0c616f61cd6699135a34a500f7df30022abf9358ba612f10668ea3c988e00","9ad1d0b171f7bb9f484ad156e97f0d8e760a5fee13e342831669c7b2d1137a30","7ccadd4ba126bb2c0564bfb85ddd7d084aa5f2880cc2d0149fbe183fd5ceb6d1","ebbde5a8a356a1547ac6ecdfba7547036a5ada116011cb96634c32df1cf69084","e703eded767e3a944ac1f7c58c201a0821da1d68c88d6ba94bb985a347c53e42","99953f3f1f9deae755b97ed3f43ce2bee2ae1324c21c1e5fa9285c0fe7b5077f","2afd452bfa6ebaacbead1ca5d8ab6eda3064d1ea7df60f2f8a2e8e69b40259e9","dae0f3382477d65621b86a085bdb0caabf49e6980e9f50ee1506b7466c4d678d","e5793b3f4cbd73c841790264db591d3abe9bd09128302a2901fedd2353ab24d5","41ed74193a13f64a53705a83e243235920fd58d4b115b4a9f5d122362cda7662","478e31b207faa7110b04f6a406240f26b06243eb2d2cff3234c3fc8dd075bf6c","3ef0c5634d9aabee346f9ba056c1c5d977f2e811f6d13c082614c9062cd4b624","1ddb49c7f8fc4b9e4da2d5ddca91b4e2763fe7d17aa79940bd60406f3e2739bd","d5b01eab562dc40986a5ceb908519dc7f02a7ded2bcb74318317a75714dbc54c","b19ef44e991aa150a19a9f84be1fd1c4d86496241300fd904216762246700623","87df6cf2565a88dae3ec50e403e9ef6b434ad3e34d922fe11924299018b38e58","9d999d30b52fb0b916f7a64c468f6d5c7a994e0c1ef74d363562e9bda3cb8b99","9b1b05f88ded21046391276ff60d2d987bf160d77b40399e07b7bdbfe2e38b31","3c80bf6873eb3b95cd590aab8eb1612f0f7cef6a30b3f49535844f7cecd99351","da367ede4ebd5ff4cb1cf9e6bc8eb35848b23c57c22c53360e53dc772c7be8f9","4337acbd8896efb7e7d8d6e0eca78607fc7c1a9ad2bb228240f13f97b3492f1f","505c7800f8195961302dee715870b7212bdfb667e5e47de76447151dd35a40f1","cf5a3eed6cd493d198b0c1eacf70486d8bd527fc411d57660caf2c93b5ea0fb6","900e344adae3c65076c9ba4ee1a77c6db19fb0c7e54d7ce23c28ff8d272cba26","bcc5186a38d1eecf60b2c4d1e3eb9abd8ab91cb492f384a9d2ed7bcda2abd0d5","0ec1b41954fea9def7d9d87e0f3beea2ba3ec5b7beb769f308cfe32ad2968669","51189c085256f11da13b22792f1d7c928f8a8e9d9b6c7b38e956e72a51ef8219","504f509e23f2ab3a8018533925c034a340fbce4af9e77a1f71a8ddffbe0c19fa","635c049483e13e1dc8bee72dde300c40d350046cff59b202d41a12ec8c733d27","7fd8d5f70ea745e1a0338de7aaacd9bd6ff086ce6de75dcf91749c77d1e23831","78d2a7795bfd2be490937e8b01968a0acca8a6bdf5933570bc013806049d4175","db49833b6e9aa54b535076f40615349a7465005367a787b50ba7b92421e26442","6a936fc917de40c44ca81331ee7d7a71dc30ae1895871e7be7b6ed85d96cc41f","bdd2a764cf87c4ab1efd7084597d1ca4ba17f6b6496553095ecca5a14b5d4278","ddef8e6676fd572ee3de174ad28df05c7b3803542d7318482b8f98779ff25612","34eae3bc7f5bfb515d2ec163ccd4b63fdb73ad7f66564707686d84f42a8b7c35","d240d106cf9bc3c0efdb323d807b944ce16ac5d837ecef5b75f1e66d606b2a72","639d5a26be297431e0bcc9f71f969fd7d84319fc03b5e1c672ea10fb0094c616","770c3e6367c2802c027c0b1f86928f288e11ad77ac2f454d7f682460eab30a0c","c9dd2760e0419a059cf733c38ef5d44eeca3fc647f9c201d88656e5040f5a3a7","16766b8f3d1bba66ac8167e6407be6c490d4462e802f67c140b1174869db5b67","f9267391788ac81ca54dfae32c5d86e99a19abaee9b172b2f8d98a3c2b578a2f","92441638c0fa88072ef9f7b296a30e806bac70219ce2736ef33c8941259d9b70","8774efbaf39f9ea3a0ff5b1c662c224babee5abb3d754796278e30eb2e51ae3c","e634b47a7d3f9468572a7c9af1fe2f52687ee1afb23ba5568205a7a4c55662ef","1cbef47ee169c717a1ef7ea91b15582c61ac721fd5f5671de95c3df9f026db9a","0db0ee49f803c9b901dfe06be9c8fb6a1c05f98664ca34c68e0da575eae76f2b","4b745fcadf040899979b6b26e24aca6d2fa2bbe52a919d67f717bfe0339354a3","bc57f3550b3fd3b7d31b9a278d0b491dd45d170e37c4046a3105fdea9ebe5f89","b5f7093d62a228669dd56edd0bcb86a0cf0b46db4816a3967b4632503c21b93c","4d70bbb1f35f345b2c2e1b5c9b8174d5397bba76ffef12656bca16ce9a1830d3","a004fc80aa8f78dfb1d47b0e098fe646e759311c276b6b27404f5e356528f22d","c8933d9afe6c5ee7ecbeec5aa01f6b37d3c2be2f7dd203ee75ee4850164007cb","b1129b38f1eea70951ece3ccd1cc3e1d094379b64d3958ba8ce55b0ec0083434","b2bb10f992cfd1cf831eb005311a80f7f28bc14cfac5883f17e75f758d1354e1","149288ae23bb3b31ffe5cfb7eea669fc6872e41901d60be932af2581601fc70f","01a0fd262c8fdc6c91078255c4fe2f8602fd4fe4c753b2eae88537585b21dddf","deb69e6754a61784daadc35b318544b0aa69048ebfb142073c62b7f46bb1d5d0","60eef77c9b5cec20516907628f849845975a8137773ddb0bcb53fc2ea7d28870","67bcdcbd8cece34ae28180c636908af1b118fa9603d0d4b7dea877156d4de519","5a1c2cee26d1f8d9bb15b334f5b2df7de27a3944bff9ccf71d3b69c588612bda","a04d60b205af1f28461f3d2f5a8222ec2d8af54d436bc53a0460756e07e4207d","14c85d4debb2e0c8939f81b85cb9ab4543f70c8fe53be5fb5caf1192677c8ca4","c507cdc9757c048620ff08a85b9cf6278598eb1738d729fdbfa1e387a35e639a","4a4807c3096f49a463476742e3b5d23ccf0e087e43c017891c332ae5b8ad667d","0cec41f583efa1f1033a4d546d926ee949756f19040bb65807c5a3ab6f3b8449","73b1eda15491d4f3052d6fac202190e76d6453fce832034bd29901cb198448b9","08c66989383183f3d7c43346617c8f466bef28f1e3eb4da829316d548cdbdf80","1f283476bbeaa589fe644fe6ba9da223baf118ecd4756863deae7362b246aff3","0a8f91ace4d1803eb2a50079c9e233fb262b0027d19aa250eb7ecbf6319e52d6","65bab52912be03b374ab591d73ee40aff3a465ac20bc0f2024b4c80ac5ce8397","6a647bf0620a4a7777527c688c62636a503e8b4d5e680037503066dd2af6d0dd","f1466e4d708815280c849956a506e132b7dc243907b9c8e07d52862e32dfcd91","cb4b99f8e47f57df841c95fcb1afc28488a2b5442e3524f6261e611b86105331","473d9ca5b242db0471d418336f410922eadd290679914f37ef21ee26dbeee2b4","2ffeb6ad0b074d1cfa3dc9671dad062b08129d1e8a8988b727dd2ce9fd4298d8","fa1d4332a68d84300895af592811f65f5f1d725ed0664f17d5c215a63408b6b4","7a09768c36d8b7d8e44b6085031712559362b28a54f133b803bed19408676cdf","f0b807278b2619fbe0acb9833bd285acabbf31da3592da949f4668a2e4bcbcf0","bc6419ca69c35169941d9d0f7a15c483a82ac601c3448257f29a1123bc2399e1","45f530610645ca6e25621ce8e7b3cf6c28cd5988871bc68b3772488bd8e45c25","2d3e715ca71765b491ae8bd76257e8ccfe97201c605dadc4e6532bb62e4f6eee","c519419c11e61347181ba3b77e8d560d8cc7614b6231cacefe206b41474792d4","24823640771cf82865c3b1cb48a8a88119b69e56aef594171cc0570f35f60b8a","30398045bda704d03d23e78a37095aa56e69ab2dd8bb7304b15df9e183b9800a","9a816fe54ea736ecf02b6865c10157724cdb5ba3f57ead02d9216b2dd4bd0d5f","a67582f2933f5b6faebba3484c99e78b529aa016369b768021726e400c93ddb8","96cd7367cc076d36d9f10cbe34b91e94467caf9b64a7a0fe1c4f6c8287e0a1b5","17c7be2c601e4b7e6292932997e491ff874418bef9ee6137e69ea6ef497e0e5d","eb7ed3b69718cf40c1ab8ce9a0e917819e0ef0b7480ba2890cddbb94a1386b10","7a7cec0720ee6d20e08fa9def697b149a94db1763bbec6e1ab5da8d7726ebddc","c024677c477a9dd20e7aba894c2f3e6ef81c4076af932a7fc00c210543cd53bc","ec67ae56b7943bea6c0363b474048559ed90a3d1ebc660453f041d45e223122c",{"version":"a871cea3a0158ef9d80c475070a7a1e9f4cb5c217e963d62961c327cab69a150","signature":"f4129c1b08a3df0c65375eeb859edbc8231212a89626d7d0d58278e590e64758"},{"version":"080163b8be58a3bf8f7facab02cb3af7d757e414402fc7e7c743a26b3c6bc03b","signature":"e45715f0d9be038e9ff215f3de2c8296bddfa9a3b219f839825ab31f0104805c"},{"version":"499c9e78cce39d99c1b9b0d801a091333faa390fc4f276b53aa60c6ac4edf6f0","signature":"4d6ad15bb0c548fcabaa5b817a3475ff6e65b17cd698923723806c4a67e60057"},{"version":"c1f68487e9087b0812df655fc54e4cd24ae46a39bc3772a2ebde2df1b65d59a1","signature":"17e6c27d3987c9dbfa3292369e0bda9ad0b9b39329b594a24539ff8b28807495"},{"version":"f8f8fcbb30e3e6a89035bb0ba2cc7202868c31ec5f40f0fc7f75c080b8949dbb","signature":"aa792abdfc8e04593319400a743d73e6fdc87f1fc8b285fba53adb66b4bace8d"},"96fcd078b8f7f7b9808b4d1ea3179017f2dd31d3857dd2e9eadffd1eb7b17630","d7f808e0ae6f6bb3ad298b9f057eee5cc4c1e188597f6e5c730c227173459e6e",{"version":"e3714c1c17dbabb1b72c670055ba2b6ba46f6cc6023aacbfd70a72852a57d240","signature":"aa3b902d90263f4e18cbddca88a01d420fd2e4c168f633a869135a64a048ef5c"},{"version":"093325976acd47c772e09a779c28f3a0570fc0a3f6ab6872dca9be2835f8ff92","signature":"fd21041b6c15fd24c9fb126495148b0fc151d738869a23ed3aa49bc0583304ba"},{"version":"cf8d4ca480394fd4baddc639fd84193000c30521e88abba8c43e61e65480711e","signature":"6b3365f3a34153fa03035d83ccaad5e736b9f3452a4e630bcf263b843646ed39"},{"version":"47b52f87c52e7436e881ebc14f9343e3555246f8d6856f94f32e99ad96cf3850","signature":"1bddc9fd7488f2796a60803b4cd0421e6bf90d86f009a8ddcc370090b29824a4"},{"version":"e1e208ed1fa7ad9dcaef6a585239d59f5147765204eef8f4ec87728f14aee8e2","signature":"58bd894e6b961165a48aa995270be8eeae37e289d584949483cc5f1da16563c6"},{"version":"a0952d2acc0e3ab4c96edb376e5cbdfe9c24ce2e44da545a77026571c3ddb438","signature":"c28e72da93697fd3344ff34fbb4269d4966e942a08e5fb649e5d63bd47a12d0c"},{"version":"d54c2ae9f90f8942becd10ac07bd58d4dc5fc191e7f763f2f941a815c3b194d6","signature":"d7cf9eeeee1c573cf6af329b3ab79b51e850f94cbf2221b0ed67bcef0122297a"},{"version":"838426c3fcc1e939688d006b71fe30937d3a87c23f8cfe606cbd615d2a8ac24a","signature":"f82dd7b223c5b10cbf0eeb32bc92b07807ab9d2097cd09715d498532f7f8115d"},{"version":"22ea9b49bbffe4ba08df86bb2a97337e7692cd236f5dcc8b8cb943c55c92bbfb","signature":"a5fe3bb273f59a12b817ead7e9cfb4c8a4649559136128fb5cc36d1b18a740f0"},{"version":"354d5f0481a3552057ae8404d9821e3669cec3ab17e8b1d3c6613d76a09a347a","signature":"5b264e0d4172176b05007b2f163d6e01318a0dd82c32f1ebaf3e697cd7bcae5f"},{"version":"5da8fdfb9c01c5dc75833c47131a4ab38be530cf2c3c4b1df8fdbf6223d22d29","signature":"36ef703cf01505ccf74e77c0257150045173bd9e13dc27b35a0d9418cd2effda"},{"version":"a2eacc7f56b270c82752a6e0092df3af48a1939d0fb1df2c71df02f519a01b99","signature":"29a22801434524bfeb6055c9ccff4166c30631f97c05eae0b509e7e2db97dbcb"},{"version":"a59cf612e0c5203dbc8e6a311076d67890460ebb34decb201ef8e27e2f0ea66d","signature":"0ae35ae22726ab89eff019e0b9f4e610ead6681104587c3db4d8630e0ef31f2e"},{"version":"0146d5f6b505a4baa2632a7b7aed70ed933d2160e3f56faee473bd9a5c762fdc","signature":"286697c9878c0fb2b9708c8385cf327acea00cccdefe4066b8d3eb62be48b3cb"},{"version":"9782fa6b811701ed50b3f17c3ef5737b56aafe4ba3e87a336cd9e8f012b94dae","signature":"9615c43ed4e4885893c4b1335bcc9d438178144b4205fd9c93a0e5e755385505"},{"version":"db8675f503f8395deb5db86ecfbf7d1463840daf0e9eb844c31d2911b0a31b2c","signature":"603ef94b3d8b4367da49aefdabf58d8c099ac2bff4ce7391d8126eb924ef5c56"},{"version":"fcd8a6c857468d06036c77bf9af4da3d35e106b79f534e51bc7e56f7d07837b4","signature":"becac721add7e84842c80aa76cc745eb0be77481be36c1cba056d6ef88a6fb0a"},{"version":"b3ddba54333ddb0d5e84db92f89bb7ac64732dce396a82fffbeb0a25523b96e2","signature":"b258512fc01c4b1a3eada671e07b7cb9f44b47a74bedada554df33057ce60436"},{"version":"bf41ea1f87bc72d7e0d359c8f18d0dcd398a17a50baeda4682793ed40bef16b0","signature":"37295efcabae750c14a76547b7ee771ba05baa8c8c2502724e8381e0bdd2b6d0"},{"version":"0a7b2a9179fcd5b108e41011e9d9d6d6d4ceb9c66b1f7b467ad5aad7ec1ce623","signature":"024992989df6dacc0ea8947e23908c0532c56f38f52316d71a6635d35e6af859"},{"version":"4041a2c0db78bab6b0d7e5a7b46a625b076cc9555f6d2cca852761854e3ff747","signature":"acc75380c83dac496e3ac79a7ce67ff9ac17399afd6521fdbb388cb5aa7e4f08"},{"version":"b2338e0f659d23ce20277eaaca84242f93e23e446ef48d040a1f9ccbd76cf260","signature":"052d075af319b760f7785df57f2c249bcbefb6498461c3c973328fbf99e3a4ba"},{"version":"6926348439acf3560e1ddabb3438d2bee36d52179be7cc8a5bbac65ec75fad19","signature":"b317382fd5e7b34a99922a3ec25ae988148ad59e45e1f60b2c8fb26c0263a69d"},{"version":"ad296bedd36b17fbc8f31b4024ae3a7d353e9cb9c99a33cb7ef97cc76af4a6c3","signature":"cb7385457d46eea4bba2485b037e7a72bb7ac0a199625fafc003c120254330ee"},{"version":"c06be95acb8001a74c3ea8c3a6f9eea9a57f6eb8da3c050773987eb43d61d44b","signature":"01d0db94a60f93b52110281e705cb834369968953b42bff14b6b20dd316c8cc3"},{"version":"4b26be8cf0a32f41ef525283328e4c873f4a36af1a789af268b222167848707b","signature":"003ec730d6ca7b51ee83303291f33e13ea541e532d41d002c2875f9845820088"},{"version":"b5fc622675f458373946e4a8c9665c1ee912a1afbb6e7fedc678d7b1a01db49e","signature":"8d9dca90ffd01cb6354ee336b1f43d83d2b2379b1187af3b5fc1a1131f4ad517"},{"version":"4ca4d2e1e6a1204ee47ff6dfc456d9c2b9418118ff409f18110650dd20a58ce7","signature":"e4198a57b2ca4beef5cd2934383eca74728e29ce6b6ad10d84319acdb4328deb"},{"version":"e049d7579c5ec8793abbad55cce1f1edf8c4078ba677f9d5097d7f8fdcb14236","signature":"c3f25977ec5cad1338f0f7bdb8fac4846dcebe8ade0e9edf35dd2e0ac0d15be2"},{"version":"04e60c16828932cb8672c544cda90d02c5de8fae2e90b03856f00349b4c4d4cc","signature":"a7388435f378cf5b7042379ea03a0f8548be29e7564095bc104702bd8966f79b"},{"version":"a1a80d2f692a608f42f07e6e32f91549bac3d39eceb1901ece87cd5cb8a20fc9","signature":"b6858dd895ec3dde189a08388ee456e795d716c8e42eac5115a34360e432dc82"},{"version":"8ccf388b95cde8972b21af6260f46b9ffd3c90700c9fe0b2fde22eb3d7e08504","signature":"1e957e4302d48e11e0fafeafca7c340263d247dd5a124024d24cb5252201b721"},{"version":"6eb9b4d3dff83be468b2188d309ede0513cee77c0ed5a28e3425026fea87a4cf","signature":"7d9c64a90e23f0b14b77727a5d79fa81a1979b8c2d2672a49871de7a0473b521"},{"version":"06942a05e37623ffd4969a50376d6cc348d7a403a5693d1222c016b4d4891551","signature":"44a669400a15ad61d5936ca7062738e3af0cadec20562be9030155c77974fbbc"},{"version":"b275dca8175ed5303baaa8126b5452ebcf4204a2ff1fed1a8271a15d5d528bda","signature":"2e30461e30eb56ffddafafb727f15ab03c790f2dcbf764f4cca65d044a7b8135"},{"version":"7e8691804c628ff8d8e23fc1f902c8efb48dfea61a3710ae987568c0ef67b8f3","signature":"b11b76ddff4422f75fc76a573719df6fea0c91cf59c6a9c7f91fe98be93fdfdb"},{"version":"6b887c1d7e182e8c5cd65349f19286c5a9c62cf67dc4b5eed4b4f72d23b70188","signature":"ba808f987b9fe1bd5969e628de3ed16f7ffce8adf965fa88c4595c064495b29c"},{"version":"77886c6709daed395a74a4fba52aa188abb01f3a3b047cc211d69ad8855cee7f","signature":"4ce7e02e517404d763db4e79cd84f955bf84d69e0970079fe7a66213f6dcc4ca"},{"version":"716be47bc453c664f16e5b0084162f7b276a4dd04e950b25d50b334a1066ded9","signature":"7813f2013ad0b0544d3ebeea1155aac001ed195c603425bfc3fb8c7108401eb3"},{"version":"e089f089347297524520220b97887d01c54853acb42a1ceddbe7c079dceffbbd","signature":"86595e4cbe04b84ff424e13b5716f47eda07aa82027b4b10532b5095d2f04bd7"},{"version":"cd3d66e6223d1bf151490aa953c69c1fee00ff7d42c6e388dd7a7c918e16ad45","signature":"1de75a7baa8598b59982c361239d937b96a41b0fd85b3c0a3f8fc3302c69bfe1"},{"version":"090d8d43242301eb86af8f0b960bebf0585aa07234e96c5f2cbcf6e82d5e21f5","signature":"7d8e6aaa635d466b797554fc9f77b7f8933eff96262da30bf5a5cf3f36408fd0"},{"version":"6c505cc4f77f07868905882a5602a0d8333f3edf67527f941fc828dfaf263368","signature":"bcb2adc194224c3f50cd1c0231db45ea98cc5efa9dde7882ac0fe7bc2055620d"},{"version":"b8c1d17e520841499f4cf079d2946f51d054b808d0a31e54cb5d8ee9ab55f169","signature":"ebc60c06f03e268e9475c74cfe905535c76c17a87d7fc2e34a44576abc329488"},{"version":"73ab13f638fc4afc4a9a2e5e11b2fca9f2ff0243504afe9f573cf92b7480624c","signature":"6dbb6ff4100eff8fbef2a9540716b02460abbac35bb555622fa9bd0cec8e2f2a"},{"version":"adfb56e3c7e47023a64ac893027ae79d538e0d4ad3a1160d8acdfb332d488552","signature":"e50be0a856af14b43a887ae2459ecf17988c823075885fc083bd3a9ac74a8d59"},"ddb0b9fcd2670bce028e60ca5768719c5d21508b00dc83acf6af25cbe1fcc5ec","2c8e55457aaf4902941dfdba4061935922e8ee6e120539c9801cd7b400fae050","8041cfce439ff29d339742389de04c136e3029d6b1817f07b2d7fcbfb7534990","670a76db379b27c8ff42f1ba927828a22862e2ab0b0908e38b671f0e912cc5ed","9d38964b57191567a14b396422c87488cecd48f405c642daa734159875ee81d9","069bebfee29864e3955378107e243508b163e77ab10de6a5ee03ae06939f0bb9","ef50b93a202c92c16ba0aa66ac03ded00a213eea4c2fa30adbc191a944f76f12","9e4b070b543d91d0b321a481e1119e99bb8f136f4ef271d7b5ba264919fc32e2",{"version":"be7abf1df570aea13a80f9e26c48e4ec51ee5b5c807326fc730eadba8a118905","affectsGlobalScope":true},{"version":"14c2fd6220654a41c53836a62ba96d4b515ae1413b0ccb31c2445fb1ae1de5de","affectsGlobalScope":true},{"version":"94460282fca2c683449dcb4d58166b60a8f6ee2de9ece5fcd1bc5727adf2baff","affectsGlobalScope":true},{"version":"f65b3f4d5fd737570c8b1df6a050572891d8848eb65be9185e9d3117f85175b9","affectsGlobalScope":true},"42be4e268c54bcab6bb453e76948108c8ee46dd81651ceb35e580382b869d736","68cc8d6fcc2f270d7108f02f3ebc59480a54615be3e09a47e14527f349e9d53e","3eb11dbf3489064a47a2e1cf9d261b1f100ef0b3b50ffca6c44dd99d6dd81ac1",{"version":"ec661892cf668936492eee432fb5229e37fe07ba3033bec9e5d97a9734c4de45","affectsGlobalScope":true},"ee7d8894904b465b072be0d2e4b45cf6b887cdba16a467645c4e200982ece7ea","f3d8c757e148ad968f0d98697987db363070abada5f503da3c06aefd9d4248c1","96d14f21b7652903852eef49379d04dbda28c16ed36468f8c9fa08f7c14c9538","54bc19b420a8ef23048f1cea931ab5d5562e69b9926b9436199749a7a55c865d","6d727c1f6a7122c04e4f7c164c5e6f460c21ada618856894cdaa6ac25e95f38c","fbca5ffaebf282ec3cdac47b0d1d4a138a8b0bb32105251a38acb235087d3318","22293bd6fa12747929f8dfca3ec1684a3fe08638aa18023dd286ab337e88a592","916be7d770b0ae0406be9486ac12eb9825f21514961dd050594c4b250617d5a8","254d9fb8c872d73d34594be8a200fd7311dbfa10a4116bfc465fba408052f2b3","6ab263df6465e2ed8f1d02922bae18bb5b407020767de021449a4c509859b22e","6805621d9f970cda51ab1516e051febe5f3ec0e45b371c7ad98ac2700d13d57c","5e379df3d61561c2ed7789b5995b9ba2143bbba21a905e2381e16efe7d1fa424","f07a137bbe2de7a122c37bfea00e761975fb264c49f18003d398d71b3fb35a5f","4ef960df4f672e93b479f88211ed8b5cfa8a598b97aafa3396cacdc3341e3504","d8f7109e14f20eb735225a62fd3f8366da1a8349e90331cdad57f4b04caf6c5a","5b5337f28573ffdbc95c3653c4a7961d0f02fdf4788888253bf74a3b5a05443e","9871b7ee672bc16c78833bdab3052615834b08375cb144e4d2cba74473f4a589","c863198dae89420f3c552b5a03da6ed6d0acfa3807a64772b895db624b0de707","8b03a5e327d7db67112ebbc93b4f744133eda2c1743dbb0a990c61a8007823ef","86c73f2ee1752bac8eeeece234fd05dfcf0637a4fbd8032e4f5f43102faa8eec","42fad1f540271e35ca37cecda12c4ce2eef27f0f5cf0f8dd761d723c744d3159","ff3743a5de32bee10906aff63d1de726f6a7fd6ee2da4b8229054dfa69de2c34","83acd370f7f84f203e71ebba33ba61b7f1291ca027d7f9a662c6307d74e4ac22","1445cec898f90bdd18b2949b9590b3c012f5b7e1804e6e329fb0fe053946d5ec","0e5318ec2275d8da858b541920d9306650ae6ac8012f0e872fe66eb50321a669","cf530297c3fb3a92ec9591dd4fa229d58b5981e45fe6702a0bd2bea53a5e59be","c1f6f7d08d42148ddfe164d36d7aba91f467dbcb3caa715966ff95f55048b3a4","f4e9bf9103191ef3b3612d3ec0044ca4044ca5be27711fe648ada06fad4bcc85","0c1ee27b8f6a00097c2d6d91a21ee4d096ab52c1e28350f6362542b55380059a","7677d5b0db9e020d3017720f853ba18f415219fb3a9597343b1b1012cfd699f7","bc1c6bc119c1784b1a2be6d9c47addec0d83ef0d52c8fbe1f14a51b4dfffc675","52cf2ce99c2a23de70225e252e9822a22b4e0adb82643ab0b710858810e00bf1","770625067bb27a20b9826255a8d47b6b5b0a2d3dfcbd21f89904c731f671ba77","d1ed6765f4d7906a05968fb5cd6d1db8afa14dbe512a4884e8ea5c0f5e142c80","799c0f1b07c092626cf1efd71d459997635911bb5f7fc1196efe449bba87e965","2a184e4462b9914a30b1b5c41cf80c6d3428f17b20d3afb711fff3f0644001fd","9eabde32a3aa5d80de34af2c2206cdc3ee094c6504a8d0c2d6d20c7c179503cc","397c8051b6cfcb48aa22656f0faca2553c5f56187262135162ee79d2b2f6c966","a8ead142e0c87dcd5dc130eba1f8eeed506b08952d905c47621dc2f583b1bff9","a02f10ea5f73130efca046429254a4e3c06b5475baecc8f7b99a0014731be8b3","c2576a4083232b0e2d9bd06875dd43d371dee2e090325a9eac0133fd5650c1cb","4c9a0564bb317349de6a24eb4efea8bb79898fa72ad63a1809165f5bd42970dd","f40ac11d8859092d20f953aae14ba967282c3bb056431a37fced1866ec7a2681","cc11e9e79d4746cc59e0e17473a59d6f104692fd0eeea1bdb2e206eabed83b03","b444a410d34fb5e98aa5ee2b381362044f4884652e8bc8a11c8fe14bbd85518e","c35808c1f5e16d2c571aa65067e3cb95afeff843b259ecfa2fc107a9519b5392","14d5dc055143e941c8743c6a21fa459f961cbc3deedf1bfe47b11587ca4b3ef5","a3ad4e1fc542751005267d50a6298e6765928c0c3a8dce1572f2ba6ca518661c","f237e7c97a3a89f4591afd49ecb3bd8d14f51a1c4adc8fcae3430febedff5eb6","3ffdfbec93b7aed71082af62b8c3e0cc71261cc68d796665faa1e91604fbae8f","662201f943ed45b1ad600d03a90dffe20841e725203ced8b708c91fcd7f9379a","c9ef74c64ed051ea5b958621e7fb853fe3b56e8787c1587aefc6ea988b3c7e79","2462ccfac5f3375794b861abaa81da380f1bbd9401de59ffa43119a0b644253d","34baf65cfee92f110d6653322e2120c2d368ee64b3c7981dff08ed105c4f19b0","85f8ebd7f245e8bf29da270e8b53dcdd17528826ffd27176c5fc7e426213ef5a","ee017d9a501b99cc39f303893847e2913a234dfb7482b787ec8327e2e50c06ee","15fe687c59d62741b4494d5e623d497d55eb38966ecf5bea7f36e48fc3fbe15e",{"version":"2c3b8be03577c98530ef9cb1a76e2c812636a871f367e9edf4c5f3ce702b77f8","affectsGlobalScope":true}],"root":[246,[248,250],[252,256],631,[1566,1578],[1879,1890],[1892,1903],[2123,2132],2232,[2385,2413],[2415,2417],[2673,2676],2678,2679,[2681,2687],[2692,2724],[3022,3026],[3029,3074]],"options":{"allowJs":true,"composite":false,"declaration":true,"declarationMap":true,"esModuleInterop":true,"inlineSources":false,"jsx":1,"module":99,"noUnusedLocals":false,"noUnusedParameters":false,"rootDir":"./","skipLibCheck":true,"strict":true,"target":99},"fileIdsList":[[244,245],[78],[114],[115,120,148],[116,127,128,135,145,156],[116,117,127,135],[118,157],[119,120,128,136],[120,145,153],[121,123,127,135],[114,122],[123,124],[127],[125,127],[114,127],[127,128,129,145,156],[127,128,129,142,145,148],[112,115,161],[123,127,130,135,145,156],[127,128,130,131,135,145,153,156],[130,132,145,153,156],[78,79,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163],[127,133],[134,156,161],[123,127,135,145],[136],[137],[114,138],[139,155,161],[140],[141],[127,142,143],[142,144,157,159],[115,127,145,146,147,148],[115,145,147],[145,146],[148],[149],[114,145],[127,151,152],[151,152],[120,135,145,153],[154],[135,155],[115,130,141,156],[120,157],[145,158],[134,159],[160],[115,120,127,129,138,145,156,159,161],[145,162],[71],[228,2684],[71,616,1226,1521,1575,1885,1886,1887,2387,2406,2677,2687,2692,2693,2695,2696],[244,247],[71,236],[71,237,1226,1521,2698],[71,237,249,630,760,1226,1572,1898,1900,1901,2123,2125,2130,2391,2691,2698,2700,2702,2708,2709,2710,2711,2718,2719,2720,2721,2722],[71,760,1226,1569,1572,1878,1898,1900,1901,2125,2698,2724,3022,3023],[71,237,1899,2698,3034,3036,3041,3044,3047],[71,630,760,1226,1572,1900,1901,2698,2724,3049,3050],[71,237,249,616,630,760,1226,1569,1895,1897,1900,2393,2395,2674,2691,2698,2700,2706,3025,3052,3053,3061,3062,3063,3064],[71,630,760,1226,1569,1900,2123,2128,2412,2415,2698,2720,3025,3066,3067],[252,253,254,255],[251],[252],[630],[1521,1565,1566],[760],[256,1226,1497],[156],[71,1875],[71,1576,1875,1885,1892,1895,2389,2691],[71,1576,1875,1885,1892,2389,2691,2694],[760,1226,1569,1570],[630,760,1574],[616,760,1226,1571,1574,1576,1884],[760,1571,1578,1883,1885],[71,630,1572,1573],[71,630,1572,1577],[71,222,256,760,1226,1521,1567,1568,1877,2683],[71,1890,2677,2704],[1889,1891],[616,1892],[1226,1890],[71,3026],[71,2701],[71,2677,2701],[71,2677,2691],[71,1875,1896],[71,2677],[71,156,236,2677],[71,156,1896,2677,2712,2713,2714,2715],[256,1875,1877,1879],[71,2677,2680],[616,1226],[71,250,2677],[252,256,1569],[252,1572],[71,760,1226,1569,1880,1881,1882],[71,630,631,1226,1569],[71,1569,2674,2677,2701,2705],[760,1226,2123],[71,236,237,249,1226,1521,1885,2385,2677,2678,2679,2681,2682],[71,256,1226,1566],[71,1226,1569,1875,1877],[71,630,1897,2128],[630,760,1572,1573],[630,760,1572,1577],[630,760],[71,236,249,1569,1879,1890,1895,2125,2677,2681,2701,2703,2706,2707],[71,2691,2703],[71,236,249,630,1226,2125,2126,2673,2677,2681,2716,2717,3021],[71,2691,2713,2714,3021],[71,1894,2125,2126,2677,2681],[71,2691],[2125],[71,630],[71,249,630,1894,2123,2707,2716,2717],[2231],[71,251,256,1226,1569,2232,2269,2384],[71,237],[71,237,2386],[630,760,1569,1573],[71,236,249,616,1226,1895,2707,3026,3028],[71,630,1890,2704,3057],[71,616,1878,1892,2677,3042],[71,616,760,1226,1577,1899,2405,3025,3029,3030,3031,3032,3033],[71,256,760,1226,1569,1573,3025,3031,3032,3033,3035],[71,1894,2390,2681,2703],[71,236,249,1894,2390,2681,2691,2705],[71,2393,2703],[71,249,1894,2399,2675,2707,2715,3037],[71,2681,2713],[71,616,760,1226,1572,1900,2128,2393,2394,2398,2675,3025,3031,3032,3033,3038,3040],[71,236,249,760,1226,1572,1878,2391,2395,2681,2705,3049],[71,760,1572,1894,1900,2128,2394,2395,2399,3054,3055],[71,1894,2393,2681,2703,3039],[630,760,2128],[760,1900,2128,2393,2394],[760,2128],[294,760,1226,1883,1900,2397],[760,1883,2397],[630,760,1226,1569,1572,1573,1900],[616,630,760,1226,1573],[630,760,1226,1569,1900,2231],[294,616,760,1226,1569,1572,1573],[616,760,1226,1577,1883],[760,1577,1883],[630,760,1573],[71,616,760,1226,1569,1573,1880,1899,2404,2405,2407,2408,3025,3029,3030,3031,3032,3033,3043],[71,236,249,616,630,760,1226,1573,1875,1893,1894,1895,1899,2128,2405,2406,2681,2704,3054,3055,3058],[71,1569,1894,2390,2674,2681,2702,2703],[71,249,2700],[71,2691,3031],[71,2691,2702],[71,236,249,2704],[71,2691,3054],[71,1893,2410],[71,760,1226,1573,1898,1899,2409,3025,3029,3031,3032,3033,3045,3046],[71,236,249,616,630,760,1226,1573,1875,1893,1894,1895,1899,2128,2409,2411,2681,2704,3054,3055,3058],[71,1875,2677],[71,2412,2414],[630,760,1573,1900,2393,2395],[71,1572,1875,1890,1900,2396,2400,2677,2681,2704],[71,249,1894,2400,2412,2707,2716,3021],[71,249,630,1894,2124,2707,2716],[71,1894,2393,2681,2703],[71,760,1572,1890,1894,1900,2128,2392,2401,3054,3055,3056,3059,3060],[71,249,256,630,1569,1894,2713,2715,2717],[71,630,1878],[630,760,1577,1883],[630,760,1226,1573],[71,236,249,630,1226,1894,2130,2403,2416,2417,2677,2721],[256,1878],[2672],[256],[616,1226,1566,1969,2108,2122],[616,630,2123],[630,2392,2393],[3075],[1227,1248,1250,1251],[1231,1232,1233,1234],[1233],[1250,1252],[1228,1229,1230,1236,1243,1244,1248,1249],[1245,1246,1247],[1229,1236],[164,1229,1235,1236,1237,1239,1241,1242],[1242],[1229,1235,1237,1241,1242],[1230],[1245],[164,1229,1238],[1229],[1241,1242],[1229,1240],[616,619,622,623,624],[617,618],[279,620],[279,618,620,621],[279],[620],[1913,1914],[616,1905,1907,1909,1911,1912,1918,1919,1920,1922,1923,1924,1925,1927,1929,1930],[616,1905,1932,1934,1937,1938,1939,1940],[616,656,1905,1942,1948,1949,1950,1951,1952,1953,1954,1955,1956,1957,1958,1959,1960,1961,1962,1963,1964],[616,1904,1905,1930,1931,1941,1969,2078],[616,1904,1905,1941,2078],[616,656,1904,1905,1928,1965,2097,2098],[616,1905],[616,1904],[2101],[1904,2101],[616,1904,1905,1906],[616,1904,1905,1906,1916],[616,1904,1905,1906,1908],[616,1904,1905,1906,1910],[616,1904,1905,1906,1917],[616,1904,1905,1921],[616,1904,1905,1908,1917],[616,1904,1905],[616,1904,1905,1906,1926],[616,1904,1905,1906,1928],[1905,2076],[616],[1905],[1905,1933],[616,1905,1936],[1905,1936],[616,1904,1928,1935],[616,656,1904,1905],[616,656,1904,1905,1947],[616,656,1904,1905,1928],[616,656,1904,1905,1943],[616,656,1904,1905,1946],[1931,1941,1965,2079,2080,2099,2100,2101,2102,2103,2104,2105,2106,2107],[1907,1908,1909,1910,1911,1912,1917,1918,1919,1920,1922,1923,1924,1925,1926,1927,1929,1966,1967,1968],[1932,1933,1934,1936,1937,1938,1939,1940,2077],[616,1915],[2081,2082],[616,1943],[1904,1905],[616,1904,1943,1944,1945],[1943],[1916,1928,1943,1944,1945,1946,1947,2082,2083,2084,2085,2086,2087,2088,2089,2090,2091,2093,2094,2095,2096],[2092],[616,1928,1946],[2093],[1904],[1942,1948,1949,1950,1951,1952,1953,1954,1955,1956,1957,1958,1959,1960,1961,1962,1963,1964],[164,2244],[164],[127,164],[115,164],[2240,2241,2242,2243,2244,2245,2246,2247,2248,2249,2250,2251,2252],[164,2242,2243],[164,2242,2244],[2070],[1579,1580,1581,1582,1583,1584,1585,1586,1587,1588,1589,1590,1591,1592,1593,1594,1595,1596,1597,1598,1599,1600,1601,1602,1603,1604,1605,1606,1607,1608,1609,1610,1611,1612,1613,1614,1615,1616,1617,1618,1619,1620,1621,1622,1623,1624,1625,1626,1627,1628,1629,1630,1631,1632,1633,1634,1635,1636,1637,1638,1639,1640,1641,1642,1643,1644,1645,1646,1647,1648,1649,1650,1651,1652,1653,1654,1655,1656,1657,1658,1659,1660,1661,1662,1663,1664,1665,1666,1667,1668,1669,1670,1671,1672,1673,1674,1675,1676,1677,1678,1679,1680,1681,1682,1683,1684,1685,1686,1687,1688,1689,1690,1691,1692,1693,1694,1695,1696,1697,1698,1699,1700,1701,1702,1703,1704,1705,1706,1707,1708,1709,1710,1711,1712,1713,1714,1715,1716,1717,1718,1719,1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1730,1731,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1813,1814,1815,1816,1817,1818,1819,1820,1821,1822,1823,1824,1825,1826,1827,1828,1829,1830,1831,1832,1833,1834,1835,1836,1837,1838,1839,1840,1841,1842,1843,1844,1845,1846,1847,1848,1849,1850,1851,1852,1853,1854,1855,1856,1857,1858,1859,1860,1861,1862,1863,1864,1865,1866,1867,1868,1869,1870,1871,1872,1873,1874],[2725,2726,2727,2728,2729,2730,2731,2732,2733,2734,2735,2736,2737,2738,2739,2740,2741,2742,2743,2744,2745,2746,2747,2748,2749,2750,2751,2752,2753,2754,2755,2756,2757,2758,2759,2760,2761,2762,2763,2764,2765,2766,2767,2768,2769,2770,2771,2772,2773,2774,2775,2776,2777,2778,2779,2780,2781,2782,2783,2784,2785,2786,2787,2788,2789,2790,2791,2792,2793,2794,2795,2796,2797,2798,2799,2800,2801,2802,2803,2804,2805,2806,2807,2808,2809,2810,2811,2812,2813,2814,2815,2816,2817,2818,2819,2820,2821,2822,2823,2824,2825,2826,2827,2828,2829,2830,2831,2832,2833,2834,2835,2836,2837,2838,2839,2840,2841,2842,2843,2844,2845,2846,2847,2848,2849,2850,2851,2852,2853,2854,2855,2856,2857,2858,2859,2860,2861,2862,2863,2864,2865,2866,2867,2868,2869,2870,2871,2872,2873,2874,2875,2876,2877,2878,2879,2880,2881,2882,2883,2884,2885,2886,2887,2888,2889,2890,2891,2892,2893,2894,2895,2896,2897,2898,2899,2900,2901,2902,2903,2904,2905,2906,2907,2908,2909,2910,2911,2912,2913,2914,2915,2916,2917,2918,2919,2920,2921,2922,2923,2924,2925,2926,2927,2928,2929,2930,2931,2932,2933,2934,2935,2936,2937,2938,2939,2940,2941,2942,2943,2944,2945,2946,2947,2948,2949,2950,2951,2952,2953,2954,2955,2956,2957,2958,2959,2960,2961,2962,2963,2964,2965,2966,2967,2968,2969,2970,2971,2972,2973,2974,2975,2976,2977,2978,2979,2980,2981,2982,2983,2984,2985,2986,2987,2988,2989,2990,2991,2992,2993,2994,2995,2996,2997,2998,2999,3000,3001,3002,3003,3004,3005,3006,3007,3008,3009,3010,3011,3012,3013,3014,3015,3016,3017,3018,3019,3020],[1255,1263,1264],[1266],[1265,1266,1267,1268,1269,1270],[145,164,1268],[145,164,1263,1265,1266],[1264,1268],[145,164,1255,1263,1265],[1263],[1272,1273,1274],[1272,1273,1274,1275,1276,1278,1279,1299,1300,1301,1302,1303,1304,1308,1309,1311,1312,1313,1314,1315,1316,1317,1318,1319],[1276,1277,1299,1302,1303,1304,1310],[1272,1273,1276,1277,1278,1279,1301,1302,1304,1308,1309,1310,1311,1312,1313,1314,1315,1320],[1272,1276,1277,1298,1302,1303,1304,1305,1306,1307,1308,1310],[1277,1302,1303,1305,1306,1307,1308,1309],[1273,1299,1300,1301],[1273,1279,1303,1311],[1279],[1271,1320,1322,1323,1331,1332,1336,1337],[1325,1328],[164,1320,1326,1327],[145,164,1265,1271],[1264,1277,1320,1323,1324,1326,1328,1329,1330,1331,1332,1334,1335],[1320],[1336],[1333],[1320,1324,1325,1328,1329,1330,1332,1336],[2254,2255,2256,2257],[164,2253],[2383],[251,2233],[2234],[251,2262],[2236,2237,2238,2263,2264,2265,2266,2267,2268],[2262],[2262,2281],[251,2262,2281],[2262,2312],[2322],[251,2262,2271],[2270,2271,2272,2273,2274,2275,2276,2278,2279,2280],[251,2259,2262,2271],[2277],[2276,2281,2300,2301,2302,2303,2304,2305,2306,2307,2308,2309,2310,2311,2312,2313,2314,2315,2316,2317,2318,2319,2320,2321,2322,2323,2324,2325,2326,2327],[318,402,616],[251,2260,2262,2369],[251,2258,2262],[2235,2260,2262,2269,2294,2296,2299,2328,2347,2367,2369,2370,2371,2382],[2239,2298],[2262,2297],[251,2262,2328,2369],[251,617,2262,2369],[2260,2262,2368,2369,2372,2373,2374,2378,2379,2381],[251,2262,2368],[251,2262,2369,2380],[251,2371],[251,2262,2297,2371,2375,2376,2377],[251,2262,2371,2375],[251,616,2262,2371],[2235,2239,2262],[127,164,251,2260,2262],[2366],[2239,2366],[2329,2330,2331,2332,2333,2334,2335,2336,2337,2338,2339,2340,2341,2342,2343,2344,2366],[2262,2332],[2262,2366],[2262,2347,2348,2349,2350,2351,2352,2353,2354,2355,2356,2357,2358,2359,2360,2361,2362,2363,2364,2365],[251,2231,2239,2258,2259,2260,2261],[2271,2282,2283,2284,2285,2286,2287,2288,2289,2290,2291,2292,2293,2383],[2295],[2239,2262],[2345,2346],[251,2239,2262],[251,2262,2345],[1518,1519],[71,635,637],[71,636],[71,1494],[71,1497],[71,635,1497,1499,1500,1501,1502],[71,1495],[616,1226,1493,1504],[635],[633,634],[636,638,1493,1496,1499,1500,1501,1503,1504,1505,1506,1507,1508,1509,1511,1513,1514,1515,1516,1517,1520],[1498],[1512],[1510],[1226,1493],[1226,1493,1506],[1493],[1198,1226,1493],[1226,1490,1491,1492],[1491,1492,1522,1523,1524,1525,1526,1527,1528,1529,1530,1531,1532,1533,1534,1535,1536,1537,1538,1539,1540,1541,1542,1543,1544,1545,1546,1547,1548,1549,1550,1551,1552,1553,1554,1555,1556,1557,1558,1559,1560,1561,1562,1563,1564],[1370],[127,164,1368,1369],[1357,1360],[1360],[1357,1360,1365,1366,1367],[1361,1362,1363,1364],[1352],[1353,1355,1356,1359],[1353,1356,1357,1358],[1354],[1358,1360],[1340,1342,1343,1344,1345,1346,1347,1348,1349,1350,1351],[1340,1342,1343,1344,1345,1346,1347,1348,1349,1350],[1340],[1340,1341],[734],[733,734,735],[733,734,735,736,737,738,739,740,741],[733,734],[71,742],[71,742,743,744,745,746,747,748,749,750,751,752,753,754,755,756,757,758,759],[742,743],[71,752],[742],[742,743,750],[742,743,745],[3075,3076,3077,3078,3079],[3075,3077],[3082],[3083,3085],[3088],[3084],[2121],[2109,2111,2112,2113,2114,2115,2116,2117,2118,2119,2120,2121],[2109,2110,2112,2113,2114,2115,2116,2117,2118,2119,2120,2121],[2110,2111,2112,2113,2114,2115,2116,2117,2118,2119,2120,2121],[2109,2110,2111,2113,2114,2115,2116,2117,2118,2119,2120,2121],[2109,2110,2111,2112,2114,2115,2116,2117,2118,2119,2120,2121],[2109,2110,2111,2112,2113,2115,2116,2117,2118,2119,2120,2121],[2109,2110,2111,2112,2113,2114,2116,2117,2118,2119,2120,2121],[2109,2110,2111,2112,2113,2114,2115,2117,2118,2119,2120,2121],[2109,2110,2111,2112,2113,2114,2115,2116,2118,2119,2120,2121],[2109,2110,2111,2112,2113,2114,2115,2116,2117,2119,2120,2121],[2109,2110,2111,2112,2113,2114,2115,2116,2117,2118,2120,2121],[2109,2110,2111,2112,2113,2114,2115,2116,2117,2118,2119,2121],[2109,2110,2111,2112,2113,2114,2115,2116,2117,2118,2119,2120],[145,164,3100],[67,68,69,70],[164,3102],[3106,3145],[3106,3130,3145],[3145],[3106],[3106,3131,3145],[3106,3107,3108,3109,3110,3111,3112,3113,3114,3115,3116,3117,3118,3119,3120,3121,3122,3123,3124,3125,3126,3127,3128,3129,3130,3131,3132,3133,3134,3135,3136,3137,3138,3139,3140,3141,3142,3143,3144],[3131,3145],[3147],[68],[632],[728,763,1253],[728,1254,1339,1372,1487,1488],[616,728,763,1338],[728,763,1368,1371],[616,728,763,1486],[616,649,650],[616,646,648,649,650,652,653],[649,650,652,653],[616,646,649,650,656,660],[616,646,649,650,652,656,657,658],[616,646,649,650,656],[616,649],[616,646,649,650,656,657],[646,649,650,656],[649],[616,646,649,650],[646,649],[616,646,649,650,652,653],[616,646,649,650,660,686],[616,649,650,656,657],[616,646,649,652,658],[616,646,649,650,657],[616,649,650,656],[616,649,650,684,685],[646,648,649,652],[616,646,649,650,652,657,658],[616,646,649,650,652,656,658],[616,649,652,653],[616,646,649,650,652,653,700],[649,663],[649,669],[649,670],[649,671],[649,672],[649,673],[649,682],[616,646,649,650,652,656,657,658,698],[616,645,646,647],[616,646,648],[616,648],[616,643,644,645,646,647,648],[646],[616,649,652],[649,652],[616,647,648,649,651,652,653,654,655,658,659,661,662,663,664,665,666,667,668,669,670,671,672,673,674,675,676,677,678,679,680,681,682,683,684,685,686,687,688,689,690,691,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716,717,718,719,720,721,722,723,724,725,726,727],[645,646,650,657,723,761,762],[768,770,771,772,773,774,775,776,777,778,779,780,781,782,783,784,785,786,787,788,789,790,1149,1150,1151,1152,1153,1154,1155,1156,1157,1158,1159,1160,1161,1162,1163,1164,1165,1166,1167,1168,1169],[616,646,649,650,651],[648,649,654,769],[649,655,769],[616,646,649,650,660,661],[646,649,650,659],[646,649,650,662],[616,646,649,650,660,664],[616,646,649,650,665],[646,649,650,666],[646,649,650,667],[646,649,650,668],[616,646,649,650,658],[616,646,649,650,674],[616,646,649,650,656,675],[616,646,649,650,676],[616,646,649,650,677],[616,646,649,650,656,678],[616,646,649,650,679],[646,649,650,680],[616,646,649,650,681],[616,646,649,650,683],[646,649,650,660,687],[616,646,649,650,657,688,1148],[646,649,650,689],[616,646,649,650,690],[616,646,649,650,657,691],[616,646,649,650,692],[616,646,649,650,686],[616,646,649,650,693],[616,646,649,650,685],[646,649,694,769],[646,649,695,742],[616,646,649,696,769],[616,646,649,697,742],[616,646,649,650,657,698],[646,649,699,769],[646,649,701,742],[646,742],[616,646,649,650,702],[616,646,649,650,703],[616,646,649,650,657,714],[616,646,649,650,657,715,742],[616,646,649],[1422,1423,1424,1425,1426,1427,1428,1429,1430,1431,1432,1433,1434],[1418],[1396,1418],[127,164,1396,1418],[1436,1437,1455,1456,1458,1459,1460,1461,1462,1463,1464],[127,164,1396,1418,1449,1454],[127,164,1396,1418,1457],[127,164,1418],[1421,1435,1465],[1441,1442],[127,164,1377,1390,1418,1419,1483],[1484,1485],[1418,1484],[1378],[1383],[127,164,1381],[1381,1382,1384],[1379],[1380],[1477],[127,164,1449],[1386,1387,1388,1389],[1386,1387],[1443],[1390,1439],[1439],[1438,1439,1440,1444,1445,1446,1447,1448],[1390],[1375,1376],[1375],[1373,1374],[1393,1394,1395],[1393],[1450,1451,1452,1453],[1450],[1390,1450],[1468,1469,1470,1471,1472,1473,1474],[1396,1418,1466],[1420,1467,1475],[1377,1379,1385,1396,1397,1398,1402,1403,1404,1406,1407,1408],[1390,1396,1397,1409],[1396],[1379,1396,1409],[1379,1390,1396,1409],[1397,1398,1399,1400,1401,1402,1403,1404,1405,1406,1407,1408,1409],[1396,1409],[127,164,1390,1396,1402,1405,1409],[1379,1396,1402],[1379,1390,1396,1399,1400,1401,1409],[1390,1396,1409],[1379,1390,1396,1402],[1410,1417],[127,164,1396,1407,1409,1411,1412,1414,1415],[127,164,1390,1402,1406,1411,1412,1413,1414,1416],[1411,1412,1413,1414,1415,1416],[1390,1402,1411,1412,1416],[1402,1405,1416],[1402,1405,1411,1416],[1481,1482],[1479,1480],[1377,1379,1418,1476,1478,1480],[1390,1418,1476,1479],[127,164,1390,1396,1418,1476,1481],[257,258],[258],[257,259,260,261,262,264,265,266,267,270,271,272,273,274,275,276,277,278],[260],[259,260,263],[259,260],[259,266],[259,263,265],[258,259,263],[258,259,264],[258,259,263,268,269],[258,259,261,263,268,269],[258,259],[258,259,263,268],[257,258,259,263,269],[257,258,259],[2420],[2418,2420],[2418],[2420,2483,2484],[2486],[2487],[2504],[2420,2421,2422,2423,2424,2425,2426,2427,2428,2429,2430,2431,2432,2433,2434,2435,2436,2437,2438,2439,2440,2441,2442,2443,2444,2445,2446,2447,2448,2449,2450,2451,2452,2453,2454,2455,2456,2457,2458,2459,2460,2461,2462,2463,2464,2465,2466,2467,2468,2469,2470,2471,2472,2473,2474,2475,2476,2477,2478,2479,2480,2481,2482,2485,2486,2487,2488,2489,2490,2491,2492,2493,2494,2495,2496,2497,2498,2499,2500,2501,2502,2503,2505,2506,2507,2508,2509,2510,2511,2512,2513,2514,2515,2516,2517,2518,2519,2520,2521,2522,2523,2524,2525,2526,2527,2528,2529,2530,2531,2532,2533,2534,2535,2536,2537,2538,2539,2540,2541,2542,2543,2544,2545,2546,2547,2548,2549,2550,2551,2552,2553,2554,2555,2556,2557,2558,2559,2560,2561,2562,2563,2564,2565,2566,2567,2568,2569,2570,2571,2572,2573,2574,2575,2576,2577,2578,2579,2581,2582,2583,2584,2585,2586,2587,2588,2589,2590,2591,2592,2593,2594,2595,2596,2597,2598,2599,2600,2605,2606,2607,2608,2609,2610,2611,2612,2613,2614,2615,2616,2617,2618,2619,2620,2621,2622,2623,2624,2625,2626,2627,2628,2629,2630,2631,2632,2633,2634,2635,2636,2637,2638,2639,2640,2641,2642,2643,2644,2645,2646,2647,2648,2649,2650,2651,2652,2653,2654,2655,2656,2657,2658,2659,2660,2661,2662,2663,2664,2665,2666,2667,2668,2669,2670,2671],[2580],[2420,2484,2604],[2418,2601,2602],[2603],[2601],[2418,2419],[1285,1286,1290,1291,1292,1293],[1280,1284,1285],[1280,1284,1286],[1287,1288,1289],[1285],[1284,1285],[1281],[1281,1282,1283],[2204,2205,2206],[2204],[2206,2207,2208,2209,2210],[2204,2205,2206,2207,2209],[2140,2204,2205],[2140],[2137,2138,2139],[2212,2213,2214,2215],[2140,2160,2182,2183,2192,2204,2211],[2140,2182,2183,2184,2192,2204,2211],[2182,2183,2184,2185],[2183,2192,2211],[2160,2182,2184,2192,2204,2211],[2141,2142,2143,2144,2145,2146,2147,2148,2149],[2148,2150,2204],[2133,2140,2150,2154,2168,2186,2192,2204,2211,2216,2223,2229],[2163,2164,2165,2166,2167],[2150],[2150,2204],[2230],[2140,2158,2159,2160,2161,2204],[2154,2160,2168,2169],[2160],[2158,2162,2174],[2160,2162,2204],[2150,2154],[2155,2157,2158,2159,2160,2161,2162,2169,2170,2171,2172,2173,2174,2175,2176,2177,2178,2179,2180,2181,2187,2188,2189,2190,2191],[2154,2157,2204],[2156,2160],[2158,2162,2171,2172,2204],[2158,2172],[2157,2158,2160,2162,2186],[2158,2162],[2158,2162,2171,2172,2174,2204],[135,164,2158,2172,2173],[2154,2158,2160,2162,2168,2169,2170,2204],[2158,2160,2162,2172],[2158,2172,2173],[2140,2150,2154,2155,2158,2159,2204],[2160,2168,2169,2170],[2140,2154,2155,2160,2168],[2154],[2151,2152,2153],[2150,2154,2204],[2135],[2156,2192],[2134,2135,2136,2156,2193,2194,2195,2196,2197,2198,2199,2200,2201,2202,2203],[2199],[2198,2200],[2150,2168,2192],[2150,2192,2204,2217,2223,2224],[2217,2224,2225,2226,2227,2228],[2204,2223],[2150,2192,2217,2225],[2218,2219,2220,2221,2222],[2219],[2218],[2073],[2071,2073,2074,2075],[1970,1979,1981,2071,2072],[1972,1973,1979,1980],[1981,2045,2046],[1972,1979,1981],[1973,1981],[1972,1974,1975,1976,1979,1981,1984,1985],[1975,1986,2000,2001],[1972,1979,1984,1985,1986],[1972,1974,1979,1981,1983,1984,1985],[1972,1973,1984,1985,1986],[1971,1987,1992,1999,2002,2003,2044,2047,2069],[1972],[1973,1977,1978],[1973,1977,1978,1979,1980,1982,1993,1994,1995,1996,1997,1998],[1973,1978,1979],[1973],[1972,1973,1978,1979,1981,1994],[1979],[1973,1979,1980],[1977,1979],[1986,2000],[1972,1974,1975,1976,1979,1984],[1972,1979,1982,1985],[1975,1983,1984,1985,1988,1989,1990,1991],[1985],[1972,1974,1979,1981,1983,1985],[1981,1984],[1981],[1972,1979,1985],[1973,1979,1984,1995],[1984,2048],[1981,1985],[1979,1984],[1984],[1972,1982],[1972,1979],[1979,1984,1985],[2004,2048,2049,2050,2051,2052,2053,2054,2055,2056,2057,2058,2059,2060,2061,2062,2063,2064,2065,2066,2067,2068],[1984,1985],[1974,1979],[1972,1979,1983,1984,1985,1997],[1972,1974,1979,1985],[1972,1974,1979],[2005,2006,2007,2008,2009,2010,2011,2012,2013,2014,2015,2016,2017,2018,2019,2020,2021,2022,2023,2024,2025,2026,2027,2028,2029,2030,2031,2032,2033,2034,2035,2036,2037,2038,2039,2040,2041,2042,2043],[1997,2005],[2005],[1972,1979,1981,1984,2004,2005],[1972,1979,1981,1983,1984,1985,1997,2004],[1257],[1257,1258,1259,1260,1261,1262],[1255],[639,640,641,642],[639,640],[639],[76],[221],[223],[169,172,210],[174],[167,181],[167],[167,181,182],[71,170],[71,156,164],[71,181,216],[71,181],[214,218],[71,215,220],[168],[71,211,220],[71,220],[130,164,173,220],[130,164,172,174],[130,145,164,173,174,179,210],[130,141,156,164,168,169,170,172,173,174,177,179,180,181,184,191,192,194,196,197,198,199,201,203,210],[130,145,164],[167,169,170,171,210,220],[172],[141,156,164,169,172,173,174,177,180,190,195,197,200,204,206,207],[130,156,164,172,179,203],[165,210,220],[130,141,156,164,169,172,173,175,177,179,180,183,184,190,191,192,194,195,196,199,200,203,204,205,220],[130,164,179,206,208],[71,130,141,164,168,170,174,179,184,196,197,198,210],[130,141,156,164,173,178],[202],[164,184],[141,164,168,169,173,177,179],[130,164,184,193],[130,164,173,194],[190],[187],[172,185,186,190],[172,185,186],[172,178,187,188,189],[71,165,196,198,210,220],[71,141,156,164,168,213,215,217,220],[173,177,181],[141,164],[176],[71,130,141,164,168,210,211,212,218,219],[66,71,72,73,74,210,2680],[225],[227],[229],[231],[233],[75,77,210,222,224,226,228,230,232,234,236,237,239,242,243],[235],[215],[238],[114,187,188,189,190,240,241],[71,75,130,141,164,166,168,174,209,220,2680],[130,164],[127,161,1391,1392],[71,1876],[2688,2689,2690],[71,2688],[71,1321],[71,75,210],[1295,1296,1297],[1280,1294,1295,1296],[1280,1295,1297],[1280],[89,93,156],[89,145,156],[84],[86,89,153,156],[135,153],[84,164],[86,89,135,156],[81,82,85,88,115,127,145,156],[81,87],[85,89,115,148,156,164],[105,115,164],[83,84,164],[89],[83,84,85,86,87,88,89,90,91,93,94,95,96,97,98,99,100,101,102,103,104,106,107,108,109,110,111],[89,96,97],[87,89,97,98],[88],[81,84,89],[89,93,97,98],[93],[87,89,92,156],[81,86,87,89,93,96],[115,145],[84,89,105,115,161,164],[329],[321,329,354],[320,329,354,520,968],[317,319,330,379,380,509,510,513,519,520,955,956,957,958,959,960,961,962,963,964,965,966,967,968,969,970,971],[329,520,969],[321,329,354,380,510,513,519,520,966,967],[317,329,371,375,520],[317,318,320,321,327,328,358,378,519],[317,329,520],[317,321,329,354,967],[317,321,329,356,410],[321,329,379,481,509],[321,327,329,356,358,378,379],[317,321,328,329,379,486,509],[317,318,329,336,351,354,402,417,420,421,429,432,434,518],[318,329,336,402,436,439,440,518],[317,318,329,336,354,402,421,432,434,518],[317,318,336,354,402,417,420,421,429,432,434,518],[317,318,325,329,336,402,434,449,452,462,478,479,496,518,520],[386,387,388,391,395,396,398,399,400,401,425,434,435,440,441,442,443,445,449,450,451,452,453,454,456,457,458,461,462,464,466,467,468,470,471,472,474,475,477,478,479,480,483,484,487,492,493,495,496,497,498,503,504,505,506,507,508,511,512,514,515,516,522,523,524,525,526,527,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,548,549,550,551,552,553],[317,318,321,329,330,332,336,339,342,345,354,384,385,402,415,417,419,420,421,422,424,518,520],[329,336,345,402,444,518],[317,325,329,332,336,345,354,402,444,448,518],[317,318,325,329,332,336,345,354,402,444,448,518],[317,318,325,330,336,391,402,420,433,518,520],[323,329,332,336,338,398,399,400,402,518],[317,318,330,332,336,339,345,354,384,385,390,402,518,520],[320,329,332,336,338,345,353,395,398,399,402,518],[317,329,332,336,345,354,402,518],[329,336,345,402,518,520],[318,321,329,332,336,345,354,392,394,402,518,520],[329,336,345,402,455,518],[321,329,332,336,345,353,354,402,518],[329,336,345,353,402,518,520],[317,321,329,332,336,345,354,402,518],[317,321,325,326,329,332,336,402,416,461,518],[317,318,321,329,336,434,463,518],[323,332,336,345,354,402,465,518],[317,321,326,329,332,336,345,402,444,459,460,518],[317,326,329,332,336,345,402,444,459,460,518],[317,321,325,326,329,332,336,345,354,402,448,459,460,518],[317,321,329,332,333,336,345,354,402,469,518],[318,321,329,332,336,345,354,393,402,518],[321,329,336,402,456,472,473,518],[317,329,332,336,345,353,354,402,518,520],[321,329,336,345,357,402,473,518,616],[317,325,329,336,402,417,420,421,425,433,434,476,518],[317,318,325,336,402,417,420,425,433,518],[317,318,320,321,325,329,330,336,402,417,420,425,433,478,518],[317,318,321,329,336,349,354,402,419,425,482,518],[317,318,321,329,336,402,481,483,518],[317,321,328,329,336,402,483,486,518],[321,327,329,336,343,395,402,472,475,488,492,518],[329,336,402,456,490,491,518],[329,332,336,395,402,490,491,494,518],[317,325,326,329,332,336,402,488,490,494,518],[321,329,336,402,488,490,494,518],[318,321,329,336,402,481,483,500,518],[320,321,329,336,345,402,547],[320,329,336,345,402,547],[317,320,329,334,336,345,402,547],[317,320,329,336,345,402,547],[320,329,334,336,345,402,547],[320,321,329,336,345,384,402,547],[317,320,321,329,336,345,402,547],[329,336,345,354,402,518,520],[317,318,321,325,329,336,388,402,518,520],[317,329,336,345,402,410,518,520],[329,335,336,345,402,518,520],[317,318,320,324,327,330,336,358,384,385,391,395,396,397,401,402,518,520],[317,329,336,345,402,518,520],[318,329,335,336,345,402,518,520],[321,327,329,336,345,402,518],[318,320,321,324,329,330,336,345,380,381,382,384,385,386,387,398,402,518,520],[320,321,329,330,336,345,354,402,510,518,520],[318,320,324,327,329,330,336,345,354,380,381,384,385,386,402,518,520],[317,320,321,328,329,330,336,345,349,397,402,485,494,513,518,520],[317,318,320,321,325,329,336,384,388,402,420,518,520],[321,616,839],[317,318,321,323,327,332,334],[317,616,1148],[317,616,840,1148],[317,616,983,996,1148],[318,402,791,792,793,794,795,796,797,798,799,800,801,802,803,804,805,806,807,808,809,810,811,812,813,814,815,816,817,818,819,820,821,822,823,824,825,826,827,828,829,830,831,832,833,834,835,836,837,838,839,841,842,843,844,845,846,847,848,849,850,851,852,853,854,855,856,857,858,859,860,861,862,863,864,865,866,867,868,869,870,871,872,873,874,875,876,877,878,879,880,881,882,883,884,885,886,887,888,889,890,891,892,893,894,895,896,897,898,899,900,901,902,903,904,905,906,907,908,909,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,930,931,932,933,934,941,984,985,986,997,998,999,1000,1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1011,1012,1013,1014,1015,1016,1017,1018,1019,1020,1021,1022,1023,1024,1025,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,1037,1038,1039,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,1104,1105,1106,1107,1108,1109,1110,1111,1112,1113,1114,1115,1116,1117,1118,1119,1120,1121,1122,1123,1124,1125,1126,1127,1128,1129,1130,1131,1132,1133,1134,1135,1136,1137,1138,1139,1140,1141,1142,1143,1144,1145,1146,1147],[317,318,320,329,330,335,336,402,427,502,517,520],[317,318,320,329,335,336,402,502,518],[317,318,320,329,335,336,402,518,520,546],[317,318,320,329,335,336,402,517,518,520],[317,320,323,325,332,336,386,387,391,395,396,398,399,400,401,402,425,434,435,440,441,442,443,444,445,449,450,451,452,453,454,456,457,458,461,462,464,466,467,468,470,471,472,474,475,477,479,480,484,487,492,493,495,496,497,498,501,518],[320,334,336,402,518,522,523,524,525,526,527,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,547,548],[317,325,336,386,387,388,398,402,478,503,504,505,506,507,508,511,512,514,515,516,518,520],[329,335,402,518],[329,336],[329,336,402],[329,336,555,557],[321,329,334,336,344,555,561],[429,431,432,435,439,440,441,442,443,3027],[317,321,337],[337],[321,337],[337,402],[317,321,337,402,414,425],[317,337],[337,391,402,520],[318,337],[337,339],[321,327,332,337,388,402,520],[317],[317,318,320,321,322,323,324,325,326,327,328,331,332,334,335,336,337,338,339,340,341,343,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,367,368,369,370,371,372,373,375,376,377,378,381,384,385,386,387,388,391,392,393,394,395,396,398,399,400,401,402,403,404,409,410,411,412,414,415,416,417,418,419,420,421,423,425,427,429,431,433,434,435,436,437,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,456,457,458,459,460,461,462,464,466,467,468,470,471,472,473,474,475,476,477,478,479,480,481,483,484,485,486,487,489,490,492,493,494,495,496,497,498,502,503,504,505,506,507,508,509,511,512,514,515,516,517,518,519,520,521,522,523,524,525,526,527,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,546,547,548,549,550,551,552,553,554,555,556,558,559,560,562,563,564,565,566,567,568,569,570,571,572,573,574,575,576,577,578,579,580,581,582,583,584,585,586,587,588,589,590,591,592,593,594,595,596,597,598,599,600,601,602,603,604,605,606,607,608,609,610,611,612,613,614,615],[321,327,329,378,1145],[321,332,334,1145],[318,321,323,327,334],[317,318,319,520],[317,321,327,331],[317,318,320,323,327,336,378,394,398,401,518],[317,318,321,327],[317,318,321,332,334],[321],[318],[317,318,321,325,332,335],[317,318,321,327,520],[317,321,325],[317,318,325],[317,321],[317,318,321,323,326,327,332,333],[317,318,321],[317,318,321,322,323,324,326],[318,336,489],[317,318],[317,321,329,350,351,352,354,366,403,404,410,411],[317,321,325,329,403,412],[317,318,321,325,329,403,409,412,413],[317,318,321,325,329,403,412,413,447],[317,318,321,325,329,403,404,409,412,413],[317,318,321,325,329,403,412,416],[317,321,329,348,350,354,369,371,375,403,404],[317,318,321,325,329,369,403,418],[317,318,321,325,329,369,409,413,416,418],[317,318,321,325,329,352,356,403,413,416,418,446,447],[317,318,321,325,329,369,403,409,413,416,418],[317,318,321,325,329,403,416,418],[317,321,329,348,354,369,371,375,403],[317,325,329,403],[317,318,321,325,329,349,375,403,409],[317,325,326,329,334,459],[317,318,321,325,329,369,403,409,413,416],[317,329,352,356,375],[317,321,329,348,352,356,369,370,404,410,575],[317,329,374],[317,329,371],[321,324,329,352,354],[321,329,362],[321,329,354,361],[321,329,352,354,366],[321,322,329,362],[321,329,350,352,354,364,366],[318,321,322,324,329,359,360,367],[329,335,340,341,342,343,344],[317,321,329,336,340,402,425,426,518],[329,372,402],[318,402],[329,402],[372,402],[321,329,365],[321,329],[321,329,349,352],[321,329,347],[321,329,349],[321,329,347,349,350],[321,329,351,353,354],[321,329,346,350,351,352],[321,329,337,346,352,354,366,370],[321,329,348,349,353,354],[321,329,346,348,353],[329,336,402,436,438,518],[317,329,336,402,434,436,437,518],[329,352,354,356,428],[329,352,354,356,369,428],[321,329,352,430,431],[329,389,402,415,425],[317,329,415],[329,355,389,391,402,520],[318,337,373,388],[329,357,388,389,402,520],[318,321,329,332,334,383,393,402],[323,329,334],[318,329],[318,326,329,334],[318,329,333,334],[317,318,321,327,329,332,334,383,402],[318,327,329,334,383,402],[317,318,321,327,329,334,383,402,616],[329,352,356],[321,329,349,350],[321,329,349,352,354],[408],[329,408],[407],[317,329,404,408],[317,329,406],[317,329,405,407],[324,329],[329,596],[317,318,518],[329,334,340,556],[329,334,342],[344],[321,329,352,354],[321,329,356],[317,321,328,329,354,356,418,485],[321,329,404],[317,318,321,329,412,591],[317,321,329],[317,321,329,481,581],[321,329,349,353],[317,321,327,329,356,378,509,581],[317,321,328,329,486,581],[321,329,353],[321,329,353,354],[321,329,354,369],[317,321,329,410,582,588],[317,321,328,329,410,585,588],[317,318,499],[334,339,347,354,371,423],[318,329,330,357,371,373,388,402],[327,329,337,364,371,372,373,375],[318,327,329,353,357,404,616],[318,327,329,357,616],[318,321,327,329,348,349,353,357,370,371,375,376,577,604],[321,327,329,357,370,371,375],[318,321,327,329,354,357,358,359,360,363,368,369,370,376,377],[317,321,328,329,350,354,375,486],[601],[329,612],[317,321,325,329,336,504,518,520,934,935,938,939],[320,336,388,518,930,934,943],[320,336,388,518,934,943],[317,320,336,402,518,943],[320,336,402,518,941,943],[320,336,402,518,935,943],[317,320,332,336,337,397,402,518],[320,336,402,518,943],[320,321,336,402,518,943],[320,332,336,337,397,402,518,972,973],[320,321,336,402,518,942,943],[320,336,402,518,932,941,943],[320,321,336,402,518,932,943],[336,388,518,520,934],[318,320,336,402,512,518,520,932,934],[317,318,616,983,996],[984,985,986],[317,320,336,388,517,518,934,940,980,982],[320,336,518,949,950,974,1148],[320,336,518,934,944,945,946,947,948,951,952,953,954,975,976,977,978,979,991,992],[930,931,932,933,934,939,940,941,943,944,945,946,947,948,949,950,951,952,953,954,974,975,976,977,978,979,980,981,982,983,987,988,989,990,993,994,995],[616,932],[317,321,332,334,932],[402,932,933],[317,321,930,932,941,942],[317,321,932],[317,321,326,334],[317,318,321,323,327,334,930,931,933],[317,321,325,329,419,420,935,937],[321,329,352,361,936],[317,321,420],[321,420],[295,296],[296],[295,297,298,299,300,302,303,304,305,308,309,310,311,312,313,314,315,316],[298],[297,298,301],[297,298],[297,304],[297,301,303],[296,297,301],[296,297,302],[296,297,301,306,307],[296,297,299,301,306,307],[296,297],[296,297,301,306],[295,296,297,301,307],[295,296,297],[71,728,729],[728],[731],[1148],[1489],[728,729,730,731,732,766,767,1171,1172,1173,1174,1175,1176,1177,1178,1179,1180,1181,1182,1183,1184,1185,1186,1187,1188,1189,1190,1191,1192,1193,1194,1195,1196,1197,1199,1200,1201,1202,1203,1204,1205,1206,1207,1208,1209,1210,1211,1212,1213,1214,1215,1216,1217,1218,1219,1220,1221,1222,1223,1224,1225],[1170],[728,765],[728,763,765],[728,763,764,765,1170],[616,728,763,764,765,1170,1172],[728,763,764,765,1170,1174],[616,728,763,764,765,1170],[728,764,765,1170],[616,728,764,765,1170,1198],[616,728,764,765,1170],[616,728,763,765],[71,728],[728,760,763,764],[760,763],[279,280,281,282,283,284,285],[279,280],[279,280,281,282,283,284,285,286,287,288],[282],[279,280,281,282,283,284,285,286,287,288,289,290,291,292,293],[279,280,281,282,284,288],[280,281,282,283,284],[280,281,282],[279,280,281,282,283],[279,280,281,282,284],[281,282],[280,281,282,284],[281,286,287,291,292,293,294,616,625,626,627,628,629],[71,222],[244],[71,630,760,2393],[71,760,2412],[618],[1226],[760,1570],[71,1896],[71,156],[71,156,1896],[71,2680],[760,2123],[71,2125],[71,630,2125],[71,630,2123],[2232],[71,2393],[71,2675],[760,2393],[294,760],[2412],[630,760,2393],[71,2412],[616,630],[630,2393],[279,329,520],[279,321,329,356,410],[279,318,325,330,336,391,402,420,433,518,520],[279,320,329,334,336,345,402,547],[279,320,329,336,345,402,547],[279,320,321,329,336,345,402,547],[279,318,321,325,329,336,388,402,518,520],[279,329,336,345,402,410,518,520],[279,329,336,345,402,518,520],[279,321,325],[279,318,325],[279,321,325,329,403,412],[279,318,321,325,329,403,409,412,413],[279,321,329,348,354,369,371,375,403],[279,329,371],[279,329,404,408],[279,329,406],[279,329,405,407]],"referencedMap":[[246,1],[78,2],[79,2],[114,3],[115,4],[116,5],[117,6],[118,7],[119,8],[120,9],[121,10],[122,11],[123,12],[124,12],[126,13],[125,14],[127,15],[128,16],[129,17],[113,18],[130,19],[131,20],[132,21],[164,22],[133,23],[134,24],[135,25],[136,26],[137,27],[138,28],[139,29],[140,30],[141,31],[142,32],[143,32],[144,33],[145,34],[147,35],[146,36],[148,37],[149,38],[150,39],[151,40],[152,41],[153,42],[154,43],[155,44],[156,45],[157,46],[158,47],[159,48],[160,49],[161,50],[162,51],[2676,52],[2685,53],[2697,54],[248,55],[2686,56],[2699,57],[2723,58],[3024,59],[3048,60],[3051,61],[3065,62],[3068,63],[256,64],[252,65],[253,66],[254,66],[255,66],[631,67],[1567,68],[1568,69],[1566,70],[249,71],[2687,72],[2692,73],[2693,73],[2695,74],[2696,72],[1571,75],[1575,76],[1576,76],[1885,77],[1886,78],[1887,78],[1574,79],[1578,80],[2684,81],[2705,82],[2700,56],[3025,52],[1892,83],[1893,84],[1894,84],[1895,85],[3026,52],[3042,86],[2724,87],[2702,88],[2698,89],[3069,52],[2712,90],[2703,52],[2679,52],[2713,91],[2714,91],[2715,92],[2716,93],[1880,94],[1881,94],[1882,94],[2681,95],[1898,96],[2704,97],[1572,98],[1899,99],[1883,100],[1900,79],[1573,101],[1901,79],[1902,80],[1577,101],[1903,80],[2706,102],[2124,103],[2683,104],[1569,105],[2682,106],[2129,107],[2130,108],[2131,109],[2132,110],[2708,111],[2709,112],[3022,113],[3023,114],[2710,115],[2711,116],[2126,117],[2127,67],[3074,118],[2718,119],[2719,116],[2232,120],[2385,121],[2386,122],[2387,123],[1884,124],[2388,124],[2389,124],[3029,125],[3058,126],[3043,127],[3034,128],[3036,129],[3035,130],[3049,131],[3039,132],[3038,133],[3037,134],[3041,135],[3050,136],[3056,137],[3040,138],[2391,139],[2395,140],[2396,141],[2398,142],[2399,143],[2128,79],[2397,80],[2400,144],[2401,145],[2402,146],[2403,147],[2404,148],[2405,149],[2406,150],[2407,149],[2408,149],[3044,151],[3059,152],[3030,153],[3031,154],[3032,155],[3033,156],[3054,157],[3055,158],[3045,159],[2409,149],[2410,149],[2411,150],[3047,160],[3060,161],[3046,153],[2720,162],[2415,163],[2413,164],[3052,112],[2707,165],[3066,166],[3067,114],[3057,167],[3053,168],[3061,169],[3062,116],[3063,116],[3064,170],[2717,171],[2416,172],[2417,173],[2722,174],[2721,116],[2674,175],[1879,175],[2673,176],[1570,177],[2123,178],[2125,67],[2675,179],[2394,180],[2392,67],[3077,181],[1252,182],[1235,183],[1234,184],[1253,185],[1250,186],[1248,187],[1249,188],[1243,189],[1244,190],[1251,191],[1237,192],[1246,193],[1239,194],[1245,195],[1247,196],[1241,197],[1242,197],[625,198],[619,199],[621,200],[622,201],[623,202],[624,203],[1915,204],[1931,205],[1941,206],[1965,207],[2079,208],[2080,209],[2099,210],[2100,211],[1905,212],[2102,213],[2103,213],[2104,214],[2105,213],[2106,213],[2107,213],[1908,215],[1910,215],[1917,216],[1926,215],[1907,215],[1909,217],[1911,218],[1912,215],[1918,219],[1919,215],[1920,215],[1922,220],[1923,215],[1924,221],[1925,215],[1966,222],[1927,223],[1929,224],[1930,215],[1967,215],[1968,215],[2077,225],[1933,226],[1935,226],[1932,227],[1934,228],[1937,229],[1938,222],[1939,211],[1940,230],[1936,231],[1942,232],[1948,233],[1949,234],[1950,232],[1951,233],[1952,232],[1953,235],[1954,232],[1955,234],[1956,232],[1957,234],[1958,232],[1959,236],[1960,232],[1961,232],[1962,232],[1963,232],[1964,234],[2108,237],[1969,238],[2078,239],[1904,211],[1916,240],[2083,241],[1943,212],[2084,226],[2085,242],[1944,226],[2086,226],[1945,226],[1906,243],[1946,244],[2096,245],[2089,226],[2097,246],[2090,226],[2093,247],[1921,211],[1947,248],[2094,249],[2095,250],[2098,251],[2245,252],[2242,253],[2249,254],[2243,252],[2240,255],[2253,256],[2247,253],[2244,257],[2246,258],[2071,259],[1579,52],[1580,52],[1581,52],[1582,52],[1584,52],[1583,52],[1585,52],[1591,52],[1586,52],[1588,52],[1587,52],[1589,52],[1590,52],[1592,52],[1593,52],[1596,52],[1594,52],[1595,52],[1597,52],[1598,52],[1599,52],[1600,52],[1602,52],[1601,52],[1603,52],[1604,52],[1607,52],[1605,52],[1606,52],[1608,52],[1609,52],[1610,52],[1611,52],[1626,52],[1627,52],[1628,52],[1629,52],[1612,52],[1613,52],[1614,52],[1615,52],[1621,52],[1616,52],[1618,52],[1617,52],[1619,52],[1620,52],[1622,52],[1623,52],[1624,52],[1625,52],[1630,52],[1631,52],[1632,52],[1633,52],[1634,52],[1635,52],[1636,52],[1637,52],[1638,52],[1639,52],[1640,52],[1641,52],[1642,52],[1643,52],[1644,52],[1645,52],[1646,52],[1649,52],[1647,52],[1648,52],[1651,52],[1650,52],[1655,52],[1653,52],[1654,52],[1652,52],[1656,52],[1657,52],[1658,52],[1659,52],[1660,52],[1661,52],[1662,52],[1663,52],[1664,52],[1665,52],[1666,52],[1668,52],[1667,52],[1669,52],[1671,52],[1670,52],[1672,52],[1674,52],[1673,52],[1675,52],[1676,52],[1677,52],[1678,52],[1679,52],[1680,52],[1681,52],[1682,52],[1683,52],[1684,52],[1685,52],[1686,52],[1687,52],[1688,52],[1689,52],[1690,52],[1692,52],[1691,52],[1693,52],[1694,52],[1695,52],[1696,52],[1697,52],[1699,52],[1698,52],[1700,52],[1701,52],[1702,52],[1703,52],[1704,52],[1705,52],[1706,52],[1708,52],[1707,52],[1709,52],[1710,52],[1711,52],[1712,52],[1713,52],[1714,52],[1715,52],[1716,52],[1717,52],[1718,52],[1719,52],[1720,52],[1721,52],[1722,52],[1723,52],[1728,52],[1724,52],[1725,52],[1726,52],[1727,52],[1729,52],[1730,52],[1731,52],[1733,52],[1732,52],[1734,52],[1735,52],[1736,52],[1738,52],[1737,52],[1739,52],[1740,52],[1741,52],[1742,52],[1743,52],[1744,52],[1745,52],[1749,52],[1746,52],[1747,52],[1748,52],[1750,52],[1751,52],[1752,52],[1754,52],[1753,52],[1755,52],[1756,52],[1757,52],[1758,52],[1759,52],[1760,52],[1761,52],[1762,52],[1763,52],[1765,52],[1764,52],[1766,52],[1767,52],[1769,52],[1768,52],[1875,260],[1770,52],[1771,52],[1772,52],[1773,52],[1774,52],[1775,52],[1776,52],[1777,52],[1778,52],[1779,52],[1782,52],[1780,52],[1781,52],[1784,52],[1783,52],[1785,52],[1786,52],[1787,52],[1789,52],[1788,52],[1790,52],[1791,52],[1792,52],[1793,52],[1794,52],[1795,52],[1796,52],[1797,52],[1798,52],[1800,52],[1799,52],[1801,52],[1802,52],[1804,52],[1803,52],[1805,52],[1806,52],[1808,52],[1807,52],[1809,52],[1811,52],[1810,52],[1812,52],[1813,52],[1814,52],[1815,52],[1816,52],[1817,52],[1818,52],[1819,52],[1820,52],[1821,52],[1822,52],[1823,52],[1824,52],[1825,52],[1826,52],[1827,52],[1828,52],[1830,52],[1829,52],[1831,52],[1832,52],[1833,52],[1834,52],[1835,52],[1837,52],[1836,52],[1838,52],[1839,52],[1840,52],[1841,52],[1842,52],[1843,52],[1844,52],[1845,52],[1846,52],[1847,52],[1848,52],[1849,52],[1850,52],[1851,52],[1852,52],[1853,52],[1854,52],[1855,52],[1856,52],[1857,52],[1858,52],[1861,52],[1859,52],[1860,52],[1862,52],[1863,52],[1865,52],[1864,52],[1866,52],[1867,52],[1868,52],[1869,52],[1870,52],[1872,52],[1871,52],[1873,52],[1874,52],[2725,52],[2726,52],[2727,52],[2728,52],[2730,52],[2729,52],[2731,52],[2737,52],[2732,52],[2734,52],[2733,52],[2735,52],[2736,52],[2738,52],[2739,52],[2742,52],[2740,52],[2741,52],[2743,52],[2744,52],[2745,52],[2746,52],[2748,52],[2747,52],[2749,52],[2750,52],[2753,52],[2751,52],[2752,52],[2754,52],[2755,52],[2756,52],[2757,52],[2772,52],[2773,52],[2774,52],[2775,52],[2758,52],[2759,52],[2760,52],[2761,52],[2767,52],[2762,52],[2764,52],[2763,52],[2765,52],[2766,52],[2768,52],[2769,52],[2770,52],[2771,52],[2776,52],[2777,52],[2778,52],[2779,52],[2780,52],[2781,52],[2782,52],[2783,52],[2784,52],[2785,52],[2786,52],[2787,52],[2788,52],[2789,52],[2790,52],[2791,52],[2792,52],[2795,52],[2793,52],[2794,52],[2797,52],[2796,52],[2801,52],[2799,52],[2800,52],[2798,52],[2802,52],[2803,52],[2804,52],[2805,52],[2806,52],[2807,52],[2808,52],[2809,52],[2810,52],[2811,52],[2812,52],[2814,52],[2813,52],[2815,52],[2817,52],[2816,52],[2818,52],[2820,52],[2819,52],[2821,52],[2822,52],[2823,52],[2824,52],[2825,52],[2826,52],[2827,52],[2828,52],[2829,52],[2830,52],[2831,52],[2832,52],[2833,52],[2834,52],[2835,52],[2836,52],[2838,52],[2837,52],[2839,52],[2840,52],[2841,52],[2842,52],[2843,52],[2845,52],[2844,52],[2846,52],[2847,52],[2848,52],[2849,52],[2850,52],[2851,52],[2852,52],[2854,52],[2853,52],[2855,52],[2856,52],[2857,52],[2858,52],[2859,52],[2860,52],[2861,52],[2862,52],[2863,52],[2864,52],[2865,52],[2866,52],[2867,52],[2868,52],[2869,52],[2874,52],[2870,52],[2871,52],[2872,52],[2873,52],[2875,52],[2876,52],[2877,52],[2879,52],[2878,52],[2880,52],[2881,52],[2882,52],[2884,52],[2883,52],[2885,52],[2886,52],[2887,52],[2888,52],[2889,52],[2890,52],[2891,52],[2895,52],[2892,52],[2893,52],[2894,52],[2896,52],[2897,52],[2898,52],[2900,52],[2899,52],[2901,52],[2902,52],[2903,52],[2904,52],[2905,52],[2906,52],[2907,52],[2908,52],[2909,52],[2911,52],[2910,52],[2912,52],[2913,52],[2915,52],[2914,52],[3021,261],[2916,52],[2917,52],[2918,52],[2919,52],[2920,52],[2921,52],[2922,52],[2923,52],[2924,52],[2925,52],[2928,52],[2926,52],[2927,52],[2930,52],[2929,52],[2931,52],[2932,52],[2933,52],[2935,52],[2934,52],[2936,52],[2937,52],[2938,52],[2939,52],[2940,52],[2941,52],[2942,52],[2943,52],[2944,52],[2946,52],[2945,52],[2947,52],[2948,52],[2950,52],[2949,52],[2951,52],[2952,52],[2954,52],[2953,52],[2955,52],[2957,52],[2956,52],[2958,52],[2959,52],[2960,52],[2961,52],[2962,52],[2963,52],[2964,52],[2965,52],[2966,52],[2967,52],[2968,52],[2969,52],[2970,52],[2971,52],[2972,52],[2973,52],[2974,52],[2976,52],[2975,52],[2977,52],[2978,52],[2979,52],[2980,52],[2981,52],[2983,52],[2982,52],[2984,52],[2985,52],[2986,52],[2987,52],[2988,52],[2989,52],[2990,52],[2991,52],[2992,52],[2993,52],[2994,52],[2995,52],[2996,52],[2997,52],[2998,52],[2999,52],[3000,52],[3001,52],[3002,52],[3003,52],[3004,52],[3007,52],[3005,52],[3006,52],[3008,52],[3009,52],[3011,52],[3010,52],[3012,52],[3013,52],[3014,52],[3015,52],[3016,52],[3018,52],[3017,52],[3019,52],[3020,52],[1265,262],[1267,263],[1271,264],[1269,265],[1268,266],[1270,267],[1266,268],[1264,269],[1255,254],[1275,270],[1320,271],[1305,272],[1316,273],[1309,274],[1310,275],[1302,276],[1314,277],[1315,278],[1338,279],[1329,280],[1328,281],[1323,282],[1336,283],[1330,284],[1331,285],[1325,284],[1334,286],[1333,287],[1332,284],[2258,288],[2254,289],[2255,253],[2257,289],[2384,290],[2234,291],[2235,292],[2265,65],[2236,65],[2237,65],[2266,293],[2269,294],[2238,65],[2263,293],[2267,293],[2264,293],[2268,293],[2315,295],[2314,295],[2305,296],[2301,293],[2300,297],[2304,295],[2309,296],[2310,296],[2327,65],[2312,293],[2318,293],[2313,293],[2323,298],[2324,293],[2322,293],[2325,299],[2321,293],[2273,300],[2279,295],[2275,300],[2281,301],[2276,302],[2274,293],[2272,297],[2278,303],[2280,295],[2306,296],[2328,304],[2307,296],[2326,295],[2320,295],[2317,295],[2316,295],[2302,297],[2319,293],[2303,296],[2311,296],[2277,295],[2233,305],[2370,306],[2308,307],[2383,308],[2299,309],[2298,310],[2372,311],[2374,293],[2373,312],[2382,313],[2369,314],[2381,315],[2377,316],[2378,317],[2376,318],[2379,318],[2375,319],[2371,320],[2368,321],[2260,293],[2351,322],[2355,323],[2338,295],[2336,295],[2340,295],[2363,322],[2352,322],[2357,322],[2334,295],[2332,293],[2342,293],[2367,324],[2333,325],[2361,322],[2350,323],[2358,322],[2359,322],[2365,322],[2364,326],[2353,322],[2356,322],[2339,295],[2337,295],[2341,293],[2354,323],[2343,293],[2366,327],[2344,293],[2330,293],[2349,326],[2360,322],[2331,293],[2348,322],[2335,295],[2262,328],[2259,65],[2261,295],[2293,293],[2283,297],[2291,293],[2290,293],[2287,65],[2284,65],[2292,65],[2285,65],[2286,295],[2288,293],[2294,329],[2282,297],[2289,293],[2296,330],[2295,295],[2346,331],[2347,332],[2345,333],[2380,334],[1520,335],[638,336],[637,337],[1518,52],[1519,338],[1500,52],[636,52],[1501,52],[1509,52],[1502,52],[1504,339],[1503,340],[1496,341],[1495,338],[1505,342],[1517,343],[1516,343],[635,344],[1521,345],[1499,346],[1512,343],[1514,347],[1513,347],[1515,347],[1510,226],[1511,348],[1506,349],[1507,350],[1508,351],[1494,352],[1493,353],[1522,351],[1523,351],[1524,351],[1525,351],[1526,351],[1527,351],[1528,351],[1529,351],[1491,351],[1530,351],[1531,351],[1532,351],[1533,351],[1534,351],[1535,351],[1536,351],[1537,351],[1565,354],[1538,351],[1539,351],[1540,351],[1541,351],[1542,351],[1543,351],[1544,351],[1545,351],[1546,351],[1547,351],[1548,351],[1549,351],[1550,351],[1551,351],[1553,351],[1554,351],[1552,351],[1555,351],[1556,351],[1557,351],[1559,351],[1558,351],[1560,351],[1561,351],[1492,351],[1562,351],[1563,351],[1564,351],[1371,355],[1370,356],[1369,254],[1366,357],[1362,358],[1368,359],[1363,358],[1365,360],[1361,358],[1356,361],[1360,362],[1359,363],[1355,364],[1353,361],[1364,365],[1352,366],[1351,367],[1344,368],[1349,368],[1343,368],[1348,368],[1342,369],[739,370],[741,371],[742,372],[737,371],[740,370],[736,371],[735,373],[754,374],[760,375],[750,376],[759,52],[751,374],[753,377],[745,376],[743,378],[758,379],[755,378],[757,376],[756,378],[744,376],[746,380],[748,376],[749,376],[747,376],[3080,381],[3076,181],[3078,382],[3079,181],[1238,253],[3083,383],[3086,384],[3089,385],[3085,386],[2122,387],[3094,387],[2110,388],[2111,389],[2109,390],[2112,391],[2113,392],[2114,393],[2115,394],[2116,395],[2117,396],[2118,397],[2119,398],[2120,399],[2121,400],[3099,253],[3101,401],[166,52],[71,402],[752,52],[3103,403],[3105,253],[3130,404],[3131,405],[3106,406],[3109,406],[3128,404],[3129,404],[3119,404],[3118,407],[3116,404],[3111,404],[3124,404],[3122,404],[3126,404],[3110,404],[3123,404],[3127,404],[3112,404],[3113,404],[3125,404],[3107,404],[3114,404],[3115,404],[3117,404],[3121,404],[3132,408],[3120,404],[3108,404],[3145,409],[3139,408],[3141,410],[3140,408],[3133,408],[3134,408],[3136,408],[3138,408],[3142,410],[3143,410],[3135,410],[3137,410],[3146,253],[3148,411],[632,412],[633,413],[1254,414],[1489,415],[1339,416],[1372,417],[1487,418],[651,419],[654,420],[655,421],[661,422],[659,423],[662,424],[663,425],[664,422],[665,426],[666,427],[667,427],[668,427],[669,428],[670,425],[671,429],[672,430],[658,431],[673,428],[674,427],[675,427],[676,427],[677,427],[678,427],[679,427],[680,427],[681,427],[682,429],[683,427],[687,432],[688,426],[689,433],[690,427],[691,426],[692,434],[684,419],[693,435],[685,436],[686,437],[694,438],[695,439],[696,440],[697,440],[698,423],[699,441],[701,442],[702,427],[703,424],[714,426],[704,443],[706,426],[705,426],[707,444],[761,445],[708,446],[709,447],[710,448],[711,426],[712,426],[713,449],[715,450],[648,451],[716,452],[717,453],[649,454],[647,430],[652,455],[653,456],[700,457],[728,458],[763,459],[1170,460],[718,428],[768,461],[770,462],[771,463],[772,464],[773,465],[774,466],[775,467],[776,468],[777,469],[778,470],[779,471],[780,472],[781,473],[782,474],[783,475],[784,476],[785,477],[786,478],[787,479],[788,480],[789,481],[790,482],[1149,483],[1150,484],[1151,485],[1152,486],[1153,487],[1154,488],[1155,489],[1156,490],[1157,488],[1158,491],[1159,492],[1160,493],[1161,494],[1163,495],[1162,496],[1164,497],[769,498],[1169,378],[1165,499],[1166,500],[1167,501],[1168,502],[719,425],[720,425],[657,503],[650,428],[721,428],[722,428],[1435,504],[1430,505],[1436,506],[1464,506],[1462,507],[1461,507],[1465,508],[1459,506],[1437,506],[1460,507],[1455,509],[1456,506],[1458,510],[1457,505],[1463,506],[1421,511],[1466,512],[1443,513],[1484,514],[1486,515],[1419,516],[1378,254],[1379,517],[1384,518],[1382,519],[1385,520],[1380,521],[1381,522],[1478,523],[1477,524],[1390,525],[1387,254],[1388,526],[1444,527],[1440,528],[1445,529],[1449,530],[1439,531],[1448,529],[1377,532],[1376,533],[1375,534],[1396,535],[1395,536],[1454,537],[1452,538],[1451,539],[1453,539],[1420,505],[1468,505],[1472,505],[1475,540],[1467,541],[1476,542],[1409,543],[1398,544],[1408,545],[1404,546],[1403,547],[1410,548],[1397,549],[1399,549],[1406,550],[1400,551],[1402,552],[1405,553],[1401,554],[1407,545],[1418,555],[1416,556],[1415,557],[1417,558],[1413,559],[1414,555],[1411,560],[1412,561],[1483,562],[1481,563],[1479,564],[1480,565],[1482,566],[259,567],[260,568],[279,569],[274,570],[275,571],[276,572],[277,570],[278,570],[267,573],[266,574],[264,575],[265,576],[270,577],[271,578],[272,578],[273,578],[263,579],[269,580],[268,581],[262,582],[2504,583],[2483,584],[2484,585],[2421,583],[2433,583],[2434,583],[2447,583],[2450,583],[2453,583],[2455,583],[2456,583],[2457,583],[2459,583],[2460,583],[2461,583],[2462,583],[2463,583],[2465,583],[2464,583],[2468,583],[2480,583],[2485,586],[2486,583],[2487,583],[2488,587],[2489,588],[2490,583],[2491,583],[2492,583],[2493,583],[2496,583],[2505,589],[2514,583],[2519,583],[2520,583],[2522,583],[2521,583],[2672,590],[2527,583],[2528,583],[2541,583],[2552,583],[2562,583],[2571,583],[2578,583],[2581,591],[2418,583],[2583,583],[2593,583],[2605,592],[2603,593],[2604,594],[2602,595],[2601,583],[2608,583],[2618,583],[2622,583],[2624,583],[2626,589],[2636,583],[2637,583],[2650,583],[2651,583],[2654,583],[2667,583],[2420,596],[1294,597],[1286,598],[1285,599],[1290,600],[1287,598],[1288,601],[1289,602],[1283,603],[1282,603],[1284,604],[2207,605],[2208,606],[2205,606],[2211,607],[2210,608],[2209,609],[2139,610],[2138,606],[2140,611],[2216,612],[2184,613],[2185,614],[2186,615],[2182,616],[2183,617],[2141,606],[2150,618],[2142,606],[2144,606],[2143,606],[2146,606],[2147,606],[2148,606],[2149,619],[2230,620],[2168,621],[2165,622],[2167,623],[2231,624],[2162,625],[2170,626],[2155,627],[2175,628],[2161,629],[2159,630],[2192,631],[2158,632],[2157,633],[2179,634],[2180,634],[2178,635],[2181,635],[2187,636],[2177,637],[2188,638],[2191,639],[2172,640],[2189,634],[2190,634],[2173,641],[2174,642],[2160,643],[2176,644],[2169,645],[2151,646],[2152,623],[2154,647],[2153,648],[2134,606],[2136,649],[2193,650],[2195,606],[2204,651],[2196,649],[2198,606],[2200,652],[2199,653],[2201,606],[2202,606],[2203,606],[2217,654],[2225,655],[2229,656],[2227,623],[2224,657],[2228,658],[2223,659],[2220,660],[2219,661],[2221,660],[2222,661],[1876,412],[2074,662],[2076,663],[2075,662],[2073,664],[1981,665],[2047,666],[2046,667],[2045,668],[1986,669],[2002,670],[2000,671],[2001,672],[1987,673],[2070,674],[1975,675],[1979,676],[1999,677],[1994,678],[1980,679],[1995,680],[1998,681],[1996,681],[1993,682],[1997,683],[2003,684],[1985,685],[1983,686],[1992,687],[1989,688],[1988,688],[1984,689],[1990,690],[2066,691],[2060,692],[2053,693],[2052,694],[2061,695],[2062,681],[2054,696],[2067,697],[2048,698],[2049,699],[2050,700],[2069,701],[2051,694],[2055,697],[2056,702],[2063,703],[2064,679],[2065,702],[2068,681],[2057,700],[2004,704],[2058,705],[2059,706],[2044,707],[2042,708],[2043,708],[2008,708],[2009,708],[2010,708],[2011,708],[2012,708],[2013,708],[2014,708],[2015,708],[2034,708],[2016,708],[2017,708],[2018,708],[2019,708],[2020,708],[2021,708],[2041,708],[2022,708],[2023,708],[2024,708],[2039,708],[2025,708],[2040,708],[2026,708],[2037,708],[2038,708],[2027,708],[2028,708],[2029,708],[2035,708],[2036,708],[2030,708],[2031,708],[2032,708],[2033,708],[2007,709],[2006,710],[2005,711],[1259,712],[1260,712],[1258,712],[1263,713],[1257,714],[1262,712],[1256,13],[643,715],[639,226],[641,716],[640,717],[642,716],[77,718],[222,719],[224,720],[181,721],[191,722],[182,723],[198,724],[183,725],[192,724],[171,724],[233,726],[235,727],[217,728],[216,729],[215,730],[238,52],[214,731],[169,732],[221,731],[225,733],[229,734],[174,735],[173,736],[195,737],[204,738],[178,739],[172,740],[168,741],[208,742],[207,741],[205,743],[197,744],[206,745],[209,746],[184,739],[199,747],[179,748],[203,749],[202,750],[180,751],[194,752],[193,753],[185,741],[186,754],[188,755],[187,756],[189,757],[190,758],[227,52],[231,52],[211,759],[218,760],[201,761],[200,762],[177,763],[220,764],[75,765],[72,52],[226,766],[228,767],[230,768],[232,769],[245,770],[234,770],[244,771],[236,772],[237,773],[239,774],[242,775],[243,253],[210,776],[1391,777],[1393,778],[1877,779],[2691,780],[2689,781],[2690,781],[1322,782],[1321,52],[2680,783],[1298,784],[1297,785],[1296,786],[1295,787],[1392,254],[96,788],[103,789],[95,788],[110,790],[87,791],[86,792],[109,253],[104,793],[107,794],[89,795],[88,796],[84,797],[83,255],[106,798],[85,799],[90,800],[94,800],[112,801],[111,800],[98,802],[99,803],[101,804],[97,805],[100,806],[105,253],[92,807],[93,808],[102,809],[82,810],[108,811],[964,812],[965,813],[969,814],[972,815],[970,816],[968,817],[966,818],[520,819],[330,820],[971,821],[967,822],[379,813],[510,823],[380,824],[513,825],[435,826],[441,827],[442,828],[443,828],[440,829],[521,830],[656,831],[425,832],[445,833],[449,834],[450,835],[451,833],[452,836],[401,837],[391,838],[400,839],[453,840],[454,841],[395,842],[456,843],[457,844],[386,845],[458,846],[462,847],[464,848],[466,849],[467,850],[468,851],[399,841],[461,852],[470,853],[471,846],[472,854],[474,855],[396,856],[475,857],[477,858],[434,859],[479,860],[480,833],[483,861],[484,862],[487,863],[493,864],[492,865],[495,866],[496,867],[497,867],[498,868],[501,869],[548,870],[522,870],[523,871],[524,872],[525,871],[526,873],[527,871],[528,873],[529,870],[530,871],[550,871],[531,871],[532,874],[533,875],[551,871],[534,873],[535,871],[536,871],[537,876],[538,873],[539,871],[552,871],[540,871],[541,871],[542,871],[543,873],[553,871],[544,876],[549,871],[545,873],[503,877],[504,878],[505,879],[506,880],[398,881],[507,882],[508,883],[387,884],[388,885],[511,886],[512,887],[514,888],[515,877],[516,880],[478,889],[840,890],[839,891],[791,226],[792,892],[793,892],[794,226],[795,226],[796,226],[797,226],[798,226],[802,226],[803,226],[804,226],[799,226],[800,226],[801,226],[805,226],[806,226],[807,226],[808,226],[809,226],[810,226],[811,892],[812,892],[813,892],[814,226],[815,226],[816,226],[817,226],[818,226],[819,226],[820,226],[821,226],[822,226],[823,226],[824,226],[825,226],[826,226],[827,226],[828,226],[829,226],[830,226],[831,226],[833,226],[832,226],[834,226],[835,226],[836,226],[837,226],[838,226],[841,893],[842,893],[843,226],[844,226],[845,226],[846,226],[847,226],[848,226],[849,226],[850,226],[851,226],[852,226],[853,226],[854,892],[855,892],[856,226],[857,226],[858,226],[859,226],[860,226],[861,226],[862,226],[863,226],[864,226],[865,226],[866,226],[873,226],[874,226],[867,226],[868,226],[869,226],[870,226],[871,226],[872,226],[875,226],[876,226],[877,226],[878,226],[879,226],[880,226],[881,226],[882,226],[883,226],[885,226],[884,226],[886,226],[887,226],[888,892],[889,892],[890,892],[891,226],[892,226],[900,226],[901,226],[898,226],[899,226],[902,226],[905,226],[906,226],[903,226],[904,226],[907,226],[909,226],[908,226],[910,226],[911,226],[912,226],[913,226],[893,226],[894,226],[895,226],[896,226],[914,226],[897,226],[915,226],[916,226],[917,226],[918,226],[919,226],[920,226],[921,226],[922,226],[923,226],[924,226],[925,226],[926,226],[927,226],[928,226],[929,226],[997,894],[998,892],[999,226],[1000,226],[1001,226],[1002,226],[1003,226],[1004,226],[1005,226],[1006,226],[1007,226],[1008,226],[1009,226],[1010,226],[1011,226],[1012,226],[1013,226],[1014,892],[1015,226],[1016,226],[1017,226],[1018,226],[1019,226],[1020,226],[1021,226],[1022,226],[1023,226],[1024,226],[1025,226],[1026,226],[1027,226],[1028,226],[1029,226],[1030,226],[1031,226],[1032,226],[1033,226],[1035,226],[1034,226],[1036,226],[1042,226],[1040,226],[1041,226],[1037,892],[1038,892],[1039,892],[1043,226],[1044,226],[1045,226],[1047,892],[1048,892],[1049,226],[1046,894],[1050,226],[1051,226],[1052,226],[1053,226],[1054,226],[1055,226],[1056,226],[1057,226],[1058,226],[1059,226],[1060,226],[1061,226],[1062,226],[1063,226],[1064,226],[1065,226],[1066,226],[1067,226],[1068,226],[1069,226],[1070,892],[1071,892],[1072,226],[1073,226],[1074,226],[1075,226],[1076,226],[1077,226],[1078,226],[1079,226],[1080,226],[1081,226],[1101,226],[1102,226],[1082,226],[1083,226],[1084,226],[1085,226],[1086,226],[1087,226],[1088,226],[1089,226],[1090,226],[1091,226],[1092,226],[1093,226],[1094,226],[1095,226],[1096,226],[1097,226],[1098,226],[1099,226],[1100,226],[1103,226],[1104,226],[1105,226],[1107,226],[1108,226],[1109,226],[1110,226],[1111,226],[1106,226],[1112,226],[1113,226],[1114,226],[1115,226],[1116,226],[1117,226],[1118,226],[1119,226],[1120,226],[1121,226],[1122,226],[1123,226],[1126,226],[1127,226],[1128,226],[1129,226],[1125,226],[1124,226],[1130,226],[1131,226],[1132,226],[1133,226],[1134,226],[1135,226],[1136,226],[1144,226],[1137,226],[1138,226],[984,894],[1139,894],[1140,894],[986,894],[985,894],[1141,892],[1142,892],[1143,892],[1148,895],[518,896],[559,897],[547,898],[560,899],[502,900],[546,901],[517,902],[336,903],[554,904],[489,905],[558,906],[562,907],[3028,908],[403,909],[397,910],[371,910],[364,911],[392,911],[426,909],[372,912],[415,913],[365,910],[347,910],[463,914],[346,911],[437,910],[355,915],[338,910],[446,910],[373,910],[340,910],[341,916],[423,917],[357,918],[555,910],[329,919],[616,920],[1147,921],[1146,922],[1145,923],[320,924],[332,925],[402,926],[325,927],[335,928],[322,929],[323,930],[444,931],[324,932],[326,933],[321,930],[476,934],[333,935],[334,936],[339,937],[327,938],[490,939],[328,940],[331,929],[412,941],[569,942],[414,943],[459,944],[570,945],[417,946],[418,947],[419,948],[571,949],[448,950],[420,951],[573,952],[600,953],[413,954],[416,955],[574,956],[572,957],[410,958],[576,959],[375,960],[588,961],[359,962],[360,962],[363,963],[362,964],[595,965],[594,966],[367,967],[368,968],[345,969],[427,970],[381,971],[598,972],[599,973],[421,974],[366,975],[369,976],[575,976],[482,977],[349,976],[348,978],[350,979],[404,980],[351,976],[411,981],[353,982],[604,983],[352,984],[354,985],[370,965],[439,986],[438,987],[428,979],[430,976],[431,988],[429,989],[3027,812],[432,990],[422,991],[433,992],[390,993],[389,994],[382,995],[394,996],[465,997],[383,998],[460,999],[469,1000],[393,1001],[473,1002],[384,1003],[405,1004],[610,1005],[356,1006],[406,812],[611,1006],[361,1006],[607,1007],[447,1008],[605,1009],[608,1007],[409,1010],[606,1009],[407,1011],[408,1012],[596,1013],[597,1014],[519,1015],[488,998],[491,812],[342,812],[455,812],[343,812],[556,812],[557,1016],[344,1017],[561,1018],[578,1019],[481,1020],[486,1021],[591,1022],[579,813],[592,1023],[580,813],[581,1024],[582,1025],[583,1026],[584,1027],[585,1028],[587,1029],[593,1024],[509,1030],[586,1019],[609,1031],[589,1032],[590,1033],[499,919],[500,1034],[424,1035],[494,812],[385,1036],[376,1037],[577,1038],[358,1039],[615,1040],[377,1041],[378,1042],[485,1043],[602,1044],[603,1044],[601,812],[613,1045],[614,1045],[612,812],[940,1046],[944,1047],[991,1048],[945,1049],[992,1049],[946,1050],[948,1049],[947,1051],[949,1052],[950,1052],[951,1053],[952,1050],[953,1054],[954,1054],[974,1055],[975,1056],[976,1049],[977,1057],[978,1049],[979,1058],[939,1059],[980,1059],[981,1060],[982,1060],[988,1061],[987,1062],[989,1063],[990,1064],[993,1065],[936,910],[973,910],[996,1066],[983,1067],[941,1068],[934,1069],[935,919],[943,1070],[933,1071],[931,1072],[942,929],[932,1073],[938,1074],[937,1075],[994,1076],[995,1077],[297,1078],[298,1079],[317,1080],[312,1081],[313,1082],[314,1083],[315,1081],[316,1081],[305,1084],[304,1085],[302,1086],[303,1087],[308,1088],[309,1089],[310,1089],[311,1089],[301,1090],[307,1091],[306,1092],[300,1093],[730,1094],[731,1095],[732,1096],[1497,1097],[1490,1098],[1226,1099],[1198,1100],[766,1101],[767,1102],[1171,1103],[1173,1104],[1175,1105],[1176,1103],[1177,1103],[1178,1103],[1179,1101],[1180,1101],[1181,1102],[1182,1101],[1183,1103],[1184,1101],[1186,1103],[1185,1101],[1187,1103],[1188,1103],[1189,1103],[1190,1103],[1191,1103],[1192,1103],[1193,1106],[1194,1107],[1195,1103],[1196,1103],[1197,1103],[1199,1108],[1200,1109],[1201,1103],[1202,1102],[1203,1106],[1204,1106],[1205,1103],[1206,1103],[1207,1103],[1208,1103],[1209,1109],[1210,1103],[1211,1103],[1212,1103],[1213,1103],[1214,1103],[1215,1107],[1216,1103],[1217,1103],[1218,1103],[1219,1109],[1221,1103],[1220,1103],[1174,1102],[1172,1110],[1222,1110],[1223,1102],[1224,1109],[729,1111],[765,1112],[764,1113],[286,1114],[291,1115],[289,1116],[290,1117],[280,202],[294,1118],[281,1115],[626,1119],[285,1120],[283,1121],[292,1122],[293,1123],[287,1114],[627,1123],[284,1124],[628,1123],[288,1125],[629,1119],[630,1126]],"exportedModulesMap":[[246,1],[78,2],[79,2],[114,3],[115,4],[116,5],[117,6],[118,7],[119,8],[120,9],[121,10],[122,11],[123,12],[124,12],[126,13],[125,14],[127,15],[128,16],[129,17],[113,18],[130,19],[131,20],[132,21],[164,22],[133,23],[134,24],[135,25],[136,26],[137,27],[138,28],[139,29],[140,30],[141,31],[142,32],[143,32],[144,33],[145,34],[147,35],[146,36],[148,37],[149,38],[150,39],[151,40],[152,41],[153,42],[154,43],[155,44],[156,45],[157,46],[158,47],[159,48],[160,49],[161,50],[162,51],[2676,52],[2685,1127],[2697,52],[248,1128],[2686,52],[2699,52],[2723,52],[3024,52],[3048,52],[3051,52],[3065,1129],[3068,1130],[256,66],[252,65],[253,66],[254,66],[255,66],[631,1131],[1567,1132],[1568,69],[1566,226],[249,71],[2687,52],[2692,52],[2693,52],[2695,52],[2696,52],[1571,1133],[1575,110],[1576,110],[1885,69],[1886,69],[1887,69],[1574,67],[1578,67],[2684,1127],[2705,52],[2700,52],[3025,52],[3026,52],[3042,86],[2724,52],[2702,52],[2698,52],[3069,52],[2712,1134],[2703,52],[2679,52],[2713,52],[2714,52],[2715,1135],[2716,1136],[1880,177],[1881,177],[1882,177],[2681,1137],[1898,1132],[2704,52],[1572,66],[1899,66],[1883,69],[1900,67],[1573,67],[1901,67],[1902,67],[1577,67],[1903,67],[2706,52],[2124,1138],[2683,52],[1569,177],[2129,67],[2130,110],[2131,110],[2132,110],[2708,1139],[2709,52],[3022,1140],[3023,52],[2710,1139],[2711,52],[2126,117],[2127,67],[3074,118],[2718,1141],[2719,52],[2232,120],[2385,1142],[2387,52],[1884,110],[2388,110],[2389,110],[3029,52],[3058,118],[3043,52],[3034,52],[3036,52],[3035,52],[3049,52],[3039,1143],[3038,1144],[3037,52],[3041,52],[3050,52],[3056,52],[3040,1143],[2391,110],[2395,1145],[2396,69],[2398,69],[2399,69],[2128,67],[2397,67],[2400,110],[2401,110],[2402,110],[2403,1146],[2404,69],[2405,69],[2406,110],[2407,69],[2408,69],[3044,52],[3059,52],[3030,52],[3031,52],[3032,52],[3033,52],[3054,52],[3055,52],[3045,52],[2409,69],[2410,69],[2411,110],[3047,52],[3060,52],[3046,52],[2720,52],[2415,1147],[2413,1148],[3052,52],[2707,52],[3066,1149],[3067,52],[3057,118],[3053,1143],[3061,52],[3062,52],[3063,52],[3064,118],[2717,118],[2416,110],[2417,110],[2722,118],[2721,52],[2674,177],[1879,177],[1570,177],[2123,96],[2125,67],[2675,1150],[2394,1151],[2392,67],[3077,181],[1252,182],[1235,183],[1234,184],[1253,185],[1250,186],[1248,187],[1249,188],[1243,189],[1244,190],[1251,191],[1237,192],[1246,193],[1239,194],[1245,195],[1247,196],[1241,197],[1242,197],[625,198],[619,199],[621,200],[622,201],[623,202],[624,203],[1915,204],[1931,205],[1941,206],[1965,207],[2079,208],[2080,209],[2099,210],[2100,211],[1905,212],[2102,213],[2103,213],[2104,214],[2105,213],[2106,213],[2107,213],[1908,215],[1910,215],[1917,216],[1926,215],[1907,215],[1909,217],[1911,218],[1912,215],[1918,219],[1919,215],[1920,215],[1922,220],[1923,215],[1924,221],[1925,215],[1966,222],[1927,223],[1929,224],[1930,215],[1967,215],[1968,215],[2077,225],[1933,226],[1935,226],[1932,227],[1934,228],[1937,229],[1938,222],[1939,211],[1940,230],[1936,231],[1942,232],[1948,233],[1949,234],[1950,232],[1951,233],[1952,232],[1953,235],[1954,232],[1955,234],[1956,232],[1957,234],[1958,232],[1959,236],[1960,232],[1961,232],[1962,232],[1963,232],[1964,234],[2108,237],[1969,238],[2078,239],[1904,211],[1916,240],[2083,241],[1943,212],[2084,226],[2085,242],[1944,226],[2086,226],[1945,226],[1906,243],[1946,244],[2096,245],[2089,226],[2097,246],[2090,226],[2093,247],[1921,211],[1947,248],[2094,249],[2095,250],[2098,251],[2245,252],[2242,253],[2249,254],[2243,252],[2240,255],[2253,256],[2247,253],[2244,257],[2246,258],[2071,259],[1579,52],[1580,52],[1581,52],[1582,52],[1584,52],[1583,52],[1585,52],[1591,52],[1586,52],[1588,52],[1587,52],[1589,52],[1590,52],[1592,52],[1593,52],[1596,52],[1594,52],[1595,52],[1597,52],[1598,52],[1599,52],[1600,52],[1602,52],[1601,52],[1603,52],[1604,52],[1607,52],[1605,52],[1606,52],[1608,52],[1609,52],[1610,52],[1611,52],[1626,52],[1627,52],[1628,52],[1629,52],[1612,52],[1613,52],[1614,52],[1615,52],[1621,52],[1616,52],[1618,52],[1617,52],[1619,52],[1620,52],[1622,52],[1623,52],[1624,52],[1625,52],[1630,52],[1631,52],[1632,52],[1633,52],[1634,52],[1635,52],[1636,52],[1637,52],[1638,52],[1639,52],[1640,52],[1641,52],[1642,52],[1643,52],[1644,52],[1645,52],[1646,52],[1649,52],[1647,52],[1648,52],[1651,52],[1650,52],[1655,52],[1653,52],[1654,52],[1652,52],[1656,52],[1657,52],[1658,52],[1659,52],[1660,52],[1661,52],[1662,52],[1663,52],[1664,52],[1665,52],[1666,52],[1668,52],[1667,52],[1669,52],[1671,52],[1670,52],[1672,52],[1674,52],[1673,52],[1675,52],[1676,52],[1677,52],[1678,52],[1679,52],[1680,52],[1681,52],[1682,52],[1683,52],[1684,52],[1685,52],[1686,52],[1687,52],[1688,52],[1689,52],[1690,52],[1692,52],[1691,52],[1693,52],[1694,52],[1695,52],[1696,52],[1697,52],[1699,52],[1698,52],[1700,52],[1701,52],[1702,52],[1703,52],[1704,52],[1705,52],[1706,52],[1708,52],[1707,52],[1709,52],[1710,52],[1711,52],[1712,52],[1713,52],[1714,52],[1715,52],[1716,52],[1717,52],[1718,52],[1719,52],[1720,52],[1721,52],[1722,52],[1723,52],[1728,52],[1724,52],[1725,52],[1726,52],[1727,52],[1729,52],[1730,52],[1731,52],[1733,52],[1732,52],[1734,52],[1735,52],[1736,52],[1738,52],[1737,52],[1739,52],[1740,52],[1741,52],[1742,52],[1743,52],[1744,52],[1745,52],[1749,52],[1746,52],[1747,52],[1748,52],[1750,52],[1751,52],[1752,52],[1754,52],[1753,52],[1755,52],[1756,52],[1757,52],[1758,52],[1759,52],[1760,52],[1761,52],[1762,52],[1763,52],[1765,52],[1764,52],[1766,52],[1767,52],[1769,52],[1768,52],[1875,260],[1770,52],[1771,52],[1772,52],[1773,52],[1774,52],[1775,52],[1776,52],[1777,52],[1778,52],[1779,52],[1782,52],[1780,52],[1781,52],[1784,52],[1783,52],[1785,52],[1786,52],[1787,52],[1789,52],[1788,52],[1790,52],[1791,52],[1792,52],[1793,52],[1794,52],[1795,52],[1796,52],[1797,52],[1798,52],[1800,52],[1799,52],[1801,52],[1802,52],[1804,52],[1803,52],[1805,52],[1806,52],[1808,52],[1807,52],[1809,52],[1811,52],[1810,52],[1812,52],[1813,52],[1814,52],[1815,52],[1816,52],[1817,52],[1818,52],[1819,52],[1820,52],[1821,52],[1822,52],[1823,52],[1824,52],[1825,52],[1826,52],[1827,52],[1828,52],[1830,52],[1829,52],[1831,52],[1832,52],[1833,52],[1834,52],[1835,52],[1837,52],[1836,52],[1838,52],[1839,52],[1840,52],[1841,52],[1842,52],[1843,52],[1844,52],[1845,52],[1846,52],[1847,52],[1848,52],[1849,52],[1850,52],[1851,52],[1852,52],[1853,52],[1854,52],[1855,52],[1856,52],[1857,52],[1858,52],[1861,52],[1859,52],[1860,52],[1862,52],[1863,52],[1865,52],[1864,52],[1866,52],[1867,52],[1868,52],[1869,52],[1870,52],[1872,52],[1871,52],[1873,52],[1874,52],[2725,52],[2726,52],[2727,52],[2728,52],[2730,52],[2729,52],[2731,52],[2737,52],[2732,52],[2734,52],[2733,52],[2735,52],[2736,52],[2738,52],[2739,52],[2742,52],[2740,52],[2741,52],[2743,52],[2744,52],[2745,52],[2746,52],[2748,52],[2747,52],[2749,52],[2750,52],[2753,52],[2751,52],[2752,52],[2754,52],[2755,52],[2756,52],[2757,52],[2772,52],[2773,52],[2774,52],[2775,52],[2758,52],[2759,52],[2760,52],[2761,52],[2767,52],[2762,52],[2764,52],[2763,52],[2765,52],[2766,52],[2768,52],[2769,52],[2770,52],[2771,52],[2776,52],[2777,52],[2778,52],[2779,52],[2780,52],[2781,52],[2782,52],[2783,52],[2784,52],[2785,52],[2786,52],[2787,52],[2788,52],[2789,52],[2790,52],[2791,52],[2792,52],[2795,52],[2793,52],[2794,52],[2797,52],[2796,52],[2801,52],[2799,52],[2800,52],[2798,52],[2802,52],[2803,52],[2804,52],[2805,52],[2806,52],[2807,52],[2808,52],[2809,52],[2810,52],[2811,52],[2812,52],[2814,52],[2813,52],[2815,52],[2817,52],[2816,52],[2818,52],[2820,52],[2819,52],[2821,52],[2822,52],[2823,52],[2824,52],[2825,52],[2826,52],[2827,52],[2828,52],[2829,52],[2830,52],[2831,52],[2832,52],[2833,52],[2834,52],[2835,52],[2836,52],[2838,52],[2837,52],[2839,52],[2840,52],[2841,52],[2842,52],[2843,52],[2845,52],[2844,52],[2846,52],[2847,52],[2848,52],[2849,52],[2850,52],[2851,52],[2852,52],[2854,52],[2853,52],[2855,52],[2856,52],[2857,52],[2858,52],[2859,52],[2860,52],[2861,52],[2862,52],[2863,52],[2864,52],[2865,52],[2866,52],[2867,52],[2868,52],[2869,52],[2874,52],[2870,52],[2871,52],[2872,52],[2873,52],[2875,52],[2876,52],[2877,52],[2879,52],[2878,52],[2880,52],[2881,52],[2882,52],[2884,52],[2883,52],[2885,52],[2886,52],[2887,52],[2888,52],[2889,52],[2890,52],[2891,52],[2895,52],[2892,52],[2893,52],[2894,52],[2896,52],[2897,52],[2898,52],[2900,52],[2899,52],[2901,52],[2902,52],[2903,52],[2904,52],[2905,52],[2906,52],[2907,52],[2908,52],[2909,52],[2911,52],[2910,52],[2912,52],[2913,52],[2915,52],[2914,52],[3021,261],[2916,52],[2917,52],[2918,52],[2919,52],[2920,52],[2921,52],[2922,52],[2923,52],[2924,52],[2925,52],[2928,52],[2926,52],[2927,52],[2930,52],[2929,52],[2931,52],[2932,52],[2933,52],[2935,52],[2934,52],[2936,52],[2937,52],[2938,52],[2939,52],[2940,52],[2941,52],[2942,52],[2943,52],[2944,52],[2946,52],[2945,52],[2947,52],[2948,52],[2950,52],[2949,52],[2951,52],[2952,52],[2954,52],[2953,52],[2955,52],[2957,52],[2956,52],[2958,52],[2959,52],[2960,52],[2961,52],[2962,52],[2963,52],[2964,52],[2965,52],[2966,52],[2967,52],[2968,52],[2969,52],[2970,52],[2971,52],[2972,52],[2973,52],[2974,52],[2976,52],[2975,52],[2977,52],[2978,52],[2979,52],[2980,52],[2981,52],[2983,52],[2982,52],[2984,52],[2985,52],[2986,52],[2987,52],[2988,52],[2989,52],[2990,52],[2991,52],[2992,52],[2993,52],[2994,52],[2995,52],[2996,52],[2997,52],[2998,52],[2999,52],[3000,52],[3001,52],[3002,52],[3003,52],[3004,52],[3007,52],[3005,52],[3006,52],[3008,52],[3009,52],[3011,52],[3010,52],[3012,52],[3013,52],[3014,52],[3015,52],[3016,52],[3018,52],[3017,52],[3019,52],[3020,52],[1265,262],[1267,263],[1271,264],[1269,265],[1268,266],[1270,267],[1266,268],[1264,269],[1255,254],[1275,270],[1320,271],[1305,272],[1316,273],[1309,274],[1310,275],[1302,276],[1314,277],[1315,278],[1338,279],[1329,280],[1328,281],[1323,282],[1336,283],[1330,284],[1331,285],[1325,284],[1334,286],[1333,287],[1332,284],[2258,288],[2254,289],[2255,253],[2257,289],[2384,290],[2234,291],[2235,292],[2265,65],[2236,65],[2237,65],[2266,293],[2269,294],[2238,65],[2263,293],[2267,293],[2264,293],[2268,293],[2315,295],[2314,295],[2305,296],[2301,293],[2300,297],[2304,295],[2309,296],[2310,296],[2327,65],[2312,293],[2318,293],[2313,293],[2323,298],[2324,293],[2322,293],[2325,299],[2321,293],[2273,300],[2279,295],[2275,300],[2281,301],[2276,302],[2274,293],[2272,297],[2278,303],[2280,295],[2306,296],[2328,304],[2307,296],[2326,295],[2320,295],[2317,295],[2316,295],[2302,297],[2319,293],[2303,296],[2311,296],[2277,295],[2233,305],[2370,306],[2308,307],[2383,308],[2299,309],[2298,310],[2372,311],[2374,293],[2373,312],[2382,313],[2369,314],[2381,315],[2377,316],[2378,317],[2376,318],[2379,318],[2375,319],[2371,320],[2368,321],[2260,293],[2351,322],[2355,323],[2338,295],[2336,295],[2340,295],[2363,322],[2352,322],[2357,322],[2334,295],[2332,293],[2342,293],[2367,324],[2333,325],[2361,322],[2350,323],[2358,322],[2359,322],[2365,322],[2364,326],[2353,322],[2356,322],[2339,295],[2337,295],[2341,293],[2354,323],[2343,293],[2366,327],[2344,293],[2330,293],[2349,326],[2360,322],[2331,293],[2348,322],[2335,295],[2262,328],[2259,65],[2261,295],[2293,293],[2283,297],[2291,293],[2290,293],[2287,65],[2284,65],[2292,65],[2285,65],[2286,295],[2288,293],[2294,329],[2282,297],[2289,293],[2296,330],[2295,295],[2346,331],[2347,332],[2345,333],[2380,334],[1520,335],[638,336],[637,337],[1518,52],[1519,338],[1500,52],[636,52],[1501,52],[1509,52],[1502,52],[1504,339],[1503,340],[1496,341],[1495,338],[1505,342],[1517,343],[1516,343],[635,344],[1521,345],[1499,346],[1512,343],[1514,347],[1513,347],[1515,347],[1510,226],[1511,348],[1506,349],[1507,350],[1508,351],[1494,352],[1493,353],[1522,351],[1523,351],[1524,351],[1525,351],[1526,351],[1527,351],[1528,351],[1529,351],[1491,351],[1530,351],[1531,351],[1532,351],[1533,351],[1534,351],[1535,351],[1536,351],[1537,351],[1565,354],[1538,351],[1539,351],[1540,351],[1541,351],[1542,351],[1543,351],[1544,351],[1545,351],[1546,351],[1547,351],[1548,351],[1549,351],[1550,351],[1551,351],[1553,351],[1554,351],[1552,351],[1555,351],[1556,351],[1557,351],[1559,351],[1558,351],[1560,351],[1561,351],[1492,351],[1562,351],[1563,351],[1564,351],[1371,355],[1370,356],[1369,254],[1366,357],[1362,358],[1368,359],[1363,358],[1365,360],[1361,358],[1356,361],[1360,362],[1359,363],[1355,364],[1353,361],[1364,365],[1352,366],[1351,367],[1344,368],[1349,368],[1343,368],[1348,368],[1342,369],[739,370],[741,371],[742,372],[737,371],[740,370],[736,371],[735,373],[754,374],[760,375],[750,376],[759,52],[751,374],[753,377],[745,376],[743,378],[758,379],[755,378],[757,376],[756,378],[744,376],[746,380],[748,376],[749,376],[747,376],[3080,381],[3076,181],[3078,382],[3079,181],[1238,253],[3083,383],[3086,384],[3089,385],[3085,386],[2122,387],[3094,387],[2110,388],[2111,389],[2109,390],[2112,391],[2113,392],[2114,393],[2115,394],[2116,395],[2117,396],[2118,397],[2119,398],[2120,399],[2121,400],[3099,253],[3101,401],[166,52],[71,402],[752,52],[3103,403],[3105,253],[3130,404],[3131,405],[3106,406],[3109,406],[3128,404],[3129,404],[3119,404],[3118,407],[3116,404],[3111,404],[3124,404],[3122,404],[3126,404],[3110,404],[3123,404],[3127,404],[3112,404],[3113,404],[3125,404],[3107,404],[3114,404],[3115,404],[3117,404],[3121,404],[3132,408],[3120,404],[3108,404],[3145,409],[3139,408],[3141,410],[3140,408],[3133,408],[3134,408],[3136,408],[3138,408],[3142,410],[3143,410],[3135,410],[3137,410],[3146,253],[3148,411],[632,412],[633,413],[1254,414],[1489,415],[1339,416],[1372,417],[1487,418],[651,419],[654,420],[655,421],[661,422],[659,423],[662,424],[663,425],[664,422],[665,426],[666,427],[667,427],[668,427],[669,428],[670,425],[671,429],[672,430],[658,431],[673,428],[674,427],[675,427],[676,427],[677,427],[678,427],[679,427],[680,427],[681,427],[682,429],[683,427],[687,432],[688,426],[689,433],[690,427],[691,426],[692,434],[684,419],[693,435],[685,436],[686,437],[694,438],[695,439],[696,440],[697,440],[698,423],[699,441],[701,442],[702,427],[703,424],[714,426],[704,443],[706,426],[705,426],[707,444],[761,445],[708,446],[709,447],[710,448],[711,426],[712,426],[713,449],[715,450],[648,451],[716,452],[717,453],[649,454],[647,430],[652,455],[653,456],[700,457],[728,458],[763,459],[1170,460],[718,428],[768,461],[770,462],[771,463],[772,464],[773,465],[774,466],[775,467],[776,468],[777,469],[778,470],[779,471],[780,472],[781,473],[782,474],[783,475],[784,476],[785,477],[786,478],[787,479],[788,480],[789,481],[790,482],[1149,483],[1150,484],[1151,485],[1152,486],[1153,487],[1154,488],[1155,489],[1156,490],[1157,488],[1158,491],[1159,492],[1160,493],[1161,494],[1163,495],[1162,496],[1164,497],[769,498],[1169,378],[1165,499],[1166,500],[1167,501],[1168,502],[719,425],[720,425],[657,503],[650,428],[721,428],[722,428],[1435,504],[1430,505],[1436,506],[1464,506],[1462,507],[1461,507],[1465,508],[1459,506],[1437,506],[1460,507],[1455,509],[1456,506],[1458,510],[1457,505],[1463,506],[1421,511],[1466,512],[1443,513],[1484,514],[1486,515],[1419,516],[1378,254],[1379,517],[1384,518],[1382,519],[1385,520],[1380,521],[1381,522],[1478,523],[1477,524],[1390,525],[1387,254],[1388,526],[1444,527],[1440,528],[1445,529],[1449,530],[1439,531],[1448,529],[1377,532],[1376,533],[1375,534],[1396,535],[1395,536],[1454,537],[1452,538],[1451,539],[1453,539],[1420,505],[1468,505],[1472,505],[1475,540],[1467,541],[1476,542],[1409,543],[1398,544],[1408,545],[1404,546],[1403,547],[1410,548],[1397,549],[1399,549],[1406,550],[1400,551],[1402,552],[1405,553],[1401,554],[1407,545],[1418,555],[1416,556],[1415,557],[1417,558],[1413,559],[1414,555],[1411,560],[1412,561],[1483,562],[1481,563],[1479,564],[1480,565],[1482,566],[259,567],[260,568],[279,569],[274,570],[275,571],[276,572],[277,570],[278,570],[267,573],[266,574],[264,575],[265,576],[270,577],[271,578],[272,578],[273,578],[263,579],[269,580],[268,581],[262,582],[2504,583],[2483,584],[2484,585],[2421,583],[2433,583],[2434,583],[2447,583],[2450,583],[2453,583],[2455,583],[2456,583],[2457,583],[2459,583],[2460,583],[2461,583],[2462,583],[2463,583],[2465,583],[2464,583],[2468,583],[2480,583],[2485,586],[2486,583],[2487,583],[2488,587],[2489,588],[2490,583],[2491,583],[2492,583],[2493,583],[2496,583],[2505,589],[2514,583],[2519,583],[2520,583],[2522,583],[2521,583],[2672,590],[2527,583],[2528,583],[2541,583],[2552,583],[2562,583],[2571,583],[2578,583],[2581,591],[2418,583],[2583,583],[2593,583],[2605,592],[2603,593],[2604,594],[2602,595],[2601,583],[2608,583],[2618,583],[2622,583],[2624,583],[2626,589],[2636,583],[2637,583],[2650,583],[2651,583],[2654,583],[2667,583],[2420,596],[1294,597],[1286,598],[1285,599],[1290,600],[1287,598],[1288,601],[1289,602],[1283,603],[1282,603],[1284,604],[2207,605],[2208,606],[2205,606],[2211,607],[2210,608],[2209,609],[2139,610],[2138,606],[2140,611],[2216,612],[2184,613],[2185,614],[2186,615],[2182,616],[2183,617],[2141,606],[2150,618],[2142,606],[2144,606],[2143,606],[2146,606],[2147,606],[2148,606],[2149,619],[2230,620],[2168,621],[2165,622],[2167,623],[2231,624],[2162,625],[2170,626],[2155,627],[2175,628],[2161,629],[2159,630],[2192,631],[2158,632],[2157,633],[2179,634],[2180,634],[2178,635],[2181,635],[2187,636],[2177,637],[2188,638],[2191,639],[2172,640],[2189,634],[2190,634],[2173,641],[2174,642],[2160,643],[2176,644],[2169,645],[2151,646],[2152,623],[2154,647],[2153,648],[2134,606],[2136,649],[2193,650],[2195,606],[2204,651],[2196,649],[2198,606],[2200,652],[2199,653],[2201,606],[2202,606],[2203,606],[2217,654],[2225,655],[2229,656],[2227,623],[2224,657],[2228,658],[2223,659],[2220,660],[2219,661],[2221,660],[2222,661],[1876,412],[2074,662],[2076,663],[2075,662],[2073,664],[1981,665],[2047,666],[2046,667],[2045,668],[1986,669],[2002,670],[2000,671],[2001,672],[1987,673],[2070,674],[1975,675],[1979,676],[1999,677],[1994,678],[1980,679],[1995,680],[1998,681],[1996,681],[1993,682],[1997,683],[2003,684],[1985,685],[1983,686],[1992,687],[1989,688],[1988,688],[1984,689],[1990,690],[2066,691],[2060,692],[2053,693],[2052,694],[2061,695],[2062,681],[2054,696],[2067,697],[2048,698],[2049,699],[2050,700],[2069,701],[2051,694],[2055,697],[2056,702],[2063,703],[2064,679],[2065,702],[2068,681],[2057,700],[2004,704],[2058,705],[2059,706],[2044,707],[2042,708],[2043,708],[2008,708],[2009,708],[2010,708],[2011,708],[2012,708],[2013,708],[2014,708],[2015,708],[2034,708],[2016,708],[2017,708],[2018,708],[2019,708],[2020,708],[2021,708],[2041,708],[2022,708],[2023,708],[2024,708],[2039,708],[2025,708],[2040,708],[2026,708],[2037,708],[2038,708],[2027,708],[2028,708],[2029,708],[2035,708],[2036,708],[2030,708],[2031,708],[2032,708],[2033,708],[2007,709],[2006,710],[2005,711],[1259,712],[1260,712],[1258,712],[1263,713],[1257,714],[1262,712],[1256,13],[643,715],[639,226],[641,716],[640,717],[642,716],[77,718],[222,719],[224,720],[181,721],[191,722],[182,723],[198,724],[183,725],[192,724],[171,724],[233,726],[235,727],[217,728],[216,729],[215,730],[238,52],[214,731],[169,732],[221,731],[225,733],[229,734],[174,735],[173,736],[195,737],[204,738],[178,739],[172,740],[168,741],[208,742],[207,741],[205,743],[197,744],[206,745],[209,746],[184,739],[199,747],[179,748],[203,749],[202,750],[180,751],[194,752],[193,753],[185,741],[186,754],[188,755],[187,756],[189,757],[190,758],[227,52],[231,52],[211,759],[218,760],[201,761],[200,762],[177,763],[220,764],[75,765],[72,52],[226,766],[228,767],[230,768],[232,769],[245,770],[234,770],[244,771],[236,772],[237,773],[239,774],[242,775],[243,253],[210,776],[1391,777],[1393,778],[1877,779],[2691,780],[2689,781],[2690,781],[1322,782],[1321,52],[2680,783],[1298,784],[1297,785],[1296,786],[1295,787],[1392,254],[96,788],[103,789],[95,788],[110,790],[87,791],[86,792],[109,253],[104,793],[107,794],[89,795],[88,796],[84,797],[83,255],[106,798],[85,799],[90,800],[94,800],[112,801],[111,800],[98,802],[99,803],[101,804],[97,805],[100,806],[105,253],[92,807],[93,808],[102,809],[82,810],[108,811],[964,812],[965,813],[969,814],[972,815],[970,816],[968,817],[966,818],[520,819],[330,1152],[971,821],[967,1153],[379,813],[510,823],[380,824],[513,825],[435,826],[441,827],[442,828],[443,828],[440,829],[521,830],[656,831],[425,832],[445,833],[449,834],[450,835],[451,833],[452,1154],[401,837],[391,838],[400,839],[453,840],[454,841],[395,842],[456,843],[457,844],[386,845],[458,846],[462,847],[464,848],[466,849],[467,850],[468,851],[399,841],[461,852],[470,853],[471,846],[472,854],[474,855],[396,856],[475,857],[477,858],[434,859],[479,860],[480,833],[483,861],[484,862],[487,863],[493,864],[492,865],[495,866],[496,867],[497,867],[498,868],[501,869],[548,870],[522,870],[523,871],[524,1155],[525,871],[526,1156],[527,871],[528,1156],[529,870],[530,871],[550,871],[531,871],[532,874],[533,875],[551,871],[534,1156],[535,871],[536,871],[537,1157],[538,1156],[539,871],[552,871],[540,871],[541,871],[542,871],[543,1156],[553,871],[544,1157],[549,871],[545,1156],[503,877],[504,1158],[505,1159],[506,880],[398,881],[507,1160],[508,883],[387,884],[388,885],[511,886],[512,887],[514,888],[515,877],[516,880],[478,889],[840,890],[839,891],[791,226],[792,892],[793,892],[794,226],[795,226],[796,226],[797,226],[798,226],[802,226],[803,226],[804,226],[799,226],[800,226],[801,226],[805,226],[806,226],[807,226],[808,226],[809,226],[810,226],[811,892],[812,892],[813,892],[814,226],[815,226],[816,226],[817,226],[818,226],[819,226],[820,226],[821,226],[822,226],[823,226],[824,226],[825,226],[826,226],[827,226],[828,226],[829,226],[830,226],[831,226],[833,226],[832,226],[834,226],[835,226],[836,226],[837,226],[838,226],[841,893],[842,893],[843,226],[844,226],[845,226],[846,226],[847,226],[848,226],[849,226],[850,226],[851,226],[852,226],[853,226],[854,892],[855,892],[856,226],[857,226],[858,226],[859,226],[860,226],[861,226],[862,226],[863,226],[864,226],[865,226],[866,226],[873,226],[874,226],[867,226],[868,226],[869,226],[870,226],[871,226],[872,226],[875,226],[876,226],[877,226],[878,226],[879,226],[880,226],[881,226],[882,226],[883,226],[885,226],[884,226],[886,226],[887,226],[888,892],[889,892],[890,892],[891,226],[892,226],[900,226],[901,226],[898,226],[899,226],[902,226],[905,226],[906,226],[903,226],[904,226],[907,226],[909,226],[908,226],[910,226],[911,226],[912,226],[913,226],[893,226],[894,226],[895,226],[896,226],[914,226],[897,226],[915,226],[916,226],[917,226],[918,226],[919,226],[920,226],[921,226],[922,226],[923,226],[924,226],[925,226],[926,226],[927,226],[928,226],[929,226],[997,894],[998,892],[999,226],[1000,226],[1001,226],[1002,226],[1003,226],[1004,226],[1005,226],[1006,226],[1007,226],[1008,226],[1009,226],[1010,226],[1011,226],[1012,226],[1013,226],[1014,892],[1015,226],[1016,226],[1017,226],[1018,226],[1019,226],[1020,226],[1021,226],[1022,226],[1023,226],[1024,226],[1025,226],[1026,226],[1027,226],[1028,226],[1029,226],[1030,226],[1031,226],[1032,226],[1033,226],[1035,226],[1034,226],[1036,226],[1042,226],[1040,226],[1041,226],[1037,892],[1038,892],[1039,892],[1043,226],[1044,226],[1045,226],[1047,892],[1048,892],[1049,226],[1046,894],[1050,226],[1051,226],[1052,226],[1053,226],[1054,226],[1055,226],[1056,226],[1057,226],[1058,226],[1059,226],[1060,226],[1061,226],[1062,226],[1063,226],[1064,226],[1065,226],[1066,226],[1067,226],[1068,226],[1069,226],[1070,892],[1071,892],[1072,226],[1073,226],[1074,226],[1075,226],[1076,226],[1077,226],[1078,226],[1079,226],[1080,226],[1081,226],[1101,226],[1102,226],[1082,226],[1083,226],[1084,226],[1085,226],[1086,226],[1087,226],[1088,226],[1089,226],[1090,226],[1091,226],[1092,226],[1093,226],[1094,226],[1095,226],[1096,226],[1097,226],[1098,226],[1099,226],[1100,226],[1103,226],[1104,226],[1105,226],[1107,226],[1108,226],[1109,226],[1110,226],[1111,226],[1106,226],[1112,226],[1113,226],[1114,226],[1115,226],[1116,226],[1117,226],[1118,226],[1119,226],[1120,226],[1121,226],[1122,226],[1123,226],[1126,226],[1127,226],[1128,226],[1129,226],[1125,226],[1124,226],[1130,226],[1131,226],[1132,226],[1133,226],[1134,226],[1135,226],[1136,226],[1144,226],[1137,226],[1138,226],[984,894],[1139,894],[1140,894],[986,894],[985,894],[1141,892],[1142,892],[1143,892],[1148,895],[518,896],[559,897],[547,898],[560,899],[502,900],[546,901],[517,902],[336,903],[554,904],[489,905],[558,906],[562,907],[3028,908],[403,909],[397,910],[371,910],[364,911],[392,911],[426,909],[372,912],[415,913],[365,910],[347,910],[463,914],[346,911],[437,910],[355,915],[338,910],[446,910],[373,910],[340,910],[341,916],[423,917],[357,918],[555,910],[329,202],[616,920],[1147,921],[1146,922],[1145,923],[320,924],[332,925],[402,926],[325,927],[335,928],[322,929],[323,930],[444,931],[324,932],[326,1161],[321,930],[476,1162],[333,935],[334,936],[339,937],[327,938],[490,939],[328,940],[331,929],[412,941],[569,1163],[414,1164],[459,944],[570,945],[417,946],[418,947],[419,948],[571,949],[448,950],[420,951],[573,952],[600,1165],[413,954],[416,955],[574,956],[572,957],[410,958],[576,959],[375,960],[588,1166],[359,962],[360,962],[363,963],[362,964],[595,965],[594,966],[367,967],[368,968],[345,969],[427,970],[381,971],[598,972],[599,973],[421,974],[366,975],[369,976],[575,976],[482,977],[349,976],[348,978],[350,979],[404,980],[351,976],[411,981],[353,982],[604,983],[352,984],[354,985],[370,965],[439,986],[438,987],[428,979],[430,976],[431,988],[429,989],[3027,812],[432,990],[422,991],[433,992],[390,993],[389,994],[382,995],[394,996],[465,997],[383,998],[460,999],[469,1000],[393,1001],[473,1002],[384,1003],[405,1004],[610,1005],[356,1006],[406,812],[611,1006],[361,1006],[607,1007],[447,1008],[605,1009],[608,1007],[409,1167],[606,1009],[407,1168],[408,1169],[596,1013],[597,1014],[519,1015],[488,998],[491,812],[342,812],[455,812],[343,812],[556,812],[557,1016],[344,1017],[561,1018],[578,1019],[481,1020],[486,1021],[591,1022],[579,813],[592,1023],[580,813],[581,1024],[582,1025],[583,1026],[584,1027],[585,1028],[587,1029],[593,1024],[509,1030],[586,1019],[609,1031],[589,1032],[590,1033],[499,919],[500,1034],[424,1035],[494,812],[385,1036],[376,1037],[577,1038],[358,1039],[615,1040],[377,1041],[378,1042],[485,1043],[602,1044],[603,1044],[601,812],[613,1045],[614,1045],[612,812],[940,1046],[944,1047],[991,1048],[945,1049],[992,1049],[946,1050],[948,1049],[947,1051],[949,1052],[950,1052],[951,1053],[952,1050],[953,1054],[954,1054],[974,1055],[975,1056],[976,1049],[977,1057],[978,1049],[979,1058],[939,1059],[980,1059],[981,1060],[982,1060],[988,1061],[987,1062],[989,1063],[990,1064],[993,1065],[936,910],[973,910],[996,1066],[983,1067],[941,1068],[934,1069],[935,919],[943,1070],[933,1071],[931,1072],[942,929],[932,1073],[938,1074],[937,1075],[994,1076],[995,1077],[297,1078],[298,1079],[317,1080],[312,1081],[313,1082],[314,1083],[315,1081],[316,1081],[305,1084],[304,1085],[302,1086],[303,1087],[308,1088],[309,1089],[310,1089],[311,1089],[301,1090],[307,1091],[306,1092],[300,1093],[730,1094],[731,1095],[732,1096],[1497,1097],[1490,1098],[1226,1099],[1198,1100],[766,1101],[767,1102],[1171,1103],[1173,1104],[1175,1105],[1176,1103],[1177,1103],[1178,1103],[1179,1101],[1180,1101],[1181,1102],[1182,1101],[1183,1103],[1184,1101],[1186,1103],[1185,1101],[1187,1103],[1188,1103],[1189,1103],[1190,1103],[1191,1103],[1192,1103],[1193,1106],[1194,1107],[1195,1103],[1196,1103],[1197,1103],[1199,1108],[1200,1109],[1201,1103],[1202,1102],[1203,1106],[1204,1106],[1205,1103],[1206,1103],[1207,1103],[1208,1103],[1209,1109],[1210,1103],[1211,1103],[1212,1103],[1213,1103],[1214,1103],[1215,1107],[1216,1103],[1217,1103],[1218,1103],[1219,1109],[1221,1103],[1220,1103],[1174,1102],[1172,1110],[1222,1110],[1223,1102],[1224,1109],[729,1111],[765,1112],[764,1113],[286,1114],[291,1115],[289,1116],[290,1117],[280,202],[294,1118],[281,1115],[626,1119],[285,1120],[283,1121],[292,1122],[293,1123],[287,1114],[627,1123],[284,1124],[628,1123],[288,1125],[629,1119],[630,1126]],"semanticDiagnosticsPerFile":[246,78,79,114,115,116,117,118,119,120,121,122,123,124,126,125,127,128,129,113,163,130,131,132,164,133,134,135,136,137,138,139,140,141,142,143,144,145,147,146,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,2676,2685,2697,248,247,2686,2699,2723,3024,3048,3051,3065,3068,250,256,252,253,254,255,631,1567,1568,1566,249,2687,2692,2693,2695,2696,1571,1575,1576,1885,1886,1887,1574,1578,2684,2705,2700,3025,1889,1890,1892,1893,1894,1895,3026,3042,1888,2724,2702,2698,3069,2712,1896,2703,2678,2694,3070,3071,3072,2701,2679,3073,2713,2714,2715,2716,1880,1881,1882,2681,1897,1898,2704,1572,1899,1883,1900,1573,1901,1902,1577,1903,2706,2124,2683,1569,2682,2129,2130,2131,2132,2708,2709,3022,3023,2710,2711,2126,2127,3074,2718,2719,2232,2385,2386,2387,1884,2388,2389,3029,3058,3043,3034,3036,3035,3049,3039,3038,3037,3041,3050,3056,3040,2391,2395,2396,2398,2399,2128,2397,2400,2401,2402,2403,2404,2405,2406,2407,2408,3044,3059,3030,2390,3031,3032,3033,3054,3055,3045,2409,2410,2411,3047,3060,3046,2720,2415,2413,3052,2412,2707,3066,3067,3057,3053,3061,3062,3063,3064,2717,2416,2417,2722,2721,2674,1879,2673,1570,2123,2125,2675,2394,2392,2393,3077,3075,1227,1252,1231,1232,1235,1234,1233,1229,1253,1230,1250,1248,1236,1249,1243,1244,1251,1237,1246,1239,1245,1247,1240,1241,1242,625,620,619,621,622,623,624,618,1914,1915,1913,1931,1941,1965,2079,2080,2099,2100,1905,2101,2102,2103,2104,2105,2106,2107,2081,1908,1910,1917,1926,1907,1909,1911,1912,1918,1919,1920,1922,1923,1924,1925,1966,1927,1929,1930,1967,1968,2077,1933,1935,1932,1934,1937,1938,1939,1940,1936,1942,1948,1949,1950,1951,1952,1953,1954,1955,1956,1957,1958,1959,1960,1961,1962,1963,1964,2108,1969,2078,1904,2087,1916,2083,2082,1943,2084,2085,1944,2086,1945,2088,1928,1906,1946,2096,2089,2097,2090,2091,2093,1921,1947,2094,2095,2098,2092,2245,2242,2249,2243,2240,2248,2253,2250,2251,2252,2247,2244,2241,2246,2071,1579,1580,1581,1582,1584,1583,1585,1591,1586,1588,1587,1589,1590,1592,1593,1596,1594,1595,1597,1598,1599,1600,1602,1601,1603,1604,1607,1605,1606,1608,1609,1610,1611,1626,1627,1628,1629,1612,1613,1614,1615,1621,1616,1618,1617,1619,1620,1622,1623,1624,1625,1630,1631,1632,1633,1634,1635,1636,1637,1638,1639,1640,1641,1642,1643,1644,1645,1646,1649,1647,1648,1651,1650,1655,1653,1654,1652,1656,1657,1658,1659,1660,1661,1662,1663,1664,1665,1666,1668,1667,1669,1671,1670,1672,1674,1673,1675,1676,1677,1678,1679,1680,1681,1682,1683,1684,1685,1686,1687,1688,1689,1690,1692,1691,1693,1694,1695,1696,1697,1699,1698,1700,1701,1702,1703,1704,1705,1706,1708,1707,1709,1710,1711,1712,1713,1714,1715,1716,1717,1718,1719,1720,1721,1722,1723,1728,1724,1725,1726,1727,1729,1730,1731,1733,1732,1734,1735,1736,1738,1737,1739,1740,1741,1742,1743,1744,1745,1749,1746,1747,1748,1750,1751,1752,1754,1753,1755,1756,1757,1758,1759,1760,1761,1762,1763,1765,1764,1766,1767,1769,1768,1875,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1782,1780,1781,1784,1783,1785,1786,1787,1789,1788,1790,1791,1792,1793,1794,1795,1796,1797,1798,1800,1799,1801,1802,1804,1803,1805,1806,1808,1807,1809,1811,1810,1812,1813,1814,1815,1816,1817,1818,1819,1820,1821,1822,1823,1824,1825,1826,1827,1828,1830,1829,1831,1832,1833,1834,1835,1837,1836,1838,1839,1840,1841,1842,1843,1844,1845,1846,1847,1848,1849,1850,1851,1852,1853,1854,1855,1856,1857,1858,1861,1859,1860,1862,1863,1865,1864,1866,1867,1868,1869,1870,1872,1871,1873,1874,2725,2726,2727,2728,2730,2729,2731,2737,2732,2734,2733,2735,2736,2738,2739,2742,2740,2741,2743,2744,2745,2746,2748,2747,2749,2750,2753,2751,2752,2754,2755,2756,2757,2772,2773,2774,2775,2758,2759,2760,2761,2767,2762,2764,2763,2765,2766,2768,2769,2770,2771,2776,2777,2778,2779,2780,2781,2782,2783,2784,2785,2786,2787,2788,2789,2790,2791,2792,2795,2793,2794,2797,2796,2801,2799,2800,2798,2802,2803,2804,2805,2806,2807,2808,2809,2810,2811,2812,2814,2813,2815,2817,2816,2818,2820,2819,2821,2822,2823,2824,2825,2826,2827,2828,2829,2830,2831,2832,2833,2834,2835,2836,2838,2837,2839,2840,2841,2842,2843,2845,2844,2846,2847,2848,2849,2850,2851,2852,2854,2853,2855,2856,2857,2858,2859,2860,2861,2862,2863,2864,2865,2866,2867,2868,2869,2874,2870,2871,2872,2873,2875,2876,2877,2879,2878,2880,2881,2882,2884,2883,2885,2886,2887,2888,2889,2890,2891,2895,2892,2893,2894,2896,2897,2898,2900,2899,2901,2902,2903,2904,2905,2906,2907,2908,2909,2911,2910,2912,2913,2915,2914,3021,2916,2917,2918,2919,2920,2921,2922,2923,2924,2925,2928,2926,2927,2930,2929,2931,2932,2933,2935,2934,2936,2937,2938,2939,2940,2941,2942,2943,2944,2946,2945,2947,2948,2950,2949,2951,2952,2954,2953,2955,2957,2956,2958,2959,2960,2961,2962,2963,2964,2965,2966,2967,2968,2969,2970,2971,2972,2973,2974,2976,2975,2977,2978,2979,2980,2981,2983,2982,2984,2985,2986,2987,2988,2989,2990,2991,2992,2993,2994,2995,2996,2997,2998,2999,3000,3001,3002,3003,3004,3007,3005,3006,3008,3009,3011,3010,3012,3013,3014,3015,3016,3018,3017,3019,3020,1265,1267,1271,1269,1268,1270,1266,1264,1255,1275,1317,1276,1320,1305,1316,1309,1278,1318,1306,1279,1310,1302,1272,1311,1307,1312,1308,1319,1299,1303,1304,1300,1273,1313,1314,1315,1274,1301,1338,1329,1328,1327,1323,1336,1330,1331,1325,1334,1333,1337,1332,1335,1326,212,2256,2258,2254,2255,2257,2384,2234,2235,2265,2236,2237,2266,2269,2238,2263,2267,2264,2268,2315,2314,2305,2301,2300,2304,2309,2310,2327,2312,2318,2313,2323,2324,2322,2325,2321,2270,2273,2279,2275,2281,2276,2271,2274,2272,2278,2280,2306,2328,2307,2326,2320,2317,2316,2302,2319,2303,2311,2277,2233,251,2370,2308,2383,2239,2299,2298,2372,2374,2373,2382,2369,2381,2377,2378,2376,2379,2375,2371,2368,2260,2351,2355,2338,2336,2340,2363,2352,2357,2334,2332,2342,2329,2367,2333,2361,2350,2358,2359,2365,2364,2353,2356,2339,2337,2341,2354,2343,2366,2344,2330,2349,2360,2331,2348,2335,2262,2259,2261,2293,2283,2291,2290,2287,2284,2292,2285,2286,2288,2294,2282,2289,2296,2295,2346,2347,2345,2380,1520,638,637,1518,1519,1500,636,1501,1509,1502,1504,1503,1496,1495,1505,1517,1516,634,635,1521,1498,1499,1512,1514,1513,1515,1510,1511,1506,1507,1508,1494,1493,1522,1523,1524,1525,1526,1527,1528,1529,1491,1530,1531,1532,1533,1534,1535,1536,1537,1565,1538,1539,1540,1541,1542,1543,1544,1545,1546,1547,1548,1549,1550,1551,1553,1554,1552,1555,1556,1557,1559,1558,1560,1561,1492,1562,1563,1564,1371,1370,1369,1366,1357,1354,1362,1368,1363,1365,1361,1356,1360,1359,1358,1355,1353,1367,1364,1352,1351,1344,1340,1346,1349,1341,1347,1350,1345,1343,1348,1342,319,955,956,957,958,959,960,961,962,963,1280,739,741,742,737,738,740,736,735,733,734,754,760,750,759,751,753,745,743,758,755,757,756,744,746,748,749,747,3080,3076,3078,3079,3081,1238,3083,3086,3087,1891,3089,3090,3091,3085,3084,3082,3092,3093,2122,3094,2110,2111,2109,2112,2113,2114,2115,2116,2117,2118,2119,2120,2121,3095,3096,3088,3097,3098,3099,3101,69,166,67,71,752,3103,3102,3104,70,3105,3130,3131,3106,3109,3128,3129,3119,3118,3116,3111,3124,3122,3126,3110,3123,3127,3112,3113,3125,3107,3114,3115,3117,3121,3132,3120,3108,3145,3144,3139,3141,3140,3133,3134,3136,3138,3142,3143,3135,3137,3146,3148,3147,632,633,1254,1489,1339,1372,1488,1487,651,654,655,661,659,662,663,664,665,666,667,668,669,670,671,672,658,673,674,675,676,677,678,679,680,681,682,683,687,688,689,690,691,692,684,693,685,686,694,695,696,697,698,699,701,702,703,714,704,706,705,707,761,708,709,710,711,712,713,715,648,716,717,649,645,647,652,653,700,728,763,1170,718,768,770,771,772,773,774,775,776,777,778,779,780,781,782,783,784,785,786,787,788,789,790,1149,1150,1151,1152,1153,1154,1155,1156,1157,1158,1159,1160,1161,1163,1162,1164,769,1169,1165,1166,1167,1168,719,720,657,650,721,660,646,722,723,724,725,726,762,727,644,1422,1423,1434,1432,1431,1435,1424,1425,1430,1426,1427,1428,1429,1433,1436,1464,1462,1461,1465,1459,1437,1460,1455,1456,1458,1457,1463,1421,1466,1441,1442,1443,1485,1484,1486,1419,1378,1379,1383,1384,1382,1385,1380,1381,1478,1477,1390,1386,1387,1388,1389,1438,1444,1440,1445,1449,1446,1439,1447,1448,1377,1376,1375,1373,1374,1394,1396,1395,1454,1452,1451,1450,1453,1420,1468,1472,1469,1475,1473,1470,1471,1474,1467,1476,1409,1398,1408,1404,1403,1410,1397,1399,1406,1400,1402,1405,1401,1407,1418,1416,1415,1417,1413,1414,1411,1412,1483,1481,1479,1480,1482,259,260,279,274,275,276,277,278,267,266,264,265,270,271,272,273,263,269,268,261,257,258,262,1878,2297,80,2677,2072,68,2504,2483,2580,2484,2421,2422,2423,2424,2425,2426,2427,2428,2429,2430,2431,2432,2433,2434,2435,2436,2437,2438,2439,2440,2441,2442,2444,2443,2445,2446,2447,2448,2449,2450,2451,2452,2453,2454,2455,2456,2457,2458,2459,2460,2461,2462,2463,2465,2466,2467,2464,2468,2469,2470,2471,2472,2473,2474,2475,2476,2477,2478,2479,2480,2481,2482,2485,2486,2487,2488,2489,2490,2491,2492,2493,2496,2494,2495,2419,2497,2498,2499,2500,2501,2502,2503,2505,2506,2507,2508,2510,2509,2511,2512,2513,2514,2515,2516,2517,2518,2519,2520,2522,2521,2523,2524,2525,2526,2672,2527,2528,2529,2530,2531,2532,2533,2534,2535,2536,2537,2538,2539,2540,2541,2542,2543,2544,2545,2546,2547,2548,2549,2550,2551,2552,2553,2554,2555,2556,2557,2558,2559,2560,2561,2562,2563,2564,2565,2566,2567,2568,2569,2570,2571,2572,2573,2574,2575,2576,2577,2578,2579,2581,2418,2582,2583,2584,2585,2586,2587,2588,2589,2590,2591,2592,2593,2594,2595,2596,2597,2598,2599,2600,2605,2603,2604,2602,2601,2606,2607,2608,2609,2610,2611,2612,2613,2614,2615,2616,2617,2618,2619,2620,2621,2622,2623,2624,2625,2626,2627,2628,2629,2630,2631,2632,2633,2634,2635,2636,2637,2638,2639,2640,2641,2642,2643,2644,2645,2646,2647,2648,2649,2650,2651,2652,2653,2654,2655,2656,2657,2658,2659,2660,2661,2662,2663,2664,2665,2666,2667,2420,2668,2669,2670,2671,1292,1294,1286,1285,1290,1287,1293,1288,1289,1291,1281,1283,1282,1284,2133,2207,2208,2205,2206,2211,2210,2209,2137,2139,2138,2140,2212,2213,2216,2214,2215,2184,2185,2186,2182,2183,2141,2150,2142,2144,2145,2143,2146,2147,2148,2149,2230,2163,2168,2165,2164,2166,2167,2231,2162,2170,2171,2155,2175,2161,2159,2192,2158,2157,2179,2180,2178,2181,2187,2177,2188,2191,2172,2189,2190,2173,2174,2160,2176,2169,2151,2152,2154,2153,2134,2136,2135,2193,2194,2156,2195,2204,2196,2197,2198,2200,2199,2201,2202,2203,2217,2225,2229,2226,2227,2224,2228,2223,2220,2219,2221,2218,2222,1277,1228,2414,1876,2074,1970,2076,2075,2073,1981,2047,2046,2045,1986,2002,2000,2001,1987,2070,1972,1974,1975,1976,1979,1982,1999,1977,1994,1980,1995,1998,1996,1993,1973,1978,1997,2003,1991,1985,1983,1992,1989,1988,1984,1990,2066,2060,2053,2052,2061,2062,2054,2067,2048,2049,2050,2069,2051,2055,2056,2063,2064,2065,2068,2057,2004,2058,2059,2044,2042,2043,2008,2009,2010,2011,2012,2013,2014,2015,2034,2016,2017,2018,2019,2020,2021,2041,2022,2023,2024,2039,2025,2040,2026,2037,2038,2027,2028,2029,2035,2036,2030,2031,2032,2033,2007,2006,2005,1971,1324,1259,1260,1261,1258,1263,1257,1262,1256,3100,617,643,639,641,640,642,77,222,224,181,191,182,198,183,192,171,233,235,217,216,215,238,214,241,167,169,221,225,229,174,173,195,204,178,172,168,208,207,196,165,205,175,197,206,209,184,199,179,203,202,180,194,193,185,186,188,187,189,240,190,76,219,227,231,211,170,213,218,201,200,177,176,223,220,66,75,72,73,74,226,228,230,232,245,234,244,236,237,239,242,243,210,1391,1393,1877,2691,2689,2688,2690,1322,1321,2680,1298,1297,1296,1295,1392,64,65,12,13,15,14,2,16,17,18,19,20,21,22,23,3,4,24,28,25,26,27,29,30,31,5,32,33,34,35,6,39,36,37,38,40,7,41,46,47,42,43,44,45,8,51,48,49,50,52,9,53,54,55,58,56,57,59,60,10,1,11,63,62,61,96,103,95,110,87,86,109,104,107,89,88,84,83,106,85,90,91,94,81,112,111,98,99,101,97,100,105,92,93,102,82,108,2362,964,965,969,972,970,968,966,520,330,971,967,379,510,380,513,435,441,442,443,440,521,656,425,445,449,450,451,452,401,391,400,453,454,395,456,457,386,458,462,464,466,467,468,399,461,470,471,472,474,396,475,477,434,479,480,483,484,487,493,492,495,496,497,498,501,548,522,523,524,525,526,527,528,529,530,550,531,532,533,551,534,535,536,537,538,539,552,540,541,542,543,553,544,549,545,503,504,505,506,398,507,508,387,388,511,512,514,515,516,478,840,839,791,792,793,794,795,796,797,798,802,803,804,799,800,801,805,806,807,808,809,810,811,812,813,814,815,816,817,818,819,820,821,822,823,824,825,826,827,828,829,830,831,833,832,834,835,836,837,838,841,842,843,844,845,846,847,848,849,850,851,852,853,854,855,856,857,858,859,860,861,862,863,864,865,866,873,874,867,868,869,870,871,872,875,876,877,878,879,880,881,882,883,885,884,886,887,888,889,890,891,892,900,901,898,899,902,905,906,903,904,907,909,908,910,911,912,913,893,894,895,896,914,897,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,997,998,999,1000,1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1011,1012,1013,1014,1015,1016,1017,1018,1019,1020,1021,1022,1023,1024,1025,1026,1027,1028,1029,1030,1031,1032,1033,1035,1034,1036,1042,1040,1041,1037,1038,1039,1043,1044,1045,1047,1048,1049,1046,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1101,1102,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1103,1104,1105,1107,1108,1109,1110,1111,1106,1112,1113,1114,1115,1116,1117,1118,1119,1120,1121,1122,1123,1126,1127,1128,1129,1125,1124,1130,1131,1132,1133,1134,1135,1136,1144,1137,1138,984,1139,1140,986,985,1141,1142,1143,1148,518,559,547,560,502,546,517,336,554,489,558,562,563,564,567,566,568,565,3028,403,397,371,337,364,392,426,372,415,365,347,463,346,437,355,338,446,373,340,341,423,357,555,329,616,1147,1146,1145,320,332,402,325,335,322,436,323,444,324,326,321,476,333,334,339,327,490,328,318,331,412,569,414,459,570,417,418,419,571,448,420,573,600,413,416,574,572,410,576,375,588,359,360,363,362,595,594,367,368,345,427,381,598,599,421,366,369,575,482,349,348,350,404,351,411,353,604,352,354,370,439,438,428,430,431,429,3027,432,422,433,390,389,382,394,465,383,460,469,393,473,384,405,610,356,406,611,361,607,447,605,608,409,606,407,408,596,597,374,519,488,491,342,455,343,556,557,344,561,578,481,486,591,579,592,580,581,582,583,584,585,587,593,509,586,609,589,590,499,500,424,494,385,376,577,358,615,377,378,485,602,603,601,613,614,612,940,944,991,945,992,946,948,947,949,950,951,952,953,954,974,975,976,977,978,979,939,980,981,982,988,987,989,990,993,936,973,996,983,941,934,935,943,933,930,931,942,932,938,937,994,995,297,298,317,312,313,314,315,316,305,304,302,303,308,309,310,311,301,307,306,299,295,296,300,730,731,732,1497,1490,1226,1198,766,767,1171,1173,1175,1176,1177,1178,1179,1180,1181,1182,1183,1184,1186,1185,1187,1188,1189,1190,1191,1192,1193,1194,1195,1196,1197,1199,1200,1201,1202,1203,1204,1205,1206,1207,1208,1209,1210,1211,1212,1213,1214,1215,1216,1217,1218,1219,1221,1220,1174,1172,1222,1223,1224,729,765,764,1225,286,282,291,289,290,280,294,281,626,285,283,292,293,287,627,284,628,288,629,630],"affectedFilesPendingEmit":[2676,2685,2697,248,2686,2699,2723,3024,3048,3051,3065,3068,256,252,253,254,255,631,1567,1568,1566,249,2687,2692,2693,2695,2696,1571,1575,1576,1885,1886,1887,1574,1578,2684,2705,2700,3025,1889,1890,1892,1893,1894,1895,3026,3042,1888,2724,2702,2698,3069,2712,1896,2703,2678,2694,3070,3071,3072,2701,2679,3073,2713,2714,2715,2716,1880,1881,1882,2681,1897,1898,2704,1572,1899,1883,1900,1573,1901,1902,1577,1903,2706,2124,2683,1569,2682,2129,2130,2131,2132,2708,2709,3022,3023,2710,2711,2126,2127,3074,2718,2719,2232,2385,2386,2387,1884,2388,2389,3029,3058,3043,3034,3036,3035,3049,3039,3038,3037,3041,3050,3056,3040,2391,2395,2396,2398,2399,2128,2397,2400,2401,2402,2403,2404,2405,2406,2407,2408,3044,3059,3030,2390,3031,3032,3033,3054,3055,3045,2409,2410,2411,3047,3060,3046,2720,2415,2413,3052,2412,2707,3066,3067,3057,3053,3061,3062,3063,3064,2717,2416,2417,2722,2721,2674,1879,2673,1570,2123,2125,2675,2394,2392,2393]},"version":"5.3.3"} \ No newline at end of file diff --git a/apps/landing-page/.eslintrc.cjs b/apps/landing-page/.eslintrc.cjs deleted file mode 100644 index 3221c1d0..00000000 --- a/apps/landing-page/.eslintrc.cjs +++ /dev/null @@ -1,18 +0,0 @@ -module.exports = { - root: true, - extends: [ - "plugin:react/recommended", - "plugin:react-hooks/recommended", - // Removes the requirement to import `React` when you use jsx - "plugin:react/jsx-runtime", - "plugin:tailwindcss/recommended", - // @council/eslint-config needs to be the last config extended because it includes prettier - "@council/eslint-config", - ], - rules: { - // Disable ordering in favor of prettier plugin - "tailwindcss/classnames-order": "off", - "tailwindcss/no-custom-classname": "off", - }, - ignorePatterns: ["**/*.cjs"] -}; \ No newline at end of file diff --git a/apps/landing-page/eslint.config.cjs b/apps/landing-page/eslint.config.cjs new file mode 100644 index 00000000..092408a9 --- /dev/null +++ b/apps/landing-page/eslint.config.cjs @@ -0,0 +1,28 @@ +import js from '@eslint/js' +import globals from 'globals' +import reactHooks from 'eslint-plugin-react-hooks' +import reactRefresh from 'eslint-plugin-react-refresh' +import tseslint from 'typescript-eslint' + +export default tseslint.config( + { ignores: ['dist'] }, + { + extends: [js.configs.recommended, ...tseslint.configs.recommended], + files: ['**/*.{ts,tsx}'], + languageOptions: { + ecmaVersion: 2020, + globals: globals.browser, + }, + plugins: { + 'react-hooks': reactHooks, + 'react-refresh': reactRefresh, + }, + rules: { + ...reactHooks.configs.recommended.rules, + 'react-refresh/only-export-components': [ + 'warn', + { allowConstantExport: true }, + ], + }, + }, +) diff --git a/apps/landing-page/index.html b/apps/landing-page/index.html index 4b21c29d..1df79c02 100644 --- a/apps/landing-page/index.html +++ b/apps/landing-page/index.html @@ -1,4 +1,4 @@ - + @@ -27,7 +27,11 @@ - +
diff --git a/apps/landing-page/package.json b/apps/landing-page/package.json index f015637c..dc444efa 100644 --- a/apps/landing-page/package.json +++ b/apps/landing-page/package.json @@ -9,26 +9,26 @@ "preview": "vite preview" }, "dependencies": { - "@heroicons/react": "^2.0.16", - "classnames": "^2.3.2", + "@heroicons/react": "^2.2.0", + "classnames": "^2.5.1", "react": "^18.2.0", "react-dom": "^18.2.0" }, "devDependencies": { - "@council/eslint-config": "*", - "@council/tsconfig": "*", + "@eslint/js": "^9.21.0", + "@tailwindcss/vite": "^4.0.12", "@types/react": "^18.2.57", "@types/react-dom": "^18.2.19", - "@vitejs/plugin-react": "^4.2.1", - "autoprefixer": "^10.4.17", - "eslint": "^8.56.0", - "eslint-plugin-react": "^7.33.2", - "eslint-plugin-react-hooks": "^4.6.0", - "eslint-plugin-tailwindcss": "^3.14.3", - "postcss": "^8.4.35", - "tailwindcss": "^3.4.1", - "typescript": "^5.3.3", - "vite": "^5.1.4", - "vite-tsconfig-paths": "^4.3.1" + "@vitejs/plugin-react": "^4.3.4", + "eslint": "^9.21.0", + "eslint-plugin-react-hooks": "^5.1.0", + "eslint-plugin-react-refresh": "^0.4.19", + "eslint-plugin-tailwindcss": "^3.18.0", + "globals": "^15.15.0", + "tailwindcss": "^4.0.12", + "typescript": "~5.7.2", + "typescript-eslint": "^8.24.1", + "vite": "^6.2.0", + "vite-tsconfig-paths": "^5.1.4" } } diff --git a/apps/landing-page/postcss.config.cjs b/apps/landing-page/postcss.config.cjs deleted file mode 100644 index 33ad091d..00000000 --- a/apps/landing-page/postcss.config.cjs +++ /dev/null @@ -1,6 +0,0 @@ -module.exports = { - plugins: { - tailwindcss: {}, - autoprefixer: {}, - }, -} diff --git a/apps/landing-page/src/@types/cfonts/index.d.ts b/apps/landing-page/src/@types/cfonts/index.d.ts deleted file mode 100644 index 195b078c..00000000 --- a/apps/landing-page/src/@types/cfonts/index.d.ts +++ /dev/null @@ -1,141 +0,0 @@ -//https://github.com/dominikwilkowski/cfonts/blob/released/nodejs/src/Options.js -// https://github.com/dominikwilkowski/cfonts/blob/released/nodejs/src/constants.js -/* eslint-disable */ -declare module "cfonts" { - type GradientColor = - | "transparent" - | "black" - | "red" - | "green" - | "yellow" - | "blue" - | "magenta" - | "cyan" - | "white" - | "gray" - | "grey"; - - export function say( - msg: string, - options?: { - /** - * define the font face - */ - font?: - | "console" - | "block" - | "simpleBlock" - | "simple" - | "3d" - | "simple3d" - | "chrome" - | "huge" - | "shade" - | "slick" - | "grid" - | "pallet" - | "tiny"; - - /** - * define text alignment - */ - align?: "left" | "center" | "right" | "top" | "bottom"; - - /** - * define all colors - */ - colors?: ( - | "system" - | "black" - | "red" - | "green" - | "yellow" - | "blue" - | "magenta" - | "cyan" - | "white" - | "gray" - | "redBright" - | "greenBright" - | "yellowBright" - | "blueBright" - | "magentaBright" - | "cyanBright" - | "whiteBright" - )[]; - - /** - * define the background color, you can also use `backgroundColor` here as - * key - */ - background?: ( - | "transparent" - | "black" - | "red" - | "green" - | "yellow" - | "blue" - | "magenta" - | "cyan" - | "white" - | "blackBright" - | "redBright" - | "greenBright" - | "yellowBright" - | "blueBright" - | "magentaBright" - | "cyanBright" - | "whiteBright" - )[]; - - /** - * define letter spacing - * @default 1 - */ - letterSpacing?: number; - - /** - * define the line height - * @default 1 - */ - lineHeight?: number; - - /** - * define if the output text should have empty lines on top and on the - * bottom - * @default true - */ - space?: boolean; - - /** - * define how many character can be on one line - * @default 0 - */ - maxLength?: number; - - /** - * define your two gradient colors - * @default false - */ - gradient?: false | [GradientColor, GradientColor] | [string, string]; - - /** - * define if you want to recalculate the gradient for each new line - * @default false - */ - independentGradient?: boolean; - - /** - * define if this is a transition between colors directly - * @default false - */ - transitionGradient?: boolean; - - /** - * define the environment cfonts is being executed in - * @default "node" - */ - env?: "node" | "browser"; - }, - ): void; -} diff --git a/apps/landing-page/src/index.css b/apps/landing-page/src/index.css index 826e9463..01400e6d 100644 --- a/apps/landing-page/src/index.css +++ b/apps/landing-page/src/index.css @@ -1,24 +1,30 @@ -@import url('https://fonts.googleapis.com/css2?family=Rubik:ital,wght@0,300;0,400;0,500;0,600;0,700;1,400&display=swap'); +@import url("https://fonts.googleapis.com/css2?family=Rubik:ital,wght@0,300;0,400;0,500;0,600;0,700;1,400&display=swap"); +@import "tailwindcss"; -@tailwind base; -@tailwind components; -@tailwind utilities; +@theme { + --color-primary: #5e53bf; + --color-primary-hover: #473da4; + --color-primary-dim: #554cad; + --color-primary-20: rgba(183, 176, 244, 0.2); + --color-primary-text: #9f95f5; + --color-primary-text-light: #b7b0f4; + --color-primary-white: #e1deff; + --color-dark: #120f1b; + --color-black: #0c0916; +} :root { - font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; + font-family: "Rubik", system-ui, Avenir, Helvetica, Arial, sans-serif; line-height: 1.5; - font-weight: 400; + font-weight: 100; font-synthesis: none; text-rendering: optimizeLegibility; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; - -webkit-text-size-adjust: 100%; - font-family: 'Rubik', sans-serif; - font-weight: 100; } body { - @apply bg-dark + background-color: var(--color-dark); } a { diff --git a/apps/landing-page/src/main.tsx b/apps/landing-page/src/main.tsx index 8b1ddb97..c2a145c6 100644 --- a/apps/landing-page/src/main.tsx +++ b/apps/landing-page/src/main.tsx @@ -1,10 +1,10 @@ -import React from "react"; -import ReactDOM from "react-dom/client"; +import { StrictMode } from "react"; +import { createRoot } from "react-dom/client"; import App from "./App"; import "./index.css"; -ReactDOM.createRoot(document.getElementById("root") as HTMLElement).render( - +createRoot(document.getElementById("root")!).render( + - , + , ); diff --git a/apps/landing-page/tailwind.config.cjs b/apps/landing-page/tailwind.config.cjs deleted file mode 100644 index e7fdcd2b..00000000 --- a/apps/landing-page/tailwind.config.cjs +++ /dev/null @@ -1,20 +0,0 @@ -/** @type {import('tailwindcss').Config} */ -module.exports = { - content: ["./src/**/*.{js,ts,jsx,tsx}"], - theme: { - extend: { - colors: { - primary: "#5E53BF", - "primary-hover": "#473DA4", - "primary-dim": "#554CAD", - "primary-20": "rgba(183, 176, 244, .2)", - "primary-text": "#9F95F5", - "primary-text-light": "#B7B0F4", - "primary-white": "#E1DEFF", - dark: "#120F1B", - black: "#0C0916", - }, - }, - }, - plugins: [], -}; diff --git a/apps/landing-page/tsconfig.app.json b/apps/landing-page/tsconfig.app.json new file mode 100644 index 00000000..dfb1c252 --- /dev/null +++ b/apps/landing-page/tsconfig.app.json @@ -0,0 +1,32 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", + "target": "ES2020", + "useDefineForClassFields": true, + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + "resolveJsonModule": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "isolatedModules": true, + "moduleDetection": "force", + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true, + + /* Path aliases */ + "paths": { + "src/*": ["./src/*"] + } + }, + "include": ["src"] +} diff --git a/apps/landing-page/tsconfig.json b/apps/landing-page/tsconfig.json index 6c2e7e38..1ffef600 100644 --- a/apps/landing-page/tsconfig.json +++ b/apps/landing-page/tsconfig.json @@ -1,27 +1,7 @@ { - "extends": "@council/tsconfig/base.json", - "include": ["src"], - "references": [{ "path": "./tsconfig.node.json" }], - "compilerOptions": { - "target": "ESNext", - "useDefineForClassFields": true, - "lib": ["DOM", "DOM.Iterable", "ESNext"], - "allowJs": false, - "skipLibCheck": true, - "esModuleInterop": false, - "allowSyntheticDefaultImports": true, - "strict": true, - "forceConsistentCasingInFileNames": true, - "module": "ESNext", - "moduleResolution": "Node", - "resolveJsonModule": true, - "isolatedModules": true, - "noEmit": true, - "jsx": "react-jsx", - "rootDir": ".", - "baseUrl": ".", - "paths": { - "src/*": ["./src/*"] - } - } + "files": [], + "references": [ + { "path": "./tsconfig.app.json" }, + { "path": "./tsconfig.node.json" } + ] } diff --git a/apps/landing-page/tsconfig.node.json b/apps/landing-page/tsconfig.node.json index 9d31e2ae..db0becc8 100644 --- a/apps/landing-page/tsconfig.node.json +++ b/apps/landing-page/tsconfig.node.json @@ -1,9 +1,24 @@ { "compilerOptions": { - "composite": true, + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", + "target": "ES2022", + "lib": ["ES2023"], "module": "ESNext", - "moduleResolution": "Node", - "allowSyntheticDefaultImports": true + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "isolatedModules": true, + "moduleDetection": "force", + "noEmit": true, + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true }, "include": ["vite.config.ts"] } diff --git a/apps/landing-page/vite.config.ts b/apps/landing-page/vite.config.ts index 6b8c6922..b937970c 100644 --- a/apps/landing-page/vite.config.ts +++ b/apps/landing-page/vite.config.ts @@ -1,8 +1,9 @@ +import tailwindcss from "@tailwindcss/vite"; import react from "@vitejs/plugin-react"; import { defineConfig } from "vite"; import tsconfigPaths from "vite-tsconfig-paths"; -// https://vitejs.dev/config/ +// https://vite.dev/config/ export default defineConfig({ - plugins: [react(), tsconfigPaths()], + plugins: [tailwindcss(), react(), tsconfigPaths()], }); diff --git a/apps/sandbox/.env.example b/apps/sandbox/.env.example new file mode 100644 index 00000000..b4a7ea2d --- /dev/null +++ b/apps/sandbox/.env.example @@ -0,0 +1,2 @@ +RPC_URL=http://127.0.0.1:8545 +WALLET_PRIVATE_KEY=0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 # Hardhat/Anvil account #0 \ No newline at end of file diff --git a/apps/council-sdk-starter/.eslintignore b/apps/sandbox/.eslintignore similarity index 100% rename from apps/council-sdk-starter/.eslintignore rename to apps/sandbox/.eslintignore diff --git a/apps/council-sdk-starter/.eslintrc b/apps/sandbox/.eslintrc similarity index 100% rename from apps/council-sdk-starter/.eslintrc rename to apps/sandbox/.eslintrc diff --git a/apps/council-sdk-starter/.gitignore b/apps/sandbox/.gitignore similarity index 100% rename from apps/council-sdk-starter/.gitignore rename to apps/sandbox/.gitignore diff --git a/apps/council-sdk-starter/CHANGELOG.md b/apps/sandbox/CHANGELOG.md similarity index 100% rename from apps/council-sdk-starter/CHANGELOG.md rename to apps/sandbox/CHANGELOG.md diff --git a/apps/sandbox/README.md b/apps/sandbox/README.md new file mode 100644 index 00000000..e9a76229 --- /dev/null +++ b/apps/sandbox/README.md @@ -0,0 +1,28 @@ +# Council Kit Sandbox + +A sandbox to try out [Council Kit packages](../../packages). + +## Getting started + +### Environment + +Create your own `.env` using [`.env.example`](.env.example) for reference. + +### Running + +Edit the code in [`src/sandbox.ts`](src/sandbox.ts) then run: + +```bash +yarn workspace sandbox dev + +# or to run on save: +yarn workspace sandbox watch +``` + +Example scripts can be found in [`src/scripts`](src/scripts). Each one has a corresponding [package.json](package.json) script to run it. + +For example: + +```bash +yarn workspace sandbox getProposalResults +``` diff --git a/apps/sandbox/package.json b/apps/sandbox/package.json new file mode 100644 index 00000000..b6bd18ca --- /dev/null +++ b/apps/sandbox/package.json @@ -0,0 +1,32 @@ +{ + "name": "sandbox", + "version": "0.0.4", + "description": "Boilerplate to get started using council-js fast!", + "license": "MIT", + "private": true, + "type": "module", + "scripts": { + "dev": "tsx -r dotenv/config src/sandbox.ts", + "watch": "tsx -r dotenv/config --watch src/sandbox.ts", + "changeVaultStatus": "tsx -r dotenv/config src/scripts/changeVaultStatus.ts", + "createProposal": "tsx -r dotenv/config src/scripts/createProposal.ts", + "executeProposal": "tsx -r dotenv/config src/scripts/executeProposal.ts", + "getGscMembers": "tsx -r dotenv/config src/scripts/getGscMembers.ts", + "getProposalResults": "tsx -r dotenv/config src/scripts/getProposalResults.ts", + "setLockDuration": "tsx -r dotenv/config src/scripts/setLockDuration.ts", + "typecheck": "tsc --noEmit" + }, + "dependencies": { + "@delvtech/drift": "^0.6.0", + "@delvtech/drift-viem": "^0.6.0", + "@delvtech/fixed-point-wasm": "^0.0.8", + "@delvtech/council-js": "^0.0.0", + "viem": "^2.23.7" + }, + "devDependencies": { + "@types/node": "^22.13.1", + "dotenv": "^16.4.5", + "tsx": "^4.19.2", + "typescript": "^5.3.3" + } +} diff --git a/apps/sandbox/src/client.ts b/apps/sandbox/src/client.ts new file mode 100644 index 00000000..76c686ee --- /dev/null +++ b/apps/sandbox/src/client.ts @@ -0,0 +1,32 @@ +import { createCouncil } from "@delvtech/council-js"; +import { viemAdapter } from "@delvtech/drift-viem"; +import { + createPublicClient, + createWalletClient, + http, + type Address, + type PublicClient, + type WalletClient, +} from "viem"; +import { privateKeyToAccount } from "viem/accounts"; +import { anvil } from "viem/chains"; + +export const publicClient: PublicClient = createPublicClient({ + transport: http(process.env.RPC_URL), + chain: anvil, +}); +export let walletClient: WalletClient | undefined; + +if (process.env.WALLET_PRIVATE_KEY) { + walletClient = createWalletClient({ + account: privateKeyToAccount(process.env.WALLET_PRIVATE_KEY as Address), + transport: http(process.env.RPC_URL), + chain: anvil, + }); +} + +export const council = createCouncil({ + adapter: viemAdapter({ publicClient, walletClient }), +}); + +export const drift = council.drift; diff --git a/apps/sandbox/src/sandbox.ts b/apps/sandbox/src/sandbox.ts new file mode 100644 index 00000000..7bf7f68a --- /dev/null +++ b/apps/sandbox/src/sandbox.ts @@ -0,0 +1,55 @@ +import { ReadWriteCouncil } from "@delvtech/council-js"; +import { council, drift } from "src/client"; + +if (!(council instanceof ReadWriteCouncil)) { + throw new Error("Missing WALLET_PRIVATE_KEY environment variable."); +} + +const DAY_IN_BLOCKS = 6496n; +const lockDuration = DAY_IN_BLOCKS * 3n; +const extraVoteTime = DAY_IN_BLOCKS * 5n; + +const coreVoting = council.coreVoting( + "0xa513e6e4b8f2a923d98304ec87f64353c4d5c853", +); + +const callData = coreVoting.contract.encodeFunctionData("changeVaultStatus", { + vault: "0x0dcd1bf9a1b36ce34237eeafef220932846bcd82", + isValid: true, +}); + +const currentBlock = await drift.getBlockNumber(); +console.log( + "Current block:", + currentBlock + lockDuration + extraVoteTime + 10n, +); + +const hash = await coreVoting.createProposal({ + args: { + targets: [coreVoting.contract.address], + votingVaults: ["0x8a791620dd6260079bf849dc5567adc3f2fdc318"], + calldatas: [callData], + ballot: "yes", + lastCallBlock: currentBlock + lockDuration + extraVoteTime + 10n, + }, + options: { + onMined: (receipt) => { + console.log("Transaction receipt:", receipt); + }, + }, +}); + +// const hash = await coreVoting.executeProposal({ +// args: { +// proposalId: 0n, +// calldatas: [callData], +// targets: [coreVoting.contract.address], +// }, +// options: { +// onMined: (receipt) => { +// console.log("Transaction receipt:", receipt); +// }, +// }, +// }); + +console.log("Transaction submitted:", hash); diff --git a/apps/sandbox/src/scripts/changeVaultStatus.ts b/apps/sandbox/src/scripts/changeVaultStatus.ts new file mode 100644 index 00000000..bfbc61ef --- /dev/null +++ b/apps/sandbox/src/scripts/changeVaultStatus.ts @@ -0,0 +1,24 @@ +import { ReadWriteCouncil } from "@delvtech/council-js"; +import { council } from "src/client"; + +if (!(council instanceof ReadWriteCouncil)) { + throw new Error("Missing WALLET_PRIVATE_KEY environment variable."); +} + +const coreVoting = council.coreVoting("0x"); // <-- replace address + +const hash = await coreVoting.changeVaultStatus({ + args: { + vault: "0x", // <-- replace address + isValid: true, + }, + options: { + onMined: (receipt) => { + console.log("Transaction receipt:", receipt); + }, + }, +}); + +console.log("Transaction submitted:", hash); + +process.exit(); diff --git a/apps/sandbox/src/scripts/createProposal.ts b/apps/sandbox/src/scripts/createProposal.ts new file mode 100644 index 00000000..8b44322b --- /dev/null +++ b/apps/sandbox/src/scripts/createProposal.ts @@ -0,0 +1,62 @@ +import { ReadWriteCouncil } from "@delvtech/council-js"; +import { council, publicClient, walletClient } from "src/client"; +import type { Address } from "viem"; + +const DAY_SECONDS = 24n * 60n * 60n; +const DAY_BLOCKS = DAY_SECONDS / 12n; // Assuming 12s block time + +if (!(council instanceof ReadWriteCouncil)) { + throw new Error("Missing WALLET_PRIVATE_KEY environment variable."); +} + +const coreVoting = council.coreVoting("0x"); // <-- replace address +const walletAddress = walletClient?.account?.address; + +if (!walletAddress) { + throw Error("Missing private key"); +} + +// the vaults from which power will be drawn for the initial ballot +let votingVaults: Address[] = ["0x", "0x"]; // <-- replace addresses + +// Trying to create a proposal with vaults you have no power in will throw an +// uninitialized error. +const vaultPowers = await Promise.all( + votingVaults.map((vault) => + council.votingVault(vault).getVotingPower({ voter: walletAddress }), + ), +); +votingVaults = votingVaults.filter((_, i) => vaultPowers[i] > 0n); + +// The contracts to call in the proposal +const targets = [coreVoting.address]; + +// The data to send in the contract calls +const calldatas = [ + coreVoting.contract.encodeFunctionData("setDefaultQuorum", { quorum: 100n }), +]; + +const currentBlock = await publicClient.getBlockNumber(); + +const hash = await coreVoting.createProposal({ + args: { + targets, + calldatas, + votingVaults, + + // the ballot to cast for the first vote + ballot: "yes", + + // the block number after which the proposal can no longer be executed + lastCallBlock: currentBlock + 14n * DAY_BLOCKS, + }, + options: { + onMined: (receipt) => { + console.log("Transaction receipt:", receipt); + }, + }, +}); + +console.log("Transaction submitted:", hash); + +process.exit(); diff --git a/apps/sandbox/src/scripts/executeProposal.ts b/apps/sandbox/src/scripts/executeProposal.ts new file mode 100644 index 00000000..397dfbaf --- /dev/null +++ b/apps/sandbox/src/scripts/executeProposal.ts @@ -0,0 +1,27 @@ +import { ReadWriteCouncil } from "@delvtech/council-js"; +import { council } from "src/client"; + +if (!(council instanceof ReadWriteCouncil)) { + throw new Error("Missing WALLET_PRIVATE_KEY environment variable."); +} + +const coreVoting = council.coreVoting("0x"); // <-- replace with the CoreVoting contract address + +// get the proposal to be executed +const hash = await coreVoting.executeProposal({ + args: { + proposalId: 0n, // <-- replace with the proposal ID + + // These will be fetched from the creation transaction if not provided. + // targets: ["0x"], // <-- replace with the contract addresses (optional) + // calldatas: ["0x"], // <-- replace with the execution calldata (optional) + }, + options: { + onMined: (receipt) => { + console.log("Transaction receipt:", receipt); + }, + }, +}); +console.log("Transaction submitted:", hash); + +process.exit(); diff --git a/apps/sandbox/src/scripts/getGscMembers.ts b/apps/sandbox/src/scripts/getGscMembers.ts new file mode 100644 index 00000000..a6d5c9d6 --- /dev/null +++ b/apps/sandbox/src/scripts/getGscMembers.ts @@ -0,0 +1,36 @@ +import { fixed } from "@delvtech/fixed-point-wasm"; +import { council } from "src/client"; + +const gscVault = council.gscVault("0x"); // <-- replace address + +// get all members +const members = await gscVault.getMembers(); + +// create an array of member stat objects +const memberStats = await Promise.all( + members.map(async (member) => { + console.log("fetching", member); + + const [joinDate, qualifyingVaults] = await Promise.all([ + gscVault.getJoinDate(member), + gscVault.getMemberVaults(member), + ]); + + // get the voting vaults that were used to prove the member meets the + // minimum voting power requirement + const votingPowers = await Promise.all( + qualifyingVaults.map((vault) => vault.getVotingPower({ voter: member })), + ); + const totalVotingPower = votingPowers.reduce((a, b) => a + b, 0n); + + return { + member, + joinDate, + votingPower: fixed(totalVotingPower).format(), + }; + }), +); + +console.table(memberStats); + +process.exit(); diff --git a/apps/sandbox/src/scripts/getProposalResults.ts b/apps/sandbox/src/scripts/getProposalResults.ts new file mode 100644 index 00000000..992123ef --- /dev/null +++ b/apps/sandbox/src/scripts/getProposalResults.ts @@ -0,0 +1,34 @@ +import { fixed } from "@delvtech/fixed-point-wasm"; +import { council } from "src/client"; + +const coreVoting = council.coreVoting("0x"); // <-- replace address + +// get all proposals +const proposals = await coreVoting.getProposalCreations(); + +// get results for all proposals and key them by id in a new object +const resultsByProposalId: { + [proposalId: number]: { + yes: string; + no: string; + maybe: string; + total: string; + }; +} = {}; + +await Promise.all( + proposals.map(async ({ proposalId }) => { + const results = await coreVoting.getProposalVotingPower(proposalId); + + resultsByProposalId[Number(proposalId)] = { + yes: fixed(results.yes).format(), + no: fixed(results.no).format(), + maybe: fixed(results.maybe).format(), + total: fixed(results.total).format(), + }; + }), +); + +console.table(resultsByProposalId); + +process.exit(); diff --git a/apps/sandbox/src/scripts/setLockDuration.ts b/apps/sandbox/src/scripts/setLockDuration.ts new file mode 100644 index 00000000..6cfa2ab4 --- /dev/null +++ b/apps/sandbox/src/scripts/setLockDuration.ts @@ -0,0 +1,23 @@ +import { ReadWriteCouncil } from "@delvtech/council-js"; +import { council } from "src/client"; + +if (!(council instanceof ReadWriteCouncil)) { + throw new Error("Missing WALLET_PRIVATE_KEY environment variable."); +} + +const coreVoting = council.coreVoting("0x"); // <-- replace address + +const hash = await coreVoting.setLockDuration({ + args: { + blocks: 0n, // <-- replace with the number of blocks to lock + }, + options: { + onMined: (receipt) => { + console.log("Transaction receipt:", receipt); + }, + }, +}); + +console.log("Transaction submitted:", hash); + +process.exit(); diff --git a/apps/sandbox/tsconfig.json b/apps/sandbox/tsconfig.json new file mode 100644 index 00000000..90e7488f --- /dev/null +++ b/apps/sandbox/tsconfig.json @@ -0,0 +1,19 @@ +{ + "include": ["src"], + "compilerOptions": { + "rootDir": ".", + "baseUrl": ".", + "lib": ["ESNext", "DOM"], + "target": "ESNext", + "module": "ESNext", + "moduleResolution": "bundler", + "moduleDetection": "force", + "resolveJsonModule": true, + "allowJs": true, + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "noEmit": true, + "strict": true, + "skipLibCheck": true + } +} diff --git a/package.json b/package.json index 4637ba74..f81d61a0 100644 --- a/package.json +++ b/package.json @@ -8,6 +8,8 @@ "packages/*" ], "scripts": { + "deploy": " yarn council deploy simple -y --out-dir=../../apps/council-ui/src/deployments", + "council": "yarn workspace @delvtech/council-cli prod", "build": "turbo run build", "build:packages": "turbo run build --filter=./packages/*", "dev": "turbo run dev --parallel --filter=./apps/*", @@ -15,36 +17,17 @@ "format": "turbo run format", "format:check": "turbo run format:check", "typecheck": "turbo run typecheck", - "postinstall": "husky install", "test": "turbo test", - "release": "turbo build && changeset publish" + "reset-node-modules": "find . -name 'node_modules' -type d -prune -exec rm -rf '{}' + && yarn cache clean && yarn", + "release": "yarn build:packages && changeset publish" }, "devDependencies": { - "@changesets/cli": "^2.27.1", + "@changesets/cli": "^2.27.2", "eslint": "^8.56.0", - "husky": "^8.0.1", - "lint-staged": "^13.0.3", - "os-browserify": "^0.3.0", - "prettier": "^3.2.5", - "prettier-plugin-organize-imports": "^3.2.4", - "prettier-plugin-tailwindcss": "^0.5.11", - "turbo": "latest" - }, - "lint-staged": { - "{apps,packages}/**/*.{gql,graphql,js,jsx,ts,tsx,json}": [ - "eslint --fix", - "prettier --write" - ] - }, - "resolutions": { - "react": "18.2.0", - "react-dom": "18.2.0", - "@types/react": "18.2.57", - "prettier": "^3.2.5", - "prettier-plugin-organize-imports": "^3.2.4", - "prettier-plugin-tailwindcss": "^0.5.11", - "viem": "^2.16.2", - "wagmi": "^2.5.7" + "prettier": "^3.4.2", + "prettier-plugin-organize-imports": "^4.1.0", + "prettier-plugin-tailwindcss": "^0.6.11", + "turbo": "^2.4.2" }, "engines": { "node": ">=18.0.0" diff --git a/packages/.eslintrc b/packages/.eslintrc deleted file mode 100644 index bfe638b3..00000000 --- a/packages/.eslintrc +++ /dev/null @@ -1,5 +0,0 @@ -{ - // fallback eslint config to prevent lint-staged from failing when packages - // don't contain an eslint config. Instead, we'll just ignore them. - "ignorePatterns": ["**/*"] -} diff --git a/packages/council-artifacts/package.json b/packages/council-artifacts/package.json index ad2a40a3..b073916c 100644 --- a/packages/council-artifacts/package.json +++ b/packages/council-artifacts/package.json @@ -25,7 +25,7 @@ "devDependencies": { "@council/eslint-config": "*", "@council/tsconfig": "*", - "typescript": "^5.3.3" + "typescript": "^5.8.2" }, "publishConfig": { "access": "public" diff --git a/packages/council-cli/.env.example b/packages/council-cli/.env.example index 6d7be679..0ff2dabb 100644 --- a/packages/council-cli/.env.example +++ b/packages/council-cli/.env.example @@ -1,4 +1,28 @@ -RPC_URL= - # For signing transactions -WALLET_PRIVATE_KEY= \ No newline at end of file +WALLET_PRIVATE_KEY=0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 + +# Default config # + +# Network +CHAIN=anvil +RPC_URL=http://127.0.0.1:8545/ +FORK_CHAIN=mainnet +FORK_URL= + +# Deployments +DEPLOYMENTS_DIR="./deployments" +BASE_QUORUM=1000000.0 +EXTRA_VOTING_BLOCKS = +GSC_EXTRA_VOTING_BLOCKS = +GSC_IDLE_DURATION = +GSC_LOCK_DURATION = +GSC_QUORUM=3.0 +GSC_VOTING_POWER_BOUND=100000.0 +LOCK_DURATION = +MIN_PROPOSAL_POWER=25000.0 +STALE_BLOCK_LAG=259200.0 +TIMELOCK_WAIT_TIME=21600.0 +TREASURY_ADDRESS = +VOTING_TOKEN_ADDRESS = +VOTING_TOKEN_NAME=Mock Voting Token +VOTING_TOKEN_SYMBOL=MVT diff --git a/packages/council-cli/.gitignore b/packages/council-cli/.gitignore index f517cae6..1add2e22 100644 --- a/packages/council-cli/.gitignore +++ b/packages/council-cli/.gitignore @@ -1,4 +1,6 @@ dist .env coverage -deployments \ No newline at end of file +deployments +cache +council-cli.json diff --git a/packages/council-cli/hardhat.config.cjs b/packages/council-cli/hardhat.config.cjs index b86b01ec..ea457377 100644 --- a/packages/council-cli/hardhat.config.cjs +++ b/packages/council-cli/hardhat.config.cjs @@ -3,7 +3,7 @@ module.exports = { solidity: { compilers: [ { - version: "0.8.3", + version: "0.8.24", settings: { optimizer: { enabled: true, diff --git a/packages/council-cli/merkle-rewards/sample-accounts.json b/packages/council-cli/merkle-rewards/sample-input.json similarity index 100% rename from packages/council-cli/merkle-rewards/sample-accounts.json rename to packages/council-cli/merkle-rewards/sample-input.json diff --git a/packages/council-cli/package.json b/packages/council-cli/package.json index 6c848956..71c95ffc 100644 --- a/packages/council-cli/package.json +++ b/packages/council-cli/package.json @@ -12,15 +12,17 @@ ], "scripts": { "council": "node dist/council.js", - "dev": "NODE_ENV=development tesm-node src/council.ts", - "prod": "tesm-node src/council.ts", + "dev": "NODE_ENV=development tsx src/council.ts", + "dev:watch": "NODE_ENV=development tsx --watch src/council.ts", + "prod": "tsx src/council.ts", + "prod:watch": "tsx --watch src/council.ts", "build": "rimraf dist && tsc", "watch": "tsc --watch", "typecheck": "tsc --noEmit" }, "peerDependencies": { - "viem": ">=2", - "hardhat": ">=2" + "hardhat": ">=2", + "viem": ">=2" }, "peerDependenciesMeta": { "hardhat": { @@ -29,32 +31,31 @@ }, "dependencies": { "@delvtech/council-artifacts": "^0.1.0", - "@delvtech/council-viem": "^0.1.0", - "ajv": "^8.12.0", - "cfonts": "^3.2.0", - "cli-table": "^0.3.11", - "clide-js": "^0.2.0", - "clide-plugin-command-menu": "^0.1.0", + "@delvtech/council-js": "^0.0.0", + "@delvtech/drift": "^0.6.0", + "@delvtech/drift-viem": "^0.6.0", + "@delvtech/fixed-point-wasm": "^0.0.8", + "ajv": "^8.17.1", + "clide-js": "^0.2.14-next.5", + "clide-plugin-command-menu": "^0.1.2-next.0", "colors": "^1.4.0", - "dotenv": "^16.4.5", + "dotenv": "^16.4.7", "json-schema-typed": "^8.0.1", - "merkletreejs": "^0.3.11", - "node-fetch-native": "^1.6.2", - "signale": "^1.4.0" + "merkletreejs": "^0.5.1", + "signale": "^1.4.0", + "zod": "^3.24.2", + "zod-validation-error": "^3.4.0" }, "devDependencies": { "@council/eslint-config": "*", "@council/tsconfig": "*", - "@types/cli-table": "^0.3.4", - "@types/node": "^20.11.19", - "@types/prompts": "^2.4.9", + "@types/node": "^22.13.1", "@types/signale": "^1.4.7", - "hardhat": "^2.20.1", - "rimraf": "^5.0.5", - "tesm-node": "^1.3.1", - "ts-node": "^10.9.2", - "typescript": "^5.3.3", - "viem": "^2.16.2" + "hardhat": "^2.22.19", + "rimraf": "^6.0.1", + "tsx": "^4.19.3", + "typescript": "^5.8.2", + "viem": "^2.23.7" }, "publishConfig": { "access": "public" diff --git a/packages/council-cli/src/commands/config.ts b/packages/council-cli/src/commands/config.ts index 590c5fcc..4caaa126 100644 --- a/packages/council-cli/src/commands/config.ts +++ b/packages/council-cli/src/commands/config.ts @@ -1,6 +1,5 @@ -import { command, passThroughCommand } from "clide-js"; +import { command } from "clide-js"; export default command({ - ...passThroughCommand, description: "Manage configuration options for the Council CLI", }); diff --git a/packages/council-cli/src/commands/config/delete.ts b/packages/council-cli/src/commands/config/delete.ts new file mode 100644 index 00000000..4378ecf9 --- /dev/null +++ b/packages/council-cli/src/commands/config/delete.ts @@ -0,0 +1,21 @@ +import { command } from "clide-js"; +import signale from "signale"; +import { config, Config, settings } from "../../config.js"; + +export default command({ + description: "Delete a setting", + options: { + s: { + alias: ["settings"], + type: "array", + description: "The setting to change", + required: true, + choices: settings, + }, + }, + handler: async ({ options }) => { + const settings = await options.settings(); + config.delete(...(settings as (keyof Config)[])); + signale.success(`Deleted settings: ${settings.join(", ")}`); + }, +}); diff --git a/packages/council-cli/src/commands/config/delete/[...settings].ts b/packages/council-cli/src/commands/config/delete/[...settings].ts deleted file mode 100644 index d9d4a762..00000000 --- a/packages/council-cli/src/commands/config/delete/[...settings].ts +++ /dev/null @@ -1,14 +0,0 @@ -import { command } from "clide-js"; -import signale from "signale"; -import { config, CouncilCliConfig } from "../../../config.js"; - -export default command({ - description: "Delete a setting", - handler: ({ params }) => { - const { settings } = params as { - settings: (keyof CouncilCliConfig)[]; - }; - config.delete(...settings); - signale.success(`Deleted settings: ${settings.join(", ")}`); - }, -}); diff --git a/packages/council-cli/src/commands/config/get.ts b/packages/council-cli/src/commands/config/get.ts new file mode 100644 index 00000000..62d6075f --- /dev/null +++ b/packages/council-cli/src/commands/config/get.ts @@ -0,0 +1,22 @@ +import { command } from "clide-js"; +import signale from "signale"; +import { Config, config, settings } from "../../config.js"; + +export default command({ + description: "Get a setting", + options: { + s: { + alias: ["setting"], + type: "string", + description: "The setting to change", + required: true, + choices: settings, + }, + }, + handler: async ({ options, next }) => { + const setting = await options.setting(); + const value = config.get(setting as keyof Config); + signale.info(value); + next(value); + }, +}); diff --git a/packages/council-cli/src/commands/config/get/[setting].ts b/packages/council-cli/src/commands/config/get/[setting].ts deleted file mode 100644 index 6a9ac041..00000000 --- a/packages/council-cli/src/commands/config/get/[setting].ts +++ /dev/null @@ -1,15 +0,0 @@ -import { command } from "clide-js"; -import signale from "signale"; -import { CouncilCliConfig, config } from "../../../config.js"; - -export default command({ - description: "Get a setting", - handler: ({ params, next }) => { - const { setting } = params as { - setting: keyof CouncilCliConfig; - }; - const value = config.get(setting as keyof CouncilCliConfig); - signale.info(value); - next(value); - }, -}); diff --git a/packages/council-cli/src/commands/config/inspect.ts b/packages/council-cli/src/commands/config/inspect.ts index eae08367..354530ed 100644 --- a/packages/council-cli/src/commands/config/inspect.ts +++ b/packages/council-cli/src/commands/config/inspect.ts @@ -1,16 +1,9 @@ -import Table from "cli-table"; import { command } from "clide-js"; import { config } from "../../config.js"; export default command({ description: "Print all settings out as a table", handler: () => { - const data = config.data; - const table = new Table({ - rows: Object.entries(data).filter( - ([_, value]: unknown[]) => value !== undefined, - ), - }); - console.log(table.toString()); + console.table(config.data()); }, }); diff --git a/packages/council-cli/src/commands/config/reset.ts b/packages/council-cli/src/commands/config/reset.ts index 11118c13..068dc4f2 100644 --- a/packages/council-cli/src/commands/config/reset.ts +++ b/packages/council-cli/src/commands/config/reset.ts @@ -1,7 +1,26 @@ import { command } from "clide-js"; +import signale from "signale"; import { config } from "../../config.js"; export default command({ - description: "Reset settings to default", - handler: () => config.reset(), + description: "Reset all settings to default", + options: { + y: { + alias: ["yes"], + description: "Confirm the reset without a prompt.", + type: "boolean", + default: true, + }, + }, + handler: async ({ options, next }) => { + const confirmed = await options.yes({ + prompt: "Reset all settings to default?", + }); + if (confirmed) { + config.reset(); + signale.success("All settings reset to default"); + console.table(config.data()); + } + next(config.data()); + }, }); diff --git a/packages/council-cli/src/commands/config/rm.ts b/packages/council-cli/src/commands/config/rm.ts index a8b8136d..c5fcf75a 100644 --- a/packages/council-cli/src/commands/config/rm.ts +++ b/packages/council-cli/src/commands/config/rm.ts @@ -1,7 +1,25 @@ import { command } from "clide-js"; +import signale from "signale"; import { config } from "../../config.js"; export default command({ description: "Remove the configuration file", - handler: () => config.rm(), + options: { + y: { + alias: ["yes"], + description: "Confirm the removal without a prompt.", + type: "boolean", + default: true, + }, + }, + handler: async ({ options, next }) => { + const confirmed = await options.yes({ + prompt: "Delete the configuration file?", + }); + if (confirmed) { + config.rm(); + signale.success("Configuration file removed"); + } + next(confirmed); + }, }); diff --git a/packages/council-cli/src/commands/config/set.ts b/packages/council-cli/src/commands/config/set.ts index e4063200..e713ad2f 100644 --- a/packages/council-cli/src/commands/config/set.ts +++ b/packages/council-cli/src/commands/config/set.ts @@ -1,6 +1,34 @@ -import { command, passThroughCommand } from "clide-js"; +import { command } from "clide-js"; +import signale from "signale"; +import { config, settings } from "../../config.js"; export default command({ - ...passThroughCommand, description: "Set a configuration value", + options: { + s: { + alias: ["setting"], + type: "string", + customType: "setting", + description: "The setting to change.", + required: true, + choices: settings, + }, + v: { + alias: ["value"], + type: "string", + description: "The new value for the setting.", + required: true, + }, + }, + handler: async ({ options, next }) => { + const [setting, value] = await Promise.all([ + options.setting(), + options.value(), + ]); + config.set(setting, value); + signale.success(`${setting} set to ${value}`); + const newData = { [setting]: value }; + console.table(newData); + next(newData); + }, }); diff --git a/packages/council-cli/src/commands/config/set/[setting].ts b/packages/council-cli/src/commands/config/set/[setting].ts deleted file mode 100644 index 7f339ebd..00000000 --- a/packages/council-cli/src/commands/config/set/[setting].ts +++ /dev/null @@ -1,8 +0,0 @@ -import { command, passThroughCommand } from "clide-js"; - -export default command({ - ...passThroughCommand, - description: `The setting to change. Possible values are: - - 'rpc-url' to set the rpc url -`, -}); diff --git a/packages/council-cli/src/commands/config/set/[setting]/[value].ts b/packages/council-cli/src/commands/config/set/[setting]/[value].ts deleted file mode 100644 index 8fb9a574..00000000 --- a/packages/council-cli/src/commands/config/set/[setting]/[value].ts +++ /dev/null @@ -1,13 +0,0 @@ -import { command } from "clide-js"; -import { CouncilCliConfig, config } from "../../../../config.js"; - -export default command({ - description: "The value to set", - handler: ({ params }) => { - const { setting, value } = params as { - setting: keyof CouncilCliConfig; - value: string; - }; - config.set(setting, value); - }, -}); diff --git a/packages/council-cli/src/commands/core-voting.ts b/packages/council-cli/src/commands/core-voting.ts index 1be6360a..79fb0f00 100644 --- a/packages/council-cli/src/commands/core-voting.ts +++ b/packages/council-cli/src/commands/core-voting.ts @@ -1,6 +1,5 @@ -import { command, passThroughCommand } from "clide-js"; +import { command } from "clide-js"; export default command({ - ...passThroughCommand, description: "Interact with a CoreVoting contract", }); diff --git a/packages/council-cli/src/commands/core-voting/change-vault-status.ts b/packages/council-cli/src/commands/core-voting/change-vault-status.ts index 8c128703..3989cf35 100644 --- a/packages/council-cli/src/commands/core-voting/change-vault-status.ts +++ b/packages/council-cli/src/commands/core-voting/change-vault-status.ts @@ -1,29 +1,28 @@ -import { ReadWriteCouncil } from "@delvtech/council-viem"; import { command } from "clide-js"; import signale from "signale"; -import { createPublicClient, createWalletClient, http } from "viem"; -import { - getWriteOptions, - writeOptions, -} from "../../reusable-options/writeOptions.js"; +import { getWriteOptions, writeOptions } from "../../options/writeOptions.js"; export default command({ description: "Change a vault's status in a CoreVoting contract.", options: { - address: { - describe: "The CoreVoting contract address", + a: { + alias: ["address"], + description: "The CoreVoting contract address.", type: "string", + customType: "hex", required: true, }, - vault: { - describe: "The vault address", + v: { + alias: ["vault"], + description: "The vault address.", type: "string", + customType: "hex", required: true, }, - valid: { - alias: ["is-valid", "approved"], - describe: "Whether or not the vault is valid", + V: { + alias: ["valid", "approved"], + description: "Whether or not the vault is valid.", type: "boolean", default: true, required: true, @@ -31,12 +30,8 @@ export default command({ ...writeOptions, }, - handler: async ({ options, context, next }) => { - const { - account: signerAccount, - chain, - rpcUrl, - } = await getWriteOptions(options, context); + handler: async ({ options, client, next }) => { + const { council, publicClient } = await getWriteOptions(options, client); const address = await options.address({ prompt: "Enter Core Voting address", @@ -50,25 +45,17 @@ export default command({ prompt: "Is the vault valid/approved?", }); - const transport = http(rpcUrl); - const publicClient = createPublicClient({ chain, transport }); - const walletClient = createWalletClient({ - transport, - chain, - account: signerAccount, + const hash = await council.coreVoting(address).changeVaultStatus({ + args: { vault, isValid }, + options: { + onMined: () => { + signale.success(`Transaction success: ${hash}`); + }, + }, }); - const coreVoting = new ReadWriteCouncil({ - publicClient, - walletClient, - }).coreVoting({ address: address as `0x${string}` }); - - const hash = await coreVoting.changeVaultStatus({ - vault: vault as `0x${string}`, - isValid, - }); - - signale.success(hash); + signale.pending(`Transaction submitted: ${hash}`); + await publicClient.waitForTransactionReceipt({ hash }); next(hash); }, }); diff --git a/packages/council-cli/src/commands/deploy.ts b/packages/council-cli/src/commands/deploy.ts index c78a4c4e..48e5ea4b 100644 --- a/packages/council-cli/src/commands/deploy.ts +++ b/packages/council-cli/src/commands/deploy.ts @@ -1,14 +1,86 @@ import { command } from "clide-js"; +import colors from "colors"; +import { config } from "../config.js"; +import { Deployer } from "../deploy/Deployer.js"; import { getWriteOptions, + WriteOptions, writeOptions, -} from "../reusable-options/writeOptions.js"; +} from "../options/writeOptions.js"; + +const line = colors.dim("-".repeat(80)); +const thickLine = colors.dim("=".repeat(80)); export default command({ - description: "Deploy a contract or combination of contracts", + description: "Deploy a contract or combination of contracts.", requiresSubcommand: true, - options: writeOptions, - handler: async ({ options, context, next }) => { - return next(await getWriteOptions(options, context)); + + options: { + name: { + description: + "A name for the deployment. Defaults to the the contract name if a single contract is deployed, otherwise a timestamp.", + type: "string", + }, + "out-dir": { + alias: ["deployments-dir"], + description: + "The directory to write the contract deployment information to, relative to the current working directory. Defaults to config.deployments-dir.", + type: "string", + default: config.get("deploymentsDir"), + }, + ...writeOptions, + }, + + handler: async ({ options, client, next, end, commands }) => { + const { walletClient, publicClient, ...rest } = await getWriteOptions( + options, + client, + ); + + const deployer = new Deployer({ publicClient, walletClient }); + + const deployOptions: DeployOptions = { + deployer, + publicClient, + walletClient, + ...rest, + }; + + await next(deployOptions); + + const outDir = await options.outDir(); + let name = await options.name(); + + if (!name) { + if (deployer.deployedContracts.length === 1) { + name = deployer.deployedContracts[0].name; + } else { + const lastCommandName = commands.at(-1)?.commandName; + name = lastCommandName || new Date().toISOString().replace(/:/g, "-"); + } + } + + await deployer.save({ name, outDir }); + + console.log(` +Deployment complete! + +${thickLine} +${deployer.deployedContracts + .map(({ name, address }, i) => { + if (i !== 0) { + return `${line}\n${name}: ${address}`; + } + return `${name}: ${address}`; + }) + .join("\n")} +${thickLine} +`); + + end(); }, }); + +export interface DeployOptions extends WriteOptions { + deployer: Deployer; +} diff --git a/packages/council-cli/src/commands/deploy/airdrop.ts b/packages/council-cli/src/commands/deploy/airdrop.ts index 46ae810e..170b0162 100644 --- a/packages/council-cli/src/commands/deploy/airdrop.ts +++ b/packages/council-cli/src/commands/deploy/airdrop.ts @@ -1,51 +1,49 @@ import { Airdrop } from "@delvtech/council-artifacts/Airdrop"; import { command } from "clide-js"; -import signale from "signale"; -import { PrivateKeyAccount } from "viem"; -import { Chain } from "viem/chains"; -import { WriteOptions } from "../../reusable-options/writeOptions.js"; -import { - DeployedContract, - deployContract, -} from "../../utils/deployContract.js"; +import { ownerOption } from "../../options/owner.js"; +import { DeployOptions } from "../deploy.js"; export default command({ description: "Deploy an Airdrop contract", options: { - owner: { - alias: ["governance"], - description: "The contract owner's address (e.g., a Timelock contract)", - type: "string", + g: { + ...ownerOption, + alias: ["governance", ...ownerOption.alias], }, - root: { - alias: ["merkle-root"], - description: "The merkle root of the airdrop", + r: { + alias: ["root"], + description: "The merkle root of the airdrop.", type: "string", + customType: "hex", required: true, }, - token: { - description: "The address of the ERC20 token contract", + t: { + alias: ["token"], + description: "The address of the ERC20 token contract.", type: "string", + customType: "hex", required: true, }, - vault: { - alias: ["locking-vault"], + v: { + alias: ["vault"], description: - "The address of the locking vault contract that will be used when calling OptimisticRewards.claimAndDelegate()", + "The address of the locking vault contract that will be used when calling OptimisticRewards.claimAndDelegate().", type: "string", + customType: "hex", required: true, }, - expiration: { + e: { + alias: ["expiration"], description: - "The expiration timestamp (in seconds) after which the funds can be reclaimed by the owner", + "The expiration timestamp (in seconds) after which the funds can be reclaimed by the owner.", type: "number", required: true, }, }, handler: async ({ data, options, next }) => { - const { account, chain, rpcUrl } = data as WriteOptions; + const { account, deployer } = data as DeployOptions; const owner = (await options.owner()) || account.address; @@ -57,7 +55,7 @@ export default command({ prompt: "Enter token address", }); - const lockingVault = await options.lockingVault({ + const vault = await options.vault({ prompt: "Enter locking vault address", }); @@ -65,63 +63,19 @@ export default command({ prompt: "Enter expiration timestamp (in seconds)", }); - signale.pending("Deploying Airdrop..."); - - const deployData = await deployAirDrop({ - owner, - merkleRoot: root, - token, - expiration, - lockingVault, - account, - rpcUrl, - chain, - onSubmitted: (txHash) => { - signale.pending(`Airdrop deployment tx submitted: ${txHash}`); + const deployedContract = await deployer.deploy({ + abi: Airdrop.abi, + bytecode: Airdrop.bytecode, + name: "Airdrop", + args: { + _expiration: BigInt(expiration), + _governance: owner, + _lockingVault: vault, + _merkleRoot: root, + _token: token, }, }); - signale.success(`Airdrop deployed @ ${deployData.address}`); - next(deployData); + next(deployedContract); }, }); - -export interface DeployAirDropOptions { - owner: string; - merkleRoot: string; - token: string; - expiration: number; - lockingVault: string; - account: PrivateKeyAccount; - rpcUrl: string; - chain: Chain; - onSubmitted?: (txHash: string) => void; -} - -export async function deployAirDrop({ - owner, - merkleRoot, - token, - expiration, - lockingVault, - account, - rpcUrl, - chain, - onSubmitted, -}: DeployAirDropOptions): Promise { - return deployContract({ - abi: Airdrop.abi, - args: [ - owner as `0x${string}`, - merkleRoot as `0x${string}`, - token as `0x${string}`, - BigInt(expiration), - lockingVault as `0x${string}`, - ], - bytecode: Airdrop.bytecode, - account, - rpcUrl, - chain, - onSubmitted, - }); -} diff --git a/packages/council-cli/src/commands/deploy/core-voting.ts b/packages/council-cli/src/commands/deploy/core-voting.ts index cc043318..5ca94929 100644 --- a/packages/council-cli/src/commands/deploy/core-voting.ts +++ b/packages/council-cli/src/commands/deploy/core-voting.ts @@ -1,135 +1,80 @@ import { CoreVoting } from "@delvtech/council-artifacts/CoreVoting"; import { command } from "clide-js"; -import signale from "signale"; -import { PrivateKeyAccount, parseUnits } from "viem"; -import { Chain } from "viem/chains"; -import { WriteOptions } from "../../reusable-options/writeOptions.js"; -import { - DeployedContract, - deployContract, -} from "../../utils/deployContract.js"; +import { parseEther } from "viem"; +import { ownerOption } from "../../options/owner.js"; +import { DeployOptions } from "../deploy.js"; export default command({ description: "Deploy a CoreVoting contract", options: { - owner: { - alias: ["timelock"], - description: "The contract owner's address (e.g., a Timelock contract)", - type: "string", + t: { + ...ownerOption, + alias: ["timelock", ...ownerOption.alias], }, - quorum: { - alias: ["base-quorum"], - description: "The default quorum for proposals", + q: { + alias: ["quorum"], + description: + "The minimum voting power required for a proposal to pass as a decimal string.", type: "string", required: true, }, - "min-power": { + p: { alias: ["min-proposal-power"], - description: "The minimum voting power required to create a proposal", + description: + "The minimum voting power required to create a proposal as a decimal string.", type: "string", required: true, }, - decimals: { - description: - "The decimal precision to use. The quorum and power options will be multiplied by (10 ** decimals). For example, if quorum is 100 and decimals is 18, then the result will be 100000000000000000000", - type: "number", - default: 18, - }, - gsc: { - description: "The address of the Governance Steering Committee contract", + g: { + alias: ["gsc"], + description: "The address of the Governance Steering Committee contract.", type: "string", + customType: "hex", }, - vaults: { - alias: ["voting-vaults"], + v: { + alias: ["vaults"], description: "The addresses of the approved voting vaults", type: "array", + customType: "hexArray", default: [], }, }, handler: async ({ data, options, next }) => { - const { account, chain, rpcUrl } = data as WriteOptions; + const { account, deployer } = data as DeployOptions; - const owner = (await options.owner()) || account.address; + const timelock = (await options.timelock()) || account.address; const quorum = await options.quorum({ prompt: "Enter default quorum", }); - const minPower = await options.minPower({ + const minProposalPower = await options.minProposalPower({ prompt: "Enter minimum proposal power", }); - const decimals = await options.decimals(); + const gsc = (await options.gsc()) || timelock; - const gsc = (await options.gsc()) || owner; - - const maybeVaults = await options.vaults({ - prompt: "Enter approved voting vaults", - }); + const maybeVaults = + (await options.vaults({ + prompt: "Enter approved voting vaults", + })) || []; const vaults = maybeVaults?.filter((v) => !!v) || []; - signale.pending("Deploying CoreVoting..."); - - const deployData = await deployCoreVoting({ - owner, - quorum, - minPower, - decimals, - gsc, - vaults, - account, - rpcUrl, - chain, - onSubmitted: (txHash) => { - signale.pending(`CoreVoting deployment tx submitted: ${txHash}`); + const deployedContract = deployer.deploy({ + abi: CoreVoting.abi, + bytecode: CoreVoting.bytecode, + name: "CoreVoting", + args: { + _baseQuorum: parseEther(quorum), + _minProposalPower: parseEther(minProposalPower), + _gsc: gsc, + _timelock: timelock, + votingVaults: vaults, }, }); - signale.success(`CoreVoting deployed @ ${deployData.address}`); - next(deployData); + next(deployedContract); }, }); - -export interface DeployCoreVotingOptions { - quorum: string; - minPower: string; - decimals: number; - gsc: string; - vaults: string[]; - account: PrivateKeyAccount; - rpcUrl: string; - chain: Chain; - owner?: string; - onSubmitted?: (txHash: string) => void; -} - -export async function deployCoreVoting({ - quorum, - minPower, - decimals, - gsc, - vaults, - account, - rpcUrl, - chain, - owner = account.address, - onSubmitted, -}: DeployCoreVotingOptions): Promise { - return await deployContract({ - abi: CoreVoting.abi, - args: [ - owner as `0x${string}`, - parseUnits(quorum, decimals), - parseUnits(minPower, decimals), - gsc as `0x${string}`, - vaults as `0x${string}`[], - ], - bytecode: CoreVoting.bytecode, - account, - rpcUrl, - chain, - onSubmitted, - }); -} diff --git a/packages/council-cli/src/commands/deploy/default.ts b/packages/council-cli/src/commands/deploy/default.ts index abd99492..88034f01 100644 --- a/packages/council-cli/src/commands/deploy/default.ts +++ b/packages/council-cli/src/commands/deploy/default.ts @@ -1,188 +1,142 @@ -import { CoreVoting } from "@delvtech/council-artifacts/CoreVoting"; import { Timelock } from "@delvtech/council-artifacts/Timelock"; -import { ReadWriteCouncil } from "@delvtech/council-viem"; import { command } from "clide-js"; import colors from "colors"; import signale from "signale"; -import { Address, createPublicClient, createWalletClient, http } from "viem"; -import { - ContractInfo, - DEFAULT_DEPLOYMENTS_DIR, - getDeploymentStore, -} from "../../deploymentStore.js"; -import { WriteOptions } from "../../reusable-options/writeOptions.js"; -import { DAY_IN_BLOCKS, DAY_IN_SECONDS } from "../../utils/constants.js"; -import { DeployedContract } from "../../utils/deployContract.js"; -import { stringifyBigInts } from "../../utils/stringifyBigInts.js"; -import { mine } from "../server/mine.js"; +import { Address } from "viem"; +import { config } from "../../config.js"; +import { DeployedContractInfo } from "../../deploy/DeploymentJson.js"; +import { localChainIds, mine } from "../../lib/viem.js"; +import { freshDeployOption } from "../../options/fresh-deploy.js"; +import { DeployOptions } from "../deploy.js"; import deployCoreVotingCommand from "./core-voting.js"; import deployGscVaultCommand from "./gsc-vault.js"; import deployLockingVaultCommand from "./locking-vault.js"; import deployMockErc20Command from "./mock-erc20.js"; import deploySimpleProxyCommand from "./simple-proxy.js"; import deployTimelockCommand from "./timelock.js"; -import deployTreasuryCommand from "./treasury.js"; - -const defaults = { - tokenAddress: process.env.VOTING_TOKEN_ADDRESS, - tokenName: process.env.VOTING_TOKEN_NAME || "Mock Voting Token", - tokenSymbol: process.env.VOTING_TOKEN_SYMBOL || "MVT", - baseQuorum: process.env.BASE_QUORUM || "1000000", - minProposalPower: process.env.MIN_PROPOSAL_POWER || "25000", - lockDuration: process.env.LOCK_DURATION - ? +process.env.LOCK_DURATION - : undefined, - extraVotingBlocks: process.env.EXTRA_VOTING_BLOCKS - ? +process.env.EXTRA_VOTING_BLOCKS - : undefined, - timelockWaitTime: process.env.TIMELOCK_WAIT_TIME - ? +process.env.TIMELOCK_WAIT_TIME - : DAY_IN_SECONDS * 3n, - treasuryAddress: process.env.TREASURY_ADDRESS, - staleBlockLag: DAY_IN_BLOCKS * 28n, - gscQuorum: process.env.GSC_QUORUM || "3", - gscLockDuration: process.env.GSC_LOCK_DURATION - ? +process.env.GSC_LOCK_DURATION - : undefined, - gscExtraVotingBlocks: process.env.GSC_EXTRA_VOTING_BLOCKS - ? +process.env.GSC_EXTRA_VOTING_BLOCKS - : undefined, - gscVotingPowerBound: process.env.GSC_VOTING_POWER_BOUND || "100000", - gscIdleDuration: process.env.GSC_IDLE_DURATION - ? +process.env.GSC_IDLE_DURATION - : undefined, - outDir: DEFAULT_DEPLOYMENTS_DIR, - name: "default", -}; +import deployTreasury from "./treasury.js"; export default command({ description: "Deploy a default version of Council which includes 2 CoreVoting contracts - 1 for general voting with power from a LockingVault deployed behind a SimpleProxy contract, and another for GSC voting with membership in a GSCVault. Also deployed will be a Timelock, Treasury, and if no voting token address is provided, a mock voting token.", options: { - "token-address": { + f: freshDeployOption, + t: { + alias: ["token"], description: "The address of the token used for voting.", type: "string", - default: defaults.tokenAddress, + customType: "hex", + default: config.get("token"), + conflicts: ["token-name", "token-symbol"], }, - "token-name": { + n: { + alias: ["token-name"], description: "The name of the mock token to be deployed for voting if no token address is provided.", type: "string", - default: defaults.tokenName, + default: config.get("tokenName"), + conflicts: ["token"], }, - "token-symbol": { + s: { + alias: ["token-symbol"], description: "The symbol of the mock token to be deployed for voting if no token address is provided.", type: "string", - default: defaults.tokenSymbol, + default: config.get("tokenSymbol"), + conflicts: ["token"], }, - "base-quorum": { + q: { + alias: ["quorum"], description: - "The minimum voting power required for a proposal to pass. Will be scaled by 10 ** token.decimals.", + "The minimum voting power required for a proposal to pass as a decimal string.", type: "string", - default: defaults.baseQuorum, + default: config.get("quorum"), required: true, }, - "min-proposal-power": { + m: { + alias: ["min-proposal-power"], description: - "The minimum voting power required to create a proposal. Will be scaled by 10 ** token.decimals.", + "The minimum voting power required to create a proposal as a decimal string.", type: "string", - default: defaults.minProposalPower, + default: config.get("minProposalPower"), required: true, }, - "lock-duration": { + d: { + alias: ["lock-duration"], description: "The number of blocks a proposal must wait before it can be executed.", type: "number", - default: defaults.lockDuration, + default: config.get("lockDuration"), }, - "extra-voting-blocks": { + b: { + alias: ["extra-voting-blocks"], description: "The number of blocks for which a proposal can still be voted on after it's unlocked.", type: "number", - default: defaults.extraVotingBlocks, + default: config.get("extraVotingBlocks"), }, "timelock-wait-time": { description: "The amount of time (in seconds) a proposal must wait in the timelock before it can be executed.", type: "number", - default: Number(defaults.timelockWaitTime), + default: Number(config.get("timelockWaitTime")), required: true, }, - "treasury-address": { + T: { + alias: ["treasury"], description: "The address of the treasury contract.", type: "string", - default: defaults.treasuryAddress, + customType: "hex", + default: config.get("treasury"), }, - "stale-block-lag": { + l: { + alias: ["stale-block-lag"], description: "The number of blocks before the delegation history is forgotten. Voting power can't be used on proposals that are older than the stale block lag.", type: "number", - default: Number(defaults.staleBlockLag), + default: Number(config.get("staleBlockLag")), required: true, }, "gsc-quorum": { description: - "The minimum voting power required for a GSC proposal to pass.", + "The minimum voting power required for a GSC proposal to pass as a decimal string.", type: "string", - default: defaults.gscQuorum, + default: config.get("gscQuorum"), required: true, }, "gsc-lock-duration": { description: "The number of blocks a GSC proposal must wait before it can be executed.", type: "number", - default: defaults.gscLockDuration, + default: config.get("gscLockDuration"), }, "gsc-extra-voting-blocks": { description: "The number of blocks for which a GSC proposal can still be voted on after it's unlocked.", type: "number", - default: defaults.gscExtraVotingBlocks, + default: config.get("gscExtraVotingBlocks"), }, "gsc-voting-power-bound": { description: - "The minimum voting power required to become a member of the GSC. Will be scaled by 10 ** token.decimals.", + "The minimum voting power required to become a member of the GSC as a decimal string.", type: "string", - default: defaults.gscVotingPowerBound, + default: config.get("gscVotingPowerBound"), required: true, }, "gsc-idle-duration": { description: "The amount of time (in seconds) a new GSC member must wait after joining before they can vote.", type: "number", - default: defaults.gscIdleDuration, - }, - out: { - alias: ["out-dir"], - description: - "The directory to write the contract addresses to; relative to the current working directory.", - type: "string", - default: defaults.outDir, - }, - name: { - description: "The name of the deployment.", - type: "string", - default: defaults.name, + default: config.get("gscIdleDuration"), }, }, handler: async ({ data, options, fork, next }) => { - const { account, chain, rpcUrl } = data as WriteOptions; + const { account, deployer, council, chain, publicClient } = + data as DeployOptions; - const publicClient = createPublicClient({ - transport: http(rpcUrl), - chain, - }); - const walletClient = createWalletClient({ - account, - transport: http(rpcUrl), - chain, - }); - const council = new ReadWriteCouncil({ publicClient, walletClient }); - - const contractInfos: ContractInfo[] = []; + const isFreshDeploy = await options.freshDeploy(); signale.pending("Deploying Council contracts..."); @@ -190,53 +144,37 @@ export default command({ // 1. Voting Token // ========================================================================= - let votingTokenAddress = await options.tokenAddress({ - prompt: `Enter voting token address ${colors.dim( - "(leave blank to deploy a mock voting token)", - )}`, - }); - - // Used to scale voting power to match the token's decimals - let decimals = 18; - - // If a voting token address was provided, fetch the name and decimals - if (votingTokenAddress) { - signale.pending("Fetching data from voting token..."); + let votingTokenAddress: Address | undefined; - const token = council.token(votingTokenAddress as `0x${string}`); - const tokenName = await token.getName(); - decimals = await token.getDecimals(); - - signale.success(`Data successfully fetched from voting token`); - - contractInfos.push({ - name: tokenName, - address: votingTokenAddress, + if (!isFreshDeploy) { + votingTokenAddress = await options.token({ + prompt: `Enter voting token address ${colors.dim( + "(leave blank to deploy a mock voting token)", + )}`, }); } // Deploy a mock voting token if no voting token address was provided if (!votingTokenAddress) { - const tokenName = await options.tokenName({ + const name = await options.tokenName({ prompt: "Enter voting token name", }); - const tokenSymbol = await options.tokenSymbol({ + const symbol = await options.tokenSymbol({ prompt: "Enter voting token symbol", }); - const tokenDeployData: DeployedContract = await fork({ + const { address } = (await fork({ commands: [deployMockErc20Command], + // FIXME: Known issue with clide-js where optionValues in fork commands + // have to be set using the keys of the options object. optionValues: { - name: tokenName, - symbol: tokenSymbol, + n: name, + s: symbol, }, - }); - contractInfos.push({ - name: tokenName, - ...tokenDeployData, - }); - votingTokenAddress = tokenDeployData.address; + })) as DeployedContractInfo; + + votingTokenAddress = address; } // ========================================================================= @@ -244,26 +182,21 @@ export default command({ // ========================================================================= const gscQuorum = await options.gscQuorum({ - prompt: "Enter GSC quorum", + prompt: "Enter default GSC quorum", }); - const gscCoreVotingDeployData: DeployedContract = await fork({ + const gscCoreVotingDeployInfo = (await fork({ commands: [deployCoreVotingCommand], + // FIXME: Known issue with clide-js where optionValues in fork commands + // have to be set using the keys of the options object. optionValues: { - owner: account.address, - quorum: gscQuorum, - minPower: gscQuorum, - decimals, + t: account.address, + q: gscQuorum, + p: "1", }, - }); - contractInfos.push({ - name: "GSCCoreVoting", - ...gscCoreVotingDeployData, - }); + })) as DeployedContractInfo; - const gscCoreVoting = council.coreVoting({ - address: gscCoreVotingDeployData.address, - }); + const gscCoreVoting = council.coreVoting(gscCoreVotingDeployInfo.address); const gscLockDuration = await options.gscLockDuration(); // Set the GSC CoreVoting lock duration if provided @@ -273,14 +206,20 @@ export default command({ ); const hash = await gscCoreVoting.setLockDuration({ - blocks: BigInt(gscLockDuration), + args: { + blocks: BigInt(gscLockDuration), + }, + options: { + onMined: () => { + signale.success( + `Successfully set GSC CoreVoting lock duration to ${gscLockDuration}`, + ); + }, + }, }); signale.pending(`GSC CoreVoting lock duration tx submitted: ${hash}`); await publicClient.waitForTransactionReceipt({ hash }); - signale.success( - `Successfully set GSC CoreVoting lock duration to ${gscLockDuration}`, - ); } const gscExtraVotingBlocks = await options.gscExtraVotingBlocks(); @@ -292,14 +231,20 @@ export default command({ ); const hash = await gscCoreVoting.changeExtraVotingTime({ - extraVoteBlocks: BigInt(gscExtraVotingBlocks), + args: { + extraVoteBlocks: BigInt(gscExtraVotingBlocks), + }, + options: { + onMined: () => { + signale.success( + `Successfully set GSC CoreVoting extra voting time to ${gscExtraVotingBlocks}`, + ); + }, + }, }); signale.pending(`GSC CoreVoting extra voting time tx submitted: ${hash}`); await publicClient.waitForTransactionReceipt({ hash }); - signale.success( - `Successfully set GSC CoreVoting extra voting time to ${gscExtraVotingBlocks}`, - ); } // ========================================================================= @@ -310,39 +255,39 @@ export default command({ prompt: `Enter timelock wait time ${colors.dim("(in seconds)")}`, }); - const timelockDeployData: DeployedContract = await fork({ + const timelockDeployInfo = (await fork({ commands: [deployTimelockCommand], + // FIXME: Known issue with clide-js where optionValues in fork commands + // have to be set using the keys of the options object. optionValues: { - waitTime: timelockWaitTime, - gsc: gscCoreVotingDeployData.address, + t: timelockWaitTime, + gsc: gscCoreVotingDeployInfo.address, }, - }); - contractInfos.push({ - name: "Timelock", - ...timelockDeployData, - }); + })) as DeployedContractInfo; // ========================================================================= // 4. Treasury // ========================================================================= - const treasuryAddress = await options.treasuryAddress({ - prompt: `Enter Treasury address ${colors.dim( - "(leave blank to deploy a new one)", - )}`, - }); + let treasury: Address | undefined; + + if (!isFreshDeploy) { + treasury = await options.treasury({ + prompt: `Enter Treasury address ${colors.dim( + "(leave blank to deploy a new one)", + )}`, + }); + } - if (!treasuryAddress) { - const treasuryDeployData: DeployedContract = await fork({ - commands: [deployTreasuryCommand], + if (!treasury) { + await fork({ + commands: [deployTreasury], + // FIXME: Known issue with clide-js where optionValues in fork commands + // have to be set using the keys of the options object. optionValues: { - owner: timelockDeployData.address, + g: timelockDeployInfo.address, }, }); - contractInfos.push({ - name: "Treasury", - ...treasuryDeployData, - }); } // ========================================================================= @@ -353,11 +298,12 @@ export default command({ prompt: "Enter stale block lag", }); - if (chain.id === 31337) { - const blocksToMine = staleBlockLag * 2; - // Calling queryVotePower on a voting vault that has a stale block lag larger - // than the current block height will result in an error. To avoid this, we - // we fast forward the block height by the stale block lag. + if (localChainIds.includes(chain.id)) { + // Calling queryVotePower on a voting vault that has a stale block lag + // larger than the current block height will result in an error. To avoid + // this, we we fast forward the block height. + const blocksToMine = staleBlockLag + 1; + signale.pending( `Fast forwarding block height by ${blocksToMine} blocks...`, ); @@ -372,61 +318,51 @@ export default command({ ); } - const lockingVaultDeployData: DeployedContract = await fork({ + const lockingVaultDeployInfo = (await fork({ commands: [deployLockingVaultCommand], + // FIXME: Known issue with clide-js where optionValues in fork commands + // have to be set using the keys of the options object. optionValues: { - token: votingTokenAddress, - staleBlockLag, + t: votingTokenAddress, + l: staleBlockLag, }, - }); - contractInfos.push({ - name: "LockingVault", - ...lockingVaultDeployData, - }); + })) as DeployedContractInfo; - const lockVaultProxyDeployData: DeployedContract = await fork({ + const lockVaultProxyDeployInfo = (await fork({ commands: [deploySimpleProxyCommand], + // FIXME: Known issue with clide-js where optionValues in fork commands + // have to be set using the keys of the options object. optionValues: { - owner: timelockDeployData.address, - implementation: lockingVaultDeployData.address, + g: timelockDeployInfo.address, + i: lockingVaultDeployInfo.address, }, - }); - - contractInfos.push({ - name: "LockingVaultProxy", - ...lockVaultProxyDeployData, - }); + })) as DeployedContractInfo; // ========================================================================= // 6. CoreVoting // ========================================================================= - const baseQuorum = await options.baseQuorum({ - prompt: "Enter base quorum", + const quorum = await options.quorum({ + prompt: "Enter default quorum", }); const minProposalPower = await options.minProposalPower({ prompt: "Enter minimum proposal power", }); - const coreVotingDeployData: DeployedContract = await fork({ + const coreVotingDeployInfo = (await fork({ commands: [deployCoreVotingCommand], + // FIXME: Known issue with clide-js where optionValues in fork commands + // have to be set using the keys of the options object. optionValues: { - quorum: baseQuorum, - minPower: minProposalPower, - decimals, - gsc: gscCoreVotingDeployData.address, - vaults: [lockVaultProxyDeployData.address], + q: quorum, + p: minProposalPower, + g: gscCoreVotingDeployInfo.address, + v: [lockVaultProxyDeployInfo.address], }, - }); - contractInfos.push({ - name: "CoreVoting", - ...coreVotingDeployData, - }); + })) as DeployedContractInfo; - const coreVoting = council.coreVoting({ - address: coreVotingDeployData.address, - }); + const coreVoting = council.coreVoting(coreVotingDeployInfo.address); const lockDuration = await options.lockDuration(); // Set the CoreVoting lock duration if provided @@ -434,14 +370,20 @@ export default command({ signale.pending(`Setting CoreVoting lock duration to ${lockDuration}...`); const hash = await coreVoting.setLockDuration({ - blocks: BigInt(lockDuration), + args: { + blocks: BigInt(lockDuration), + }, + options: { + onMined: () => { + signale.success( + `Successfully set CoreVoting lock duration to ${lockDuration}`, + ); + }, + }, }); signale.pending(`CoreVoting lock duration tx submitted: ${hash}`); await publicClient.waitForTransactionReceipt({ hash }); - signale.success( - `Successfully set CoreVoting lock duration to ${lockDuration}`, - ); } const extraVotingBlocks = await options.extraVotingBlocks(); @@ -453,16 +395,20 @@ export default command({ ); const hash = await coreVoting.changeExtraVotingTime({ - extraVoteBlocks: BigInt(extraVotingBlocks), + args: { + extraVoteBlocks: BigInt(extraVotingBlocks), + }, + options: { + onMined: () => { + signale.success( + `Successfully set CoreVoting extra voting time to ${extraVotingBlocks}`, + ); + }, + }, }); signale.pending(`CoreVoting extra voting time tx submitted: ${hash}`); - await publicClient.waitForTransactionReceipt({ hash }); - - signale.success( - `Successfully set CoreVoting extra voting time to ${extraVotingBlocks}`, - ); } // ========================================================================= @@ -473,19 +419,16 @@ export default command({ prompt: "Enter GSC voting power bound", }); - const gscVaultDeployData: DeployedContract = await fork({ + const gscVaultDeployInfo = (await fork({ commands: [deployGscVaultCommand], + // FIXME: Known issue with clide-js where optionValues in fork commands + // have to be set using the keys of the options object. optionValues: { - coreVoting: coreVotingDeployData.address, - votingPowerBound: gscVotingPowerBound, - decimals, - owner: timelockDeployData.address, + c: coreVotingDeployInfo.address, + b: gscVotingPowerBound, + o: timelockDeployInfo.address, }, - }); - contractInfos.push({ - name: "GSCVault", - ...gscVaultDeployData, - }); + })) as DeployedContractInfo; const gscIdleDuration = await options.gscIdleDuration(); @@ -495,29 +438,43 @@ export default command({ `Setting GSCVault idle duration to ${gscIdleDuration}...`, ); - const gscVault = council.gscVault(gscCoreVotingDeployData.address); + const gscVault = council.gscVault(gscCoreVotingDeployInfo.address); const hash = await gscVault.setIdleDuration({ - duration: BigInt(gscIdleDuration), + args: { + duration: BigInt(gscIdleDuration), + }, + options: { + onMined: () => { + signale.success( + `Successfully set GSCVault idle duration to ${gscIdleDuration}`, + ); + }, + }, }); signale.pending(`GSCVault idle duration tx submitted: ${hash}`); await publicClient.waitForTransactionReceipt({ hash }); - signale.success( - `Successfully set GSCVault idle duration to ${gscIdleDuration}`, - ); } // Approve the GSCVault to be used by the GSC CoreVoting contract - signale.pending("Changing GSCVault status in GSC CoreVoting"); + signale.pending("Changing GSCVault status in GSC CoreVoting..."); const gscVaultStatusHash = await gscCoreVoting.changeVaultStatus({ - vault: gscVaultDeployData.address, - isValid: true, + args: { + vault: gscVaultDeployInfo.address, + isValid: true, + }, + options: { + onMined: () => { + signale.success( + "Successfully changed GSCVault status in GSC CoreVoting", + ); + }, + }, }); signale.pending(`GSCVault status tx submitted: ${gscVaultStatusHash}`); await publicClient.waitForTransactionReceipt({ hash: gscVaultStatusHash }); - signale.success("Successfully changed GSCVault status in GSC CoreVoting"); // ========================================================================= // 7. Lock it down @@ -525,83 +482,59 @@ export default command({ signale.pending("Setting GSC CoreVoting owner to Timelock..."); - const gscCoreVotingOwnerHash = await walletClient.writeContract({ - abi: CoreVoting.abi, - address: gscCoreVotingDeployData.address as Address, - functionName: "setOwner", - args: [timelockDeployData.address], - }); + const gscCoreVotingOwnerHash = await gscCoreVoting.contract.write( + "setOwner", + { + who: timelockDeployInfo.address, + }, + { + onMined: () => { + signale.success("Successfully set GSC CoreVoting owner to Timelock"); + }, + }, + ); signale.pending( `GSC CoreVoting owner tx submitted: ${gscCoreVotingOwnerHash}`, ); - await publicClient.waitForTransactionReceipt({ - hash: gscCoreVotingOwnerHash, - }); - signale.success("Successfully set GSC CoreVoting owner to Timelock"); + signale.pending("Setting CoreVoting owner to Timelock..."); - const coreVotingOwnerHash = await walletClient.writeContract({ - abi: CoreVoting.abi, - address: coreVoting.address as Address, - functionName: "setOwner", - args: [timelockDeployData.address], - }); + const coreVotingOwnerHash = await coreVoting.contract.write( + "setOwner", + { + who: timelockDeployInfo.address, + }, + { + onMined: () => { + signale.success("Successfully set CoreVoting owner to Timelock"); + }, + }, + ); signale.pending(`CoreVoting owner tx submitted: ${coreVotingOwnerHash}`); await publicClient.waitForTransactionReceipt({ hash: coreVotingOwnerHash }); - signale.success("Successfully set CoreVoting owner to Timelock"); signale.pending("Setting Timelock owner to CoreVoting..."); - const timelockOwnerHash = await walletClient.writeContract({ + const timelockOwnerHash = await council.drift.write({ abi: Timelock.abi, - address: timelockDeployData.address, - functionName: "setOwner", - args: [coreVoting.address], + address: "0x", + fn: "setOwner", + args: { + who: timelockDeployInfo.address, + }, + onMined: () => { + signale.success("Successfully set Timelock owner to CoreVoting"); + }, }); signale.pending(`Timelock owner tx submitted: ${timelockOwnerHash}`); await publicClient.waitForTransactionReceipt({ hash: timelockOwnerHash }); - signale.success("Successfully set Timelock owner to CoreVoting"); - - // ========================================================================= - // 8. Save the addresses - // ========================================================================= - - const deploymentName = await options.name({ - prompt: "Enter deployment name", - }); - - const outDir = await options.outDir({ - prompt: "Enter output directory", - }); - - const store = getDeploymentStore(deploymentName, chain.id, outDir); - await store.set({ - name: deploymentName, - chainId: chain.id, - timestamp: Date.now(), - deployer: account.address, - contracts: stringifyBigInts(contractInfos), - }); // ========================================================================= - // 9. DONE! + // DONE! // ========================================================================= - console.log("\n"); - signale.success("Council contracts deployed successfully!"); - console.log("\n"); - - console.log(colors.dim(`${"=".repeat(80)}`)); - contractInfos.forEach((contractInfo, i) => { - if (i !== 0) { - console.log(colors.dim(`${"-".repeat(80)}`)); - } - console.log(`${contractInfo.name}: ${contractInfo.address}`); - }); - console.log(colors.dim(`${"=".repeat(80)}`)); - - next(contractInfos); + next(deployer.deployedContracts); }, }); diff --git a/packages/council-cli/src/commands/deploy/gsc-vault.ts b/packages/council-cli/src/commands/deploy/gsc-vault.ts index abc46822..e2f44cae 100644 --- a/packages/council-cli/src/commands/deploy/gsc-vault.ts +++ b/packages/council-cli/src/commands/deploy/gsc-vault.ts @@ -1,108 +1,54 @@ import { GSCVault } from "@delvtech/council-artifacts/GSCVault"; import { command } from "clide-js"; -import signale from "signale"; -import { WriteOptions } from "src/reusable-options/writeOptions.js"; -import { PrivateKeyAccount, parseUnits } from "viem"; -import { Chain } from "viem/chains"; -import { - DeployedContract, - deployContract, -} from "../../utils/deployContract.js"; +import { parseEther } from "viem"; +import { ownerOption } from "../../options/owner.js"; +import { DeployOptions } from "../deploy.js"; export default command({ description: "Deploy a GSCVault contract", options: { - "core-voting": { - description: "The address of the CoreVoting contract", + c: { + alias: ["core-voting"], + description: "The address of the CoreVoting contract.", type: "string", + customType: "hex", required: true, }, - bound: { + b: { alias: ["voting-power-bound"], - description: "The minimum voting power required to become a member", - type: "string", - required: true, - }, - decimals: { description: - "The decimal precision to use. The bound option will be multiplied by (10 ** decimals). For example, if bound is 100 and decimals is 18, then the result will be 100000000000000000000", - type: "number", - default: 18, - }, - owner: { - description: "The owner of the contract (e.g., a Timelock contract)", + "The minimum voting power required to become a member as a decimal string.", type: "string", + required: true, }, + o: ownerOption, }, handler: async ({ data, options, next }) => { - const { account, chain, rpcUrl } = data as WriteOptions; + const { account, deployer } = data as DeployOptions; const coreVoting = await options.coreVoting({ prompt: "Enter CoreVoting address", }); - const bound = await options.bound({ + const votingPowerBound = await options.votingPowerBound({ prompt: "Enter voting power bound", }); - const decimals = await options.decimals(); - const owner = (await options.owner()) || account.address; - signale.pending("Deploying GSCVault..."); - - const deployData = await deployGSCVault({ - coreVoting, - votingPowerBound: bound, - decimals, - owner, - account, - rpcUrl, - chain, - onSubmitted: (txHash) => { - signale.pending(`GSCVault deployment tx submitted: ${txHash}`); + const deployedContract = deployer.deploy({ + abi: GSCVault.abi, + bytecode: GSCVault.bytecode, + name: "GSCVault", + args: { + _coreVoting: coreVoting, + _votingPowerBound: parseEther(votingPowerBound), + _owner: owner, }, }); - signale.success(`GSCVault deployed @ ${deployData.address}`); - next(deployData); + next(deployedContract); }, }); - -export interface DeployGSCVaultOptions { - coreVoting: string; - votingPowerBound: string; - decimals: number; - owner: string; - account: PrivateKeyAccount; - rpcUrl: string; - chain: Chain; - onSubmitted?: (txHash: string) => void; -} - -export async function deployGSCVault({ - coreVoting, - votingPowerBound, - decimals, - owner, - account, - rpcUrl, - chain, - onSubmitted, -}: DeployGSCVaultOptions): Promise { - return await deployContract({ - abi: GSCVault.abi, - args: [ - coreVoting as `0x${string}`, - parseUnits(votingPowerBound, decimals), - owner as `0x${string}`, - ], - bytecode: GSCVault.bytecode, - account, - rpcUrl, - chain, - onSubmitted, - }); -} diff --git a/packages/council-cli/src/commands/deploy/locking-vault.ts b/packages/council-cli/src/commands/deploy/locking-vault.ts index bca00fc4..61723287 100644 --- a/packages/council-cli/src/commands/deploy/locking-vault.ts +++ b/packages/council-cli/src/commands/deploy/locking-vault.ts @@ -1,85 +1,48 @@ import { LockingVault } from "@delvtech/council-artifacts/LockingVault"; import { command } from "clide-js"; -import signale from "signale"; -import { PrivateKeyAccount } from "viem"; -import { Chain } from "viem/chains"; -import { WriteOptions } from "../../reusable-options/writeOptions.js"; -import { - DeployedContract, - deployContract, -} from "../../utils/deployContract.js"; +import { DeployOptions } from "../deploy.js"; export default command({ description: "Deploy a LockingVault contract", options: { - token: { - description: "The address of the ERC20 token contract", + t: { + alias: ["token"], + description: "The address of the ERC20 token contract.", type: "string", + customType: "hex", required: true, }, - lag: { + l: { alias: ["stale-block-lag"], description: - "The number of blocks before the delegation history is forgotten", + "The number of blocks before the delegation history is forgotten.", type: "number", required: true, }, }, handler: async ({ data, options, next }) => { - const { account, chain, rpcUrl } = data as WriteOptions; + const { deployer } = data as DeployOptions; const token = await options.token({ prompt: "Enter token address", }); - const lag = await options.lag({ + const staleBlockLag = await options.staleBlockLag({ prompt: "Enter stale block lag", }); - signale.pending("Deploying LockingVault..."); - - const deployData = await deployLockingVault({ - token, - staleBlockLag: lag, - account, - rpcUrl, - chain, - onSubmitted: (txHash) => { - signale.pending(`LockingVault deployment tx submitted: ${txHash}`); + const deployedContract = await deployer.deploy({ + abi: LockingVault.abi, + bytecode: LockingVault.bytecode, + name: "LockingVault", + args: { + _token: token, + _staleBlockLag: BigInt(staleBlockLag), }, }); - signale.success(`LockingVault deployed @ ${deployData.address}`); - next(deployData); + next(deployedContract); }, }); - -export interface DeployLockingVaultOptions { - token: string; - staleBlockLag: number; - account: PrivateKeyAccount; - rpcUrl: string; - chain: Chain; - onSubmitted?: (txHash: string) => void; -} - -export async function deployLockingVault({ - token, - staleBlockLag, - account, - rpcUrl, - chain, - onSubmitted, -}: DeployLockingVaultOptions): Promise { - return await deployContract({ - abi: LockingVault.abi, - args: [token as `0x${string}`, BigInt(staleBlockLag)], - bytecode: LockingVault.bytecode, - account, - rpcUrl, - chain, - onSubmitted, - }); -} diff --git a/packages/council-cli/src/commands/deploy/mock-erc20.ts b/packages/council-cli/src/commands/deploy/mock-erc20.ts index 9da7c379..84e0213e 100644 --- a/packages/council-cli/src/commands/deploy/mock-erc20.ts +++ b/packages/council-cli/src/commands/deploy/mock-erc20.ts @@ -1,32 +1,29 @@ import { MockERC20 } from "@delvtech/council-artifacts/MockERC20"; import { command } from "clide-js"; -import signale from "signale"; -import { WriteOptions } from "src/reusable-options/writeOptions.js"; -import { PrivateKeyAccount } from "viem"; -import { Chain } from "viem/chains"; -import { - DeployedContract, - deployContract, -} from "../../utils/deployContract.js"; +import { ownerOption } from "../../options/owner.js"; +import { DeployOptions } from "../deploy.js"; export default command({ description: "Deploy a MockERC20 contract for use as a mock voting token", options: { - name: { - description: "The name of the token", + n: { + alias: ["name"], + description: "The name of the token.", type: "string", required: true, }, - symbol: { - description: "The symbol of the token", + s: { + alias: ["symbol"], + description: "The symbol of the token.", type: "string", required: true, }, + o: ownerOption, }, handler: async ({ data, options, next }) => { - const { account, chain, rpcUrl } = data as WriteOptions; + const { account, deployer } = data as DeployOptions; const name = await options.name({ prompt: "Enter token name", @@ -36,48 +33,19 @@ export default command({ prompt: "Enter token symbol", }); - signale.pending("Deploying MockERC20..."); + const owner = await options.o(); - const deployData = await deployMockERC20({ - tokenName: name, - tokenSymbol: symbol, - account, - rpcUrl, - chain, - onSubmitted: (txHash) => { - signale.pending(`MockERC20 deployment tx submitted: ${txHash}`); + const deployedContract = await deployer.deploy({ + name: "MockERC20", + abi: MockERC20.abi, + bytecode: MockERC20.bytecode, + args: { + name_: name, + symbol_: symbol, + owner_: owner || account.address, }, }); - signale.success(`MockERC20 deployed @ ${deployData.address}`); - next(deployData); + next(deployedContract); }, }); - -export interface DeployMockERC20Options { - tokenName: string; - tokenSymbol: string; - account: PrivateKeyAccount; - rpcUrl: string; - chain: Chain; - onSubmitted?: (txHash: string) => void; -} - -export async function deployMockERC20({ - tokenName, - tokenSymbol, - account, - rpcUrl, - chain, - onSubmitted, -}: DeployMockERC20Options): Promise { - return await deployContract({ - abi: MockERC20.abi, - args: [tokenName, tokenSymbol, account.address], - bytecode: MockERC20.bytecode, - account, - rpcUrl, - chain, - onSubmitted, - }); -} diff --git a/packages/council-cli/src/commands/deploy/optimistic-grants.ts b/packages/council-cli/src/commands/deploy/optimistic-grants.ts index 62aaaba4..4e0cd1b4 100644 --- a/packages/council-cli/src/commands/deploy/optimistic-grants.ts +++ b/packages/council-cli/src/commands/deploy/optimistic-grants.ts @@ -1,32 +1,26 @@ import { OptimisticGrants } from "@delvtech/council-artifacts/OptimisticGrants"; import { command } from "clide-js"; -import signale from "signale"; -import { WriteOptions } from "src/reusable-options/writeOptions.js"; -import { PrivateKeyAccount } from "viem"; -import { Chain } from "viem/chains"; -import { - DeployedContract, - deployContract, -} from "../../utils/deployContract.js"; +import { ownerOption } from "../../options/owner.js"; +import { DeployOptions } from "../deploy.js"; export default command({ description: "Deploy an OptimisticGrants contract", options: { - token: { - description: "The address of the ERC20 token to distribute", + t: { + alias: ["token"], + description: "The address of the ERC20 token to distribute.", type: "string", + customType: "hex", required: true, }, - governance: { - description: - "The governance contract's address for ACL (e.g., a Timelock contract)", - type: "string", - required: true, + g: { + ...ownerOption, + alias: ["governance", ...ownerOption.alias], }, }, handler: async ({ data, options, next }) => { - const { account, chain, rpcUrl } = data as WriteOptions; + const { account, deployer } = data as DeployOptions; const token = await options.token({ prompt: "Enter token address", @@ -36,48 +30,16 @@ export default command({ prompt: "Enter governance address (e.g., a Timelock contract)", }); - signale.pending("Deploying OptimisticGrants..."); - - const deployData = await deployOptimisticGrants({ - token, - governance, - account, - rpcUrl, - chain, - onSubmitted: (txHash) => { - signale.pending(`OptimisticGrants deployment tx submitted: ${txHash}`); + const deployedContract = await deployer.deploy({ + abi: OptimisticGrants.abi, + bytecode: OptimisticGrants.bytecode, + name: "OptimisticGrants", + args: { + _token: token, + __governance: governance || account.address, }, }); - signale.success(`OptimisticGrants deployed @ ${deployData.address}`); - next(deployData); + next(deployedContract); }, }); - -export interface DeployOptimisticGrantsOptions { - token: string; - governance: string; - account: PrivateKeyAccount; - rpcUrl: string; - chain: Chain; - onSubmitted?: (txHash: string) => void; -} - -export async function deployOptimisticGrants({ - token, - governance, - account, - rpcUrl, - chain, - onSubmitted, -}: DeployOptimisticGrantsOptions): Promise { - return deployContract({ - abi: OptimisticGrants.abi, - args: [token as `0x${string}`, governance as `0x${string}`], - bytecode: OptimisticGrants.bytecode, - account, - rpcUrl, - chain, - onSubmitted, - }); -} diff --git a/packages/council-cli/src/commands/deploy/optimistic-rewards.ts b/packages/council-cli/src/commands/deploy/optimistic-rewards.ts index 9fbb93b3..46781eb4 100644 --- a/packages/council-cli/src/commands/deploy/optimistic-rewards.ts +++ b/packages/council-cli/src/commands/deploy/optimistic-rewards.ts @@ -1,133 +1,87 @@ import { OptimisticRewards } from "@delvtech/council-artifacts/OptimisticRewards"; import { command } from "clide-js"; -import signale from "signale"; -import { PrivateKeyAccount } from "viem"; -import { Chain } from "viem/chains"; -import { WriteOptions } from "../../reusable-options/writeOptions.js"; -import { - DeployedContract, - deployContract, -} from "../../utils/deployContract.js"; +import { ownerOption } from "../../options/owner.js"; +import { DeployOptions } from "../deploy.js"; export default command({ description: "Deploy a OptimisticRewards contract", options: { - owner: { - alias: ["governance"], - description: "The contract owner's address (e.g., a Timelock contract)", - type: "string", - }, - root: { + s: { alias: ["starting-root"], - description: "The starting merkle root", + description: "The starting merkle root.", type: "string", + customType: "hex", required: true, }, - proposer: { - description: "The address that can propose new roots", + t: { + alias: ["token"], + description: "The address of the ERC20 token to distribute.", type: "string", + customType: "hex", + required: true, }, - revoker: { - alias: ["challenger"], - description: "The address that can remove proposed reward roots", + v: { + alias: ["locking-vault"], + description: + "The address of the locking vault contract that will be used when calling Airdrop.claimAndDelegate().", type: "string", + customType: "hex", + required: true, }, - token: { - description: "The address of the ERC20 token to distribute", + g: { + ...ownerOption, + alias: ["governance", ...ownerOption.alias], + }, + p: { + alias: ["proposer"], + description: + "The address that can propose new roots. Defaults to governance.", type: "string", - required: true, + customType: "hex", }, - "locking-vault": { + r: { + alias: ["revoker"], description: - "The address of the locking vault contract that will be used when calling Airdrop.claimAndDelegate()", + "The address that can remove proposed reward roots. Defaults to governance.", type: "string", - required: true, + customType: "hex", }, }, handler: async ({ data, options, next }) => { - const { account, chain, rpcUrl } = data as WriteOptions; - - const owner = (await options.owner()) || account.address; + const { account, deployer } = data as DeployOptions; - const root = await options.root({ + const root = await options.startingRoot({ prompt: "Enter starting root", }); - const proposer = (await options.proposer()) || owner; - - const revoker = (await options.revoker()) || owner; + const lockingVault = await options.lockingVault({ + prompt: "Enter locking vault address", + }); const token = await options.token({ prompt: "Enter token address", }); - const lockingVault = await options.lockingVault({ - prompt: "Enter locking vault address", - }); - - signale.pending("Deploying OptimisticRewards..."); + const governance = (await options.governance()) || account.address; + const proposer = (await options.proposer()) || governance; + const revoker = (await options.revoker()) || governance; - const deployData = await deployOptimisticRewards({ - owner, - startingRoot: root, - proposer, - revoker, - token, - lockingVault, - account, - rpcUrl, - chain, - onSubmitted: (txHash) => { - signale.pending(`OptimisticRewards deployment tx submitted: ${txHash}`); + const deployedContract = await deployer.deploy({ + abi: OptimisticRewards.abi, + bytecode: OptimisticRewards.bytecode, + name: "OptimisticRewards", + args: { + _token: token, + _governance: governance, + _lockingVault: lockingVault, + _startingRoot: root, + _proposer: proposer, + _revoker: revoker, }, }); - signale.success(`OptimisticRewards deployed @ ${deployData.address}`); - next(deployData); + next(deployedContract); }, }); - -export interface DeployOptimisticRewardsOptions { - owner: string; - startingRoot: string; - proposer: string; - revoker: string; - token: string; - lockingVault: string; - account: PrivateKeyAccount; - rpcUrl: string; - chain: Chain; - onSubmitted?: (txHash: string) => void; -} - -export async function deployOptimisticRewards({ - owner, - startingRoot, - proposer, - revoker, - token, - lockingVault, - account, - rpcUrl, - chain, - onSubmitted, -}: DeployOptimisticRewardsOptions): Promise { - return deployContract({ - abi: OptimisticRewards.abi, - args: [ - owner as `0x${string}`, - startingRoot as `0x${string}`, - proposer as `0x${string}`, - revoker as `0x${string}`, - token as `0x${string}`, - lockingVault as `0x${string}`, - ], - bytecode: OptimisticRewards.bytecode, - account, - rpcUrl, - chain, - onSubmitted, - }); -} diff --git a/packages/council-cli/src/commands/deploy/simple-proxy.ts b/packages/council-cli/src/commands/deploy/simple-proxy.ts index 2bb28ddd..3b528e6d 100644 --- a/packages/council-cli/src/commands/deploy/simple-proxy.ts +++ b/packages/council-cli/src/commands/deploy/simple-proxy.ts @@ -1,80 +1,44 @@ import { SimpleProxy } from "@delvtech/council-artifacts/SimpleProxy"; import { command } from "clide-js"; -import signale from "signale"; -import { PrivateKeyAccount } from "viem"; -import { Chain } from "viem/chains"; -import { WriteOptions } from "../../reusable-options/writeOptions.js"; -import { - DeployedContract, - deployContract, -} from "../../utils/deployContract.js"; +import { ownerOption } from "../../options/owner.js"; +import { DeployOptions } from "../deploy.js"; export default command({ description: "Deploy a SimpleProxy contract", options: { - owner: { - describe: "The contract owner's address (e.g., a Timelock contract)", - type: "string", + g: { + ...ownerOption, + alias: ["governance", ...ownerOption.alias], }, - implementation: { - alias: ["first-implementation"], - describe: "The address that calls to the proxy will be forwarded to", + i: { + alias: ["implementation"], + description: "The address that calls to the proxy will be forwarded to.", type: "string", + customType: "hex", required: true, }, }, handler: async ({ data, options, next }) => { - const { account, chain, rpcUrl } = data as WriteOptions; - const owner = (await options.owner()) || account.address; + const { account, deployer } = data as DeployOptions; const implementation = await options.implementation({ prompt: "Enter implementation address", }); - signale.pending("Deploying SimpleProxy..."); + const governance = (await options.governance()) || account.address; - const deployData = await deploySimpleProxy({ - owner, - implementation, - account, - rpcUrl, - chain, - onSubmitted: (txHash) => { - signale.pending(`SimpleProxy deployment tx submitted: ${txHash}`); + const deployedContract = await deployer.deploy({ + abi: SimpleProxy.abi, + bytecode: SimpleProxy.bytecode, + name: "SimpleProxy", + args: { + _firstImplementation: implementation, + _governance: governance, }, }); - signale.success(`SimpleProxy deployed @ ${deployData.address}`); - return next(deployData); + next(deployedContract); }, }); - -export interface DeploySimpleProxyOptions { - owner: string; - implementation: string; - account: PrivateKeyAccount; - rpcUrl: string; - chain: Chain; - onSubmitted?: (txHash: string) => void; -} - -export async function deploySimpleProxy({ - owner, - implementation, - account, - rpcUrl, - chain, - onSubmitted, -}: DeploySimpleProxyOptions): Promise { - return await deployContract({ - abi: SimpleProxy.abi, - args: [owner as `0x${string}`, implementation as `0x${string}`], - bytecode: SimpleProxy.bytecode, - account, - rpcUrl, - chain, - onSubmitted, - }); -} diff --git a/packages/council-cli/src/commands/deploy/simple.ts b/packages/council-cli/src/commands/deploy/simple.ts index 5f5cc710..0b420ab7 100644 --- a/packages/council-cli/src/commands/deploy/simple.ts +++ b/packages/council-cli/src/commands/deploy/simple.ts @@ -1,135 +1,98 @@ -import { ReadWriteCouncil } from "@delvtech/council-viem"; +import { Address } from "@delvtech/drift"; import { command } from "clide-js"; import colors from "colors"; import signale from "signale"; -import { createPublicClient, createWalletClient, http } from "viem"; -import { foundry, hardhat, localhost } from "viem/chains"; -import { - ContractInfo, - DEFAULT_DEPLOYMENTS_DIR, - getDeploymentStore, -} from "../../deploymentStore.js"; -import { freshDeployOption } from "../../reusable-options/deploy/fresh-deploy.js"; -import { WriteOptions } from "../../reusable-options/writeOptions.js"; -import { DAY_IN_BLOCKS } from "../../utils/constants.js"; -import { DeployedContract } from "../../utils/deployContract.js"; -import { stringifyBigInts } from "../../utils/stringifyBigInts.js"; -import { mine } from "../server/mine.js"; +import { config } from "../../config.js"; +import { DeployedContractInfo } from "../../deploy/DeploymentJson.js"; +import { localChainIds, mine } from "../../lib/viem.js"; +import { freshDeployOption } from "../../options/fresh-deploy.js"; +import { DeployOptions } from "../deploy.js"; import deployCoreVotingCommand from "./core-voting.js"; import deployLockingVaultCommand from "./locking-vault.js"; import deployMockErc20Command from "./mock-erc20.js"; import deploySimpleProxyCommand from "./simple-proxy.js"; import deployTreasury from "./treasury.js"; -const defaults = { - tokenAddress: process.env.VOTING_TOKEN_ADDRESS, - tokenName: process.env.VOTING_TOKEN_NAME || "Mock Voting Token", - tokenSymbol: process.env.VOTING_TOKEN_SYMBOL || "MVT", - baseQuorum: process.env.BASE_QUORUM || "1000000", - minProposalPower: process.env.MIN_PROPOSAL_POWER || "25000", - lockDuration: process.env.LOCK_DURATION - ? +process.env.LOCK_DURATION - : undefined, - extraVotingBlocks: process.env.EXTRA_VOTING_BLOCKS - ? +process.env.EXTRA_VOTING_BLOCKS - : undefined, - treasuryAddress: process.env.TREASURY_ADDRESS, - staleBlockLag: DAY_IN_BLOCKS * 28n, - outDir: DEFAULT_DEPLOYMENTS_DIR, - name: "simple", -}; - export default command({ description: "Deploy a simple version of Council which includes 1 CoreVoting contract for general voting with power from a LockingVault deployed behind a SimpleProxy contract. Also deployed will be a Treasury, and if no voting token address is provided, a mock voting token.", options: { - fresh: freshDeployOption, - "token-address": { + f: freshDeployOption, + t: { + alias: ["token"], description: "The address of the token used for voting.", type: "string", - default: defaults.tokenAddress, + customType: "hex", + default: config.get("token"), + conflicts: ["token-name", "token-symbol"], }, - "token-name": { + n: { + alias: ["token-name"], description: "The name of the mock token to be deployed for voting if no token address is provided.", type: "string", - default: defaults.tokenName, + default: config.get("tokenName"), + conflicts: ["token"], }, - "token-symbol": { + s: { + alias: ["token-symbol"], description: "The symbol of the mock token to be deployed for voting if no token address is provided.", type: "string", - default: defaults.tokenSymbol, + default: config.get("tokenSymbol"), + conflicts: ["token"], }, - "base-quorum": { + q: { + alias: ["quorum"], description: - "The minimum voting power required for a proposal to pass. Will be scaled by 10 ** token.decimals.", + "The minimum voting power required for a proposal to pass as a decimal string.", type: "string", - default: defaults.baseQuorum, + default: config.get("quorum"), required: true, }, - "min-proposal-power": { + m: { + alias: ["min-proposal-power"], description: - "The minimum voting power required to create a proposal. Will be scaled by 10 ** token.decimals.", + "The minimum voting power required to create a proposal as a decimal string.", type: "string", - default: defaults.minProposalPower, + default: config.get("minProposalPower"), required: true, }, - "lock-duration": { + d: { + alias: ["lock-duration"], description: "The number of blocks a proposal must wait before it can be executed.", type: "number", - default: defaults.lockDuration, + default: config.get("lockDuration"), }, - "extra-voting-blocks": { + b: { + alias: ["extra-voting-blocks"], description: "The number of blocks for which a proposal can still be voted on after it's unlocked.", type: "number", - default: defaults.extraVotingBlocks, + default: config.get("extraVotingBlocks"), }, - "treasury-address": { + T: { + alias: ["treasury"], description: "The address of the treasury contract.", type: "string", - default: defaults.treasuryAddress, + customType: "hex", + default: config.get("treasury"), }, - "stale-block-lag": { + l: { + alias: ["stale-block-lag"], description: "The number of blocks before the delegation history is forgotten. Voting power can't be used on proposals that are older than the stale block lag.", type: "number", - default: Number(defaults.staleBlockLag), - required: true, - }, - out: { - alias: ["out-dir"], - description: - "The directory to write the contract addresses to; relative to the current working directory.", - type: "string", - default: defaults.outDir, + default: Number(config.get("staleBlockLag")), required: true, }, - name: { - description: "The name of the deployment.", - type: "string", - default: defaults.name, - }, }, handler: async ({ data, options, fork, next }) => { - const { account, chain, rpcUrl } = data as WriteOptions; - - const publicClient = createPublicClient({ - transport: http(rpcUrl), - chain, - }); - const walletClient = createWalletClient({ - account, - transport: http(rpcUrl), - chain, - }); - const council = new ReadWriteCouncil({ publicClient, walletClient }); + const { deployer, council, chain, publicClient } = data as DeployOptions; - const contractInfos: ContractInfo[] = []; const isFreshDeploy = await options.freshDeploy(); signale.pending("Deploying Council contracts..."); @@ -138,109 +101,84 @@ export default command({ // 1. Voting Token // ========================================================================= - let votingTokenAddress: string | undefined; + let votingTokenAddress: Address | undefined; if (!isFreshDeploy) { - votingTokenAddress = await options.tokenAddress({ + votingTokenAddress = await options.token({ prompt: `Enter voting token address ${colors.dim( "(leave blank to deploy a mock voting token)", )}`, }); } - // Used to scale voting power to match the token's decimals - let decimals = 18; - - // If a voting token address was provided, fetch the name and decimals - if (votingTokenAddress) { - signale.pending("Fetching data from voting token..."); - - const token = council.token(votingTokenAddress as `0x${string}`); - const tokenName = await token.getName(); - decimals = await token.getDecimals(); - - signale.success(`Data successfully fetched from voting token`); - - contractInfos.push({ - name: tokenName, - address: votingTokenAddress, - }); - } - // Deploy a mock voting token if no voting token address was provided if (!votingTokenAddress) { - const tokenName = await options.tokenName({ + const name = await options.tokenName({ prompt: "Enter voting token name", }); - const tokenSymbol = await options.tokenSymbol({ + const symbol = await options.tokenSymbol({ prompt: "Enter voting token symbol", }); - const tokenDeployData: DeployedContract = await fork({ + const { address } = (await fork({ commands: [deployMockErc20Command], - optionValues: { - name: tokenName, - symbol: tokenSymbol, - }, - }); + optionValues: { name, symbol }, + })) as DeployedContractInfo; - votingTokenAddress = tokenDeployData.address; - - contractInfos.push({ - name: tokenName, - ...tokenDeployData, - }); + votingTokenAddress = address; } // ========================================================================= // 2. CoreVoting // ========================================================================= - const baseQuorum = await options.baseQuorum({ - prompt: "Enter base quorum", + const quorum = await options.quorum({ + prompt: "Enter default quorum", }); const minProposalPower = await options.minProposalPower({ prompt: "Enter minimum proposal power", }); - const coreVotingDeployData: DeployedContract = await fork({ + const coreVotingDeployInfo = (await fork({ commands: [deployCoreVotingCommand], optionValues: { - quorum: baseQuorum, - minPower: minProposalPower, - decimals, + quorum, + minProposalPower, vaults: isFreshDeploy ? [] : undefined, }, - }); - - contractInfos.push({ - name: "CoreVoting", - ...coreVotingDeployData, - }); + })) as DeployedContractInfo; - const coreVoting = council.coreVoting({ - address: coreVotingDeployData.address, + const coreVoting = council.coreVoting(coreVotingDeployInfo.address); + const lockDuration = await options.lockDuration({ + prompt: `Enter proposal lock duration ${colors.dim("in blocks")}`, }); - const lockDuration = await options.lockDuration(); // Set the CoreVoting lock duration if provided if (lockDuration) { signale.pending(`Setting CoreVoting lock duration to ${lockDuration}...`); const hash = await coreVoting.setLockDuration({ - blocks: BigInt(lockDuration), + args: { + blocks: BigInt(lockDuration), + }, + options: { + onMined: () => { + signale.success( + `Successfully set CoreVoting lock duration to ${lockDuration}`, + ); + }, + }, }); signale.pending(`CoreVoting lock duration tx submitted: ${hash}`); await publicClient.waitForTransactionReceipt({ hash }); - signale.success( - `Successfully set CoreVoting lock duration to ${lockDuration}`, - ); } - const extraVotingBlocks = await options.extraVotingBlocks(); + const extraVotingBlocks = await options.extraVotingBlocks({ + prompt: `Enter extra voting time ${colors.dim("(in blocks)")}`, + }); // Set the CoreVoting extra voting time if provided if (extraVotingBlocks) { @@ -249,14 +187,20 @@ export default command({ ); const hash = await coreVoting.changeExtraVotingTime({ - extraVoteBlocks: BigInt(extraVotingBlocks), + args: { + extraVoteBlocks: BigInt(extraVotingBlocks), + }, + options: { + onMined: () => { + signale.success( + `Successfully set CoreVoting extra voting time to ${extraVotingBlocks}`, + ); + }, + }, }); signale.pending(`CoreVoting extra voting time tx submitted: ${hash}`); await publicClient.waitForTransactionReceipt({ hash }); - signale.success( - `Successfully set CoreVoting extra voting time to ${extraVotingBlocks}`, - ); } // ========================================================================= @@ -267,56 +211,60 @@ export default command({ prompt: "Enter stale block lag", }); - const localChainIds: number[] = [hardhat.id, localhost.id, foundry.id]; if (localChainIds.includes(chain.id)) { - const blocksToMine = staleBlockLag * 2; - // Calling queryVotePower on a voting vault that has a stale block lag larger - // than the current block height will result in an error. To avoid this, we - // we fast forward the block height by the stale block lag. - signale.pending( - `Fast forwarding block height by ${blocksToMine} blocks...`, - ); - - const blockNumber = await mine({ - blocks: blocksToMine, - client: publicClient, - }); - - signale.success( - `Successfully fast forwarded block height to ${blockNumber}`, - ); + const currentBlock = await publicClient.getBlockNumber(); + // Calling queryVotePower on a voting vault that has a stale block lag + // larger than the current block height will result in an error. To avoid + // this, we we fast forward the block height. + const blocksToMine = staleBlockLag + 1 - Number(currentBlock); + + if (blocksToMine > 0) { + signale.pending( + `Fast forwarding block height by ${blocksToMine} blocks...`, + ); + + const blockNumber = await mine({ + blocks: blocksToMine, + client: publicClient, + }); + + signale.success( + `Successfully fast forwarded block height to ${blockNumber}`, + ); + } } - const lockingVaultDeployData: DeployedContract = await fork({ + const lockingVaultDeployInfo = (await fork({ commands: [deployLockingVaultCommand], optionValues: { token: votingTokenAddress, staleBlockLag, }, - }); - contractInfos.push({ - name: "LockingVault", - ...lockingVaultDeployData, - }); + })) as DeployedContractInfo; - const lockVaultProxyDeployData: DeployedContract = await fork({ + const lockVaultProxyDeployInfo = (await fork({ commands: [deploySimpleProxyCommand], optionValues: { - owner: coreVotingDeployData.address, - implementation: lockingVaultDeployData.address, + governance: coreVotingDeployInfo.address, + implementation: lockingVaultDeployInfo.address, }, - }); - contractInfos.push({ - name: "LockingVaultProxy", - ...lockVaultProxyDeployData, - }); + })) as DeployedContractInfo; // Approve the vault to be used by the CoreVoting contract signale.pending("Changing LockingVault SimpleProxy status in CoreVoting"); const lockingVaultStatusHash = await coreVoting.changeVaultStatus({ - vault: lockVaultProxyDeployData.address, - isValid: true, + args: { + vault: lockVaultProxyDeployInfo.address, + isValid: true, + }, + options: { + onMined: () => { + signale.success( + "Successfully changed LockingVault SimpleProxy status in CoreVoting", + ); + }, + }, }); signale.pending( @@ -325,79 +273,34 @@ export default command({ await publicClient.waitForTransactionReceipt({ hash: lockingVaultStatusHash, }); - signale.success( - "Successfully changed LockingVault SimpleProxy status in CoreVoting", - ); // ========================================================================= // 4. Treasury // ========================================================================= - let treasuryAddress: string | undefined; + let treasury: Address | undefined; if (!isFreshDeploy) { - treasuryAddress = await options.treasuryAddress({ + treasury = await options.treasury({ prompt: `Enter Treasury address ${colors.dim( "(leave blank to deploy a new one)", )}`, }); } - if (!treasuryAddress) { - signale.pending("Deploying Treasury..."); - - const treasuryDeployData: DeployedContract = await fork({ + if (!treasury) { + await fork({ commands: [deployTreasury], optionValues: { - owner: coreVotingDeployData.address, + governance: coreVotingDeployInfo.address, }, }); - - contractInfos.push({ - name: "Treasury", - ...treasuryDeployData, - }); } // ========================================================================= - // 5. Save the addresses - // ========================================================================= - - const deploymentName = await options.name({ - prompt: "Enter deployment name", - }); - - const outDir = await options.outDir({ - prompt: "Enter output directory", - }); - - const store = getDeploymentStore(deploymentName, chain.id, outDir); - - await store.set({ - name: deploymentName, - chainId: chain.id, - timestamp: Date.now(), - deployer: account.address, - contracts: stringifyBigInts(contractInfos), - }); - - // ========================================================================= - // 7. DONE! + // DONE! // ========================================================================= - console.log("\n"); - signale.success("Council contracts deployed successfully!"); - console.log("\n"); - - console.log(colors.dim(`${"=".repeat(80)}`)); - contractInfos.forEach((contractInfo, i) => { - if (i !== 0) { - console.log(colors.dim(`${"-".repeat(80)}`)); - } - console.log(`${contractInfo.name}: ${contractInfo.address}`); - }); - console.log(colors.dim(`${"=".repeat(80)}`)); - - next(contractInfos); + next(deployer.deployedContracts); }, }); diff --git a/packages/council-cli/src/commands/deploy/spender.ts b/packages/council-cli/src/commands/deploy/spender.ts index 85261774..e9bd9d2b 100644 --- a/packages/council-cli/src/commands/deploy/spender.ts +++ b/packages/council-cli/src/commands/deploy/spender.ts @@ -1,146 +1,85 @@ import { Spender } from "@delvtech/council-artifacts/Spender"; import { command } from "clide-js"; -import signale from "signale"; -import { PrivateKeyAccount, parseUnits } from "viem"; -import { Chain } from "viem/chains"; -import { WriteOptions } from "../../reusable-options/writeOptions.js"; -import { - DeployedContract, - deployContract, -} from "../../utils/deployContract.js"; +import { parseUnits } from "viem"; +import { ownerOption } from "../../options/owner.js"; +import { DeployOptions } from "../deploy.js"; export default command({ description: "Deploy a Spender contract", options: { - owner: { - description: "The contract owner's address (e.g., a Timelock contract)", - type: "string", - }, - spender: { - description: "The first address authorized to spend tokens", - type: "string", - }, - token: { - description: "The address of the ERC20 token contract", + t: { + alias: ["token"], + description: "The address of the ERC20 token contract.", type: "string", + customType: "hex", required: true, }, - small: { + s: { alias: ["small-spend-limit"], - description: "The small spend proposal limit", + description: "The small spend proposal limit as a decimal string.", type: "string", required: true, }, - medium: { + m: { alias: ["medium-spend-limit"], - description: "The medium spend proposal limit", + description: "The medium spend proposal limit as a decimal string.", type: "string", required: true, }, - high: { + h: { alias: ["high-spend-limit"], - description: "The high spend proposal limit", + description: "The high spend proposal limit as a decimal string.", type: "string", required: true, }, - decimals: { + o: ownerOption, + S: { + alias: ["spender"], description: - "The decimal precision to use. The limit options will be multiplied by (10 ** decimals). For example, if the small limit is 100 and decimals is 18, then the result will be 100000000000000000000", - type: "number", - default: 18, + "The first address authorized to spend tokens. Defaults to the owner.", + type: "string", + customType: "hex", }, }, handler: async ({ data, options, next }) => { - const { account, chain, rpcUrl } = data as WriteOptions; - - const owner = (await options.owner()) || account.address; - - const spender = (await options.spender()) || owner; + const { council, account, deployer } = data as DeployOptions; const token = await options.token({ prompt: "Enter token address", }); - const small = await options.small({ + const small = await options.smallSpendLimit({ prompt: "Enter small spend limit", }); - const medium = await options.medium({ + const medium = await options.mediumSpendLimit({ prompt: "Enter medium spend limit", }); - const high = await options.high({ + const high = await options.highSpendLimit({ prompt: "Enter high spend limit", }); - const decimals = await options.decimals(); - - signale.pending("Deploying Spender..."); + const owner = (await options.owner()) || account.address; + const spender = (await options.spender()) || owner; + const decimals = await council.token(token).getDecimals(); - const deployData = await deploySpender({ - owner, - spender, - token, - smallSpendLimit: small, - mediumSpendLimit: medium, - highSpendLimit: high, - decimals, - account, - rpcUrl, - chain, - onSubmitted: (txHash) => { - signale.pending(`Spender deployment tx submitted: ${txHash}`); + const deployedContract = await deployer.deploy({ + abi: Spender.abi, + bytecode: Spender.bytecode, + name: "Spender", + args: { + _highSpendLimit: parseUnits(high, decimals), + _mediumSpendLimit: parseUnits(medium, decimals), + _smallSpendLimit: parseUnits(small, decimals), + _token: token, + _owner: owner, + _spender: spender, }, }); - signale.success(`Spender deployed @ ${deployData.address}`); - next(deployData); + next(deployedContract); }, }); - -export interface DeploySpenderOptions { - owner: string; - spender: string; - token: string; - smallSpendLimit: string; - mediumSpendLimit: string; - highSpendLimit: string; - decimals: number; - account: PrivateKeyAccount; - rpcUrl: string; - chain: Chain; - onSubmitted?: (txHash: string) => void; -} - -export async function deploySpender({ - owner, - spender, - token, - smallSpendLimit, - mediumSpendLimit, - highSpendLimit, - decimals, - account, - rpcUrl, - chain, - onSubmitted, -}: DeploySpenderOptions): Promise { - return deployContract({ - abi: Spender.abi, - args: [ - owner as `0x${string}`, - spender as `0x${string}`, - token as `0x${string}`, - parseUnits(smallSpendLimit, decimals), - parseUnits(mediumSpendLimit, decimals), - parseUnits(highSpendLimit, decimals), - ], - bytecode: Spender.bytecode, - account, - rpcUrl, - chain, - onSubmitted, - }); -} diff --git a/packages/council-cli/src/commands/deploy/timelock.ts b/packages/council-cli/src/commands/deploy/timelock.ts index ceb3ec11..0ade0bc2 100644 --- a/packages/council-cli/src/commands/deploy/timelock.ts +++ b/packages/council-cli/src/commands/deploy/timelock.ts @@ -1,94 +1,55 @@ import { Timelock } from "@delvtech/council-artifacts/Timelock"; import { command } from "clide-js"; -import signale from "signale"; -import { WriteOptions } from "src/reusable-options/writeOptions.js"; -import { PrivateKeyAccount } from "viem"; -import { Chain } from "viem/chains"; -import { - DeployedContract, - deployContract, -} from "../../utils/deployContract.js"; +import { ownerOption } from "../../options/owner.js"; +import { DeployOptions } from "../deploy.js"; export default command({ description: "Deploy a Timelock contract", options: { - time: { + t: { alias: ["wait-time"], description: - "The time (in seconds) to wait until a proposal can be executed", + "The time (in seconds) to wait until a proposal can be executed.", type: "number", required: true, }, - owner: { - description: "The contract owner's address (e.g., a CoreVoting contract)", - type: "string", - }, gsc: { - description: "The address of the GSC contract", + description: "The address of the GSC contract.", type: "string", + customType: "hex", required: true, }, + g: { + ...ownerOption, + alias: ["governance", ...ownerOption.alias], + }, }, handler: async ({ data, options, next }) => { - const { account, chain, rpcUrl } = data as WriteOptions; + const { account, deployer } = data as DeployOptions; - const time = await options.time({ + const waitTime = await options.waitTime({ prompt: "Enter wait time (in seconds)", }); - const owner = (await options.owner()) || account.address; - const gsc = await options.gsc({ prompt: "Enter GSC address", }); - signale.pending("Deploying Timelock..."); + const governance = (await options.governance()) || account.address; - const deployData = await deployTimelock({ - waitTime: time, - owner, - gsc, - account, - rpcUrl, - chain, - onSubmitted: (txHash) => { - signale.pending(`Timelock deployment tx submitted: ${txHash}`); + const deployedContract = await deployer.deploy({ + abi: Timelock.abi, + bytecode: Timelock.bytecode, + name: "Timelock", + args: { + _waitTime: BigInt(waitTime), + _gsc: gsc, + _governance: governance, }, }); - signale.success(`Timelock deployed @ ${deployData.address}`); - next(deployData); + next(deployedContract); }, }); - -export interface DeployTimelockOptions { - waitTime: number; - gsc: string; - account: PrivateKeyAccount; - rpcUrl: string; - owner?: string; - chain: Chain; - onSubmitted?: (txHash: string) => void; -} - -export async function deployTimelock({ - waitTime, - gsc, - account, - rpcUrl, - chain, - owner = account.address, - onSubmitted, -}: DeployTimelockOptions): Promise { - return await deployContract({ - abi: Timelock.abi, - args: [BigInt(waitTime), owner as `0x${string}`, gsc as `0x${string}`], - bytecode: Timelock.bytecode, - account, - rpcUrl, - chain, - onSubmitted, - }); -} diff --git a/packages/council-cli/src/commands/deploy/treasury.ts b/packages/council-cli/src/commands/deploy/treasury.ts index e3d51b03..f999b5e1 100644 --- a/packages/council-cli/src/commands/deploy/treasury.ts +++ b/packages/council-cli/src/commands/deploy/treasury.ts @@ -1,69 +1,32 @@ import { Treasury } from "@delvtech/council-artifacts/Treasury"; import { command } from "clide-js"; -import signale from "signale"; -import { PrivateKeyAccount } from "viem"; -import { Chain } from "viem/chains"; -import { WriteOptions } from "../../reusable-options/writeOptions.js"; -import { - DeployedContract, - deployContract, -} from "../../utils/deployContract.js"; +import { ownerOption } from "../../options/owner.js"; +import { DeployOptions } from "../deploy.js"; export default command({ description: "Deploy a Treasury contract", options: { - owner: { - description: "The contract owner's address (e.g., a Timelock contract)", - type: "string", - required: true, + g: { + ...ownerOption, + alias: ["governance", ...ownerOption.alias], }, }, handler: async ({ data, options, next }) => { - const { account, chain, rpcUrl } = data as WriteOptions; + const { account, deployer } = data as DeployOptions; - const owner = (await options.owner()) || account.address; + const governance = (await options.owner()) || account.address; - signale.pending("Deploying Treasury..."); - - const deployData = await deployTreasury({ - owner, - account, - rpcUrl, - chain, - onSubmitted: (txHash) => { - signale.pending(`Treasury deployment tx submitted: ${txHash}`); + const deployedContract = await deployer.deploy({ + abi: Treasury.abi, + bytecode: Treasury.bytecode, + name: "Treasury", + args: { + __governance: governance, }, }); - signale.success(`Treasury deployed @ ${deployData.address}`); - next(deployData); + next(deployedContract); }, }); - -export interface DeployTreasuryOptions { - account: PrivateKeyAccount; - rpcUrl: string; - chain: Chain; - owner?: string; - onSubmitted?: (txHash: string) => void; -} - -export async function deployTreasury({ - account, - rpcUrl, - chain, - owner = account.address, - onSubmitted, -}: DeployTreasuryOptions): Promise { - return await deployContract({ - abi: Treasury.abi, - args: [owner as `0x${string}`], - bytecode: Treasury.bytecode, - account, - rpcUrl, - chain, - onSubmitted, - }); -} diff --git a/packages/council-cli/src/commands/deploy/vesting-vault.ts b/packages/council-cli/src/commands/deploy/vesting-vault.ts index 874dd127..0d52603c 100644 --- a/packages/council-cli/src/commands/deploy/vesting-vault.ts +++ b/packages/council-cli/src/commands/deploy/vesting-vault.ts @@ -1,85 +1,48 @@ import { LockingVault } from "@delvtech/council-artifacts/LockingVault"; import { command } from "clide-js"; -import signale from "signale"; -import { PrivateKeyAccount } from "viem"; -import { Chain } from "viem/chains"; -import { WriteOptions } from "../../reusable-options/writeOptions.js"; -import { - DeployedContract, - deployContract, -} from "../../utils/deployContract.js"; +import { DeployOptions } from "../deploy.js"; export default command({ description: "Deploy a VestingVault contract", options: { - token: { - description: "The address of the ERC20 token contract", + t: { + alias: ["token"], + description: "The address of the ERC20 token contract.", type: "string", + customType: "hex", required: true, }, - lag: { + l: { alias: ["stale-block-lag"], description: - "The number of blocks before the delegation history is forgotten", + "The number of blocks before the delegation history is forgotten.", type: "number", required: true, }, }, handler: async ({ data, options, next }) => { - const { account, chain, rpcUrl } = data as WriteOptions; + const { deployer } = data as DeployOptions; const token = await options.token({ prompt: "Enter token address", }); - const lag = await options.lag({ + const staleBlockLag = await options.staleBlockLag({ prompt: "Enter stale block lag", }); - signale.pending("Deploying VestingVault..."); - - const deployData = await deployVestingVault({ - token, - staleBlockLag: lag, - account, - rpcUrl, - chain, - onSubmitted: (txHash) => { - signale.pending(`VestingVault deployment tx submitted: ${txHash}`); + const deployedContract = await deployer.deploy({ + abi: LockingVault.abi, + bytecode: LockingVault.bytecode, + name: "LockingVault", + args: { + _staleBlockLag: BigInt(staleBlockLag), + _token: token, }, }); - signale.success(`VestingVault deployed @ ${deployData.address}`); - next(deployData); + next(deployedContract); }, }); - -export interface DeployVestingVaultOptions { - token: string; - staleBlockLag: number; - account: PrivateKeyAccount; - rpcUrl: string; - chain: Chain; - onSubmitted?: (txHash: string) => void; -} - -export async function deployVestingVault({ - token, - staleBlockLag, - account, - rpcUrl, - chain, - onSubmitted, -}: DeployVestingVaultOptions): Promise { - return deployContract({ - abi: LockingVault.abi, - args: [token as `0x${string}`, BigInt(staleBlockLag)], - bytecode: LockingVault.bytecode, - account, - rpcUrl, - chain, - onSubmitted, - }); -} diff --git a/packages/council-cli/src/commands/encode.ts b/packages/council-cli/src/commands/encode.ts index 2d4c061b..f6d672a3 100644 --- a/packages/council-cli/src/commands/encode.ts +++ b/packages/council-cli/src/commands/encode.ts @@ -1,6 +1,5 @@ -import { command, passThroughCommand } from "clide-js"; +import { command } from "clide-js"; export default command({ - ...passThroughCommand, description: "Encode call data for a contract function", }); diff --git a/packages/council-cli/src/commands/encode/airdrop/reclaim.ts b/packages/council-cli/src/commands/encode/airdrop/reclaim.ts index 71d62943..95f90f58 100644 --- a/packages/council-cli/src/commands/encode/airdrop/reclaim.ts +++ b/packages/council-cli/src/commands/encode/airdrop/reclaim.ts @@ -1,34 +1,33 @@ import { Airdrop } from "@delvtech/council-artifacts/Airdrop"; +import { encodeFunctionData } from "@delvtech/drift"; import { command } from "clide-js"; import signale from "signale"; -import { encodeFunctionData } from "viem"; export default command({ description: "Encode call data for Airdrop.reclaim", options: { - recipient: { + d: { alias: ["destination"], description: "The recipient of the reclaimed funds", type: "string", + customType: "hex", required: true, }, }, handler: async ({ options, next }) => { - const recipient = await options.recipient({ - prompt: "Enter recipient address", + const destination = await options.destination({ + prompt: "Enter destination address", }); - const encoded = encodeReclaim(recipient); + + const encoded = encodeFunctionData({ + abi: Airdrop.abi, + fn: "reclaim", + args: { destination }, + }); + signale.success(encoded); next(encoded); }, }); - -function encodeReclaim(recipient: string) { - return encodeFunctionData({ - abi: Airdrop.abi, - functionName: "reclaim", - args: [recipient as `0x${string}`], - }); -} diff --git a/packages/council-cli/src/commands/encode/authorizable/authorize.ts b/packages/council-cli/src/commands/encode/authorizable/authorize.ts index 8c96f3b4..ac70ec01 100644 --- a/packages/council-cli/src/commands/encode/authorizable/authorize.ts +++ b/packages/council-cli/src/commands/encode/authorizable/authorize.ts @@ -1,16 +1,17 @@ import { Authorizable } from "@delvtech/council-artifacts/Authorizable"; +import { encodeFunctionData } from "@delvtech/drift"; import { command } from "clide-js"; import signale from "signale"; -import { encodeFunctionData } from "viem"; export default command({ description: "Encode call data for Authorizable.authorize", options: { - address: { - alias: ["who"], + a: { + alias: ["address", "who"], description: "The address to authorize", type: "string", + customType: "hex", required: true, }, }, @@ -20,17 +21,13 @@ export default command({ prompt: "Enter address", }); - const encoded = encodeAuthorize(address); + const encoded = encodeFunctionData({ + abi: Authorizable.abi, + fn: "authorize", + args: { who: address }, + }); signale.success(encoded); next(encoded); }, }); - -export function encodeAuthorize(address: string): string { - return encodeFunctionData({ - abi: Authorizable.abi, - functionName: "authorize", - args: [address as `0x${string}`], - }); -} diff --git a/packages/council-cli/src/commands/encode/authorizable/deauthorize.ts b/packages/council-cli/src/commands/encode/authorizable/deauthorize.ts index 8c9378fb..6a222eed 100644 --- a/packages/council-cli/src/commands/encode/authorizable/deauthorize.ts +++ b/packages/council-cli/src/commands/encode/authorizable/deauthorize.ts @@ -1,16 +1,17 @@ import { Authorizable } from "@delvtech/council-artifacts/Authorizable"; +import { encodeFunctionData } from "@delvtech/drift"; import { command } from "clide-js"; import signale from "signale"; -import { encodeFunctionData } from "viem"; export default command({ description: "Encode call data for Authorizable.deauthorize", options: { - address: { - alias: ["who"], + a: { + alias: ["address", "who"], description: "The address to remove authorization from", type: "string", + customType: "hex", required: true, }, }, @@ -20,17 +21,13 @@ export default command({ prompt: "Enter address", }); - const encoded = encodeDeauthorize(address); + const encoded = encodeFunctionData({ + abi: Authorizable.abi, + fn: "deauthorize", + args: { who: address }, + }); signale.success(encoded); next(encoded); }, }); - -export function encodeDeauthorize(address: string): string { - return encodeFunctionData({ - abi: Authorizable.abi, - functionName: "deauthorize", - args: [address as `0x${string}`], - }); -} diff --git a/packages/council-cli/src/commands/encode/authorizable/set-owner.ts b/packages/council-cli/src/commands/encode/authorizable/set-owner.ts index b2441deb..3422b3e6 100644 --- a/packages/council-cli/src/commands/encode/authorizable/set-owner.ts +++ b/packages/council-cli/src/commands/encode/authorizable/set-owner.ts @@ -1,16 +1,17 @@ import { Authorizable } from "@delvtech/council-artifacts/Authorizable"; +import { encodeFunctionData } from "@delvtech/drift"; import { command } from "clide-js"; import signale from "signale"; -import { encodeFunctionData } from "viem"; export default command({ description: "Encode call data for Authorizable.setOwner", options: { - address: { - alias: ["who"], + a: { + alias: ["address", "who"], description: "The address to set as the owner", type: "string", + customType: "hex", required: true, }, }, @@ -20,17 +21,13 @@ export default command({ prompt: "Enter owner address", }); - const encoded = encodeSetOwner(address); + const encoded = encodeFunctionData({ + abi: Authorizable.abi, + fn: "setOwner", + args: { who: address }, + }); signale.success(encoded); next(encoded); }, }); - -export function encodeSetOwner(address: string): string { - return encodeFunctionData({ - abi: Authorizable.abi, - functionName: "setOwner", - args: [address as `0x${string}`], - }); -} diff --git a/packages/council-cli/src/commands/encode/core-voting/change-extra-voting-time.ts b/packages/council-cli/src/commands/encode/core-voting/change-extra-voting-time.ts index 98d3d742..d80fbba8 100644 --- a/packages/council-cli/src/commands/encode/core-voting/change-extra-voting-time.ts +++ b/packages/council-cli/src/commands/encode/core-voting/change-extra-voting-time.ts @@ -1,14 +1,14 @@ import { CoreVoting } from "@delvtech/council-artifacts/CoreVoting"; +import { encodeFunctionData } from "@delvtech/drift"; import { command } from "clide-js"; import signale from "signale"; -import { encodeFunctionData } from "viem"; export default command({ description: "Encode call data for CoreVoting.changeExtraVotingTime", options: { - blocks: { - alias: ["extra-vote-time"], + b: { + alias: ["blocks", "extra-vote-time"], description: "The number of blocks for which a proposal can still be voted on after it's unlocked", type: "number", @@ -17,19 +17,17 @@ export default command({ }, handler: async ({ options, next }) => { - const blocks = await options.blocks({ + const blocks = await options.extraVoteTime({ prompt: "Enter extra voting time (in blocks)", }); - const encoded = encodeChangeExtraVotingTime(blocks); + + const encoded = encodeFunctionData({ + abi: CoreVoting.abi, + fn: "changeExtraVotingTime", + args: { _extraVoteTime: BigInt(blocks) }, + }); + signale.success(encoded); next(encoded); }, }); - -export function encodeChangeExtraVotingTime(duration: number): string { - return encodeFunctionData({ - abi: CoreVoting.abi, - functionName: "changeExtraVotingTime", - args: [BigInt(duration)], - }); -} diff --git a/packages/council-cli/src/commands/encode/core-voting/change-vault-status.ts b/packages/council-cli/src/commands/encode/core-voting/change-vault-status.ts index 30bc611b..3a0af2a4 100644 --- a/packages/council-cli/src/commands/encode/core-voting/change-vault-status.ts +++ b/packages/council-cli/src/commands/encode/core-voting/change-vault-status.ts @@ -1,19 +1,21 @@ import { CoreVoting } from "@delvtech/council-artifacts/CoreVoting"; +import { encodeFunctionData } from "@delvtech/drift"; import { command } from "clide-js"; import signale from "signale"; -import { encodeFunctionData } from "viem"; export default command({ description: "Encode call data for CoreVoting.changeVaultStatus", options: { - vault: { + v: { + alias: ["vault"], description: "The voting vault's address", type: "string", + customType: "hex", required: true, }, - approved: { - alias: ["is-valid"], + a: { + alias: ["approved", "is-valid"], description: "Whether or not the vault should be approved", type: "boolean", required: true, @@ -25,7 +27,7 @@ export default command({ prompt: "Enter voting vault address", }); - const approved = await options.approved({ + const isValid = await options.isValid({ prompt: { message: "Enter approval status", active: "Approved", @@ -33,19 +35,13 @@ export default command({ }, }); - const encoded = encodeChangeVaultStatus(vault, approved); + const encoded = encodeFunctionData({ + abi: CoreVoting.abi, + fn: "changeVaultStatus", + args: { isValid, vault }, + }); + signale.success(encoded); next(encoded); }, }); - -export function encodeChangeVaultStatus( - vault: string, - approved: boolean, -): string { - return encodeFunctionData({ - abi: CoreVoting.abi, - functionName: "changeVaultStatus", - args: [vault as `0x${string}`, approved], - }); -} diff --git a/packages/council-cli/src/commands/encode/core-voting/set-custom-quorum.ts b/packages/council-cli/src/commands/encode/core-voting/set-custom-quorum.ts index 5b17e394..2d921d36 100644 --- a/packages/council-cli/src/commands/encode/core-voting/set-custom-quorum.ts +++ b/packages/council-cli/src/commands/encode/core-voting/set-custom-quorum.ts @@ -1,36 +1,34 @@ import { CoreVoting } from "@delvtech/council-artifacts/CoreVoting"; +import { encodeFunctionData } from "@delvtech/drift"; import { command } from "clide-js"; import signale from "signale"; -import { encodeFunctionData, parseUnits } from "viem"; +import { parseEther } from "viem"; export default command({ description: "Encode call data for CoreVoting.setCustomQuorum", options: { - target: { + t: { + alias: ["target"], description: "The address to set a custom quorum for", type: "string", + customType: "hex", required: true, }, f: { alias: ["function", "selector"], description: "The 4 byte function selector to set a custom quorum for", type: "string", + customType: "hex", required: true, }, - power: { + q: { alias: ["quorum"], description: "A new base quorum for the specific function (e.g. 0x12345678)", type: "string", required: true, }, - decimals: { - description: - "The decimal precision used by the contract. The power option will be multiplied by (10 ** decimals). For example, if power is 100 and decimals is 18, then the result will be 100000000000000000000", - type: "number", - default: 18, - }, }, handler: async ({ options, next }) => { @@ -42,31 +40,21 @@ export default command({ prompt: "Enter 4 byte function selector", }); - const power = await options.power({ + const quorum = await options.quorum({ prompt: "Enter new base quorum", }); - const decimals = await options.decimals(); + const encoded = encodeFunctionData({ + abi: CoreVoting.abi, + fn: "setCustomQuorum", + args: { + target, + selector, + quorum: parseEther(quorum), + }, + }); - const encoded = encodeSetCustomQuorum(target, selector, power, decimals); signale.success(encoded); next(encoded); }, }); - -export function encodeSetCustomQuorum( - target: string, - selector: string, - quorum: string, - decimals: number, -): string { - return encodeFunctionData({ - abi: CoreVoting.abi, - functionName: "setCustomQuorum", - args: [ - target as `0x${string}`, - selector as `0x${string}`, - parseUnits(quorum, decimals), - ], - }); -} diff --git a/packages/council-cli/src/commands/encode/core-voting/set-default-quorum.ts b/packages/council-cli/src/commands/encode/core-voting/set-default-quorum.ts index 1bfa91e8..5505a7f3 100644 --- a/packages/council-cli/src/commands/encode/core-voting/set-default-quorum.ts +++ b/packages/council-cli/src/commands/encode/core-voting/set-default-quorum.ts @@ -1,46 +1,33 @@ import { CoreVoting } from "@delvtech/council-artifacts/CoreVoting"; +import { encodeFunctionData } from "@delvtech/drift"; import { command } from "clide-js"; import signale from "signale"; -import { encodeFunctionData, parseUnits } from "viem"; +import { parseEther } from "viem"; export default command({ description: "Encode call data for CoreVoting.setDefaultQuorum", options: { - power: { + q: { alias: ["quorum"], - description: "The new base quorum", + description: "The new base quorum.", type: "string", required: true, }, - decimals: { - description: - "The decimal precision used by the contract. The quorum option will be multiplied by (10 ** decimals). For example, if quorum is 100 and decimals is 18, then the result will be 100000000000000000000", - type: "number", - default: 18, - }, }, handler: async ({ options, next }) => { - const power = await options.power({ + const quorum = await options.quorum({ prompt: "Enter new base quorum", }); - const decimals = await options.decimals(); + const encoded = encodeFunctionData({ + abi: CoreVoting.abi, + fn: "setDefaultQuorum", + args: { quorum: parseEther(quorum) }, + }); - const encoded = encodeSetDefaultQuorum(power, decimals); signale.success(encoded); next(encoded); }, }); - -export function encodeSetDefaultQuorum( - quorum: string, - decimals: number, -): string { - return encodeFunctionData({ - abi: CoreVoting.abi, - functionName: "setDefaultQuorum", - args: [parseUnits(quorum, decimals)], - }); -} diff --git a/packages/council-cli/src/commands/encode/core-voting/set-lock-duration.ts b/packages/council-cli/src/commands/encode/core-voting/set-lock-duration.ts index 160b261a..db0aaee7 100644 --- a/packages/council-cli/src/commands/encode/core-voting/set-lock-duration.ts +++ b/packages/council-cli/src/commands/encode/core-voting/set-lock-duration.ts @@ -1,16 +1,16 @@ import { CoreVoting } from "@delvtech/council-artifacts/CoreVoting"; +import { encodeFunctionData } from "@delvtech/drift"; import { command } from "clide-js"; import signale from "signale"; -import { encodeFunctionData } from "viem"; export default command({ description: "Encode call data for CoreVoting.setLockDuration", options: { - blocks: { - alias: ["lock-duration"], + b: { + alias: ["blocks", "lock-duration"], description: - "The number of blocks that must pass before a new proposal can be executed", + "The number of blocks that must pass before a new proposal can be executed.", type: "number", required: true, }, @@ -20,16 +20,14 @@ export default command({ const blocks = await options.blocks({ prompt: "Enter new lock duration (in blocks)", }); - const encoded = encodeSetLockDuration(blocks); + + const encoded = encodeFunctionData({ + abi: CoreVoting.abi, + fn: "setLockDuration", + args: { _lockDuration: BigInt(blocks) }, + }); + signale.success(encoded); next(encoded); }, }); - -export function encodeSetLockDuration(duration: number): string { - return encodeFunctionData({ - abi: CoreVoting.abi, - functionName: "setLockDuration", - args: [BigInt(duration)], - }); -} diff --git a/packages/council-cli/src/commands/encode/core-voting/set-min-proposal-power.ts b/packages/council-cli/src/commands/encode/core-voting/set-min-proposal-power.ts index d8d6ee44..816dabf4 100644 --- a/packages/council-cli/src/commands/encode/core-voting/set-min-proposal-power.ts +++ b/packages/council-cli/src/commands/encode/core-voting/set-min-proposal-power.ts @@ -1,24 +1,19 @@ import { CoreVoting } from "@delvtech/council-artifacts/CoreVoting"; +import { encodeFunctionData } from "@delvtech/drift"; import { command } from "clide-js"; import signale from "signale"; -import { encodeFunctionData, parseUnits } from "viem"; +import { parseEther } from "viem"; export default command({ description: "Encode call data for CoreVoting.setMinProposalPower", options: { - power: { - alias: ["min-proposal-power"], - description: "The minimum voting power required to create a proposal", + p: { + alias: ["power", "min-proposal-power"], + description: "The minimum voting power required to create a proposal.", type: "string", required: true, }, - decimals: { - description: - "The decimal precision used by the contract. The power option will be multiplied by (10 ** decimals). For example, if power is 100 and decimals is 18, then the result will be 100000000000000000000", - type: "number", - default: 18, - }, }, handler: async ({ options, next }) => { @@ -26,21 +21,15 @@ export default command({ prompt: "Enter minimum voting power", }); - const decimals = await options.decimals(); + const encoded = encodeFunctionData({ + abi: CoreVoting.abi, + fn: "setMinProposalPower", + args: { + _minProposalPower: parseEther(power), + }, + }); - const encoded = encodeSetMinProposalPower(power, decimals); signale.success(encoded); next(encoded); }, }); - -export function encodeSetMinProposalPower( - power: string, - decimals: number, -): string { - return encodeFunctionData({ - abi: CoreVoting.abi, - functionName: "setMinProposalPower", - args: [parseUnits(power, decimals)], - }); -} diff --git a/packages/council-cli/src/commands/encode/gsc-vault/set-core-voting.ts b/packages/council-cli/src/commands/encode/gsc-vault/set-core-voting.ts index cfeec6b2..54de36f5 100644 --- a/packages/council-cli/src/commands/encode/gsc-vault/set-core-voting.ts +++ b/packages/council-cli/src/commands/encode/gsc-vault/set-core-voting.ts @@ -1,16 +1,17 @@ import { GSCVault } from "@delvtech/council-artifacts/GSCVault"; +import { encodeFunctionData } from "@delvtech/drift"; import { command } from "clide-js"; import signale from "signale"; -import { encodeFunctionData } from "viem"; export default command({ description: "Encode call data for GSCVault.setCoreVoting", options: { - address: { - alias: ["new-voting"], - description: "The new core voting contract address", + a: { + alias: ["address", "new-voting"], + description: "The new core voting contract address.", type: "string", + customType: "hex", required: true, }, }, @@ -19,16 +20,14 @@ export default command({ const address = await options.address({ prompt: "Enter core voting address", }); - const encoded = encodeSetCoreVoting(address); + + const encoded = encodeFunctionData({ + abi: GSCVault.abi, + fn: "setCoreVoting", + args: { _newVoting: address }, + }); + signale.success(encoded); next(encoded); }, }); - -export function encodeSetCoreVoting(address: string): string { - return encodeFunctionData({ - abi: GSCVault.abi, - functionName: "setCoreVoting", - args: [address as `0x${string}`], - }); -} diff --git a/packages/council-cli/src/commands/encode/gsc-vault/set-idle-duration.ts b/packages/council-cli/src/commands/encode/gsc-vault/set-idle-duration.ts index 42c9a2d2..7db426f9 100644 --- a/packages/council-cli/src/commands/encode/gsc-vault/set-idle-duration.ts +++ b/packages/council-cli/src/commands/encode/gsc-vault/set-idle-duration.ts @@ -1,16 +1,16 @@ import { GSCVault } from "@delvtech/council-artifacts/GSCVault"; +import { encodeFunctionData } from "@delvtech/drift"; import { command } from "clide-js"; import signale from "signale"; -import { encodeFunctionData } from "viem"; export default command({ description: "Encode call data for GSCVault.setIdleDuration", options: { - time: { - alias: ["idle-duration"], + t: { + alias: ["time", "idle-duration"], description: - "The time (in seconds) new members must wait before they can vote", + "The time (in seconds) new members must wait before they can vote.", type: "number", required: true, }, @@ -20,16 +20,14 @@ export default command({ const time = await options.time({ prompt: "Enter new idle time (in seconds)", }); - const encoded = encodeSetIdleDuration(time); + + const encoded = encodeFunctionData({ + abi: GSCVault.abi, + fn: "setIdleDuration", + args: { _idleDuration: BigInt(time) }, + }); + signale.success(encoded); next(encoded); }, }); - -export function encodeSetIdleDuration(time: number): string { - return encodeFunctionData({ - abi: GSCVault.abi, - functionName: "setIdleDuration", - args: [BigInt(time)], - }); -} diff --git a/packages/council-cli/src/commands/encode/gsc-vault/set-vote-power-bound.ts b/packages/council-cli/src/commands/encode/gsc-vault/set-vote-power-bound.ts index f319bea6..43879253 100644 --- a/packages/council-cli/src/commands/encode/gsc-vault/set-vote-power-bound.ts +++ b/packages/council-cli/src/commands/encode/gsc-vault/set-vote-power-bound.ts @@ -1,46 +1,33 @@ import { GSCVault } from "@delvtech/council-artifacts/GSCVault"; +import { encodeFunctionData } from "@delvtech/drift"; import { command } from "clide-js"; import signale from "signale"; -import { encodeFunctionData, parseUnits } from "viem"; +import { parseEther } from "viem"; export default command({ description: "Encode call data for GSCVault.setVotePowerBound", options: { - bound: { - alias: ["power"], - description: "The new required voting power to become a member", + p: { + alias: ["power", "new-bound"], + description: "The new required voting power to become a member.", type: "string", required: true, }, - decimals: { - description: - "The decimal precision used by the contract. The power option will be multiplied by (10 ** decimals). For example, if power is 100 and decimals is 18, then the result will be 100000000000000000000", - type: "number", - default: 18, - }, }, handler: async ({ options, next }) => { - const power = await options.power({ + const newBound = await options.newBound({ prompt: "Enter new voting power bound", }); - const decimals = await options.decimals(); + const encoded = encodeFunctionData({ + abi: GSCVault.abi, + fn: "setVotePowerBound", + args: { _newBound: parseEther(newBound) }, + }); - const encoded = encodeSetVotePowerBound(power, decimals); signale.success(encoded); next(encoded); }, }); - -export function encodeSetVotePowerBound( - power: string, - decimals: number, -): string { - return encodeFunctionData({ - abi: GSCVault.abi, - functionName: "setVotePowerBound", - args: [parseUnits(power, decimals)], - }); -} diff --git a/packages/council-cli/src/commands/encode/locking-vault/change-delegation.ts b/packages/council-cli/src/commands/encode/locking-vault/change-delegation.ts index 848f80e4..e031d0fb 100644 --- a/packages/council-cli/src/commands/encode/locking-vault/change-delegation.ts +++ b/packages/council-cli/src/commands/encode/locking-vault/change-delegation.ts @@ -1,34 +1,33 @@ import { LockingVault } from "@delvtech/council-artifacts/LockingVault"; +import { encodeFunctionData } from "@delvtech/drift"; import { command } from "clide-js"; import signale from "signale"; -import { encodeFunctionData } from "viem"; export default command({ description: "Encode call data for LockingVault.changeDelegation", options: { - address: { - alias: ["new-delegate"], - description: "The address to delegate to", + a: { + alias: ["address", "new-delegate"], + description: "The address to delegate to.", type: "string", + customType: "hex", required: true, }, }, handler: async ({ options, next }) => { - const address = await options.address({ + const newDelegate = await options.newDelegate({ prompt: "Enter new delegate address", }); - const encoded = encodeChangeDelegation(address); + + const encoded = encodeFunctionData({ + abi: LockingVault.abi, + fn: "changeDelegation", + args: { newDelegate }, + }); + signale.success(encoded); next(encoded); }, }); - -export function encodeChangeDelegation(address: string): string { - return encodeFunctionData({ - abi: LockingVault.abi, - functionName: "changeDelegation", - args: [address as `0x${string}`], - }); -} diff --git a/packages/council-cli/src/commands/encode/locking-vault/deposit.ts b/packages/council-cli/src/commands/encode/locking-vault/deposit.ts index 3358de42..e20614b2 100644 --- a/packages/council-cli/src/commands/encode/locking-vault/deposit.ts +++ b/packages/council-cli/src/commands/encode/locking-vault/deposit.ts @@ -1,40 +1,45 @@ import { LockingVault } from "@delvtech/council-artifacts/LockingVault"; +import { encodeFunctionData } from "@delvtech/drift"; import { command } from "clide-js"; import signale from "signale"; -import { encodeFunctionData, parseUnits } from "viem"; +import { parseUnits } from "viem"; export default command({ description: "Encode call data for LockingVault.deposit", options: { - account: { - alias: ["funded-account"], - description: "The address to credit this deposit to", + a: { + alias: ["account", "funded-account"], + description: "The address to credit this deposit to.", type: "string", + customType: "hex", required: true, }, - amount: { - description: "The amount of tokens to deposit", + A: { + alias: ["amount"], + description: "The amount of tokens to deposit.", type: "string", required: true, }, - decimals: { + d: { + alias: ["decimals"], description: - "The decimal precision used by the contract. The amount option will be multiplied by (10 ** decimals). For example, if amount is 100 and decimals is 18, then the result will be 100000000000000000000", + "The decimal precision used by the contract. The amount option will be multiplied by (10 ** decimals). For example, if amount is 100 and decimals is 18, then the result will be 100000000000000000000.", type: "number", default: 18, }, - delegate: { - alias: ["first-delegate"], + D: { + alias: ["delegate", "first-delegation"], description: - "The address to delegate the resulting voting power to if the account doesn't already have a delegate", + "The address to delegate the resulting voting power to if the account doesn't already have a delegate.", type: "string", + customType: "hex", required: true, }, }, handler: async ({ options, next }) => { - const account = await options.account({ + const fundedAccount = await options.fundedAccount({ prompt: "Enter account address", }); @@ -44,29 +49,21 @@ export default command({ const decimals = await options.decimals(); - const delegate = await options.delegate({ - prompt: "Enter first delegate address", + const firstDelegation = await options.firstDelegation({ + prompt: "Enter first delegation address", + }); + + const encoded = encodeFunctionData({ + abi: LockingVault.abi, + fn: "deposit", + args: { + fundedAccount, + amount: parseUnits(amount, decimals), + firstDelegation, + }, }); - const encoded = encodeDeposit(account, amount, decimals, delegate); signale.success(encoded); next(encoded); }, }); - -export function encodeDeposit( - account: string, - amount: string, - decimals: number, - delegate: string, -): string { - return encodeFunctionData({ - abi: LockingVault.abi, - functionName: "deposit", - args: [ - account as `0x${string}`, - parseUnits(amount, decimals), - delegate as `0x${string}`, - ], - }); -} diff --git a/packages/council-cli/src/commands/encode/locking-vault/withdraw.ts b/packages/council-cli/src/commands/encode/locking-vault/withdraw.ts index 5a70ef39..68f51d58 100644 --- a/packages/council-cli/src/commands/encode/locking-vault/withdraw.ts +++ b/packages/council-cli/src/commands/encode/locking-vault/withdraw.ts @@ -1,23 +1,21 @@ import { LockingVault } from "@delvtech/council-artifacts/LockingVault"; +import { encodeFunctionData } from "@delvtech/drift"; import { command } from "clide-js"; import signale from "signale"; -import { encodeFunctionData, parseUnits } from "viem"; +import { parseUnits } from "viem"; +import { decimalsOption } from "../../../options/decimals.js"; export default command({ description: "Encode call data for LockingVault.withdraw", options: { - amount: { - description: "The amount of tokens to withdraw", + a: { + alias: ["amount"], + description: "The amount of tokens to withdraw.", type: "string", required: true, }, - decimals: { - description: - "The decimal precision used by the contract. The amount option will be multiplied by (10 ** decimals). For example, if amount is 100 and decimals is 18, then the result will be 100000000000000000000", - type: "number", - default: 18, - }, + d: decimalsOption, }, handler: async ({ options, next }) => { @@ -27,16 +25,13 @@ export default command({ const decimals = await options.decimals(); - const encoded = encodeWithdraw(amount, decimals); + const encoded = encodeFunctionData({ + abi: LockingVault.abi, + fn: "withdraw", + args: { amount: parseUnits(amount, decimals) }, + }); + signale.success(encoded); next(encoded); }, }); - -export function encodeWithdraw(amount: string, decimals: number): string { - return encodeFunctionData({ - abi: LockingVault.abi, - functionName: "withdraw", - args: [parseUnits(amount, decimals)], - }); -} diff --git a/packages/council-cli/src/commands/encode/merkle-rewards/claim-and-delegate.ts b/packages/council-cli/src/commands/encode/merkle-rewards/claim-and-delegate.ts index 04da7b8e..f9e9d0ff 100644 --- a/packages/council-cli/src/commands/encode/merkle-rewards/claim-and-delegate.ts +++ b/packages/council-cli/src/commands/encode/merkle-rewards/claim-and-delegate.ts @@ -1,44 +1,47 @@ import { MerkleRewards } from "@delvtech/council-artifacts/MerkleRewards"; +import { encodeFunctionData } from "@delvtech/drift"; import { command } from "clide-js"; import signale from "signale"; -import { encodeFunctionData, parseUnits } from "viem"; +import { decimalsOption } from "../../../options/decimals.js"; +import { parseUnits } from "viem"; export default command({ description: "Encode call data for MerkleRewards.claimAndDelegate", options: { - amount: { - description: "The amount of rewards to claim and delegate", + a: { + alias: ["amount"], + description: "The amount of rewards to claim and delegate.", type: "string", required: true, }, - decimals: { + d: decimalsOption, + D: { + alias: ["delegate"], description: - "The decimal precision used by the contract. The amount option will be multiplied by (10 ** decimals). For example, if amount is 100 and decimals is 18, then the result will be 100000000000000000000", - type: "number", - default: 18, - }, - delegate: { - description: - "The address to delegate the resulting voting power to if the recipient doesn't already have a delegate", + "The address to delegate the resulting voting power to if the recipient doesn't already have a delegate.", type: "string", + customType: "hex", required: true, }, - "total-grant": { - description: "The total grant amount", + g: { + alias: ["total-grant"], + description: "The total grant amount.", type: "string", required: true, }, - proof: { + p: { alias: ["merkle-proof"], - description: "The merkle proof for the claim", + description: "The merkle proof for the claim.", type: "array", + customType: "hexArray", required: true, }, - recipient: { - alias: ["destination"], - description: "The address which will be credited with funds", + r: { + alias: ["recipient", "destination"], + description: "The address which will be credited with funds.", type: "string", + customType: "hex", required: true, }, }, @@ -54,52 +57,34 @@ export default command({ const decimals = await options.decimals(); - const proof = await options.proof({ + const merkleProof = await options.merkleProof({ prompt: "Enter merkle proof", }); - const recipient = await options.recipient({ - prompt: "Enter recipient address", + const destination = await options.destination({ + prompt: "Enter destination address", }); const delegate = await options.delegate({ prompt: { message: "Enter delegate address", - initial: recipient, + initial: destination, }, }); - const encoded = encodeClaimAndDelegate( - amount, - decimals, - delegate, - totalGrant, - proof, - recipient, - ); + const encoded = encodeFunctionData({ + abi: MerkleRewards.abi, + fn: "claimAndDelegate", + args: { + amount: parseUnits(amount, decimals), + delegate, + destination, + merkleProof, + totalGrant: parseUnits(totalGrant, decimals), + }, + }); signale.success(encoded); next(encoded); }, }); - -export function encodeClaimAndDelegate( - amount: string, - decimals: number, - delegate: string, - totalGrant: string, - proof: string[], - recipient: string, -): string { - return encodeFunctionData({ - abi: MerkleRewards.abi, - functionName: "claimAndDelegate", - args: [ - parseUnits(amount, decimals), - delegate as `0x${string}`, - parseUnits(totalGrant, decimals), - proof as `0x${string}`[], - recipient as `0x${string}`, - ], - }); -} diff --git a/packages/council-cli/src/commands/encode/merkle-rewards/claim.ts b/packages/council-cli/src/commands/encode/merkle-rewards/claim.ts index 6593e02a..087c97c3 100644 --- a/packages/council-cli/src/commands/encode/merkle-rewards/claim.ts +++ b/packages/council-cli/src/commands/encode/merkle-rewards/claim.ts @@ -1,38 +1,39 @@ import { MerkleRewards } from "@delvtech/council-artifacts/MerkleRewards"; +import { encodeFunctionData } from "@delvtech/drift"; import { command } from "clide-js"; import signale from "signale"; -import { encodeFunctionData, parseUnits } from "viem"; +import { parseUnits } from "viem"; +import { decimalsOption } from "../../../options/decimals.js"; export default command({ description: "Encode call data for MerkleRewards.claim", options: { - amount: { + a: { + alias: ["amount"], description: "The amount of rewards to claim", type: "string", required: true, }, - decimals: { - description: - "The decimal precision used by the contract. The amount option will be multiplied by (10 ** decimals). For example, if amount is 100 and decimals is 18, then the result will be 100000000000000000000", - type: "number", - default: 18, - }, - "total-grant": { - description: "The total grant amount", + d: decimalsOption, + g: { + alias: ["total-grant"], + description: "The total grant amount.", type: "string", required: true, }, - proof: { + p: { alias: ["merkle-proof"], - description: "The merkle proof for the claim", + description: "The merkle proof for the claim.", type: "array", + customType: "hexArray", required: true, }, - recipient: { - alias: ["destination"], - description: "The address which will be credited with funds", + r: { + alias: ["recipient", "destination"], + description: "The address which will be credited with funds.", type: "string", + customType: "hex", required: true, }, }, @@ -48,36 +49,26 @@ export default command({ const decimals = await options.decimals(); - const proof = await options.proof({ + const merkleProof = await options.merkleProof({ prompt: "Enter merkle proof", }); - const recipient = await options.recipient({ + const destination = await options.destination({ prompt: "Enter recipient address", }); - const encoded = encodeClaim(amount, decimals, totalGrant, proof, recipient); + const encoded = encodeFunctionData({ + abi: MerkleRewards.abi, + fn: "claim", + args: { + amount: parseUnits(amount, decimals), + destination, + merkleProof, + totalGrant: parseUnits(totalGrant, decimals), + }, + }); signale.success(encoded); next(encoded); }, }); - -export function encodeClaim( - amount: string, - decimals: number, - totalGrant: string, - proof: string[], - recipient: string, -): string { - return encodeFunctionData({ - abi: MerkleRewards.abi, - functionName: "claim", - args: [ - parseUnits(amount, decimals), - parseUnits(totalGrant, decimals), - proof as `0x${string}`[], - recipient as `0x${string}`, - ], - }); -} diff --git a/packages/council-cli/src/commands/encode/optimistic-grants/claim.ts b/packages/council-cli/src/commands/encode/optimistic-grants/claim.ts index 8f83545b..5ddef6c6 100644 --- a/packages/council-cli/src/commands/encode/optimistic-grants/claim.ts +++ b/packages/council-cli/src/commands/encode/optimistic-grants/claim.ts @@ -1,34 +1,33 @@ import { OptimisticGrants } from "@delvtech/council-artifacts/OptimisticGrants"; +import { encodeFunctionData } from "@delvtech/drift"; import { command } from "clide-js"; import signale from "signale"; -import { encodeFunctionData } from "viem"; export default command({ description: "Encode call data for OptimisticGrants.claim", options: { - recipient: { - alias: ["destination"], - description: "The address to send the tokens to", + r: { + alias: ["recipient", "destination"], + description: "The address to send the tokens to.", type: "string", + customType: "hex", required: true, }, }, handler: async ({ options, next }) => { - const recipient = await options.recipient({ + const destination = await options.destination({ prompt: "Enter recipient address", }); - const encoded = encodeClaim(recipient); + + const encoded = encodeFunctionData({ + abi: OptimisticGrants.abi, + fn: "claim", + args: { _destination: destination }, + }); + signale.success(encoded); next(encoded); }, }); - -export function encodeClaim(recipient: string): string { - return encodeFunctionData({ - abi: OptimisticGrants.abi, - functionName: "claim", - args: [recipient as `0x${string}`], - }); -} diff --git a/packages/council-cli/src/commands/encode/optimistic-grants/configure-grant.ts b/packages/council-cli/src/commands/encode/optimistic-grants/configure-grant.ts index 15798a8b..eb03fd1a 100644 --- a/packages/council-cli/src/commands/encode/optimistic-grants/configure-grant.ts +++ b/packages/council-cli/src/commands/encode/optimistic-grants/configure-grant.ts @@ -1,30 +1,31 @@ import { OptimisticGrants } from "@delvtech/council-artifacts/OptimisticGrants"; +import { encodeFunctionData } from "@delvtech/drift"; import { command } from "clide-js"; import signale from "signale"; -import { encodeFunctionData, parseUnits } from "viem"; +import { parseUnits } from "viem"; +import { decimalsOption } from "../../../options/decimals.js"; export default command({ description: "Encode call data for a OptimisticGrants.configureGrant", options: { - owner: { - description: "The address of the grant owner", + o: { + alias: ["owner"], + description: "The address of the grant owner.", type: "string", + customType: "hex", required: true, }, - amount: { - description: "The amount of tokens to grant", + a: { + alias: ["amount"], + description: "The amount of tokens to grant.", type: "string", required: true, }, - decimals: { - description: - "The decimal precision used by the contract. The amount option will be multiplied by (10 ** decimals). For example, if amount is 100 and decimals is 18, then the result will be 100000000000000000000", - type: "number", - default: 18, - }, - expiration: { - description: "The expiration timestamp (in seconds) of the grant", + d: decimalsOption, + e: { + alias: ["expiration"], + description: "The expiration timestamp (in seconds) of the grant.", type: "number", required: true, }, @@ -45,25 +46,17 @@ export default command({ prompt: "Enter expiration timestamp (in seconds)", }); - const encoded = encodeConfigureGrant(owner, amount, decimals, expiration); + const encoded = encodeFunctionData({ + abi: OptimisticGrants.abi, + fn: "configureGrant", + args: { + _amount: parseUnits(amount, decimals), + _expiration: BigInt(expiration), + _owner: owner, + }, + }); + signale.success(encoded); next(encoded); }, }); - -export function encodeConfigureGrant( - owner: string, - amount: string, - decimals: number, - expiration: number, -): string { - return encodeFunctionData({ - abi: OptimisticGrants.abi, - functionName: "configureGrant", - args: [ - owner as `0x${string}`, - parseUnits(amount, decimals), - BigInt(expiration), - ], - }); -} diff --git a/packages/council-cli/src/commands/encode/optimistic-grants/deposit.ts b/packages/council-cli/src/commands/encode/optimistic-grants/deposit.ts index 01946556..31f475db 100644 --- a/packages/council-cli/src/commands/encode/optimistic-grants/deposit.ts +++ b/packages/council-cli/src/commands/encode/optimistic-grants/deposit.ts @@ -1,23 +1,21 @@ import { OptimisticGrants } from "@delvtech/council-artifacts/OptimisticGrants"; +import { encodeFunctionData } from "@delvtech/drift"; import { command } from "clide-js"; import signale from "signale"; -import { encodeFunctionData, parseUnits } from "viem"; +import { parseUnits } from "viem"; +import { decimalsOption } from "../../../options/decimals.js"; export default command({ description: "Encode call data for OptimisticGrants.deposit", options: { - amount: { - description: "The amount of tokens to deposit", + a: { + alias: ["amount"], + description: "The amount of tokens to deposit.", type: "string", required: true, }, - decimals: { - description: - "The decimal precision used by the contract. The amount option will be multiplied by (10 ** decimals). For example, if amount is 100 and decimals is 18, then the result will be 100000000000000000000", - type: "number", - default: 18, - }, + d: decimalsOption, }, handler: async ({ options, next }) => { @@ -27,16 +25,13 @@ export default command({ const decimals = await options.decimals(); - const encoded = encodeDeposit(amount, decimals); + const encoded = encodeFunctionData({ + abi: OptimisticGrants.abi, + fn: "deposit", + args: { _amount: parseUnits(amount, decimals) }, + }); + signale.success(encoded); next(encoded); }, }); - -export function encodeDeposit(amount: string, decimals: number): string { - return encodeFunctionData({ - abi: OptimisticGrants.abi, - functionName: "deposit", - args: [parseUnits(amount, decimals)], - }); -} diff --git a/packages/council-cli/src/commands/encode/optimistic-grants/withdraw.ts b/packages/council-cli/src/commands/encode/optimistic-grants/withdraw.ts index eb2c51a5..d76687ec 100644 --- a/packages/council-cli/src/commands/encode/optimistic-grants/withdraw.ts +++ b/packages/council-cli/src/commands/encode/optimistic-grants/withdraw.ts @@ -1,26 +1,26 @@ import { OptimisticGrants } from "@delvtech/council-artifacts/OptimisticGrants"; +import { encodeFunctionData } from "@delvtech/drift"; import { command } from "clide-js"; import signale from "signale"; -import { encodeFunctionData, parseUnits } from "viem"; +import { parseUnits } from "viem"; +import { decimalsOption } from "../../../options/decimals.js"; export default command({ description: "Encode call data for OptimisticGrants.withdraw", options: { - amount: { - description: "The amount of tokens to withdraw", + a: { + alias: ["amount"], + description: "The amount of tokens to withdraw.", type: "string", required: true, }, - decimals: { - description: - "The decimal precision used by the contract. The amount option will be multiplied by (10 ** decimals). For example, if amount is 100 and decimals is 18, then the result will be 100000000000000000000", - type: "number", - default: 18, - }, - recipient: { - description: "The address to withdraw to", + d: decimalsOption, + r: { + alias: ["recipient", "destination"], + description: "The address to withdraw to.", type: "string", + customType: "hex", required: true, }, }, @@ -36,20 +36,16 @@ export default command({ prompt: "Enter recipient address", }); - const encoded = encodeDeposit(amount, decimals, recipient); + const encoded = encodeFunctionData({ + abi: OptimisticGrants.abi, + fn: "withdraw", + args: { + _amount: parseUnits(amount, decimals), + _recipient: recipient, + }, + }); + signale.success(encoded); next(encoded); }, }); - -export function encodeDeposit( - amount: string, - decimals: number, - recipient: string, -): string { - return encodeFunctionData({ - abi: OptimisticGrants.abi, - functionName: "withdraw", - args: [parseUnits(amount, decimals), recipient as `0x${string}`], - }); -} diff --git a/packages/council-cli/src/commands/encode/optimistic-rewards/challenge-rewards.ts b/packages/council-cli/src/commands/encode/optimistic-rewards/challenge-rewards.ts index c5a236c5..2127148b 100644 --- a/packages/council-cli/src/commands/encode/optimistic-rewards/challenge-rewards.ts +++ b/packages/council-cli/src/commands/encode/optimistic-rewards/challenge-rewards.ts @@ -1,21 +1,17 @@ import { OptimisticRewards } from "@delvtech/council-artifacts/OptimisticRewards"; +import { encodeFunctionData } from "@delvtech/drift"; import { command } from "clide-js"; import signale from "signale"; -import { encodeFunctionData } from "viem"; export default command({ description: "Encode call data for OptimisticRewards.challengeRewards", handler: async ({ next }) => { - const encoded = encodeChallengeRewards(); + const encoded = encodeFunctionData({ + abi: OptimisticRewards.abi, + fn: "challengeRewards", + }); signale.success(encoded); next(encoded); }, }); - -export function encodeChallengeRewards(): string { - return encodeFunctionData({ - abi: OptimisticRewards.abi, - functionName: "challengeRewards", - }); -} diff --git a/packages/council-cli/src/commands/encode/optimistic-rewards/propose-rewards.ts b/packages/council-cli/src/commands/encode/optimistic-rewards/propose-rewards.ts index a9d40d97..8b3b547b 100644 --- a/packages/council-cli/src/commands/encode/optimistic-rewards/propose-rewards.ts +++ b/packages/council-cli/src/commands/encode/optimistic-rewards/propose-rewards.ts @@ -1,34 +1,33 @@ import { OptimisticRewards } from "@delvtech/council-artifacts/OptimisticRewards"; +import { encodeFunctionData } from "@delvtech/drift"; import { command } from "clide-js"; import signale from "signale"; -import { encodeFunctionData } from "viem"; export default command({ description: "Encode call data for OptimisticRewards.proposeRewards", options: { - root: { - description: "The merkle root of the proposed new rewards", + r: { + alias: ["new-root"], + description: "The merkle root of the proposed new rewards.", type: "string", + customType: "hex", required: true, }, }, handler: async ({ options, next }) => { - const root = await options.root({ + const newRoot = await options.newRoot({ prompt: "Enter rewards merkle root", }); - const encoded = encodeProposeRewards(root); + const encoded = encodeFunctionData({ + abi: OptimisticRewards.abi, + fn: "proposeRewards", + args: { newRoot }, + }); + signale.success(encoded); next(encoded); }, }); - -export function encodeProposeRewards(root: string): string { - return encodeFunctionData({ - abi: OptimisticRewards.abi, - functionName: "proposeRewards", - args: [root as `0x${string}`], - }); -} diff --git a/packages/council-cli/src/commands/encode/optimistic-rewards/set-challenge-period.ts b/packages/council-cli/src/commands/encode/optimistic-rewards/set-challenge-period.ts index 09a47539..754b08ad 100644 --- a/packages/council-cli/src/commands/encode/optimistic-rewards/set-challenge-period.ts +++ b/packages/council-cli/src/commands/encode/optimistic-rewards/set-challenge-period.ts @@ -1,34 +1,32 @@ import { OptimisticRewards } from "@delvtech/council-artifacts/OptimisticRewards"; +import { encodeFunctionData } from "@delvtech/drift"; import { command } from "clide-js"; import signale from "signale"; -import { encodeFunctionData } from "viem"; export default command({ description: "Encode call data for OptimisticRewards.setChallengePeriod", options: { - period: { - description: "The new challenge period (in seconds)", + p: { + alias: ["challenge-period"], + description: "The new challenge period (in seconds).", type: "number", required: true, }, }, handler: async ({ options, next }) => { - const period = await options.period({ + const challengePeriod = await options.challengePeriod({ prompt: "Enter challenge period (in seconds)", }); - const encoded = encodeSetChallengePeriod(period); + const encoded = encodeFunctionData({ + abi: OptimisticRewards.abi, + fn: "setChallengePeriod", + args: { _challengePeriod: BigInt(challengePeriod) }, + }); + signale.success(encoded); next(encoded); }, }); - -export function encodeSetChallengePeriod(period: number): string { - return encodeFunctionData({ - abi: OptimisticRewards.abi, - functionName: "setChallengePeriod", - args: [BigInt(period)], - }); -} diff --git a/packages/council-cli/src/commands/encode/optimistic-rewards/set-proposer.ts b/packages/council-cli/src/commands/encode/optimistic-rewards/set-proposer.ts index 9fbba42f..8eee782b 100644 --- a/packages/council-cli/src/commands/encode/optimistic-rewards/set-proposer.ts +++ b/packages/council-cli/src/commands/encode/optimistic-rewards/set-proposer.ts @@ -1,34 +1,33 @@ import { OptimisticRewards } from "@delvtech/council-artifacts/OptimisticRewards"; +import { encodeFunctionData } from "@delvtech/drift"; import { command } from "clide-js"; import signale from "signale"; -import { encodeFunctionData } from "viem"; export default command({ description: "Encode call data for OptimisticRewards.setProposer", options: { - address: { + p: { alias: ["proposer"], - description: "The address of the new proposer", + description: "The address of the new proposer.", type: "string", + customType: "hex", required: true, }, }, handler: async ({ options, next }) => { - const address = await options.address({ + const proposer = await options.proposer({ prompt: "Enter proposer address", }); - const encoded = encodeSetProposer(address); + + const encoded = encodeFunctionData({ + abi: OptimisticRewards.abi, + fn: "setProposer", + args: { _proposer: proposer }, + }); + signale.success(encoded); next(encoded); }, }); - -export function encodeSetProposer(proposerAddress: string): string { - return encodeFunctionData({ - abi: OptimisticRewards.abi, - functionName: "setProposer", - args: [proposerAddress as `0x${string}`], - }); -} diff --git a/packages/council-cli/src/commands/encode/spender/high-spend.ts b/packages/council-cli/src/commands/encode/spender/high-spend.ts index 27b9fe42..f01fb685 100644 --- a/packages/council-cli/src/commands/encode/spender/high-spend.ts +++ b/packages/council-cli/src/commands/encode/spender/high-spend.ts @@ -1,26 +1,26 @@ import { Spender } from "@delvtech/council-artifacts/Spender"; +import { encodeFunctionData } from "@delvtech/drift"; import { command } from "clide-js"; import signale from "signale"; -import { encodeFunctionData, parseUnits } from "viem"; +import { parseUnits } from "viem"; +import { decimalsOption } from "../../../options/decimals.js"; export default command({ description: "Encode call data for a Spender.highSpend", options: { - amount: { - description: "The amount to spend", + a: { + alias: ["amount"], + description: "The amount to spend.", type: "string", required: true, }, - decimals: { - description: - "The decimal precision used by the contract. The amount option will be multiplied by (10 ** decimals). For example, if amount is 100 and decimals is 18, then the result will be 100000000000000000000", - type: "number", - default: 18, - }, - destination: { - description: "The address to send the funds to", + d: decimalsOption, + D: { + alias: ["destination"], + description: "The address to send the funds to.", type: "string", + customType: "hex", required: true, }, }, @@ -36,21 +36,16 @@ export default command({ prompt: "Enter destination address", }); - const encoded = encodeHighSpend(amount, decimals, destination); + const encoded = encodeFunctionData({ + abi: Spender.abi, + fn: "smallSpend", + args: { + amount: parseUnits(amount, decimals), + destination, + }, + }); signale.success(encoded); next(encoded); }, }); - -export function encodeHighSpend( - amount: string, - decimals: number, - destination: string, -): string { - return encodeFunctionData({ - abi: Spender.abi, - functionName: "smallSpend", - args: [parseUnits(amount, decimals), destination as `0x${string}`], - }); -} diff --git a/packages/council-cli/src/commands/encode/spender/medium-spend.ts b/packages/council-cli/src/commands/encode/spender/medium-spend.ts index 2555db1a..b94d65d4 100644 --- a/packages/council-cli/src/commands/encode/spender/medium-spend.ts +++ b/packages/council-cli/src/commands/encode/spender/medium-spend.ts @@ -1,26 +1,26 @@ import { Spender } from "@delvtech/council-artifacts/Spender"; +import { encodeFunctionData } from "@delvtech/drift"; import { command } from "clide-js"; import signale from "signale"; -import { encodeFunctionData, parseUnits } from "viem"; +import { parseUnits } from "viem"; +import { decimalsOption } from "../../../options/decimals.js"; export default command({ description: "Encode call data for a Spender.mediumSpend", options: { - amount: { - description: "The amount to spend", + a: { + alias: ["amount"], + description: "The amount to spend.", type: "string", required: true, }, - decimals: { - description: - "The decimal precision used by the contract. The amount option will be multiplied by (10 ** decimals). For example, if amount is 100 and decimals is 18, then the result will be 100000000000000000000", - type: "number", - default: 18, - }, - destination: { - description: "The address to send the funds to", + d: decimalsOption, + D: { + alias: ["destination"], + description: "The address to send the funds to.", type: "string", + customType: "hex", required: true, }, }, @@ -36,21 +36,16 @@ export default command({ prompt: "Enter destination address", }); - const encoded = encodeMediumSpend(amount, decimals, destination); + const encoded = encodeFunctionData({ + abi: Spender.abi, + fn: "mediumSpend", + args: { + amount: parseUnits(amount, decimals), + destination, + }, + }); signale.success(encoded); next(encoded); }, }); - -export function encodeMediumSpend( - amount: string, - decimals: number, - destination: string, -): string { - return encodeFunctionData({ - abi: Spender.abi, - functionName: "mediumSpend", - args: [parseUnits(amount, decimals), destination as `0x${string}`], - }); -} diff --git a/packages/council-cli/src/commands/encode/spender/remove-token.ts b/packages/council-cli/src/commands/encode/spender/remove-token.ts index 8504bc3e..d7e66ff3 100644 --- a/packages/council-cli/src/commands/encode/spender/remove-token.ts +++ b/packages/council-cli/src/commands/encode/spender/remove-token.ts @@ -1,27 +1,28 @@ import { Spender } from "@delvtech/council-artifacts/Spender"; +import { encodeFunctionData } from "@delvtech/drift"; import { command } from "clide-js"; import signale from "signale"; -import { encodeFunctionData, parseUnits } from "viem"; +import { parseUnits } from "viem"; +import { decimalsOption } from "../../../options/decimals.js"; export default command({ description: "Encode call data for a Spender.removeToken", options: { - amount: { + a: { + alias: ["amount"], description: "The amount of tokens to remove (max uint256 for the full balance)", type: "string", + customType: "hex", required: true, }, - decimals: { - description: - "The decimal precision used by the contract. The amount option will be multiplied by (10 ** decimals). For example, if amount is 100 and decimals is 18, then the result will be 100000000000000000000", - type: "number", - default: 18, - }, - destination: { - description: "The address to send the funds to", + d: decimalsOption, + D: { + alias: ["destination"], + description: "The address to send the funds to.", type: "string", + customType: "hex", required: true, }, }, @@ -37,21 +38,16 @@ export default command({ prompt: "Enter destination address", }); - const encoded = encodeRemoveToken(amount, decimals, destination); + const encoded = encodeFunctionData({ + abi: Spender.abi, + fn: "removeToken", + args: { + amount: parseUnits(amount, decimals), + destination, + }, + }); signale.success(encoded); next(encoded); }, }); - -export function encodeRemoveToken( - amount: string, - decimals: number, - destination: string, -): string { - return encodeFunctionData({ - abi: Spender.abi, - functionName: "removeToken", - args: [parseUnits(amount, decimals), destination as `0x${string}`], - }); -} diff --git a/packages/council-cli/src/commands/encode/spender/set-limits.ts b/packages/council-cli/src/commands/encode/spender/set-limits.ts index 7c679162..a6e01e3f 100644 --- a/packages/council-cli/src/commands/encode/spender/set-limits.ts +++ b/packages/council-cli/src/commands/encode/spender/set-limits.ts @@ -1,7 +1,9 @@ import { Spender } from "@delvtech/council-artifacts/Spender"; +import { encodeFunctionData } from "@delvtech/drift"; import { command } from "clide-js"; import signale from "signale"; -import { encodeFunctionData, parseUnits } from "viem"; +import { parseUnits } from "viem"; +import { decimalsOption } from "../../../options/decimals.js"; export default command({ description: "Encode call data for a Spender.setLimits", @@ -25,12 +27,7 @@ export default command({ type: "string", required: true, }, - decimals: { - description: - "The decimal precision used by the contract. The amount options will be multiplied by (10 ** decimals). For example, if small is 100 and decimals is 18, then the result will be 100000000000000000000", - type: "number", - default: 18, - }, + d: decimalsOption, }, handler: async ({ options, next }) => { @@ -48,28 +45,19 @@ export default command({ const decimals = await options.decimals(); - const encoded = encodeSetLimits(small, medium, high, decimals); + const encoded = encodeFunctionData({ + abi: Spender.abi, + fn: "setLimits", + args: { + limits: [ + parseUnits(small, decimals), + parseUnits(medium, decimals), + parseUnits(high, decimals), + ], + }, + }); signale.success(encoded); next(encoded); }, }); - -export function encodeSetLimits( - small: string, - medium: string, - high: string, - decimals: number, -): string { - return encodeFunctionData({ - abi: Spender.abi, - functionName: "setLimits", - args: [ - [ - parseUnits(small, decimals), - parseUnits(medium, decimals), - parseUnits(high, decimals), - ], - ], - }); -} diff --git a/packages/council-cli/src/commands/encode/spender/small-spend.ts b/packages/council-cli/src/commands/encode/spender/small-spend.ts index b0bf0efc..a99023bc 100644 --- a/packages/council-cli/src/commands/encode/spender/small-spend.ts +++ b/packages/council-cli/src/commands/encode/spender/small-spend.ts @@ -1,26 +1,26 @@ import { Spender } from "@delvtech/council-artifacts/Spender"; +import { encodeFunctionData } from "@delvtech/drift"; import { command } from "clide-js"; import signale from "signale"; -import { encodeFunctionData, parseUnits } from "viem"; +import { parseUnits } from "viem"; +import { decimalsOption } from "../../../options/decimals.js"; export default command({ description: "Encode call data for a Spender.smallSpend", options: { - amount: { - description: "The amount to spend", + a: { + alias: ["amount"], + description: "The amount to spend.", type: "string", required: true, }, - decimals: { - description: - "The decimal precision used by the contract. The amount option will be multiplied by (10 ** decimals). For example, if amount is 100 and decimals is 18, then the result will be 100000000000000000000", - type: "number", - default: 18, - }, - destination: { - description: "The address to send the funds to", + d: decimalsOption, + D: { + alias: ["destination"], + description: "The address to send the funds to.", type: "string", + customType: "hex", required: true, }, }, @@ -36,21 +36,16 @@ export default command({ prompt: "Enter destination address", }); - const encoded = encodeSmallSpend(amount, decimals, destination); + const encoded = encodeFunctionData({ + abi: Spender.abi, + fn: "smallSpend", + args: { + amount: parseUnits(amount, decimals), + destination, + }, + }); signale.success(encoded); next(encoded); }, }); - -export function encodeSmallSpend( - amount: string, - decimals: number, - destination: string, -): string { - return encodeFunctionData({ - abi: Spender.abi, - functionName: "smallSpend", - args: [parseUnits(amount, decimals), destination as `0x${string}`], - }); -} diff --git a/packages/council-cli/src/commands/encode/timelock/execute.ts b/packages/council-cli/src/commands/encode/timelock/execute.ts index 6940d8b4..a229ea4d 100644 --- a/packages/council-cli/src/commands/encode/timelock/execute.ts +++ b/packages/council-cli/src/commands/encode/timelock/execute.ts @@ -1,21 +1,25 @@ import { Timelock } from "@delvtech/council-artifacts/Timelock"; +import { encodeFunctionData } from "@delvtech/drift"; import { command } from "clide-js"; import signale from "signale"; -import { encodeFunctionData } from "viem"; export default command({ description: "Encode call data for Timelock.execute", options: { - targets: { - description: "A list of target addresses the timelock contract will call", + t: { + alias: ["targets"], + description: + "A list of target addresses the timelock contract will call.", type: "array", + customType: "hexArray", required: true, }, - data: { + d: { alias: ["calldatas"], - description: "Encoded call data for each target", + description: "Encoded call data for each target.", type: "array", + customType: "hexArray", required: true, }, }, @@ -29,17 +33,13 @@ export default command({ prompt: "Enter call data for each target", }); - const encoded = encodeExecute(targets, calldatas); + const encoded = encodeFunctionData({ + abi: Timelock.abi, + fn: "execute", + args: { calldatas, targets }, + }); signale.success(encoded); next(encoded); }, }); - -export function encodeExecute(targets: string[], calldatas: string[]): string { - return encodeFunctionData({ - abi: Timelock.abi, - functionName: "execute", - args: [targets as `0x${string}`[], calldatas as `0x${string}`[]], - }); -} diff --git a/packages/council-cli/src/commands/encode/timelock/increase-time.ts b/packages/council-cli/src/commands/encode/timelock/increase-time.ts index 0e68e034..eccdcfa5 100644 --- a/packages/council-cli/src/commands/encode/timelock/increase-time.ts +++ b/packages/council-cli/src/commands/encode/timelock/increase-time.ts @@ -1,18 +1,16 @@ import { Timelock } from "@delvtech/council-artifacts/Timelock"; +import { encodeFunctionData } from "@delvtech/drift"; import { command } from "clide-js"; import signale from "signale"; -import { - callHashOptions, - getCallHash, -} from "src/reusable-options/call-hash.js"; -import { encodeFunctionData } from "viem"; +import { callHashOptions, getCallHash } from "../../../options/call-hash.js"; export default command({ description: "Encode call data for Timelock.increaseTime", options: { - time: { - description: "The amount of time (in seconds) to increase by", + t: { + alias: ["time"], + description: "The amount of time (in seconds) to increase by.", type: "number", required: true, }, @@ -30,20 +28,16 @@ export default command({ options.calldatas, ); - const encoded = encodeIncreaseTime(timeValue.toString(), callHash); + const encoded = encodeFunctionData({ + abi: Timelock.abi, + fn: "increaseTime", + args: { + callHash, + timeValue: BigInt(timeValue), + }, + }); signale.success(encoded); next(encoded); }, }); - -export function encodeIncreaseTime( - timeValue: string, - callHash: string, -): string { - return encodeFunctionData({ - abi: Timelock.abi, - functionName: "increaseTime", - args: [BigInt(timeValue), callHash as `0x${string}`], - }); -} diff --git a/packages/council-cli/src/commands/encode/timelock/register-call.ts b/packages/council-cli/src/commands/encode/timelock/register-call.ts index adcc2b8e..0cd03482 100644 --- a/packages/council-cli/src/commands/encode/timelock/register-call.ts +++ b/packages/council-cli/src/commands/encode/timelock/register-call.ts @@ -1,11 +1,8 @@ import { Timelock } from "@delvtech/council-artifacts/Timelock"; +import { encodeFunctionData } from "@delvtech/drift"; import { command } from "clide-js"; import signale from "signale"; -import { - callHashOptions, - getCallHash, -} from "src/reusable-options/call-hash.js"; -import { encodeFunctionData } from "viem"; +import { callHashOptions, getCallHash } from "../../../options/call-hash.js"; export default command({ description: "Encode call data for Timelock.registerCall", @@ -19,17 +16,13 @@ export default command({ options.calldatas, ); - const encoded = encodeRegisterCall(callHash); + const encoded = encodeFunctionData({ + abi: Timelock.abi, + fn: "registerCall", + args: { callHash }, + }); signale.success(encoded); next(encoded); }, }); - -export function encodeRegisterCall(callHash: string): string { - return encodeFunctionData({ - abi: Timelock.abi, - functionName: "registerCall", - args: [callHash as `0x${string}`], - }); -} diff --git a/packages/council-cli/src/commands/encode/timelock/set-wait-time.ts b/packages/council-cli/src/commands/encode/timelock/set-wait-time.ts index d443a491..088e330d 100644 --- a/packages/council-cli/src/commands/encode/timelock/set-wait-time.ts +++ b/packages/council-cli/src/commands/encode/timelock/set-wait-time.ts @@ -1,13 +1,13 @@ import { Timelock } from "@delvtech/council-artifacts/Timelock"; +import { encodeFunctionData } from "@delvtech/drift"; import { command } from "clide-js"; import signale from "signale"; -import { encodeFunctionData } from "viem"; export default command({ description: "Encode call data for Timelock.setWaitTime", options: { - time: { + t: { alias: ["wait-time"], description: "The new wait time (in seconds)", type: "number", @@ -16,21 +16,17 @@ export default command({ }, handler: async ({ options, next }) => { - const time = await options.time({ + const waitTime = await options.waitTime({ prompt: "Enter new wait time (in seconds)", }); - const encoded = encodeSetWaitTime(time.toString()); + const encoded = encodeFunctionData({ + abi: Timelock.abi, + fn: "setWaitTime", + args: { _waitTime: BigInt(waitTime) }, + }); signale.success(encoded); next(encoded); }, }); - -export function encodeSetWaitTime(waitTime: string): string { - return encodeFunctionData({ - abi: Timelock.abi, - functionName: "setWaitTime", - args: [BigInt(waitTime)], - }); -} diff --git a/packages/council-cli/src/commands/encode/timelock/stop-call.ts b/packages/council-cli/src/commands/encode/timelock/stop-call.ts index 41d34155..78bae98f 100644 --- a/packages/council-cli/src/commands/encode/timelock/stop-call.ts +++ b/packages/council-cli/src/commands/encode/timelock/stop-call.ts @@ -1,11 +1,8 @@ import { Timelock } from "@delvtech/council-artifacts/Timelock"; +import { encodeFunctionData } from "@delvtech/drift"; import { command } from "clide-js"; import signale from "signale"; -import { - callHashOptions, - getCallHash, -} from "src/reusable-options/call-hash.js"; -import { encodeFunctionData } from "viem"; +import { callHashOptions, getCallHash } from "../../../options/call-hash.js"; export default command({ description: "Encode call data for Timelock.stopCall", @@ -19,17 +16,13 @@ export default command({ options.calldatas, ); - const encoded = encodeStopCall(callHash); + const encoded = encodeFunctionData({ + abi: Timelock.abi, + fn: "stopCall", + args: { callHash }, + }); signale.success(encoded); next(encoded); }, }); - -export function encodeStopCall(callHash: string): string { - return encodeFunctionData({ - abi: Timelock.abi, - functionName: "stopCall", - args: [callHash as `0x${string}`], - }); -} diff --git a/packages/council-cli/src/commands/encode/treasury/approve.ts b/packages/council-cli/src/commands/encode/treasury/approve.ts index a9b7808c..a219ed37 100644 --- a/packages/council-cli/src/commands/encode/treasury/approve.ts +++ b/packages/council-cli/src/commands/encode/treasury/approve.ts @@ -1,31 +1,33 @@ import { Treasury } from "@delvtech/council-artifacts/Treasury"; +import { encodeFunctionData } from "@delvtech/drift"; import { command } from "clide-js"; import signale from "signale"; -import { encodeFunctionData, parseUnits } from "viem"; +import { parseUnits } from "viem"; +import { decimalsOption } from "../../../options/decimals.js"; export default command({ description: "Encode call data for Treasury.approve", options: { - token: { - description: `The address of the token to approve`, + t: { + alias: ["token"], + description: "The address of the token to approve.", type: "string", + customType: "hex", required: true, }, - amount: { - description: "The amount to approve", + a: { + alias: ["amount"], + description: "The amount to approve.", type: "string", required: true, }, - decimals: { - description: - "The decimal precision used by the contract. The amount option will be multiplied by (10 ** decimals). For example, if amount is 100 and decimals is 18, then the result will be 100000000000000000000", - type: "number", - default: 18, - }, - spender: { - description: "The address to approve", + d: decimalsOption, + s: { + alias: ["spender"], + description: "The address to approve.", type: "string", + customType: "hex", required: true, }, }, @@ -45,26 +47,17 @@ export default command({ prompt: "Enter spender address", }); - const encoded = encodeApprove(token, amount, decimals, spender); + const encoded = encodeFunctionData({ + abi: Treasury.abi, + fn: "approve", + args: { + _amount: parseUnits(amount, decimals), + _spender: spender, + _token: token, + }, + }); signale.success(encoded); next(encoded); }, }); - -export function encodeApprove( - token: string, - amount: string, - decimals: number, - spender: string, -): string { - return encodeFunctionData({ - abi: Treasury.abi, - functionName: "approve", - args: [ - token as `0x${string}`, - spender as `0x${string}`, - parseUnits(amount, decimals), - ], - }); -} diff --git a/packages/council-cli/src/commands/encode/treasury/generic-call.ts b/packages/council-cli/src/commands/encode/treasury/generic-call.ts index a2f1030f..5b6b4d64 100644 --- a/packages/council-cli/src/commands/encode/treasury/generic-call.ts +++ b/packages/council-cli/src/commands/encode/treasury/generic-call.ts @@ -1,21 +1,24 @@ import { Treasury } from "@delvtech/council-artifacts/Treasury"; +import { encodeFunctionData } from "@delvtech/drift"; import { command } from "clide-js"; import signale from "signale"; -import { encodeFunctionData } from "viem"; export default command({ description: "Encode call data for Treasury.genericCall", options: { - target: { - description: `The address of the target contract`, + t: { + alias: ["target"], + description: `The address of the target contract.`, type: "string", + customType: "hex", required: true, }, - data: { + d: { alias: ["calldata", "call-data"], - description: "The encoded call data", + description: "The encoded call data.", type: "string", + customType: "hex", required: true, }, }, @@ -25,21 +28,20 @@ export default command({ prompt: "Enter target address", }); - const data = await options.data({ + const calldata = await options.calldata({ prompt: "Enter call data", }); - const encoded = encodeGenericCall(target, data); + const encoded = encodeFunctionData({ + abi: Treasury.abi, + fn: "genericCall", + args: { + _callData: calldata, + _target: target, + }, + }); signale.success(encoded); next(encoded); }, }); - -export function encodeGenericCall(target: string, data: string): string { - return encodeFunctionData({ - abi: Treasury.abi, - functionName: "genericCall", - args: [target as `0x${string}`, data as `0x${string}`], - }); -} diff --git a/packages/council-cli/src/commands/encode/treasury/send-funds.ts b/packages/council-cli/src/commands/encode/treasury/send-funds.ts index 68d2cb2a..a2e979b9 100644 --- a/packages/council-cli/src/commands/encode/treasury/send-funds.ts +++ b/packages/council-cli/src/commands/encode/treasury/send-funds.ts @@ -1,7 +1,9 @@ import { Treasury } from "@delvtech/council-artifacts/Treasury"; +import { encodeFunctionData } from "@delvtech/drift"; import { command } from "clide-js"; import signale from "signale"; -import { encodeFunctionData, parseUnits } from "viem"; +import { parseUnits } from "viem"; +import { decimalsOption } from "../../../options/decimals.js"; const ETH_CONSTANT = "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE"; @@ -9,25 +11,25 @@ export default command({ description: "Encode call data for Treasury.sendFunds", options: { - token: { - description: `The address of token to send (${ETH_CONSTANT} to send ETH)`, + t: { + alias: ["token"], + description: `The address of token to send (${ETH_CONSTANT} to send ETH).`, type: "string", + customType: "hex", required: true, }, - amount: { - description: "The amount to send", + a: { + alias: ["amount"], + description: "The amount to send.", type: "string", required: true, }, - decimals: { - description: - "The decimal precision used by the contract. The amount option will be multiplied by (10 ** decimals). For example, if amount is 100 and decimals is 18, then the result will be 100000000000000000000", - type: "number", - default: 18, - }, - recipient: { - description: "The address to send the funds to", + d: decimalsOption, + r: { + alias: ["recipient"], + description: "The address to send the funds to.", type: "string", + customType: "hex", required: true, }, }, @@ -50,26 +52,17 @@ export default command({ prompt: "Enter recipient address", }); - const encoded = encodeSendFunds(token, amount, decimals, recipient); + const encoded = encodeFunctionData({ + abi: Treasury.abi, + fn: "sendFunds", + args: { + _amount: parseUnits(amount, decimals), + _recipient: recipient, + _token: token, + }, + }); signale.success(encoded); next(encoded); }, }); - -export function encodeSendFunds( - token: string, - amount: string, - decimals: number, - recipient: string, -): string { - return encodeFunctionData({ - abi: Treasury.abi, - functionName: "sendFunds", - args: [ - token as `0x${string}`, - parseUnits(amount, decimals), - recipient as `0x${string}`, - ], - }); -} diff --git a/packages/council-cli/src/commands/encode/vesting-vault/accept-grant.ts b/packages/council-cli/src/commands/encode/vesting-vault/accept-grant.ts index ed8ed110..8552b24e 100644 --- a/packages/council-cli/src/commands/encode/vesting-vault/accept-grant.ts +++ b/packages/council-cli/src/commands/encode/vesting-vault/accept-grant.ts @@ -1,21 +1,18 @@ import { VestingVault } from "@delvtech/council-artifacts/VestingVault"; +import { encodeFunctionData } from "@delvtech/drift"; import { command } from "clide-js"; import signale from "signale"; -import { encodeFunctionData } from "viem"; export default command({ description: "Encode call data for VestingVault.acceptGrant", handler: ({ next }) => { - const encoded = encodeAcceptGrant(); + const encoded = encodeFunctionData({ + abi: VestingVault.abi, + fn: "acceptGrant", + }); + signale.success(encoded); next(encoded); }, }); - -export function encodeAcceptGrant(): string { - return encodeFunctionData({ - abi: VestingVault.abi, - functionName: "acceptGrant", - }); -} diff --git a/packages/council-cli/src/commands/encode/vesting-vault/add-grant-and-delegate.ts b/packages/council-cli/src/commands/encode/vesting-vault/add-grant-and-delegate.ts index 788ca3c3..438cdbb3 100644 --- a/packages/council-cli/src/commands/encode/vesting-vault/add-grant-and-delegate.ts +++ b/packages/council-cli/src/commands/encode/vesting-vault/add-grant-and-delegate.ts @@ -1,51 +1,55 @@ import { VestingVault } from "@delvtech/council-artifacts/VestingVault"; +import { encodeFunctionData } from "@delvtech/drift"; import { command } from "clide-js"; import signale from "signale"; -import { encodeFunctionData, parseUnits } from "viem"; +import { parseUnits } from "viem"; +import { decimalsOption } from "../../../options/decimals.js"; export default command({ description: "Encode call data for VestingVault.addGrantAndDelegate", options: { - who: { - alias: ["address"], + w: { + alias: ["who", "address"], description: "The grant recipient", type: "string", + customType: "hex", required: true, }, - amount: { - description: "The total grant value", + a: { + alias: ["amount"], + description: "The total grant value.", type: "string", required: true, }, - decimals: { + d: decimalsOption, + t: { + alias: ["start-time"], description: - "The decimal precision used by the contract. The amount option will be multiplied by (10 ** decimals). For example, if amount is 100 and decimals is 18, then the result will be 100000000000000000000", - type: "number", - default: 18, - }, - "start-time": { - description: - "An optional non standard start time (in seconds). If set to zero then the start time will be made the block this is executed in", + "An optional non standard start time (in seconds). If set to zero then the start time will be made the block this is executed in.", type: "number", default: 0, }, - expiration: { + e: { + alias: ["expiration"], description: - "The timestamp (in seconds) when the grant ends and all tokens are unlocked", + "The timestamp (in seconds) when the grant ends and all tokens are unlocked.", type: "number", required: true, }, - cliff: { + c: { + alias: ["cliff"], description: - "The timestamp (in seconds) when the grant begins vesting. No tokens will be unlocked until this timestamp has been reached", + "The timestamp (in seconds) when the grant begins vesting. No tokens will be unlocked until this timestamp has been reached.", type: "number", required: true, }, - delegate: { + D: { + alias: ["delegate", "delegatee"], description: - "The address to delegate the resulting voting power to if the recipient doesn't already have a delegate", + "The address to delegate the resulting voting power to if the recipient doesn't already have a delegate.", type: "string", + customType: "hex", required: true, }, }, @@ -71,54 +75,24 @@ export default command({ prompt: "Enter cliff timestamp (in seconds)", }); - const delegate = await options.delegate({ - prompt: "Enter delegate address", + const delegatee = await options.delegatee({ + prompt: "Enter delegatee address", }); - const encoded = encodeAddGrantAndDelegate({ - who, - amount, - decimals, - startTime, - expiration, - cliff, - delegate, + const encoded = encodeFunctionData({ + abi: VestingVault.abi, + fn: "addGrantAndDelegate", + args: { + _amount: parseUnits(amount, decimals), + _cliff: BigInt(cliff), + _delegatee: delegatee, + _expiration: BigInt(expiration), + _startTime: BigInt(startTime), + _who: who, + }, }); signale.success(encoded); next(encoded); }, }); - -interface EncodeAddGrantAndDelegateOptions { - who: string; - amount: string; - decimals: number; - expiration: number; - cliff: number; - delegate: string; - startTime?: number; -} - -export function encodeAddGrantAndDelegate({ - who, - amount, - decimals, - startTime = 0, - expiration, - cliff, - delegate, -}: EncodeAddGrantAndDelegateOptions): string { - return encodeFunctionData({ - abi: VestingVault.abi, - functionName: "addGrantAndDelegate", - args: [ - who as `0x${string}`, - parseUnits(amount, decimals), - BigInt(startTime), - BigInt(expiration), - BigInt(cliff), - delegate as `0x${string}`, - ], - }); -} diff --git a/packages/council-cli/src/commands/encode/vesting-vault/change-delegation.ts b/packages/council-cli/src/commands/encode/vesting-vault/change-delegation.ts index 1361e6ca..d45c20ed 100644 --- a/packages/council-cli/src/commands/encode/vesting-vault/change-delegation.ts +++ b/packages/council-cli/src/commands/encode/vesting-vault/change-delegation.ts @@ -1,36 +1,33 @@ import { VestingVault } from "@delvtech/council-artifacts/VestingVault"; +import { encodeFunctionData } from "@delvtech/drift"; import { command } from "clide-js"; import signale from "signale"; -import { encodeFunctionData } from "viem"; export default command({ description: "Encode call data for VestingVault.changeDelegation", options: { - address: { - alias: ["new-delegate", "newDelegate"], - description: "The amount of tokens to deposit", + d: { + alias: ["to", "new-delegate"], + description: "The amount of tokens to deposit.", type: "string", + customType: "hex", required: true, }, }, handler: async ({ options, next }) => { - const address = await options.address({ + const to = await options.to({ prompt: "Enter new delegate address", }); - const encoded = encodeChangeDelegation(address); + const encoded = encodeFunctionData({ + abi: VestingVault.abi, + fn: "delegate", + args: { _to: to }, + }); signale.success(encoded); next(encoded); }, }); - -export function encodeChangeDelegation(address: string): string { - return encodeFunctionData({ - abi: VestingVault.abi, - functionName: "delegate", - args: [address as `0x${string}`], - }); -} diff --git a/packages/council-cli/src/commands/encode/vesting-vault/change-unvested-multiplier.ts b/packages/council-cli/src/commands/encode/vesting-vault/change-unvested-multiplier.ts index ef04bbaa..e9a44d69 100644 --- a/packages/council-cli/src/commands/encode/vesting-vault/change-unvested-multiplier.ts +++ b/packages/council-cli/src/commands/encode/vesting-vault/change-unvested-multiplier.ts @@ -1,14 +1,15 @@ import { VestingVault } from "@delvtech/council-artifacts/VestingVault"; +import { encodeFunctionData } from "@delvtech/drift"; import { command } from "clide-js"; import signale from "signale"; -import { encodeFunctionData } from "viem"; export default command({ description: "Encode call data for VestingVault.changeUnvestedMultiplier", options: { - multiplier: { - description: "The new multiplier as a percentage", + m: { + alias: ["multiplier"], + description: "The new multiplier as a percentage.", type: "number", required: true, }, @@ -19,17 +20,13 @@ export default command({ prompt: "Enter new multiplier (%)", }); - const encoded = encodeChangeUnvestedMultiplier(multiplier); + const encoded = encodeFunctionData({ + abi: VestingVault.abi, + fn: "changeUnvestedMultiplier", + args: { _multiplier: BigInt(multiplier) }, + }); signale.success(encoded); next(encoded); }, }); - -export function encodeChangeUnvestedMultiplier(multiplier: number): string { - return encodeFunctionData({ - abi: VestingVault.abi, - functionName: "changeUnvestedMultiplier", - args: [BigInt(multiplier)], - }); -} diff --git a/packages/council-cli/src/commands/encode/vesting-vault/delegate.ts b/packages/council-cli/src/commands/encode/vesting-vault/delegate.ts index 948d40e0..e34d9364 100644 --- a/packages/council-cli/src/commands/encode/vesting-vault/delegate.ts +++ b/packages/council-cli/src/commands/encode/vesting-vault/delegate.ts @@ -1,36 +1,33 @@ import { VestingVault } from "@delvtech/council-artifacts/VestingVault"; +import { encodeFunctionData } from "@delvtech/drift"; import { command } from "clide-js"; import signale from "signale"; -import { encodeFunctionData } from "viem"; export default command({ description: "Encode call data for VestingVault.delegate", options: { - address: { - alias: ["to"], - description: "The address to delegate to", + t: { + alias: ["to", "address"], + description: "The address to delegate to.", type: "string", + customType: "hex", required: true, }, }, handler: async ({ options, next }) => { - const address = await options.address({ + const to = await options.to({ prompt: "Enter new delegate address", }); - const encoded = encodeDelegate(address); + const encoded = encodeFunctionData({ + abi: VestingVault.abi, + fn: "delegate", + args: { _to: to }, + }); signale.success(encoded); next(encoded); }, }); - -export function encodeDelegate(address: string): string { - return encodeFunctionData({ - abi: VestingVault.abi, - functionName: "delegate", - args: [address as `0x${string}`], - }); -} diff --git a/packages/council-cli/src/commands/encode/vesting-vault/deposit.ts b/packages/council-cli/src/commands/encode/vesting-vault/deposit.ts index aaf848e3..901fa265 100644 --- a/packages/council-cli/src/commands/encode/vesting-vault/deposit.ts +++ b/packages/council-cli/src/commands/encode/vesting-vault/deposit.ts @@ -1,23 +1,21 @@ import { VestingVault } from "@delvtech/council-artifacts/VestingVault"; +import { encodeFunctionData } from "@delvtech/drift"; import { command } from "clide-js"; import signale from "signale"; -import { encodeFunctionData, parseUnits } from "viem"; +import { parseUnits } from "viem"; +import { decimalsOption } from "../../../options/decimals.js"; export default command({ description: "Encode call data for VestingVault.deposit", options: { - amount: { - description: "The amount of tokens to deposit", + a: { + alias: ["amount"], + description: "The amount of tokens to deposit.", type: "string", required: true, }, - decimals: { - description: - "The decimal precision used by the contract. The amount option will be multiplied by (10 ** decimals). For example, if amount is 100 and decimals is 18, then the result will be 100000000000000000000", - type: "number", - default: 18, - }, + d: decimalsOption, }, handler: async ({ options, next }) => { @@ -27,17 +25,13 @@ export default command({ const decimals = await options.decimals(); - const encoded = encodeDeposit(amount, decimals); + const encoded = encodeFunctionData({ + abi: VestingVault.abi, + fn: "deposit", + args: { _amount: parseUnits(amount, decimals) }, + }); signale.success(encoded); next(encoded); }, }); - -export function encodeDeposit(amount: string, decimals: number): string { - return encodeFunctionData({ - abi: VestingVault.abi, - functionName: "deposit", - args: [parseUnits(amount, decimals)], - }); -} diff --git a/packages/council-cli/src/commands/encode/vesting-vault/initialize.ts b/packages/council-cli/src/commands/encode/vesting-vault/initialize.ts index 2adbd0db..556cad4e 100644 --- a/packages/council-cli/src/commands/encode/vesting-vault/initialize.ts +++ b/packages/council-cli/src/commands/encode/vesting-vault/initialize.ts @@ -1,21 +1,25 @@ import { VestingVault } from "@delvtech/council-artifacts/VestingVault"; +import { encodeFunctionData } from "@delvtech/drift"; import { command } from "clide-js"; import signale from "signale"; -import { encodeFunctionData } from "viem"; export default command({ description: "Encode call data for VestingVault.initialize", options: { - manager: { - description: "The address that will be able add and remove grants", + m: { + alias: ["manager"], + description: "The address that will be able add and remove grants.", type: "string", + customType: "hex", required: true, }, - timelock: { + t: { + alias: ["timelock"], description: - "The address that will be able to change the unvested multiplier, the manager, and the timelock", + "The address that will be able to change the unvested multiplier, the manager, and the timelock.", type: "string", + customType: "hex", required: true, }, }, @@ -29,17 +33,16 @@ export default command({ prompt: "Enter timelock address", }); - const encoded = encodeInitialize(manager, timelock); + const encoded = encodeFunctionData({ + abi: VestingVault.abi, + fn: "initialize", + args: { + manager_: manager, + timelock_: timelock, + }, + }); signale.success(encoded); next(encoded); }, }); - -export function encodeInitialize(manager: string, timelock: string): string { - return encodeFunctionData({ - abi: VestingVault.abi, - functionName: "initialize", - args: [manager as `0x${string}`, timelock as `0x${string}`], - }); -} diff --git a/packages/council-cli/src/commands/encode/vesting-vault/remove-grant.ts b/packages/council-cli/src/commands/encode/vesting-vault/remove-grant.ts index 4466d6ae..864a976c 100644 --- a/packages/council-cli/src/commands/encode/vesting-vault/remove-grant.ts +++ b/packages/council-cli/src/commands/encode/vesting-vault/remove-grant.ts @@ -1,36 +1,33 @@ import { VestingVault } from "@delvtech/council-artifacts/VestingVault"; +import { encodeFunctionData } from "@delvtech/drift"; import { command } from "clide-js"; import signale from "signale"; -import { encodeFunctionData } from "viem"; export default command({ description: "Encode call data for VestingVault.removeGrant", options: { - address: { - alias: ["who"], - description: "The grant owner", + w: { + alias: ["who", "address"], + description: "The grant owner.", type: "string", + customType: "hex", required: true, }, }, handler: async ({ options, next }) => { const who = await options.who({ - prompt: "Enter owner address", + prompt: "Enter grantee address", }); - const encoded = encodeRemoveGrant(who); + const encoded = encodeFunctionData({ + abi: VestingVault.abi, + fn: "removeGrant", + args: { _who: who }, + }); signale.success(encoded); next(encoded); }, }); - -export function encodeRemoveGrant(who: string): string { - return encodeFunctionData({ - abi: VestingVault.abi, - functionName: "removeGrant", - args: [who as `0x${string}`], - }); -} diff --git a/packages/council-cli/src/commands/encode/vesting-vault/set-manager.ts b/packages/council-cli/src/commands/encode/vesting-vault/set-manager.ts index d133205c..1148ff87 100644 --- a/packages/council-cli/src/commands/encode/vesting-vault/set-manager.ts +++ b/packages/council-cli/src/commands/encode/vesting-vault/set-manager.ts @@ -1,36 +1,33 @@ import { VestingVault } from "@delvtech/council-artifacts/VestingVault"; +import { encodeFunctionData } from "@delvtech/drift"; import { command } from "clide-js"; import signale from "signale"; -import { encodeFunctionData } from "viem"; export default command({ description: "Encode call data for VestingVault.setManager", options: { - address: { - alias: ["manager"], - description: "The new manager address", + m: { + alias: ["manager", "address"], + description: "The new manager address.", type: "string", + customType: "hex", required: true, }, }, handler: async ({ options, next }) => { - const address = await options.address({ + const manager = await options.manager({ prompt: "Enter new manager address", }); - const encoded = encodeSetManager(address); + const encoded = encodeFunctionData({ + abi: VestingVault.abi, + fn: "setManager", + args: { manager_: manager }, + }); signale.success(encoded); next(encoded); }, }); - -export function encodeSetManager(address: string): string { - return encodeFunctionData({ - abi: VestingVault.abi, - functionName: "setManager", - args: [address as `0x${string}`], - }); -} diff --git a/packages/council-cli/src/commands/encode/vesting-vault/set-timelock.ts b/packages/council-cli/src/commands/encode/vesting-vault/set-timelock.ts index d3979395..d49d5961 100644 --- a/packages/council-cli/src/commands/encode/vesting-vault/set-timelock.ts +++ b/packages/council-cli/src/commands/encode/vesting-vault/set-timelock.ts @@ -1,36 +1,33 @@ import { VestingVault } from "@delvtech/council-artifacts/VestingVault"; +import { encodeFunctionData } from "@delvtech/drift"; import { command } from "clide-js"; import signale from "signale"; -import { encodeFunctionData } from "viem"; export default command({ description: "Encode call data for VestingVault.setTimelock", options: { - address: { - alias: ["timelock"], - description: "The new timelock address", + t: { + alias: ["timelock", "address"], + description: "The new timelock address.", type: "string", + customType: "hex", required: true, }, }, handler: async ({ options, next }) => { - const address = await options.address({ + const timelock = await options.timelock({ prompt: "Enter new timelock address", }); - const encoded = encodeSetTimelock(address); + const encoded = encodeFunctionData({ + abi: VestingVault.abi, + fn: "setTimelock", + args: { timelock_: timelock }, + }); signale.success(encoded); next(encoded); }, }); - -export function encodeSetTimelock(address: string): string { - return encodeFunctionData({ - abi: VestingVault.abi, - functionName: "setTimelock", - args: [address as `0x${string}`], - }); -} diff --git a/packages/council-cli/src/commands/encode/vesting-vault/update-voting-power.ts b/packages/council-cli/src/commands/encode/vesting-vault/update-voting-power.ts index 00d343e3..f281e193 100644 --- a/packages/council-cli/src/commands/encode/vesting-vault/update-voting-power.ts +++ b/packages/council-cli/src/commands/encode/vesting-vault/update-voting-power.ts @@ -1,16 +1,17 @@ import { VestingVault } from "@delvtech/council-artifacts/VestingVault"; +import { encodeFunctionData } from "@delvtech/drift"; import { command } from "clide-js"; import signale from "signale"; -import { encodeFunctionData } from "viem"; export default command({ description: "Encode call data for VestingVault.updateVotingPower", options: { - address: { - alias: ["who"], - description: "The address to update voting power for", + w: { + alias: ["who", "address"], + description: "The address to update voting power for.", type: "string", + customType: "hex", required: true, }, }, @@ -20,17 +21,13 @@ export default command({ prompt: "Enter voter's address", }); - const encoded = encodeUpdateVotingPower(who); + const encoded = encodeFunctionData({ + abi: VestingVault.abi, + fn: "updateVotingPower", + args: { _who: who }, + }); signale.success(encoded); next(encoded); }, }); - -export function encodeUpdateVotingPower(who: string): string { - return encodeFunctionData({ - abi: VestingVault.abi, - functionName: "updateVotingPower", - args: [who as `0x${string}`], - }); -} diff --git a/packages/council-cli/src/commands/encode/vesting-vault/withdraw.ts b/packages/council-cli/src/commands/encode/vesting-vault/withdraw.ts index 776ec891..41c9d348 100644 --- a/packages/council-cli/src/commands/encode/vesting-vault/withdraw.ts +++ b/packages/council-cli/src/commands/encode/vesting-vault/withdraw.ts @@ -1,26 +1,26 @@ import { VestingVault } from "@delvtech/council-artifacts/VestingVault"; +import { encodeFunctionData } from "@delvtech/drift"; import { command } from "clide-js"; import signale from "signale"; -import { encodeFunctionData, parseUnits } from "viem"; +import { parseUnits } from "viem"; +import { decimalsOption } from "../../../options/decimals.js"; export default command({ description: "Encode call data for VestingVault.withdraw", options: { - amount: { - description: "The amount of tokens to withdraw", + a: { + alias: ["amount"], + description: "The amount of tokens to withdraw.", type: "string", required: true, }, - decimals: { - description: - "The decimal precision used by the contract. The amount option will be multiplied by (10 ** decimals). For example, if amount is 100 and decimals is 18, then the result will be 100000000000000000000", - type: "number", - default: 18, - }, - recipient: { - description: "The address to withdraw to", + d: decimalsOption, + r: { + alias: ["recipient"], + description: "The address to withdraw to.", type: "string", + customType: "hex", required: true, }, }, @@ -39,21 +39,16 @@ export default command({ prompt: "Enter recipient address", }); - const encoded = encodeDeposit(amount, decimals, recipient); + const encoded = encodeFunctionData({ + abi: VestingVault.abi, + fn: "withdraw", + args: { + _amount: parseUnits(amount, decimals), + _recipient: recipient, + }, + }); signale.success(encoded); next(encoded); }, }); - -export function encodeDeposit( - amount: string, - decimals: number, - recipient: string, -): string { - return encodeFunctionData({ - abi: VestingVault.abi, - functionName: "withdraw", - args: [parseUnits(amount, decimals), recipient as `0x${string}`], - }); -} diff --git a/packages/council-cli/src/commands/locking-vault.ts b/packages/council-cli/src/commands/locking-vault.ts index 3ef24594..92faa88b 100644 --- a/packages/council-cli/src/commands/locking-vault.ts +++ b/packages/council-cli/src/commands/locking-vault.ts @@ -1,6 +1,5 @@ -import { command, passThroughCommand } from "clide-js"; +import { command } from "clide-js"; export default command({ - ...passThroughCommand, description: "Interact with a LockingVault contract", }); diff --git a/packages/council-cli/src/commands/locking-vault/approve.ts b/packages/council-cli/src/commands/locking-vault/approve.ts index 64501bd3..9fcd7380 100644 --- a/packages/council-cli/src/commands/locking-vault/approve.ts +++ b/packages/council-cli/src/commands/locking-vault/approve.ts @@ -1,41 +1,30 @@ -import { ReadWriteCouncil } from "@delvtech/council-viem"; import { command } from "clide-js"; import signale from "signale"; -import { - createPublicClient, - createWalletClient, - http, - maxUint256, - parseUnits, -} from "viem"; -import { - getWriteOptions, - writeOptions, -} from "../../reusable-options/writeOptions.js"; +import { maxUint256, parseUnits } from "viem"; +import { getWriteOptions, writeOptions } from "../../options/writeOptions.js"; export default command({ description: "Give a spending allowance to a LockingVault contract for the tokens it accepts.", options: { - address: { - describe: "The LockingVault contract address", + a: { + alias: ["address"], + description: "The LockingVault contract address.", type: "string", + customType: "hex", required: true, }, - amount: { - describe: "The amount of tokens to approve", + A: { + alias: ["amount"], + description: "The amount of tokens to approve as a decimal string.", type: "string", }, ...writeOptions, }, - handler: async ({ options, context, next }) => { - const { - account: signerAccount, - chain, - rpcUrl, - } = await getWriteOptions(options, context); + handler: async ({ options, client, next }) => { + const { council, publicClient } = await getWriteOptions(options, client); const address = await options.address({ prompt: "Enter Locking Vault address", @@ -43,28 +32,25 @@ export default command({ const amount = await options.amount(); - const transport = http(rpcUrl); - const publicClient = createPublicClient({ chain, transport }); - const walletClient = createWalletClient({ - transport, - chain, - account: signerAccount, - }); - - const lockingVault = new ReadWriteCouncil({ - publicClient, - walletClient, - }).lockingVault(address as `0x${string}`); - + const lockingVault = council.lockingVault(address); const token = await lockingVault.getToken(); const decimals = await token.getDecimals(); const hash = await token.approve({ - amount: amount !== undefined ? parseUnits(amount, decimals) : maxUint256, - spender: lockingVault.address, + args: { + amount: + amount !== undefined ? parseUnits(amount, decimals) : maxUint256, + spender: lockingVault.address, + }, + options: { + onMined: () => { + signale.success(`Transaction success: ${hash}`); + }, + }, }); - signale.success(hash); + signale.pending(`Transaction submitted: ${hash}`); + await publicClient.waitForTransactionReceipt({ hash }); next(hash); }, }); diff --git a/packages/council-cli/src/commands/locking-vault/deposit.ts b/packages/council-cli/src/commands/locking-vault/deposit.ts index e648636c..20595b67 100644 --- a/packages/council-cli/src/commands/locking-vault/deposit.ts +++ b/packages/council-cli/src/commands/locking-vault/deposit.ts @@ -1,39 +1,36 @@ -import { ReadWriteCouncil } from "@delvtech/council-viem"; +import { parseFixed } from "@delvtech/fixed-point-wasm"; import { command } from "clide-js"; import signale from "signale"; -import { createPublicClient, createWalletClient, http, parseUnits } from "viem"; -import { - getWriteOptions, - writeOptions, -} from "../../reusable-options/writeOptions.js"; +import { getWriteOptions, writeOptions } from "../../options/writeOptions.js"; export default command({ description: "Deposit tokens into a LockingVault.", options: { - address: { - describe: "The LockingVault contract address", + a: { + alias: ["address"], + description: "The LockingVault contract address.", type: "string", + customType: "hex", required: true, }, - amount: { - describe: "The amount of tokens to deposit", + A: { + alias: ["amount"], + description: "The amount of tokens to deposit as a decimal string.", type: "string", required: true, }, - account: { - describe: "The account to credit the deposit to", + c: { + alias: ["account"], + description: "The account to credit the deposit to.", type: "string", + customType: "hex", }, ...writeOptions, }, - handler: async ({ options, context, next }) => { - const { - account: signerAccount, - chain, - rpcUrl, - } = await getWriteOptions(options, context); + handler: async ({ options, client, next }) => { + const { council, publicClient } = await getWriteOptions(options, client); const address = await options.address({ prompt: "Enter Locking Vault address", @@ -48,28 +45,24 @@ export default command({ const account = await options.account(); - const transport = http(rpcUrl); - const publicClient = createPublicClient({ chain, transport }); - const walletClient = createWalletClient({ - transport, - chain, - account: signerAccount, - }); - - const lockingVault = new ReadWriteCouncil({ - publicClient, - walletClient, - }).lockingVault(address as `0x${string}`); - + const lockingVault = council.lockingVault(address); const token = await lockingVault.getToken(); const decimals = await token.getDecimals(); const hash = await lockingVault.deposit({ - amount: parseUnits(amount, decimals), - account: account as `0x${string}` | undefined, + args: { + amount: parseFixed(amount, decimals).bigint, + account, + }, + options: { + onMined: () => { + signale.success(`Transaction success: ${hash}`); + }, + }, }); - signale.success(hash); + signale.pending(`Transaction submitted: ${hash}`); + await publicClient.waitForTransactionReceipt({ hash }); next(hash); }, }); diff --git a/packages/council-cli/src/commands/locking-vault/get-balance.ts b/packages/council-cli/src/commands/locking-vault/get-balance.ts index 640845e4..bb9a3203 100644 --- a/packages/council-cli/src/commands/locking-vault/get-balance.ts +++ b/packages/council-cli/src/commands/locking-vault/get-balance.ts @@ -1,33 +1,32 @@ -import { ReadCouncil } from "@delvtech/council-viem"; +import { createCouncil } from "@delvtech/council-js"; +import { fixed } from "@delvtech/fixed-point-wasm"; import { command } from "clide-js"; import signale from "signale"; -import { createPublicClient, http } from "viem"; -import { chainOption, getChain } from "../../reusable-options/chain.js"; -import { rpcUrlOption } from "../../reusable-options/rpc-url.js"; +import { rpcUrlOption } from "../../options/rpc-url.js"; export default command({ description: "Get the balance of a given account.", options: { - address: { - description: "The LockingVault contract address", + a: { + alias: ["address"], + description: "The LockingVault contract address.", type: "string", + customType: "hex", required: true, }, - account: { - alias: ["voter"], - description: "The account to get the balance of", + A: { + alias: ["account"], + description: "The account to get the balance of.", type: "string", + customType: "hex", required: true, }, - chain: chainOption, - rpc: rpcUrlOption, + r: rpcUrlOption, }, - handler: async ({ options, context, next }) => { - const chain = await getChain(options.chain, context); - - const rpcUrl = await options.rpc({ + handler: async ({ options, next }) => { + const rpcUrl = await options.rpcUrl({ prompt: "Enter RPC URL", }); @@ -39,17 +38,15 @@ export default command({ prompt: "Enter account to get balance of", }); - const transport = http(rpcUrl); - const publicClient = createPublicClient({ transport, chain }); - - const council = new ReadCouncil({ publicClient }); - const lockingVault = council.lockingVault(address as `0x${string}`); - - const balance = await lockingVault.getDepositedBalance({ - account: account as `0x${string}`, - }); + const lockingVault = createCouncil({ rpcUrl }).lockingVault(address); + const token = await lockingVault.getToken(); + const [balance, decimals] = await Promise.all([ + lockingVault.getBalanceOf(account), + token.getDecimals(), + ]); + const formattedBalance = fixed(balance, decimals).format(); - signale.info(balance); + signale.info(formattedBalance); next(balance); }, }); diff --git a/packages/council-cli/src/commands/locking-vault/get-delegate.ts b/packages/council-cli/src/commands/locking-vault/get-delegate.ts index ae68302a..a6400c74 100644 --- a/packages/council-cli/src/commands/locking-vault/get-delegate.ts +++ b/packages/council-cli/src/commands/locking-vault/get-delegate.ts @@ -1,33 +1,31 @@ -import { ReadCouncil } from "@delvtech/council-viem"; +import { createCouncil } from "@delvtech/council-js"; import { command } from "clide-js"; import signale from "signale"; -import { createPublicClient, http } from "viem"; -import { chainOption, getChain } from "../../reusable-options/chain.js"; -import { rpcUrlOption } from "../../reusable-options/rpc-url.js"; +import { rpcUrlOption } from "../../options/rpc-url.js"; export default command({ description: "Get the delegate of a given account.", options: { - address: { - description: "The LockingVault contract address", + a: { + alias: ["address"], + description: "The LockingVault contract address.", type: "string", + customType: "hex", required: true, }, - account: { - alias: ["voter"], - description: "The account to get the delegate of", + v: { + alias: ["voter", "account"], + description: "The account to get the delegate of.", type: "string", + customType: "hex", required: true, }, - chain: chainOption, - rpc: rpcUrlOption, + r: rpcUrlOption, }, - handler: async ({ options, context, next }) => { - const chain = await getChain(options.chain, context); - - const rpcUrl = await options.rpc({ + handler: async ({ options, next }) => { + const rpcUrl = await options.rpcUrl({ prompt: "Enter RPC URL", }); @@ -39,17 +37,11 @@ export default command({ prompt: "Enter account to get delegate of", }); - const transport = http(rpcUrl); - const publicClient = createPublicClient({ transport, chain }); - - const council = new ReadCouncil({ publicClient }); - const lockingVault = council.lockingVault(address as `0x${string}`); - - const delegate = await lockingVault.getDelegate({ - account: account as `0x${string}`, - }); + const delegate = await createCouncil({ rpcUrl }) + .lockingVault(address) + .getDelegate(account); - signale.info(delegate.address); + signale.info(delegate); next(delegate); }, }); diff --git a/packages/council-cli/src/commands/locking-vault/get-token.ts b/packages/council-cli/src/commands/locking-vault/get-token.ts index 8798c468..44cd3fa5 100644 --- a/packages/council-cli/src/commands/locking-vault/get-token.ts +++ b/packages/council-cli/src/commands/locking-vault/get-token.ts @@ -1,27 +1,24 @@ -import { ReadCouncil } from "@delvtech/council-viem"; +import { createCouncil } from "@delvtech/council-js"; import { command } from "clide-js"; import signale from "signale"; -import { createPublicClient, http } from "viem"; -import { chainOption, getChain } from "../../reusable-options/chain.js"; -import { rpcUrlOption } from "../../reusable-options/rpc-url.js"; +import { rpcUrlOption } from "../../options/rpc-url.js"; export default command({ description: "Get the token contract address of a given locking vault.", options: { - address: { + a: { + alias: ["address"], description: "The LockingVault contract address", type: "string", + customType: "hex", required: true, }, - chain: chainOption, - rpc: rpcUrlOption, + r: rpcUrlOption, }, - handler: async ({ options, context, next }) => { - const chain = await getChain(options.chain, context); - - const rpcUrl = await options.rpc({ + handler: async ({ options, next }) => { + const rpcUrl = await options.rpcUrl({ prompt: "Enter RPC URL", }); @@ -29,12 +26,8 @@ export default command({ prompt: "Enter LockingVault contract address", }); - const transport = http(rpcUrl); - const publicClient = createPublicClient({ transport, chain }); - - const council = new ReadCouncil({ publicClient }); - const lockingVault = council.lockingVault(address as `0x${string}`); - + const council = createCouncil({ rpcUrl }); + const lockingVault = council.lockingVault(address); const token = await lockingVault.getToken(); signale.info(token.address); diff --git a/packages/council-cli/src/commands/locking-vault/get-voting-power.ts b/packages/council-cli/src/commands/locking-vault/get-voting-power.ts index 35e8c15b..43515e18 100644 --- a/packages/council-cli/src/commands/locking-vault/get-voting-power.ts +++ b/packages/council-cli/src/commands/locking-vault/get-voting-power.ts @@ -1,33 +1,32 @@ -import { ReadCouncil } from "@delvtech/council-viem"; +import { createCouncil } from "@delvtech/council-js"; +import { fixed } from "@delvtech/fixed-point-wasm"; import { command } from "clide-js"; import signale from "signale"; -import { createPublicClient, http } from "viem"; -import { chainOption, getChain } from "../../reusable-options/chain.js"; -import { rpcUrlOption } from "../../reusable-options/rpc-url.js"; +import { rpcUrlOption } from "../../options/rpc-url.js"; export default command({ description: "Get the voting power of a given account.", options: { - address: { + a: { + alias: ["address"], description: "The LockingVault contract address", type: "string", + customType: "hex", required: true, }, - account: { - alias: ["voter"], + v: { + alias: ["voter", "account"], description: "The account to get the voting power of", type: "string", + customType: "hex", required: true, }, - chain: chainOption, - rpc: rpcUrlOption, + r: rpcUrlOption, }, - handler: async ({ options, context, next }) => { - const chain = await getChain(options.chain, context); - - const rpcUrl = await options.rpc({ + handler: async ({ options, next }) => { + const rpcUrl = await options.rpcUrl({ prompt: "Enter RPC URL", }); @@ -35,21 +34,16 @@ export default command({ prompt: "Enter LockingVault contract address", }); - const account = await options.account({ + const voter = await options.voter({ prompt: "Enter account to get balance of", }); - const transport = http(rpcUrl); - const publicClient = createPublicClient({ transport, chain }); - - const council = new ReadCouncil({ publicClient }); - const lockingVault = council.lockingVault(address as `0x${string}`); - - const power = await lockingVault.getVotingPower({ - account: account as `0x${string}`, - }); + const council = createCouncil({ rpcUrl }); + const lockingVault = council.lockingVault(address); + const power = await lockingVault.getVotingPower({ voter }); + const formattedPower = fixed(power, 18).format(); - signale.info(power); + signale.info(formattedPower); next(power); }, }); diff --git a/packages/council-cli/src/commands/locking-vault/withdraw.ts b/packages/council-cli/src/commands/locking-vault/withdraw.ts index 34fe2f5a..04975ee4 100644 --- a/packages/council-cli/src/commands/locking-vault/withdraw.ts +++ b/packages/council-cli/src/commands/locking-vault/withdraw.ts @@ -1,35 +1,30 @@ -import { ReadWriteCouncil } from "@delvtech/council-viem"; +import { parseFixed } from "@delvtech/fixed-point-wasm"; import { command } from "clide-js"; import signale from "signale"; -import { createPublicClient, createWalletClient, http, parseUnits } from "viem"; -import { - getWriteOptions, - writeOptions, -} from "../../reusable-options/writeOptions.js"; +import { getWriteOptions, writeOptions } from "../../options/writeOptions.js"; export default command({ description: "Withdraw tokens from a LockingVault.", options: { - address: { - describe: "The LockingVault contract address", + a: { + alias: ["address"], + description: "The LockingVault contract address.", type: "string", + customType: "hex", required: true, }, - amount: { - describe: "The amount of tokens to withdraw", + A: { + alias: ["amount"], + description: "The amount of tokens to withdraw as a decimal string.", type: "string", required: true, }, ...writeOptions, }, - handler: async ({ options, context, next }) => { - const { - account: signerAccount, - chain, - rpcUrl, - } = await getWriteOptions(options, context); + handler: async ({ options, client, next }) => { + const { council, publicClient } = await getWriteOptions(options, client); const address = await options.address({ prompt: "Enter Locking Vault address", @@ -42,27 +37,23 @@ export default command({ }, }); - const transport = http(rpcUrl); - const publicClient = createPublicClient({ chain, transport }); - const walletClient = createWalletClient({ - transport, - chain, - account: signerAccount, - }); - - const lockingVault = new ReadWriteCouncil({ - publicClient, - walletClient, - }).lockingVault(address as `0x${string}`); - + const lockingVault = council.lockingVault(address); const token = await lockingVault.getToken(); const decimals = await token.getDecimals(); const hash = await lockingVault.withdraw({ - amount: parseUnits(amount, decimals), + args: { + amount: parseFixed(amount, decimals).bigint, + }, + options: { + onMined: () => { + signale.success(`Transaction success: ${hash}`); + }, + }, }); - signale.success(hash); + signale.pending(`Transaction submitted: ${hash}`); + await publicClient.waitForTransactionReceipt({ hash }); next(hash); }, }); diff --git a/packages/council-cli/src/commands/merkle-rewards.ts b/packages/council-cli/src/commands/merkle-rewards.ts index 9644c923..458293be 100644 --- a/packages/council-cli/src/commands/merkle-rewards.ts +++ b/packages/council-cli/src/commands/merkle-rewards.ts @@ -1,7 +1,6 @@ -import { command, passThroughCommand } from "clide-js"; +import { command } from "clide-js"; export default command({ - ...passThroughCommand, description: "Do something for merkle rewards, like create a tree with proofs.", }); diff --git a/packages/council-cli/src/commands/merkle-rewards/create-tree.ts b/packages/council-cli/src/commands/merkle-rewards/create-tree.ts index 1618e800..90a1136d 100644 --- a/packages/council-cli/src/commands/merkle-rewards/create-tree.ts +++ b/packages/council-cli/src/commands/merkle-rewards/create-tree.ts @@ -4,7 +4,6 @@ import MerkleTree from "merkletreejs"; import path from "path"; import signale from "signale"; import { - Address, Hex, encodePacked, formatUnits, @@ -12,39 +11,45 @@ import { keccak256, parseUnits, } from "viem"; -import { JsonStore } from "../../utils/config/JsonStore.js"; -import { Schema, validateData } from "../../utils/config/validateData.js"; +import { z } from "zod"; +import { Address as AddressSchema, DecimalString } from "../../lib/zod.js"; +import { JsonStore } from "../../utils/JsonStore.js"; import { isNotEmptyList } from "../../utils/validation/isNotEmptyList.js"; import { isNumberString } from "../../utils/validation/isNumberString.js"; +import { validateData } from "../../utils/validation/validateData.js"; export default command({ description: "Create a merkle tree for rewards (e.g., airdrop) from a list of addresses and reward amounts. The output is a JSON file with the merkle root and each leaf by address with it's proof.", options: { - "accounts-path": { + i: { + alias: ["input", "input-path"], description: 'The path to the json file with the addresses and amounts listed as an array of objects with address and amount properties. The amount property is a decimal string that will be scaled based on the decimals option. For example, [{"address": "0x1234...", "amount": "100.5"}, ...].', type: "string", }, - addresses: { + a: { + alias: ["addresses"], description: "A list of recipient addresses to include in the merkle tree.", type: "array", + customType: "hexArray", }, - amounts: { + A: { + alias: ["amounts"], description: "A list of amounts to reward each address. Must be same length as addresses.", type: "array", }, - decimals: { - alias: ["token-decimals"], + d: { + alias: ["decimals", "token-decimals"], description: "The decimal precision used by the token contract. The amounts will be multiplied by (10 ** decimals). For example, if amount is 100 and decimals is 18, then the result will be 100000000000000000000.", type: "number", default: 18, }, - out: { + o: { alias: ["out-dir"], description: "The directory to write the merkle tree info to; relative to the current working directory.", @@ -53,29 +58,29 @@ export default command({ }, handler: async ({ options, next }) => { - const accounts = await getAccounts({ - accountsPathGetter: options.accountsPath, + const leaves = await getLeaves({ + inputsPathGetter: options.inputPath, addressesGetter: options.addresses, amountsGetter: options.amounts, }); const decimals = await options.decimals(); - const merkleTree = getMerkleTree(accounts, decimals); + const merkleTree = createMerkleTree(leaves, decimals); // Sum all the amounts - const amountTotal = accounts.reduce( + const amountTotal = leaves.reduce( (sum, { amount }) => sum + parseUnits(amount, decimals), 0n, ); // Get the total unique addresses - const allAddresses = accounts.map(({ address }) => address); + const allAddresses = leaves.map(({ address }) => address); const uniqueAddresses = new Set(allAddresses); // Create object entries for each account with the address as the key which // is lowercased since object keys are case sensitive. - const accountsEntries = accounts.map(({ address, amount }) => { + const accountsEntries = leaves.map(({ address, amount }) => { const proof = merkleTree.getHexProof( hashAccount({ address, amount }, decimals), ); @@ -121,81 +126,80 @@ export default command({ }, }); +const Leaves = z.array( + z.object({ + address: AddressSchema, + amount: DecimalString, + }), +); +type Leaves = z.infer; + /** - * A requiredOption wrapper for prompting the user for the accounts to create + * A requiredOption wrapper for prompting the user for the leaves to create * the merkle tree from. */ -async function getAccounts({ - accountsPathGetter, +async function getLeaves({ + inputsPathGetter, addressesGetter, amountsGetter, }: { - accountsPathGetter: OptionGetter; - addressesGetter: OptionGetter; - amountsGetter: OptionGetter; -}): Promise { - let accounts: Account[] = []; + inputsPathGetter: OptionGetter<{ type: "string"; customType: "hex" }>; + addressesGetter: OptionGetter<{ type: "array"; customType: "hexArray" }>; + amountsGetter: OptionGetter<{ type: "array" }>; +}): Promise { + const leaves: Leaves = []; let addresses = await addressesGetter(); let amounts = await amountsGetter(); - // Try to import the accounts from the accounts path if it was passed or - // prompt the user for the accounts path if no options were passed. + // Try to import the leaves from the input path if it was passed or prompt + // the user for the input path if no options were passed. if (!addresses && !amounts) { - const possibleAccountsPath = await accountsPathGetter({ - prompt: `Enter the path to the accounts JSON file ${colors.dim( + const possibleInputPath = await inputsPathGetter({ + prompt: `Enter the path to the leaves JSON file ${colors.dim( "(Leave blank to enter addresses and amounts manually)", )}`, }); - // Import and validate the accounts from the accounts path - if (possibleAccountsPath) { - const fullAccountsPath = path.resolve( - process.cwd(), - possibleAccountsPath, - ); + // Import and validate the leaves from the input path + if (possibleInputPath) { + const fullInputPath = path.resolve(process.cwd(), possibleInputPath); - const { default: importedAccounts } = await import( - fullAccountsPath - ).catch((err) => { - signale.error(err); - throw new Error( - `The accounts file at ${fullAccountsPath} could not be found.`, - ); - }); + const { default: importedLeafs } = await import(fullInputPath).catch( + (err) => { + signale.error(err); + throw new Error( + `The leaves file at ${fullInputPath} could not be found.`, + ); + }, + ); - // Validate the imported accounts - validateData(importedAccounts, accountsScema); + // Validate the imported leaves + validateData(importedLeafs, Leaves); - // Add the imported accounts to the accounts array - accounts = [...accounts, ...importedAccounts]; + // Add the imported leaves to the leaves array + leaves.push(...importedLeafs); } } - // Add accounts from the addresses and amounts options if they were passed or - // prompt the user for them if accounts is still empty. - if ( - isNotEmptyList(addresses) || - isNotEmptyList(amounts) || - !accounts.length - ) { + // Add leaves from the addresses and amounts options if they were passed or + // prompt the user for them if leaves is still empty. + if (isNotEmptyList(addresses) || isNotEmptyList(amounts) || !leaves.length) { addresses = await addressesGetter({ - prompt: { - message: "Enter recipient addresses", - validate: (addresses) => { - if (!addresses?.length) { - return "Enter valid addresses"; + prompt: "Enter recipient addresses", + validate: (addresses) => { + if (!Array.isArray(addresses) || !addresses?.length) { + return "Enter valid addresses"; + } + + // Validate the addresses + for (const address of addresses) { + if (!isAddress(address)) { + return `Invalid address: ${address}`; } + } - // Validate the addresses - for (const address of addresses) { - if (!isAddress(address)) { - return `Invalid address: ${address}`; - } - } - - return true; - }, + return true; }, }); @@ -204,22 +208,20 @@ async function getAccounts({ } amounts = await amountsGetter({ - prompt: { - message: "Enter reward amounts", - validate: (amounts) => { - if (!amounts) { - return "Enter valid amounts"; - } - - // Validate the addresses - for (const amount of amounts) { - if (!isNumberString(amount)) { - return `Invalid amount: ${amount}`; - } + prompt: "Enter reward amounts", + validate: (amounts) => { + if (!amounts || !Array.isArray(amounts)) { + return "Enter valid amounts"; + } + + // Validate the addresses + for (const amount of amounts) { + if (!isNumberString(amount)) { + return `Invalid amount: ${amount}`; } + } - return true; - }, + return true; }, }); @@ -234,48 +236,25 @@ async function getAccounts({ ); } - const ensuredAccounts = addresses.map((address, i) => { + const leavesFromOptions = addresses.map((address, i) => { return { - address: address as `0x${string}`, + address, amount: (amounts as `${number}`[])[i], }; }); - // Add the ensured accounts to the accounts array - return [...accounts, ...ensuredAccounts]; + // Add the manually entered leaves to the leaves array + leaves.push(...leavesFromOptions); } - return accounts; + return leaves; } -interface Account { - address: Address; - amount: `${number}`; -} - -const accountsScema: Schema = { - type: "array", - items: { - type: "object", - properties: { - address: { - type: "string", - pattern: "^0x[a-fA-F0-9]{40}$", - }, - amount: { - type: "string", - pattern: "^(\\d*\\.)?\\d+$", - }, - }, - required: ["address", "amount"], - }, -}; - -function getMerkleTree(accounts: Account[], tokenDecimals: number) { - const leaves = accounts.map((account) => hashAccount(account, tokenDecimals)); +function createMerkleTree(leaves: Leaves, tokenDecimals: number) { + const hashedLeaves = leaves.map((leaf) => hashAccount(leaf, tokenDecimals)); return new MerkleTree.default( - leaves, + hashedLeaves, (bytes: Hex) => { const packedData = encodePacked(["bytes"], [bytes]); return keccak256(packedData); @@ -287,7 +266,10 @@ function getMerkleTree(accounts: Account[], tokenDecimals: number) { ); } -function hashAccount({ address, amount }: Account, tokenDecimals: number) { +function hashAccount( + { address, amount }: Leaves[number], + tokenDecimals: number, +) { const packedData = encodePacked( ["address", "uint256"], [address, parseUnits(amount, tokenDecimals)], diff --git a/packages/council-cli/src/commands/mock-token.ts b/packages/council-cli/src/commands/mock-token.ts index 91a86ae3..421132bc 100644 --- a/packages/council-cli/src/commands/mock-token.ts +++ b/packages/council-cli/src/commands/mock-token.ts @@ -1,6 +1,5 @@ -import { command, passThroughCommand } from "clide-js"; +import { command } from "clide-js"; export default command({ - ...passThroughCommand, description: "Interact with a MockERC20 contract", }); diff --git a/packages/council-cli/src/commands/mock-token/mint.ts b/packages/council-cli/src/commands/mock-token/mint.ts index 902fdb60..0fa174d5 100644 --- a/packages/council-cli/src/commands/mock-token/mint.ts +++ b/packages/council-cli/src/commands/mock-token/mint.ts @@ -1,40 +1,38 @@ -import { ReadWriteMockToken } from "@delvtech/council-viem"; +import { MockERC20 } from "@delvtech/council-artifacts/MockERC20"; import { command } from "clide-js"; import signale from "signale"; -import { createPublicClient, createWalletClient, http, parseUnits } from "viem"; -import { - getWriteOptions, - writeOptions, -} from "../../reusable-options/writeOptions.js"; +import { parseUnits } from "viem"; +import { getWriteOptions, writeOptions } from "../../options/writeOptions.js"; export default command({ description: "Mint tokens", options: { - address: { - describe: "The token contract address", + a: { + alias: ["address"], + description: "The token contract address.", type: "string", + customType: "hex", required: true, }, - account: { - describe: "The account to mint tokens for", + A: { + alias: ["amount"], + description: "The amount of tokens to mint.", type: "string", required: true, }, - amount: { - describe: "The amount of tokens to mint", + c: { + alias: ["account"], + description: "The account to mint tokens for,", type: "string", + customType: "hex", required: true, }, ...writeOptions, }, - handler: async ({ options, context, next }) => { - const { - account: signerAccount, - chain, - rpcUrl, - } = await getWriteOptions(options, context); + handler: async ({ options, client, next }) => { + const { drift } = await getWriteOptions(options, client); const address = await options.address({ prompt: "Enter token contract address", @@ -51,27 +49,27 @@ export default command({ }, }); - const transport = http(rpcUrl); - const publicClient = createPublicClient({ transport, chain }); - const walletClient = createWalletClient({ - transport, - chain, - account: signerAccount, + const token = drift.contract({ + abi: MockERC20.abi, + address, }); + const decimals = await token.read("decimals"); - const token = new ReadWriteMockToken({ - address: address as `0x${string}`, - publicClient, - walletClient, - }); - - const decimals = await token.getDecimals(); - const hash = await token.mint({ - account: account as `0x${string}`, - amount: parseUnits(amount, decimals), - }); + const hash = await token.write( + "mint", + { + account, + amount: parseUnits(amount, decimals), + }, + { + onMined: () => { + signale.success(`Transaction success: ${hash}`); + }, + }, + ); - signale.success(hash); + signale.pending(`Transaction submitted: ${hash}`); + await drift.waitForTransaction({ hash }); next(hash); }, }); diff --git a/packages/council-cli/src/commands/mock-token/set-allowance.ts b/packages/council-cli/src/commands/mock-token/set-allowance.ts index 41482f77..2a8e1e62 100644 --- a/packages/council-cli/src/commands/mock-token/set-allowance.ts +++ b/packages/council-cli/src/commands/mock-token/set-allowance.ts @@ -1,46 +1,46 @@ -import { ReadWriteMockToken } from "@delvtech/council-viem"; +import { MockERC20 } from "@delvtech/council-artifacts/MockERC20"; import { command } from "clide-js"; import signale from "signale"; -import { createPublicClient, createWalletClient, http, parseUnits } from "viem"; -import { - getWriteOptions, - writeOptions, -} from "../../reusable-options/writeOptions.js"; +import { parseUnits } from "viem"; +import { getWriteOptions, writeOptions } from "../../options/writeOptions.js"; export default command({ description: "Set an account's token allowance", options: { - address: { - description: "The token contract address", + a: { + alias: ["address"], + description: "The token contract address.", type: "string", + customType: "hex", required: true, }, - owner: { - description: "The address of the token owner", + o: { + alias: ["owner", "source"], + description: "The address of the token owner.", type: "string", + customType: "hex", required: true, }, - spender: { - description: "The address of the token spender", + s: { + alias: ["spender"], + description: "The address of the token spender.", type: "string", + customType: "hex", required: true, }, - allowance: { + A: { + alias: ["allowance"], description: - "The amount of tokens the spender is allowed to spend from the owner's account", + "The amount of tokens the spender is allowed to spend from the owner's account as a decimals string.", type: "string", required: true, }, ...writeOptions, }, - handler: async ({ options, context, next }) => { - const { - account: signerAccount, - chain, - rpcUrl, - } = await getWriteOptions(options, context); + handler: async ({ options, client, next }) => { + const { drift } = await getWriteOptions(options, client); const address = await options.address({ prompt: "Enter token contract address", @@ -62,28 +62,28 @@ export default command({ }, }); - const transport = http(rpcUrl); - const publicClient = createPublicClient({ transport, chain }); - const walletClient = createWalletClient({ - transport, - chain, - account: signerAccount, + const token = drift.contract({ + abi: MockERC20.abi, + address, }); + const decimals = await token.read("decimals"); - const token = new ReadWriteMockToken({ - address: address as `0x${string}`, - publicClient, - walletClient, - }); - - const decimals = await token.getDecimals(); - const hash = await token.setAllowance({ - allowance: parseUnits(allowance, decimals), - spender: spender as `0x${string}`, - owner: owner as `0x${string}`, - }); + const hash = await token.write( + "setAllowance", + { + amount: parseUnits(allowance, decimals), + source: owner, + spender, + }, + { + onMined: () => { + signale.success(`Transaction success: ${hash}`); + }, + }, + ); - signale.success(hash); + signale.pending(`Transaction submitted: ${hash}`); + await drift.waitForTransaction({ hash }); next(hash); }, }); diff --git a/packages/council-cli/src/commands/mock-token/set-balance.ts b/packages/council-cli/src/commands/mock-token/set-balance.ts index 347f40cb..1aae0e69 100644 --- a/packages/council-cli/src/commands/mock-token/set-balance.ts +++ b/packages/council-cli/src/commands/mock-token/set-balance.ts @@ -1,40 +1,39 @@ -import { ReadWriteMockToken } from "@delvtech/council-viem"; +import { MockERC20 } from "@delvtech/council-artifacts/MockERC20"; import { command } from "clide-js"; import signale from "signale"; -import { createPublicClient, createWalletClient, http, parseUnits } from "viem"; -import { - getWriteOptions, - writeOptions, -} from "../../reusable-options/writeOptions.js"; +import { parseUnits } from "viem"; +import { getWriteOptions, writeOptions } from "../../options/writeOptions.js"; export default command({ description: "Set an account's token balance", options: { - address: { - description: "The token contract address", + a: { + alias: ["address"], + description: "The token contract address.", type: "string", + customType: "hex", required: true, }, - account: { - description: "The account to set balance for", + c: { + alias: ["account"], + description: "The account to set balance for.", type: "string", + customType: "hex", required: true, }, - balance: { - description: "The new balance (as a decimal string) for the account", + b: { + alias: ["balance"], + description: + "The new balance (as a decimal string) for the account as a decimal string.", type: "string", required: true, }, ...writeOptions, }, - handler: async ({ options, context, next }) => { - const { - account: singerAccount, - chain, - rpcUrl, - } = await getWriteOptions(options, context); + handler: async ({ options, client, next }) => { + const { drift } = await getWriteOptions(options, client); const address = await options.address({ prompt: "Enter token contract address", @@ -51,27 +50,27 @@ export default command({ }, }); - const transport = http(rpcUrl); - const publicClient = createPublicClient({ transport, chain }); - const walletClient = createWalletClient({ - transport, - chain, - account: singerAccount, + const token = drift.contract({ + abi: MockERC20.abi, + address, }); + const decimals = await token.read("decimals"); - const token = new ReadWriteMockToken({ - address: address as `0x${string}`, - publicClient, - walletClient, - }); - - const decimals = await token.getDecimals(); - const hash = await token.setBalance({ - account: account as `0x${string}`, - balance: parseUnits(balance, decimals), - }); + const hash = await token.write( + "setBalance", + { + who: account, + amount: parseUnits(balance, decimals), + }, + { + onMined: () => { + signale.success(`Transaction success: ${hash}`); + }, + }, + ); - signale.success(hash); + signale.pending(`Transaction submitted: ${hash}`); + await drift.waitForTransaction({ hash }); next(hash); }, }); diff --git a/packages/council-cli/src/commands/proposal.ts b/packages/council-cli/src/commands/proposal.ts index 47537174..a68c1ec8 100644 --- a/packages/council-cli/src/commands/proposal.ts +++ b/packages/council-cli/src/commands/proposal.ts @@ -1,6 +1,5 @@ -import { command, passThroughCommand } from "clide-js"; +import { command } from "clide-js"; export default command({ - ...passThroughCommand, description: "Interact with a proposal", }); diff --git a/packages/council-cli/src/commands/proposal/create.ts b/packages/council-cli/src/commands/proposal/create.ts index 88cd96e3..1392c00b 100644 --- a/packages/council-cli/src/commands/proposal/create.ts +++ b/packages/council-cli/src/commands/proposal/create.ts @@ -1,75 +1,81 @@ -import { Ballot, ReadWriteCouncil } from "@delvtech/council-viem"; +import { Ballot } from "@delvtech/council-js"; import { command } from "clide-js"; import signale from "signale"; -import { createPublicClient, createWalletClient, http } from "viem"; -import { - getWriteOptions, - writeOptions, -} from "../../reusable-options/writeOptions.js"; +import { getWriteOptions, writeOptions } from "../../options/writeOptions.js"; import { DAY_IN_BLOCKS } from "../../utils/constants.js"; export default command({ description: "Create a proposal", options: { - address: { + a: { + alias: ["address"], description: "The voting contract address", type: "string", + customType: "hex", required: true, }, - vaults: { - description: - "The addresses of the approved voting vaults to draw voting power from. This will be used to verify that the signer has enough voting power to create a proposal.", + t: { + alias: ["targets"], + description: "A list of addresses to call.", type: "array", + customType: "hexArray", string: true, required: true, }, - vaultdatas: { - alias: ["vault-data", "extra-vault-data"], - description: "The extra data for each vault", + d: { + alias: ["data", "calldatas"], + description: "Encoded call data for each target.", type: "array", + customType: "hexArray", string: true, + required: true, }, - targets: { - description: "A list of addresses to call.", + v: { + alias: ["vaults"], + description: + "The addresses of the approved voting vaults to draw voting power from. This will be used to verify that the signer has enough voting power to create a proposal.", type: "array", + customType: "hexArray", string: true, required: true, }, - calldatas: { - alias: ["data", "call-data"], - description: "Encoded call data for each target.", + D: { + alias: ["vault-data", "extra-vault-data"], + description: "The extra data for each vault.", type: "array", + customType: "hexArray", string: true, - required: true, }, - "last-call": { + l: { + alias: ["last-call"], description: "The block after which the proposal can no longer be executed.", type: "number", required: true, }, - ballot: { - description: - "The initial vote from the signer's account (yes, no, maybe).", + b: { + alias: ["ballot"], + description: "The initial vote from the signer's account.", type: "string", default: "yes", + choices: ["yes", "no", "maybe"], }, ...writeOptions, }, - handler: async ({ options, context, next }) => { - const { account, chain, rpcUrl } = await getWriteOptions(options, context); + handler: async ({ options, client, next }) => { + const { council, publicClient } = await getWriteOptions(options, client); const address = await options.address({ prompt: "Enter voting contract address", }); - const vaults = await options.vaults({ + const votingVaults = await options.vaults({ prompt: "Enter voting vault addresses", }); - const vaultdatas = await options.vaultdatas(); + const extraVaultData = await options.extraVaultData(); const targets = await options.targets({ prompt: "Enter target addresses", @@ -80,63 +86,41 @@ export default command({ }); const ballot = await options.ballot({ - prompt: { - message: "Select initial ballot", - type: "select", - choices: [ - { - title: "Yes", - value: "yes", - }, - { - title: "No", - value: "no", - }, - { - title: "Abstain", - value: "maybe", - }, - ], - }, - validate: (value) => { - if (value === "yes" || value === "no" || value === "maybe") { - return true; - } - return false; - }, + prompt: "Select initial ballot", }); - const transport = http(rpcUrl); - const publicClient = createPublicClient({ transport, chain }); - const walletClient = createWalletClient({ transport, chain, account }); - const currentBlock = await publicClient.getBlockNumber(); + const lastCallValue: number | undefined = options.values.lastCall; + const initialCallBlock = + lastCallValue === undefined + ? await publicClient.getBlockNumber() + : BigInt(lastCallValue); const lastCall = await options.lastCall({ prompt: { message: "Enter the last call block", - initial: String(currentBlock + DAY_IN_BLOCKS * 14n), - validate: (value) => { - return !isNaN(Number(value)); - }, + initial: String(Number(initialCallBlock) + DAY_IN_BLOCKS * 14), }, + validate: (value) => !isNaN(Number(value)), }); - const council = new ReadWriteCouncil({ publicClient, walletClient }); - const coreVoting = council.coreVoting({ - address: address as `0x${string}`, - }); - - const hash = await coreVoting.createProposal({ - ballot: ballot as Ballot, - calldatas: calldatas as `0x${string}`[], - lastCall: BigInt(lastCall), - targets: targets as `0x${string}`[], - vaults: vaults as `0x${string}`[], - extraVaultData: - (vaultdatas as `0x${string}`[] | undefined) || vaults.map(() => "0x"), + const hash = await council.coreVoting(address).createProposal({ + args: { + targets, + calldatas, + votingVaults, + extraVaultData, + ballot: ballot as Ballot, + lastCallBlock: BigInt(lastCall), + }, + options: { + onMined: () => { + signale.success(`Transaction success: ${hash}`); + }, + }, }); - signale.success(hash); + signale.pending(`Transaction submitted: ${hash}`); + await publicClient.waitForTransactionReceipt({ hash }); next(hash); }, }); diff --git a/packages/council-cli/src/commands/proposal/execute.ts b/packages/council-cli/src/commands/proposal/execute.ts index c1b7b51f..b295adf3 100644 --- a/packages/council-cli/src/commands/proposal/execute.ts +++ b/packages/council-cli/src/commands/proposal/execute.ts @@ -1,23 +1,20 @@ -import { ReadWriteCouncil } from "@delvtech/council-viem"; import { command } from "clide-js"; import signale from "signale"; -import { createPublicClient, createWalletClient, http } from "viem"; -import { - getWriteOptions, - writeOptions, -} from "../../reusable-options/writeOptions.js"; +import { getWriteOptions, writeOptions } from "../../options/writeOptions.js"; export default command({ description: "Execute a proposal", options: { - address: { + a: { + alias: ["address"], description: "The voting contract address", type: "string", + customType: "hex", required: true, }, - id: { - alias: ["proposal"], + p: { + alias: ["proposal", "id"], description: "The id of the proposal to execute", type: "number", required: true, @@ -25,8 +22,8 @@ export default command({ ...writeOptions, }, - handler: async ({ options, context, end, next }) => { - const { account, chain, rpcUrl } = await getWriteOptions(options, context); + handler: async ({ options, client, next }) => { + const { council, publicClient } = await getWriteOptions(options, client); const address = await options.address({ prompt: "Enter voting contract address", @@ -36,24 +33,19 @@ export default command({ prompt: "Enter proposal id", }); - const transport = http(rpcUrl); - const publicClient = createPublicClient({ transport, chain }); - const walletClient = createWalletClient({ transport, chain, account }); - - const council = new ReadWriteCouncil({ publicClient, walletClient }); - const coreVoting = council.coreVoting({ - address: address as `0x${string}`, + const hash = await council.coreVoting(address).executeProposal({ + args: { + proposalId: BigInt(id), + }, + options: { + onMined: () => { + signale.success(`Transaction success: ${hash}`); + }, + }, }); - const proposal = await coreVoting.getProposal({ id: BigInt(id) }); - - if (!proposal) { - signale.error(`Proposal ${id} not found`); - return end(); - } - - const hash = await proposal.execute(); - signale.success(hash); + signale.pending(`Transaction submitted: ${hash}`); + await publicClient.waitForTransactionReceipt({ hash }); next(hash); }, }); diff --git a/packages/council-cli/src/commands/proposal/vote.ts b/packages/council-cli/src/commands/proposal/vote.ts index 969ac663..c957a6c4 100644 --- a/packages/council-cli/src/commands/proposal/vote.ts +++ b/packages/council-cli/src/commands/proposal/vote.ts @@ -1,41 +1,42 @@ -import { Ballot, ReadWriteCouncil } from "@delvtech/council-viem"; +import { Ballot } from "@delvtech/council-js"; +import { Address, Bytes } from "@delvtech/drift"; import { command } from "clide-js"; import signale from "signale"; -import { createPublicClient, createWalletClient, http } from "viem"; -import { - getWriteOptions, - writeOptions, -} from "../../reusable-options/writeOptions.js"; +import { getWriteOptions, writeOptions } from "../../options/writeOptions.js"; export default command({ description: "Vote on a proposal", options: { - address: { + a: { + alias: ["address"], description: "The voting contract address", type: "string", + customType: "hex", required: true, }, - id: { - alias: ["proposal-id"], - description: "The proposal id", + p: { + alias: ["proposal", "id"], + description: "The id of the proposal", type: "number", required: true, }, - ballot: { - description: - "The initial vote from the signer's account (yes, no, maybe).", + b: { + alias: ["ballot"], + description: "The ballot to cast.", type: "string", default: "yes", + choices: ["yes", "no", "maybe"], }, - vaults: { + v: { + alias: ["vaults"], description: "The addresses of the approved voting vaults to draw voting power from.", type: "array", string: true, required: true, }, - vaultdatas: { + d: { alias: ["vault-data", "extra-vault-data"], description: "The extra data for each vault", type: "array", @@ -44,67 +45,43 @@ export default command({ ...writeOptions, }, - handler: async ({ options, context, next }) => { - const { account, chain, rpcUrl } = await getWriteOptions(options, context); + handler: async ({ options, client, next }) => { + const { drift, council } = await getWriteOptions(options, client); const address = await options.address({ prompt: "Enter voting contract address", }); - const id = await options.id({ + const proposalId = await options.id({ prompt: "Enter proposal id", }); const ballot = await options.ballot({ - prompt: { - message: "Select initial ballot", - type: "select", - choices: [ - { - title: "Yes", - value: "yes", - }, - { - title: "No", - value: "no", - }, - { - title: "Abstain", - value: "maybe", - }, - ], - }, - validate: (value) => { - if (value === "yes" || value === "no" || value === "maybe") { - return true; - } - return false; - }, + prompt: "Select a ballot to cast", }); const vaults = await options.vaults({ prompt: "Enter voting vault addresses", }); - const vaultdatas = await options.vaultdatas(); - - const transport = http(rpcUrl); - const publicClient = createPublicClient({ transport, chain }); - const walletClient = createWalletClient({ transport, chain, account }); + const extraData = await options.extraVaultData(); - const council = new ReadWriteCouncil({ publicClient, walletClient }); - const coreVoting = council.coreVoting({ - address: address as `0x${string}`, - }); - - const propsal = await coreVoting.getProposal({ id: BigInt(id) }); - const hash = await propsal?.vote({ - ballot: ballot as Ballot, - vaults: vaults as `0x${string}`[], - extraVaultData: vaultdatas as `0x${string}`[] | undefined, + const hash = await council.coreVoting(address).vote({ + args: { + ballot: ballot as Ballot, + proposalId: BigInt(proposalId), + vaults: vaults as Address[], + extraVaultData: extraData as Bytes[] | undefined, + }, + options: { + onMined: () => { + signale.success(`Transaction success: ${hash}`); + }, + }, }); - signale.success(hash); + signale.pending(`Transaction submitted: ${hash}`); + await drift.waitForTransaction({ hash }); next(hash); }, }); diff --git a/packages/council-cli/src/commands/server.ts b/packages/council-cli/src/commands/server.ts index c2a82ccb..1d8a94fc 100644 --- a/packages/council-cli/src/commands/server.ts +++ b/packages/council-cli/src/commands/server.ts @@ -1,7 +1,13 @@ import { command } from "clide-js"; import { execSync } from "node:child_process"; import signale from "signale"; -import { parseUnits } from "viem"; +import { parseEther } from "viem"; +import { config } from "../config.js"; +import { ConfiguredChain, configuredChains } from "../lib/viem.js"; + +const DEFAULT_RPC_URL = new URL( + config.get("rpcUrl") || configuredChains.hardhat.rpcUrls.default.http[0], +); // This command is only available if the optional hardhat peer dependency is // installed so we import it dynamically to avoid crashing if it's not @@ -13,33 +19,58 @@ const hardhat = await import("hardhat").catch((e) => { }); export default command({ - description: "Start a local ethereum node", + description: "Start a local ethereum node with hardhat.", isMiddleware: false, options: { - host: { - description: "The host to listen on", + H: { + alias: ["hostname"], + description: "The hostname to use.", + type: "string", + default: DEFAULT_RPC_URL.hostname, + }, + f: { + alias: ["fork"], + description: + "Whether to fork a network. If this is true and no fork-url is provided, the default from config will be used.", + type: "boolean", + }, + F: { + alias: ["fork-url"], + description: + "A URL to fork from. Note: this is only used if `fork` is true.", type: "string", - default: "127.0.0.1", + default: config.get("forkUrl"), }, - port: { - description: "The port to listen on", + b: { + alias: ["block"], + description: + "The fork block number to start at. Note: this is only used if `fork` is true.", type: "number", - default: 8545, }, - balance: { - description: "The ETH balance to assign to each account", + p: { + alias: ["port"], + description: "The port to listen on.", type: "number", - default: 1_000, + default: +DEFAULT_RPC_URL.port, }, - "block-time": { - description: "The blockTime in seconds for automatic mining", + B: { + alias: ["balance"], + description: + "The ETH balance to assign to each account as a decimal string.", + type: "string", + default: "1000", + }, + t: { + alias: ["block-time"], + description: "The blockTime in seconds for automatic mining.", type: "number", }, - "chain-id": { - description: "The id to use for the local blockchain", + c: { + alias: ["chain-id"], + description: + "The id to use for the local blockchain. Defaults to the id of either `chain` or `forkChain` depending on the value of `fork`.", type: "number", - default: 1337, }, }, @@ -72,33 +103,67 @@ export default command({ const hre = hardhat.default; - const host = await options.host(); - const port = await options.port(); const balance = await options.balance(); const blockTime = await options.blockTime(); - const chainId = await options.chainId(); + const block = await options.block(); + const hostname = await options.hostname(); + const port = await options.port(); - hre.config.networks.hardhat = { - ...hre.config.networks.hardhat, - chainId, + const fork = await options.fork(); + const forkUrl = await options.forkUrl( + !fork + ? undefined // Don't prompt if not forking + : { + prompt: "Enter the URL to fork from", + validate: (url) => { + try { + new URL(url as string); + return true; + } catch { + return "Invalid URL"; + } + }, + }, + ); + + let chainId = await options.chainId(); + if (chainId === undefined) { + const chainName = config.get(fork ? "forkChain" : "chain")?.toLowerCase(); + chainId = + chainName && chainName in configuredChains + ? configuredChains[chainName as ConfiguredChain].id + : configuredChains.hardhat.id; + } + const networks = hre.config.networks; + networks.hardhat = { + ...networks.hardhat, allowUnlimitedContractSize: true, accounts: { - ...hre.config.networks.hardhat.accounts, - accountsBalance: String(parseUnits(String(balance), 18)), + ...networks.hardhat.accounts, + accountsBalance: String(parseEther(balance)), }, + chainId, + forking: + fork && forkUrl + ? { + url: forkUrl, + enabled: true, + blockNumber: block, + } + : undefined, mining: blockTime !== undefined ? { - ...hre.config.networks.hardhat.mining, + ...networks.hardhat.mining, auto: false, interval: blockTime * 1_000, } - : hre.config.networks.hardhat.mining, + : networks.hardhat.mining, }; hre.run("node", { - hostname: host, + hostname, port, }); diff --git a/packages/council-cli/src/commands/server/block-number.ts b/packages/council-cli/src/commands/server/block-number.ts index 6e237f88..85445785 100644 --- a/packages/council-cli/src/commands/server/block-number.ts +++ b/packages/council-cli/src/commands/server/block-number.ts @@ -1,7 +1,7 @@ +import { createDrift } from "@delvtech/drift"; import { command } from "clide-js"; import signale from "signale"; -import { createClient, http } from "viem"; -import { rpcUrlOption } from "../../reusable-options/rpc-url.js"; +import { rpcUrlOption } from "../../options/rpc-url.js"; export default command({ description: "Get the block number of the local blockchain", @@ -15,14 +15,7 @@ export default command({ prompt: "Enter RPC URL", }); - const client = createClient({ - transport: http(rpcUrl), - }); - - const blockNumberHex = await client.request({ - method: "eth_blockNumber", - }); - const blockNumber = BigInt(blockNumberHex); + const blockNumber = await createDrift({ rpcUrl }).getBlockNumber(); signale.info(`Current block number: ${blockNumber}`); next(blockNumber); diff --git a/packages/council-cli/src/commands/server/mine.ts b/packages/council-cli/src/commands/server/mine.ts index 2cb9abe1..f3777d6f 100644 --- a/packages/council-cli/src/commands/server/mine.ts +++ b/packages/council-cli/src/commands/server/mine.ts @@ -1,7 +1,8 @@ import { command } from "clide-js"; import signale from "signale"; -import { Client, createClient, http } from "viem"; -import { rpcUrlOption } from "../../reusable-options/rpc-url.js"; +import { createClient, http } from "viem"; +import { mine } from "../../lib/viem.js"; +import { rpcUrlOption } from "../../options/rpc-url.js"; export default command({ description: "Mine blocks on the local blockchain", @@ -34,21 +35,3 @@ export default command({ next(); }, }); - -interface MineOptions { - blocks: number; - client: Client; -} - -/** - * Mine a given number of blocks on the local testnet - * @param blocks The number of blocks to mine - * @returns The new current block number - */ -export async function mine({ blocks, client }: MineOptions): Promise { - await client.request({ - // @ts-expect-error - This is a hardhat method - method: "hardhat_mine", - params: [`0x${blocks.toString(16)}`], - }); -} diff --git a/packages/council-cli/src/commands/vault.ts b/packages/council-cli/src/commands/vault.ts index a50f7b75..c0f50696 100644 --- a/packages/council-cli/src/commands/vault.ts +++ b/packages/council-cli/src/commands/vault.ts @@ -1,6 +1,5 @@ -import { command, passThroughCommand } from "clide-js"; +import { command } from "clide-js"; export default command({ - ...passThroughCommand, description: "Interact with a VotingVault contract", }); diff --git a/packages/council-cli/src/commands/vault/get-voting-power.ts b/packages/council-cli/src/commands/vault/get-voting-power.ts index 5517ebde..ec583a08 100644 --- a/packages/council-cli/src/commands/vault/get-voting-power.ts +++ b/packages/council-cli/src/commands/vault/get-voting-power.ts @@ -1,33 +1,31 @@ -import { ReadCouncil } from "@delvtech/council-viem"; +import { createCouncil } from "@delvtech/council-js"; import { command } from "clide-js"; import signale from "signale"; -import { createPublicClient, http } from "viem"; -import { chainOption, getChain } from "../../reusable-options/chain.js"; -import { rpcUrlOption } from "../../reusable-options/rpc-url.js"; +import { rpcUrlOption } from "../../options/rpc-url.js"; export default command({ description: "Get the voting power of a given account.", options: { - address: { - description: "The vault contract address", + a: { + alias: ["address"], + description: "The vault contract address.", type: "string", + customType: "hex", required: true, }, - account: { - alias: ["voter"], - description: "The account to get the voting power of", + v: { + alias: ["voter", "account"], + description: "The account to get the voting power of.", type: "string", + customType: "hex", required: true, }, - chain: chainOption, - rpc: rpcUrlOption, + r: rpcUrlOption, }, - handler: async ({ options, context, next }) => { - const chain = await getChain(options.chain, context); - - const rpcUrl = await options.rpc({ + handler: async ({ options, next }) => { + const rpcUrl = await options.rpcUrl({ prompt: "Enter RPC URL", }); @@ -35,19 +33,13 @@ export default command({ prompt: "Enter vault contract address", }); - const account = await options.account({ + const voter = await options.voter({ prompt: "Enter account to get voting power of", }); - const transport = http(rpcUrl); - const publicClient = createPublicClient({ transport, chain }); - - const council = new ReadCouncil({ publicClient }); - const votingVault = council.votingVault(address as `0x${string}`); - - const votingPower = await votingVault.getVotingPower({ - account: account as `0x${string}`, - }); + const votingPower = await createCouncil({ rpcUrl }) + .votingVault(address) + .getVotingPower({ voter }); signale.success(votingPower); next(votingPower); diff --git a/packages/council-cli/src/commands/vesting-vault.ts b/packages/council-cli/src/commands/vesting-vault.ts index 9193fcbe..64638d38 100644 --- a/packages/council-cli/src/commands/vesting-vault.ts +++ b/packages/council-cli/src/commands/vesting-vault.ts @@ -1,6 +1,5 @@ -import { command, passThroughCommand } from "clide-js"; +import { command } from "clide-js"; export default command({ - ...passThroughCommand, description: "Interact with a VestingVault contract", }); diff --git a/packages/council-cli/src/commands/vesting-vault/get-delegate.ts b/packages/council-cli/src/commands/vesting-vault/get-delegate.ts index ae68302a..c9010569 100644 --- a/packages/council-cli/src/commands/vesting-vault/get-delegate.ts +++ b/packages/council-cli/src/commands/vesting-vault/get-delegate.ts @@ -1,33 +1,31 @@ -import { ReadCouncil } from "@delvtech/council-viem"; +import { createCouncil } from "@delvtech/council-js"; import { command } from "clide-js"; import signale from "signale"; -import { createPublicClient, http } from "viem"; -import { chainOption, getChain } from "../../reusable-options/chain.js"; -import { rpcUrlOption } from "../../reusable-options/rpc-url.js"; +import { rpcUrlOption } from "../../options/rpc-url.js"; export default command({ description: "Get the delegate of a given account.", options: { - address: { - description: "The LockingVault contract address", + a: { + alias: ["address"], + description: "The LockingVault contract address.", type: "string", + customType: "hex", required: true, }, - account: { - alias: ["voter"], - description: "The account to get the delegate of", + v: { + alias: ["account", "voter"], + description: "The account to get the delegate of.", type: "string", + customType: "hex", required: true, }, - chain: chainOption, rpc: rpcUrlOption, }, - handler: async ({ options, context, next }) => { - const chain = await getChain(options.chain, context); - - const rpcUrl = await options.rpc({ + handler: async ({ options, next }) => { + const rpcUrl = await options.rpcUrl({ prompt: "Enter RPC URL", }); @@ -35,21 +33,15 @@ export default command({ prompt: "Enter LockingVault contract address", }); - const account = await options.account({ + const account = await options.voter({ prompt: "Enter account to get delegate of", }); - const transport = http(rpcUrl); - const publicClient = createPublicClient({ transport, chain }); - - const council = new ReadCouncil({ publicClient }); - const lockingVault = council.lockingVault(address as `0x${string}`); - - const delegate = await lockingVault.getDelegate({ - account: account as `0x${string}`, - }); + const delegate = await createCouncil({ rpcUrl }) + .vestingVault(address) + .getDelegate(account); - signale.info(delegate.address); + signale.info(delegate); next(delegate); }, }); diff --git a/packages/council-cli/src/commands/vesting-vault/get-token.ts b/packages/council-cli/src/commands/vesting-vault/get-token.ts index 8798c468..eb3c17d8 100644 --- a/packages/council-cli/src/commands/vesting-vault/get-token.ts +++ b/packages/council-cli/src/commands/vesting-vault/get-token.ts @@ -1,27 +1,24 @@ -import { ReadCouncil } from "@delvtech/council-viem"; +import { createCouncil } from "@delvtech/council-js"; import { command } from "clide-js"; import signale from "signale"; -import { createPublicClient, http } from "viem"; -import { chainOption, getChain } from "../../reusable-options/chain.js"; -import { rpcUrlOption } from "../../reusable-options/rpc-url.js"; +import { rpcUrlOption } from "../../options/rpc-url.js"; export default command({ description: "Get the token contract address of a given locking vault.", options: { - address: { + a: { + alias: ["address"], description: "The LockingVault contract address", type: "string", + customType: "hex", required: true, }, - chain: chainOption, rpc: rpcUrlOption, }, - handler: async ({ options, context, next }) => { - const chain = await getChain(options.chain, context); - - const rpcUrl = await options.rpc({ + handler: async ({ options, next }) => { + const rpcUrl = await options.rpcUrl({ prompt: "Enter RPC URL", }); @@ -29,13 +26,9 @@ export default command({ prompt: "Enter LockingVault contract address", }); - const transport = http(rpcUrl); - const publicClient = createPublicClient({ transport, chain }); - - const council = new ReadCouncil({ publicClient }); - const lockingVault = council.lockingVault(address as `0x${string}`); - - const token = await lockingVault.getToken(); + const token = await createCouncil({ rpcUrl }) + .vestingVault(address) + .getToken(); signale.info(token.address); next(token); diff --git a/packages/council-cli/src/config.ts b/packages/council-cli/src/config.ts index d97a5e1a..898878c4 100644 --- a/packages/council-cli/src/config.ts +++ b/packages/council-cli/src/config.ts @@ -1,23 +1,92 @@ -import { JsonStore } from "./utils/config/JsonStore.js"; -import { getOSConfigDir } from "./utils/config/getOSConfigDir.js"; +import { z } from "zod"; +import { ConfiguredChain } from "./lib/viem.js"; +import { Address, DecimalString, Empty } from "./lib/zod.js"; +import { DAY_IN_BLOCKS, DAY_IN_SECONDS } from "./utils/constants.js"; +import { getAppRootDir } from "./utils/getAppRootDir.js"; +import { JsonStore } from "./utils/JsonStore.js"; -const configSettingNames = ["rpc-url"] as const; +// Store // -export type CouncilCliConfig = Partial< - Record<(typeof configSettingNames)[number], string> ->; +export const config = new JsonStore({ + path: getAppRootDir(), + name: "council-cli", + schema: z + .object({ + // Network + chain: z.string(), + rpcUrl: z.string(), + forkChain: z.string(), + forkUrl: z.string(), -// TODO: Test if this will work in environments like an AWS Lambda and ensure -// graceful fallbacks if not. -export const config = new JsonStore({ - path: getOSConfigDir("council"), - name: "cli", + // Deployments + deploymentsDir: z.string(), + extraVotingBlocks: z.coerce.number(), + gscExtraVotingBlocks: z.coerce.number(), + gscIdleDuration: z.coerce.number(), + gscLockDuration: z.coerce.number(), + gscQuorum: DecimalString.or(Empty), + gscVotingPowerBound: DecimalString.or(Empty), + lockDuration: z.coerce.number(), + minProposalPower: DecimalString.or(Empty), + quorum: DecimalString.or(Empty), + staleBlockLag: z.coerce.number(), + timelockWaitTime: z.coerce.number(), + token: Address.or(Empty), + tokenName: z.string(), + tokenSymbol: z.string(), + treasury: Address.or(Empty), + }) + .partial(), defaults: { - "rpc-url": process.env.RPC_URL, - }, - schema: { - "rpc-url": { - type: "string", - }, + // Network + chain: process.env.CHAIN || "hardhat", + rpcUrl: process.env.RPC_URL || "http://127.0.0.1:8545", + forkChain: process.env.FORK_CHAIN as ConfiguredChain | undefined, + forkUrl: process.env.FORK_URL, + + // Deployments + deploymentsDir: process.env.DEPLOYMENTS_DIR || "./deployments", + extraVotingBlocks: process.env.EXTRA_VOTING_BLOCKS + ? +process.env.EXTRA_VOTING_BLOCKS + : undefined, + gscExtraVotingBlocks: process.env.GSC_EXTRA_VOTING_BLOCKS + ? +process.env.GSC_EXTRA_VOTING_BLOCKS + : undefined, + gscIdleDuration: process.env.GSC_IDLE_DURATION + ? +process.env.GSC_IDLE_DURATION + : undefined, + gscLockDuration: process.env.GSC_LOCK_DURATION + ? +process.env.GSC_LOCK_DURATION + : undefined, + gscQuorum: (process.env.GSC_QUORUM as DecimalString | undefined) || "3.0", + gscVotingPowerBound: + (process.env.GSC_VOTING_POWER_BOUND as DecimalString | undefined) || + "100000.0", + lockDuration: process.env.LOCK_DURATION + ? +process.env.LOCK_DURATION + : undefined, + minProposalPower: + (process.env.MIN_PROPOSAL_POWER as DecimalString | undefined) || + "25000.0", + quorum: + (process.env.BASE_QUORUM as DecimalString | undefined) || "1000000.0", + staleBlockLag: process.env.STALE_BLOCK_LAG + ? +process.env.STALE_BLOCK_LAG + : DAY_IN_BLOCKS * 28, + timelockWaitTime: process.env.TIMELOCK_WAIT_TIME + ? +process.env.TIMELOCK_WAIT_TIME + : DAY_IN_SECONDS * 3, + token: process.env.VOTING_TOKEN_ADDRESS as Address | undefined, + tokenName: process.env.VOTING_TOKEN_NAME || "Mock Voting Token", + tokenSymbol: process.env.VOTING_TOKEN_SYMBOL || "MVT", + treasury: process.env.TREASURY_ADDRESS as Address | undefined, }, }); +export type Config = z.infer; + +const Setting = config.schema.keyof(); +export type Setting = z.infer; +export const settings = Object.values(Setting.Values); +export const optionalSettings = Object.keys(config.schema.shape).filter((key) => + config.schema.shape[key as Setting].isOptional(), +); diff --git a/packages/council-cli/src/council.ts b/packages/council-cli/src/council.ts index d00ea5af..dc8924af 100644 --- a/packages/council-cli/src/council.ts +++ b/packages/council-cli/src/council.ts @@ -2,14 +2,11 @@ import { help, run } from "clide-js"; import { commandMenu } from "clide-plugin-command-menu"; import "dotenv/config"; -import signale from "signale"; -run({ +await run({ plugins: [ // Help generator with --help and -h options - help({ - maxWidth: 100, - }), + help({ maxWidth: 100 }), // Interactive prompts for incomplete commands commandMenu({ @@ -29,13 +26,17 @@ run({ }, }, - afterParse: async ({ parsedOptions, context }) => { + afterParse: async ({ parsedOptions, context, setParsedOptions }) => { if (parsedOptions.yes) { + const newOptions = { ...parsedOptions }; for (const [key, config] of Object.entries(context.options)) { - (parsedOptions[key] as any) = parsedOptions[key] ?? config.default; + // Set defaults if --yes is passed + (newOptions[key] as any) ??= config.default; } + setParsedOptions(newOptions); } }, }).catch((error) => { - signale.error(error); + console.error(error); + process.exit(1); }); diff --git a/packages/council-cli/src/deploy/Deployer.ts b/packages/council-cli/src/deploy/Deployer.ts new file mode 100644 index 00000000..45a6ec51 --- /dev/null +++ b/packages/council-cli/src/deploy/Deployer.ts @@ -0,0 +1,129 @@ +import { ConstructorArgs, prepareParamsArray } from "@delvtech/drift"; +import signale from "signale"; +import { + Abi, + Account, + Chain, + Hex, + PublicClient, + Transport, + WalletClient, +} from "viem"; +import { config } from "../config.js"; +import { stringifyBigInts } from "../utils/stringifyBigInts.js"; +import { DeployedContractInfo, getDeploymentJson } from "./DeploymentJson.js"; + +export const DEFAULT_DEPLOYMENTS_DIR = + config.get("deploymentsDir") || "./deployments"; + +export interface DeployerOptions { + publicClient: PublicClient; + walletClient: WalletClient; +} + +export class Deployer { + #publicClient: PublicClient; + #walletClient: WalletClient; + #deployedContracts: DeployedContractInfo[] = []; + #savedPaths: Set = new Set(); + + constructor({ publicClient, walletClient }: DeployerOptions) { + this.#publicClient = publicClient; + this.#walletClient = walletClient; + } + + get deployedContracts(): DeployedContractInfo[] { + return this.#deployedContracts; + } + + get savedPaths(): Set { + return this.#savedPaths; + } + + async deploy({ + name, + abi, + args, + bytecode, + onSubmitted, + }: { + name: string; + abi: TAbi; + args: ConstructorArgs; + bytecode: Hex; + onSubmitted?: (txHash: string) => void; + }): Promise { + signale.pending(`Deploying ${name}...`); + + const { params } = prepareParamsArray({ + abi, + kind: "inputs", + type: "constructor", + name: undefined as any, + value: args, + }); + + const hash = await this.#walletClient.deployContract({ + abi, + args: params, + bytecode, + account: this.#walletClient.account, + } as any); + onSubmitted?.(hash); + + signale.pending(`${name} deployment tx submitted: ${hash}`); + + const { contractAddress } = + await this.#publicClient.waitForTransactionReceipt({ + hash, + }); + + if (!contractAddress) { + throw new Error( + `No contract address found in receipt for ${name} deployment tx: ${hash}`, + ); + } + + signale.success(`${name} deployed @ ${contractAddress}`); + + const info: DeployedContractInfo = { + name, + address: contractAddress, + deployTransaction: hash, + deployArgs: stringifyBigInts(params), + bytecode, + }; + + this.#deployedContracts.push(info); + return info; + } + + /** + * Save information about the deployed contracts to a json file. + * @returns The path to the saved deployment information. + */ + save({ + name, + outDir = DEFAULT_DEPLOYMENTS_DIR, + }: { + /** The name of the deployment. */ + name: string; + /** The directory to save the deployment information to. */ + outDir?: string; + }): string { + const chainId = this.#walletClient.chain.id; + const json = getDeploymentJson({ name, chainId, outDir }); + + signale.pending(`Saving deployment info to: ${json.path}`); + + json.set({ + deployer: this.#walletClient.account.address, + contracts: this.#deployedContracts, + }); + + signale.success(`Deployment info saved to: ${json.path}`); + + this.#savedPaths.add(json.path); + return json.path; + } +} diff --git a/packages/council-cli/src/deploy/DeploymentJson.ts b/packages/council-cli/src/deploy/DeploymentJson.ts new file mode 100644 index 00000000..5c4b2a2a --- /dev/null +++ b/packages/council-cli/src/deploy/DeploymentJson.ts @@ -0,0 +1,42 @@ +import { z } from "zod"; +import { Address, HexString } from "../lib/zod.js"; +import { JsonStore } from "../utils/JsonStore.js"; + +const DeployedContractInfo = z.object({ + name: z.string(), + address: Address, + deployTransaction: HexString, + deployArgs: z.array(z.unknown()), + bytecode: HexString, +}); +export type DeployedContractInfo = z.infer; + +const DeploymentInfo = z.object({ + name: z.string(), + chainId: z.number(), + deployer: Address, + contracts: DeployedContractInfo.array(), +}); +export type DeploymentInfo = z.infer; + +export function getDeploymentJson({ + name, + chainId, + outDir, +}: { + name: string; + chainId: number; + outDir: string; +}) { + return new JsonStore({ + path: outDir, + name: `${chainId}-${name}`, + schema: DeploymentInfo, + defaults: { + name, + chainId, + deployer: "0x", + contracts: [], + }, + }); +} diff --git a/packages/council-cli/src/deploymentStore.ts b/packages/council-cli/src/deploymentStore.ts deleted file mode 100644 index 8b81475d..00000000 --- a/packages/council-cli/src/deploymentStore.ts +++ /dev/null @@ -1,68 +0,0 @@ -import { JsonStore } from "./utils/config/JsonStore.js"; - -export const DEFAULT_DEPLOYMENTS_DIR = "./deployments"; - -export interface ContractInfo { - address: string; - name: string; - deploymentTransactionHash?: string; - deploymentArgs?: any[]; -} - -export interface DeploymentInfo { - name: string; - chainId: number; - timestamp?: number; - deployer?: string; - contracts: ContractInfo[]; -} - -export function getDeploymentStore( - name: string, - chainId: number, - deploymentsDir = DEFAULT_DEPLOYMENTS_DIR, -): JsonStore { - return new JsonStore({ - path: deploymentsDir, - name: `${name}-${chainId}`, - defaults: { - name, - chainId, - contracts: [], - }, - schema: { - name: { - type: "string", - }, - chainId: { - type: "number", - }, - timestamp: { - type: "number", - }, - deployer: { - type: "string", - }, - contracts: { - type: "array", - items: { - type: "object", - properties: { - name: { - type: "string", - }, - address: { - type: "string", - }, - deploymentTransactionHash: { - type: "string", - }, - deploymentArgs: { - type: "array", - }, - }, - }, - }, - }, - }); -} diff --git a/packages/council-cli/src/lib/viem.ts b/packages/council-cli/src/lib/viem.ts index fbe5f072..09d210c9 100644 --- a/packages/council-cli/src/lib/viem.ts +++ b/packages/council-cli/src/lib/viem.ts @@ -1,24 +1,34 @@ +import { Client, Hex } from "viem"; import { + anvil, arbitrum, + base, + gnosis, goerli, - localhost, + hardhat, + linea, mainnet, optimism, polygon, sepolia, } from "viem/chains"; -export const supportedChains = { - [formatChainName(localhost.name)]: localhost, - [formatChainName(mainnet.name)]: mainnet, +export const configuredChains = { + [formatChainName(anvil.name)]: anvil, + [formatChainName(arbitrum.name)]: arbitrum, + [formatChainName(base.name)]: base, + [formatChainName(gnosis.name)]: gnosis, [formatChainName(goerli.name)]: goerli, - [formatChainName(sepolia.name)]: sepolia, + [formatChainName(hardhat.name)]: hardhat, + [formatChainName(linea.name)]: linea, + [formatChainName(mainnet.name)]: mainnet, [formatChainName(optimism.name)]: optimism, - [formatChainName(arbitrum.name)]: arbitrum, [formatChainName(polygon.name)]: polygon, + [formatChainName(sepolia.name)]: sepolia, }; -export type SupportedChain = keyof typeof supportedChains; +type ConfiguredChains = typeof configuredChains; +export type ConfiguredChain = keyof ConfiguredChains; export function formatChainName(name: K): HyphenCase { return name.replace(" ", "-").toLowerCase() as HyphenCase; @@ -29,3 +39,41 @@ export type HyphenCase = T extends `${infer A}${infer B}` ? `${Lowercase}-${HyphenCase>}` : `${Lowercase}${HyphenCase}` : T; + +export const localChainIds: number[] = [hardhat.id, anvil.id]; + +/** + * Mine a given number of blocks on the local testnet + * @param blocks The number of blocks to mine + * @returns The new current block number + */ +export async function mine({ + blocks, + client, +}: { + blocks: number; + client: Client; +}): Promise { + const methodsToTry: any[] = ["hardhat_mine", "anvil_mine"]; + const params: [Hex] = [`0x${blocks.toString(16)}`]; + let success = false; + let error: unknown; + + while (!success && methodsToTry.length) { + await client + .request({ + method: methodsToTry.shift()!, + params, + }) + .then(() => { + success = true; + }) + .catch((e) => { + error ||= e; + }); + } + + if (!success) { + throw error; + } +} diff --git a/packages/council-cli/src/lib/zod.ts b/packages/council-cli/src/lib/zod.ts new file mode 100644 index 00000000..10370605 --- /dev/null +++ b/packages/council-cli/src/lib/zod.ts @@ -0,0 +1,30 @@ +import { z } from "zod"; + +export const HexString = z + .string() + .refine( + (s): s is `0x${string}` => /^0x[a-fA-F0-9]*$/.test(s), + "Invalid hex string", + ); + +export const Address = z + .string() + .refine( + (s): s is `0x${string}` => /^0x[a-fA-F0-9]{40}$/.test(s), + "Invalid address", + ); +export type Address = z.infer; + +export const DecimalString = z + .string() + .refine((s): s is `${number}` => !isNaN(+s), "Invalid decimal string"); +export type DecimalString = z.infer; + +/** + * An empty string coerced to `undefined` or `undefined` itself. Useful for + * representing empty environment variables. + */ +export const Empty = z + .literal("") + .optional() + .transform(() => undefined); diff --git a/packages/council-cli/src/reusable-options/call-hash.ts b/packages/council-cli/src/options/call-hash.ts similarity index 76% rename from packages/council-cli/src/reusable-options/call-hash.ts rename to packages/council-cli/src/options/call-hash.ts index d2d4e6b6..3c3a5da2 100644 --- a/packages/council-cli/src/reusable-options/call-hash.ts +++ b/packages/council-cli/src/options/call-hash.ts @@ -1,30 +1,36 @@ -import { OptionGetter, OptionsConfig } from "clide-js"; +import { OptionGetter, options } from "clide-js"; import colors from "colors"; +import { Hash } from "viem"; import { createCallHash } from "../utils/createCallHash.js"; import { isNotEmptyList } from "../utils/validation/isNotEmptyList.js"; -export const callHashOptions = { +export const callHashOptions = options({ "call-hash": { - description: "The hash entry to increase time for", + description: "The hash entry to increase time for.", type: "string", + customType: "hex", }, targets: { description: "A list of addresses to call. This will be used with the `--calldatas` option to create a call hash if one isn't provided via the `--call-hash` option.", type: "array", + customType: "hexArray", }, calldatas: { description: "Encoded call data for each target. This will be used with the `--targets` option to create a call hash if one isn't provided via the `--call-hash` option.", type: "array", + customType: "hexArray", }, -} as const satisfies OptionsConfig; +}); + +type CallHashOptions = typeof callHashOptions; export async function getCallHash( - callHashGetter: OptionGetter, - targetsGetter: OptionGetter, - calldatasGetter: OptionGetter, -): Promise { + callHashGetter: OptionGetter, + targetsGetter: OptionGetter, + calldatasGetter: OptionGetter, +): Promise { let callHash = await callHashGetter(); if (callHash) { return callHash; diff --git a/packages/council-cli/src/options/chain.ts b/packages/council-cli/src/options/chain.ts new file mode 100644 index 00000000..b21d3ab2 --- /dev/null +++ b/packages/council-cli/src/options/chain.ts @@ -0,0 +1,56 @@ +import { Client, option, OptionGetter } from "clide-js"; +import { Chain, defineChain } from "viem"; +import { config } from "../config.js"; +import { ConfiguredChain, configuredChains } from "../lib/viem.js"; + +declare module "clide-js" { + interface OptionCustomTypeMap { + chain: ConfiguredChain | "other" | `other:${number}`; + } +} + +export const chainOption = option({ + alias: ["chain"], + description: "The chain to target.", + type: "string", + customType: "chain", + required: true, + default: config.get("chain"), + choices: [...(Object.keys(configuredChains) as ConfiguredChain[]), "other"], +}); + +export async function getChain( + chainOptionGetter: OptionGetter, + client = new Client(), +): Promise { + const chosenChain = (await chainOptionGetter({ + prompt: "Select chain", + })) as ConfiguredChain | "other" | `other:${number}`; + + if (chosenChain in configuredChains) { + return configuredChains[chosenChain as ConfiguredChain]; + } + + const id = chosenChain.startsWith("other:") + ? parseInt(chosenChain.split(":")[1]) + : await client.prompt({ + message: "Enter chain ID", + type: "number", + validate: (value) => !!value, + }); + + return defineChain({ + id: id || 0, + name: chosenChain, + network: "other", + nativeCurrency: { + decimals: 18, + name: "Native Currency", + symbol: "VALUE", + }, + rpcUrls: { + default: { http: [] }, + public: { http: [] }, + }, + }); +} diff --git a/packages/council-cli/src/options/decimals.ts b/packages/council-cli/src/options/decimals.ts new file mode 100644 index 00000000..b7619f39 --- /dev/null +++ b/packages/council-cli/src/options/decimals.ts @@ -0,0 +1,9 @@ +import { option } from "clide-js"; + +export const decimalsOption = option({ + alias: ["decimals"], + type: "number", + description: "The decimals to parse decimal string options with.", + default: 18, + required: true, +}); diff --git a/packages/council-cli/src/reusable-options/deploy/fresh-deploy.ts b/packages/council-cli/src/options/fresh-deploy.ts similarity index 51% rename from packages/council-cli/src/reusable-options/deploy/fresh-deploy.ts rename to packages/council-cli/src/options/fresh-deploy.ts index aca4e1c3..263b20ab 100644 --- a/packages/council-cli/src/reusable-options/deploy/fresh-deploy.ts +++ b/packages/council-cli/src/options/fresh-deploy.ts @@ -1,8 +1,8 @@ -import { OptionConfig } from "clide-js"; +import { option } from "clide-js"; -export const freshDeployOption = { +export const freshDeployOption = option({ alias: ["fresh-deploy"], description: "Deploy all contracts from scratch.", type: "boolean", default: false, -} as const satisfies OptionConfig; +}); diff --git a/packages/council-cli/src/options/owner.ts b/packages/council-cli/src/options/owner.ts new file mode 100644 index 00000000..642b867d --- /dev/null +++ b/packages/council-cli/src/options/owner.ts @@ -0,0 +1,9 @@ +import { option } from "clide-js"; + +export const ownerOption = option({ + alias: ["owner"], + description: + "The contract owner's address (e.g., a Timelock contract). Defaults to the deployer address.", + type: "string", + customType: "hex", +}); diff --git a/packages/council-cli/src/options/rpc-url.ts b/packages/council-cli/src/options/rpc-url.ts new file mode 100644 index 00000000..8d8b2943 --- /dev/null +++ b/packages/council-cli/src/options/rpc-url.ts @@ -0,0 +1,10 @@ +import { option } from "clide-js"; +import { config } from "../config.js"; + +export const rpcUrlOption = option({ + alias: ["rpc-url"], + description: "An RPC URL to send the transaction request to", + type: "string", + required: true, + default: config.get("rpcUrl"), +}); diff --git a/packages/council-cli/src/options/types.ts b/packages/council-cli/src/options/types.ts new file mode 100644 index 00000000..213a57bb --- /dev/null +++ b/packages/council-cli/src/options/types.ts @@ -0,0 +1,11 @@ +import { HexString } from "@delvtech/drift"; +import { Setting } from "../config.js"; + +declare module "clide-js" { + export interface OptionCustomTypeMap { + hex: HexString; + hexArray: HexString[]; + setting: Setting; + settingsArray: Setting[]; + } +} diff --git a/packages/council-cli/src/reusable-options/wallet-key.ts b/packages/council-cli/src/options/wallet-key.ts similarity index 61% rename from packages/council-cli/src/reusable-options/wallet-key.ts rename to packages/council-cli/src/options/wallet-key.ts index 54bd1938..aec51fbf 100644 --- a/packages/council-cli/src/reusable-options/wallet-key.ts +++ b/packages/council-cli/src/options/wallet-key.ts @@ -1,9 +1,9 @@ -import { OptionConfig } from "clide-js"; +import { option } from "clide-js"; -export const walletKeyOption = { +export const walletKeyOption = option({ alias: ["wallet-key"], description: "A wallet key to sign and pay for the transaction", type: "secret", required: true, default: process.env.WALLET_PRIVATE_KEY, -} as const satisfies OptionConfig; +}); diff --git a/packages/council-cli/src/options/writeOptions.ts b/packages/council-cli/src/options/writeOptions.ts new file mode 100644 index 00000000..17ac0b24 --- /dev/null +++ b/packages/council-cli/src/options/writeOptions.ts @@ -0,0 +1,69 @@ +import { createCouncil, ReadWriteCouncil } from "@delvtech/council-js"; +import { createDrift, Drift, ReadWriteAdapter } from "@delvtech/drift"; +import { viemAdapter } from "@delvtech/drift-viem"; +import { Client, options, OptionsGetter } from "clide-js"; +import { + Account, + Chain, + createPublicClient, + createWalletClient, + http, + PrivateKeyAccount, + PublicClient, + Transport, + WalletClient, +} from "viem"; +import { privateKeyToAccount } from "viem/accounts"; +import { chainOption, getChain } from "./chain.js"; +import { rpcUrlOption } from "./rpc-url.js"; +import { walletKeyOption } from "./wallet-key.js"; + +export const writeOptions = options({ + [chainOption.alias[0]]: chainOption, + [rpcUrlOption.alias[0]]: rpcUrlOption, + [walletKeyOption.alias[0]]: walletKeyOption, +}); + +export interface WriteOptions { + chain: Chain; + rpcUrl: string; + account: PrivateKeyAccount; + publicClient: PublicClient; + walletClient: WalletClient; + drift: Drift; + council: ReadWriteCouncil; +} + +export async function getWriteOptions( + optionsGetter: OptionsGetter, + client?: Client, +): Promise { + const chain = await getChain(optionsGetter.chain, client); + + const rpcUrl = await optionsGetter.rpcUrl({ + prompt: "Enter RPC URL", + }); + + const walletKey = await optionsGetter.walletKey({ + prompt: "Enter wallet key", + }); + + const account = privateKeyToAccount(walletKey as `0x${string}`); + const transport = http(rpcUrl); + const publicClient = createPublicClient({ chain, transport }); + const walletClient = createWalletClient({ transport, chain, account }); + const drift = createDrift({ + adapter: viemAdapter({ publicClient, walletClient }), + }); + const council = createCouncil({ drift }); + + return { + chain, + rpcUrl, + account, + publicClient, + walletClient, + drift, + council, + }; +} diff --git a/packages/council-cli/src/reusable-options/chain.ts b/packages/council-cli/src/reusable-options/chain.ts deleted file mode 100644 index 71ad843d..00000000 --- a/packages/council-cli/src/reusable-options/chain.ts +++ /dev/null @@ -1,81 +0,0 @@ -import { Context, OptionConfig, OptionGetter } from "clide-js"; -import { Chain, defineChain } from "viem"; -import { - HyphenCase, - SupportedChain, - formatChainName, - supportedChains, -} from "../lib/viem.js"; - -// TODO: Add a way to register new chains that updates the chain prompt and -// makes it possible to use the custom chain name in environment variables. - -export const chainOption = { - alias: ["chain"], - description: "The chain to target.", - type: "string", - required: true, - default: process.env.CHAIN || "localhost", -} as const satisfies OptionConfig; - -const supportedChainNames = Object.keys(supportedChains); - -export async function getChain( - chainOptionGetter: OptionGetter, - context?: Context, -): Promise { - const choices = supportedChainNames.map((chainName) => { - return { - title: chainName, - value: chainName, - }; - }); - - if (context) { - choices.push({ - title: "other", - value: "other", - }); - } - - const chosenChain = (await chainOptionGetter({ - prompt: { - message: "Select chain", - type: "select", - choices, - }, - })) as SupportedChain | "other" | `other:${number}`; - - if (chosenChain in supportedChains) { - return supportedChains[chosenChain as SupportedChain]; - } - - const id = chosenChain.startsWith("other:") - ? parseInt(chosenChain.split(":")[1]) - : await context?.client.prompt({ - message: "Enter chain ID", - type: "number", - }); - - return defineChain({ - id, - name: chosenChain, - network: "other", - nativeCurrency: { - decimals: 18, - name: "Native Currency", - symbol: "VALUE", - }, - rpcUrls: { - default: { http: [] }, - public: { http: [] }, - }, - }); -} - -/** Derive the correct option value from a Chain object. */ -export function chainToOptionValue( - chain: TChain, -): HyphenCase { - return formatChainName(chain.name) as HyphenCase; -} diff --git a/packages/council-cli/src/reusable-options/rpc-url.ts b/packages/council-cli/src/reusable-options/rpc-url.ts deleted file mode 100644 index 051ec984..00000000 --- a/packages/council-cli/src/reusable-options/rpc-url.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { OptionConfig } from "clide-js"; - -export const rpcUrlOption = { - alias: ["rpc", "rpc-url"], - description: "An RPC URL to send the transaction request to", - type: "string", - required: true, - default: process.env.RPC_URL || "http://127.0.0.1:8545", -} as const satisfies OptionConfig; diff --git a/packages/council-cli/src/reusable-options/writeOptions.ts b/packages/council-cli/src/reusable-options/writeOptions.ts deleted file mode 100644 index 5a42556f..00000000 --- a/packages/council-cli/src/reusable-options/writeOptions.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { Context, OptionsConfig, OptionsGetter } from "clide-js"; -import { Chain, PrivateKeyAccount } from "viem"; -import { privateKeyToAccount } from "viem/accounts"; -import { chainOption, getChain } from "./chain.js"; -import { rpcUrlOption } from "./rpc-url.js"; -import { walletKeyOption } from "./wallet-key.js"; - -export const writeOptions = { - chain: chainOption, - rpc: rpcUrlOption, - wallet: walletKeyOption, -} as const satisfies OptionsConfig; - -export interface WriteOptions { - chain: Chain; - rpcUrl: string; - account: PrivateKeyAccount; - walletKey: `0x${string}`; -} - -export async function getWriteOptions( - optionsGetter: OptionsGetter, - context?: Context, -): Promise { - const chain = await getChain(optionsGetter.chain, context); - - const rpcUrl = await optionsGetter.rpc({ - prompt: "Enter RPC URL", - }); - - const walletKey = await optionsGetter.wallet({ - prompt: "Enter wallet key", - }); - - const account = privateKeyToAccount(walletKey as `0x${string}`); - - return { - chain, - rpcUrl, - account, - walletKey: walletKey as `0x${string}`, - }; -} diff --git a/packages/council-cli/src/utils/JsonStore.ts b/packages/council-cli/src/utils/JsonStore.ts new file mode 100644 index 00000000..73551366 --- /dev/null +++ b/packages/council-cli/src/utils/JsonStore.ts @@ -0,0 +1,246 @@ +import { mkdirSync, readFileSync, rmSync, writeFileSync } from "node:fs"; +import { dirname, resolve } from "node:path"; +import { z } from "zod"; +import { fromError } from "zod-validation-error"; +import type { IfElse, IsNever, OptionalKey, RequiredKey } from "./types.js"; + +type DefaultsOption = { + /** + * The default values the JSON will be created with and will reset to + */ + defaults?: z.infer; +}; + +/** + * Options for the `JSONStore` class + */ +export type JsonStoreOptions = { + /** + * The path where the JSON will be saved; *excluding the filename* + */ + path: string; + + /** + * The name to use for the `.json` file + */ + name: string; + + /** + * A schema to validate the JSON against + * @see [Zod](https://zod.dev) + */ + schema?: T; +} & IfElse< + IsNever>>, + DefaultsOption, + Required> +>; + +/** + * Use a JSON file to persist key-value data. + */ +export class JsonStore { + /** + * The path to the JSON file for this store + */ + readonly path: string; + + /** + * The default values the JSON will be created with and will reset to + */ + readonly defaults: JsonStoreOptions["defaults"]; + + readonly schema: T; + + /** + * Use a JSON file to persist key-value data + */ + constructor({ + name, + path, + defaults, + schema = z.object({}).passthrough() as T, + }: JsonStoreOptions) { + if (!name.endsWith(".json")) name += ".json"; + this.path = resolve(process.cwd(), path, name); + this.schema = schema; + this.defaults = defaults || {}; + } + + /** + * Get the store as an object + */ + data(): z.infer { + type Data = z.infer; + let json: string; + + try { + json = readFileSync(this.path, "utf8"); + } catch (err) { + this.reset(); + return this.defaults as Data; + } + + try { + return this.#parse(JSON.parse(json)); + } catch (err) { + const backupPath = `${this.path}.bak`; + writeFileSync(backupPath, json); + this.reset(); + console.error( + `Failed to parse JSON from ${this.path}. The file has been backed up at ${backupPath} and the store has been reset.`, + ); + return this.defaults as Data; + } + } + + /** + * Remove the store file + */ + rm(): void { + try { + rmSync(this.path); + } catch (_) {} + } + + /** + * Set the value for a key or multiple keys in the store + * @param key - The key to set or an object of key-value pairs to set + * @param value - The value to set the key to if `key` is not an object + */ + set(values: Partial>): void; + set>(key: K, value: z.infer[K]): void; + set>( + keyOrValues: K | Partial>, + value?: z.infer[K], + ): void { + const data = this.data(); + + if (typeof keyOrValues !== "object" && value) { + validateSerializable(keyOrValues.toString(), value); + data[keyOrValues] = value; + } else { + for (const [key, value] of Object.entries(keyOrValues)) { + validateSerializable(key as string, value); + } + Object.assign(data, keyOrValues); + } + + this.#save(data); + } + + /** + * Get a value from the store by key + * @param key - The key to get the value for + * @returns The value of `store[key]` + */ + get>(key: K): z.infer[K]; + get>(...keys: K[]): Pick, K>; + get>(key: K, ...restKeys: K[]) { + const data = this.data(); + return restKeys.length === 0 + ? data[key] + : Object.fromEntries([ + [key, data[key]], + ...Object.entries(data).filter(([k]) => restKeys.includes(k as any)), + ]); + } + + /** + * Check to see if the store contains all given keys + * @param keys - The keys to look for + * @returns True if all keys exists, false otherwise + */ + has(...keys: T[]): boolean { + const data = this.data(); + + let hasAllKeys = true; + + for (const key of keys) { + if (!(key in data)) { + hasAllKeys = false; + } + } + + return hasAllKeys; + } + + /** + * Delete entries in the store by their keys + * @param keys - The keys of the entries to delete + * @returns True if all entries were deleted, false otherwise + */ + delete(...keys: OptionalKey>[]): boolean { + const data = this.data(); + + let didDeleteSome = false; + let didDeleteAll = true; + + for (const key of keys) { + if ((key as string) in data) { + delete data[key]; + didDeleteSome = true; + } else { + didDeleteAll = false; + } + } + + if (didDeleteSome) { + this.#save(data); + } + + return didDeleteAll; + } + + /** + * Reset config to defaults + */ + reset() { + this.#save(this.defaults as z.infer); + return this.defaults; + } + + /** + * Throw an error if the data doesn't match the schema + * @param data - The data to validate against the schema + */ + #parse(data: unknown): z.infer { + try { + return this.schema.parse(data); + } catch (err) { + throw new Error(fromError(err).toString()); + } + } + + /** + * Save the store as JSON + * @param data - The store data + */ + #save(data: z.infer) { + data = this.#parse(data); + + const json = JSON.stringify(data, null, 2); + + mkdirSync(dirname(this.path), { recursive: true }); + + writeFileSync(this.path, json, { + encoding: "utf8", + flag: "w", + }); + } +} + +const invalidTypes = ["undefined", "function", "symbol", "bigint"]; + +/** + * Throw an error if a value is not JSON serializable + * @param key - The key being set (used to provide more context in the error) + * @param value - The value to validate + */ +function validateSerializable(key: string, value: unknown) { + if (value === null || invalidTypes.includes(typeof value)) { + throw new TypeError( + `Failed to set value of type \`${typeof value}\` for key \`${key}\`. Values must be JSON serializable.`, + ); + } +} diff --git a/packages/council-cli/src/utils/config/JsonStore.ts b/packages/council-cli/src/utils/config/JsonStore.ts deleted file mode 100644 index 714e14e2..00000000 --- a/packages/council-cli/src/utils/config/JsonStore.ts +++ /dev/null @@ -1,280 +0,0 @@ -import ajv, { ValidateFunction } from "ajv"; -import type { JSONSchema } from "json-schema-typed"; -import fs from "node:fs"; -import path from "node:path"; -import { OptionalKeys, RequiredKeys } from "../types.js"; - -fs.promises; - -const Ajv = ajv.default; - -/** - * An object of JSONSchemas based on `T` - */ -export type Schema = { - [K in keyof T]-?: JSONSchema; -}; - -/** - * Options that change depending on whether `T` includes required fields - */ -export type DynamicJSONStoreOptions = - RequiredKeys extends never - ? { - /** - * The default values the JSON will be created with and will reset to - */ - defaults?: T; - } - : { - /** - * The default values the JSON will be created with and will reset to - */ - defaults: T; - }; - -/** - * Options for the `JSONStore` class - */ -export type JsonStoreOptions> = { - /** - * The path where the JSON will be saved *excluding the filename* - */ - path: string; - - /** - * The name to use for the `.json` file - */ - name: string; - - schema?: Schema; -} & DynamicJSONStoreOptions; - -/** - * A custom JSON store since all the good ones require ESM :( - * - * Use a JSON file to persist key-value data - */ -export class JsonStore> { - /** - * The path to the JSON file for this store - */ - readonly path: string; - - /** - * The default values the JSON will be created with and will reset to - */ - readonly defaults: JsonStoreOptions["defaults"]; - - /** - * Ensures the JSON matches the schema if provided - */ - private readonly _validator?: ValidateFunction; - - /** - * Use a JSON file to persist key-value data - */ - constructor(options: JsonStoreOptions) { - const filename = `${removeJsonExtension(options.name)}.json`; - this.path = path.resolve(process.cwd(), options.path, filename); - - if (options.schema) { - const ajv = new Ajv({ allErrors: true, useDefaults: true }); - - const storeSchema: JSONSchema = { - type: "object", - properties: options.schema, - additionalProperties: false, - }; - - this._validator = ajv.compile(storeSchema); - } - - this.defaults = options.defaults || ({} as T); - } - - /** - * Get the store as an object - */ - get data(): T { - let data: T; - - try { - const raw = fs.readFileSync(this.path, "utf8"); - // TODO: handle parse error - data = JSON.parse(raw); - } catch (err) { - data = this.defaults as T; - this._save(data); - return data; - } - - this._validate(data); - return data; - - // { 'rpc-url': undefined } - } - - /** - * Remove the store file - */ - rm(): void { - try { - fs.rmSync(this.path); - } catch (_) {} - } - - /** - * Set the value for a key or multiple keys in the store - * @param key - The key to set or an object of key-value pairs to set - * @param value - The value to set the key to if `key` is not an object - */ - set(values: Partial): void; - set(key: K, value: T[K]): void; - set(keyOrValues: K | Partial, value?: T[K]): void { - const data = this.data; - - if (typeof keyOrValues !== "object" && value) { - validateSerializable(keyOrValues.toString(), value); - data[keyOrValues] = value; - } else { - for (const [key, value] of Object.entries(keyOrValues)) { - validateSerializable(key as string, value); - } - Object.assign(data, keyOrValues); - } - - this._save(data); - } - - /** - * Get a value from the store by key - * @param key - The key to get the value for - * @returns The value of `store[key]` - */ - get(key: K): T[K] { - return this.data[key]; - } - - /** - * Check to see if the store contains all given keys - * @param keys - The keys to look for - * @returns True if all keys exists, false otherwise - */ - // TODO: consider deleting because of the smart types - has(...keys: (keyof T)[]): boolean { - const data = this.data; - - let hasAllKeys = true; - - for (const key of keys) { - if (!(key in data)) { - hasAllKeys = false; - } - } - - return hasAllKeys; - } - - /** - * Delete entries in the store by their keys - * @param keys - The keys of the entries to delete - * @returns True if all entries were deleted, false otherwise - */ - delete(...keys: OptionalKeys[]): boolean { - const data = this.data; - - let didDeleteSome = false; - let didDeleteAll = true; - - for (const key of keys) { - if ((key as string) in data) { - delete data[key]; - didDeleteSome = true; - } else { - didDeleteAll = false; - } - } - - if (didDeleteSome) { - this._save(data); - } - - return didDeleteAll; - } - - /** - * Reset config to defaults - */ - reset(): void { - this._save(this.defaults as T); - } - - /** - * Throw an error if the data doesn't match the schema - * @param data - The data to validate against the schema - */ - private _validate(data: T | unknown): void { - if (!this._validator) { - return; - } - - const valid = this._validator(data); - - if (valid || !this._validator.errors) { - return; - } - - const errors = this._validator.errors.map( - ({ instancePath, message = "", params }) => { - if (params.additionalProperty) { - return `property \`${params.additionalProperty}\` not allowed`; - } - return `\`${instancePath.slice(1)}\` ${message}`; - }, - ); - throw new TypeError(`Schema violation: ${errors.join("; ")}`); - } - - /** - * Save the store as JSON - * @param data - The store data - */ - private _save(data: T): true { - this._validate(data); - - const json = JSON.stringify(data, null, 2); - - fs.mkdirSync(path.dirname(this.path), { recursive: true }); - - fs.writeFileSync(this.path, json, { - encoding: "utf8", - flag: "w", - }); - - return true; - } -} - -/** - * Remove `.json` from the end of a filename - * @param file - The full filename - * @returns The filename without the `.json` extension - */ -function removeJsonExtension(filename: string): string { - return filename.replace(/\.json$/, ""); -} - -/** - * Throw an error if a value is not JSON serializable - * @param key - The key being set (used to provide more context in the error) - * @param value - The value to validate - */ -function validateSerializable(key: string, value: unknown) { - const type = typeof value; - if (["undefined", "function", "symbol", "bigint"].includes(typeof value)) { - throw new TypeError( - `Failed to set value of type \`${type}\` for key \`${key}\`. Values must be JSON serializable.`, - ); - } -} diff --git a/packages/council-cli/src/utils/config/getOSConfigDir.ts b/packages/council-cli/src/utils/config/getOSConfigDir.ts deleted file mode 100644 index d4380d55..00000000 --- a/packages/council-cli/src/utils/config/getOSConfigDir.ts +++ /dev/null @@ -1,39 +0,0 @@ -import os from "node:os"; -import path from "node:path"; - -/** - * Get the path to an app specific config directory based on operating system - * standards. - * @param projectName - * @returns - */ -export function getOSConfigDir(projectName: string): string { - const homeDir = os.homedir(); - const platform = os.platform(); - - let configDir: string; - - if (platform === "win32") { - // Windows - // https://learn.microsoft.com/en-us/windows/apps/design/app-settings/store-and-retrieve-app-data - // https://learn.microsoft.com/en-us/windows/uwp/get-started/fileio-learning-track#app-folders - // https://learn.microsoft.com/en-us/windows/deployment/usmt/usmt-recognized-environment-variables#variables-that-are-recognized-only-in-the-user-context - /* eslint-disable-next-line turbo/no-undeclared-env-vars */ - configDir = process.env.APPDATA || path.join(homeDir, "AppData", "Roaming"); - } else if (platform === "darwin") { - // macOS - // https://apple.fandom.com/wiki/Preferences_folder - // https://developer.apple.com/library/archive/documentation/FileManagement/Conceptual/FileSystemProgrammingGuide/MacOSXDirectories/MacOSXDirectories.html - // https://apple.fandom.com/wiki/Application_Support_folder - configDir = path.join(homeDir, "Library", "Application Support'"); - } else { - // Linux and others - // https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html - // https://how-to.fandom.com/wiki/Guide_to_linux_configuration_files - /* eslint-disable-next-line turbo/no-undeclared-env-vars */ - configDir = process.env.XDG_CONFIG_HOME || path.join(homeDir, ".config"); - } - - // `-nodejs` suffix used to reduce likelihood of conflicts. - return path.join(configDir, `${projectName}-nodejs`); -} diff --git a/packages/council-cli/src/utils/constants.ts b/packages/council-cli/src/utils/constants.ts index 2a58dcfe..cdebb978 100644 --- a/packages/council-cli/src/utils/constants.ts +++ b/packages/council-cli/src/utils/constants.ts @@ -1,4 +1,4 @@ -export const DAY_IN_SECONDS = 86400n; -export const BLOCK_TIME = 12n; +export const DAY_IN_SECONDS = 86400; +export const BLOCK_TIME = 12; export const DAY_IN_BLOCKS = DAY_IN_SECONDS / BLOCK_TIME; export const ZERO_ADDRESS = "0x0000000000000000000000000000000000000000"; diff --git a/packages/council-cli/src/utils/createCallHash.ts b/packages/council-cli/src/utils/createCallHash.ts index b22979b8..05965e39 100644 --- a/packages/council-cli/src/utils/createCallHash.ts +++ b/packages/council-cli/src/utils/createCallHash.ts @@ -1,6 +1,7 @@ import { Address, encodeAbiParameters, + Hash, Hex, keccak256, parseAbiParameters, @@ -12,7 +13,7 @@ import { export function createCallHash( targets: string[], callDatas: BytesLike[], -): string { +): Hash { const encoded = encodeAbiParameters( parseAbiParameters("address[], bytes[]"), [targets as Address[], callDatas as Hex[]], diff --git a/packages/council-cli/src/utils/defaultOptionValues.ts b/packages/council-cli/src/utils/defaultOptionValues.ts deleted file mode 100644 index 1db261c7..00000000 --- a/packages/council-cli/src/utils/defaultOptionValues.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { OptionValues, OptionsConfig } from "clide-js"; - -export default function defaultOptionValues( - optionsConfig: OptionsConfig, -): OptionValues { - return Object.fromEntries( - Object.entries(optionsConfig).map(([key, config]) => { - return [key, config.default]; - }), - ) as OptionValues; -} diff --git a/packages/council-cli/src/utils/deployContract.ts b/packages/council-cli/src/utils/deployContract.ts deleted file mode 100644 index ce1c05ac..00000000 --- a/packages/council-cli/src/utils/deployContract.ts +++ /dev/null @@ -1,71 +0,0 @@ -import { - Abi, - Chain, - createPublicClient, - createWalletClient, - DeployContractParameters, - Hex, - http, - PrivateKeyAccount, -} from "viem"; - -interface DeployContractOptions { - abi: TAbi; - args: DeployContractParameters["args"]; - bytecode: Hex; - account: PrivateKeyAccount; - rpcUrl: string; - chain: Chain; - onSubmitted?: (txHash: string) => void; -} - -export async function deployContract({ - abi, - args, - bytecode, - account, - rpcUrl, - chain, - onSubmitted, -}: DeployContractOptions): Promise { - const publicClient = createPublicClient({ - transport: http(rpcUrl), - chain, - }); - - const walletClient = createWalletClient({ - account, - transport: http(rpcUrl), - chain, - }); - - const hash = await walletClient.deployContract({ - abi, - account, - args, - bytecode, - } as any); - onSubmitted?.(hash); - - const { contractAddress } = await publicClient.waitForTransactionReceipt({ - hash, - }); - - if (!contractAddress) { - throw new Error( - `Contract address not found in deployment receipt for tx, ${hash}`, - ); - } - - return { - address: contractAddress, - hash, - deploymentArgs: args as any[], - }; -} - -export type DeployedContract = { - address: `0x${string}`; - hash: `0x${string}`; - deploymentArgs: any[]; -}; diff --git a/packages/council-cli/src/utils/fetchPolyfill.ts b/packages/council-cli/src/utils/fetchPolyfill.ts deleted file mode 100644 index ab2c4ab8..00000000 --- a/packages/council-cli/src/utils/fetchPolyfill.ts +++ /dev/null @@ -1,8 +0,0 @@ -import fetch, { Headers, Request, Response } from "node-fetch-native"; - -if (!globalThis.fetch) { - globalThis.fetch = fetch; - globalThis.Headers = Headers; - globalThis.Request = Request; - globalThis.Response = Response; -} diff --git a/packages/council-cli/src/utils/getAppRootDir.ts b/packages/council-cli/src/utils/getAppRootDir.ts new file mode 100644 index 00000000..4e0ec440 --- /dev/null +++ b/packages/council-cli/src/utils/getAppRootDir.ts @@ -0,0 +1,23 @@ +import { readdirSync } from "node:fs"; +import { dirname } from "node:path"; + +/** + * Get the path to the nearest app root directory based on the presence of a + * `package.json` file. + * @param currentDirectory - The directory to start searching from. Defaults to + * the current working directory. + */ +export function getAppRootDir( + rootDir = "/", + currentDirectory = process.cwd(), +): string { + if (currentDirectory === rootDir) { + throw new Error("Could not find an app root directory."); + } + const dirItems = readdirSync(currentDirectory); + if (!dirItems.includes("package.json")) { + const parentDir = dirname(currentDirectory); + return getAppRootDir(parentDir); + } + return currentDirectory; +} diff --git a/packages/council-cli/src/utils/types.ts b/packages/council-cli/src/utils/types.ts index 4e985abc..5ee71d8c 100644 --- a/packages/council-cli/src/utils/types.ts +++ b/packages/council-cli/src/utils/types.ts @@ -1,13 +1,21 @@ +export type IsNever = [T] extends [never] ? true : false; + +export type IfElse< + TCondition extends boolean, + TTrue, + TFalse, +> = TCondition extends true ? TTrue : TFalse; + /** * Get a union of all required keys on `T` */ -export type RequiredKeys = { +export type RequiredKey = { [K in keyof T]-?: undefined extends T[K] ? never : K; }[keyof T]; /** * Get a union of all options keys on `T` */ -export type OptionalKeys = { +export type OptionalKey = { [K in keyof T]-?: undefined extends T[K] ? K : never; }[keyof T]; diff --git a/packages/council-cli/src/utils/config/validateData.ts b/packages/council-cli/src/utils/validation/validateData.ts similarity index 100% rename from packages/council-cli/src/utils/config/validateData.ts rename to packages/council-cli/src/utils/validation/validateData.ts diff --git a/packages/council-cli/tsconfig.json b/packages/council-cli/tsconfig.json index 5e787536..87c93bce 100644 --- a/packages/council-cli/tsconfig.json +++ b/packages/council-cli/tsconfig.json @@ -6,10 +6,10 @@ "compilerOptions": { "outDir": "dist", "rootDir": "src", - "baseUrl": ".", - // "module": "NodeNext", - // "moduleResolution": "NodeNext", - // "target": "ESNext", + // "baseUrl": ".", + "module": "NodeNext", + "moduleResolution": "NodeNext", + "target": "ESNext", "allowSyntheticDefaultImports": true, // important to import JSON files from @delvtech/council-artifacts @@ -20,12 +20,9 @@ "declarationMap": false, "lib": ["es2023"], - "module": "node16", - "target": "es2022", "strict": true, "esModuleInterop": true, "skipLibCheck": true, - "forceConsistentCasingInFileNames": true, - "moduleResolution": "node16", - }, + "forceConsistentCasingInFileNames": true + } } diff --git a/packages/council-core/.eslintignore b/packages/council-core/.eslintignore deleted file mode 100644 index db4c6d9b..00000000 --- a/packages/council-core/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -dist -node_modules \ No newline at end of file diff --git a/packages/council-core/package.json b/packages/council-core/package.json deleted file mode 100644 index 02ead953..00000000 --- a/packages/council-core/package.json +++ /dev/null @@ -1,143 +0,0 @@ -{ - "name": "@delvtech/council-core", - "version": "0.1.0", - "license": "AGPL-3.0", - "type": "module", - "scripts": { - "build": "tsup", - "watch": "tsup --watch", - "docs": "typedoc", - "watch:docs": "typedoc --watch", - "test": "vitest run", - "test:watch": "vitest --reporter=verbose", - "typecheck": "tsc --noEmit" - }, - "peerDependencies": { - "@delvtech/evm-client": "^0.5.1" - }, - "dependencies": { - "@delvtech/council-artifacts": "^0.1.0", - "big.js": "^6.2.1", - "fast-json-stable-stringify": "^2.1.0", - "lru-cache": "^10.2.0" - }, - "devDependencies": { - "@council/eslint-config": "*", - "@council/tsconfig": "*", - "@delvtech/evm-client": "^0.5.1", - "@types/big.js": "^6.2.2", - "abitype": "^1.0.0", - "dotenv": "^16.4.5", - "nodemon": "^3.0.3", - "sinon": "^17.0.1", - "ts-node": "^10.9.2", - "tsconfig-paths": "^4.2.0", - "tsup": "^8.0.2", - "typedoc": "^0.25.8", - "typedoc-plugin-markdown": "^3.17.1", - "typescript": "^5.3.3", - "vitest": "^1.3.1" - }, - "exports": { - ".": { - "types": "./dist/index.d.ts", - "default": "./dist/index.js" - }, - "./airdrop": { - "types": "./dist/airdrop.d.ts", - "default": "./dist/airdrop.js" - }, - "./contract": { - "types": "./dist/contract.d.ts", - "default": "./dist/contract.js" - }, - "./council": { - "types": "./dist/council.d.ts", - "default": "./dist/council.js" - }, - "./errors": { - "types": "./dist/errors.d.ts", - "default": "./dist/errors.js" - }, - "./model": { - "types": "./dist/model.d.ts", - "default": "./dist/model.js" - }, - "./proposal": { - "types": "./dist/proposal.d.ts", - "default": "./dist/proposal.js" - }, - "./token": { - "types": "./dist/token.d.ts", - "default": "./dist/token.js" - }, - "./utils": { - "types": "./dist/utils.d.ts", - "default": "./dist/utils.js" - }, - "./vaults": { - "types": "./dist/vaults.d.ts", - "default": "./dist/vaults.js" - }, - "./vote": { - "types": "./dist/vote.d.ts", - "default": "./dist/vote.js" - }, - "./voter": { - "types": "./dist/voter.d.ts", - "default": "./dist/voter.js" - }, - "./voting": { - "types": "./dist/voting.d.ts", - "default": "./dist/voting.js" - } - }, - "typesVersions": { - "*": { - "airdrop": [ - "./dist/airdrop.d.ts" - ], - "contract": [ - "./dist/contract.d.ts" - ], - "council": [ - "./dist/council.d.ts" - ], - "error": [ - "./dist/error.d.ts" - ], - "model": [ - "./dist/model.d.ts" - ], - "proposal": [ - "./dist/proposal.d.ts" - ], - "token": [ - "./dist/token.d.ts" - ], - "utils": [ - "./dist/utils.d.ts" - ], - "vaults": [ - "./dist/vaults.d.ts" - ], - "vote": [ - "./dist/vote.d.ts" - ], - "voter": [ - "./dist/voter.d.ts" - ], - "voting": [ - "./dist/voting.d.ts" - ] - } - }, - "main": "dist/index.js", - "types": "dist/index.d.ts", - "files": [ - "dist" - ], - "publishConfig": { - "access": "public" - } -} diff --git a/packages/council-core/src/contract/extend.ts b/packages/council-core/src/contract/extend.ts deleted file mode 100644 index 301ac4cf..00000000 --- a/packages/council-core/src/contract/extend.ts +++ /dev/null @@ -1,91 +0,0 @@ -import { - CachedReadContract, - CachedReadWriteContract, - CreateCachedReadContractOptions, - CreateCachedReadWriteContractOptions, - Network, - createCachedReadContract, - createCachedReadWriteContract, -} from "@delvtech/evm-client"; -import { Abi } from "abitype"; -import { Prettify } from "src/types"; -import { getEventsWithSplitAndRetry } from "src/utils/getEventsWithSplitAndRetry"; - -interface ExtendOptions { - network: Network; - /** - * The maximum number of times to split a failed event query into smaller - * block ranges and retry. This number has the potential to increase the - * number of requests exponentially, so the number should be considered - * carefully. Defaults to 5. - */ - maxEventQuerySplits?: number; -} - -export type ExtendReadContractOptions = Prettify< - ExtendOptions & CreateCachedReadContractOptions ->; - -/** - * Extends a read contract with custom event fetching logic and caching. When - * event queries fail, the range of blocks is recursively split in half and the - * query is retried until the `maxEventQuerySplits` is reached. - */ -export function extendReadContract({ - contract, - network, - cache, - namespace, - maxEventQuerySplits = 5, -}: ExtendReadContractOptions): CachedReadContract { - return createCachedReadContract({ - contract: { - ...contract, - getEvents(eventName, options) { - return getEventsWithSplitAndRetry({ - contract, - network, - eventName, - options, - attemptsLeft: maxEventQuerySplits, - }); - }, - }, - cache, - namespace, - }); -} - -export type ExtendReadWriteContractOptions = Prettify< - ExtendOptions & CreateCachedReadWriteContractOptions ->; - -/** - * Extends a read contract with custom event fetching logic and caching. When - * event queries fail, the range of blocks is recursively split in half and the - * query is retried until the `maxEventQuerySplits` is reached. - */ -export function extendReadWriteContract({ - contract, - network, - cache, - namespace, - maxEventQuerySplits = 5, -}: ExtendReadWriteContractOptions): CachedReadWriteContract { - return createCachedReadWriteContract({ - contract: { - ...contract, - getEvents(eventName, options) { - return getEventsWithSplitAndRetry({ - contract, - network, - eventName, - options, - attemptsLeft: maxEventQuerySplits, - }); - }, - }, - cache, - namespace, - }); -} diff --git a/packages/council-core/src/contract/factory.ts b/packages/council-core/src/contract/factory.ts deleted file mode 100644 index 2e295520..00000000 --- a/packages/council-core/src/contract/factory.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { - CachedReadContract, - CachedReadWriteContract, - CreateCachedReadContractOptions, -} from "@delvtech/evm-client"; -import { Abi } from "abitype"; -import { Prettify } from "src/types"; - -export type ContractFactoryOptions = Prettify< - Omit & { - abi: TAbi; - address: `0x${string}`; - } ->; - -export type ReadContractFactory = ( - options: ContractFactoryOptions, -) => CachedReadContract; - -export type ReadWriteContractFactory = ( - options: ContractFactoryOptions, -) => CachedReadWriteContract; diff --git a/packages/council-core/src/errors/BlockNotFound.ts b/packages/council-core/src/errors/BlockNotFound.ts deleted file mode 100644 index 21636747..00000000 --- a/packages/council-core/src/errors/BlockNotFound.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { BlockLike } from "src/utils/blockToReadOptions"; - -export class BlockNotFoundError extends Error { - constructor(block?: BlockLike) { - super(`Block${block !== undefined ? ` ${block}` : ""} not found`); - this.name = "BlockNotFound"; - } -} diff --git a/packages/council-core/src/exports/airdrop.ts b/packages/council-core/src/exports/airdrop.ts deleted file mode 100644 index 5145fc14..00000000 --- a/packages/council-core/src/exports/airdrop.ts +++ /dev/null @@ -1,5 +0,0 @@ -export { - ReadAirdrop, - type ReadAirdropOptions, -} from "src/models/airdrop/ReadAirdrop"; -export { ReadWriteAirdrop } from "src/models/airdrop/ReadWriteAirdrop"; diff --git a/packages/council-core/src/exports/contract.ts b/packages/council-core/src/exports/contract.ts deleted file mode 100644 index 36b6f224..00000000 --- a/packages/council-core/src/exports/contract.ts +++ /dev/null @@ -1,12 +0,0 @@ -export type { - ContractFactoryOptions, - ReadContractFactory, - ReadWriteContractFactory, -} from "src/contract/factory"; - -export { - extendReadContract, - extendReadWriteContract, - type ExtendReadContractOptions, - type ExtendReadWriteContractOptions, -} from "src/contract/extend"; diff --git a/packages/council-core/src/exports/council.ts b/packages/council-core/src/exports/council.ts deleted file mode 100644 index 3992432e..00000000 --- a/packages/council-core/src/exports/council.ts +++ /dev/null @@ -1,8 +0,0 @@ -export { - ReadCouncil, - type ReadCouncilOptions, -} from "src/models/council/ReadCouncil"; -export { - ReadWriteCouncil, - type ReadWriteCouncilOptions, -} from "src/models/council/ReadWriteCouncil"; diff --git a/packages/council-core/src/exports/errors.ts b/packages/council-core/src/exports/errors.ts deleted file mode 100644 index 14500751..00000000 --- a/packages/council-core/src/exports/errors.ts +++ /dev/null @@ -1 +0,0 @@ -export { BlockNotFoundError } from "src/errors/BlockNotFound"; diff --git a/packages/council-core/src/exports/index.ts b/packages/council-core/src/exports/index.ts deleted file mode 100644 index 5c51e94d..00000000 --- a/packages/council-core/src/exports/index.ts +++ /dev/null @@ -1,12 +0,0 @@ -export * from "src/exports/airdrop"; -export * from "src/exports/council"; -export * from "src/exports/errors"; -export * from "src/exports/contract"; -export * from "src/exports/model"; -export * from "src/exports/proposal"; -export * from "src/exports/token"; -export * from "src/exports/utils"; -export * from "src/exports/vaults"; -export * from "src/exports/vote"; -export * from "src/exports/voter"; -export * from "src/exports/voting"; diff --git a/packages/council-core/src/exports/model.ts b/packages/council-core/src/exports/model.ts deleted file mode 100644 index 2be6b22e..00000000 --- a/packages/council-core/src/exports/model.ts +++ /dev/null @@ -1,7 +0,0 @@ -export { - Model, - type ReadContractModelOptions, - type ReadModelOptions, - type ReadWriteContractModelOptions, - type ReadWriteModelOptions, -} from "src/models/Model"; diff --git a/packages/council-core/src/exports/proposal.ts b/packages/council-core/src/exports/proposal.ts deleted file mode 100644 index 50e012b4..00000000 --- a/packages/council-core/src/exports/proposal.ts +++ /dev/null @@ -1,9 +0,0 @@ -export { - ReadProposal, - type BaseProposalOptions, - type ReadProposalOptions, -} from "src/models/proposal/ReadProposal"; -export { - ReadWriteProposal, - type ReadWriteProposalOptions, -} from "src/models/proposal/ReadWriteProposal"; diff --git a/packages/council-core/src/exports/token.ts b/packages/council-core/src/exports/token.ts deleted file mode 100644 index e5704d58..00000000 --- a/packages/council-core/src/exports/token.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { ReadToken, type ReadTokenOptions } from "src/models/token/ReadToken"; -export { ReadWriteMockToken } from "src/models/token/ReadWriteMockToken"; diff --git a/packages/council-core/src/exports/utils.ts b/packages/council-core/src/exports/utils.ts deleted file mode 100644 index 811b210c..00000000 --- a/packages/council-core/src/exports/utils.ts +++ /dev/null @@ -1,5 +0,0 @@ -export { - blockToReadOptions, - type BlockLike, -} from "src/utils/blockToReadOptions"; -export { getVaultsWithPower } from "src/utils/getVaultsWithPower"; diff --git a/packages/council-core/src/exports/vaults.ts b/packages/council-core/src/exports/vaults.ts deleted file mode 100644 index ef3931fd..00000000 --- a/packages/council-core/src/exports/vaults.ts +++ /dev/null @@ -1,30 +0,0 @@ -export { - ReadVotingVault, - type ReadVotingVaultOptions, -} from "src/models/votingVault/ReadVotingVault"; -export { - ReadGscVault, - type ReadGscVaultOptions, -} from "src/models/votingVault/gscVault/ReadGscVault"; -export { - ReadWriteGscVault, - type ReadWriteGscVaultOptions, -} from "src/models/votingVault/gscVault/ReadWriteGscVault"; -export { - ReadLockingVault, - type ReadLockingVaultOptions, -} from "src/models/votingVault/lockingVault/ReadLockingVault"; -export { - ReadWriteLockingVault, - type ReadWriteLockingVaultOptions, -} from "src/models/votingVault/lockingVault/ReadWriteLockingVault"; -export type { - VoterPowerBreakdown, - VoterWithPower, - VotingVaultAbi, -} from "src/models/votingVault/types"; -export { - ReadVestingVault, - type ReadVestingVaultOptions, -} from "src/models/votingVault/vestingVault/ReadVestingVault"; -export { ReadWriteVestingVault } from "src/models/votingVault/vestingVault/ReadWriteVestingVault"; diff --git a/packages/council-core/src/exports/vote.ts b/packages/council-core/src/exports/vote.ts deleted file mode 100644 index a9768dc1..00000000 --- a/packages/council-core/src/exports/vote.ts +++ /dev/null @@ -1 +0,0 @@ -export { ReadVote, type ReadVoteOptions } from "src/models/ReadVote"; diff --git a/packages/council-core/src/exports/voter.ts b/packages/council-core/src/exports/voter.ts deleted file mode 100644 index e6a497e5..00000000 --- a/packages/council-core/src/exports/voter.ts +++ /dev/null @@ -1 +0,0 @@ -export { ReadVoter, type ReadVoterOptions } from "src/models/ReadVoter"; diff --git a/packages/council-core/src/exports/voting.ts b/packages/council-core/src/exports/voting.ts deleted file mode 100644 index f167a6e1..00000000 --- a/packages/council-core/src/exports/voting.ts +++ /dev/null @@ -1,15 +0,0 @@ -export { - ReadCoreVoting, - type ReadCoreVotingOptions, -} from "src/models/coreVoting/ReadCoreVoting"; -export { - ReadWriteCoreVoting, - type ReadWriteCoreVotingOptions, -} from "src/models/coreVoting/ReadWriteCoreVoting"; -export { EXECUTED_PROPOSAL_HASH } from "src/models/coreVoting/constants"; -export type { - Actions, - Ballot, - CoreVotingAbi, - VoteResults, -} from "src/models/coreVoting/types"; diff --git a/packages/council-core/src/models/Model.ts b/packages/council-core/src/models/Model.ts deleted file mode 100644 index 80e248b8..00000000 --- a/packages/council-core/src/models/Model.ts +++ /dev/null @@ -1,68 +0,0 @@ -import { - CreateCachedReadContractOptions, - CreateCachedReadWriteContractOptions, - Network, -} from "@delvtech/evm-client"; -import { - ReadContractFactory, - ReadWriteContractFactory, -} from "src/contract/factory"; - -interface ModelOptions { - network: Network; - /** - * An arbitrary name for the instance. This is for convenience only (e.g., - * display name, debugging) and has no affect on the model's behavior. - */ - name?: string; -} - -/** - * @category Models - */ -export interface ReadModelOptions extends ModelOptions { - contractFactory: ReadContractFactory; -} - -/** - * A base class for read-only models. - * @category Models - */ -export class Model { - name: string; - network: Network; - contractFactory: ReadContractFactory; - - constructor({ name, network, contractFactory }: ReadModelOptions) { - this.name = name ?? this.constructor.name; - this.network = network; - this.contractFactory = contractFactory; - } -} - -/** - * @category Models - */ -export interface ReadWriteModelOptions extends ModelOptions { - contractFactory: ReadWriteContractFactory; -} - -// Contract models - -/** - * @category Models - */ -export interface ReadContractModelOptions - extends ReadModelOptions, - Omit { - address: `0x${string}`; -} - -/** - * @category Models - */ -export interface ReadWriteContractModelOptions - extends ReadWriteModelOptions, - Omit { - address: `0x${string}`; -} diff --git a/packages/council-core/src/models/ReadVote.ts b/packages/council-core/src/models/ReadVote.ts deleted file mode 100644 index daa645f3..00000000 --- a/packages/council-core/src/models/ReadVote.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { Ballot } from "src/models/coreVoting/types"; -import { Model, ReadModelOptions } from "src/models/Model"; -import { ReadProposal } from "src/models/proposal/ReadProposal"; -import { ReadVoter } from "src/models/ReadVoter"; - -export interface ReadVoteOptions extends ReadModelOptions { - ballot: Ballot; - power: bigint; - proposal: ReadProposal; - voter: ReadVoter | `0x${string}`; -} - -/** - * @category Models - */ -export class ReadVote extends Model { - ballot: Ballot; - power: bigint; - proposal: ReadProposal; - voter: ReadVoter; - - constructor({ - name = "Vote", - ballot, - contractFactory, - network, - power, - proposal, - voter, - }: ReadVoteOptions) { - super({ contractFactory, network, name }); - this.ballot = ballot; - this.power = power; - this.proposal = proposal; - this.voter = - typeof voter === "string" - ? new ReadVoter({ - address: voter, - contractFactory, - network, - }) - : voter; - } -} diff --git a/packages/council-core/src/models/ReadVoter.ts b/packages/council-core/src/models/ReadVoter.ts deleted file mode 100644 index 664df88c..00000000 --- a/packages/council-core/src/models/ReadVoter.ts +++ /dev/null @@ -1,118 +0,0 @@ -import { ReadCoreVoting } from "src/models/coreVoting/ReadCoreVoting"; -import { Model, ReadModelOptions } from "src/models/Model"; -import { ReadVote } from "src/models/ReadVote"; -import { ReadVotingVault } from "src/models/votingVault/ReadVotingVault"; -import { BlockLike } from "src/utils/blockToReadOptions"; - -export interface ReadVoterOptions extends ReadModelOptions { - address: `0x${string}`; -} - -/** - * A participant in Council - * @category Models - */ -export class ReadVoter extends Model { - address: `0x${string}`; - - constructor({ address, name = `Voter`, ...rest }: ReadVoterOptions) { - super({ - name, - ...rest, - }); - this.address = address; - } - - /** - * Get the total voting power for this Voter from a given list of vaults. - * @param extraData - ABI encoded optional extra data used by some vaults, such - * as merkle proofs. - */ - async getVotingPower({ - vaults, - atBlock, - extraData, - }: { - vaults: (ReadVotingVault | `0x${string}`)[]; - atBlock?: BlockLike; - extraData?: `0x${string}`[]; - }): Promise { - const vaultPowers = vaults.map((vault, i) => { - if (typeof vault === "string") { - vault = new ReadVotingVault({ - address: vault, - contractFactory: this.contractFactory, - network: this.network, - }); - } - return vault.getVotingPower({ - account: this.address, - atBlock, - extraData: extraData?.[i], - }); - }); - return (await Promise.all(vaultPowers)).reduce((sum, val) => sum + val, 0n); - } - - /** - * Get the casted votes for this Voter in a given Voting Contract - */ - async getVotes({ - coreVoting, - proposalId, - fromBlock, - toBlock, - }: { - coreVoting: ReadCoreVoting | `0x${string}`; - proposalId?: bigint; - fromBlock?: BlockLike; - toBlock?: BlockLike; - }): Promise { - const _coreVoting = - typeof coreVoting === "string" - ? new ReadCoreVoting({ - address: coreVoting, - contractFactory: this.contractFactory, - network: this.network, - }) - : coreVoting; - return _coreVoting.getVotes({ - proposalId, - account: this, - fromBlock, - toBlock, - }); - } - - /** - * Get the number of proposals this Voter has voted on and the number of - * proposals that they were able to vote on. If the numbers are the same, then - * this Voter has voted on every proposal they were able to. - */ - async getParticipation({ - coreVoting, - vaults, - fromBlock, - toBlock, - }: { - coreVoting: ReadCoreVoting | `0x${string}`; - vaults: (ReadVotingVault | `0x${string}`)[]; - fromBlock?: BlockLike; - toBlock?: BlockLike; - }): Promise<[number, number]> { - const _coreVoting = - typeof coreVoting === "string" - ? new ReadCoreVoting({ - address: coreVoting, - contractFactory: this.contractFactory, - network: this.network, - vaults, - }) - : coreVoting; - return _coreVoting.getParticipation({ - account: this, - fromBlock, - toBlock, - }); - } -} diff --git a/packages/council-core/src/models/airdrop/ReadAirdrop.ts b/packages/council-core/src/models/airdrop/ReadAirdrop.ts deleted file mode 100644 index 97d896eb..00000000 --- a/packages/council-core/src/models/airdrop/ReadAirdrop.ts +++ /dev/null @@ -1,100 +0,0 @@ -import { Airdrop as AirdropArtifact } from "@delvtech/council-artifacts/Airdrop"; -import { CachedReadContract } from "@delvtech/evm-client"; -import { AirdropAbi } from "src/models/airdrop/types"; -import { Model, ReadContractModelOptions } from "src/models/Model"; -import { ReadToken } from "src/models/token/ReadToken"; -import { ReadLockingVault } from "src/models/votingVault/lockingVault/ReadLockingVault"; -import { BlockLike, blockToReadOptions } from "src/utils/blockToReadOptions"; - -/** - * @category Models - */ -export interface ReadAirdropOptions extends ReadContractModelOptions {} - -/** - * @category Models - */ -export class ReadAirdrop extends Model { - contract: CachedReadContract; - - constructor({ - name = "Airdrop", - address, - contractFactory, - network, - cache, - namespace, - }: ReadAirdropOptions) { - super({ contractFactory, name, network }); - this.contract = contractFactory({ - abi: AirdropArtifact.abi, - address, - cache, - namespace, - }); - } - - get address(): `0x${string}` { - return this.contract.address; - } - get namespace(): string | undefined { - return this.contract.namespace; - } - - /** - * Get a timestamp (in MS) of when the tokens can be reclaimed (removed by the - * owner). - */ - async getExpiration(): Promise { - const secondsTimestamp = await this.contract.read("expiration"); - return new Date(Number(secondsTimestamp * 1000n)); - } - - /** - * Get The merkle root with deposits encoded into it as hash [address, amount] - */ - getMerkleRoot(): Promise<`0x${string}`> { - return this.contract.read("rewardsRoot"); - } - - /** - * Get the token that will be paid out. - */ - async getToken(): Promise { - return new ReadToken({ - address: await this.contract.read("token"), - contractFactory: this.contractFactory, - network: this.network, - }); - } - - /** - * Get the amount that an address has already claimed. - */ - async getClaimedAmount({ - account, - atBlock, - }: { - account: `0x${string}`; - atBlock?: BlockLike; - }): Promise { - return await this.contract.read( - "claimed", - { 0: account }, - blockToReadOptions(atBlock), - ); - } - - /** - * Get the address of the locking vault into which tokens will be deposited - * when someone claims and delegates in a single tx. - */ - async getLockingVault(): Promise { - const address = await this.contract.read("lockingVault"); - return new ReadLockingVault({ - address, - contractFactory: this.contractFactory, - network: this.network, - }); - } -} diff --git a/packages/council-core/src/models/airdrop/ReadWriteAirdrop.ts b/packages/council-core/src/models/airdrop/ReadWriteAirdrop.ts deleted file mode 100644 index a5c9b633..00000000 --- a/packages/council-core/src/models/airdrop/ReadWriteAirdrop.ts +++ /dev/null @@ -1,149 +0,0 @@ -import { - CachedReadWriteContract, - ContractWriteOptions, -} from "@delvtech/evm-client"; -import { ReadWriteContractFactory } from "src/contract/factory"; -import { ReadAirdrop } from "src/models/airdrop/ReadAirdrop"; -import { AirdropAbi } from "src/models/airdrop/types"; -import { ReadWriteContractModelOptions } from "src/models/Model"; -import { ReadWriteToken } from "src/models/token/ReadWriteToken"; -import { ReadWriteLockingVault } from "src/models/votingVault/lockingVault/ReadWriteLockingVault"; - -/** - * @category Models - */ -interface ReadWriteAirdropOptions extends ReadWriteContractModelOptions {} - -/** - * @category Models - */ -export class ReadWriteAirdrop extends ReadAirdrop { - declare contract: CachedReadWriteContract; - declare contractFactory: ReadWriteContractFactory; - - constructor(options: ReadWriteAirdropOptions) { - super(options); - } - - override async getToken(): Promise { - return new ReadWriteToken({ - address: await this.contract.read("token"), - contractFactory: this.contractFactory, - network: this.network, - }); - } - - override async getLockingVault(): Promise { - return new ReadWriteLockingVault({ - address: await this.contract.read("lockingVault"), - contractFactory: this.contractFactory, - network: this.network, - }); - } - - /** - * Claims tokens from the airdrop and sends them to the user. - * @param amount - Amount of tokens to claim. - * @param totalGrant - The total amount of tokens the user was granted. - * @param merkleProof - A set of hashes that can be used to reconstruct the - * path from a user (leaf) node to the merkle root, verifying that the user is - * part of the tree. - * @param recipient - The address which will be credited with funds. - * @return - The transaction hash. - */ - async claim({ - amount, - totalGrant, - merkleProof, - recipient, - options, - }: { - amount: bigint; - totalGrant: bigint; - merkleProof: `0x${string}`[]; - recipient: `0x${string}`; - options?: ContractWriteOptions; - }): Promise<`0x${string}`> { - const hash = await this.contract.write( - "claim", - { - amount, - destination: recipient, - merkleProof, - totalGrant, - }, - options, - ); - const token = await this.getToken(); - token.contract.deleteRead("balanceOf", { 0: recipient }); - this.contract.deleteRead("claimed", { 0: recipient }); - return hash; - } - - /** - * Claims tokens from the airdrop, deposits it into the locking vault, and - * delegates in a single transaction. - * @param amount - Amount of tokens to claim. - * @param delegate - The address the user will delegate to, WARNING - should not be zero. - * @param totalGrant - The total amount of tokens the user was granted. - * @param merkleProof - A set of hashes that can be used to reconstruct the - * path from a user (leaf) node to the merkle root, verifying that the user is - * part of the tree. - * @param recipient - The address which will be credited with funds. - * @return - The transaction hash. - */ - async claimAndDelegate({ - amount, - delegate, - totalGrant, - merkleProof, - recipient, - options, - }: { - amount: bigint; - delegate: `0x${string}`; - totalGrant: bigint; - merkleProof: `0x${string}`[]; - recipient: `0x${string}`; - options?: ContractWriteOptions; - }): Promise<`0x${string}`> { - const hash = await this.contract.write( - "claimAndDelegate", - { - amount, - delegate, - totalGrant, - merkleProof, - destination: recipient, - }, - options, - ); - const lockingVault = await this.getLockingVault(); - lockingVault.contract.clearCache(); - this.contract.deleteRead("claimed", { 0: recipient }); - return hash; - } - - /** - * Remove funds from the airdrop after expiration - * @param recipient - The address which will be credited with funds. - * @return - The transaction hash. - */ - async reclaim({ - recipient, - options, - }: { - recipient: `0x${string}`; - options?: ContractWriteOptions; - }): Promise<`0x${string}`> { - const hash = await this.contract.write( - "reclaim", - { destination: recipient }, - options, - ); - const token = await this.getToken(); - token.contract.deleteRead("balanceOf", { 0: recipient }); - this.contract.clearCache(); - return hash; - } -} diff --git a/packages/council-core/src/models/airdrop/types.ts b/packages/council-core/src/models/airdrop/types.ts deleted file mode 100644 index 3b9ab527..00000000 --- a/packages/council-core/src/models/airdrop/types.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { Airdrop } from "@delvtech/council-artifacts/Airdrop"; - -export type AirdropAbi = typeof Airdrop.abi; diff --git a/packages/council-core/src/models/coreVoting/ReadCoreVoting.ts b/packages/council-core/src/models/coreVoting/ReadCoreVoting.ts deleted file mode 100644 index b01dd093..00000000 --- a/packages/council-core/src/models/coreVoting/ReadCoreVoting.ts +++ /dev/null @@ -1,309 +0,0 @@ -import { CoreVoting } from "@delvtech/council-artifacts/CoreVoting"; -import { CachedReadContract } from "@delvtech/evm-client"; -import { Model, ReadContractModelOptions } from "src/models/Model"; -import { ReadVote } from "src/models/ReadVote"; -import { ReadVoter } from "src/models/ReadVoter"; -import { - BALLOTS, - EXECUTED_PROPOSAL_HASH, -} from "src/models/coreVoting/constants"; -import { CoreVotingAbi } from "src/models/coreVoting/types"; -import { ReadProposal } from "src/models/proposal/ReadProposal"; -import { ReadVotingVault } from "src/models/votingVault/ReadVotingVault"; -import { BlockLike } from "src/utils/blockToReadOptions"; - -/** - * @category Models - */ -export interface ReadCoreVotingOptions extends ReadContractModelOptions { - vaults?: (ReadVotingVault | `0x${string}`)[]; -} - -/** - * @category Models - */ -export class ReadCoreVoting extends Model { - contract: CachedReadContract; - vaults: ReadVotingVault[]; - - /** - * Create a new CoreVoting model instance. - * @param address - The address of the deployed contract. - * @param vaults - The VotingVault instances or addresses of the vaults that are - * approved for this voting contract. - */ - constructor({ - name = "Core Voting", - address, - contractFactory, - network, - cache, - namespace, - vaults = [], - }: ReadCoreVotingOptions) { - super({ contractFactory, network, name }); - - this.contract = contractFactory({ - abi: CoreVoting.abi, - address, - cache, - namespace, - }); - - this.vaults = vaults.map((vault) => - vault instanceof ReadVotingVault - ? vault - : new ReadVotingVault({ - address: vault, - contractFactory, - network, - }), - ); - } - - get address(): `0x${string}` { - return this.contract.address; - } - get namespace(): string | undefined { - return this.contract.namespace; - } - - /** - * Get a proposal by id. - */ - async getProposal({ id }: { id: bigint }): Promise { - const proposalInfo = await this._getProposalInfo({ id }); - if (proposalInfo) { - return new ReadProposal({ - ...proposalInfo, - coreVoting: this, - contractFactory: this.contractFactory, - network: this.network, - }); - } - } - - /** - * Get all proposals ever created. - * @param fromBlock - Include all proposals created on or after this block number. - * @param toBlock - Include all proposals created on or before this block number. - */ - async getProposals({ - fromBlock, - toBlock, - }: { - fromBlock?: BlockLike; - toBlock?: BlockLike; - } = {}): Promise { - const createdEvents = await this.contract.getEvents("ProposalCreated", { - fromBlock, - toBlock, - }); - return createdEvents.map( - ({ args: { proposalId, created, execution, expiration } }) => - new ReadProposal({ - contractFactory: this.contractFactory, - coreVoting: this, - created, - expiration, - id: proposalId, - unlock: execution, - network: this.network, - }), - ); - } - - /** - * Get the voting power owned by a given address in all vaults. - * @param extraData - ABI encoded optional extra data used by some vaults, such - * as merkle proofs. - */ - async getVotingPower({ - account, - atBlock, - extraData, - }: { - account: ReadVoter | `0x${string}`; - atBlock?: BlockLike; - extraData?: `0x${string}`[]; - }): Promise { - const vaultPowers = await Promise.all( - this.vaults.map((vault, i) => - vault.getVotingPower({ - account: account, - atBlock, - extraData: extraData?.[i], - }), - ), - ); - return vaultPowers.reduce((sum, power) => sum + power, 0n); - } - - /** - * Get a casted vote for a given address on a given proposal id. - */ - async getVote({ - account, - proposalId, - }: { - account: ReadVoter | `0x${string}`; - proposalId: bigint; - }): Promise { - const { castBallot, votingPower } = await this.contract.read("votes", { - "0": account instanceof ReadVoter ? account.address : account, - "1": proposalId, - }); - - if (votingPower === 0n) { - return; - } - - return new ReadVote({ - ballot: BALLOTS[castBallot], - contractFactory: this.contractFactory, - network: this.network, - power: votingPower, - proposal: (await this.getProposal({ id: proposalId }))!, - voter: account, - }); - } - - /** - * Get all casted votes on proposals in this voting contract. - * @param fromBlock - The starting block number for the range of blocks fetched. - * @param toBlock - The ending block number for the range of blocks fetched. - */ - async getVotes({ - proposalId, - account, - fromBlock, - toBlock, - }: { - proposalId?: bigint; - account?: ReadVoter | `0x${string}`; - fromBlock?: BlockLike; - toBlock?: BlockLike; - } = {}): Promise { - const voteEvents = await this.contract.getEvents("Voted", { - filter: { - voter: - typeof account === "string" || !account ? account : account.address, - proposalId, - }, - fromBlock, - toBlock, - }); - - const votes: ReadVote[] = []; - - for (const { - args: { - proposalId, - vote: { castBallot, votingPower }, - voter, - }, - } of voteEvents) { - const proposal = await this.getProposal({ id: proposalId }); - if (!proposal) { - throw new Error( - `Vote event for proposal ${proposalId} from voter ${voter} references a non-existent proposal.`, - ); - } - votes.push( - new ReadVote({ - ballot: BALLOTS[castBallot], - contractFactory: this.contractFactory, - network: this.network, - power: votingPower, - proposal, - voter, - }), - ); - } - - return votes; - } - - /** - * Get the number of proposals an address has voted on and the number of - * proposals that they were able to vote on. If the numbers are the same, then - * the address has voted on every proposal they were able to. - */ - async getParticipation({ - account, - fromBlock, - toBlock, - }: { - account: ReadVoter | `0x${string}`; - fromBlock?: BlockLike; - toBlock?: BlockLike; - }): Promise<[number, number]> { - const votes = await this.getVotes({ - account: account, - fromBlock, - toBlock, - }); - const votedProposalIds = votes.map(({ proposal: { id } }) => id); - const proposals = await this.getProposals(); - const proposalsNotVoted = await Promise.all( - proposals - .filter(({ id }) => !votedProposalIds.includes(id)) - .map( - async (proposal) => - // could be null if the proposal has been deleted and the created - // block can't be fetched. - ((await proposal.getVotingPower({ account: account })) || 0n) > 0n, - ), - ); - const missedVotesCount = proposalsNotVoted.filter(Boolean).length; - return [proposals.length - missedVotesCount, proposals.length]; - } - - /** - * Get a proposal by id. - */ - protected async _getProposalInfo({ id }: { id: bigint }): Promise< - | { - id: bigint; - created: bigint; - expiration: bigint; - lastCall?: bigint; - proposalHash?: `0x${string}`; - requiredQuorum?: bigint; - unlock?: bigint; - } - | undefined - > { - const { created, expiration, lastCall, proposalHash, quorum, unlock } = - await this.contract.read("proposals", { 0: id }); - - if (proposalHash !== EXECUTED_PROPOSAL_HASH) { - return { - id, - created, - expiration, - lastCall, - proposalHash, - requiredQuorum: quorum, - unlock, - }; - } - - const createdEvents = await this.contract.getEvents("ProposalCreated"); - const createdEvent = createdEvents.find( - ({ args: { proposalId } }) => proposalId === id, - ); - - if (createdEvent) { - const { - args: { created, execution, expiration }, - } = createdEvent; - return { - id, - created, - expiration, - unlock: execution, - }; - } - } -} diff --git a/packages/council-core/src/models/coreVoting/ReadWriteCoreVoting.ts b/packages/council-core/src/models/coreVoting/ReadWriteCoreVoting.ts deleted file mode 100644 index fbb15c01..00000000 --- a/packages/council-core/src/models/coreVoting/ReadWriteCoreVoting.ts +++ /dev/null @@ -1,207 +0,0 @@ -import { - CachedReadWriteContract, - ContractWriteOptions, -} from "@delvtech/evm-client"; -import { ReadWriteContractFactory } from "src/contract/factory"; -import { BALLOTS } from "src/models/coreVoting/constants"; -import { ReadCoreVoting } from "src/models/coreVoting/ReadCoreVoting"; -import { Ballot, CoreVotingAbi } from "src/models/coreVoting/types"; -import { ReadWriteContractModelOptions } from "src/models/Model"; -import { ReadWriteProposal } from "src/models/proposal/ReadWriteProposal"; -import { ReadVotingVault } from "src/models/votingVault/ReadVotingVault"; -import { BlockLike } from "src/utils/blockToReadOptions"; - -export interface ReadWriteCoreVotingOptions - extends ReadWriteContractModelOptions { - vaults?: (ReadVotingVault | `0x${string}`)[]; -} - -export class ReadWriteCoreVoting< - TVaults extends ReadVotingVault[] = ReadVotingVault[], -> extends ReadCoreVoting { - declare contract: CachedReadWriteContract; - declare contractFactory: ReadWriteContractFactory; - - constructor(options: ReadWriteCoreVotingOptions) { - super(options); - } - - override async getProposal({ - id, - }: { - id: bigint; - }): Promise { - const proposalInfo = await this._getProposalInfo({ id }); - if (proposalInfo) { - return new ReadWriteProposal({ - ...proposalInfo, - coreVoting: this, - contractFactory: this.contractFactory, - network: this.network, - }); - } - } - - override async getProposals({ - fromBlock, - toBlock, - }: { - fromBlock?: BlockLike; - toBlock?: BlockLike; - } = {}): Promise { - const createdEvents = await this.contract.getEvents("ProposalCreated", { - fromBlock, - toBlock, - }); - return createdEvents.map( - ({ args: { proposalId, created, execution, expiration } }) => - new ReadWriteProposal({ - contractFactory: this.contractFactory, - coreVoting: this, - created, - expiration, - id: proposalId, - unlock: execution, - network: this.network, - }), - ); - } - - /** - * Create a new proposal. - * @param vaults - The addresses of the approved vaults to draw voting power - * from. - * @param targets - The targets (contract addresses) to call. - * @param calldatas - The execution calldata for each target. - * @param lastCall - The block number after which the proposal can't be executed. - * @param ballot: The initial vote from the signer's account. - * @returns The transaction hash. - */ - async createProposal({ - ballot, - calldatas, - lastCall, - targets, - vaults, - extraVaultData = [], - options, - }: { - vaults: (ReadVotingVault | `0x${string}`)[]; - targets: `0x${string}`[]; - calldatas: `0x${string}`[]; - lastCall: bigint; - ballot: Ballot; - /** - * Extra data given to the vaults to help calculation - */ - extraVaultData?: `0x${string}`[]; - options?: ContractWriteOptions; - }): Promise<`0x${string}`> { - const vaultAddresses = vaults.map((vault) => - typeof vault === "string" ? vault : vault.address, - ); - const hash = await this.contract.write( - "proposal", - { - ballot: BALLOTS.indexOf(ballot), - calldatas, - extraVaultData, - lastCall, - targets, - votingVaults: vaultAddresses, - }, - options, - ); - this.contract.clearCache(); - return hash; - } - - /** - * Change the number of blocks that must be waited before a proposal can be executed. - * @param blocks - The number of blocks that must be waited. - * @returns The transaction hash. - */ - async setLockDuration({ - blocks, - options, - }: { - blocks: bigint; - options?: ContractWriteOptions; - }): Promise<`0x${string}`> { - const hash = await this.contract.write( - "setLockDuration", - { _lockDuration: blocks }, - options, - ); - this.contract.deleteRead("lockDuration"); - return hash; - } - - /** - * Change whether a vault is approved or not. - * @param address -The address of the vault. - * @param isValid - Whether or not the approved. - * @returns The transaction hash. - */ - async changeVaultStatus({ - vault: _vault, - isValid, - options, - }: { - vault: ReadVotingVault | `0x${string}`; - isValid: boolean; - options?: ContractWriteOptions; - }): Promise<`0x${string}`> { - const vault = - _vault instanceof ReadVotingVault - ? _vault - : new ReadVotingVault({ - address: _vault, - contractFactory: this.contractFactory, - network: this.network, - }); - - const hash = await this.contract.write( - "changeVaultStatus", - { - isValid, - vault: vault.address, - }, - options, - ); - - if (isValid) { - this.vaults.push(vault); - } else { - this.vaults = this.vaults.filter( - ({ address }) => address !== vault.address, - ) as TVaults; - } - - this.contract.deleteRead("approvedVaults", { 0: vault.address }); - return hash; - } - - /** - * Change the amount of time (in blocks) that a proposal can still be voted on - * after it's been unlocked. - * @param extraVoteBlocks - The number of blocks after the proposal is - * unlocked during which voting can continue. - * @returns The transaction hash. - */ - async changeExtraVotingTime({ - extraVoteBlocks, - options, - }: { - extraVoteBlocks: bigint; - options?: ContractWriteOptions; - }): Promise<`0x${string}`> { - const hash = await this.contract.write( - "changeExtraVotingTime", - { _extraVoteTime: extraVoteBlocks }, - options, - ); - this.contract.deleteRead("extraVoteTime"); - return hash; - } -} diff --git a/packages/council-core/src/models/coreVoting/types.ts b/packages/council-core/src/models/coreVoting/types.ts deleted file mode 100644 index 6c14c94a..00000000 --- a/packages/council-core/src/models/coreVoting/types.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { CoreVoting } from "@delvtech/council-artifacts/CoreVoting"; -import { BALLOTS } from "src/models/coreVoting/constants"; - -export type CoreVotingAbi = typeof CoreVoting.abi; - -/** - * A valid ballot option. - * @category Data Sources - */ -export type Ballot = (typeof BALLOTS)[number]; - -/** - * The amount of voting power casted by ballot. - * @category Data Sources - */ -export type VoteResults = Record; - -/** - * The actions a proposal will perform. - */ -export interface Actions { - targets: `0x${string}`[] | readonly `0x${string}`[]; - calldatas: `0x${string}`[] | readonly `0x${string}`[]; -} diff --git a/packages/council-core/src/models/council/ReadCouncil.ts b/packages/council-core/src/models/council/ReadCouncil.ts deleted file mode 100644 index e9dfddb9..00000000 --- a/packages/council-core/src/models/council/ReadCouncil.ts +++ /dev/null @@ -1,99 +0,0 @@ -import { Network } from "@delvtech/evm-client"; -import { ReadContractFactory } from "src/contract/factory"; -import { ReadAirdrop } from "src/models/airdrop/ReadAirdrop"; -import { ReadCoreVoting } from "src/models/coreVoting/ReadCoreVoting"; -import { Model, ReadModelOptions } from "src/models/Model"; -import { ReadVoter } from "src/models/ReadVoter"; -import { ReadToken } from "src/models/token/ReadToken"; -import { ReadGscVault } from "src/models/votingVault/gscVault/ReadGscVault"; -import { ReadLockingVault } from "src/models/votingVault/lockingVault/ReadLockingVault"; -import { ReadVotingVault } from "src/models/votingVault/ReadVotingVault"; -import { ReadVestingVault } from "src/models/votingVault/vestingVault/ReadVestingVault"; - -export interface ReadCouncilOptions extends ReadModelOptions {} - -export class ReadCouncil extends Model { - protected _contractFactory: ReadContractFactory; - protected _network: Network; - - constructor({ - name = "Council", - contractFactory, - network, - }: ReadCouncilOptions) { - super({ contractFactory, network, name }); - this._contractFactory = contractFactory; - this._network = network; - } - - coreVoting({ - address, - vaults, - }: { - address: `0x${string}`; - vaults?: (ReadVotingVault | `0x${string}`)[]; - }): ReadCoreVoting { - return new ReadCoreVoting({ - address, - contractFactory: this._contractFactory, - network: this._network, - vaults, - }); - } - - voter(address: `0x${string}`): ReadVoter { - return new ReadVoter({ - address, - contractFactory: this._contractFactory, - network: this._network, - }); - } - - votingVault(address: `0x${string}`): ReadVotingVault { - return new ReadVotingVault({ - address, - contractFactory: this._contractFactory, - network: this._network, - }); - } - - lockingVault(address: `0x${string}`): ReadLockingVault { - return new ReadLockingVault({ - address, - contractFactory: this._contractFactory, - network: this._network, - }); - } - - vestingVault(address: `0x${string}`): ReadVestingVault { - return new ReadVestingVault({ - address, - contractFactory: this._contractFactory, - network: this._network, - }); - } - - gscVault(address: `0x${string}`): ReadGscVault { - return new ReadGscVault({ - address, - contractFactory: this._contractFactory, - network: this._network, - }); - } - - airdrop(address: `0x${string}`): ReadAirdrop { - return new ReadAirdrop({ - address, - contractFactory: this._contractFactory, - network: this._network, - }); - } - - token(address: `0x${string}`): ReadToken { - return new ReadToken({ - address, - contractFactory: this._contractFactory, - network: this._network, - }); - } -} diff --git a/packages/council-core/src/models/council/ReadWriteCouncil.ts b/packages/council-core/src/models/council/ReadWriteCouncil.ts deleted file mode 100644 index 23e9cb31..00000000 --- a/packages/council-core/src/models/council/ReadWriteCouncil.ts +++ /dev/null @@ -1,75 +0,0 @@ -import { ReadWriteContractFactory } from "src/contract/factory"; -import { ReadWriteModelOptions } from "src/models/Model"; -import { ReadWriteAirdrop } from "src/models/airdrop/ReadWriteAirdrop"; -import { ReadWriteCoreVoting } from "src/models/coreVoting/ReadWriteCoreVoting"; -import { ReadCouncil } from "src/models/council/ReadCouncil"; -import { ReadWriteToken } from "src/models/token/ReadWriteToken"; -import { ReadVotingVault } from "src/models/votingVault/ReadVotingVault"; -import { ReadWriteGscVault } from "src/models/votingVault/gscVault/ReadWriteGscVault"; -import { ReadWriteLockingVault } from "src/models/votingVault/lockingVault/ReadWriteLockingVault"; -import { ReadWriteVestingVault } from "src/models/votingVault/vestingVault/ReadWriteVestingVault"; - -export interface ReadWriteCouncilOptions extends ReadWriteModelOptions {} - -export class ReadWriteCouncil extends ReadCouncil { - protected declare _contractFactory: ReadWriteContractFactory; - - constructor(options: ReadWriteCouncilOptions) { - super(options); - } - - coreVoting({ - address, - vaults, - }: { - address: `0x${string}`; - vaults?: (ReadVotingVault | `0x${string}`)[]; - }): ReadWriteCoreVoting { - return new ReadWriteCoreVoting({ - address, - contractFactory: this._contractFactory, - network: this._network, - vaults, - }); - } - - lockingVault(address: `0x${string}`): ReadWriteLockingVault { - return new ReadWriteLockingVault({ - address, - contractFactory: this._contractFactory, - network: this._network, - }); - } - - vestingVault(address: `0x${string}`): ReadWriteVestingVault { - return new ReadWriteVestingVault({ - address, - contractFactory: this._contractFactory, - network: this._network, - }); - } - - gscVault(address: `0x${string}`): ReadWriteGscVault { - return new ReadWriteGscVault({ - address, - contractFactory: this._contractFactory, - network: this._network, - }); - } - - airdrop(address: `0x${string}`): ReadWriteAirdrop { - return new ReadWriteAirdrop({ - address, - contractFactory: this._contractFactory, - network: this._network, - }); - } - - token(address: `0x${string}`): ReadWriteToken { - return new ReadWriteToken({ - address, - contractFactory: this._contractFactory, - network: this._network, - }); - } -} diff --git a/packages/council-core/src/models/proposal/ReadProposal.ts b/packages/council-core/src/models/proposal/ReadProposal.ts deleted file mode 100644 index d453b601..00000000 --- a/packages/council-core/src/models/proposal/ReadProposal.ts +++ /dev/null @@ -1,448 +0,0 @@ -import { CoreVoting } from "@delvtech/council-artifacts/CoreVoting"; -import { ContractReadOptions, Event, Transaction } from "@delvtech/evm-client"; -import { Model, ReadModelOptions } from "src/models/Model"; -import { ReadVote } from "src/models/ReadVote"; -import { ReadVoter } from "src/models/ReadVoter"; -import { ReadCoreVoting } from "src/models/coreVoting/ReadCoreVoting"; -import { Actions, Ballot, VoteResults } from "src/models/coreVoting/types"; -import { BlockLike } from "src/utils/blockToReadOptions"; - -export interface BaseProposalOptions { - id: bigint; - coreVoting: ReadCoreVoting | `0x${string}`; - /** - * The block number of when this proposal was created. - */ - created: bigint; - expiration: bigint; - lastCall?: bigint; - proposalHash?: `0x${string}`; - requiredQuorum?: bigint; - unlock?: bigint; -} - -export interface ReadProposalOptions - extends BaseProposalOptions, - ReadModelOptions {} - -/** - * A model of a Proposal in Council - * @category Models - */ -export class ReadProposal extends Model { - id: bigint; - coreVoting: ReadCoreVoting; - created: bigint; - expiration: bigint; - - private _lastCall?: bigint; - private _proposalHash?: `0x${string}`; - private _requiredQuorum?: bigint; - private _unlock?: bigint; - private _allDataFetched = false; - - /** - * Create a new Proposal model instance. - * @param id - The id of the proposal in the voting contract. - * @param votingContract - the voting contract in which this proposal was - * created. - */ - constructor({ - name = "Proposal", - id, - coreVoting, - contractFactory, - network, - created, - expiration, - lastCall, - proposalHash, - requiredQuorum, - unlock, - }: ReadProposalOptions) { - super({ contractFactory, network, name }); - this.id = id; - this.coreVoting = - coreVoting instanceof ReadCoreVoting - ? coreVoting - : new ReadCoreVoting({ - address: coreVoting, - contractFactory, - network, - }); - this.created = created; - this.expiration = expiration; - this._lastCall = lastCall; - this._proposalHash = proposalHash; - this._requiredQuorum = requiredQuorum; - this._unlock = unlock; - } - - /** - * Get the array of addresses that will be called (targets) and the data - * they'll be called with (calldatas) by a proposal. - */ - async getTargetsAndCalldatas(): Promise { - const createdTransaction = await this.getCreatedTransaction(); - if (createdTransaction) { - const { - args: { targets, calldatas }, - } = this.coreVoting.contract.decodeFunctionData<"proposal">( - createdTransaction.input, - ); - return { - targets, - calldatas, - }; - } - } - - /** - * Get the hash of this proposal, used by its voting contract to verify the - * proposal data on execution. Not available on executed proposals. - */ - async getHash(): Promise<`0x${string}` | undefined> { - const data = await this._getData(); - return data?._proposalHash; - } - - /** - * Get the required quorum for this proposal to be executed. If the sum of - * voting power from all casted votes does not meet or exceed this number, - * then the proposal is not passing quorum. Not available on executed - * proposals. - */ - async getRequiredQuorum(): Promise { - const data = await this._getData(); - return data?._requiredQuorum; - } - - /** - * Get the block number of when this proposal can be executed. Will only be - * null if this proposal instance was initiated with an invalid id. - */ - async getUnlockBlock(): Promise { - const data = await this._getData(); - return data?._unlock; - } - - async getCreatedBy(): Promise { - const createdTransaction = await this.getCreatedTransaction(); - return ( - createdTransaction?.from && - new ReadVoter({ - address: createdTransaction.from, - contractFactory: this.contractFactory, - network: this.network, - }) - ); - } - - /** - * Get the hash of the transaction that created the proposal, or null if - * the Proposal doesn't exist. - * @returns The transaction hash - */ - async getCreatedTransaction(): Promise { - const createdEvent = await this._getCreatedEvent(); - const transaction = - createdEvent?.transactionHash && - (await this.network.getTransaction(createdEvent?.transactionHash)); - return transaction; - } - - /** - * Get the block number after which this proposal can no longer be executed. - * Not available on executed proposals. - */ - async getLastCallBlock(): Promise { - const data = await this._getData(); - return data?._lastCall; - } - - /** - * Get a boolean indicating whether this proposal is still active. Proposals - * are active during their voting period, i.e., from creation block up to - * expiration block or execution. Returns false if the current block is later - * than this proposal's expiration or this proposal has been executed. - */ - async getIsActive(): Promise { - const isExecuted = await this.getIsExecuted(); - if (isExecuted) { - return false; - } - const block = await this.network.getBlock(); - - return this.expiration > (block?.blockNumber ?? Infinity); - } - - /** - * Get a boolean indicating whether this proposal has been executed. - * @param atBlock - The block number to check. If this proposal was executed - * on or before this block, this will return true. - */ - async getIsExecuted(): Promise { - const executedEvent = await this._getExecutedEvent(); - return !!executedEvent; - } - - /** - * Get the hash of the transaction that executed the proposal, or null if - * the Proposal wasn't executed. - * @returns The transaction hash - */ - async getExecutedTransaction(): Promise { - const executedEvent = await this._getExecutedEvent(); - const hash = executedEvent?.transactionHash; - const transaction = hash && (await this.network.getTransaction(hash)); - return transaction; - } - - /** - * Get the casted vote for a given address on this proposal. - * @param address - The address that casted the vote. - */ - async getVote({ - account, - }: { - account: ReadVoter | `0x${string}`; - }): Promise { - return this.coreVoting.getVote({ - proposalId: this.id, - account, - }); - } - - /** - * Get all casted votes on this proposal - * @param fromBlock - Include all votes casted on or after this block. - * @param toBlock - Include all votes casted on or before this block. - */ - async getVotes({ - account, - fromBlock, - toBlock, - }: { - account?: ReadVoter | `0x${string}`; - fromBlock?: BlockLike; - toBlock?: BlockLike; - } = {}): Promise { - return this.coreVoting.getVotes({ - proposalId: this.id, - account, - fromBlock, - toBlock, - }); - } - - /** - * Get the usable voting power of a given address for this proposal determined - * by its creation block. Any changes to voting power after the creation block - * of this proposal does not apply to this proposal and therefore will not be - * reflected. - * @param extraData - ABI encoded optional extra data used by some vaults, such - * as merkle proofs. - */ - async getVotingPower({ - account, - extraData, - }: { - account: ReadVoter | `0x${string}`; - extraData?: `0x${string}`[]; - }): Promise { - return this.coreVoting.getVotingPower({ - account, - atBlock: this.created, - extraData, - }); - } - - /** - * Get the total voting power of all votes on this proposal by their ballot. - */ - async getResults({ - options, - }: { - options?: ContractReadOptions; - } = {}): Promise { - const powerByBallot: Record = { - yes: 0n, - no: 0n, - maybe: 0n, - }; - - // The proposal voting power is deleted when the proposal is executed, so we - // have to get the results from vote events. - const isExecuted = await this.getIsExecuted(); - if (isExecuted) { - const votes = await this.getVotes({ - toBlock: options?.blockNumber ?? options?.blockTag, - }); - for (const { ballot, power } of votes) { - powerByBallot[ballot] += power; - } - } else { - const proposalVotingPower = await this.coreVoting.contract.read( - "getProposalVotingPower", - { proposalId: this.id }, - options, - ); - if (Array.isArray(proposalVotingPower)) { - powerByBallot.yes = proposalVotingPower[0]; - powerByBallot.no = proposalVotingPower[1]; - powerByBallot.maybe = proposalVotingPower[2]; - } else { - return { - yes: proposalVotingPower as unknown as bigint, - no: 0n, - maybe: 0n, - }; - } - } - - return powerByBallot; - } - - /** - * Get the current quorum of this proposal measured by summing the voting - * power of all casted votes. - */ - async getCurrentQuorum(): Promise { - const results = await this.getResults(); - return Object.values(results).reduce((sum, val) => sum + val, 0n); - } - - /** - * Get a boolean indicating whether this proposal can be executed. Proposals - * can only be executed if the quorum requirement has been met, there are more - * yes votes than no votes, and the current block is between the unlock and - * last call blocks. - */ - async getIsExecutable(): Promise { - const unlockBlock = await this.getUnlockBlock(); - const lastCallBlock = await this.getLastCallBlock(); - const requiredQuorum = await this.getRequiredQuorum(); - if (!unlockBlock || !requiredQuorum || !lastCallBlock) { - return false; - } - - const block = await this.network.getBlock(); - - if (!block) { - return false; - } - - const blockNumber = block.blockNumber; - - if ( - blockNumber === null || - blockNumber < unlockBlock || - blockNumber > lastCallBlock - ) { - return false; - } - - const currentQuorum = await this.getCurrentQuorum(); - const { yes, no } = await this.getResults(); - return currentQuorum >= requiredQuorum && yes > no; - } - - /** - * Idempotent function to ensure all possible data is fetched for the - * proposal. (From both events and the CoreVoting contract) - **/ - protected async _getData(): Promise< - | { - _lastCall?: bigint; - _proposalHash?: `0x${string}`; - _requiredQuorum?: bigint; - _unlock?: bigint; - } - | undefined - > { - if (this._allDataFetched) { - return { - _lastCall: this._lastCall, - _proposalHash: this._proposalHash, - _requiredQuorum: this._requiredQuorum, - _unlock: this._unlock, - }; - } - - const { _lastCall, _proposalHash, _requiredQuorum, _unlock } = - (await this.coreVoting.getProposal({ id: this.id }))!; - - const data = { _lastCall, _proposalHash, _requiredQuorum, _unlock }; - Object.assign(this, data, { _allDataFetched: true }); - return data; - } - - /** - * Get the event that was emitted when this proposal was created. - */ - protected async _getCreatedEvent(): Promise< - Event | undefined - > { - const createdEvents = await this._getCreatedEvents(); - return createdEvents.find( - ({ args: { proposalId } }) => proposalId === this.id, - ); - } - - /** - * Get the ProposalCreated events for the proposal's creation block. - */ - protected async _getCreatedEvents(): Promise< - Event[] - > { - return await this.coreVoting.contract.getEvents("ProposalCreated", { - fromBlock: this.created, - toBlock: this.created, - }); - } - - /** - * Get the event that was emitted when this proposal was executed, or - * undefined if it hasn't been executed. - */ - protected async _getExecutedEvent(): Promise< - Event | undefined - > { - const executedEvents = await this._getExecutedEvents(); - const found = executedEvents.find( - ({ args }) => args.proposalId === this.id, - ); - - return found; - } - - /** - * Get the ProposalExecuted events within range of this proposal's lifecycle. - */ - protected async _getExecutedEvents(): Promise< - Event[] - > { - let toBlock = await this.getLastCallBlock(); - const latestBlock = await this.network.getBlock(); - - // Ensure we don't try to fetch a block range including blocks that don't - // exist yet. - if ( - typeof toBlock === "bigint" && - typeof latestBlock?.blockNumber === "bigint" && - latestBlock.blockNumber < toBlock - ) { - toBlock = latestBlock.blockNumber; - } - - const events = await this.coreVoting.contract.getEvents( - "ProposalExecuted", - { - fromBlock: this.created, - toBlock, - }, - ); - - return events; - } -} diff --git a/packages/council-core/src/models/proposal/ReadWriteProposal.ts b/packages/council-core/src/models/proposal/ReadWriteProposal.ts deleted file mode 100644 index a3179ebf..00000000 --- a/packages/council-core/src/models/proposal/ReadWriteProposal.ts +++ /dev/null @@ -1,109 +0,0 @@ -import { ContractWriteOptions } from "@delvtech/evm-client"; - -import { BALLOTS } from "src/models/coreVoting/constants"; -import { ReadWriteCoreVoting } from "src/models/coreVoting/ReadWriteCoreVoting"; -import { Ballot } from "src/models/coreVoting/types"; -import { ReadWriteModelOptions } from "src/models/Model"; -import { - BaseProposalOptions, - ReadProposal, -} from "src/models/proposal/ReadProposal"; -import { ReadVotingVault } from "src/models/votingVault/ReadVotingVault"; -import { getVaultsWithPower } from "src/utils/getVaultsWithPower"; - -export interface ReadWriteProposalOptions - extends ReadWriteModelOptions, - BaseProposalOptions { - coreVoting: ReadWriteCoreVoting | `0x${string}`; -} - -export class ReadWriteProposal extends ReadProposal { - declare coreVoting: ReadWriteCoreVoting; - - constructor(options: ReadWriteProposalOptions) { - super(options); - } - - /** - * Execute a proposal. - * @param signer - An ethers Signer instance. - * @returns The transaction hash. - */ - async execute({ - options, - }: { options?: ContractWriteOptions } = {}): Promise<`0x${string}`> { - const actions = await this.getTargetsAndCalldatas(); - if (!actions) { - throw new Error("Proposal not found"); - } - const hash = await this.coreVoting.contract.write( - "execute", - { - calldatas: actions.calldatas, - targets: actions.targets, - proposalId: this.id, - }, - options, - ); - this.coreVoting.contract.clearCache(); - return hash; - } - - /** - * Vote on this proposal. - * @param signer - An ethers Signer instance for the voter. - * @param ballot - The ballot to cast. - * @returns The transaction hash. - */ - async vote({ - ballot, - vaults: _vaults = this.coreVoting.vaults, - extraVaultData: _extraVaultData, - options, - }: { - ballot: Ballot; - /** - * The vaults to draw voting power from. Defaults to the `CoreVoting`'s - * configured vaults. - */ - vaults?: (`0x${string}` | ReadVotingVault)[]; - /** - * Extra data given to the vaults to help calculation. - */ - extraVaultData?: `0x${string}`[]; - options?: ContractWriteOptions; - }): Promise<`0x${string}`> { - const vaults = _vaults.map((vault) => - vault instanceof ReadVotingVault - ? vault - : new ReadVotingVault({ - address: vault, - contractFactory: this.contractFactory, - network: this.network, - }), - ); - - const signerAddress = await this.coreVoting.contract.getSignerAddress(); - const vaultsWithPower = await getVaultsWithPower(signerAddress, vaults); - - const extraVaultData = vaultsWithPower.map(({ address }) => { - const index = _vaults.indexOf(address); - return _extraVaultData?.[index] || "0x"; - }); - - const hash = this.coreVoting.contract.write( - "vote", - { - ballot: BALLOTS.indexOf(ballot), - extraVaultData, - proposalId: this.id, - votingVaults: vaultsWithPower.map(({ address }) => address), - }, - options, - ); - - this.coreVoting.contract.clearCache(); - - return hash; - } -} diff --git a/packages/council-core/src/models/token/ReadToken.ts b/packages/council-core/src/models/token/ReadToken.ts deleted file mode 100644 index 6a291ae5..00000000 --- a/packages/council-core/src/models/token/ReadToken.ts +++ /dev/null @@ -1,102 +0,0 @@ -import { MockERC20 } from "@delvtech/council-artifacts/MockERC20"; -import { CachedReadContract } from "@delvtech/evm-client"; -import { Model, ReadContractModelOptions } from "src/models/Model"; -import { ERC20Abi } from "src/models/token/types"; -import { BlockLike, blockToReadOptions } from "src/utils/blockToReadOptions"; - -/** - * @category Models - */ -export interface ReadTokenOptions extends ReadContractModelOptions {} - -/** - * @category Models - */ -export class ReadToken extends Model { - contract: CachedReadContract; - - constructor({ - name = "Token", - address, - contractFactory, - network, - cache, - namespace, - }: ReadTokenOptions) { - super({ name, network, contractFactory }); - this.contract = contractFactory({ - abi: MockERC20.abi, - address, - cache, - namespace, - }); - } - - get address(): `0x${string}` { - return this.contract.address; - } - get namespace(): string | undefined { - return this.contract.namespace; - } - - /** - * Get the symbol for this token. - */ - getSymbol(): Promise { - return this.contract.read("symbol"); - } - - /** - * Get the number of decimal places this token uses. - */ - getDecimals(): Promise { - return this.contract.read("decimals"); - } - - /** - * Get the name of this token - */ - getName(): Promise { - return this.contract.read("name"); - } - - /** - * Get the spending allowance of a given spender for a given owner of this - * token. - */ - getAllowance({ - owner, - spender, - atBlock, - }: { - owner: `0x${string}`; - spender: `0x${string}`; - atBlock?: BlockLike; - }): Promise { - return this.contract.read( - "allowance", - { - 0: owner, - 1: spender, - }, - blockToReadOptions(atBlock), - ); - } - - /** - * Get the token balance of a given address - */ - getBalanceOf({ - account, - atBlock, - }: { - account: `0x${string}`; - atBlock?: BlockLike; - }): Promise { - return this.contract.read( - "balanceOf", - { 0: account }, - blockToReadOptions(atBlock), - ); - } -} diff --git a/packages/council-core/src/models/token/ReadWriteMockToken.ts b/packages/council-core/src/models/token/ReadWriteMockToken.ts deleted file mode 100644 index d8bd2739..00000000 --- a/packages/council-core/src/models/token/ReadWriteMockToken.ts +++ /dev/null @@ -1,102 +0,0 @@ -import { ContractWriteOptions } from "@delvtech/evm-client"; -import { - ReadWriteToken, - ReadWriteTokenOptions, -} from "src/models/token/ReadWriteToken"; - -export class ReadWriteMockToken extends ReadWriteToken { - constructor({ name = "Mock Token", ...rest }: ReadWriteTokenOptions) { - super({ - name, - ...rest, - }); - } - - /** - * Mint new tokens - * @param account - The account to add tokens to. - * @param amount - The amount of tokens (as a decimal string) to add. - * @return - The transaction hash. - */ - async mint({ - account, - amount, - options, - }: { - account: `0x${string}`; - amount: bigint; - options?: ContractWriteOptions; - }): Promise<`0x${string}`> { - const hash = await this.contract.write( - "mint", - { - account, - amount, - }, - options, - ); - this.contract.deleteRead("balanceOf", { 0: account }); - return hash; - } - - /** - * Modify an account's balance. - * @param account - The account to set balance for. - * @param balance - The new balance (as a decimal string) for the account. - * @return - The transaction hash. - */ - async setBalance({ - account, - balance, - options, - }: { - account: `0x${string}`; - balance: bigint; - options?: ContractWriteOptions; - }): Promise<`0x${string}`> { - const hash = await this.contract.write( - "setBalance", - { - who: account, - amount: balance, - }, - options, - ); - this.contract.deleteRead("balanceOf", { 0: account }); - return hash; - } - - /** - * Modify an account's allowance. - * @param account - The address of the owner to set allowance for. - * @param spender - The address of the spender to set allowance for. - * @param balance - The new balance (as a decimal string) for the account. - * @return - The transaction hash. - */ - async setAllowance({ - owner, - spender, - allowance, - options, - }: { - owner: `0x${string}`; - spender: `0x${string}`; - allowance: bigint; - options?: ContractWriteOptions; - }): Promise<`0x${string}`> { - const hash = await this.contract.write( - "setAllowance", - { - amount: allowance, - source: owner, - spender, - }, - options, - ); - this.contract.deleteRead("allowance", { - 0: owner, - 1: spender, - }); - return hash; - } -} diff --git a/packages/council-core/src/models/token/ReadWriteToken.ts b/packages/council-core/src/models/token/ReadWriteToken.ts deleted file mode 100644 index 1241d6aa..00000000 --- a/packages/council-core/src/models/token/ReadWriteToken.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { - CachedReadWriteContract, - ContractWriteOptions, -} from "@delvtech/evm-client"; -import { ReadWriteContractFactory } from "src/contract/factory"; -import { ReadWriteContractModelOptions } from "src/models/Model"; -import { ReadToken } from "src/models/token/ReadToken"; -import { ERC20Abi } from "src/models/token/types"; - -/** - * @category Models - */ -export interface ReadWriteTokenOptions extends ReadWriteContractModelOptions {} - -/** - * @category Models - */ -export class ReadWriteToken extends ReadToken { - declare contract: CachedReadWriteContract; - declare contractFactory: ReadWriteContractFactory; - - constructor(options: ReadWriteTokenOptions) { - super(options); - } - - /** - * Give a spending allowance to a given spender. - * @param spender - The address of the spender. - * @param amount - The amount of tokens the spender can spend. - * @returns The transaction hash. - */ - async approve({ - spender, - amount, - options, - }: { - owner?: `0x${string}`; - spender: `0x${string}`; - amount: bigint; - options?: ContractWriteOptions; - }): Promise<`0x${string}`> { - const hash = await this.contract.write( - "approve", - { - account: spender, - amount, - }, - options, - ); - this.contract.deleteRead("allowance", { - 0: await this.contract.getSignerAddress(), - 1: spender, - }); - return hash; - } -} diff --git a/packages/council-core/src/models/token/types.ts b/packages/council-core/src/models/token/types.ts deleted file mode 100644 index 6da3995d..00000000 --- a/packages/council-core/src/models/token/types.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { MockERC20 } from "@delvtech/council-artifacts/MockERC20"; - -// Using MockERC20 abi for convenience to make extending to the MockToken model -// more straightforward without having to keep track of two different abis. -export type ERC20Abi = typeof MockERC20.abi; diff --git a/packages/council-core/src/models/votingVault/ReadVotingVault.ts b/packages/council-core/src/models/votingVault/ReadVotingVault.ts deleted file mode 100644 index cd715443..00000000 --- a/packages/council-core/src/models/votingVault/ReadVotingVault.ts +++ /dev/null @@ -1,85 +0,0 @@ -import { IVotingVault } from "@delvtech/council-artifacts/IVotingVault"; -import { CachedReadContract } from "@delvtech/evm-client"; -import { Model, ReadContractModelOptions } from "src/models/Model"; -import { ReadVoter } from "src/models/ReadVoter"; -import { VotingVaultAbi } from "src/models/votingVault/types"; -import { BlockLike } from "src/utils/blockToReadOptions"; -import { getBlockOrThrow } from "src/utils/getBlockOrThrow"; - -/** - * @category Models - */ -export interface ReadVotingVaultOptions extends ReadContractModelOptions {} - -/** - * A vault which stores voting power by address - * @category Models - */ -export class ReadVotingVault extends Model { - contract: CachedReadContract; - - constructor({ - name = "Voting Vault", - address, - contractFactory, - network, - cache, - namespace, - }: ReadVotingVaultOptions) { - super({ name, network, contractFactory }); - this.contract = contractFactory({ - abi: IVotingVault.abi, - address, - cache, - namespace, - }); - } - - get address(): `0x${string}` { - return this.contract.address; - } - get namespace(): string | undefined { - return this.contract.namespace; - } - - /** - * Get the usable voting power owned by a given address in this vault. - * @param extraData - ABI encoded optional extra data used by some vaults, - * such as merkle proofs. - */ - async getVotingPower({ - account, - atBlock = "latest", - extraData = "0x00", - }: { - account: ReadVoter | `0x${string}`; - atBlock?: BlockLike; - extraData?: `0x${string}`; - }): Promise { - let blockNumber = atBlock; - - if (typeof blockNumber !== "bigint") { - const block = await getBlockOrThrow(this.network, blockNumber); - if (block.blockNumber === null) { - return 0n; - } - blockNumber = block.blockNumber; - } - - try { - return await this.contract.simulateWrite("queryVotePower", { - blockNumber, - extraData, - user: typeof account === "string" ? account : account.address, - }); - } catch (error) { - // queryVotePower throws an uninitialized an error if the account is not - // found/hasn't ever had voting power. - if (error instanceof Error && error.message.includes("uninitialized")) { - return 0n; - } - - throw error; - } - } -} diff --git a/packages/council-core/src/models/votingVault/gscVault/ReadGscVault.ts b/packages/council-core/src/models/votingVault/gscVault/ReadGscVault.ts deleted file mode 100644 index 1370d65b..00000000 --- a/packages/council-core/src/models/votingVault/gscVault/ReadGscVault.ts +++ /dev/null @@ -1,250 +0,0 @@ -import { GSCVault } from "@delvtech/council-artifacts/GSCVault"; -import { CachedReadContract } from "@delvtech/evm-client"; -import { ReadContractModelOptions } from "src/models/Model"; -import { ReadVoter } from "src/models/ReadVoter"; -import { ReadVotingVault } from "src/models/votingVault/ReadVotingVault"; -import { GscVaultAbi } from "src/models/votingVault/gscVault/types"; -import { BlockLike, blockToReadOptions } from "src/utils/blockToReadOptions"; -import { getBlockOrThrow } from "src/utils/getBlockOrThrow"; - -export interface ReadGscVaultOptions extends ReadContractModelOptions {} - -/** - * A VotingVault for the Governance Steering Council in which each member has a - * single vote and must maintain a minimum required voting power in the core - * voting vaults to remain eligible. - * @category Models - */ -export class ReadGscVault extends ReadVotingVault { - gscVaultContract: CachedReadContract; - - constructor({ - name = "GSC Vault", - address, - contractFactory, - network, - cache, - namespace, - }: ReadGscVaultOptions) { - super({ - address, - contractFactory, - network, - cache, - namespace, - name, - }); - this.gscVaultContract = contractFactory({ - abi: GSCVault.abi, - address, - cache, - namespace, - }); - } - - get address(): `0x${string}` { - return this.contract.address; - } - get namespace(): string | undefined { - return this.contract.namespace; - } - - /** - * Get the amount of voting power required to join this vault. - */ - getRequiredVotingPower({ - atBlock, - }: { - atBlock?: BlockLike; - } = {}): Promise { - return this.gscVaultContract.read( - "votingPowerBound", - undefined, - blockToReadOptions(atBlock), - ); - } - - /** - * Get all current members of this vault. - * @param fromBlock - The block number to start searching for members from. - * @param toBlock - The block number to stop searching for members at. - */ - async getMembers({ - fromBlock, - toBlock, - }: { - fromBlock?: BlockLike; - toBlock?: BlockLike; - } = {}): Promise { - const latestJoinTimestampByMember: Record<`0x${string}`, bigint> = {}; - - const joinEvents = await this.gscVaultContract.getEvents( - "MembershipProved", - { - fromBlock, - toBlock, - }, - ); - - // Capture the latest join date of each address. - for (const { - args: { who, when }, - } of joinEvents) { - if ( - !latestJoinTimestampByMember[who] || - when > latestJoinTimestampByMember[who] - ) { - latestJoinTimestampByMember[who] = when; - } - } - - const kickEvents = await this.gscVaultContract.getEvents("Kicked", { - fromBlock, - toBlock, - }); - - // Ignore addresses that were kicked after their latest join date. - for (const { - args: { who, when }, - } of kickEvents) { - // NOTE: the kickEvents store `when` as a block number whereas the - // joinEvents store `when` as a timestamp, so we must convert the block - // number to a timestamp so we can compare them. - const { timestamp: kickedTimestamp } = await getBlockOrThrow( - this.network, - when, - ); - - if ( - latestJoinTimestampByMember[who] && - kickedTimestamp > latestJoinTimestampByMember[who] - ) { - delete latestJoinTimestampByMember[who]; - } - } - - return Object.entries(latestJoinTimestampByMember).map( - ([address]) => - new ReadVoter({ - address: address as `0x${string}`, - contractFactory: this.contractFactory, - network: this.network, - }), - ); - } - - /** - * Get all voters with voting power in this vault (alias for `getMembers`). - * @param fromBlock - The block number to start searching for voters from. - * @param toBlock - The block number to stop searching for voters at. - */ - getVoters( - ...args: Parameters - ): Promise { - return this.getMembers(...args); - } - - /** - * Get the join date of a given address. - */ - async getJoinDate({ - account, - atBlock, - }: { - account: ReadVoter | `0x${string}`; - atBlock?: BlockLike; - }): Promise { - const secondsTimestamp = await this.gscVaultContract.read( - "members", - { - 0: typeof account === "string" ? account : account.address, - }, - blockToReadOptions(atBlock), - ); - return secondsTimestamp ? new Date(Number(secondsTimestamp * 1000n)) : null; - } - - /** - * Get a boolean indicating whether a given voter is a current member. - */ - async getIsMember({ - account, - atBlock, - }: { - account: ReadVoter | `0x${string}`; - atBlock?: BlockLike; - }): Promise { - return !!(await this.getJoinDate({ - account, - atBlock, - })); - } - - /** - * Get the time (in MS) that a new GSC member must wait after joining before - * they can vote. - */ - getIdleDuration({ atBlock }: { atBlock?: BlockLike } = {}): Promise { - return this.gscVaultContract.read( - "idleDuration", - {}, - blockToReadOptions(atBlock), - ); - } - - /** - * Get a boolean indicating whether a member is still in the idle duration. - * Idle members cannot vote. - */ - async getIsIdle({ - account, - atBlock, - }: { - account: ReadVoter | `0x${string}`; - atBlock?: BlockLike; - }): Promise { - const joinDate = await this.getJoinDate({ - account, - atBlock, - }); - const isMember = !!joinDate; - return ( - isMember && - joinDate.getTime() + - Number( - await this.getIdleDuration({ - atBlock, - }), - ) > - Date.now() - ); - } - - /** - * Get the voting vaults a member joined with. Used to prove the member meets - * the minimum voting power requirement. - */ - async getMemberVaults({ - account, - atBlock, - }: { - account: ReadVoter | `0x${string}`; - atBlock?: BlockLike; - }): Promise { - const vaultAddresses = await this.gscVaultContract.read( - "getUserVaults", - { - who: typeof account === "string" ? account : account.address, - }, - blockToReadOptions(atBlock), - ); - return vaultAddresses.map( - (address) => - new ReadVotingVault({ - address, - contractFactory: this.contractFactory, - network: this.network, - }), - ); - } -} diff --git a/packages/council-core/src/models/votingVault/gscVault/ReadWriteGscVault.ts b/packages/council-core/src/models/votingVault/gscVault/ReadWriteGscVault.ts deleted file mode 100644 index cb4b72e8..00000000 --- a/packages/council-core/src/models/votingVault/gscVault/ReadWriteGscVault.ts +++ /dev/null @@ -1,111 +0,0 @@ -import { - CachedReadWriteContract, - ContractWriteOptions, -} from "@delvtech/evm-client"; -import { ReadWriteContractFactory } from "src/contract/factory"; -import { ReadWriteContractModelOptions } from "src/models/Model"; -import { ReadVoter } from "src/models/ReadVoter"; -import { ReadGscVault } from "src/models/votingVault/gscVault/ReadGscVault"; -import { GscVaultAbi } from "src/models/votingVault/gscVault/types"; -import { ReadVotingVault } from "src/models/votingVault/ReadVotingVault"; - -export interface ReadWriteGscVaultOptions - extends ReadWriteContractModelOptions {} - -export class ReadWriteGscVault extends ReadGscVault { - declare gscVaultContract: CachedReadWriteContract; - declare contractFactory: ReadWriteContractFactory; - - constructor(options: ReadWriteGscVaultOptions) { - super(options); - } - - /** - * Set the idle duration for a member in this GSC vault. The idle duration is - * the amount of time a member must be a member before they can vote. - * @param duration - The new idle duration in seconds. - */ - async setIdleDuration({ - duration, - options, - }: { - duration: bigint; - options?: ContractWriteOptions; - }): Promise<`0x${string}`> { - const hash = await this.gscVaultContract.write( - "setIdleDuration", - { _idleDuration: duration }, - options, - ); - this.contract.clearCache(); - return hash; - } - - /** - * Become a member of this GSC vault. - * @param vaults - The addresses of the approved vaults the joining member has - * voting power in. This is used to prove the joining member meets the - * minimum voting power requirement. If voting power is moved to a different - * vault, the member will become ineligible until they join again with the - * new vault or risk being kicked. - * @returns The transaction hash. - */ - async join({ - vaults, - extraVaultData = [], - options, - }: { - vaults: (ReadVotingVault | `0x${string}`)[]; - /** - * Extra data given to the vaults to help calculation - */ - extraVaultData?: `0x${string}`[]; - options?: ContractWriteOptions; - }): Promise<`0x${string}`> { - const vaultAddresses = vaults.map((vault) => - typeof vault === "string" ? vault : vault.address, - ); - const extraData = vaultAddresses.map((_, i) => extraVaultData[i] || "0x"); - const hash = await this.gscVaultContract.write( - "proveMembership", - { - extraData, - votingVaults: vaultAddresses, - }, - options, - ); - this.contract.clearCache(); - return hash; - } - - /** - * Remove a member that's become ineligible from this GSC vault. A member - * becomes ineligible when the voting power in the vaults they joined with - * drops below the required minimum. - * @param account - The address of the ineligible member to kick. - * @returns The transaction hash. - */ - async kick({ - account, - extraVaultData = [], - options, - }: { - account: ReadVoter | `0x${string}`; - /** - * The extra data the vaults need to load the member's voting power - */ - extraVaultData?: `0x${string}`[]; - options?: ContractWriteOptions; - }): Promise<`0x${string}`> { - const hash = await this.gscVaultContract.write( - "kick", - { - extraData: extraVaultData, - who: typeof account === "string" ? account : account.address, - }, - options, - ); - this.contract.clearCache(); - return hash; - } -} diff --git a/packages/council-core/src/models/votingVault/gscVault/types.ts b/packages/council-core/src/models/votingVault/gscVault/types.ts deleted file mode 100644 index 5c56b482..00000000 --- a/packages/council-core/src/models/votingVault/gscVault/types.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { GSCVault } from "@delvtech/council-artifacts/GSCVault"; - -export type GscVaultAbi = typeof GSCVault.abi; diff --git a/packages/council-core/src/models/votingVault/lockingVault/ReadLockingVault.test.ts b/packages/council-core/src/models/votingVault/lockingVault/ReadLockingVault.test.ts deleted file mode 100644 index a19324d0..00000000 --- a/packages/council-core/src/models/votingVault/lockingVault/ReadLockingVault.test.ts +++ /dev/null @@ -1,134 +0,0 @@ -import { NetworkStub } from "@delvtech/evm-client/stubs"; -import { ReadCouncil } from "src/models/council/ReadCouncil"; -import { LockingVaultAbi } from "src/models/votingVault/lockingVault/types"; -import { - CachedReadContractStub, - stubContractFactory, -} from "src/test/stubContractFactory"; -import { describe, expect, it } from "vitest"; - -const ALICE = "0x123"; -const BOB = "0x456"; -const CHARLIE = "0x789"; -const DAVE = "0xabc"; -const EVE = "0xdef"; - -describe("ReadLockingVault", () => { - function setupStub() { - const council = new ReadCouncil({ - contractFactory: stubContractFactory, - network: new NetworkStub(), - }); - - const lockingVault = council.lockingVault("0x"); - // The model doesn't know that the factory creates stubbed contracts. - const contractStub = - lockingVault.lockingVaultContract as CachedReadContractStub; - - return { council, lockingVault, contractStub }; - } - - it("Accurately breaks down voting power", async () => { - const { contractStub, lockingVault } = setupStub(); - - contractStub.stubEvents( - "VoteChange", - { filter: { to: undefined }, fromBlock: undefined, toBlock: undefined }, - [ - // Alice receives 100 - { - args: { - amount: 100n, - from: ALICE, - to: ALICE, - }, - eventName: "VoteChange", - }, - // Bob delegates 100 to Alice - { - args: { - amount: 100n, - from: BOB, - to: ALICE, - }, - eventName: "VoteChange", - }, - // Charlie delegates 100 to Alice - { - args: { - amount: 100n, - from: CHARLIE, - to: ALICE, - }, - eventName: "VoteChange", - }, - // Dave delegates 100 to Alice - { - args: { - amount: 100n, - from: DAVE, - to: ALICE, - }, - eventName: "VoteChange", - }, - // Eve receives 100 - { - args: { - amount: 100n, - from: EVE, - to: EVE, - }, - eventName: "VoteChange", - }, - // Bob changes his delegation of 100 from Alice to Eve - { - args: { - amount: -100n, - from: BOB, - to: ALICE, - }, - eventName: "VoteChange", - }, - { - args: { - amount: 100n, - from: BOB, - to: EVE, - }, - eventName: "VoteChange", - }, - ], - ); - - const powerBreakdown = await lockingVault.getVotingPowerBreakdown(); - - expect(powerBreakdown).toEqual([ - { - voter: expect.objectContaining({ address: ALICE }), - votingPower: 300n, - votingPowerFromAllDelegators: 200n, - votingPowerByDelegator: [ - { - voter: expect.objectContaining({ address: CHARLIE }), - votingPower: 100n, - }, - { - voter: expect.objectContaining({ address: DAVE }), - votingPower: 100n, - }, - ], - }, - { - voter: expect.objectContaining({ address: EVE }), - votingPower: 200n, - votingPowerFromAllDelegators: 100n, - votingPowerByDelegator: [ - { - voter: expect.objectContaining({ address: BOB }), - votingPower: 100n, - }, - ], - }, - ]); - }); -}); diff --git a/packages/council-core/src/models/votingVault/lockingVault/ReadLockingVault.ts b/packages/council-core/src/models/votingVault/lockingVault/ReadLockingVault.ts deleted file mode 100644 index 2fa43aa7..00000000 --- a/packages/council-core/src/models/votingVault/lockingVault/ReadLockingVault.ts +++ /dev/null @@ -1,378 +0,0 @@ -import { LockingVault } from "@delvtech/council-artifacts/LockingVault"; -import { CachedReadContract } from "@delvtech/evm-client"; -import { ReadContractModelOptions } from "src/models/Model"; -import { ReadVoter } from "src/models/ReadVoter"; -import { ReadToken } from "src/models/token/ReadToken"; -import { LockingVaultAbi } from "src/models/votingVault/lockingVault/types"; -import { ReadVotingVault } from "src/models/votingVault/ReadVotingVault"; -import { VoterPowerBreakdown } from "src/models/votingVault/types"; -import { BlockLike, blockToReadOptions } from "src/utils/blockToReadOptions"; -import { getBlockOrThrow } from "src/utils/getBlockOrThrow"; -import { getOrSet } from "src/utils/getOrSet"; - -export interface ReadLockingVaultOptions extends ReadContractModelOptions {} - -/** - * A VotingVault that gives voting power for depositing tokens. - * @category Models - */ -export class ReadLockingVault extends ReadVotingVault { - lockingVaultContract: CachedReadContract; - - constructor({ - name = "Locking Vault", - address, - contractFactory, - network, - cache, - namespace, - }: ReadLockingVaultOptions) { - super({ - address, - contractFactory, - network, - cache, - namespace, - name, - }); - this.lockingVaultContract = contractFactory({ - abi: LockingVault.abi, - address, - cache, - namespace, - }); - } - - /** - * Get the associated token for this LockingVault. - */ - async getToken(): Promise { - return new ReadToken({ - address: await this.lockingVaultContract.read("token"), - contractFactory: this.contractFactory, - network: this.network, - }); - } - - /** - * Get the amount of tokens that a given `address` has deposited into this - * vault. - */ - async getDepositedBalance({ - account, - atBlock, - }: { - account: ReadVoter | `0x${string}`; - atBlock?: BlockLike; - }): Promise { - const deposits = await this.lockingVaultContract.read( - "deposits", - { - who: typeof account === "string" ? account : account.address, - }, - blockToReadOptions(atBlock), - ); - return deposits[1]; - } - - get address(): `0x${string}` { - return this.contract.address; - } - get namespace(): string | undefined { - return this.contract.namespace; - } - - /** - * Get all participants with voting power in this vault. - * @param fromBlock - Include all voters that had power on or after this block number. - * @param toBlock - Include all voters that had power on or before this block number. - */ - async getVoters({ - fromBlock, - toBlock, - }: { - fromBlock?: BlockLike; - toBlock?: BlockLike; - } = {}): Promise { - const powerByVoter = await this._getPowerByVoter({ - fromBlock, - toBlock, - }); - return Object.keys(powerByVoter).map( - ([address]) => - new ReadVoter({ - address: address as `0x${string}`, - contractFactory: this.contractFactory, - network: this.network, - }), - ); - } - - /** - * Get all participants that have voting power in this vault along with their - * voting power, the amount of voting power being delegated to them, and the - * amount of power delegated to them by each delegator. This is a convenience - * method to fetch voting power and delegation data for a large number of - * voters in a single call. - * @param account - Get a breakdown for a specific account. - * @param fromBlock - Include all voters that had power on or after this block - * number. - * @param toBlock - Include all voters that had power on or before this block - * number. - */ - async getVotingPowerBreakdown({ - account, - fromBlock, - toBlock, - }: { - account?: `0x${string}`; - fromBlock?: BlockLike; - toBlock?: BlockLike; - } = {}): Promise { - const voteChangeEvents = await this.lockingVaultContract.getEvents( - "VoteChange", - { - filter: { - to: account, - }, - fromBlock, - toBlock, - }, - ); - - const breakdownByVoter: Record< - `0x${string}`, - { - power: bigint; - powerFromAllDelegators: bigint; - powerByDelegator: Record<`0x${string}`, bigint>; - } - > = {}; - - for (const { - args: { from, to, amount }, - } of voteChangeEvents) { - if (!breakdownByVoter[to]) { - breakdownByVoter[to] = { - power: 0n, - powerFromAllDelegators: 0n, - powerByDelegator: {}, - }; - } - - breakdownByVoter[to].power += amount; - - // ignore self-delegation - if (from !== to) { - breakdownByVoter[to].powerFromAllDelegators += amount; - breakdownByVoter[to].powerByDelegator[from] = - (breakdownByVoter[to].powerByDelegator[from] ?? 0n) + amount; - } - } - - const voterMap = new Map<`0x${string}`, ReadVoter>(); - - return Object.entries(breakdownByVoter) - .filter(([, { power }]) => power > 0) - .map( - ([_address, { power, powerByDelegator, powerFromAllDelegators }]) => { - const address = _address as `0x${string}`; - - const voter = getOrSet({ - key: address, - cache: voterMap, - callback: () => - new ReadVoter({ - address, - contractFactory: this.contractFactory, - network: this.network, - }), - }); - - const votingPowerByDelegator = Object.entries(powerByDelegator) - .filter(([, votingPower]) => votingPower > 0n) - .map(([_address, votingPower]) => { - const address = _address as `0x${string}`; - const voter = getOrSet({ - key: address, - cache: voterMap, - callback: () => - new ReadVoter({ - address, - contractFactory: this.contractFactory, - network: this.network, - }), - }); - return { - voter, - votingPower, - }; - }); - - return { - voter, - votingPower: power, - votingPowerFromAllDelegators: powerFromAllDelegators, - votingPowerByDelegator, - }; - }, - ); - } - - /** - * Get the number of blocks before the delegation history is forgotten. Voting - * power from this vault can't be used on proposals that are older than the - * stale block lag. - */ - getStaleBlockLag(): Promise { - return this.lockingVaultContract.read("staleBlockLag"); - } - - /** - * Get the voting power for a given address at a given block without - * accounting for the stale block lag. - */ - async getHistoricalVotingPower({ - account, - atBlock, - }: { - account: `0x${string}`; - atBlock?: BlockLike; - }): Promise { - let blockNumber = atBlock; - - if (typeof blockNumber !== "bigint") { - const block = await getBlockOrThrow(this.network, atBlock); - blockNumber = block.blockNumber ?? undefined; - } - - if (blockNumber === undefined) { - return 0n; - } - - return this.lockingVaultContract.read("queryVotePowerView", { - user: account, - blockNumber, - }); - } - - /** - * Get the sum of voting power held by all voters in this vault. - * @param atBlock - Get the total held at this block number. - */ - async getTotalVotingPower({ - atBlock, - }: { - atBlock?: BlockLike; - } = {}): Promise { - const powerByVoter = await this._getPowerByVoter({ - toBlock: atBlock, - }); - return Object.values(powerByVoter).reduce((sum, power) => sum + power, 0n); - } - - /** - * Get the current delegate of a given account. - */ - async getDelegate({ - account, - atBlock, - }: { - account: `0x${string}`; - atBlock?: BlockLike; - }): Promise { - const { 0: address } = await this.lockingVaultContract.read( - "deposits", - { - who: account, - }, - blockToReadOptions(atBlock), - ); - return new ReadVoter({ - address, - contractFactory: this.contractFactory, - network: this.network, - }); - } - - /** - * Get all voters delegated to a given account in this vault. - */ - async getDelegatorsTo({ - account, - atBlock, - }: { - account: `0x${string}`; - atBlock?: BlockLike; - }): Promise { - let toBlock = atBlock; - - if (typeof toBlock !== "bigint") { - const { blockNumber } = await getBlockOrThrow(this.network, toBlock); - toBlock = blockNumber ?? undefined; - } - - const voteChangeEvents = await this.lockingVaultContract.getEvents( - "VoteChange", - { - filter: { - to: account, - }, - toBlock, - }, - ); - - const powerByDelegators: Record<`0x${string}`, bigint> = {}; - for (const { - args: { from, amount }, - } of voteChangeEvents) { - // ignore self-delegation - if (from !== account) { - powerByDelegators[from] = (powerByDelegators[from] ?? 0n) + amount; - } - } - - return Object.entries(powerByDelegators) - .filter(([, power]) => power > 0) - .map( - ([address]) => - new ReadVoter({ - address: address as `0x${string}`, - contractFactory: this.contractFactory, - network: this.network, - }), - ); - } - - private async _getPowerByVoter({ - account, - fromBlock, - toBlock, - }: { - account?: `0x${string}`; - fromBlock?: BlockLike; - toBlock?: BlockLike; - } = {}): Promise> { - const voteChangeEvents = await this.lockingVaultContract.getEvents( - "VoteChange", - { - filter: { - to: account, - }, - fromBlock, - toBlock, - }, - ); - - const powerByVoter: Record<`0x${string}`, bigint> = {}; - for (const { - args: { to, amount }, - } of voteChangeEvents) { - powerByVoter[to] = (powerByVoter[to] ?? 0n) + amount; - } - - return Object.fromEntries( - Object.entries(powerByVoter).filter(([, power]) => power > 0n), - ); - } -} diff --git a/packages/council-core/src/models/votingVault/lockingVault/ReadWriteLockingVault.ts b/packages/council-core/src/models/votingVault/lockingVault/ReadWriteLockingVault.ts deleted file mode 100644 index 21e4db07..00000000 --- a/packages/council-core/src/models/votingVault/lockingVault/ReadWriteLockingVault.ts +++ /dev/null @@ -1,111 +0,0 @@ -import { - CachedReadWriteContract, - ContractWriteOptions, -} from "@delvtech/evm-client"; -import { ReadWriteContractFactory } from "src/contract/factory"; -import { ReadWriteContractModelOptions } from "src/models/Model"; -import { ReadWriteToken } from "src/models/token/ReadWriteToken"; -import { ReadLockingVault } from "src/models/votingVault/lockingVault/ReadLockingVault"; -import { LockingVaultAbi } from "src/models/votingVault/lockingVault/types"; - -export interface ReadWriteLockingVaultOptions - extends ReadWriteContractModelOptions {} - -export class ReadWriteLockingVault extends ReadLockingVault { - declare lockingVaultContract: CachedReadWriteContract; - declare contractFactory: ReadWriteContractFactory; - - constructor(options: ReadWriteLockingVaultOptions) { - super(options); - } - - override async getToken(): Promise { - return new ReadWriteToken({ - address: await this.lockingVaultContract.read("token"), - contractFactory: this.contractFactory, - network: this.network, - }); - } - - /** - * Change current delegate. - * @param delegate - The address to delegate to. - * @returns The transaction hash. - */ - async changeDelegate({ - delegate, - options, - }: { - delegate: `0x${string}`; - options?: ContractWriteOptions; - }): Promise<`0x${string}`> { - const hash = await this.lockingVaultContract.write( - "changeDelegation", - { newDelegate: delegate }, - options, - ); - this.contract.clearCache(); - return hash; - } - - /** - * Deposit tokens into this vault. - * @param account - The address to credit this deposit to. Defaults to the - * signer's address. - * @param amount - The amount of tokens to deposit. (formatted decimal string) - * @param firstDelegate - The address to delegate the resulting voting power - * to if the account doesn't already have a delegate. Defaults to funded - * account being credited. - * @returns The transaction hash. - */ - async deposit({ - account, - amount, - firstDelegate, - options, - }: { - account?: `0x${string}`; - amount: bigint; - firstDelegate?: `0x${string}`; - options?: ContractWriteOptions; - }): Promise<`0x${string}`> { - const fundedAccount = - account ?? (await this.lockingVaultContract.getSignerAddress()); - const hash = await this.lockingVaultContract.write( - "deposit", - { - amount, - fundedAccount, - firstDelegation: firstDelegate ?? fundedAccount, - }, - options, - ); - this.contract.clearCache(); - const token = await this.getToken(); - token.contract.clearCache(); - return hash; - } - - /** - * Withdraw tokens from this vault. - * @param amount - The amount of tokens to withdraw. (formatted decimal string) - * @returns The transaction hash. - */ - async withdraw({ - amount, - options, - }: { - amount: bigint; - options?: ContractWriteOptions; - }): Promise<`0x${string}`> { - const hash = await this.lockingVaultContract.write( - "withdraw", - { amount }, - options, - ); - this.contract.clearCache(); - const token = await this.getToken(); - token.contract.clearCache(); - return hash; - } -} diff --git a/packages/council-core/src/models/votingVault/lockingVault/types.ts b/packages/council-core/src/models/votingVault/lockingVault/types.ts deleted file mode 100644 index 8e2b1800..00000000 --- a/packages/council-core/src/models/votingVault/lockingVault/types.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { LockingVault } from "@delvtech/council-artifacts/LockingVault"; - -export type LockingVaultAbi = typeof LockingVault.abi; diff --git a/packages/council-core/src/models/votingVault/types.ts b/packages/council-core/src/models/votingVault/types.ts deleted file mode 100644 index d06c9fd5..00000000 --- a/packages/council-core/src/models/votingVault/types.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { IVotingVault } from "@delvtech/council-artifacts/IVotingVault"; -import { ReadVoter } from "src/models/ReadVoter"; - -export type VotingVaultAbi = typeof IVotingVault.abi; - -export interface VoterWithPower { - voter: ReadVoter; - votingPower: bigint; -} - -export interface VoterPowerBreakdown extends VoterWithPower { - /** - * The total voting power from all wallets delegated to this voter. Does not - * include self-delegation. - */ - votingPowerFromAllDelegators: bigint; - /** - * All wallets delegated to this voter with the power they're delegating. Does - * not include self-delegation. - */ - votingPowerByDelegator: VoterWithPower[]; -} diff --git a/packages/council-core/src/models/votingVault/vestingVault/ReadVestingVault.ts b/packages/council-core/src/models/votingVault/vestingVault/ReadVestingVault.ts deleted file mode 100644 index 7779067f..00000000 --- a/packages/council-core/src/models/votingVault/vestingVault/ReadVestingVault.ts +++ /dev/null @@ -1,438 +0,0 @@ -import { VestingVault } from "@delvtech/council-artifacts/VestingVault"; -import { CachedReadContract } from "@delvtech/evm-client"; -import Big from "big.js"; -import { ReadContractModelOptions } from "src/models/Model"; -import { ReadVoter } from "src/models/ReadVoter"; -import { ReadToken } from "src/models/token/ReadToken"; -import { ReadVotingVault } from "src/models/votingVault/ReadVotingVault"; -import { VoterPowerBreakdown } from "src/models/votingVault/types"; -import { - Grant, - VestingVaultAbi, -} from "src/models/votingVault/vestingVault/types"; -import { BlockLike, blockToReadOptions } from "src/utils/blockToReadOptions"; -import { getBlockOrThrow } from "src/utils/getBlockOrThrow"; -import { getOrSet } from "src/utils/getOrSet"; - -export interface ReadVestingVaultOptions extends ReadContractModelOptions {} - -/** - * A VotingVault that gives voting power for receiving grants and applies a - * multiplier on unvested tokens to reduce their voting power. - * @category Models - */ -export class ReadVestingVault extends ReadVotingVault { - vestingVaultContract: CachedReadContract; - - constructor({ - name = "Vesting Vault", - address, - contractFactory, - network, - cache, - namespace, - }: ReadVestingVaultOptions) { - super({ - address, - contractFactory, - network, - cache, - namespace, - name, - }); - this.vestingVaultContract = contractFactory({ - abi: VestingVault.abi, - address, - cache, - namespace, - }); - } - - get address(): `0x${string}` { - return this.contract.address; - } - get namespace(): string | undefined { - return this.contract.namespace; - } - - /** - * Get this vault's token. - */ - async getToken(): Promise { - return new ReadToken({ - address: await this.vestingVaultContract.read("token"), - contractFactory: this.contractFactory, - network: this.network, - }); - } - - /** - * Get this vault's unvested multiplier, a number that represents the voting - * power of each unvested token as a percentage of a vested token. For example - * if unvested tokens have 50% voting power compared to vested ones, this - * value would be 50. - */ - getUnvestedMultiplier({ - atBlock, - }: { atBlock?: BlockLike } = {}): Promise { - return this.vestingVaultContract.read( - "unvestedMultiplier", - undefined, - blockToReadOptions(atBlock), - ); - } - - /** - * Get the grant data for a given address. - */ - getGrant({ - account, - atBlock, - }: { - account: ReadVoter | `0x${string}`; - atBlock?: BlockLike; - }): Promise { - return this.vestingVaultContract.read( - "getGrant", - { - _who: typeof account === "string" ? account : account.address, - }, - blockToReadOptions(atBlock), - ); - } - - /** - * Gets the amount of tokens currently claimable from the grant. - * Mimics internal function https://github.com/delvtech/council/blob/main/contracts/vaults/VestingVault.sol#L434 - * @param account - The grantee account address. - * @returns The amount of claimable tokens. - */ - async getWithdrawableAmount({ - account, - atBlock, - }: { - account: ReadVoter | `0x${string}`; - atBlock?: BlockLike; - }): Promise { - let blockNumber = atBlock; - - if (typeof blockNumber !== "bigint") { - const block = await getBlockOrThrow(this.network, blockNumber); - if (block.blockNumber === null) { - return 0n; - } - blockNumber = block.blockNumber; - } - - const { allocation, created, cliff, expiration, withdrawn } = - await this.getGrant({ - account: account, - atBlock, - }); - - // funds are not unlocked - if (blockNumber < cliff) { - return 0n; - } - - // all funds are claimable - if (blockNumber >= expiration) { - return allocation - withdrawn; - } - - const blocksSinceCreated = blockNumber - created; - const grantDuration = expiration - created; - const amount = Big(String(allocation)) - .mul(String(blocksSinceCreated)) - .div(String(grantDuration)); - - return BigInt(amount.toFixed()) - withdrawn; - } - - /** - * Get all participants that have voting power in this vault. - * @param fromBlock - Include all voters that had power on or after this block number. - * @param toBlock - Include all voters that had power on or before this block number. - */ - async getVoters({ - fromBlock, - toBlock, - }: { - fromBlock?: BlockLike; - toBlock?: BlockLike; - } = {}): Promise { - const powerByVoter = await this._getPowerByVoter({ - fromBlock, - toBlock, - }); - return Object.keys(powerByVoter).map( - (address) => - new ReadVoter({ - address: address as `0x${string}`, - contractFactory: this.contractFactory, - network: this.network, - }), - ); - } - - /** - * Get all participants that have voting power in this vault along with their - * voting power, the amount of voting power being delegated to them, and the - * amount of power delegated to them by each delegator. This is a convenience - * method to fetch voting power and delegation data for a large number of - * voters in a single call. - * @param account - Get a breakdown for a specific account. - * @param fromBlock - Include all voters that had power on or after this block - * number. - * @param toBlock - Include all voters that had power on or before this block - * number. - */ - async getVotingPowerBreakdown({ - account, - fromBlock, - toBlock, - }: { - account?: `0x${string}`; - fromBlock?: BlockLike; - toBlock?: BlockLike; - } = {}): Promise { - // const breakdownByVoter = await this._getPowerBreakdownByVoter(options); - const voteChangeEvents = await this.vestingVaultContract.getEvents( - "VoteChange", - { - filter: { - to: account, - }, - fromBlock, - toBlock, - }, - ); - - const breakdownByVoter: Record< - `0x${string}`, - { - power: bigint; - powerFromAllDelegators: bigint; - powerByDelegator: Record<`0x${string}`, bigint>; - } - > = {}; - - for (const { - args: { from, to, amount }, - } of voteChangeEvents) { - if (!breakdownByVoter[to]) { - breakdownByVoter[to] = { - power: 0n, - powerFromAllDelegators: 0n, - powerByDelegator: {}, - }; - } - - breakdownByVoter[to].power += amount; - - // ignore self-delegation - if (from !== to) { - breakdownByVoter[to].powerFromAllDelegators += amount; - breakdownByVoter[to].powerByDelegator[from] = - (breakdownByVoter[to].powerByDelegator[from] ?? 0n) + amount; - } - } - - const voterMap = new Map<`0x${string}`, ReadVoter>(); - - return Object.entries(breakdownByVoter) - .filter(([, { power }]) => power > 0) - .map( - ([_address, { power, powerByDelegator, powerFromAllDelegators }]) => { - const address = _address as `0x${string}`; - - const voter = getOrSet({ - key: address, - cache: voterMap, - callback: () => - new ReadVoter({ - address, - contractFactory: this.contractFactory, - network: this.network, - }), - }); - - const votingPowerByDelegator = Object.entries(powerByDelegator) - .filter(([, votingPower]) => votingPower > 0n) - .map(([_address, votingPower]) => { - const address = _address as `0x${string}`; - const voter = getOrSet({ - key: address, - cache: voterMap, - callback: () => - new ReadVoter({ - address, - contractFactory: this.contractFactory, - network: this.network, - }), - }); - return { - voter, - votingPower, - }; - }); - - return { - voter, - votingPower: power, - votingPowerFromAllDelegators: powerFromAllDelegators, - votingPowerByDelegator, - }; - }, - ); - } - - /** - * Get the number of blocks before the delegation history is forgotten. Voting - * power from this vault can't be used on proposals that are older than the - * stale block lag. - */ - getStaleBlockLag(): Promise { - return this.vestingVaultContract.read("staleBlockLag"); - } - - /** - * Get the voting power for a given address at a given block without - * accounting for the stale block lag. - * @param account - * @param atBlock - * @returns The historical voting power of the given address. - */ - async getHistoricalVotingPower({ - account, - atBlock, - }: { - account: ReadVoter | `0x${string}`; - atBlock?: BlockLike; - }): Promise { - let blockNumber = atBlock; - - if (typeof blockNumber !== "bigint") { - const block = await getBlockOrThrow(this.network, blockNumber); - if (block.blockNumber === null) { - return 0n; - } - blockNumber = block.blockNumber; - } - - return this.vestingVaultContract.read("queryVotePowerView", { - user: typeof account === "string" ? account : account.address, - blockNumber, - }); - } - - /** - * Get the sum of voting power held by all voters in this vault. - * @param atBlock - Get the total held at this block number. - */ - async getTotalVotingPower({ - atBlock, - }: { - atBlock?: BlockLike; - } = {}): Promise { - const powerByVoter = await this._getPowerByVoter({ - toBlock: atBlock, - }); - return Object.values(powerByVoter).reduce((sum, power) => sum + power, 0n); - } - - /** - * Get the current delegate of a given account. - */ - async getDelegate({ - account, - atBlock, - }: { - account: ReadVoter | `0x${string}`; - atBlock?: BlockLike; - }): Promise { - const { delegatee } = await this.getGrant({ - account, - atBlock, - }); - return new ReadVoter({ - address: delegatee, - contractFactory: this.contractFactory, - network: this.network, - }); - } - - /** - * Get all voters delegated to a given address in this vault. - */ - async getDelegatorsTo({ - account, - atBlock, - }: { - account: `0x${string}`; - atBlock?: BlockLike; - }): Promise { - const voteChangeEvents = await this.vestingVaultContract.getEvents( - "VoteChange", - { - filter: { - to: account, - }, - toBlock: atBlock, - }, - ); - - const powerByDelegators: Record<`0x${string}`, bigint> = {}; - for (const { - args: { from, amount }, - } of voteChangeEvents) { - // ignore self-delegation - if (from !== account) { - powerByDelegators[from] = (powerByDelegators[from] ?? 0n) + amount; - } - } - - return Object.entries(powerByDelegators) - .filter(([, power]) => power > 0) - .map( - ([address]) => - new ReadVoter({ - address: address as `0x${string}`, - contractFactory: this.contractFactory, - network: this.network, - }), - ); - } - - private async _getPowerByVoter({ - address, - fromBlock, - toBlock, - }: { - address?: `0x${string}`; - fromBlock?: BlockLike; - toBlock?: BlockLike; - } = {}): Promise> { - const voteChangeEvents = await this.vestingVaultContract.getEvents( - "VoteChange", - { - filter: { - to: address, - }, - fromBlock, - toBlock, - }, - ); - - const powerByVoter: Record<`0x${string}`, bigint> = {}; - for (const { - args: { to, amount }, - } of voteChangeEvents) { - powerByVoter[to] = (powerByVoter[to] ?? 0n) + amount; - } - - return Object.fromEntries( - Object.entries(powerByVoter).filter(([, power]) => power > 0n), - ); - } -} diff --git a/packages/council-core/src/models/votingVault/vestingVault/ReadWriteVestingVault.ts b/packages/council-core/src/models/votingVault/vestingVault/ReadWriteVestingVault.ts deleted file mode 100644 index 60d2208c..00000000 --- a/packages/council-core/src/models/votingVault/vestingVault/ReadWriteVestingVault.ts +++ /dev/null @@ -1,72 +0,0 @@ -import { - CachedReadWriteContract, - ContractWriteOptions, -} from "@delvtech/evm-client"; -import { ReadWriteContractFactory } from "src/contract/factory"; -import { ReadWriteContractModelOptions } from "src/models/Model"; -import { ReadWriteToken } from "src/models/token/ReadWriteToken"; -import { ReadVestingVault } from "src/models/votingVault/vestingVault/ReadVestingVault"; -import { VestingVaultAbi } from "src/models/votingVault/vestingVault/types"; - -interface ReadWriteVestingVaultOptions extends ReadWriteContractModelOptions {} - -export class ReadWriteVestingVault extends ReadVestingVault { - declare vestingVaultContract: CachedReadWriteContract; - declare contractFactory: ReadWriteContractFactory; - - constructor(options: ReadWriteVestingVaultOptions) { - super(options); - } - - override async getToken(): Promise { - return new ReadWriteToken({ - address: await this.vestingVaultContract.read("token"), - contractFactory: this.contractFactory, - network: this.network, - }); - } - - /** - * Change current delegate. - * @param delegate - The address to delegate to. Defaults to the signer's - * address. - * @returns The transaction hash. - */ - async changeDelegate({ - delegate, - options, - }: { - delegate: `0x${string}`; - options?: ContractWriteOptions; - }): Promise<`0x${string}`> { - const hash = await this.vestingVaultContract.write( - "delegate", - { - _to: delegate, - }, - options, - ); - this.contract.clearCache(); - return hash; - } - - /** - * Claim a grant and withdraw the tokens. - * @returns The transaction hash. - */ - async claim({ - options, - }: { - options?: ContractWriteOptions; - } = {}): Promise<`0x${string}`> { - const hash = await this.vestingVaultContract.write( - "claim", - undefined, - options, - ); - const token = await this.getToken(); - token.contract.clearCache(); - this.contract.clearCache(); - return hash; - } -} diff --git a/packages/council-core/src/models/votingVault/vestingVault/types.ts b/packages/council-core/src/models/votingVault/vestingVault/types.ts deleted file mode 100644 index 373ebd0d..00000000 --- a/packages/council-core/src/models/votingVault/vestingVault/types.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { VestingVault } from "@delvtech/council-artifacts/VestingVault"; -import { FunctionReturn } from "@delvtech/evm-client"; - -export type VestingVaultAbi = typeof VestingVault.abi; -export type Grant = FunctionReturn; diff --git a/packages/council-core/src/test/stubContractFactory.ts b/packages/council-core/src/test/stubContractFactory.ts deleted file mode 100644 index 444596c7..00000000 --- a/packages/council-core/src/test/stubContractFactory.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { - CachedReadContract, - createCachedReadContract, -} from "@delvtech/evm-client"; -import { ReadContractStub } from "@delvtech/evm-client/stubs"; -import { Abi } from "abitype"; -import { ContractFactoryOptions } from "src/exports"; -import { Prettify } from "src/types"; - -/** - * A cached read contract combined with a read contract stub. - */ -export type CachedReadContractStub = Prettify< - CachedReadContract & ReadContractStub ->; - -/** - * A factory for creating cached read contract stubs. - */ -export function stubContractFactory({ - abi, -}: ContractFactoryOptions): CachedReadContractStub { - return createCachedReadContract({ - contract: new ReadContractStub(abi), - }) as CachedReadContractStub; -} diff --git a/packages/council-core/src/types.ts b/packages/council-core/src/types.ts deleted file mode 100644 index 0719b023..00000000 --- a/packages/council-core/src/types.ts +++ /dev/null @@ -1,3 +0,0 @@ -export type Prettify = { - [K in keyof T]: T[K]; -} & unknown; diff --git a/packages/council-core/src/utils/blockToReadOptions.ts b/packages/council-core/src/utils/blockToReadOptions.ts deleted file mode 100644 index eb4de138..00000000 --- a/packages/council-core/src/utils/blockToReadOptions.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { BlockTag, ContractReadOptions } from "@delvtech/evm-client"; - -export type BlockLike = BlockTag | bigint; - -export function blockToReadOptions( - block?: BlockLike, -): ContractReadOptions | undefined { - switch (typeof block) { - case "bigint": - return { - blockNumber: block, - }; - - case "string": - return { - blockTag: block, - }; - - default: - return undefined; - } -} diff --git a/packages/council-core/src/utils/formatUnits.ts b/packages/council-core/src/utils/formatUnits.ts deleted file mode 100644 index 08a7b2f6..00000000 --- a/packages/council-core/src/utils/formatUnits.ts +++ /dev/null @@ -1,5 +0,0 @@ -import Big from "big.js"; - -export function formatUnits(value: number | bigint, decimals: number): string { - return Big(String(value)).div(Big(10).pow(decimals)).toFixed(decimals); -} diff --git a/packages/council-core/src/utils/getBlockOrThrow.ts b/packages/council-core/src/utils/getBlockOrThrow.ts deleted file mode 100644 index b8704264..00000000 --- a/packages/council-core/src/utils/getBlockOrThrow.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { Block, Network } from "@delvtech/evm-client"; -import { BlockNotFoundError } from "src/errors/BlockNotFound"; -import { BlockLike, blockToReadOptions } from "src/utils/blockToReadOptions"; - -/** - * A utility that tries to fetch a block from a given network and throws an - * error if no block is found. - * @throws `BlockNotFoundError` - */ -export async function getBlockOrThrow( - network: Network, - block?: BlockLike, -): Promise { - const fetched = await network.getBlock(blockToReadOptions(block)); - if (!fetched) { - throw new BlockNotFoundError(block); - } - return fetched; -} diff --git a/packages/council-core/src/utils/getEventsWithSplitAndRetry.ts b/packages/council-core/src/utils/getEventsWithSplitAndRetry.ts deleted file mode 100644 index d45eae8d..00000000 --- a/packages/council-core/src/utils/getEventsWithSplitAndRetry.ts +++ /dev/null @@ -1,104 +0,0 @@ -import { - ContractGetEventsOptions, - Event, - EventName, - Network, - ReadContract, -} from "@delvtech/evm-client"; -import { Abi } from "abitype"; - -/** - * Fetch events from a contract, splitting the range of blocks in half and - * sending 2 smaller requests if the original request fails. This repeats - * until the attempts are exhausted. - */ -export async function getEventsWithSplitAndRetry< - TAbi extends Abi, - TEventName extends EventName, ->({ - eventName, - contract, - network, - attemptsLeft, - options, -}: { - eventName: TEventName; - contract: ReadContract; - network: Network; - attemptsLeft: number; - options?: ContractGetEventsOptions; -}): Promise[]> { - if (attemptsLeft <= 0) { - throw new Error(`Max attempts reached for fetching events: ${eventName}`); - } - - return contract.getEvents(eventName, options).catch(async (error) => { - let fromBlock = options?.fromBlock; - let toBlock = options?.toBlock; - - // Unable to make ranges with these blocks - if (typeof fromBlock === "string" && fromBlock !== "earliest") { - throw new Error( - `Unable to split block range with fromBlock: ${fromBlock}, for event: ${eventName}\n\n${error.message}`, - ); - } - if (typeof toBlock === "string" && toBlock === "earliest") { - throw new Error( - `Unable to split block range with toBlock: ${toBlock}, for event: ${eventName}\n\n${error.message}`, - ); - } - - // Set default values for fromBlock and toBlock - if (typeof fromBlock !== "bigint") { - fromBlock = 0n; - } - if (typeof toBlock !== "bigint") { - const block = await network.getBlock(); - if (!block?.blockNumber) { - throw new Error( - `Unable to get latest block for event: ${eventName}\n\n${error.message}`, - ); - } - toBlock = block.blockNumber; - } - - // No range to split - if (fromBlock === toBlock) { - throw error; - } - - const middleBlock = (fromBlock + toBlock) / 2n; - - console.warn("Failed to fetch events:", { - address: contract.address, - eventName, - options, - attemptsLeft, - }); - - const firstHalf = await getEventsWithSplitAndRetry({ - eventName, - contract, - network, - options: { - ...options, - fromBlock, - toBlock: middleBlock, - }, - attemptsLeft: attemptsLeft - 1, - }); - const secondHalf = await getEventsWithSplitAndRetry({ - eventName, - contract, - network, - options: { - ...options, - fromBlock: middleBlock + 1n, - toBlock, - }, - attemptsLeft: attemptsLeft - 1, - }); - - return firstHalf.concat(secondHalf); - }); -} diff --git a/packages/council-core/src/utils/getOrSet.ts b/packages/council-core/src/utils/getOrSet.ts deleted file mode 100644 index 32369d70..00000000 --- a/packages/council-core/src/utils/getOrSet.ts +++ /dev/null @@ -1,16 +0,0 @@ -export function getOrSet({ - cache, - callback, - key, -}: { - key: string; - cache: Map; - callback: () => TValue; -}): TValue { - if (cache.has(key)) { - return cache.get(key)!; - } - const value = callback(); - cache.set(key, value); - return value; -} diff --git a/packages/council-core/src/utils/getVaultsWithPower.ts b/packages/council-core/src/utils/getVaultsWithPower.ts deleted file mode 100644 index 8c355390..00000000 --- a/packages/council-core/src/utils/getVaultsWithPower.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { ReadVotingVault } from "src/models/votingVault/ReadVotingVault"; - - -export async function getVaultsWithPower( - account: `0x${string}`, - vaults: ReadVotingVault[], -): Promise { - const vaultsWithPower: ReadVotingVault[] = []; - - for (const vault of vaults) { - // Some vaults may throw an error when voting power is zero or cannot find - // found. The catch block ensures this does not interrupt any voting flows. - const votingPower = await vault.getVotingPower({ account: account }).catch(() => 0n); - - if (votingPower > 0n) { - vaultsWithPower.push(vault); - } - } - - return vaultsWithPower; -} diff --git a/packages/council-core/tsup.config.ts b/packages/council-core/tsup.config.ts deleted file mode 100644 index b8aa555c..00000000 --- a/packages/council-core/tsup.config.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { defineConfig } from "tsup"; - -export default defineConfig({ - // Splitting the entry points in foundational packages like this makes it - // easier for wrapper packages to re-export `*` from some entry points and - // specific exports from others that it needs to augment or modify. - // Otherwise, if the wrapper package overwrites any of the exports, it would - // have to re-export all of the foundational package's exports individually. - entry: [ - "src/exports/index.ts", - "src/exports/airdrop.ts", - "src/exports/council.ts", - "src/exports/errors.ts", - "src/exports/contract.ts", - "src/exports/model.ts", - "src/exports/proposal.ts", - "src/exports/token.ts", - "src/exports/utils.ts", - "src/exports/vaults.ts", - "src/exports/vote.ts", - "src/exports/voter.ts", - "src/exports/voting.ts", - ], - format: ["esm"], - sourcemap: true, - dts: true, - clean: true, - minify: true, - shims: true, - cjsInterop: true, -}); diff --git a/packages/council-core/vitest.config.ts b/packages/council-core/vitest.config.ts deleted file mode 100644 index 430cf4b6..00000000 --- a/packages/council-core/vitest.config.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { defineConfig } from "vitest/config"; - -export default defineConfig({ - test: { - alias: { - "src/": "/src/", - }, - coverage: { - // get coverage for all of source except the example dir - include: ["./src/{!(example),}/**/*.ts"] - } - }, -}); diff --git a/packages/council-ethers/.eslintrc b/packages/council-ethers/.eslintrc deleted file mode 100644 index f533fc62..00000000 --- a/packages/council-ethers/.eslintrc +++ /dev/null @@ -1,4 +0,0 @@ -{ - "root": true, - "extends": ["@council/eslint-config"] -} diff --git a/packages/council-ethers/.gitignore b/packages/council-ethers/.gitignore deleted file mode 100644 index db4c6d9b..00000000 --- a/packages/council-ethers/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -dist -node_modules \ No newline at end of file diff --git a/packages/council-ethers/CHANGELOG.md b/packages/council-ethers/CHANGELOG.md deleted file mode 100644 index f58d3e42..00000000 --- a/packages/council-ethers/CHANGELOG.md +++ /dev/null @@ -1,32 +0,0 @@ -# @delvtech/council-ethers - -## 0.1.0 - -### Minor Changes - -- e742438: Updated license to AGPL-3.0 - -### Patch Changes - -- Updated dependencies [e742438] - - @delvtech/council-core@0.1.0 - -## 0.0.3 - -### Patch Changes - -- @delvtech/council-core@0.0.3 - -## 0.0.2 - -### Patch Changes - -- @delvtech/council-core@0.0.2 - -## 0.0.1 - -### Patch Changes - -- abebf3c: Initial release 🚀 -- Updated dependencies [abebf3c] - - @delvtech/council-core@0.0.1 diff --git a/packages/council-ethers/LICENSE b/packages/council-ethers/LICENSE deleted file mode 100644 index 0ad25db4..00000000 --- a/packages/council-ethers/LICENSE +++ /dev/null @@ -1,661 +0,0 @@ - GNU AFFERO GENERAL PUBLIC LICENSE - Version 3, 19 November 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU Affero General Public License is a free, copyleft license for -software and other kinds of works, specifically designed to ensure -cooperation with the community in the case of network server software. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -our General Public Licenses are intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - Developers that use our General Public Licenses protect your rights -with two steps: (1) assert copyright on the software, and (2) offer -you this License which gives you legal permission to copy, distribute -and/or modify the software. - - A secondary benefit of defending all users' freedom is that -improvements made in alternate versions of the program, if they -receive widespread use, become available for other developers to -incorporate. Many developers of free software are heartened and -encouraged by the resulting cooperation. However, in the case of -software used on network servers, this result may fail to come about. -The GNU General Public License permits making a modified version and -letting the public access it on a server without ever releasing its -source code to the public. - - The GNU Affero General Public License is designed specifically to -ensure that, in such cases, the modified source code becomes available -to the community. It requires the operator of a network server to -provide the source code of the modified version running there to the -users of that server. Therefore, public use of a modified version, on -a publicly accessible server, gives the public access to the source -code of the modified version. - - An older license, called the Affero General Public License and -published by Affero, was designed to accomplish similar goals. This is -a different license, not a version of the Affero GPL, but Affero has -released a new version of the Affero GPL which permits relicensing under -this license. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU Affero General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Remote Network Interaction; Use with the GNU General Public License. - - Notwithstanding any other provision of this License, if you modify the -Program, your modified version must prominently offer all users -interacting with it remotely through a computer network (if your version -supports such interaction) an opportunity to receive the Corresponding -Source of your version by providing access to the Corresponding Source -from a network server at no charge, through some standard or customary -means of facilitating copying of software. This Corresponding Source -shall include the Corresponding Source for any work covered by version 3 -of the GNU General Public License that is incorporated pursuant to the -following paragraph. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the work with which it is combined will remain governed by version -3 of the GNU General Public License. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU Affero General Public License from time to time. Such new versions -will be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU Affero General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU Affero General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU Affero General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published - by the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If your software can interact with users remotely through a computer -network, you should also make sure that it provides a way for users to -get its source. For example, if your program is a web application, its -interface could display a "Source" link that leads users to an archive -of the code. There are many ways you could offer source, and different -solutions will be better for different programs; see section 13 for the -specific requirements. - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU AGPL, see -. diff --git a/packages/council-ethers/README.md b/packages/council-ethers/README.md deleted file mode 100644 index 2d1963d6..00000000 --- a/packages/council-ethers/README.md +++ /dev/null @@ -1 +0,0 @@ -# Viem integrations for the @delvtech/evm-client diff --git a/packages/council-ethers/package.json b/packages/council-ethers/package.json deleted file mode 100644 index 4bcf890e..00000000 --- a/packages/council-ethers/package.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "name": "@delvtech/council-ethers", - "version": "0.1.0", - "license": "AGPL-3.0", - "type": "module", - "main": "dist/index.js", - "types": "dist/index.d.ts", - "exports": { - ".": { - "types": "./dist/index.d.ts", - "default": "./dist/index.js" - } - }, - "scripts": { - "build": "tsup", - "watch": "tsup --watch", - "typecheck": "tsc --noEmit" - }, - "peerDependencies": { - "ethers": ">=6" - }, - "dependencies": { - "@delvtech/council-core": "0.1.0", - "@delvtech/evm-client-ethers": "^0.5.1" - }, - "devDependencies": { - "@council/eslint-config": "*", - "@council/tsconfig": "*", - "ethers": "^6.13.1", - "tsup": "^8.0.2", - "typescript": "^5.3.3" - }, - "publishConfig": { - "access": "public" - }, - "files": [ - "dist" - ] -} diff --git a/packages/council-ethers/src/contract/createReadContractFactory.ts b/packages/council-ethers/src/contract/createReadContractFactory.ts deleted file mode 100644 index 856b11f6..00000000 --- a/packages/council-ethers/src/contract/createReadContractFactory.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { - ReadContractFactory, - extendReadContract, -} from "@delvtech/council-core"; -import { - SimpleCache, - createNetwork, - createReadContract, -} from "@delvtech/evm-client-ethers"; -import { Provider } from "ethers"; - -export interface CreateReadContractFactoryOptions { - provider: Provider; - cache?: SimpleCache; - namespace?: string; -} - -export function createReadContractFactory( - factoryOptions: CreateReadContractFactoryOptions, -): ReadContractFactory { - return (instanceOptions) => { - const options = { - ...factoryOptions, - ...instanceOptions, - }; - - const viemReadContract = createReadContract({ - abi: options.abi, - address: options.address, - provider: options.provider, - }); - - const viemNetwork = createNetwork(options.provider); - - // Adds custom event fetching logic to the base contract before caching. - return extendReadContract({ - ...options, - contract: viemReadContract, - network: viemNetwork, - }); - }; -} diff --git a/packages/council-ethers/src/contract/createReadWriteContractFactory.ts b/packages/council-ethers/src/contract/createReadWriteContractFactory.ts deleted file mode 100644 index 91ebacb5..00000000 --- a/packages/council-ethers/src/contract/createReadWriteContractFactory.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { - ReadWriteContractFactory, - extendReadWriteContract, -} from "@delvtech/council-core"; -import { - createNetwork, - createReadWriteContract, -} from "@delvtech/evm-client-ethers"; -import { Signer } from "ethers"; -import { CreateReadContractFactoryOptions } from "src/contract/createReadContractFactory"; - -export interface CreateReadWriteContractFactoryOptions - extends CreateReadContractFactoryOptions { - signer: Signer; -} - -export function createReadWriteContractFactory( - factoryOptions: CreateReadWriteContractFactoryOptions, -): ReadWriteContractFactory { - return (instanceOptions) => { - const options = { - ...factoryOptions, - ...instanceOptions, - }; - - const viemReadWriteContract = createReadWriteContract({ - abi: options.abi, - address: options.address, - provider: options.provider, - signer: options.signer, - }); - - const viemNetwork = createNetwork(options.provider); - - // Adds custom event fetching logic to the base contract before caching. - return extendReadWriteContract({ - ...options, - contract: viemReadWriteContract, - network: viemNetwork, - }); - }; -} diff --git a/packages/council-ethers/src/index.ts b/packages/council-ethers/src/index.ts deleted file mode 100644 index e8500b4b..00000000 --- a/packages/council-ethers/src/index.ts +++ /dev/null @@ -1,39 +0,0 @@ -// Client -export { - createReadContractFactory, - type CreateReadContractFactoryOptions, -} from "src/contract/createReadContractFactory"; -export { - createReadWriteContractFactory, - type CreateReadWriteContractFactoryOptions, -} from "src/contract/createReadWriteContractFactory"; - -// Client Re-exports -export * from "@delvtech/evm-client-ethers"; - -// Council -export { - ReadCouncil, - type ReadCouncilOptions, -} from "src/models/council/ReadCouncil"; -export { - ReadWriteCouncil, - type ReadWriteCouncilOptions, -} from "src/models/council/ReadWriteCouncil"; -export { - ReadWriteMockToken, - type ReadWriteMockTokenOptions, -} from "src/models/token/ReadWriteMockToken"; - -// Council Core Re-exports -export * from "@delvtech/council-core/airdrop"; -export * from "@delvtech/council-core/contract"; -export * from "@delvtech/council-core/errors"; -export * from "@delvtech/council-core/model"; -export * from "@delvtech/council-core/proposal"; -export { ReadToken, type ReadTokenOptions } from "@delvtech/council-core/token"; -export * from "@delvtech/council-core/utils"; -export * from "@delvtech/council-core/vaults"; -export * from "@delvtech/council-core/vote"; -export * from "@delvtech/council-core/voter"; -export * from "@delvtech/council-core/voting"; diff --git a/packages/council-ethers/src/models/council/ReadCouncil.ts b/packages/council-ethers/src/models/council/ReadCouncil.ts deleted file mode 100644 index b09ef081..00000000 --- a/packages/council-ethers/src/models/council/ReadCouncil.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { ReadCouncil as BaseReadCouncil } from "@delvtech/council-core"; -import { SimpleCache, createNetwork } from "@delvtech/evm-client-ethers"; -import { Provider } from "ethers"; -import { createReadContractFactory } from "src/contract/createReadContractFactory"; - -export interface ReadCouncilOptions { - provider: Provider; - cache?: SimpleCache; - /** - * A namespace to distinguish this instance from others in the cache by - * prefixing all cache keys. - */ - namespace?: string; -} - -export class ReadCouncil extends BaseReadCouncil { - constructor({ provider, cache, namespace }: ReadCouncilOptions) { - super({ - name: namespace, - network: createNetwork(provider), - contractFactory: createReadContractFactory({ - provider, - cache, - namespace, - }), - }); - } -} diff --git a/packages/council-ethers/src/models/council/ReadWriteCouncil.ts b/packages/council-ethers/src/models/council/ReadWriteCouncil.ts deleted file mode 100644 index 529076cf..00000000 --- a/packages/council-ethers/src/models/council/ReadWriteCouncil.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { ReadWriteCouncil as BaseReadWriteCouncil } from "@delvtech/council-core"; -import { createNetwork } from "@delvtech/evm-client-ethers"; -import { Signer } from "ethers"; -import { createReadWriteContractFactory } from "src/contract/createReadWriteContractFactory"; -import { ReadCouncilOptions } from "./ReadCouncil"; - -export interface ReadWriteCouncilOptions extends ReadCouncilOptions { - signer: Signer; -} - -export class ReadWriteCouncil extends BaseReadWriteCouncil { - constructor({ provider, signer, cache, namespace }: ReadWriteCouncilOptions) { - super({ - name: namespace, - network: createNetwork(provider), - contractFactory: createReadWriteContractFactory({ - provider, - signer, - cache, - namespace, - }), - }); - } -} diff --git a/packages/council-ethers/src/models/token/ReadWriteMockToken.ts b/packages/council-ethers/src/models/token/ReadWriteMockToken.ts deleted file mode 100644 index 03625a16..00000000 --- a/packages/council-ethers/src/models/token/ReadWriteMockToken.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { ReadWriteMockToken as BaseReadWriteMockToken } from "@delvtech/council-core"; -import { SimpleCache, createNetwork } from "@delvtech/evm-client-ethers"; -import { Provider, Signer } from "ethers"; -import { createReadWriteContractFactory } from "src/contract/createReadWriteContractFactory"; - -export interface ReadWriteMockTokenOptions { - address: `0x${string}`; - provider: Provider; - signer: Signer; - cache?: SimpleCache; - /** - * A namespace to distinguish this instance from others in the cache by - * prefixing all cache keys. - */ - namespace?: string; -} - -export class ReadWriteMockToken extends BaseReadWriteMockToken { - constructor({ - address, - provider, - signer, - cache, - namespace, - }: ReadWriteMockTokenOptions) { - super({ - address, - name: namespace, - network: createNetwork(provider), - contractFactory: createReadWriteContractFactory({ - provider, - signer, - cache, - namespace, - }), - }); - } -} diff --git a/packages/council-ethers/tsconfig.json b/packages/council-ethers/tsconfig.json deleted file mode 100644 index 161d563b..00000000 --- a/packages/council-ethers/tsconfig.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "extends": "@council/tsconfig/base.json", - "include": ["src"], - "exclude": ["node_modules"], - "compilerOptions": { - "rootDir": ".", - "baseUrl": ".", - "target": "esnext", - "module": "ESNext", - "moduleResolution": "Bundler", - "paths": { - "src/*": ["src/*"], - }, - "resolveJsonModule": true, - }, -} diff --git a/packages/council-ethers/tsup.config.ts b/packages/council-ethers/tsup.config.ts deleted file mode 100644 index 7924d73c..00000000 --- a/packages/council-ethers/tsup.config.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { defineConfig } from "tsup"; - -export default defineConfig({ - entry: ["src/index.ts"], - format: ["esm"], - sourcemap: true, - dts: true, - clean: true, - minify: true, - shims: true, - cjsInterop: true, -}); diff --git a/packages/council-core/.env.example b/packages/council-js/.env.example similarity index 100% rename from packages/council-core/.env.example rename to packages/council-js/.env.example diff --git a/apps/landing-page/.eslintignore b/packages/council-js/.eslintignore similarity index 100% rename from apps/landing-page/.eslintignore rename to packages/council-js/.eslintignore diff --git a/packages/council-core/.eslintrc b/packages/council-js/.eslintrc similarity index 100% rename from packages/council-core/.eslintrc rename to packages/council-js/.eslintrc diff --git a/packages/council-core/.gitignore b/packages/council-js/.gitignore similarity index 100% rename from packages/council-core/.gitignore rename to packages/council-js/.gitignore diff --git a/packages/council-core/CHANGELOG.md b/packages/council-js/CHANGELOG.md similarity index 95% rename from packages/council-core/CHANGELOG.md rename to packages/council-js/CHANGELOG.md index 7be9eb7b..8e5877df 100644 --- a/packages/council-core/CHANGELOG.md +++ b/packages/council-js/CHANGELOG.md @@ -1,4 +1,4 @@ -# @delvtech/council-core +# @delvtech/council-js ## 0.1.0 diff --git a/packages/council-core/LICENSE b/packages/council-js/LICENSE similarity index 100% rename from packages/council-core/LICENSE rename to packages/council-js/LICENSE diff --git a/packages/council-core/README.md b/packages/council-js/README.md similarity index 100% rename from packages/council-core/README.md rename to packages/council-js/README.md diff --git a/packages/council-js/package.json b/packages/council-js/package.json new file mode 100644 index 00000000..f06f9d2f --- /dev/null +++ b/packages/council-js/package.json @@ -0,0 +1,68 @@ +{ + "name": "@delvtech/council-js", + "version": "0.0.0", + "license": "AGPL-3.0", + "author": { + "name": "DELV", + "email": "contact@delv.tech", + "url": "https://github.com/delvtech" + }, + "repository": "https://github.com/delvtech/council-kit/tree/main/packages/council-js", + "bugs": "https://github.com/delvtech/council-kit/issues", + "scripts": { + "build": "tsup", + "watch": "tsup --watch", + "docs": "typedoc", + "watch:docs": "typedoc --watch", + "test": "vitest run", + "test:watch": "vitest --reporter=verbose", + "typecheck": "tsc --noEmit", + "typecheck:watch": "tsc --noEmit --watch" + }, + "dependencies": { + "@delvtech/council-artifacts": "^0.1.0", + "@delvtech/fixed-point-wasm": "^0.0.8" + }, + "devDependencies": { + "@council/eslint-config": "*", + "@council/tsconfig": "*", + "@delvtech/drift": "^0.6.0", + "@types/sinon": "^17.0.3", + "sinon": "^17.0.1", + "tsconfig-paths": "^4.2.0", + "tsup": "^8.3.6", + "typedoc": "^0.27.6", + "typedoc-plugin-markdown": "^4.4.1", + "typescript": "^5.8.2", + "vitest": "^3.0.5" + }, + "type": "module", + "main": "dist/index.cjs", + "types": "dist/index.d.cts", + "exports": { + ".": { + "types": { + "import": "./dist/index.d.ts", + "require": "./dist/index.d.cts" + }, + "default": { + "import": "./dist/index.js", + "require": "./dist/index.cjs" + } + }, + "./package.json": "./package.json" + }, + "typesVersions": { + "*": { + ".": [ + "./dist/index.d.ts" + ] + } + }, + "files": [ + "dist" + ], + "publishConfig": { + "access": "public" + } +} diff --git a/packages/council-js/src/entities/Entity.ts b/packages/council-js/src/entities/Entity.ts new file mode 100644 index 00000000..af5e6b17 --- /dev/null +++ b/packages/council-js/src/entities/Entity.ts @@ -0,0 +1,92 @@ +import { + Adapter, + Address, + ContractWriteOptions, + Drift, + DriftConfig, + OnMinedParam, + OneOf, + createDrift, +} from "@delvtech/drift"; +import { getEventsWithSplitAndRetry } from "src/utils/getEventsWithSplitAndRetry"; + +/** + * Configuration options for an {@link Entity}. + */ +export type EntityConfig = OneOf< + | { + drift?: Drift; + } + | DriftConfig +> & { + /** + * The earliest block to fetch events from. + */ + earliestBlock?: bigint; +}; + +/** + * A base class for SDK entities. + */ +export class Entity { + drift: Drift; + + constructor({ + drift, + earliestBlock = 0n, + ...driftConfig + }: EntityConfig = {}) { + this.drift = drift || createDrift(driftConfig); + this.drift.extend({ + getEvents({ + fromBlock = earliestBlock, + toBlock = "latest", + ...restParams + }) { + // Overwrite `fromBlock` if earlier than the `earliestBlock` option. + if ( + earliestBlock !== undefined && + (fromBlock === "earliest" || + (typeof fromBlock === "bigint" && fromBlock < earliestBlock)) + ) { + fromBlock = earliestBlock; + } + + // Add logic to split failed requests into multiple smaller requests to + // accommodate block range and/or event count limits. + return getEventsWithSplitAndRetry({ + params: { + fromBlock, + toBlock, + ...restParams, + }, + drift: this, + earliestBlock, + }); + }, + }); + } +} + +/** + * Params for write operations on an {@linkcode Entity}. + * + * @template Args Additional parameters for the write operation. + */ +export type EntityWriteParams = { + args: Args; + options?: ContractWriteOptions & OnMinedParam; +}; + +// Contract // + +/** + * Configuration options for an {@linkcode Entity} that represents a specific + * contract. + */ +export type ContractEntityConfig = { + /** + * The address of the contract. + */ + address: Address; +} & EntityConfig; diff --git a/packages/council-js/src/entities/airdrop/ReadAirdrop.ts b/packages/council-js/src/entities/airdrop/ReadAirdrop.ts new file mode 100644 index 00000000..f10ba7ab --- /dev/null +++ b/packages/council-js/src/entities/airdrop/ReadAirdrop.ts @@ -0,0 +1,73 @@ +import { + Adapter, + Address, + Contract, + ContractReadOptions, +} from "@delvtech/drift"; +import { airdropAbi, AirdropAbi } from "src/entities/airdrop/abi"; +import { ContractEntityConfig, Entity } from "src/entities/Entity"; +import { ReadToken } from "src/entities/token/ReadToken"; +import { ReadLockingVault } from "src/entities/votingVault/lockingVault/ReadLockingVault"; + +export class ReadAirdrop extends Entity { + contract: Contract; + + constructor({ address, ...config }: ContractEntityConfig) { + super(config); + this.contract = this.drift.contract({ + abi: airdropAbi, + address, + }); + } + + get address(): Address { + return this.contract.address; + } + + /** + * Get the date of when the tokens can be reclaimed (removed by the owner). + */ + async getExpiration(): Promise { + const secondsTimestamp = await this.contract.read("expiration"); + return new Date(Number(secondsTimestamp * 1000n)); + } + + /** + * Get The merkle root with deposits encoded into it as hash [address, amount] + */ + getMerkleRoot(): Promise
{ + return this.contract.read("rewardsRoot"); + } + + /** + * Get the token that will be paid out. + */ + async getToken(): Promise> { + return new ReadToken({ + address: await this.contract.read("token"), + drift: this.drift, + }); + } + + /** + * Get the amount that an address has already claimed. + */ + async getClaimedAmount( + account: Address, + options?: ContractReadOptions, + ): Promise { + return await this.contract.read("claimed", [account], options); + } + + /** + * Get the address of the locking vault into which tokens will be deposited + * when someone claims and delegates in a single tx. + */ + async getLockingVault(): Promise> { + const address = await this.contract.read("lockingVault"); + return new ReadLockingVault({ + address, + drift: this.drift, + }); + } +} diff --git a/packages/council-js/src/entities/airdrop/ReadWriteAirdrop.ts b/packages/council-js/src/entities/airdrop/ReadWriteAirdrop.ts new file mode 100644 index 00000000..395bee80 --- /dev/null +++ b/packages/council-js/src/entities/airdrop/ReadWriteAirdrop.ts @@ -0,0 +1,158 @@ +import { Address, Hash, ReadWriteAdapter } from "@delvtech/drift"; +import { ReadAirdrop } from "src/entities/airdrop/ReadAirdrop"; +import { EntityWriteParams } from "src/entities/Entity"; +import { ReadWriteToken } from "src/entities/token/ReadWriteToken"; +import { ReadWriteLockingVault } from "src/entities/votingVault/lockingVault/ReadWriteLockingVault"; + +export class ReadWriteAirdrop< + A extends ReadWriteAdapter = ReadWriteAdapter, +> extends ReadAirdrop { + async getToken(): Promise> { + return new ReadWriteToken({ + address: await this.contract.read("token"), + drift: this.drift, + }); + } + + async getLockingVault(): Promise> { + return new ReadWriteLockingVault({ + address: await this.contract.read("lockingVault"), + drift: this.drift, + }); + } + + /** + * Claims tokens from the airdrop and sends them to the user. + * @return - The transaction hash. + */ + claim({ + args: { amount, totalGrant, merkleProof, recipient: destination }, + options, + }: EntityWriteParams<{ + /** + * Amount of tokens to claim. + */ + amount: bigint; + /** + * The total amount of tokens the user was granted. + */ + totalGrant: bigint; + /** + * A set of hashes that can be used to reconstruct the path from a user + * (leaf) node to the merkle root, verifying that the user is part of the + * tree. + */ + merkleProof: Hash[]; + /** + * The address which will be credited with funds. + */ + recipient: Address; + }>): Promise { + return this.contract.write( + "claim", + { + amount, + destination, + merkleProof, + totalGrant, + }, + { + ...options, + onMined: async (receipt) => { + if (receipt?.status === "success") { + // Invalidate the claimed amount for the recipient + this.contract.invalidateRead("claimed", [destination]); + + // Invalidate the balance of the recipient. This requires reading + // the contract, but in most cases, the read will already be cached. + const token = await this.getToken(); + token.contract.invalidateRead("balanceOf", { + account: destination, + }); + } + options?.onMined?.(receipt); + }, + }, + ); + } + + /** + * Claims tokens from the airdrop, deposits it into the locking vault, and + * delegates in a single transaction. + * @return - The transaction hash. + */ + claimAndDelegate({ + args: { amount, delegate, totalGrant, merkleProof, destination }, + options, + }: EntityWriteParams<{ + /** + * Amount of tokens to claim. + */ + amount: bigint; + /** + * The address the user will delegate to, WARNING - should not be zero. + */ + delegate: Address; + /** + * The total amount of tokens the user was granted. + */ + totalGrant: bigint; + /** + * A set of hashes that can be used to reconstruct the path from a user + * (leaf) node to the merkle root, verifying that the user is part of the + * tree. + */ + merkleProof: Hash[]; + /** + * The address which will be credited with funds. + */ + destination: Address; + }>): Promise { + return this.contract.write( + "claimAndDelegate", + { + amount, + delegate, + totalGrant, + merkleProof, + destination, + }, + { + onMined: async (receipt) => { + if (receipt?.status === "success") { + this.contract.cache.clear(); + } + options?.onMined?.(receipt); + }, + }, + ); + } + + /** + * Remove funds from the airdrop after expiration + * @return - The transaction hash. + */ + async reclaim({ + args: { destination }, + options, + }: EntityWriteParams<{ + /** + * The address which will be credited with funds. + */ + destination: Address; + }>): Promise { + const hash = await this.contract.write( + "reclaim", + { destination }, + { + onMined: async (receipt) => { + if (receipt?.status === "success") { + this.contract.cache.clear(); + } + options?.onMined?.(receipt); + }, + }, + ); + return hash; + } +} diff --git a/packages/council-js/src/entities/airdrop/abi.ts b/packages/council-js/src/entities/airdrop/abi.ts new file mode 100644 index 00000000..ccd82735 --- /dev/null +++ b/packages/council-js/src/entities/airdrop/abi.ts @@ -0,0 +1,4 @@ +import { Airdrop } from "@delvtech/council-artifacts/Airdrop"; + +export const airdropAbi = Airdrop.abi; +export type AirdropAbi = typeof airdropAbi; diff --git a/packages/council-js/src/entities/coreVoting/ReadCoreVoting.test.ts b/packages/council-js/src/entities/coreVoting/ReadCoreVoting.test.ts new file mode 100644 index 00000000..5ba91b52 --- /dev/null +++ b/packages/council-js/src/entities/coreVoting/ReadCoreVoting.test.ts @@ -0,0 +1,253 @@ +import { createMockDrift, createStubBlock } from "@delvtech/drift/testing"; +import { coreVotingAbi } from "src/entities/coreVoting/abi"; +import { EXECUTED_PROPOSAL_HASH } from "src/entities/coreVoting/constants"; +import { ReadCoreVoting } from "src/entities/coreVoting/ReadCoreVoting"; +import { ExecutedProposal, VoteResults } from "src/entities/coreVoting/types"; +import { beforeEach, describe, expect, it } from "vitest"; + +describe("ReadCoreVoting", () => { + const chainId = 0; + const address = "0x123"; + const drift = createMockDrift({ chainId }); + const contract = drift.contract({ abi: coreVotingAbi, address }); + const coreVoting = new ReadCoreVoting({ address, drift }); + + beforeEach(async () => { + drift.reset(); + await drift.cache.clear(); + }); + + it("Returns proposal args for deleted/executed proposals", async () => { + contract.onRead("proposals").resolves({ + proposalHash: EXECUTED_PROPOSAL_HASH, + created: 0n, + expiration: 0n, + lastCall: 0n, + quorum: 0n, + unlock: 0n, + }); + contract.onGetEvents("ProposalCreated").resolves([ + { + eventName: "ProposalCreated", + args: { + proposalId: 1n, + created: 123n, + expiration: 456n, + execution: 789n, + }, + }, + ]); + const proposal = await coreVoting.getProposal(1n); + expect(proposal).toMatchObject({ + chainId, + coreVotingAddress: address, + proposalId: 1n, + proposalHash: EXECUTED_PROPOSAL_HASH, + status: "executed", + createdBlock: 123n, + expirationBlock: 456n, + unlockBlock: 789n, + } satisfies ExecutedProposal); + }); + + it("Returns voting power for a deleted/executed proposal", async () => { + // Proposal creation event + contract.onGetEvents("ProposalCreated").resolves([ + { + eventName: "ProposalCreated", + args: { + proposalId: 1n, + created: 123n, + expiration: 456n, + execution: 789n, + }, + }, + ]); + // Executed proposal response + contract.onRead("proposals").resolves({ + proposalHash: EXECUTED_PROPOSAL_HASH, + created: 0n, + expiration: 0n, + lastCall: 0n, + quorum: 0n, + unlock: 0n, + }); + contract.onGetEvents("Voted").resolves([ + // 2 votes for yes w/ 200 voting power + { + eventName: "Voted", + args: { + proposalId: 1n, + vote: { castBallot: 0, votingPower: 200n }, + voter: "0x123", + }, + }, + { + eventName: "Voted", + args: { + proposalId: 1n, + vote: { castBallot: 0, votingPower: 200n }, + voter: "0x123", + }, + }, + + // 2 votes for no w/ 150 voting power + { + eventName: "Voted", + args: { + proposalId: 1n, + vote: { castBallot: 1, votingPower: 150n }, + voter: "0x123", + }, + }, + { + eventName: "Voted", + args: { + proposalId: 1n, + vote: { castBallot: 1, votingPower: 150n }, + voter: "0x123", + }, + }, + + // 2 votes for maybe w/ 100 voting power + { + eventName: "Voted", + args: { + proposalId: 1n, + vote: { castBallot: 2, votingPower: 100n }, + voter: "0x123", + }, + }, + { + eventName: "Voted", + args: { + proposalId: 1n, + vote: { castBallot: 2, votingPower: 100n }, + voter: "0x123", + }, + }, + ]); + + const results = await coreVoting.getProposalVotingPower(1n); + + expect(results).toEqual({ + yes: 400n, + no: 300n, + maybe: 200n, + total: 900n, + } satisfies VoteResults); + }); + + describe("getProposalStatus", () => { + it('Returns "active" for locked proposals', async () => { + contract.onRead("proposals").resolves({ + proposalHash: "0x", + created: 0n, + unlock: 10n, + expiration: 20n, + lastCall: 30n, + quorum: 1n, + }); + drift.onGetBlock().resolves(createStubBlock({ number: 5n })); + const status = await coreVoting.getProposalStatus(0n); + expect(status).toBe("active"); + }); + + it('Returns "unlocked" for unlocked proposals', async () => { + contract.onRead("proposals").resolves({ + proposalHash: "0x", + created: 0n, + unlock: 10n, + expiration: 20n, + lastCall: 30n, + quorum: 1n, + }); + drift.onGetBlock().resolves(createStubBlock({ number: 15n })); + const status = await coreVoting.getProposalStatus(0n); + expect(status).toBe("unlocked"); + }); + + it("Returns 'closed' for un-executed proposals with enough yes votes", async () => { + contract.onRead("proposals").resolves({ + proposalHash: "0x", + created: 0n, + unlock: 10n, + expiration: 20n, + lastCall: 30n, + quorum: 1n, + }); + drift.onGetBlock().resolves(createStubBlock({ number: 25n })); + contract.onRead("getProposalVotingPower").resolves([100n, 0n, 0n]); + const status = await coreVoting.getProposalStatus(0n); + expect(status).toBe("closed"); + }); + + it("Returns 'failed' for proposals without enough yes votes", async () => { + contract.onRead("proposals").resolves({ + proposalHash: "0x", + created: 0n, + unlock: 10n, + expiration: 20n, + lastCall: 30n, + quorum: 1n, + }); + drift.onGetBlock().resolves(createStubBlock({ number: 25n })); + contract.onRead("getProposalVotingPower").resolves([0n, 0n, 0n]); + const status = await coreVoting.getProposalStatus(0n); + expect(status).toBe("failed"); + }); + + it("Returns 'executed' for proposals with the executed proposal hash and a ProposalCreated event", async () => { + contract.onRead("proposals").resolves({ + proposalHash: EXECUTED_PROPOSAL_HASH, + created: 0n, + unlock: 0n, + expiration: 0n, + lastCall: 0n, + quorum: 0n, + }); + contract.onGetEvents("ProposalCreated").resolves([ + { + eventName: "ProposalCreated", + args: { + proposalId: 0n, + created: 0n, + expiration: 0n, + execution: 0n, + }, + }, + ]); + const status = await coreVoting.getProposalStatus(0n); + expect(status).toBe("executed"); + }); + + it('Returns "expired" for proposals past the last call block', async () => { + contract.onRead("proposals").resolves({ + proposalHash: "0x", + created: 0n, + unlock: 10n, + expiration: 20n, + lastCall: 30n, + quorum: 1n, + }); + drift.onGetBlock().resolves(createStubBlock({ number: 35n })); + contract.onRead("getProposalVotingPower").resolves([100n, 0n, 0n]); + const status = await coreVoting.getProposalStatus(0n); + expect(status).toBe("expired"); + }); + + it('Returns "unknown" for proposals without a ProposalCreated event', async () => { + contract.onRead("proposals").resolves({ + proposalHash: EXECUTED_PROPOSAL_HASH, + created: 0n, + unlock: 0n, + expiration: 0n, + lastCall: 0n, + quorum: 0n, + }); + contract.onGetEvents("ProposalCreated").resolves([]); + const status = await coreVoting.getProposalStatus(0n); + expect(status).toBe("unknown"); + }); + }); +}); diff --git a/packages/council-js/src/entities/coreVoting/ReadCoreVoting.ts b/packages/council-js/src/entities/coreVoting/ReadCoreVoting.ts new file mode 100644 index 00000000..d373da70 --- /dev/null +++ b/packages/council-js/src/entities/coreVoting/ReadCoreVoting.ts @@ -0,0 +1,339 @@ +import { + Adapter, + Address, + Contract, + ContractReadOptions, + FunctionArgs, + RangeBlock, +} from "@delvtech/drift"; +import { ContractEntityConfig, Entity } from "src/entities/Entity"; +import { coreVotingAbi, CoreVotingAbi } from "src/entities/coreVoting/abi"; +import { + BALLOTS, + EXECUTED_PROPOSAL_HASH, +} from "src/entities/coreVoting/constants"; +import { + Proposal, + ProposalCreation, + ProposalExecution, + ProposalStatus, + Vote, + VoteResults, +} from "src/entities/coreVoting/types"; +import { convertToBlockNumber } from "src/utils/convertToBlockNumber"; +import { convertToRangeBlock } from "src/utils/convertToRangeBlock"; + +export class ReadCoreVoting extends Entity { + readonly address: Address; + readonly contract: Contract; + + constructor({ address, ...config }: ContractEntityConfig) { + super(config); + this.address = address; + this.contract = this.drift.contract({ + abi: coreVotingAbi, + address, + }); + } + + getIsVaultApproved( + vault: Address, + options?: ContractReadOptions, + ): Promise { + return this.contract.read("approvedVaults", [vault], options); + } + + /** + * Get a casted vote for a given address on a given proposal id. + */ + async getVote({ + voter, + proposalId, + }: { + voter: Address; + proposalId: bigint; + }): Promise { + const { castBallot, votingPower } = await this.contract.read("votes", [ + voter, + proposalId, + ]); + + if (votingPower === 0n) { + return; + } + + return { + proposalId, + ballot: BALLOTS[castBallot], + votingPower, + voter, + }; + } + + /** + * Get all casted votes on proposals in this voting contract. + */ + async getVotes({ + proposalId, + voter, + fromBlock, + toBlock, + }: { + proposalId?: bigint; + voter?: Address; + fromBlock?: RangeBlock; + toBlock?: RangeBlock; + }): Promise { + const voteEvents = await this.contract.getEvents("Voted", { + filter: { proposalId, voter }, + fromBlock, + toBlock, + }); + + return voteEvents.map(({ args: { proposalId, vote, voter } }) => { + return { + proposalId, + ballot: BALLOTS[vote.castBallot], + votingPower: vote.votingPower, + voter, + }; + }); + } + + /** + * Get a proposal by id. + */ + async getProposal( + proposalId: bigint, + options?: ContractReadOptions, + ): Promise { + const { created, expiration, lastCall, proposalHash, quorum, unlock } = + await this.contract.read("proposals", [proposalId], options); + + if (proposalHash === EXECUTED_PROPOSAL_HASH) { + const creationEvents = await this.contract.getEvents("ProposalCreated", { + toBlock: await convertToRangeBlock(options?.block, this.drift), + }); + const creationEvent = creationEvents.find( + ({ args }) => args.proposalId === proposalId, + ); + + if (!creationEvent) { + return { + proposalId, + proposalHash, + status: "unknown", + chainId: await this.drift.getChainId(), + coreVotingAddress: this.address, + }; + } + + return { + proposalId, + proposalHash, + status: "executed", + chainId: await this.drift.getChainId(), + coreVotingAddress: this.address, + createdBlock: creationEvent?.args.created, + expirationBlock: creationEvent?.args.expiration, + unlockBlock: creationEvent?.args.execution, + }; + } + + return { + proposalId, + proposalHash, + status: undefined, + chainId: await this.drift.getChainId(), + coreVotingAddress: this.address, + createdBlock: created, + expirationBlock: expiration, + lastCallBlock: lastCall, + requiredQuorum: quorum, + unlockBlock: unlock, + }; + } + + /** + * Get proposal creation events. + */ + async getProposalCreations( + options: { + fromBlock?: RangeBlock; + toBlock?: RangeBlock; + } = {}, + ): Promise { + const events = await this.contract.getEvents("ProposalCreated", options); + let result: ProposalCreation[] = []; + for (const { args, blockNumber, transactionHash } of events) { + // Filter out pending blocks. + if (transactionHash && blockNumber !== undefined) { + result.push({ + blockNumber, + transactionHash, + chainId: await this.drift.getChainId(), + coreVotingAddress: this.address, + proposalId: args.proposalId, + createdBlock: args.created, + expirationBlock: args.expiration, + unlockBlock: args.execution, + }); + } + } + return result; + } + + /** + * Get proposal creation events. + */ + async getProposalExecutions( + options: { + fromBlock?: RangeBlock; + toBlock?: RangeBlock; + } = {}, + ): Promise { + const events = await this.contract.getEvents("ProposalExecuted", options); + let result: ProposalExecution[] = []; + for (const { args, blockNumber, transactionHash } of events) { + // Filter out pending blocks. + if (transactionHash && blockNumber !== undefined) { + result.push({ + blockNumber, + transactionHash, + chainId: await this.drift.getChainId(), + coreVotingAddress: this.address, + proposalId: args.proposalId, + }); + } + } + return result; + } + + /** + * Get the status of a proposal. + */ + async getProposalStatus( + proposalId: bigint, + options?: ContractReadOptions, + ): Promise { + const { expiration, lastCall, unlock, proposalHash, quorum } = + await this.contract.read("proposals", [proposalId], options); + + if (proposalHash === EXECUTED_PROPOSAL_HASH) { + const createEvents = await this.contract.getEvents("ProposalCreated", { + toBlock: await convertToRangeBlock(options?.block, this.drift), + }); + const hasCreateEvent = createEvents.some( + ({ args }) => args.proposalId === proposalId, + ); + if (hasCreateEvent) { + return "executed"; + } + return "unknown"; + } + + let currentBlock = await convertToBlockNumber(options?.block, this.drift); + if (currentBlock === undefined) { + currentBlock = await this.drift.getBlockNumber(); + } + + // Locked to prevent execution while voting is ongoing. + if (currentBlock <= unlock) { + return "active"; + } + + // Unlocked to allow execution, but voting is still ongoing. + if (currentBlock <= expiration) { + return "unlocked"; + } + + const { total, yes, no } = await this.getProposalVotingPower( + proposalId, + options, + ); + const accepted = total >= quorum && yes > no; + + // Voting ended without enough yes votes. + if (!accepted) { + return "failed"; + } + + if (currentBlock > lastCall) { + return "expired"; + } + + return "closed"; + } + + /** + * Get the total voting power of all votes on a proposal by ballot. + */ + async getProposalVotingPower( + proposalId: bigint, + options?: ContractReadOptions, + ): Promise { + const proposal = await this.getProposal(proposalId, options); + + // The proposal voting power is deleted when the proposal is executed, so we + // have to get the results from vote events. + if ( + !proposal?.proposalHash || + proposal.proposalHash === EXECUTED_PROPOSAL_HASH + ) { + const votes = await this.getVotes({ + toBlock: await convertToRangeBlock(options?.block, this.drift), + proposalId, + }); + const results: VoteResults = { + yes: 0n, + no: 0n, + maybe: 0n, + total: 0n, + }; + for (const { ballot, votingPower } of votes) { + results[ballot] += votingPower; + results.total += votingPower; + } + return results; + } + + const [yes, no, maybe] = await this.contract.read( + "getProposalVotingPower", + { proposalId }, + options, + ); + return { yes, no, maybe, total: yes + no + maybe }; + } + + /** + * Get the array of addresses that will be called (targets) and the data + * they'll be called with (calldatas) by a proposal. + */ + async getProposalArgs( + proposalId: bigint, + options?: ContractReadOptions, + ): Promise | undefined> { + const logs = await this.contract.getEvents("ProposalCreated", { + toBlock: await convertToRangeBlock(options?.block, this.drift), + }); + const log = logs.find(({ args }) => args.proposalId === proposalId); + + if (!log?.transactionHash) { + return undefined; + } + + const createTransaction = await this.drift.getTransaction({ + hash: log.transactionHash, + }); + + if (!createTransaction?.input) { + return undefined; + } + + const { args } = this.contract.decodeFunctionData<"proposal">( + createTransaction.input, + ); + + return args; + } +} diff --git a/packages/council-js/src/entities/coreVoting/ReadWriteCoreVoting.ts b/packages/council-js/src/entities/coreVoting/ReadWriteCoreVoting.ts new file mode 100644 index 00000000..329abea0 --- /dev/null +++ b/packages/council-js/src/entities/coreVoting/ReadWriteCoreVoting.ts @@ -0,0 +1,278 @@ +import { + Address, + Bytes, + ContractWriteOptions, + Hash, + OnMinedParam, + ReadWriteAdapter, +} from "@delvtech/drift"; +import { BALLOTS } from "src/entities/coreVoting/constants"; +import { ReadCoreVoting } from "src/entities/coreVoting/ReadCoreVoting"; +import { Ballot } from "src/entities/coreVoting/types"; +import { EntityWriteParams } from "src/entities/Entity"; +import { ReadVotingVault } from "src/entities/votingVault/ReadVotingVault"; +import { CouncilSdkError } from "src/error"; + +export class ReadWriteCoreVoting< + A extends ReadWriteAdapter = ReadWriteAdapter, +> extends ReadCoreVoting { + /** + * Create a new proposal. + * @returns The transaction hash. + */ + createProposal({ + args: { + targets, + calldatas, + lastCallBlock, + ballot, + votingVaults, + extraVaultData = [], + }, + options, + }: EntityWriteParams<{ + /** + * The addresses of the approved vaults to draw voting power from. + */ + votingVaults: Address[]; + /** + * The targets (contract addresses) to call. + */ + targets: Address[]; + /** + * The execution calldata for each target. + */ + calldatas: Bytes[]; + /** + * The block number after which the proposal can't be executed. + */ + lastCallBlock: bigint; + /** + * The initial vote from the signer's account. + */ + ballot: Ballot; + /** + * Extra data given to the vaults to help calculation + */ + extraVaultData?: Bytes[]; + }>): Promise { + return this.contract.write( + "proposal", + { + ballot: BALLOTS.indexOf(ballot), + calldatas, + extraVaultData: votingVaults.map((_, i) => extraVaultData[i] ?? "0x"), + lastCall: lastCallBlock, + targets, + votingVaults: votingVaults, + }, + { + ...options, + onMined: async (receipt) => { + if (receipt?.status === "success") { + await this.contract.cache.clear(); + } + options?.onMined?.(receipt); + }, + }, + ); + } + + /** + * Change the number of blocks that must be waited before a proposal can be executed. + * @returns The transaction hash. + */ + setLockDuration({ + args: { + /** + * The number of blocks that must be waited. + */ + blocks, + }, + options, + }: EntityWriteParams<{ + blocks: bigint; + }>): Promise { + return this.contract.write( + "setLockDuration", + { _lockDuration: blocks }, + { + ...options, + onMined: async (receipt) => { + if (receipt?.status === "success") { + await this.contract.cache.clear(); + } + options?.onMined?.(receipt); + }, + }, + ); + } + + /** + * Change whether a vault is approved or not. + * @returns The transaction hash. + */ + changeVaultStatus({ + args, + options, + }: EntityWriteParams<{ + /** + * The address of the vault. + */ + vault: Address; + /** + * Whether or not the approved. + */ + isValid: boolean; + }>): Promise { + return this.contract.write("changeVaultStatus", args, { + ...options, + onMined: async (receipt) => { + if (receipt?.status === "success") { + await this.contract.invalidateRead("approvedVaults", [args.vault]); + } + options?.onMined?.(receipt); + }, + }); + } + + /** + * Change the amount of time (in blocks) that a proposal can still be voted on + * after it's been unlocked. + * @returns The transaction hash. + */ + changeExtraVotingTime({ + args: { + /** + * The number of blocks after the proposal is unlocked during which voting + * can continue. + */ + extraVoteBlocks, + }, + options, + }: EntityWriteParams<{ + extraVoteBlocks: bigint; + }>): Promise { + return this.contract.write( + "changeExtraVotingTime", + { _extraVoteTime: extraVoteBlocks }, + { + ...options, + onMined: async (receipt) => { + if (receipt?.status === "success") { + await this.contract.invalidateRead("extraVoteTime"); + } + options?.onMined?.(receipt); + }, + }, + ); + } + + /** + * Execute a proposal. + */ + async executeProposal({ + args: { proposalId, targets, calldatas }, + options, + }: EntityWriteParams<{ + proposalId: bigint; + targets?: Readonly; + calldatas?: Readonly; + }>): Promise { + if (!targets || !calldatas) { + const args = await this.getProposalArgs(proposalId); + if (!args) { + throw new CouncilSdkError( + `Missing targets and calldatas to execute proposal ${proposalId}`, + ); + } + targets = args.targets; + calldatas = args.calldatas; + } + + return this.contract.write( + "execute", + { + proposalId, + targets, + calldatas, + }, + { + ...options, + onMined: async (receipt) => { + if (receipt?.status === "success") { + await this.contract.invalidateRead("proposals", [proposalId]); + } + options?.onMined?.(receipt); + }, + }, + ); + } + + /** + * Vote on this a proposal. + */ + async vote({ + args: { proposalId, ballot, vaults, extraVaultData }, + options, + }: EntityWriteParams<{ + proposalId: bigint; + ballot: Ballot; + /** + * The vaults to draw voting power from. Defaults to the `CoreVoting`'s + * configured vaults. + */ + vaults: Address[]; + /** + * Extra data given to the vaults to help calculation. + */ + extraVaultData?: (Bytes | undefined)[]; + options?: ContractWriteOptions & OnMinedParam; + }>): Promise { + const voter = await this.contract.getSignerAddress(); + + // Filter out vaults with no voting power which would cause a revert. + const vaultsWithPower: Address[] = []; + const extraDataForVaultsWithPower: Bytes[] = []; + await Promise.all( + vaults.map(async (address, i) => { + const extraData = extraVaultData?.[i] || "0x"; + const readVault = new ReadVotingVault({ address, drift: this.drift }); + const power = await readVault.getVotingPower({ + voter, + extraData, + }); + + if (power > 0n) { + vaultsWithPower.push(address); + extraDataForVaultsWithPower.push(extraData); + } + }), + ); + + return this.contract.write( + "vote", + { + proposalId, + ballot: BALLOTS.indexOf(ballot), + extraVaultData: extraDataForVaultsWithPower, + votingVaults: vaultsWithPower, + }, + { + ...options, + onMined: async (receipt) => { + if (receipt?.status === "success") { + await Promise.all([ + this.contract.invalidateReadsMatching("quorums"), + this.contract.invalidateRead("votes", [voter, proposalId]), + this.contract.invalidateRead("getProposalVotingPower", { + proposalId, + }), + ]); + } + options?.onMined?.(receipt); + }, + }, + ); + } +} diff --git a/packages/council-js/src/entities/coreVoting/abi.ts b/packages/council-js/src/entities/coreVoting/abi.ts new file mode 100644 index 00000000..ca534b3c --- /dev/null +++ b/packages/council-js/src/entities/coreVoting/abi.ts @@ -0,0 +1,4 @@ +import { CoreVoting } from "@delvtech/council-artifacts/CoreVoting"; + +export const coreVotingAbi = CoreVoting.abi; +export type CoreVotingAbi = typeof coreVotingAbi; diff --git a/packages/council-core/src/models/coreVoting/constants.ts b/packages/council-js/src/entities/coreVoting/constants.ts similarity index 100% rename from packages/council-core/src/models/coreVoting/constants.ts rename to packages/council-js/src/entities/coreVoting/constants.ts diff --git a/packages/council-js/src/entities/coreVoting/types.ts b/packages/council-js/src/entities/coreVoting/types.ts new file mode 100644 index 00000000..39c399a6 --- /dev/null +++ b/packages/council-js/src/entities/coreVoting/types.ts @@ -0,0 +1,148 @@ +import { Address, Bytes, Eval, Hash, OneOf } from "@delvtech/drift"; +import { + BALLOTS, + EXECUTED_PROPOSAL_HASH, +} from "src/entities/coreVoting/constants"; + +/** + * The status of a proposal. + * + * In the order of the lifecycle of a proposal: + * + * | | | | + * | --- | ---------- | - | + * | 1. | `active` | Open for voting but not yet executable. | + * | 2. | `unlocked` | Open for voting and executable. | + * | 3a. | `closed` | Voting has ended but the proposal hasn't been executed. | + * | 3b. | `failed` | Voting ended before meeting requirements for execution. | + * | 4a. | `executed` | Executed successfully. | + * | 4b. | `expired` | Met requirements for execution but wasn't executed in time. | + * | 5. | `unknown` | No information is available. Possibly non-existent. | + * + */ +export type ProposalStatus = + | "active" + | "unlocked" + | "closed" + | "failed" + | "executed" + | "expired" + | "unknown"; + +/** + * The properties required to identify a proposal. + */ +export type BaseProposalProps = { + chainId: number; + coreVotingAddress: Address; + proposalId: bigint; +}; + +/** + * The data emitted by the `ProposalCreated` event. + */ +export type ProposalCreatedArgs = BaseProposalProps & { + createdBlock: bigint; + /** + * The block number after which the proposal can be executed. + */ + unlockBlock: bigint; + /** + * The block number after which the proposal can no longer be voted on. + */ + expirationBlock: bigint; +}; + +/** + * A proposal creation event. + */ +export type ProposalCreation = ProposalCreatedArgs & { + blockNumber: bigint; + transactionHash: Hash; +}; + +/** + * A proposal execution event. + */ +export type ProposalExecution = BaseProposalProps & { + blockNumber: bigint; + transactionHash: Hash; +}; + +/** + * A proposal with it's current state. + */ +export type ProposalWithState = ProposalCreatedArgs & { + proposalHash: Hash; + /** + * The amount of voting power required to pass the proposal. + */ + requiredQuorum: bigint; + /** + * The block number after which the proposal can no longer be executed. + */ + lastCallBlock: bigint; + status: "active" | "expired" | "failed" | undefined; +}; + +/** + * An executed proposal that has been deleted from the contract. + */ +export type ExecutedProposal = ProposalCreatedArgs & { + proposalHash: typeof EXECUTED_PROPOSAL_HASH; + status: "executed"; +}; + +/** + * An unknown proposal that has no information available. + */ +export type UnknownProposal = BaseProposalProps & { + proposalHash: typeof EXECUTED_PROPOSAL_HASH; + status: "unknown"; +}; + +/** + * A proposal in any state. + * + * Once a proposal has been executed, it will be deleted from the voting + * contract and only the event logs will remain. + */ +export type Proposal< + T extends ProposalStatus | undefined = ProposalStatus | undefined, +> = OneOf< + (ProposalWithState | ExecutedProposal | UnknownProposal) & { + status: T; + } +>; + +/** + * A valid ballot option. + */ +export type Ballot = (typeof BALLOTS)[number]; + +/** + * The amount of voting power casted for each ballot. + */ +export type VoteResults = Eval< + Record & { + total: bigint; + } +>; + +/** + * A vote on a proposal. + */ +export type Vote = { + proposalId: bigint; + ballot: Ballot; + votingPower: bigint; + voter: Address; +}; + +/** + * The actions a proposal will perform. + */ +export type Actions = { + targets: Address[]; + calldatas: Bytes[]; +}; diff --git a/packages/council-js/src/entities/council/ReadCouncil.ts b/packages/council-js/src/entities/council/ReadCouncil.ts new file mode 100644 index 00000000..e3503f1f --- /dev/null +++ b/packages/council-js/src/entities/council/ReadCouncil.ts @@ -0,0 +1,60 @@ +import { Adapter, Address } from "@delvtech/drift"; +import { ReadAirdrop } from "src/entities/airdrop/ReadAirdrop"; +import { ReadCoreVoting } from "src/entities/coreVoting/ReadCoreVoting"; +import { Entity } from "src/entities/Entity"; +import { ReadToken } from "src/entities/token/ReadToken"; +import { ReadGscVault } from "src/entities/votingVault/gscVault/ReadGscVault"; +import { ReadLockingVault } from "src/entities/votingVault/lockingVault/ReadLockingVault"; +import { ReadVotingVault } from "src/entities/votingVault/ReadVotingVault"; +import { ReadVestingVault } from "src/entities/votingVault/vestingVault/ReadVestingVault"; + +export class ReadCouncil extends Entity { + coreVoting(address: Address) { + return new ReadCoreVoting({ + address, + drift: this.drift, + }); + } + + votingVault(address: Address) { + return new ReadVotingVault({ + address, + drift: this.drift, + }); + } + + lockingVault(address: Address) { + return new ReadLockingVault({ + address, + drift: this.drift, + }); + } + + vestingVault(address: Address) { + return new ReadVestingVault({ + address, + drift: this.drift, + }); + } + + gscVault(address: Address) { + return new ReadGscVault({ + address, + drift: this.drift, + }); + } + + airdrop(address: Address) { + return new ReadAirdrop({ + address, + drift: this.drift, + }); + } + + token(address: Address) { + return new ReadToken({ + address, + drift: this.drift, + }); + } +} diff --git a/packages/council-js/src/entities/council/ReadWriteCouncil.ts b/packages/council-js/src/entities/council/ReadWriteCouncil.ts new file mode 100644 index 00000000..9f86cb47 --- /dev/null +++ b/packages/council-js/src/entities/council/ReadWriteCouncil.ts @@ -0,0 +1,54 @@ +import { Address, ReadWriteAdapter } from "@delvtech/drift"; +import { ReadWriteAirdrop } from "src/entities/airdrop/ReadWriteAirdrop"; +import { ReadWriteCoreVoting } from "src/entities/coreVoting/ReadWriteCoreVoting"; +import { ReadCouncil } from "src/entities/council/ReadCouncil"; +import { ReadWriteToken } from "src/entities/token/ReadWriteToken"; +import { ReadWriteGscVault } from "src/entities/votingVault/gscVault/ReadWriteGscVault"; +import { ReadWriteLockingVault } from "src/entities/votingVault/lockingVault/ReadWriteLockingVault"; +import { ReadWriteVestingVault } from "src/entities/votingVault/vestingVault/ReadWriteVestingVault"; + +export class ReadWriteCouncil< + A extends ReadWriteAdapter = ReadWriteAdapter, +> extends ReadCouncil { + coreVoting(address: Address) { + return new ReadWriteCoreVoting({ + address, + drift: this.drift, + }); + } + + lockingVault(address: Address) { + return new ReadWriteLockingVault({ + address, + drift: this.drift, + }); + } + + vestingVault(address: Address) { + return new ReadWriteVestingVault({ + address, + drift: this.drift, + }); + } + + gscVault(address: Address) { + return new ReadWriteGscVault({ + address, + drift: this.drift, + }); + } + + airdrop(address: Address) { + return new ReadWriteAirdrop({ + address, + drift: this.drift, + }); + } + + token(address: Address) { + return new ReadWriteToken({ + address, + drift: this.drift, + }); + } +} diff --git a/packages/council-js/src/entities/council/createCouncil.ts b/packages/council-js/src/entities/council/createCouncil.ts new file mode 100644 index 00000000..089db43c --- /dev/null +++ b/packages/council-js/src/entities/council/createCouncil.ts @@ -0,0 +1,28 @@ +import { Adapter, createDrift, Drift, ReadWriteAdapter } from "@delvtech/drift"; +import { ReadCouncil } from "src/entities/council/ReadCouncil"; +import { ReadWriteCouncil } from "src/entities/council/ReadWriteCouncil"; +import { EntityConfig } from "src/entities/Entity"; + +export function createCouncil({ + drift, + earliestBlock, + ...driftConfig +}: EntityConfig = {}): Council { + drift ||= createDrift(driftConfig); + + if (drift.isReadWrite()) { + return new ReadWriteCouncil({ + drift: drift as Drift, + earliestBlock, + }) as Council; + } + + return new ReadCouncil({ + drift, + earliestBlock, + }) as Council; +} + +export type Council = A extends ReadWriteAdapter + ? ReadWriteCouncil + : ReadCouncil; diff --git a/packages/council-js/src/entities/token/ReadToken.ts b/packages/council-js/src/entities/token/ReadToken.ts new file mode 100644 index 00000000..527d97e1 --- /dev/null +++ b/packages/council-js/src/entities/token/ReadToken.ts @@ -0,0 +1,58 @@ +import { Adapter, Contract, ContractReadOptions } from "@delvtech/drift"; +import { Address } from "abitype"; +import { ContractEntityConfig, Entity } from "src/entities/Entity"; +import { tokenAbi, TokenAbi } from "src/entities/token/abi"; + +export class ReadToken extends Entity { + contract: Contract; + + constructor({ address, ...config }: ContractEntityConfig) { + super(config); + this.contract = this.drift.contract({ + abi: tokenAbi, + address, + }); + } + + get address(): Address { + return this.contract.address; + } + + getName(): Promise { + return this.contract.read("name"); + } + + getSymbol(): Promise { + return this.contract.read("symbol"); + } + + getDecimals(): Promise { + return this.contract.read("decimals"); + } + + getAllowance({ + owner, + spender, + options, + }: { + owner: Address; + spender: Address; + options?: ContractReadOptions; + }): Promise { + return this.contract.read("allowance", { owner, spender }, options); + } + + getBalanceOf( + account: Address, + options?: ContractReadOptions, + ): Promise { + return this.contract.read("balanceOf", { account }, options); + } + + /** + * Get the total supply of the token. + */ + getTotalSupply(options?: ContractReadOptions): Promise { + return this.contract.read("totalSupply", {}, options); + } +} diff --git a/packages/council-js/src/entities/token/ReadWriteToken.ts b/packages/council-js/src/entities/token/ReadWriteToken.ts new file mode 100644 index 00000000..516a2910 --- /dev/null +++ b/packages/council-js/src/entities/token/ReadWriteToken.ts @@ -0,0 +1,38 @@ +import { Address, Hash, ReadWriteAdapter } from "@delvtech/drift"; +import { EntityWriteParams } from "src/entities/Entity"; +import { ReadToken } from "src/entities/token/ReadToken"; + +export class ReadWriteToken< + A extends ReadWriteAdapter = ReadWriteAdapter, +> extends ReadToken { + approve({ + args: { spender, amount }, + options, + }: EntityWriteParams<{ + /** + * The address of the spender. + */ + spender: Address; + /** + * The amount of tokens the spender can spend. + */ + amount: bigint; + }>): Promise { + return this.contract.write( + "approve", + { spender, amount }, + { + ...options, + onMined: (receipt) => { + if (receipt?.status === "success") { + this.contract.invalidateRead("allowance", { + owner: receipt.from, + spender, + }); + } + options?.onMined?.(receipt); + }, + }, + ); + } +} diff --git a/packages/council-js/src/entities/token/abi.ts b/packages/council-js/src/entities/token/abi.ts new file mode 100644 index 00000000..3cb7114b --- /dev/null +++ b/packages/council-js/src/entities/token/abi.ts @@ -0,0 +1,4 @@ +import { erc20 } from "@delvtech/drift/testing"; + +export const tokenAbi = erc20.abi; +export type TokenAbi = typeof tokenAbi; diff --git a/packages/council-js/src/entities/votingVault/ReadVotingVault.ts b/packages/council-js/src/entities/votingVault/ReadVotingVault.ts new file mode 100644 index 00000000..3c4f7760 --- /dev/null +++ b/packages/council-js/src/entities/votingVault/ReadVotingVault.ts @@ -0,0 +1,63 @@ +import { Adapter, Address, Bytes, Contract, RangeBlock } from "@delvtech/drift"; +import { ContractEntityConfig, Entity } from "src/entities/Entity"; +import { votingVaultAbi, VotingVaultAbi } from "src/entities/votingVault/abi"; +import { convertToBlockNumber } from "src/utils/convertToBlockNumber"; + +/** + * A vault which stores voting power by address + */ +export class ReadVotingVault extends Entity { + readonly address: Address; + readonly contract: Contract; + + constructor({ address, ...config }: ContractEntityConfig) { + super(config); + this.address = address; + this.contract = this.drift.contract({ + abi: votingVaultAbi, + address, + }); + } + + /** + * Get the usable voting power owned by a given address in this vault. + * @param extraData - ABI encoded optional extra data used by some vaults, + * such as merkle proofs. + */ + async getVotingPower({ + voter, + /** + * The block to get voting power at. Usually the creation block of a + * proposal. + */ + block, + // extraData = "0x00", + extraData = "0x", + }: { + voter: Address; + block?: RangeBlock; + extraData?: Bytes; + }): Promise { + const blockNumber = await convertToBlockNumber(block, this.drift); + + if (blockNumber === undefined) { + return 0n; + } + + return this.contract + .simulateWrite("queryVotePower", { + blockNumber, + extraData, + user: voter, + }) + .catch((error) => { + // queryVotePower throws an uninitialized an error if the account is not + // found/hasn't ever had voting power. + if (error instanceof Error && error.message.includes("uninitialized")) { + return 0n; + } + + throw error; + }); + } +} diff --git a/packages/council-js/src/entities/votingVault/abi.ts b/packages/council-js/src/entities/votingVault/abi.ts new file mode 100644 index 00000000..a82f2c8d --- /dev/null +++ b/packages/council-js/src/entities/votingVault/abi.ts @@ -0,0 +1,4 @@ +import { IVotingVault } from "@delvtech/council-artifacts/IVotingVault"; + +export const votingVaultAbi = IVotingVault.abi; +export type VotingVaultAbi = typeof votingVaultAbi; diff --git a/packages/council-js/src/entities/votingVault/gscVault/ReadGscVault.ts b/packages/council-js/src/entities/votingVault/gscVault/ReadGscVault.ts new file mode 100644 index 00000000..5ac067f2 --- /dev/null +++ b/packages/council-js/src/entities/votingVault/gscVault/ReadGscVault.ts @@ -0,0 +1,174 @@ +import { + Adapter, + Address, + Contract, + ContractReadOptions, + RangeBlock, +} from "@delvtech/drift"; +import { ContractEntityConfig } from "src/entities/Entity"; +import { + gscVaultAbi, + GscVaultAbi, +} from "src/entities/votingVault/gscVault/abi"; +import { ReadVotingVault } from "src/entities/votingVault/ReadVotingVault"; + +/** + * A VotingVault for the Governance Steering Council in which each member has a + * single vote and must maintain a minimum required voting power in the core + * voting vaults to remain eligible. + */ +export class ReadGscVault< + A extends Adapter = Adapter, +> extends ReadVotingVault { + readonly gscVaultContract: Contract; + + constructor(config: ContractEntityConfig) { + super(config); + this.gscVaultContract = this.drift.contract({ + abi: gscVaultAbi, + address: this.address, + }); + } + + /** + * Get the amount of voting power required to join this vault. + */ + getRequiredVotingPower(options?: ContractReadOptions): Promise { + return this.gscVaultContract.read("votingPowerBound", {}, options); + } + + /** + * Get all current members of this vault. + */ + async getMembers( + options: { + /** + * The block number to start searching for members from. + */ + fromBlock?: RangeBlock; + /** + * The block number to stop searching for members at. + */ + toBlock?: RangeBlock; + } = {}, + ): Promise { + const latestJoinTimestampByMember: { + [member: Address]: bigint; + } = {}; + + const joinEvents = await this.gscVaultContract.getEvents( + "MembershipProved", + options, + ); + + // Capture the latest join date of each address. + for (const { + args: { who, when }, + } of joinEvents) { + if (when > (latestJoinTimestampByMember[who] || -1n)) { + latestJoinTimestampByMember[who] = when; + } + } + + const kickEvents = await this.gscVaultContract.getEvents("Kicked", options); + + // Ignore addresses that were kicked after their latest join date. + for (const { + args: { who, when }, + } of kickEvents) { + // NOTE: the kickEvents store `when` as a block number whereas the + // joinEvents store `when` as a timestamp, so we must convert the block + // number to a timestamp so we can compare them. + const { timestamp: kickedTimestamp } = + await this.drift.getBlockOrThrow(when); + + if ( + latestJoinTimestampByMember[who] && + kickedTimestamp > latestJoinTimestampByMember[who] + ) { + delete latestJoinTimestampByMember[who]; + } + } + + return Object.keys(latestJoinTimestampByMember) as Address[]; + } + + /** + * Get the join date of a given address. + */ + async getJoinDate( + member: Address, + options?: ContractReadOptions, + ): Promise { + const secondsTimestamp = await this.gscVaultContract.read( + "members", + [member], + options, + ); + return secondsTimestamp + ? new Date(Number(secondsTimestamp * 1000n)) + : undefined; + } + + /** + * Get a boolean indicating whether a given voter is a current member. + */ + async getIsMember( + voter: Address, + options?: ContractReadOptions, + ): Promise { + return !!(await this.getJoinDate(voter, options)); + } + + /** + * Get the time (in MS) that a new GSC member must wait after joining before + * they can vote. + */ + async getIdleDuration(options?: ContractReadOptions): Promise { + const seconds = await this.gscVaultContract.read( + "idleDuration", + {}, + options, + ); + return seconds * 1000n; + } + + /** + * Get a boolean indicating whether a member is still in the idle duration. + * Idle members cannot vote. + */ + async getIsIdle( + member: Address, + options?: ContractReadOptions, + ): Promise { + const joinDate = await this.getJoinDate(member, options); + const isMember = !!joinDate; + return ( + isMember && + joinDate.getTime() + Number(await this.getIdleDuration(options)) > + Date.now() + ); + } + + /** + * Get the voting vaults a member joined with. Used to prove the member meets + * the minimum voting power requirement. + */ + async getMemberVaults( + member: Address, + options?: ContractReadOptions, + ): Promise[]> { + const vaultAddresses = await this.gscVaultContract.read( + "getUserVaults", + { who: member }, + options, + ); + return vaultAddresses.map( + (address) => + new ReadVotingVault({ + address, + drift: this.drift, + }), + ); + } +} diff --git a/packages/council-js/src/entities/votingVault/gscVault/ReadWriteGscVault.ts b/packages/council-js/src/entities/votingVault/gscVault/ReadWriteGscVault.ts new file mode 100644 index 00000000..be6ce459 --- /dev/null +++ b/packages/council-js/src/entities/votingVault/gscVault/ReadWriteGscVault.ts @@ -0,0 +1,140 @@ +import { Address, Bytes, Hash, ReadWriteAdapter } from "@delvtech/drift"; +import { EntityWriteParams } from "src/entities/Entity"; +import { ReadGscVault } from "src/entities/votingVault/gscVault/ReadGscVault"; +import { ReadVotingVault } from "src/entities/votingVault/ReadVotingVault"; + +export class ReadWriteGscVault< + A extends ReadWriteAdapter = ReadWriteAdapter, +> extends ReadGscVault { + /** + * Set the idle duration for a member in this GSC vault. The idle duration is + * the amount of time a member must be a member before they can vote. + */ + setIdleDuration({ + args: { duration }, + options, + }: EntityWriteParams<{ + /** + * The new idle duration in seconds. + */ + duration: bigint; + }>): Promise { + return this.gscVaultContract.write( + "setIdleDuration", + { _idleDuration: duration }, + { + ...options, + onMined: (receipt) => { + if (receipt?.status === "success") { + this.contract.cache.clear(); + } + options?.onMined?.(receipt); + }, + }, + ); + } + + /** + * Become a member of this GSC vault. + * @returns The transaction hash. + */ + async join({ + args: { vaults, extraVaultData = [] }, + options, + }: EntityWriteParams<{ + /** + * The addresses of the approved vaults the joining member has voting power + * in. This is used to prove the joining member meets the minimum voting + * power requirement. If voting power is moved to a different vault, the + * member will become ineligible until they join again with the new vault or + * risk being kicked. + */ + vaults: Address[]; + /** + * Extra data given to the vaults to help calculation + */ + extraVaultData?: (Bytes | undefined)[]; + }>): Promise { + // Filter out vaults with no voting power which would cause a revert. + const voter = await this.contract.getSignerAddress(); + const vaultsWithPower: Address[] = []; + const extraDataForVaultsWithPower: Bytes[] = []; + await Promise.all( + vaults.map(async (address, i) => { + const extraData = extraVaultData?.[i] || "0x"; + const readVault = new ReadVotingVault({ + address, + drift: this.drift, + }); + const power = await readVault.getVotingPower({ + voter, + extraData, + }); + + if (power > 0n) { + vaultsWithPower.push(address); + extraDataForVaultsWithPower.push(extraData); + } + }), + ); + + const extraData = vaults.map((_, i) => extraVaultData[i] || "0x"); + return this.gscVaultContract.write( + "proveMembership", + { votingVaults: vaults, extraData }, + { + ...options, + onMined: (receipt) => { + if (receipt?.status === "success") { + this.contract.cache.clear(); + } + options?.onMined?.(receipt); + }, + }, + ); + } + + /** + * Remove a member that's become ineligible from this GSC vault. A member + * becomes ineligible when the voting power in the vaults they joined with + * drops below the required minimum. + * @param account - + * @returns The transaction hash. + */ + async kick({ + args: { member, extraVaultData = [] }, + options, + }: EntityWriteParams<{ + /** + * The address of the ineligible member to kick. + */ + member: Address; + /** + * The extra data the vaults need to load the member's voting power + */ + extraVaultData?: (Bytes | undefined)[]; + }>): Promise<`0x${string}`> { + let extraData: Bytes[]; + if (!extraVaultData) { + // Get the member vaults to create the right amount of default extra data. + const memberVaults = await this.getMemberVaults(member); + extraData = memberVaults.map(() => "0x"); + } else { + extraData = extraVaultData.map((_, i) => extraVaultData[i] || "0x"); + } + + return this.gscVaultContract.write( + "kick", + { extraData, who: member }, + { + ...options, + onMined: (receipt) => { + if (receipt?.status === "success") { + this.contract.cache.clear(); + } + options?.onMined?.(receipt); + }, + }, + ); + } +} diff --git a/packages/council-js/src/entities/votingVault/gscVault/abi.ts b/packages/council-js/src/entities/votingVault/gscVault/abi.ts new file mode 100644 index 00000000..80cbcc5f --- /dev/null +++ b/packages/council-js/src/entities/votingVault/gscVault/abi.ts @@ -0,0 +1,4 @@ +import { GSCVault } from "@delvtech/council-artifacts/GSCVault"; + +export const gscVaultAbi = GSCVault.abi; +export type GscVaultAbi = typeof gscVaultAbi; diff --git a/packages/council-js/src/entities/votingVault/lockingVault/ReadLockingVault.test.ts b/packages/council-js/src/entities/votingVault/lockingVault/ReadLockingVault.test.ts new file mode 100644 index 00000000..5d1a9145 --- /dev/null +++ b/packages/council-js/src/entities/votingVault/lockingVault/ReadLockingVault.test.ts @@ -0,0 +1,127 @@ +import { createMockDrift } from "@delvtech/drift/testing"; +import { lockingVaultAbi } from "src/entities/votingVault/lockingVault/abi"; +import { ReadLockingVault } from "src/entities/votingVault/lockingVault/ReadLockingVault"; +import { VotingPowerBreakdown } from "src/entities/votingVault/types"; +import { describe, expect, it } from "vitest"; + +const ALICE = "0x123"; +const BOB = "0x456"; +const CHARLIE = "0x789"; +const DAVE = "0xabc"; +const EVE = "0xdef"; + +describe("ReadLockingVault", () => { + const drift = createMockDrift(); + function setupVault() { + const lockingVault = new ReadLockingVault({ + address: "0x", + drift, + }); + const contract = drift.contract({ + address: lockingVault.address, + abi: lockingVaultAbi, + }); + + return { lockingVault, contract }; + } + + it("Accurately breaks down voting power", async () => { + const { contract, lockingVault } = setupVault(); + + const foo = contract.onGetEvents("VoteChange").resolves([ + // Alice receives 100 + { + args: { + amount: 100n, + from: ALICE, + to: ALICE, + }, + eventName: "VoteChange", + }, + // Bob delegates 100 to Alice + { + args: { + amount: 100n, + from: BOB, + to: ALICE, + }, + eventName: "VoteChange", + }, + // Charlie delegates 100 to Alice + { + args: { + amount: 100n, + from: CHARLIE, + to: ALICE, + }, + eventName: "VoteChange", + }, + // Dave delegates 100 to Alice + { + args: { + amount: 100n, + from: DAVE, + to: ALICE, + }, + eventName: "VoteChange", + }, + // Eve receives 100 + { + args: { + amount: 100n, + from: EVE, + to: EVE, + }, + eventName: "VoteChange", + }, + // Bob changes his delegation of 100 from Alice to Eve + { + args: { + amount: -100n, + from: BOB, + to: ALICE, + }, + eventName: "VoteChange", + }, + { + args: { + amount: 100n, + from: BOB, + to: EVE, + }, + eventName: "VoteChange", + }, + ]); + + const powerBreakdown = await lockingVault.getVotingPowerBreakdown(); + + expect(powerBreakdown).toEqual([ + { + voter: ALICE, + votingPower: 300n, + votingPowerFromDelegators: 200n, + delegators: [ + { + voter: CHARLIE, + votingPower: 100n, + }, + { + voter: DAVE, + votingPower: 100n, + }, + ], + }, + { + voter: EVE, + votingPower: 200n, + votingPowerFromDelegators: 100n, + delegators: [ + { + voter: BOB, + votingPower: 100n, + }, + ], + }, + ] satisfies VotingPowerBreakdown[]); + }); +}); diff --git a/packages/council-js/src/entities/votingVault/lockingVault/ReadLockingVault.ts b/packages/council-js/src/entities/votingVault/lockingVault/ReadLockingVault.ts new file mode 100644 index 00000000..cdee03b8 --- /dev/null +++ b/packages/council-js/src/entities/votingVault/lockingVault/ReadLockingVault.ts @@ -0,0 +1,258 @@ +import { + Adapter, + Address, + Bytes, + Contract, + ContractReadOptions, + RangeBlock, +} from "@delvtech/drift"; +import { ContractEntityConfig } from "src/entities/Entity"; +import { ReadToken } from "src/entities/token/ReadToken"; +import { + lockingVaultAbi, + LockingVaultAbi, +} from "src/entities/votingVault/lockingVault/abi"; +import { ReadVotingVault } from "src/entities/votingVault/ReadVotingVault"; +import { + VoterWithPower, + VotingPowerBreakdown, +} from "src/entities/votingVault/types"; +import { convertToBlockNumber } from "src/utils/convertToBlockNumber"; + +/** + * A VotingVault that gives voting power for depositing tokens. + */ +export class ReadLockingVault< + A extends Adapter = Adapter, +> extends ReadVotingVault { + readonly lockingVaultContract: Contract; + + constructor(config: ContractEntityConfig) { + super(config); + this.lockingVaultContract = this.drift.contract({ + abi: lockingVaultAbi, + address: this.address, + }); + } + + /** + * Get the number of blocks before the delegation history is forgotten. Voting + * power from this vault can't be used on proposals that are older than the + * stale block lag. + */ + getStaleBlockLag(): Promise { + return this.lockingVaultContract.read("staleBlockLag"); + } + + /** + * Get the associated token for this LockingVault. + */ + async getToken(): Promise> { + return new ReadToken({ + address: await this.lockingVaultContract.read("token"), + drift: this.drift, + }); + } + + /** + * Get the deposit balance of a given account. + */ + async getBalanceOf( + account: Address, + options?: ContractReadOptions, + ): Promise { + const deposits = await this.lockingVaultContract.read( + "deposits", + { who: account }, + options, + ); + return deposits[1]; + } + + /** + * Get the current delegate of a given account. + */ + async getDelegate( + account: Address, + options?: ContractReadOptions, + ): Promise
{ + const { 0: delegate } = await this.lockingVaultContract.read( + "deposits", + { who: account }, + options, + ); + return delegate; + } + + /** + * Get all voters delegated to a given account in this vault. + */ + async getDelegatorsTo( + voter: Address, + options?: { + fromBlock?: RangeBlock; + toBlock?: RangeBlock; + }, + ): Promise { + const breakdown = await this.getVotingPowerBreakdown({ + voter, + ...options, + }); + return breakdown[0]?.delegators || []; + } + + /** + * Get the voting power for a given address at a given block without + * accounting for the stale block lag. + */ + async getHistoricalVotingPower({ + voter, + /** + * The block to get voting power at. Usually the creation block of a + * proposal. + */ + block, + options, + }: { + voter: Address; + block: RangeBlock; + extraData?: Bytes; + options?: ContractReadOptions; + }): Promise { + const blockNumber = await convertToBlockNumber(block, this.drift); + + if (blockNumber === undefined) { + return 0n; + } + + return this.lockingVaultContract.read( + "queryVotePowerView", + { + user: voter, + blockNumber, + }, + options, + ); + } + + /** + * Get the sum of voting power held by all voters in this vault. + */ + async getTotalVotingPower({ + fromBlock, + toBlock, + }: { + fromBlock?: RangeBlock; + toBlock?: RangeBlock; + } = {}): Promise { + const breakdown = await this.getVotingPowerBreakdown({ + fromBlock, + toBlock, + }); + return Object.values(breakdown).reduce( + (sum, { votingPower }) => sum + votingPower, + 0n, + ); + } + + /** + * Get all participants that have voting power in this vault along with their + * voting power, the amount of voting power being delegated to them, and the + * amount of power delegated to them by each delegator. This is a convenience + * method to fetch voting power and delegation data for a large number of + * voters in a single call. + */ + async getVotingPowerBreakdown({ + voter, + fromBlock, + toBlock, + }: { + /** + * Get a breakdown for a specific account. + */ + voter?: Address; + fromBlock?: RangeBlock; + toBlock?: RangeBlock; + } = {}): Promise { + const voteChangeEvents = await this.lockingVaultContract.getEvents( + "VoteChange", + { + filter: { to: voter }, + fromBlock, + toBlock, + }, + ); + + const breakdownByVoter: { + [voter: Address]: { + votingPower: bigint; + votingPowerFromDelegators: bigint; + powerByDelegator: { + [delegator: Address]: bigint; + }; + }; + } = {}; + + // Calculate the delegated voting power for each voter. + for (const { + args: { from, to, amount }, + } of voteChangeEvents) { + const breakdown = (breakdownByVoter[to] ||= { + votingPower: 0n, + votingPowerFromDelegators: 0n, + powerByDelegator: {}, + }); + + breakdown.votingPower += amount; + + // ignore self-delegation + if (from !== to) { + breakdown.votingPowerFromDelegators += amount; + breakdown.powerByDelegator[from] ??= 0n; + breakdown.powerByDelegator[from] += amount; + } + } + + let breakdowns: VotingPowerBreakdown[] = []; + + // Convert objects to arrays and filter out voters with no voting power. + for (const [voter, breakdown] of Object.entries(breakdownByVoter)) { + const { votingPower, votingPowerFromDelegators, powerByDelegator } = + breakdown; + if (votingPower <= 0n) continue; + + let delegators: VoterWithPower[] = []; + + for (const [delegator, votingPower] of Object.entries(powerByDelegator)) { + if (votingPower <= 0n) continue; + delegators.push({ + voter: delegator as Address, + votingPower, + }); + } + + breakdowns.push({ + voter: voter as Address, + votingPower, + votingPowerFromDelegators, + delegators, + }); + } + + return breakdowns; + } + + async getVoters({ + fromBlock, + toBlock, + }: { + fromBlock?: RangeBlock; + toBlock?: RangeBlock; + } = {}): Promise { + const breakdown = await this.getVotingPowerBreakdown({ + fromBlock, + toBlock, + }); + return breakdown.map(({ voter }) => voter); + } +} diff --git a/packages/council-js/src/entities/votingVault/lockingVault/ReadWriteLockingVault.ts b/packages/council-js/src/entities/votingVault/lockingVault/ReadWriteLockingVault.ts new file mode 100644 index 00000000..693e98ab --- /dev/null +++ b/packages/council-js/src/entities/votingVault/lockingVault/ReadWriteLockingVault.ts @@ -0,0 +1,113 @@ +import { + Address, + ContractWriteOptions, + Hash, + ReadWriteAdapter, +} from "@delvtech/drift"; +import { EntityWriteParams } from "src/entities/Entity"; +import { ReadWriteToken } from "src/entities/token/ReadWriteToken"; +import { ReadLockingVault } from "src/entities/votingVault/lockingVault/ReadLockingVault"; + +export class ReadWriteLockingVault< + A extends ReadWriteAdapter = ReadWriteAdapter, +> extends ReadLockingVault { + async getToken(): Promise> { + return new ReadWriteToken({ + address: await this.lockingVaultContract.read("token"), + drift: this.drift, + }); + } + + /** + * Change current delegate. + * @returns The transaction hash. + */ + changeDelegate({ + args, + options, + }: EntityWriteParams<{ + /** + * The address to delegate to. + */ + newDelegate: Address; + }>): Promise { + return this.lockingVaultContract.write("changeDelegation", args, { + ...options, + onMined: async (receipt) => { + if (receipt?.status === "success") { + this.contract.cache.clear(); + } + options?.onMined?.(receipt); + }, + }); + } + + /** + * Deposit tokens into this vault. + * @returns The transaction hash. + */ + async deposit({ + args: { account, amount, firstDelegate }, + options, + }: EntityWriteParams<{ + /** + * The amount of tokens to deposit. (formatted decimal string) + */ + amount: bigint; + /** + * The address to credit this deposit to. Defaults to the signer's address. + */ + account?: Address; + /** + * The address to delegate the resulting voting power to if the account + * doesn't already have a delegate. Defaults to funded account being + * credited. + */ + firstDelegate?: Address; + options?: ContractWriteOptions; + }>): Promise { + const fundedAccount = + account ?? (await this.lockingVaultContract.getSignerAddress()); + return this.lockingVaultContract.write( + "deposit", + { + amount, + fundedAccount, + firstDelegation: firstDelegate ?? fundedAccount, + }, + { + ...options, + onMined: async (receipt) => { + if (receipt?.status === "success") { + this.contract.cache.clear(); + } + options?.onMined?.(receipt); + }, + }, + ); + } + + /** + * Withdraw tokens from this vault. + * @returns The transaction hash. + */ + withdraw({ + args, + options, + }: EntityWriteParams<{ + /** + * The amount of tokens to withdraw. + */ + amount: bigint; + }>): Promise { + return this.lockingVaultContract.write("withdraw", args, { + ...options, + onMined: async (receipt) => { + if (receipt?.status === "success") { + this.contract.cache.clear(); + } + options?.onMined?.(receipt); + }, + }); + } +} diff --git a/packages/council-js/src/entities/votingVault/lockingVault/abi.ts b/packages/council-js/src/entities/votingVault/lockingVault/abi.ts new file mode 100644 index 00000000..1eb4246a --- /dev/null +++ b/packages/council-js/src/entities/votingVault/lockingVault/abi.ts @@ -0,0 +1,4 @@ +import { LockingVault } from "@delvtech/council-artifacts/LockingVault"; + +export const lockingVaultAbi = LockingVault.abi; +export type LockingVaultAbi = typeof lockingVaultAbi; diff --git a/packages/council-js/src/entities/votingVault/types.ts b/packages/council-js/src/entities/votingVault/types.ts new file mode 100644 index 00000000..67c2a5b8 --- /dev/null +++ b/packages/council-js/src/entities/votingVault/types.ts @@ -0,0 +1,24 @@ +import { Address } from "@delvtech/drift"; + +export type VotingPowerByVoter = { + [voter: Address]: bigint; +}; + +export interface VoterWithPower { + voter: Address; + votingPower: bigint; +} + +export interface VotingPowerBreakdown extends VoterWithPower { + /** + * The total voting power from all wallets delegated to this voter. Does not + * include self-delegation. + */ + votingPowerFromDelegators: bigint; + /** + * All wallets delegated to this voter with the power they're delegating. + * + * **Note:** Does not include self-delegation. + */ + delegators: VoterWithPower[]; +} diff --git a/packages/council-js/src/entities/votingVault/utils/mergeVotingPowerBreakdowns.ts b/packages/council-js/src/entities/votingVault/utils/mergeVotingPowerBreakdowns.ts new file mode 100644 index 00000000..ccbd0522 --- /dev/null +++ b/packages/council-js/src/entities/votingVault/utils/mergeVotingPowerBreakdowns.ts @@ -0,0 +1,72 @@ +import { Address } from "@delvtech/drift"; +import { + VoterWithPower, + VotingPowerBreakdown, +} from "src/entities/votingVault/types"; + +/** + * Merge an array of {@linkcode VotingPowerBreakdown} into a single breakdown, + * aggregating the voting power of voters and their delegators. + */ +export function mergeVotingPowerBreakdowns( + breakdowns: VotingPowerBreakdown[], +): VotingPowerBreakdown[] { + // create a temp object to merge unique addresses + const voterBreakdownMap: Map< + Address, // voter + Omit & { + delegatorsMap: Map; + } + > = new Map(); + + for (const { + delegators, + voter, + votingPower, + votingPowerFromDelegators, + } of breakdowns) { + let mergedBreakdown = voterBreakdownMap.get(voter); + + if (!mergedBreakdown) { + mergedBreakdown = { + voter, + votingPower, + votingPowerFromDelegators, + delegatorsMap: new Map( + delegators.map((delegatorWithPower) => [ + delegatorWithPower.voter, + delegatorWithPower, + ]), + ), + }; + voterBreakdownMap.set(voter, mergedBreakdown); + continue; + } + + mergedBreakdown.votingPower += votingPower; + mergedBreakdown.votingPowerFromDelegators += votingPowerFromDelegators; + + for (const { voter, votingPower } of delegators) { + let mergedDelegatorWithPower = mergedBreakdown.delegatorsMap.get(voter); + + if (!mergedDelegatorWithPower) { + mergedBreakdown.delegatorsMap.set(voter, { + voter, + votingPower, + }); + continue; + } + + mergedDelegatorWithPower.votingPower += votingPower; + } + } + + return Array.from(voterBreakdownMap.values()).map( + ({ delegatorsMap, ...rest }) => { + return { + ...rest, + delegators: Array.from(delegatorsMap.values()), + }; + }, + ); +} diff --git a/packages/council-js/src/entities/votingVault/vestingVault/ReadVestingVault.ts b/packages/council-js/src/entities/votingVault/vestingVault/ReadVestingVault.ts new file mode 100644 index 00000000..21ebfc37 --- /dev/null +++ b/packages/council-js/src/entities/votingVault/vestingVault/ReadVestingVault.ts @@ -0,0 +1,322 @@ +import { + Adapter, + Address, + BlockIdentifier, + Bytes, + Contract, + ContractReadOptions, + RangeBlock, +} from "@delvtech/drift"; +import { fixed } from "@delvtech/fixed-point-wasm"; +import { ContractEntityConfig } from "src/entities/Entity"; +import { ReadToken } from "src/entities/token/ReadToken"; +import { ReadVotingVault } from "src/entities/votingVault/ReadVotingVault"; +import { + VoterWithPower, + VotingPowerBreakdown, +} from "src/entities/votingVault/types"; +import { + vestingVaultAbi, + VestingVaultAbi, +} from "src/entities/votingVault/vestingVault/abi"; +import { Grant } from "src/entities/votingVault/vestingVault/types"; +import { convertToBlockNumber } from "src/utils/convertToBlockNumber"; + +/** + * A VotingVault that gives voting power for receiving grants and applies a + * multiplier on unvested tokens to reduce their voting power. + */ +export class ReadVestingVault< + A extends Adapter = Adapter, +> extends ReadVotingVault { + readonly vestingVaultContract: Contract; + + constructor(config: ContractEntityConfig) { + super(config); + this.vestingVaultContract = this.drift.contract({ + abi: vestingVaultAbi, + address: this.address, + }); + } + + /** + * Get the number of blocks before the delegation history is forgotten. Voting + * power from this vault can't be used on proposals that are older than the + * stale block lag. + */ + getStaleBlockLag(): Promise { + return this.vestingVaultContract.read("staleBlockLag"); + } + + /** + * Get this vault's token. + */ + async getToken(): Promise> { + return new ReadToken({ + address: await this.vestingVaultContract.read("token"), + drift: this.drift, + }); + } + + /** + * Get this vault's unvested multiplier, a number that represents the voting + * power of each unvested token as a percentage of a vested token. For example + * if unvested tokens have 50% voting power compared to vested ones, this + * value would be 50. + */ + getUnvestedMultiplier(options?: ContractReadOptions): Promise { + return this.vestingVaultContract.read("unvestedMultiplier", {}, options); + } + + /** + * Get the grant data for a given address. + */ + async getGrant( + account: Address, + options?: ContractReadOptions, + ): Promise { + const { + allocation, + cliff, + created, + delegatee, + expiration, + latestVotingPower, + range, + withdrawn, + } = await this.vestingVaultContract.read( + "getGrant", + { _who: account }, + options, + ); + return { + allocation, + cliffBlock: cliff, + createdBlock: created, + delegatee, + expirationBlock: expiration, + latestVotingPower, + range, + withdrawn, + }; + } + + /** + * Gets the amount of tokens currently claimable from the grant. + * + * Mimics internal function + * {@linkcode https://github.com/delvtech/council/blob/5f7be330b05f1c3bebd0176882cc5c3429f0764f/contracts/vaults/VestingVault.sol#L434 _getWithdrawableAmount}. + * + * @param account - The grantee account address. + * @returns The amount of claimable tokens. + */ + async getWithdrawableAmount( + account: Address, + options?: ContractReadOptions, + ): Promise { + const { allocation, createdBlock, cliffBlock, expirationBlock, withdrawn } = + await this.getGrant(account, options); + + let currentBlock = 0n; + if (typeof options?.block === "bigint") { + currentBlock = options.block; + } else { + const { number } = await this.drift.getBlockOrThrow(options?.block); + if (number === undefined) { + return 0n; + } + currentBlock = number; + } + + // funds are not unlocked + if (currentBlock < cliffBlock) { + return 0n; + } + + // all funds are claimable + if (currentBlock >= expirationBlock) { + return allocation - withdrawn; + } + + const vestedBlocks = currentBlock - createdBlock; + const grantDurationBlocks = expirationBlock - createdBlock; + const amount = fixed(allocation).mul(vestedBlocks).div(grantDurationBlocks); + + return amount.bigint - withdrawn; + } + + /** + * Get the current delegate of a given account. + */ + async getDelegate( + account: Address, + options?: ContractReadOptions, + ): Promise
{ + const { delegatee } = await this.getGrant(account, options); + return delegatee; + } + + /** + * Get all voters delegated to a given account in this vault. + */ + async getDelegatorsTo( + voter: Address, + options?: { + fromBlock?: RangeBlock; + toBlock?: RangeBlock; + }, + ): Promise { + const breakdown = await this.getVotingPowerBreakdown({ + voter, + ...options, + }); + return breakdown[0]?.delegators || []; + } + + /** + * Get the voting power for a given address at a given block without + * accounting for the stale block lag. + */ + async getHistoricalVotingPower({ + voter, + /** + * The block to get voting power at. Usually the creation block of a + * proposal. + */ + block, + }: { + voter: Address; + block?: BlockIdentifier; + extraData?: Bytes; + }): Promise { + const blockNumber = await convertToBlockNumber(block, this.drift); + + if (blockNumber === undefined) { + return 0n; + } + + return this.vestingVaultContract.read("queryVotePowerView", { + user: voter, + blockNumber, + }); + } + + /** + * Get the sum of voting power held by all voters in this vault. + */ + async getTotalVotingPower({ + fromBlock, + toBlock, + }: { + fromBlock?: RangeBlock; + toBlock?: RangeBlock; + } = {}): Promise { + const breakdown = await this.getVotingPowerBreakdown({ + fromBlock, + toBlock, + }); + return Object.values(breakdown).reduce( + (sum, { votingPower }) => sum + votingPower, + 0n, + ); + } + + /** + * Get all participants that have voting power in this vault along with their + * voting power, the amount of voting power being delegated to them, and the + * amount of power delegated to them by each delegator. This is a convenience + * method to fetch voting power and delegation data for a large number of + * voters in a single call. + */ + async getVotingPowerBreakdown({ + voter, + fromBlock, + toBlock, + }: { + /** + * Get a breakdown for a specific account. + */ + voter?: Address; + fromBlock?: RangeBlock; + toBlock?: RangeBlock; + } = {}): Promise { + const voteChangeEvents = await this.vestingVaultContract.getEvents( + "VoteChange", + { + filter: { to: voter }, + fromBlock, + toBlock, + }, + ); + + const breakdownByVoter: { + [voter: Address]: { + votingPower: bigint; + votingPowerFromDelegators: bigint; + powerByDelegator: { + [delegator: Address]: bigint; + }; + }; + } = {}; + + // Calculate the delegated voting power for each voter. + for (const { + args: { from, to, amount }, + } of voteChangeEvents) { + const breakdown = (breakdownByVoter[to] ||= { + votingPower: 0n, + votingPowerFromDelegators: 0n, + powerByDelegator: {}, + }); + + breakdown.votingPower += amount; + + // ignore self-delegation + if (from !== to) { + breakdown.votingPowerFromDelegators += amount; + breakdown.powerByDelegator[from] ??= 0n; + breakdown.powerByDelegator[from] += amount; + } + } + + // Convert objects to arrays and filter out voters with no voting power. + let breakdowns: VotingPowerBreakdown[] = []; + for (const [ + voter, + { votingPower, votingPowerFromDelegators, powerByDelegator }, + ] of Object.entries(breakdownByVoter)) { + if (votingPower <= 0n) continue; + let delegators: VoterWithPower[] = []; + for (const [delegator, power] of Object.entries(powerByDelegator)) { + if (votingPower <= 0n) continue; + delegators.push({ + voter: delegator as Address, + votingPower: power, + }); + } + + breakdowns.push({ + voter: voter as Address, + votingPower, + votingPowerFromDelegators, + delegators, + }); + } + + return breakdowns; + } + + async getVoters({ + fromBlock, + toBlock, + }: { + fromBlock?: RangeBlock; + toBlock?: RangeBlock; + } = {}): Promise { + const breakdown = await this.getVotingPowerBreakdown({ + fromBlock, + toBlock, + }); + return breakdown.map(({ voter }) => voter); + } +} diff --git a/packages/council-js/src/entities/votingVault/vestingVault/ReadWriteVestingVault.ts b/packages/council-js/src/entities/votingVault/vestingVault/ReadWriteVestingVault.ts new file mode 100644 index 00000000..36dd8bf1 --- /dev/null +++ b/packages/council-js/src/entities/votingVault/vestingVault/ReadWriteVestingVault.ts @@ -0,0 +1,74 @@ +import { + Address, + ContractWriteOptions, + Hash, + OnMinedParam, + ReadWriteAdapter, +} from "@delvtech/drift"; +import { EntityWriteParams } from "src/entities/Entity"; +import { ReadWriteToken } from "src/entities/token/ReadWriteToken"; +import { ReadVestingVault } from "src/entities/votingVault/vestingVault/ReadVestingVault"; + +export class ReadWriteVestingVault< + A extends ReadWriteAdapter = ReadWriteAdapter, +> extends ReadVestingVault { + async getToken(): Promise> { + return new ReadWriteToken({ + address: await this.vestingVaultContract.read("token"), + drift: this.drift, + }); + } + + /** + * Change current delegate. + * @returns The transaction hash. + */ + changeDelegate({ + /** + * The address to delegate to. Defaults to the signer's + * address. + */ + args: { newDelegate }, + options, + }: EntityWriteParams<{ + newDelegate: Address; + }>): Promise { + return this.vestingVaultContract.write( + "delegate", + { _to: newDelegate }, + { + ...options, + onMined: (receipt) => { + if (receipt?.status === "success") { + this.contract.cache.clear(); + } + options?.onMined?.(receipt); + }, + }, + ); + } + + /** + * Claim a grant and withdraw the tokens. + * @returns The transaction hash. + */ + claim({ + options, + }: { + options?: ContractWriteOptions & OnMinedParam; + } = {}): Promise { + return this.vestingVaultContract.write( + "claim", + {}, + { + ...options, + onMined: (receipt) => { + if (receipt?.status === "success") { + this.contract.cache.clear(); + } + options?.onMined?.(receipt); + }, + }, + ); + } +} diff --git a/packages/council-js/src/entities/votingVault/vestingVault/abi.ts b/packages/council-js/src/entities/votingVault/vestingVault/abi.ts new file mode 100644 index 00000000..01bac113 --- /dev/null +++ b/packages/council-js/src/entities/votingVault/vestingVault/abi.ts @@ -0,0 +1,4 @@ +import { VestingVault } from "@delvtech/council-artifacts/VestingVault"; + +export const vestingVaultAbi = VestingVault.abi; +export type VestingVaultAbi = typeof vestingVaultAbi; diff --git a/packages/council-js/src/entities/votingVault/vestingVault/types.ts b/packages/council-js/src/entities/votingVault/vestingVault/types.ts new file mode 100644 index 00000000..ecca189a --- /dev/null +++ b/packages/council-js/src/entities/votingVault/vestingVault/types.ts @@ -0,0 +1,12 @@ +import { Address } from "@delvtech/drift"; + +export type Grant = { + allocation: bigint; + withdrawn: bigint; + createdBlock: bigint; + expirationBlock: bigint; + cliffBlock: bigint; + latestVotingPower: bigint; + delegatee: Address; + range: readonly [bigint, bigint]; +}; diff --git a/packages/council-js/src/error.ts b/packages/council-js/src/error.ts new file mode 100644 index 00000000..1dd5e1d0 --- /dev/null +++ b/packages/council-js/src/error.ts @@ -0,0 +1,11 @@ +import { DriftError } from "@delvtech/drift"; + +export class CouncilSdkError extends DriftError { + constructor(error: any, options?: ErrorOptions) { + super(error, { + prefix: "🅲 ", + name: "Council SDK Error", + ...options, + }); + } +} diff --git a/packages/council-js/src/index.ts b/packages/council-js/src/index.ts new file mode 100644 index 00000000..3124a3d0 --- /dev/null +++ b/packages/council-js/src/index.ts @@ -0,0 +1,79 @@ +// Core voting +export { coreVotingAbi, type CoreVotingAbi } from "src/entities/coreVoting/abi"; +export { + BALLOTS, + EXECUTED_PROPOSAL_HASH, +} from "src/entities/coreVoting/constants"; +export { ReadCoreVoting } from "src/entities/coreVoting/ReadCoreVoting"; +export { ReadWriteCoreVoting } from "src/entities/coreVoting/ReadWriteCoreVoting"; +export type { + Actions, + Ballot, + ExecutedProposal, + Proposal, + ProposalCreation, + ProposalExecution, + ProposalStatus, + ProposalWithState, + UnknownProposal, + Vote, + VoteResults, +} from "src/entities/coreVoting/types"; + +// Council +export { + createCouncil, + type Council, +} from "src/entities/council/createCouncil"; +export { ReadCouncil } from "src/entities/council/ReadCouncil"; +export { ReadWriteCouncil } from "src/entities/council/ReadWriteCouncil"; + +// Voting vaults +export { + votingVaultAbi, + type VotingVaultAbi, +} from "src/entities/votingVault/abi"; +export { ReadVotingVault } from "src/entities/votingVault/ReadVotingVault"; +export type { + VoterWithPower, + VotingPowerBreakdown, + VotingPowerByVoter, +} from "src/entities/votingVault/types"; +export { mergeVotingPowerBreakdowns } from "src/entities/votingVault/utils/mergeVotingPowerBreakdowns"; + +// GSC vault +export { + gscVaultAbi, + type GscVaultAbi, +} from "src/entities/votingVault/gscVault/abi"; +export { ReadGscVault } from "src/entities/votingVault/gscVault/ReadGscVault"; +export { ReadWriteGscVault } from "src/entities/votingVault/gscVault/ReadWriteGscVault"; + +// Locking vault +export { + lockingVaultAbi, + type LockingVaultAbi, +} from "src/entities/votingVault/lockingVault/abi"; +export { ReadLockingVault } from "src/entities/votingVault/lockingVault/ReadLockingVault"; +export { ReadWriteLockingVault } from "src/entities/votingVault/lockingVault/ReadWriteLockingVault"; + +// Vesting vault +export { + vestingVaultAbi, + type VestingVaultAbi, +} from "src/entities/votingVault/vestingVault/abi"; +export { ReadVestingVault } from "src/entities/votingVault/vestingVault/ReadVestingVault"; +export { ReadWriteVestingVault } from "src/entities/votingVault/vestingVault/ReadWriteVestingVault"; + +// Airdrop +export { airdropAbi, type AirdropAbi } from "src/entities/airdrop/abi"; +export { ReadAirdrop } from "src/entities/airdrop/ReadAirdrop"; +export { ReadWriteAirdrop } from "src/entities/airdrop/ReadWriteAirdrop"; + +// Token +export { tokenAbi, type TokenAbi } from "src/entities/token/abi"; +export { ReadToken } from "src/entities/token/ReadToken"; +export { ReadWriteToken } from "src/entities/token/ReadWriteToken"; + +// Error +export { CouncilSdkError } from "src/error"; diff --git a/packages/council-js/src/utils/convertToBlockNumber.ts b/packages/council-js/src/utils/convertToBlockNumber.ts new file mode 100644 index 00000000..688ae017 --- /dev/null +++ b/packages/council-js/src/utils/convertToBlockNumber.ts @@ -0,0 +1,17 @@ +import { BlockIdentifier, Drift, MaybePromise } from "@delvtech/drift"; + +/** + * Converts a {@linkcode BlockIdentifier} to a block number by + * fetching it from the drift instance if it's not already a number. + * + * @internal + */ +export function convertToBlockNumber( + block: BlockIdentifier | undefined, + drift: Drift, +): MaybePromise { + if (typeof block === "bigint") { + return block; + } + return drift.getBlock(block).then((block) => block?.number); +} diff --git a/packages/council-js/src/utils/convertToRangeBlock.ts b/packages/council-js/src/utils/convertToRangeBlock.ts new file mode 100644 index 00000000..68058b86 --- /dev/null +++ b/packages/council-js/src/utils/convertToRangeBlock.ts @@ -0,0 +1,23 @@ +import { + BlockIdentifier, + Drift, + isHexString, + MaybePromise, + RangeBlock, +} from "@delvtech/drift"; + +/** + * Converts a {@linkcode BlockIdentifier} to a {@linkcode RangeBlock} by + * fetching the block number from the drift instance if the block is a hash. + * + * @internal + */ +export function convertToRangeBlock( + block: BlockIdentifier | undefined, + drift: Drift, +): MaybePromise { + if (isHexString(block)) { + return drift.getBlock(block).then((block) => block?.number); + } + return block; +} diff --git a/packages/council-js/src/utils/getEventsWithSplitAndRetry.ts b/packages/council-js/src/utils/getEventsWithSplitAndRetry.ts new file mode 100644 index 00000000..5f5dea50 --- /dev/null +++ b/packages/council-js/src/utils/getEventsWithSplitAndRetry.ts @@ -0,0 +1,130 @@ +import { + Abi, + Drift, + EventLog, + EventName, + GetEventsParams, +} from "@delvtech/drift"; +import { CouncilSdkError } from "src/error"; + +/** + * @internal + */ +export async function getEventsWithSplitAndRetry< + A extends Abi, + E extends EventName, +>({ + params, + drift, + earliestBlock, + /** + * The maximum number of times to split failed event requests into smaller + * requests before giving up. Defaults to 4. + */ + retries = 4, +}: { + params: GetEventsParams; + drift: Drift; + earliestBlock?: bigint; + retries?: number; +}): Promise[]> { + let chunkedParams = [params]; + let error: Error | undefined; + + while (retries) { + let nextChunkedParams: GetEventsParams[] = []; + let nextError; + + const chunkedEvents = await Promise.all( + chunkedParams.map(async (params) => { + let { fromBlock, toBlock } = params; + + // Check the cache for the chunk + const cacheKey = await drift.cache.eventsKey(params); + if (await drift.cache.has(cacheKey)) { + nextChunkedParams.push(params); + return drift.cache.get(cacheKey) as Promise[]>; + } + + const chunk = await drift.adapter + .getEvents(params) + // Split the request into 2 smaller requests if it throws an error + .catch(async (e) => { + nextError = new CouncilSdkError(e); + + // Check if the chunk is too small to split + if ( + [0n, "earliest", fromBlock].includes(toBlock) || + // Implies the chunk starts at "finalized", "latest", "safe", or "pending" + (typeof fromBlock === "string" && fromBlock !== "earliest") + ) { + throw nextError; + } + + // Coerce fromBlock and toBlock to bigints to find the middle + if (typeof fromBlock !== "bigint") { + fromBlock = earliestBlock || 0n; + } + if (typeof toBlock !== "bigint") { + const block = await drift.getBlock(); + if (!block?.number) { + throw nextError; + } + toBlock = block.number; + } + + // Check again if they're the same after coercion + if (fromBlock === toBlock) { + throw nextError; + } + + const middleBlock = fromBlock + (toBlock - fromBlock) / 2n; + nextChunkedParams.push( + { + ...params, + fromBlock, + toBlock: middleBlock, + }, + { + ...params, + fromBlock: middleBlock + 1n, + toBlock, + }, + ); + }); + + if (chunk) { + drift.cache.preloadEvents({ + ...params, + value: chunk, + }); + nextChunkedParams.push(params); + return chunk; + } + + return []; + }), + ); + + if (!nextError) { + return chunkedEvents.flat(); + } + + console.warn( + `Failed to fetch '${params.event}' events from ${params.address}. Retrying with ${ + nextChunkedParams.length + } smaller requests.`, + ); + + chunkedParams = nextChunkedParams; + error = nextError; + retries--; + } + + throw ( + error || + new CouncilSdkError( + `Unknown error fetching '${params.event}' events from ${params.address}`, + ) + ); +} diff --git a/packages/council-core/tsconfig.json b/packages/council-js/tsconfig.json similarity index 100% rename from packages/council-core/tsconfig.json rename to packages/council-js/tsconfig.json diff --git a/packages/council-viem/tsup.config.ts b/packages/council-js/tsup.config.ts similarity index 81% rename from packages/council-viem/tsup.config.ts rename to packages/council-js/tsup.config.ts index 7924d73c..fed259d9 100644 --- a/packages/council-viem/tsup.config.ts +++ b/packages/council-js/tsup.config.ts @@ -2,11 +2,12 @@ import { defineConfig } from "tsup"; export default defineConfig({ entry: ["src/index.ts"], - format: ["esm"], + format: ["esm", "cjs"], sourcemap: true, dts: true, clean: true, minify: true, shims: true, cjsInterop: true, + splitting: true, }); diff --git a/packages/council-core/typedoc.json b/packages/council-js/typedoc.json similarity index 100% rename from packages/council-core/typedoc.json rename to packages/council-js/typedoc.json diff --git a/packages/council-viem/vitest.config.ts b/packages/council-js/vitest.config.ts similarity index 80% rename from packages/council-viem/vitest.config.ts rename to packages/council-js/vitest.config.ts index 430cf4b6..f3db8088 100644 --- a/packages/council-viem/vitest.config.ts +++ b/packages/council-js/vitest.config.ts @@ -7,7 +7,7 @@ export default defineConfig({ }, coverage: { // get coverage for all of source except the example dir - include: ["./src/{!(example),}/**/*.ts"] - } + include: ["./src/**/*.ts"], + }, }, }); diff --git a/packages/council-viem/.eslintrc b/packages/council-viem/.eslintrc deleted file mode 100644 index f533fc62..00000000 --- a/packages/council-viem/.eslintrc +++ /dev/null @@ -1,4 +0,0 @@ -{ - "root": true, - "extends": ["@council/eslint-config"] -} diff --git a/packages/council-viem/.gitignore b/packages/council-viem/.gitignore deleted file mode 100644 index db4c6d9b..00000000 --- a/packages/council-viem/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -dist -node_modules \ No newline at end of file diff --git a/packages/council-viem/CHANGELOG.md b/packages/council-viem/CHANGELOG.md deleted file mode 100644 index 52f57038..00000000 --- a/packages/council-viem/CHANGELOG.md +++ /dev/null @@ -1,32 +0,0 @@ -# @delvtech/council-viem - -## 0.1.0 - -### Minor Changes - -- e742438: Updated license to AGPL-3.0 - -### Patch Changes - -- Updated dependencies [e742438] - - @delvtech/council-core@0.1.0 - -## 0.0.3 - -### Patch Changes - -- @delvtech/council-core@0.0.3 - -## 0.0.2 - -### Patch Changes - -- @delvtech/council-core@0.0.2 - -## 0.0.1 - -### Patch Changes - -- abebf3c: Initial release 🚀 -- Updated dependencies [abebf3c] - - @delvtech/council-core@0.0.1 diff --git a/packages/council-viem/LICENSE b/packages/council-viem/LICENSE deleted file mode 100644 index 0ad25db4..00000000 --- a/packages/council-viem/LICENSE +++ /dev/null @@ -1,661 +0,0 @@ - GNU AFFERO GENERAL PUBLIC LICENSE - Version 3, 19 November 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU Affero General Public License is a free, copyleft license for -software and other kinds of works, specifically designed to ensure -cooperation with the community in the case of network server software. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -our General Public Licenses are intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - Developers that use our General Public Licenses protect your rights -with two steps: (1) assert copyright on the software, and (2) offer -you this License which gives you legal permission to copy, distribute -and/or modify the software. - - A secondary benefit of defending all users' freedom is that -improvements made in alternate versions of the program, if they -receive widespread use, become available for other developers to -incorporate. Many developers of free software are heartened and -encouraged by the resulting cooperation. However, in the case of -software used on network servers, this result may fail to come about. -The GNU General Public License permits making a modified version and -letting the public access it on a server without ever releasing its -source code to the public. - - The GNU Affero General Public License is designed specifically to -ensure that, in such cases, the modified source code becomes available -to the community. It requires the operator of a network server to -provide the source code of the modified version running there to the -users of that server. Therefore, public use of a modified version, on -a publicly accessible server, gives the public access to the source -code of the modified version. - - An older license, called the Affero General Public License and -published by Affero, was designed to accomplish similar goals. This is -a different license, not a version of the Affero GPL, but Affero has -released a new version of the Affero GPL which permits relicensing under -this license. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU Affero General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Remote Network Interaction; Use with the GNU General Public License. - - Notwithstanding any other provision of this License, if you modify the -Program, your modified version must prominently offer all users -interacting with it remotely through a computer network (if your version -supports such interaction) an opportunity to receive the Corresponding -Source of your version by providing access to the Corresponding Source -from a network server at no charge, through some standard or customary -means of facilitating copying of software. This Corresponding Source -shall include the Corresponding Source for any work covered by version 3 -of the GNU General Public License that is incorporated pursuant to the -following paragraph. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the work with which it is combined will remain governed by version -3 of the GNU General Public License. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU Affero General Public License from time to time. Such new versions -will be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU Affero General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU Affero General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU Affero General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published - by the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If your software can interact with users remotely through a computer -network, you should also make sure that it provides a way for users to -get its source. For example, if your program is a web application, its -interface could display a "Source" link that leads users to an archive -of the code. There are many ways you could offer source, and different -solutions will be better for different programs; see section 13 for the -specific requirements. - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU AGPL, see -. diff --git a/packages/council-viem/README.md b/packages/council-viem/README.md deleted file mode 100644 index 2d1963d6..00000000 --- a/packages/council-viem/README.md +++ /dev/null @@ -1 +0,0 @@ -# Viem integrations for the @delvtech/evm-client diff --git a/packages/council-viem/package.json b/packages/council-viem/package.json deleted file mode 100644 index 3bf01902..00000000 --- a/packages/council-viem/package.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "@delvtech/council-viem", - "version": "0.1.0", - "license": "AGPL-3.0", - "type": "module", - "main": "dist/index.js", - "types": "dist/index.d.ts", - "exports": { - ".": { - "types": "./dist/index.d.ts", - "default": "./dist/index.js" - } - }, - "scripts": { - "build": "tsup", - "watch": "tsup --watch", - "test": "vitest run", - "test:watch": "vitest --reporter=verbose", - "typecheck": "tsc --noEmit" - }, - "peerDependencies": { - "viem": ">=2" - }, - "dependencies": { - "@delvtech/council-core": "0.1.0", - "@delvtech/evm-client-viem": "^0.6.1" - }, - "devDependencies": { - "@council/eslint-config": "*", - "@council/tsconfig": "*", - "tsup": "^8.0.2", - "typescript": "^5.3.3", - "viem": "^2.16.2", - "vitest": "^1.3.1" - }, - "publishConfig": { - "access": "public" - }, - "files": [ - "dist" - ] -} diff --git a/packages/council-viem/src/contract/createReadContractFactory.ts b/packages/council-viem/src/contract/createReadContractFactory.ts deleted file mode 100644 index aafef960..00000000 --- a/packages/council-viem/src/contract/createReadContractFactory.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { - ReadContractFactory, - extendReadContract, -} from "@delvtech/council-core"; -import { - SimpleCache, - createNetwork, - createReadContract, -} from "@delvtech/evm-client-viem"; -import { PublicClient } from "viem"; - -export interface CreateReadContractFactoryOptions { - publicClient: PublicClient; - cache?: SimpleCache; - namespace?: string; -} - -export function createReadContractFactory( - factoryOptions: CreateReadContractFactoryOptions, -): ReadContractFactory { - return (instanceOptions) => { - const options = { - ...factoryOptions, - ...instanceOptions, - }; - - const viemReadContract = createReadContract({ - abi: options.abi, - address: options.address, - publicClient: options.publicClient, - }); - - const viemNetwork = createNetwork(options.publicClient); - - // Adds custom event fetching logic to the base contract before caching. - return extendReadContract({ - ...options, - contract: viemReadContract, - network: viemNetwork, - }); - }; -} diff --git a/packages/council-viem/src/contract/createReadWriteContractFactory.ts b/packages/council-viem/src/contract/createReadWriteContractFactory.ts deleted file mode 100644 index 39659bc2..00000000 --- a/packages/council-viem/src/contract/createReadWriteContractFactory.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { - ReadWriteContractFactory, - extendReadWriteContract, -} from "@delvtech/council-core"; -import { - createNetwork, - createReadWriteContract, -} from "@delvtech/evm-client-viem"; -import { CreateReadContractFactoryOptions } from "src/contract/createReadContractFactory"; -import { WalletClient } from "viem"; - -export interface CreateReadWriteContractFactoryOptions - extends CreateReadContractFactoryOptions { - walletClient: WalletClient; -} - -export function createReadWriteContractFactory( - factoryOptions: CreateReadWriteContractFactoryOptions, -): ReadWriteContractFactory { - return (instanceOptions) => { - const options = { - ...factoryOptions, - ...instanceOptions, - }; - - const viemReadWriteContract = createReadWriteContract({ - abi: options.abi, - address: options.address, - publicClient: options.publicClient, - walletClient: options.walletClient, - }); - - const viemNetwork = createNetwork(options.publicClient); - - // Adds custom event fetching logic to the base contract before caching. - return extendReadWriteContract({ - ...options, - contract: viemReadWriteContract, - network: viemNetwork, - }); - }; -} diff --git a/packages/council-viem/src/index.ts b/packages/council-viem/src/index.ts deleted file mode 100644 index e0b29a17..00000000 --- a/packages/council-viem/src/index.ts +++ /dev/null @@ -1,39 +0,0 @@ -// Client -export { - createReadContractFactory, - type CreateReadContractFactoryOptions, -} from "src/contract/createReadContractFactory"; -export { - createReadWriteContractFactory, - type CreateReadWriteContractFactoryOptions, -} from "src/contract/createReadWriteContractFactory"; - -// Client Re-exports -export * from "@delvtech/evm-client-viem"; - -// Council -export { - ReadCouncil, - type ReadCouncilOptions, -} from "src/models/council/ReadCouncil"; -export { - ReadWriteCouncil, - type ReadWriteCouncilOptions, -} from "src/models/council/ReadWriteCouncil"; -export { - ReadWriteMockToken, - type ReadWriteMockTokenOptions, -} from "src/models/token/ReadWriteMockToken"; - -// Council Core Re-exports -export * from "@delvtech/council-core/airdrop"; -export * from "@delvtech/council-core/contract"; -export * from "@delvtech/council-core/errors"; -export * from "@delvtech/council-core/model"; -export * from "@delvtech/council-core/proposal"; -export { ReadToken, type ReadTokenOptions } from "@delvtech/council-core/token"; -export * from "@delvtech/council-core/utils"; -export * from "@delvtech/council-core/vaults"; -export * from "@delvtech/council-core/vote"; -export * from "@delvtech/council-core/voter"; -export * from "@delvtech/council-core/voting"; diff --git a/packages/council-viem/src/models/council/ReadCouncil.ts b/packages/council-viem/src/models/council/ReadCouncil.ts deleted file mode 100644 index a172ec44..00000000 --- a/packages/council-viem/src/models/council/ReadCouncil.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { ReadCouncil as BaseReadCouncil } from "@delvtech/council-core"; -import { SimpleCache, createNetwork } from "@delvtech/evm-client-viem"; -import { createReadContractFactory } from "src/contract/createReadContractFactory"; -import { PublicClient } from "viem"; - -export interface ReadCouncilOptions { - publicClient: PublicClient; - cache?: SimpleCache; - /** - * A namespace to distinguish this instance from others in the cache by - * prefixing all cache keys. - */ - namespace?: string; -} - -export class ReadCouncil extends BaseReadCouncil { - constructor({ publicClient, cache, namespace }: ReadCouncilOptions) { - super({ - name: namespace, - network: createNetwork(publicClient), - contractFactory: createReadContractFactory({ - publicClient, - cache, - namespace, - }), - }); - } -} diff --git a/packages/council-viem/src/models/council/ReadWriteCouncil.ts b/packages/council-viem/src/models/council/ReadWriteCouncil.ts deleted file mode 100644 index defff99a..00000000 --- a/packages/council-viem/src/models/council/ReadWriteCouncil.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { - ReadWriteCouncil as BaseReadWriteCouncil, - ReadCouncil, -} from "@delvtech/council-core"; -import { createNetwork } from "@delvtech/evm-client-viem"; -import { createReadWriteContractFactory } from "src/contract/createReadWriteContractFactory"; -import { ReadCouncilOptions } from "src/models/council/ReadCouncil"; -import { WalletClient } from "viem"; - -export interface ReadWriteCouncilOptions extends ReadCouncilOptions { - walletClient: WalletClient; - readCouncil?: ReadCouncil; -} - -export class ReadWriteCouncil extends BaseReadWriteCouncil { - constructor({ - publicClient, - walletClient, - cache, - namespace, - }: ReadWriteCouncilOptions) { - super({ - name: namespace, - network: createNetwork(publicClient), - contractFactory: createReadWriteContractFactory({ - publicClient, - walletClient, - cache, - namespace, - }), - }); - } -} diff --git a/packages/council-viem/src/models/token/ReadWriteMockToken.ts b/packages/council-viem/src/models/token/ReadWriteMockToken.ts deleted file mode 100644 index 9cee9bfe..00000000 --- a/packages/council-viem/src/models/token/ReadWriteMockToken.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { ReadWriteMockToken as BaseReadWriteMockToken } from "@delvtech/council-core"; -import { SimpleCache, createNetwork } from "@delvtech/evm-client-viem"; -import { createReadWriteContractFactory } from "src/contract/createReadWriteContractFactory"; -import { PublicClient, WalletClient } from "viem"; - -export interface ReadWriteMockTokenOptions { - address: `0x${string}`; - publicClient: PublicClient; - walletClient: WalletClient; - cache?: SimpleCache; - /** - * A namespace to distinguish this instance from others in the cache by - * prefixing all cache keys. - */ - namespace?: string; -} - -export class ReadWriteMockToken extends BaseReadWriteMockToken { - constructor({ - address, - publicClient, - walletClient, - cache, - namespace, - }: ReadWriteMockTokenOptions) { - super({ - address, - name: namespace, - network: createNetwork(publicClient), - contractFactory: createReadWriteContractFactory({ - publicClient, - walletClient, - cache, - namespace, - }), - }); - } -} diff --git a/packages/council-viem/src/test/integration/ReadCoreVoting.test.ts b/packages/council-viem/src/test/integration/ReadCoreVoting.test.ts deleted file mode 100644 index 7687fa9a..00000000 --- a/packages/council-viem/src/test/integration/ReadCoreVoting.test.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { ReadLockingVault } from "@delvtech/council-core"; -import { createNetwork, createReadContractFactory } from "src/index"; -import { createPublicClient, http } from "viem"; -import { expect, test } from "vitest"; - -const rpcUrl = process.env.TEST_RPC_URL || "http://localhost:8545"; - -test.todo("It fetches events", async () => { - const client = createPublicClient({ - transport: http(rpcUrl), - }); - const lockingVault = new ReadLockingVault({ - address: "0x", - contractFactory: createReadContractFactory({ - publicClient: client, - }), - network: createNetwork(client), - }); - - const result = await lockingVault.getDelegatorsTo({ - account: "0x", - }); - console.log("result:", result); - - expect(result).toBeDefined(); -}); diff --git a/packages/council-viem/tsconfig.json b/packages/council-viem/tsconfig.json deleted file mode 100644 index 161d563b..00000000 --- a/packages/council-viem/tsconfig.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "extends": "@council/tsconfig/base.json", - "include": ["src"], - "exclude": ["node_modules"], - "compilerOptions": { - "rootDir": ".", - "baseUrl": ".", - "target": "esnext", - "module": "ESNext", - "moduleResolution": "Bundler", - "paths": { - "src/*": ["src/*"], - }, - "resolveJsonModule": true, - }, -} diff --git a/turbo.json b/turbo.json index 6b8d81c1..5f96366a 100644 --- a/turbo.json +++ b/turbo.json @@ -1,7 +1,7 @@ { "$schema": "https://turborepo.org/schema.json", "globalDependencies": ["**/.env.*local"], - "pipeline": { + "tasks": { "build": { "dependsOn": ["^build"], "outputs": ["dist/**", ".next/**"] @@ -21,46 +21,13 @@ "NEXT_PUBLIC_WALLET_CONNECT_PROJECT_ID" ] }, - "council-sdk-starter#build": { + "@delvtech/council-js#build": { "dependsOn": ["^build"], - "outputs": ["dist/**"], - "env": ["PROVIDER_URI", "WALLET_PRIVATE_KEY", "NODE_ENV"] - }, - "@council/sdk#build": { - "dependsOn": ["^build"], - "outputs": ["dist/**"], - "env": ["PROVIDER_URI", "EXAMPLE_WALLET_PRIVATE_KEY", "NODE_ENV"] - }, - "@council/cli": { - "env": [ - "RPC_URL", - "WALLET_PRIVATE_KEY", - "CHAIN", - "VOTING_TOKEN_ADDRESS", - "VOTING_TOKEN_DECIMALS", - "VOTING_TOKEN_NAME", - "VOTING_TOKEN_SYMBOL", - "BASE_QUORUM", - "MIN_PROPOSAL_POWER", - "LOCK_DURATION", - "EXTRA_VOTING_BLOCKS", - "TIMELOCK_WAIT_TIME", - "TREASURY_ADDRESS", - "STALE_BLOCK_LAG", - "GSC_QUORUM", - "GSC_LOCK_DURATION", - "GSC_EXTRA_VOTING_BLOCKS", - "GSC_VOTING_POWER_BOUND", - "GSC_IDLE_DURATION" - ] + "outputs": ["dist/**"] }, - "@council/cli#build": { + "@delvtech/council-cli#build": { "dependsOn": ["^build"], - "outputs": ["dist/**"], - "env": ["NODE_ENV"] - }, - "@delvtech/council-viem": { - "env": ["TEST_RPC_URL"] + "outputs": ["dist/**"] }, "lint": { "dependsOn": ["^build"], diff --git a/yarn.lock b/yarn.lock index d6cbde6b..ea2a420b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,11 +2,6 @@ # yarn lockfile v1 -"@aashutoshrathi/word-wrap@^1.2.3": - version "1.2.6" - resolved "https://registry.yarnpkg.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf" - integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== - "@adraffy/ens-normalize@1.10.0": version "1.10.0" resolved "https://registry.yarnpkg.com/@adraffy/ens-normalize/-/ens-normalize-1.10.0.tgz#d2a39395c587e092d77cbbc80acf956a54f38bf7" @@ -17,248 +12,194 @@ resolved "https://registry.yarnpkg.com/@adraffy/ens-normalize/-/ens-normalize-1.10.1.tgz#63430d04bd8c5e74f8d7d049338f1cd9d4f02069" integrity sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw== -"@adraffy/ens-normalize@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@adraffy/ens-normalize/-/ens-normalize-1.9.0.tgz#223572538f6bea336750039bb43a4016dcc8182d" - integrity sha512-iowxq3U30sghZotgl4s/oJRci6WPBfNO5YYgk2cIOMCHr3LeGPcsZjCEr+33Q4N+oV3OABDAtA+pyvWjbvBifQ== +"@adraffy/ens-normalize@^1.10.1": + version "1.11.0" + resolved "https://registry.yarnpkg.com/@adraffy/ens-normalize/-/ens-normalize-1.11.0.tgz#42cc67c5baa407ac25059fcd7d405cc5ecdb0c33" + integrity sha512-/3DDPKHqqIqxUULp8yP4zODUY1i+2xvVWsv8A79xGWdCAG+8sb0hRh0Rk2QyOJUnnbyPUAZYcpBuRe3nS2OIUg== "@alloc/quick-lru@^5.2.0": version "5.2.0" resolved "https://registry.yarnpkg.com/@alloc/quick-lru/-/quick-lru-5.2.0.tgz#7bf68b20c0a350f936915fcae06f58e32007ce30" integrity sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw== -"@ambire/signature-validator@^1.3.1": - version "1.3.1" - resolved "https://registry.yarnpkg.com/@ambire/signature-validator/-/signature-validator-1.3.1.tgz#d899aae3b26f65a3557b4d43b6fe4b50c6f9074b" - integrity sha512-kR6Se3nhAGf1VMeun7V2Lml9KRXB5oz64vO2zGSg+dNaGq4BPDEjsNdr0PIKXZ8651sDlRCN7V9SzL5E2ddBYQ== - dependencies: - ethers "^5.6.5" - tap-spec "^5.0.0" - tape "^5.5.3" - "@ampproject/remapping@^2.2.0": - version "2.2.1" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630" - integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== + version "2.3.0" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4" + integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== dependencies: - "@jridgewell/gen-mapping" "^0.3.0" - "@jridgewell/trace-mapping" "^0.3.9" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.24" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.23.5": - version "7.23.5" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.23.5.tgz#9009b69a8c602293476ad598ff53e4562e15c244" - integrity sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA== +"@babel/code-frame@^7.26.2": + version "7.26.2" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.26.2.tgz#4b5fab97d33338eff916235055f0ebc21e573a85" + integrity sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ== dependencies: - "@babel/highlight" "^7.23.4" - chalk "^2.4.2" + "@babel/helper-validator-identifier" "^7.25.9" + js-tokens "^4.0.0" + picocolors "^1.0.0" -"@babel/compat-data@^7.23.5": - version "7.23.5" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.23.5.tgz#ffb878728bb6bdcb6f4510aa51b1be9afb8cfd98" - integrity sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw== +"@babel/compat-data@^7.26.5": + version "7.26.8" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.26.8.tgz#821c1d35641c355284d4a870b8a4a7b0c141e367" + integrity sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ== -"@babel/core@^7.23.5", "@babel/core@^7.23.9": - version "7.23.9" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.23.9.tgz#b028820718000f267870822fec434820e9b1e4d1" - integrity sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw== +"@babel/core@^7.26.0", "@babel/core@^7.26.8": + version "7.26.9" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.26.9.tgz#71838542a4b1e49dfed353d7acbc6eb89f4a76f2" + integrity sha512-lWBYIrF7qK5+GjY5Uy+/hEgp8OJWOD/rpy74GplYRhEauvbHDeFB8t5hPOZxCZ0Oxf4Cc36tK51/l3ymJysrKw== dependencies: "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.23.5" - "@babel/generator" "^7.23.6" - "@babel/helper-compilation-targets" "^7.23.6" - "@babel/helper-module-transforms" "^7.23.3" - "@babel/helpers" "^7.23.9" - "@babel/parser" "^7.23.9" - "@babel/template" "^7.23.9" - "@babel/traverse" "^7.23.9" - "@babel/types" "^7.23.9" + "@babel/code-frame" "^7.26.2" + "@babel/generator" "^7.26.9" + "@babel/helper-compilation-targets" "^7.26.5" + "@babel/helper-module-transforms" "^7.26.0" + "@babel/helpers" "^7.26.9" + "@babel/parser" "^7.26.9" + "@babel/template" "^7.26.9" + "@babel/traverse" "^7.26.9" + "@babel/types" "^7.26.9" convert-source-map "^2.0.0" debug "^4.1.0" gensync "^1.0.0-beta.2" json5 "^2.2.3" semver "^6.3.1" -"@babel/generator@^7.23.6": - version "7.23.6" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.6.tgz#9e1fca4811c77a10580d17d26b57b036133f3c2e" - integrity sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw== +"@babel/generator@^7.26.9": + version "7.26.9" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.26.9.tgz#75a9482ad3d0cc7188a537aa4910bc59db67cbca" + integrity sha512-kEWdzjOAUMW4hAyrzJ0ZaTOu9OmpyDIQicIh0zg0EEcEkYXZb2TjtBhnHi2ViX7PKwZqF4xwqfAm299/QMP3lg== + dependencies: + "@babel/parser" "^7.26.9" + "@babel/types" "^7.26.9" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" + jsesc "^3.0.2" + +"@babel/helper-compilation-targets@^7.26.5": + version "7.26.5" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz#75d92bb8d8d51301c0d49e52a65c9a7fe94514d8" + integrity sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA== + dependencies: + "@babel/compat-data" "^7.26.5" + "@babel/helper-validator-option" "^7.25.9" + browserslist "^4.24.0" + lru-cache "^5.1.1" + semver "^6.3.1" + +"@babel/helper-module-imports@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz#e7f8d20602ebdbf9ebbea0a0751fb0f2a4141715" + integrity sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw== dependencies: - "@babel/types" "^7.23.6" - "@jridgewell/gen-mapping" "^0.3.2" - "@jridgewell/trace-mapping" "^0.3.17" - jsesc "^2.5.1" + "@babel/traverse" "^7.25.9" + "@babel/types" "^7.25.9" -"@babel/helper-compilation-targets@^7.23.6": - version "7.23.6" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz#4d79069b16cbcf1461289eccfbbd81501ae39991" - integrity sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ== +"@babel/helper-module-transforms@^7.26.0": + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz#8ce54ec9d592695e58d84cd884b7b5c6a2fdeeae" + integrity sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw== dependencies: - "@babel/compat-data" "^7.23.5" - "@babel/helper-validator-option" "^7.23.5" - browserslist "^4.22.2" - lru-cache "^5.1.1" - semver "^6.3.1" + "@babel/helper-module-imports" "^7.25.9" + "@babel/helper-validator-identifier" "^7.25.9" + "@babel/traverse" "^7.25.9" -"@babel/helper-environment-visitor@^7.22.20": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" - integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== - -"@babel/helper-function-name@^7.23.0": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759" - integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== - dependencies: - "@babel/template" "^7.22.15" - "@babel/types" "^7.23.0" - -"@babel/helper-hoist-variables@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" - integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-module-imports@^7.16.7", "@babel/helper-module-imports@^7.22.15": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz#16146307acdc40cc00c3b2c647713076464bdbf0" - integrity sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w== - dependencies: - "@babel/types" "^7.22.15" - -"@babel/helper-module-transforms@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz#d7d12c3c5d30af5b3c0fcab2a6d5217773e2d0f1" - integrity sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ== - dependencies: - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-module-imports" "^7.22.15" - "@babel/helper-simple-access" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/helper-validator-identifier" "^7.22.20" - -"@babel/helper-plugin-utils@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz#dd7ee3735e8a313b9f7b05a773d892e88e6d7295" - integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== - -"@babel/helper-simple-access@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz#4938357dc7d782b80ed6dbb03a0fba3d22b1d5de" - integrity sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-split-export-declaration@^7.22.6": - version "7.22.6" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c" - integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-string-parser@^7.23.4": - version "7.23.4" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz#9478c707febcbbe1ddb38a3d91a2e054ae622d83" - integrity sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ== - -"@babel/helper-validator-identifier@^7.22.20": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" - integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== - -"@babel/helper-validator-option@^7.23.5": - version "7.23.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz#907a3fbd4523426285365d1206c423c4c5520307" - integrity sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw== - -"@babel/helpers@^7.23.9": - version "7.23.9" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.23.9.tgz#c3e20bbe7f7a7e10cb9b178384b4affdf5995c7d" - integrity sha512-87ICKgU5t5SzOT7sBMfCOZQ2rHjRU+Pcb9BoILMYz600W6DkVRLFBPwQ18gwUVvggqXivaUakpnxWQGbpywbBQ== - dependencies: - "@babel/template" "^7.23.9" - "@babel/traverse" "^7.23.9" - "@babel/types" "^7.23.9" - -"@babel/highlight@^7.23.4": - version "7.23.4" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.23.4.tgz#edaadf4d8232e1a961432db785091207ead0621b" - integrity sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A== - dependencies: - "@babel/helper-validator-identifier" "^7.22.20" - chalk "^2.4.2" - js-tokens "^4.0.0" +"@babel/helper-plugin-utils@^7.25.9": + version "7.26.5" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz#18580d00c9934117ad719392c4f6585c9333cc35" + integrity sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg== + +"@babel/helper-string-parser@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz#1aabb72ee72ed35789b4bbcad3ca2862ce614e8c" + integrity sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA== -"@babel/parser@^7.1.0", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9": - version "7.23.9" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.9.tgz#7b903b6149b0f8fa7ad564af646c4c38a77fc44b" - integrity sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA== +"@babel/helper-validator-identifier@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz#24b64e2c3ec7cd3b3c547729b8d16871f22cbdc7" + integrity sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ== -"@babel/plugin-transform-react-jsx-self@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.23.3.tgz#ed3e7dadde046cce761a8e3cf003a13d1a7972d9" - integrity sha512-qXRvbeKDSfwnlJnanVRp0SfuWE5DQhwQr5xtLBzp56Wabyo+4CMosF6Kfp+eOD/4FYpql64XVJ2W0pVLlJZxOQ== +"@babel/helper-validator-option@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz#86e45bd8a49ab7e03f276577f96179653d41da72" + integrity sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw== + +"@babel/helpers@^7.26.9": + version "7.26.9" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.26.9.tgz#28f3fb45252fc88ef2dc547c8a911c255fc9fef6" + integrity sha512-Mz/4+y8udxBKdmzt/UjPACs4G3j5SshJJEFFKxlCGPydG4JAHXxjWjAwjd09tf6oINvl1VfMJo+nB7H2YKQ0dA== + dependencies: + "@babel/template" "^7.26.9" + "@babel/types" "^7.26.9" + +"@babel/parser@^7.1.0", "@babel/parser@^7.20.7", "@babel/parser@^7.26.9": + version "7.26.9" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.26.9.tgz#d9e78bee6dc80f9efd8f2349dcfbbcdace280fd5" + integrity sha512-81NWa1njQblgZbQHxWHpxxCzNsa3ZwvFqpUg7P+NNUU6f3UU2jBEg4OlF/J6rl8+PQGh1q6/zWScd001YwcA5A== + dependencies: + "@babel/types" "^7.26.9" + +"@babel/plugin-transform-react-jsx-self@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.25.9.tgz#c0b6cae9c1b73967f7f9eb2fca9536ba2fad2858" + integrity sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-react-jsx-source@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.23.3.tgz#03527006bdc8775247a78643c51d4e715fe39a3e" - integrity sha512-91RS0MDnAWDNvGC6Wio5XYkyWI39FMFO+JK9+4AlgaTH+yWwVTsw7/sn6LK0lH7c5F+TFkpv/3LfCJ1Ydwof/g== +"@babel/plugin-transform-react-jsx-source@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.25.9.tgz#4c6b8daa520b5f155b5fb55547d7c9fa91417503" + integrity sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/runtime@^7.12.5", "@babel/runtime@^7.18.3", "@babel/runtime@^7.20.1", "@babel/runtime@^7.20.6", "@babel/runtime@^7.21.0", "@babel/runtime@^7.22.5", "@babel/runtime@^7.23.2", "@babel/runtime@^7.5.5": - version "7.23.9" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.9.tgz#47791a15e4603bb5f905bc0753801cf21d6345f7" - integrity sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw== +"@babel/runtime@^7.12.5", "@babel/runtime@^7.21.0", "@babel/runtime@^7.26.0", "@babel/runtime@^7.5.5": + version "7.26.9" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.26.9.tgz#aa4c6facc65b9cb3f87d75125ffd47781b475433" + integrity sha512-aA63XwOkcl4xxQa3HjPMqOP6LiK0ZDv3mUPYEFXkpHbaFjtGggE1A61FjFzJnB+p7/oy2gA8E+rcBNl/zC1tMg== dependencies: regenerator-runtime "^0.14.0" -"@babel/template@^7.22.15", "@babel/template@^7.23.9": - version "7.23.9" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.23.9.tgz#f881d0487cba2828d3259dcb9ef5005a9731011a" - integrity sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA== - dependencies: - "@babel/code-frame" "^7.23.5" - "@babel/parser" "^7.23.9" - "@babel/types" "^7.23.9" - -"@babel/traverse@^7.23.9": - version "7.23.9" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.9.tgz#2f9d6aead6b564669394c5ce0f9302bb65b9d950" - integrity sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg== - dependencies: - "@babel/code-frame" "^7.23.5" - "@babel/generator" "^7.23.6" - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-function-name" "^7.23.0" - "@babel/helper-hoist-variables" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/parser" "^7.23.9" - "@babel/types" "^7.23.9" +"@babel/template@^7.26.9": + version "7.26.9" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.26.9.tgz#4577ad3ddf43d194528cff4e1fa6b232fa609bb2" + integrity sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA== + dependencies: + "@babel/code-frame" "^7.26.2" + "@babel/parser" "^7.26.9" + "@babel/types" "^7.26.9" + +"@babel/traverse@^7.25.9", "@babel/traverse@^7.26.9": + version "7.26.9" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.26.9.tgz#4398f2394ba66d05d988b2ad13c219a2c857461a" + integrity sha512-ZYW7L+pL8ahU5fXmNbPF+iZFHCv5scFak7MZ9bwaRPLUhHh7QQEMjZUg0HevihoqCM5iSYHN61EyCoZvqC+bxg== + dependencies: + "@babel/code-frame" "^7.26.2" + "@babel/generator" "^7.26.9" + "@babel/parser" "^7.26.9" + "@babel/template" "^7.26.9" + "@babel/types" "^7.26.9" debug "^4.3.1" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.22.15", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.23.6", "@babel/types@^7.23.9": - version "7.23.9" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.9.tgz#1dd7b59a9a2b5c87f8b41e52770b5ecbf492e002" - integrity sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q== +"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.25.9", "@babel/types@^7.26.9": + version "7.26.9" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.26.9.tgz#08b43dec79ee8e682c2ac631c010bdcac54a21ce" + integrity sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw== dependencies: - "@babel/helper-string-parser" "^7.23.4" - "@babel/helper-validator-identifier" "^7.22.20" - to-fast-properties "^2.0.0" + "@babel/helper-string-parser" "^7.25.9" + "@babel/helper-validator-identifier" "^7.25.9" -"@changesets/apply-release-plan@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@changesets/apply-release-plan/-/apply-release-plan-7.0.0.tgz#ce3c3dfc5720550a5d592b54ad2f411f816ec5ff" - integrity sha512-vfi69JR416qC9hWmFGSxj7N6wA5J222XNBmezSVATPWDVPIF7gkd4d8CpbEbXmRWbVrkoli3oerGS6dcL/BGsQ== +"@changesets/apply-release-plan@^7.0.10": + version "7.0.10" + resolved "https://registry.yarnpkg.com/@changesets/apply-release-plan/-/apply-release-plan-7.0.10.tgz#d6f64258bd8706dd57aaefcdab052b6e4ced8ec5" + integrity sha512-wNyeIJ3yDsVspYvHnEz1xQDq18D9ifed3lI+wxRQRK4pArUcuHgCTrHv0QRnnwjhVCQACxZ+CBih3wgOct6UXw== dependencies: - "@babel/runtime" "^7.20.1" - "@changesets/config" "^3.0.0" + "@changesets/config" "^3.1.1" "@changesets/get-version-range-type" "^0.4.0" - "@changesets/git" "^3.0.0" - "@changesets/types" "^6.0.0" + "@changesets/git" "^3.0.2" + "@changesets/should-skip-package" "^0.1.2" + "@changesets/types" "^6.1.0" "@manypkg/get-packages" "^1.1.3" detect-indent "^6.0.0" fs-extra "^7.0.1" @@ -268,75 +209,71 @@ resolve-from "^5.0.0" semver "^7.5.3" -"@changesets/assemble-release-plan@^6.0.0": - version "6.0.0" - resolved "https://registry.yarnpkg.com/@changesets/assemble-release-plan/-/assemble-release-plan-6.0.0.tgz#c69969b4bef7c32a8544b6941d1053260ca47e05" - integrity sha512-4QG7NuisAjisbW4hkLCmGW2lRYdPrKzro+fCtZaILX+3zdUELSvYjpL4GTv0E4aM9Mef3PuIQp89VmHJ4y2bfw== +"@changesets/assemble-release-plan@^6.0.6": + version "6.0.6" + resolved "https://registry.yarnpkg.com/@changesets/assemble-release-plan/-/assemble-release-plan-6.0.6.tgz#094dbf98dd4b391357dd99a21f916a1e231a4c98" + integrity sha512-Frkj8hWJ1FRZiY3kzVCKzS0N5mMwWKwmv9vpam7vt8rZjLL1JMthdh6pSDVSPumHPshTTkKZ0VtNbE0cJHZZUg== dependencies: - "@babel/runtime" "^7.20.1" "@changesets/errors" "^0.2.0" - "@changesets/get-dependents-graph" "^2.0.0" - "@changesets/types" "^6.0.0" + "@changesets/get-dependents-graph" "^2.1.3" + "@changesets/should-skip-package" "^0.1.2" + "@changesets/types" "^6.1.0" "@manypkg/get-packages" "^1.1.3" semver "^7.5.3" -"@changesets/changelog-git@^0.2.0": - version "0.2.0" - resolved "https://registry.yarnpkg.com/@changesets/changelog-git/-/changelog-git-0.2.0.tgz#1f3de11becafff5a38ebe295038a602403c93a86" - integrity sha512-bHOx97iFI4OClIT35Lok3sJAwM31VbUM++gnMBV16fdbtBhgYu4dxsphBF/0AZZsyAHMrnM0yFcj5gZM1py6uQ== +"@changesets/changelog-git@^0.2.1": + version "0.2.1" + resolved "https://registry.yarnpkg.com/@changesets/changelog-git/-/changelog-git-0.2.1.tgz#7f311f3dc11eae1235aa7fd2c1807112962b409b" + integrity sha512-x/xEleCFLH28c3bQeQIyeZf8lFXyDFVn1SgcBiR2Tw/r4IAWlk1fzxCEZ6NxQAjF2Nwtczoen3OA2qR+UawQ8Q== dependencies: - "@changesets/types" "^6.0.0" + "@changesets/types" "^6.1.0" -"@changesets/cli@^2.27.1": - version "2.27.1" - resolved "https://registry.yarnpkg.com/@changesets/cli/-/cli-2.27.1.tgz#abce480fd30b9abbe2cfcf07d5d668c364ce2804" - integrity sha512-iJ91xlvRnnrJnELTp4eJJEOPjgpF3NOh4qeQehM6Ugiz9gJPRZ2t+TsXun6E3AMN4hScZKjqVXl0TX+C7AB3ZQ== +"@changesets/cli@^2.27.2": + version "2.28.1" + resolved "https://registry.yarnpkg.com/@changesets/cli/-/cli-2.28.1.tgz#b7f27d5e2083ffc296bfe4accdd66124fa0af291" + integrity sha512-PiIyGRmSc6JddQJe/W1hRPjiN4VrMvb2VfQ6Uydy2punBioQrsxppyG5WafinKcW1mT0jOe/wU4k9Zy5ff21AA== dependencies: - "@babel/runtime" "^7.20.1" - "@changesets/apply-release-plan" "^7.0.0" - "@changesets/assemble-release-plan" "^6.0.0" - "@changesets/changelog-git" "^0.2.0" - "@changesets/config" "^3.0.0" + "@changesets/apply-release-plan" "^7.0.10" + "@changesets/assemble-release-plan" "^6.0.6" + "@changesets/changelog-git" "^0.2.1" + "@changesets/config" "^3.1.1" "@changesets/errors" "^0.2.0" - "@changesets/get-dependents-graph" "^2.0.0" - "@changesets/get-release-plan" "^4.0.0" - "@changesets/git" "^3.0.0" - "@changesets/logger" "^0.1.0" - "@changesets/pre" "^2.0.0" - "@changesets/read" "^0.6.0" - "@changesets/types" "^6.0.0" - "@changesets/write" "^0.3.0" + "@changesets/get-dependents-graph" "^2.1.3" + "@changesets/get-release-plan" "^4.0.8" + "@changesets/git" "^3.0.2" + "@changesets/logger" "^0.1.1" + "@changesets/pre" "^2.0.2" + "@changesets/read" "^0.6.3" + "@changesets/should-skip-package" "^0.1.2" + "@changesets/types" "^6.1.0" + "@changesets/write" "^0.4.0" "@manypkg/get-packages" "^1.1.3" - "@types/semver" "^7.5.0" ansi-colors "^4.1.3" - chalk "^2.1.0" ci-info "^3.7.0" - enquirer "^2.3.0" + enquirer "^2.4.1" external-editor "^3.1.0" fs-extra "^7.0.1" - human-id "^1.0.2" - meow "^6.0.0" - outdent "^0.5.0" + mri "^1.2.0" p-limit "^2.2.0" - preferred-pm "^3.0.0" + package-manager-detector "^0.2.0" + picocolors "^1.1.0" resolve-from "^5.0.0" semver "^7.5.3" - spawndamnit "^2.0.0" + spawndamnit "^3.0.1" term-size "^2.1.0" - tty-table "^4.1.5" -"@changesets/config@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@changesets/config/-/config-3.0.0.tgz#a1a1cafc77134b117b4a9266459c84fdd360a6be" - integrity sha512-o/rwLNnAo/+j9Yvw9mkBQOZySDYyOr/q+wptRLcAVGlU6djOeP9v1nlalbL9MFsobuBVQbZCTp+dIzdq+CLQUA== +"@changesets/config@^3.1.1": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@changesets/config/-/config-3.1.1.tgz#3e5b1f74236a4552c5f4eddf2bd05a43a0b71160" + integrity sha512-bd+3Ap2TKXxljCggI0mKPfzCQKeV/TU4yO2h2C6vAihIo8tzseAn2e7klSuiyYYXvgu53zMN1OeYMIQkaQoWnA== dependencies: "@changesets/errors" "^0.2.0" - "@changesets/get-dependents-graph" "^2.0.0" - "@changesets/logger" "^0.1.0" - "@changesets/types" "^6.0.0" + "@changesets/get-dependents-graph" "^2.1.3" + "@changesets/logger" "^0.1.1" + "@changesets/types" "^6.1.0" "@manypkg/get-packages" "^1.1.3" fs-extra "^7.0.1" - micromatch "^4.0.2" + micromatch "^4.0.8" "@changesets/errors@^0.2.0": version "0.2.0" @@ -345,28 +282,26 @@ dependencies: extendable-error "^0.1.5" -"@changesets/get-dependents-graph@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@changesets/get-dependents-graph/-/get-dependents-graph-2.0.0.tgz#97f0cc9fbec436e0d6ab95a6a59c08acf21ac714" - integrity sha512-cafUXponivK4vBgZ3yLu944mTvam06XEn2IZGjjKc0antpenkYANXiiE6GExV/yKdsCnE8dXVZ25yGqLYZmScA== +"@changesets/get-dependents-graph@^2.1.3": + version "2.1.3" + resolved "https://registry.yarnpkg.com/@changesets/get-dependents-graph/-/get-dependents-graph-2.1.3.tgz#cd31b39daab7102921fb65acdcb51b4658502eee" + integrity sha512-gphr+v0mv2I3Oxt19VdWRRUxq3sseyUpX9DaHpTUmLj92Y10AGy+XOtV+kbM6L/fDcpx7/ISDFK6T8A/P3lOdQ== dependencies: - "@changesets/types" "^6.0.0" + "@changesets/types" "^6.1.0" "@manypkg/get-packages" "^1.1.3" - chalk "^2.1.0" - fs-extra "^7.0.1" + picocolors "^1.1.0" semver "^7.5.3" -"@changesets/get-release-plan@^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@changesets/get-release-plan/-/get-release-plan-4.0.0.tgz#8cb057da90a08796a335dfd18073234d33902069" - integrity sha512-9L9xCUeD/Tb6L/oKmpm8nyzsOzhdNBBbt/ZNcjynbHC07WW4E1eX8NMGC5g5SbM5z/V+MOrYsJ4lRW41GCbg3w== - dependencies: - "@babel/runtime" "^7.20.1" - "@changesets/assemble-release-plan" "^6.0.0" - "@changesets/config" "^3.0.0" - "@changesets/pre" "^2.0.0" - "@changesets/read" "^0.6.0" - "@changesets/types" "^6.0.0" +"@changesets/get-release-plan@^4.0.8": + version "4.0.8" + resolved "https://registry.yarnpkg.com/@changesets/get-release-plan/-/get-release-plan-4.0.8.tgz#528ef38720e3c09aec5a3ff49c8aea8e318347ef" + integrity sha512-MM4mq2+DQU1ZT7nqxnpveDMTkMBLnwNX44cX7NSxlXmr7f8hO6/S2MXNiXG54uf/0nYnefv0cfy4Czf/ZL/EKQ== + dependencies: + "@changesets/assemble-release-plan" "^6.0.6" + "@changesets/config" "^3.1.1" + "@changesets/pre" "^2.0.2" + "@changesets/read" "^0.6.3" + "@changesets/types" "^6.1.0" "@manypkg/get-packages" "^1.1.3" "@changesets/get-version-range-type@^0.4.0": @@ -374,232 +309,122 @@ resolved "https://registry.yarnpkg.com/@changesets/get-version-range-type/-/get-version-range-type-0.4.0.tgz#429a90410eefef4368502c41c63413e291740bf5" integrity sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ== -"@changesets/git@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@changesets/git/-/git-3.0.0.tgz#e71d003752a97bc27988db6d410e0038a4a88055" - integrity sha512-vvhnZDHe2eiBNRFHEgMiGd2CT+164dfYyrJDhwwxTVD/OW0FUD6G7+4DIx1dNwkwjHyzisxGAU96q0sVNBns0w== +"@changesets/git@^3.0.2": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@changesets/git/-/git-3.0.2.tgz#669c700049dc3b8ba53f46de45f5c4b1e6ddea3b" + integrity sha512-r1/Kju9Y8OxRRdvna+nxpQIsMsRQn9dhhAZt94FLDeu0Hij2hnOozW8iqnHBgvu+KdnJppCveQwK4odwfw/aWQ== dependencies: - "@babel/runtime" "^7.20.1" "@changesets/errors" "^0.2.0" - "@changesets/types" "^6.0.0" "@manypkg/get-packages" "^1.1.3" is-subdir "^1.1.1" - micromatch "^4.0.2" - spawndamnit "^2.0.0" + micromatch "^4.0.8" + spawndamnit "^3.0.1" -"@changesets/logger@^0.1.0": - version "0.1.0" - resolved "https://registry.yarnpkg.com/@changesets/logger/-/logger-0.1.0.tgz#2d2a58536c5beeeaef52ab464931d99fcf24f17b" - integrity sha512-pBrJm4CQm9VqFVwWnSqKEfsS2ESnwqwH+xR7jETxIErZcfd1u2zBSqrHbRHR7xjhSgep9x2PSKFKY//FAshA3g== +"@changesets/logger@^0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@changesets/logger/-/logger-0.1.1.tgz#9926ac4dc8fb00472fe1711603b6b4755d64b435" + integrity sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg== dependencies: - chalk "^2.1.0" + picocolors "^1.1.0" -"@changesets/parse@^0.4.0": - version "0.4.0" - resolved "https://registry.yarnpkg.com/@changesets/parse/-/parse-0.4.0.tgz#5cabbd9844b3b213cb83f5edb5768454c70dd2b4" - integrity sha512-TS/9KG2CdGXS27S+QxbZXgr8uPsP4yNJYb4BC2/NeFUj80Rni3TeD2qwWmabymxmrLo7JEsytXH1FbpKTbvivw== +"@changesets/parse@^0.4.1": + version "0.4.1" + resolved "https://registry.yarnpkg.com/@changesets/parse/-/parse-0.4.1.tgz#18ba51d2eb784d27469034f06344f8fdcba586df" + integrity sha512-iwksMs5Bf/wUItfcg+OXrEpravm5rEd9Bf4oyIPL4kVTmJQ7PNDSd6MDYkpSJR1pn7tz/k8Zf2DhTCqX08Ou+Q== dependencies: - "@changesets/types" "^6.0.0" + "@changesets/types" "^6.1.0" js-yaml "^3.13.1" -"@changesets/pre@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@changesets/pre/-/pre-2.0.0.tgz#ad3edf3d6ac287991d7ef5e26cf280d03c9e3764" - integrity sha512-HLTNYX/A4jZxc+Sq8D1AMBsv+1qD6rmmJtjsCJa/9MSRybdxh0mjbTvE6JYZQ/ZiQ0mMlDOlGPXTm9KLTU3jyw== +"@changesets/pre@^2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@changesets/pre/-/pre-2.0.2.tgz#b35e84d25fca8b970340642ca04ce76c7fc34ced" + integrity sha512-HaL/gEyFVvkf9KFg6484wR9s0qjAXlZ8qWPDkTyKF6+zqjBe/I2mygg3MbpZ++hdi0ToqNUF8cjj7fBy0dg8Ug== dependencies: - "@babel/runtime" "^7.20.1" "@changesets/errors" "^0.2.0" - "@changesets/types" "^6.0.0" + "@changesets/types" "^6.1.0" "@manypkg/get-packages" "^1.1.3" fs-extra "^7.0.1" -"@changesets/read@^0.6.0": - version "0.6.0" - resolved "https://registry.yarnpkg.com/@changesets/read/-/read-0.6.0.tgz#27e13b58d0b0eb3b0a5cba48a3f4f71f05ef4610" - integrity sha512-ZypqX8+/im1Fm98K4YcZtmLKgjs1kDQ5zHpc2U1qdtNBmZZfo/IBiG162RoP0CUF05tvp2y4IspH11PLnPxuuw== - dependencies: - "@babel/runtime" "^7.20.1" - "@changesets/git" "^3.0.0" - "@changesets/logger" "^0.1.0" - "@changesets/parse" "^0.4.0" - "@changesets/types" "^6.0.0" - chalk "^2.1.0" +"@changesets/read@^0.6.3": + version "0.6.3" + resolved "https://registry.yarnpkg.com/@changesets/read/-/read-0.6.3.tgz#3760ec591fa8eb4452e73c846d20fc54ebe24fba" + integrity sha512-9H4p/OuJ3jXEUTjaVGdQEhBdqoT2cO5Ts95JTFsQyawmKzpL8FnIeJSyhTDPW1MBRDnwZlHFEM9SpPwJDY5wIg== + dependencies: + "@changesets/git" "^3.0.2" + "@changesets/logger" "^0.1.1" + "@changesets/parse" "^0.4.1" + "@changesets/types" "^6.1.0" fs-extra "^7.0.1" p-filter "^2.1.0" + picocolors "^1.1.0" + +"@changesets/should-skip-package@^0.1.2": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@changesets/should-skip-package/-/should-skip-package-0.1.2.tgz#c018e1e05eab3d97afa4c4590f2b0db7486ae488" + integrity sha512-qAK/WrqWLNCP22UDdBTMPH5f41elVDlsNyat180A33dWxuUDyNpg6fPi/FyTZwRriVjg0L8gnjJn2F9XAoF0qw== + dependencies: + "@changesets/types" "^6.1.0" + "@manypkg/get-packages" "^1.1.3" "@changesets/types@^4.0.1": version "4.1.0" resolved "https://registry.yarnpkg.com/@changesets/types/-/types-4.1.0.tgz#fb8f7ca2324fd54954824e864f9a61a82cb78fe0" integrity sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw== -"@changesets/types@^6.0.0": - version "6.0.0" - resolved "https://registry.yarnpkg.com/@changesets/types/-/types-6.0.0.tgz#e46abda9890610dd1fbe1617730173d2267544bd" - integrity sha512-b1UkfNulgKoWfqyHtzKS5fOZYSJO+77adgL7DLRDr+/7jhChN+QcHnbjiQVOz/U+Ts3PGNySq7diAItzDgugfQ== +"@changesets/types@^6.1.0": + version "6.1.0" + resolved "https://registry.yarnpkg.com/@changesets/types/-/types-6.1.0.tgz#12a4c8490827d26bc6fbf97a151499be2fb6d2f5" + integrity sha512-rKQcJ+o1nKNgeoYRHKOS07tAMNd3YSN0uHaJOZYjBAgxfV7TUE7JE+z4BzZdQwb5hKaYbayKN5KrYV7ODb2rAA== -"@changesets/write@^0.3.0": - version "0.3.0" - resolved "https://registry.yarnpkg.com/@changesets/write/-/write-0.3.0.tgz#c6c5bc390cce4031da20eab8a4ca2d71453a1985" - integrity sha512-slGLb21fxZVUYbyea+94uFiD6ntQW0M2hIKNznFizDhZPDgn2c/fv1UzzlW43RVzh1BEDuIqW6hzlJ1OflNmcw== +"@changesets/write@^0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@changesets/write/-/write-0.4.0.tgz#ec903cbd8aa9b6da6fa09ef19fb609eedd115ed6" + integrity sha512-CdTLvIOPiCNuH71pyDu3rA+Q0n65cmAbXnwWH84rKGiFumFzkmHNT8KHTMEchcxN+Kl8I54xGUhJ7l3E7X396Q== dependencies: - "@babel/runtime" "^7.20.1" - "@changesets/types" "^6.0.0" + "@changesets/types" "^6.1.0" fs-extra "^7.0.1" - human-id "^1.0.2" + human-id "^4.1.1" prettier "^2.7.1" -"@coinbase/wallet-sdk@3.9.1": - version "3.9.1" - resolved "https://registry.yarnpkg.com/@coinbase/wallet-sdk/-/wallet-sdk-3.9.1.tgz#503a14671bb392d653623ef2340934e213ac971f" - integrity sha512-cGUE8wm1/cMI8irRMVOqbFWYcnNugqCtuy2lnnHfgloBg+GRLs9RsrkOUDMdv/StfUeeKhCDyYudsXXvcL1xIA== +"@coinbase/wallet-sdk@4.3.0": + version "4.3.0" + resolved "https://registry.yarnpkg.com/@coinbase/wallet-sdk/-/wallet-sdk-4.3.0.tgz#03b8fce92ac2b3b7cf132f64d6008ac081569b4e" + integrity sha512-T3+SNmiCw4HzDm4we9wCHCxlP0pqCiwKe4sOwPH3YAK2KSKjxPRydKu6UQJrdONFVLG7ujXvbd/6ZqmvJb8rkw== dependencies: - bn.js "^5.2.1" - buffer "^6.0.3" + "@noble/hashes" "^1.4.0" clsx "^1.2.1" - eth-block-tracker "^7.1.0" - eth-json-rpc-filters "^6.0.0" eventemitter3 "^5.0.1" - keccak "^3.0.3" - preact "^10.16.0" - sha.js "^2.4.11" - -"@cspotcode/source-map-support@^0.8.0": - version "0.8.1" - resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" - integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== - dependencies: - "@jridgewell/trace-mapping" "0.3.9" - -"@delvtech/evm-client-ethers@^0.5.1": - version "0.5.1" - resolved "https://registry.yarnpkg.com/@delvtech/evm-client-ethers/-/evm-client-ethers-0.5.1.tgz#b015846bda225d444a2f6103c25c06c223c211ec" - integrity sha512-D8lqY/EOXMPO+kQWHck1XeRJOpEwznveX9dK2vYsQA8d997VkuqSvQnc8FEB+cKf17qRGU14cDxPSjmzPnBawg== - dependencies: - "@delvtech/evm-client" "0.5.1" + preact "^10.24.2" -"@delvtech/evm-client-viem@^0.6.1": - version "0.6.1" - resolved "https://registry.yarnpkg.com/@delvtech/evm-client-viem/-/evm-client-viem-0.6.1.tgz#d8cc37b6a7b5a4ab5957e0bcba4428ddfd3a61e7" - integrity sha512-LtJ9hsRPjqqMZ08+Rwz/spcCEX9WO5Kl94wQPXt/6nwFtCQS+Q7zqBOGruxYT93cRnlLvdI3wLdf26NNY3zFsw== - dependencies: - "@delvtech/evm-client" "0.5.1" +"@delvtech/drift-viem@^0.6.0": + version "0.6.0" + resolved "https://registry.yarnpkg.com/@delvtech/drift-viem/-/drift-viem-0.6.0.tgz#992bdc6e3ec73ae0dde8c6d3f3ccf4146c62958e" + integrity sha512-iDZnutYjzCVNQ2RgBpXSISsFCfaVcWV3TBFGr7eXGCeFZ5Fe1hZS5IYe9aFJWUJTv5FjWajQI9tot5uu+Mf52g== -"@delvtech/evm-client@0.5.1", "@delvtech/evm-client@^0.5.1": - version "0.5.1" - resolved "https://registry.yarnpkg.com/@delvtech/evm-client/-/evm-client-0.5.1.tgz#b69bd04ecb9f1690c1ce94acb7362e4d30b9e1e5" - integrity sha512-Ixx7coKko1l9i2CkrrkhzRVnxzf+b3ROEppWvN7Q0+Gx3DLq1lq8oorXjZb5dZhs5K07LtJM7sUJLztxx8BIEA== +"@delvtech/drift@^0.6.0": + version "0.6.0" + resolved "https://registry.yarnpkg.com/@delvtech/drift/-/drift-0.6.0.tgz#61251d2c20472aceb446502781083a5a0157dd50" + integrity sha512-pqmB+g85meV4cUIZtcdJk/XtPmhi2epNBLfCCrDjULBp89/g9aExThRkEplDMi+bQe4/9cY9I7GMqufbSxaNQw== dependencies: - "@types/lodash.ismatch" "^4.4.9" - fast-safe-stringify "^2.1.1" lodash.ismatch "^4.4.0" - lru-cache "^10.0.1" - -"@emotion/babel-plugin@^11.11.0": - version "11.11.0" - resolved "https://registry.yarnpkg.com/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz#c2d872b6a7767a9d176d007f5b31f7d504bb5d6c" - integrity sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ== - dependencies: - "@babel/helper-module-imports" "^7.16.7" - "@babel/runtime" "^7.18.3" - "@emotion/hash" "^0.9.1" - "@emotion/memoize" "^0.8.1" - "@emotion/serialize" "^1.1.2" - babel-plugin-macros "^3.1.0" - convert-source-map "^1.5.0" - escape-string-regexp "^4.0.0" - find-root "^1.1.0" - source-map "^0.5.7" - stylis "4.2.0" - -"@emotion/cache@^11.11.0": - version "11.11.0" - resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-11.11.0.tgz#809b33ee6b1cb1a625fef7a45bc568ccd9b8f3ff" - integrity sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ== - dependencies: - "@emotion/memoize" "^0.8.1" - "@emotion/sheet" "^1.2.2" - "@emotion/utils" "^1.2.1" - "@emotion/weak-memoize" "^0.3.1" - stylis "4.2.0" - -"@emotion/hash@^0.9.0", "@emotion/hash@^0.9.1": - version "0.9.1" - resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.9.1.tgz#4ffb0055f7ef676ebc3a5a91fb621393294e2f43" - integrity sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ== - -"@emotion/is-prop-valid@^1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-1.2.1.tgz#23116cf1ed18bfeac910ec6436561ecb1a3885cc" - integrity sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw== - dependencies: - "@emotion/memoize" "^0.8.1" - -"@emotion/memoize@^0.8.1": - version "0.8.1" - resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.8.1.tgz#c1ddb040429c6d21d38cc945fe75c818cfb68e17" - integrity sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA== - -"@emotion/react@^11.10.6": - version "11.11.3" - resolved "https://registry.yarnpkg.com/@emotion/react/-/react-11.11.3.tgz#96b855dc40a2a55f52a72f518a41db4f69c31a25" - integrity sha512-Cnn0kuq4DoONOMcnoVsTOR8E+AdnKFf//6kUWc4LCdnxj31pZWn7rIULd6Y7/Js1PiPHzn7SKCM9vB/jBni8eA== - dependencies: - "@babel/runtime" "^7.18.3" - "@emotion/babel-plugin" "^11.11.0" - "@emotion/cache" "^11.11.0" - "@emotion/serialize" "^1.1.3" - "@emotion/use-insertion-effect-with-fallbacks" "^1.0.1" - "@emotion/utils" "^1.2.1" - "@emotion/weak-memoize" "^0.3.1" - hoist-non-react-statics "^3.3.1" - -"@emotion/serialize@^1.1.2", "@emotion/serialize@^1.1.3": - version "1.1.3" - resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-1.1.3.tgz#84b77bfcfe3b7bb47d326602f640ccfcacd5ffb0" - integrity sha512-iD4D6QVZFDhcbH0RAG1uVu1CwVLMWUkCvAqqlewO/rxf8+87yIBAlt4+AxMiiKPLs5hFc0owNk/sLLAOROw3cA== - dependencies: - "@emotion/hash" "^0.9.1" - "@emotion/memoize" "^0.8.1" - "@emotion/unitless" "^0.8.1" - "@emotion/utils" "^1.2.1" - csstype "^3.0.2" + lru-cache "^11.0.2" + ox "^0.6.9" + safe-stable-stringify "^2.5.0" -"@emotion/sheet@^1.2.2": - version "1.2.2" - resolved "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-1.2.2.tgz#d58e788ee27267a14342303e1abb3d508b6d0fec" - integrity sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA== - -"@emotion/styled@^11.10.6": - version "11.11.0" - resolved "https://registry.yarnpkg.com/@emotion/styled/-/styled-11.11.0.tgz#26b75e1b5a1b7a629d7c0a8b708fbf5a9cdce346" - integrity sha512-hM5Nnvu9P3midq5aaXj4I+lnSfNi7Pmd4EWk1fOZ3pxookaQTNew6bp4JaCBYM4HVFZF9g7UjJmsUmC2JlxOng== - dependencies: - "@babel/runtime" "^7.18.3" - "@emotion/babel-plugin" "^11.11.0" - "@emotion/is-prop-valid" "^1.2.1" - "@emotion/serialize" "^1.1.2" - "@emotion/use-insertion-effect-with-fallbacks" "^1.0.1" - "@emotion/utils" "^1.2.1" - -"@emotion/unitless@^0.8.1": - version "0.8.1" - resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.8.1.tgz#182b5a4704ef8ad91bde93f7a860a88fd92c79a3" - integrity sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ== - -"@emotion/use-insertion-effect-with-fallbacks@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz#08de79f54eb3406f9daaf77c76e35313da963963" - integrity sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw== +"@delvtech/fixed-point-wasm@^0.0.8": + version "0.0.8" + resolved "https://registry.yarnpkg.com/@delvtech/fixed-point-wasm/-/fixed-point-wasm-0.0.8.tgz#8deb0d5e573ab0d841ee0e5ccb28ceca0ebe2317" + integrity sha512-CpknUB10q+eqrOiL2JL6unkV2rX+QHTcB4Gsu1RrmwdNKpIyj07T9CZ9BxaA8dsjc1U0YstcfVpMC1w5Bg+w9g== -"@emotion/utils@^1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@emotion/utils/-/utils-1.2.1.tgz#bbab58465738d31ae4cb3dbb6fc00a5991f755e4" - integrity sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg== +"@ecies/ciphers@^0.2.2": + version "0.2.3" + resolved "https://registry.yarnpkg.com/@ecies/ciphers/-/ciphers-0.2.3.tgz#963805e46d07e646550098ac29cbcc5b132218ea" + integrity sha512-tapn6XhOueMwht3E2UzY0ZZjYokdaw9XtL9kEyjhQ/Fb9vL9xTFbOaI+fV0AWvTpYu4BNloC6getKW6NtSg4mA== -"@emotion/weak-memoize@^0.3.1": - version "0.3.1" - resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz#d0fce5d07b0620caa282b5131c297bb60f9d87e6" - integrity sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww== +"@emotion/hash@^0.9.0": + version "0.9.2" + resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.9.2.tgz#ff9221b9f58b4dfe61e619a7788734bd63f6898b" + integrity sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g== "@ensdomains/address-encoder@1.0.0-rc.3": version "1.0.0-rc.3" @@ -610,10 +435,10 @@ "@noble/hashes" "^1.3.2" "@scure/base" "^1.1.5" -"@ensdomains/address-encoder@1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@ensdomains/address-encoder/-/address-encoder-1.1.0.tgz#0765ea1fdb1fd91cc3f4d3d2dd579c83a9b4f016" - integrity sha512-kc+VFq4ml6UB/s1TRjwx/QOeGmvbUWkMDps/nLDco40CpU3//Iw8vscQ12wQzmCzn760kkyOt6nNBP2L3nhtAA== +"@ensdomains/address-encoder@1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@ensdomains/address-encoder/-/address-encoder-1.1.1.tgz#5cbec1fc6e2435b109c058426d7c222cb5a5d8de" + integrity sha512-yg7s+suCuKRhaGsgLu57W/jxIs/Lnqs/SU7jT7UwS4ATSnW94jbUCbmyyZ82CQwKsmwaUE8uYvvVb4N6lfz29A== dependencies: "@noble/curves" "^1.2.0" "@noble/hashes" "^1.3.2" @@ -637,148 +462,179 @@ dns-packet "^5.6.1" typescript-logging "^1.0.1" -"@ensdomains/ensjs@^3.4.4": - version "3.4.4" - resolved "https://registry.yarnpkg.com/@ensdomains/ensjs/-/ensjs-3.4.4.tgz#2b0ea3363a659a25f103fb4b28af367e66f77ec7" - integrity sha512-x81JQA91Pgs4o4rGbGsE4vt0GUOd+5DK4R0LDXXLAt+q5oQQKThnH41wmwl0DB1KSlknHYPWHCrLtzbRAboAFw== +"@ensdomains/ensjs@^4.0.2": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@ensdomains/ensjs/-/ensjs-4.0.2.tgz#c617f1363ba4e02f1bb884f1f6cce8bcd3899500" + integrity sha512-4vDIZEFAa1doNA3H9MppUHxflSDYYPVNyaDbdHLksTa4taq3y4dGpletX67Xea8nxI+cMfjEi4nOzLJmPzRE/g== dependencies: - "@adraffy/ens-normalize" "1.9.0" - "@ensdomains/address-encoder" "1.1.0" + "@adraffy/ens-normalize" "1.10.1" + "@ensdomains/address-encoder" "1.1.1" "@ensdomains/content-hash" "3.1.0-rc.1" "@ensdomains/dnsprovejs" "^0.5.1" - abitype "^0.8.0" + abitype "^1.0.0" dns-packet "^5.3.1" graphql "^16.3.0" graphql-request "6.1.0" pako "^2.1.0" - traverse "^0.6.6" - -"@esbuild/aix-ppc64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz#d1bc06aedb6936b3b6d313bf809a5a40387d2b7f" - integrity sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA== - -"@esbuild/android-arm64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz#7ad65a36cfdb7e0d429c353e00f680d737c2aed4" - integrity sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA== - -"@esbuild/android-arm@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.19.12.tgz#b0c26536f37776162ca8bde25e42040c203f2824" - integrity sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w== - -"@esbuild/android-x64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.19.12.tgz#cb13e2211282012194d89bf3bfe7721273473b3d" - integrity sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew== - -"@esbuild/darwin-arm64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz#cbee41e988020d4b516e9d9e44dd29200996275e" - integrity sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g== - -"@esbuild/darwin-x64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz#e37d9633246d52aecf491ee916ece709f9d5f4cd" - integrity sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A== - -"@esbuild/freebsd-arm64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz#1ee4d8b682ed363b08af74d1ea2b2b4dbba76487" - integrity sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA== - -"@esbuild/freebsd-x64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz#37a693553d42ff77cd7126764b535fb6cc28a11c" - integrity sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg== - -"@esbuild/linux-arm64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz#be9b145985ec6c57470e0e051d887b09dddb2d4b" - integrity sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA== - -"@esbuild/linux-arm@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz#207ecd982a8db95f7b5279207d0ff2331acf5eef" - integrity sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w== - -"@esbuild/linux-ia32@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz#d0d86b5ca1562523dc284a6723293a52d5860601" - integrity sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA== - -"@esbuild/linux-loong64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz#9a37f87fec4b8408e682b528391fa22afd952299" - integrity sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA== - -"@esbuild/linux-mips64el@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz#4ddebd4e6eeba20b509d8e74c8e30d8ace0b89ec" - integrity sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w== - -"@esbuild/linux-ppc64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz#adb67dadb73656849f63cd522f5ecb351dd8dee8" - integrity sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg== - -"@esbuild/linux-riscv64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz#11bc0698bf0a2abf8727f1c7ace2112612c15adf" - integrity sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg== - -"@esbuild/linux-s390x@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz#e86fb8ffba7c5c92ba91fc3b27ed5a70196c3cc8" - integrity sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg== - -"@esbuild/linux-x64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz#5f37cfdc705aea687dfe5dfbec086a05acfe9c78" - integrity sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg== - -"@esbuild/netbsd-x64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz#29da566a75324e0d0dd7e47519ba2f7ef168657b" - integrity sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA== - -"@esbuild/openbsd-x64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz#306c0acbdb5a99c95be98bdd1d47c916e7dc3ff0" - integrity sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw== - -"@esbuild/sunos-x64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz#0933eaab9af8b9b2c930236f62aae3fc593faf30" - integrity sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA== - -"@esbuild/win32-arm64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz#773bdbaa1971b36db2f6560088639ccd1e6773ae" - integrity sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A== - -"@esbuild/win32-ia32@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz#000516cad06354cc84a73f0943a4aa690ef6fd67" - integrity sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ== - -"@esbuild/win32-x64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz#c57c8afbb4054a3ab8317591a0b7320360b444ae" - integrity sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA== + ts-pattern "^5.4.0" + +"@esbuild/aix-ppc64@0.25.1": + version "0.25.1" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.25.1.tgz#c33cf6bbee34975626b01b80451cbb72b4c6c91d" + integrity sha512-kfYGy8IdzTGy+z0vFGvExZtxkFlA4zAxgKEahG9KE1ScBjpQnFsNOX8KTU5ojNru5ed5CVoJYXFtoxaq5nFbjQ== + +"@esbuild/android-arm64@0.25.1": + version "0.25.1" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.25.1.tgz#ea766015c7d2655164f22100d33d7f0308a28d6d" + integrity sha512-50tM0zCJW5kGqgG7fQ7IHvQOcAn9TKiVRuQ/lN0xR+T2lzEFvAi1ZcS8DiksFcEpf1t/GYOeOfCAgDHFpkiSmA== + +"@esbuild/android-arm@0.25.1": + version "0.25.1" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.25.1.tgz#e84d2bf2fe2e6177a0facda3a575b2139fd3cb9c" + integrity sha512-dp+MshLYux6j/JjdqVLnMglQlFu+MuVeNrmT5nk6q07wNhCdSnB7QZj+7G8VMUGh1q+vj2Bq8kRsuyA00I/k+Q== + +"@esbuild/android-x64@0.25.1": + version "0.25.1" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.25.1.tgz#58337bee3bc6d78d10425e5500bd11370cfdfbed" + integrity sha512-GCj6WfUtNldqUzYkN/ITtlhwQqGWu9S45vUXs7EIYf+7rCiiqH9bCloatO9VhxsL0Pji+PF4Lz2XXCES+Q8hDw== + +"@esbuild/darwin-arm64@0.25.1": + version "0.25.1" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.25.1.tgz#a46805c1c585d451aa83be72500bd6e8495dd591" + integrity sha512-5hEZKPf+nQjYoSr/elb62U19/l1mZDdqidGfmFutVUjjUZrOazAtwK+Kr+3y0C/oeJfLlxo9fXb1w7L+P7E4FQ== + +"@esbuild/darwin-x64@0.25.1": + version "0.25.1" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.25.1.tgz#0643e003bb238c63fc93ddbee7d26a003be3cd98" + integrity sha512-hxVnwL2Dqs3fM1IWq8Iezh0cX7ZGdVhbTfnOy5uURtao5OIVCEyj9xIzemDi7sRvKsuSdtCAhMKarxqtlyVyfA== + +"@esbuild/freebsd-arm64@0.25.1": + version "0.25.1" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.1.tgz#cff18da5469c09986b93e87979de5d6872fe8f8e" + integrity sha512-1MrCZs0fZa2g8E+FUo2ipw6jw5qqQiH+tERoS5fAfKnRx6NXH31tXBKI3VpmLijLH6yriMZsxJtaXUyFt/8Y4A== + +"@esbuild/freebsd-x64@0.25.1": + version "0.25.1" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.25.1.tgz#362fc09c2de14987621c1878af19203c46365dde" + integrity sha512-0IZWLiTyz7nm0xuIs0q1Y3QWJC52R8aSXxe40VUxm6BB1RNmkODtW6LHvWRrGiICulcX7ZvyH6h5fqdLu4gkww== + +"@esbuild/linux-arm64@0.25.1": + version "0.25.1" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.25.1.tgz#aa90d5b02efc97a271e124e6d1cea490634f7498" + integrity sha512-jaN3dHi0/DDPelk0nLcXRm1q7DNJpjXy7yWaWvbfkPvI+7XNSc/lDOnCLN7gzsyzgu6qSAmgSvP9oXAhP973uQ== + +"@esbuild/linux-arm@0.25.1": + version "0.25.1" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.25.1.tgz#dfcefcbac60a20918b19569b4b657844d39db35a" + integrity sha512-NdKOhS4u7JhDKw9G3cY6sWqFcnLITn6SqivVArbzIaf3cemShqfLGHYMx8Xlm/lBit3/5d7kXvriTUGa5YViuQ== + +"@esbuild/linux-ia32@0.25.1": + version "0.25.1" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.25.1.tgz#6f9527077ccb7953ed2af02e013d4bac69f13754" + integrity sha512-OJykPaF4v8JidKNGz8c/q1lBO44sQNUQtq1KktJXdBLn1hPod5rE/Hko5ugKKZd+D2+o1a9MFGUEIUwO2YfgkQ== + +"@esbuild/linux-loong64@0.25.1": + version "0.25.1" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.25.1.tgz#287d2412a5456e5860c2839d42a4b51284d1697c" + integrity sha512-nGfornQj4dzcq5Vp835oM/o21UMlXzn79KobKlcs3Wz9smwiifknLy4xDCLUU0BWp7b/houtdrgUz7nOGnfIYg== + +"@esbuild/linux-mips64el@0.25.1": + version "0.25.1" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.25.1.tgz#530574b9e1bc5d20f7a4f44c5f045e26f3783d57" + integrity sha512-1osBbPEFYwIE5IVB/0g2X6i1qInZa1aIoj1TdL4AaAb55xIIgbg8Doq6a5BzYWgr+tEcDzYH67XVnTmUzL+nXg== + +"@esbuild/linux-ppc64@0.25.1": + version "0.25.1" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.25.1.tgz#5d7e6b283a0b321ea42c6bc0abeb9eb99c1f5589" + integrity sha512-/6VBJOwUf3TdTvJZ82qF3tbLuWsscd7/1w+D9LH0W/SqUgM5/JJD0lrJ1fVIfZsqB6RFmLCe0Xz3fmZc3WtyVg== + +"@esbuild/linux-riscv64@0.25.1": + version "0.25.1" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.25.1.tgz#14fa0cd073c26b4ee2465d18cd1e18eea7859fa8" + integrity sha512-nSut/Mx5gnilhcq2yIMLMe3Wl4FK5wx/o0QuuCLMtmJn+WeWYoEGDN1ipcN72g1WHsnIbxGXd4i/MF0gTcuAjQ== + +"@esbuild/linux-s390x@0.25.1": + version "0.25.1" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.25.1.tgz#e677b4b9d1b384098752266ccaa0d52a420dc1aa" + integrity sha512-cEECeLlJNfT8kZHqLarDBQso9a27o2Zd2AQ8USAEoGtejOrCYHNtKP8XQhMDJMtthdF4GBmjR2au3x1udADQQQ== + +"@esbuild/linux-x64@0.25.1": + version "0.25.1" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.25.1.tgz#f1c796b78fff5ce393658313e8c58613198d9954" + integrity sha512-xbfUhu/gnvSEg+EGovRc+kjBAkrvtk38RlerAzQxvMzlB4fXpCFCeUAYzJvrnhFtdeyVCDANSjJvOvGYoeKzFA== + +"@esbuild/netbsd-arm64@0.25.1": + version "0.25.1" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.1.tgz#0d280b7dfe3973f111b02d5fe9f3063b92796d29" + integrity sha512-O96poM2XGhLtpTh+s4+nP7YCCAfb4tJNRVZHfIE7dgmax+yMP2WgMd2OecBuaATHKTHsLWHQeuaxMRnCsH8+5g== + +"@esbuild/netbsd-x64@0.25.1": + version "0.25.1" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.25.1.tgz#be663893931a4bb3f3a009c5cc24fa9681cc71c0" + integrity sha512-X53z6uXip6KFXBQ+Krbx25XHV/NCbzryM6ehOAeAil7X7oa4XIq+394PWGnwaSQ2WRA0KI6PUO6hTO5zeF5ijA== + +"@esbuild/openbsd-arm64@0.25.1": + version "0.25.1" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.1.tgz#d9021b884233673a05dc1cc26de0bf325d824217" + integrity sha512-Na9T3szbXezdzM/Kfs3GcRQNjHzM6GzFBeU1/6IV/npKP5ORtp9zbQjvkDJ47s6BCgaAZnnnu/cY1x342+MvZg== + +"@esbuild/openbsd-x64@0.25.1": + version "0.25.1" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.25.1.tgz#9f1dc1786ed2e2938c404b06bcc48be9a13250de" + integrity sha512-T3H78X2h1tszfRSf+txbt5aOp/e7TAz3ptVKu9Oyir3IAOFPGV6O9c2naym5TOriy1l0nNf6a4X5UXRZSGX/dw== + +"@esbuild/sunos-x64@0.25.1": + version "0.25.1" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.25.1.tgz#89aac24a4b4115959b3f790192cf130396696c27" + integrity sha512-2H3RUvcmULO7dIE5EWJH8eubZAI4xw54H1ilJnRNZdeo8dTADEZ21w6J22XBkXqGJbe0+wnNJtw3UXRoLJnFEg== + +"@esbuild/win32-arm64@0.25.1": + version "0.25.1" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.25.1.tgz#354358647a6ea98ea6d243bf48bdd7a434999582" + integrity sha512-GE7XvrdOzrb+yVKB9KsRMq+7a2U/K5Cf/8grVFRAGJmfADr/e/ODQ134RK2/eeHqYV5eQRFxb1hY7Nr15fv1NQ== + +"@esbuild/win32-ia32@0.25.1": + version "0.25.1" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.25.1.tgz#8cea7340f2647eba951a041dc95651e3908cd4cb" + integrity sha512-uOxSJCIcavSiT6UnBhBzE8wy3n0hOkJsBOzy7HDAuTDE++1DJMRRVCPGisULScHL+a/ZwdXPpXD3IyFKjA7K8A== + +"@esbuild/win32-x64@0.25.1": + version "0.25.1" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.25.1.tgz#7d79922cb2d88f9048f06393dbf62d2e4accb584" + integrity sha512-Y1EQdcfwMSeQN/ujR5VayLOJ1BHaK+ssyk0AEzPjC+t1lITgsnccPqFjb6V+LsTp/9Iov4ysfjxLaGJ9RPtkVg== "@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": - version "4.4.0" - resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" - integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== + version "4.5.0" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.5.0.tgz#716637f508a8add5814cc64c56e58cce57bdbe93" + integrity sha512-RoV8Xs9eNwiDvhv7M+xcL4PWyRyIXRY/FLp3buU4h1EYfdF7unWUy3dOjPqb3C7rMUewIcqwW850PgS8h1o1yg== + dependencies: + eslint-visitor-keys "^3.4.3" + +"@eslint-community/regexpp@^4.10.0", "@eslint-community/regexpp@^4.12.1", "@eslint-community/regexpp@^4.6.1": + version "4.12.1" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.12.1.tgz#cfc6cffe39df390a3841cde2abccf92eaa7ae0e0" + integrity sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ== + +"@eslint/config-array@^0.19.2": + version "0.19.2" + resolved "https://registry.yarnpkg.com/@eslint/config-array/-/config-array-0.19.2.tgz#3060b809e111abfc97adb0bb1172778b90cb46aa" + integrity sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w== dependencies: - eslint-visitor-keys "^3.3.0" + "@eslint/object-schema" "^2.1.6" + debug "^4.3.1" + minimatch "^3.1.2" -"@eslint-community/regexpp@^4.5.1", "@eslint-community/regexpp@^4.6.1": - version "4.10.0" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz#548f6de556857c8bb73bbee70c35dc82a2e74d63" - integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA== +"@eslint/config-helpers@^0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@eslint/config-helpers/-/config-helpers-0.1.0.tgz#62f1b7821e9d9ced1b3f512c7ea731825765d1cc" + integrity sha512-kLrdPDJE1ckPo94kmPPf9Hfd0DU0Jw6oKYrhe+pwSC0iTUInmTa+w6fw8sGgcfkFJGNdWOUeOaDM4quW4a7OkA== + +"@eslint/core@^0.12.0": + version "0.12.0" + resolved "https://registry.yarnpkg.com/@eslint/core/-/core-0.12.0.tgz#5f960c3d57728be9f6c65bd84aa6aa613078798e" + integrity sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg== + dependencies: + "@types/json-schema" "^7.0.15" "@eslint/eslintrc@^2.1.4": version "2.1.4" @@ -795,11 +651,49 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" +"@eslint/eslintrc@^3.3.0": + version "3.3.0" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-3.3.0.tgz#96a558f45842989cca7ea1ecd785ad5491193846" + integrity sha512-yaVPAiNAalnCZedKLdR21GOGILMLKPyqSLWaAjQFvYA2i/ciDi8ArYVr69Anohb6cH2Ukhqti4aFnYyPm8wdwQ== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^10.0.1" + globals "^14.0.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.1.2" + strip-json-comments "^3.1.1" + "@eslint/js@8.56.0": version "8.56.0" resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.56.0.tgz#ef20350fec605a7f7035a01764731b2de0f3782b" integrity sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A== +"@eslint/js@8.57.1": + version "8.57.1" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.1.tgz#de633db3ec2ef6a3c89e2f19038063e8a122e2c2" + integrity sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q== + +"@eslint/js@9.22.0", "@eslint/js@^9.21.0": + version "9.22.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.22.0.tgz#4ff53649ded7cbce90b444b494c234137fa1aa3d" + integrity sha512-vLFajx9o8d1/oL2ZkpMYbkLv8nDB6yaIwFNt7nI4+I80U/z03SxmfOMsLbvWr3p7C+Wnoh//aOu2pQW8cS0HCQ== + +"@eslint/object-schema@^2.1.6": + version "2.1.6" + resolved "https://registry.yarnpkg.com/@eslint/object-schema/-/object-schema-2.1.6.tgz#58369ab5b5b3ca117880c0f6c0b0f32f6950f24f" + integrity sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA== + +"@eslint/plugin-kit@^0.2.7": + version "0.2.7" + resolved "https://registry.yarnpkg.com/@eslint/plugin-kit/-/plugin-kit-0.2.7.tgz#9901d52c136fb8f375906a73dcc382646c3b6a27" + integrity sha512-JubJ5B2pJ4k4yGxaNLdbjrnk9d/iDz6/q8wOilpIowd6PJPgaxCuHBnBszq7Ce2TyMrywm5r4PnKm6V3iiZF+g== + dependencies: + "@eslint/core" "^0.12.0" + levn "^0.4.1" + "@ethereumjs/common@^3.2.0": version "3.2.0" resolved "https://registry.yarnpkg.com/@ethereumjs/common/-/common-3.2.0.tgz#b71df25845caf5456449163012074a55f048e0a0" @@ -832,372 +726,216 @@ ethereum-cryptography "^2.0.0" micro-ftch "^0.3.1" -"@ethersproject/abi@5.7.0", "@ethersproject/abi@^5.1.2", "@ethersproject/abi@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.7.0.tgz#b3f3e045bbbeed1af3947335c247ad625a44e449" - integrity sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA== - dependencies: - "@ethersproject/address" "^5.7.0" - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/constants" "^5.7.0" - "@ethersproject/hash" "^5.7.0" - "@ethersproject/keccak256" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/strings" "^5.7.0" - -"@ethersproject/abstract-provider@5.7.0", "@ethersproject/abstract-provider@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz#b0a8550f88b6bf9d51f90e4795d48294630cb9ef" - integrity sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw== - dependencies: - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/networks" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/transactions" "^5.7.0" - "@ethersproject/web" "^5.7.0" - -"@ethersproject/abstract-signer@5.7.0", "@ethersproject/abstract-signer@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz#13f4f32117868452191a4649723cb086d2b596b2" - integrity sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ== - dependencies: - "@ethersproject/abstract-provider" "^5.7.0" - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - -"@ethersproject/address@5.7.0", "@ethersproject/address@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.7.0.tgz#19b56c4d74a3b0a46bfdbb6cfcc0a153fc697f37" - integrity sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA== - dependencies: - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/keccak256" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/rlp" "^5.7.0" - -"@ethersproject/base64@5.7.0", "@ethersproject/base64@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.7.0.tgz#ac4ee92aa36c1628173e221d0d01f53692059e1c" - integrity sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ== - dependencies: - "@ethersproject/bytes" "^5.7.0" - -"@ethersproject/basex@5.7.0", "@ethersproject/basex@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.7.0.tgz#97034dc7e8938a8ca943ab20f8a5e492ece4020b" - integrity sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw== - dependencies: - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - -"@ethersproject/bignumber@5.7.0", "@ethersproject/bignumber@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.7.0.tgz#e2f03837f268ba655ffba03a57853e18a18dc9c2" - integrity sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw== - dependencies: - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/logger" "^5.7.0" +"@ethersproject/abi@^5.1.2": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.8.0.tgz#e79bb51940ac35fe6f3262d7fe2cdb25ad5f07d9" + integrity sha512-b9YS/43ObplgyV6SlyQsG53/vkSal0MNA1fskSC4mbnCMi8R+NkcH8K9FPYNESf6jUefBUniE4SOKms0E/KK1Q== + dependencies: + "@ethersproject/address" "^5.8.0" + "@ethersproject/bignumber" "^5.8.0" + "@ethersproject/bytes" "^5.8.0" + "@ethersproject/constants" "^5.8.0" + "@ethersproject/hash" "^5.8.0" + "@ethersproject/keccak256" "^5.8.0" + "@ethersproject/logger" "^5.8.0" + "@ethersproject/properties" "^5.8.0" + "@ethersproject/strings" "^5.8.0" + +"@ethersproject/abstract-provider@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.8.0.tgz#7581f9be601afa1d02b95d26b9d9840926a35b0c" + integrity sha512-wC9SFcmh4UK0oKuLJQItoQdzS/qZ51EJegK6EmAWlh+OptpQ/npECOR3QqECd8iGHC0RJb4WKbVdSfif4ammrg== + dependencies: + "@ethersproject/bignumber" "^5.8.0" + "@ethersproject/bytes" "^5.8.0" + "@ethersproject/logger" "^5.8.0" + "@ethersproject/networks" "^5.8.0" + "@ethersproject/properties" "^5.8.0" + "@ethersproject/transactions" "^5.8.0" + "@ethersproject/web" "^5.8.0" + +"@ethersproject/abstract-signer@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.8.0.tgz#8d7417e95e4094c1797a9762e6789c7356db0754" + integrity sha512-N0XhZTswXcmIZQdYtUnd79VJzvEwXQw6PK0dTl9VoYrEBxxCPXqS0Eod7q5TNKRxe1/5WUMuR0u0nqTF/avdCA== + dependencies: + "@ethersproject/abstract-provider" "^5.8.0" + "@ethersproject/bignumber" "^5.8.0" + "@ethersproject/bytes" "^5.8.0" + "@ethersproject/logger" "^5.8.0" + "@ethersproject/properties" "^5.8.0" + +"@ethersproject/address@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.8.0.tgz#3007a2c352eee566ad745dca1dbbebdb50a6a983" + integrity sha512-GhH/abcC46LJwshoN+uBNoKVFPxUuZm6dA257z0vZkKmU1+t8xTn8oK7B9qrj8W2rFRMch4gbJl6PmVxjxBEBA== + dependencies: + "@ethersproject/bignumber" "^5.8.0" + "@ethersproject/bytes" "^5.8.0" + "@ethersproject/keccak256" "^5.8.0" + "@ethersproject/logger" "^5.8.0" + "@ethersproject/rlp" "^5.8.0" + +"@ethersproject/base64@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.8.0.tgz#61c669c648f6e6aad002c228465d52ac93ee83eb" + integrity sha512-lN0oIwfkYj9LbPx4xEkie6rAMJtySbpOAFXSDVQaBnAzYfB4X2Qr+FXJGxMoc3Bxp2Sm8OwvzMrywxyw0gLjIQ== + dependencies: + "@ethersproject/bytes" "^5.8.0" + +"@ethersproject/bignumber@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.8.0.tgz#c381d178f9eeb370923d389284efa19f69efa5d7" + integrity sha512-ZyaT24bHaSeJon2tGPKIiHszWjD/54Sz8t57Toch475lCLljC6MgPmxk7Gtzz+ddNN5LuHea9qhAe0x3D+uYPA== + dependencies: + "@ethersproject/bytes" "^5.8.0" + "@ethersproject/logger" "^5.8.0" bn.js "^5.2.1" -"@ethersproject/bytes@5.7.0", "@ethersproject/bytes@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.7.0.tgz#a00f6ea8d7e7534d6d87f47188af1148d71f155d" - integrity sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A== - dependencies: - "@ethersproject/logger" "^5.7.0" - -"@ethersproject/constants@5.7.0", "@ethersproject/constants@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.7.0.tgz#df80a9705a7e08984161f09014ea012d1c75295e" - integrity sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA== - dependencies: - "@ethersproject/bignumber" "^5.7.0" - -"@ethersproject/contracts@5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.7.0.tgz#c305e775abd07e48aa590e1a877ed5c316f8bd1e" - integrity sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg== - dependencies: - "@ethersproject/abi" "^5.7.0" - "@ethersproject/abstract-provider" "^5.7.0" - "@ethersproject/abstract-signer" "^5.7.0" - "@ethersproject/address" "^5.7.0" - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/constants" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/transactions" "^5.7.0" - -"@ethersproject/hash@5.7.0", "@ethersproject/hash@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.7.0.tgz#eb7aca84a588508369562e16e514b539ba5240a7" - integrity sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g== - dependencies: - "@ethersproject/abstract-signer" "^5.7.0" - "@ethersproject/address" "^5.7.0" - "@ethersproject/base64" "^5.7.0" - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/keccak256" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/strings" "^5.7.0" - -"@ethersproject/hdnode@5.7.0", "@ethersproject/hdnode@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.7.0.tgz#e627ddc6b466bc77aebf1a6b9e47405ca5aef9cf" - integrity sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg== - dependencies: - "@ethersproject/abstract-signer" "^5.7.0" - "@ethersproject/basex" "^5.7.0" - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/pbkdf2" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/sha2" "^5.7.0" - "@ethersproject/signing-key" "^5.7.0" - "@ethersproject/strings" "^5.7.0" - "@ethersproject/transactions" "^5.7.0" - "@ethersproject/wordlists" "^5.7.0" - -"@ethersproject/json-wallets@5.7.0", "@ethersproject/json-wallets@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz#5e3355287b548c32b368d91014919ebebddd5360" - integrity sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g== - dependencies: - "@ethersproject/abstract-signer" "^5.7.0" - "@ethersproject/address" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/hdnode" "^5.7.0" - "@ethersproject/keccak256" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/pbkdf2" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/random" "^5.7.0" - "@ethersproject/strings" "^5.7.0" - "@ethersproject/transactions" "^5.7.0" - aes-js "3.0.0" - scrypt-js "3.0.1" - -"@ethersproject/keccak256@5.7.0", "@ethersproject/keccak256@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.7.0.tgz#3186350c6e1cd6aba7940384ec7d6d9db01f335a" - integrity sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg== - dependencies: - "@ethersproject/bytes" "^5.7.0" +"@ethersproject/bytes@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.8.0.tgz#9074820e1cac7507a34372cadeb035461463be34" + integrity sha512-vTkeohgJVCPVHu5c25XWaWQOZ4v+DkGoC42/TS2ond+PARCxTJvgTFUNDZovyQ/uAQ4EcpqqowKydcdmRKjg7A== + dependencies: + "@ethersproject/logger" "^5.8.0" + +"@ethersproject/constants@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.8.0.tgz#12f31c2f4317b113a4c19de94e50933648c90704" + integrity sha512-wigX4lrf5Vu+axVTIvNsuL6YrV4O5AXl5ubcURKMEME5TnWBouUh0CDTWxZ2GpnRn1kcCgE7l8O5+VbV9QTTcg== + dependencies: + "@ethersproject/bignumber" "^5.8.0" + +"@ethersproject/hash@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.8.0.tgz#b8893d4629b7f8462a90102572f8cd65a0192b4c" + integrity sha512-ac/lBcTbEWW/VGJij0CNSw/wPcw9bSRgCB0AIBz8CvED/jfvDoV9hsIIiWfvWmFEi8RcXtlNwp2jv6ozWOsooA== + dependencies: + "@ethersproject/abstract-signer" "^5.8.0" + "@ethersproject/address" "^5.8.0" + "@ethersproject/base64" "^5.8.0" + "@ethersproject/bignumber" "^5.8.0" + "@ethersproject/bytes" "^5.8.0" + "@ethersproject/keccak256" "^5.8.0" + "@ethersproject/logger" "^5.8.0" + "@ethersproject/properties" "^5.8.0" + "@ethersproject/strings" "^5.8.0" + +"@ethersproject/keccak256@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.8.0.tgz#d2123a379567faf2d75d2aaea074ffd4df349e6a" + integrity sha512-A1pkKLZSz8pDaQ1ftutZoaN46I6+jvuqugx5KYNeQOPqq+JZ0Txm7dlWesCHB5cndJSu5vP2VKptKf7cksERng== + dependencies: + "@ethersproject/bytes" "^5.8.0" js-sha3 "0.8.0" -"@ethersproject/logger@5.7.0", "@ethersproject/logger@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.7.0.tgz#6ce9ae168e74fecf287be17062b590852c311892" - integrity sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig== +"@ethersproject/logger@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.8.0.tgz#f0232968a4f87d29623a0481690a2732662713d6" + integrity sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA== -"@ethersproject/networks@5.7.1", "@ethersproject/networks@^5.7.0": - version "5.7.1" - resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.7.1.tgz#118e1a981d757d45ccea6bb58d9fd3d9db14ead6" - integrity sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ== +"@ethersproject/networks@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.8.0.tgz#8b4517a3139380cba9fb00b63ffad0a979671fde" + integrity sha512-egPJh3aPVAzbHwq8DD7Po53J4OUSsA1MjQp8Vf/OZPav5rlmWUaFLiq8cvQiGK0Z5K6LYzm29+VA/p4RL1FzNg== dependencies: - "@ethersproject/logger" "^5.7.0" + "@ethersproject/logger" "^5.8.0" -"@ethersproject/pbkdf2@5.7.0", "@ethersproject/pbkdf2@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz#d2267d0a1f6e123f3771007338c47cccd83d3102" - integrity sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw== +"@ethersproject/properties@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.8.0.tgz#405a8affb6311a49a91dabd96aeeae24f477020e" + integrity sha512-PYuiEoQ+FMaZZNGrStmN7+lWjlsoufGIHdww7454FIaGdbe/p5rnaCXTr5MtBYl3NkeoVhHZuyzChPeGeKIpQw== dependencies: - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/sha2" "^5.7.0" + "@ethersproject/logger" "^5.8.0" -"@ethersproject/properties@5.7.0", "@ethersproject/properties@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.7.0.tgz#a6e12cb0439b878aaf470f1902a176033067ed30" - integrity sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw== +"@ethersproject/rlp@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.8.0.tgz#5a0d49f61bc53e051532a5179472779141451de5" + integrity sha512-LqZgAznqDbiEunaUvykH2JAoXTT9NV0Atqk8rQN9nx9SEgThA/WMx5DnW8a9FOufo//6FZOCHZ+XiClzgbqV9Q== dependencies: - "@ethersproject/logger" "^5.7.0" - -"@ethersproject/providers@5.7.2": - version "5.7.2" - resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.7.2.tgz#f8b1a4f275d7ce58cf0a2eec222269a08beb18cb" - integrity sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg== - dependencies: - "@ethersproject/abstract-provider" "^5.7.0" - "@ethersproject/abstract-signer" "^5.7.0" - "@ethersproject/address" "^5.7.0" - "@ethersproject/base64" "^5.7.0" - "@ethersproject/basex" "^5.7.0" - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/constants" "^5.7.0" - "@ethersproject/hash" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/networks" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/random" "^5.7.0" - "@ethersproject/rlp" "^5.7.0" - "@ethersproject/sha2" "^5.7.0" - "@ethersproject/strings" "^5.7.0" - "@ethersproject/transactions" "^5.7.0" - "@ethersproject/web" "^5.7.0" - bech32 "1.1.4" - ws "7.4.6" - -"@ethersproject/random@5.7.0", "@ethersproject/random@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.7.0.tgz#af19dcbc2484aae078bb03656ec05df66253280c" - integrity sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ== - dependencies: - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - -"@ethersproject/rlp@5.7.0", "@ethersproject/rlp@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.7.0.tgz#de39e4d5918b9d74d46de93af80b7685a9c21304" - integrity sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w== - dependencies: - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - -"@ethersproject/sha2@5.7.0", "@ethersproject/sha2@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.7.0.tgz#9a5f7a7824ef784f7f7680984e593a800480c9fb" - integrity sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw== - dependencies: - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - hash.js "1.1.7" + "@ethersproject/bytes" "^5.8.0" + "@ethersproject/logger" "^5.8.0" -"@ethersproject/signing-key@5.7.0", "@ethersproject/signing-key@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.7.0.tgz#06b2df39411b00bc57c7c09b01d1e41cf1b16ab3" - integrity sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q== +"@ethersproject/signing-key@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.8.0.tgz#9797e02c717b68239c6349394ea85febf8893119" + integrity sha512-LrPW2ZxoigFi6U6aVkFN/fa9Yx/+4AtIUe4/HACTvKJdhm0eeb107EVCIQcrLZkxaSIgc/eCrX8Q1GtbH+9n3w== dependencies: - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/properties" "^5.7.0" + "@ethersproject/bytes" "^5.8.0" + "@ethersproject/logger" "^5.8.0" + "@ethersproject/properties" "^5.8.0" bn.js "^5.2.1" - elliptic "6.5.4" + elliptic "6.6.1" hash.js "1.1.7" -"@ethersproject/solidity@5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.7.0.tgz#5e9c911d8a2acce2a5ebb48a5e2e0af20b631cb8" - integrity sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA== - dependencies: - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/keccak256" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/sha2" "^5.7.0" - "@ethersproject/strings" "^5.7.0" - -"@ethersproject/strings@5.7.0", "@ethersproject/strings@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.7.0.tgz#54c9d2a7c57ae8f1205c88a9d3a56471e14d5ed2" - integrity sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg== - dependencies: - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/constants" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - -"@ethersproject/transactions@5.7.0", "@ethersproject/transactions@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.7.0.tgz#91318fc24063e057885a6af13fdb703e1f993d3b" - integrity sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ== - dependencies: - "@ethersproject/address" "^5.7.0" - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/constants" "^5.7.0" - "@ethersproject/keccak256" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/rlp" "^5.7.0" - "@ethersproject/signing-key" "^5.7.0" - -"@ethersproject/units@5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.7.0.tgz#637b563d7e14f42deeee39245275d477aae1d8b1" - integrity sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg== - dependencies: - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/constants" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - -"@ethersproject/wallet@5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.7.0.tgz#4e5d0790d96fe21d61d38fb40324e6c7ef350b2d" - integrity sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA== - dependencies: - "@ethersproject/abstract-provider" "^5.7.0" - "@ethersproject/abstract-signer" "^5.7.0" - "@ethersproject/address" "^5.7.0" - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/hash" "^5.7.0" - "@ethersproject/hdnode" "^5.7.0" - "@ethersproject/json-wallets" "^5.7.0" - "@ethersproject/keccak256" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/random" "^5.7.0" - "@ethersproject/signing-key" "^5.7.0" - "@ethersproject/transactions" "^5.7.0" - "@ethersproject/wordlists" "^5.7.0" - -"@ethersproject/web@5.7.1", "@ethersproject/web@^5.7.0": - version "5.7.1" - resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.7.1.tgz#de1f285b373149bee5928f4eb7bcb87ee5fbb4ae" - integrity sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w== - dependencies: - "@ethersproject/base64" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/strings" "^5.7.0" - -"@ethersproject/wordlists@5.7.0", "@ethersproject/wordlists@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.7.0.tgz#8fb2c07185d68c3e09eb3bfd6e779ba2774627f5" - integrity sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA== - dependencies: - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/hash" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/strings" "^5.7.0" +"@ethersproject/strings@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.8.0.tgz#ad79fafbf0bd272d9765603215ac74fd7953908f" + integrity sha512-qWEAk0MAvl0LszjdfnZ2uC8xbR2wdv4cDabyHiBh3Cldq/T8dPH3V4BbBsAYJUeonwD+8afVXld274Ls+Y1xXg== + dependencies: + "@ethersproject/bytes" "^5.8.0" + "@ethersproject/constants" "^5.8.0" + "@ethersproject/logger" "^5.8.0" + +"@ethersproject/transactions@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.8.0.tgz#1e518822403abc99def5a043d1c6f6fe0007e46b" + integrity sha512-UglxSDjByHG0TuU17bDfCemZ3AnKO2vYrL5/2n2oXvKzvb7Cz+W9gOWXKARjp2URVwcWlQlPOEQyAviKwT4AHg== + dependencies: + "@ethersproject/address" "^5.8.0" + "@ethersproject/bignumber" "^5.8.0" + "@ethersproject/bytes" "^5.8.0" + "@ethersproject/constants" "^5.8.0" + "@ethersproject/keccak256" "^5.8.0" + "@ethersproject/logger" "^5.8.0" + "@ethersproject/properties" "^5.8.0" + "@ethersproject/rlp" "^5.8.0" + "@ethersproject/signing-key" "^5.8.0" + +"@ethersproject/web@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.8.0.tgz#3e54badc0013b7a801463a7008a87988efce8a37" + integrity sha512-j7+Ksi/9KfGviws6Qtf9Q7KCqRhpwrYKQPs+JBA/rKVFF/yaWLHJEH3zfVP2plVu+eys0d2DlFmhoQJayFewcw== + dependencies: + "@ethersproject/base64" "^5.8.0" + "@ethersproject/bytes" "^5.8.0" + "@ethersproject/logger" "^5.8.0" + "@ethersproject/properties" "^5.8.0" + "@ethersproject/strings" "^5.8.0" "@fastify/busboy@^2.0.0": - version "2.1.0" - resolved "https://registry.yarnpkg.com/@fastify/busboy/-/busboy-2.1.0.tgz#0709e9f4cb252351c609c6e6d8d6779a8d25edff" - integrity sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA== + version "2.1.1" + resolved "https://registry.yarnpkg.com/@fastify/busboy/-/busboy-2.1.1.tgz#b9da6a878a371829a0502c9b6c1c143ef6663f4d" + integrity sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA== "@floating-ui/core@^1.6.0": - version "1.6.0" - resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.6.0.tgz#fa41b87812a16bf123122bf945946bae3fdf7fc1" - integrity sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g== + version "1.6.9" + resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.6.9.tgz#64d1da251433019dafa091de9b2886ff35ec14e6" + integrity sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw== dependencies: - "@floating-ui/utils" "^0.2.1" + "@floating-ui/utils" "^0.2.9" -"@floating-ui/dom@^1.0.0": - version "1.6.1" - resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.6.1.tgz#d552e8444f77f2d88534372369b3771dc3a2fa5d" - integrity sha512-iA8qE43/H5iGozC3W0YSnVSW42Vh522yyM1gj+BqRwVsTNOyr231PsXDaV04yT39PsO0QL2QpbI/M0ZaLUQgRQ== +"@floating-ui/dom@^1.6.1": + version "1.6.13" + resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.6.13.tgz#a8a938532aea27a95121ec16e667a7cbe8c59e34" + integrity sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w== dependencies: "@floating-ui/core" "^1.6.0" - "@floating-ui/utils" "^0.2.1" + "@floating-ui/utils" "^0.2.9" -"@floating-ui/utils@^0.2.1": - version "0.2.1" - resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.2.1.tgz#16308cea045f0fc777b6ff20a9f25474dd8293d2" - integrity sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q== +"@floating-ui/utils@^0.2.9": + version "0.2.9" + resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.2.9.tgz#50dea3616bc8191fb8e112283b49eaff03e78429" + integrity sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg== + +"@gerrit0/mini-shiki@^1.24.0": + version "1.27.2" + resolved "https://registry.yarnpkg.com/@gerrit0/mini-shiki/-/mini-shiki-1.27.2.tgz#cf2a9fcb08a6581c78fc94821f0c854ec4b9f899" + integrity sha512-GeWyHz8ao2gBiUW4OJnQDxXQnFgZQwwQk05t/CVVgNBN7/rK8XZ7xY6YhLVv9tH3VppWWmr9DCl3MwemB/i+Og== + dependencies: + "@shikijs/engine-oniguruma" "^1.27.2" + "@shikijs/types" "^1.27.2" + "@shikijs/vscode-textmate" "^10.0.1" "@graphql-typed-document-node/core@^3.2.0": version "3.2.0" @@ -1216,10 +954,23 @@ dependencies: "@hapi/hoek" "^9.0.0" -"@heroicons/react@^2.0.16", "@heroicons/react@^2.1.1": - version "2.1.1" - resolved "https://registry.yarnpkg.com/@heroicons/react/-/react-2.1.1.tgz#422deb80c4d6caf3371aec6f4bee8361a354dc13" - integrity sha512-JyyN9Lo66kirbCMuMMRPtJxtKJoIsXKS569ebHGGRKbl8s4CtUfLnyKJxteA+vIKySocO4s1SkTkGS4xtG/yEA== +"@heroicons/react@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@heroicons/react/-/react-2.2.0.tgz#0c05124af50434a800773abec8d3af6a297d904b" + integrity sha512-LMcepvRaS9LYHJGsF0zzmgKCUim/X3N/DQKc4jepAXJ7l8QxJ1PmxJzqplF2Z3FE4PqBAIGyJAQ/w4B5dsqbtQ== + +"@humanfs/core@^0.19.1": + version "0.19.1" + resolved "https://registry.yarnpkg.com/@humanfs/core/-/core-0.19.1.tgz#17c55ca7d426733fe3c561906b8173c336b40a77" + integrity sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA== + +"@humanfs/node@^0.16.6": + version "0.16.6" + resolved "https://registry.yarnpkg.com/@humanfs/node/-/node-0.16.6.tgz#ee2a10eaabd1131987bf0488fd9b820174cd765e" + integrity sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw== + dependencies: + "@humanfs/core" "^0.19.1" + "@humanwhocodes/retry" "^0.3.0" "@humanwhocodes/config-array@^0.11.13": version "0.11.14" @@ -1230,20 +981,34 @@ debug "^4.3.1" minimatch "^3.0.5" +"@humanwhocodes/config-array@^0.13.0": + version "0.13.0" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.13.0.tgz#fb907624df3256d04b9aa2df50d7aa97ec648748" + integrity sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw== + dependencies: + "@humanwhocodes/object-schema" "^2.0.3" + debug "^4.3.1" + minimatch "^3.0.5" + "@humanwhocodes/module-importer@^1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== -"@humanwhocodes/object-schema@^2.0.2": - version "2.0.2" - resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz#d9fae00a2d5cb40f92cfe64b47ad749fbc38f917" - integrity sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw== +"@humanwhocodes/object-schema@^2.0.2", "@humanwhocodes/object-schema@^2.0.3": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3" + integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== -"@ioredis/commands@^1.1.1": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@ioredis/commands/-/commands-1.2.0.tgz#6d61b3097470af1fdbbe622795b8921d42018e11" - integrity sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg== +"@humanwhocodes/retry@^0.3.0": + version "0.3.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.3.1.tgz#c72a5c76a9fbaf3488e231b13dc52c0da7bab42a" + integrity sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA== + +"@humanwhocodes/retry@^0.4.2": + version "0.4.2" + resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.4.2.tgz#1860473de7dfa1546767448f333db80cb0ff2161" + integrity sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ== "@isaacs/cliui@^8.0.2": version "8.0.2" @@ -1257,62 +1022,47 @@ wrap-ansi "^8.1.0" wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" -"@jest/schemas@^29.6.3": - version "29.6.3" - resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.6.3.tgz#430b5ce8a4e0044a7e3819663305a7b3091c8e03" - integrity sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA== - dependencies: - "@sinclair/typebox" "^0.27.8" - -"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": - version "0.3.3" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" - integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== +"@jridgewell/gen-mapping@^0.3.2", "@jridgewell/gen-mapping@^0.3.5": + version "0.3.8" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz#4f0e06362e01362f823d348f1872b08f666d8142" + integrity sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA== dependencies: - "@jridgewell/set-array" "^1.0.1" + "@jridgewell/set-array" "^1.2.1" "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping" "^0.3.9" - -"@jridgewell/resolve-uri@^3.0.3", "@jridgewell/resolve-uri@^3.1.0": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" - integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== + "@jridgewell/trace-mapping" "^0.3.24" -"@jridgewell/set-array@^1.0.1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" - integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== +"@jridgewell/resolve-uri@^3.1.0": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== -"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.4.15": - version "1.4.15" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" - integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== +"@jridgewell/set-array@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" + integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== -"@jridgewell/trace-mapping@0.3.9": - version "0.3.9" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" - integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== - dependencies: - "@jridgewell/resolve-uri" "^3.0.3" - "@jridgewell/sourcemap-codec" "^1.4.10" +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.5.0": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" + integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== -"@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": - version "0.3.22" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.22.tgz#72a621e5de59f5f1ef792d0793a82ee20f645e4c" - integrity sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw== +"@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": + version "0.3.25" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" + integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== dependencies: "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" "@leichtgewicht/ip-codec@^2.0.1": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz#b2ac626d6cb9c8718ab459166d4bb405b8ffa78b" - integrity sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A== + version "2.0.5" + resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz#4fc56c15c580b9adb7dc3c333a134e540b44bfb1" + integrity sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw== "@lit-labs/ssr-dom-shim@^1.0.0", "@lit-labs/ssr-dom-shim@^1.1.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@lit-labs/ssr-dom-shim/-/ssr-dom-shim-1.2.0.tgz#353ce4a76c83fadec272ea5674ede767650762fd" - integrity sha512-yWJKmpGE6lUURKAaIltoPIE/wrbY3TEkqQt+X0m+7fQNnAv0keydnYvbiJFP1PnMhizmIWRWOG5KLhYyc/xl+g== + version "1.3.0" + resolved "https://registry.yarnpkg.com/@lit-labs/ssr-dom-shim/-/ssr-dom-shim-1.3.0.tgz#a28799c463177d1a0b0e5cefdc173da5ac859eb4" + integrity sha512-nQIWonJ6eFAvUUrSlwyHDm/aE8PBDu5kRpL0vHMg6K8fK3Diq1xdPjTnsJSwxABhaZ+5eBi1btQB5ShUTKo4nQ== "@lit/reactive-element@^1.3.0", "@lit/reactive-element@^1.6.0": version "1.6.3" @@ -1332,20 +1082,6 @@ tus-js-client "^3.1.0" zustand "^4.3.9" -"@ljharb/resumer@^0.0.1": - version "0.0.1" - resolved "https://registry.yarnpkg.com/@ljharb/resumer/-/resumer-0.0.1.tgz#8a940a9192dd31f6a1df17564bbd26dc6ad3e68d" - integrity sha512-skQiAOrCfO7vRTq53cxznMpks7wS1va95UCidALlOVWqvBAzwPVErwizDwoMqNVMEn1mDq0utxZd02eIrvF1lw== - dependencies: - "@ljharb/through" "^2.3.9" - -"@ljharb/through@^2.3.11", "@ljharb/through@^2.3.9": - version "2.3.12" - resolved "https://registry.yarnpkg.com/@ljharb/through/-/through-2.3.12.tgz#c418c43060eee193adce48b15c2206096a28e9ea" - integrity sha512-ajo/heTlG3QgC8EGP6APIejksVAYt4ayz4tqoP3MolFELzcH1x1fzwEYRJTPO0IELutZ5HQ0c26/GqAYy79u3g== - dependencies: - call-bind "^1.0.5" - "@manypkg/find-root@^1.1.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@manypkg/find-root/-/find-root-1.1.0.tgz#a62d8ed1cd7e7d4c11d9d52a8397460b5d4ad29f" @@ -1409,22 +1145,40 @@ mersenne-twister "^1.1.0" "@metamask/json-rpc-engine@^7.0.0": - version "7.3.2" - resolved "https://registry.yarnpkg.com/@metamask/json-rpc-engine/-/json-rpc-engine-7.3.2.tgz#e8f0695811619eef7b7c894ba5cf782db9f1c2cb" - integrity sha512-dVjBPlni4CoiBpESVqrxh6k4OR14w6GRXKSSXHFuITjuhALE42gNCkXTpL4cjNeOBUgTba3eGe5EI8cyc2QLRg== + version "7.3.3" + resolved "https://registry.yarnpkg.com/@metamask/json-rpc-engine/-/json-rpc-engine-7.3.3.tgz#f2b30a2164558014bfcca45db10f5af291d989af" + integrity sha512-dwZPq8wx9yV3IX2caLi9q9xZBw2XeIoYqdyihDDDpuHVCEiqadJLwqM3zy+uwf6F1QYQ65A8aOMQg1Uw7LMLNg== dependencies: - "@metamask/rpc-errors" "^6.1.0" + "@metamask/rpc-errors" "^6.2.1" "@metamask/safe-event-emitter" "^3.0.0" "@metamask/utils" "^8.3.0" -"@metamask/object-multiplex@^1.1.0": - version "1.3.0" - resolved "https://registry.yarnpkg.com/@metamask/object-multiplex/-/object-multiplex-1.3.0.tgz#459de4862aa5a5a025dabceadda0ffd553ca4b25" - integrity sha512-czcQeVYdSNtabd+NcYQnrM69MciiJyd1qvKH8WM2Id3C0ZiUUX5Xa/MK+/VUk633DBhVOwdNzAKIQ33lGyA+eQ== +"@metamask/json-rpc-engine@^8.0.1", "@metamask/json-rpc-engine@^8.0.2": + version "8.0.2" + resolved "https://registry.yarnpkg.com/@metamask/json-rpc-engine/-/json-rpc-engine-8.0.2.tgz#29510a871a8edef892f838ee854db18de0bf0d14" + integrity sha512-IoQPmql8q7ABLruW7i4EYVHWUbF74yrp63bRuXV5Zf9BQwcn5H9Ww1eLtROYvI1bUXwOiHZ6qT5CWTrDc/t/AA== + dependencies: + "@metamask/rpc-errors" "^6.2.1" + "@metamask/safe-event-emitter" "^3.0.0" + "@metamask/utils" "^8.3.0" + +"@metamask/json-rpc-middleware-stream@^7.0.1": + version "7.0.2" + resolved "https://registry.yarnpkg.com/@metamask/json-rpc-middleware-stream/-/json-rpc-middleware-stream-7.0.2.tgz#2e8b2cbc38968e3c6239a9144c35bbb08a8fb57d" + integrity sha512-yUdzsJK04Ev98Ck4D7lmRNQ8FPioXYhEUZOMS01LXW8qTvPGiRVXmVltj2p4wrLkh0vW7u6nv0mNl5xzC5Qmfg== + dependencies: + "@metamask/json-rpc-engine" "^8.0.2" + "@metamask/safe-event-emitter" "^3.0.0" + "@metamask/utils" "^8.3.0" + readable-stream "^3.6.2" + +"@metamask/object-multiplex@^2.0.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@metamask/object-multiplex/-/object-multiplex-2.1.0.tgz#5e2e908fc46aee581cbba809870eeee0e571cbb6" + integrity sha512-4vKIiv0DQxljcXwfpnbsXcfa5glMj5Zg9mqn4xpIWqkv6uJ2ma5/GtUfLFSxhlxnR8asRMv8dDmWya1Tc1sDFA== dependencies: - end-of-stream "^1.4.4" once "^1.4.0" - readable-stream "^2.3.3" + readable-stream "^3.6.2" "@metamask/onboarding@^1.0.1": version "1.0.1" @@ -1433,38 +1187,30 @@ dependencies: bowser "^2.9.0" -"@metamask/post-message-stream@^6.1.0": - version "6.2.0" - resolved "https://registry.yarnpkg.com/@metamask/post-message-stream/-/post-message-stream-6.2.0.tgz#3db0a50adc2b2206d1bb95739e7fff49e36e0324" - integrity sha512-WunZ0bruClF862mvbKQGETn5SM0XKGmocPMQR1Ew6sYix9/FDzeoZnoI8RkXk01E+70FCdxhTE/r8kk5SFOuTw== - dependencies: - "@metamask/utils" "^5.0.0" - readable-stream "2.3.3" - -"@metamask/providers@^10.2.1": - version "10.2.1" - resolved "https://registry.yarnpkg.com/@metamask/providers/-/providers-10.2.1.tgz#61304940adeccc7421dcda30ffd1d834273cc77b" - integrity sha512-p2TXw2a1Nb8czntDGfeIYQnk4LLVbd5vlcb3GY//lylYlKdSqp+uUTegCvxiFblRDOT68jsY8Ib1VEEzVUOolA== +"@metamask/providers@16.1.0": + version "16.1.0" + resolved "https://registry.yarnpkg.com/@metamask/providers/-/providers-16.1.0.tgz#7da593d17c541580fa3beab8d9d8a9b9ce19ea07" + integrity sha512-znVCvux30+3SaUwcUGaSf+pUckzT5ukPRpcBmy+muBLC0yaWnBcvDqGfcsw6CBIenUdFrVoAFa8B6jsuCY/a+g== dependencies: - "@metamask/object-multiplex" "^1.1.0" - "@metamask/safe-event-emitter" "^2.0.0" - "@types/chrome" "^0.0.136" + "@metamask/json-rpc-engine" "^8.0.1" + "@metamask/json-rpc-middleware-stream" "^7.0.1" + "@metamask/object-multiplex" "^2.0.0" + "@metamask/rpc-errors" "^6.2.1" + "@metamask/safe-event-emitter" "^3.1.1" + "@metamask/utils" "^8.3.0" detect-browser "^5.2.0" - eth-rpc-errors "^4.0.2" - extension-port-stream "^2.0.1" - fast-deep-equal "^2.0.1" + extension-port-stream "^3.0.0" + fast-deep-equal "^3.1.3" is-stream "^2.0.0" - json-rpc-engine "^6.1.0" - json-rpc-middleware-stream "^4.2.1" - pump "^3.0.0" - webextension-polyfill-ts "^0.25.0" + readable-stream "^3.6.2" + webextension-polyfill "^0.10.0" -"@metamask/rpc-errors@^6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@metamask/rpc-errors/-/rpc-errors-6.1.0.tgz#dfdef7cba4b9ad01ca3f99e990b5980575b89b4f" - integrity sha512-JQElKxai26FpDyRKO/yH732wI+BV90i1u6pOuDOpdADSbppB2g1pPh3AGST1zkZqEE9eIKIUw8UdBQ4rp3VTSg== +"@metamask/rpc-errors@^6.2.1": + version "6.4.0" + resolved "https://registry.yarnpkg.com/@metamask/rpc-errors/-/rpc-errors-6.4.0.tgz#a7ce01c06c9a347ab853e55818ac5654a73bd006" + integrity sha512-1ugFO1UoirU2esS3juZanS/Fo8C8XYocCuBpfZI5N7ECtoG+zu0wF+uWZASik6CkO6w9n/Iebt4iI4pT0vptpg== dependencies: - "@metamask/utils" "^8.1.0" + "@metamask/utils" "^9.0.0" fast-safe-stringify "^2.0.6" "@metamask/safe-event-emitter@^2.0.0": @@ -1472,70 +1218,60 @@ resolved "https://registry.yarnpkg.com/@metamask/safe-event-emitter/-/safe-event-emitter-2.0.0.tgz#af577b477c683fad17c619a78208cede06f9605c" integrity sha512-/kSXhY692qiV1MXu6EeOZvg5nECLclxNXcKCxJ3cXQgYuRymRHpdx/t7JXfsK+JLjwA1e1c1/SBrlQYpusC29Q== -"@metamask/safe-event-emitter@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@metamask/safe-event-emitter/-/safe-event-emitter-3.0.0.tgz#8c2b9073fe0722d48693143b0dc8448840daa3bd" - integrity sha512-j6Z47VOmVyGMlnKXZmL0fyvWfEYtKWCA9yGZkU3FCsGZUT5lHGmvaV9JA5F2Y+010y7+ROtR3WMXIkvl/nVzqQ== +"@metamask/safe-event-emitter@^3.0.0", "@metamask/safe-event-emitter@^3.1.1": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@metamask/safe-event-emitter/-/safe-event-emitter-3.1.2.tgz#bfac8c7a1a149b5bbfe98f59fbfea512dfa3bad4" + integrity sha512-5yb2gMI1BDm0JybZezeoX/3XhPDOtTbcFvpTXM9kxsoZjPZFh4XciqRbpD6N86HYZqWDhEaKUDuOyR0sQHEjMA== -"@metamask/sdk-communication-layer@0.14.3": - version "0.14.3" - resolved "https://registry.yarnpkg.com/@metamask/sdk-communication-layer/-/sdk-communication-layer-0.14.3.tgz#0e7ec8e472641273da5802f3b357687ce12369c3" - integrity sha512-yjSbj8y7fFbQXv2HBzUX6D9C8BimkCYP6BDV7hdw53W8b/GlYCtXVxUFajQ9tuO1xPTRjR/xt/dkdr2aCi6WGw== +"@metamask/sdk-communication-layer@0.32.0": + version "0.32.0" + resolved "https://registry.yarnpkg.com/@metamask/sdk-communication-layer/-/sdk-communication-layer-0.32.0.tgz#89710e807806836138ea5018b087731d6acab627" + integrity sha512-dmj/KFjMi1fsdZGIOtbhxdg3amxhKL/A5BqSU4uh/SyDKPub/OT+x5pX8bGjpTL1WPWY/Q0OIlvFyX3VWnT06Q== dependencies: bufferutil "^4.0.8" - cross-fetch "^3.1.5" date-fns "^2.29.3" - eciesjs "^0.3.16" - eventemitter2 "^6.4.5" - socket.io-client "^4.5.1" - utf-8-validate "^6.0.3" + debug "^4.3.4" + utf-8-validate "^5.0.2" uuid "^8.3.2" -"@metamask/sdk-install-modal-web@0.14.1": - version "0.14.1" - resolved "https://registry.yarnpkg.com/@metamask/sdk-install-modal-web/-/sdk-install-modal-web-0.14.1.tgz#c8e64b4f7d2dac262c2ec28025c541b258478c31" - integrity sha512-emT8HKbnfVwGhPxyUfMja6DWzvtJvDEBQxqCVx93H0HsyrrOzOC43iGCAosslw6o5h7gOfRKLqWmK8V7jQAS2Q== - dependencies: - "@emotion/react" "^11.10.6" - "@emotion/styled" "^11.10.6" - i18next "22.5.1" - qr-code-styling "^1.6.0-rc.1" - react "^18.2.0" - react-dom "^18.2.0" - react-i18next "^13.2.2" - -"@metamask/sdk@0.14.3": - version "0.14.3" - resolved "https://registry.yarnpkg.com/@metamask/sdk/-/sdk-0.14.3.tgz#ec1ecf00edef981fd17e2c5cf4ec40ce0a43a55c" - integrity sha512-BYLs//nY2wioVSih78gOQI6sLIYY3vWkwVqXGYUgkBV+bi49bv+9S0m+hZ2cwiRaxfMYtKs0KvhAQ8weiYwDrg== +"@metamask/sdk-install-modal-web@0.32.0": + version "0.32.0" + resolved "https://registry.yarnpkg.com/@metamask/sdk-install-modal-web/-/sdk-install-modal-web-0.32.0.tgz#86f80420ca364fa0d7710016fa5c81f95537ab23" + integrity sha512-TFoktj0JgfWnQaL3yFkApqNwcaqJ+dw4xcnrJueMP3aXkSNev2Ido+WVNOg4IIMxnmOrfAC9t0UJ0u/dC9MjOQ== dependencies: + "@paulmillr/qr" "^0.2.1" + +"@metamask/sdk@0.32.0": + version "0.32.0" + resolved "https://registry.yarnpkg.com/@metamask/sdk/-/sdk-0.32.0.tgz#f0e179746fe69dccd032a9026884b45b519c1975" + integrity sha512-WmGAlP1oBuD9hk4CsdlG1WJFuPtYJY+dnTHJMeCyohTWD2GgkcLMUUuvu9lO1/NVzuOoSi1OrnjbuY1O/1NZ1g== + dependencies: + "@babel/runtime" "^7.26.0" "@metamask/onboarding" "^1.0.1" - "@metamask/post-message-stream" "^6.1.0" - "@metamask/providers" "^10.2.1" - "@metamask/sdk-communication-layer" "0.14.3" - "@metamask/sdk-install-modal-web" "0.14.1" - "@react-native-async-storage/async-storage" "^1.17.11" - "@types/dom-screen-wake-lock" "^1.0.0" + "@metamask/providers" "16.1.0" + "@metamask/sdk-communication-layer" "0.32.0" + "@metamask/sdk-install-modal-web" "0.32.0" + "@paulmillr/qr" "^0.2.1" bowser "^2.9.0" cross-fetch "^4.0.0" - eciesjs "^0.3.15" + debug "^4.3.4" + eciesjs "^0.4.11" eth-rpc-errors "^4.0.3" - eventemitter2 "^6.4.7" - extension-port-stream "^2.0.1" - i18next "22.5.1" - i18next-browser-languagedetector "^7.1.0" + eventemitter2 "^6.4.9" obj-multiplex "^1.0.0" pump "^3.0.0" - qrcode-terminal-nooctal "^0.12.1" - react-i18next "^13.2.2" - react-native-webview "^11.26.0" - readable-stream "^2.3.7" - rollup-plugin-visualizer "^5.9.2" + readable-stream "^3.6.2" socket.io-client "^4.5.1" + tslib "^2.6.0" util "^0.12.4" uuid "^8.3.2" -"@metamask/utils@^5.0.0", "@metamask/utils@^5.0.1": +"@metamask/superstruct@^3.0.0", "@metamask/superstruct@^3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@metamask/superstruct/-/superstruct-3.1.0.tgz#148f786a674fba3ac885c1093ab718515bf7f648" + integrity sha512-N08M56HdOgBfRKkrgCMZvQppkZGcArEop3kixNEtVbJKm6P9Cfg0YkI6X0s1g78sNrj2fWUwvJADdZuzJgFttA== + +"@metamask/utils@^5.0.1": version "5.0.2" resolved "https://registry.yarnpkg.com/@metamask/utils/-/utils-5.0.2.tgz#140ba5061d90d9dac0280c19cab101bc18c8857c" integrity sha512-yfmE79bRQtnMzarnKfX7AEJBwFTxvTyw3nBQlu/5rmGXrjAeAMltoGxO62TFurxrQAFMNa/fEjIHNvungZp0+g== @@ -1546,57 +1282,73 @@ semver "^7.3.8" superstruct "^1.0.3" -"@metamask/utils@^8.1.0", "@metamask/utils@^8.3.0": - version "8.3.0" - resolved "https://registry.yarnpkg.com/@metamask/utils/-/utils-8.3.0.tgz#a20de447aeb9ffb75924d822a186a597033984b6" - integrity sha512-WFVcMPEkKKRCJ8DDkZUTVbLlpwgRn98F4VM/WzN89HM8PmHMnCyk/oG0AmK/seOxtik7uC7Bbi2YBC5Z5XB2zw== +"@metamask/utils@^8.3.0": + version "8.5.0" + resolved "https://registry.yarnpkg.com/@metamask/utils/-/utils-8.5.0.tgz#ddd0d4012d5191809404c97648a837ea9962cceb" + integrity sha512-I6bkduevXb72TIM9q2LRO63JSsF9EXduh3sBr9oybNX2hNNpr/j1tEjXrsG0Uabm4MJ1xkGAQEMwifvKZIkyxQ== dependencies: "@ethereumjs/tx" "^4.2.0" + "@metamask/superstruct" "^3.0.0" "@noble/hashes" "^1.3.1" "@scure/base" "^1.1.3" "@types/debug" "^4.1.7" debug "^4.3.4" pony-cause "^2.1.10" semver "^7.5.4" - superstruct "^1.0.3" + uuid "^9.0.1" + +"@metamask/utils@^9.0.0": + version "9.3.0" + resolved "https://registry.yarnpkg.com/@metamask/utils/-/utils-9.3.0.tgz#4726bd7f5d6a43ea8425b6d663ab9207f617c2d1" + integrity sha512-w8CVbdkDrVXFJbfBSlDfafDR6BAkpDmv1bC1UJVCoVny5tW2RKAdn9i68Xf7asYT4TnUhl/hN4zfUiKQq9II4g== + dependencies: + "@ethereumjs/tx" "^4.2.0" + "@metamask/superstruct" "^3.1.0" + "@noble/hashes" "^1.3.1" + "@scure/base" "^1.1.3" + "@types/debug" "^4.1.7" + debug "^4.3.4" + pony-cause "^2.1.10" + semver "^7.5.4" + uuid "^9.0.1" -"@motionone/animation@^10.15.1", "@motionone/animation@^10.17.0": - version "10.17.0" - resolved "https://registry.yarnpkg.com/@motionone/animation/-/animation-10.17.0.tgz#7633c6f684b5fee2b61c405881b8c24662c68fca" - integrity sha512-ANfIN9+iq1kGgsZxs+Nz96uiNcPLGTXwfNo2Xz/fcJXniPYpaz/Uyrfa+7I5BPLxCP82sh7quVDudf1GABqHbg== +"@motionone/animation@^10.15.1", "@motionone/animation@^10.18.0": + version "10.18.0" + resolved "https://registry.yarnpkg.com/@motionone/animation/-/animation-10.18.0.tgz#868d00b447191816d5d5cf24b1cafa144017922b" + integrity sha512-9z2p5GFGCm0gBsZbi8rVMOAJCtw1WqBTIPw3ozk06gDvZInBPIsQcHgYogEJ4yuHJ+akuW8g1SEIOpTOvYs8hw== dependencies: - "@motionone/easing" "^10.17.0" - "@motionone/types" "^10.17.0" - "@motionone/utils" "^10.17.0" + "@motionone/easing" "^10.18.0" + "@motionone/types" "^10.17.1" + "@motionone/utils" "^10.18.0" tslib "^2.3.1" "@motionone/dom@^10.16.2", "@motionone/dom@^10.16.4": - version "10.17.0" - resolved "https://registry.yarnpkg.com/@motionone/dom/-/dom-10.17.0.tgz#519dd78aab0750a94614c69a82da5290cd617383" - integrity sha512-cMm33swRlCX/qOPHWGbIlCl0K9Uwi6X5RiL8Ma6OrlJ/TP7Q+Np5GE4xcZkFptysFjMTi4zcZzpnNQGQ5D6M0Q== - dependencies: - "@motionone/animation" "^10.17.0" - "@motionone/generators" "^10.17.0" - "@motionone/types" "^10.17.0" - "@motionone/utils" "^10.17.0" + version "10.18.0" + resolved "https://registry.yarnpkg.com/@motionone/dom/-/dom-10.18.0.tgz#7fd25dac04cab72def6d2b92b8e0cdc091576527" + integrity sha512-bKLP7E0eyO4B2UaHBBN55tnppwRnaE3KFfh3Ps9HhnAkar3Cb69kUCJY9as8LrccVYKgHA+JY5dOQqJLOPhF5A== + dependencies: + "@motionone/animation" "^10.18.0" + "@motionone/generators" "^10.18.0" + "@motionone/types" "^10.17.1" + "@motionone/utils" "^10.18.0" hey-listen "^1.0.8" tslib "^2.3.1" -"@motionone/easing@^10.17.0": - version "10.17.0" - resolved "https://registry.yarnpkg.com/@motionone/easing/-/easing-10.17.0.tgz#d66cecf7e3ee30104ad00389fb3f0b2282d81aa9" - integrity sha512-Bxe2wSuLu/qxqW4rBFS5m9tMLOw+QBh8v5A7Z5k4Ul4sTj5jAOfZG5R0bn5ywmk+Fs92Ij1feZ5pmC4TeXA8Tg== +"@motionone/easing@^10.18.0": + version "10.18.0" + resolved "https://registry.yarnpkg.com/@motionone/easing/-/easing-10.18.0.tgz#7b82f6010dfee3a1bb0ee83abfbaff6edae0c708" + integrity sha512-VcjByo7XpdLS4o9T8t99JtgxkdMcNWD3yHU/n6CLEz3bkmKDRZyYQ/wmSf6daum8ZXqfUAgFeCZSpJZIMxaCzg== dependencies: - "@motionone/utils" "^10.17.0" + "@motionone/utils" "^10.18.0" tslib "^2.3.1" -"@motionone/generators@^10.17.0": - version "10.17.0" - resolved "https://registry.yarnpkg.com/@motionone/generators/-/generators-10.17.0.tgz#878d292539c41434c13310d5f863a87a94e6e689" - integrity sha512-T6Uo5bDHrZWhIfxG/2Aut7qyWQyJIWehk6OB4qNvr/jwA/SRmixwbd7SOrxZi1z5rH3LIeFFBKK1xHnSbGPZSQ== +"@motionone/generators@^10.18.0": + version "10.18.0" + resolved "https://registry.yarnpkg.com/@motionone/generators/-/generators-10.18.0.tgz#fe09ab5cfa0fb9a8884097feb7eb60abeb600762" + integrity sha512-+qfkC2DtkDj4tHPu+AFKVfR/C30O1vYdvsGYaR13W/1cczPrrcjdvYCj0VLFuRMN+lP1xvpNZHCRNM4fBzn1jg== dependencies: - "@motionone/types" "^10.17.0" - "@motionone/utils" "^10.17.0" + "@motionone/types" "^10.17.1" + "@motionone/utils" "^10.18.0" tslib "^2.3.1" "@motionone/svelte@^10.16.2": @@ -1607,17 +1359,17 @@ "@motionone/dom" "^10.16.4" tslib "^2.3.1" -"@motionone/types@^10.15.1", "@motionone/types@^10.17.0": - version "10.17.0" - resolved "https://registry.yarnpkg.com/@motionone/types/-/types-10.17.0.tgz#179571ce98851bac78e19a1c3974767227f08ba3" - integrity sha512-EgeeqOZVdRUTEHq95Z3t8Rsirc7chN5xFAPMYFobx8TPubkEfRSm5xihmMUkbaR2ErKJTUw3347QDPTHIW12IA== +"@motionone/types@^10.15.1", "@motionone/types@^10.17.1": + version "10.17.1" + resolved "https://registry.yarnpkg.com/@motionone/types/-/types-10.17.1.tgz#cf487badbbdc9da0c2cb86ffc1e5d11147c6e6fb" + integrity sha512-KaC4kgiODDz8hswCrS0btrVrzyU2CSQKO7Ps90ibBVSQmjkrt2teqta6/sOG59v7+dPnKMAg13jyqtMKV2yJ7A== -"@motionone/utils@^10.15.1", "@motionone/utils@^10.17.0": - version "10.17.0" - resolved "https://registry.yarnpkg.com/@motionone/utils/-/utils-10.17.0.tgz#cc0ba8acdc6848ff48d8c1f2d0d3e7602f4f942e" - integrity sha512-bGwrki4896apMWIj9yp5rAS2m0xyhxblg6gTB/leWDPt+pb410W8lYWsxyurX+DH+gO1zsQsfx2su/c1/LtTpg== +"@motionone/utils@^10.15.1", "@motionone/utils@^10.18.0": + version "10.18.0" + resolved "https://registry.yarnpkg.com/@motionone/utils/-/utils-10.18.0.tgz#a59ff8932ed9009624bca07c56b28ef2bb2f885e" + integrity sha512-3XVF7sgyTSI2KWvTf6uLlBJ5iAgRgmvp3bpuOiQJvInd4nZ19ET8lX5unn30SlmRH7hXbBbH+Gxd0m0klJ3Xtw== dependencies: - "@motionone/types" "^10.17.0" + "@motionone/types" "^10.17.1" hey-listen "^1.0.8" tslib "^2.3.1" @@ -1634,10 +1386,10 @@ resolved "https://registry.yarnpkg.com/@next/env/-/env-13.0.0.tgz#38527956680693c90b4522ab4ab9a2fbe3a17f67" integrity sha512-65v9BVuah2Mplohm4+efsKEnoEuhmlGm8B2w6vD1geeEP2wXtlSJCvR/cCRJ3fD8wzCQBV41VcMBQeYET6MRkg== -"@next/eslint-plugin-next@14.1.0": - version "14.1.0" - resolved "https://registry.yarnpkg.com/@next/eslint-plugin-next/-/eslint-plugin-next-14.1.0.tgz#29b041233fac7417e22eefa4146432d5cd910820" - integrity sha512-x4FavbNEeXx/baD/zC/SdrvkjSby8nBn8KcCREqk6UuwvwoAPZmaV8TFCAuo/cpovBRTIY67mHhe86MQQm/68Q== +"@next/eslint-plugin-next@14.2.24": + version "14.2.24" + resolved "https://registry.yarnpkg.com/@next/eslint-plugin-next/-/eslint-plugin-next-14.2.24.tgz#2bd0857c31d510610386ecb7a4cc9c2ca452a4ee" + integrity sha512-FDL3qs+5DML0AJz56DCVr+KnFYivxeAX73En8QbPw9GjJZ6zbfvqDy+HrarHFzbsIASn7y8y5ySJ/lllSruNVQ== dependencies: glob "10.3.10" @@ -1706,6 +1458,11 @@ resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.0.0.tgz#c54a5a739dee04b20338d305226a2acdf701f67f" integrity sha512-FFOGGWwTCRMu9W7MF496Urefxtuo2lttxF1vwS+1rIRsKvuLrWhVaVTj3T8sf2EBL6gtJbmh4TYlizS+obnGKA== +"@noble/ciphers@1.2.1", "@noble/ciphers@^1.0.0": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@noble/ciphers/-/ciphers-1.2.1.tgz#3812b72c057a28b44ff0ad4aff5ca846e5b9cdc9" + integrity sha512-rONPWMC7PeExE077uLE4oqWrZ1IvAfz3oH9LibVAcVCopJiA9R62uavnbEzdkVmJYI6M6Zgkbeb07+tWjlq2XA== + "@noble/curves@1.2.0", "@noble/curves@~1.2.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.2.0.tgz#92d7e12e4e49b23105a2555c6984d41733d65c35" @@ -1713,12 +1470,26 @@ dependencies: "@noble/hashes" "1.3.2" -"@noble/curves@1.3.0", "@noble/curves@^1.2.0", "@noble/curves@~1.3.0": - version "1.3.0" - resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.3.0.tgz#01be46da4fd195822dab821e72f71bf4aeec635e" - integrity sha512-t01iSXPuN+Eqzb4eBX0S5oubSqXbK/xXa1Ne18Hj8f9pStxztHCE2gfboSp/dZRLSqfuLpRK2nDXDK+W9puocA== +"@noble/curves@1.4.2", "@noble/curves@~1.4.0": + version "1.4.2" + resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.4.2.tgz#40309198c76ed71bc6dbf7ba24e81ceb4d0d1fe9" + integrity sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw== + dependencies: + "@noble/hashes" "1.4.0" + +"@noble/curves@1.8.0": + version "1.8.0" + resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.8.0.tgz#fe035a23959e6aeadf695851b51a87465b5ba8f7" + integrity sha512-j84kjAbzEnQHaSIhRPUmB3/eVXu2k3dKPl2LOrR8fSOIL+89U+7lV117EWHtq/GHM3ReGHM46iRBdZfpc4HRUQ== dependencies: - "@noble/hashes" "1.3.3" + "@noble/hashes" "1.7.0" + +"@noble/curves@1.8.1", "@noble/curves@^1.2.0", "@noble/curves@^1.6.0", "@noble/curves@~1.8.1": + version "1.8.1" + resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.8.1.tgz#19bc3970e205c99e4bdb1c64a4785706bce497ff" + integrity sha512-warwspo+UYUPep0Q+vtdVB4Ugn8GGQj8iyB3gnRWsztmUHTI3S1nhdiWNsPUGL0vud7JlRRk1XEu7Lq1KGTnMQ== + dependencies: + "@noble/hashes" "1.7.1" "@noble/hashes@1.2.0", "@noble/hashes@~1.2.0": version "1.2.0" @@ -1730,7 +1501,22 @@ resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.2.tgz#6f26dbc8fbc7205873ce3cee2f690eba0d421b39" integrity sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ== -"@noble/hashes@1.3.3", "@noble/hashes@^1.3.1", "@noble/hashes@^1.3.2", "@noble/hashes@~1.3.0", "@noble/hashes@~1.3.2": +"@noble/hashes@1.4.0", "@noble/hashes@~1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.4.0.tgz#45814aa329f30e4fe0ba49426f49dfccdd066426" + integrity sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg== + +"@noble/hashes@1.7.0": + version "1.7.0" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.7.0.tgz#5d9e33af2c7d04fee35de1519b80c958b2e35e39" + integrity sha512-HXydb0DgzTpDPwbVeDGCG1gIu7X6+AuU6Zl6av/E/KG8LMsvPntvq+w17CHRpKBmN6Ybdrt1eP3k4cj8DJa78w== + +"@noble/hashes@1.7.1", "@noble/hashes@^1.3.1", "@noble/hashes@^1.3.2", "@noble/hashes@^1.4.0", "@noble/hashes@^1.5.0", "@noble/hashes@~1.7.1": + version "1.7.1" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.7.1.tgz#5738f6d765710921e7a751e00c20ae091ed8db0f" + integrity sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ== + +"@noble/hashes@~1.3.0", "@noble/hashes@~1.3.2": version "1.3.3" resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.3.tgz#39908da56a4adc270147bb07968bf3b16cfe1699" integrity sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA== @@ -1761,33 +1547,58 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" -"@nomicfoundation/ethereumjs-block@5.0.4": - version "5.0.4" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-block/-/ethereumjs-block-5.0.4.tgz#ff2acb98a86b9290e35e315a6abfb9aebb9cf39e" - integrity sha512-AcyacJ9eX/uPEvqsPiB+WO1ymE+kyH48qGGiGV+YTojdtas8itUTW5dehDSOXEEItWGbbzEJ4PRqnQZlWaPvDw== - dependencies: - "@nomicfoundation/ethereumjs-common" "4.0.4" - "@nomicfoundation/ethereumjs-rlp" "5.0.4" - "@nomicfoundation/ethereumjs-trie" "6.0.4" - "@nomicfoundation/ethereumjs-tx" "5.0.4" - "@nomicfoundation/ethereumjs-util" "9.0.4" - ethereum-cryptography "0.1.3" +"@nolyfill/is-core-module@1.0.39": + version "1.0.39" + resolved "https://registry.yarnpkg.com/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz#3dc35ba0f1e66b403c00b39344f870298ebb1c8e" + integrity sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA== -"@nomicfoundation/ethereumjs-blockchain@7.0.4": - version "7.0.4" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-blockchain/-/ethereumjs-blockchain-7.0.4.tgz#b77511b389290b186c8d999e70f4b15c27ef44ea" - integrity sha512-jYsd/kwzbmpnxx86tXsYV8wZ5xGvFL+7/P0c6OlzpClHsbFzeF41KrYA9scON8Rg6bZu3ZTv6JOAgj3t7USUfg== +"@nomicfoundation/edr-darwin-arm64@0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-darwin-arm64/-/edr-darwin-arm64-0.8.0.tgz#70a23214a2dd2941fcb55e47bb4653514d2dae06" + integrity sha512-sKTmOu/P5YYhxT0ThN2Pe3hmCE/5Ag6K/eYoiavjLWbR7HEb5ZwPu2rC3DpuUk1H+UKJqt7o4/xIgJxqw9wu6A== + +"@nomicfoundation/edr-darwin-x64@0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-darwin-x64/-/edr-darwin-x64-0.8.0.tgz#89c11ae510b3ac5c0e5268cd3a6b04194552112f" + integrity sha512-8ymEtWw1xf1Id1cc42XIeE+9wyo3Dpn9OD/X8GiaMz9R70Ebmj2g+FrbETu8o6UM+aL28sBZQCiCzjlft2yWAg== + +"@nomicfoundation/edr-linux-arm64-gnu@0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-arm64-gnu/-/edr-linux-arm64-gnu-0.8.0.tgz#02c1b4f426576af4e464320e340855139a00fe9b" + integrity sha512-h/wWzS2EyQuycz+x/SjMRbyA+QMCCVmotRsgM1WycPARvVZWIVfwRRsKoXKdCftsb3S8NTprqBdJlOmsFyETFA== + +"@nomicfoundation/edr-linux-arm64-musl@0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-arm64-musl/-/edr-linux-arm64-musl-0.8.0.tgz#9b432dca973068f16a33abb70260e904494638dd" + integrity sha512-gnWxDgdkka0O9GpPX/gZT3REeKYV28Guyg13+Vj/bbLpmK1HmGh6Kx+fMhWv+Ht/wEmGDBGMCW1wdyT/CftJaQ== + +"@nomicfoundation/edr-linux-x64-gnu@0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-x64-gnu/-/edr-linux-x64-gnu-0.8.0.tgz#72954e5fd875df17c43d4ef3fcc381e3312e1347" + integrity sha512-DTMiAkgAx+nyxcxKyxFZk1HPakXXUCgrmei7r5G7kngiggiGp/AUuBBWFHi8xvl2y04GYhro5Wp+KprnLVoAPA== + +"@nomicfoundation/edr-linux-x64-musl@0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-x64-musl/-/edr-linux-x64-musl-0.8.0.tgz#0d59390c512106010d6f4d94b7fffd99fb7fd8ae" + integrity sha512-iTITWe0Zj8cNqS0xTblmxPbHVWwEtMiDC+Yxwr64d7QBn/1W0ilFQ16J8gB6RVVFU3GpfNyoeg3tUoMpSnrm6Q== + +"@nomicfoundation/edr-win32-x64-msvc@0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-win32-x64-msvc/-/edr-win32-x64-msvc-0.8.0.tgz#d14225c513372fda54684de1229cc793ffe48c12" + integrity sha512-mNRDyd/C3j7RMcwapifzv2K57sfA5xOw8g2U84ZDvgSrXVXLC99ZPxn9kmolb+dz8VMm9FONTZz9ESS6v8DTnA== + +"@nomicfoundation/edr@^0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr/-/edr-0.8.0.tgz#63441bb24c1804b6d27b075d0d29f3a02d94fc4f" + integrity sha512-dwWRrghSVBQDpt0wP+6RXD8BMz2i/9TI34TcmZqeEAZuCLei3U9KZRgGTKVAM1rMRvrpf5ROfPqrWNetKVUTag== dependencies: - "@nomicfoundation/ethereumjs-block" "5.0.4" - "@nomicfoundation/ethereumjs-common" "4.0.4" - "@nomicfoundation/ethereumjs-ethash" "3.0.4" - "@nomicfoundation/ethereumjs-rlp" "5.0.4" - "@nomicfoundation/ethereumjs-trie" "6.0.4" - "@nomicfoundation/ethereumjs-tx" "5.0.4" - "@nomicfoundation/ethereumjs-util" "9.0.4" - debug "^4.3.3" - ethereum-cryptography "0.1.3" - lru-cache "^10.0.0" + "@nomicfoundation/edr-darwin-arm64" "0.8.0" + "@nomicfoundation/edr-darwin-x64" "0.8.0" + "@nomicfoundation/edr-linux-arm64-gnu" "0.8.0" + "@nomicfoundation/edr-linux-arm64-musl" "0.8.0" + "@nomicfoundation/edr-linux-x64-gnu" "0.8.0" + "@nomicfoundation/edr-linux-x64-musl" "0.8.0" + "@nomicfoundation/edr-win32-x64-msvc" "0.8.0" "@nomicfoundation/ethereumjs-common@4.0.4": version "4.0.4" @@ -1796,62 +1607,11 @@ dependencies: "@nomicfoundation/ethereumjs-util" "9.0.4" -"@nomicfoundation/ethereumjs-ethash@3.0.4": - version "3.0.4" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-ethash/-/ethereumjs-ethash-3.0.4.tgz#06cb2502b3012fb6c11cffd44af08aecf71310da" - integrity sha512-xvIrwIMl9sSaiYKRem68+O7vYdj7Q2XWv5P7JXiIkn83918QzWHvqbswTRsH7+r6X1UEvdsURRnZbvZszEjAaQ== - dependencies: - "@nomicfoundation/ethereumjs-block" "5.0.4" - "@nomicfoundation/ethereumjs-rlp" "5.0.4" - "@nomicfoundation/ethereumjs-util" "9.0.4" - bigint-crypto-utils "^3.2.2" - ethereum-cryptography "0.1.3" - -"@nomicfoundation/ethereumjs-evm@2.0.4": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-evm/-/ethereumjs-evm-2.0.4.tgz#c9c761767283ac53946185474362230b169f8f63" - integrity sha512-lTyZZi1KpeMHzaO6cSVisR2tjiTTedjo7PcmhI/+GNFo9BmyY6QYzGeSti0sFttmjbEMioHgXxl5yrLNRg6+1w== - dependencies: - "@nomicfoundation/ethereumjs-common" "4.0.4" - "@nomicfoundation/ethereumjs-statemanager" "2.0.4" - "@nomicfoundation/ethereumjs-tx" "5.0.4" - "@nomicfoundation/ethereumjs-util" "9.0.4" - "@types/debug" "^4.1.9" - debug "^4.3.3" - ethereum-cryptography "0.1.3" - rustbn-wasm "^0.2.0" - "@nomicfoundation/ethereumjs-rlp@5.0.4": version "5.0.4" resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-5.0.4.tgz#66c95256fc3c909f6fb18f6a586475fc9762fa30" integrity sha512-8H1S3s8F6QueOc/X92SdrA4RDenpiAEqMg5vJH99kcQaCy/a3Q6fgseo75mgWlbanGJXSlAPtnCeG9jvfTYXlw== -"@nomicfoundation/ethereumjs-statemanager@2.0.4": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-statemanager/-/ethereumjs-statemanager-2.0.4.tgz#bf14415e1f31b5ea8b98a0c027c547d0555059b6" - integrity sha512-HPDjeFrxw6llEi+BzqXkZ+KkvFnTOPczuHBtk21hRlDiuKuZz32dPzlhpRsDBGV1b5JTmRDUVqCS1lp3Gghw4Q== - dependencies: - "@nomicfoundation/ethereumjs-common" "4.0.4" - "@nomicfoundation/ethereumjs-rlp" "5.0.4" - "@nomicfoundation/ethereumjs-trie" "6.0.4" - "@nomicfoundation/ethereumjs-util" "9.0.4" - debug "^4.3.3" - ethereum-cryptography "0.1.3" - js-sdsl "^4.1.4" - lru-cache "^10.0.0" - -"@nomicfoundation/ethereumjs-trie@6.0.4": - version "6.0.4" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-trie/-/ethereumjs-trie-6.0.4.tgz#688a3f76646c209365ee6d959c3d7330ede5e609" - integrity sha512-3nSwQiFMvr2VFe/aZUyinuohYvtytUqZCUCvIWcPJ/BwJH6oQdZRB42aNFBJ/8nAh2s3OcroWpBLskzW01mFKA== - dependencies: - "@nomicfoundation/ethereumjs-rlp" "5.0.4" - "@nomicfoundation/ethereumjs-util" "9.0.4" - "@types/readable-stream" "^2.3.13" - ethereum-cryptography "0.1.3" - lru-cache "^10.0.0" - readable-stream "^3.6.0" - "@nomicfoundation/ethereumjs-tx@5.0.4": version "5.0.4" resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-5.0.4.tgz#b0ceb58c98cc34367d40a30d255d6315b2f456da" @@ -1870,202 +1630,69 @@ "@nomicfoundation/ethereumjs-rlp" "5.0.4" ethereum-cryptography "0.1.3" -"@nomicfoundation/ethereumjs-verkle@0.0.2": - version "0.0.2" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-verkle/-/ethereumjs-verkle-0.0.2.tgz#7686689edec775b2efea5a71548f417c18f7dea4" - integrity sha512-bjnfZElpYGK/XuuVRmLS3yDvr+cDs85D9oonZ0YUa5A3lgFgokWMp76zXrxX2jVQ0BfHaw12y860n1+iOi6yFQ== - dependencies: - "@nomicfoundation/ethereumjs-rlp" "5.0.4" - "@nomicfoundation/ethereumjs-util" "9.0.4" - lru-cache "^10.0.0" - rust-verkle-wasm "^0.0.1" - -"@nomicfoundation/ethereumjs-vm@7.0.4": - version "7.0.4" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-vm/-/ethereumjs-vm-7.0.4.tgz#e5a6eec4877dc62dda93003c6d7afd1fe4b9625b" - integrity sha512-gsA4IhmtWHI4BofKy3kio9W+dqZQs5Ji5mLjLYxHCkat+JQBUt5szjRKra2F9nGDJ2XcI/wWb0YWUFNgln4zRQ== - dependencies: - "@nomicfoundation/ethereumjs-block" "5.0.4" - "@nomicfoundation/ethereumjs-blockchain" "7.0.4" - "@nomicfoundation/ethereumjs-common" "4.0.4" - "@nomicfoundation/ethereumjs-evm" "2.0.4" - "@nomicfoundation/ethereumjs-rlp" "5.0.4" - "@nomicfoundation/ethereumjs-statemanager" "2.0.4" - "@nomicfoundation/ethereumjs-trie" "6.0.4" - "@nomicfoundation/ethereumjs-tx" "5.0.4" - "@nomicfoundation/ethereumjs-util" "9.0.4" - debug "^4.3.3" - ethereum-cryptography "0.1.3" - -"@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.1": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.1.1.tgz#4c858096b1c17fe58a474fe81b46815f93645c15" - integrity sha512-KcTodaQw8ivDZyF+D76FokN/HdpgGpfjc/gFCImdLUyqB6eSWVaZPazMbeAjmfhx3R0zm/NYVzxwAokFKgrc0w== - -"@nomicfoundation/solidity-analyzer-darwin-x64@0.1.1": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-darwin-x64/-/solidity-analyzer-darwin-x64-0.1.1.tgz#6e25ccdf6e2d22389c35553b64fe6f3fdaec432c" - integrity sha512-XhQG4BaJE6cIbjAVtzGOGbK3sn1BO9W29uhk9J8y8fZF1DYz0Doj8QDMfpMu+A6TjPDs61lbsmeYodIDnfveSA== - -"@nomicfoundation/solidity-analyzer-freebsd-x64@0.1.1": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-freebsd-x64/-/solidity-analyzer-freebsd-x64-0.1.1.tgz#0a224ea50317139caeebcdedd435c28a039d169c" - integrity sha512-GHF1VKRdHW3G8CndkwdaeLkVBi5A9u2jwtlS7SLhBc8b5U/GcoL39Q+1CSO3hYqePNP+eV5YI7Zgm0ea6kMHoA== - -"@nomicfoundation/solidity-analyzer-linux-arm64-gnu@0.1.1": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-arm64-gnu/-/solidity-analyzer-linux-arm64-gnu-0.1.1.tgz#dfa085d9ffab9efb2e7b383aed3f557f7687ac2b" - integrity sha512-g4Cv2fO37ZsUENQ2vwPnZc2zRenHyAxHcyBjKcjaSmmkKrFr64yvzeNO8S3GBFCo90rfochLs99wFVGT/0owpg== +"@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.2": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.1.2.tgz#3a9c3b20d51360b20affb8f753e756d553d49557" + integrity sha512-JaqcWPDZENCvm++lFFGjrDd8mxtf+CtLd2MiXvMNTBD33dContTZ9TWETwNFwg7JTJT5Q9HEecH7FA+HTSsIUw== -"@nomicfoundation/solidity-analyzer-linux-arm64-musl@0.1.1": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-arm64-musl/-/solidity-analyzer-linux-arm64-musl-0.1.1.tgz#c9e06b5d513dd3ab02a7ac069c160051675889a4" - integrity sha512-WJ3CE5Oek25OGE3WwzK7oaopY8xMw9Lhb0mlYuJl/maZVo+WtP36XoQTb7bW/i8aAdHW5Z+BqrHMux23pvxG3w== +"@nomicfoundation/solidity-analyzer-darwin-x64@0.1.2": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-darwin-x64/-/solidity-analyzer-darwin-x64-0.1.2.tgz#74dcfabeb4ca373d95bd0d13692f44fcef133c28" + integrity sha512-fZNmVztrSXC03e9RONBT+CiksSeYcxI1wlzqyr0L7hsQlK1fzV+f04g2JtQ1c/Fe74ZwdV6aQBdd6Uwl1052sw== -"@nomicfoundation/solidity-analyzer-linux-x64-gnu@0.1.1": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-x64-gnu/-/solidity-analyzer-linux-x64-gnu-0.1.1.tgz#8d328d16839e52571f72f2998c81e46bf320f893" - integrity sha512-5WN7leSr5fkUBBjE4f3wKENUy9HQStu7HmWqbtknfXkkil+eNWiBV275IOlpXku7v3uLsXTOKpnnGHJYI2qsdA== +"@nomicfoundation/solidity-analyzer-linux-arm64-gnu@0.1.2": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-arm64-gnu/-/solidity-analyzer-linux-arm64-gnu-0.1.2.tgz#4af5849a89e5a8f511acc04f28eb5d4460ba2b6a" + integrity sha512-3d54oc+9ZVBuB6nbp8wHylk4xh0N0Gc+bk+/uJae+rUgbOBwQSfuGIbAZt1wBXs5REkSmynEGcqx6DutoK0tPA== -"@nomicfoundation/solidity-analyzer-linux-x64-musl@0.1.1": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-x64-musl/-/solidity-analyzer-linux-x64-musl-0.1.1.tgz#9b49d0634b5976bb5ed1604a1e1b736f390959bb" - integrity sha512-KdYMkJOq0SYPQMmErv/63CwGwMm5XHenEna9X9aB8mQmhDBrYrlAOSsIPgFCUSL0hjxE3xHP65/EPXR/InD2+w== +"@nomicfoundation/solidity-analyzer-linux-arm64-musl@0.1.2": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-arm64-musl/-/solidity-analyzer-linux-arm64-musl-0.1.2.tgz#54036808a9a327b2ff84446c130a6687ee702a8e" + integrity sha512-iDJfR2qf55vgsg7BtJa7iPiFAsYf2d0Tv/0B+vhtnI16+wfQeTbP7teookbGvAo0eJo7aLLm0xfS/GTkvHIucA== -"@nomicfoundation/solidity-analyzer-win32-arm64-msvc@0.1.1": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-win32-arm64-msvc/-/solidity-analyzer-win32-arm64-msvc-0.1.1.tgz#e2867af7264ebbcc3131ef837878955dd6a3676f" - integrity sha512-VFZASBfl4qiBYwW5xeY20exWhmv6ww9sWu/krWSesv3q5hA0o1JuzmPHR4LPN6SUZj5vcqci0O6JOL8BPw+APg== +"@nomicfoundation/solidity-analyzer-linux-x64-gnu@0.1.2": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-x64-gnu/-/solidity-analyzer-linux-x64-gnu-0.1.2.tgz#466cda0d6e43691986c944b909fc6dbb8cfc594e" + integrity sha512-9dlHMAt5/2cpWyuJ9fQNOUXFB/vgSFORg1jpjX1Mh9hJ/MfZXlDdHQ+DpFCs32Zk5pxRBb07yGvSHk9/fezL+g== -"@nomicfoundation/solidity-analyzer-win32-ia32-msvc@0.1.1": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-win32-ia32-msvc/-/solidity-analyzer-win32-ia32-msvc-0.1.1.tgz#0685f78608dd516c8cdfb4896ed451317e559585" - integrity sha512-JnFkYuyCSA70j6Si6cS1A9Gh1aHTEb8kOTBApp/c7NRTFGNMH8eaInKlyuuiIbvYFhlXW4LicqyYuWNNq9hkpQ== +"@nomicfoundation/solidity-analyzer-linux-x64-musl@0.1.2": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-x64-musl/-/solidity-analyzer-linux-x64-musl-0.1.2.tgz#2b35826987a6e94444140ac92310baa088ee7f94" + integrity sha512-GzzVeeJob3lfrSlDKQw2bRJ8rBf6mEYaWY+gW0JnTDHINA0s2gPR4km5RLIj1xeZZOYz4zRw+AEeYgLRqB2NXg== -"@nomicfoundation/solidity-analyzer-win32-x64-msvc@0.1.1": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-win32-x64-msvc/-/solidity-analyzer-win32-x64-msvc-0.1.1.tgz#c9a44f7108646f083b82e851486e0f6aeb785836" - integrity sha512-HrVJr6+WjIXGnw3Q9u6KQcbZCtk0caVWhCdFADySvRyUxJ8PnzlaP+MhwNE8oyT8OZ6ejHBRrrgjSqDCFXGirw== +"@nomicfoundation/solidity-analyzer-win32-x64-msvc@0.1.2": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-win32-x64-msvc/-/solidity-analyzer-win32-x64-msvc-0.1.2.tgz#e6363d13b8709ca66f330562337dbc01ce8bbbd9" + integrity sha512-Fdjli4DCcFHb4Zgsz0uEJXZ2K7VEO+w5KVv7HmT7WO10iODdU9csC2az4jrhEsRtiR9Gfd74FlG0NYlw1BMdyA== "@nomicfoundation/solidity-analyzer@^0.1.0": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.1.1.tgz#f5f4d36d3f66752f59a57e7208cd856f3ddf6f2d" - integrity sha512-1LMtXj1puAxyFusBgUIy5pZk3073cNXYnXUpuNKFghHbIit/xZgbk0AokpUADbNm3gyD6bFWl3LRFh3dhVdREg== - optionalDependencies: - "@nomicfoundation/solidity-analyzer-darwin-arm64" "0.1.1" - "@nomicfoundation/solidity-analyzer-darwin-x64" "0.1.1" - "@nomicfoundation/solidity-analyzer-freebsd-x64" "0.1.1" - "@nomicfoundation/solidity-analyzer-linux-arm64-gnu" "0.1.1" - "@nomicfoundation/solidity-analyzer-linux-arm64-musl" "0.1.1" - "@nomicfoundation/solidity-analyzer-linux-x64-gnu" "0.1.1" - "@nomicfoundation/solidity-analyzer-linux-x64-musl" "0.1.1" - "@nomicfoundation/solidity-analyzer-win32-arm64-msvc" "0.1.1" - "@nomicfoundation/solidity-analyzer-win32-ia32-msvc" "0.1.1" - "@nomicfoundation/solidity-analyzer-win32-x64-msvc" "0.1.1" - -"@parcel/watcher-android-arm64@2.4.0": - version "2.4.0" - resolved "https://registry.yarnpkg.com/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.4.0.tgz#9c93763794153e4f76920994a423b6ea3257059d" - integrity sha512-+fPtO/GsbYX1LJnCYCaDVT3EOBjvSFdQN9Mrzh9zWAOOfvidPWyScTrHIZHHfJBvlHzNA0Gy0U3NXFA/M7PHUA== - -"@parcel/watcher-darwin-arm64@2.4.0": - version "2.4.0" - resolved "https://registry.yarnpkg.com/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.4.0.tgz#2c79c2abde16aa24cac67e555b60802fd13fe210" - integrity sha512-T/At5pansFuQ8VJLRx0C6C87cgfqIYhW2N/kBfLCUvDhCah0EnLLwaD/6MW3ux+rpgkpQAnMELOCTKlbwncwiA== - -"@parcel/watcher-darwin-x64@2.4.0": - version "2.4.0" - resolved "https://registry.yarnpkg.com/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.4.0.tgz#23d82f198c5d033f047467c68d7c335f3df49b46" - integrity sha512-vZMv9jl+szz5YLsSqEGCMSllBl1gU1snfbRL5ysJU03MEa6gkVy9OMcvXV1j4g0++jHEcvzhs3Z3LpeEbVmY6Q== - -"@parcel/watcher-freebsd-x64@2.4.0": - version "2.4.0" - resolved "https://registry.yarnpkg.com/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.4.0.tgz#7310cc86abc27dacd57624bcdba1f0ba092e76df" - integrity sha512-dHTRMIplPDT1M0+BkXjtMN+qLtqq24sLDUhmU+UxxLP2TEY2k8GIoqIJiVrGWGomdWsy5IO27aDV1vWyQ6gfHA== - -"@parcel/watcher-linux-arm-glibc@2.4.0": - version "2.4.0" - resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.4.0.tgz#c31b76e695027eeb1078d3d6f1d641d0b900c335" - integrity sha512-9NQXD+qk46RwATNC3/UB7HWurscY18CnAPMTFcI9Y8CTbtm63/eex1SNt+BHFinEQuLBjaZwR2Lp+n7pmEJPpQ== - -"@parcel/watcher-linux-arm64-glibc@2.4.0": - version "2.4.0" - resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.4.0.tgz#56e09b86e9d8a4096f606be118b588da6e965080" - integrity sha512-QuJTAQdsd7PFW9jNGaV9Pw+ZMWV9wKThEzzlY3Lhnnwy7iW23qtQFPql8iEaSFMCVI5StNNmONUopk+MFKpiKg== - -"@parcel/watcher-linux-arm64-musl@2.4.0": - version "2.4.0" - resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.4.0.tgz#27ffd5ca5f510ecd638f9ad22e2e813049db54e7" - integrity sha512-oyN+uA9xcTDo/45bwsd6TFHa7Lc7hKujyMlvwrCLvSckvWogndCEoVYFNfZ6JJ2KNL/6fFiGPcbjp8jJmEh5Ng== - -"@parcel/watcher-linux-x64-glibc@2.4.0": - version "2.4.0" - resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.4.0.tgz#44cbbb1e5884a1ca900655f47a0775218318f934" - integrity sha512-KphV8awJmxU3q52JQvJot0QMu07CIyEjV+2Tb2ZtbucEgqyRcxOBDMsqp1JNq5nuDXtcCC0uHQICeiEz38dPBQ== - -"@parcel/watcher-linux-x64-musl@2.4.0": - version "2.4.0" - resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.4.0.tgz#4c33993618c8d5113722852806239cb80360494b" - integrity sha512-7jzcOonpXNWcSijPpKD5IbC6xC7yTibjJw9jviVzZostYLGxbz8LDJLUnLzLzhASPlPGgpeKLtFUMjAAzM+gSA== - -"@parcel/watcher-wasm@2.4.0": - version "2.4.0" - resolved "https://registry.yarnpkg.com/@parcel/watcher-wasm/-/watcher-wasm-2.4.0.tgz#84a3959c8ef1cd67b36b9fec487edbc8f27719f6" - integrity sha512-MNgQ4WCbBybqQ97KwR/hqJGYTg3+s8qHpgIyFWB2qJOBvoJWbXuJGmm4ZkPLq2bMaANqCZqrXwmKYagZTkMKZA== - dependencies: - is-glob "^4.0.3" - micromatch "^4.0.5" - napi-wasm "^1.1.0" - -"@parcel/watcher-win32-arm64@2.4.0": - version "2.4.0" - resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.4.0.tgz#2a172fd2fda95fe5389298ca3e70b5a96316162a" - integrity sha512-NOej2lqlq8bQNYhUMnOD0nwvNql8ToQF+1Zhi9ULZoG+XTtJ9hNnCFfyICxoZLXor4bBPTOnzs/aVVoefYnjIg== - -"@parcel/watcher-win32-ia32@2.4.0": - version "2.4.0" - resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.4.0.tgz#279225b2ebe1fadd3c5137c9b2365ad422656904" - integrity sha512-IO/nM+K2YD/iwjWAfHFMBPz4Zqn6qBDqZxY4j2n9s+4+OuTSRM/y/irksnuqcspom5DjkSeF9d0YbO+qpys+JA== - -"@parcel/watcher-win32-x64@2.4.0": - version "2.4.0" - resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.4.0.tgz#93e0bd0ad1bda2c9a688764b9b30b71dc5b72a71" - integrity sha512-pAUyUVjfFjWaf/pShmJpJmNxZhbMvJASUpdes9jL6bTEJ+gDxPRSpXTIemNyNsb9AtbiGXs9XduP1reThmd+dA== - -"@parcel/watcher@^2.4.0": - version "2.4.0" - resolved "https://registry.yarnpkg.com/@parcel/watcher/-/watcher-2.4.0.tgz#2d3c4ef8832a5cdfdbb76b914f022489933e664f" - integrity sha512-XJLGVL0DEclX5pcWa2N9SX1jCGTDd8l972biNooLFtjneuGqodupPQh6XseXIBBeVIMaaJ7bTcs3qGvXwsp4vg== - dependencies: - detect-libc "^1.0.3" - is-glob "^4.0.3" - micromatch "^4.0.5" - node-addon-api "^7.0.0" + version "0.1.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.1.2.tgz#8bcea7d300157bf3a770a851d9f5c5e2db34ac55" + integrity sha512-q4n32/FNKIhQ3zQGGw5CvPF6GTvDCpYwIf7bEY/dZTZbgfDsHyjJwURxUJf3VQuuJj+fDIFl4+KkBVbw4Ef6jA== optionalDependencies: - "@parcel/watcher-android-arm64" "2.4.0" - "@parcel/watcher-darwin-arm64" "2.4.0" - "@parcel/watcher-darwin-x64" "2.4.0" - "@parcel/watcher-freebsd-x64" "2.4.0" - "@parcel/watcher-linux-arm-glibc" "2.4.0" - "@parcel/watcher-linux-arm64-glibc" "2.4.0" - "@parcel/watcher-linux-arm64-musl" "2.4.0" - "@parcel/watcher-linux-x64-glibc" "2.4.0" - "@parcel/watcher-linux-x64-musl" "2.4.0" - "@parcel/watcher-win32-arm64" "2.4.0" - "@parcel/watcher-win32-ia32" "2.4.0" - "@parcel/watcher-win32-x64" "2.4.0" + "@nomicfoundation/solidity-analyzer-darwin-arm64" "0.1.2" + "@nomicfoundation/solidity-analyzer-darwin-x64" "0.1.2" + "@nomicfoundation/solidity-analyzer-linux-arm64-gnu" "0.1.2" + "@nomicfoundation/solidity-analyzer-linux-arm64-musl" "0.1.2" + "@nomicfoundation/solidity-analyzer-linux-x64-gnu" "0.1.2" + "@nomicfoundation/solidity-analyzer-linux-x64-musl" "0.1.2" + "@nomicfoundation/solidity-analyzer-win32-x64-msvc" "0.1.2" + +"@paulmillr/qr@^0.2.1": + version "0.2.1" + resolved "https://registry.yarnpkg.com/@paulmillr/qr/-/qr-0.2.1.tgz#76ade7080be4ac4824f638146fd8b6db1805eeca" + integrity sha512-IHnV6A+zxU7XwmKFinmYjUcwlyK9+xkG3/s9KcQhI9BjQKycrJ1JRO+FbNYPwZiPKW3je/DR0k7w8/gLa5eaxQ== "@pkgjs/parseargs@^0.11.0": version "0.11.0" resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== -"@pushprotocol/restapi@^1.6.7": - version "1.6.8" - resolved "https://registry.yarnpkg.com/@pushprotocol/restapi/-/restapi-1.6.8.tgz#707cf8abcceaeb98c45551e87ac14bbdb741ba32" - integrity sha512-ZImz4qvXkqqcQowJBBFCKO8FsI/mjFDyC4dEhw5q1jlxWYuMKOD3NwaF+yvfIwgrFYWpCyYHvOCeLR+830Zn6g== +"@pushprotocol/restapi@^1.7.30": + version "1.7.31" + resolved "https://registry.yarnpkg.com/@pushprotocol/restapi/-/restapi-1.7.31.tgz#df688e891ae37056d28dfd04a47ffb7e5237e39c" + integrity sha512-f3JIJjapAJeiumcAER0zw9dNqDFZBPIDR2I0jJx4Bru4o+lY0QAr8qnCQ9BI0QEyc7njdGtO4a2sk+9ITnRvJw== dependencies: - "@ambire/signature-validator" "^1.3.1" "@metamask/eth-sig-util" "^5.0.2" axios "^0.27.2" buffer "^6.0.3" @@ -2083,121 +1710,154 @@ video-stream-merger "^4.0.1" viem "^1.20.3" -"@rainbow-me/rainbowkit@^2.0.2": - version "2.0.2" - resolved "https://registry.yarnpkg.com/@rainbow-me/rainbowkit/-/rainbowkit-2.0.2.tgz#6122e349b7b87e4bb57ece374747c21915816ae7" - integrity sha512-xm/3iWxwL/ATVVWjtYVGviTJ4ldXwcvaic+bQnGg/pqzf8zKONkuzd5gNWLw0ft1iNG2IPHL1ABP9UoR2Trlaw== - dependencies: - "@vanilla-extract/css" "1.14.0" - "@vanilla-extract/dynamic" "2.1.0" - "@vanilla-extract/sprinkles" "1.6.1" - clsx "2.1.0" - qrcode "1.5.3" - react-remove-scroll "2.5.7" +"@rainbow-me/rainbowkit@^2.2.3": + version "2.2.4" + resolved "https://registry.yarnpkg.com/@rainbow-me/rainbowkit/-/rainbowkit-2.2.4.tgz#a02b79b8be3838046cf4ef54d2d014ac9301fe3b" + integrity sha512-LUYBcB5bzLf6/BMdnW3dEFHVqoPkTGcFN3u6WamaIHXuqD9HT+HVAeNlcYvKENBXldN2zNBs1Bt3k8Oy7y5bTw== + dependencies: + "@vanilla-extract/css" "1.15.5" + "@vanilla-extract/dynamic" "2.1.2" + "@vanilla-extract/sprinkles" "1.6.3" + clsx "2.1.1" + qrcode "1.5.4" + react-remove-scroll "2.6.2" ua-parser-js "^1.0.37" -"@react-native-async-storage/async-storage@^1.17.11": - version "1.21.0" - resolved "https://registry.yarnpkg.com/@react-native-async-storage/async-storage/-/async-storage-1.21.0.tgz#d7e370028e228ab84637016ceeb495878b7a44c8" - integrity sha512-JL0w36KuFHFCvnbOXRekqVAUplmOyT/OuCQkogo6X98MtpSaJOKEAeZnYO8JB0U/RIEixZaGI5px73YbRm/oag== - dependencies: - merge-options "^3.0.4" - -"@rollup/rollup-android-arm-eabi@4.9.6": - version "4.9.6" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.9.6.tgz#66b8d9cb2b3a474d115500f9ebaf43e2126fe496" - integrity sha512-MVNXSSYN6QXOulbHpLMKYi60ppyO13W9my1qogeiAqtjb2yR4LSmfU2+POvDkLzhjYLXz9Rf9+9a3zFHW1Lecg== - -"@rollup/rollup-android-arm64@4.9.6": - version "4.9.6" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.9.6.tgz#46327d5b86420d2307946bec1535fdf00356e47d" - integrity sha512-T14aNLpqJ5wzKNf5jEDpv5zgyIqcpn1MlwCrUXLrwoADr2RkWA0vOWP4XxbO9aiO3dvMCQICZdKeDrFl7UMClw== - -"@rollup/rollup-darwin-arm64@4.9.6": - version "4.9.6" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.9.6.tgz#166987224d2f8b1e2fd28ee90c447d52271d5e90" - integrity sha512-CqNNAyhRkTbo8VVZ5R85X73H3R5NX9ONnKbXuHisGWC0qRbTTxnF1U4V9NafzJbgGM0sHZpdO83pLPzq8uOZFw== - -"@rollup/rollup-darwin-x64@4.9.6": - version "4.9.6" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.9.6.tgz#a2e6e096f74ccea6e2f174454c26aef6bcdd1274" - integrity sha512-zRDtdJuRvA1dc9Mp6BWYqAsU5oeLixdfUvkTHuiYOHwqYuQ4YgSmi6+/lPvSsqc/I0Omw3DdICx4Tfacdzmhog== - -"@rollup/rollup-linux-arm-gnueabihf@4.9.6": - version "4.9.6" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.9.6.tgz#09fcd4c55a2d6160c5865fec708a8e5287f30515" - integrity sha512-oNk8YXDDnNyG4qlNb6is1ojTOGL/tRhbbKeE/YuccItzerEZT68Z9gHrY3ROh7axDc974+zYAPxK5SH0j/G+QQ== - -"@rollup/rollup-linux-arm64-gnu@4.9.6": - version "4.9.6" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.9.6.tgz#19a3c0b6315c747ca9acf86e9b710cc2440f83c9" - integrity sha512-Z3O60yxPtuCYobrtzjo0wlmvDdx2qZfeAWTyfOjEDqd08kthDKexLpV97KfAeUXPosENKd8uyJMRDfFMxcYkDQ== - -"@rollup/rollup-linux-arm64-musl@4.9.6": - version "4.9.6" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.9.6.tgz#94aaf95fdaf2ad9335983a4552759f98e6b2e850" - integrity sha512-gpiG0qQJNdYEVad+1iAsGAbgAnZ8j07FapmnIAQgODKcOTjLEWM9sRb+MbQyVsYCnA0Im6M6QIq6ax7liws6eQ== - -"@rollup/rollup-linux-riscv64-gnu@4.9.6": - version "4.9.6" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.9.6.tgz#160510e63f4b12618af4013bddf1761cf9fc9880" - integrity sha512-+uCOcvVmFUYvVDr27aiyun9WgZk0tXe7ThuzoUTAukZJOwS5MrGbmSlNOhx1j80GdpqbOty05XqSl5w4dQvcOA== - -"@rollup/rollup-linux-x64-gnu@4.9.6": - version "4.9.6" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.9.6.tgz#5ac5d068ce0726bd0a96ca260d5bd93721c0cb98" - integrity sha512-HUNqM32dGzfBKuaDUBqFB7tP6VMN74eLZ33Q9Y1TBqRDn+qDonkAUyKWwF9BR9unV7QUzffLnz9GrnKvMqC/fw== - -"@rollup/rollup-linux-x64-musl@4.9.6": - version "4.9.6" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.9.6.tgz#bafa759ab43e8eab9edf242a8259ffb4f2a57a5d" - integrity sha512-ch7M+9Tr5R4FK40FHQk8VnML0Szi2KRujUgHXd/HjuH9ifH72GUmw6lStZBo3c3GB82vHa0ZoUfjfcM7JiiMrQ== - -"@rollup/rollup-win32-arm64-msvc@4.9.6": - version "4.9.6" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.9.6.tgz#1cc3416682e5a20d8f088f26657e6e47f8db468e" - integrity sha512-VD6qnR99dhmTQ1mJhIzXsRcTBvTjbfbGGwKAHcu+52cVl15AC/kplkhxzW/uT0Xl62Y/meBKDZvoJSJN+vTeGA== - -"@rollup/rollup-win32-ia32-msvc@4.9.6": - version "4.9.6" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.9.6.tgz#7d2251e1aa5e8a1e47c86891fe4547a939503461" - integrity sha512-J9AFDq/xiRI58eR2NIDfyVmTYGyIZmRcvcAoJ48oDld/NTR8wyiPUu2X/v1navJ+N/FGg68LEbX3Ejd6l8B7MQ== - -"@rollup/rollup-win32-x64-msvc@4.9.6": - version "4.9.6" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.9.6.tgz#2c1fb69e02a3f1506f52698cfdc3a8b6386df9a6" - integrity sha512-jqzNLhNDvIZOrt69Ce4UjGRpXJBzhUBzawMwnaDAwyHriki3XollsewxWzOzz+4yOFDkuJHtTsZFwMxhYJWmLQ== +"@rollup/rollup-android-arm-eabi@4.35.0": + version "4.35.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.35.0.tgz#e1d7700735f7e8de561ef7d1fa0362082a180c43" + integrity sha512-uYQ2WfPaqz5QtVgMxfN6NpLD+no0MYHDBywl7itPYd3K5TjjSghNKmX8ic9S8NU8w81NVhJv/XojcHptRly7qQ== + +"@rollup/rollup-android-arm64@4.35.0": + version "4.35.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.35.0.tgz#fa6cdfb1fc9e2c8e227a7f35d524d8f7f90cf4db" + integrity sha512-FtKddj9XZudurLhdJnBl9fl6BwCJ3ky8riCXjEw3/UIbjmIY58ppWwPEvU3fNu+W7FUsAsB1CdH+7EQE6CXAPA== + +"@rollup/rollup-darwin-arm64@4.35.0": + version "4.35.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.35.0.tgz#6da5a1ddc4f11d4a7ae85ab443824cb6bf614e30" + integrity sha512-Uk+GjOJR6CY844/q6r5DR/6lkPFOw0hjfOIzVx22THJXMxktXG6CbejseJFznU8vHcEBLpiXKY3/6xc+cBm65Q== + +"@rollup/rollup-darwin-x64@4.35.0": + version "4.35.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.35.0.tgz#25b74ce2d8d3f9ea8e119b01384d44a1c0a0d3ae" + integrity sha512-3IrHjfAS6Vkp+5bISNQnPogRAW5GAV1n+bNCrDwXmfMHbPl5EhTmWtfmwlJxFRUCBZ+tZ/OxDyU08aF6NI/N5Q== + +"@rollup/rollup-freebsd-arm64@4.35.0": + version "4.35.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.35.0.tgz#be3d39e3441df5d6e187c83d158c60656c82e203" + integrity sha512-sxjoD/6F9cDLSELuLNnY0fOrM9WA0KrM0vWm57XhrIMf5FGiN8D0l7fn+bpUeBSU7dCgPV2oX4zHAsAXyHFGcQ== + +"@rollup/rollup-freebsd-x64@4.35.0": + version "4.35.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.35.0.tgz#cd932d3ec679711efd65ca25821fb318e25b7ce4" + integrity sha512-2mpHCeRuD1u/2kruUiHSsnjWtHjqVbzhBkNVQ1aVD63CcexKVcQGwJ2g5VphOd84GvxfSvnnlEyBtQCE5hxVVw== + +"@rollup/rollup-linux-arm-gnueabihf@4.35.0": + version "4.35.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.35.0.tgz#d300b74c6f805474225632f185daaeae760ac2bb" + integrity sha512-mrA0v3QMy6ZSvEuLs0dMxcO2LnaCONs1Z73GUDBHWbY8tFFocM6yl7YyMu7rz4zS81NDSqhrUuolyZXGi8TEqg== + +"@rollup/rollup-linux-arm-musleabihf@4.35.0": + version "4.35.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.35.0.tgz#2caac622380f314c41934ed1e68ceaf6cc380cc3" + integrity sha512-DnYhhzcvTAKNexIql8pFajr0PiDGrIsBYPRvCKlA5ixSS3uwo/CWNZxB09jhIapEIg945KOzcYEAGGSmTSpk7A== + +"@rollup/rollup-linux-arm64-gnu@4.35.0": + version "4.35.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.35.0.tgz#1ec841650b038cc15c194c26326483fd7ebff3e3" + integrity sha512-uagpnH2M2g2b5iLsCTZ35CL1FgyuzzJQ8L9VtlJ+FckBXroTwNOaD0z0/UF+k5K3aNQjbm8LIVpxykUOQt1m/A== + +"@rollup/rollup-linux-arm64-musl@4.35.0": + version "4.35.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.35.0.tgz#2fc70a446d986e27f6101ea74e81746987f69150" + integrity sha512-XQxVOCd6VJeHQA/7YcqyV0/88N6ysSVzRjJ9I9UA/xXpEsjvAgDTgH3wQYz5bmr7SPtVK2TsP2fQ2N9L4ukoUg== + +"@rollup/rollup-linux-loongarch64-gnu@4.35.0": + version "4.35.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.35.0.tgz#561bd045cd9ce9e08c95f42e7a8688af8c93d764" + integrity sha512-5pMT5PzfgwcXEwOaSrqVsz/LvjDZt+vQ8RT/70yhPU06PTuq8WaHhfT1LW+cdD7mW6i/J5/XIkX/1tCAkh1W6g== + +"@rollup/rollup-linux-powerpc64le-gnu@4.35.0": + version "4.35.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.35.0.tgz#45d849a0b33813f33fe5eba9f99e0ff15ab5caad" + integrity sha512-c+zkcvbhbXF98f4CtEIP1EBA/lCic5xB0lToneZYvMeKu5Kamq3O8gqrxiYYLzlZH6E3Aq+TSW86E4ay8iD8EA== + +"@rollup/rollup-linux-riscv64-gnu@4.35.0": + version "4.35.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.35.0.tgz#78dde3e6fcf5b5733a97d0a67482d768aa1e83a5" + integrity sha512-s91fuAHdOwH/Tad2tzTtPX7UZyytHIRR6V4+2IGlV0Cej5rkG0R61SX4l4y9sh0JBibMiploZx3oHKPnQBKe4g== + +"@rollup/rollup-linux-s390x-gnu@4.35.0": + version "4.35.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.35.0.tgz#2e34835020f9e03dfb411473a5c2a0e8a9c5037b" + integrity sha512-hQRkPQPLYJZYGP+Hj4fR9dDBMIM7zrzJDWFEMPdTnTy95Ljnv0/4w/ixFw3pTBMEuuEuoqtBINYND4M7ujcuQw== + +"@rollup/rollup-linux-x64-gnu@4.35.0": + version "4.35.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.35.0.tgz#4f9774beddc6f4274df57ac99862eb23040de461" + integrity sha512-Pim1T8rXOri+0HmV4CdKSGrqcBWX0d1HoPnQ0uw0bdp1aP5SdQVNBy8LjYncvnLgu3fnnCt17xjWGd4cqh8/hA== + +"@rollup/rollup-linux-x64-musl@4.35.0": + version "4.35.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.35.0.tgz#dfcff2c1aed518b3d23ccffb49afb349d74fb608" + integrity sha512-QysqXzYiDvQWfUiTm8XmJNO2zm9yC9P/2Gkrwg2dH9cxotQzunBHYr6jk4SujCTqnfGxduOmQcI7c2ryuW8XVg== + +"@rollup/rollup-win32-arm64-msvc@4.35.0": + version "4.35.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.35.0.tgz#b0b37e2d77041e3aa772f519291309abf4c03a84" + integrity sha512-OUOlGqPkVJCdJETKOCEf1mw848ZyJ5w50/rZ/3IBQVdLfR5jk/6Sr5m3iO2tdPgwo0x7VcncYuOvMhBWZq8ayg== + +"@rollup/rollup-win32-ia32-msvc@4.35.0": + version "4.35.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.35.0.tgz#5b5a40e44a743ddc0e06b8e1b3982f856dc9ce0a" + integrity sha512-2/lsgejMrtwQe44glq7AFFHLfJBPafpsTa6JvP2NGef/ifOa4KBoglVf7AKN7EV9o32evBPRqfg96fEHzWo5kw== + +"@rollup/rollup-win32-x64-msvc@4.35.0": + version "4.35.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.35.0.tgz#05f25dbc9981bee1ae6e713daab10397044a46ca" + integrity sha512-PIQeY5XDkrOysbQblSW7v3l1MDZzkTEzAfTPkj5VAu3FW8fS4ynyLg2sINp0fp3SjZ8xkRYpLqoKcYqAkhU1dw== + +"@rtsao/scc@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@rtsao/scc/-/scc-1.1.0.tgz#927dd2fae9bc3361403ac2c7a00c32ddce9ad7e8" + integrity sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g== "@rushstack/eslint-patch@^1.3.3": - version "1.7.2" - resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.7.2.tgz#2d4260033e199b3032a08b41348ac10de21c47e9" - integrity sha512-RbhOOTCNoCrbfkRyoXODZp75MlpiHMgbE5MEBZAnnnLyQNgrigEj4p0lzsMDyc1zVsJDLrivB58tgg3emX0eEA== + version "1.11.0" + resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.11.0.tgz#75dce8e972f90bba488e2b0cc677fb233aa357ab" + integrity sha512-zxnHvoMQVqewTJr/W4pKjF0bMGiKJv1WX7bSrkl46Hg0QjESbzBROWK0Wg4RphzSOS5Jiy7eFimmM3UgMrMZbQ== -"@safe-global/safe-apps-provider@0.18.1": - version "0.18.1" - resolved "https://registry.yarnpkg.com/@safe-global/safe-apps-provider/-/safe-apps-provider-0.18.1.tgz#287b5a1e2ef3be630dacde54279409df3ced8202" - integrity sha512-V4a05A3EgJcriqtDoJklDz1BOinWhC6P0hjUSxshA4KOZM7rGPCTto/usXs09zr1vvL28evl/NldSTv97j2bmg== +"@safe-global/safe-apps-provider@0.18.5": + version "0.18.5" + resolved "https://registry.yarnpkg.com/@safe-global/safe-apps-provider/-/safe-apps-provider-0.18.5.tgz#745a932bda3739a8a298ae44ec6c465f6c4773b7" + integrity sha512-9v9wjBi3TwLsEJ3C2ujYoexp3pFJ0omDLH/GX91e2QB+uwCKTBYyhxFSrTQ9qzoyQd+bfsk4gjOGW87QcJhf7g== dependencies: - "@safe-global/safe-apps-sdk" "^8.1.0" + "@safe-global/safe-apps-sdk" "^9.1.0" events "^3.3.0" -"@safe-global/safe-apps-sdk@8.1.0", "@safe-global/safe-apps-sdk@^8.1.0": - version "8.1.0" - resolved "https://registry.yarnpkg.com/@safe-global/safe-apps-sdk/-/safe-apps-sdk-8.1.0.tgz#d1d0c69cd2bf4eef8a79c5d677d16971926aa64a" - integrity sha512-XJbEPuaVc7b9n23MqlF6c+ToYIS3f7P2Sel8f3cSBQ9WORE4xrSuvhMpK9fDSFqJ7by/brc+rmJR/5HViRr0/w== +"@safe-global/safe-apps-sdk@9.1.0", "@safe-global/safe-apps-sdk@^9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@safe-global/safe-apps-sdk/-/safe-apps-sdk-9.1.0.tgz#0e65913e0f202e529ed3c846e0f5a98c2d35aa98" + integrity sha512-N5p/ulfnnA2Pi2M3YeWjULeWbjo7ei22JwU/IXnhoHzKq3pYCN6ynL9mJBOlvDVv892EgLPCWCOwQk/uBT2v0Q== dependencies: "@safe-global/safe-gateway-typescript-sdk" "^3.5.3" - viem "^1.0.0" + viem "^2.1.1" "@safe-global/safe-gateway-typescript-sdk@^3.5.3": - version "3.14.0" - resolved "https://registry.yarnpkg.com/@safe-global/safe-gateway-typescript-sdk/-/safe-gateway-typescript-sdk-3.14.0.tgz#9581c524c1ea4956555f40761eb6b4007392aa82" - integrity sha512-/dqU66RvHw50n+7x3nwnJedq8V6iLQyoWitNdjx5cFTBmae+rpP+LvHq+LqZfXJVkB1qNytMdjFjdyES0t79gQ== + version "3.22.9" + resolved "https://registry.yarnpkg.com/@safe-global/safe-gateway-typescript-sdk/-/safe-gateway-typescript-sdk-3.22.9.tgz#7f6571aaf1aecbe1217f6dd294ad2f3d90c2c8c2" + integrity sha512-7ojVK/crhOaGowEO8uYWaopZzcr5rR76emgllGIfjCLR70aY4PbASpi9Pbs+7jIRzPDBBkM0RBo+zYx5UduX8Q== -"@scure/base@^1.1.1", "@scure/base@^1.1.3", "@scure/base@^1.1.5", "@scure/base@~1.1.0", "@scure/base@~1.1.2", "@scure/base@~1.1.4": - version "1.1.5" - resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.5.tgz#1d85d17269fe97694b9c592552dd9e5e33552157" - integrity sha512-Brj9FiG2W1MRQSTB212YVPRrcbjkv48FoZi/u4l/zds/ieRrqsh7aUf6CLwkAq61oKXr/ZlTzlY66gLIj3TFTQ== +"@scure/base@^1.1.3", "@scure/base@^1.1.5", "@scure/base@~1.2.2", "@scure/base@~1.2.4": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.2.4.tgz#002eb571a35d69bdb4c214d0995dff76a8dcd2a9" + integrity sha512-5Yy9czTO47mqz+/J8GM6GIId4umdCk1wc1q8rKERQulIoc8VP9pzDcghv10Tl2E7R96ZUx/PhND3ESYUQX8NuQ== + +"@scure/base@~1.1.0", "@scure/base@~1.1.2", "@scure/base@~1.1.6": + version "1.1.9" + resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.9.tgz#e5e142fbbfe251091f9c5f1dd4c834ac04c3dbd1" + integrity sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg== "@scure/bip32@1.1.5": version "1.1.5" @@ -2217,14 +1877,23 @@ "@noble/hashes" "~1.3.2" "@scure/base" "~1.1.2" -"@scure/bip32@1.3.3": - version "1.3.3" - resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.3.3.tgz#a9624991dc8767087c57999a5d79488f48eae6c8" - integrity sha512-LJaN3HwRbfQK0X1xFSi0Q9amqOgzQnnDngIt+ZlsBC3Bm7/nE7K0kwshZHyaru79yIVRv/e1mQAjZyuZG6jOFQ== +"@scure/bip32@1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.4.0.tgz#4e1f1e196abedcef395b33b9674a042524e20d67" + integrity sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg== dependencies: - "@noble/curves" "~1.3.0" - "@noble/hashes" "~1.3.2" - "@scure/base" "~1.1.4" + "@noble/curves" "~1.4.0" + "@noble/hashes" "~1.4.0" + "@scure/base" "~1.1.6" + +"@scure/bip32@1.6.2", "@scure/bip32@^1.5.0": + version "1.6.2" + resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.6.2.tgz#093caa94961619927659ed0e711a6e4bf35bffd0" + integrity sha512-t96EPDMbtGgtb7onKKqxRLfE5g05k7uHnHRM2xdE6BP/ZmxaLtPek4J4KfVn/90IQNrU1IOAqMgiDtUdtbe3nw== + dependencies: + "@noble/curves" "~1.8.1" + "@noble/hashes" "~1.7.1" + "@scure/base" "~1.2.2" "@scure/bip39@1.1.1": version "1.1.1" @@ -2242,13 +1911,21 @@ "@noble/hashes" "~1.3.0" "@scure/base" "~1.1.0" -"@scure/bip39@1.2.2": - version "1.2.2" - resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.2.2.tgz#f3426813f4ced11a47489cbcf7294aa963966527" - integrity sha512-HYf9TUXG80beW+hGAt3TRM8wU6pQoYur9iNypTROm42dorCGmLnFe3eWjz3gOq6G62H2WRh0FCzAR1PI+29zIA== +"@scure/bip39@1.3.0": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.3.0.tgz#0f258c16823ddd00739461ac31398b4e7d6a18c3" + integrity sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ== dependencies: - "@noble/hashes" "~1.3.2" - "@scure/base" "~1.1.4" + "@noble/hashes" "~1.4.0" + "@scure/base" "~1.1.6" + +"@scure/bip39@1.5.4", "@scure/bip39@^1.4.0": + version "1.5.4" + resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.5.4.tgz#07fd920423aa671be4540d59bdd344cc1461db51" + integrity sha512-TFM4ni0vKvCfBpohoh+/lY05i9gRbSwXWngAsF4CABQxoaOHijxuaZ2R6cStDQ5CHtHO9aGJTr4ksVJASRRyMA== + dependencies: + "@noble/hashes" "~1.7.1" + "@scure/base" "~1.2.4" "@sentry/core@5.30.0": version "5.30.0" @@ -2318,6 +1995,27 @@ "@sentry/types" "5.30.0" tslib "^1.9.3" +"@shikijs/engine-oniguruma@^1.27.2": + version "1.29.2" + resolved "https://registry.yarnpkg.com/@shikijs/engine-oniguruma/-/engine-oniguruma-1.29.2.tgz#d879717ced61d44e78feab16f701f6edd75434f1" + integrity sha512-7iiOx3SG8+g1MnlzZVDYiaeHe7Ez2Kf2HrJzdmGwkRisT7r4rak0e655AcM/tF9JG/kg5fMNYlLLKglbN7gBqA== + dependencies: + "@shikijs/types" "1.29.2" + "@shikijs/vscode-textmate" "^10.0.1" + +"@shikijs/types@1.29.2", "@shikijs/types@^1.27.2": + version "1.29.2" + resolved "https://registry.yarnpkg.com/@shikijs/types/-/types-1.29.2.tgz#a93fdb410d1af8360c67bf5fc1d1a68d58e21c4f" + integrity sha512-VJjK0eIijTZf0QSTODEXCqinjBn0joAHQ+aPSBzrv4O2d/QSbsMw+ZeSRx03kV34Hy7NzUvV/7NqfYGRLrASmw== + dependencies: + "@shikijs/vscode-textmate" "^10.0.1" + "@types/hast" "^3.0.4" + +"@shikijs/vscode-textmate@^10.0.1": + version "10.0.2" + resolved "https://registry.yarnpkg.com/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz#a90ab31d0cc1dfb54c66a69e515bf624fa7b2224" + integrity sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg== + "@sideway/address@^4.1.5": version "4.1.5" resolved "https://registry.yarnpkg.com/@sideway/address/-/address-4.1.5.tgz#4bc149a0076623ced99ca8208ba780d65a99b9d5" @@ -2335,19 +2033,7 @@ resolved "https://registry.yarnpkg.com/@sideway/pinpoint/-/pinpoint-2.0.0.tgz#cff8ffadc372ad29fd3f78277aeb29e632cc70df" integrity sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ== -"@sinclair/typebox@^0.27.8": - version "0.27.8" - resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" - integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== - -"@sinonjs/commons@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-2.0.0.tgz#fd4ca5b063554307e8327b4564bd56d3b73924a3" - integrity sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg== - dependencies: - type-detect "4.0.8" - -"@sinonjs/commons@^3.0.0": +"@sinonjs/commons@^3.0.0", "@sinonjs/commons@^3.0.1": version "3.0.1" resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-3.0.1.tgz#1029357e44ca901a615585f6d27738dbc89084cd" integrity sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ== @@ -2355,164 +2041,30 @@ type-detect "4.0.8" "@sinonjs/fake-timers@^11.2.2": - version "11.2.2" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-11.2.2.tgz#50063cc3574f4a27bd8453180a04171c85cc9699" - integrity sha512-G2piCSxQ7oWOxwGSAyFHfPIsyeJGXYtc6mFbnFA+kRXkiEnTl8c/8jul2S329iFBnDI9HGoeWWAZvuvOkZccgw== + version "11.3.1" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-11.3.1.tgz#51d6e8d83ca261ff02c0ab0e68e9db23d5cd5999" + integrity sha512-EVJO7nW5M/F5Tur0Rf2z/QoMo+1Ia963RiMtapiQrEWvY0iBUvADo8Beegwjpnle5BHkyHuoxSTW3jF43H1XRA== dependencies: - "@sinonjs/commons" "^3.0.0" + "@sinonjs/commons" "^3.0.1" "@sinonjs/samsam@^8.0.0": - version "8.0.0" - resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-8.0.0.tgz#0d488c91efb3fa1442e26abea81759dfc8b5ac60" - integrity sha512-Bp8KUVlLp8ibJZrnvq2foVhP0IVX2CIprMJPK0vqGqgrDa0OHVKeZyBykqskkrdxV6yKBPmGasO8LVjAKR3Gew== + version "8.0.2" + resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-8.0.2.tgz#e4386bf668ff36c95949e55a38dc5f5892fc2689" + integrity sha512-v46t/fwnhejRSFTGqbpn9u+LQ9xJDse10gNnPgAcxgdoCDMXj/G2asWAC/8Qs+BAZDicX+MNZouXT1A7c83kVw== dependencies: - "@sinonjs/commons" "^2.0.0" + "@sinonjs/commons" "^3.0.1" lodash.get "^4.4.2" - type-detect "^4.0.8" + type-detect "^4.1.0" "@sinonjs/text-encoding@^0.7.2": - version "0.7.2" - resolved "https://registry.yarnpkg.com/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz#5981a8db18b56ba38ef0efb7d995b12aa7b51918" - integrity sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ== + version "0.7.3" + resolved "https://registry.yarnpkg.com/@sinonjs/text-encoding/-/text-encoding-0.7.3.tgz#282046f03e886e352b2d5f5da5eb755e01457f3f" + integrity sha512-DE427ROAphMQzU4ENbliGYrBSYPXF+TtLg9S8vzeA+OF4ZKzoDdzfL8sxuMUGS/lgRhM6j1URSk9ghf7Xo1tyA== "@socket.io/component-emitter@~3.1.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz#96116f2a912e0c02817345b3c10751069920d553" - integrity sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg== - -"@stablelib/aead@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@stablelib/aead/-/aead-1.0.1.tgz#c4b1106df9c23d1b867eb9b276d8f42d5fc4c0c3" - integrity sha512-q39ik6sxGHewqtO0nP4BuSe3db5G1fEJE8ukvngS2gLkBXyy6E7pLubhbYgnkDFv6V8cWaxcE4Xn0t6LWcJkyg== - -"@stablelib/binary@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@stablelib/binary/-/binary-1.0.1.tgz#c5900b94368baf00f811da5bdb1610963dfddf7f" - integrity sha512-ClJWvmL6UBM/wjkvv/7m5VP3GMr9t0osr4yVgLZsLCOz4hGN9gIAFEqnJ0TsSMAN+n840nf2cHZnA5/KFqHC7Q== - dependencies: - "@stablelib/int" "^1.0.1" - -"@stablelib/bytes@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@stablelib/bytes/-/bytes-1.0.1.tgz#0f4aa7b03df3080b878c7dea927d01f42d6a20d8" - integrity sha512-Kre4Y4kdwuqL8BR2E9hV/R5sOrUj6NanZaZis0V6lX5yzqC3hBuVSDXUIBqQv/sCpmuWRiHLwqiT1pqqjuBXoQ== - -"@stablelib/chacha20poly1305@1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@stablelib/chacha20poly1305/-/chacha20poly1305-1.0.1.tgz#de6b18e283a9cb9b7530d8767f99cde1fec4c2ee" - integrity sha512-MmViqnqHd1ymwjOQfghRKw2R/jMIGT3wySN7cthjXCBdO+qErNPUBnRzqNpnvIwg7JBCg3LdeCZZO4de/yEhVA== - dependencies: - "@stablelib/aead" "^1.0.1" - "@stablelib/binary" "^1.0.1" - "@stablelib/chacha" "^1.0.1" - "@stablelib/constant-time" "^1.0.1" - "@stablelib/poly1305" "^1.0.1" - "@stablelib/wipe" "^1.0.1" - -"@stablelib/chacha@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@stablelib/chacha/-/chacha-1.0.1.tgz#deccfac95083e30600c3f92803a3a1a4fa761371" - integrity sha512-Pmlrswzr0pBzDofdFuVe1q7KdsHKhhU24e8gkEwnTGOmlC7PADzLVxGdn2PoNVBBabdg0l/IfLKg6sHAbTQugg== - dependencies: - "@stablelib/binary" "^1.0.1" - "@stablelib/wipe" "^1.0.1" - -"@stablelib/constant-time@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@stablelib/constant-time/-/constant-time-1.0.1.tgz#bde361465e1cf7b9753061b77e376b0ca4c77e35" - integrity sha512-tNOs3uD0vSJcK6z1fvef4Y+buN7DXhzHDPqRLSXUel1UfqMB1PWNsnnAezrKfEwTLpN0cGH2p9NNjs6IqeD0eg== - -"@stablelib/ed25519@^1.0.2": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@stablelib/ed25519/-/ed25519-1.0.3.tgz#f8fdeb6f77114897c887bb6a3138d659d3f35996" - integrity sha512-puIMWaX9QlRsbhxfDc5i+mNPMY+0TmQEskunY1rZEBPi1acBCVQAhnsk/1Hk50DGPtVsZtAWQg4NHGlVaO9Hqg== - dependencies: - "@stablelib/random" "^1.0.2" - "@stablelib/sha512" "^1.0.1" - "@stablelib/wipe" "^1.0.1" - -"@stablelib/hash@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@stablelib/hash/-/hash-1.0.1.tgz#3c944403ff2239fad8ebb9015e33e98444058bc5" - integrity sha512-eTPJc/stDkdtOcrNMZ6mcMK1e6yBbqRBaNW55XA1jU8w/7QdnCF0CmMmOD1m7VSkBR44PWrMHU2l6r8YEQHMgg== - -"@stablelib/hkdf@1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@stablelib/hkdf/-/hkdf-1.0.1.tgz#b4efd47fd56fb43c6a13e8775a54b354f028d98d" - integrity sha512-SBEHYE16ZXlHuaW5RcGk533YlBj4grMeg5TooN80W3NpcHRtLZLLXvKyX0qcRFxf+BGDobJLnwkvgEwHIDBR6g== - dependencies: - "@stablelib/hash" "^1.0.1" - "@stablelib/hmac" "^1.0.1" - "@stablelib/wipe" "^1.0.1" - -"@stablelib/hmac@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@stablelib/hmac/-/hmac-1.0.1.tgz#3d4c1b8cf194cb05d28155f0eed8a299620a07ec" - integrity sha512-V2APD9NSnhVpV/QMYgCVMIYKiYG6LSqw1S65wxVoirhU/51ACio6D4yDVSwMzuTJXWZoVHbDdINioBwKy5kVmA== - dependencies: - "@stablelib/constant-time" "^1.0.1" - "@stablelib/hash" "^1.0.1" - "@stablelib/wipe" "^1.0.1" - -"@stablelib/int@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@stablelib/int/-/int-1.0.1.tgz#75928cc25d59d73d75ae361f02128588c15fd008" - integrity sha512-byr69X/sDtDiIjIV6m4roLVWnNNlRGzsvxw+agj8CIEazqWGOQp2dTYgQhtyVXV9wpO6WyXRQUzLV/JRNumT2w== - -"@stablelib/keyagreement@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@stablelib/keyagreement/-/keyagreement-1.0.1.tgz#4612efb0a30989deb437cd352cee637ca41fc50f" - integrity sha512-VKL6xBwgJnI6l1jKrBAfn265cspaWBPAPEc62VBQrWHLqVgNRE09gQ/AnOEyKUWrrqfD+xSQ3u42gJjLDdMDQg== - dependencies: - "@stablelib/bytes" "^1.0.1" - -"@stablelib/poly1305@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@stablelib/poly1305/-/poly1305-1.0.1.tgz#93bfb836c9384685d33d70080718deae4ddef1dc" - integrity sha512-1HlG3oTSuQDOhSnLwJRKeTRSAdFNVB/1djy2ZbS35rBSJ/PFqx9cf9qatinWghC2UbfOYD8AcrtbUQl8WoxabA== - dependencies: - "@stablelib/constant-time" "^1.0.1" - "@stablelib/wipe" "^1.0.1" - -"@stablelib/random@^1.0.1", "@stablelib/random@^1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@stablelib/random/-/random-1.0.2.tgz#2dece393636489bf7e19c51229dd7900eddf742c" - integrity sha512-rIsE83Xpb7clHPVRlBj8qNe5L8ISQOzjghYQm/dZ7VaM2KHYwMW5adjQjrzTZCchFnNCNhkwtnOBa9HTMJCI8w== - dependencies: - "@stablelib/binary" "^1.0.1" - "@stablelib/wipe" "^1.0.1" - -"@stablelib/sha256@1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@stablelib/sha256/-/sha256-1.0.1.tgz#77b6675b67f9b0ea081d2e31bda4866297a3ae4f" - integrity sha512-GIIH3e6KH+91FqGV42Kcj71Uefd/QEe7Dy42sBTeqppXV95ggCcxLTk39bEr+lZfJmp+ghsR07J++ORkRELsBQ== - dependencies: - "@stablelib/binary" "^1.0.1" - "@stablelib/hash" "^1.0.1" - "@stablelib/wipe" "^1.0.1" - -"@stablelib/sha512@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@stablelib/sha512/-/sha512-1.0.1.tgz#6da700c901c2c0ceacbd3ae122a38ac57c72145f" - integrity sha512-13gl/iawHV9zvDKciLo1fQ8Bgn2Pvf7OV6amaRVKiq3pjQ3UmEpXxWiAfV8tYjUpeZroBxtyrwtdooQT/i3hzw== - dependencies: - "@stablelib/binary" "^1.0.1" - "@stablelib/hash" "^1.0.1" - "@stablelib/wipe" "^1.0.1" - -"@stablelib/wipe@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@stablelib/wipe/-/wipe-1.0.1.tgz#d21401f1d59ade56a62e139462a97f104ed19a36" - integrity sha512-WfqfX/eXGiAd3RJe4VU2snh/ZPwtSjLG4ynQ/vYzvghTh7dHFcI1wl+nrkWG6lGhukOxOsUHfv8dUXr58D0ayg== - -"@stablelib/x25519@^1.0.3": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@stablelib/x25519/-/x25519-1.0.3.tgz#13c8174f774ea9f3e5e42213cbf9fc68a3c7b7fd" - integrity sha512-KnTbKmUhPhHavzobclVJQG5kuivH+qDLpe84iRqX3CLrKp881cF160JvXJ+hjn1aMyCwYOKeIZefIH/P5cJoRw== - dependencies: - "@stablelib/keyagreement" "^1.0.1" - "@stablelib/random" "^1.0.2" - "@stablelib/wipe" "^1.0.1" + version "3.1.2" + resolved "https://registry.yarnpkg.com/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz#821f8442f4175d8f0467b9daf26e3a18e2d02af2" + integrity sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA== "@stitches/core@^1.2.8": version "1.2.8" @@ -2531,64 +2083,135 @@ resolved "https://registry.yarnpkg.com/@tailwindcss/line-clamp/-/line-clamp-0.4.4.tgz#767cf8e5d528a5d90c9740ca66eb079f5e87d423" integrity sha512-5U6SY5z8N42VtrCrKlsTAA35gy2VSyYtHWCsg1H87NU1SXnEfekTVlrga9fzUDrrHcGi2Lb5KenUWb4lRQT5/g== -"@tailwindcss/typography@^0.5.10": - version "0.5.10" - resolved "https://registry.yarnpkg.com/@tailwindcss/typography/-/typography-0.5.10.tgz#2abde4c6d5c797ab49cf47610830a301de4c1e0a" - integrity sha512-Pe8BuPJQJd3FfRnm6H0ulKIGoMEQS+Vq01R6M5aCrFB/ccR/shT+0kXLjouGC1gFLm9hopTFN+DMP0pfwRWzPw== +"@tailwindcss/node@4.0.12": + version "4.0.12" + resolved "https://registry.yarnpkg.com/@tailwindcss/node/-/node-4.0.12.tgz#0f89ad2537eafe65a35ec4400b42142de918bafc" + integrity sha512-a6J11K1Ztdln9OrGfoM75/hChYPcHYGNYimqciMrvKXRmmPaS8XZTHhdvb5a3glz4Kd4ZxE1MnuFE2c0fGGmtg== + dependencies: + enhanced-resolve "^5.18.1" + jiti "^2.4.2" + tailwindcss "4.0.12" + +"@tailwindcss/oxide-android-arm64@4.0.12": + version "4.0.12" + resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.0.12.tgz#f79cf637bc11b0ae71e75b66d7c5ba5159bd3df3" + integrity sha512-dAXCaemu3mHLXcA5GwGlQynX8n7tTdvn5i1zAxRvZ5iC9fWLl5bGnjZnzrQqT7ttxCvRwdVf3IHUnMVdDBO/kQ== + +"@tailwindcss/oxide-darwin-arm64@4.0.12": + version "4.0.12" + resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.0.12.tgz#6b730b5d19ff01748a27af5103966f534a899f07" + integrity sha512-vPNI+TpJQ7sizselDXIJdYkx9Cu6JBdtmRWujw9pVIxW8uz3O2PjgGGzL/7A0sXI8XDjSyRChrUnEW9rQygmJQ== + +"@tailwindcss/oxide-darwin-x64@4.0.12": + version "4.0.12" + resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.0.12.tgz#2eb33ba40cbb78922004be9d6b81542347043fe5" + integrity sha512-RL/9jM41Fdq4Efr35C5wgLx98BirnrfwuD+zgMFK6Ir68HeOSqBhW9jsEeC7Y/JcGyPd3MEoJVIU4fAb7YLg7A== + +"@tailwindcss/oxide-freebsd-x64@4.0.12": + version "4.0.12" + resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.0.12.tgz#317b980504b0bbcaee32c9e4e961f77cdadb02a6" + integrity sha512-7WzWiax+LguJcMEimY0Q4sBLlFXu1tYxVka3+G2M9KmU/3m84J3jAIV4KZWnockbHsbb2XgrEjtlJKVwHQCoRA== + +"@tailwindcss/oxide-linux-arm-gnueabihf@4.0.12": + version "4.0.12" + resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.0.12.tgz#0f7153dec6e200327b76775ad2d1154706cef34d" + integrity sha512-X9LRC7jjE1QlfIaBbXjY0PGeQP87lz5mEfLSVs2J1yRc9PSg1tEPS9NBqY4BU9v5toZgJgzKeaNltORyTs22TQ== + +"@tailwindcss/oxide-linux-arm64-gnu@4.0.12": + version "4.0.12" + resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.0.12.tgz#50a3ec46600cc998f45a265ebdd5de2d7bb27ee0" + integrity sha512-i24IFNq2402zfDdoWKypXz0ZNS2G4NKaA82tgBlE2OhHIE+4mg2JDb5wVfyP6R+MCm5grgXvurcIcKWvo44QiQ== + +"@tailwindcss/oxide-linux-arm64-musl@4.0.12": + version "4.0.12" + resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.0.12.tgz#2de10c5239766e2fb810045fe5b75db54d481fd4" + integrity sha512-LmOdshJBfAGIBG0DdBWhI0n5LTMurnGGJCHcsm9F//ISfsHtCnnYIKgYQui5oOz1SUCkqsMGfkAzWyNKZqbGNw== + +"@tailwindcss/oxide-linux-x64-gnu@4.0.12": + version "4.0.12" + resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.0.12.tgz#f89a24ffb0f14ea23d110efcbf58baa1db783582" + integrity sha512-OSK667qZRH30ep8RiHbZDQfqkXjnzKxdn0oRwWzgCO8CoTxV+MvIkd0BWdQbYtYuM1wrakARV/Hwp0eA/qzdbw== + +"@tailwindcss/oxide-linux-x64-musl@4.0.12": + version "4.0.12" + resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.0.12.tgz#c53a5b494e241a744f067ba3a261adca80c20af4" + integrity sha512-uylhWq6OWQ8krV8Jk+v0H/3AZKJW6xYMgNMyNnUbbYXWi7hIVdxRKNUB5UvrlC3RxtgsK5EAV2i1CWTRsNcAnA== + +"@tailwindcss/oxide-win32-arm64-msvc@4.0.12": + version "4.0.12" + resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.0.12.tgz#63c0befad43355fb5cea6c64efd946a718acb06b" + integrity sha512-XDLnhMoXZEEOir1LK43/gHHwK84V1GlV8+pAncUAIN2wloeD+nNciI9WRIY/BeFTqES22DhTIGoilSO39xDb2g== + +"@tailwindcss/oxide-win32-x64-msvc@4.0.12": + version "4.0.12" + resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.0.12.tgz#d8fabbdc86d323ca29f5ef298c20f651585ed402" + integrity sha512-I/BbjCLpKDQucvtn6rFuYLst1nfFwSMYyPzkx/095RE+tuzk5+fwXuzQh7T3fIBTcbn82qH/sFka7yPGA50tLw== + +"@tailwindcss/oxide@4.0.12": + version "4.0.12" + resolved "https://registry.yarnpkg.com/@tailwindcss/oxide/-/oxide-4.0.12.tgz#2db7c930d2c6fe29ee14a996891b21401650189a" + integrity sha512-DWb+myvJB9xJwelwT9GHaMc1qJj6MDXRDR0CS+T8IdkejAtu8ctJAgV4r1drQJLPeS7mNwq2UHW2GWrudTf63A== + optionalDependencies: + "@tailwindcss/oxide-android-arm64" "4.0.12" + "@tailwindcss/oxide-darwin-arm64" "4.0.12" + "@tailwindcss/oxide-darwin-x64" "4.0.12" + "@tailwindcss/oxide-freebsd-x64" "4.0.12" + "@tailwindcss/oxide-linux-arm-gnueabihf" "4.0.12" + "@tailwindcss/oxide-linux-arm64-gnu" "4.0.12" + "@tailwindcss/oxide-linux-arm64-musl" "4.0.12" + "@tailwindcss/oxide-linux-x64-gnu" "4.0.12" + "@tailwindcss/oxide-linux-x64-musl" "4.0.12" + "@tailwindcss/oxide-win32-arm64-msvc" "4.0.12" + "@tailwindcss/oxide-win32-x64-msvc" "4.0.12" + +"@tailwindcss/typography@^0.5.16": + version "0.5.16" + resolved "https://registry.yarnpkg.com/@tailwindcss/typography/-/typography-0.5.16.tgz#a926c8f44d5c439b2915e231cad80058850047c6" + integrity sha512-0wDLwCVF5V3x3b1SGXPCDcdsbDHMBe+lkFzBRaHeLvNi+nrrnZ1lA18u+OTWO8iSWU2GxUOCvlXtDuqftc1oiA== dependencies: lodash.castarray "^4.4.0" lodash.isplainobject "^4.0.6" lodash.merge "^4.6.2" postcss-selector-parser "6.0.10" -"@tanstack/eslint-plugin-query@^5.20.1": - version "5.20.1" - resolved "https://registry.yarnpkg.com/@tanstack/eslint-plugin-query/-/eslint-plugin-query-5.20.1.tgz#861afedd7cde6b98c88cf86a5923bb659122e7af" - integrity sha512-oIp7Wh90KHOm1FKCvcv87fiD2H96xo/crFrlhbvqBzR2f0tMEGOK/ANKMGNFQprd6BT6lyZhQPlOEkFdezsjIg== +"@tailwindcss/vite@^4.0.12": + version "4.0.12" + resolved "https://registry.yarnpkg.com/@tailwindcss/vite/-/vite-4.0.12.tgz#326ba32aaafe0108911611aa881ff78e95de8174" + integrity sha512-JM3gp601UJiryIZ9R2bSqalzcOy15RCybQ1Q+BJqDEwVyo4LkWKeqQAcrpHapWXY31OJFTuOUVBFDWMhzHm2Bg== dependencies: - "@typescript-eslint/utils" "^6.20.0" + "@tailwindcss/node" "4.0.12" + "@tailwindcss/oxide" "4.0.12" + lightningcss "^1.29.1" + tailwindcss "4.0.12" -"@tanstack/query-core@5.22.2": - version "5.22.2" - resolved "https://registry.yarnpkg.com/@tanstack/query-core/-/query-core-5.22.2.tgz#af67d41b0b4a3e846c2325f32540f39ca0d4788d" - integrity sha512-z3PwKFUFACMUqe1eyesCIKg3Jv1mysSrYfrEW5ww5DCDUD4zlpTKBvUDaEjsfZzL3ULrFLDM9yVUxI/fega1Qg== - -"@tanstack/react-query@^5.22.2": - version "5.22.2" - resolved "https://registry.yarnpkg.com/@tanstack/react-query/-/react-query-5.22.2.tgz#e5fce278fbdd026fc1d561a4505142b9f93549d7" - integrity sha512-TaxJDRzJ8/NWRT4lY2jguKCrNI6MRN+67dELzPjNUlvqzTxGANlMp68l7aC7hG8Bd1uHNxHl7ihv7MT50i/43A== +"@tanstack/eslint-plugin-query@^5.66.1": + version "5.67.2" + resolved "https://registry.yarnpkg.com/@tanstack/eslint-plugin-query/-/eslint-plugin-query-5.67.2.tgz#74a32d753a18436254afbecf58c19c313293dc5d" + integrity sha512-bWAA/0lYGBNv7lIV6tID2o5wC6yWUjkh9yx8ow9YMP3brxIhuUPdCAtJBhXL2nVzJTnc6FRrL401KFG5PPEkZg== dependencies: - "@tanstack/query-core" "5.22.2" - -"@tsconfig/node-lts@^20.1.1": - version "20.1.1" - resolved "https://registry.yarnpkg.com/@tsconfig/node-lts/-/node-lts-20.1.1.tgz#c43c9cbfc9c4f6e0a5146cd3b16cd79720033252" - integrity sha512-V7wHydi1dv8I8xiOX3pJ0lhC+MlOakznvLks94J6y/TqQK6DBcbdD1G4jEq8yU+s6lBASPn4e1Ci636fDqeyvQ== - -"@tsconfig/node10@^1.0.7": - version "1.0.9" - resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.9.tgz#df4907fc07a886922637b15e02d4cebc4c0021b2" - integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== + "@typescript-eslint/utils" "^8.18.1" -"@tsconfig/node12@^1.0.7": - version "1.0.11" - resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" - integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== +"@tanstack/query-core@5.67.2": + version "5.67.2" + resolved "https://registry.yarnpkg.com/@tanstack/query-core/-/query-core-5.67.2.tgz#3d59a7dd3613321465925975510c0bb8e603a064" + integrity sha512-+iaFJ/pt8TaApCk6LuZ0WHS/ECVfTzrxDOEL9HH9Dayyb5OVuomLzDXeSaI2GlGT/8HN7bDGiRXDts3LV+u6ww== -"@tsconfig/node14@^1.0.0": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" - integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== +"@tanstack/react-query@^5.66.0": + version "5.67.2" + resolved "https://registry.yarnpkg.com/@tanstack/react-query/-/react-query-5.67.2.tgz#70ef113dcd80500700a99658134dc3c6d0c1c65e" + integrity sha512-6Sa+BVNJWhAV4QHvIqM73norNeGRWGC3ftN0Ix87cmMvI215I1wyJ44KUTt/9a0V9YimfGcg25AITaYVel71Og== + dependencies: + "@tanstack/query-core" "5.67.2" -"@tsconfig/node16@^1.0.2": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" - integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== +"@tsconfig/node-lts@^20.1.1": + version "20.1.3" + resolved "https://registry.yarnpkg.com/@tsconfig/node-lts/-/node-lts-20.1.3.tgz#8cdf6fa6c593bf5e16e53134ed377627a58a746e" + integrity sha512-m3b7EP2U+h5tNSpaBMfcTuHmHn04wrgRPQQrfKt75YIPq6kPs2153/KfPHdqkEWGx5pEBvS6rnvToT+yTtC1iw== "@tsconfig/recommended@^1.0.3": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@tsconfig/recommended/-/recommended-1.0.3.tgz#742540ba9170897a44097e838bca411abf56ccd2" - integrity sha512-+jby/Guq9H8O7NWgCv6X8VAiQE8Dr/nccsCtL74xyHKhu2Knu5EAKmOZj3nLCnLm1KooUzKY+5DsnGVqhM8/wQ== + version "1.0.8" + resolved "https://registry.yarnpkg.com/@tsconfig/recommended/-/recommended-1.0.8.tgz#16483d57b56bbbd32b8c3af0eff1a40c32d006fa" + integrity sha512-TotjFaaXveVUdsrXCdalyF6E5RyG6+7hHHQVZonQtdlk1rJZ1myDIvPUUKPhoYv+JAzThb2lQJh9+9ZfF46hsA== "@types/babel__core@^7.20.5": version "7.20.5" @@ -2617,17 +2240,12 @@ "@babel/types" "^7.0.0" "@types/babel__traverse@*": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.5.tgz#7b7502be0aa80cc4ef22978846b983edaafcd4dd" - integrity sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ== + version "7.20.6" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.6.tgz#8dc9f0ae0f202c08d8d4dab648912c8d6038e3f7" + integrity sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg== dependencies: "@babel/types" "^7.20.7" -"@types/big.js@^6.2.2": - version "6.2.2" - resolved "https://registry.yarnpkg.com/@types/big.js/-/big.js-6.2.2.tgz#69422ec9ef59df1330ccfde2106d9e1159a083c3" - integrity sha512-e2cOW9YlVzFY2iScnGBBkplKsrn2CsObHQ2Hiw4V1sSyiGbgWL8IyqE3zFi1Pt5o1pdAtYkDAIsF3KKUPjdzaA== - "@types/bn.js@^4.11.3": version "4.11.6" resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-4.11.6.tgz#c306c70d9358aaea33cd4eda092a742b9505967c" @@ -2636,65 +2254,37 @@ "@types/node" "*" "@types/bn.js@^5.1.0": - version "5.1.5" - resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-5.1.5.tgz#2e0dacdcce2c0f16b905d20ff87aedbc6f7b4bf0" - integrity sha512-V46N0zwKRF5Q00AZ6hWtN0T8gGmDUaUzLWQvHFo5yThtVwK/VCenFY3wXVbOvNfajEpsTfQM4IN9k/d6gUVX3A== + version "5.1.6" + resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-5.1.6.tgz#9ba818eec0c85e4d3c679518428afdf611d03203" + integrity sha512-Xh8vSwUeMKeYYrj3cX4lGQgFSF/N03r+tv4AiLl1SucqV+uTQpxRcnM8AkXKHwYP9ZPXOYXRr2KPXpVlIvqh9w== dependencies: "@types/node" "*" -"@types/chrome@^0.0.136": - version "0.0.136" - resolved "https://registry.yarnpkg.com/@types/chrome/-/chrome-0.0.136.tgz#7c011b9f997b0156f25a140188a0c5689d3f368f" - integrity sha512-XDEiRhLkMd+SB7Iw3ZUIj/fov3wLd4HyTdLltVszkgl1dBfc3Rb7oPMVZ2Mz2TLqnF7Ow+StbR8E7r9lqpb4DA== - dependencies: - "@types/filesystem" "*" - "@types/har-format" "*" - -"@types/cli-table@^0.3.4": - version "0.3.4" - resolved "https://registry.yarnpkg.com/@types/cli-table/-/cli-table-0.3.4.tgz#ecc3efce1b4d13503de59d2ddb49b8f9fd7203e7" - integrity sha512-GsALrTL69mlwbAw/MHF1IPTadSLZQnsxe7a80G8l4inN/iEXCOcVeT/S7aRc6hbhqzL9qZ314kHPDQnQ3ev+HA== - "@types/d3-format@^3.0.4": version "3.0.4" resolved "https://registry.yarnpkg.com/@types/d3-format/-/d3-format-3.0.4.tgz#b1e4465644ddb3fdf3a263febb240a6cd616de90" integrity sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g== -"@types/debug@^4.1.7", "@types/debug@^4.1.9": +"@types/debug@^4.1.7": version "4.1.12" resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.12.tgz#a155f21690871953410df4b6b6f53187f0500917" integrity sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ== dependencies: "@types/ms" "*" -"@types/dom-screen-wake-lock@^1.0.0": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@types/dom-screen-wake-lock/-/dom-screen-wake-lock-1.0.3.tgz#c3588a5f6f40fae957f9ce5be9bc4927a61bb9a0" - integrity sha512-3Iten7X3Zgwvk6kh6/NRdwN7WbZ760YgFCsF5AxDifltUQzW1RaW+WRmcVtgwFzLjaNu64H+0MPJ13yRa8g3Dw== - -"@types/estree@1.0.5", "@types/estree@^1.0.0": - version "1.0.5" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" - integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== +"@types/estree@1.0.6", "@types/estree@^1.0.0", "@types/estree@^1.0.6": + version "1.0.6" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.6.tgz#628effeeae2064a1b4e79f78e81d87b7e5fc7b50" + integrity sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw== -"@types/filesystem@*": - version "0.0.35" - resolved "https://registry.yarnpkg.com/@types/filesystem/-/filesystem-0.0.35.tgz#6d6766626083e2b397c09bdc57092827120db11d" - integrity sha512-1eKvCaIBdrD2mmMgy5dwh564rVvfEhZTWVQQGRNn0Nt4ZEnJ0C8oSUCzvMKRA4lGde5oEVo+q2MrTTbV/GHDCQ== +"@types/hast@^3.0.4": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/hast/-/hast-3.0.4.tgz#1d6b39993b82cea6ad783945b0508c25903e15aa" + integrity sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ== dependencies: - "@types/filewriter" "*" + "@types/unist" "*" -"@types/filewriter@*": - version "0.0.33" - resolved "https://registry.yarnpkg.com/@types/filewriter/-/filewriter-0.0.33.tgz#d9d611db9d9cd99ae4e458de420eeb64ad604ea8" - integrity sha512-xFU8ZXTw4gd358lb2jw25nxY9QAgqn2+bKKjKOYfNCzN4DKCFetK7sPtrlpg66Ywe3vWY9FNxprZawAh9wfJ3g== - -"@types/har-format@*": - version "1.2.15" - resolved "https://registry.yarnpkg.com/@types/har-format/-/har-format-1.2.15.tgz#f352493638c2f89d706438a19a9eb300b493b506" - integrity sha512-RpQH4rXLuvTXKR0zqHq3go0RVXYv/YVqv4TnPH95VbwUxZdQlK1EtcMvQvMpDngHbt13Csh9Z4qT9AbkiQH5BA== - -"@types/json-schema@^7.0.12": +"@types/json-schema@^7.0.15": version "7.0.15" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== @@ -2711,67 +2301,40 @@ dependencies: "@types/lodash" "*" -"@types/lodash.ismatch@^4.4.9": - version "4.4.9" - resolved "https://registry.yarnpkg.com/@types/lodash.ismatch/-/lodash.ismatch-4.4.9.tgz#97b4317f7dc3975bb51660a0f9a055ac7b67b134" - integrity sha512-qWihnStOPKH8urljLGm6ZOEdN/5Bt4vxKR81tL3L4ArUNLvcf9RW3QSnPs21eix5BiqioSWq4aAXD4Iep+d0fw== - dependencies: - "@types/lodash" "*" - "@types/lodash@*": - version "4.14.202" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.202.tgz#f09dbd2fb082d507178b2f2a5c7e74bd72ff98f8" - integrity sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ== + version "4.17.16" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.17.16.tgz#94ae78fab4a38d73086e962d0b65c30d816bfb0a" + integrity sha512-HX7Em5NYQAXKW+1T+FiuG27NGwzJfCX3s1GjOa7ujxZa52kjJLOr4FUxT+giF6Tgxv1e+/czV/iTtBw27WTU9g== "@types/lru-cache@^5.1.0": version "5.1.1" resolved "https://registry.yarnpkg.com/@types/lru-cache/-/lru-cache-5.1.1.tgz#c48c2e27b65d2a153b19bfc1a317e30872e01eef" integrity sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw== -"@types/minimist@^1.2.0": - version "1.2.5" - resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.5.tgz#ec10755e871497bcd83efe927e43ec46e8c0747e" - integrity sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag== - "@types/ms@*": - version "0.7.34" - resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.34.tgz#10964ba0dee6ac4cd462e2795b6bebd407303433" - integrity sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g== + version "2.1.0" + resolved "https://registry.yarnpkg.com/@types/ms/-/ms-2.1.0.tgz#052aa67a48eccc4309d7f0191b7e41434b90bb78" + integrity sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA== -"@types/node@*": - version "20.11.16" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.11.16.tgz#4411f79411514eb8e2926f036c86c9f0e4ec6708" - integrity sha512-gKb0enTmRCzXSSUJDq6/sPcqrfCv2mkkG6Jt/clpn5eiCbKTY+SgZUxo+p8ZKMof5dCp9vHQUAB7wOUTod22wQ== +"@types/node@*", "@types/node@^22.13.1": + version "22.13.10" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.13.10.tgz#df9ea358c5ed991266becc3109dc2dc9125d77e4" + integrity sha512-I6LPUvlRH+O6VRUqYOcMudhaIdUVWfsjnZavnsraHvpBwaEyMN29ry+0UVJhImYL16xsscu0aske3yA+uPOWfw== dependencies: - undici-types "~5.26.4" + undici-types "~6.20.0" -"@types/node@18.15.13": - version "18.15.13" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.15.13.tgz#f64277c341150c979e42b00e4ac289290c9df469" - integrity sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q== +"@types/node@22.7.5": + version "22.7.5" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.7.5.tgz#cfde981727a7ab3611a481510b473ae54442b92b" + integrity sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ== + dependencies: + undici-types "~6.19.2" "@types/node@^12.7.1": version "12.20.55" resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.55.tgz#c329cbd434c42164f846b909bd6f85b5537f6240" integrity sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ== -"@types/node@^20.11.19": - version "20.11.19" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.11.19.tgz#b466de054e9cb5b3831bee38938de64ac7f81195" - integrity sha512-7xMnVEcZFu0DikYjWOlRq7NTPETrm7teqUT2WkQjrTIkEgUyyGdWsj/Zg8bEJt5TNklzbPD1X3fqfsHw3SpapQ== - dependencies: - undici-types "~5.26.4" - -"@types/normalize-package-data@^2.4.0": - version "2.4.4" - resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz#56e2cc26c397c038fab0e3a917a12d5c5909e901" - integrity sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA== - -"@types/parse-json@^4.0.0": - version "4.0.2" - resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.2.tgz#5950e50960793055845e956c427fc2b0d70c5239" - integrity sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw== - "@types/pbkdf2@^3.0.0": version "3.1.2" resolved "https://registry.yarnpkg.com/@types/pbkdf2/-/pbkdf2-3.1.2.tgz#2dc43808e9985a2c69ff02e2d2027bd4fe33e8dc" @@ -2788,51 +2351,30 @@ kleur "^3.0.3" "@types/prop-types@*": - version "15.7.11" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.11.tgz#2596fb352ee96a1379c657734d4b913a613ad563" - integrity sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng== + version "15.7.14" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.14.tgz#1433419d73b2a7ebfc6918dcefd2ec0d5cd698f2" + integrity sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ== "@types/react-dom@^18.2.19": - version "18.2.19" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.19.tgz#b84b7c30c635a6c26c6a6dfbb599b2da9788be58" - integrity sha512-aZvQL6uUbIJpjZk4U8JZGbau9KDeAwMfmhyWorxgBkqDIEf6ROjRozcmPIicqsUwPUjbkDfHKgGee1Lq65APcA== - dependencies: - "@types/react" "*" + version "18.3.5" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.3.5.tgz#45f9f87398c5dcea085b715c58ddcf1faf65f716" + integrity sha512-P4t6saawp+b/dFrUr2cvkVsfvPguwsxtH6dNIYRllMsefqFzkZk5UIjzyDOv5g1dXIPdG4Sp1yCR4Z6RCUsG/Q== -"@types/react@*", "@types/react@18.2.57", "@types/react@^18.2.57": - version "18.2.57" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.57.tgz#147b516d8bdb2900219acbfc6f939bdeecca7691" - integrity sha512-ZvQsktJgSYrQiMirAN60y4O/LRevIV8hUzSOSNB6gfR3/o3wCBFQx3sPwIYtuDMeiVgsSS3UzCV26tEzgnfvQw== +"@types/react@^18.2.57": + version "18.3.18" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.3.18.tgz#9b382c4cd32e13e463f97df07c2ee3bbcd26904b" + integrity sha512-t4yC+vtgnkYjNSKlFx1jkAhH8LgTo2N/7Qvi83kdEaUtMDiwpbLAktKDaAMlRcJ5eSxZkH74eEGt1ky31d7kfQ== dependencies: "@types/prop-types" "*" - "@types/scheduler" "*" csstype "^3.0.2" -"@types/readable-stream@^2.3.13": - version "2.3.15" - resolved "https://registry.yarnpkg.com/@types/readable-stream/-/readable-stream-2.3.15.tgz#3d79c9ceb1b6a57d5f6e6976f489b9b5384321ae" - integrity sha512-oM5JSKQCcICF1wvGgmecmHldZ48OZamtMxcGGVICOJA8o8cahXC1zEVAif8iwoc5j8etxFaRFnf095+CDsuoFQ== - dependencies: - "@types/node" "*" - safe-buffer "~5.1.1" - -"@types/scheduler@*": - version "0.16.8" - resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.8.tgz#ce5ace04cfeabe7ef87c0091e50752e36707deff" - integrity sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A== - -"@types/secp256k1@^4.0.1", "@types/secp256k1@^4.0.4": +"@types/secp256k1@^4.0.1": version "4.0.6" resolved "https://registry.yarnpkg.com/@types/secp256k1/-/secp256k1-4.0.6.tgz#d60ba2349a51c2cbc5e816dcd831a42029d376bf" integrity sha512-hHxJU6PAEUn0TP4S/ZOzuTUvJWuZ6eIKeNKb5RBpODvSl6hp1Wrw4s7ATY50rklRCScUDpHzVA/DQdSjJ3UoYQ== dependencies: "@types/node" "*" -"@types/semver@^7.5.0": - version "7.5.6" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.6.tgz#c65b2bfce1bec346582c07724e3f8c1017a20339" - integrity sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A== - "@types/signale@^1.4.7": version "1.4.7" resolved "https://registry.yarnpkg.com/@types/signale/-/signale-1.4.7.tgz#317846ca23e4eaff78601e2786ba3e2065cc859d" @@ -2840,328 +2382,343 @@ dependencies: "@types/node" "*" +"@types/sinon@^17.0.3": + version "17.0.4" + resolved "https://registry.yarnpkg.com/@types/sinon/-/sinon-17.0.4.tgz#fd9a3e8e07eea1a3f4a6f82a972c899e5778f369" + integrity sha512-RHnIrhfPO3+tJT0s7cFaXGZvsL4bbR3/k7z3P312qMS4JaS2Tk+KiwiLx1S0rQ56ERj00u1/BtdyVd0FY+Pdew== + dependencies: + "@types/sinonjs__fake-timers" "*" + +"@types/sinonjs__fake-timers@*": + version "8.1.5" + resolved "https://registry.yarnpkg.com/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.5.tgz#5fd3592ff10c1e9695d377020c033116cc2889f2" + integrity sha512-mQkU2jY8jJEF7YHjHvsQO8+3ughTL1mcnn96igfhONmR+fUPSKIkefQYpSe8bsly2Ep7oQbn/6VG5/9/0qcArQ== + "@types/trusted-types@^2.0.2": version "2.0.7" resolved "https://registry.yarnpkg.com/@types/trusted-types/-/trusted-types-2.0.7.tgz#baccb07a970b91707df3a3e8ba6896c57ead2d11" integrity sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw== +"@types/unist@*": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/unist/-/unist-3.0.3.tgz#acaab0f919ce69cce629c2d4ed2eb4adc1b6c20c" + integrity sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q== + +"@typescript-eslint/eslint-plugin@8.26.1", "@typescript-eslint/eslint-plugin@^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0": + version "8.26.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.26.1.tgz#3e48eb847924161843b092c87a9b65176b53782f" + integrity sha512-2X3mwqsj9Bd3Ciz508ZUtoQQYpOhU/kWoUqIf49H8Z0+Vbh6UF/y0OEYp0Q0axOGzaBGs7QxRwq0knSQ8khQNA== + dependencies: + "@eslint-community/regexpp" "^4.10.0" + "@typescript-eslint/scope-manager" "8.26.1" + "@typescript-eslint/type-utils" "8.26.1" + "@typescript-eslint/utils" "8.26.1" + "@typescript-eslint/visitor-keys" "8.26.1" + graphemer "^1.4.0" + ignore "^5.3.1" + natural-compare "^1.4.0" + ts-api-utils "^2.0.1" + "@typescript-eslint/eslint-plugin@^7.0.2": - version "7.0.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.0.2.tgz#c13a34057be425167cc4a765158c46fdf2fd981d" - integrity sha512-/XtVZJtbaphtdrWjr+CJclaCVGPtOdBpFEnvtNf/jRV0IiEemRrL0qABex/nEt8isYcnFacm3nPHYQwL+Wb7qg== - dependencies: - "@eslint-community/regexpp" "^4.5.1" - "@typescript-eslint/scope-manager" "7.0.2" - "@typescript-eslint/type-utils" "7.0.2" - "@typescript-eslint/utils" "7.0.2" - "@typescript-eslint/visitor-keys" "7.0.2" - debug "^4.3.4" + version "7.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.18.0.tgz#b16d3cf3ee76bf572fdf511e79c248bdec619ea3" + integrity sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw== + dependencies: + "@eslint-community/regexpp" "^4.10.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.2.4" + ignore "^5.3.1" natural-compare "^1.4.0" - semver "^7.5.4" - ts-api-utils "^1.0.1" + ts-api-utils "^1.3.0" -"@typescript-eslint/parser@^5.4.2 || ^6.0.0": - version "6.20.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-6.20.0.tgz#17e314177304bdf498527e3c4b112e41287b7416" - integrity sha512-bYerPDF/H5v6V76MdMYhjwmwgMA+jlPVqjSDq2cRqMi8bP5sR3Z+RLOiOMad3nsnmDVmn2gAFCyNgh/dIrfP/w== +"@typescript-eslint/parser@8.26.1", "@typescript-eslint/parser@^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0": + version "8.26.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.26.1.tgz#0e2f915a497519fc43f52cf2ecbfa607ff56f72e" + integrity sha512-w6HZUV4NWxqd8BdeFf81t07d7/YV9s7TCWrQQbG5uhuvGUAW+fq1usZ1Hmz9UPNLniFnD8GLSsDpjP0hm1S4lQ== dependencies: - "@typescript-eslint/scope-manager" "6.20.0" - "@typescript-eslint/types" "6.20.0" - "@typescript-eslint/typescript-estree" "6.20.0" - "@typescript-eslint/visitor-keys" "6.20.0" + "@typescript-eslint/scope-manager" "8.26.1" + "@typescript-eslint/types" "8.26.1" + "@typescript-eslint/typescript-estree" "8.26.1" + "@typescript-eslint/visitor-keys" "8.26.1" debug "^4.3.4" "@typescript-eslint/parser@^7.0.2": - version "7.0.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-7.0.2.tgz#95c31233d343db1ca1df8df7811b5b87ca7b1a68" - integrity sha512-GdwfDglCxSmU+QTS9vhz2Sop46ebNCXpPPvsByK7hu0rFGRHL+AusKQJ7SoN+LbLh6APFpQwHKmDSwN35Z700Q== - dependencies: - "@typescript-eslint/scope-manager" "7.0.2" - "@typescript-eslint/types" "7.0.2" - "@typescript-eslint/typescript-estree" "7.0.2" - "@typescript-eslint/visitor-keys" "7.0.2" + version "7.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-7.18.0.tgz#83928d0f1b7f4afa974098c64b5ce6f9051f96a0" + integrity sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg== + dependencies: + "@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" -"@typescript-eslint/scope-manager@6.20.0": - version "6.20.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-6.20.0.tgz#8a926e60f6c47feb5bab878246dc2ae465730151" - integrity sha512-p4rvHQRDTI1tGGMDFQm+GtxP1ZHyAh64WANVoyEcNMpaTFn3ox/3CcgtIlELnRfKzSs/DwYlDccJEtr3O6qBvA== +"@typescript-eslint/scope-manager@7.18.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-7.18.0.tgz#c928e7a9fc2c0b3ed92ab3112c614d6bd9951c83" + integrity sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA== dependencies: - "@typescript-eslint/types" "6.20.0" - "@typescript-eslint/visitor-keys" "6.20.0" + "@typescript-eslint/types" "7.18.0" + "@typescript-eslint/visitor-keys" "7.18.0" -"@typescript-eslint/scope-manager@6.21.0": - version "6.21.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz#ea8a9bfc8f1504a6ac5d59a6df308d3a0630a2b1" - integrity sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg== +"@typescript-eslint/scope-manager@8.26.1": + version "8.26.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.26.1.tgz#5e6ad0ac258ccf79462e91c3f43a3f1f7f31a6cc" + integrity sha512-6EIvbE5cNER8sqBu6V7+KeMZIC1664d2Yjt+B9EWUXrsyWpxx4lEZrmvxgSKRC6gX+efDL/UY9OpPZ267io3mg== dependencies: - "@typescript-eslint/types" "6.21.0" - "@typescript-eslint/visitor-keys" "6.21.0" + "@typescript-eslint/types" "8.26.1" + "@typescript-eslint/visitor-keys" "8.26.1" -"@typescript-eslint/scope-manager@7.0.2": - version "7.0.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-7.0.2.tgz#6ec4cc03752758ddd1fdaae6fbd0ed9a2ca4fe63" - integrity sha512-l6sa2jF3h+qgN2qUMjVR3uCNGjWw4ahGfzIYsCtFrQJCjhbrDPdiihYT8FnnqFwsWX+20hK592yX9I2rxKTP4g== +"@typescript-eslint/type-utils@7.18.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-7.18.0.tgz#2165ffaee00b1fbbdd2d40aa85232dab6998f53b" + integrity sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA== dependencies: - "@typescript-eslint/types" "7.0.2" - "@typescript-eslint/visitor-keys" "7.0.2" + "@typescript-eslint/typescript-estree" "7.18.0" + "@typescript-eslint/utils" "7.18.0" + debug "^4.3.4" + ts-api-utils "^1.3.0" -"@typescript-eslint/type-utils@7.0.2": - version "7.0.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-7.0.2.tgz#a7fc0adff0c202562721357e7478207d380a757b" - integrity sha512-IKKDcFsKAYlk8Rs4wiFfEwJTQlHcdn8CLwLaxwd6zb8HNiMcQIFX9sWax2k4Cjj7l7mGS5N1zl7RCHOVwHq2VQ== +"@typescript-eslint/type-utils@8.26.1": + version "8.26.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.26.1.tgz#462f0bae09de72ac6e8e1af2ebe588c23224d7f8" + integrity sha512-Kcj/TagJLwoY/5w9JGEFV0dclQdyqw9+VMndxOJKtoFSjfZhLXhYjzsQEeyza03rwHx2vFEGvrJWJBXKleRvZg== dependencies: - "@typescript-eslint/typescript-estree" "7.0.2" - "@typescript-eslint/utils" "7.0.2" + "@typescript-eslint/typescript-estree" "8.26.1" + "@typescript-eslint/utils" "8.26.1" debug "^4.3.4" - ts-api-utils "^1.0.1" + ts-api-utils "^2.0.1" -"@typescript-eslint/types@6.20.0": - version "6.20.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.20.0.tgz#5ccd74c29011ae7714ae6973e4ec0c634708b448" - integrity sha512-MM9mfZMAhiN4cOEcUOEx+0HmuaW3WBfukBZPCfwSqFnQy0grXYtngKCqpQN339X3RrwtzspWJrpbrupKYUSBXQ== +"@typescript-eslint/types@7.18.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.18.0.tgz#b90a57ccdea71797ffffa0321e744f379ec838c9" + integrity sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ== -"@typescript-eslint/types@6.21.0": - version "6.21.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.21.0.tgz#205724c5123a8fef7ecd195075fa6e85bac3436d" - integrity sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg== +"@typescript-eslint/types@8.26.1": + version "8.26.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.26.1.tgz#d5978721670cff263348d5062773389231a64132" + integrity sha512-n4THUQW27VmQMx+3P+B0Yptl7ydfceUj4ON/AQILAASwgYdZ/2dhfymRMh5egRUrvK5lSmaOm77Ry+lmXPOgBQ== -"@typescript-eslint/types@7.0.2": - version "7.0.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.0.2.tgz#b6edd108648028194eb213887d8d43ab5750351c" - integrity sha512-ZzcCQHj4JaXFjdOql6adYV4B/oFOFjPOC9XYwCaZFRvqN8Llfvv4gSxrkQkd2u4Ci62i2c6W6gkDwQJDaRc4nA== - -"@typescript-eslint/typescript-estree@6.20.0": - version "6.20.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.20.0.tgz#5b2d0975949e6bdd8d45ee1471461ef5fadc5542" - integrity sha512-RnRya9q5m6YYSpBN7IzKu9FmLcYtErkDkc8/dKv81I9QiLLtVBHrjz+Ev/crAqgMNW2FCsoZF4g2QUylMnJz+g== +"@typescript-eslint/typescript-estree@7.18.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-7.18.0.tgz#b5868d486c51ce8f312309ba79bdb9f331b37931" + integrity sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA== dependencies: - "@typescript-eslint/types" "6.20.0" - "@typescript-eslint/visitor-keys" "6.20.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" - minimatch "9.0.3" - semver "^7.5.4" - ts-api-utils "^1.0.1" + minimatch "^9.0.4" + semver "^7.6.0" + ts-api-utils "^1.3.0" -"@typescript-eslint/typescript-estree@6.21.0": - version "6.21.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz#c47ae7901db3b8bddc3ecd73daff2d0895688c46" - integrity sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ== +"@typescript-eslint/typescript-estree@8.26.1": + version "8.26.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.26.1.tgz#eb0e4ce31753683d83be53441a409fd5f0b34afd" + integrity sha512-yUwPpUHDgdrv1QJ7YQal3cMVBGWfnuCdKbXw1yyjArax3353rEJP1ZA+4F8nOlQ3RfS2hUN/wze3nlY+ZOhvoA== dependencies: - "@typescript-eslint/types" "6.21.0" - "@typescript-eslint/visitor-keys" "6.21.0" + "@typescript-eslint/types" "8.26.1" + "@typescript-eslint/visitor-keys" "8.26.1" debug "^4.3.4" - globby "^11.1.0" + fast-glob "^3.3.2" is-glob "^4.0.3" - minimatch "9.0.3" - semver "^7.5.4" - ts-api-utils "^1.0.1" + minimatch "^9.0.4" + semver "^7.6.0" + ts-api-utils "^2.0.1" -"@typescript-eslint/typescript-estree@7.0.2": - version "7.0.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-7.0.2.tgz#3c6dc8a3b9799f4ef7eca0d224ded01974e4cb39" - integrity sha512-3AMc8khTcELFWcKcPc0xiLviEvvfzATpdPj/DXuOGIdQIIFybf4DMT1vKRbuAEOFMwhWt7NFLXRkbjsvKZQyvw== - dependencies: - "@typescript-eslint/types" "7.0.2" - "@typescript-eslint/visitor-keys" "7.0.2" - debug "^4.3.4" - globby "^11.1.0" - is-glob "^4.0.3" - minimatch "9.0.3" - semver "^7.5.4" - ts-api-utils "^1.0.1" - -"@typescript-eslint/utils@7.0.2": - version "7.0.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-7.0.2.tgz#8756123054cd934c8ba7db6a6cffbc654b10b5c4" - integrity sha512-PZPIONBIB/X684bhT1XlrkjNZJIEevwkKDsdwfiu1WeqBxYEEdIgVDgm8/bbKHVu+6YOpeRqcfImTdImx/4Bsw== +"@typescript-eslint/utils@7.18.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-7.18.0.tgz#bca01cde77f95fc6a8d5b0dbcbfb3d6ca4be451f" + integrity sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw== dependencies: "@eslint-community/eslint-utils" "^4.4.0" - "@types/json-schema" "^7.0.12" - "@types/semver" "^7.5.0" - "@typescript-eslint/scope-manager" "7.0.2" - "@typescript-eslint/types" "7.0.2" - "@typescript-eslint/typescript-estree" "7.0.2" - semver "^7.5.4" + "@typescript-eslint/scope-manager" "7.18.0" + "@typescript-eslint/types" "7.18.0" + "@typescript-eslint/typescript-estree" "7.18.0" -"@typescript-eslint/utils@^6.20.0": - version "6.21.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-6.21.0.tgz#4714e7a6b39e773c1c8e97ec587f520840cd8134" - integrity sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ== +"@typescript-eslint/utils@8.26.1", "@typescript-eslint/utils@^8.18.1": + version "8.26.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.26.1.tgz#54cc58469955f25577f659753b71a0e117a0539f" + integrity sha512-V4Urxa/XtSUroUrnI7q6yUTD3hDtfJ2jzVfeT3VK0ciizfK2q/zGC0iDh1lFMUZR8cImRrep6/q0xd/1ZGPQpg== dependencies: "@eslint-community/eslint-utils" "^4.4.0" - "@types/json-schema" "^7.0.12" - "@types/semver" "^7.5.0" - "@typescript-eslint/scope-manager" "6.21.0" - "@typescript-eslint/types" "6.21.0" - "@typescript-eslint/typescript-estree" "6.21.0" - semver "^7.5.4" + "@typescript-eslint/scope-manager" "8.26.1" + "@typescript-eslint/types" "8.26.1" + "@typescript-eslint/typescript-estree" "8.26.1" -"@typescript-eslint/visitor-keys@6.20.0": - version "6.20.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.20.0.tgz#f7ada27f2803de89df0edd9fd7be22c05ce6a498" - integrity sha512-E8Cp98kRe4gKHjJD4NExXKz/zOJ1A2hhZc+IMVD6i7w4yjIvh6VyuRI0gRtxAsXtoC35uGMaQ9rjI2zJaXDEAw== +"@typescript-eslint/visitor-keys@7.18.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-7.18.0.tgz#0564629b6124d67607378d0f0332a0495b25e7d7" + integrity sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg== dependencies: - "@typescript-eslint/types" "6.20.0" - eslint-visitor-keys "^3.4.1" - -"@typescript-eslint/visitor-keys@6.21.0": - version "6.21.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz#87a99d077aa507e20e238b11d56cc26ade45fe47" - integrity sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A== - dependencies: - "@typescript-eslint/types" "6.21.0" - eslint-visitor-keys "^3.4.1" + "@typescript-eslint/types" "7.18.0" + eslint-visitor-keys "^3.4.3" -"@typescript-eslint/visitor-keys@7.0.2": - version "7.0.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-7.0.2.tgz#2899b716053ad7094962beb895d11396fc12afc7" - integrity sha512-8Y+YiBmqPighbm5xA2k4wKTxRzx9EkBu7Rlw+WHqMvRJ3RPz/BMBO9b2ru0LUNmXg120PHUXD5+SWFy2R8DqlQ== +"@typescript-eslint/visitor-keys@8.26.1": + version "8.26.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.26.1.tgz#c5267fcc82795cf10280363023837deacad2647c" + integrity sha512-AjOC3zfnxd6S4Eiy3jwktJPclqhFHNyd8L6Gycf9WUPoKZpgM5PjkxY1X7uSy61xVpiJDhhk7XT2NVsN3ALTWg== dependencies: - "@typescript-eslint/types" "7.0.2" - eslint-visitor-keys "^3.4.1" + "@typescript-eslint/types" "8.26.1" + eslint-visitor-keys "^4.2.0" "@ungap/structured-clone@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" - integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== + version "1.3.0" + resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.3.0.tgz#d06bbb384ebcf6c505fde1c3d0ed4ddffe0aaff8" + integrity sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g== -"@vanilla-extract/css@1.14.0": - version "1.14.0" - resolved "https://registry.yarnpkg.com/@vanilla-extract/css/-/css-1.14.0.tgz#45fab9c04d893e3e363cf2cde7559d21233b7f63" - integrity sha512-rYfm7JciWZ8PFzBM/HDiE2GLnKI3xJ6/vdmVJ5BSgcCZ5CxRlM9Cjqclni9lGzF3eMOijnUhCd/KV8TOzyzbMA== +"@vanilla-extract/css@1.15.5": + version "1.15.5" + resolved "https://registry.yarnpkg.com/@vanilla-extract/css/-/css-1.15.5.tgz#06782b98b4d1478baec578fb06c223bde589d4b3" + integrity sha512-N1nQebRWnXvlcmu9fXKVUs145EVwmWtMD95bpiEKtvehHDpUhmO1l2bauS7FGYKbi3dU1IurJbGpQhBclTr1ng== dependencies: "@emotion/hash" "^0.9.0" - "@vanilla-extract/private" "^1.0.3" - chalk "^4.1.1" + "@vanilla-extract/private" "^1.0.6" css-what "^6.1.0" cssesc "^3.0.0" csstype "^3.0.7" + dedent "^1.5.3" deep-object-diff "^1.1.9" deepmerge "^4.2.2" + lru-cache "^10.4.3" media-query-parser "^2.0.2" modern-ahocorasick "^1.0.0" - outdent "^0.8.0" + picocolors "^1.0.0" -"@vanilla-extract/dynamic@2.1.0": - version "2.1.0" - resolved "https://registry.yarnpkg.com/@vanilla-extract/dynamic/-/dynamic-2.1.0.tgz#316d3bd4adfd5f5c9fb080445c41d55abe3b463c" - integrity sha512-8zl0IgBYRtgD1h+56Zu13wHTiMTJSVEa4F7RWX9vTB/5Xe2KtjoiqApy/szHPVFA56c+ex6A4GpCQjT1bKXbYw== +"@vanilla-extract/dynamic@2.1.2": + version "2.1.2" + resolved "https://registry.yarnpkg.com/@vanilla-extract/dynamic/-/dynamic-2.1.2.tgz#b1d1c1e0e392934c5a3bbb53f99069a7721311ac" + integrity sha512-9BGMciD8rO1hdSPIAh1ntsG4LPD3IYKhywR7VOmmz9OO4Lx1hlwkSg3E6X07ujFx7YuBfx0GDQnApG9ESHvB2A== dependencies: - "@vanilla-extract/private" "^1.0.3" + "@vanilla-extract/private" "^1.0.6" -"@vanilla-extract/private@^1.0.3": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@vanilla-extract/private/-/private-1.0.3.tgz#7ec72bc2ff6fe51f9d650f962e8d1989b073690f" - integrity sha512-17kVyLq3ePTKOkveHxXuIJZtGYs+cSoev7BlP+Lf4916qfDhk/HBjvlYDe8egrea7LNPHKwSZJK/bzZC+Q6AwQ== - -"@vanilla-extract/sprinkles@1.6.1": - version "1.6.1" - resolved "https://registry.yarnpkg.com/@vanilla-extract/sprinkles/-/sprinkles-1.6.1.tgz#2c8a832757a0d8104dc6bd5d961db2c70d1dbdcb" - integrity sha512-N/RGKwGAAidBupZ436RpuweRQHEFGU+mvAqBo8PRMAjJEmHoPDttV8RObaMLrJHWLqvX+XUMinHUnD0hFRQISw== - -"@vitejs/plugin-react@^4.2.1": - version "4.2.1" - resolved "https://registry.yarnpkg.com/@vitejs/plugin-react/-/plugin-react-4.2.1.tgz#744d8e4fcb120fc3dbaa471dadd3483f5a304bb9" - integrity sha512-oojO9IDc4nCUUi8qIR11KoQm0XFFLIwsRBwHRR4d/88IWghn1y6ckz/bJ8GHDCsYEJee8mDzqtJxh15/cisJNQ== - dependencies: - "@babel/core" "^7.23.5" - "@babel/plugin-transform-react-jsx-self" "^7.23.3" - "@babel/plugin-transform-react-jsx-source" "^7.23.3" +"@vanilla-extract/private@^1.0.6": + version "1.0.6" + resolved "https://registry.yarnpkg.com/@vanilla-extract/private/-/private-1.0.6.tgz#f10bbf3189f7b827d0bd7f804a6219dd03ddbdd4" + integrity sha512-ytsG/JLweEjw7DBuZ/0JCN4WAQgM9erfSTdS1NQY778hFQSZ6cfCDEZZ0sgVm4k54uNz6ImKB33AYvSR//fjxw== + +"@vanilla-extract/sprinkles@1.6.3": + version "1.6.3" + resolved "https://registry.yarnpkg.com/@vanilla-extract/sprinkles/-/sprinkles-1.6.3.tgz#733968d653cc2395538b5c29f04dcdb0a2ca15c5" + integrity sha512-oCHlQeYOBIJIA2yWy2GnY5wE2A7hGHDyJplJo4lb+KEIBcJWRnDJDg8ywDwQS5VfWJrBBO3drzYZPFpWQjAMiQ== + +"@vitejs/plugin-react@^4.3.4": + version "4.3.4" + resolved "https://registry.yarnpkg.com/@vitejs/plugin-react/-/plugin-react-4.3.4.tgz#c64be10b54c4640135a5b28a2432330e88ad7c20" + integrity sha512-SCCPBJtYLdE8PX/7ZQAs1QAZ8Jqwih+0VBLum1EGqmCCQal+MIUqLCzj3ZUy8ufbC0cAM4LRlSTm7IQJwWT4ug== + dependencies: + "@babel/core" "^7.26.0" + "@babel/plugin-transform-react-jsx-self" "^7.25.9" + "@babel/plugin-transform-react-jsx-source" "^7.25.9" "@types/babel__core" "^7.20.5" - react-refresh "^0.14.0" + react-refresh "^0.14.2" -"@vitest/expect@1.3.1": - version "1.3.1" - resolved "https://registry.yarnpkg.com/@vitest/expect/-/expect-1.3.1.tgz#d4c14b89c43a25fd400a6b941f51ba27fe0cb918" - integrity sha512-xofQFwIzfdmLLlHa6ag0dPV8YsnKOCP1KdAeVVh34vSjN2dcUiXYCD9htu/9eM7t8Xln4v03U9HLxLpPlsXdZw== +"@vitest/expect@3.0.8": + version "3.0.8" + resolved "https://registry.yarnpkg.com/@vitest/expect/-/expect-3.0.8.tgz#53c408180d6476c7363eb976dcaae8e7b1f1a078" + integrity sha512-Xu6TTIavTvSSS6LZaA3EebWFr6tsoXPetOWNMOlc7LO88QVVBwq2oQWBoDiLCN6YTvNYsGSjqOO8CAdjom5DCQ== dependencies: - "@vitest/spy" "1.3.1" - "@vitest/utils" "1.3.1" - chai "^4.3.10" + "@vitest/spy" "3.0.8" + "@vitest/utils" "3.0.8" + chai "^5.2.0" + tinyrainbow "^2.0.0" -"@vitest/runner@1.3.1": - version "1.3.1" - resolved "https://registry.yarnpkg.com/@vitest/runner/-/runner-1.3.1.tgz#e7f96cdf74842934782bfd310eef4b8695bbfa30" - integrity sha512-5FzF9c3jG/z5bgCnjr8j9LNq/9OxV2uEBAITOXfoe3rdZJTdO7jzThth7FXv/6b+kdY65tpRQB7WaKhNZwX+Kg== +"@vitest/mocker@3.0.8": + version "3.0.8" + resolved "https://registry.yarnpkg.com/@vitest/mocker/-/mocker-3.0.8.tgz#01638859e7dd422a8aaf04ef63dca9e1bbb9838d" + integrity sha512-n3LjS7fcW1BCoF+zWZxG7/5XvuYH+lsFg+BDwwAz0arIwHQJFUEsKBQ0BLU49fCxuM/2HSeBPHQD8WjgrxMfow== dependencies: - "@vitest/utils" "1.3.1" - p-limit "^5.0.0" - pathe "^1.1.1" + "@vitest/spy" "3.0.8" + estree-walker "^3.0.3" + magic-string "^0.30.17" -"@vitest/snapshot@1.3.1": - version "1.3.1" - resolved "https://registry.yarnpkg.com/@vitest/snapshot/-/snapshot-1.3.1.tgz#193a5d7febf6ec5d22b3f8c5a093f9e4322e7a88" - integrity sha512-EF++BZbt6RZmOlE3SuTPu/NfwBF6q4ABS37HHXzs2LUVPBLx2QoY/K0fKpRChSo8eLiuxcbCVfqKgx/dplCDuQ== +"@vitest/pretty-format@3.0.8", "@vitest/pretty-format@^3.0.8": + version "3.0.8" + resolved "https://registry.yarnpkg.com/@vitest/pretty-format/-/pretty-format-3.0.8.tgz#89f6111d141142689871f5a4e62ad679bb6b6357" + integrity sha512-BNqwbEyitFhzYMYHUVbIvepOyeQOSFA/NeJMIP9enMntkkxLgOcgABH6fjyXG85ipTgvero6noreavGIqfJcIg== dependencies: - magic-string "^0.30.5" - pathe "^1.1.1" - pretty-format "^29.7.0" + tinyrainbow "^2.0.0" -"@vitest/spy@1.3.1": - version "1.3.1" - resolved "https://registry.yarnpkg.com/@vitest/spy/-/spy-1.3.1.tgz#814245d46d011b99edd1c7528f5725c64e85a88b" - integrity sha512-xAcW+S099ylC9VLU7eZfdT9myV67Nor9w9zhf0mGCYJSO+zM2839tOeROTdikOi/8Qeusffvxb/MyBSOja1Uig== +"@vitest/runner@3.0.8": + version "3.0.8" + resolved "https://registry.yarnpkg.com/@vitest/runner/-/runner-3.0.8.tgz#dda7223c25a89a829a29c3f0c037a99e028a9c64" + integrity sha512-c7UUw6gEcOzI8fih+uaAXS5DwjlBaCJUo7KJ4VvJcjL95+DSR1kova2hFuRt3w41KZEFcOEiq098KkyrjXeM5w== dependencies: - tinyspy "^2.2.0" + "@vitest/utils" "3.0.8" + pathe "^2.0.3" -"@vitest/utils@1.3.1": - version "1.3.1" - resolved "https://registry.yarnpkg.com/@vitest/utils/-/utils-1.3.1.tgz#7b05838654557544f694a372de767fcc9594d61a" - integrity sha512-d3Waie/299qqRyHTm2DjADeTaNdNSVsnwHPWrs20JMpjh6eiVq7ggggweO8rc4arhf6rRkWuHKwvxGvejUXZZQ== +"@vitest/snapshot@3.0.8": + version "3.0.8" + resolved "https://registry.yarnpkg.com/@vitest/snapshot/-/snapshot-3.0.8.tgz#b65d738c00ff052a323125ad7dfb001927049c78" + integrity sha512-x8IlMGSEMugakInj44nUrLSILh/zy1f2/BgH0UeHpNyOocG18M9CWVIFBaXPt8TrqVZWmcPjwfG/ht5tnpba8A== dependencies: - diff-sequences "^29.6.3" - estree-walker "^3.0.3" - loupe "^2.3.7" - pretty-format "^29.7.0" - -"@wagmi/connectors@4.1.14": - version "4.1.14" - resolved "https://registry.yarnpkg.com/@wagmi/connectors/-/connectors-4.1.14.tgz#66b945408b145c117c696f3543021232106bfcb2" - integrity sha512-e8I89FsNBtzhIilU3nqmgMR9xvSgCfmkWLz9iCKBTqyitbK5EJU7WTEtjjYFm1v2J//JeAwaA2XEKtG9BLR9jQ== - dependencies: - "@coinbase/wallet-sdk" "3.9.1" - "@metamask/sdk" "0.14.3" - "@safe-global/safe-apps-provider" "0.18.1" - "@safe-global/safe-apps-sdk" "8.1.0" - "@walletconnect/ethereum-provider" "2.11.1" - "@walletconnect/modal" "2.6.2" - -"@wagmi/core@2.6.5": - version "2.6.5" - resolved "https://registry.yarnpkg.com/@wagmi/core/-/core-2.6.5.tgz#7d1b7d94083d0b01c9ac4bb69e37d0d82b1640b5" - integrity sha512-DLyrc0o+dx05oIhBJuxnS7ekS5e6rB5mytlqPme+Km7aLdeBdcfYB4yJyYCyWoi93OLa7M5sbflTttz3o56bKw== + "@vitest/pretty-format" "3.0.8" + magic-string "^0.30.17" + pathe "^2.0.3" + +"@vitest/spy@3.0.8": + version "3.0.8" + resolved "https://registry.yarnpkg.com/@vitest/spy/-/spy-3.0.8.tgz#2a31ce28858aae50286644d64f886c72d55ae2ce" + integrity sha512-MR+PzJa+22vFKYb934CejhR4BeRpMSoxkvNoDit68GQxRLSf11aT6CTj3XaqUU9rxgWJFnqicN/wxw6yBRkI1Q== + dependencies: + tinyspy "^3.0.2" + +"@vitest/utils@3.0.8": + version "3.0.8" + resolved "https://registry.yarnpkg.com/@vitest/utils/-/utils-3.0.8.tgz#289277fbd8e733dff69cfa993c34665415c9b66b" + integrity sha512-nkBC3aEhfX2PdtQI/QwAWp8qZWwzASsU4Npbcd5RdMPBSSLCpkZp52P3xku3s3uA0HIEhGvEcF8rNkBsz9dQ4Q== + dependencies: + "@vitest/pretty-format" "3.0.8" + loupe "^3.1.3" + tinyrainbow "^2.0.0" + +"@wagmi/connectors@5.7.9": + version "5.7.9" + resolved "https://registry.yarnpkg.com/@wagmi/connectors/-/connectors-5.7.9.tgz#ad354ee5ee5db6786993c4fcafdb128bb766f320" + integrity sha512-mKgSjjdlnFjVu5dE8yKJfgs06+GvFFf6tOrLh9ihFzz0dwv6SQtC68qeo/YHxiHRZ8olFzam8GQRuTXM9bF1rg== + dependencies: + "@coinbase/wallet-sdk" "4.3.0" + "@metamask/sdk" "0.32.0" + "@safe-global/safe-apps-provider" "0.18.5" + "@safe-global/safe-apps-sdk" "9.1.0" + "@walletconnect/ethereum-provider" "2.19.0" + cbw-sdk "npm:@coinbase/wallet-sdk@3.9.3" + +"@wagmi/core@2.16.5": + version "2.16.5" + resolved "https://registry.yarnpkg.com/@wagmi/core/-/core-2.16.5.tgz#ae451daba4d84402f4ddf7b1279efeab46f3567f" + integrity sha512-7WlsxIvcS2WXO/8KnIkutCfY6HACsPsEuZHoYGu2TbwM7wlJv2HmR9zSvmyeEDsTBDPva/tuFbmJo4HJ9llkWA== dependencies: eventemitter3 "5.0.1" - mipd "0.0.5" - zustand "4.4.1" + mipd "0.0.7" + zustand "5.0.0" -"@walletconnect/core@2.11.1": - version "2.11.1" - resolved "https://registry.yarnpkg.com/@walletconnect/core/-/core-2.11.1.tgz#da2be26b8b6514c74f06dc9a5ffb450bdec3456d" - integrity sha512-T57Vd7YdbHPsy3tthBuwrhaZNafN0+PqjISFRNeJy/bsKdXxpJg2hGSARuOTpCO7V6VcaatqlaSMuG3DrnG5rA== +"@walletconnect/core@2.19.0": + version "2.19.0" + resolved "https://registry.yarnpkg.com/@walletconnect/core/-/core-2.19.0.tgz#acd84b605b05469aa9962079af2590e583815d49" + integrity sha512-AEoyICLHQEnjijZr9XsL4xtFhC5Cmu0RsEGxAxmwxbfGvAcYcSCNp1fYq0Q6nHc8jyoPOALpwySTle300Y1vxw== dependencies: - "@walletconnect/heartbeat" "1.2.1" - "@walletconnect/jsonrpc-provider" "1.0.13" - "@walletconnect/jsonrpc-types" "1.0.3" + "@walletconnect/heartbeat" "1.2.2" + "@walletconnect/jsonrpc-provider" "1.0.14" + "@walletconnect/jsonrpc-types" "1.0.4" "@walletconnect/jsonrpc-utils" "1.0.8" - "@walletconnect/jsonrpc-ws-connection" "1.0.14" - "@walletconnect/keyvaluestorage" "^1.1.1" - "@walletconnect/logger" "^2.0.1" - "@walletconnect/relay-api" "^1.0.9" - "@walletconnect/relay-auth" "^1.0.4" - "@walletconnect/safe-json" "^1.0.2" - "@walletconnect/time" "^1.0.2" - "@walletconnect/types" "2.11.1" - "@walletconnect/utils" "2.11.1" - events "^3.3.0" - isomorphic-unfetch "3.1.0" + "@walletconnect/jsonrpc-ws-connection" "1.0.16" + "@walletconnect/keyvaluestorage" "1.1.1" + "@walletconnect/logger" "2.1.2" + "@walletconnect/relay-api" "1.0.11" + "@walletconnect/relay-auth" "1.1.0" + "@walletconnect/safe-json" "1.0.2" + "@walletconnect/time" "1.0.2" + "@walletconnect/types" "2.19.0" + "@walletconnect/utils" "2.19.0" + "@walletconnect/window-getters" "1.0.1" + events "3.3.0" lodash.isequal "4.5.0" - uint8arrays "^3.1.0" + uint8arrays "3.1.0" "@walletconnect/environment@^1.0.1": version "1.0.1" @@ -3170,23 +2727,24 @@ dependencies: tslib "1.14.1" -"@walletconnect/ethereum-provider@2.11.1": - version "2.11.1" - resolved "https://registry.yarnpkg.com/@walletconnect/ethereum-provider/-/ethereum-provider-2.11.1.tgz#6e0174ec9026940eaadeedc53417e222eb45f5aa" - integrity sha512-UfQH0ho24aa2M1xYmanbJv2ggQPebKmQytp2j20QEvURJ2R0v7YKWZ+0PfwOs6o6cuGw6gGxy/0WQXQRZSAsfg== +"@walletconnect/ethereum-provider@2.19.0": + version "2.19.0" + resolved "https://registry.yarnpkg.com/@walletconnect/ethereum-provider/-/ethereum-provider-2.19.0.tgz#bbc94b1f6162e8288817b60bf286abfc9d663988" + integrity sha512-c1lwV6geL+IAbgB0DBTArzxkCE9raifTHPPv8ixGQPNS21XpVCaWTN6SE+rS9iwAtEoXjWAoNeK7rEOHE2negw== dependencies: - "@walletconnect/jsonrpc-http-connection" "^1.0.7" - "@walletconnect/jsonrpc-provider" "^1.0.13" - "@walletconnect/jsonrpc-types" "^1.0.3" - "@walletconnect/jsonrpc-utils" "^1.0.8" - "@walletconnect/modal" "^2.6.2" - "@walletconnect/sign-client" "2.11.1" - "@walletconnect/types" "2.11.1" - "@walletconnect/universal-provider" "2.11.1" - "@walletconnect/utils" "2.11.1" - events "^3.3.0" - -"@walletconnect/events@^1.0.1": + "@walletconnect/jsonrpc-http-connection" "1.0.8" + "@walletconnect/jsonrpc-provider" "1.0.14" + "@walletconnect/jsonrpc-types" "1.0.4" + "@walletconnect/jsonrpc-utils" "1.0.8" + "@walletconnect/keyvaluestorage" "1.1.1" + "@walletconnect/modal" "2.7.0" + "@walletconnect/sign-client" "2.19.0" + "@walletconnect/types" "2.19.0" + "@walletconnect/universal-provider" "2.19.0" + "@walletconnect/utils" "2.19.0" + events "3.3.0" + +"@walletconnect/events@1.0.1", "@walletconnect/events@^1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@walletconnect/events/-/events-1.0.1.tgz#2b5f9c7202019e229d7ccae1369a9e86bda7816c" integrity sha512-NPTqaoi0oPBVNuLv7qPaJazmGHs5JGyO8eEAk5VGKmJzDR7AHzD4k6ilox5kxk1iwiOnFopBOOMLs86Oa76HpQ== @@ -3194,43 +2752,43 @@ keyvaluestorage-interface "^1.0.0" tslib "1.14.1" -"@walletconnect/heartbeat@1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@walletconnect/heartbeat/-/heartbeat-1.2.1.tgz#afaa3a53232ae182d7c9cff41c1084472d8f32e9" - integrity sha512-yVzws616xsDLJxuG/28FqtZ5rzrTA4gUjdEMTbWB5Y8V1XHRmqq4efAxCw5ie7WjbXFSUyBHaWlMR+2/CpQC5Q== +"@walletconnect/heartbeat@1.2.2": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@walletconnect/heartbeat/-/heartbeat-1.2.2.tgz#e8dc5179db7769950c6f9cf59b23516d9b95227d" + integrity sha512-uASiRmC5MwhuRuf05vq4AT48Pq8RMi876zV8rr8cV969uTOzWdB/k+Lj5yI2PBtB1bGQisGen7MM1GcZlQTBXw== dependencies: "@walletconnect/events" "^1.0.1" "@walletconnect/time" "^1.0.2" - tslib "1.14.1" + events "^3.3.0" -"@walletconnect/jsonrpc-http-connection@^1.0.7": - version "1.0.7" - resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-http-connection/-/jsonrpc-http-connection-1.0.7.tgz#a6973569b8854c22da707a759d241e4f5c2d5a98" - integrity sha512-qlfh8fCfu8LOM9JRR9KE0s0wxP6ZG9/Jom8M0qsoIQeKF3Ni0FyV4V1qy/cc7nfI46SLQLSl4tgWSfLiE1swyQ== +"@walletconnect/jsonrpc-http-connection@1.0.8": + version "1.0.8" + resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-http-connection/-/jsonrpc-http-connection-1.0.8.tgz#2f4c3948f074960a3edd07909560f3be13e2c7ae" + integrity sha512-+B7cRuaxijLeFDJUq5hAzNyef3e3tBDIxyaCNmFtjwnod5AGis3RToNqzFU33vpVcxFhofkpE7Cx+5MYejbMGw== dependencies: "@walletconnect/jsonrpc-utils" "^1.0.6" "@walletconnect/safe-json" "^1.0.1" cross-fetch "^3.1.4" - tslib "1.14.1" + events "^3.3.0" -"@walletconnect/jsonrpc-provider@1.0.13", "@walletconnect/jsonrpc-provider@^1.0.13": - version "1.0.13" - resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-provider/-/jsonrpc-provider-1.0.13.tgz#9a74da648d015e1fffc745f0c7d629457f53648b" - integrity sha512-K73EpThqHnSR26gOyNEL+acEex3P7VWZe6KE12ZwKzAt2H4e5gldZHbjsu2QR9cLeJ8AXuO7kEMOIcRv1QEc7g== +"@walletconnect/jsonrpc-provider@1.0.14": + version "1.0.14" + resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-provider/-/jsonrpc-provider-1.0.14.tgz#696f3e3b6d728b361f2e8b853cfc6afbdf2e4e3e" + integrity sha512-rtsNY1XqHvWj0EtITNeuf8PHMvlCLiS3EjQL+WOkxEOA4KPxsohFnBDeyPYiNm4ZvkQdLnece36opYidmtbmow== dependencies: "@walletconnect/jsonrpc-utils" "^1.0.8" "@walletconnect/safe-json" "^1.0.2" - tslib "1.14.1" + events "^3.3.0" -"@walletconnect/jsonrpc-types@1.0.3", "@walletconnect/jsonrpc-types@^1.0.2", "@walletconnect/jsonrpc-types@^1.0.3": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-types/-/jsonrpc-types-1.0.3.tgz#65e3b77046f1a7fa8347ae02bc1b841abe6f290c" - integrity sha512-iIQ8hboBl3o5ufmJ8cuduGad0CQm3ZlsHtujv9Eu16xq89q+BG7Nh5VLxxUgmtpnrePgFkTwXirCTkwJH1v+Yw== +"@walletconnect/jsonrpc-types@1.0.4", "@walletconnect/jsonrpc-types@^1.0.2", "@walletconnect/jsonrpc-types@^1.0.3": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-types/-/jsonrpc-types-1.0.4.tgz#ce1a667d79eadf2a2d9d002c152ceb68739c230c" + integrity sha512-P6679fG/M+wuWg9TY8mh6xFSdYnFyFjwFelxyISxMDrlbXokorEVXYOxiqEbrU3x1BmBoCAJJ+vtEaEoMlpCBQ== dependencies: + events "^3.3.0" keyvaluestorage-interface "^1.0.0" - tslib "1.14.1" -"@walletconnect/jsonrpc-utils@1.0.8", "@walletconnect/jsonrpc-utils@^1.0.6", "@walletconnect/jsonrpc-utils@^1.0.7", "@walletconnect/jsonrpc-utils@^1.0.8": +"@walletconnect/jsonrpc-utils@1.0.8", "@walletconnect/jsonrpc-utils@^1.0.6", "@walletconnect/jsonrpc-utils@^1.0.8": version "1.0.8" resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-utils/-/jsonrpc-utils-1.0.8.tgz#82d0cc6a5d6ff0ecc277cb35f71402c91ad48d72" integrity sha512-vdeb03bD8VzJUL6ZtzRYsFMq1eZQcM3EAzT0a3st59dyLfJ0wq+tKMpmGH7HlB7waD858UWgfIcudbPFsbzVdw== @@ -3239,17 +2797,17 @@ "@walletconnect/jsonrpc-types" "^1.0.3" tslib "1.14.1" -"@walletconnect/jsonrpc-ws-connection@1.0.14": - version "1.0.14" - resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-ws-connection/-/jsonrpc-ws-connection-1.0.14.tgz#eec700e74766c7887de2bd76c91a0206628732aa" - integrity sha512-Jsl6fC55AYcbkNVkwNM6Jo+ufsuCQRqViOQ8ZBPH9pRREHH9welbBiszuTLqEJiQcO/6XfFDl6bzCJIkrEi8XA== +"@walletconnect/jsonrpc-ws-connection@1.0.16": + version "1.0.16" + resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-ws-connection/-/jsonrpc-ws-connection-1.0.16.tgz#666bb13fbf32a2d4f7912d5b4d0bdef26a1d057b" + integrity sha512-G81JmsMqh5nJheE1mPst1W0WfVv0SG3N7JggwLLGnI7iuDZJq8cRJvQwLGKHn5H1WTW7DEPCo00zz5w62AbL3Q== dependencies: "@walletconnect/jsonrpc-utils" "^1.0.6" "@walletconnect/safe-json" "^1.0.2" events "^3.3.0" ws "^7.5.1" -"@walletconnect/keyvaluestorage@^1.1.1": +"@walletconnect/keyvaluestorage@1.1.1": version "1.1.1" resolved "https://registry.yarnpkg.com/@walletconnect/keyvaluestorage/-/keyvaluestorage-1.1.1.tgz#dd2caddabfbaf80f6b8993a0704d8b83115a1842" integrity sha512-V7ZQq2+mSxAq7MrRqDxanTzu2RcElfK1PfNYiaVnJgJ7Q7G7hTVwF8voIBx92qsRyGHZihrwNPHuZd1aKkd0rA== @@ -3258,143 +2816,147 @@ idb-keyval "^6.2.1" unstorage "^1.9.0" -"@walletconnect/logger@^2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@walletconnect/logger/-/logger-2.0.1.tgz#7f489b96e9a1ff6bf3e58f0fbd6d69718bf844a8" - integrity sha512-SsTKdsgWm+oDTBeNE/zHxxr5eJfZmE9/5yp/Ku+zJtcTAjELb3DXueWkDXmE9h8uHIbJzIb5wj5lPdzyrjT6hQ== +"@walletconnect/logger@2.1.2": + version "2.1.2" + resolved "https://registry.yarnpkg.com/@walletconnect/logger/-/logger-2.1.2.tgz#813c9af61b96323a99f16c10089bfeb525e2a272" + integrity sha512-aAb28I3S6pYXZHQm5ESB+V6rDqIYfsnHaQyzFbwUUBFY4H0OXx/YtTl8lvhUNhMMfb9UxbwEBS253TlXUYJWSw== dependencies: + "@walletconnect/safe-json" "^1.0.2" pino "7.11.0" - tslib "1.14.1" -"@walletconnect/modal-core@2.6.2": - version "2.6.2" - resolved "https://registry.yarnpkg.com/@walletconnect/modal-core/-/modal-core-2.6.2.tgz#d73e45d96668764e0c8668ea07a45bb8b81119e9" - integrity sha512-cv8ibvdOJQv2B+nyxP9IIFdxvQznMz8OOr/oR/AaUZym4hjXNL/l1a2UlSQBXrVjo3xxbouMxLb3kBsHoYP2CA== +"@walletconnect/modal-core@2.7.0": + version "2.7.0" + resolved "https://registry.yarnpkg.com/@walletconnect/modal-core/-/modal-core-2.7.0.tgz#73c13c3b7b0abf9ccdbac9b242254a86327ce0a4" + integrity sha512-oyMIfdlNdpyKF2kTJowTixZSo0PGlCJRdssUN/EZdA6H6v03hZnf09JnwpljZNfir2M65Dvjm/15nGrDQnlxSA== dependencies: valtio "1.11.2" -"@walletconnect/modal-ui@2.6.2": - version "2.6.2" - resolved "https://registry.yarnpkg.com/@walletconnect/modal-ui/-/modal-ui-2.6.2.tgz#fa57c087c57b7f76aaae93deab0f84bb68b59cf9" - integrity sha512-rbdstM1HPGvr7jprQkyPggX7rP4XiCG85ZA+zWBEX0dVQg8PpAgRUqpeub4xQKDgY7pY/xLRXSiCVdWGqvG2HA== +"@walletconnect/modal-ui@2.7.0": + version "2.7.0" + resolved "https://registry.yarnpkg.com/@walletconnect/modal-ui/-/modal-ui-2.7.0.tgz#dbbb7ee46a5a25f7d39db622706f2d197b268cbb" + integrity sha512-gERYvU7D7K1ANCN/8vUgsE0d2hnRemfAFZ2novm9aZBg7TEd/4EgB+AqbJ+1dc7GhOL6dazckVq78TgccHb7mQ== dependencies: - "@walletconnect/modal-core" "2.6.2" + "@walletconnect/modal-core" "2.7.0" lit "2.8.0" motion "10.16.2" qrcode "1.5.3" -"@walletconnect/modal@2.6.2", "@walletconnect/modal@^2.6.2": - version "2.6.2" - resolved "https://registry.yarnpkg.com/@walletconnect/modal/-/modal-2.6.2.tgz#4b534a836f5039eeb3268b80be7217a94dd12651" - integrity sha512-eFopgKi8AjKf/0U4SemvcYw9zlLpx9njVN8sf6DAkowC2Md0gPU/UNEbH1Wwj407pEKnEds98pKWib1NN1ACoA== +"@walletconnect/modal@2.7.0": + version "2.7.0" + resolved "https://registry.yarnpkg.com/@walletconnect/modal/-/modal-2.7.0.tgz#55f969796d104cce1205f5f844d8f8438b79723a" + integrity sha512-RQVt58oJ+rwqnPcIvRFeMGKuXb9qkgSmwz4noF8JZGUym3gUAzVs+uW2NQ1Owm9XOJAV+sANrtJ+VoVq1ftElw== dependencies: - "@walletconnect/modal-core" "2.6.2" - "@walletconnect/modal-ui" "2.6.2" + "@walletconnect/modal-core" "2.7.0" + "@walletconnect/modal-ui" "2.7.0" -"@walletconnect/relay-api@^1.0.9": - version "1.0.9" - resolved "https://registry.yarnpkg.com/@walletconnect/relay-api/-/relay-api-1.0.9.tgz#f8c2c3993dddaa9f33ed42197fc9bfebd790ecaf" - integrity sha512-Q3+rylJOqRkO1D9Su0DPE3mmznbAalYapJ9qmzDgK28mYF9alcP3UwG/og5V7l7CFOqzCLi7B8BvcBUrpDj0Rg== +"@walletconnect/relay-api@1.0.11": + version "1.0.11" + resolved "https://registry.yarnpkg.com/@walletconnect/relay-api/-/relay-api-1.0.11.tgz#80ab7ef2e83c6c173be1a59756f95e515fb63224" + integrity sha512-tLPErkze/HmC9aCmdZOhtVmYZq1wKfWTJtygQHoWtgg722Jd4homo54Cs4ak2RUFUZIGO2RsOpIcWipaua5D5Q== dependencies: "@walletconnect/jsonrpc-types" "^1.0.2" - tslib "1.14.1" -"@walletconnect/relay-auth@^1.0.4": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@walletconnect/relay-auth/-/relay-auth-1.0.4.tgz#0b5c55c9aa3b0ef61f526ce679f3ff8a5c4c2c7c" - integrity sha512-kKJcS6+WxYq5kshpPaxGHdwf5y98ZwbfuS4EE/NkQzqrDFm5Cj+dP8LofzWvjrrLkZq7Afy7WrQMXdLy8Sx7HQ== +"@walletconnect/relay-auth@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@walletconnect/relay-auth/-/relay-auth-1.1.0.tgz#c3c5f54abd44a5138ea7d4fe77970597ba66c077" + integrity sha512-qFw+a9uRz26jRCDgL7Q5TA9qYIgcNY8jpJzI1zAWNZ8i7mQjaijRnWFKsCHAU9CyGjvt6RKrRXyFtFOpWTVmCQ== dependencies: - "@stablelib/ed25519" "^1.0.2" - "@stablelib/random" "^1.0.1" + "@noble/curves" "1.8.0" + "@noble/hashes" "1.7.0" "@walletconnect/safe-json" "^1.0.1" "@walletconnect/time" "^1.0.2" - tslib "1.14.1" uint8arrays "^3.0.0" -"@walletconnect/safe-json@^1.0.1", "@walletconnect/safe-json@^1.0.2": +"@walletconnect/safe-json@1.0.2", "@walletconnect/safe-json@^1.0.1", "@walletconnect/safe-json@^1.0.2": version "1.0.2" resolved "https://registry.yarnpkg.com/@walletconnect/safe-json/-/safe-json-1.0.2.tgz#7237e5ca48046e4476154e503c6d3c914126fa77" integrity sha512-Ogb7I27kZ3LPC3ibn8ldyUr5544t3/STow9+lzz7Sfo808YD7SBWk7SAsdBFlYgP2zDRy2hS3sKRcuSRM0OTmA== dependencies: tslib "1.14.1" -"@walletconnect/sign-client@2.11.1": - version "2.11.1" - resolved "https://registry.yarnpkg.com/@walletconnect/sign-client/-/sign-client-2.11.1.tgz#c073b8d2d594e792bb783d36c8b021bd37a9d4f6" - integrity sha512-s3oKSx6/F5X2WmkV1jfJImBFACf9Km5HpTb+n5q+mobJVpUQw/clvoVyIrNNppLhm1V1S/ylHXh0qCrDppDpCA== +"@walletconnect/sign-client@2.19.0": + version "2.19.0" + resolved "https://registry.yarnpkg.com/@walletconnect/sign-client/-/sign-client-2.19.0.tgz#775d21928a402ab5506f7c0b6065932cd6c8724d" + integrity sha512-+GkuJzPK9SPq+RZgdKHNOvgRagxh/hhYWFHOeSiGh3DyAQofWuFTq4UrN/MPjKOYswSSBKfIa+iqKYsi4t8zLQ== dependencies: - "@walletconnect/core" "2.11.1" - "@walletconnect/events" "^1.0.1" - "@walletconnect/heartbeat" "1.2.1" + "@walletconnect/core" "2.19.0" + "@walletconnect/events" "1.0.1" + "@walletconnect/heartbeat" "1.2.2" "@walletconnect/jsonrpc-utils" "1.0.8" - "@walletconnect/logger" "^2.0.1" - "@walletconnect/time" "^1.0.2" - "@walletconnect/types" "2.11.1" - "@walletconnect/utils" "2.11.1" - events "^3.3.0" + "@walletconnect/logger" "2.1.2" + "@walletconnect/time" "1.0.2" + "@walletconnect/types" "2.19.0" + "@walletconnect/utils" "2.19.0" + events "3.3.0" -"@walletconnect/time@^1.0.2": +"@walletconnect/time@1.0.2", "@walletconnect/time@^1.0.2": version "1.0.2" resolved "https://registry.yarnpkg.com/@walletconnect/time/-/time-1.0.2.tgz#6c5888b835750ecb4299d28eecc5e72c6d336523" integrity sha512-uzdd9woDcJ1AaBZRhqy5rNC9laqWGErfc4dxA9a87mPdKOgWMD85mcFo9dIYIts/Jwocfwn07EC6EzclKubk/g== dependencies: tslib "1.14.1" -"@walletconnect/types@2.11.1": - version "2.11.1" - resolved "https://registry.yarnpkg.com/@walletconnect/types/-/types-2.11.1.tgz#4f705b43ddc286b69eb9bf91bb6e9496d20de0e3" - integrity sha512-UbdbX+d6MOK0AXKxt5imV3KvAcLVpZUHylaRDIP5ffwVylM/p4DHnKppil1Qq5N+IGDr3RsUwLGFkKjqsQYRKw== - dependencies: - "@walletconnect/events" "^1.0.1" - "@walletconnect/heartbeat" "1.2.1" - "@walletconnect/jsonrpc-types" "1.0.3" - "@walletconnect/keyvaluestorage" "^1.1.1" - "@walletconnect/logger" "^2.0.1" - events "^3.3.0" - -"@walletconnect/universal-provider@2.11.1": - version "2.11.1" - resolved "https://registry.yarnpkg.com/@walletconnect/universal-provider/-/universal-provider-2.11.1.tgz#988f2a78325eb52ef7481a220851a56efb209d64" - integrity sha512-BJvPYByIfbBYF4x8mqDV79ebQX0tD54pp8itsqrHWn0qKZeJyIH8sQ69yY0GnbJrzoFS3ZLULdC0yDxWDeuRGw== - dependencies: - "@walletconnect/jsonrpc-http-connection" "^1.0.7" - "@walletconnect/jsonrpc-provider" "1.0.13" - "@walletconnect/jsonrpc-types" "^1.0.2" - "@walletconnect/jsonrpc-utils" "^1.0.7" - "@walletconnect/logger" "^2.0.1" - "@walletconnect/sign-client" "2.11.1" - "@walletconnect/types" "2.11.1" - "@walletconnect/utils" "2.11.1" - events "^3.3.0" - -"@walletconnect/utils@2.11.1": - version "2.11.1" - resolved "https://registry.yarnpkg.com/@walletconnect/utils/-/utils-2.11.1.tgz#56116d9c410c6f2ae8d562017cf6876cccb366f1" - integrity sha512-wRFDHN86dZ05mCET1H3912odIeQa8j7cZKxl1FlWRpV2YsILj9HCYSX6Uq2brwO02Kv2vryke44G1r8XI/LViA== - dependencies: - "@stablelib/chacha20poly1305" "1.0.1" - "@stablelib/hkdf" "1.0.1" - "@stablelib/random" "^1.0.2" - "@stablelib/sha256" "1.0.1" - "@stablelib/x25519" "^1.0.3" - "@walletconnect/relay-api" "^1.0.9" - "@walletconnect/safe-json" "^1.0.2" - "@walletconnect/time" "^1.0.2" - "@walletconnect/types" "2.11.1" - "@walletconnect/window-getters" "^1.0.1" - "@walletconnect/window-metadata" "^1.0.1" +"@walletconnect/types@2.19.0": + version "2.19.0" + resolved "https://registry.yarnpkg.com/@walletconnect/types/-/types-2.19.0.tgz#cbb8053c20064377a85440ede06d5057c34c5786" + integrity sha512-Ttse3p3DCdFQ/TRQrsPMQJzFr7cb/2AF5ltLPzXRNMmapmGydc6WO8QU7g/tGEB3RT9nHcLY2aqlwsND9sXMxA== + dependencies: + "@walletconnect/events" "1.0.1" + "@walletconnect/heartbeat" "1.2.2" + "@walletconnect/jsonrpc-types" "1.0.4" + "@walletconnect/keyvaluestorage" "1.1.1" + "@walletconnect/logger" "2.1.2" + events "3.3.0" + +"@walletconnect/universal-provider@2.19.0": + version "2.19.0" + resolved "https://registry.yarnpkg.com/@walletconnect/universal-provider/-/universal-provider-2.19.0.tgz#2648a604def3a81cc91893ffd1bba01c6fa637d5" + integrity sha512-e9JvadT5F8QwdLmd7qBrmACq04MT7LQEe1m3X2Fzvs3DWo8dzY8QbacnJy4XSv5PCdxMWnua+2EavBk8nrI9QA== + dependencies: + "@walletconnect/events" "1.0.1" + "@walletconnect/jsonrpc-http-connection" "1.0.8" + "@walletconnect/jsonrpc-provider" "1.0.14" + "@walletconnect/jsonrpc-types" "1.0.4" + "@walletconnect/jsonrpc-utils" "1.0.8" + "@walletconnect/keyvaluestorage" "1.1.1" + "@walletconnect/logger" "2.1.2" + "@walletconnect/sign-client" "2.19.0" + "@walletconnect/types" "2.19.0" + "@walletconnect/utils" "2.19.0" + events "3.3.0" + lodash "4.17.21" + +"@walletconnect/utils@2.19.0": + version "2.19.0" + resolved "https://registry.yarnpkg.com/@walletconnect/utils/-/utils-2.19.0.tgz#5fffb1f83928ece8c534d1596134e5c097010804" + integrity sha512-LZ0D8kevknKfrfA0Sq3Hf3PpmM8oWyNfsyWwFR51t//2LBgtN2Amz5xyoDDJcjLibIbKAxpuo/i0JYAQxz+aPA== + dependencies: + "@noble/ciphers" "1.2.1" + "@noble/curves" "1.8.1" + "@noble/hashes" "1.7.1" + "@walletconnect/jsonrpc-utils" "1.0.8" + "@walletconnect/keyvaluestorage" "1.1.1" + "@walletconnect/relay-api" "1.0.11" + "@walletconnect/relay-auth" "1.1.0" + "@walletconnect/safe-json" "1.0.2" + "@walletconnect/time" "1.0.2" + "@walletconnect/types" "2.19.0" + "@walletconnect/window-getters" "1.0.1" + "@walletconnect/window-metadata" "1.0.1" detect-browser "5.3.0" + elliptic "6.6.1" query-string "7.1.3" - uint8arrays "^3.1.0" + uint8arrays "3.1.0" + viem "2.23.2" -"@walletconnect/window-getters@^1.0.1": +"@walletconnect/window-getters@1.0.1", "@walletconnect/window-getters@^1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@walletconnect/window-getters/-/window-getters-1.0.1.tgz#f36d1c72558a7f6b87ecc4451fc8bd44f63cbbdc" integrity sha512-vHp+HqzGxORPAN8gY03qnbTMnhqIwjeRJNOMOAzePRg4xVEEE2WvYsI9G2NMjOknA8hnuYbU3/hwLcKbjhc8+Q== dependencies: tslib "1.14.1" -"@walletconnect/window-metadata@^1.0.1": +"@walletconnect/window-metadata@1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@walletconnect/window-metadata/-/window-metadata-1.0.1.tgz#2124f75447b7e989e4e4e1581d55d25bc75f7be5" integrity sha512-9koTqyGrM2cqFRW517BPY/iEtUDx2r1+Pwwu5m7sJ7ka79wi3EyqhqcICk/yDmv6jAS1rjKgTKXlEhanYjijcA== @@ -3402,51 +2964,38 @@ "@walletconnect/window-getters" "^1.0.1" tslib "1.14.1" -abbrev@1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" - integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== - -abitype@1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/abitype/-/abitype-1.0.4.tgz#a817ff44860e8a84e9a37ed22aa9b738dbb51dba" - integrity sha512-UivtYZOGJGE8rsrM/N5vdRkUpqEZVmuTumfTuolm7m/6O09wprd958rx8kUBwVAAAhQDveGAgD0GJdBuR8s6tw== +abitype@0.9.8: + version "0.9.8" + resolved "https://registry.yarnpkg.com/abitype/-/abitype-0.9.8.tgz#1f120b6b717459deafd213dfbf3a3dd1bf10ae8c" + integrity sha512-puLifILdm+8sjyss4S+fsUN09obiT1g2YW6CtcQF+QDzxR0euzgEB29MZujC6zMk2a6SVmtttq1fc6+YFA7WYQ== -abitype@^0.8.0: - version "0.8.11" - resolved "https://registry.yarnpkg.com/abitype/-/abitype-0.8.11.tgz#66e1cf2cbf46f48d0e57132d7c1c392447536cc1" - integrity sha512-bM4v2dKvX08sZ9IU38IN5BKmN+ZkOSd2oI4a9f0ejHYZQYV6cDr7j+d95ga0z2XHG36Y4jzoG5Z7qDqxp7fi/A== +abitype@1.0.8, abitype@^1.0.0, abitype@^1.0.6: + version "1.0.8" + resolved "https://registry.yarnpkg.com/abitype/-/abitype-1.0.8.tgz#3554f28b2e9d6e9f35eb59878193eabd1b9f46ba" + integrity sha512-ZeiI6h3GnW06uYDLx0etQtX/p8E24UaHHBj57RSjK7YBFe7iuVn07EDpOeP451D06sF27VOz9JJPlIKJmXgkEg== -abitype@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/abitype/-/abitype-1.0.0.tgz#237176dace81d90d018bebf3a45cb42f2a2d9e97" - integrity sha512-NMeMah//6bJ56H5XRj8QCV4AwuW6hB6zqz2LnhhLdcWVQOsXki6/Pn3APeqxCma62nXIcmZWdu1DlHWS74umVQ== +abort-controller@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" + integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== + dependencies: + event-target-shim "^5.0.0" acorn-jsx@^5.3.2: version "5.3.2" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -acorn-walk@^8.1.1, acorn-walk@^8.3.2: - version "8.3.2" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.2.tgz#7703af9415f1b6db9315d6895503862e231d34aa" - integrity sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A== - -acorn@^8.11.3, acorn@^8.4.1, acorn@^8.9.0: - version "8.11.3" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" - integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== +acorn@^8.14.0, acorn@^8.9.0: + version "8.14.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.14.1.tgz#721d5dc10f7d5b5609a891773d47731796935dfb" + integrity sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg== adm-zip@^0.4.16: version "0.4.16" resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.4.16.tgz#cf4c508fdffab02c269cbc7f471a875f05570365" integrity sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg== -aes-js@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.0.0.tgz#e21df10ad6c2053295bcbb8dab40b09dbea87e4d" - integrity sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw== - aes-js@4.0.0-beta.5: version "4.0.0-beta.5" resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-4.0.0-beta.5.tgz#8d2452c52adedebc3a3e28465d858c11ca315873" @@ -3477,15 +3026,15 @@ ajv@^6.12.4: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^8.12.0: - version "8.12.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1" - integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== +ajv@^8.17.1: + version "8.17.1" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.17.1.tgz#37d9a5c776af6bc92d7f4f9510eba4c0a60d11a6" + integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g== dependencies: - fast-deep-equal "^3.1.1" + fast-deep-equal "^3.1.3" + fast-uri "^3.0.1" json-schema-traverse "^1.0.0" require-from-string "^2.0.2" - uri-js "^4.2.2" ansi-align@^3.0.0: version "3.0.1" @@ -3494,11 +3043,6 @@ ansi-align@^3.0.0: dependencies: string-width "^4.1.0" -ansi-colors@4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" - integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== - ansi-colors@^4.1.1, ansi-colors@^4.1.3: version "4.1.3" resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" @@ -3511,24 +3055,12 @@ ansi-escapes@^4.3.0: dependencies: type-fest "^0.21.3" -ansi-escapes@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-5.0.0.tgz#b6a0caf0eef0c41af190e9a749e0c00ec04bb2a6" - integrity sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA== - dependencies: - type-fest "^1.0.2" - -ansi-escapes@^6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-6.2.0.tgz#8a13ce75286f417f1963487d86ba9f90dccf9947" - integrity sha512-kzRaCqXnpzWs+3z5ABPQiVke+iq0KXkHo8xiWV4RPTi5Yli0l97BEQuhXV1s7+aSU/fu1kUuxgS4MsQ0fRuygw== +ansi-escapes@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-7.0.0.tgz#00fc19f491bbb18e1d481b97868204f92109bfe7" + integrity sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw== dependencies: - type-fest "^3.0.0" - -ansi-regex@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" - integrity sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA== + environment "^1.0.0" ansi-regex@^5.0.1: version "5.0.1" @@ -3536,19 +3068,9 @@ ansi-regex@^5.0.1: integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== ansi-regex@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" - integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== - -ansi-sequence-parser@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ansi-sequence-parser/-/ansi-sequence-parser-1.1.1.tgz#e0aa1cdcbc8f8bb0b5bca625aac41f5f056973cf" - integrity sha512-vJXt3yiaUL4UU546s3rPXlsry/RnM730G1+HkpKE012AN0sx1eOrxSu95oKDIonskeLTijMgqWZ3uDEe3NFvyg== - -ansi-styles@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" - integrity sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA== + version "6.1.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.1.0.tgz#95ec409c69619d6cb1b8b34f14b660ef28ebd654" + integrity sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA== ansi-styles@^3.2.1: version "3.2.1" @@ -3564,11 +3086,6 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0: dependencies: color-convert "^2.0.1" -ansi-styles@^5.0.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" - integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== - ansi-styles@^6.0.0, ansi-styles@^6.1.0, ansi-styles@^6.2.1: version "6.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" @@ -3587,11 +3104,6 @@ anymatch@^3.1.3, anymatch@~3.1.2: normalize-path "^3.0.0" picomatch "^2.0.4" -arg@^4.1.0: - version "4.1.3" - resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" - integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== - arg@^5.0.2: version "5.0.2" resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c" @@ -3609,30 +3121,29 @@ argparse@^2.0.1: resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== -aria-query@^5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.3.0.tgz#650c569e41ad90b51b3d7df5e5eed1c7549c103e" - integrity sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A== - dependencies: - dequal "^2.0.3" +aria-query@^5.3.2: + version "5.3.2" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.3.2.tgz#93f81a43480e33a338f19163a3d10a50c01dcd59" + integrity sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw== -array-buffer-byte-length@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz#1e5583ec16763540a27ae52eed99ff899223568f" - integrity sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg== +array-buffer-byte-length@^1.0.1, array-buffer-byte-length@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz#384d12a37295aec3769ab022ad323a18a51ccf8b" + integrity sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw== dependencies: - call-bind "^1.0.5" - is-array-buffer "^3.0.4" + call-bound "^1.0.3" + is-array-buffer "^3.0.5" -array-includes@^3.1.6, array-includes@^3.1.7: - version "3.1.7" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.7.tgz#8cd2e01b26f7a3086cbc87271593fe921c62abda" - integrity sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ== +array-includes@^3.1.6, array-includes@^3.1.8: + version "3.1.8" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.8.tgz#5e370cbe172fdd5dd6530c1d4aadda25281ba97d" + integrity sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - get-intrinsic "^1.2.1" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-object-atoms "^1.0.0" + get-intrinsic "^1.2.4" is-string "^1.0.7" array-union@^2.1.0: @@ -3640,75 +3151,73 @@ array-union@^2.1.0: resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== -array.prototype.every@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/array.prototype.every/-/array.prototype.every-1.1.5.tgz#f8ca86a1a82a91eb5173187ef68935dc47215922" - integrity sha512-FfMQJ+/joFGXpRCltbzV3znaP5QxIhLFySo0fEPn3GuoYlud9LhknMCIxdYKC2qsM/6VHoSp6YGwe3EZXrEcwQ== +array.prototype.findlast@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz#3e4fbcb30a15a7f5bf64cf2faae22d139c2e4904" + integrity sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - is-string "^1.0.7" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + es-shim-unscopables "^1.0.2" -array.prototype.findlastindex@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz#b37598438f97b579166940814e2c0493a4f50207" - integrity sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA== +array.prototype.findlastindex@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz#8c35a755c72908719453f87145ca011e39334d0d" + integrity sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - es-shim-unscopables "^1.0.0" - get-intrinsic "^1.2.1" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + es-shim-unscopables "^1.0.2" -array.prototype.flat@^1.2.3, array.prototype.flat@^1.3.1, array.prototype.flat@^1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz#1476217df8cff17d72ee8f3ba06738db5b387d18" - integrity sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA== +array.prototype.flat@^1.3.1, array.prototype.flat@^1.3.2: + version "1.3.3" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz#534aaf9e6e8dd79fb6b9a9917f839ef1ec63afe5" + integrity sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - es-shim-unscopables "^1.0.0" + call-bind "^1.0.8" + define-properties "^1.2.1" + es-abstract "^1.23.5" + es-shim-unscopables "^1.0.2" -array.prototype.flatmap@^1.3.1, array.prototype.flatmap@^1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz#c9a7c6831db8e719d6ce639190146c24bbd3e527" - integrity sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ== +array.prototype.flatmap@^1.3.2, array.prototype.flatmap@^1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz#712cc792ae70370ae40586264629e33aab5dd38b" + integrity sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - es-shim-unscopables "^1.0.0" + call-bind "^1.0.8" + define-properties "^1.2.1" + es-abstract "^1.23.5" + es-shim-unscopables "^1.0.2" -array.prototype.tosorted@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.2.tgz#620eff7442503d66c799d95503f82b475745cefd" - integrity sha512-HuQCHOlk1Weat5jzStICBCd83NxiIMwqDg/dHEsoefabn/hJRj5pVdWcPUSpRrwhwxZOsQassMpgN/xRYFBMIg== +array.prototype.tosorted@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz#fe954678ff53034e717ea3352a03f0b0b86f7ffc" + integrity sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - es-shim-unscopables "^1.0.0" - get-intrinsic "^1.2.1" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.3" + es-errors "^1.3.0" + es-shim-unscopables "^1.0.2" -arraybuffer.prototype.slice@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz#98bd561953e3e74bb34938e77647179dfe6e9f12" - integrity sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw== - dependencies: - array-buffer-byte-length "^1.0.0" - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - get-intrinsic "^1.2.1" - is-array-buffer "^3.0.2" - is-shared-array-buffer "^1.0.2" - -arrify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" - integrity sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA== +arraybuffer.prototype.slice@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz#9d760d84dbdd06d0cbf92c8849615a1a7ab3183c" + integrity sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ== + dependencies: + array-buffer-byte-length "^1.0.1" + call-bind "^1.0.8" + define-properties "^1.2.1" + es-abstract "^1.23.5" + es-errors "^1.3.0" + get-intrinsic "^1.2.6" + is-array-buffer "^3.0.4" asn1.js@^5.0.0: version "5.4.1" @@ -3720,21 +3229,26 @@ asn1.js@^5.0.0: minimalistic-assert "^1.0.0" safer-buffer "^2.1.0" -assert-never@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/assert-never/-/assert-never-1.2.1.tgz#11f0e363bf146205fb08193b5c7b90f4d1cf44fe" - integrity sha512-TaTivMB6pYI1kXwrFlEhLeGfOqoDNdTxjCdwRfFFkEA30Eu+k48W34nlok2EYWJfFFzqaEmichdNM7th6M5HNw== +assert-never@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/assert-never/-/assert-never-1.4.0.tgz#b0d4988628c87f35eb94716cc54422a63927e175" + integrity sha512-5oJg84os6NMQNl27T9LnZkvvqzvAnHu03ShCnoj6bsJwS7L8AO4lf+C/XjK/nvzEqQB744moC6V128RucQd1jA== -assertion-error@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" - integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== +assertion-error@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-2.0.1.tgz#f641a196b335690b1070bf00b6e7593fec190bf7" + integrity sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA== ast-types-flow@^0.0.8: version "0.0.8" resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.8.tgz#0a85e1c92695769ac13a428bb653e7538bea27d6" integrity sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ== +async-function@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/async-function/-/async-function-1.0.0.tgz#509c9fca60eaf85034c6829838188e4e4c8ffb2b" + integrity sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA== + async-mutex@^0.2.6: version "0.2.6" resolved "https://registry.yarnpkg.com/async-mutex/-/async-mutex-0.2.6.tgz#0d7a3deb978bc2b984d5908a2038e1ae2e54ff40" @@ -3742,13 +3256,6 @@ async-mutex@^0.2.6: dependencies: tslib "^2.0.0" -asynciterator.prototype@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz#8c5df0514936cdd133604dfcc9d3fb93f09b2b62" - integrity sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg== - dependencies: - has-symbols "^1.0.3" - asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" @@ -3759,27 +3266,29 @@ atomic-sleep@^1.0.0: resolved "https://registry.yarnpkg.com/atomic-sleep/-/atomic-sleep-1.0.0.tgz#eb85b77a601fc932cfe432c5acd364a9e2c9075b" integrity sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ== -autoprefixer@^10.4.17: - version "10.4.17" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.17.tgz#35cd5695cbbe82f536a50fa025d561b01fdec8be" - integrity sha512-/cpVNRLSfhOtcGflT13P2794gVSgmPgTR+erw5ifnMLZb0UnSlkK4tquLmkd3BhA+nLo5tX8Cu0upUsGKvKbmg== +autoprefixer@^10.4.20: + version "10.4.21" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.21.tgz#77189468e7a8ad1d9a37fbc08efc9f480cf0a95d" + integrity sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ== dependencies: - browserslist "^4.22.2" - caniuse-lite "^1.0.30001578" + browserslist "^4.24.4" + caniuse-lite "^1.0.30001702" fraction.js "^4.3.7" normalize-range "^0.1.2" - picocolors "^1.0.0" + picocolors "^1.1.1" postcss-value-parser "^4.2.0" -available-typed-arrays@^1.0.5, available-typed-arrays@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.6.tgz#ac812d8ce5a6b976d738e1c45f08d0b00bc7d725" - integrity sha512-j1QzY8iPNPG4o4xmO3ptzpRxTciqD3MgEHtifP/YnJpIo58Xu+ne4BejlbkuaLfXn/nz6HFiw29bLpj2PNMdGg== +available-typed-arrays@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" + integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== + dependencies: + possible-typed-array-names "^1.0.0" -axe-core@=4.7.0: - version "4.7.0" - resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.7.0.tgz#34ba5a48a8b564f67e103f0aa5768d76e15bbbbf" - integrity sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ== +axe-core@^4.10.0: + version "4.10.3" + resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.10.3.tgz#04145965ac7894faddbac30861e5d8f11bfd14fc" + integrity sha512-Xm7bpRXnDSX2YE2YFfBk2FnF0ep6tmG7xPh8iHee8MIcrgq762Nkce856dYtJYLkuIoYZvGfTs/PbZhideTcEg== axios@^0.27.2: version "0.27.2" @@ -3789,21 +3298,10 @@ axios@^0.27.2: follow-redirects "^1.14.9" form-data "^4.0.0" -axobject-query@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-3.2.1.tgz#39c378a6e3b06ca679f29138151e45b2b32da62a" - integrity sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg== - dependencies: - dequal "^2.0.3" - -babel-plugin-macros@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz#9ef6dc74deb934b4db344dc973ee851d148c50c1" - integrity sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg== - dependencies: - "@babel/runtime" "^7.12.5" - cosmiconfig "^7.0.0" - resolve "^1.19.0" +axobject-query@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-4.1.0.tgz#28768c76d0e3cff21bc62a9e2d0b6ac30042a1ee" + integrity sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ== balanced-match@^1.0.0: version "1.0.2" @@ -3811,9 +3309,9 @@ balanced-match@^1.0.0: integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== base-x@^3.0.2: - version "3.0.9" - resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.9.tgz#6349aaabb58526332de9f60995e548a53fe21320" - integrity sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ== + version "3.0.11" + resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.11.tgz#40d80e2a1aeacba29792ccc6c5354806421287ff" + integrity sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA== dependencies: safe-buffer "^5.0.1" @@ -3822,11 +3320,6 @@ base64-js@^1.3.1: resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== -bech32@1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/bech32/-/bech32-1.1.4.tgz#e38c9f37bf179b8eb16ae3a772b40c356d4832e9" - integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ== - better-path-resolve@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/better-path-resolve/-/better-path-resolve-1.0.0.tgz#13a35a1104cdd48a7b74bf8758f96a1ee613f99d" @@ -3834,40 +3327,20 @@ better-path-resolve@1.0.0: dependencies: is-windows "^1.0.0" -big.js@^6.2.1: - version "6.2.1" - resolved "https://registry.yarnpkg.com/big.js/-/big.js-6.2.1.tgz#7205ce763efb17c2e41f26f121c420c6a7c2744f" - integrity sha512-bCtHMwL9LeDIozFn+oNhhFoq+yQ3BNdnsLSASUxLciOb1vgvpHsIO1dsENiGMgbb4SkP5TrzWzRiLddn8ahVOQ== - -bigint-crypto-utils@^3.2.2: - version "3.3.0" - resolved "https://registry.yarnpkg.com/bigint-crypto-utils/-/bigint-crypto-utils-3.3.0.tgz#72ad00ae91062cf07f2b1def9594006c279c1d77" - integrity sha512-jOTSb+drvEDxEq6OuUybOAv/xxoh3cuYRUIPyu8sSHQNKM303UQ2R1DAo45o1AkcIXw6fzbaFI1+xGGdaXs2lg== - -bignumber.js@^9.0.1: - version "9.1.2" - resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.2.tgz#b7c4242259c008903b13707983b5f4bbd31eda0c" - integrity sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug== - binary-extensions@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" - integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + version "2.3.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" + integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== blakejs@^1.1.0: version "1.2.1" resolved "https://registry.yarnpkg.com/blakejs/-/blakejs-1.2.1.tgz#5057e4206eadb4a97f7c0b6e197a505042fc3814" integrity sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ== -bn.js@4.11.6: - version "4.11.6" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.6.tgz#53344adb14617a13f6e8dd2ce28905d1c0ba3215" - integrity sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA== - bn.js@^4.0.0, bn.js@^4.11.0, bn.js@^4.11.8, bn.js@^4.11.9, bn.js@^4.12.0: - version "4.12.0" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" - integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== + version "4.12.1" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.1.tgz#215741fe3c9dba2d7e12c001d0cfdbae43975ba7" + integrity sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg== bn.js@^5.2.0, bn.js@^5.2.1: version "5.2.1" @@ -3908,26 +3381,19 @@ brace-expansion@^2.0.1: dependencies: balanced-match "^1.0.0" -braces@^3.0.2, braces@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== - dependencies: - fill-range "^7.0.1" - -breakword@^1.0.5: - version "1.0.6" - resolved "https://registry.yarnpkg.com/breakword/-/breakword-1.0.6.tgz#242506e7b871b7fad1bce8dc05cb0f2a129c12bd" - integrity sha512-yjxDAYyK/pBvws9H4xKYpLDpYKEH6CzrBPAuXq3x18I+c/2MkVtT3qAr7Oloi6Dss9qNhPVueAAVU1CSeNDIXw== +braces@^3.0.3, braces@~3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" + integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== dependencies: - wcwidth "^1.0.1" + fill-range "^7.1.1" brorand@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== -browser-stdout@1.3.1: +browser-stdout@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== @@ -3944,15 +3410,15 @@ browserify-aes@^1.2.0: inherits "^2.0.1" safe-buffer "^5.0.1" -browserslist@^4.22.2: - version "4.22.3" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.22.3.tgz#299d11b7e947a6b843981392721169e27d60c5a6" - integrity sha512-UAp55yfwNv0klWNapjs/ktHoguxuQNGnOzxYmfnXIS+8AsRDZkSDxg7R1AX3GKzn078SBI5dzwzj/Yx0Or0e3A== +browserslist@^4.24.0, browserslist@^4.24.4: + version "4.24.4" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.24.4.tgz#c6b2865a3f08bcb860a0e827389003b9fe686e4b" + integrity sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A== dependencies: - caniuse-lite "^1.0.30001580" - electron-to-chromium "^1.4.648" - node-releases "^2.0.14" - update-browserslist-db "^1.0.13" + caniuse-lite "^1.0.30001688" + electron-to-chromium "^1.5.73" + node-releases "^2.0.19" + update-browserslist-db "^1.1.1" bs58@^4.0.0: version "4.0.1" @@ -3980,11 +3446,6 @@ buffer-reverse@^1.0.1: resolved "https://registry.yarnpkg.com/buffer-reverse/-/buffer-reverse-1.0.1.tgz#49283c8efa6f901bc01fa3304d06027971ae2f60" integrity sha512-M87YIUBsZ6N924W57vDwT/aOu8hw7ZgdByz6ijksLjmHJELBASmYTTlNHRgjE+pTsT9oJXGaDSgqqwfdHotDUg== -buffer-shims@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51" - integrity sha512-Zy8ZXMyxIT6RMTeY7OP/bDndfj6bwCan7SS98CEndS6deHwWPpseeHlwarNcBim+etXnF9HBc1non5JgDaJU1g== - buffer-xor@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" @@ -3999,16 +3460,16 @@ buffer@^6.0.3: ieee754 "^1.2.1" bufferutil@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.8.tgz#1de6a71092d65d7766c4d8a522b261a6e787e8ea" - integrity sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw== + version "4.0.9" + resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.9.tgz#6e81739ad48a95cad45a279588e13e95e24a800a" + integrity sha512-WDtdLmJvAuNNPzByAYpRo2rF1Mmradw6gvWsQKf63476DDXmomT9zUiGypLcG4ibIM67vhAj8jJRdbmEws2Aqw== dependencies: node-gyp-build "^4.3.0" -bundle-require@^4.0.0: - version "4.0.2" - resolved "https://registry.yarnpkg.com/bundle-require/-/bundle-require-4.0.2.tgz#65fc74ff14eabbba36d26c9a6161bd78fff6b29e" - integrity sha512-jwzPOChofl67PSTW2SGubV9HBQAhhR2i6nskiOThauo9dzwDUgOWQScFVaJkjEfYX+UXiD+LEx8EblQMc2wIag== +bundle-require@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/bundle-require/-/bundle-require-5.1.0.tgz#8db66f41950da3d77af1ef3322f4c3e04009faee" + integrity sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA== dependencies: load-tsconfig "^0.2.3" @@ -4017,19 +3478,36 @@ bytes@3.1.2: resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== -cac@^6.7.12, cac@^6.7.14: +cac@^6.7.14: version "6.7.14" resolved "https://registry.yarnpkg.com/cac/-/cac-6.7.14.tgz#804e1e6f506ee363cb0e3ccbb09cad5dd9870959" integrity sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ== -call-bind@^1.0.0, call-bind@^1.0.2, call-bind@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.5.tgz#6fa2b7845ce0ea49bf4d8b9ef64727a2c2e2e513" - integrity sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ== +call-bind-apply-helpers@^1.0.0, call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz#4b5428c222be985d79c3d82657479dbe0b59b2d6" + integrity sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ== dependencies: + es-errors "^1.3.0" function-bind "^1.1.2" - get-intrinsic "^1.2.1" - set-function-length "^1.1.1" + +call-bind@^1.0.7, call-bind@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.8.tgz#0736a9660f537e3388826f440d5ec45f744eaa4c" + integrity sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww== + dependencies: + call-bind-apply-helpers "^1.0.0" + es-define-property "^1.0.0" + get-intrinsic "^1.2.4" + set-function-length "^1.2.2" + +call-bound@^1.0.2, call-bound@^1.0.3, call-bound@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/call-bound/-/call-bound-1.0.4.tgz#238de935d2a2a692928c538c7ccfa91067fd062a" + integrity sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg== + dependencies: + call-bind-apply-helpers "^1.0.2" + get-intrinsic "^1.3.0" callsites@^3.0.0: version "3.1.0" @@ -4041,16 +3519,7 @@ camelcase-css@^2.0.1: resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5" integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== -camelcase-keys@^6.2.2: - version "6.2.2" - resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-6.2.2.tgz#5e755d6ba51aa223ec7d3d52f25778210f9dc3c0" - integrity sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg== - dependencies: - camelcase "^5.3.1" - map-obj "^4.0.0" - quick-lru "^4.0.1" - -camelcase@^5.0.0, camelcase@^5.3.1: +camelcase@^5.0.0: version "5.3.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== @@ -4060,49 +3529,46 @@ camelcase@^6.0.0, camelcase@^6.2.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== -caniuse-lite@^1.0.30001406, caniuse-lite@^1.0.30001578, caniuse-lite@^1.0.30001580: - version "1.0.30001583" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001583.tgz#abb2970cc370801dc7e27bf290509dc132cfa390" - integrity sha512-acWTYaha8xfhA/Du/z4sNZjHUWjkiuoAi2LM+T/aL+kemKQgPT1xBb/YKjlQ0Qo8gvbHsGNplrEJ+9G3gL7i4Q== +caniuse-lite@^1.0.30001406, caniuse-lite@^1.0.30001688, caniuse-lite@^1.0.30001702: + version "1.0.30001703" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001703.tgz#977cb4920598c158f491ecf4f4f2cfed9e354718" + integrity sha512-kRlAGTRWgPsOj7oARC9m1okJEXdL/8fekFVcxA8Hl7GH4r/sN4OJn/i6Flde373T50KS7Y37oFbMwlE8+F42kQ== -cfonts@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/cfonts/-/cfonts-3.2.0.tgz#3c72b79679e48d19c620614d1134326a1f22cdec" - integrity sha512-CFGxRY6aBuOgK85bceCpmMMhuyO6IwcAyyeapB//DtRzm7NbAEsDuuZzBoQxVonz+C2BmZ3swqB/YgcmW+rh3A== +"cbw-sdk@npm:@coinbase/wallet-sdk@3.9.3": + version "3.9.3" + resolved "https://registry.yarnpkg.com/@coinbase/wallet-sdk/-/wallet-sdk-3.9.3.tgz#daf10cb0c85d0363315b7270cb3f02bedc408aab" + integrity sha512-N/A2DRIf0Y3PHc1XAMvbBUu4zisna6qAdqABMZwBMNEfWrXpAwx16pZGkYCLGE+Rvv1edbcB2LYDRnACNcmCiw== dependencies: - supports-color "^8" - window-size "^1.1.1" + bn.js "^5.2.1" + buffer "^6.0.3" + clsx "^1.2.1" + eth-block-tracker "^7.1.0" + eth-json-rpc-filters "^6.0.0" + eventemitter3 "^5.0.1" + keccak "^3.0.3" + preact "^10.16.0" + sha.js "^2.4.11" -chai@^4.3.10: - version "4.4.1" - resolved "https://registry.yarnpkg.com/chai/-/chai-4.4.1.tgz#3603fa6eba35425b0f2ac91a009fe924106e50d1" - integrity sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g== - dependencies: - assertion-error "^1.1.0" - check-error "^1.0.3" - deep-eql "^4.1.3" - get-func-name "^2.0.2" - loupe "^2.3.6" - pathval "^1.1.1" - type-detect "^4.0.8" - -chalk@5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.3.0.tgz#67c20a7ebef70e7f3970a01f90fa210cb6860385" - integrity sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w== +cfonts@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/cfonts/-/cfonts-3.3.0.tgz#53e80fa239c2dc8fb11b9c7c00ede2c8ceedb34c" + integrity sha512-RlVxeEw2FXWI5Bs9LD0/Ef3bsQIc9m6lK/DINN20HIW0Y0YHUO2jjy88cot9YKZITiRTCdWzTfLmTyx47HeSLA== + dependencies: + supports-color "^8" + window-size "^1" -chalk@^1.0.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" - integrity sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A== +chai@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/chai/-/chai-5.2.0.tgz#1358ee106763624114addf84ab02697e411c9c05" + integrity sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw== dependencies: - ansi-styles "^2.2.1" - escape-string-regexp "^1.0.2" - has-ansi "^2.0.0" - strip-ansi "^3.0.0" - supports-color "^2.0.0" + assertion-error "^2.0.1" + check-error "^2.1.1" + deep-eql "^5.0.1" + loupe "^3.1.0" + pathval "^2.0.0" -chalk@^2.1.0, chalk@^2.3.2, chalk@^2.4.2: +chalk@^2.3.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -4111,7 +3577,7 @@ chalk@^2.1.0, chalk@^2.3.2, chalk@^2.4.2: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.1, chalk@^4.1.2: +chalk@^4.0.0, chalk@^4.1.0: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== @@ -4124,29 +3590,12 @@ chardet@^0.7.0: resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== -check-error@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.3.tgz#a6502e4312a7ee969f646e83bb3ddd56281bd694" - integrity sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg== - dependencies: - get-func-name "^2.0.2" - -chokidar@3.5.3, chokidar@^3.5.1, chokidar@^3.5.2, chokidar@^3.5.3: - version "3.5.3" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" - integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== - dependencies: - anymatch "~3.1.2" - braces "~3.0.2" - glob-parent "~5.1.2" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.6.0" - optionalDependencies: - fsevents "~2.3.2" +check-error@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/check-error/-/check-error-2.1.1.tgz#87eb876ae71ee388fa0471fe423f494be1d96ccc" + integrity sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw== -chokidar@^3.4.0: +chokidar@^3.5.3, chokidar@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== @@ -4161,6 +3610,13 @@ chokidar@^3.4.0: optionalDependencies: fsevents "~2.3.2" +chokidar@^4.0.0, chokidar@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-4.0.3.tgz#7be37a4c03c9aee1ecfe862a4a23b2c70c205d30" + integrity sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA== + dependencies: + readdirp "^4.0.1" + ci-info@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" @@ -4172,21 +3628,14 @@ ci-info@^3.7.0: integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" - integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - -citty@^0.1.5: - version "0.1.5" - resolved "https://registry.yarnpkg.com/citty/-/citty-0.1.5.tgz#fe37ceae5dc764af75eb2fece99d2bf527ea4e50" - integrity sha512-AS7n5NSc0OQVMV9v6wt3ByujNIrne0/cTjiC2MYqhvao57VNfiuVksTSr2p17nVOhEr2KtqiAkGwHcgMC/qUuQ== + version "1.0.6" + resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.6.tgz#8fe672437d01cd6c4561af5334e0cc50ff1955f7" + integrity sha512-3Ek9H3X6pj5TgenXYtNWdaBon1tgYCaebd+XPg0keyjEbEfkD4KkmAxkQ/i1vYvxdcT5nscLBfq9VJRmCBcFSw== dependencies: - consola "^3.2.3" + inherits "^2.0.4" + safe-buffer "^5.2.1" -classnames@^2.3.0, classnames@^2.3.2, classnames@^2.5.1: +classnames@^2.3.0, classnames@^2.5.1: version "2.5.1" resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.5.1.tgz#ba774c614be0f016da105c858e7159eae8e7687b" integrity sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow== @@ -4201,27 +3650,12 @@ cli-boxes@^2.2.1: resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.1.tgz#ddd5035d25094fce220e9cab40a45840a440318f" integrity sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw== -cli-cursor@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-4.0.0.tgz#3cecfe3734bf4fe02a8361cbdc0f6fe28c6a57ea" - integrity sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg== - dependencies: - restore-cursor "^4.0.0" - -cli-table@^0.3.11: - version "0.3.11" - resolved "https://registry.yarnpkg.com/cli-table/-/cli-table-0.3.11.tgz#ac69cdecbe81dccdba4889b9a18b7da312a9d3ee" - integrity sha512-IqLQi4lO0nIB4tcdTpN4LCB9FI3uqrJZK7RC515EnhZ6qBaglkIgICb1wjeAqpdoOabm1+SuQtkXIPdYC93jhQ== - dependencies: - colors "1.0.3" - -cli-truncate@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-3.1.0.tgz#3f23ab12535e3d73e839bb43e73c9de487db1389" - integrity sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA== +cli-cursor@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-5.0.0.tgz#24a4831ecf5a6b01ddeb32fb71a4b2088b0dce38" + integrity sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw== dependencies: - slice-ansi "^5.0.0" - string-width "^5.0.0" + restore-cursor "^5.0.0" cli-truncate@^4.0.0: version "4.0.0" @@ -4231,38 +3665,29 @@ cli-truncate@^4.0.0: slice-ansi "^5.0.0" string-width "^7.0.0" -clide-js@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/clide-js/-/clide-js-0.2.0.tgz#00c1c9b5c2e84e73f5e349a11a229915e3806ba2" - integrity sha512-ZOGGjH2XFMs1eTfj2uqBcRri00XyoAuuDZ25ym0WOOKd/g6T7m8dSYe72bPq/9aoi2doQ3AOmRdhF0o167AkOw== +clide-js@^0.2.14-next.5: + version "0.2.14-next.5" + resolved "https://registry.yarnpkg.com/clide-js/-/clide-js-0.2.14-next.5.tgz#ad9d55e58677726378fad7b604d348cad016f583" + integrity sha512-W+0zVf6vUyl9ViyvJRt4vFPvMnZVkyApMfIqAvNLCPcwYOXTupF1w6wduQr5JMlNihHdcYOebmD6bu3Ow/yt2g== dependencies: + "@types/prompts" "^2.4.9" cliui "^8.0.1" prompts "^2.4.2" yargs-parser "^21.1.1" -clide-plugin-command-menu@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/clide-plugin-command-menu/-/clide-plugin-command-menu-0.1.0.tgz#41dd26ba6cd379b5b706d12e5e5d0d858f8a7ec7" - integrity sha512-E9Pfjnd0/TSVEc9ILcMALm4QaIguwzOV+peOK1fTJhVeRbTwBI0dVNJNCd/qHrQvV/jX3Lx9/A6xKDXTC3zYdg== +clide-plugin-command-menu@^0.1.2-next.0: + version "0.1.2-next.0" + resolved "https://registry.yarnpkg.com/clide-plugin-command-menu/-/clide-plugin-command-menu-0.1.2-next.0.tgz#dac53e9ce3f012a3258db3d3ad942c030b247b32" + integrity sha512-EANc7LHDJ/UKoNHryWpPDlOgmZNUbrZEnnb/1V6YhybFOltg04NjnJict8P3Tx3v2r5y6R/nSVFLngzOFt6gag== dependencies: - cfonts "^3.2.0" + cfonts "^3.3.0" colors "^1.4.0" - tesm-node "^1.3.1" client-only@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/client-only/-/client-only-0.0.1.tgz#38bba5d403c41ab150bff64a95c85013cf73bca1" integrity sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA== -clipboardy@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/clipboardy/-/clipboardy-4.0.0.tgz#e73ced93a76d19dd379ebf1f297565426dffdca1" - integrity sha512-5mOlNS0mhX0707P2I0aZ2V/cmHUEO/fL7VFLqszkhUsxt7RwnmrInf/eEQKlf5GzvYeHIjT+Ov1HRfNmymlG0w== - dependencies: - execa "^8.0.1" - is-wsl "^3.1.0" - is64bit "^2.0.0" - cliui@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" @@ -4295,21 +3720,16 @@ clone@^1.0.2: resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== -clsx@2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/clsx/-/clsx-2.1.0.tgz#e851283bcb5c80ee7608db18487433f7b23f77cb" - integrity sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg== +clsx@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/clsx/-/clsx-2.1.1.tgz#eed397c9fd8bd882bfb18deab7102049a2f32999" + integrity sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA== clsx@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.2.1.tgz#0ddc4a20a549b59c93a4116bb26f5294ca17dc12" integrity sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg== -cluster-key-slot@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz#88ddaa46906e303b5de30d3153b7d9fe0a0c19ac" - integrity sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA== - color-convert@^1.3.0, color-convert@^1.9.0: version "1.9.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" @@ -4355,11 +3775,6 @@ colorette@^2.0.20: resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== -colors@1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" - integrity sha512-pFGrxThWcWQ2MsAz6RtgeWe4NK2kUE1WfsrvvlctdII745EW9I0yflqhe7++M5LEc7bV2c/9/5zc8sFcpL0Drw== - colors@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" @@ -4385,45 +3800,35 @@ command-exists@^1.2.8: resolved "https://registry.yarnpkg.com/command-exists/-/command-exists-1.2.9.tgz#c50725af3808c8ab0260fd60b01fbfa25b954f69" integrity sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w== -commander@11.0.0: - version "11.0.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-11.0.0.tgz#43e19c25dbedc8256203538e8d7e9346877a6f67" - integrity sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ== - -commander@3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/commander/-/commander-3.0.2.tgz#6837c3fb677ad9933d1cfba42dd14d5117d6b39e" - integrity sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow== - commander@^4.0.0: version "4.1.1" resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== +commander@^8.1.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" + integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== + concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== -consola@^3.2.3: - version "3.2.3" - resolved "https://registry.yarnpkg.com/consola/-/consola-3.2.3.tgz#0741857aa88cfa0d6fd53f1cff0375136e98502f" - integrity sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ== - -convert-source-map@^1.5.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" - integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== +consola@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/consola/-/consola-3.4.0.tgz#4cfc9348fd85ed16a17940b3032765e31061ab88" + integrity sha512-EiPU8G6dQG0GFHNR8ljnZFki/8a+cQwEQ+7wpxdChl02Q8HXlwEZWD5lqAF8vC2sEC3Tehr8hy7vErz88LHyUA== convert-source-map@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== -cookie-es@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/cookie-es/-/cookie-es-1.0.0.tgz#4759684af168dfc54365b2c2dda0a8d7ee1e4865" - integrity sha512-mWYvfOLrfEc996hlKcdABeIiPHUPC6DM2QYZdGGOvhOTbA3tjm2eBwqlJpoFdjC89NI4Qt6h0Pu06Mp+1Pj5OQ== +cookie-es@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/cookie-es/-/cookie-es-1.2.2.tgz#18ceef9eb513cac1cb6c14bcbf8bdb2679b34821" + integrity sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg== cookie@^0.4.1: version "0.4.2" @@ -4431,26 +3836,15 @@ cookie@^0.4.1: integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== core-js@^3.31.1: - version "3.35.1" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.35.1.tgz#9c28f8b7ccee482796f8590cc8d15739eaaf980c" - integrity sha512-IgdsbxNyMskrTFxa9lWHyMwAJU5gXOPP+1yO+K59d50VLVAIDAbs7gIv705KzALModfK3ZrSZTPNpC0PQgIZuw== + version "3.41.0" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.41.0.tgz#57714dafb8c751a6095d028a7428f1fb5834a776" + integrity sha512-SJ4/EHwS36QMJd6h/Rg+GyR4A5xE0FSI3eZ+iBVpfqf1x0eTSg1smWLHrA+2jQThZSh97fmSgFSU8B61nxosxA== core-util-is@~1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== -cosmiconfig@^7.0.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.1.0.tgz#1443b9afa596b670082ea46cbd8f6a62b84635f6" - integrity sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA== - dependencies: - "@types/parse-json" "^4.0.0" - import-fresh "^3.2.1" - parse-json "^5.0.0" - path-type "^4.0.0" - yaml "^1.10.0" - crc-32@^1.2.0: version "1.2.2" resolved "https://registry.yarnpkg.com/crc-32/-/crc-32-1.2.2.tgz#3cad35a934b8bf71f25ca524b6da51fb7eace2ff" @@ -4479,47 +3873,35 @@ create-hmac@^1.1.4, create-hmac@^1.1.7: safe-buffer "^5.0.1" sha.js "^2.4.8" -create-require@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" - integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== - cross-fetch@^3.1.4, cross-fetch@^3.1.5: - version "3.1.8" - resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.8.tgz#0327eba65fd68a7d119f8fb2bf9334a1a7956f82" - integrity sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg== + version "3.2.0" + resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.2.0.tgz#34e9192f53bc757d6614304d9e5e6fb4edb782e3" + integrity sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q== dependencies: - node-fetch "^2.6.12" + node-fetch "^2.7.0" cross-fetch@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-4.0.0.tgz#f037aef1580bb3a1a35164ea2a848ba81b445983" - integrity sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g== - dependencies: - node-fetch "^2.6.12" - -cross-spawn@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" - integrity sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A== + version "4.1.0" + resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-4.1.0.tgz#8f69355007ee182e47fa692ecbaa37a52e43c3d2" + integrity sha512-uKm5PU+MHTootlWEY+mZ4vvXoCn4fLQxT9dSc1sXVMSFkINTJVN8cAQROpwcKm8bJ/c7rgZVIBWzH5T78sNZZw== dependencies: - lru-cache "^4.0.1" - shebang-command "^1.2.0" - which "^1.2.9" + node-fetch "^2.7.0" -cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: - version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== +cross-spawn@^7.0.2, cross-spawn@^7.0.5, cross-spawn@^7.0.6: + version "7.0.6" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" + integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== dependencies: path-key "^3.1.0" shebang-command "^2.0.0" which "^2.0.1" -crossws@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/crossws/-/crossws-0.1.1.tgz#3a85a8140568e4828d9747a884171ea7e6a8bbe2" - integrity sha512-c9c/o7bS3OjsdpSkvexpka0JNlesBF2JU9B2V1yNsYGwRbAafxhJQ7VI9b48D5bpONz/oxbPGMzBojy9sXoQIQ== +crossws@^0.3.3: + version "0.3.4" + resolved "https://registry.yarnpkg.com/crossws/-/crossws-0.3.4.tgz#06164c6495ea99152ea7557c99310b52d9be9b29" + integrity sha512-uj0O1ETYX1Bh6uSgktfPvwDiPYGQ3aI4qVsaC/LWpkIzGj1nUYm5FK3K+t11oOlpN01lGbprFCH4wBlKdJjVgw== + dependencies: + uncrypto "^0.1.3" crypto-js@^4.1.1, crypto-js@^4.2.0: version "4.2.0" @@ -4544,36 +3926,11 @@ cssesc@^3.0.0: resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== -csstype@^3.0.2, csstype@^3.0.7: +csstype@^3.0.2, csstype@^3.0.7, csstype@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== -csv-generate@^3.4.3: - version "3.4.3" - resolved "https://registry.yarnpkg.com/csv-generate/-/csv-generate-3.4.3.tgz#bc42d943b45aea52afa896874291da4b9108ffff" - integrity sha512-w/T+rqR0vwvHqWs/1ZyMDWtHHSJaN06klRqJXBEpDJaM/+dZkso0OKh1VcuuYvK3XM53KysVNq8Ko/epCK8wOw== - -csv-parse@^4.16.3: - version "4.16.3" - resolved "https://registry.yarnpkg.com/csv-parse/-/csv-parse-4.16.3.tgz#7ca624d517212ebc520a36873c3478fa66efbaf7" - integrity sha512-cO1I/zmz4w2dcKHVvpCr7JVRu8/FymG5OEpmvsZYlccYolPBLoVGKUHgNoc4ZGkFeFlWGEDmMyBM+TTqRdW/wg== - -csv-stringify@^5.6.5: - version "5.6.5" - resolved "https://registry.yarnpkg.com/csv-stringify/-/csv-stringify-5.6.5.tgz#c6d74badda4b49a79bf4e72f91cce1e33b94de00" - integrity sha512-PjiQ659aQ+fUTQqSrd1XEDnOr52jh30RBurfzkscaE2tPaFsDH5wOAHJiw8XAHphRknCwMUE9KRayc4K/NbO8A== - -csv@^5.5.3: - version "5.5.3" - resolved "https://registry.yarnpkg.com/csv/-/csv-5.5.3.tgz#cd26c1e45eae00ce6a9b7b27dcb94955ec95207d" - integrity sha512-QTaY0XjjhTQOdguARF0lGKm5/mEq9PD9/VhZZegHDIBq2tQwgNpHc3dneD4mGo2iJs+fTKv5Bp0fZ+BRuY3Z0g== - dependencies: - csv-generate "^3.4.3" - csv-parse "^4.16.3" - csv-stringify "^5.6.5" - stream-transform "^2.1.3" - culori@^3: version "3.3.0" resolved "https://registry.yarnpkg.com/culori/-/culori-3.3.0.tgz#e33530adbd124d53bd6550394397e695eaaed739" @@ -4589,10 +3946,10 @@ d3-format@^3.1.0: resolved "https://registry.yarnpkg.com/d3-format/-/d3-format-3.1.0.tgz#9260e23a28ea5cb109e93b21a06e24e2ebd55641" integrity sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA== -daisyui@^4.7.2: - version "4.7.2" - resolved "https://registry.yarnpkg.com/daisyui/-/daisyui-4.7.2.tgz#d2359d9eb1cac2082302ca55b6b35eca437a011f" - integrity sha512-9UCss12Zmyk/22u+JbkVrHHxOzFOyY17HuqP5LeswI4hclbj6qbjJTovdj2zRy8cCH6/n6Wh0lTLjriGnyGh0g== +daisyui@^4.12.23: + version "4.12.24" + resolved "https://registry.yarnpkg.com/daisyui/-/daisyui-4.12.24.tgz#f98d26f8032335d4bfacb85f75af75341815dae8" + integrity sha512-JYg9fhQHOfXyLadrBrEqCDM6D5dWCSSiM6eTNCRrBRzx/VlOCrLS8eDfIw9RVvs64v2mJdLooKXY8EwQzoszAA== dependencies: css-selector-tokenizer "^0.8" culori "^3" @@ -4604,6 +3961,33 @@ damerau-levenshtein@^1.0.8: resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz#b43d286ccbd36bc5b2f7ed41caf2d0aba1f8a6e7" integrity sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA== +data-view-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/data-view-buffer/-/data-view-buffer-1.0.2.tgz#211a03ba95ecaf7798a8c7198d79536211f88570" + integrity sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ== + dependencies: + call-bound "^1.0.3" + es-errors "^1.3.0" + is-data-view "^1.0.2" + +data-view-byte-length@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz#9e80f7ca52453ce3e93d25a35318767ea7704735" + integrity sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ== + dependencies: + call-bound "^1.0.3" + es-errors "^1.3.0" + is-data-view "^1.0.2" + +data-view-byte-offset@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz#068307f9b71ab76dbbe10291389e020856606191" + integrity sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + is-data-view "^1.0.1" + date-fns@^2.29.3: version "2.30.0" resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.30.0.tgz#f367e644839ff57894ec6ac480de40cae4b0f4d0" @@ -4611,17 +3995,17 @@ date-fns@^2.29.3: dependencies: "@babel/runtime" "^7.21.0" -date-fns@^3.3.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-3.3.1.tgz#7581daca0892d139736697717a168afbb908cfed" - integrity sha512-y8e109LYGgoQDveiEBD3DYXKba1jWf5BA8YU1FL5Tvm0BTdEfy54WLCwnuYWZNnzzvALy/QQ4Hov+Q9RVRv+Zw== +date-fns@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-4.1.0.tgz#64b3d83fff5aa80438f5b1a633c2e83b8a1c2d14" + integrity sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg== -debug@4, debug@4.3.4, debug@^4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4, debug@~4.3.1, debug@~4.3.2: - version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== +debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.3.5, debug@^4.3.7, debug@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.0.tgz#2b3f2aea2ffeb776477460267377dc8710faba8a" + integrity sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA== dependencies: - ms "2.1.2" + ms "^2.1.3" debug@^3.2.7: version "3.2.7" @@ -4630,15 +4014,14 @@ debug@^3.2.7: dependencies: ms "^2.1.1" -decamelize-keys@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.1.tgz#04a2d523b2f18d80d0158a43b895d56dff8d19d8" - integrity sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg== +debug@~4.3.1, debug@~4.3.2: + version "4.3.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.7.tgz#87945b4151a011d76d95a198d7111c865c360a52" + integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ== dependencies: - decamelize "^1.1.0" - map-obj "^1.0.0" + ms "^2.1.3" -decamelize@^1.1.0, decamelize@^1.2.0: +decamelize@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== @@ -4653,36 +4036,15 @@ decode-uri-component@^0.2.2: resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz#e69dbe25d37941171dd540e024c444cd5188e1e9" integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ== -deep-eql@^4.1.3: - version "4.1.3" - resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-4.1.3.tgz#7c7775513092f7df98d8df9996dd085eb668cc6d" - integrity sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw== - dependencies: - type-detect "^4.0.0" +dedent@^1.5.3: + version "1.5.3" + resolved "https://registry.yarnpkg.com/dedent/-/dedent-1.5.3.tgz#99aee19eb9bae55a67327717b6e848d0bf777e5a" + integrity sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ== -deep-equal@^2.2.3: - version "2.2.3" - resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-2.2.3.tgz#af89dafb23a396c7da3e862abc0be27cf51d56e1" - integrity sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA== - dependencies: - array-buffer-byte-length "^1.0.0" - call-bind "^1.0.5" - es-get-iterator "^1.1.3" - get-intrinsic "^1.2.2" - is-arguments "^1.1.1" - is-array-buffer "^3.0.2" - is-date-object "^1.0.5" - is-regex "^1.1.4" - is-shared-array-buffer "^1.0.2" - isarray "^2.0.5" - object-is "^1.1.5" - object-keys "^1.1.1" - object.assign "^4.1.4" - regexp.prototype.flags "^1.5.1" - side-channel "^1.0.4" - which-boxed-primitive "^1.0.2" - which-collection "^1.0.1" - which-typed-array "^1.1.13" +deep-eql@^5.0.1: + version "5.0.2" + resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-5.0.2.tgz#4b756d8d770a9257300825d52a2c2cff99c3a341" + integrity sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q== deep-is@^0.1.3: version "0.1.4" @@ -4699,28 +4061,16 @@ deepmerge@^4.2.2: resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== -defaults@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.4.tgz#b0b02062c1e2aa62ff5d9528f0f98baa90978d7a" - integrity sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A== - dependencies: - clone "^1.0.2" - -define-data-property@^1.0.1, define-data-property@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.1.tgz#c35f7cd0ab09883480d12ac5cb213715587800b3" - integrity sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ== +define-data-property@^1.0.1, define-data-property@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" + integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== dependencies: - get-intrinsic "^1.2.1" + es-define-property "^1.0.0" + es-errors "^1.3.0" gopd "^1.0.1" - has-property-descriptors "^1.0.0" -define-lazy-prop@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" - integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== - -define-properties@^1.1.3, define-properties@^1.2.0, define-properties@^1.2.1: +define-properties@^1.1.3, define-properties@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== @@ -4736,12 +4086,7 @@ define-property@^1.0.0: dependencies: is-descriptor "^1.0.0" -defined@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.1.tgz#c0b9db27bfaffd95d6f61399419b893df0f91ebf" - integrity sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q== - -defu@^6.1.3, defu@^6.1.4: +defu@^6.1.4: version "6.1.4" resolved "https://registry.yarnpkg.com/defu/-/defu-6.1.4.tgz#4e0c9cf9ff68fe5f3d7f2765cc1a012dfdcb0479" integrity sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg== @@ -4751,25 +4096,15 @@ delayed-stream@~1.0.0: resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== -denque@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/denque/-/denque-2.1.0.tgz#e93e1a6569fb5e66f16a3c2a2964617d349d6ab1" - integrity sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw== - depd@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== -dequal@^2.0.3: +destr@^2.0.3: version "2.0.3" - resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" - integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== - -destr@^2.0.1, destr@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/destr/-/destr-2.0.2.tgz#8d3c0ee4ec0a76df54bc8b819bca215592a8c218" - integrity sha512-65AlobnZMiCET00KaFFjUefxDX0khFA/E4myqZ7a6Sq1yZtR8+FVIvilVX66vF2uobSumxooYZChiRPCKNqhmg== + resolved "https://registry.yarnpkg.com/destr/-/destr-2.0.3.tgz#7f9e97cb3d16dbdca7be52aca1644ce402cfe449" + integrity sha512-2N3BOUU4gYMpTP24s5rF5iP7BDr7uNTCs4ozw3kf/eKfvWSIu93GEBi5m427YoyJoeOzQ5smuu4nNAPGb8idSQ== detect-browser@5.3.0, detect-browser@^5.2.0: version "5.3.0" @@ -4781,10 +4116,10 @@ detect-indent@^6.0.0: resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-6.1.0.tgz#592485ebbbf6b3b1ab2be175c8393d04ca0d57e6" integrity sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA== -detect-libc@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" - integrity sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg== +detect-libc@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.3.tgz#f0cd503b40f9939b894697d19ad50895e30cf700" + integrity sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw== detect-node-es@^1.1.0: version "1.1.0" @@ -4796,22 +4131,7 @@ didyoumean@^1.2.2: resolved "https://registry.yarnpkg.com/didyoumean/-/didyoumean-1.2.2.tgz#989346ffe9e839b4555ecf5666edea0d3e8ad037" integrity sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw== -diff-sequences@^29.6.3: - version "29.6.3" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.6.3.tgz#4deaf894d11407c51efc8418012f9e70b84ea921" - integrity sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q== - -diff@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" - integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== - -diff@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" - integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== - -diff@^5.1.0: +diff@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/diff/-/diff-5.2.0.tgz#26ded047cd1179b78b9537d5ef725503ce1ae531" integrity sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A== @@ -4859,56 +4179,54 @@ dotenv@16.0.3: resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.0.3.tgz#115aec42bac5053db3c456db30cc243a5a836a07" integrity sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ== -dotenv@^16.4.5: - version "16.4.5" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.5.tgz#cdd3b3b604cb327e286b4762e13502f717cb099f" - integrity sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg== +dotenv@^16.4.5, dotenv@^16.4.7: + version "16.4.7" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.7.tgz#0e20c5b82950140aa99be360a8a5f52335f53c26" + integrity sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ== -dotignore@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/dotignore/-/dotignore-0.1.2.tgz#f942f2200d28c3a76fbdd6f0ee9f3257c8a2e905" - integrity sha512-UGGGWfSauusaVJC+8fgV+NVvBXkCTmVv7sk6nojDZZvuOUNGUy0Zk4UpHQD6EDjS0jpBwcACvH4eofvyzBcRDw== +dunder-proto@^1.0.0, dunder-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a" + integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== dependencies: - minimatch "^3.0.4" - -duplexer@^0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" - integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== + call-bind-apply-helpers "^1.0.1" + es-errors "^1.3.0" + gopd "^1.2.0" duplexify@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-4.1.2.tgz#18b4f8d28289132fa0b9573c898d9f903f81c7b0" - integrity sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw== + version "4.1.3" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-4.1.3.tgz#a07e1c0d0a2c001158563d32592ba58bddb0236f" + integrity sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA== dependencies: end-of-stream "^1.4.1" inherits "^2.0.3" readable-stream "^3.1.1" - stream-shift "^1.0.0" + stream-shift "^1.0.2" eastasianwidth@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== -eciesjs@^0.3.15, eciesjs@^0.3.16: - version "0.3.18" - resolved "https://registry.yarnpkg.com/eciesjs/-/eciesjs-0.3.18.tgz#67b5d73a8466e40a45bbc2f2a3177e71e9c0643d" - integrity sha512-RQhegEtLSyIiGJmFTZfvCTHER/fymipXFVx6OwSRYD6hOuy+6Kjpk0dGvIfP9kxn/smBpxQy71uxpGO406ITCw== +eciesjs@^0.4.11: + version "0.4.14" + resolved "https://registry.yarnpkg.com/eciesjs/-/eciesjs-0.4.14.tgz#a48c527f7754b4390dfd7e863fe0166c1972be94" + integrity sha512-eJAgf9pdv214Hn98FlUzclRMYWF7WfoLlkS9nWMTm1qcCwn6Ad4EGD9lr9HXMBfSrZhYQujRE+p0adPRkctC6A== dependencies: - "@types/secp256k1" "^4.0.4" - futoin-hkdf "^1.5.3" - secp256k1 "^5.0.0" + "@ecies/ciphers" "^0.2.2" + "@noble/ciphers" "^1.0.0" + "@noble/curves" "^1.6.0" + "@noble/hashes" "^1.5.0" -electron-to-chromium@^1.4.648: - version "1.4.656" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.656.tgz#b374fb7cab9b782a5bc967c0ce0e19826186b9c9" - integrity sha512-9AQB5eFTHyR3Gvt2t/NwR0le2jBSUNwCnMbUCejFWHD+so4tH40/dRLgoE+jxlPeWS43XJewyvCv+I8LPMl49Q== +electron-to-chromium@^1.5.73: + version "1.5.114" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.114.tgz#f2bb4fda80a7db4ea273565e75b0ebbe19af0ac3" + integrity sha512-DFptFef3iktoKlFQK/afbo274/XNWD00Am0xa7M8FZUepHlHT8PEuiNBoRfFHbH1okqN58AlhbJ4QTkcnXorjA== -elliptic@6.5.4, elliptic@^6.5.2, elliptic@^6.5.4: - version "6.5.4" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" - integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== +elliptic@6.6.1, elliptic@^6.5.2, elliptic@^6.5.7: + version "6.6.1" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.6.1.tgz#3b8ffb02670bf69e382c7f65bf524c97c5405c06" + integrity sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g== dependencies: bn.js "^4.11.9" brorand "^1.1.0" @@ -4919,9 +4237,9 @@ elliptic@6.5.4, elliptic@^6.5.2, elliptic@^6.5.4: minimalistic-crypto-utils "^1.0.1" emoji-regex@^10.3.0: - version "10.3.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-10.3.0.tgz#76998b9268409eb3dae3de989254d456e70cfe23" - integrity sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw== + version "10.4.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-10.4.0.tgz#03553afea80b3975749cfcb36f776ca268e413d4" + integrity sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw== emoji-regex@^8.0.0: version "8.0.0" @@ -4938,38 +4256,38 @@ encode-utf8@^1.0.3: resolved "https://registry.yarnpkg.com/encode-utf8/-/encode-utf8-1.0.3.tgz#f30fdd31da07fb596f281beb2f6b027851994cda" integrity sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw== -end-of-stream@^1.1.0, end-of-stream@^1.4.0, end-of-stream@^1.4.1, end-of-stream@^1.4.4: +end-of-stream@^1.1.0, end-of-stream@^1.4.0, end-of-stream@^1.4.1: version "1.4.4" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== dependencies: once "^1.4.0" -engine.io-client@~6.5.2: - version "6.5.3" - resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-6.5.3.tgz#4cf6fa24845029b238f83c628916d9149c399bc5" - integrity sha512-9Z0qLB0NIisTRt1DZ/8U2k12RJn8yls/nXMZLn+/N8hANT3TcYjKFKcwbw5zFQiN4NTde3TSY9zb79e1ij6j9Q== +engine.io-client@~6.6.1: + version "6.6.3" + resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-6.6.3.tgz#815393fa24f30b8e6afa8f77ccca2f28146be6de" + integrity sha512-T0iLjnyNWahNyv/lcjS2y4oE358tVS/SYQNxYXGAJ9/GLgH4VCvOQ/mhTjqU88mLZCQgiG8RIegFHYCdVC+j5w== dependencies: "@socket.io/component-emitter" "~3.1.0" debug "~4.3.1" engine.io-parser "~5.2.1" - ws "~8.11.0" - xmlhttprequest-ssl "~2.0.0" + ws "~8.17.1" + xmlhttprequest-ssl "~2.1.1" engine.io-parser@~5.2.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-5.2.1.tgz#9f213c77512ff1a6cc0c7a86108a7ffceb16fcfb" - integrity sha512-9JktcM3u18nU9N2Lz3bWeBgxVgOKpw7yhRaoxQA3FUDZzzw+9WlA6p4G4u0RixNkg14fH7EfEc/RhpurtiROTQ== + version "5.2.3" + resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-5.2.3.tgz#00dc5b97b1f233a23c9398d0209504cf5f94d92f" + integrity sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q== -enhanced-resolve@^5.10.0, enhanced-resolve@^5.12.0: - version "5.15.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz#1af946c7d93603eb88e9896cee4904dc012e9c35" - integrity sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg== +enhanced-resolve@^5.10.0, enhanced-resolve@^5.15.0, enhanced-resolve@^5.18.1: + version "5.18.1" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz#728ab082f8b7b6836de51f1637aab5d3b9568faf" + integrity sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg== dependencies: graceful-fs "^4.2.4" tapable "^2.2.0" -enquirer@^2.3.0: +enquirer@^2.3.0, enquirer@^2.4.1: version "2.4.1" resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.4.1.tgz#93334b3fbd74fc7097b224ab4a8fb7e40bf4ae56" integrity sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ== @@ -4977,11 +4295,21 @@ enquirer@^2.3.0: ansi-colors "^4.1.1" strip-ansi "^6.0.1" +entities@^4.4.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" + integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== + env-paths@^2.2.0: version "2.2.1" resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== +environment@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/environment/-/environment-1.1.0.tgz#8e86c66b180f363c7ab311787e0259665f45a9f1" + integrity sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q== + err-code@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/err-code/-/err-code-3.0.1.tgz#a444c7b992705f2b120ee320b09972eef331c920" @@ -5001,173 +4329,188 @@ error-stack-parser@^1.3.6: dependencies: stackframe "^0.3.1" -es-abstract@^1.22.1: - version "1.22.3" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.22.3.tgz#48e79f5573198de6dee3589195727f4f74bc4f32" - integrity sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA== - dependencies: - array-buffer-byte-length "^1.0.0" - arraybuffer.prototype.slice "^1.0.2" - available-typed-arrays "^1.0.5" - call-bind "^1.0.5" - es-set-tostringtag "^2.0.1" - es-to-primitive "^1.2.1" - function.prototype.name "^1.1.6" - get-intrinsic "^1.2.2" - get-symbol-description "^1.0.0" - globalthis "^1.0.3" - gopd "^1.0.1" - has-property-descriptors "^1.0.0" - has-proto "^1.0.1" - has-symbols "^1.0.3" - hasown "^2.0.0" - internal-slot "^1.0.5" - is-array-buffer "^3.0.2" +es-abstract@^1.17.5, es-abstract@^1.23.2, es-abstract@^1.23.3, es-abstract@^1.23.5, es-abstract@^1.23.6, es-abstract@^1.23.9: + version "1.23.9" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.9.tgz#5b45994b7de78dada5c1bebf1379646b32b9d606" + integrity sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA== + dependencies: + array-buffer-byte-length "^1.0.2" + arraybuffer.prototype.slice "^1.0.4" + available-typed-arrays "^1.0.7" + call-bind "^1.0.8" + call-bound "^1.0.3" + data-view-buffer "^1.0.2" + data-view-byte-length "^1.0.2" + data-view-byte-offset "^1.0.1" + es-define-property "^1.0.1" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + es-set-tostringtag "^2.1.0" + es-to-primitive "^1.3.0" + function.prototype.name "^1.1.8" + get-intrinsic "^1.2.7" + get-proto "^1.0.0" + get-symbol-description "^1.1.0" + globalthis "^1.0.4" + gopd "^1.2.0" + has-property-descriptors "^1.0.2" + has-proto "^1.2.0" + has-symbols "^1.1.0" + hasown "^2.0.2" + internal-slot "^1.1.0" + is-array-buffer "^3.0.5" is-callable "^1.2.7" - is-negative-zero "^2.0.2" - is-regex "^1.1.4" - is-shared-array-buffer "^1.0.2" - is-string "^1.0.7" - is-typed-array "^1.1.12" - is-weakref "^1.0.2" - object-inspect "^1.13.1" + is-data-view "^1.0.2" + is-regex "^1.2.1" + is-shared-array-buffer "^1.0.4" + is-string "^1.1.1" + is-typed-array "^1.1.15" + is-weakref "^1.1.0" + math-intrinsics "^1.1.0" + object-inspect "^1.13.3" object-keys "^1.1.1" - object.assign "^4.1.4" - regexp.prototype.flags "^1.5.1" - safe-array-concat "^1.0.1" - safe-regex-test "^1.0.0" - string.prototype.trim "^1.2.8" - string.prototype.trimend "^1.0.7" - string.prototype.trimstart "^1.0.7" - typed-array-buffer "^1.0.0" - typed-array-byte-length "^1.0.0" - typed-array-byte-offset "^1.0.0" - typed-array-length "^1.0.4" - unbox-primitive "^1.0.2" - which-typed-array "^1.1.13" - -es-errors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.0.0.tgz#1936450fb8cff7bffb969335d0e55dfca7279aab" - integrity sha512-yHV74THqMJUyFKkHyN7hyENcEZM3Dj2a2IrdClY+IT4BFQHkIVwlh8s6uZfjsFydMdNHv0F5mWgAA3ajFbsvVQ== + object.assign "^4.1.7" + own-keys "^1.0.1" + regexp.prototype.flags "^1.5.3" + safe-array-concat "^1.1.3" + safe-push-apply "^1.0.0" + safe-regex-test "^1.1.0" + set-proto "^1.0.0" + string.prototype.trim "^1.2.10" + string.prototype.trimend "^1.0.9" + string.prototype.trimstart "^1.0.8" + typed-array-buffer "^1.0.3" + typed-array-byte-length "^1.0.3" + typed-array-byte-offset "^1.0.4" + typed-array-length "^1.0.7" + unbox-primitive "^1.1.0" + which-typed-array "^1.1.18" + +es-define-property@^1.0.0, es-define-property@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa" + integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== -es-get-iterator@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.3.tgz#3ef87523c5d464d41084b2c3c9c214f1199763d6" - integrity sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.3" - has-symbols "^1.0.3" - is-arguments "^1.1.1" - is-map "^2.0.2" - is-set "^2.0.2" - is-string "^1.0.7" - isarray "^2.0.5" - stop-iteration-iterator "^1.0.0" +es-errors@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" + integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== -es-iterator-helpers@^1.0.12, es-iterator-helpers@^1.0.15: - version "1.0.15" - resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.0.15.tgz#bd81d275ac766431d19305923707c3efd9f1ae40" - integrity sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g== +es-iterator-helpers@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz#d1dd0f58129054c0ad922e6a9a1e65eef435fe75" + integrity sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w== dependencies: - asynciterator.prototype "^1.0.0" - call-bind "^1.0.2" + call-bind "^1.0.8" + call-bound "^1.0.3" define-properties "^1.2.1" - es-abstract "^1.22.1" - es-set-tostringtag "^2.0.1" - function-bind "^1.1.1" - get-intrinsic "^1.2.1" - globalthis "^1.0.3" - has-property-descriptors "^1.0.0" - has-proto "^1.0.1" - has-symbols "^1.0.3" - internal-slot "^1.0.5" - iterator.prototype "^1.1.2" - safe-array-concat "^1.0.1" + es-abstract "^1.23.6" + es-errors "^1.3.0" + es-set-tostringtag "^2.0.3" + function-bind "^1.1.2" + get-intrinsic "^1.2.6" + globalthis "^1.0.4" + gopd "^1.2.0" + has-property-descriptors "^1.0.2" + has-proto "^1.2.0" + has-symbols "^1.1.0" + internal-slot "^1.1.0" + iterator.prototype "^1.1.4" + safe-array-concat "^1.1.3" + +es-module-lexer@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.6.0.tgz#da49f587fd9e68ee2404fe4e256c0c7d3a81be21" + integrity sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ== -es-set-tostringtag@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz#11f7cc9f63376930a5f20be4915834f4bc74f9c9" - integrity sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q== +es-object-atoms@^1.0.0, es-object-atoms@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz#1c4f2c4837327597ce69d2ca190a7fdd172338c1" + integrity sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA== dependencies: - get-intrinsic "^1.2.2" - has-tostringtag "^1.0.0" - hasown "^2.0.0" + es-errors "^1.3.0" -es-shim-unscopables@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz#1f6942e71ecc7835ed1c8a83006d8771a63a3763" - integrity sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw== +es-set-tostringtag@^2.0.3, es-set-tostringtag@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz#f31dbbe0c183b00a6d26eb6325c810c0fd18bd4d" + integrity sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA== dependencies: - hasown "^2.0.0" + es-errors "^1.3.0" + get-intrinsic "^1.2.6" + has-tostringtag "^1.0.2" + hasown "^2.0.2" -es-to-primitive@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" - integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== +es-shim-unscopables@^1.0.2: + version "1.1.0" + resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz#438df35520dac5d105f3943d927549ea3b00f4b5" + integrity sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw== + dependencies: + hasown "^2.0.2" + +es-to-primitive@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.3.0.tgz#96c89c82cc49fd8794a24835ba3e1ff87f214e18" + integrity sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g== dependencies: - is-callable "^1.1.4" - is-date-object "^1.0.1" - is-symbol "^1.0.2" + is-callable "^1.2.7" + is-date-object "^1.0.5" + is-symbol "^1.0.4" -esbuild@^0.19.2, esbuild@^0.19.3: - version "0.19.12" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.19.12.tgz#dc82ee5dc79e82f5a5c3b4323a2a641827db3e04" - integrity sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg== +esbuild@^0.25.0, esbuild@~0.25.0: + version "0.25.1" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.25.1.tgz#a16b8d070b6ad4871935277bda6ccfe852e3fa2f" + integrity sha512-BGO5LtrGC7vxnqucAe/rmvKdJllfGaYWdyABvyMoXQlfYMb2bbRuReWR5tEGE//4LcNJj9XrkovTqNYRFZHAMQ== optionalDependencies: - "@esbuild/aix-ppc64" "0.19.12" - "@esbuild/android-arm" "0.19.12" - "@esbuild/android-arm64" "0.19.12" - "@esbuild/android-x64" "0.19.12" - "@esbuild/darwin-arm64" "0.19.12" - "@esbuild/darwin-x64" "0.19.12" - "@esbuild/freebsd-arm64" "0.19.12" - "@esbuild/freebsd-x64" "0.19.12" - "@esbuild/linux-arm" "0.19.12" - "@esbuild/linux-arm64" "0.19.12" - "@esbuild/linux-ia32" "0.19.12" - "@esbuild/linux-loong64" "0.19.12" - "@esbuild/linux-mips64el" "0.19.12" - "@esbuild/linux-ppc64" "0.19.12" - "@esbuild/linux-riscv64" "0.19.12" - "@esbuild/linux-s390x" "0.19.12" - "@esbuild/linux-x64" "0.19.12" - "@esbuild/netbsd-x64" "0.19.12" - "@esbuild/openbsd-x64" "0.19.12" - "@esbuild/sunos-x64" "0.19.12" - "@esbuild/win32-arm64" "0.19.12" - "@esbuild/win32-ia32" "0.19.12" - "@esbuild/win32-x64" "0.19.12" - -escalade@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" - integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + "@esbuild/aix-ppc64" "0.25.1" + "@esbuild/android-arm" "0.25.1" + "@esbuild/android-arm64" "0.25.1" + "@esbuild/android-x64" "0.25.1" + "@esbuild/darwin-arm64" "0.25.1" + "@esbuild/darwin-x64" "0.25.1" + "@esbuild/freebsd-arm64" "0.25.1" + "@esbuild/freebsd-x64" "0.25.1" + "@esbuild/linux-arm" "0.25.1" + "@esbuild/linux-arm64" "0.25.1" + "@esbuild/linux-ia32" "0.25.1" + "@esbuild/linux-loong64" "0.25.1" + "@esbuild/linux-mips64el" "0.25.1" + "@esbuild/linux-ppc64" "0.25.1" + "@esbuild/linux-riscv64" "0.25.1" + "@esbuild/linux-s390x" "0.25.1" + "@esbuild/linux-x64" "0.25.1" + "@esbuild/netbsd-arm64" "0.25.1" + "@esbuild/netbsd-x64" "0.25.1" + "@esbuild/openbsd-arm64" "0.25.1" + "@esbuild/openbsd-x64" "0.25.1" + "@esbuild/sunos-x64" "0.25.1" + "@esbuild/win32-arm64" "0.25.1" + "@esbuild/win32-ia32" "0.25.1" + "@esbuild/win32-x64" "0.25.1" + +escalade@^3.1.1, escalade@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" + integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== -escape-string-regexp@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" - integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== -escape-string-regexp@4.0.0, escape-string-regexp@^4.0.0: +escape-string-regexp@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== -escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== - eslint-config-next@^14.1.0: - version "14.1.0" - resolved "https://registry.yarnpkg.com/eslint-config-next/-/eslint-config-next-14.1.0.tgz#7e309d426b8afacaba3b32fdbb02ba220b6d0a97" - integrity sha512-SBX2ed7DoRFXC6CQSLc/SbLY9Ut6HxNB2wPTcoIWjUMd7aF7O/SIE7111L8FdZ9TXsNV4pulUDnfthpyPtbFUg== + version "14.2.24" + resolved "https://registry.yarnpkg.com/eslint-config-next/-/eslint-config-next-14.2.24.tgz#da232b0c7f768c0d5c11e1cab9df20351cf3f602" + integrity sha512-9r1ujK++Pgpfixr5+DQ6rXDIQmSzuDbBlAQYMkJRMz9KWqovX7ESUTC0EAyBfOCl3ubkoeplw+aoXDuih3A8fw== dependencies: - "@next/eslint-plugin-next" "14.1.0" + "@next/eslint-plugin-next" "14.2.24" "@rushstack/eslint-patch" "^1.3.3" - "@typescript-eslint/parser" "^5.4.2 || ^6.0.0" + "@typescript-eslint/eslint-plugin" "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0" + "@typescript-eslint/parser" "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0" eslint-import-resolver-node "^0.3.6" eslint-import-resolver-typescript "^3.5.2" eslint-plugin-import "^2.28.1" @@ -5181,11 +4524,11 @@ eslint-config-prettier@^9.1.0: integrity sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw== eslint-config-turbo@latest: - version "1.12.2" - resolved "https://registry.yarnpkg.com/eslint-config-turbo/-/eslint-config-turbo-1.12.2.tgz#0f5a2f8aba495f481e7d0f514afaf71edce1f6b3" - integrity sha512-JHTGtDQuISBEWIorHenu5AeX1nv16NiDgDVRi1i0VyeYw0SiVh+lSQbv4BawXSnG1nOFpjbopAQdZvdB3PwXbQ== + version "2.4.4" + resolved "https://registry.yarnpkg.com/eslint-config-turbo/-/eslint-config-turbo-2.4.4.tgz#b7c2f5b825bc90775c7492d180b7fb89b3b1c5cc" + integrity sha512-4w/heWywWkFw09a5MY5lCvb9suJlhBSkzNtGTwM5+zRif4rksubaMYy1pD0++5rqoDVcQax25jCrtii9ptsNDw== dependencies: - eslint-plugin-turbo "1.12.2" + eslint-plugin-turbo "2.4.4" eslint-import-resolver-node@^0.3.6, eslint-import-resolver-node@^0.3.9: version "0.3.9" @@ -5197,109 +4540,122 @@ eslint-import-resolver-node@^0.3.6, eslint-import-resolver-node@^0.3.9: resolve "^1.22.4" eslint-import-resolver-typescript@^3.5.2, eslint-import-resolver-typescript@^3.6.1: - version "3.6.1" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.1.tgz#7b983680edd3f1c5bce1a5829ae0bc2d57fe9efa" - integrity sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg== - 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" - is-glob "^4.0.3" - -eslint-module-utils@^2.7.4, eslint-module-utils@^2.8.0: - version "2.8.0" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz#e439fee65fc33f6bba630ff621efc38ec0375c49" - integrity sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw== + version "3.8.4" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.8.4.tgz#6729767f638de277946ae7349c4e53cc6f798ae5" + integrity sha512-vjTGvhr528DzCOLQnBxvoB9a2YuzegT1ogfrUwOqMXS/J6vNYQKSHDJxxDVU1gRuTiUK8N2wyp8Uik9JSPAygA== + dependencies: + "@nolyfill/is-core-module" "1.0.39" + debug "^4.3.7" + enhanced-resolve "^5.15.0" + get-tsconfig "^4.10.0" + is-bun-module "^1.0.2" + stable-hash "^0.0.4" + tinyglobby "^0.2.12" + +eslint-module-utils@^2.12.0: + version "2.12.0" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz#fe4cfb948d61f49203d7b08871982b65b9af0b0b" + integrity sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg== dependencies: debug "^3.2.7" eslint-plugin-import@^2.28.1, eslint-plugin-import@^2.29.1: - version "2.29.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz#d45b37b5ef5901d639c15270d74d46d161150643" - integrity sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw== + version "2.31.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz#310ce7e720ca1d9c0bb3f69adfd1c6bdd7d9e0e7" + integrity sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A== 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.12.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" + string.prototype.trimend "^1.0.8" tsconfig-paths "^3.15.0" eslint-plugin-jsx-a11y@^6.7.1: - version "6.8.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.8.0.tgz#2fa9c701d44fcd722b7c771ec322432857fcbad2" - integrity sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA== + version "6.10.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz#d2812bb23bf1ab4665f1718ea442e8372e638483" + integrity sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q== dependencies: - "@babel/runtime" "^7.23.2" - aria-query "^5.3.0" - array-includes "^3.1.7" + aria-query "^5.3.2" + array-includes "^3.1.8" array.prototype.flatmap "^1.3.2" ast-types-flow "^0.0.8" - axe-core "=4.7.0" - axobject-query "^3.2.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.15" - hasown "^2.0.0" + hasown "^2.0.2" jsx-ast-utils "^3.3.5" language-tags "^1.0.9" minimatch "^3.1.2" - object.entries "^1.1.7" - object.fromentries "^2.0.7" + object.fromentries "^2.0.8" + safe-regex-test "^1.0.3" + string.prototype.includes "^2.0.1" -"eslint-plugin-react-hooks@^4.5.0 || 5.0.0-canary-7118f5dd7-20230705", eslint-plugin-react-hooks@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz#4c3e697ad95b77e93f8646aaa1630c1ba607edd3" - integrity sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g== +"eslint-plugin-react-hooks@^4.5.0 || 5.0.0-canary-7118f5dd7-20230705": + version "5.0.0-canary-7118f5dd7-20230705" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.0.0-canary-7118f5dd7-20230705.tgz#4d55c50e186f1a2b0636433d2b0b2f592ddbccfd" + integrity sha512-AZYbMo/NW9chdL7vk6HQzQhT+PvTAEVqWk9ziruUoW2kAOcN5qNyelv70e0F1VNQAbvutOC9oc+xfWycI9FxDw== -eslint-plugin-react@^7.33.2: - version "7.33.2" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz#69ee09443ffc583927eafe86ffebb470ee737608" - integrity sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw== - dependencies: - array-includes "^3.1.6" - array.prototype.flatmap "^1.3.1" - array.prototype.tosorted "^1.1.1" +eslint-plugin-react-hooks@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.2.0.tgz#1be0080901e6ac31ce7971beed3d3ec0a423d9e3" + integrity sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg== + +eslint-plugin-react-refresh@^0.4.19: + version "0.4.19" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.19.tgz#f15020c0caa58e33fc4efda27d328281ca74e53d" + integrity sha512-eyy8pcr/YxSYjBoqIFSrlbn9i/xvxUFa8CjzAYo9cFjgGXqq1hyjihcpZvxRLalpaWmueWR81xn7vuKmAFijDQ== + +eslint-plugin-react@^7.33.2, eslint-plugin-react@^7.37.4: + version "7.37.4" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.37.4.tgz#1b6c80b6175b6ae4b26055ae4d55d04c414c7181" + integrity sha512-BGP0jRmfYyvOyvMoRX/uoUeW+GqNj9y16bPQzqAHf3AYII/tDs+jMN0dBVkl88/OZwNGwrVFxE7riHsXVfy/LQ== + dependencies: + array-includes "^3.1.8" + array.prototype.findlast "^1.2.5" + array.prototype.flatmap "^1.3.3" + array.prototype.tosorted "^1.1.4" doctrine "^2.1.0" - es-iterator-helpers "^1.0.12" + es-iterator-helpers "^1.2.1" estraverse "^5.3.0" + hasown "^2.0.2" jsx-ast-utils "^2.4.1 || ^3.0.0" minimatch "^3.1.2" - object.entries "^1.1.6" - object.fromentries "^2.0.6" - object.hasown "^1.1.2" - object.values "^1.1.6" + object.entries "^1.1.8" + object.fromentries "^2.0.8" + object.values "^1.2.1" prop-types "^15.8.1" - resolve "^2.0.0-next.4" + resolve "^2.0.0-next.5" semver "^6.3.1" - string.prototype.matchall "^4.0.8" + string.prototype.matchall "^4.0.12" + string.prototype.repeat "^1.0.0" -eslint-plugin-tailwindcss@^3.14.3: - version "3.14.3" - resolved "https://registry.yarnpkg.com/eslint-plugin-tailwindcss/-/eslint-plugin-tailwindcss-3.14.3.tgz#7d845869da1485e7f74226ccbc2c05e278f2a48e" - integrity sha512-1MKT8CrVuqVJleHxb7ICHsF2QwO0G+VJ28athTtlcOkccp0qmwK7nCUa1C9paCZ+VVgQU4fonsjLz/wUxoMHJQ== +eslint-plugin-tailwindcss@^3.18.0: + version "3.18.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-tailwindcss/-/eslint-plugin-tailwindcss-3.18.0.tgz#00b020f6360e616d592c477a9abdc7d18970715d" + integrity sha512-PQDU4ZMzFH0eb2DrfHPpbgo87Zgg2EXSMOj1NSfzdZm+aJzpuwGerfowMIaVehSREEa0idbf/eoNYAOHSJoDAQ== dependencies: fast-glob "^3.2.5" postcss "^8.4.4" -eslint-plugin-turbo@1.12.2: - version "1.12.2" - resolved "https://registry.yarnpkg.com/eslint-plugin-turbo/-/eslint-plugin-turbo-1.12.2.tgz#610327a35933a9f29cc6ce546e21ff3f3867b36a" - integrity sha512-/l0aGvZRzK1LMRTibRd6ZbEEuD5TtGotDTkZpxSIWA1FI764pWVvQduQMKBaRuz7aTuAo0WxatD8v1scK+qRWw== +eslint-plugin-turbo@2.4.4: + version "2.4.4" + resolved "https://registry.yarnpkg.com/eslint-plugin-turbo/-/eslint-plugin-turbo-2.4.4.tgz#8db288135e39c6437af4469009cb0b47f03c5fa8" + integrity sha512-myEnQTjr3FkI0j1Fu0Mqnv1z8n0JW5iFTOUNzHaEevjzl+1uzMSsFwks/x8i3rGmI3EYtC1BY8K2B2pS0Vfx6w== dependencies: dotenv "16.0.3" @@ -5311,12 +4667,25 @@ eslint-scope@^7.2.2: esrecurse "^4.3.0" estraverse "^5.2.0" -eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: +eslint-scope@^8.3.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-8.3.0.tgz#10cd3a918ffdd722f5f3f7b5b83db9b23c87340d" + integrity sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + +eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: version "3.4.3" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== -eslint@8.56.0, eslint@^8.56.0: +eslint-visitor-keys@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz#687bacb2af884fcdda8a6e7d65c606f46a14cd45" + integrity sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw== + +eslint@8.56.0: version "8.56.0" resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.56.0.tgz#4957ce8da409dc0809f99ab07a1b94832ab74b15" integrity sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ== @@ -5360,6 +4729,100 @@ eslint@8.56.0, eslint@^8.56.0: strip-ansi "^6.0.1" text-table "^0.2.0" +eslint@^8.56.0: + version "8.57.1" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.1.tgz#7df109654aba7e3bbe5c8eae533c5e461d3c6ca9" + integrity sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@eslint-community/regexpp" "^4.6.1" + "@eslint/eslintrc" "^2.1.4" + "@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" + ajv "^6.12.4" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.3.2" + doctrine "^3.0.0" + escape-string-regexp "^4.0.0" + eslint-scope "^7.2.2" + eslint-visitor-keys "^3.4.3" + espree "^9.6.1" + esquery "^1.4.2" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" + find-up "^5.0.0" + glob-parent "^6.0.2" + globals "^13.19.0" + graphemer "^1.4.0" + ignore "^5.2.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + is-path-inside "^3.0.3" + js-yaml "^4.1.0" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash.merge "^4.6.2" + minimatch "^3.1.2" + natural-compare "^1.4.0" + optionator "^0.9.3" + strip-ansi "^6.0.1" + text-table "^0.2.0" + +eslint@^9.21.0: + version "9.22.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.22.0.tgz#0760043809fbf836f582140345233984d613c552" + integrity sha512-9V/QURhsRN40xuHXWjV64yvrzMjcz7ZyNoF2jJFmy9j/SLk0u1OLSZgXi28MrXjymnjEGSR80WCdab3RGMDveQ== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@eslint-community/regexpp" "^4.12.1" + "@eslint/config-array" "^0.19.2" + "@eslint/config-helpers" "^0.1.0" + "@eslint/core" "^0.12.0" + "@eslint/eslintrc" "^3.3.0" + "@eslint/js" "9.22.0" + "@eslint/plugin-kit" "^0.2.7" + "@humanfs/node" "^0.16.6" + "@humanwhocodes/module-importer" "^1.0.1" + "@humanwhocodes/retry" "^0.4.2" + "@types/estree" "^1.0.6" + "@types/json-schema" "^7.0.15" + ajv "^6.12.4" + chalk "^4.0.0" + cross-spawn "^7.0.6" + debug "^4.3.2" + escape-string-regexp "^4.0.0" + eslint-scope "^8.3.0" + eslint-visitor-keys "^4.2.0" + espree "^10.3.0" + esquery "^1.5.0" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^8.0.0" + find-up "^5.0.0" + glob-parent "^6.0.2" + ignore "^5.2.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + json-stable-stringify-without-jsonify "^1.0.1" + lodash.merge "^4.6.2" + minimatch "^3.1.2" + natural-compare "^1.4.0" + optionator "^0.9.3" + +espree@^10.0.1, espree@^10.3.0: + version "10.3.0" + resolved "https://registry.yarnpkg.com/espree/-/espree-10.3.0.tgz#29267cf5b0cb98735b65e64ba07e0ed49d1eed8a" + integrity sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg== + dependencies: + acorn "^8.14.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^4.2.0" + espree@^9.6.0, espree@^9.6.1: version "9.6.1" resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" @@ -5374,10 +4837,10 @@ esprima@^4.0.0: resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== -esquery@^1.4.2: - version "1.5.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" - integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== +esquery@^1.4.2, esquery@^1.5.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.6.0.tgz#91419234f804d852a82dceec3e16cdc22cf9dae7" + integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg== dependencies: estraverse "^5.1.0" @@ -5442,13 +4905,6 @@ eth-rpc-errors@^4.0.2, eth-rpc-errors@^4.0.3: dependencies: fast-safe-stringify "^2.0.6" -ethereum-bloom-filters@^1.0.6: - version "1.0.10" - resolved "https://registry.yarnpkg.com/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.10.tgz#3ca07f4aed698e75bd134584850260246a5fed8a" - integrity sha512-rxJ5OFN3RwjQxDcFP2Z5+Q9ho4eIdEmSc2ht0fCu8Se9nbXjZ7/031uXoUYJ87KHCOdVeiUuwSnoS7hmYAGVHA== - dependencies: - js-sha3 "^0.8.0" - ethereum-cryptography@0.1.3, ethereum-cryptography@^0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz#8d6143cfc3d74bf79bbd8edecdf29e4ae20dd191" @@ -5480,15 +4936,15 @@ ethereum-cryptography@^1.0.3: "@scure/bip32" "1.1.5" "@scure/bip39" "1.1.1" -ethereum-cryptography@^2.0.0, ethereum-cryptography@^2.1.2: - version "2.1.3" - resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-2.1.3.tgz#1352270ed3b339fe25af5ceeadcf1b9c8e30768a" - integrity sha512-BlwbIL7/P45W8FGW2r7LGuvoEZ+7PWsniMvQ4p5s2xCyw9tmaDlpfsN9HjAucbF+t/qpVHwZUisgfK24TCW8aA== +ethereum-cryptography@^2.0.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-2.2.1.tgz#58f2810f8e020aecb97de8c8c76147600b0b8ccf" + integrity sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg== dependencies: - "@noble/curves" "1.3.0" - "@noble/hashes" "1.3.3" - "@scure/bip32" "1.3.3" - "@scure/bip39" "1.2.2" + "@noble/curves" "1.4.2" + "@noble/hashes" "1.4.0" + "@scure/bip32" "1.4.0" + "@scure/bip39" "1.3.0" ethereumjs-abi@^0.6.8: version "0.6.8" @@ -5509,78 +4965,21 @@ ethereumjs-util@^6.0.0, ethereumjs-util@^6.2.1: elliptic "^6.5.2" ethereum-cryptography "^0.1.3" ethjs-util "0.1.6" - rlp "^2.2.3" - -ethers@^5.6.5: - version "5.7.2" - resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.7.2.tgz#3a7deeabbb8c030d4126b24f84e525466145872e" - integrity sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg== - dependencies: - "@ethersproject/abi" "5.7.0" - "@ethersproject/abstract-provider" "5.7.0" - "@ethersproject/abstract-signer" "5.7.0" - "@ethersproject/address" "5.7.0" - "@ethersproject/base64" "5.7.0" - "@ethersproject/basex" "5.7.0" - "@ethersproject/bignumber" "5.7.0" - "@ethersproject/bytes" "5.7.0" - "@ethersproject/constants" "5.7.0" - "@ethersproject/contracts" "5.7.0" - "@ethersproject/hash" "5.7.0" - "@ethersproject/hdnode" "5.7.0" - "@ethersproject/json-wallets" "5.7.0" - "@ethersproject/keccak256" "5.7.0" - "@ethersproject/logger" "5.7.0" - "@ethersproject/networks" "5.7.1" - "@ethersproject/pbkdf2" "5.7.0" - "@ethersproject/properties" "5.7.0" - "@ethersproject/providers" "5.7.2" - "@ethersproject/random" "5.7.0" - "@ethersproject/rlp" "5.7.0" - "@ethersproject/sha2" "5.7.0" - "@ethersproject/signing-key" "5.7.0" - "@ethersproject/solidity" "5.7.0" - "@ethersproject/strings" "5.7.0" - "@ethersproject/transactions" "5.7.0" - "@ethersproject/units" "5.7.0" - "@ethersproject/wallet" "5.7.0" - "@ethersproject/web" "5.7.1" - "@ethersproject/wordlists" "5.7.0" - -ethers@^6.11.1: - version "6.11.1" - resolved "https://registry.yarnpkg.com/ethers/-/ethers-6.11.1.tgz#96aae00b627c2e35f9b0a4d65c7ab658259ee6af" - integrity sha512-mxTAE6wqJQAbp5QAe/+o+rXOID7Nw91OZXvgpjDa1r4fAbq2Nu314oEZSbjoRLacuCzs7kUC3clEvkCQowffGg== - dependencies: - "@adraffy/ens-normalize" "1.10.1" - "@noble/curves" "1.2.0" - "@noble/hashes" "1.3.2" - "@types/node" "18.15.13" - aes-js "4.0.0-beta.5" - tslib "2.4.0" - ws "8.5.0" + rlp "^2.2.3" -ethers@^6.13.1: - version "6.13.1" - resolved "https://registry.yarnpkg.com/ethers/-/ethers-6.13.1.tgz#2b9f9c7455cde9d38b30fe6589972eb083652961" - integrity sha512-hdJ2HOxg/xx97Lm9HdCWk949BfYqYWpyw4//78SiwOLgASyfrNszfMUNB2joKjvGUdwhHfaiMMFFwacVVoLR9A== +ethers@^6.13.5: + version "6.13.5" + resolved "https://registry.yarnpkg.com/ethers/-/ethers-6.13.5.tgz#8c1d6ac988ac08abc3c1d8fabbd4b8b602851ac4" + integrity sha512-+knKNieu5EKRThQJWwqaJ10a6HE9sSehGeqWN65//wE7j47ZpFhKAnHB/JJFibwwg61I/koxaPsXbXpD/skNOQ== dependencies: "@adraffy/ens-normalize" "1.10.1" "@noble/curves" "1.2.0" "@noble/hashes" "1.3.2" - "@types/node" "18.15.13" + "@types/node" "22.7.5" aes-js "4.0.0-beta.5" - tslib "2.4.0" + tslib "2.7.0" ws "8.17.1" -ethjs-unit@0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/ethjs-unit/-/ethjs-unit-0.1.6.tgz#c665921e476e87bce2a9d588a6fe0405b2c41699" - integrity sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw== - dependencies: - bn.js "4.11.6" - number-to-bn "1.7.0" - ethjs-util@0.1.6, ethjs-util@^0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/ethjs-util/-/ethjs-util-0.1.6.tgz#f308b62f185f9fe6237132fb2a9818866a5cd536" @@ -5589,7 +4988,12 @@ ethjs-util@0.1.6, ethjs-util@^0.1.6: is-hex-prefixed "1.0.0" strip-hex-prefix "1.0.0" -eventemitter2@^6.4.5, eventemitter2@^6.4.7: +event-target-shim@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" + integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== + +eventemitter2@^6.4.9: version "6.4.9" resolved "https://registry.yarnpkg.com/eventemitter2/-/eventemitter2-6.4.9.tgz#41f2750781b4230ed58827bc119d293471ecb125" integrity sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg== @@ -5599,7 +5003,7 @@ eventemitter3@5.0.1, eventemitter3@^5.0.1: resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-5.0.1.tgz#53f5ffd0a492ac800721bb42c66b841de96423c4" integrity sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA== -events@^3.3.0: +events@3.3.0, events@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== @@ -5612,61 +5016,22 @@ evp_bytestokey@^1.0.3: md5.js "^1.3.4" safe-buffer "^5.1.1" -execa@7.2.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-7.2.0.tgz#657e75ba984f42a70f38928cedc87d6f2d4fe4e9" - integrity sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA== - dependencies: - cross-spawn "^7.0.3" - get-stream "^6.0.1" - human-signals "^4.3.0" - is-stream "^3.0.0" - merge-stream "^2.0.0" - npm-run-path "^5.1.0" - onetime "^6.0.0" - signal-exit "^3.0.7" - strip-final-newline "^3.0.0" - -execa@^5.0.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" - integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== - dependencies: - cross-spawn "^7.0.3" - get-stream "^6.0.0" - human-signals "^2.1.0" - is-stream "^2.0.0" - merge-stream "^2.0.0" - npm-run-path "^4.0.1" - onetime "^5.1.2" - signal-exit "^3.0.3" - strip-final-newline "^2.0.0" - -execa@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/execa/-/execa-8.0.1.tgz#51f6a5943b580f963c3ca9c6321796db8cc39b8c" - integrity sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg== - dependencies: - cross-spawn "^7.0.3" - get-stream "^8.0.1" - human-signals "^5.0.0" - is-stream "^3.0.0" - merge-stream "^2.0.0" - npm-run-path "^5.1.0" - onetime "^6.0.0" - signal-exit "^4.1.0" - strip-final-newline "^3.0.0" +expect-type@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/expect-type/-/expect-type-1.2.0.tgz#b52a0a1117260f5a8dcf33aef66365be18c13415" + integrity sha512-80F22aiJ3GLyVnS/B3HzgR6RelZVumzj9jkL0Rhz4h0xYbNW9PjlQz5h3J/SShErbXBc295vseR4/MIbVmUbeA== extendable-error@^0.1.5: version "0.1.7" resolved "https://registry.yarnpkg.com/extendable-error/-/extendable-error-0.1.7.tgz#60b9adf206264ac920058a7395685ae4670c2b96" integrity sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg== -extension-port-stream@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/extension-port-stream/-/extension-port-stream-2.1.1.tgz#ec11f2a5ed95655d8c40805d7cb0c39939ee9ef4" - integrity sha512-qknp5o5rj2J9CRKfVB8KJr+uXQlrojNZzdESUPhKYLXf97TPcGf6qWWKmpsNNtUyOdzFhab1ON0jzouNxHHvow== +extension-port-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/extension-port-stream/-/extension-port-stream-3.0.0.tgz#00a7185fe2322708a36ed24843c81bd754925fef" + integrity sha512-an2S5quJMiy5bnZKEf6AkfH/7r8CzHvhchU40gxN+OM6HPhe7Z9T1FUychcf2M9PpPOO0Hf7BAEfJkw2TDIBDw== dependencies: + readable-stream "^3.6.2 || ^4.4.2" webextension-polyfill ">=0.10.0 <1.0" external-editor@^3.1.0: @@ -5678,28 +5043,23 @@ external-editor@^3.1.0: iconv-lite "^0.4.24" tmp "^0.0.33" -fast-deep-equal@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" - integrity sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w== - fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== -fast-glob@^3.2.5, fast-glob@^3.2.9, fast-glob@^3.3.0, fast-glob@^3.3.1: - version "3.3.2" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" - integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== +fast-glob@^3.2.5, fast-glob@^3.2.9, fast-glob@^3.3.2: + version "3.3.3" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.3.tgz#d06d585ce8dba90a16b0505c543c3ccfb3aeb818" + integrity sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg== dependencies: "@nodelib/fs.stat" "^2.0.2" "@nodelib/fs.walk" "^1.2.3" glob-parent "^5.1.2" merge2 "^1.3.0" - micromatch "^4.0.4" + micromatch "^4.0.8" -fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: +fast-json-stable-stringify@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== @@ -5710,34 +5070,36 @@ fast-levenshtein@^2.0.6: integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== fast-redact@^3.0.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/fast-redact/-/fast-redact-3.3.0.tgz#7c83ce3a7be4898241a46560d51de10f653f7634" - integrity sha512-6T5V1QK1u4oF+ATxs1lWUmlEk6P2T9HqJG3e2DnHOdVgZy2rFJBoEnrIedcTXlkAHU/zKC+7KETJ+KGGKwxgMQ== + version "3.5.0" + resolved "https://registry.yarnpkg.com/fast-redact/-/fast-redact-3.5.0.tgz#e9ea02f7e57d0cd8438180083e93077e496285e4" + integrity sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A== -fast-safe-stringify@^2.0.6, fast-safe-stringify@^2.1.1: +fast-safe-stringify@^2.0.6: version "2.1.1" resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz#c406a83b6e70d9e35ce3b30a81141df30aeba884" integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA== +fast-uri@^3.0.1: + version "3.0.6" + resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.0.6.tgz#88f130b77cfaea2378d56bf970dea21257a68748" + integrity sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw== + fastparse@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.2.tgz#91728c5a5942eced8531283c79441ee4122c35a9" integrity sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ== fastq@^1.6.0: - version "1.17.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.0.tgz#ca5e1a90b5e68f97fc8b61330d5819b82f5fab03" - integrity sha512-zGygtijUMT7jnk3h26kUms3BkSDp4IfIKjmnqI2tvx6nuBfiF1UqOxbnLfzdv+apBy+53oaImsKtMw/xYbW+1w== + version "1.19.1" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.19.1.tgz#d50eaba803c8846a883c16492821ebcd2cda55f5" + integrity sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ== dependencies: reusify "^1.0.4" -figures@^1.4.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e" - integrity sha512-UxKlfCRuCBxSXU4C6t9scbDyWZ4VlaFFdojKtzJuSkuOBQ5CNFum+zZXFwHjo+CxBC1t6zlYPgHIgFjL8ggoEQ== - dependencies: - escape-string-regexp "^1.0.5" - object-assign "^4.1.0" +fdir@^6.4.3: + version "6.4.3" + resolved "https://registry.yarnpkg.com/fdir/-/fdir-6.4.3.tgz#011cdacf837eca9b811c89dbb902df714273db72" + integrity sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw== figures@^2.0.0: version "2.0.0" @@ -5753,10 +5115,17 @@ file-entry-cache@^6.0.1: dependencies: flat-cache "^3.0.4" -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== +file-entry-cache@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-8.0.0.tgz#7787bddcf1131bffb92636c69457bbc0edd6d81f" + integrity sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ== + dependencies: + flat-cache "^4.0.0" + +fill-range@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" + integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== dependencies: to-regex-range "^5.0.1" @@ -5765,27 +5134,14 @@ filter-obj@^1.1.0: resolved "https://registry.yarnpkg.com/filter-obj/-/filter-obj-1.1.0.tgz#9b311112bc6c6127a16e016c6c5d7f19e0805c5b" integrity sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ== -find-root@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4" - integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== - -find-up@5.0.0, find-up@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" - integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== - dependencies: - locate-path "^6.0.0" - path-exists "^4.0.0" - -find-up@^2.0.0, find-up@^2.1.0: +find-up@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" integrity sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ== dependencies: locate-path "^2.0.0" -find-up@^4.0.0, find-up@^4.1.0: +find-up@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== @@ -5793,13 +5149,13 @@ find-up@^4.0.0, find-up@^4.1.0: locate-path "^5.0.0" path-exists "^4.0.0" -find-yarn-workspace-root2@1.2.16: - version "1.2.16" - resolved "https://registry.yarnpkg.com/find-yarn-workspace-root2/-/find-yarn-workspace-root2-1.2.16.tgz#60287009dd2f324f59646bdb4b7610a6b301c2a9" - integrity sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA== +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== dependencies: - micromatch "^4.0.2" - pkg-dir "^4.2.0" + locate-path "^6.0.0" + path-exists "^4.0.0" flat-cache@^3.0.4: version "3.2.0" @@ -5810,43 +5166,52 @@ flat-cache@^3.0.4: keyv "^4.5.3" rimraf "^3.0.2" +flat-cache@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-4.0.1.tgz#0ece39fcb14ee012f4b0410bd33dd9c1f011127c" + integrity sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw== + dependencies: + flatted "^3.2.9" + keyv "^4.5.4" + flat@^5.0.2: version "5.0.2" resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== flatted@^3.2.9: - version "3.2.9" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.9.tgz#7eb4c67ca1ba34232ca9d2d93e9886e611ad7daf" - integrity sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ== + version "3.3.3" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.3.tgz#67c8fad95454a7c7abebf74bb78ee74a44023358" + integrity sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg== follow-redirects@^1.12.1, follow-redirects@^1.14.9: - version "1.15.5" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.5.tgz#54d4d6d062c0fa7d9d17feb008461550e3ba8020" - integrity sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw== + version "1.15.9" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.9.tgz#a604fa10e443bf98ca94228d9eebcc2e8a2c8ee1" + integrity sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ== -for-each@^0.3.3: - version "0.3.3" - resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" - integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== +for-each@^0.3.3, for-each@^0.3.5: + version "0.3.5" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.5.tgz#d650688027826920feeb0af747ee7b9421a41d47" + integrity sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg== dependencies: - is-callable "^1.1.3" + is-callable "^1.2.7" foreground-child@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.1.1.tgz#1d173e776d75d2772fed08efe4a0de1ea1b12d0d" - integrity sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg== + version "3.3.1" + resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.3.1.tgz#32e8e9ed1b68a3497befb9ac2b6adf92a638576f" + integrity sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw== dependencies: - cross-spawn "^7.0.0" + cross-spawn "^7.0.6" signal-exit "^4.0.1" form-data@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" - integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== + version "4.0.2" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.2.tgz#35cabbdd30c3ce73deb2c42d3c8d3ed9ca51794c" + integrity sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w== dependencies: asynckit "^0.4.0" combined-stream "^1.0.8" + es-set-tostringtag "^2.1.0" mime-types "^2.1.12" fp-ts@1.19.3: @@ -5864,17 +5229,6 @@ fraction.js@^4.3.7: resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.3.7.tgz#06ca0085157e42fda7f9e726e79fefc4068840f7" integrity sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew== -fs-extra@^0.30.0: - version "0.30.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.30.0.tgz#f233ffcc08d4da7d432daa449776989db1df93f0" - integrity sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA== - dependencies: - graceful-fs "^4.1.2" - jsonfile "^2.1.0" - klaw "^1.0.0" - path-is-absolute "^1.0.0" - rimraf "^2.2.8" - fs-extra@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" @@ -5903,35 +5257,32 @@ fsevents@~2.3.2, fsevents@~2.3.3: resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== -function-bind@^1.1.1, function-bind@^1.1.2: +function-bind@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== -function.prototype.name@^1.1.5, function.prototype.name@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd" - integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg== +function.prototype.name@^1.1.6, function.prototype.name@^1.1.8: + version "1.1.8" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.8.tgz#e68e1df7b259a5c949eeef95cdbde53edffabb78" + integrity sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" + call-bind "^1.0.8" + call-bound "^1.0.3" + define-properties "^1.2.1" functions-have-names "^1.2.3" + hasown "^2.0.2" + is-callable "^1.2.7" functions-have-names@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== -fuse.js@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/fuse.js/-/fuse.js-7.0.0.tgz#6573c9fcd4c8268e403b4fc7d7131ffcf99a9eb2" - integrity sha512-14F4hBIxqKvD4Zz/XjDc3y94mNZN6pRv3U13Udo0lNLCWRBUsrMv2xwcF/y/Z5sV6+FQW+/ow68cHpm4sunt8Q== - -futoin-hkdf@^1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/futoin-hkdf/-/futoin-hkdf-1.5.3.tgz#6c8024f2e1429da086d4e18289ef2239ad33ee35" - integrity sha512-SewY5KdMpaoCeh7jachEWFsh1nNlaDjNHZXWqL5IGwtpEYHTgkr2+AMCgNwKWkcc0wpSYrZfR7he4WdmHFtDxQ== +fuse.js@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/fuse.js/-/fuse.js-7.1.0.tgz#306228b4befeee11e05b027087c2744158527d09" + integrity sha512-trLf4SzuuUxfusZADLINj+dE8clK1frKdmqiJNb1Es75fmI5oY6X2mxLVUciLLjxqw/xr72Dhy+lER6dGd02FQ== gensync@^1.0.0-beta.2: version "1.0.0-beta.2" @@ -5949,63 +5300,52 @@ get-caller-file@^2.0.1, get-caller-file@^2.0.5: integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== get-east-asian-width@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/get-east-asian-width/-/get-east-asian-width-1.2.0.tgz#5e6ebd9baee6fb8b7b6bd505221065f0cd91f64e" - integrity sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA== - -get-func-name@^2.0.1, get-func-name@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.2.tgz#0d7cf20cd13fda808669ffa88f4ffc7a3943fc41" - integrity sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ== + version "1.3.0" + resolved "https://registry.yarnpkg.com/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz#21b4071ee58ed04ee0db653371b55b4299875389" + integrity sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ== -get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.3.tgz#9d2d284a238e62672f556361e7d4e1a4686ae50e" - integrity sha512-JIcZczvcMVE7AUOP+X72bh8HqHBRxFdz5PDHYtNG/lE3yk9b3KZBJlwFcTyPYjg3L4RLLmZJzvjxhaZVapxFrQ== +get-intrinsic@^1.2.4, get-intrinsic@^1.2.5, get-intrinsic@^1.2.6, get-intrinsic@^1.2.7, get-intrinsic@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz#743f0e3b6964a93a5491ed1bffaae054d7f98d01" + integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ== dependencies: - es-errors "^1.0.0" + call-bind-apply-helpers "^1.0.2" + es-define-property "^1.0.1" + es-errors "^1.3.0" + es-object-atoms "^1.1.1" function-bind "^1.1.2" - has-proto "^1.0.1" - has-symbols "^1.0.3" - hasown "^2.0.0" + get-proto "^1.0.1" + gopd "^1.2.0" + has-symbols "^1.1.0" + hasown "^2.0.2" + math-intrinsics "^1.1.0" get-nonce@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/get-nonce/-/get-nonce-1.0.1.tgz#fdf3f0278073820d2ce9426c18f07481b1e0cdf3" integrity sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q== -get-package-type@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" - integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== - -get-port-please@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/get-port-please/-/get-port-please-3.1.2.tgz#502795e56217128e4183025c89a48c71652f4e49" - integrity sha512-Gxc29eLs1fbn6LQ4jSU4vXjlwyZhF5HsGuMAa7gqBP4Rw4yxxltyDUuF5MBclFzDTXO+ACchGQoeela4DSfzdQ== - -get-stream@^6.0.0, get-stream@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" - integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== - -get-stream@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-8.0.1.tgz#def9dfd71742cd7754a7761ed43749a27d02eca2" - integrity sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA== +get-proto@^1.0.0, get-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/get-proto/-/get-proto-1.0.1.tgz#150b3f2743869ef3e851ec0c49d15b1d14d00ee1" + integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g== + dependencies: + dunder-proto "^1.0.1" + es-object-atoms "^1.0.0" -get-symbol-description@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" - integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== +get-symbol-description@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.1.0.tgz#7bdd54e0befe8ffc9f3b4e203220d9f1e881b6ee" + integrity sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg== dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.1" + call-bound "^1.0.3" + es-errors "^1.3.0" + get-intrinsic "^1.2.6" -get-tsconfig@^4.5.0: - version "4.7.2" - resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.7.2.tgz#0dcd6fb330391d46332f4c6c1bf89a6514c2ddce" - integrity sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A== +get-tsconfig@^4.10.0, get-tsconfig@^4.7.5: + version "4.10.0" + resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.10.0.tgz#403a682b373a823612475a4c2928c7326fc0f6bb" + integrity sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A== dependencies: resolve-pkg-maps "^1.0.0" @@ -6023,7 +5363,7 @@ glob-parent@^6.0.2: dependencies: is-glob "^4.0.3" -glob@10.3.10, glob@^10.3.10, glob@^10.3.7: +glob@10.3.10: version "10.3.10" resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.10.tgz#0351ebb809fd187fe421ab96af83d3a70715df4b" integrity sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g== @@ -6034,19 +5374,43 @@ glob@10.3.10, glob@^10.3.10, glob@^10.3.7: minipass "^5.0.0 || ^6.0.2 || ^7.0.0" path-scurry "^1.10.1" -glob@7.2.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" - integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== +glob@^10.3.10: + version "10.4.5" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.5.tgz#f4d9f0b90ffdbab09c9d77f5f29b4262517b0956" + integrity sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg== + dependencies: + foreground-child "^3.1.0" + jackspeak "^3.1.2" + minimatch "^9.0.4" + minipass "^7.1.2" + package-json-from-dist "^1.0.0" + path-scurry "^1.11.1" + +glob@^11.0.0: + version "11.0.1" + resolved "https://registry.yarnpkg.com/glob/-/glob-11.0.1.tgz#1c3aef9a59d680e611b53dcd24bb8639cef064d9" + integrity sha512-zrQDm8XPnYEKawJScsnM0QzobJxlT/kHOOlRTio8IH/GrmxRE5fjllkzdaHclIuNjUQTJYH2xHNIGfdpJkDJUw== + dependencies: + foreground-child "^3.1.0" + jackspeak "^4.0.1" + minimatch "^10.0.0" + minipass "^7.1.2" + package-json-from-dist "^1.0.0" + path-scurry "^2.0.0" + +glob@^7.1.3: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" inherits "2" - minimatch "^3.0.4" + minimatch "^3.1.1" once "^1.3.0" path-is-absolute "^1.0.0" -glob@8.1.0: +glob@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== @@ -6057,18 +5421,6 @@ glob@8.1.0: minimatch "^5.0.1" once "^1.3.0" -glob@^7.1.3, glob@^7.2.3: - version "7.2.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.1.1" - once "^1.3.0" - path-is-absolute "^1.0.0" - globals@^11.1.0: version "11.12.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" @@ -6081,14 +5433,25 @@ globals@^13.19.0: dependencies: type-fest "^0.20.2" -globalthis@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" - integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== +globals@^14.0.0: + version "14.0.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-14.0.0.tgz#898d7413c29babcf6bafe56fcadded858ada724e" + integrity sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ== + +globals@^15.15.0: + version "15.15.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-15.15.0.tgz#7c4761299d41c32b075715a4ce1ede7897ff72a8" + integrity sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg== + +globalthis@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.4.tgz#7430ed3a975d97bfb59bcce41f5cabbafa651236" + integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ== dependencies: - define-properties "^1.1.3" + define-properties "^1.2.1" + gopd "^1.0.1" -globby@^11.0.0, globby@^11.0.3, globby@^11.1.0: +globby@^11.0.0, globby@^11.1.0: version "11.1.0" resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== @@ -6105,28 +5468,21 @@ globrex@^0.1.2: resolved "https://registry.yarnpkg.com/globrex/-/globrex-0.1.2.tgz#dd5d9ec826232730cd6793a5e33a9302985e6098" integrity sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg== -goober@^2.1.10: - version "2.1.14" - resolved "https://registry.yarnpkg.com/goober/-/goober-2.1.14.tgz#4a5c94fc34dc086a8e6035360ae1800005135acd" - integrity sha512-4UpC0NdGyAFqLNPnhCT2iHpza2q+RAY3GV85a/mRPdzyPQMsj0KmMMuetdIkzWRbJ+Hgau1EZztq8ImmiMGhsg== +goober@^2.1.16: + version "2.1.16" + resolved "https://registry.yarnpkg.com/goober/-/goober-2.1.16.tgz#7d548eb9b83ff0988d102be71f271ca8f9c82a95" + integrity sha512-erjk19y1U33+XAMe1VTvIONHYoSqE4iS7BYUZfHaqeohLmnC0FdxEh7rQU+6MZ4OajItzjZFSRtVANrQwNq6/g== -gopd@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" - integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== - dependencies: - get-intrinsic "^1.1.3" +gopd@^1.0.1, gopd@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1" + integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== -graceful-fs@^4.1.2, graceful-fs@^4.1.5, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0, graceful-fs@^4.2.4: +graceful-fs@^4.1.2, graceful-fs@^4.1.5, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4: version "4.2.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== -grapheme-splitter@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e" - integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== - graphemer@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" @@ -6141,60 +5497,36 @@ graphql-request@6.1.0: cross-fetch "^3.1.5" graphql@^16.3.0: - version "16.8.1" - resolved "https://registry.yarnpkg.com/graphql/-/graphql-16.8.1.tgz#1930a965bef1170603702acdb68aedd3f3cf6f07" - integrity sha512-59LZHPdGZVh695Ud9lRzPBVTtlX9ZCV150Er2W43ro37wVof0ctenSaskPPjN7lVTIN8mSZt8PHUNKZuNQUuxw== + version "16.10.0" + resolved "https://registry.yarnpkg.com/graphql/-/graphql-16.10.0.tgz#24c01ae0af6b11ea87bf55694429198aaa8e220c" + integrity sha512-AjqGKbDGUFRKIRCP9tCKiIGHyriz2oHEbPIbEtcSLSs4YjReZOIPQQWek4+6hjw62H9QShXHyaGivGiYVLeYFQ== -h3@^1.10.1, h3@^1.8.2: - version "1.10.1" - resolved "https://registry.yarnpkg.com/h3/-/h3-1.10.1.tgz#221634ca9bdb216a6b359bd2915be466a179b8a1" - integrity sha512-UBAUp47hmm4BB5/njB4LrEa9gpuvZj4/Qf/ynSMzO6Ku2RXaouxEfiG2E2IFnv6fxbhAkzjasDxmo6DFdEeXRg== +h3@^1.15.0: + version "1.15.1" + resolved "https://registry.yarnpkg.com/h3/-/h3-1.15.1.tgz#59d6f70d7ef619fad74ecdf465a08fff898033bb" + integrity sha512-+ORaOBttdUm1E2Uu/obAyCguiI7MbBvsLTndc3gyK3zU+SYLoZXlyCP9Xgy0gikkGufFLTZXCXD6+4BsufnmHA== dependencies: - cookie-es "^1.0.0" + cookie-es "^1.2.2" + crossws "^0.3.3" defu "^6.1.4" - destr "^2.0.2" - iron-webcrypto "^1.0.0" - ohash "^1.1.3" - radix3 "^1.1.0" - ufo "^1.3.2" + destr "^2.0.3" + iron-webcrypto "^1.2.1" + node-mock-http "^1.0.0" + radix3 "^1.1.2" + ufo "^1.5.4" uncrypto "^0.1.3" - unenv "^1.9.0" - -handlebars@^4.7.7: - version "4.7.8" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.8.tgz#41c42c18b1be2365439188c77c6afae71c0cd9e9" - integrity sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ== - dependencies: - minimist "^1.2.5" - neo-async "^2.6.2" - source-map "^0.6.1" - wordwrap "^1.0.0" - optionalDependencies: - uglify-js "^3.1.4" - -hard-rejection@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/hard-rejection/-/hard-rejection-2.1.0.tgz#1c6eda5c1685c63942766d79bb40ae773cecd883" - integrity sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA== -hardhat@^2.20.1: - version "2.20.1" - resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.20.1.tgz#3ad8f2b003a96c9ce80a55fec3575580ff2ddcd4" - integrity sha512-q75xDQiQtCZcTMBwjTovrXEU5ECr49baxr4/OBkIu/ULTPzlB20yk1dRWNmD2IFbAeAeXggaWvQAdpiScaHtPw== +hardhat@^2.22.19: + version "2.22.19" + resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.22.19.tgz#92eb6f59e75b0dded841fecf16260a5e3f6eb4eb" + integrity sha512-jptJR5o6MCgNbhd7eKa3mrteR+Ggq1exmE5RUL5ydQEVKcZm0sss5laa86yZ0ixIavIvF4zzS7TdGDuyopj0sQ== dependencies: "@ethersproject/abi" "^5.1.2" "@metamask/eth-sig-util" "^4.0.0" - "@nomicfoundation/ethereumjs-block" "5.0.4" - "@nomicfoundation/ethereumjs-blockchain" "7.0.4" + "@nomicfoundation/edr" "^0.8.0" "@nomicfoundation/ethereumjs-common" "4.0.4" - "@nomicfoundation/ethereumjs-evm" "2.0.4" - "@nomicfoundation/ethereumjs-rlp" "5.0.4" - "@nomicfoundation/ethereumjs-statemanager" "2.0.4" - "@nomicfoundation/ethereumjs-trie" "6.0.4" "@nomicfoundation/ethereumjs-tx" "5.0.4" "@nomicfoundation/ethereumjs-util" "9.0.4" - "@nomicfoundation/ethereumjs-verkle" "0.0.2" - "@nomicfoundation/ethereumjs-vm" "7.0.4" "@nomicfoundation/solidity-analyzer" "^0.1.0" "@sentry/node" "^5.18.1" "@types/bn.js" "^5.1.0" @@ -6203,55 +5535,41 @@ hardhat@^2.20.1: aggregate-error "^3.0.0" ansi-escapes "^4.3.0" boxen "^5.1.2" - chalk "^2.4.2" - chokidar "^3.4.0" + chokidar "^4.0.0" ci-info "^2.0.0" debug "^4.1.1" enquirer "^2.3.0" env-paths "^2.2.0" ethereum-cryptography "^1.0.3" ethereumjs-abi "^0.6.8" - find-up "^2.1.0" + find-up "^5.0.0" fp-ts "1.19.3" fs-extra "^7.0.1" - glob "7.2.0" immutable "^4.0.0-rc.12" io-ts "1.10.4" + json-stream-stringify "^3.1.4" keccak "^3.0.2" lodash "^4.17.11" mnemonist "^0.38.0" mocha "^10.0.0" p-map "^4.0.0" + picocolors "^1.1.0" raw-body "^2.4.1" resolve "1.17.0" semver "^6.3.0" - solc "0.7.3" + solc "0.8.26" source-map-support "^0.5.13" stacktrace-parser "^0.1.10" + tinyglobby "^0.2.6" tsort "0.0.1" undici "^5.14.0" uuid "^8.3.2" ws "^7.4.6" -has-ansi@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" - integrity sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg== - dependencies: - ansi-regex "^2.0.0" - -has-bigints@^1.0.1, has-bigints@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" - integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== - -has-dynamic-import@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/has-dynamic-import/-/has-dynamic-import-2.1.0.tgz#06359ad7672b9e764aea93a54bb9d6e17542d34c" - integrity sha512-su0anMkNEnJKZ/rB99jn3y6lV/J8Ro96hBJ28YAeVzj5rWxH+YL/AdCyiYYA1HDLV9YhmvqpWSJJj2KLo1MX6g== - dependencies: - call-bind "^1.0.5" - get-intrinsic "^1.2.2" +has-bigints@^1.0.2: + version "1.1.0" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.1.0.tgz#28607e965ac967e03cd2a2c70a2636a1edad49fe" + integrity sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg== has-flag@^3.0.0: version "3.0.0" @@ -6263,24 +5581,26 @@ has-flag@^4.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== -has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz#52ba30b6c5ec87fd89fa574bc1c39125c6f65340" - integrity sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg== +has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" + integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== dependencies: - get-intrinsic "^1.2.2" + es-define-property "^1.0.0" -has-proto@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" - integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== +has-proto@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.2.0.tgz#5de5a6eabd95fdffd9818b43055e8065e39fe9d5" + integrity sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ== + dependencies: + dunder-proto "^1.0.0" -has-symbols@^1.0.2, has-symbols@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" - integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== +has-symbols@^1.0.3, has-symbols@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338" + integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== -has-tostringtag@^1.0.0, has-tostringtag@^1.0.1: +has-tostringtag@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== @@ -6304,14 +5624,14 @@ hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7: inherits "^2.0.3" minimalistic-assert "^1.0.1" -hasown@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.0.tgz#f4c513d454a57b7c7e1650778de226b11700546c" - integrity sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA== +hasown@^2.0.0, hasown@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== dependencies: function-bind "^1.1.2" -he@1.2.0: +he@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== @@ -6322,9 +5642,9 @@ hey-listen@^1.0.8: integrity sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q== hls.js@^1.4.12: - version "1.5.3" - resolved "https://registry.yarnpkg.com/hls.js/-/hls.js-1.5.3.tgz#548a4de3b9bdb9f12985cc2f07d206c0f2e74d12" - integrity sha512-gonnYpZ5bxuVdwpcbzfylUlNZ8917LjACUjpWXiaeo8zPAIDfPcMZjEQPy6CeeRSJbcg1P+aVqwxrXr2J+SeUg== + version "1.5.20" + resolved "https://registry.yarnpkg.com/hls.js/-/hls.js-1.5.20.tgz#7eb23bb5e2595311d4e2761038ca6882673de7e2" + integrity sha512-uu0VXUK52JhihhnN/MVVo1lvqNNuhoxkonqgO3IpjvQiGpJBdIXMGkofjQb/j9zvV7a1SW8U9g1FslWx/1HOiQ== hmac-drbg@^1.0.1: version "1.0.1" @@ -6335,25 +5655,6 @@ hmac-drbg@^1.0.1: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.1" -hoist-non-react-statics@^3.3.1: - version "3.3.2" - resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" - integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== - dependencies: - react-is "^16.7.0" - -hosted-git-info@^2.1.4: - version "2.8.9" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" - integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== - -html-parse-stringify@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz#dfc1017347ce9f77c8141a507f233040c59c55d2" - integrity sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg== - dependencies: - void-elements "3.1.0" - http-errors@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" @@ -6365,11 +5666,6 @@ http-errors@2.0.0: statuses "2.0.1" toidentifier "1.0.1" -http-shutdown@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/http-shutdown/-/http-shutdown-1.2.2.tgz#41bc78fc767637c4c95179bc492f312c0ae64c5f" - integrity sha512-S9wWkJ/VSY9/k4qcjG318bqJNruzE4HySUhFYknwmu6LBP97KLLfwNf+n4V1BHurvFNkSKLFnK/RsuUnRTf9Vw== - https-proxy-agent@^5.0.0: version "5.0.1" resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" @@ -6378,44 +5674,10 @@ https-proxy-agent@^5.0.0: agent-base "6" debug "4" -human-id@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/human-id/-/human-id-1.0.2.tgz#e654d4b2b0d8b07e45da9f6020d8af17ec0a5df3" - integrity sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw== - -human-signals@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" - integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== - -human-signals@^4.3.0: - version "4.3.1" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-4.3.1.tgz#ab7f811e851fca97ffbd2c1fe9a958964de321b2" - integrity sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ== - -human-signals@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-5.0.0.tgz#42665a284f9ae0dade3ba41ebc37eb4b852f3a28" - integrity sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ== - -husky@^8.0.1: - version "8.0.3" - resolved "https://registry.yarnpkg.com/husky/-/husky-8.0.3.tgz#4936d7212e46d1dea28fef29bb3a108872cd9184" - integrity sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg== - -i18next-browser-languagedetector@^7.1.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/i18next-browser-languagedetector/-/i18next-browser-languagedetector-7.2.0.tgz#de0321cba6881be37d82e20e4d6f05aa75f6e37f" - integrity sha512-U00DbDtFIYD3wkWsr2aVGfXGAj2TgnELzOX9qv8bT0aJtvPV9CRO77h+vgmHFBMe7LAxdwvT/7VkCWGya6L3tA== - dependencies: - "@babel/runtime" "^7.23.2" - -i18next@22.5.1: - version "22.5.1" - resolved "https://registry.yarnpkg.com/i18next/-/i18next-22.5.1.tgz#99df0b318741a506000c243429a7352e5f44d424" - integrity sha512-8TGPgM3pAD+VRsMtUMNknRz3kzqwp/gPALrWMsDnmC1mKqJwpWyooQRLMcbTwq8z8YwSmuj+ZYvc+xCuEpkssA== - dependencies: - "@babel/runtime" "^7.20.6" +human-id@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/human-id/-/human-id-4.1.1.tgz#2801fbd61b9a5c1c9170f332802db6408a39a4b0" + integrity sha512-3gKm/gCSUipeLsRYZbbdA1BD83lBoWUkZ7G9VFrhWPAU76KwYo5KR8V28bpoPm/ygy0x5/GCbpRQdY7VLYCoIg== iconv-lite@0.4.24, iconv-lite@^0.4.24: version "0.4.24" @@ -6434,30 +5696,25 @@ ieee754@^1.2.1: resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== -ignore-by-default@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" - integrity sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA== - -ignore@^5.2.0, ignore@^5.2.4: - version "5.3.1" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef" - integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== +ignore@^5.2.0, ignore@^5.3.1: + version "5.3.2" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" + integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== immer@^10.0.2: - version "10.0.3" - resolved "https://registry.yarnpkg.com/immer/-/immer-10.0.3.tgz#a8de42065e964aa3edf6afc282dfc7f7f34ae3c9" - integrity sha512-pwupu3eWfouuaowscykeckFmVTpqbzW+rXFCX8rQLkZzM9ftBmU/++Ra+o+L27mz03zJTlyV4UUr+fdKNffo4A== + version "10.1.1" + resolved "https://registry.yarnpkg.com/immer/-/immer-10.1.1.tgz#206f344ea372d8ea176891545ee53ccc062db7bc" + integrity sha512-s2MPrmjovJcoMaHtx6K11Ra7oD05NT97w1IC5zpMkT6Atjr7H8LjaDd81iIxUYpMKSRRNMJE703M1Fhr/TctHw== immutable@^4.0.0-rc.12: - version "4.3.5" - resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.5.tgz#f8b436e66d59f99760dc577f5c99a4fd2a5cc5a0" - integrity sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw== + version "4.3.7" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.7.tgz#c70145fc90d89fb02021e65c84eb0226e4e5a381" + integrity sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw== import-fresh@^3.2.1: - version "3.3.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" - integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + version "3.3.1" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.1.tgz#9cecb56503c0ada1f2741dbbd6546e4b13b57ccf" + integrity sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ== dependencies: parent-module "^1.0.0" resolve-from "^4.0.0" @@ -6480,26 +5737,19 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3: +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== -internal-slot@^1.0.4, internal-slot@^1.0.5: - version "1.0.6" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.6.tgz#37e756098c4911c5e912b8edbf71ed3aa116f930" - integrity sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg== - dependencies: - get-intrinsic "^1.2.2" - hasown "^2.0.0" - side-channel "^1.0.4" - -invariant@2.2.4, invariant@^2.2.4: - version "2.2.4" - resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" - integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== +internal-slot@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.1.0.tgz#1eac91762947d2f7056bc838d93e13b2e9604961" + integrity sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw== dependencies: - loose-envify "^1.0.0" + es-errors "^1.3.0" + hasown "^2.0.2" + side-channel "^1.1.0" io-ts@1.10.4: version "1.10.4" @@ -6508,25 +5758,10 @@ io-ts@1.10.4: dependencies: fp-ts "^1.0.0" -ioredis@^5.3.2: - version "5.3.2" - resolved "https://registry.yarnpkg.com/ioredis/-/ioredis-5.3.2.tgz#9139f596f62fc9c72d873353ac5395bcf05709f7" - integrity sha512-1DKMMzlIHM02eBBVOFQ1+AolGjs6+xEcM4PDL7NqOS6szq7H9jSaEkIUH6/a5Hl241LzW6JLSiAbNvTQjUupUA== - dependencies: - "@ioredis/commands" "^1.1.1" - cluster-key-slot "^1.1.0" - debug "^4.3.4" - denque "^2.1.0" - lodash.defaults "^4.2.0" - lodash.isarguments "^3.1.0" - redis-errors "^1.2.0" - redis-parser "^3.0.0" - standard-as-callback "^2.1.0" - -iron-webcrypto@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/iron-webcrypto/-/iron-webcrypto-1.0.0.tgz#e3b689c0c61b434a0a4cb82d0aeabbc8b672a867" - integrity sha512-anOK1Mktt8U1Xi7fCM3RELTuYbnFikQY5VtrDj7kPgpejV7d43tWKhzgioO0zpkazLEL/j/iayRqnJhrGfqUsg== +iron-webcrypto@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/iron-webcrypto/-/iron-webcrypto-1.2.1.tgz#aa60ff2aa10550630f4c0b11fd2442becdb35a6f" + integrity sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg== is-accessor-descriptor@^1.0.1: version "1.0.1" @@ -6535,21 +5770,22 @@ is-accessor-descriptor@^1.0.1: dependencies: hasown "^2.0.0" -is-arguments@^1.0.4, is-arguments@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" - integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== +is-arguments@^1.0.4: + version "1.2.0" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.2.0.tgz#ad58c6aecf563b78ef2bf04df540da8f5d7d8e1b" + integrity sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA== dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" + call-bound "^1.0.2" + has-tostringtag "^1.0.2" -is-array-buffer@^3.0.2, is-array-buffer@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.4.tgz#7a1f92b3d61edd2bc65d24f130530ea93d7fae98" - integrity sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw== +is-array-buffer@^3.0.4, is-array-buffer@^3.0.5: + version "3.0.5" + resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.5.tgz#65742e1e687bd2cc666253068fd8707fe4d44280" + integrity sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A== dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.2.1" + call-bind "^1.0.8" + call-bound "^1.0.3" + get-intrinsic "^1.2.6" is-arrayish@^0.2.1: version "0.2.1" @@ -6557,18 +5793,22 @@ is-arrayish@^0.2.1: integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== is-async-function@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-async-function/-/is-async-function-2.0.0.tgz#8e4418efd3e5d3a6ebb0164c05ef5afb69aa9646" - integrity sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA== + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-async-function/-/is-async-function-2.1.1.tgz#3e69018c8e04e73b738793d020bfe884b9fd3523" + integrity sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ== dependencies: - has-tostringtag "^1.0.0" + async-function "^1.0.0" + call-bound "^1.0.3" + get-proto "^1.0.1" + has-tostringtag "^1.0.2" + safe-regex-test "^1.1.0" -is-bigint@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" - integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== +is-bigint@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.1.0.tgz#dda7a3445df57a42583db4228682eba7c4170672" + integrity sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ== dependencies: - has-bigints "^1.0.1" + has-bigints "^1.0.2" is-binary-path@~2.1.0: version "2.1.0" @@ -6577,30 +5817,37 @@ is-binary-path@~2.1.0: dependencies: binary-extensions "^2.0.0" -is-boolean-object@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" - integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== +is-boolean-object@^1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.2.2.tgz#7067f47709809a393c71ff5bb3e135d8a9215d9e" + integrity sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A== dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" + call-bound "^1.0.3" + has-tostringtag "^1.0.2" is-buffer@^1.1.5: version "1.1.6" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== -is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: +is-bun-module@^1.0.2: + version "1.3.0" + resolved "https://registry.yarnpkg.com/is-bun-module/-/is-bun-module-1.3.0.tgz#ea4d24fdebfcecc98e81bcbcb506827fee288760" + integrity sha512-DgXeu5UWI0IsMQundYb5UAOzm6G2eVnarJ0byP6Tm55iZNKceD59LNPA2L4VvsScTtHcw0yEkVwSf7PC+QoLSA== + dependencies: + semver "^7.6.3" + +is-callable@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== -is-core-module@^2.11.0, is-core-module@^2.13.0, is-core-module@^2.13.1: - version "2.13.1" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" - integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== +is-core-module@^2.13.0, is-core-module@^2.15.1, is-core-module@^2.16.0: + version "2.16.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.16.1.tgz#2a98801a849f43e2add644fbb6bc6229b19a4ef4" + integrity sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w== dependencies: - hasown "^2.0.0" + hasown "^2.0.2" is-data-descriptor@^1.0.1: version "1.0.1" @@ -6609,12 +5856,22 @@ is-data-descriptor@^1.0.1: dependencies: hasown "^2.0.0" -is-date-object@^1.0.1, is-date-object@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" - integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== +is-data-view@^1.0.1, is-data-view@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-data-view/-/is-data-view-1.0.2.tgz#bae0a41b9688986c2188dda6657e56b8f9e63b8e" + integrity sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw== + dependencies: + call-bound "^1.0.2" + get-intrinsic "^1.2.6" + is-typed-array "^1.1.13" + +is-date-object@^1.0.5, is-date-object@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.1.0.tgz#ad85541996fc7aa8b2729701d27b7319f95d82f7" + integrity sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg== dependencies: - has-tostringtag "^1.0.0" + call-bound "^1.0.2" + has-tostringtag "^1.0.2" is-descriptor@^1.0.0: version "1.0.3" @@ -6624,32 +5881,17 @@ is-descriptor@^1.0.0: is-accessor-descriptor "^1.0.1" is-data-descriptor "^1.0.1" -is-docker@^2.0.0, is-docker@^2.1.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" - integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== - -is-docker@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-3.0.0.tgz#90093aa3106277d8a77a5910dbae71747e15a200" - integrity sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ== - is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== -is-finalizationregistry@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz#c8749b65f17c133313e661b1289b95ad3dbd62e6" - integrity sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw== +is-finalizationregistry@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz#eefdcdc6c94ddd0674d9c85887bf93f944a97c90" + integrity sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg== dependencies: - call-bind "^1.0.2" - -is-finite@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.1.0.tgz#904135c77fb42c0641d6aa1bcdbc4daa8da082f3" - integrity sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w== + call-bound "^1.0.3" is-fullwidth-code-point@^3.0.0: version "3.0.0" @@ -6669,11 +5911,14 @@ is-fullwidth-code-point@^5.0.0: get-east-asian-width "^1.0.0" is-generator-function@^1.0.10, is-generator-function@^1.0.7: - version "1.0.10" - resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" - integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.1.0.tgz#bf3eeda931201394f57b5dba2800f91a238309ca" + integrity sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ== dependencies: - has-tostringtag "^1.0.0" + call-bound "^1.0.3" + get-proto "^1.0.0" + has-tostringtag "^1.0.2" + safe-regex-test "^1.1.0" is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: version "4.0.3" @@ -6687,29 +5932,18 @@ is-hex-prefixed@1.0.0: resolved "https://registry.yarnpkg.com/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz#7d8d37e6ad77e5d127148913c573e082d777f554" integrity sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA== -is-inside-container@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-inside-container/-/is-inside-container-1.0.0.tgz#e81fba699662eb31dbdaf26766a61d4814717ea4" - integrity sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA== - dependencies: - is-docker "^3.0.0" - -is-map@^2.0.1, is-map@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.2.tgz#00922db8c9bf73e81b7a335827bc2a43f2b91127" - integrity sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg== - -is-negative-zero@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" - integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== +is-map@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.3.tgz#ede96b7fe1e270b3c4465e3a465658764926d62e" + integrity sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw== -is-number-object@^1.0.4: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" - integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== +is-number-object@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.1.1.tgz#144b21e95a1bc148205dcc2814a9134ec41b2541" + integrity sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw== dependencies: - has-tostringtag "^1.0.0" + call-bound "^1.0.3" + has-tostringtag "^1.0.2" is-number@^3.0.0: version "3.0.0" @@ -6728,52 +5962,45 @@ is-path-inside@^3.0.3: resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== -is-plain-obj@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" - integrity sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg== - is-plain-obj@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== -is-regex@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" - integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== +is-regex@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.2.1.tgz#76d70a3ed10ef9be48eb577887d74205bf0cad22" + integrity sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g== dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" + call-bound "^1.0.2" + gopd "^1.2.0" + has-tostringtag "^1.0.2" + hasown "^2.0.2" -is-set@^2.0.1, is-set@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.2.tgz#90755fa4c2562dc1c5d4024760d6119b94ca18ec" - integrity sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g== +is-set@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.3.tgz#8ab209ea424608141372ded6e0cb200ef1d9d01d" + integrity sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg== -is-shared-array-buffer@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" - integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== +is-shared-array-buffer@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz#9b67844bd9b7f246ba0708c3a93e34269c774f6f" + integrity sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A== dependencies: - call-bind "^1.0.2" + call-bound "^1.0.3" is-stream@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== -is-stream@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-3.0.0.tgz#e6bfd7aa6bef69f4f472ce9bb681e3e57b4319ac" - integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== - -is-string@^1.0.5, is-string@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" - integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== +is-string@^1.0.7, is-string@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.1.1.tgz#92ea3f3d5c5b6e039ca8677e5ac8d07ea773cbb9" + integrity sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA== dependencies: - has-tostringtag "^1.0.0" + call-bound "^1.0.3" + has-tostringtag "^1.0.2" is-subdir@^1.1.1: version "1.2.0" @@ -6782,71 +6009,52 @@ is-subdir@^1.1.1: dependencies: better-path-resolve "1.0.0" -is-symbol@^1.0.2, is-symbol@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" - integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== +is-symbol@^1.0.4, is-symbol@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.1.1.tgz#f47761279f532e2b05a7024a7506dbbedacd0634" + integrity sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w== dependencies: - has-symbols "^1.0.2" + call-bound "^1.0.2" + has-symbols "^1.1.0" + safe-regex-test "^1.1.0" -is-typed-array@^1.1.10, is-typed-array@^1.1.12, is-typed-array@^1.1.3, is-typed-array@^1.1.9: - version "1.1.13" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.13.tgz#d6c5ca56df62334959322d7d7dd1cca50debe229" - integrity sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw== +is-typed-array@^1.1.13, is-typed-array@^1.1.14, is-typed-array@^1.1.15, is-typed-array@^1.1.3: + version "1.1.15" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.15.tgz#4bfb4a45b61cee83a5a46fba778e4e8d59c0ce0b" + integrity sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ== dependencies: - which-typed-array "^1.1.14" + which-typed-array "^1.1.16" is-unicode-supported@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== -is-weakmap@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.1.tgz#5008b59bdc43b698201d18f62b37b2ca243e8cf2" - integrity sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA== +is-weakmap@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.2.tgz#bf72615d649dfe5f699079c54b83e47d1ae19cfd" + integrity sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w== -is-weakref@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" - integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== +is-weakref@^1.0.2, is-weakref@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.1.1.tgz#eea430182be8d64174bd96bffbc46f21bf3f9293" + integrity sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew== dependencies: - call-bind "^1.0.2" + call-bound "^1.0.3" -is-weakset@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.2.tgz#4569d67a747a1ce5a994dfd4ef6dcea76e7c0a1d" - integrity sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg== +is-weakset@^2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.4.tgz#c9f5deb0bc1906c6d6f1027f284ddf459249daca" + integrity sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ== dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.1" + call-bound "^1.0.3" + get-intrinsic "^1.2.6" is-windows@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== -is-wsl@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" - integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== - dependencies: - is-docker "^2.0.0" - -is-wsl@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-3.1.0.tgz#e1c657e39c10090afcbedec61720f6b924c3cbd2" - integrity sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw== - dependencies: - is-inside-container "^1.0.0" - -is64bit@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is64bit/-/is64bit-2.0.0.tgz#198c627cbcb198bbec402251f88e5e1a51236c07" - integrity sha512-jv+8jaWCl0g2lSBkNSVXdzfBA0npK1HGC2KtWM9FumFRoGS94g3NbCCLVnCYHLjp4GrW2KZeeSTMo5ddtznmGw== - dependencies: - system-architecture "^0.1.0" - isarray@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" @@ -6862,29 +6070,27 @@ isexe@^2.0.0: resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== -isomorphic-unfetch@3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/isomorphic-unfetch/-/isomorphic-unfetch-3.1.0.tgz#87341d5f4f7b63843d468438128cb087b7c3e98f" - integrity sha512-geDJjpoZ8N0kWexiwkX8F9NkTsXhetLPVbZFQ+JTW239QNOwvB0gniuR1Wc6f0AMTn7/mFGyXvHTifrCp/GH8Q== - dependencies: - node-fetch "^2.6.1" - unfetch "^4.2.0" +isows@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/isows/-/isows-1.0.3.tgz#93c1cf0575daf56e7120bab5c8c448b0809d0d74" + integrity sha512-2cKei4vlmg2cxEjm3wVSqn8pcoRF/LX/wpifuuNquFO4SQmPwarClT+SUCA2lt+l581tTeZIPIZuIDo2jWN1fg== -isows@1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/isows/-/isows-1.0.4.tgz#810cd0d90cc4995c26395d2aa4cfa4037ebdf061" - integrity sha512-hEzjY+x9u9hPmBom9IIAqdJCwNLax+xrPb51vEPpERoFlIxgmZcHzsT5jKG06nvInKOBGvReAVz80Umed5CczQ== +isows@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/isows/-/isows-1.0.6.tgz#0da29d706fa51551c663c627ace42769850f86e7" + integrity sha512-lPHCayd40oW98/I0uvgaHKWCSvkzY27LjWLbtzOm64yQ+G3Q5npjjbdppU65iZXkK1Zt+kH9pfegli0AYfwYYw== -iterator.prototype@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/iterator.prototype/-/iterator.prototype-1.1.2.tgz#5e29c8924f01916cb9335f1ff80619dcff22b0c0" - integrity sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w== +iterator.prototype@^1.1.4: + version "1.1.5" + resolved "https://registry.yarnpkg.com/iterator.prototype/-/iterator.prototype-1.1.5.tgz#12c959a29de32de0aa3bbbb801f4d777066dae39" + integrity sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g== dependencies: - define-properties "^1.2.1" - get-intrinsic "^1.2.1" - has-symbols "^1.0.3" - reflect.getprototypeof "^1.0.4" - set-function-name "^2.0.1" + define-data-property "^1.1.4" + es-object-atoms "^1.0.0" + get-intrinsic "^1.2.6" + get-proto "^1.0.0" + has-symbols "^1.1.0" + set-function-name "^2.0.2" jackspeak@^2.3.5: version "2.3.6" @@ -6895,15 +6101,36 @@ jackspeak@^2.3.5: optionalDependencies: "@pkgjs/parseargs" "^0.11.0" -jiti@^1.19.1, jiti@^1.21.0: - version "1.21.0" - resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.0.tgz#7c97f8fe045724e136a397f7340475244156105d" - integrity sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q== +jackspeak@^3.1.2: + version "3.4.3" + resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-3.4.3.tgz#8833a9d89ab4acde6188942bd1c53b6390ed5a8a" + integrity sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw== + dependencies: + "@isaacs/cliui" "^8.0.2" + optionalDependencies: + "@pkgjs/parseargs" "^0.11.0" + +jackspeak@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-4.1.0.tgz#c489c079f2b636dc4cbe9b0312a13ff1282e561b" + integrity sha512-9DDdhb5j6cpeitCbvLO7n7J4IxnbM6hoF6O1g4HQ5TfhvvKN8ywDM7668ZhMHRqVmxqhps/F6syWK2KcPxYlkw== + dependencies: + "@isaacs/cliui" "^8.0.2" + +jiti@^1.21.6: + version "1.21.7" + resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.7.tgz#9dd81043424a3d28458b193d965f0d18a2300ba9" + integrity sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A== + +jiti@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/jiti/-/jiti-2.4.2.tgz#d19b7732ebb6116b06e2038da74a55366faef560" + integrity sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A== joi@^17.9.2: - version "17.12.1" - resolved "https://registry.yarnpkg.com/joi/-/joi-17.12.1.tgz#3347ecf4cd3301962d42191c021b165eef1f395b" - integrity sha512-vtxmq+Lsc5SlfqotnfVjlViWfOL9nt/avKNbKYizwf6gsCfq9NYY/ceYRMFD8XDdrjJ9abJyScWmhmIiy+XRtQ== + version "17.13.3" + resolved "https://registry.yarnpkg.com/joi/-/joi-17.13.3.tgz#0f5cc1169c999b30d344366d384b12d92558bcec" + integrity sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA== dependencies: "@hapi/hoek" "^9.3.0" "@hapi/topo" "^5.1.0" @@ -6911,22 +6138,17 @@ joi@^17.9.2: "@sideway/formula" "^3.0.1" "@sideway/pinpoint" "^2.0.0" -joycon@^3.0.1: +joycon@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/joycon/-/joycon-3.1.1.tgz#bce8596d6ae808f8b68168f5fc69280996894f03" integrity sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw== js-base64@^3.7.2: - version "3.7.6" - resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-3.7.6.tgz#6ccb5d761b48381fd819f9ce04998866dbcbbc99" - integrity sha512-NPrWuHFxFUknr1KqJRDgUQPexQF0uIJWjeT+2KjEePhitQxQEx5EJBG1lVn5/hc8aLycTpXrDOgPQ6Zq+EDiTA== - -js-sdsl@^4.1.4: - version "4.4.2" - resolved "https://registry.yarnpkg.com/js-sdsl/-/js-sdsl-4.4.2.tgz#2e3c031b1f47d3aca8b775532e3ebb0818e7f847" - integrity sha512-dwXFwByc/ajSV6m5bcKAPwe4yDDF6D614pxmIi5odytzxRlwqF6nwoiCek80Ixc7Cvma5awClxrzFtxCQvcM8w== + version "3.7.7" + resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-3.7.7.tgz#e51b84bf78fbf5702b9541e2cb7bfcb893b43e79" + integrity sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw== -js-sha3@0.8.0, js-sha3@^0.8.0: +js-sha3@0.8.0: version "0.8.0" resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== @@ -6936,19 +6158,7 @@ js-sha3@0.8.0, js-sha3@^0.8.0: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -js-tokens@^8.0.2: - version "8.0.3" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-8.0.3.tgz#1c407ec905643603b38b6be6977300406ec48775" - integrity sha512-UfJMcSJc+SEXEl9lH/VLHSZbThQyLpw1vLO1Lb+j4RWDvG3N2f7yj3PVQA3cmkTBNldJ9eFnM+xEXxHIXrYiJw== - -js-yaml@4.1.0, js-yaml@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" - integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== - dependencies: - argparse "^2.0.1" - -js-yaml@^3.13.0, js-yaml@^3.13.1, js-yaml@^3.6.1: +js-yaml@^3.13.1, js-yaml@^3.6.1: version "3.14.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== @@ -6956,10 +6166,17 @@ js-yaml@^3.13.0, js-yaml@^3.13.1, js-yaml@^3.6.1: argparse "^1.0.7" esprima "^4.0.0" -jsesc@^2.5.1: - version "2.5.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" - integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +jsesc@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.1.0.tgz#74d335a234f67ed19907fdadfac7ccf9d409825d" + integrity sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA== json-buffer@3.0.1: version "3.0.1" @@ -6971,11 +6188,6 @@ json-parse-better-errors@^1.0.1: resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== -json-parse-even-better-errors@^2.3.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" - integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== - json-rpc-engine@^6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/json-rpc-engine/-/json-rpc-engine-6.1.0.tgz#bf5ff7d029e1c1bf20cb6c0e9f348dcd8be5a393" @@ -6984,15 +6196,6 @@ json-rpc-engine@^6.1.0: "@metamask/safe-event-emitter" "^2.0.0" eth-rpc-errors "^4.0.2" -json-rpc-middleware-stream@^4.2.1: - version "4.2.3" - resolved "https://registry.yarnpkg.com/json-rpc-middleware-stream/-/json-rpc-middleware-stream-4.2.3.tgz#08340846ffaa2a60287930773546eb4b7f7dbba2" - integrity sha512-4iFb0yffm5vo3eFKDbQgke9o17XBcLQ2c3sONrXSbcOLzP8LTojqo8hRGVgtJShhm5q4ZDSNq039fAx9o65E1w== - dependencies: - "@metamask/safe-event-emitter" "^3.0.0" - json-rpc-engine "^6.1.0" - readable-stream "^2.3.3" - json-rpc-random-id@^1.0.0, json-rpc-random-id@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json-rpc-random-id/-/json-rpc-random-id-1.0.1.tgz#ba49d96aded1444dbb8da3d203748acbbcdec8c8" @@ -7018,6 +6221,11 @@ json-stable-stringify-without-jsonify@^1.0.1: resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== +json-stream-stringify@^3.1.4: + version "3.1.6" + resolved "https://registry.yarnpkg.com/json-stream-stringify/-/json-stream-stringify-3.1.6.tgz#ebe32193876fb99d4ec9f612389a8d8e2b5d54d4" + integrity sha512-x7fpwxOkbhFCaJDJ8vb1fBY3DdSa4AlITaz+HHILQJzdPMnHEFjxPwVUi1ALIbcIxDE0PNe/0i7frnY8QnBQog== + json5@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" @@ -7030,18 +6238,6 @@ json5@^2.2.2, json5@^2.2.3: resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== -jsonc-parser@^3.2.0: - version "3.2.1" - resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.2.1.tgz#031904571ccf929d7670ee8c547545081cb37f1a" - integrity sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA== - -jsonfile@^2.1.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" - integrity sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw== - optionalDependencies: - graceful-fs "^4.1.6" - jsonfile@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" @@ -7073,7 +6269,7 @@ keccak@^3.0.0, keccak@^3.0.2, keccak@^3.0.3: node-gyp-build "^4.2.0" readable-stream "^3.6.0" -keyv@^4.5.3: +keyv@^4.5.3, keyv@^4.5.4: version "4.5.4" resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== @@ -7092,32 +6288,15 @@ kind-of@^3.0.2: dependencies: is-buffer "^1.1.5" -kind-of@^6.0.3: - version "6.0.3" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" - integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== - -klaw@^1.0.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" - integrity sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw== - optionalDependencies: - graceful-fs "^4.1.9" - kleur@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== -kleur@^4.1.5: - version "4.1.5" - resolved "https://registry.yarnpkg.com/kleur/-/kleur-4.1.5.tgz#95106101795f7050c6c650f350c683febddb1780" - integrity sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ== - language-subtag-registry@^0.3.20: - version "0.3.22" - resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz#2e1500861b2e457eba7e7ae86877cbd08fa1fd1d" - integrity sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w== + version "0.3.23" + resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz#23529e04d9e3b74679d70142df3fd2eb6ec572e7" + integrity sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ== language-tags@^1.0.9: version "1.0.9" @@ -7134,83 +6313,101 @@ levn@^0.4.1: prelude-ls "^1.2.1" type-check "~0.4.0" -lilconfig@2.1.0, lilconfig@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52" - integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== - -lilconfig@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-3.0.0.tgz#f8067feb033b5b74dab4602a5f5029420be749bc" - integrity sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g== +lightningcss-darwin-arm64@1.29.2: + version "1.29.2" + resolved "https://registry.yarnpkg.com/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.29.2.tgz#6ceff38b01134af48e859394e1ca21e5d49faae6" + integrity sha512-cK/eMabSViKn/PG8U/a7aCorpeKLMlK0bQeNHmdb7qUnBkNPnL+oV5DjJUo0kqWsJUapZsM4jCfYItbqBDvlcA== + +lightningcss-darwin-x64@1.29.2: + version "1.29.2" + resolved "https://registry.yarnpkg.com/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.29.2.tgz#891b6f9e57682d794223c33463ca66d3af3fb038" + integrity sha512-j5qYxamyQw4kDXX5hnnCKMf3mLlHvG44f24Qyi2965/Ycz829MYqjrVg2H8BidybHBp9kom4D7DR5VqCKDXS0w== + +lightningcss-freebsd-x64@1.29.2: + version "1.29.2" + resolved "https://registry.yarnpkg.com/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.29.2.tgz#8a95f9ab73b2b2b0beefe1599fafa8b058938495" + integrity sha512-wDk7M2tM78Ii8ek9YjnY8MjV5f5JN2qNVO+/0BAGZRvXKtQrBC4/cn4ssQIpKIPP44YXw6gFdpUF+Ps+RGsCwg== + +lightningcss-linux-arm-gnueabihf@1.29.2: + version "1.29.2" + resolved "https://registry.yarnpkg.com/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.29.2.tgz#5c60bbf92b39d7ed51e363f7b98a7111bf5914a1" + integrity sha512-IRUrOrAF2Z+KExdExe3Rz7NSTuuJ2HvCGlMKoquK5pjvo2JY4Rybr+NrKnq0U0hZnx5AnGsuFHjGnNT14w26sg== + +lightningcss-linux-arm64-gnu@1.29.2: + version "1.29.2" + resolved "https://registry.yarnpkg.com/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.29.2.tgz#e73d7608c4cce034c3654e5e8b53be74846224de" + integrity sha512-KKCpOlmhdjvUTX/mBuaKemp0oeDIBBLFiU5Fnqxh1/DZ4JPZi4evEH7TKoSBFOSOV3J7iEmmBaw/8dpiUvRKlQ== + +lightningcss-linux-arm64-musl@1.29.2: + version "1.29.2" + resolved "https://registry.yarnpkg.com/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.29.2.tgz#a95a18d5a909831c092e0a8d2de4b9ac1a8db151" + integrity sha512-Q64eM1bPlOOUgxFmoPUefqzY1yV3ctFPE6d/Vt7WzLW4rKTv7MyYNky+FWxRpLkNASTnKQUaiMJ87zNODIrrKQ== + +lightningcss-linux-x64-gnu@1.29.2: + version "1.29.2" + resolved "https://registry.yarnpkg.com/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.29.2.tgz#551ca07e565394928642edee92acc042e546cb78" + integrity sha512-0v6idDCPG6epLXtBH/RPkHvYx74CVziHo6TMYga8O2EiQApnUPZsbR9nFNrg2cgBzk1AYqEd95TlrsL7nYABQg== + +lightningcss-linux-x64-musl@1.29.2: + version "1.29.2" + resolved "https://registry.yarnpkg.com/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.29.2.tgz#2fd164554340831bce50285b57101817850dd258" + integrity sha512-rMpz2yawkgGT8RULc5S4WiZopVMOFWjiItBT7aSfDX4NQav6M44rhn5hjtkKzB+wMTRlLLqxkeYEtQ3dd9696w== + +lightningcss-win32-arm64-msvc@1.29.2: + version "1.29.2" + resolved "https://registry.yarnpkg.com/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.29.2.tgz#da43ea49fafc5d2de38e016f1a8539d5eed98318" + integrity sha512-nL7zRW6evGQqYVu/bKGK+zShyz8OVzsCotFgc7judbt6wnB2KbiKKJwBE4SGoDBQ1O94RjW4asrCjQL4i8Fhbw== + +lightningcss-win32-x64-msvc@1.29.2: + version "1.29.2" + resolved "https://registry.yarnpkg.com/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.29.2.tgz#ddefaa099a39b725b2f5bbdcb9fc718435cc9797" + integrity sha512-EdIUW3B2vLuHmv7urfzMI/h2fmlnOQBk1xlsDxkN1tCWKjNFjfLhGxYk8C8mzpSfr+A6jFFIi8fU6LbQGsRWjA== + +lightningcss@^1.29.1: + version "1.29.2" + resolved "https://registry.yarnpkg.com/lightningcss/-/lightningcss-1.29.2.tgz#f5f0fd6e63292a232697e6fe709da5b47624def3" + integrity sha512-6b6gd/RUXKaw5keVdSEtqFVdzWnU5jMxTUjA2bVcMNPLwSQ08Sv/UodBVtETLCn7k4S1Ibxwh7k68IwLZPgKaA== + dependencies: + detect-libc "^2.0.3" + optionalDependencies: + lightningcss-darwin-arm64 "1.29.2" + lightningcss-darwin-x64 "1.29.2" + lightningcss-freebsd-x64 "1.29.2" + lightningcss-linux-arm-gnueabihf "1.29.2" + lightningcss-linux-arm64-gnu "1.29.2" + lightningcss-linux-arm64-musl "1.29.2" + lightningcss-linux-x64-gnu "1.29.2" + lightningcss-linux-x64-musl "1.29.2" + lightningcss-win32-arm64-msvc "1.29.2" + lightningcss-win32-x64-msvc "1.29.2" + +lilconfig@^3.0.0, lilconfig@^3.1.1, lilconfig@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-3.1.3.tgz#a1bcfd6257f9585bf5ae14ceeebb7b559025e4c4" + integrity sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw== lines-and-columns@^1.1.6: version "1.2.4" resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== -lint-staged@^13.0.3: - version "13.3.0" - resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-13.3.0.tgz#7965d72a8d6a6c932f85e9c13ccf3596782d28a5" - integrity sha512-mPRtrYnipYYv1FEE134ufbWpeggNTo+O/UPzngoaKzbzHAthvR55am+8GfHTnqNRQVRRrYQLGW9ZyUoD7DsBHQ== - dependencies: - chalk "5.3.0" - commander "11.0.0" - debug "4.3.4" - execa "7.2.0" - lilconfig "2.1.0" - listr2 "6.6.1" - micromatch "4.0.5" - pidtree "0.6.0" - string-argv "0.3.2" - yaml "2.3.1" - -listhen@^1.5.5: - version "1.6.0" - resolved "https://registry.yarnpkg.com/listhen/-/listhen-1.6.0.tgz#df26c527c59b87557be4d0408d4a09626bd946c8" - integrity sha512-z0RcEXVX5oTpY1bO02SKoTU/kmZSrFSngNNzHRM6KICR17PTq7ANush6AE6ztGJwJD4RLpBrVHd9GnV51J7s3w== - dependencies: - "@parcel/watcher" "^2.4.0" - "@parcel/watcher-wasm" "2.4.0" - citty "^0.1.5" - clipboardy "^4.0.0" - consola "^3.2.3" - crossws "^0.1.0" - defu "^6.1.4" - get-port-please "^3.1.2" - h3 "^1.10.1" - http-shutdown "^1.2.2" - jiti "^1.21.0" - mlly "^1.5.0" - node-forge "^1.3.1" - pathe "^1.1.2" - std-env "^3.7.0" - ufo "^1.3.2" - untun "^0.1.3" - uqr "^0.1.2" - -listr2@6.6.1: - version "6.6.1" - resolved "https://registry.yarnpkg.com/listr2/-/listr2-6.6.1.tgz#08b2329e7e8ba6298481464937099f4a2cd7f95d" - integrity sha512-+rAXGHh0fkEWdXBmX+L6mmfmXmXvDGEKzkjxO+8mP3+nI/r/CWznVBvsibXdxda9Zz0OW2e2ikphN3OwCT/jSg== +linkify-it@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-5.0.0.tgz#9ef238bfa6dc70bd8e7f9572b52d369af569b421" + integrity sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ== dependencies: - cli-truncate "^3.1.0" - colorette "^2.0.20" - eventemitter3 "^5.0.1" - log-update "^5.0.1" - rfdc "^1.3.0" - wrap-ansi "^8.1.0" + uc.micro "^2.0.0" -listr2@^8.0.2: - version "8.0.2" - resolved "https://registry.yarnpkg.com/listr2/-/listr2-8.0.2.tgz#07649d1f93ee28c9922c0fca64eaf348b7e4a6b7" - integrity sha512-v5jEMOeEJUpRjSXSB4U3w5A3YPmURYMUO/86f1PA4GGYcdbUQYpkbvKYT7Xaq1iu4Zjn51Rv1UeD1zsBXRijiQ== +listr2@^8.2.5: + version "8.2.5" + resolved "https://registry.yarnpkg.com/listr2/-/listr2-8.2.5.tgz#5c9db996e1afeb05db0448196d3d5f64fec2593d" + integrity sha512-iyAZCeyD+c1gPyE9qpFu8af0Y+MRtmKOncdGoA2S5EY8iFq99dmmvkNnHiWo+pj0s7yH7l3KPIgee77tKpXPWQ== dependencies: cli-truncate "^4.0.0" colorette "^2.0.20" eventemitter3 "^5.0.1" - log-update "^6.0.0" - rfdc "^1.3.1" + log-update "^6.1.0" + rfdc "^1.4.1" wrap-ansi "^9.0.0" lit-element@^3.3.0: @@ -7267,24 +6464,6 @@ load-tsconfig@^0.2.3: resolved "https://registry.yarnpkg.com/load-tsconfig/-/load-tsconfig-0.2.5.tgz#453b8cd8961bfb912dea77eb6c168fe8cca3d3a1" integrity sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg== -load-yaml-file@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/load-yaml-file/-/load-yaml-file-0.2.0.tgz#af854edaf2bea89346c07549122753c07372f64d" - integrity sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw== - dependencies: - graceful-fs "^4.1.5" - js-yaml "^3.13.0" - pify "^4.0.1" - strip-bom "^3.0.0" - -local-pkg@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/local-pkg/-/local-pkg-0.5.0.tgz#093d25a346bae59a99f80e75f6e9d36d7e8c925c" - integrity sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg== - dependencies: - mlly "^1.4.2" - pkg-types "^1.0.3" - locate-path@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" @@ -7354,21 +6533,11 @@ lodash.chunk@^4.2.0: resolved "https://registry.yarnpkg.com/lodash.chunk/-/lodash.chunk-4.2.0.tgz#66e5ce1f76ed27b4303d8c6512e8d1216e8106bc" integrity sha512-ZzydJKfUHJwHa+hF5X66zLFCBrWn5GeF28OHEr4WVWtNDXlQ/IjWKPBiikqKo2ne0+v6JgCgJ0GzJp8k8bHC7w== -lodash.defaults@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c" - integrity sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ== - lodash.get@^4.4.2: version "4.4.2" resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" integrity sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ== -lodash.isarguments@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" - integrity sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg== - lodash.isequal@4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" @@ -7412,12 +6581,12 @@ lodash.uniqby@4.5.0: lodash._baseiteratee "~4.7.0" lodash._baseuniq "~4.6.0" -lodash@^4.17.10, lodash@^4.17.11: +lodash@4.17.21, lodash@^4.17.11: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== -log-symbols@4.1.0: +log-symbols@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== @@ -7425,54 +6594,38 @@ log-symbols@4.1.0: chalk "^4.1.0" is-unicode-supported "^0.1.0" -log-update@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/log-update/-/log-update-5.0.1.tgz#9e928bf70cb183c1f0c9e91d9e6b7115d597ce09" - integrity sha512-5UtUDQ/6edw4ofyljDNcOVJQ4c7OjDro4h3y8e1GQL5iYElYclVHJ3zeWchylvMaKnDbDilC8irOVyexnA/Slw== - dependencies: - ansi-escapes "^5.0.0" - cli-cursor "^4.0.0" - slice-ansi "^5.0.0" - strip-ansi "^7.0.1" - wrap-ansi "^8.0.1" - -log-update@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/log-update/-/log-update-6.0.0.tgz#0ddeb7ac6ad658c944c1de902993fce7c33f5e59" - integrity sha512-niTvB4gqvtof056rRIrTZvjNYE4rCUzO6X/X+kYjd7WFxXeJ0NwEFnRxX6ehkvv3jTwrXnNdtAak5XYZuIyPFw== +log-update@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/log-update/-/log-update-6.1.0.tgz#1a04ff38166f94647ae1af562f4bd6a15b1b7cd4" + integrity sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w== dependencies: - ansi-escapes "^6.2.0" - cli-cursor "^4.0.0" - slice-ansi "^7.0.0" + ansi-escapes "^7.0.0" + cli-cursor "^5.0.0" + slice-ansi "^7.1.0" strip-ansi "^7.1.0" wrap-ansi "^9.0.0" -loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: +loose-envify@^1.1.0, loose-envify@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== dependencies: js-tokens "^3.0.0 || ^4.0.0" -loupe@^2.3.6, loupe@^2.3.7: - version "2.3.7" - resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.7.tgz#6e69b7d4db7d3ab436328013d37d1c8c3540c697" - integrity sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA== - dependencies: - get-func-name "^2.0.1" +loupe@^3.1.0, loupe@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/loupe/-/loupe-3.1.3.tgz#042a8f7986d77f3d0f98ef7990a2b2fef18b0fd2" + integrity sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug== -lru-cache@^10.0.0, lru-cache@^10.0.1, lru-cache@^10.0.2, lru-cache@^10.1.0, lru-cache@^10.2.0, "lru-cache@^9.1.1 || ^10.0.0": - version "10.2.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.2.0.tgz#0bd445ca57363465900f4d1f9bd8db343a4d95c3" - integrity sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q== +lru-cache@^10.1.0, lru-cache@^10.2.0, lru-cache@^10.4.3: + version "10.4.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119" + integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== -lru-cache@^4.0.1: - version "4.1.5" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" - integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== - dependencies: - pseudomap "^1.0.2" - yallist "^2.1.2" +lru-cache@^11.0.0, lru-cache@^11.0.2: + version "11.0.2" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-11.0.2.tgz#fbd8e7cf8211f5e7e5d91905c415a3f55755ca39" + integrity sha512-123qHRfJBmo2jXDbo/a5YOQrJoHF/GNQTLzQ5+IdK5pWpceK17yRc6ozlWd25FxvGKQbIUs91fDFkXmDHTKcyA== lru-cache@^5.1.1: version "5.1.1" @@ -7481,13 +6634,6 @@ lru-cache@^5.1.1: dependencies: yallist "^3.0.2" -lru-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" - integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== - dependencies: - yallist "^4.0.0" - lru_map@^0.3.3: version "0.3.3" resolved "https://registry.yarnpkg.com/lru_map/-/lru_map-0.3.3.tgz#b5c8351b9464cbd750335a79650a0ec0e56118dd" @@ -7498,32 +6644,29 @@ lunr@^2.3.9: resolved "https://registry.yarnpkg.com/lunr/-/lunr-2.3.9.tgz#18b123142832337dd6e964df1a5a7707b25d35e1" integrity sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow== -magic-string@^0.30.5: - version "0.30.6" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.6.tgz#996e21b42f944e45591a68f0905d6a740a12506c" - integrity sha512-n62qCLbPjNjyo+owKtveQxZFZTBm+Ms6YoGD23Wew6Vw337PElFNifQpknPruVRQV57kVShPnLGo9vWxVhpPvA== +magic-string@^0.30.17: + version "0.30.17" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.17.tgz#450a449673d2460e5bbcfba9a61916a1714c7453" + integrity sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA== dependencies: - "@jridgewell/sourcemap-codec" "^1.4.15" - -make-error@^1.1.1: - version "1.3.6" - resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" - integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== - -map-obj@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" - integrity sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg== + "@jridgewell/sourcemap-codec" "^1.5.0" -map-obj@^4.0.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.3.0.tgz#9304f906e93faae70880da102a9f1df0ea8bb05a" - integrity sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ== +markdown-it@^14.1.0: + version "14.1.0" + resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-14.1.0.tgz#3c3c5992883c633db4714ccb4d7b5935d98b7d45" + integrity sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg== + dependencies: + argparse "^2.0.1" + entities "^4.4.0" + linkify-it "^5.0.0" + mdurl "^2.0.0" + punycode.js "^2.3.1" + uc.micro "^2.1.0" -marked@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/marked/-/marked-4.3.0.tgz#796362821b019f734054582038b116481b456cf3" - integrity sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A== +math-intrinsics@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9" + integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== md5.js@^1.3.4: version "1.3.5" @@ -7534,6 +6677,11 @@ md5.js@^1.3.4: inherits "^2.0.1" safe-buffer "^5.1.2" +mdurl@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-2.0.0.tgz#80676ec0433025dd3e17ee983d0fe8de5a2237e0" + integrity sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w== + media-query-parser@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/media-query-parser/-/media-query-parser-2.0.2.tgz#ff79e56cee92615a304a1c2fa4f2bd056c0a1d29" @@ -7546,50 +6694,19 @@ memorystream@^0.3.1: resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2" integrity sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw== -meow@^6.0.0: - version "6.1.1" - resolved "https://registry.yarnpkg.com/meow/-/meow-6.1.1.tgz#1ad64c4b76b2a24dfb2f635fddcadf320d251467" - integrity sha512-3YffViIt2QWgTy6Pale5QpopX/IvU3LPL03jOTqp6pGj3VjesdO/U8CuHMKpnQr4shCNCM5fd5XFFvIIl6JBHg== - dependencies: - "@types/minimist" "^1.2.0" - camelcase-keys "^6.2.2" - decamelize-keys "^1.1.0" - hard-rejection "^2.1.0" - minimist-options "^4.0.2" - normalize-package-data "^2.5.0" - read-pkg-up "^7.0.1" - redent "^3.0.0" - trim-newlines "^3.0.0" - type-fest "^0.13.1" - yargs-parser "^18.1.3" - -merge-options@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/merge-options/-/merge-options-3.0.4.tgz#84709c2aa2a4b24c1981f66c179fe5565cc6dbb7" - integrity sha512-2Sug1+knBjkaMsMgf1ctR1Ujx+Ayku4EdJN4Z+C2+JzoeF7A3OZ9KM2GY0CpQS51NR61LTurMJrRKPhSs3ZRTQ== - dependencies: - is-plain-obj "^2.1.0" - -merge-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" - integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== - merge2@^1.3.0, merge2@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== -merkletreejs@^0.3.11: - version "0.3.11" - resolved "https://registry.yarnpkg.com/merkletreejs/-/merkletreejs-0.3.11.tgz#e0de05c3ca1fd368de05a12cb8efb954ef6fc04f" - integrity sha512-LJKTl4iVNTndhL+3Uz/tfkjD0klIWsHlUzgtuNnNrsf7bAlXR30m+xYB7lHr5Z/l6e/yAIsr26Dabx6Buo4VGQ== +merkletreejs@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/merkletreejs/-/merkletreejs-0.5.1.tgz#cbb30f5db453b437510c0d32f91ec969a63c8e83" + integrity sha512-iR1MI07/HvioeZUvG9EQorcY6zSun8LCmW4jqNbHdecv2XsOt7qYMHWspcjY//lwaSM8/GUMX7ehpm/+UvqrqQ== dependencies: - bignumber.js "^9.0.1" buffer-reverse "^1.0.1" crypto-js "^4.2.0" treeify "^1.1.0" - web3-utils "^1.3.4" mersenne-twister@^1.1.0: version "1.1.0" @@ -7601,12 +6718,12 @@ micro-ftch@^0.3.1: resolved "https://registry.yarnpkg.com/micro-ftch/-/micro-ftch-0.3.1.tgz#6cb83388de4c1f279a034fb0cf96dfc050853c5f" integrity sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg== -micromatch@4.0.5, micromatch@^4.0.2, micromatch@^4.0.4, micromatch@^4.0.5: - version "4.0.5" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" - integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== +micromatch@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" + integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== dependencies: - braces "^3.0.2" + braces "^3.0.3" picomatch "^2.3.1" mime-db@1.52.0: @@ -7621,25 +6738,10 @@ mime-types@^2.1.12: dependencies: mime-db "1.52.0" -mime@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-3.0.0.tgz#b374550dca3a0c18443b0c950a6a58f1931cf7a7" - integrity sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A== - -mimic-fn@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" - integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== - -mimic-fn@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc" - integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== - -min-indent@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" - integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== +mimic-function@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/mimic-function/-/mimic-function-5.0.1.tgz#acbe2b3349f99b9deaca7fb70e48b83e94e67076" + integrity sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA== minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: version "1.0.1" @@ -7651,74 +6753,48 @@ minimalistic-crypto-utils@^1.0.1: resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== -minimatch@5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.0.1.tgz#fb9022f7528125187c92bd9e9b6366be1cf3415b" - integrity sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g== - dependencies: - brace-expansion "^2.0.1" - -minimatch@9.0.3, minimatch@^9.0.1, minimatch@^9.0.3: - version "9.0.3" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" - integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== +minimatch@^10.0.0: + version "10.0.1" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-10.0.1.tgz#ce0521856b453c86e25f2c4c0d03e6ff7ddc440b" + integrity sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ== dependencies: brace-expansion "^2.0.1" -minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: +minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== dependencies: brace-expansion "^1.1.7" -minimatch@^5.0.1: +minimatch@^5.0.1, minimatch@^5.1.6: version "5.1.6" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== dependencies: brace-expansion "^2.0.1" -minimist-options@^4.0.2: - version "4.1.0" - resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-4.1.0.tgz#c0655713c53a8a2ebd77ffa247d342c40f010619" - integrity sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A== +minimatch@^9.0.1, minimatch@^9.0.4, minimatch@^9.0.5: + version "9.0.5" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" + integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== dependencies: - arrify "^1.0.1" - is-plain-obj "^1.1.0" - kind-of "^6.0.3" + brace-expansion "^2.0.1" -minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6, minimist@^1.2.8: +minimist@^1.2.0, minimist@^1.2.6: version "1.2.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== -"minipass@^5.0.0 || ^6.0.2 || ^7.0.0": - version "7.0.4" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.0.4.tgz#dbce03740f50a4786ba994c1fb908844d27b038c" - integrity sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ== - -mipd@0.0.5: - version "0.0.5" - resolved "https://registry.yarnpkg.com/mipd/-/mipd-0.0.5.tgz#367ee796531c23f0631f129038700b1406663aec" - integrity sha512-gbKA784D2WKb5H/GtqEv+Ofd1S9Zj+Z/PGDIl1u1QAbswkxD28BQ5bSXQxkeBzPBABg1iDSbiwGG1XqlOxRspA== - dependencies: - viem "^1.1.4" - -mixme@^0.5.1: - version "0.5.10" - resolved "https://registry.yarnpkg.com/mixme/-/mixme-0.5.10.tgz#d653b2984b75d9018828f1ea333e51717ead5f51" - integrity sha512-5H76ANWinB1H3twpJ6JY8uvAtpmFvHNArpilJAjXRKXSDDLPIMoZArw5SH0q9z+lLs8IrMw7Q2VWpWimFKFT1Q== +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.1.2: + version "7.1.2" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707" + integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== -mlly@^1.2.0, mlly@^1.4.2, mlly@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/mlly/-/mlly-1.5.0.tgz#8428a4617d54cc083d3009030ac79739a0e5447a" - integrity sha512-NPVQvAY1xr1QoVeG0cy8yUYC7FQcOx6evl/RjT1wL5FvzPnzOysoqB/jmx/DhssT2dYa8nxECLAaFI/+gVLhDQ== - dependencies: - acorn "^8.11.3" - pathe "^1.1.2" - pkg-types "^1.0.3" - ufo "^1.3.2" +mipd@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/mipd/-/mipd-0.0.7.tgz#bb5559e21fa18dc3d9fe1c08902ef14b7ce32fd9" + integrity sha512-aAPZPNDQ3uMTdKbuO2YmAw2TxLHO0moa4YKAyETM/DTj5FloZo+a+8tU+iv4GmW+sOxKLSRwcSFuczk+Cpt6fg== mnemonist@^0.38.0: version "0.38.5" @@ -7728,47 +6804,35 @@ mnemonist@^0.38.0: obliterator "^2.0.0" mocha@^10.0.0: - version "10.3.0" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.3.0.tgz#0e185c49e6dccf582035c05fa91084a4ff6e3fe9" - integrity sha512-uF2XJs+7xSLsrmIvn37i/wnc91nw7XjOQB8ccyx5aEgdnohr7n+rEiZP23WkCYHjilR6+EboEnbq/ZQDz4LSbg== - dependencies: - ansi-colors "4.1.1" - browser-stdout "1.3.1" - chokidar "3.5.3" - debug "4.3.4" - diff "5.0.0" - escape-string-regexp "4.0.0" - find-up "5.0.0" - glob "8.1.0" - he "1.2.0" - js-yaml "4.1.0" - log-symbols "4.1.0" - minimatch "5.0.1" - ms "2.1.3" - serialize-javascript "6.0.0" - strip-json-comments "3.1.1" - supports-color "8.1.1" - workerpool "6.2.1" - yargs "16.2.0" - yargs-parser "20.2.4" - yargs-unparser "2.0.0" - -mock-property@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/mock-property/-/mock-property-1.0.3.tgz#3e37c50a56609d548cabd56559fde3dd8767b10c" - integrity sha512-2emPTb1reeLLYwHxyVx993iYyCHEiRRO+y8NFXFPL5kl5q14sgTK76cXyEKkeKCHeRw35SfdkUJ10Q1KfHuiIQ== + version "10.8.2" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.8.2.tgz#8d8342d016ed411b12a429eb731b825f961afb96" + integrity sha512-VZlYo/WE8t1tstuRmqgeyBgCbJc/lEdopaa+axcKzTBJ+UIdlAB9XnmvTCAH4pwR4ElNInaedhEBmZD8iCSVEg== dependencies: - define-data-property "^1.1.1" - functions-have-names "^1.2.3" - gopd "^1.0.1" - has-property-descriptors "^1.0.0" - hasown "^2.0.0" - isarray "^2.0.5" + ansi-colors "^4.1.3" + browser-stdout "^1.3.1" + chokidar "^3.5.3" + debug "^4.3.5" + diff "^5.2.0" + escape-string-regexp "^4.0.0" + find-up "^5.0.0" + glob "^8.1.0" + he "^1.2.0" + js-yaml "^4.1.0" + log-symbols "^4.1.0" + minimatch "^5.1.6" + ms "^2.1.3" + serialize-javascript "^6.0.2" + strip-json-comments "^3.1.1" + supports-color "^8.1.1" + workerpool "^6.5.1" + yargs "^16.2.0" + yargs-parser "^20.2.9" + yargs-unparser "^2.0.0" modern-ahocorasick@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/modern-ahocorasick/-/modern-ahocorasick-1.0.1.tgz#dec373444f51b5458ac05216a8ec376e126dd283" - integrity sha512-yoe+JbhTClckZ67b2itRtistFKf8yPYelHLc7e5xAwtNAXxM6wJTUx2C7QeVSJFDzKT7bCIFyBVybPMKvmB9AA== + version "1.1.0" + resolved "https://registry.yarnpkg.com/modern-ahocorasick/-/modern-ahocorasick-1.1.0.tgz#9b1fa15d4f654be20a2ad7ecc44ec9d7645bb420" + integrity sha512-sEKPVl2rM+MNVkGQt3ChdmD8YsigmXdn5NifZn6jiwn9LRJpWm8F3guhaqrJT/JOat6pwpbXEk6kv+b9DMIjsQ== motion@10.16.2: version "10.16.2" @@ -7787,12 +6851,7 @@ mri@^1.2.0: resolved "https://registry.yarnpkg.com/mri/-/mri-1.2.0.tgz#6721480fec2a11a4889861115a48b6cbe7cc8f0b" integrity sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA== -ms@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -ms@2.1.3, ms@^2.1.1: +ms@^2.1.1, ms@^2.1.3: version "2.1.3" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== @@ -7816,26 +6875,16 @@ mz@^2.7.0: object-assign "^4.0.1" thenify-all "^1.0.0" -nanoid@^3.3.4, nanoid@^3.3.7: - version "3.3.7" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" - integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== - -napi-wasm@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/napi-wasm/-/napi-wasm-1.1.0.tgz#bbe617823765ae9c1bc12ff5942370eae7b2ba4e" - integrity sha512-lHwIAJbmLSjF9VDRm9GoVOy9AGp3aIvkjv+Kvz9h16QR3uSVYH78PNQUnT2U4X53mhlnV2M7wrhibQ3GHicDmg== +nanoid@^3.3.4, nanoid@^3.3.8: + version "3.3.9" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.9.tgz#e0097d8e026b3343ff053e9ccd407360a03f503a" + integrity sha512-SppoicMGpZvbF1l3z4x7No3OlIjP7QJvC9XR7AhZr1kL133KHnKPztkKDc+Ir4aJ/1VhTySrtKhrsycmrMQfvg== natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== -neo-async@^2.6.2: - version "2.6.2" - resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" - integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== - next-transpile-modules@10.0.1: version "10.0.1" resolved "https://registry.yarnpkg.com/next-transpile-modules/-/next-transpile-modules-10.0.1.tgz#1ca2b735b14781f4792f6214f808b600574e0348" @@ -7869,7 +6918,7 @@ next@13.0.0: "@next/swc-win32-ia32-msvc" "13.0.0" "@next/swc-win32-x64-msvc" "13.0.0" -nise@^5.1.5: +nise@^5.1.9: version "5.1.9" resolved "https://registry.yarnpkg.com/nise/-/nise-5.1.9.tgz#0cb73b5e4499d738231a473cd89bd8afbb618139" integrity sha512-qOnoujW4SV6e40dYxJOb3uvuoPHtmLzIk4TFo+j0jPJoC+5Z9xja5qH5JZobEPsa8+YYphMrOSwnrshEhG2qww== @@ -7890,75 +6939,32 @@ node-addon-api@^5.0.0: resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-5.1.0.tgz#49da1ca055e109a23d537e9de43c09cca21eb762" integrity sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA== -node-addon-api@^7.0.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-7.1.0.tgz#71f609369379c08e251c558527a107107b5e0fdb" - integrity sha512-mNcltoe1R8o7STTegSOHdnJNN7s5EUvhoS7ShnTHDyOSd+8H+UdWODq6qSv67PjC8Zc5JRT8+oLAMCr0SIXw7g== - -node-fetch-native@^1.4.0, node-fetch-native@^1.4.1, node-fetch-native@^1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/node-fetch-native/-/node-fetch-native-1.6.1.tgz#f95c74917d3cebc794cdae0cd2a9c7594aad0cb4" - integrity sha512-bW9T/uJDPAJB2YNYEpWzE54U5O3MQidXsOyTfnbKYtTtFexRvGzb1waphBN4ZwP6EcIvYYEOwW0b72BpAqydTw== - -node-fetch-native@^1.6.2: - version "1.6.2" - resolved "https://registry.yarnpkg.com/node-fetch-native/-/node-fetch-native-1.6.2.tgz#f439000d972eb0c8a741b65dcda412322955e1c6" - integrity sha512-69mtXOFZ6hSkYiXAVB5SqaRvrbITC/NPyqv7yuu/qw0nmgPyYbIMYYNIDhNtwPrzk0ptrimrLz/hhjvm4w5Z+w== +node-fetch-native@^1.6.4, node-fetch-native@^1.6.6: + version "1.6.6" + resolved "https://registry.yarnpkg.com/node-fetch-native/-/node-fetch-native-1.6.6.tgz#ae1d0e537af35c2c0b0de81cbff37eedd410aa37" + integrity sha512-8Mc2HhqPdlIfedsuZoc3yioPuzp6b+L5jRCRY1QzuWZh2EGJVQrGppC6V6cF0bLdbW0+O2YpqCA25aF/1lvipQ== -node-fetch@^2.6.1, node-fetch@^2.6.12: +node-fetch@^2.7.0: version "2.7.0" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== dependencies: whatwg-url "^5.0.0" -node-forge@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3" - integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== - node-gyp-build@^4.2.0, node-gyp-build@^4.3.0: - version "4.8.0" - resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.8.0.tgz#3fee9c1731df4581a3f9ead74664369ff00d26dd" - integrity sha512-u6fs2AEUljNho3EYTJNBfImO5QTo/J/1Etd+NVdCj7qWKUSN/bSLkZwhDv7I+w/MSC6qJ4cknepkAYykDdK8og== - -node-releases@^2.0.14: - version "2.0.14" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.14.tgz#2ffb053bceb8b2be8495ece1ab6ce600c4461b0b" - integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw== - -nodemon@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-3.0.3.tgz#244a62d1c690eece3f6165c6cdb0db03ebd80b76" - integrity sha512-7jH/NXbFPxVaMwmBCC2B9F/V6X1VkEdNgx3iu9jji8WxWcvhMWkmhNWhI5077zknOnZnBzba9hZP6bCPJLSReQ== - dependencies: - chokidar "^3.5.2" - debug "^4" - ignore-by-default "^1.0.1" - minimatch "^3.1.2" - pstree.remy "^1.1.8" - semver "^7.5.3" - simple-update-notifier "^2.0.0" - supports-color "^5.5.0" - touch "^3.1.0" - undefsafe "^2.0.5" + version "4.8.4" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.8.4.tgz#8a70ee85464ae52327772a90d66c6077a900cfc8" + integrity sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ== -nopt@~1.0.10: - version "1.0.10" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee" - integrity sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg== - dependencies: - abbrev "1" +node-mock-http@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/node-mock-http/-/node-mock-http-1.0.0.tgz#4b32cd509c7f46d844e68ea93fb8be405a18a42a" + integrity sha512-0uGYQ1WQL1M5kKvGRXWQ3uZCHtLTO8hln3oBjIusM75WoesZ909uQJs/Hb946i2SS+Gsrhkaa6iAO17jRIv6DQ== -normalize-package-data@^2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" - integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== - dependencies: - hosted-git-info "^2.1.4" - resolve "^1.10.0" - semver "2 || 3 || 4 || 5" - validate-npm-package-license "^3.0.1" +node-releases@^2.0.19: + version "2.0.19" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.19.tgz#9e445a52950951ec4d177d843af370b411caf314" + integrity sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw== normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" @@ -7970,28 +6976,6 @@ normalize-range@^0.1.2: resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== -npm-run-path@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" - integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== - dependencies: - path-key "^3.0.0" - -npm-run-path@^5.1.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-5.2.0.tgz#224cdd22c755560253dd71b83a1ef2f758b2e955" - integrity sha512-W4/tgAXFqFA0iL7fk0+uQ3g7wkL8xJmx3XdK0VGb4cHW//eZTtKGvFBBoRKVTpY7n6ze4NL9ly7rgXcHufqXKg== - dependencies: - path-key "^4.0.0" - -number-to-bn@1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/number-to-bn/-/number-to-bn-1.7.0.tgz#bb3623592f7e5f9e0030b1977bd41a0c53fe1ea0" - integrity sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig== - dependencies: - bn.js "4.11.6" - strip-hex-prefix "1.0.0" - obj-multiplex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/obj-multiplex/-/obj-multiplex-1.0.0.tgz#2f2ae6bfd4ae11befe742ea9ea5b36636eabffc1" @@ -8001,7 +6985,7 @@ obj-multiplex@^1.0.0: once "^1.4.0" readable-stream "^2.3.3" -object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: +object-assign@^4.0.1, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== @@ -8011,97 +6995,79 @@ object-hash@^3.0.0: resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-3.0.0.tgz#73f97f753e7baffc0e2cc9d6e079079744ac82e9" integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== -object-inspect@^1.13.1, object-inspect@^1.9.0: - version "1.13.1" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2" - integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== - -object-is@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" - integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" +object-inspect@^1.13.3: + version "1.13.4" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.4.tgz#8375265e21bc20d0fa582c22e1b13485d6e00213" + integrity sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew== object-keys@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== -object.assign@^4.1.4, object.assign@^4.1.5: - version "4.1.5" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.5.tgz#3a833f9ab7fdb80fc9e8d2300c803d216d8fdbb0" - integrity sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ== +object.assign@^4.1.4, object.assign@^4.1.7: + version "4.1.7" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.7.tgz#8c14ca1a424c6a561b0bb2a22f66f5049a945d3d" + integrity sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw== dependencies: - call-bind "^1.0.5" + call-bind "^1.0.8" + call-bound "^1.0.3" define-properties "^1.2.1" - has-symbols "^1.0.3" + es-object-atoms "^1.0.0" + has-symbols "^1.1.0" object-keys "^1.1.1" -object.entries@^1.1.6, object.entries@^1.1.7: - version "1.1.7" - resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.7.tgz#2b47760e2a2e3a752f39dd874655c61a7f03c131" - integrity sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - -object.fromentries@^2.0.6, object.fromentries@^2.0.7: - version "2.0.7" - resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.7.tgz#71e95f441e9a0ea6baf682ecaaf37fa2a8d7e616" - integrity sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA== +object.entries@^1.1.8: + version "1.1.8" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.8.tgz#bffe6f282e01f4d17807204a24f8edd823599c41" + integrity sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" -object.groupby@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.1.tgz#d41d9f3c8d6c778d9cbac86b4ee9f5af103152ee" - integrity sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ== +object.fromentries@^2.0.8: + version "2.0.8" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.8.tgz#f7195d8a9b97bd95cbc1999ea939ecd1a2b00c65" + integrity sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - get-intrinsic "^1.2.1" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-object-atoms "^1.0.0" -object.hasown@^1.1.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.3.tgz#6a5f2897bb4d3668b8e79364f98ccf971bda55ae" - integrity sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA== +object.groupby@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.3.tgz#9b125c36238129f6f7b61954a1e7176148d5002e" + integrity sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ== dependencies: - define-properties "^1.2.0" - es-abstract "^1.22.1" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" -object.values@^1.1.6, object.values@^1.1.7: - version "1.1.7" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.7.tgz#617ed13272e7e1071b43973aa1655d9291b8442a" - integrity sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng== +object.values@^1.1.6, object.values@^1.2.0, object.values@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.2.1.tgz#deed520a50809ff7f75a7cfd4bc64c7a038c6216" + integrity sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" + call-bind "^1.0.8" + call-bound "^1.0.3" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" obliterator@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/obliterator/-/obliterator-2.0.4.tgz#fa650e019b2d075d745e44f1effeb13a2adbe816" - integrity sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ== + version "2.0.5" + resolved "https://registry.yarnpkg.com/obliterator/-/obliterator-2.0.5.tgz#031e0145354b0c18840336ae51d41e7d6d2c76aa" + integrity sha512-42CPE9AhahZRsMNslczq0ctAEtqk8Eka26QofnqC346BZdHDySk3LWka23LI7ULIw11NmltpiLagIq8gBozxTw== -ofetch@^1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/ofetch/-/ofetch-1.3.3.tgz#588cb806a28e5c66c2c47dd8994f9059a036d8c0" - integrity sha512-s1ZCMmQWXy4b5K/TW9i/DtiN8Ku+xCiHcjQ6/J/nDdssirrQNOoB165Zu8EqLMA2lln1JUth9a0aW9Ap2ctrUg== +ofetch@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/ofetch/-/ofetch-1.4.1.tgz#b6bf6b0d75ba616cef6519dd8b6385a8bae480ec" + integrity sha512-QZj2DfGplQAr2oj9KzceK9Hwz6Whxazmn85yYeVuS3u9XTMOGMRx0kO95MQ+vLsj/S/NwBDMMLU5hpxvI6Tklw== dependencies: - destr "^2.0.1" - node-fetch-native "^1.4.0" - ufo "^1.3.0" - -ohash@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/ohash/-/ohash-1.1.3.tgz#f12c3c50bfe7271ce3fd1097d42568122ccdcf07" - integrity sha512-zuHHiGTYTA1sYJ/wZN+t5HKZaH23i4yI1HMwbuXm24Nid7Dv0KcuRlKoNKS9UNfAVSBlnGLcuQrnOKWOZoEGaw== + destr "^2.0.3" + node-fetch-native "^1.6.4" + ufo "^1.5.4" on-exit-leak-free@^0.2.0: version "0.2.0" @@ -8115,52 +7081,31 @@ once@^1.3.0, once@^1.3.1, once@^1.4.0: dependencies: wrappy "1" -onetime@^5.1.0, onetime@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" - integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== - dependencies: - mimic-fn "^2.1.0" - -onetime@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-6.0.0.tgz#7c24c18ed1fd2e9bca4bd26806a33613c77d34b4" - integrity sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ== - dependencies: - mimic-fn "^4.0.0" - -open@^8.4.0: - version "8.4.2" - resolved "https://registry.yarnpkg.com/open/-/open-8.4.2.tgz#5b5ffe2a8f793dcd2aad73e550cb87b59cb084f9" - integrity sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ== +onetime@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-7.0.0.tgz#9f16c92d8c9ef5120e3acd9dd9957cceecc1ab60" + integrity sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ== dependencies: - define-lazy-prop "^2.0.0" - is-docker "^2.1.1" - is-wsl "^2.2.0" + mimic-function "^5.0.0" openpgp@^5.5.0: - version "5.11.0" - resolved "https://registry.yarnpkg.com/openpgp/-/openpgp-5.11.0.tgz#cec5b285d188148f7b5201b9aceb53850cc286a2" - integrity sha512-hytHsxIPtRhuh6uAmoBUThHSwHSX3imLu7x4453T+xkVqIw49rl22MRD4KQIAQdCDoVdouejzYgcuLmMA/2OAA== + version "5.11.2" + resolved "https://registry.yarnpkg.com/openpgp/-/openpgp-5.11.2.tgz#2c035a26b13feb3b0bb5180718ec91c8e65cc686" + integrity sha512-f8dJFVLwdkvPvW3VPFs6q9Vs2+HNhdvwls7a/MIFcQUB+XiQzRe7alfa3RtwfGJU7oUDDMAWPZ0nYsHa23Az+A== dependencies: asn1.js "^5.0.0" optionator@^0.9.3: - version "0.9.3" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64" - integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg== + version "0.9.4" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" + integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== dependencies: - "@aashutoshrathi/word-wrap" "^1.2.3" deep-is "^0.1.3" fast-levenshtein "^2.0.6" levn "^0.4.1" prelude-ls "^1.2.1" type-check "^0.4.0" - -os-browserify@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" - integrity sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A== + word-wrap "^1.2.5" os-tmpdir@~1.0.2: version "1.0.2" @@ -8172,10 +7117,53 @@ outdent@^0.5.0: resolved "https://registry.yarnpkg.com/outdent/-/outdent-0.5.0.tgz#9e10982fdc41492bb473ad13840d22f9655be2ff" integrity sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q== -outdent@^0.8.0: - version "0.8.0" - resolved "https://registry.yarnpkg.com/outdent/-/outdent-0.8.0.tgz#2ebc3e77bf49912543f1008100ff8e7f44428eb0" - integrity sha512-KiOAIsdpUTcAXuykya5fnVVT+/5uS0Q1mrkRHcF89tpieSmY33O/tmc54CqwA+bfhbtEfZUNLHaPUiB9X3jt1A== +own-keys@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/own-keys/-/own-keys-1.0.1.tgz#e4006910a2bf913585289676eebd6f390cf51358" + integrity sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg== + dependencies: + get-intrinsic "^1.2.6" + object-keys "^1.1.1" + safe-push-apply "^1.0.0" + +ox@0.6.7: + version "0.6.7" + resolved "https://registry.yarnpkg.com/ox/-/ox-0.6.7.tgz#afd53f2ecef68b8526660e9d29dee6e6b599a832" + integrity sha512-17Gk/eFsFRAZ80p5eKqv89a57uXjd3NgIf1CaXojATPBuujVc/fQSVhBeAU9JCRB+k7J50WQAyWTxK19T9GgbA== + dependencies: + "@adraffy/ens-normalize" "^1.10.1" + "@noble/curves" "^1.6.0" + "@noble/hashes" "^1.5.0" + "@scure/bip32" "^1.5.0" + "@scure/bip39" "^1.4.0" + abitype "^1.0.6" + eventemitter3 "5.0.1" + +ox@0.6.9: + version "0.6.9" + resolved "https://registry.yarnpkg.com/ox/-/ox-0.6.9.tgz#da1ee04fa10de30c8d04c15bfb80fe58b1f554bd" + integrity sha512-wi5ShvzE4eOcTwQVsIPdFr+8ycyX+5le/96iAJutaZAvCes1J0+RvpEPg5QDPDiaR0XQQAvZVl7AwqQcINuUug== + dependencies: + "@adraffy/ens-normalize" "^1.10.1" + "@noble/curves" "^1.6.0" + "@noble/hashes" "^1.5.0" + "@scure/bip32" "^1.5.0" + "@scure/bip39" "^1.4.0" + abitype "^1.0.6" + eventemitter3 "5.0.1" + +ox@^0.6.9: + version "0.6.10" + resolved "https://registry.yarnpkg.com/ox/-/ox-0.6.10.tgz#5a3ff11d0c2b21422acf670e10e155ca79c93505" + integrity sha512-B3rYmtaDF5smwQcVKSar+1wuYX8VlQ82Nxp5i6q/FaXskXY9tbJNTnwZ2f7uMfqTZIPx1lPzDUdjrCTPeC5LXQ== + dependencies: + "@adraffy/ens-normalize" "^1.10.1" + "@noble/curves" "^1.6.0" + "@noble/hashes" "^1.5.0" + "@scure/bip32" "^1.5.0" + "@scure/bip39" "^1.4.0" + abitype "^1.0.6" + eventemitter3 "5.0.1" p-filter@^2.1.0: version "2.1.0" @@ -8205,13 +7193,6 @@ p-limit@^3.0.2: dependencies: yocto-queue "^0.1.0" -p-limit@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-5.0.0.tgz#6946d5b7140b649b7a33a027d89b4c625b3a5985" - integrity sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ== - dependencies: - yocto-queue "^1.0.0" - p-locate@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" @@ -8255,6 +7236,18 @@ p-try@^2.0.0: resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== +package-json-from-dist@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz#4f1471a010827a86f94cfd9b0727e36d267de505" + integrity sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw== + +package-manager-detector@^0.2.0: + version "0.2.11" + resolved "https://registry.yarnpkg.com/package-manager-detector/-/package-manager-detector-0.2.11.tgz#3af0b34f99d86d24af0a0620603d2e1180d05c9c" + integrity sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ== + dependencies: + quansync "^0.2.7" + pako@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/pako/-/pako-2.1.0.tgz#266cc37f98c7d883545d11335c00fbd4062c9a86" @@ -8275,21 +7268,6 @@ parse-json@^4.0.0: error-ex "^1.3.1" json-parse-better-errors "^1.0.1" -parse-json@^5.0.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" - integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== - dependencies: - "@babel/code-frame" "^7.0.0" - error-ex "^1.3.1" - json-parse-even-better-errors "^2.3.0" - lines-and-columns "^1.1.6" - -parse-ms@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parse-ms/-/parse-ms-1.0.1.tgz#56346d4749d78f23430ca0c713850aef91aa361d" - integrity sha512-LpH1Cf5EYuVjkBvCDBYvkUPh+iv2bk3FHflxHkpCYT0/FZ1d3N3uJaLiHr4yGuMcFUhv6eAivitTvWZI4B/chg== - path-exists@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" @@ -8305,48 +7283,51 @@ path-is-absolute@^1.0.0: resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== -path-key@^3.0.0, path-key@^3.1.0: +path-key@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== -path-key@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-4.0.0.tgz#295588dc3aee64154f877adb9d780b81c554bf18" - integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ== - path-parse@^1.0.6, path-parse@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== -path-scurry@^1.10.1: - version "1.10.1" - resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.10.1.tgz#9ba6bf5aa8500fe9fd67df4f0d9483b2b0bfc698" - integrity sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ== +path-scurry@^1.10.1, path-scurry@^1.11.1: + version "1.11.1" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.11.1.tgz#7960a668888594a0720b12a911d1a742ab9f11d2" + integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA== dependencies: - lru-cache "^9.1.1 || ^10.0.0" + lru-cache "^10.2.0" minipass "^5.0.0 || ^6.0.2 || ^7.0.0" +path-scurry@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-2.0.0.tgz#9f052289f23ad8bf9397a2a0425e7b8615c58580" + integrity sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg== + dependencies: + lru-cache "^11.0.0" + minipass "^7.1.2" + path-to-regexp@^6.2.1: - version "6.2.1" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-6.2.1.tgz#d54934d6798eb9e5ef14e7af7962c945906918e5" - integrity sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw== + version "6.3.0" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-6.3.0.tgz#2b6a26a337737a8e1416f9272ed0766b1c0389f4" + integrity sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ== path-type@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== -pathe@^1.1.0, pathe@^1.1.1, pathe@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/pathe/-/pathe-1.1.2.tgz#6c4cb47a945692e48a1ddd6e4094d170516437ec" - integrity sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ== +pathe@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/pathe/-/pathe-2.0.3.tgz#3ecbec55421685b70a9da872b2cff3e1cbed1716" + integrity sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w== -pathval@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" - integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== +pathval@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pathval/-/pathval-2.0.0.tgz#7e2550b422601d4f6b8e26f1301bc8f15a741a25" + integrity sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA== pbkdf2@^3.0.17: version "3.1.2" @@ -8359,20 +7340,20 @@ pbkdf2@^3.0.17: safe-buffer "^5.0.1" sha.js "^2.4.8" -picocolors@^1, picocolors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" - integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== +picocolors@^1, picocolors@^1.0.0, picocolors@^1.1.0, picocolors@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" + integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== -pidtree@0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.6.0.tgz#90ad7b6d42d5841e69e0a2419ef38f8883aa057c" - integrity sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g== +picomatch@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.2.tgz#77c742931e8f3b8820946c76cd0c1f13730d1dab" + integrity sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg== pify@^2.3.0: version "2.3.0" @@ -8437,36 +7418,20 @@ pkg-conf@^2.1.0: find-up "^2.0.0" load-json-file "^4.0.0" -pkg-dir@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" - integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== - dependencies: - find-up "^4.0.0" - -pkg-types@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/pkg-types/-/pkg-types-1.0.3.tgz#988b42ab19254c01614d13f4f65a2cfc7880f868" - integrity sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A== - dependencies: - jsonc-parser "^3.2.0" - mlly "^1.2.0" - pathe "^1.1.0" - -plur@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/plur/-/plur-1.0.0.tgz#db85c6814f5e5e5a3b49efc28d604fec62975156" - integrity sha512-qSnKBSZeDY8ApxwhfVIwKwF36KVJqb1/9nzYYq3j3vdwocULCXT8f8fQGkiw1Nk9BGfxiDagEe/pwakA+bOBqw== - pngjs@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-5.0.0.tgz#e79dd2b215767fd9c04561c01236df960bce7fbb" integrity sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw== pony-cause@^2.1.10: - version "2.1.10" - resolved "https://registry.yarnpkg.com/pony-cause/-/pony-cause-2.1.10.tgz#828457ad6f13be401a075dbf14107a9057945174" - integrity sha512-3IKLNXclQgkU++2fSi93sQ6BznFuxSLB11HdvZQ6JW/spahf/P1pAHBQEahr20rs0htZW0UDkM1HmA+nZkXKsw== + version "2.1.11" + resolved "https://registry.yarnpkg.com/pony-cause/-/pony-cause-2.1.11.tgz#d69a20aaccdb3bdb8f74dd59e5c68d8e6772e4bd" + integrity sha512-M7LhCsdNbNgiLYiP4WjsfLUuFmCfnjdF6jKe2R9NKl4WFN+HZPGHJZ9lnLP7f9ZnKe3U9nuWD0szirmj+migUg== + +possible-typed-array-names@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz#93e3582bc0e5426586d9d07b79ee40fc841de4ae" + integrity sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg== postcss-import@^15.1.0: version "15.1.0" @@ -8484,7 +7449,7 @@ postcss-js@^4, postcss-js@^4.0.1: dependencies: camelcase-css "^2.0.1" -postcss-load-config@^4.0.1: +postcss-load-config@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-4.0.2.tgz#7159dcf626118d33e299f485d6afe4aff7c4a3e3" integrity sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ== @@ -8492,12 +7457,19 @@ postcss-load-config@^4.0.1: lilconfig "^3.0.0" yaml "^2.3.4" -postcss-nested@^6.0.1: +postcss-load-config@^6.0.1: version "6.0.1" - resolved "https://registry.yarnpkg.com/postcss-nested/-/postcss-nested-6.0.1.tgz#f83dc9846ca16d2f4fa864f16e9d9f7d0961662c" - integrity sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ== + resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-6.0.1.tgz#6fd7dcd8ae89badcf1b2d644489cbabf83aa8096" + integrity sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g== + dependencies: + lilconfig "^3.1.1" + +postcss-nested@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/postcss-nested/-/postcss-nested-6.2.0.tgz#4c2d22ab5f20b9cb61e2c5c5915950784d068131" + integrity sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ== dependencies: - postcss-selector-parser "^6.0.11" + postcss-selector-parser "^6.1.1" postcss-selector-parser@6.0.10: version "6.0.10" @@ -8507,10 +7479,10 @@ postcss-selector-parser@6.0.10: cssesc "^3.0.0" util-deprecate "^1.0.2" -postcss-selector-parser@^6.0.11: - version "6.0.15" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz#11cc2b21eebc0b99ea374ffb9887174855a01535" - integrity sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw== +postcss-selector-parser@^6.1.1, postcss-selector-parser@^6.1.2: + version "6.1.2" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz#27ecb41fb0e3b6ba7a1ec84fff347f734c7929de" + integrity sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg== dependencies: cssesc "^3.0.0" util-deprecate "^1.0.2" @@ -8529,81 +7501,44 @@ postcss@8.4.14: picocolors "^1.0.0" source-map-js "^1.0.2" -postcss@^8.4.23, postcss@^8.4.32, postcss@^8.4.4: - version "8.4.33" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.33.tgz#1378e859c9f69bf6f638b990a0212f43e2aaa742" - integrity sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg== - dependencies: - nanoid "^3.3.7" - picocolors "^1.0.0" - source-map-js "^1.0.2" - -postcss@^8.4.35: - version "8.4.35" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.35.tgz#60997775689ce09011edf083a549cea44aabe2f7" - integrity sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA== +postcss@^8.4.4, postcss@^8.4.47, postcss@^8.5.3: + version "8.5.3" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.3.tgz#1463b6f1c7fb16fe258736cba29a2de35237eafb" + integrity sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A== dependencies: - nanoid "^3.3.7" - picocolors "^1.0.0" - source-map-js "^1.0.2" + nanoid "^3.3.8" + picocolors "^1.1.1" + source-map-js "^1.2.1" -preact@^10.16.0: - version "10.19.3" - resolved "https://registry.yarnpkg.com/preact/-/preact-10.19.3.tgz#7a7107ed2598a60676c943709ea3efb8aaafa899" - integrity sha512-nHHTeFVBTHRGxJXKkKu5hT8C/YWBkPso4/Gad6xuj5dbptt9iF9NZr9pHbPhBrnT2klheu7mHTxTZ/LjwJiEiQ== - -preferred-pm@^3.0.0: - version "3.1.3" - resolved "https://registry.yarnpkg.com/preferred-pm/-/preferred-pm-3.1.3.tgz#4125ea5154603136c3b6444e5f5c94ecf90e4916" - integrity sha512-MkXsENfftWSRpzCzImcp4FRsCc3y1opwB73CfCNWyzMqArju2CrlMHlqB7VexKiPEOjGMbttv1r9fSCn5S610w== - dependencies: - find-up "^5.0.0" - find-yarn-workspace-root2 "1.2.16" - path-exists "^4.0.0" - which-pm "2.0.0" +preact@^10.16.0, preact@^10.24.2: + version "10.26.4" + resolved "https://registry.yarnpkg.com/preact/-/preact-10.26.4.tgz#b514f4249453a4247c82ff6d1267d59b7d78f9f9" + integrity sha512-KJhO7LBFTjP71d83trW+Ilnjbo+ySsaAgCfXOXUlmGzJ4ygYPWmysm77yg4emwfmoz3b22yvH5IsVFHbhUaH5w== prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== -prettier-plugin-organize-imports@^3.2.4: - version "3.2.4" - resolved "https://registry.yarnpkg.com/prettier-plugin-organize-imports/-/prettier-plugin-organize-imports-3.2.4.tgz#77967f69d335e9c8e6e5d224074609309c62845e" - integrity sha512-6m8WBhIp0dfwu0SkgfOxJqh+HpdyfqSSLfKKRZSFbDuEQXDDndb8fTpRWkUrX/uBenkex3MgnVk0J3b3Y5byog== - -prettier-plugin-tailwindcss@^0.5.11: - version "0.5.11" - resolved "https://registry.yarnpkg.com/prettier-plugin-tailwindcss/-/prettier-plugin-tailwindcss-0.5.11.tgz#1aa9308c3285b3cb7942aaeaec8d0e0775ac54d0" - integrity sha512-AvI/DNyMctyyxGOjyePgi/gqj5hJYClZ1avtQvLlqMT3uDZkRbi4HhGUpok3DRzv9z7Lti85Kdj3s3/1CeNI0w== - -prettier@^2.7.1, prettier@^3.2.5: - version "3.2.5" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.2.5.tgz#e52bc3090586e824964a8813b09aba6233b28368" - integrity sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A== +prettier-plugin-organize-imports@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/prettier-plugin-organize-imports/-/prettier-plugin-organize-imports-4.1.0.tgz#f3d3764046a8e7ba6491431158b9be6ffd83b90f" + integrity sha512-5aWRdCgv645xaa58X8lOxzZoiHAldAPChljr/MT0crXVOWTZ+Svl4hIWlz+niYSlO6ikE5UXkN1JrRvIP2ut0A== -pretty-format@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.7.0.tgz#ca42c758310f365bfa71a0bda0a807160b776812" - integrity sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ== - dependencies: - "@jest/schemas" "^29.6.3" - ansi-styles "^5.0.0" - react-is "^18.0.0" +prettier-plugin-tailwindcss@^0.6.11: + version "0.6.11" + resolved "https://registry.yarnpkg.com/prettier-plugin-tailwindcss/-/prettier-plugin-tailwindcss-0.6.11.tgz#cfacd60c4f81997353ee913e589037f796df0f5f" + integrity sha512-YxaYSIvZPAqhrrEpRtonnrXdghZg1irNg4qrjboCXrpybLWVs55cW2N3juhspVJiO0JBvYJT8SYsJpc8OQSnsA== -pretty-ms@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/pretty-ms/-/pretty-ms-2.1.0.tgz#4257c256df3fb0b451d6affaab021884126981dc" - integrity sha512-H2enpsxzDhuzRl3zeSQpQMirn8dB0Z/gxW96j06tMfTviUWvX14gjKb7qd1gtkUyYhDPuoNe00K5PqNvy2oQNg== - dependencies: - is-finite "^1.0.1" - parse-ms "^1.0.0" - plur "^1.0.0" +prettier@^2.7.1: + version "2.8.8" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" + integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== -process-nextick-args@~1.0.6: - version "1.0.7" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" - integrity sha512-yN0WQmuCX63LP/TMvAg31nvT6m4vDqJEiiv2CAZqWOGNWutc9DfDk1NPYYmKUFmaVM2UwDowH4u5AHWYP/jxKw== +prettier@^3.4.2: + version "3.5.3" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.5.3.tgz#4fc2ce0d657e7a02e602549f053b239cb7dfe1b5" + integrity sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw== process-nextick-args@~2.0.0: version "2.0.1" @@ -8615,6 +7550,11 @@ process-warning@^1.0.0: resolved "https://registry.yarnpkg.com/process-warning/-/process-warning-1.0.0.tgz#980a0b25dc38cd6034181be4b7726d89066b4616" integrity sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q== +process@^0.11.10: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== + prompts@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" @@ -8646,46 +7586,24 @@ proxy-compare@2.5.1: resolved "https://registry.yarnpkg.com/proxy-compare/-/proxy-compare-2.5.1.tgz#17818e33d1653fbac8c2ec31406bce8a2966f600" integrity sha512-oyfc0Tx87Cpwva5ZXezSp5V9vht1c7dZBhvuV/y3ctkgMVUmiAGDVeeB0dKhGSyT0v1ZTEQYpe/RXlBVBNuCLA== -pseudomap@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" - integrity sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ== - -pstree.remy@^1.1.8: - version "1.1.8" - resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.8.tgz#c242224f4a67c21f686839bbdb4ac282b8373d3a" - integrity sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w== - pump@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" - integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + version "3.0.2" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.2.tgz#836f3edd6bc2ee599256c924ffe0d88573ddcbf8" + integrity sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw== dependencies: end-of-stream "^1.1.0" once "^1.3.1" +punycode.js@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/punycode.js/-/punycode.js-2.3.1.tgz#6b53e56ad75588234e79f4affa90972c7dd8cdb7" + integrity sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA== + punycode@^2.1.0: version "2.3.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== -qr-code-styling@^1.6.0-rc.1: - version "1.6.0-rc.1" - resolved "https://registry.yarnpkg.com/qr-code-styling/-/qr-code-styling-1.6.0-rc.1.tgz#6c89e185fa50cc9135101085c12ae95b06f1b290" - integrity sha512-ModRIiW6oUnsP18QzrRYZSc/CFKFKIdj7pUs57AEVH20ajlglRpN3HukjHk0UbNMTlKGuaYl7Gt6/O5Gg2NU2Q== - dependencies: - qrcode-generator "^1.4.3" - -qrcode-generator@^1.4.3: - version "1.4.4" - resolved "https://registry.yarnpkg.com/qrcode-generator/-/qrcode-generator-1.4.4.tgz#63f771224854759329a99048806a53ed278740e7" - integrity sha512-HM7yY8O2ilqhmULxGMpcHSF1EhJJ9yBj8gvDEuZ6M+KGJ0YY2hKpnXvRD+hZPLrDVck3ExIGhmPtSdcjC+guuw== - -qrcode-terminal-nooctal@^0.12.1: - version "0.12.1" - resolved "https://registry.yarnpkg.com/qrcode-terminal-nooctal/-/qrcode-terminal-nooctal-0.12.1.tgz#45016aca0d82b2818de7af0a06d072ad671fbe2e" - integrity sha512-jy/kkD0iIMDjTucB+5T6KBsnirlhegDH47vHgrj5MejchSQmi/EAMM0xMFeePgV9CJkkAapNakpVUWYgHvtdKg== - qrcode@1.5.3: version "1.5.3" resolved "https://registry.yarnpkg.com/qrcode/-/qrcode-1.5.3.tgz#03afa80912c0dccf12bc93f615a535aad1066170" @@ -8696,6 +7614,20 @@ qrcode@1.5.3: pngjs "^5.0.0" yargs "^15.3.1" +qrcode@1.5.4: + version "1.5.4" + resolved "https://registry.yarnpkg.com/qrcode/-/qrcode-1.5.4.tgz#5cb81d86eb57c675febb08cf007fff963405da88" + integrity sha512-1ca71Zgiu6ORjHqFBDpnSMTR2ReToX4l1Au1VFLyVeBTFavzQnv5JxMFr3ukHVKpSrSA2MCk0lNJSykjUfz7Zg== + dependencies: + dijkstrajs "^1.0.1" + pngjs "^5.0.0" + yargs "^15.3.1" + +quansync@^0.2.7: + version "0.2.8" + resolved "https://registry.yarnpkg.com/quansync/-/quansync-0.2.8.tgz#2e893d17bb754ba0988ea399ff0bc5f2a8467793" + integrity sha512-4+saucphJMazjt7iOM27mbFCk+D9dd/zmgMDCzRZ8MEoBfYp7lAvoN38et/phRQF6wOPMy/OROBGgoWeSKyluA== + query-string@7.1.3: version "7.1.3" resolved "https://registry.yarnpkg.com/query-string/-/query-string-7.1.3.tgz#a1cf90e994abb113a325804a972d98276fe02328" @@ -8721,15 +7653,10 @@ quick-format-unescaped@^4.0.3: resolved "https://registry.yarnpkg.com/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz#93ef6dd8d3453cbc7970dd614fad4c5954d6b5a7" integrity sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg== -quick-lru@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f" - integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g== - -radix3@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/radix3/-/radix3-1.1.0.tgz#9745df67a49c522e94a33d0a93cf743f104b6e0d" - integrity sha512-pNsHDxbGORSvuSScqNJ+3Km6QAVqk8CfsCBIEoDgpqLrkD2f3QM4I7d1ozJJ172OmIcoUcerZaNWqtLkRXTV3A== +radix3@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/radix3/-/radix3-1.1.2.tgz#fd27d2af3896c6bf4bcdfab6427c69c2afc69ec0" + integrity sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA== randombytes@^2.1.0: version "2.1.0" @@ -8748,12 +7675,7 @@ raw-body@^2.4.1: iconv-lite "0.4.24" unpipe "1.0.0" -re-emitter@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/re-emitter/-/re-emitter-1.1.3.tgz#fa9e319ffdeeeb35b27296ef0f3d374dac2f52a7" - integrity sha512-bHJul9CWcocrS+w5e5QrKYXV9NkbSA9hxSEyhYuctwm6keY9NXR2Xt/4A0vbMP0QvuwyfEyb4bkowYXv1ziEbg== - -react-dom@18.2.0, react-dom@^18.2.0: +react-dom@18.2.0: version "18.2.0" resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d" integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g== @@ -8761,92 +7683,86 @@ react-dom@18.2.0, react-dom@^18.2.0: loose-envify "^1.1.0" scheduler "^0.23.0" -react-hot-toast@^2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/react-hot-toast/-/react-hot-toast-2.4.1.tgz#df04295eda8a7b12c4f968e54a61c8d36f4c0994" - integrity sha512-j8z+cQbWIM5LY37pR6uZR6D4LfseplqnuAO4co4u8917hBUvXlEqyP1ZzqVLcqoyUesZZv/ImreoCeHVDpE5pQ== +react-dom@^18.2.0: + version "18.3.1" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.3.1.tgz#c2265d79511b57d479b3dd3fdfa51536494c5cb4" + integrity sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw== dependencies: - goober "^2.1.10" + loose-envify "^1.1.0" + scheduler "^0.23.2" -react-i18next@^13.2.2: - version "13.5.0" - resolved "https://registry.yarnpkg.com/react-i18next/-/react-i18next-13.5.0.tgz#44198f747628267a115c565f0c736a50a76b1ab0" - integrity sha512-CFJ5NDGJ2MUyBohEHxljOq/39NQ972rh1ajnadG9BjTk+UXbHLq4z5DKEbEQBDoIhUmmbuS/fIMJKo6VOax1HA== +react-hot-toast@^2.5.2: + version "2.5.2" + resolved "https://registry.yarnpkg.com/react-hot-toast/-/react-hot-toast-2.5.2.tgz#b55328966a26add56513e2dc1682e2cb4753c244" + integrity sha512-Tun3BbCxzmXXM7C+NI4qiv6lT0uwGh4oAfeJyNOjYUejTsm35mK9iCaYLGv8cBz9L5YxZLx/2ii7zsIwPtPUdw== dependencies: - "@babel/runtime" "^7.22.5" - html-parse-stringify "^3.0.1" + csstype "^3.1.3" + goober "^2.1.16" -react-is@^16.13.1, react-is@^16.7.0: +react-is@^16.13.1: version "16.13.1" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== -react-is@^18.0.0: - version "18.2.0" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" - integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== - -react-loading-skeleton@^3.4.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/react-loading-skeleton/-/react-loading-skeleton-3.4.0.tgz#c71a3a17259d08e4064974aa0b07f150a09dfd57" - integrity sha512-1oJEBc9+wn7BbkQQk7YodlYEIjgeR+GrRjD+QXkVjwZN7LGIcAFHrx4NhT7UHGBxNY1+zax3c+Fo6XQM4R7CgA== - -react-native-webview@^11.26.0: - version "11.26.1" - resolved "https://registry.yarnpkg.com/react-native-webview/-/react-native-webview-11.26.1.tgz#658c09ed5162dc170b361e48c2dd26c9712879da" - integrity sha512-hC7BkxOpf+z0UKhxFSFTPAM4shQzYmZHoELa6/8a/MspcjEP7ukYKpuSUTLDywQditT8yI9idfcKvfZDKQExGw== - dependencies: - escape-string-regexp "2.0.0" - invariant "2.2.4" +react-loading-skeleton@^3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/react-loading-skeleton/-/react-loading-skeleton-3.5.0.tgz#da2090355b4dedcad5c53cb3f0ed364e3a76d6ca" + integrity sha512-gxxSyLbrEAdXTKgfbpBEFZCO/P153DnqSCQau2+o6lNy1jgMRr2MmRmOzMmyrwSaSYLRB8g7b0waYPmUjz7IhQ== -react-refresh@^0.14.0: - version "0.14.0" - resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.14.0.tgz#4e02825378a5f227079554d4284889354e5f553e" - integrity sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ== +react-refresh@^0.14.2: + version "0.14.2" + resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.14.2.tgz#3833da01ce32da470f1f936b9d477da5c7028bf9" + integrity sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA== -react-remove-scroll-bar@^2.3.4: - version "2.3.4" - resolved "https://registry.yarnpkg.com/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.4.tgz#53e272d7a5cb8242990c7f144c44d8bd8ab5afd9" - integrity sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A== +react-remove-scroll-bar@^2.3.7: + version "2.3.8" + resolved "https://registry.yarnpkg.com/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz#99c20f908ee467b385b68a3469b4a3e750012223" + integrity sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q== dependencies: - react-style-singleton "^2.2.1" + react-style-singleton "^2.2.2" tslib "^2.0.0" -react-remove-scroll@2.5.7: - version "2.5.7" - resolved "https://registry.yarnpkg.com/react-remove-scroll/-/react-remove-scroll-2.5.7.tgz#15a1fd038e8497f65a695bf26a4a57970cac1ccb" - integrity sha512-FnrTWO4L7/Bhhf3CYBNArEG/yROV0tKmTv7/3h9QCFvH6sndeFf1wPqOcbFVu5VAulS5dV1wGT3GZZ/1GawqiA== +react-remove-scroll@2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/react-remove-scroll/-/react-remove-scroll-2.6.2.tgz#2518d2c5112e71ea8928f1082a58459b5c7a2a97" + integrity sha512-KmONPx5fnlXYJQqC62Q+lwIeAk64ws/cUw6omIumRzMRPqgnYqhSSti99nbj0Ry13bv7dF+BKn7NB+OqkdZGTw== dependencies: - react-remove-scroll-bar "^2.3.4" + react-remove-scroll-bar "^2.3.7" react-style-singleton "^2.2.1" tslib "^2.1.0" - use-callback-ref "^1.3.0" + use-callback-ref "^1.3.3" use-sidecar "^1.1.2" -react-style-singleton@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/react-style-singleton/-/react-style-singleton-2.2.1.tgz#f99e420492b2d8f34d38308ff660b60d0b1205b4" - integrity sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g== +react-style-singleton@^2.2.1, react-style-singleton@^2.2.2: + version "2.2.3" + resolved "https://registry.yarnpkg.com/react-style-singleton/-/react-style-singleton-2.2.3.tgz#4265608be69a4d70cfe3047f2c6c88b2c3ace388" + integrity sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ== dependencies: get-nonce "^1.0.0" - invariant "^2.2.4" tslib "^2.0.0" -react-tooltip@^5.26.0: - version "5.26.0" - resolved "https://registry.yarnpkg.com/react-tooltip/-/react-tooltip-5.26.0.tgz#340d054cf952c43c2442f3af24bfc5c2b81fa80a" - integrity sha512-UBbwy3fo1KYDwRCOWwM6AEfQsk9shgVfNkXFqgwS33QHplzg7xao/7mX/6wd+lE6KSZzhUNTkB5TNk9SMaBV/A== +react-tooltip@^5.28.0: + version "5.28.0" + resolved "https://registry.yarnpkg.com/react-tooltip/-/react-tooltip-5.28.0.tgz#c7b5343ab2d740a428494a3d8315515af1f26f46" + integrity sha512-R5cO3JPPXk6FRbBHMO0rI9nkUG/JKfalBSQfZedZYzmqaZQgq7GLzF8vcCWx6IhUCKg0yPqJhXIzmIO5ff15xg== dependencies: - "@floating-ui/dom" "^1.0.0" + "@floating-ui/dom" "^1.6.1" classnames "^2.3.0" -react@18.2.0, react@^18.2.0: +react@18.2.0: version "18.2.0" resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5" integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== dependencies: loose-envify "^1.1.0" +react@^18.2.0: + version "18.3.1" + resolved "https://registry.yarnpkg.com/react/-/react-18.3.1.tgz#49ab892009c53933625bd16b2533fc754cab2891" + integrity sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ== + dependencies: + loose-envify "^1.1.0" + read-cache@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/read-cache/-/read-cache-1.0.0.tgz#e664ef31161166c9751cdbe8dbcf86b5fb58f774" @@ -8854,25 +7770,6 @@ read-cache@^1.0.0: dependencies: pify "^2.3.0" -read-pkg-up@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507" - integrity sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg== - dependencies: - find-up "^4.1.0" - read-pkg "^5.2.0" - type-fest "^0.8.1" - -read-pkg@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" - integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg== - dependencies: - "@types/normalize-package-data" "^2.4.0" - normalize-package-data "^2.5.0" - parse-json "^5.0.0" - type-fest "^0.6.0" - read-yaml-file@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/read-yaml-file/-/read-yaml-file-1.1.0.tgz#9362bbcbdc77007cc8ea4519fe1c0b821a7ce0d8" @@ -8883,33 +7780,7 @@ read-yaml-file@^1.1.0: pify "^4.0.1" strip-bom "^3.0.0" -readable-stream@2.2.9: - version "2.2.9" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.2.9.tgz#cf78ec6f4a6d1eb43d26488cac97f042e74b7fc8" - integrity sha512-iuxqX7b7FYt08AriYECxUsK9KTXE3A/FenxIa3IPmvANHxaTP/wGIwwf+IidvvIDk/MsCp/oEV6A8CXo4SDcCg== - dependencies: - buffer-shims "~1.0.0" - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "~1.0.0" - process-nextick-args "~1.0.6" - string_decoder "~1.0.0" - util-deprecate "~1.0.1" - -readable-stream@2.3.3: - version "2.3.3" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c" - integrity sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~1.0.6" - safe-buffer "~5.1.1" - string_decoder "~1.0.3" - util-deprecate "~1.0.1" - -readable-stream@^2.3.3, readable-stream@^2.3.7, readable-stream@~2.3.6: +readable-stream@^2.3.3: version "2.3.8" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== @@ -8922,7 +7793,7 @@ readable-stream@^2.3.3, readable-stream@^2.3.7, readable-stream@~2.3.6: string_decoder "~1.1.1" util-deprecate "~1.0.1" -readable-stream@^3.1.1, readable-stream@^3.6.0: +readable-stream@^3.1.1, readable-stream@^3.6.0, readable-stream@^3.6.2: version "3.6.2" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== @@ -8931,6 +7802,22 @@ readable-stream@^3.1.1, readable-stream@^3.6.0: string_decoder "^1.1.1" util-deprecate "^1.0.1" +"readable-stream@^3.6.2 || ^4.4.2": + version "4.7.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-4.7.0.tgz#cedbd8a1146c13dfff8dab14068028d58c15ac91" + integrity sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg== + dependencies: + abort-controller "^3.0.0" + buffer "^6.0.3" + events "^3.3.0" + process "^0.11.10" + string_decoder "^1.3.0" + +readdirp@^4.0.1: + version "4.1.2" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-4.1.2.tgz#eb85801435fbf2a7ee58f19e0921b068fc69948d" + integrity sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg== + readdirp@~3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" @@ -8943,63 +7830,43 @@ real-require@^0.1.0: resolved "https://registry.yarnpkg.com/real-require/-/real-require-0.1.0.tgz#736ac214caa20632847b7ca8c1056a0767df9381" integrity sha512-r/H9MzAWtrv8aSVjPCMFpDMl5q66GqtmmRkRjpHTsp4zBAa+snZyiQNlMONiUmEJcsnaw0wCauJ2GWODr/aFkg== -redent@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" - integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg== - dependencies: - indent-string "^4.0.0" - strip-indent "^3.0.0" - -redis-errors@^1.0.0, redis-errors@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/redis-errors/-/redis-errors-1.2.0.tgz#eb62d2adb15e4eaf4610c04afe1529384250abad" - integrity sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w== - -redis-parser@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/redis-parser/-/redis-parser-3.0.0.tgz#b66d828cdcafe6b4b8a428a7def4c6bcac31c8b4" - integrity sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A== - dependencies: - redis-errors "^1.0.0" - -reflect.getprototypeof@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.4.tgz#aaccbf41aca3821b87bb71d9dcbc7ad0ba50a3f3" - integrity sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw== +reflect.getprototypeof@^1.0.6, reflect.getprototypeof@^1.0.9: + version "1.0.10" + resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz#c629219e78a3316d8b604c765ef68996964e7bf9" + integrity sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - get-intrinsic "^1.2.1" - globalthis "^1.0.3" - which-builtin-type "^1.1.3" + call-bind "^1.0.8" + define-properties "^1.2.1" + es-abstract "^1.23.9" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + get-intrinsic "^1.2.7" + get-proto "^1.0.1" + which-builtin-type "^1.2.1" regenerator-runtime@^0.14.0: version "0.14.1" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== -regexp.prototype.flags@^1.5.0, regexp.prototype.flags@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz#90ce989138db209f81492edd734183ce99f9677e" - integrity sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg== +regexp.prototype.flags@^1.5.3: + version "1.5.4" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz#1ad6c62d44a259007e55b3970e00f746efbcaa19" + integrity sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - set-function-name "^2.0.0" - -repeat-string@^1.5.2: - version "1.6.1" - resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w== + call-bind "^1.0.8" + define-properties "^1.2.1" + es-errors "^1.3.0" + get-proto "^1.0.1" + gopd "^1.2.0" + set-function-name "^2.0.2" require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== -require-from-string@^2.0.0, require-from-string@^2.0.2: +require-from-string@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== @@ -9036,16 +7903,16 @@ resolve@1.17.0: dependencies: path-parse "^1.0.6" -resolve@^1.1.7, resolve@^1.10.0, resolve@^1.19.0, resolve@^1.22.2, resolve@^1.22.4: - version "1.22.8" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" - integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== +resolve@^1.1.7, resolve@^1.22.4, resolve@^1.22.8: + version "1.22.10" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.10.tgz#b663e83ffb09bbf2386944736baae803029b8b39" + integrity sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w== dependencies: - is-core-module "^2.13.0" + is-core-module "^2.16.0" path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" -resolve@^2.0.0-next.4, resolve@^2.0.0-next.5: +resolve@^2.0.0-next.5: version "2.0.0-next.5" resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.5.tgz#6b0ec3107e671e52b68cd068ef327173b90dc03c" integrity sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA== @@ -9054,13 +7921,13 @@ resolve@^2.0.0-next.4, resolve@^2.0.0-next.5: path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" -restore-cursor@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-4.0.0.tgz#519560a4318975096def6e609d44100edaa4ccb9" - integrity sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg== +restore-cursor@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-5.1.0.tgz#0766d95699efacb14150993f55baf0953ea1ebe7" + integrity sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA== dependencies: - onetime "^5.1.0" - signal-exit "^3.0.2" + onetime "^7.0.0" + signal-exit "^4.1.0" retry@^0.12.0: version "0.12.0" @@ -9068,21 +7935,14 @@ retry@^0.12.0: integrity sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow== reusify@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" - integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== - -rfdc@^1.3.0, rfdc@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.1.tgz#2b6d4df52dffe8bb346992a10ea9451f24373a8f" - integrity sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg== + version "1.1.0" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.1.0.tgz#0fe13b9522e1473f51b558ee796e08f11f9b489f" + integrity sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw== -rimraf@^2.2.8: - version "2.7.1" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" - integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== - dependencies: - glob "^7.1.3" +rfdc@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.4.1.tgz#778f76c4fb731d93414e8f925fbecf64cce7f6ca" + integrity sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA== rimraf@^3.0.2: version "3.0.2" @@ -9091,12 +7951,13 @@ rimraf@^3.0.2: dependencies: glob "^7.1.3" -rimraf@^5.0.5: - version "5.0.5" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-5.0.5.tgz#9be65d2d6e683447d2e9013da2bf451139a61ccf" - integrity sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A== +rimraf@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-6.0.1.tgz#ffb8ad8844dd60332ab15f52bc104bc3ed71ea4e" + integrity sha512-9dkvaxAsk/xNXSJzMgFqqMCuFgt2+KsOFek3TMLfo8NCPfWpBmqwyNn5Y+NX56QUYfCtsyhF3ayiboEoUmJk/A== dependencies: - glob "^10.3.7" + glob "^11.0.0" + package-json-from-dist "^1.0.0" ripemd160@^2.0.0, ripemd160@^2.0.1: version "2.0.2" @@ -9113,36 +7974,32 @@ rlp@^2.2.3: dependencies: bn.js "^5.2.0" -rollup-plugin-visualizer@^5.9.2: - version "5.12.0" - resolved "https://registry.yarnpkg.com/rollup-plugin-visualizer/-/rollup-plugin-visualizer-5.12.0.tgz#661542191ce78ee4f378995297260d0c1efb1302" - integrity sha512-8/NU9jXcHRs7Nnj07PF2o4gjxmm9lXIrZ8r175bT9dK8qoLlvKTwRMArRCMgpMGlq8CTLugRvEmyMeMXIU2pNQ== - dependencies: - open "^8.4.0" - picomatch "^2.3.1" - source-map "^0.7.4" - yargs "^17.5.1" - -rollup@^4.0.2, rollup@^4.2.0: - version "4.9.6" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.9.6.tgz#4515facb0318ecca254a2ee1315e22e09efc50a0" - integrity sha512-05lzkCS2uASX0CiLFybYfVkwNbKZG5NFQ6Go0VWyogFTXXbR039UVsegViTntkk4OglHBdF54ccApXRRuXRbsg== +rollup@^4.30.1, rollup@^4.34.8: + version "4.35.0" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.35.0.tgz#76c95dba17a579df4c00c3955aed32aa5d4dc66d" + integrity sha512-kg6oI4g+vc41vePJyO6dHt/yl0Rz3Thv0kJeVQ3D1kS3E5XSuKbPc29G4IpT/Kv1KQwgHVcN+HtyS+HYLNSvQg== dependencies: - "@types/estree" "1.0.5" + "@types/estree" "1.0.6" optionalDependencies: - "@rollup/rollup-android-arm-eabi" "4.9.6" - "@rollup/rollup-android-arm64" "4.9.6" - "@rollup/rollup-darwin-arm64" "4.9.6" - "@rollup/rollup-darwin-x64" "4.9.6" - "@rollup/rollup-linux-arm-gnueabihf" "4.9.6" - "@rollup/rollup-linux-arm64-gnu" "4.9.6" - "@rollup/rollup-linux-arm64-musl" "4.9.6" - "@rollup/rollup-linux-riscv64-gnu" "4.9.6" - "@rollup/rollup-linux-x64-gnu" "4.9.6" - "@rollup/rollup-linux-x64-musl" "4.9.6" - "@rollup/rollup-win32-arm64-msvc" "4.9.6" - "@rollup/rollup-win32-ia32-msvc" "4.9.6" - "@rollup/rollup-win32-x64-msvc" "4.9.6" + "@rollup/rollup-android-arm-eabi" "4.35.0" + "@rollup/rollup-android-arm64" "4.35.0" + "@rollup/rollup-darwin-arm64" "4.35.0" + "@rollup/rollup-darwin-x64" "4.35.0" + "@rollup/rollup-freebsd-arm64" "4.35.0" + "@rollup/rollup-freebsd-x64" "4.35.0" + "@rollup/rollup-linux-arm-gnueabihf" "4.35.0" + "@rollup/rollup-linux-arm-musleabihf" "4.35.0" + "@rollup/rollup-linux-arm64-gnu" "4.35.0" + "@rollup/rollup-linux-arm64-musl" "4.35.0" + "@rollup/rollup-linux-loongarch64-gnu" "4.35.0" + "@rollup/rollup-linux-powerpc64le-gnu" "4.35.0" + "@rollup/rollup-linux-riscv64-gnu" "4.35.0" + "@rollup/rollup-linux-s390x-gnu" "4.35.0" + "@rollup/rollup-linux-x64-gnu" "4.35.0" + "@rollup/rollup-linux-x64-musl" "4.35.0" + "@rollup/rollup-win32-arm64-msvc" "4.35.0" + "@rollup/rollup-win32-ia32-msvc" "4.35.0" + "@rollup/rollup-win32-x64-msvc" "4.35.0" fsevents "~2.3.2" run-parallel@^1.1.9: @@ -9152,29 +8009,18 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" -rust-verkle-wasm@^0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/rust-verkle-wasm/-/rust-verkle-wasm-0.0.1.tgz#fd8396a7060d8ee8ea10da50ab6e862948095a74" - integrity sha512-BN6fiTsxcd2dCECz/cHtGTt9cdLJR925nh7iAuRcj8ymKw7OOaPmCneQZ7JePOJ/ia27TjEL91VdOi88Yf+mcA== - -rustbn-wasm@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/rustbn-wasm/-/rustbn-wasm-0.2.0.tgz#0407521fb55ae69eeb4968d01885d63efd1c4ff9" - integrity sha512-FThvYFNTqrEKGqXuseeg0zR7yROh/6U1617mCHF68OVqrN1tNKRN7Tdwy4WayPVsCmmK+eMxtIZX1qL6JxTkMg== - dependencies: - "@scure/base" "^1.1.1" - -safe-array-concat@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.0.tgz#8d0cae9cb806d6d1c06e08ab13d847293ebe0692" - integrity sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg== +safe-array-concat@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.3.tgz#c9e54ec4f603b0bbb8e7e5007a5ee7aecd1538c3" + integrity sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q== dependencies: - call-bind "^1.0.5" - get-intrinsic "^1.2.2" - has-symbols "^1.0.3" + call-bind "^1.0.8" + call-bound "^1.0.2" + get-intrinsic "^1.2.6" + has-symbols "^1.1.0" isarray "^2.0.5" -safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: +safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@^5.2.1, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== @@ -9184,56 +8030,55 @@ safe-buffer@~5.1.0, safe-buffer@~5.1.1: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -safe-regex-test@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.2.tgz#3ba32bdb3ea35f940ee87e5087c60ee786c3f6c5" - integrity sha512-83S9w6eFq12BBIJYvjMux6/dkirb8+4zJRA9cxNBVb7Wq5fJBW+Xze48WqR8pxua7bDuAaaAxtVVd4Idjp1dBQ== +safe-push-apply@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/safe-push-apply/-/safe-push-apply-1.0.0.tgz#01850e981c1602d398c85081f360e4e6d03d27f5" + integrity sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA== + dependencies: + es-errors "^1.3.0" + isarray "^2.0.5" + +safe-regex-test@^1.0.3, safe-regex-test@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.1.0.tgz#7f87dfb67a3150782eaaf18583ff5d1711ac10c1" + integrity sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw== dependencies: - call-bind "^1.0.5" - get-intrinsic "^1.2.2" - is-regex "^1.1.4" + call-bound "^1.0.2" + es-errors "^1.3.0" + is-regex "^1.2.1" -safe-stable-stringify@^2.1.0: - version "2.4.3" - resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz#138c84b6f6edb3db5f8ef3ef7115b8f55ccbf886" - integrity sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g== +safe-stable-stringify@^2.1.0, safe-stable-stringify@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz#4ca2f8e385f2831c432a719b108a3bf7af42a1dd" + integrity sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA== "safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -scheduler@^0.23.0: - version "0.23.0" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe" - integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw== +scheduler@^0.23.0, scheduler@^0.23.2: + version "0.23.2" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.2.tgz#414ba64a3b282892e944cf2108ecc078d115cdc3" + integrity sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ== dependencies: loose-envify "^1.1.0" -scrypt-js@3.0.1, scrypt-js@^3.0.0: +scrypt-js@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-3.0.1.tgz#d314a57c2aef69d1ad98a138a21fe9eafa9ee312" integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA== secp256k1@^4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-4.0.3.tgz#c4559ecd1b8d3c1827ed2d1b94190d69ce267303" - integrity sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA== - dependencies: - elliptic "^6.5.4" - node-addon-api "^2.0.0" - node-gyp-build "^4.2.0" - -secp256k1@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-5.0.0.tgz#be6f0c8c7722e2481e9773336d351de8cddd12f7" - integrity sha512-TKWX8xvoGHrxVdqbYeZM9w+izTF4b9z3NhSaDkdn81btvuh+ivbIMGT/zQvDtTFWhRlThpoz6LEYTr7n8A5GcA== + version "4.0.4" + resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-4.0.4.tgz#58f0bfe1830fe777d9ca1ffc7574962a8189f8ab" + integrity sha512-6JfvwvjUOn8F/jUoBY2Q1v5WY5XS+rj8qSe0v8Y4ezH4InLgTEeOOPQsRll9OV429Pvo6BCHGavIyJfr3TAhsw== dependencies: - elliptic "^6.5.4" + elliptic "^6.5.7" node-addon-api "^5.0.0" node-gyp-build "^4.2.0" -"semver@2 || 3 || 4 || 5", semver@^5.5.0: +semver@^5.5.0: version "5.7.2" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== @@ -9243,17 +8088,15 @@ semver@^6.3.0, semver@^6.3.1: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.3.8, semver@^7.5.3, semver@^7.5.4: - version "7.5.4" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" - integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== - dependencies: - lru-cache "^6.0.0" +semver@^7.3.8, semver@^7.5.3, semver@^7.5.4, semver@^7.6.0, semver@^7.6.3: + version "7.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.1.tgz#abd5098d82b18c6c81f6074ff2647fd3e7220c9f" + integrity sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA== -serialize-javascript@6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" - integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== +serialize-javascript@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.2.tgz#defa1e055c83bf6d59ea805d8da862254eb6a6c2" + integrity sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g== dependencies: randombytes "^2.1.0" @@ -9262,25 +8105,36 @@ set-blocking@^2.0.0: resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== -set-function-length@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.0.tgz#2f81dc6c16c7059bda5ab7c82c11f03a515ed8e1" - integrity sha512-4DBHDoyHlM1IRPGYcoxexgh67y4ueR53FKV1yyxwFMY7aCqcN/38M1+SwZ/qJQ8iLv7+ck385ot4CcisOAPT9w== +set-function-length@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" + integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== dependencies: - define-data-property "^1.1.1" + define-data-property "^1.1.4" + es-errors "^1.3.0" function-bind "^1.1.2" - get-intrinsic "^1.2.2" + get-intrinsic "^1.2.4" gopd "^1.0.1" - has-property-descriptors "^1.0.1" + has-property-descriptors "^1.0.2" -set-function-name@^2.0.0, set-function-name@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.1.tgz#12ce38b7954310b9f61faa12701620a0c882793a" - integrity sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA== +set-function-name@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.2.tgz#16a705c5a0dc2f5e638ca96d8a8cd4e1c2b90985" + integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ== dependencies: - define-data-property "^1.0.1" + define-data-property "^1.1.4" + es-errors "^1.3.0" functions-have-names "^1.2.3" - has-property-descriptors "^1.0.0" + has-property-descriptors "^1.0.2" + +set-proto@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/set-proto/-/set-proto-1.0.0.tgz#0760dbcff30b2d7e801fd6e19983e56da337565e" + integrity sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw== + dependencies: + dunder-proto "^1.0.1" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" setimmediate@^1.0.5: version "1.0.5" @@ -9300,13 +8154,6 @@ sha.js@^2.4.0, sha.js@^2.4.11, sha.js@^2.4.8: inherits "^2.0.1" safe-buffer "^5.0.1" -shebang-command@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" - integrity sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg== - dependencies: - shebang-regex "^1.0.0" - shebang-command@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" @@ -9314,41 +8161,57 @@ shebang-command@^2.0.0: dependencies: shebang-regex "^3.0.0" -shebang-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" - integrity sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ== - shebang-regex@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== -shiki@^0.14.7: - version "0.14.7" - resolved "https://registry.yarnpkg.com/shiki/-/shiki-0.14.7.tgz#c3c9e1853e9737845f1d2ef81b31bcfb07056d4e" - integrity sha512-dNPAPrxSc87ua2sKJ3H5dQ/6ZaY8RNnaAqK+t0eG7p0Soi2ydiqbGOTaZCqaYvA/uZYfS1LJnemt3Q+mSfcPCg== +side-channel-list@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/side-channel-list/-/side-channel-list-1.0.0.tgz#10cb5984263115d3b7a0e336591e290a830af8ad" + integrity sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA== dependencies: - ansi-sequence-parser "^1.1.0" - jsonc-parser "^3.2.0" - vscode-oniguruma "^1.7.0" - vscode-textmate "^8.0.0" + es-errors "^1.3.0" + object-inspect "^1.13.3" -side-channel@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" - integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== +side-channel-map@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/side-channel-map/-/side-channel-map-1.0.1.tgz#d6bb6b37902c6fef5174e5f533fab4c732a26f42" + integrity sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + get-intrinsic "^1.2.5" + object-inspect "^1.13.3" + +side-channel-weakmap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz#11dda19d5368e40ce9ec2bdc1fb0ecbc0790ecea" + integrity sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + get-intrinsic "^1.2.5" + object-inspect "^1.13.3" + side-channel-map "^1.0.1" + +side-channel@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.1.0.tgz#c3fcff9c4da932784873335ec9765fa94ff66bc9" + integrity sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw== dependencies: - call-bind "^1.0.0" - get-intrinsic "^1.0.2" - object-inspect "^1.9.0" + es-errors "^1.3.0" + object-inspect "^1.13.3" + side-channel-list "^1.0.0" + side-channel-map "^1.0.1" + side-channel-weakmap "^1.0.2" siginfo@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/siginfo/-/siginfo-2.0.0.tgz#32e76c70b79724e3bb567cb9d543eb858ccfaf30" integrity sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g== -signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: +signal-exit@^3.0.2: version "3.0.7" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== @@ -9380,24 +8243,17 @@ simple-peer@^9.11.1: randombytes "^2.1.0" readable-stream "^3.6.0" -simple-update-notifier@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz#d70b92bdab7d6d90dfd73931195a30b6e3d7cebb" - integrity sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w== - dependencies: - semver "^7.5.3" - sinon@^17.0.1: - version "17.0.1" - resolved "https://registry.yarnpkg.com/sinon/-/sinon-17.0.1.tgz#26b8ef719261bf8df43f925924cccc96748e407a" - integrity sha512-wmwE19Lie0MLT+ZYNpDymasPHUKTaZHUH/pKEubRXIzySv9Atnlw+BUMGCzWgV7b7wO+Hw6f1TEOr0IUnmU8/g== + version "17.0.2" + resolved "https://registry.yarnpkg.com/sinon/-/sinon-17.0.2.tgz#470894bcc2d24b01bad539722ea46da949892405" + integrity sha512-uihLiaB9FhzesElPDFZA7hDcNABzsVHwr3YfmM9sBllVwab3l0ltGlRV1XhpNfIacNDLGD1QRZNLs5nU5+hTuA== dependencies: - "@sinonjs/commons" "^3.0.0" + "@sinonjs/commons" "^3.0.1" "@sinonjs/fake-timers" "^11.2.2" "@sinonjs/samsam" "^8.0.0" - diff "^5.1.0" - nise "^5.1.5" - supports-color "^7.2.0" + diff "^5.2.0" + nise "^5.1.9" + supports-color "^7" sisteransi@^1.0.5: version "1.0.5" @@ -9417,7 +8273,7 @@ slice-ansi@^5.0.0: ansi-styles "^6.0.0" is-fullwidth-code-point "^4.0.0" -slice-ansi@^7.0.0: +slice-ansi@^7.1.0: version "7.1.0" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-7.1.0.tgz#cd6b4655e298a8d1bdeb04250a433094b347b9a9" integrity sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg== @@ -9425,26 +8281,14 @@ slice-ansi@^7.0.0: ansi-styles "^6.2.1" is-fullwidth-code-point "^5.0.0" -smartwrap@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/smartwrap/-/smartwrap-2.0.2.tgz#7e25d3dd58b51c6ca4aba3a9e391650ea62698a4" - integrity sha512-vCsKNQxb7PnCNd2wY1WClWifAc2lwqsG8OaswpJkVJsvMGcnEntdTCDajZCkk93Ay1U3t/9puJmb525Rg5MZBA== - dependencies: - array.prototype.flat "^1.2.3" - breakword "^1.0.5" - grapheme-splitter "^1.0.4" - strip-ansi "^6.0.0" - wcwidth "^1.0.1" - yargs "^15.1.0" - socket.io-client@^4.5.1, socket.io-client@^4.7.2: - version "4.7.4" - resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-4.7.4.tgz#5f0e060ff34ac0a4b4c5abaaa88e0d1d928c64c8" - integrity sha512-wh+OkeF0rAVCrABWQBaEjLfb7DVPotMbu0cgWgyR0v6eA4EoVnAwcIeIbcdTE3GT/H3kbdLl7OoH2+asoDRIIg== + version "4.8.1" + resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-4.8.1.tgz#1941eca135a5490b94281d0323fe2a35f6f291cb" + integrity sha512-hJVXfu3E28NmzGk8o1sHhN3om52tRvwYeidbj7xKy2eIIse5IoKX3USlS6Tqt3BHAtflLIkCQBkzVrEEfWUyYQ== dependencies: "@socket.io/component-emitter" "~3.1.0" debug "~4.3.2" - engine.io-client "~6.5.2" + engine.io-client "~6.6.1" socket.io-parser "~4.2.4" socket.io-parser@~4.2.4: @@ -9455,18 +8299,16 @@ socket.io-parser@~4.2.4: "@socket.io/component-emitter" "~3.1.0" debug "~4.3.1" -solc@0.7.3: - version "0.7.3" - resolved "https://registry.yarnpkg.com/solc/-/solc-0.7.3.tgz#04646961bd867a744f63d2b4e3c0701ffdc7d78a" - integrity sha512-GAsWNAjGzIDg7VxzP6mPjdurby3IkGCjQcM8GFYZT6RyaoUZKmMU6Y7YwG+tFGhv7dwZ8rmR4iwFDrrD99JwqA== +solc@0.8.26: + version "0.8.26" + resolved "https://registry.yarnpkg.com/solc/-/solc-0.8.26.tgz#afc78078953f6ab3e727c338a2fefcd80dd5b01a" + integrity sha512-yiPQNVf5rBFHwN6SIf3TUUvVAFKcQqmSUFeq+fb6pNRCo0ZCgpYOZDi3BVoezCPIAcKrVYd/qXlBLUP9wVrZ9g== dependencies: command-exists "^1.2.8" - commander "3.0.2" + commander "^8.1.0" follow-redirects "^1.12.1" - fs-extra "^0.30.0" js-sha3 "0.8.0" memorystream "^0.3.1" - require-from-string "^2.0.0" semver "^5.5.0" tmp "0.0.33" @@ -9477,10 +8319,10 @@ sonic-boom@^2.2.1: dependencies: atomic-sleep "^1.0.0" -source-map-js@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" - integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== +source-map-js@^1.0.2, source-map-js@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" + integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== source-map-support@^0.5.13: version "0.5.21" @@ -9502,54 +8344,18 @@ source-map@0.8.0-beta.0: dependencies: whatwg-url "^7.0.0" -source-map@^0.5.7: - version "0.5.7" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== - -source-map@^0.6.0, source-map@^0.6.1: +source-map@^0.6.0: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== -source-map@^0.7.4: - version "0.7.4" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.4.tgz#a9bbe705c9d8846f4e08ff6765acf0f1b0898656" - integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== - -spawndamnit@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/spawndamnit/-/spawndamnit-2.0.0.tgz#9f762ac5c3476abb994b42ad592b5ad22bb4b0ad" - integrity sha512-j4JKEcncSjFlqIwU5L/rp2N5SIPsdxaRsIv678+TZxZ0SRDJTm8JrxJMjE/XuiEZNEir3S8l0Fa3Ke339WI4qA== - dependencies: - cross-spawn "^5.1.0" - signal-exit "^3.0.2" - -spdx-correct@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.2.0.tgz#4f5ab0668f0059e34f9c00dce331784a12de4e9c" - integrity sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA== - dependencies: - spdx-expression-parse "^3.0.0" - spdx-license-ids "^3.0.0" - -spdx-exceptions@^2.1.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz#5d607d27fc806f66d7b64a766650fa890f04ed66" - integrity sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w== - -spdx-expression-parse@^3.0.0: +spawndamnit@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" - integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== + resolved "https://registry.yarnpkg.com/spawndamnit/-/spawndamnit-3.0.1.tgz#44410235d3dc4e21f8e4f740ae3266e4486c2aed" + integrity sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg== dependencies: - spdx-exceptions "^2.1.0" - spdx-license-ids "^3.0.0" - -spdx-license-ids@^3.0.0: - version "3.0.17" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.17.tgz#887da8aa73218e51a1d917502d79863161a93f9c" - integrity sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg== + cross-spawn "^7.0.5" + signal-exit "^4.0.1" split-on-first@^1.0.0: version "1.1.0" @@ -9561,18 +8367,16 @@ split2@^4.0.0: resolved "https://registry.yarnpkg.com/split2/-/split2-4.2.0.tgz#c9c5920904d148bab0b9f67145f245a86aadbfa4" integrity sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg== -split@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/split/-/split-1.0.0.tgz#c4395ce683abcd254bc28fe1dabb6e5c27dcffae" - integrity sha512-3SVfJe2A0WZg3D+ZEtXqYkvpSGAVaZ1MgufNCeHioBESCqQFsuT1VcQufiopBfJZqh92ZwQ6ddL378iUSbqVNQ== - dependencies: - through "2" - sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== +stable-hash@^0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/stable-hash/-/stable-hash-0.0.4.tgz#55ae7dadc13e4b3faed13601587cec41859b42f7" + integrity sha512-LjdcbuBeLcdETCrPn9i8AYAZ1eCtu4ECAWtP7UleOiZ9LzVxRzzUZEoZ8zB24nhkQnDWyET0I+3sWokSDS3E7g== + stack-generator@^1.0.7: version "1.1.0" resolved "https://registry.yarnpkg.com/stack-generator/-/stack-generator-1.1.0.tgz#36f6a920751a6c10f499a13c32cbb5f51a0b8b25" @@ -9613,57 +8417,33 @@ stacktrace-js@1.3.1: stacktrace-gps "^2.4.3" stacktrace-parser@^0.1.10: - version "0.1.10" - resolved "https://registry.yarnpkg.com/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz#29fb0cae4e0d0b85155879402857a1639eb6051a" - integrity sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg== + version "0.1.11" + resolved "https://registry.yarnpkg.com/stacktrace-parser/-/stacktrace-parser-0.1.11.tgz#c7c08f9b29ef566b9a6f7b255d7db572f66fabc4" + integrity sha512-WjlahMgHmCJpqzU8bIBy4qtsZdU9lRlcZE3Lvyej6t4tuOuv1vk57OW3MBrj6hXBFx/nNoC9MPMTcr5YA7NQbg== dependencies: type-fest "^0.7.1" -standard-as-callback@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/standard-as-callback/-/standard-as-callback-2.1.0.tgz#8953fc05359868a77b5b9739a665c5977bb7df45" - integrity sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A== - statuses@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== -std-env@^3.5.0, std-env@^3.7.0: - version "3.7.0" - resolved "https://registry.yarnpkg.com/std-env/-/std-env-3.7.0.tgz#c9f7386ced6ecf13360b6c6c55b8aaa4ef7481d2" - integrity sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg== +std-env@^3.8.0: + version "3.8.1" + resolved "https://registry.yarnpkg.com/std-env/-/std-env-3.8.1.tgz#2b81c631c62e3d0b964b87f099b8dcab6c9a5346" + integrity sha512-vj5lIj3Mwf9D79hBkltk5qmkFI+biIKWS2IBxEyEU3AX1tUf7AoL8nSazCOiiqQsGKIq01SClsKEzweu34uwvA== -stop-iteration-iterator@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz#6a60be0b4ee757d1ed5254858ec66b10c49285e4" - integrity sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ== - dependencies: - internal-slot "^1.0.4" - -stream-shift@^1.0.0: +stream-shift@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.3.tgz#85b8fab4d71010fc3ba8772e8046cc49b8a3864b" integrity sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ== -stream-transform@^2.1.3: - version "2.1.3" - resolved "https://registry.yarnpkg.com/stream-transform/-/stream-transform-2.1.3.tgz#a1c3ecd72ddbf500aa8d342b0b9df38f5aa598e3" - integrity sha512-9GHUiM5hMiCi6Y03jD2ARC1ettBXkQBoQAe7nJsPknnI0ow10aXjTnew8QtYQmLjzn974BnmWEAJgCY6ZP1DeQ== - dependencies: - mixme "^0.5.1" - strict-uri-encode@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546" integrity sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ== -string-argv@0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.2.tgz#2b6d0ef24b656274d957d54e0a4bbf6153dc02b6" - integrity sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q== - -"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3: +"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -9672,7 +8452,7 @@ string-argv@0.3.2: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" -string-width@^5.0.0, string-width@^5.0.1, string-width@^5.1.2: +string-width@^5.0.1, string-width@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== @@ -9682,70 +8462,89 @@ string-width@^5.0.0, string-width@^5.0.1, string-width@^5.1.2: strip-ansi "^7.0.1" string-width@^7.0.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-7.1.0.tgz#d994252935224729ea3719c49f7206dc9c46550a" - integrity sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw== + version "7.2.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-7.2.0.tgz#b5bb8e2165ce275d4d43476dd2700ad9091db6dc" + integrity sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ== dependencies: emoji-regex "^10.3.0" get-east-asian-width "^1.0.0" strip-ansi "^7.1.0" -string.prototype.matchall@^4.0.8: - version "4.0.10" - resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz#a1553eb532221d4180c51581d6072cd65d1ee100" - integrity sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ== +string.prototype.includes@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz#eceef21283640761a81dbe16d6c7171a4edf7d92" + integrity sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - get-intrinsic "^1.2.1" - has-symbols "^1.0.3" - internal-slot "^1.0.5" - regexp.prototype.flags "^1.5.0" - set-function-name "^2.0.0" - side-channel "^1.0.4" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.3" -string.prototype.trim@^1.2.8: - version "1.2.8" - resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz#f9ac6f8af4bd55ddfa8895e6aea92a96395393bd" - integrity sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ== +string.prototype.matchall@^4.0.12: + version "4.0.12" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz#6c88740e49ad4956b1332a911e949583a275d4c0" + integrity sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.3" + define-properties "^1.2.1" + es-abstract "^1.23.6" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + get-intrinsic "^1.2.6" + gopd "^1.2.0" + has-symbols "^1.1.0" + internal-slot "^1.1.0" + regexp.prototype.flags "^1.5.3" + set-function-name "^2.0.2" + side-channel "^1.1.0" + +string.prototype.repeat@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz#e90872ee0308b29435aa26275f6e1b762daee01a" + integrity sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" + define-properties "^1.1.3" + es-abstract "^1.17.5" -string.prototype.trimend@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz#1bb3afc5008661d73e2dc015cd4853732d6c471e" - integrity sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA== +string.prototype.trim@^1.2.10: + version "1.2.10" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz#40b2dd5ee94c959b4dcfb1d65ce72e90da480c81" + integrity sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" + call-bind "^1.0.8" + call-bound "^1.0.2" + define-data-property "^1.1.4" + define-properties "^1.2.1" + es-abstract "^1.23.5" + es-object-atoms "^1.0.0" + has-property-descriptors "^1.0.2" -string.prototype.trimstart@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz#d4cdb44b83a4737ffbac2d406e405d43d0184298" - integrity sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg== +string.prototype.trimend@^1.0.8, string.prototype.trimend@^1.0.9: + version "1.0.9" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz#62e2731272cd285041b36596054e9f66569b6942" + integrity sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.2" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + +string.prototype.trimstart@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz#7ee834dda8c7c17eff3118472bb35bfedaa34dde" + integrity sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" -string_decoder@^1.1.1: +string_decoder@^1.1.1, string_decoder@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== dependencies: safe-buffer "~5.2.0" -string_decoder@~1.0.0, string_decoder@~1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab" - integrity sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ== - dependencies: - safe-buffer "~5.1.0" - string_decoder@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" @@ -9760,13 +8559,6 @@ string_decoder@~1.1.1: dependencies: ansi-regex "^5.0.1" -strip-ansi@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" - integrity sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg== - dependencies: - ansi-regex "^2.0.0" - strip-ansi@^7.0.1, strip-ansi@^7.1.0: version "7.1.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" @@ -9776,18 +8568,8 @@ strip-ansi@^7.0.1, strip-ansi@^7.1.0: strip-bom@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== - -strip-final-newline@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" - integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== - -strip-final-newline@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz#52894c313fbff318835280aed60ff71ebf12b8fd" - integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw== + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== strip-hex-prefix@1.0.0: version "1.0.0" @@ -9796,25 +8578,11 @@ strip-hex-prefix@1.0.0: dependencies: is-hex-prefixed "1.0.0" -strip-indent@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" - integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== - dependencies: - min-indent "^1.0.0" - -strip-json-comments@3.1.1, strip-json-comments@^3.1.1: +strip-json-comments@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== -strip-literal@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-literal/-/strip-literal-2.0.0.tgz#5d063580933e4e03ebb669b12db64d2200687527" - integrity sha512-f9vHgsCWBq2ugHAkGMiiYY+AYG0D/cbloKKg0nhaaaSNsujdGIpVXCNsrJpCKr5M0f4aI31mr13UjY6GAuXCKA== - dependencies: - js-tokens "^8.0.2" - styled-jsx@5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/styled-jsx/-/styled-jsx-5.1.0.tgz#4a5622ab9714bd3fcfaeec292aa555871f057563" @@ -9822,12 +8590,7 @@ styled-jsx@5.1.0: dependencies: client-only "0.0.1" -stylis@4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.2.0.tgz#79daee0208964c8fe695a42fcffcac633a211a51" - integrity sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw== - -sucrase@^3.20.3, sucrase@^3.32.0: +sucrase@^3.35.0: version "3.35.0" resolved "https://registry.yarnpkg.com/sucrase/-/sucrase-3.35.0.tgz#57f17a3d7e19b36d8995f06679d121be914ae263" integrity sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA== @@ -9841,141 +8604,79 @@ sucrase@^3.20.3, sucrase@^3.32.0: ts-interface-checker "^0.1.9" superstruct@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/superstruct/-/superstruct-1.0.3.tgz#de626a5b49c6641ff4d37da3c7598e7a87697046" - integrity sha512-8iTn3oSS8nRGn+C2pgXSKPI3jmpm6FExNazNpjvqS6ZUJQCej3PUXEKM8NjHBOs54ExM+LPW/FBRhymrdcCiSg== - -supports-color@8.1.1, supports-color@^8: - version "8.1.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== - dependencies: - has-flag "^4.0.0" - -supports-color@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" - integrity sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g== + version "1.0.4" + resolved "https://registry.yarnpkg.com/superstruct/-/superstruct-1.0.4.tgz#0adb99a7578bd2f1c526220da6571b2d485d91ca" + integrity sha512-7JpaAoX2NGyoFlI9NBh66BQXGONc+uE+MRS5i2iOBKuS4e+ccgMDjATgZldkah+33DakBxDHiss9kvUcGAO8UQ== -supports-color@^5.3.0, supports-color@^5.5.0: +supports-color@^5.3.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== dependencies: has-flag "^3.0.0" -supports-color@^7.1.0, supports-color@^7.2.0: +supports-color@^7, supports-color@^7.1.0: version "7.2.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== dependencies: has-flag "^4.0.0" +supports-color@^8, supports-color@^8.1.1: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + supports-preserve-symlinks-flag@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== -system-architecture@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/system-architecture/-/system-architecture-0.1.0.tgz#71012b3ac141427d97c67c56bc7921af6bff122d" - integrity sha512-ulAk51I9UVUyJgxlv9M6lFot2WP3e7t8Kz9+IS6D4rVba1tR9kON+Ey69f+1R4Q8cd45Lod6a4IcJIxnzGc/zA== +tailwindcss@4.0.12, tailwindcss@^4.0.12: + version "4.0.12" + resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-4.0.12.tgz#71ab22c78810303b1156354bcc561a747169b5bd" + integrity sha512-bT0hJo91FtncsAMSsMzUkoo/iEU0Xs5xgFgVC9XmdM9bw5MhZuQFjPNl6wxAE0SiQF/YTZJa+PndGWYSDtuxAg== -tailwindcss@^3.4.1: - version "3.4.1" - resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.4.1.tgz#f512ca5d1dd4c9503c7d3d28a968f1ad8f5c839d" - integrity sha512-qAYmXRfk3ENzuPBakNK0SRrUDipP8NQnEY6772uDhflcQz5EhRdD7JNZxyrFHVQNCwULPBn6FNPp9brpO7ctcA== +tailwindcss@^3.4.17: + version "3.4.17" + resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.4.17.tgz#ae8406c0f96696a631c790768ff319d46d5e5a63" + integrity sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og== dependencies: "@alloc/quick-lru" "^5.2.0" arg "^5.0.2" - chokidar "^3.5.3" + chokidar "^3.6.0" didyoumean "^1.2.2" dlv "^1.1.3" - fast-glob "^3.3.0" + fast-glob "^3.3.2" glob-parent "^6.0.2" is-glob "^4.0.3" - jiti "^1.19.1" - lilconfig "^2.1.0" - micromatch "^4.0.5" + jiti "^1.21.6" + lilconfig "^3.1.3" + micromatch "^4.0.8" normalize-path "^3.0.0" object-hash "^3.0.0" - picocolors "^1.0.0" - postcss "^8.4.23" + picocolors "^1.1.1" + postcss "^8.4.47" postcss-import "^15.1.0" postcss-js "^4.0.1" - postcss-load-config "^4.0.1" - postcss-nested "^6.0.1" - postcss-selector-parser "^6.0.11" - resolve "^1.22.2" - sucrase "^3.32.0" - -tap-out@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/tap-out/-/tap-out-2.1.0.tgz#c093079a915036de8b835bfa3297f14458b15358" - integrity sha512-LJE+TBoVbOWhwdz4+FQk40nmbIuxJLqaGvj3WauQw3NYYU5TdjoV3C0x/yq37YAvVyi+oeBXmWnxWSjJ7IEyUw== - dependencies: - re-emitter "1.1.3" - readable-stream "2.2.9" - split "1.0.0" - trim "0.0.1" - -tap-spec@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/tap-spec/-/tap-spec-5.0.0.tgz#7329e4e66e8aa68da2a164215abbb903a7c5d352" - integrity sha512-zMDVJiE5I6Y4XGjlueGXJIX2YIkbDN44broZlnypT38Hj/czfOXrszHNNJBF/DXR8n+x6gbfSx68x04kIEHdrw== - dependencies: - chalk "^1.0.0" - duplexer "^0.1.1" - figures "^1.4.0" - lodash "^4.17.10" - pretty-ms "^2.1.0" - repeat-string "^1.5.2" - tap-out "^2.1.0" - through2 "^2.0.0" + postcss-load-config "^4.0.2" + postcss-nested "^6.2.0" + postcss-selector-parser "^6.1.2" + resolve "^1.22.8" + sucrase "^3.35.0" tapable@^2.2.0: version "2.2.1" resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== -tape@^5.5.3: - version "5.7.4" - resolved "https://registry.yarnpkg.com/tape/-/tape-5.7.4.tgz#5c515282a513599e9d1434665640900faf066a3b" - integrity sha512-uaigP+5H9+E8aaMLKMbGkDd33G5TKu4UFpapqT7um+8xSHQQUS2lJNd+hTj9fFVQLg8bmcIofwc8b9f6+ISSfQ== - dependencies: - "@ljharb/resumer" "^0.0.1" - "@ljharb/through" "^2.3.11" - array.prototype.every "^1.1.5" - call-bind "^1.0.5" - deep-equal "^2.2.3" - defined "^1.0.1" - dotignore "^0.1.2" - for-each "^0.3.3" - get-package-type "^0.1.0" - glob "^7.2.3" - has-dynamic-import "^2.1.0" - hasown "^2.0.0" - inherits "^2.0.4" - is-regex "^1.1.4" - minimist "^1.2.8" - mock-property "^1.0.3" - object-inspect "^1.13.1" - object-is "^1.1.5" - object-keys "^1.1.1" - object.assign "^4.1.5" - resolve "^2.0.0-next.5" - string.prototype.trim "^1.2.8" - term-size@^2.1.0: version "2.2.1" resolved "https://registry.yarnpkg.com/term-size/-/term-size-2.2.1.tgz#2a6a54840432c2fb6320fea0f415531e90189f54" integrity sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg== -tesm-node@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/tesm-node/-/tesm-node-1.3.1.tgz#306da50594ef3f1eef64f2bb55110047c583bb62" - integrity sha512-zyNa8mIJoTN8S61XSr9oYJaZft7/hAE7tPYu2Nu4FALJAexjgE4apD0NUp1x/8Bn4PmX16r0aHrwipUG82+Q1w== - text-table@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" @@ -10002,33 +8703,38 @@ thread-stream@^0.15.1: dependencies: real-require "^0.1.0" -through2@^2.0.0: - version "2.0.5" - resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" - integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== - dependencies: - readable-stream "~2.3.6" - xtend "~4.0.1" +tinybench@^2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/tinybench/-/tinybench-2.9.0.tgz#103c9f8ba6d7237a47ab6dd1dcff77251863426b" + integrity sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg== -through@2: - version "2.3.8" - resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== +tinyexec@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/tinyexec/-/tinyexec-0.3.2.tgz#941794e657a85e496577995c6eef66f53f42b3d2" + integrity sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA== + +tinyglobby@^0.2.11, tinyglobby@^0.2.12, tinyglobby@^0.2.6: + version "0.2.12" + resolved "https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.12.tgz#ac941a42e0c5773bd0b5d08f32de82e74a1a61b5" + integrity sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww== + dependencies: + fdir "^6.4.3" + picomatch "^4.0.2" -tinybench@^2.5.1: - version "2.6.0" - resolved "https://registry.yarnpkg.com/tinybench/-/tinybench-2.6.0.tgz#1423284ee22de07c91b3752c048d2764714b341b" - integrity sha512-N8hW3PG/3aOoZAN5V/NSAEDz0ZixDSSt5b/a05iqtpgfLWMSVuCo7w0k2vVvEjdrIoeGqZzweX2WlyioNIHchA== +tinypool@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/tinypool/-/tinypool-1.0.2.tgz#706193cc532f4c100f66aa00b01c42173d9051b2" + integrity sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA== -tinypool@^0.8.2: - version "0.8.2" - resolved "https://registry.yarnpkg.com/tinypool/-/tinypool-0.8.2.tgz#84013b03dc69dacb322563a475d4c0a9be00f82a" - integrity sha512-SUszKYe5wgsxnNOVlBYO6IC+8VGWdVGZWAqUxp3UErNBtptZvWbwyUOyzNL59zigz2rCA92QiL3wvG+JDSdJdQ== +tinyrainbow@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/tinyrainbow/-/tinyrainbow-2.0.0.tgz#9509b2162436315e80e3eee0fcce4474d2444294" + integrity sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw== -tinyspy@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/tinyspy/-/tinyspy-2.2.0.tgz#9dc04b072746520b432f77ea2c2d17933de5d6ce" - integrity sha512-d2eda04AN/cPOR89F7Xv5bK/jrQEhmcLFe6HFldoeO9AJtps+fqEnh486vnT/8y4bw38pSyxDcTCAq+Ks2aJTg== +tinyspy@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/tinyspy/-/tinyspy-3.0.2.tgz#86dd3cf3d737b15adcf17d7887c84a75201df20a" + integrity sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q== tmp@0.0.33, tmp@^0.0.33: version "0.0.33" @@ -10037,11 +8743,6 @@ tmp@0.0.33, tmp@^0.0.33: dependencies: os-tmpdir "~1.0.2" -to-fast-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== - to-regex-range@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" @@ -10054,13 +8755,6 @@ toidentifier@1.0.1: resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== -touch@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/touch/-/touch-3.1.0.tgz#fe365f5f75ec9ed4e56825e0bb76d24ab74af83b" - integrity sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA== - dependencies: - nopt "~1.0.10" - tr46@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" @@ -10073,11 +8767,6 @@ tr46@~0.0.3: resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== -traverse@^0.6.6: - version "0.6.8" - resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.6.8.tgz#5e5e0c41878b57e4b73ad2f3d1e36a715ea4ab15" - integrity sha512-aXJDbk6SnumuaZSANd21XAo15ucCDE38H4fkqiGsc3MhCK+wOlZvLP9cB/TvpHT0mOyWgC4Z8EwRlzqYSUzdsA== - tree-kill@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" @@ -10088,49 +8777,30 @@ treeify@^1.1.0: resolved "https://registry.yarnpkg.com/treeify/-/treeify-1.1.0.tgz#4e31c6a463accd0943879f30667c4fdaff411bb8" integrity sha512-1m4RA7xVAJrSGrrXGs0L3YTwyvBs2S8PbRHaLZAkFw7JR8oIFwYtysxlBZhYIa7xSyiYJKZ3iGrrk55cGA3i9A== -trim-newlines@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.1.tgz#260a5d962d8b752425b32f3a7db0dcacd176c144" - integrity sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw== - -trim@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/trim/-/trim-0.0.1.tgz#5858547f6b290757ee95cccc666fb50084c460dd" - integrity sha512-YzQV+TZg4AxpKxaTHK3c3D+kRDCGVEE7LemdlQZoQXn0iennk10RsIoY6ikzAqJTc9Xjl9C1/waHom/J86ziAQ== +ts-api-utils@^1.3.0: + version "1.4.3" + resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.4.3.tgz#bfc2215fe6528fecab2b0fba570a2e8a4263b064" + integrity sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw== -ts-api-utils@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.0.3.tgz#f12c1c781d04427313dbac808f453f050e54a331" - integrity sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg== +ts-api-utils@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-2.0.1.tgz#660729385b625b939aaa58054f45c058f33f10cd" + integrity sha512-dnlgjFSVetynI8nzgJ+qF62efpglpWRk8isUEWZGWlJYySCTD6aKvbUDu+zbPeDakk3bg5H4XpitHukgfL1m9w== ts-interface-checker@^0.1.9: version "0.1.13" resolved "https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699" integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== -ts-node@^10.9.2: - version "10.9.2" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.2.tgz#70f021c9e185bccdca820e26dc413805c101c71f" - integrity sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ== - dependencies: - "@cspotcode/source-map-support" "^0.8.0" - "@tsconfig/node10" "^1.0.7" - "@tsconfig/node12" "^1.0.7" - "@tsconfig/node14" "^1.0.0" - "@tsconfig/node16" "^1.0.2" - acorn "^8.4.1" - acorn-walk "^8.1.1" - arg "^4.1.0" - create-require "^1.1.0" - diff "^4.0.1" - make-error "^1.1.1" - v8-compile-cache-lib "^3.0.1" - yn "3.1.1" - -tsconfck@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/tsconfck/-/tsconfck-3.0.1.tgz#803ca0ed8f2f2075639e4061238f04b99ba85e85" - integrity sha512-7ppiBlF3UEddCLeI1JRx5m2Ryq+xk4JrZuq4EuYXykipebaq1dV0Fhgr1hb7CkmHt32QSgOZlcqVLEtHBG4/mg== +ts-pattern@^5.4.0: + version "5.6.2" + resolved "https://registry.yarnpkg.com/ts-pattern/-/ts-pattern-5.6.2.tgz#aad9b4fe3c3f485dfad46e472e1203b688cc9bb4" + integrity sha512-d4IxJUXROL5NCa3amvMg6VQW2HVtZYmUTPfvVtO7zJWGYLJ+mry9v2OmYm+z67aniQoQ8/yFNadiEwtNS9qQiw== + +tsconfck@^3.0.3: + version "3.1.5" + resolved "https://registry.yarnpkg.com/tsconfck/-/tsconfck-3.1.5.tgz#2f07f9be6576825e7a77470a5304ce06c7746e61" + integrity sha512-CLDfGgUp7XPswWnezWwsCRxNmgQjhYq3VXHM0/XIRxhVrKw0M1if9agzryh1QS3nxjCROvV+xWxoJO1YctzzWg== tsconfig-paths@^3.15.0: version "3.15.0" @@ -10156,95 +8826,94 @@ tslib@1.14.1, tslib@^1.9.3: resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3" - integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== +tslib@2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.7.0.tgz#d9b40c5c40ab59e8738f297df3087bf1a2690c01" + integrity sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA== -tslib@^2.0.0, tslib@^2.1.0, tslib@^2.3.0, tslib@^2.3.1, tslib@^2.4.0: - version "2.6.2" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" - integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== +tslib@^2.0.0, tslib@^2.1.0, tslib@^2.3.0, tslib@^2.3.1, tslib@^2.4.0, tslib@^2.6.0: + version "2.8.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" + integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== tsort@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/tsort/-/tsort-0.0.1.tgz#e2280f5e817f8bf4275657fd0f9aebd44f5a2786" integrity sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw== -tsup@^8.0.2: - version "8.0.2" - resolved "https://registry.yarnpkg.com/tsup/-/tsup-8.0.2.tgz#c63192a08386515103e2c44ac5a23bdff75c5fa1" - integrity sha512-NY8xtQXdH7hDUAZwcQdY/Vzlw9johQsaqf7iwZ6g1DOUlFYQ5/AtVAjTvihhEyeRlGo4dLRVHtrRaL35M1daqQ== +tsup@^8.3.6: + version "8.4.0" + resolved "https://registry.yarnpkg.com/tsup/-/tsup-8.4.0.tgz#2fdf537e7abc8f1ccbbbfe4228f16831457d4395" + integrity sha512-b+eZbPCjz10fRryaAA7C8xlIHnf8VnsaRqydheLIqwG/Mcpfk8Z5zp3HayX7GaTygkigHl5cBUs+IhcySiIexQ== dependencies: - bundle-require "^4.0.0" - cac "^6.7.12" - chokidar "^3.5.1" - debug "^4.3.1" - esbuild "^0.19.2" - execa "^5.0.0" - globby "^11.0.3" - joycon "^3.0.1" - postcss-load-config "^4.0.1" + bundle-require "^5.1.0" + cac "^6.7.14" + chokidar "^4.0.3" + consola "^3.4.0" + debug "^4.4.0" + esbuild "^0.25.0" + joycon "^3.1.1" + picocolors "^1.1.1" + postcss-load-config "^6.0.1" resolve-from "^5.0.0" - rollup "^4.0.2" + rollup "^4.34.8" source-map "0.8.0-beta.0" - sucrase "^3.20.3" + sucrase "^3.35.0" + tinyexec "^0.3.2" + tinyglobby "^0.2.11" tree-kill "^1.2.2" -tty-table@^4.1.5: - version "4.2.3" - resolved "https://registry.yarnpkg.com/tty-table/-/tty-table-4.2.3.tgz#e33eb4007a0a9c976c97c37fa13ba66329a5c515" - integrity sha512-Fs15mu0vGzCrj8fmJNP7Ynxt5J7praPXqFN0leZeZBXJwkMxv9cb2D454k1ltrtUSJbZ4yH4e0CynsHLxmUfFA== +tsx@^4.19.2, tsx@^4.19.3: + version "4.19.3" + resolved "https://registry.yarnpkg.com/tsx/-/tsx-4.19.3.tgz#2bdbcb87089374d933596f8645615142ed727666" + integrity sha512-4H8vUNGNjQ4V2EOoGw005+c+dGuPSnhpPBPHBtsZdGZBk/iJb4kguGlPWaZTZ3q5nMtFOEsY0nRDlh9PJyd6SQ== dependencies: - chalk "^4.1.2" - csv "^5.5.3" - kleur "^4.1.5" - smartwrap "^2.0.2" - strip-ansi "^6.0.1" - wcwidth "^1.0.1" - yargs "^17.7.1" - -turbo-darwin-64@1.12.2: - version "1.12.2" - resolved "https://registry.yarnpkg.com/turbo-darwin-64/-/turbo-darwin-64-1.12.2.tgz#4b5e48065b874b2379a45c2db71ce69d7c35c027" - integrity sha512-Aq/ePQ5KNx6XGwlZWTVTqpQYfysm1vkwkI6kAYgrX5DjMWn+tUXrSgNx4YNte0F+V4DQ7PtuWX+jRG0h0ZNg0A== - -turbo-darwin-arm64@1.12.2: - version "1.12.2" - resolved "https://registry.yarnpkg.com/turbo-darwin-arm64/-/turbo-darwin-arm64-1.12.2.tgz#f952ac488480b869316bc12cf3c022e4e40a6be8" - integrity sha512-wTr+dqkwJo/eXE+4SPTSeNBKyyfQJhI6I9sKVlCSBmtaNEqoGNgdVzgMUdqrg9AIFzLIiKO+zhfskNaSWpVFow== - -turbo-linux-64@1.12.2: - version "1.12.2" - resolved "https://registry.yarnpkg.com/turbo-linux-64/-/turbo-linux-64-1.12.2.tgz#160ae2e3baf7c3738b9bc2b6b99ba8e2435e9034" - integrity sha512-BggBKrLojGarDaa2zBo+kUR3fmjpd6bLA8Unm3Aa2oJw0UvEi3Brd+w9lNsPZHXXQYBUzNUY2gCdxf3RteWb0g== - -turbo-linux-arm64@1.12.2: - version "1.12.2" - resolved "https://registry.yarnpkg.com/turbo-linux-arm64/-/turbo-linux-arm64-1.12.2.tgz#32d3408bc112cf433e3cec37b048da38f28a82ea" - integrity sha512-v/apSRvVuwYjq1D9MJFsHv2EpGd1S4VoSdZvVfW6FaM06L8CFZa92urNR1svdGYN28YVKwK9Ikc9qudC6t/d5A== - -turbo-windows-64@1.12.2: - version "1.12.2" - resolved "https://registry.yarnpkg.com/turbo-windows-64/-/turbo-windows-64-1.12.2.tgz#bef2607f8fe88e5e337daa016ec417191086794e" - integrity sha512-3uDdwXcRGkgopYFdPDpxQiuQjfQ12Fxq0fhj+iGymav0eWA4W4wzYwSdlUp6rT22qOBIzaEsrIspRwx1DsMkNg== - -turbo-windows-arm64@1.12.2: - version "1.12.2" - resolved "https://registry.yarnpkg.com/turbo-windows-arm64/-/turbo-windows-arm64-1.12.2.tgz#784c91ef77b8db17c441d78e487f0b3d570275bf" - integrity sha512-zNIHnwtQfJSjFi7movwhPQh2rfrcKZ7Xv609EN1yX0gEp9GxooCUi2yNnBQ8wTqFjioA2M5hZtGJQ0RrKaEm/Q== - -turbo@latest: - version "1.12.2" - resolved "https://registry.yarnpkg.com/turbo/-/turbo-1.12.2.tgz#aa66ce09dc134f8c3adc7ba9491eb30b4d9491db" - integrity sha512-BcoQjBZ+LJCMdjzWhzQflOinUjek28rWXj07aaaAQ8T3Ehs0JFSjIsXOm4qIbo52G4xk3gFVcUtJhh/QRADl7g== + esbuild "~0.25.0" + get-tsconfig "^4.7.5" + optionalDependencies: + fsevents "~2.3.3" + +turbo-darwin-64@2.4.4: + version "2.4.4" + resolved "https://registry.yarnpkg.com/turbo-darwin-64/-/turbo-darwin-64-2.4.4.tgz#2508d9b3b358bb91e8745be3e62284621a2b8721" + integrity sha512-5kPvRkLAfmWI0MH96D+/THnDMGXlFNmjeqNRj5grLKiry+M9pKj3pRuScddAXPdlxjO5Ptz06UNaOQrrYGTx1g== + +turbo-darwin-arm64@2.4.4: + version "2.4.4" + resolved "https://registry.yarnpkg.com/turbo-darwin-arm64/-/turbo-darwin-arm64-2.4.4.tgz#6fccca032d68bc6383d118da2fb7bc0c31ba3a7d" + integrity sha512-/gtHPqbGQXDFhrmy+Q/MFW2HUTUlThJ97WLLSe4bxkDrKHecDYhAjbZ4rN3MM93RV9STQb3Tqy4pZBtsd4DfCw== + +turbo-linux-64@2.4.4: + version "2.4.4" + resolved "https://registry.yarnpkg.com/turbo-linux-64/-/turbo-linux-64-2.4.4.tgz#6957b278c6fc52991bafa037dff6569d3f3b4f82" + integrity sha512-SR0gri4k0bda56hw5u9VgDXLKb1Q+jrw4lM7WAhnNdXvVoep4d6LmnzgMHQQR12Wxl3KyWPbkz9d1whL6NTm2Q== + +turbo-linux-arm64@2.4.4: + version "2.4.4" + resolved "https://registry.yarnpkg.com/turbo-linux-arm64/-/turbo-linux-arm64-2.4.4.tgz#bb596c4a3572f40bf65c0f23db16dc585f71ec80" + integrity sha512-COXXwzRd3vslQIfJhXUklgEqlwq35uFUZ7hnN+AUyXx7hUOLIiD5NblL+ETrHnhY4TzWszrbwUMfe2BYWtaPQg== + +turbo-windows-64@2.4.4: + version "2.4.4" + resolved "https://registry.yarnpkg.com/turbo-windows-64/-/turbo-windows-64-2.4.4.tgz#f73dccceb970bdc75b3a13da81e1671c2bc64325" + integrity sha512-PV9rYNouGz4Ff3fd6sIfQy5L7HT9a4fcZoEv8PKRavU9O75G7PoDtm8scpHU10QnK0QQNLbE9qNxOAeRvF0fJg== + +turbo-windows-arm64@2.4.4: + version "2.4.4" + resolved "https://registry.yarnpkg.com/turbo-windows-arm64/-/turbo-windows-arm64-2.4.4.tgz#e00c26e3d7fd9a82af90018ad3137f14e5221630" + integrity sha512-403sqp9t5sx6YGEC32IfZTVWkRAixOQomGYB8kEc6ZD+//LirSxzeCHCnM8EmSXw7l57U1G+Fb0kxgTcKPU/Lg== + +turbo@^2.4.2: + version "2.4.4" + resolved "https://registry.yarnpkg.com/turbo/-/turbo-2.4.4.tgz#cec5dbac5850adebdba71fbdf90e6e9a7723c3d6" + integrity sha512-N9FDOVaY3yz0YCOhYIgOGYad7+m2ptvinXygw27WPLQvcZDl3+0Sa77KGVlLSiuPDChOUEnTKE9VJwLSi9BPGQ== optionalDependencies: - turbo-darwin-64 "1.12.2" - turbo-darwin-arm64 "1.12.2" - turbo-linux-64 "1.12.2" - turbo-linux-arm64 "1.12.2" - turbo-windows-64 "1.12.2" - turbo-windows-arm64 "1.12.2" + turbo-darwin-64 "2.4.4" + turbo-darwin-arm64 "2.4.4" + turbo-linux-64 "2.4.4" + turbo-linux-arm64 "2.4.4" + turbo-windows-64 "2.4.4" + turbo-windows-arm64 "2.4.4" tus-js-client@^3.1.0: version "3.1.3" @@ -10276,15 +8945,15 @@ type-check@^0.4.0, type-check@~0.4.0: dependencies: prelude-ls "^1.2.1" -type-detect@4.0.8, type-detect@^4.0.0, type-detect@^4.0.8: +type-detect@4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== -type-fest@^0.13.1: - version "0.13.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.13.1.tgz#0172cb5bce80b0bd542ea348db50c7e21834d934" - integrity sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg== +type-detect@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.1.0.tgz#deb2453e8f08dcae7ae98c626b13dddb0155906c" + integrity sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw== type-fest@^0.20.2: version "0.20.2" @@ -10296,86 +8965,80 @@ type-fest@^0.21.3: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== -type-fest@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" - integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== - type-fest@^0.7.1: version "0.7.1" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.7.1.tgz#8dda65feaf03ed78f0a3f9678f1869147f7c5c48" integrity sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg== -type-fest@^0.8.1: - version "0.8.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" - integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== - -type-fest@^1.0.2: - version "1.4.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-1.4.0.tgz#e9fb813fe3bf1744ec359d55d1affefa76f14be1" - integrity sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA== - -type-fest@^3.0.0: - version "3.13.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-3.13.1.tgz#bb744c1f0678bea7543a2d1ec24e83e68e8c8706" - integrity sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g== - -typed-array-buffer@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz#18de3e7ed7974b0a729d3feecb94338d1472cd60" - integrity sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw== +typed-array-buffer@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz#a72395450a4869ec033fd549371b47af3a2ee536" + integrity sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw== dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.2.1" - is-typed-array "^1.1.10" + call-bound "^1.0.3" + es-errors "^1.3.0" + is-typed-array "^1.1.14" -typed-array-byte-length@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz#d787a24a995711611fb2b87a4052799517b230d0" - integrity sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA== +typed-array-byte-length@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz#8407a04f7d78684f3d252aa1a143d2b77b4160ce" + integrity sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg== dependencies: - call-bind "^1.0.2" + call-bind "^1.0.8" for-each "^0.3.3" - has-proto "^1.0.1" - is-typed-array "^1.1.10" + gopd "^1.2.0" + has-proto "^1.2.0" + is-typed-array "^1.1.14" -typed-array-byte-offset@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz#cbbe89b51fdef9cd6aaf07ad4707340abbc4ea0b" - integrity sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg== +typed-array-byte-offset@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz#ae3698b8ec91a8ab945016108aef00d5bff12355" + integrity sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ== dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" + available-typed-arrays "^1.0.7" + call-bind "^1.0.8" for-each "^0.3.3" - has-proto "^1.0.1" - is-typed-array "^1.1.10" + gopd "^1.2.0" + has-proto "^1.2.0" + is-typed-array "^1.1.15" + reflect.getprototypeof "^1.0.9" -typed-array-length@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.4.tgz#89d83785e5c4098bec72e08b319651f0eac9c1bb" - integrity sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng== +typed-array-length@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.7.tgz#ee4deff984b64be1e118b0de8c9c877d5ce73d3d" + integrity sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg== dependencies: - call-bind "^1.0.2" + call-bind "^1.0.7" for-each "^0.3.3" - is-typed-array "^1.1.9" + gopd "^1.0.1" + is-typed-array "^1.1.13" + possible-typed-array-names "^1.0.0" + reflect.getprototypeof "^1.0.6" -typedoc-plugin-markdown@^3.17.1: - version "3.17.1" - resolved "https://registry.yarnpkg.com/typedoc-plugin-markdown/-/typedoc-plugin-markdown-3.17.1.tgz#c33f42363c185adf842f4699166015f7fe0ed02b" - integrity sha512-QzdU3fj0Kzw2XSdoL15ExLASt2WPqD7FbLeaqwT70+XjKyTshBnUlQA5nNREO1C2P8Uen0CDjsBLMsCQ+zd0lw== - dependencies: - handlebars "^4.7.7" +typedoc-plugin-markdown@^4.4.1: + version "4.4.2" + resolved "https://registry.yarnpkg.com/typedoc-plugin-markdown/-/typedoc-plugin-markdown-4.4.2.tgz#fc31779595aa9bf00e66709f3894e048345bf7ed" + integrity sha512-kJVkU2Wd+AXQpyL6DlYXXRrfNrHrEIUgiABWH8Z+2Lz5Sq6an4dQ/hfvP75bbokjNDUskOdFlEEm/0fSVyC7eg== -typedoc@^0.25.8: - version "0.25.8" - resolved "https://registry.yarnpkg.com/typedoc/-/typedoc-0.25.8.tgz#7d0e1bf12d23bf1c459fd4893c82cb855911ff12" - integrity sha512-mh8oLW66nwmeB9uTa0Bdcjfis+48bAjSH3uqdzSuSawfduROQLlXw//WSNZLYDdhmMVB7YcYZicq6e8T0d271A== +typedoc@^0.27.6: + version "0.27.9" + resolved "https://registry.yarnpkg.com/typedoc/-/typedoc-0.27.9.tgz#5e0a7bc32bfc7bd0b70a353f4f1d5cba3d667c46" + integrity sha512-/z585740YHURLl9DN2jCWe6OW7zKYm6VoQ93H0sxZ1cwHQEQrUn5BJrEnkWhfzUdyO+BLGjnKUZ9iz9hKloFDw== dependencies: + "@gerrit0/mini-shiki" "^1.24.0" lunr "^2.3.9" - marked "^4.3.0" - minimatch "^9.0.3" - shiki "^0.14.7" + markdown-it "^14.1.0" + minimatch "^9.0.5" + yaml "^2.6.1" + +typescript-eslint@^8.24.1: + version "8.26.1" + resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-8.26.1.tgz#d17a638a7543bc535157b83cdf5876513c71493b" + integrity sha512-t/oIs9mYyrwZGRpDv3g+3K6nZ5uhKEMt2oNmAPwaY4/ye0+EH4nXIPYNtkYFS6QHm+1DFg34DbglYBz5P9Xysg== + dependencies: + "@typescript-eslint/eslint-plugin" "8.26.1" + "@typescript-eslint/parser" "8.26.1" + "@typescript-eslint/utils" "8.26.1" typescript-logging@^1.0.1: version "1.0.1" @@ -10384,81 +9047,77 @@ typescript-logging@^1.0.1: dependencies: stacktrace-js "1.3.1" -typescript@^5.3.3: - version "5.3.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.3.3.tgz#b3ce6ba258e72e6305ba66f5c9b452aaee3ffe37" - integrity sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw== +typescript@^5.3.3, typescript@^5.8.2: + version "5.8.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.8.2.tgz#8170b3702f74b79db2e5a96207c15e65807999e4" + integrity sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ== + +typescript@~5.7.2: + version "5.7.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.7.3.tgz#919b44a7dbb8583a9b856d162be24a54bf80073e" + integrity sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw== ua-parser-js@^1.0.37: - version "1.0.37" - resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-1.0.37.tgz#b5dc7b163a5c1f0c510b08446aed4da92c46373f" - integrity sha512-bhTyI94tZofjo+Dn8SN6Zv8nBDvyXTymAdM3LDI/0IboIUwTu1rEhW7v2TfiVsoYWgkQ4kOVqnI8APUFbIQIFQ== + version "1.0.40" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-1.0.40.tgz#ac6aff4fd8ea3e794a6aa743ec9c2fc29e75b675" + integrity sha512-z6PJ8Lml+v3ichVojCiB8toQJBuwR42ySM4ezjXIqXK3M0HczmKQ3LF4rhU55PfD99KEEXQG6yb7iOMyvYuHew== -ufo@^1.3.0, ufo@^1.3.1, ufo@^1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/ufo/-/ufo-1.3.2.tgz#c7d719d0628a1c80c006d2240e0d169f6e3c0496" - integrity sha512-o+ORpgGwaYQXgqGDwd+hkS4PuZ3QnmqMMxRuajK/a38L6fTpcE5GPIfrf+L/KemFzfUpeUQc1rRS1iDBozvnFA== +uc.micro@^2.0.0, uc.micro@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-2.1.0.tgz#f8d3f7d0ec4c3dea35a7e3c8efa4cb8b45c9e7ee" + integrity sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A== -uglify-js@^3.1.4: - version "3.17.4" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.17.4.tgz#61678cf5fa3f5b7eb789bb345df29afb8257c22c" - integrity sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g== +ufo@^1.5.4: + version "1.5.4" + resolved "https://registry.yarnpkg.com/ufo/-/ufo-1.5.4.tgz#16d6949674ca0c9e0fbbae1fa20a71d7b1ded754" + integrity sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ== -uint8arrays@^3.0.0, uint8arrays@^3.1.0: +uint8arrays@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/uint8arrays/-/uint8arrays-3.1.0.tgz#8186b8eafce68f28bd29bd29d683a311778901e2" + integrity sha512-ei5rfKtoRO8OyOIor2Rz5fhzjThwIHJZ3uyDPnDHTXbP0aMQ1RN/6AI5B5d9dBxJOU+BvOAk7ZQ1xphsX8Lrog== + dependencies: + multiformats "^9.4.2" + +uint8arrays@^3.0.0: version "3.1.1" resolved "https://registry.yarnpkg.com/uint8arrays/-/uint8arrays-3.1.1.tgz#2d8762acce159ccd9936057572dade9459f65ae0" integrity sha512-+QJa8QRnbdXVpHYjLoTpJIdCTiw9Ir62nocClWuXIq2JIh4Uta0cQsTSpFL678p2CN8B+XSApwcU+pQEqVpKWg== dependencies: multiformats "^9.4.2" -unbox-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" - integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== +unbox-primitive@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.1.0.tgz#8d9d2c9edeea8460c7f35033a88867944934d1e2" + integrity sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw== dependencies: - call-bind "^1.0.2" + call-bound "^1.0.3" has-bigints "^1.0.2" - has-symbols "^1.0.3" - which-boxed-primitive "^1.0.2" + has-symbols "^1.1.0" + which-boxed-primitive "^1.1.1" uncrypto@^0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/uncrypto/-/uncrypto-0.1.3.tgz#e1288d609226f2d02d8d69ee861fa20d8348ef2b" integrity sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q== -undefsafe@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.5.tgz#38733b9327bdcd226db889fb723a6efd162e6e2c" - integrity sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA== +undici-types@~6.19.2: + version "6.19.8" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02" + integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw== -undici-types@~5.26.4: - version "5.26.5" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" - integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== +undici-types@~6.20.0: + version "6.20.0" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.20.0.tgz#8171bf22c1f588d1554d55bf204bc624af388433" + integrity sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg== undici@^5.14.0: - version "5.28.3" - resolved "https://registry.yarnpkg.com/undici/-/undici-5.28.3.tgz#a731e0eff2c3fcfd41c1169a869062be222d1e5b" - integrity sha512-3ItfzbrhDlINjaP0duwnNsKpDQk3acHI3gVJ1z4fmwMK31k5G9OVIAMLSIaP6w4FaGkaAkN6zaQO9LUvZ1t7VA== + version "5.28.5" + resolved "https://registry.yarnpkg.com/undici/-/undici-5.28.5.tgz#b2b94b6bf8f1d919bc5a6f31f2c01deb02e54d4b" + integrity sha512-zICwjrDrcrUE0pyyJc1I2QzBkLM8FINsgOrt6WjA+BgajVq9Nxu2PbFFXUrAggLfDXlZGZBVZYw7WNV5KiBiBA== dependencies: "@fastify/busboy" "^2.0.0" -unenv@^1.9.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/unenv/-/unenv-1.9.0.tgz#469502ae85be1bd3a6aa60f810972b1a904ca312" - integrity sha512-QKnFNznRxmbOF1hDgzpqrlIf6NC5sbZ2OJ+5Wl3OX8uM+LUJXbj4TXvLJCtwbPTmbMHCLIz6JLKNinNsMShK9g== - dependencies: - consola "^3.2.3" - defu "^6.1.3" - mime "^3.0.0" - node-fetch-native "^1.6.1" - pathe "^1.1.1" - -unfetch@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/unfetch/-/unfetch-4.2.0.tgz#7e21b0ef7d363d8d9af0fb929a5555f6ef97a3be" - integrity sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA== - unique-names-generator@^4.7.1: version "4.7.1" resolved "https://registry.yarnpkg.com/unique-names-generator/-/unique-names-generator-4.7.1.tgz#966407b12ba97f618928f77322cfac8c80df5597" @@ -10475,43 +9134,26 @@ unpipe@1.0.0: integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== unstorage@^1.9.0: - version "1.10.1" - resolved "https://registry.yarnpkg.com/unstorage/-/unstorage-1.10.1.tgz#bf8cc00a406e40a6293e893da9807057d95875b0" - integrity sha512-rWQvLRfZNBpF+x8D3/gda5nUCQL2PgXy2jNG4U7/Rc9BGEv9+CAJd0YyGCROUBKs9v49Hg8huw3aih5Bf5TAVw== + version "1.15.0" + resolved "https://registry.yarnpkg.com/unstorage/-/unstorage-1.15.0.tgz#d1f23cba0901c5317d15a751a299e50fbb637674" + integrity sha512-m40eHdGY/gA6xAPqo8eaxqXgBuzQTlAKfmB1iF7oCKXE1HfwHwzDJBywK+qQGn52dta+bPlZluPF7++yR3p/bg== dependencies: anymatch "^3.1.3" - chokidar "^3.5.3" - destr "^2.0.2" - h3 "^1.8.2" - ioredis "^5.3.2" - listhen "^1.5.5" - lru-cache "^10.0.2" - mri "^1.2.0" - node-fetch-native "^1.4.1" - ofetch "^1.3.3" - ufo "^1.3.1" - -untun@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/untun/-/untun-0.1.3.tgz#5d10dee37a3a5737ff03d158be877dae0a0e58a6" - integrity sha512-4luGP9LMYszMRZwsvyUd9MrxgEGZdZuZgpVQHEEX0lCYFESasVRvZd0EYpCkOIbJKHMuv0LskpXc/8Un+MJzEQ== - dependencies: - citty "^0.1.5" - consola "^3.2.3" - pathe "^1.1.1" - -update-browserslist-db@^1.0.13: - version "1.0.13" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz#3c5e4f5c083661bd38ef64b6328c26ed6c8248c4" - integrity sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg== + chokidar "^4.0.3" + destr "^2.0.3" + h3 "^1.15.0" + lru-cache "^10.4.3" + node-fetch-native "^1.6.6" + ofetch "^1.4.1" + ufo "^1.5.4" + +update-browserslist-db@^1.1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz#348377dd245216f9e7060ff50b15a1b740b75420" + integrity sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw== dependencies: - escalade "^3.1.1" - picocolors "^1.0.0" - -uqr@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/uqr/-/uqr-0.1.2.tgz#5c6cd5dcff9581f9bb35b982cb89e2c483a41d7d" - integrity sha512-MJu7ypHq6QasgF5YRTjqscSzQp/W11zoUk6kvmlH+fmWEs63Y0Eib13hYFwAzagRJcVY8WVnlV+eBDUGMJ5IbA== + escalade "^3.2.0" + picocolors "^1.1.1" uri-js@^4.2.2: version "4.4.1" @@ -10528,17 +9170,17 @@ url-parse@^1.5.7: querystringify "^2.1.1" requires-port "^1.0.0" -use-callback-ref@^1.3.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/use-callback-ref/-/use-callback-ref-1.3.1.tgz#9be64c3902cbd72b07fe55e56408ae3a26036fd0" - integrity sha512-Lg4Vx1XZQauB42Hw3kK7JM6yjVjgFmFC5/Ab797s79aARomD2nEErc4mCgM8EZrARLmmbWpi5DGCadmK50DcAQ== +use-callback-ref@^1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/use-callback-ref/-/use-callback-ref-1.3.3.tgz#98d9fab067075841c5b2c6852090d5d0feabe2bf" + integrity sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg== dependencies: tslib "^2.0.0" use-sidecar@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/use-sidecar/-/use-sidecar-1.1.2.tgz#2f43126ba2d7d7e117aa5855e5d8f0276dfe73c2" - integrity sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw== + version "1.1.3" + resolved "https://registry.yarnpkg.com/use-sidecar/-/use-sidecar-1.1.3.tgz#10e7fd897d130b896e2c546c63a5e8233d00efdb" + integrity sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ== dependencies: detect-node-es "^1.1.0" tslib "^2.0.0" @@ -10548,18 +9190,18 @@ use-sync-external-store@1.2.0: resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz#7dbefd6ef3fe4e767a0cf5d7287aacfb5846928a" integrity sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA== -utf-8-validate@^6.0.3: - version "6.0.3" - resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-6.0.3.tgz#7d8c936d854e86b24d1d655f138ee27d2636d777" - integrity sha512-uIuGf9TWQ/y+0Lp+KGZCMuJWc3N9BHA+l/UmHd/oUHwJJDeysyTRxNQVkbzsIWfGFbRe3OcgML/i0mvVRPOyDA== +use-sync-external-store@1.4.0, use-sync-external-store@^1.2.2: + version "1.4.0" + resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.4.0.tgz#adbc795d8eeb47029963016cefdf89dc799fcebc" + integrity sha512-9WXSPC5fMv61vaupRkCKCxsPxBocVnwakBEkMIHHpkTTg6icbJtg6jzgtLDm4bl3cSHAca52rYWih0k4K3PfHw== + +utf-8-validate@^5.0.2: + version "5.0.10" + resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.10.tgz#d7d10ea39318171ca982718b6b96a8d2442571a2" + integrity sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ== dependencies: node-gyp-build "^4.3.0" -utf8@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/utf8/-/utf8-3.0.0.tgz#f052eed1364d696e769ef058b183df88c87f69d1" - integrity sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ== - util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" @@ -10581,24 +9223,11 @@ uuid@^8.3.2: resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== -uuid@^9.0.0: +uuid@^9.0.0, uuid@^9.0.1: version "9.0.1" resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.1.tgz#e188d4c8853cc722220392c424cd637f32293f30" integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA== -v8-compile-cache-lib@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" - integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== - -validate-npm-package-license@^3.0.1: - version "3.0.4" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" - integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== - dependencies: - spdx-correct "^3.0.0" - spdx-expression-parse "^3.0.0" - valtio@1.11.2: version "1.11.2" resolved "https://registry.yarnpkg.com/valtio/-/valtio-1.11.2.tgz#b8049c02dfe65620635d23ebae9121a741bb6530" @@ -10612,150 +9241,124 @@ video-stream-merger@^4.0.1: resolved "https://registry.yarnpkg.com/video-stream-merger/-/video-stream-merger-4.0.1.tgz#b0061251bd211121d1256ccf9e2be9477e59d5cb" integrity sha512-VazYSr8tk6S/zkOq5jpR/ryy1HnGxm5XCw+d2Ejpqy1m6d71oZpyFG82dUkgAo7dg/lk3k4TqvJPtuRUtR8URA== -viem@^1.0.0, viem@^1.1.4, viem@^1.20.3, viem@^2.16.2: - version "2.16.2" - resolved "https://registry.yarnpkg.com/viem/-/viem-2.16.2.tgz#227e14c61afc9057d2290501649e37f7ed0379be" - integrity sha512-qor3v1cJFR3jcPtcJxPbKfKURAH2agNf2IWZIaSReV6teNLERiu4Sr7kbqpkIeTAEpiDCVQwg336M+mub1m+pg== +viem@2.23.2: + version "2.23.2" + resolved "https://registry.yarnpkg.com/viem/-/viem-2.23.2.tgz#db395c8cf5f4fb5572914b962fb8ce5db09f681c" + integrity sha512-NVmW/E0c5crMOtbEAqMF0e3NmvQykFXhLOc/CkLIXOlzHSA6KXVz3CYVmaKqBF8/xtjsjHAGjdJN3Ru1kFJLaA== + dependencies: + "@noble/curves" "1.8.1" + "@noble/hashes" "1.7.1" + "@scure/bip32" "1.6.2" + "@scure/bip39" "1.5.4" + abitype "1.0.8" + isows "1.0.6" + ox "0.6.7" + ws "8.18.0" + +viem@^1.20.3: + version "1.21.4" + resolved "https://registry.yarnpkg.com/viem/-/viem-1.21.4.tgz#883760e9222540a5a7e0339809202b45fe6a842d" + integrity sha512-BNVYdSaUjeS2zKQgPs+49e5JKocfo60Ib2yiXOWBT6LuVxY1I/6fFX3waEtpXvL1Xn4qu+BVitVtMh9lyThyhQ== dependencies: "@adraffy/ens-normalize" "1.10.0" "@noble/curves" "1.2.0" "@noble/hashes" "1.3.2" "@scure/bip32" "1.3.2" "@scure/bip39" "1.2.1" - abitype "1.0.4" - isows "1.0.4" - ws "8.17.1" - -vite-node@1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/vite-node/-/vite-node-1.3.1.tgz#a93f7372212f5d5df38e945046b945ac3f4855d2" - integrity sha512-azbRrqRxlWTJEVbzInZCTchx0X69M/XPTCz4H+TLvlTcR/xH/3hkRqhOakT41fMJCMzXTu4UvegkZiEoJAWvng== + abitype "0.9.8" + isows "1.0.3" + ws "8.13.0" + +viem@^2.1.1, viem@^2.23.7: + version "2.23.9" + resolved "https://registry.yarnpkg.com/viem/-/viem-2.23.9.tgz#b28a77aa0f0c7ab1db0cb82eed95e6dbf7a19397" + integrity sha512-y8VLPfKukrstZKTerS9bm45ajZ22wUyStF+VquK3I2OovWLOyXSbQmJWei8syMFhp1uwhxh1tb0fAdx0WSRZWg== + dependencies: + "@noble/curves" "1.8.1" + "@noble/hashes" "1.7.1" + "@scure/bip32" "1.6.2" + "@scure/bip39" "1.5.4" + abitype "1.0.8" + isows "1.0.6" + ox "0.6.9" + ws "8.18.1" + +vite-node@3.0.8: + version "3.0.8" + resolved "https://registry.yarnpkg.com/vite-node/-/vite-node-3.0.8.tgz#69cd1e0b9c7c37a8e7ab3b87ce259cbbf9a7bd72" + integrity sha512-6PhR4H9VGlcwXZ+KWCdMqbtG649xCPZqfI9j2PsK1FcXgEzro5bGHcVKFCTqPLaNKZES8Evqv4LwvZARsq5qlg== dependencies: cac "^6.7.14" - debug "^4.3.4" - pathe "^1.1.1" - picocolors "^1.0.0" - vite "^5.0.0" + debug "^4.4.0" + es-module-lexer "^1.6.0" + pathe "^2.0.3" + vite "^5.0.0 || ^6.0.0" -vite-tsconfig-paths@^4.3.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/vite-tsconfig-paths/-/vite-tsconfig-paths-4.3.1.tgz#28762938151e7c80aec9d70c57e65ddce43a576f" - integrity sha512-cfgJwcGOsIxXOLU/nELPny2/LUD/lcf1IbfyeKTv2bsupVbTH/xpFtdQlBmIP1GEK2CjjLxYhFfB+QODFAx5aw== +vite-tsconfig-paths@^5.1.4: + version "5.1.4" + resolved "https://registry.yarnpkg.com/vite-tsconfig-paths/-/vite-tsconfig-paths-5.1.4.tgz#d9a71106a7ff2c1c840c6f1708042f76a9212ed4" + integrity sha512-cYj0LRuLV2c2sMqhqhGpaO3LretdtMn/BVX4cPLanIZuwwrkVl+lK84E/miEXkCHWXuq65rhNN4rXsBcOB3S4w== dependencies: debug "^4.1.1" globrex "^0.1.2" - tsconfck "^3.0.1" - -vite@^5.0.0: - version "5.0.12" - resolved "https://registry.yarnpkg.com/vite/-/vite-5.0.12.tgz#8a2ffd4da36c132aec4adafe05d7adde38333c47" - integrity sha512-4hsnEkG3q0N4Tzf1+t6NdN9dg/L3BM+q8SWgbSPnJvrgH2kgdyzfVJwbR1ic69/4uMJJ/3dqDZZE5/WwqW8U1w== - dependencies: - esbuild "^0.19.3" - postcss "^8.4.32" - rollup "^4.2.0" - optionalDependencies: - fsevents "~2.3.3" + tsconfck "^3.0.3" -vite@^5.1.4: - version "5.1.4" - resolved "https://registry.yarnpkg.com/vite/-/vite-5.1.4.tgz#14e9d3e7a6e488f36284ef13cebe149f060bcfb6" - integrity sha512-n+MPqzq+d9nMVTKyewqw6kSt+R3CkvF9QAKY8obiQn8g1fwTscKxyfaYnC632HtBXAQGc1Yjomphwn1dtwGAHg== +"vite@^5.0.0 || ^6.0.0", vite@^6.2.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/vite/-/vite-6.2.1.tgz#ae865d4bb93a11844be1bc647c8b2dd1856ea180" + integrity sha512-n2GnqDb6XPhlt9B8olZPrgMD/es/Nd1RdChF6CBD/fHW6pUyUTt2sQW2fPRX5GiD9XEa6+8A6A4f2vT6pSsE7Q== dependencies: - esbuild "^0.19.3" - postcss "^8.4.35" - rollup "^4.2.0" + esbuild "^0.25.0" + postcss "^8.5.3" + rollup "^4.30.1" optionalDependencies: fsevents "~2.3.3" -vitest@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/vitest/-/vitest-1.3.1.tgz#2d7e9861f030d88a4669392a4aecb40569d90937" - integrity sha512-/1QJqXs8YbCrfv/GPQ05wAZf2eakUPLPa18vkJAKE7RXOKfVHqMZZ1WlTjiwl6Gcn65M5vpNUB6EFLnEdRdEXQ== - dependencies: - "@vitest/expect" "1.3.1" - "@vitest/runner" "1.3.1" - "@vitest/snapshot" "1.3.1" - "@vitest/spy" "1.3.1" - "@vitest/utils" "1.3.1" - acorn-walk "^8.3.2" - chai "^4.3.10" - debug "^4.3.4" - execa "^8.0.1" - local-pkg "^0.5.0" - magic-string "^0.30.5" - pathe "^1.1.1" - picocolors "^1.0.0" - std-env "^3.5.0" - strip-literal "^2.0.0" - tinybench "^2.5.1" - tinypool "^0.8.2" - vite "^5.0.0" - vite-node "1.3.1" - why-is-node-running "^2.2.2" - -void-elements@3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-3.1.0.tgz#614f7fbf8d801f0bb5f0661f5b2f5785750e4f09" - integrity sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w== - -vscode-oniguruma@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz#439bfad8fe71abd7798338d1cd3dc53a8beea94b" - integrity sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA== - -vscode-textmate@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/vscode-textmate/-/vscode-textmate-8.0.0.tgz#2c7a3b1163ef0441097e0b5d6389cd5504b59e5d" - integrity sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg== - -wagmi@^2.5.11, wagmi@^2.5.7: - version "2.5.7" - resolved "https://registry.yarnpkg.com/wagmi/-/wagmi-2.5.7.tgz#dc5bdba16e8d5a3e8d7af6ab545cf438b564d9d1" - integrity sha512-xSuteMXFKvra4xDddqZbZv/gQlcg3X+To5AoZW7WoAm0iVlF8/vEGpQzCWy6KZs2z1szxPrr0YnH3Zr1Qj4E/A== - dependencies: - "@wagmi/connectors" "4.1.14" - "@wagmi/core" "2.6.5" - use-sync-external-store "1.2.0" - -wcwidth@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" - integrity sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg== - dependencies: - defaults "^1.0.3" - -web3-utils@^1.3.4: - version "1.10.3" - resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.10.3.tgz#f1db99c82549c7d9f8348f04ffe4e0188b449714" - integrity sha512-OqcUrEE16fDBbGoQtZXWdavsPzbGIDc5v3VrRTZ0XrIpefC/viZ1ZU9bGEemazyS0catk/3rkOOxpzTfY+XsyQ== - dependencies: - "@ethereumjs/util" "^8.1.0" - bn.js "^5.2.1" - ethereum-bloom-filters "^1.0.6" - ethereum-cryptography "^2.1.2" - ethjs-unit "0.1.6" - number-to-bn "1.7.0" - randombytes "^2.1.0" - utf8 "3.0.0" - -webextension-polyfill-ts@^0.25.0: - version "0.25.0" - resolved "https://registry.yarnpkg.com/webextension-polyfill-ts/-/webextension-polyfill-ts-0.25.0.tgz#fff041626365dbd0e29c40b197e989a55ec221ca" - integrity sha512-ikQhwwHYkpBu00pFaUzIKY26I6L87DeRI+Q6jBT1daZUNuu8dSrg5U9l/ZbqdaQ1M/TTSPKeAa3kolP5liuedw== - dependencies: - webextension-polyfill "^0.7.0" +vitest@^3.0.5: + version "3.0.8" + resolved "https://registry.yarnpkg.com/vitest/-/vitest-3.0.8.tgz#2b85e689d3067cf3b8e174626ecfcb8b24be0785" + integrity sha512-dfqAsNqRGUc8hB9OVR2P0w8PZPEckti2+5rdZip0WIz9WW0MnImJ8XiR61QhqLa92EQzKP2uPkzenKOAHyEIbA== + dependencies: + "@vitest/expect" "3.0.8" + "@vitest/mocker" "3.0.8" + "@vitest/pretty-format" "^3.0.8" + "@vitest/runner" "3.0.8" + "@vitest/snapshot" "3.0.8" + "@vitest/spy" "3.0.8" + "@vitest/utils" "3.0.8" + chai "^5.2.0" + debug "^4.4.0" + expect-type "^1.1.0" + magic-string "^0.30.17" + pathe "^2.0.3" + std-env "^3.8.0" + tinybench "^2.9.0" + tinyexec "^0.3.2" + tinypool "^1.0.2" + tinyrainbow "^2.0.0" + vite "^5.0.0 || ^6.0.0" + vite-node "3.0.8" + why-is-node-running "^2.3.0" + +wagmi@^2.14.12: + version "2.14.13" + resolved "https://registry.yarnpkg.com/wagmi/-/wagmi-2.14.13.tgz#0c3f68bd2f6618754f17ff99355c0ab50df39c46" + integrity sha512-CX+NpyTczVIST5DqLtasKZ3VrhImKQZ9XM9aDUVgOM46MRN/CykgGGAJfuIfpQ80LZ91GCY+JuitGknHUz7MNQ== + dependencies: + "@wagmi/connectors" "5.7.9" + "@wagmi/core" "2.16.5" + use-sync-external-store "1.4.0" "webextension-polyfill@>=0.10.0 <1.0": + version "0.12.0" + resolved "https://registry.yarnpkg.com/webextension-polyfill/-/webextension-polyfill-0.12.0.tgz#f62c57d2cd42524e9fbdcee494c034cae34a3d69" + integrity sha512-97TBmpoWJEE+3nFBQ4VocyCdLKfw54rFaJ6EVQYLBCXqCIpLSZkwGgASpv4oPt9gdKCJ80RJlcmNzNn008Ag6Q== + +webextension-polyfill@^0.10.0: version "0.10.0" resolved "https://registry.yarnpkg.com/webextension-polyfill/-/webextension-polyfill-0.10.0.tgz#ccb28101c910ba8cf955f7e6a263e662d744dbb8" integrity sha512-c5s35LgVa5tFaHhrZDnr3FpQpjj1BB+RXhLTYUxGqBVN460HkbM8TBtEqdXWbpTKfzwCcjAZVF7zXCYSKtcp9g== -webextension-polyfill@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/webextension-polyfill/-/webextension-polyfill-0.7.0.tgz#0df1120ff0266056319ce1a622b09ad8d4a56505" - integrity sha512-su48BkMLxqzTTvPSE1eWxKToPS2Tv5DLGxKexLEVpwFd6Po6N8hhSLIvG6acPAg7qERoEaDL+Y5HQJeJeml5Aw== - webidl-conversions@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" @@ -10783,75 +9386,63 @@ whatwg-url@^7.0.0: tr46 "^1.0.1" webidl-conversions "^4.0.2" -which-boxed-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" - integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== +which-boxed-primitive@^1.1.0, which-boxed-primitive@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz#d76ec27df7fa165f18d5808374a5fe23c29b176e" + integrity sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA== dependencies: - is-bigint "^1.0.1" - is-boolean-object "^1.1.0" - is-number-object "^1.0.4" - is-string "^1.0.5" - is-symbol "^1.0.3" + is-bigint "^1.1.0" + is-boolean-object "^1.2.1" + is-number-object "^1.1.1" + is-string "^1.1.1" + is-symbol "^1.1.1" -which-builtin-type@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/which-builtin-type/-/which-builtin-type-1.1.3.tgz#b1b8443707cc58b6e9bf98d32110ff0c2cbd029b" - integrity sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw== +which-builtin-type@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/which-builtin-type/-/which-builtin-type-1.2.1.tgz#89183da1b4907ab089a6b02029cc5d8d6574270e" + integrity sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q== dependencies: - function.prototype.name "^1.1.5" - has-tostringtag "^1.0.0" + call-bound "^1.0.2" + 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" + is-date-object "^1.1.0" + is-finalizationregistry "^1.1.0" is-generator-function "^1.0.10" - is-regex "^1.1.4" + is-regex "^1.2.1" 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" + which-boxed-primitive "^1.1.0" + which-collection "^1.0.2" + which-typed-array "^1.1.16" -which-collection@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.1.tgz#70eab71ebbbd2aefaf32f917082fc62cdcb70906" - integrity sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A== +which-collection@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.2.tgz#627ef76243920a107e7ce8e96191debe4b16c2a0" + integrity sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw== dependencies: - is-map "^2.0.1" - is-set "^2.0.1" - is-weakmap "^2.0.1" - is-weakset "^2.0.1" + is-map "^2.0.3" + is-set "^2.0.3" + is-weakmap "^2.0.2" + is-weakset "^2.0.3" which-module@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.1.tgz#776b1fe35d90aebe99e8ac15eb24093389a4a409" integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ== -which-pm@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/which-pm/-/which-pm-2.0.0.tgz#8245609ecfe64bf751d0eef2f376d83bf1ddb7ae" - integrity sha512-Lhs9Pmyph0p5n5Z3mVnN0yWcbQYUAD7rbQUiMsQxOJ3T57k7RFe35SUwWMf7dsbDZks1uOmw4AecB/JMDj3v/w== - dependencies: - load-yaml-file "^0.2.0" - path-exists "^4.0.0" - -which-typed-array@^1.1.13, which-typed-array@^1.1.14, which-typed-array@^1.1.2, which-typed-array@^1.1.9: - version "1.1.14" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.14.tgz#1f78a111aee1e131ca66164d8bdc3ab062c95a06" - integrity sha512-VnXFiIW8yNn9kIHN88xvZ4yOWchftKDsRJ8fEPacX/wl1lOvBrhsJ/OeJCXq7B0AaijRuqgzSKalJoPk+D8MPg== - dependencies: - available-typed-arrays "^1.0.6" - call-bind "^1.0.5" - for-each "^0.3.3" - gopd "^1.0.1" - has-tostringtag "^1.0.1" - -which@^1.2.9: - version "1.3.1" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" - integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== +which-typed-array@^1.1.16, which-typed-array@^1.1.18, which-typed-array@^1.1.2: + version "1.1.19" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.19.tgz#df03842e870b6b88e117524a4b364b6fc689f956" + integrity sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw== dependencies: - isexe "^2.0.0" + available-typed-arrays "^1.0.7" + call-bind "^1.0.8" + call-bound "^1.0.4" + for-each "^0.3.5" + get-proto "^1.0.1" + gopd "^1.2.0" + has-tostringtag "^1.0.2" which@^2.0.1: version "2.0.2" @@ -10860,10 +9451,10 @@ which@^2.0.1: dependencies: isexe "^2.0.0" -why-is-node-running@^2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/why-is-node-running/-/why-is-node-running-2.2.2.tgz#4185b2b4699117819e7154594271e7e344c9973e" - integrity sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA== +why-is-node-running@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/why-is-node-running/-/why-is-node-running-2.3.0.tgz#a3f69a97107f494b3cdc3bdddd883a7d65cebf04" + integrity sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w== dependencies: siginfo "^2.0.0" stackback "0.0.2" @@ -10875,7 +9466,7 @@ widest-line@^3.1.0: dependencies: string-width "^4.0.0" -window-size@^1.1.1: +window-size@^1: version "1.1.1" resolved "https://registry.yarnpkg.com/window-size/-/window-size-1.1.1.tgz#9858586580ada78ab26ecd6978a6e03115c1af20" integrity sha512-5D/9vujkmVQ7pSmc0SCBmHXbkv6eaHwXEx65MywhmUMsI8sGqJ972APq1lotfcwMKPFLuCFfL8xGHLIp7jaBmA== @@ -10883,15 +9474,15 @@ window-size@^1.1.1: define-property "^1.0.0" is-number "^3.0.0" -wordwrap@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" - integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== +word-wrap@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" + integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== -workerpool@6.2.1: - version "6.2.1" - resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.1.tgz#46fc150c17d826b86a008e5a4508656777e9c343" - integrity sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw== +workerpool@^6.5.1: + version "6.5.1" + resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.5.1.tgz#060f73b39d0caf97c6db64da004cd01b4c099544" + integrity sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA== "wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: version "7.0.0" @@ -10911,7 +9502,7 @@ wrap-ansi@^6.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" -wrap-ansi@^8.0.1, wrap-ansi@^8.1.0: +wrap-ansi@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== @@ -10934,37 +9525,37 @@ wrappy@1: resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== -ws@7.4.6: - version "7.4.6" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" - integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== +ws@8.13.0: + version "8.13.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.13.0.tgz#9a9fb92f93cf41512a0735c8f4dd09b8a1211cd0" + integrity sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA== -ws@8.17.1: +ws@8.17.1, ws@~8.17.1: version "8.17.1" resolved "https://registry.yarnpkg.com/ws/-/ws-8.17.1.tgz#9293da530bb548febc95371d90f9c878727d919b" integrity sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ== -ws@8.5.0: - version "8.5.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.5.0.tgz#bfb4be96600757fe5382de12c670dab984a1ed4f" - integrity sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg== +ws@8.18.0: + version "8.18.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.18.0.tgz#0d7505a6eafe2b0e712d232b42279f53bc289bbc" + integrity sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw== -ws@^7.4.6, ws@^7.5.1: - version "7.5.9" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" - integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== +ws@8.18.1: + version "8.18.1" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.18.1.tgz#ea131d3784e1dfdff91adb0a4a116b127515e3cb" + integrity sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w== -ws@~8.11.0: - version "8.11.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.11.0.tgz#6a0d36b8edfd9f96d8b25683db2f8d7de6e8e143" - integrity sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg== +ws@^7.4.6, ws@^7.5.1: + version "7.5.10" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.10.tgz#58b5c20dc281633f6c19113f39b349bd8bd558d9" + integrity sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ== -xmlhttprequest-ssl@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz#91360c86b914e67f44dce769180027c0da618c67" - integrity sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A== +xmlhttprequest-ssl@~2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.1.2.tgz#e9e8023b3f29ef34b97a859f584c5e6c61418e23" + integrity sha512-TEU+nJVUUnA4CYJFLvK5X9AOeH4KvDvhIfm0vV1GaQRtchnG0hgK5p8hw/xjv8cunWYCsiPCSDzObPyhEwq3KQ== -xtend@^4.0.1, xtend@~4.0.1: +xtend@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== @@ -10979,42 +9570,17 @@ y18n@^5.0.5: resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== -yallist@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" - integrity sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A== - yallist@^3.0.2: version "3.1.1" resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - -yaml@2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.3.1.tgz#02fe0975d23cd441242aa7204e09fc28ac2ac33b" - integrity sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ== - -yaml@^1.10.0: - version "1.10.2" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" - integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== - -yaml@^2.3.4: - version "2.3.4" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.3.4.tgz#53fc1d514be80aabf386dc6001eb29bf3b7523b2" - integrity sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA== - -yargs-parser@20.2.4: - version "20.2.4" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" - integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== +yaml@^2.3.4, yaml@^2.6.1: + version "2.7.0" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.7.0.tgz#aef9bb617a64c937a9a748803786ad8d3ffe1e98" + integrity sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA== -yargs-parser@^18.1.2, yargs-parser@^18.1.3: +yargs-parser@^18.1.2: version "18.1.3" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== @@ -11022,7 +9588,7 @@ yargs-parser@^18.1.2, yargs-parser@^18.1.3: camelcase "^5.0.0" decamelize "^1.2.0" -yargs-parser@^20.2.2: +yargs-parser@^20.2.2, yargs-parser@^20.2.9: version "20.2.9" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== @@ -11032,7 +9598,7 @@ yargs-parser@^21.1.1: resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== -yargs-unparser@2.0.0: +yargs-unparser@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== @@ -11042,20 +9608,7 @@ yargs-unparser@2.0.0: flat "^5.0.2" is-plain-obj "^2.1.0" -yargs@16.2.0: - version "16.2.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" - integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== - dependencies: - cliui "^7.0.2" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.0" - y18n "^5.0.5" - yargs-parser "^20.2.2" - -yargs@^15.1.0, yargs@^15.3.1: +yargs@^15.3.1: version "15.4.1" resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== @@ -11072,44 +9625,42 @@ yargs@^15.1.0, yargs@^15.3.1: y18n "^4.0.0" yargs-parser "^18.1.2" -yargs@^17.5.1, yargs@^17.7.1: - version "17.7.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" - integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== +yargs@^16.2.0: + version "16.2.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== dependencies: - cliui "^8.0.1" + cliui "^7.0.2" escalade "^3.1.1" get-caller-file "^2.0.5" require-directory "^2.1.1" - string-width "^4.2.3" + string-width "^4.2.0" y18n "^5.0.5" - yargs-parser "^21.1.1" - -yn@3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" - integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== + yargs-parser "^20.2.2" yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== -yocto-queue@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-1.0.0.tgz#7f816433fb2cbc511ec8bf7d263c3b58a1a3c251" - integrity sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g== +zod-validation-error@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/zod-validation-error/-/zod-validation-error-3.4.0.tgz#3a8a1f55c65579822d7faa190b51336c61bee2a6" + integrity sha512-ZOPR9SVY6Pb2qqO5XHt+MkkTRxGXb4EVtnjc9JpXUOtUB1T9Ru7mZOT361AN3MsetVe7R0a1KZshJDZdgp9miQ== -zustand@4.4.1: - version "4.4.1" - resolved "https://registry.yarnpkg.com/zustand/-/zustand-4.4.1.tgz#0cd3a3e4756f21811bd956418fdc686877e8b3b0" - integrity sha512-QCPfstAS4EBiTQzlaGP1gmorkh/UL1Leaj2tdj+zZCZ/9bm0WS7sI2wnfD5lpOszFqWJ1DcPnGoY8RDL61uokw== - dependencies: - use-sync-external-store "1.2.0" +zod@^3.24.2: + version "3.24.2" + resolved "https://registry.yarnpkg.com/zod/-/zod-3.24.2.tgz#8efa74126287c675e92f46871cfc8d15c34372b3" + integrity sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ== + +zustand@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/zustand/-/zustand-5.0.0.tgz#71f8aaecf185592a3ba2743d7516607361899da9" + integrity sha512-LE+VcmbartOPM+auOjCCLQOsQ05zUTp8RkgwRzefUk+2jISdMMFnxvyTjA4YNWr5ZGXYbVsEMZosttuxUBkojQ== zustand@^4.3.9: - version "4.5.0" - resolved "https://registry.yarnpkg.com/zustand/-/zustand-4.5.0.tgz#141354af56f91de378aa6c4b930032ab338f3ef0" - integrity sha512-zlVFqS5TQ21nwijjhJlx4f9iGrXSL0o/+Dpy4txAP22miJ8Ti6c1Ol1RLNN98BMib83lmDH/2KmLwaNXpjrO1A== + version "4.5.6" + resolved "https://registry.yarnpkg.com/zustand/-/zustand-4.5.6.tgz#6857d52af44874a79fb3408c9473f78367255c96" + integrity sha512-ibr/n1hBzLLj5Y+yUcU7dYw8p6WnIVzdJbnX+1YpaScvZVF2ziugqHs+LAmHw4lWO9c/zRj+K1ncgWDQuthEdQ== dependencies: - use-sync-external-store "1.2.0" + use-sync-external-store "^1.2.2"