diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 3d8e5d8a0..436cc43f2 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -7,7 +7,7 @@ jobs: runs-on: ${{ matrix.os }} strategy: matrix: - node: [ '16.x', '18.x' ] + node: [ '18.x' ] os: [ ubuntu-latest ] steps: diff --git a/.gitignore b/.gitignore index 72fa563a6..7ebab6644 100644 --- a/.gitignore +++ b/.gitignore @@ -13,4 +13,5 @@ contracts/compiled examples/*/pnpm-lock.yaml pnpm-debug.log docs-json -docs +./docs +.next diff --git a/.nvmrc b/.nvmrc index b6a7d89c6..3c032078a 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -16 +18 diff --git a/demos/README.md b/demos/README.md new file mode 100644 index 000000000..685ccb7a1 --- /dev/null +++ b/demos/README.md @@ -0,0 +1,7 @@ +# `@nucypher/*` Demos + +- [`taco-demo`](./taco-demo) - A demo of the `@nucypher/taco` library. +- [`taco-nft-demo`](./taco-nft-demo) - A demo an NFT-based condition using the `@nucypher/taco` library. +- [`nucypher-ts-demo`](https://github.com/nucypher/nucypher-ts-demo) - A demo of PRE in the `nucypher-ts` library. +- [`tdec-sandbox`](https://github.com/nucypher/tdec-sandbox) - A demo of tDec in the `nucypher-ts` library. +- [`tdec-nft-example`](https://github.com/nucypher/tdec-nft-example) - A demo of tDec in the `nucypher-ts` library. diff --git a/demos/taco-demo/README.md b/demos/taco-demo/README.md new file mode 100644 index 000000000..00173b0c0 --- /dev/null +++ b/demos/taco-demo/README.md @@ -0,0 +1,31 @@ +# taco-demo + +## Installation + +```bash +pnpm install +pnpm start +``` + +## Usage + +In order to run this demo will need a MetaMask with an account funded with some +$MATIC. + +In order to connect with the network, the demo uses a public instances of +[Porter](https://docs.threshold.network/app-development/threshold-access-control-tac/porter). + +### Polygon + +`@nucypher/taco` is in an early release. We recommend **not** using it in +production _just yet_. + +### Tapir - Mumbai Testnet + +The current release of `@nucypher/taco` supports Ursulas working on Tapir +network and contracts deployed on Mumbai testnet. + +## References + +This dApp is based on +[`useDapp` example](https://github.com/EthWorks/useDapp/tree/master/packages/example). diff --git a/demos/taco-demo/package.json b/demos/taco-demo/package.json new file mode 100644 index 000000000..369c67c7d --- /dev/null +++ b/demos/taco-demo/package.json @@ -0,0 +1,38 @@ +{ + "name": "taco-demo", + "version": "0.1.0", + "description": "A usage example for @nucypher/taco", + "private": true, + "author": "Piotr Rosłaniec ", + "scripts": { + "start": "webpack serve --mode development", + "build": "tsc --noEmit && rimraf build && webpack --mode production --progress" + }, + "dependencies": { + "@nucypher/taco": "workspace:*", + "@usedapp/core": "^1.2.13", + "buffer": "^6.0.3", + "ethers": "^5.7.1", + "file-loader": "^6.2.0", + "react": "^18.2.0", + "react-copy-to-clipboard": "^5.1.0", + "react-dom": "^18.2.0", + "react-spinners": "^0.13.6" + }, + "devDependencies": { + "@pmmmwh/react-refresh-webpack-plugin": "^0.5.7", + "@types/react": "^18.0.20", + "@types/react-copy-to-clipboard": "^5.0.4", + "@types/react-dom": "^18.0.6", + "copy-webpack-plugin": "^11.0.0", + "esbuild-loader": "^2.20.0", + "html-webpack-plugin": "^5.5.0", + "react-refresh": "^0.14.0", + "rimraf": "^3.0.2", + "stream-browserify": "^3.0.0", + "typescript": "^4.8.3", + "webpack": "^5.74.0", + "webpack-cli": "^4.10.0", + "webpack-dev-server": "^4.11.1" + } +} diff --git a/demos/taco-demo/src/App.tsx b/demos/taco-demo/src/App.tsx new file mode 100644 index 000000000..6cf0eb981 --- /dev/null +++ b/demos/taco-demo/src/App.tsx @@ -0,0 +1,122 @@ +import { + conditions, + decrypt, + encrypt, + getPorterUri, + initialize, + ThresholdMessageKit, +} from '@nucypher/taco'; +import { Mumbai, useEthers } from '@usedapp/core'; +import { ethers } from 'ethers'; +import React, { useEffect, useState } from 'react'; + +import { ConditionBuilder } from './ConditionBuilder'; +import { Decrypt } from './Decrypt'; +import { Encrypt } from './Encrypt'; +import { Spinner } from './Spinner'; + +export default function App() { + const { activateBrowserWallet, deactivate, account, switchNetwork } = + useEthers(); + + const [loading, setLoading] = useState(false); + const [condition, setCondition] = useState(); + const [encryptedMessage, setEncryptedMessage] = + useState(); + const [decryptedMessage, setDecryptedMessage] = useState(); + const [decryptionErrors, setDecryptionErrors] = useState([]); + const [ritualId, setRitualId] = useState(2); + + useEffect(() => { + initialize(); + switchNetwork(Mumbai.chainId); + }, []); + + const encryptMessage = async (message: string) => { + if (!condition) { + return; + } + setLoading(true); + + await switchNetwork(Mumbai.chainId); + + const provider = new ethers.providers.Web3Provider(window.ethereum); + const encryptedMessage = await encrypt( + provider, + message, + condition, + ritualId, + provider.getSigner(), + ); + + setEncryptedMessage(encryptedMessage); + setLoading(false); + }; + + const decryptMessage = async (encryptedMessage: ThresholdMessageKit) => { + if (!condition) { + return; + } + setLoading(true); + setDecryptedMessage(''); + setDecryptionErrors([]); + + const provider = new ethers.providers.Web3Provider(window.ethereum); + const porterUri = getPorterUri('lynx'); + const decryptedMessage = await decrypt( + provider, + encryptedMessage, + provider.getSigner(), + porterUri, + ); + + setDecryptedMessage(new TextDecoder().decode(decryptedMessage)); + setLoading(false); + }; + + if (!account) { + return ( +
+

Web3 Provider

+ +
+ ); + } + + if (loading) { + return ; + } + + return ( +
+
+

Web3 Provider

+ + {account &&

Account: {account}

} +
+ +

Ritual ID

+

Replace with your own ritual ID

+ setRitualId(parseInt(e.currentTarget.value))} /> + + + + + + +
+ ); +} diff --git a/demos/taco-demo/src/ConditionBuilder.tsx b/demos/taco-demo/src/ConditionBuilder.tsx new file mode 100644 index 000000000..1a82fc1d3 --- /dev/null +++ b/demos/taco-demo/src/ConditionBuilder.tsx @@ -0,0 +1,81 @@ +import {conditions} from '@nucypher/taco'; +import {Mumbai, useEthers} from '@usedapp/core'; +import React, {useState} from 'react'; + +interface Props { + condition?: conditions.Condition | undefined; + setConditions: (value: conditions.Condition) => void; + enabled: boolean; +} + +const rpcCondition = new conditions.RpcCondition({ + conditionType: 'rpc', + chain: Mumbai.chainId, + method: 'eth_getBalance', + parameters: [':userAddress'], + returnValueTest: { + comparator: '>', + value: '0', + }, +}); + +export const ConditionBuilder = ({ + condition, + setConditions, + enabled, + }: Props) => { + const {library} = useEthers(); + + const demoCondition = JSON.stringify((condition ?? rpcCondition).toObj()); + const [conditionString, setConditionString] = useState(demoCondition); + + if (!enabled || !library) { + return <>; + } + + const prettyPrint = (obj: object | string) => { + if (typeof obj === 'string') { + obj = JSON.parse(obj); + } + return JSON.stringify(obj, null, 2); + }; + + const makeInput = ( + onChange = (e: any) => console.log(e), + defaultValue: string, + ) => ( + + ); + + const conditionJSONInput = makeInput( + setConditionString, + JSON.stringify(rpcCondition.toObj()), + ); + + const onCreateCondition = (e: any) => { + e.preventDefault(); + setConditions(conditions.Condition.fromObj(JSON.parse(conditionString))); + }; + + return ( + <> +

Step 1 - Create A Conditioned Access Policy

+
+
+

Customize your Conditions

+
+

Condition JSON

+ {conditionJSONInput} +
+
+ +
+ + ); +}; diff --git a/demos/taco-demo/src/Decrypt.tsx b/demos/taco-demo/src/Decrypt.tsx new file mode 100644 index 000000000..cd67027f0 --- /dev/null +++ b/demos/taco-demo/src/Decrypt.tsx @@ -0,0 +1,76 @@ +import { ThresholdMessageKit } from '@nucypher/taco'; +import React, { useState } from 'react'; + +interface Props { + enabled: boolean; + decrypt: (encryptedMessage: ThresholdMessageKit) => void; + decryptedMessage?: string | undefined; + decryptionErrors: string[]; +} + +export const Decrypt = ({ + decrypt, + decryptedMessage, + decryptionErrors, + enabled, +}: Props) => { + const [encryptedMessage, setEncryptedMessage] = useState(''); + + if (!enabled) { + return <>; + } + + const onDecrypt = () => { + if (!encryptedMessage) { + return; + } + const mkBytes = Buffer.from(encryptedMessage, 'base64'); + const mk = ThresholdMessageKit.fromBytes(mkBytes); + decrypt(mk); + }; + + const DecryptedMessage = () => { + if (!decryptedMessage) { + return <>; + } + return ( + <> +

Decrypted Message:

+

{decryptedMessage}

+ + ); + }; + + const DecryptionErrors = () => { + if (decryptionErrors.length === 0) { + return null; + } + + return ( +
+

Decryption Errors

+

Not enough decryption shares to decrypt the message.

+

Some Ursulas have failed with errors:

+
    + {decryptionErrors.map((error, index) => ( +
  • {error}
  • + ))} +
+
+ ); + }; + + return ( +
+

Step 3 - Decrypt Encrypted Message

+ setEncryptedMessage(e.currentTarget.value)} + /> + + {DecryptedMessage()} + {DecryptionErrors()} +
+ ); +}; diff --git a/demos/taco-demo/src/Encrypt.tsx b/demos/taco-demo/src/Encrypt.tsx new file mode 100644 index 000000000..35e64983b --- /dev/null +++ b/demos/taco-demo/src/Encrypt.tsx @@ -0,0 +1,54 @@ +import { ThresholdMessageKit } from '@nucypher/taco'; +import React, { useState } from 'react'; +import { CopyToClipboard } from 'react-copy-to-clipboard'; + +interface Props { + enabled: boolean; + encryptedMessage?: ThresholdMessageKit; + encrypt: (value: string) => void; +} + +export const Encrypt = ({ encrypt, encryptedMessage, enabled }: Props) => { + if (!enabled) { + return <>; + } + + const [plaintext, setPlaintext] = useState('plaintext'); + + const onClick = () => encrypt(plaintext); + + const EncryptedMessageContent = () => { + if (!encryptedMessage) { + return <>; + } + + const encodedCiphertext = Buffer.from(encryptedMessage.toBytes()).toString( + 'base64', + ); + + return ( + <> +
+

Encrypted ciphertext:

+
{encodedCiphertext}
+ + + +
+ + ); + }; + + return ( +
+

Step 2 - Set conditions and Encrypt a message

+ setPlaintext(e.currentTarget.value)} + /> + + {EncryptedMessageContent()} +
+ ); +}; diff --git a/demos/taco-demo/src/Spinner.tsx b/demos/taco-demo/src/Spinner.tsx new file mode 100644 index 000000000..d8a14fbb3 --- /dev/null +++ b/demos/taco-demo/src/Spinner.tsx @@ -0,0 +1,23 @@ +import type { CSSProperties } from 'react'; +import React from 'react'; +import ClipLoader from 'react-spinners/ClipLoader'; + +interface Props { + loading: boolean; +} + +export const Spinner = ({ loading }: Props) => { + const style: CSSProperties = { + position: 'fixed', + top: '50%', + left: '50%', + transform: 'translate(-50%, -50%)', + textAlign: 'center', + }; + return ( +
+

Loading

+ +
+ ); +}; diff --git a/demos/taco-demo/src/_redirects b/demos/taco-demo/src/_redirects new file mode 100644 index 000000000..ad37e2c2c --- /dev/null +++ b/demos/taco-demo/src/_redirects @@ -0,0 +1 @@ +/* /index.html 200 diff --git a/demos/taco-demo/src/assets/images/favicon.png b/demos/taco-demo/src/assets/images/favicon.png new file mode 100644 index 000000000..4c849e1f7 Binary files /dev/null and b/demos/taco-demo/src/assets/images/favicon.png differ diff --git a/demos/taco-demo/src/index.html b/demos/taco-demo/src/index.html new file mode 100644 index 000000000..c17ac7729 --- /dev/null +++ b/demos/taco-demo/src/index.html @@ -0,0 +1,32 @@ + + + + + + + + + React App + + + + +
+ + + diff --git a/demos/taco-demo/src/index.tsx b/demos/taco-demo/src/index.tsx new file mode 100644 index 000000000..2a85089c7 --- /dev/null +++ b/demos/taco-demo/src/index.tsx @@ -0,0 +1,20 @@ +import { Config, DAppProvider, Mumbai } from '@usedapp/core'; +import React, { StrictMode } from 'react'; +import * as ReactDOMClient from 'react-dom/client'; + +import App from './App'; + +const config: Config = { + networks: [Mumbai], +}; +const rootElement = document.getElementById('root'); + +if (rootElement) { + ReactDOMClient.createRoot(rootElement).render( + + + + + , + ); +} diff --git a/demos/taco-demo/src/react-app-env.d.ts b/demos/taco-demo/src/react-app-env.d.ts new file mode 100644 index 000000000..4e39a38ad --- /dev/null +++ b/demos/taco-demo/src/react-app-env.d.ts @@ -0,0 +1,5 @@ +/// + +interface Window { + ethereum: any; +} diff --git a/demos/taco-demo/tsconfig.json b/demos/taco-demo/tsconfig.json new file mode 100644 index 000000000..6b7fb0d09 --- /dev/null +++ b/demos/taco-demo/tsconfig.json @@ -0,0 +1,16 @@ +{ + "extends": "../../tsconfig.json", + "include": ["src", "types"], + "compilerOptions": { + "jsx": "react", + "noEmit": true, + "resolveJsonModule": true, + "esModuleInterop": true, + "skipLibCheck": true + }, + "references": [ + { + "path": "../../packages/taco/tsconfig.es.json" + } + ] +} diff --git a/demos/taco-demo/webpack.config.js b/demos/taco-demo/webpack.config.js new file mode 100644 index 000000000..b6f51698d --- /dev/null +++ b/demos/taco-demo/webpack.config.js @@ -0,0 +1,78 @@ +const path = require('path'); +const HtmlWebpackPlugin = require('html-webpack-plugin'); +const CopyPlugin = require('copy-webpack-plugin'); +const { ESBuildMinifyPlugin } = require('esbuild-loader'); +const ReactRefreshWebpackPlugin = require('@pmmmwh/react-refresh-webpack-plugin'); +const webpack = require('webpack'); + +const isDevelopment = process.env.NODE_ENV !== 'production'; + +module.exports = { + entry: './src', + devtool: isDevelopment ? 'eval-source-map' : 'source-map', + plugins: [ + isDevelopment && new ReactRefreshWebpackPlugin(), + new HtmlWebpackPlugin({ + template: './src/index.html', + }), + new CopyPlugin({ + patterns: [ + { from: 'src/_redirects', to: '' }, + { + from: 'src/assets/images/favicon.png', + to: 'favicon.png', + }, + ], + }), + new webpack.ProvidePlugin({ + Buffer: ['buffer', 'Buffer'], + // process: 'process/browser', + }), + ].filter(Boolean), + module: { + rules: [ + { + test: /\.tsx?$/, + loader: 'esbuild-loader', + exclude: /node_modules/, + options: { + loader: 'tsx', + target: 'es2018', + }, + }, + { + test: /\.(png|svg|jpg|gif|woff|woff2|eot|ttf|otf|ico)$/, + use: ['file-loader'], + }, + ], + }, + resolve: { + extensions: ['.tsx', '.ts', '.js'], + fallback: { + // stream: require.resolve('stream-browserify'), + // buffer: require.resolve('buffer/'), + }, + }, + output: { + filename: '[name].[contenthash].js', + path: path.resolve(__dirname, 'build'), + }, + optimization: { + minimizer: [ + new ESBuildMinifyPlugin({ + target: 'es2018', + }), + ], + }, + devServer: { + historyApiFallback: true, + host: '127.0.0.1', + liveReload: true, + headers: { + 'Access-Control-Allow-Origin': '*', + }, + }, + experiments: { + asyncWebAssembly: true, + }, +}; diff --git a/demos/taco-nft-demo/README.md b/demos/taco-nft-demo/README.md new file mode 100644 index 000000000..0089830cd --- /dev/null +++ b/demos/taco-nft-demo/README.md @@ -0,0 +1,31 @@ +# taco-nft-example + +## Installation + +```bash +pnpm install +pnpm start +``` + +## Usage + +In order to run this demo will need a MetaMask with an account funded with some +$MATIC. + +In order to connect with the network, the demo uses a public instances of +[Porter](https://docs.nucypher.com/en/latest/application_development/web_development.html#running-porter). + +### Polygon + +`@nucypher/taco` is in an early release. We recommend **not** using it in +production _just yet_. + +### Tapir - Mumbai Testnet + +The current release of `@nucypher/taco` supports Ursulas working on Tapir +network and contracts deployed on Mumbai testnet. + +## References + +This dApp is based on +[`useDapp` example](https://github.com/EthWorks/useDapp/tree/master/packages/example). diff --git a/demos/taco-nft-demo/package.json b/demos/taco-nft-demo/package.json new file mode 100644 index 000000000..7dedd890c --- /dev/null +++ b/demos/taco-nft-demo/package.json @@ -0,0 +1,38 @@ +{ + "name": "taco-nft-demo", + "version": "0.1.0", + "description": "A usage example for @nucypher/taco", + "private": true, + "author": "Piotr Rosłaniec ", + "scripts": { + "start": "webpack serve --mode development", + "build": "tsc --noEmit && rimraf build && webpack --mode production --progress" + }, + "dependencies": { + "@nucypher/taco": "workspace:*", + "@usedapp/core": "^1.2.13", + "buffer": "^6.0.3", + "ethers": "^5.7.1", + "file-loader": "^6.2.0", + "react": "^18.2.0", + "react-copy-to-clipboard": "^5.1.0", + "react-dom": "^18.2.0", + "react-spinners": "^0.13.6" + }, + "devDependencies": { + "@pmmmwh/react-refresh-webpack-plugin": "^0.5.7", + "@types/react": "^18.0.20", + "@types/react-copy-to-clipboard": "^5.0.4", + "@types/react-dom": "^18.0.6", + "copy-webpack-plugin": "^11.0.0", + "esbuild-loader": "^2.20.0", + "html-webpack-plugin": "^5.5.0", + "react-refresh": "^0.14.0", + "rimraf": "^3.0.2", + "stream-browserify": "^3.0.0", + "typescript": "^4.8.3", + "webpack": "^5.74.0", + "webpack-cli": "^4.10.0", + "webpack-dev-server": "^4.11.1" + } +} diff --git a/demos/taco-nft-demo/src/App.tsx b/demos/taco-nft-demo/src/App.tsx new file mode 100644 index 000000000..b4df8c3ee --- /dev/null +++ b/demos/taco-nft-demo/src/App.tsx @@ -0,0 +1,121 @@ +import { + conditions, + decrypt, + encrypt, + getPorterUri, + initialize, + ThresholdMessageKit, +} from '@nucypher/taco'; +import {Mumbai, useEthers} from '@usedapp/core'; +import {ethers} from 'ethers'; +import React, {useEffect, useState} from 'react'; + +import {Decrypt} from './Decrypt'; +import {Encrypt} from './Encrypt'; +import {NFTConditionBuilder} from './NFTConditionBuilder'; +import {Spinner} from './Spinner'; + +export default function App() { + const {activateBrowserWallet, deactivate, account, switchNetwork } = + useEthers(); + + const [loading, setLoading] = useState(false); + const [condition, setCondition] = useState(); + const [encryptedMessage, setEncryptedMessage] = + useState(); + const [decryptedMessage, setDecryptedMessage] = useState(); + const [decryptionErrors, setDecryptionErrors] = useState([]); + const [ritualId, setRitualId] = useState(2); + + useEffect(() => { + initialize(); + }, []); + + const encryptMessage = async (message: string) => { + if (!condition) { + return; + } + setLoading(true); + + await switchNetwork(Mumbai.chainId); + + const provider = new ethers.providers.Web3Provider(window.ethereum); + const encryptedMessage = await encrypt( + provider, + message, + condition, + ritualId, + provider.getSigner(), + ); + + setEncryptedMessage(encryptedMessage); + setLoading(false); + }; + + const decryptMessage = async (encryptedMessage: ThresholdMessageKit) => { + if (!condition) { + return; + } + setLoading(true); + setDecryptedMessage(''); + setDecryptionErrors([]); + + const provider = new ethers.providers.Web3Provider(window.ethereum); + const porterUri = getPorterUri('lynx'); + const decryptedMessage = await decrypt( + provider, + encryptedMessage, + provider.getSigner(), + porterUri, + ); + + setDecryptedMessage(new TextDecoder().decode(decryptedMessage)); + setLoading(false); + }; + + if (!account) { + return ( +
+

Web3 Provider

+ +
+ ); + } + + if (loading) { + return ; + } + + return ( +
+
+

Web3 Provider

+ + {account &&

Account: {account}

} +
+ +

Ritual ID

+

Replace with your own ritual ID

+ setRitualId(parseInt(e.currentTarget.value))} /> + + + + + + +
+ ); +} diff --git a/demos/taco-nft-demo/src/Decrypt.tsx b/demos/taco-nft-demo/src/Decrypt.tsx new file mode 100644 index 000000000..cd67027f0 --- /dev/null +++ b/demos/taco-nft-demo/src/Decrypt.tsx @@ -0,0 +1,76 @@ +import { ThresholdMessageKit } from '@nucypher/taco'; +import React, { useState } from 'react'; + +interface Props { + enabled: boolean; + decrypt: (encryptedMessage: ThresholdMessageKit) => void; + decryptedMessage?: string | undefined; + decryptionErrors: string[]; +} + +export const Decrypt = ({ + decrypt, + decryptedMessage, + decryptionErrors, + enabled, +}: Props) => { + const [encryptedMessage, setEncryptedMessage] = useState(''); + + if (!enabled) { + return <>; + } + + const onDecrypt = () => { + if (!encryptedMessage) { + return; + } + const mkBytes = Buffer.from(encryptedMessage, 'base64'); + const mk = ThresholdMessageKit.fromBytes(mkBytes); + decrypt(mk); + }; + + const DecryptedMessage = () => { + if (!decryptedMessage) { + return <>; + } + return ( + <> +

Decrypted Message:

+

{decryptedMessage}

+ + ); + }; + + const DecryptionErrors = () => { + if (decryptionErrors.length === 0) { + return null; + } + + return ( +
+

Decryption Errors

+

Not enough decryption shares to decrypt the message.

+

Some Ursulas have failed with errors:

+
    + {decryptionErrors.map((error, index) => ( +
  • {error}
  • + ))} +
+
+ ); + }; + + return ( +
+

Step 3 - Decrypt Encrypted Message

+ setEncryptedMessage(e.currentTarget.value)} + /> + + {DecryptedMessage()} + {DecryptionErrors()} +
+ ); +}; diff --git a/demos/taco-nft-demo/src/Encrypt.tsx b/demos/taco-nft-demo/src/Encrypt.tsx new file mode 100644 index 000000000..35e64983b --- /dev/null +++ b/demos/taco-nft-demo/src/Encrypt.tsx @@ -0,0 +1,54 @@ +import { ThresholdMessageKit } from '@nucypher/taco'; +import React, { useState } from 'react'; +import { CopyToClipboard } from 'react-copy-to-clipboard'; + +interface Props { + enabled: boolean; + encryptedMessage?: ThresholdMessageKit; + encrypt: (value: string) => void; +} + +export const Encrypt = ({ encrypt, encryptedMessage, enabled }: Props) => { + if (!enabled) { + return <>; + } + + const [plaintext, setPlaintext] = useState('plaintext'); + + const onClick = () => encrypt(plaintext); + + const EncryptedMessageContent = () => { + if (!encryptedMessage) { + return <>; + } + + const encodedCiphertext = Buffer.from(encryptedMessage.toBytes()).toString( + 'base64', + ); + + return ( + <> +
+

Encrypted ciphertext:

+
{encodedCiphertext}
+ + + +
+ + ); + }; + + return ( +
+

Step 2 - Set conditions and Encrypt a message

+ setPlaintext(e.currentTarget.value)} + /> + + {EncryptedMessageContent()} +
+ ); +}; diff --git a/demos/taco-nft-demo/src/NFTConditionBuilder.tsx b/demos/taco-nft-demo/src/NFTConditionBuilder.tsx new file mode 100644 index 000000000..82d019c4e --- /dev/null +++ b/demos/taco-nft-demo/src/NFTConditionBuilder.tsx @@ -0,0 +1,122 @@ +import { conditions } from '@nucypher/taco'; +import { useEthers } from '@usedapp/core'; +import React, { useState } from 'react'; + +interface Props { + condition?: conditions.Condition | undefined; + setConditions: (value: conditions.Condition) => void; + enabled: boolean; +} + +export const NFTConditionBuilder = ({ + condition, + setConditions, + enabled, +}: Props) => { + const { library } = useEthers(); + const goerliNFTAddress = '0x932Ca55B9Ef0b3094E8Fa82435b3b4c50d713043'; // https://goerli-nfts.vercel.app/ + const [contractAddress, setContractAddress] = useState(goerliNFTAddress); + const [tokenId, setTokenId] = useState(''); + const [chain, setChain] = useState(5); + + if (!enabled || !library) { + return <>; + } + + const makeInput = ( + onChange = (e: any) => console.log(e), + defaultValue?: string | number, + ) => ( + onChange(e.target.value)} + defaultValue={defaultValue} + /> + ); + + const makeChainInput = ( + onChange = (e: any) => console.log(e), + defaultValue?: number, + ) => ( + onChange(Number.parseInt(e.target.value))} + defaultValue={defaultValue} + /> + ); + + const contractAddressInput = makeInput(setContractAddress, goerliNFTAddress); + const tokenIdInput = makeInput(setTokenId); + const chainInput = makeChainInput(setChain, 5); + + const makeCondition = (): conditions.Condition => { + if (tokenId) { + return new conditions.ContractCondition({ + conditionType: 'contract', + contractAddress, + chain, + standardContractType: 'ERC721', + method: 'ownerOf', + parameters: [parseInt(tokenId, 10)], + returnValueTest: { + comparator: '==', + value: ':userAddress', + }, + }); + } + return new conditions.ContractCondition({ + conditionType: 'contract', + contractAddress, + chain, + standardContractType: 'ERC721', + method: 'balanceOf', + parameters: [':userAddress'], + returnValueTest: { + comparator: '>', + value: '0', + }, + }); + }; + + const onCreateCondition = (e: any) => { + e.preventDefault(); + setConditions(makeCondition()); + }; + + const prettyPrint = (obj: object | string) => { + if (typeof obj === 'string') { + obj = JSON.parse(obj); + } + return JSON.stringify(obj, null, 2); + }; + + return ( + <> +

Step 1 - Create A Conditioned Access Policy

+
+
+

Customize your NFT-Condition

+
+

+ You can mint an NFT{' '} + here or use your own + contract. +

+
+
+

ERC721 Contract Address {contractAddressInput}

+

(Optional) TokenId {tokenIdInput}

+

Chain Id {chainInput}

+
+ +
+ {condition && ( +
+

Condition JSON:

+ +
+ )} +
+ + ); +}; diff --git a/demos/taco-nft-demo/src/Spinner.tsx b/demos/taco-nft-demo/src/Spinner.tsx new file mode 100644 index 000000000..d8a14fbb3 --- /dev/null +++ b/demos/taco-nft-demo/src/Spinner.tsx @@ -0,0 +1,23 @@ +import type { CSSProperties } from 'react'; +import React from 'react'; +import ClipLoader from 'react-spinners/ClipLoader'; + +interface Props { + loading: boolean; +} + +export const Spinner = ({ loading }: Props) => { + const style: CSSProperties = { + position: 'fixed', + top: '50%', + left: '50%', + transform: 'translate(-50%, -50%)', + textAlign: 'center', + }; + return ( +
+

Loading

+ +
+ ); +}; diff --git a/demos/taco-nft-demo/src/_redirects b/demos/taco-nft-demo/src/_redirects new file mode 100644 index 000000000..ad37e2c2c --- /dev/null +++ b/demos/taco-nft-demo/src/_redirects @@ -0,0 +1 @@ +/* /index.html 200 diff --git a/demos/taco-nft-demo/src/assets/images/favicon.png b/demos/taco-nft-demo/src/assets/images/favicon.png new file mode 100644 index 000000000..4c849e1f7 Binary files /dev/null and b/demos/taco-nft-demo/src/assets/images/favicon.png differ diff --git a/demos/taco-nft-demo/src/index.html b/demos/taco-nft-demo/src/index.html new file mode 100644 index 000000000..c17ac7729 --- /dev/null +++ b/demos/taco-nft-demo/src/index.html @@ -0,0 +1,32 @@ + + + + + + + + + React App + + + + +
+ + + diff --git a/demos/taco-nft-demo/src/index.tsx b/demos/taco-nft-demo/src/index.tsx new file mode 100644 index 000000000..2a85089c7 --- /dev/null +++ b/demos/taco-nft-demo/src/index.tsx @@ -0,0 +1,20 @@ +import { Config, DAppProvider, Mumbai } from '@usedapp/core'; +import React, { StrictMode } from 'react'; +import * as ReactDOMClient from 'react-dom/client'; + +import App from './App'; + +const config: Config = { + networks: [Mumbai], +}; +const rootElement = document.getElementById('root'); + +if (rootElement) { + ReactDOMClient.createRoot(rootElement).render( + + + + + , + ); +} diff --git a/demos/taco-nft-demo/src/react-app-env.d.ts b/demos/taco-nft-demo/src/react-app-env.d.ts new file mode 100644 index 000000000..4e39a38ad --- /dev/null +++ b/demos/taco-nft-demo/src/react-app-env.d.ts @@ -0,0 +1,5 @@ +/// + +interface Window { + ethereum: any; +} diff --git a/demos/taco-nft-demo/tsconfig.json b/demos/taco-nft-demo/tsconfig.json new file mode 100644 index 000000000..6b7fb0d09 --- /dev/null +++ b/demos/taco-nft-demo/tsconfig.json @@ -0,0 +1,16 @@ +{ + "extends": "../../tsconfig.json", + "include": ["src", "types"], + "compilerOptions": { + "jsx": "react", + "noEmit": true, + "resolveJsonModule": true, + "esModuleInterop": true, + "skipLibCheck": true + }, + "references": [ + { + "path": "../../packages/taco/tsconfig.es.json" + } + ] +} diff --git a/demos/taco-nft-demo/webpack.config.js b/demos/taco-nft-demo/webpack.config.js new file mode 100644 index 000000000..b6f51698d --- /dev/null +++ b/demos/taco-nft-demo/webpack.config.js @@ -0,0 +1,78 @@ +const path = require('path'); +const HtmlWebpackPlugin = require('html-webpack-plugin'); +const CopyPlugin = require('copy-webpack-plugin'); +const { ESBuildMinifyPlugin } = require('esbuild-loader'); +const ReactRefreshWebpackPlugin = require('@pmmmwh/react-refresh-webpack-plugin'); +const webpack = require('webpack'); + +const isDevelopment = process.env.NODE_ENV !== 'production'; + +module.exports = { + entry: './src', + devtool: isDevelopment ? 'eval-source-map' : 'source-map', + plugins: [ + isDevelopment && new ReactRefreshWebpackPlugin(), + new HtmlWebpackPlugin({ + template: './src/index.html', + }), + new CopyPlugin({ + patterns: [ + { from: 'src/_redirects', to: '' }, + { + from: 'src/assets/images/favicon.png', + to: 'favicon.png', + }, + ], + }), + new webpack.ProvidePlugin({ + Buffer: ['buffer', 'Buffer'], + // process: 'process/browser', + }), + ].filter(Boolean), + module: { + rules: [ + { + test: /\.tsx?$/, + loader: 'esbuild-loader', + exclude: /node_modules/, + options: { + loader: 'tsx', + target: 'es2018', + }, + }, + { + test: /\.(png|svg|jpg|gif|woff|woff2|eot|ttf|otf|ico)$/, + use: ['file-loader'], + }, + ], + }, + resolve: { + extensions: ['.tsx', '.ts', '.js'], + fallback: { + // stream: require.resolve('stream-browserify'), + // buffer: require.resolve('buffer/'), + }, + }, + output: { + filename: '[name].[contenthash].js', + path: path.resolve(__dirname, 'build'), + }, + optimization: { + minimizer: [ + new ESBuildMinifyPlugin({ + target: 'es2018', + }), + ], + }, + devServer: { + historyApiFallback: true, + host: '127.0.0.1', + liveReload: true, + headers: { + 'Access-Control-Allow-Origin': '*', + }, + }, + experiments: { + asyncWebAssembly: true, + }, +}; diff --git a/examples/README.md b/examples/README.md index b6fa68da7..424eaeb32 100644 --- a/examples/README.md +++ b/examples/README.md @@ -2,3 +2,6 @@ This directory contains a set of examples showing how to integrate `@nucypher/*` into your application. + +Refer to `./taco` for examples of how to use the `@nucypher/taco` package. +Refer to `./pre` for examples of how to use the `@nucypher/pre` package. diff --git a/examples/nodejs/README.md b/examples/nodejs/README.md deleted file mode 100644 index 3a0a4278c..000000000 --- a/examples/nodejs/README.md +++ /dev/null @@ -1,10 +0,0 @@ -# `nodejs` integration example - -Shows how to use `@nucypher/*` in NodeJS. - -## Usage - -```bash -pnpm install -pnpm start -``` diff --git a/examples/nextjs/.eslintrc.json b/examples/pre/nextjs/.eslintrc.json similarity index 100% rename from examples/nextjs/.eslintrc.json rename to examples/pre/nextjs/.eslintrc.json diff --git a/examples/nextjs/.gitignore b/examples/pre/nextjs/.gitignore similarity index 100% rename from examples/nextjs/.gitignore rename to examples/pre/nextjs/.gitignore diff --git a/examples/nextjs/README.md b/examples/pre/nextjs/README.md similarity index 100% rename from examples/nextjs/README.md rename to examples/pre/nextjs/README.md diff --git a/examples/pre/nextjs/next-env.d.ts b/examples/pre/nextjs/next-env.d.ts new file mode 100644 index 000000000..4f11a03dc --- /dev/null +++ b/examples/pre/nextjs/next-env.d.ts @@ -0,0 +1,5 @@ +/// +/// + +// NOTE: This file should not be edited +// see https://nextjs.org/docs/basic-features/typescript for more information. diff --git a/examples/nextjs/next.config.js b/examples/pre/nextjs/next.config.js similarity index 100% rename from examples/nextjs/next.config.js rename to examples/pre/nextjs/next.config.js diff --git a/examples/nextjs/package.json b/examples/pre/nextjs/package.json similarity index 88% rename from examples/nextjs/package.json rename to examples/pre/nextjs/package.json index 92ac6853f..1d88e022a 100644 --- a/examples/nextjs/package.json +++ b/examples/pre/nextjs/package.json @@ -9,7 +9,7 @@ "type-check": "tsc -p tsconfig.build.json" }, "dependencies": { - "@nucypher/shared": "workspace:*", + "@nucypher/pre": "workspace:*", "@types/node": "20.6.3", "@types/react": "18.2.22", "@types/react-dom": "18.2.7", @@ -22,7 +22,6 @@ "typescript": "5.2.2" }, "peerDependencies": { - "@nucypher/shared": "workspace:*", "ethers": "^5.7.2", "typescript": "5.2.2" } diff --git a/examples/nextjs/src/app/layout.tsx b/examples/pre/nextjs/src/app/layout.tsx similarity index 100% rename from examples/nextjs/src/app/layout.tsx rename to examples/pre/nextjs/src/app/layout.tsx diff --git a/examples/nextjs/src/app/page.tsx b/examples/pre/nextjs/src/app/page.tsx similarity index 97% rename from examples/nextjs/src/app/page.tsx rename to examples/pre/nextjs/src/app/page.tsx index 31d9300c9..79648862b 100644 --- a/examples/nextjs/src/app/page.tsx +++ b/examples/pre/nextjs/src/app/page.tsx @@ -7,7 +7,7 @@ import { initialize, SecretKey, toHexString, -} from '@nucypher/shared'; +} from '@nucypher/pre'; import {ethers} from 'ethers'; import {useEffect, useState} from 'react'; @@ -56,8 +56,6 @@ function App() { return
Loading...
; } - console.log({Alice, Bob, getPorterUri, SecretKey, toHexString}); - const makeAlice = () => { const alice = Alice.fromSecretKey(SecretKey.random()); setAlice(alice); diff --git a/examples/nextjs/tsconfig.build.json b/examples/pre/nextjs/tsconfig.build.json similarity index 76% rename from examples/nextjs/tsconfig.build.json rename to examples/pre/nextjs/tsconfig.build.json index ec9b2cb72..bca9966f8 100644 --- a/examples/nextjs/tsconfig.build.json +++ b/examples/pre/nextjs/tsconfig.build.json @@ -8,7 +8,7 @@ }, "references": [ { - "path": "../../packages/shared/tsconfig.es.json" + "path": "../../../packages/pre/tsconfig.es.json" } ] } diff --git a/examples/nextjs/tsconfig.json b/examples/pre/nextjs/tsconfig.json similarity index 100% rename from examples/nextjs/tsconfig.json rename to examples/pre/nextjs/tsconfig.json diff --git a/examples/pre/nodejs/.env.example b/examples/pre/nodejs/.env.example new file mode 100644 index 000000000..5c9041014 --- /dev/null +++ b/examples/pre/nodejs/.env.example @@ -0,0 +1,2 @@ +RPC_PROVIDER_URL= +PRIVATE_KEY= diff --git a/examples/pre/nodejs/README.md b/examples/pre/nodejs/README.md new file mode 100644 index 000000000..3bce6d079 --- /dev/null +++ b/examples/pre/nodejs/README.md @@ -0,0 +1,20 @@ +# `nodejs-pre` integration example + +Shows how to use `@nucypher/pre in Node.js. + +## Setup + +Setup environment variables: + +```bash +cp .env.example .env +``` + +Update `.env` with your values. + +## Usage + +```bash +pnpm install +pnpm start +``` diff --git a/examples/nodejs/package.json b/examples/pre/nodejs/package.json similarity index 76% rename from examples/nodejs/package.json rename to examples/pre/nodejs/package.json index a6dc3930c..2516c1e6f 100644 --- a/examples/nodejs/package.json +++ b/examples/pre/nodejs/package.json @@ -9,7 +9,10 @@ "type-check": "tsc" }, "dependencies": { - "@nucypher/shared": "workspace:*", + "@nucypher/pre": "workspace:*", + "dotenv": "^16.3.1" + }, + "peerDependencies": { "ethers": "^5.7.2" } } diff --git a/examples/nodejs/src/index.ts b/examples/pre/nodejs/src/index.ts similarity index 63% rename from examples/nodejs/src/index.ts rename to examples/pre/nodejs/src/index.ts index ed6680dff..7cb42d360 100644 --- a/examples/nodejs/src/index.ts +++ b/examples/pre/nodejs/src/index.ts @@ -5,9 +5,22 @@ import { initialize, SecretKey, toBytes, -} from '@nucypher/shared'; +} from '@nucypher/pre'; +import * as dotenv from 'dotenv'; import { ethers } from 'ethers'; +dotenv.config(); + +const rpcProviderUrl = process.env.RPC_PROVIDER_URL; +if (!rpcProviderUrl) { + throw new Error('RPC_PROVIDER_URL is not set.'); +} + +const privateKey = process.env.PRIVATE_KEY; +if (!privateKey) { + throw new Error('PRIVATE_KEY is not set.'); +} + const makeAlice = () => { const secretKey = SecretKey.fromBEBytes( toBytes('fake-secret-key-32-bytes-alice-x'), @@ -35,30 +48,21 @@ const getRandomLabel = () => `label-${new Date().getTime()}`; const runExample = async () => { await initialize(); - const provider = ethers.Wallet.createRandom(); - - const remoteBob = makeRemoteBob(); - const threshold = 2; - const shares = 3; - const startDate = new Date(); - const endDate = new Date(Date.now() + 1000 * 60 * 60 * 24 * 30); // In 30 days + const provider = new ethers.providers.JsonRpcProvider(rpcProviderUrl); + const signer = new ethers.Wallet(privateKey); const policyParams = { - bob: remoteBob, + bob: makeRemoteBob(), label: getRandomLabel(), - threshold, - shares, - startDate, - endDate, + threshold: 2, + shares: 3, + startDate: new Date(), + endDate: new Date(Date.now() + 1000 * 60 * 60 * 24 * 30), // In 30 days, }; const porterUri = getPorterUri('tapir'); // Test network - const alice = makeAlice(); - const policy = await alice.grant( - provider.provider, - provider, - porterUri, - policyParams, - ); + + console.log('Creating policy...'); + const policy = await alice.grant(provider, signer, porterUri, policyParams); console.log('Policy created:'); console.log({ policy }); diff --git a/examples/pre/nodejs/tsconfig.json b/examples/pre/nodejs/tsconfig.json new file mode 100644 index 000000000..08684819c --- /dev/null +++ b/examples/pre/nodejs/tsconfig.json @@ -0,0 +1,14 @@ +{ + "extends": "../../../tsconfig.json", + "include": ["src"], + "compilerOptions": { + "outDir": "dist", + "rootDir": "src", + "noEmit": true + }, + "references": [ + { + "path": "../../../packages/pre/tsconfig.cjs.json" + } + ] +} diff --git a/examples/react/README.md b/examples/pre/react/README.md similarity index 76% rename from examples/react/README.md rename to examples/pre/react/README.md index f9e056b2a..10eab57c5 100644 --- a/examples/react/README.md +++ b/examples/pre/react/README.md @@ -1,6 +1,6 @@ -# `react-craco` integration example +# `react-pre` integration example -Shows how to integrate `@nucypher/*` into a React application. +Shows how to integrate `@nucypher/pre` into a React application. In order to load WASM dependencies of `@nucypher/*`, we override the `react-scripts` configuration with `craco`. For more details, see the diff --git a/examples/react/package.json b/examples/pre/react/package.json similarity index 89% rename from examples/react/package.json rename to examples/pre/react/package.json index cefe60b36..513cd7e60 100644 --- a/examples/react/package.json +++ b/examples/pre/react/package.json @@ -23,8 +23,7 @@ ] }, "dependencies": { - "@nucypher/shared": "workspace:*", - "ethers": "^5.7.2", + "@nucypher/pre": "workspace:*", "react": "^18.2.0", "react-dom": "^18.2.0" }, @@ -33,5 +32,8 @@ "@types/react": "^18.2.21", "@types/react-dom": "^18.2.7", "react-scripts": "^5.0.1" + }, + "peerDependencies": { + "ethers": "^5.7.2" } } diff --git a/examples/react/public/favicon.ico b/examples/pre/react/public/favicon.ico similarity index 100% rename from examples/react/public/favicon.ico rename to examples/pre/react/public/favicon.ico diff --git a/examples/react/public/index.html b/examples/pre/react/public/index.html similarity index 100% rename from examples/react/public/index.html rename to examples/pre/react/public/index.html diff --git a/examples/react/public/logo192.png b/examples/pre/react/public/logo192.png similarity index 100% rename from examples/react/public/logo192.png rename to examples/pre/react/public/logo192.png diff --git a/examples/react/public/logo512.png b/examples/pre/react/public/logo512.png similarity index 100% rename from examples/react/public/logo512.png rename to examples/pre/react/public/logo512.png diff --git a/examples/react/public/manifest.json b/examples/pre/react/public/manifest.json similarity index 100% rename from examples/react/public/manifest.json rename to examples/pre/react/public/manifest.json diff --git a/examples/react/public/robots.txt b/examples/pre/react/public/robots.txt similarity index 100% rename from examples/react/public/robots.txt rename to examples/pre/react/public/robots.txt diff --git a/examples/react/src/App.tsx b/examples/pre/react/src/App.tsx similarity index 92% rename from examples/react/src/App.tsx rename to examples/pre/react/src/App.tsx index c08220141..d4901ad2b 100644 --- a/examples/react/src/App.tsx +++ b/examples/pre/react/src/App.tsx @@ -6,7 +6,7 @@ import { initialize, SecretKey, toHexString, -} from '@nucypher/shared'; +} from '@nucypher/pre'; import { ethers } from 'ethers'; import { useEffect, useState } from 'react'; @@ -30,13 +30,9 @@ function App() { } const provider = new ethers.providers.Web3Provider(window.ethereum, 'any'); - const {chainId} = await provider.getNetwork(); - if (chainId !== 80001) { - // Switch to Matic Mumbai testnet - await window.ethereum.request({ - method: 'wallet_switchEthereumChain', - params: [{chainId: '0x13881'}], - }); + const { chainId } = await provider.getNetwork(); + if (![137, 80001].includes(chainId)) { + console.error('You need to connect to the Mumbai or Polygon network'); } await provider.send('eth_requestAccounts', []); diff --git a/examples/react/src/index.tsx b/examples/pre/react/src/index.tsx similarity index 100% rename from examples/react/src/index.tsx rename to examples/pre/react/src/index.tsx diff --git a/examples/react/src/react-app-env.d.ts b/examples/pre/react/src/react-app-env.d.ts similarity index 100% rename from examples/react/src/react-app-env.d.ts rename to examples/pre/react/src/react-app-env.d.ts diff --git a/examples/react/tsconfig.build.json b/examples/pre/react/tsconfig.build.json similarity index 76% rename from examples/react/tsconfig.build.json rename to examples/pre/react/tsconfig.build.json index ec9b2cb72..bca9966f8 100644 --- a/examples/react/tsconfig.build.json +++ b/examples/pre/react/tsconfig.build.json @@ -8,7 +8,7 @@ }, "references": [ { - "path": "../../packages/shared/tsconfig.es.json" + "path": "../../../packages/pre/tsconfig.es.json" } ] } diff --git a/examples/react/tsconfig.json b/examples/pre/react/tsconfig.json similarity index 100% rename from examples/react/tsconfig.json rename to examples/pre/react/tsconfig.json diff --git a/examples/pre/webpack-5/README.md b/examples/pre/webpack-5/README.md new file mode 100644 index 000000000..8e5b61600 --- /dev/null +++ b/examples/pre/webpack-5/README.md @@ -0,0 +1,12 @@ +# `webpack-5` integration example + +Shows how to integrate `@nucypher/taco` with Webpack 5. + +## Usage + +```bash +pnpm install +pnpm start +``` + +Go to [localhost:8080](http://localhost:8080/) in your browser and look in the JS console. diff --git a/examples/webpack-5/package.json b/examples/pre/webpack-5/package.json similarity index 90% rename from examples/webpack-5/package.json rename to examples/pre/webpack-5/package.json index c07997c2b..640d02886 100644 --- a/examples/webpack-5/package.json +++ b/examples/pre/webpack-5/package.json @@ -11,8 +11,7 @@ "type-check": "tsc" }, "dependencies": { - "@nucypher/shared": "workspace:*", - "ethers": "^5.7.2" + "@nucypher/pre": "workspace:*" }, "devDependencies": { "copy-webpack-plugin": "^10.2.4", @@ -20,5 +19,8 @@ "webpack": "^5.4.0", "webpack-cli": "^4.9.2", "webpack-dev-server": "^4.7.4" + }, + "peerDependencies": { + "ethers": "^5.7.2" } } diff --git a/examples/webpack-5/src/index.html b/examples/pre/webpack-5/src/index.html similarity index 100% rename from examples/webpack-5/src/index.html rename to examples/pre/webpack-5/src/index.html diff --git a/examples/webpack-5/src/index.ts b/examples/pre/webpack-5/src/index.ts similarity index 85% rename from examples/webpack-5/src/index.ts rename to examples/pre/webpack-5/src/index.ts index 057317a03..3417a426d 100644 --- a/examples/webpack-5/src/index.ts +++ b/examples/pre/webpack-5/src/index.ts @@ -1,10 +1,4 @@ -import { - Alice, - Bob, - SecretKey, - getPorterUri, - initialize, -} from '@nucypher/shared'; +import { Alice, Bob, SecretKey, getPorterUri, initialize } from '@nucypher/pre'; import { ethers } from 'ethers'; declare global { @@ -51,15 +45,6 @@ const runExample = async () => { const provider = new ethers.providers.Web3Provider(window.ethereum!, 'any'); await provider.send('eth_requestAccounts', []); - const { chainId } = await provider.getNetwork(); - if (chainId !== 80001) { - // Switch to Matic Mumbai testnet - await window.ethereum!.request!({ - method: 'wallet_switchEthereumChain', - params: [{ chainId: '0x13881' }], - }); - } - const remoteBob = makeRemoteBob(); const threshold = 2; const shares = 3; diff --git a/examples/pre/webpack-5/tsconfig.json b/examples/pre/webpack-5/tsconfig.json new file mode 100644 index 000000000..e0e8b8a09 --- /dev/null +++ b/examples/pre/webpack-5/tsconfig.json @@ -0,0 +1,14 @@ +{ + "extends": "../../../tsconfig.json", + "include": ["src"], + "compilerOptions": { + "esModuleInterop": true, + "skipLibCheck": true, + "noEmit": true + }, + "references": [ + { + "path": "../../../packages/pre/tsconfig.es.json" + } + ] +} diff --git a/examples/webpack-5/webpack.config.js b/examples/pre/webpack-5/webpack.config.js similarity index 100% rename from examples/webpack-5/webpack.config.js rename to examples/pre/webpack-5/webpack.config.js diff --git a/examples/taco/nextjs/.eslintrc.json b/examples/taco/nextjs/.eslintrc.json new file mode 100644 index 000000000..bffb357a7 --- /dev/null +++ b/examples/taco/nextjs/.eslintrc.json @@ -0,0 +1,3 @@ +{ + "extends": "next/core-web-vitals" +} diff --git a/examples/taco/nextjs/.gitignore b/examples/taco/nextjs/.gitignore new file mode 100644 index 000000000..8f322f0d8 --- /dev/null +++ b/examples/taco/nextjs/.gitignore @@ -0,0 +1,35 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# local env files +.env*.local + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts diff --git a/examples/taco/nextjs/README.md b/examples/taco/nextjs/README.md new file mode 100644 index 000000000..96f8f3210 --- /dev/null +++ b/examples/taco/nextjs/README.md @@ -0,0 +1,48 @@ +This is a [Next.js](https://nextjs.org/) project bootstrapped with +[`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app). + +## Getting Started + +First, run the development server: + +```bash +npm run dev +# or +yarn dev +# or +pnpm dev +# or +bun dev +``` + +Open [http://localhost:3000](http://localhost:3000) with your browser to see the +result. + +You can start editing the page by modifying `app/page.tsx`. The page +auto-updates as you edit the file. + +This project uses +[`next/font`](https://nextjs.org/docs/basic-features/font-optimization) to +automatically optimize and load Inter, a custom Google Font. + +## Learn More + +To learn more about Next.js, take a look at the following resources: + +- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js + features and API. +- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial. + +You can check out +[the Next.js GitHub repository](https://github.com/vercel/next.js/) - your +feedback and contributions are welcome! + +## Deploy on Vercel + +The easiest way to deploy your Next.js app is to use the +[Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) +from the creators of Next.js. + +Check out our +[Next.js deployment documentation](https://nextjs.org/docs/deployment) for more +details. diff --git a/examples/taco/nextjs/next-env.d.ts b/examples/taco/nextjs/next-env.d.ts new file mode 100644 index 000000000..4f11a03dc --- /dev/null +++ b/examples/taco/nextjs/next-env.d.ts @@ -0,0 +1,5 @@ +/// +/// + +// NOTE: This file should not be edited +// see https://nextjs.org/docs/basic-features/typescript for more information. diff --git a/examples/taco/nextjs/next.config.js b/examples/taco/nextjs/next.config.js new file mode 100644 index 000000000..658404ac6 --- /dev/null +++ b/examples/taco/nextjs/next.config.js @@ -0,0 +1,4 @@ +/** @type {import('next').NextConfig} */ +const nextConfig = {}; + +module.exports = nextConfig; diff --git a/examples/taco/nextjs/package.json b/examples/taco/nextjs/package.json new file mode 100644 index 000000000..8653afefe --- /dev/null +++ b/examples/taco/nextjs/package.json @@ -0,0 +1,28 @@ +{ + "private": true, + "scripts": { + "build": "next build", + "check": "pnpm lint && pnpm type-check && pnpm build", + "dev": "next dev", + "lint": "next lint", + "start": "next start", + "type-check": "tsc -p tsconfig.build.json" + }, + "dependencies": { + "@nucypher/taco": "workspace:*", + "@types/node": "20.6.3", + "@types/react": "18.2.22", + "@types/react-dom": "18.2.7", + "eslint": "8.49.0", + "eslint-config-next": "13.5.2", + "ethers": "^5.7.2", + "next": "13.5.2", + "react": "18.2.0", + "react-dom": "18.2.0", + "typescript": "5.2.2" + }, + "peerDependencies": { + "ethers": "^5.7.2", + "typescript": "5.2.2" + } +} diff --git a/examples/taco/nextjs/src/app/layout.tsx b/examples/taco/nextjs/src/app/layout.tsx new file mode 100644 index 000000000..215ca6cb7 --- /dev/null +++ b/examples/taco/nextjs/src/app/layout.tsx @@ -0,0 +1,21 @@ +import type { Metadata } from 'next'; +import { Inter } from 'next/font/google'; + +const inter = Inter({ subsets: ['latin'] }); + +export const metadata: Metadata = { + title: 'Create Next App', + description: 'Generated by create next app', +}; + +export default function RootLayout({ + children, +}: { + children: React.ReactNode; +}) { + return ( + + {children} + + ); +} diff --git a/examples/taco/nextjs/src/app/page.tsx b/examples/taco/nextjs/src/app/page.tsx new file mode 100644 index 000000000..c9bcea875 --- /dev/null +++ b/examples/taco/nextjs/src/app/page.tsx @@ -0,0 +1,107 @@ +'use client'; +import { + conditions, + decrypt, + encrypt, fromBytes, + getPorterUri, + initialize, +} from '@nucypher/taco'; +import {ethers} from 'ethers'; +import {useEffect, useState} from 'react'; + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +declare const window: any; + +const message = 'this is a secret'; + +function App() { + const [isInit, setIsInit] = useState(false); + const [provider, setProvider] = useState< + ethers.providers.Web3Provider | undefined + >(); + const [decryptedMessage, setDecryptedMessage] = useState(""); + + const initNucypher = async () => { + await initialize(); + setIsInit(true); + }; + + const loadWeb3Provider = async () => { + if (!window.ethereum) { + console.error('You need to connect to the MetaMask extension'); + } + const provider = new ethers.providers.Web3Provider(window.ethereum, 'any'); + + const {chainId} = await provider.getNetwork(); + if (chainId !== 80001) { + // Switch to Matic Mumbai testnet + await window.ethereum.request({ + method: 'wallet_switchEthereumChain', + params: [{chainId: '0x13881'}], + }); + } + + await provider.send('eth_requestAccounts', []); + setProvider(provider); + }; + + useEffect(() => { + initNucypher(); + loadWeb3Provider(); + }, []); + + if (!isInit || !provider) { + return
Loading...
; + } + + const runExample = async () => { + if (!window.ethereum) { + console.error('You need to connect to the MetaMask extension'); + } + + await initialize(); + + const provider = new ethers.providers.Web3Provider(window.ethereum!, 'any'); + await provider.send('eth_requestAccounts', []); + const signer = provider.getSigner(); + + const {chainId} = await provider.getNetwork(); + if (chainId !== 80001) { + // Switch to Matic Mumbai testnet + await window.ethereum!.request!({ + method: 'wallet_switchEthereumChain', + params: [{chainId: '0x13881'}], + }); + } + + console.log('Encrypting message...'); + const hasPositiveBalance = new conditions.RpcCondition({ + conditionType: 'rpc', + chain: 5, + method: 'eth_getBalance', + parameters: [':userAddress', 'latest'], + returnValueTest: { + comparator: '>', + value: 0, + }, + }); + const ritualId = 2; // Replace with your own ritual ID + const messageKit = await encrypt(provider, message, hasPositiveBalance, ritualId, signer); + + console.log('Decrypting message...'); + const porterUri = getPorterUri('lynx'); // Test network + const decryptedMessage = await decrypt(provider, messageKit, signer, porterUri); + + setDecryptedMessage(fromBytes(decryptedMessage)); + }; + + return ( +
+

Secret message: {message}

+ {(decryptedMessage &&

Decrypted message: {decryptedMessage}

)} + +
+ ); +} + +export default App; diff --git a/examples/nodejs/tsconfig.json b/examples/taco/nextjs/tsconfig.build.json similarity index 62% rename from examples/nodejs/tsconfig.json rename to examples/taco/nextjs/tsconfig.build.json index 681ec7de2..22ff2bd0b 100644 --- a/examples/nodejs/tsconfig.json +++ b/examples/taco/nextjs/tsconfig.build.json @@ -1,5 +1,5 @@ { - "extends": "../../tsconfig.json", + "extends": "./tsconfig.json", "include": ["src"], "compilerOptions": { "outDir": "dist", @@ -8,7 +8,7 @@ }, "references": [ { - "path": "../../packages/shared/tsconfig.cjs.json" + "path": "../../../packages/taco/tsconfig.es.json" } ] } diff --git a/examples/taco/nextjs/tsconfig.json b/examples/taco/nextjs/tsconfig.json new file mode 100644 index 000000000..e59724b28 --- /dev/null +++ b/examples/taco/nextjs/tsconfig.json @@ -0,0 +1,27 @@ +{ + "compilerOptions": { + "target": "es5", + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "bundler", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve", + "incremental": true, + "plugins": [ + { + "name": "next" + } + ], + "paths": { + "@/*": ["./src/*"] + } + }, + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], + "exclude": ["node_modules"] +} diff --git a/examples/taco/nodejs/.env.example b/examples/taco/nodejs/.env.example new file mode 100644 index 000000000..5c9041014 --- /dev/null +++ b/examples/taco/nodejs/.env.example @@ -0,0 +1,2 @@ +RPC_PROVIDER_URL= +PRIVATE_KEY= diff --git a/examples/taco/nodejs/README.md b/examples/taco/nodejs/README.md new file mode 100644 index 000000000..a1fd6843e --- /dev/null +++ b/examples/taco/nodejs/README.md @@ -0,0 +1,20 @@ +# `nodejs-taco` integration example + +Shows how to use `@nucypher/taco` in Node.js. + +## Setup + +Setup environment variables: + +```bash +cp .env.example .env +``` + +Update `.env` with your values. + +## Usage + +```bash +pnpm install +pnpm start +``` diff --git a/examples/taco/nodejs/package.json b/examples/taco/nodejs/package.json new file mode 100644 index 000000000..8c4ba4a73 --- /dev/null +++ b/examples/taco/nodejs/package.json @@ -0,0 +1,18 @@ +{ + "version": "0.1.0", + "private": true, + "license": "GPL-3.0-only", + "author": "Piotr Rosłaniec ", + "scripts": { + "check": "pnpm type-check", + "start": "ts-node src/index.ts", + "type-check": "tsc" + }, + "dependencies": { + "@nucypher/taco": "workspace:*", + "dotenv": "^16.3.1" + }, + "peerDependencies": { + "ethers": "^5.7.2" + } +} diff --git a/examples/taco/nodejs/src/index.ts b/examples/taco/nodejs/src/index.ts new file mode 100644 index 000000000..ad00311b5 --- /dev/null +++ b/examples/taco/nodejs/src/index.ts @@ -0,0 +1,71 @@ +import { + conditions, + decrypt, + encrypt, + fromBytes, + getPorterUri, + initialize, + toBytes, +} from '@nucypher/taco'; +import * as dotenv from 'dotenv'; +import { ethers } from 'ethers'; + +dotenv.config(); + +const rpcProviderUrl = process.env.RPC_PROVIDER_URL; +if (!rpcProviderUrl) { + throw new Error('RPC_PROVIDER_URL is not set.'); +} + +const privateKey = process.env.PRIVATE_KEY; +if (!privateKey) { + throw new Error('PRIVATE_KEY is not set.'); +} + +const runExample = async () => { + await initialize(); + + const signer = new ethers.Wallet(privateKey); + const provider = new ethers.providers.JsonRpcProvider(rpcProviderUrl); + + console.log("Signer's address:", await signer.getAddress()); + + console.log('Encrypting message...'); + const message = toBytes('this is a secret'); + const hasPositiveBalance = new conditions.RpcCondition({ + conditionType: 'rpc', + chain: 5, + method: 'eth_getBalance', + parameters: [':userAddress', 'latest'], + returnValueTest: { + comparator: '>', + value: 0, + }, + }); + console.assert( + hasPositiveBalance.requiresSigner(), + 'Condition requires signer', + ); + const ritualId = 2; // Replace with your own ritual ID + const messageKit = await encrypt( + provider, + message, + hasPositiveBalance, + ritualId, + signer, + ); + + console.log('Decrypting message...'); + const porterUri = getPorterUri('lynx'); // Test network + const decryptedBytes = await decrypt(provider, messageKit, signer, porterUri); + const decryptedMessage = fromBytes(decryptedBytes); + console.log('Decrypted message:', decryptedMessage); +}; + +runExample() + .then(() => { + console.log('Example finished'); + }) + .catch((err) => { + console.error('Example failed:', err); + }); diff --git a/examples/taco/nodejs/tsconfig.json b/examples/taco/nodejs/tsconfig.json new file mode 100644 index 000000000..aeb9f0525 --- /dev/null +++ b/examples/taco/nodejs/tsconfig.json @@ -0,0 +1,14 @@ +{ + "extends": "../../../tsconfig.json", + "include": ["src"], + "compilerOptions": { + "outDir": "dist", + "rootDir": "src", + "noEmit": true + }, + "references": [ + { + "path": "../../../packages/taco/tsconfig.cjs.json" + } + ] +} diff --git a/examples/taco/react/README.md b/examples/taco/react/README.md new file mode 100644 index 000000000..5c1ef1c92 --- /dev/null +++ b/examples/taco/react/README.md @@ -0,0 +1,16 @@ +# `react-taco` integration example + +Shows how to integrate `@nucypher/taco` into a React application. + +In order to load WASM dependencies of `@nucypher/taco`, we override the `react-scripts` configuration with `craco`. For +more details, see the `craco.config.js` file. + +## Usage + +```bash +pnpm install +pnpm start +``` + +Next, go to [http://127.0.0.1:3000/](http://127.0.0.1:8080/) in your browser and +inspect the UI and the JS console. diff --git a/examples/taco/react/package.json b/examples/taco/react/package.json new file mode 100644 index 000000000..7e4a8fde9 --- /dev/null +++ b/examples/taco/react/package.json @@ -0,0 +1,39 @@ +{ + "name": "react", + "version": "0.1.0", + "private": true, + "scripts": { + "build": "react-scripts build", + "check": "pnpm type-check && pnpm build", + "eject": "react-scripts eject", + "start": "react-scripts start", + "test": "react-scripts test", + "type-check": "tsc -p tsconfig.build.json" + }, + "browserslist": { + "production": [ + ">0.2%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + }, + "dependencies": { + "@nucypher/taco": "workspace:*", + "react": "^18.2.0", + "react-dom": "^18.2.0" + }, + "devDependencies": { + "@types/node": "^16.18.50", + "@types/react": "^18.2.21", + "@types/react-dom": "^18.2.7", + "react-scripts": "^5.0.1" + }, + "peerDependencies": { + "ethers": "^5.7.2" + } +} diff --git a/examples/taco/react/public/favicon.ico b/examples/taco/react/public/favicon.ico new file mode 100644 index 000000000..a11777cc4 Binary files /dev/null and b/examples/taco/react/public/favicon.ico differ diff --git a/examples/taco/react/public/index.html b/examples/taco/react/public/index.html new file mode 100644 index 000000000..e65acb3de --- /dev/null +++ b/examples/taco/react/public/index.html @@ -0,0 +1,43 @@ + + + + + + + + + + + + + React App + + + +
+ + + diff --git a/examples/taco/react/public/logo192.png b/examples/taco/react/public/logo192.png new file mode 100644 index 000000000..fc44b0a37 Binary files /dev/null and b/examples/taco/react/public/logo192.png differ diff --git a/examples/taco/react/public/logo512.png b/examples/taco/react/public/logo512.png new file mode 100644 index 000000000..a4e47a654 Binary files /dev/null and b/examples/taco/react/public/logo512.png differ diff --git a/examples/taco/react/public/manifest.json b/examples/taco/react/public/manifest.json new file mode 100644 index 000000000..080d6c77a --- /dev/null +++ b/examples/taco/react/public/manifest.json @@ -0,0 +1,25 @@ +{ + "short_name": "React App", + "name": "Create React App Sample", + "icons": [ + { + "src": "favicon.ico", + "sizes": "64x64 32x32 24x24 16x16", + "type": "image/x-icon" + }, + { + "src": "logo192.png", + "type": "image/png", + "sizes": "192x192" + }, + { + "src": "logo512.png", + "type": "image/png", + "sizes": "512x512" + } + ], + "start_url": ".", + "display": "standalone", + "theme_color": "#000000", + "background_color": "#ffffff" +} diff --git a/examples/taco/react/public/robots.txt b/examples/taco/react/public/robots.txt new file mode 100644 index 000000000..e9e57dc4d --- /dev/null +++ b/examples/taco/react/public/robots.txt @@ -0,0 +1,3 @@ +# https://www.robotstxt.org/robotstxt.html +User-agent: * +Disallow: diff --git a/examples/taco/react/src/App.tsx b/examples/taco/react/src/App.tsx new file mode 100644 index 000000000..4073fb53e --- /dev/null +++ b/examples/taco/react/src/App.tsx @@ -0,0 +1,107 @@ +import { + conditions, + decrypt, + encrypt, + fromBytes, + getPorterUri, + initialize, +} from '@nucypher/taco'; +import {ethers} from 'ethers'; +import {useEffect, useState} from 'react'; + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +declare const window: any; + +const message = 'this is a secret'; + +function App() { + const [isInit, setIsInit] = useState(false); + const [provider, setProvider] = useState< + ethers.providers.Web3Provider | undefined + >(); + const [decryptedMessage, setDecryptedMessage] = useState(""); + + const initNucypher = async () => { + await initialize(); + setIsInit(true); + }; + + const loadWeb3Provider = async () => { + if (!window.ethereum) { + console.error('You need to connect to the MetaMask extension'); + } + const provider = new ethers.providers.Web3Provider(window.ethereum, 'any'); + + const {chainId} = await provider.getNetwork(); + if (chainId !== 80001) { + // Switch to Matic Mumbai testnet + await window.ethereum.request({ + method: 'wallet_switchEthereumChain', + params: [{chainId: '0x13881'}], + }); + } + + await provider.send('eth_requestAccounts', []); + setProvider(provider); + }; + + useEffect(() => { + initNucypher(); + loadWeb3Provider(); + }, []); + + if (!isInit || !provider) { + return
Loading...
; + } + + const runExample = async () => { + if (!window.ethereum) { + console.error('You need to connect to the MetaMask extension'); + } + + await initialize(); + + const provider = new ethers.providers.Web3Provider(window.ethereum!, 'any'); + await provider.send('eth_requestAccounts', []); + const signer = provider.getSigner(); + + const {chainId} = await provider.getNetwork(); + if (chainId !== 80001) { + // Switch to Matic Mumbai testnet + await window.ethereum!.request!({ + method: 'wallet_switchEthereumChain', + params: [{chainId: '0x13881'}], + }); + } + + console.log('Encrypting message...'); + const hasPositiveBalance = new conditions.RpcCondition({ + conditionType: 'rpc', + chain: 5, + method: 'eth_getBalance', + parameters: [':userAddress', 'latest'], + returnValueTest: { + comparator: '>', + value: 0, + }, + }); + const ritualId = 2; // Replace with your own ritual ID + const messageKit = await encrypt(provider, message, hasPositiveBalance, ritualId, signer); + + console.log('Decrypting message...'); + const porterUri = getPorterUri('lynx'); // Test network + const decryptedMessage = await decrypt(provider, messageKit, signer, porterUri); + + setDecryptedMessage(fromBytes(decryptedMessage)); + }; + + return ( +
+

Secret message: {message}

+ {(decryptedMessage &&

Decrypted message: {decryptedMessage}

)} + +
+ ); +} + +export default App; diff --git a/examples/taco/react/src/index.tsx b/examples/taco/react/src/index.tsx new file mode 100644 index 000000000..cd808f32c --- /dev/null +++ b/examples/taco/react/src/index.tsx @@ -0,0 +1,13 @@ +import React from 'react'; +import ReactDOM from 'react-dom/client'; + +import App from './App'; + +const root = ReactDOM.createRoot( + document.getElementById('root') as HTMLElement, +); +root.render( + + + , +); diff --git a/examples/taco/react/src/react-app-env.d.ts b/examples/taco/react/src/react-app-env.d.ts new file mode 100644 index 000000000..8f8826530 --- /dev/null +++ b/examples/taco/react/src/react-app-env.d.ts @@ -0,0 +1,8 @@ +/// +import { ExternalProvider } from '@ethersproject/providers'; + +declare global { + interface Window { + ethereum?: ExternalProvider; + } +} diff --git a/packages/pre/tsconfig.build.json b/examples/taco/react/tsconfig.build.json similarity index 59% rename from packages/pre/tsconfig.build.json rename to examples/taco/react/tsconfig.build.json index dedc2a266..22ff2bd0b 100644 --- a/packages/pre/tsconfig.build.json +++ b/examples/taco/react/tsconfig.build.json @@ -3,11 +3,12 @@ "include": ["src"], "compilerOptions": { "outDir": "dist", - "rootDir": "src" + "rootDir": "src", + "noEmit": true }, "references": [ { - "path": "../shared/tsconfig.es.json" + "path": "../../../packages/taco/tsconfig.es.json" } ] } diff --git a/examples/taco/react/tsconfig.json b/examples/taco/react/tsconfig.json new file mode 100644 index 000000000..9d379a3c4 --- /dev/null +++ b/examples/taco/react/tsconfig.json @@ -0,0 +1,20 @@ +{ + "compilerOptions": { + "target": "es5", + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + "noFallthroughCasesInSwitch": true, + "module": "esnext", + "moduleResolution": "node", + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx" + }, + "include": ["src"] +} diff --git a/examples/taco/webpack-5/README.md b/examples/taco/webpack-5/README.md new file mode 100644 index 000000000..cfcaa7be2 --- /dev/null +++ b/examples/taco/webpack-5/README.md @@ -0,0 +1,13 @@ +# `webpack-5` integration example + +Shows how to integrate `@nucypher/taco` with Webpack 5. + +## Usage + +```bash +pnpm install +pnpm start +``` + +Go to [localhost:8080](http://localhost:8080/) in your browser and look in the +JS console. diff --git a/examples/taco/webpack-5/package.json b/examples/taco/webpack-5/package.json new file mode 100644 index 000000000..7fd563717 --- /dev/null +++ b/examples/taco/webpack-5/package.json @@ -0,0 +1,26 @@ +{ + "version": "0.1.0", + "private": true, + "license": "GPL-3.0-only", + "author": "Piotr Rosłaniec ", + "main": "index.js", + "scripts": { + "build": "webpack --mode production --progress", + "check": "pnpm type-check && pnpm build", + "start": "webpack serve --mode development", + "type-check": "tsc" + }, + "dependencies": { + "@nucypher/taco": "workspace:*" + }, + "devDependencies": { + "copy-webpack-plugin": "^10.2.4", + "esbuild-loader": "^2.11.0", + "webpack": "^5.4.0", + "webpack-cli": "^4.9.2", + "webpack-dev-server": "^4.7.4" + }, + "peerDependencies": { + "ethers": "^5.7.2" + } +} diff --git a/examples/taco/webpack-5/src/index.html b/examples/taco/webpack-5/src/index.html new file mode 100644 index 000000000..6e9349b3e --- /dev/null +++ b/examples/taco/webpack-5/src/index.html @@ -0,0 +1,13 @@ + + + + + nucypher-ts example + + + + +

Check console for results

+ + diff --git a/examples/taco/webpack-5/src/index.ts b/examples/taco/webpack-5/src/index.ts new file mode 100644 index 000000000..370eada34 --- /dev/null +++ b/examples/taco/webpack-5/src/index.ts @@ -0,0 +1,62 @@ +import { + conditions, + decrypt, + encrypt, + fromBytes, + getPorterUri, + initialize, + toBytes, +} from '@nucypher/taco'; +import { ethers } from 'ethers'; + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +declare const window: any; + +const runExample = async () => { + await initialize(); + + const provider = new ethers.providers.Web3Provider(window.ethereum!, 'any'); + await provider.send('eth_requestAccounts', []); + const signer = provider.getSigner(); + + console.log("Signer's address:", await signer.getAddress()); + + console.log('Encrypting message...'); + const message = toBytes('this is a secret'); + const hasPositiveBalance = new conditions.RpcCondition({ + conditionType: 'rpc', + chain: 5, + method: 'eth_getBalance', + parameters: [':userAddress', 'latest'], + returnValueTest: { + comparator: '>', + value: 0, + }, + }); + console.assert( + hasPositiveBalance.requiresSigner(), + 'Condition requires signer', + ); + const ritualId = 2; // Replace with your own ritual ID + const messageKit = await encrypt( + provider, + message, + hasPositiveBalance, + ritualId, + signer, + ); + + console.log('Decrypting message...'); + const porterUri = getPorterUri('lynx'); // Test network + const decryptedBytes = await decrypt(provider, messageKit, signer, porterUri); + const decryptedMessage = fromBytes(decryptedBytes); + console.log('Decrypted message:', decryptedMessage); +}; + +runExample() + .then(() => { + console.log('Example finished'); + }) + .catch((err) => { + console.error('Example failed:', err); + }); diff --git a/examples/taco/webpack-5/tsconfig.json b/examples/taco/webpack-5/tsconfig.json new file mode 100644 index 000000000..f651a6051 --- /dev/null +++ b/examples/taco/webpack-5/tsconfig.json @@ -0,0 +1,14 @@ +{ + "extends": "../../../tsconfig.json", + "include": ["src"], + "compilerOptions": { + "esModuleInterop": true, + "skipLibCheck": true, + "noEmit": true + }, + "references": [ + { + "path": "../../../packages/taco/tsconfig.es.json" + } + ] +} diff --git a/examples/taco/webpack-5/webpack.config.js b/examples/taco/webpack-5/webpack.config.js new file mode 100644 index 000000000..90e745d26 --- /dev/null +++ b/examples/taco/webpack-5/webpack.config.js @@ -0,0 +1,43 @@ +const path = require('path'); +const HtmlWebpackPlugin = require('html-webpack-plugin'); + +module.exports = { + entry: './src/index.ts', + plugins: [ + new HtmlWebpackPlugin({ + template: './src/index.html', + }), + ].filter(Boolean), + module: { + rules: [ + { + test: /\.tsx?$/, + loader: 'esbuild-loader', + exclude: /node_modules/, + options: { + loader: 'tsx', + target: 'es2018', + }, + }, + { + test: /\.(png|svg|jpg|gif|woff|woff2|eot|ttf|otf|ico)$/, + use: ['file-loader'], + }, + ], + }, + resolve: { + extensions: ['.tsx', '.ts', '.js'], + }, + output: { + filename: '[name].[contenthash].js', + path: path.resolve(__dirname, 'build'), + }, + devServer: { + historyApiFallback: true, + host: '127.0.0.1', + liveReload: true, + headers: { + 'Access-Control-Allow-Origin': '*', + }, + }, +}; diff --git a/examples/webpack-5/README.md b/examples/webpack-5/README.md deleted file mode 100644 index 0691b025f..000000000 --- a/examples/webpack-5/README.md +++ /dev/null @@ -1,20 +0,0 @@ -# `webpack-5` integration example - -This example takes advantage of experimental async WASM loading in `webpack-5`. -See `webpack.config.js` for details: - -``` - experiments: { - asyncWebAssembly: true, - }, -``` - -## Usage - -```bash -pnpm install -pnpm start -``` - -Go to [localhost:8080](http://localhost:8080/) in your browser and look in the -JS console. diff --git a/examples/webpack-5/tsconfig.json b/examples/webpack-5/tsconfig.json deleted file mode 100644 index 7c4f81999..000000000 --- a/examples/webpack-5/tsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../../tsconfig.json", - "include": ["src"], - "compilerOptions": { - "esModuleInterop": true, - "skipLibCheck": true, - "noEmit": true - } -} diff --git a/package.json b/package.json index 18b318221..701b8f278 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,7 @@ "type-check": "pnpm --parallel --aggregate-output --reporter append-only type-check", "build": "tsc --build --verbose ./tsconfig.prod.json", "watch": "tsc --build --verbose --watch ./tsconfig.prod.json", - "test": "vitest run", + "test": "pnpm build && vitest run", "package:check": "pnpm run --parallel --aggregate-output --reporter append-only --filter './packages/**' package-check", "packages:lint": "pnpm packages:sort --check", "packages:sort": "sort-package-json \"package.json\" \"examples/*/package.json\" \"packages/*/package.json\"", @@ -24,6 +24,9 @@ "ci:lint": "run-p lint type-check package:check packages:lint exports:lint", "check-examples": "pnpm run --parallel --aggregate-output --reporter append-only --filter './examples/**' check" }, + "dependencies": { + "@nucypher/nucypher-core": "0.13.0-alpha.1" + }, "devDependencies": { "@skypack/package-check": "^0.2.2", "@types/node": "^20.6.0", diff --git a/packages/pre/package.json b/packages/pre/package.json index 54f68d394..54cef6ee0 100644 --- a/packages/pre/package.json +++ b/packages/pre/package.json @@ -14,18 +14,22 @@ "author": "Piotr Roslaniec ", "exports": { ".": { - "import": "./dist/index.js", - "require": "./dist/index.js" + "import": "./dist/es/index.js", + "require": "./dist/cjs/index.js" } }, - "main": "./dist/index.js", - "module": "./dist/index.js", - "types": "./dist/index.d.ts", + "main": "./dist/cjs/index.js", + "module": "./dist/es/index.js", + "types": "./dist/cjs/index.d.ts", "files": [ - "dist/**/*" + "dist" ], "scripts": { - "build": "tsc --build ./tsconfig.build.json --verbose", + "prebuild": "pnpm clean", + "build": "pnpm build:module && pnpm build:cjs", + "build:cjs": "tsc --build ./tsconfig.cjs.json --verbose", + "build:module": "tsc --build ./tsconfig.es.json --verbose", + "clean": "rm -rf dist", "exports:lint": "ts-unused-exports tsconfig.json --ignoreFiles src/index.ts", "lint": "eslint --ext .ts src test", "lint:fix": "pnpm lint --fix", @@ -34,7 +38,7 @@ "typedoc": "typedoc" }, "dependencies": { - "@nucypher/nucypher-core": "0.13.0-alpha.0", + "@nucypher/nucypher-core": "0.13.0-alpha.1", "@nucypher/shared": "workspace:*" }, "devDependencies": { @@ -44,7 +48,7 @@ "ethers": "^5.7.2" }, "engines": { - "node": ">=16", + "node": ">=18", "pnpm": ">=8.0.0" } } diff --git a/packages/shared/src/characters/alice.ts b/packages/pre/src/characters/alice.ts similarity index 97% rename from packages/shared/src/characters/alice.ts rename to packages/pre/src/characters/alice.ts index c93d3b262..2bc07d1cb 100644 --- a/packages/shared/src/characters/alice.ts +++ b/packages/pre/src/characters/alice.ts @@ -4,6 +4,7 @@ import { Signer, VerifiedKeyFrag, } from '@nucypher/nucypher-core'; +import { ChecksumAddress, PorterClient } from '@nucypher/shared'; import { ethers } from 'ethers'; import { Keyring } from '../keyring'; @@ -13,8 +14,6 @@ import { EnactedPolicy, PreEnactedPolicy, } from '../policy'; -import { PorterClient } from '../porter'; -import { ChecksumAddress } from '../types'; import { RemoteBob } from './bob'; diff --git a/packages/shared/src/characters/bob.ts b/packages/pre/src/characters/bob.ts similarity index 95% rename from packages/shared/src/characters/bob.ts rename to packages/pre/src/characters/bob.ts index 75509456f..6fac22ba7 100644 --- a/packages/shared/src/characters/bob.ts +++ b/packages/pre/src/characters/bob.ts @@ -5,12 +5,10 @@ import { SecretKey, Signer, } from '@nucypher/nucypher-core'; +import { PorterClient, zip } from '@nucypher/shared'; import { Keyring } from '../keyring'; -import { PolicyMessageKit } from '../kits/message'; -import { RetrievalResult } from '../kits/retrieval'; -import { PorterClient } from '../porter'; -import { zip } from '../utils'; +import { PolicyMessageKit, RetrievalResult } from '../kits'; export class RemoteBob { private constructor( diff --git a/packages/pre/src/characters/enrico.ts b/packages/pre/src/characters/enrico.ts new file mode 100644 index 000000000..a25e2d5e6 --- /dev/null +++ b/packages/pre/src/characters/enrico.ts @@ -0,0 +1,26 @@ +import { MessageKit, PublicKey, SecretKey } from '@nucypher/nucypher-core'; +import { toBytes } from '@nucypher/shared'; + +import { Keyring } from '../keyring'; + +export class Enrico { + public readonly encryptingKey: PublicKey; + private readonly keyring: Keyring; + + constructor(encryptingKey: PublicKey, verifyingKey?: SecretKey) { + this.encryptingKey = encryptingKey; + this.keyring = new Keyring(verifyingKey ?? SecretKey.random()); + } + + public get verifyingKey(): PublicKey { + return this.keyring.publicKey; + } + + public encryptMessage(plaintext: Uint8Array | string): MessageKit { + return new MessageKit( + this.encryptingKey, + plaintext instanceof Uint8Array ? plaintext : toBytes(plaintext), + null, + ); + } +} diff --git a/packages/shared/src/characters/index.ts b/packages/pre/src/characters/index.ts similarity index 52% rename from packages/shared/src/characters/index.ts rename to packages/pre/src/characters/index.ts index 4bb043a7f..add1486ba 100644 --- a/packages/shared/src/characters/index.ts +++ b/packages/pre/src/characters/index.ts @@ -1,5 +1,3 @@ export * from './alice'; export * from './bob'; -export * from './cbd-recipient'; export * from './enrico'; -export * from './pre-recipient'; diff --git a/packages/shared/src/cohort.ts b/packages/pre/src/cohort.ts similarity index 91% rename from packages/shared/src/cohort.ts rename to packages/pre/src/cohort.ts index 6807841a5..43e820f8b 100644 --- a/packages/shared/src/cohort.ts +++ b/packages/pre/src/cohort.ts @@ -1,6 +1,4 @@ -import { PorterClient } from './porter'; -import { ChecksumAddress } from './types'; -import { objectEquals } from './utils'; +import { ChecksumAddress, objectEquals, PorterClient } from '@nucypher/shared'; export type CohortJSON = { ursulaAddresses: ChecksumAddress[]; diff --git a/packages/pre/src/index.ts b/packages/pre/src/index.ts index 9646913c5..4f676b1ca 100644 --- a/packages/pre/src/index.ts +++ b/packages/pre/src/index.ts @@ -1,24 +1,9 @@ -// TODO: Create a pre module and export it here -// Similarly to how taco works -// export {pre} from './pre'; -// What goes into the pre module? Should we re-export the basic building blocks and/or remake the helper methods? export { - Alice, - BlockchainPolicyParameters, - Bob, - Cohort, - DeployedPreStrategy, - EnactedPolicy, - Enrico, - Keyring, - PolicyMessageKit, PorterClient, - PreDecrypter, - PreEnactedPolicy, - PreStrategy, - RemoteBob, - conditions, + fromHexString, getPorterUri, + toBytes, + toHexString, } from '@nucypher/shared'; export { @@ -30,4 +15,9 @@ export { SecretKey, Signer, TreasureMap, + initialize, } from '@nucypher/nucypher-core'; + +export { Alice, Bob, Enrico } from './characters'; +export { Cohort } from './cohort'; +export { EnactedPolicy } from './policy'; diff --git a/packages/shared/src/keyring.ts b/packages/pre/src/keyring.ts similarity index 97% rename from packages/shared/src/keyring.ts rename to packages/pre/src/keyring.ts index 813247501..53b02b446 100644 --- a/packages/shared/src/keyring.ts +++ b/packages/pre/src/keyring.ts @@ -7,9 +7,9 @@ import { Signer, VerifiedKeyFrag, } from '@nucypher/nucypher-core'; +import { toBytes } from '@nucypher/shared'; import { PolicyMessageKit } from './kits'; -import { toBytes } from './utils'; export class Keyring { constructor(public readonly secretKey: SecretKey) {} diff --git a/packages/shared/src/kits/index.ts b/packages/pre/src/kits/index.ts similarity index 100% rename from packages/shared/src/kits/index.ts rename to packages/pre/src/kits/index.ts diff --git a/packages/shared/src/kits/message.ts b/packages/pre/src/kits/message.ts similarity index 97% rename from packages/shared/src/kits/message.ts rename to packages/pre/src/kits/message.ts index 8ae9ab7b6..bcb9bd36a 100644 --- a/packages/shared/src/kits/message.ts +++ b/packages/pre/src/kits/message.ts @@ -5,8 +5,7 @@ import { RetrievalKit, SecretKey, } from '@nucypher/nucypher-core'; - -import { ChecksumAddress } from '../types'; +import { ChecksumAddress } from '@nucypher/shared'; import { RetrievalResult } from './retrieval'; diff --git a/packages/shared/src/kits/retrieval.ts b/packages/pre/src/kits/retrieval.ts similarity index 92% rename from packages/shared/src/kits/retrieval.ts rename to packages/pre/src/kits/retrieval.ts index 4fb1216de..ad5f333e2 100644 --- a/packages/shared/src/kits/retrieval.ts +++ b/packages/pre/src/kits/retrieval.ts @@ -1,6 +1,5 @@ import { VerifiedCapsuleFrag } from '@nucypher/nucypher-core'; - -import { ChecksumAddress } from '../types'; +import { ChecksumAddress } from '@nucypher/shared'; export class RetrievalResult { constructor( diff --git a/packages/shared/src/policy.ts b/packages/pre/src/policy.ts similarity index 92% rename from packages/shared/src/policy.ts rename to packages/pre/src/policy.ts index 9b4595ef3..9ce220154 100644 --- a/packages/shared/src/policy.ts +++ b/packages/pre/src/policy.ts @@ -6,14 +6,17 @@ import { TreasureMap, VerifiedKeyFrag, } from '@nucypher/nucypher-core'; +import { + PreSubscriptionManagerAgent, + toBytes, + toCanonicalAddress, + toEpoch, + Ursula, + zip, +} from '@nucypher/shared'; import { ethers } from 'ethers'; -import { Alice } from './characters/alice'; -import { RemoteBob } from './characters/bob'; -import { PreSubscriptionManagerAgent } from './contracts/agents/subscription-manager'; -import { Ursula } from './porter'; -import { toBytes, toEpoch, zip } from './utils'; -import { toCanonicalAddress } from './web3'; +import { Alice, RemoteBob } from './characters'; export type EnactedPolicy = { readonly id: HRAC; @@ -121,7 +124,7 @@ export class BlockchainPolicy { public async generatePreEnactedPolicy( ursulas: readonly Ursula[], ): Promise { - if (ursulas.length != this.verifiedKFrags.length) { + if (ursulas.length !== this.verifiedKFrags.length) { throw new Error( `Number of ursulas must match number of verified kFrags: ${this.verifiedKFrags.length}`, ); diff --git a/packages/shared/test/acceptance/alice-grants.test.ts b/packages/pre/test/acceptance/alice-grants.test.ts similarity index 87% rename from packages/shared/test/acceptance/alice-grants.test.ts rename to packages/pre/test/acceptance/alice-grants.test.ts index 324d6fc03..69230c2f8 100644 --- a/packages/shared/test/acceptance/alice-grants.test.ts +++ b/packages/pre/test/acceptance/alice-grants.test.ts @@ -5,35 +5,32 @@ import { PublicKey, VerifiedKeyFrag, } from '@nucypher/nucypher-core'; +import { ChecksumAddress, initialize, Ursula } from '@nucypher/shared'; import { bytesEqual, - fakeAlice, - fakeBob, fakePorterUri, fakeProvider, - fakeRemoteBob, fakeSigner, + fakeUrsulas, fromBytes, + mockGetUrsulas, + mockRetrieveCFragsRequest, +} from '@nucypher/test-utils'; +import { beforeEach, describe, expect, it } from 'vitest'; + +import { EnactedPolicy, Enrico, toBytes } from '../../src'; +import { + fakeAlice, + fakeBob, + fakeRemoteBob, mockEncryptTreasureMap, mockGenerateKFrags, - mockGetUrsulas, mockMakeTreasureMap, mockPublishToBlockchain, - mockRetrieveCFragsRequest, reencryptKFrags, -} from '@nucypher/test-utils'; -import { beforeAll, expect, test } from 'vitest'; +} from '../utils'; -import { - ChecksumAddress, - EnactedPolicy, - Enrico, - initialize, - toBytes, - Ursula, -} from '../../src'; - -test('story: alice shares message with bob through policy', () => { +describe('story: alice shares message with bob through policy', () => { const message = 'secret-message-from-alice'; const threshold = 2; const shares = 3; @@ -52,12 +49,12 @@ test('story: alice shares message with bob through policy', () => { let aliceVerifyingKey: PublicKey; let policyEncryptingKey: PublicKey; - beforeAll(async () => { + beforeEach(async () => { await initialize(); }); - test('alice grants a new policy to bob', async () => { - const getUrsulasSpy = mockGetUrsulas(); + it('alice grants a new policy to bob', async () => { + const getUrsulasSpy = mockGetUrsulas(fakeUrsulas().slice(0, shares)); const generateKFragsSpy = mockGenerateKFrags(); const publishToBlockchainSpy = mockPublishToBlockchain(); const makeTreasureMapSpy = mockMakeTreasureMap(); @@ -105,14 +102,13 @@ test('story: alice shares message with bob through policy', () => { verifiedKFrags = makeTreasureMapSpy.mock.calls[0][1] as VerifiedKeyFrag[]; }); - test('enrico encrypts the message', () => { + it('enrico encrypts the message', () => { const enrico = new Enrico(policyEncryptingKey); - encryptedMessage = enrico.encryptMessagePre(toBytes(message)); + encryptedMessage = enrico.encryptMessage(toBytes(message)); }); - test('bob retrieves and decrypts the message', async () => { + it('bob retrieves and decrypts the message', async () => { const bob = fakeBob(); - const getUrsulasSpy = mockGetUrsulas(); const retrieveCFragsSpy = mockRetrieveCFragsRequest( ursulaAddresses, verifiedKFrags, @@ -128,7 +124,6 @@ test('story: alice shares message with bob through policy', () => { ); const bobPlaintext = fromBytes(retrievedMessage[0]); - expect(getUrsulasSpy).toHaveBeenCalled(); expect(retrieveCFragsSpy).toHaveBeenCalled(); expect(bobPlaintext).toEqual(message); diff --git a/packages/shared/test/acceptance/delay-enact.test.ts b/packages/pre/test/acceptance/delay-enact.test.ts similarity index 82% rename from packages/shared/test/acceptance/delay-enact.test.ts rename to packages/pre/test/acceptance/delay-enact.test.ts index 7c2ef6428..16076eb06 100644 --- a/packages/shared/test/acceptance/delay-enact.test.ts +++ b/packages/pre/test/acceptance/delay-enact.test.ts @@ -1,34 +1,37 @@ import { bytesEqual, - fakeAlice, fakePorterUri, fakeProvider, - fakeRemoteBob, fakeSigner, - mockEncryptTreasureMap, - mockGenerateKFrags, + fakeUrsulas, mockGetUrsulas, - mockPublishToBlockchain, } from '@nucypher/test-utils'; -import { beforeAll, expect, test } from 'vitest'; +import { beforeAll, describe, expect, it } from 'vitest'; import { initialize } from '../../src'; +import { + fakeAlice, + fakeRemoteBob, + mockEncryptTreasureMap, + mockGenerateKFrags, + mockPublishToBlockchain, +} from '../utils'; -test('story: alice creates a policy but someone else enacts it', () => { +describe('story: alice creates a policy but someone else enacts it', () => { const threshold = 2; const shares = 3; const startDate = new Date(); const endDate = new Date(Date.now() + 60 * 1000); // 60s later const label = 'fake-data-label'; - test('verifies capsule frags', async () => { + describe('verifies capsule frags', async () => { beforeAll(async () => { await initialize(); }); - test('alice generates a new policy', async () => { + it('alice generates a new policy', async () => { const provider = fakeProvider(); - const getUrsulasSpy = mockGetUrsulas(); + const getUrsulasSpy = mockGetUrsulas(fakeUrsulas(shares)); const generateKFragsSpy = mockGenerateKFrags(); const publishToBlockchainSpy = mockPublishToBlockchain(); const encryptTreasureMapSpy = mockEncryptTreasureMap(); diff --git a/packages/shared/test/unit/cohort.test.ts b/packages/pre/test/cohort.test.ts similarity index 64% rename from packages/shared/test/unit/cohort.test.ts rename to packages/pre/test/cohort.test.ts index 31372a7a3..1baf6189c 100644 --- a/packages/shared/test/unit/cohort.test.ts +++ b/packages/pre/test/cohort.test.ts @@ -1,21 +1,24 @@ -import { fakeUrsulas, makeCohort } from '@nucypher/test-utils'; -import { beforeAll, expect, test } from 'vitest'; +import { initialize } from '@nucypher/shared'; +import { fakeUrsulas } from '@nucypher/test-utils'; +import { beforeAll, describe, expect, it } from 'vitest'; -import { Cohort, initialize } from '../../src'; +import { Cohort } from '../src'; -test('Cohort', () => { +import { makeCohort } from './utils'; + +describe('Cohort', () => { beforeAll(async () => { await initialize(); }); - test('creates a Cohort', async () => { + it('creates a Cohort', async () => { const ursulas = fakeUrsulas(); const cohort = await makeCohort(ursulas); const expectedUrsulas = ursulas.map((u) => u.checksumAddress); expect(cohort.ursulaAddresses).toEqual(expectedUrsulas); }); - test('serializes to a plain object', async () => { + it('serializes to a plain object', async () => { const ursulas = fakeUrsulas(); const cohort = await makeCohort(ursulas); const asObj = cohort.toObj(); @@ -23,7 +26,7 @@ test('Cohort', () => { expect(fromObj).toEqual(cohort); }); - test('serializes to JSON', async () => { + it('serializes to JSON', async () => { const ursulas = fakeUrsulas(); const cohort = await makeCohort(ursulas); const asJson = cohort.toJSON(); diff --git a/packages/pre/test/enrico.test.ts b/packages/pre/test/enrico.test.ts new file mode 100644 index 000000000..7b3c0739e --- /dev/null +++ b/packages/pre/test/enrico.test.ts @@ -0,0 +1,90 @@ +// Disabling because we want to access Alice.keyring which is a private property +/* eslint-disable @typescript-eslint/no-explicit-any */ +import { bytesEqual, fromBytes } from '@nucypher/test-utils'; +import { beforeAll, describe, expect, it } from 'vitest'; + +import { Enrico, initialize, toBytes } from '../src'; +import { PolicyMessageKit, RetrievalResult } from '../src/kits'; + +import { fakeAlice, fakeBob, reencryptKFrags } from './utils'; + +describe('enrico', () => { + beforeAll(async () => { + await initialize(); + }); + + it('alice decrypts message encrypted by enrico', async () => { + const label = 'fake-label'; + const message = 'fake-message'; + const alice = fakeAlice(); + + const policyKey = alice.getPolicyEncryptingKeyFromLabel(label); + const enrico = new Enrico(policyKey); + const encrypted = enrico.encryptMessage(toBytes(message)); + + const aliceKeyring = (alice as any).keyring; + const aliceSk = await aliceKeyring.getSecretKeyFromLabel(label); + const alicePlaintext = encrypted.decrypt(aliceSk); + expect(alicePlaintext).toEqual(alicePlaintext); + }); + + it('bob decrypts reencrypted message', async () => { + const label = 'fake-label'; + const alice = fakeAlice(); + const bob = fakeBob(); + + const policyEncryptingKey = alice.getPolicyEncryptingKeyFromLabel(label); + const enrico = new Enrico(policyEncryptingKey); + + const plaintext = 'Plaintext message'; + const plaintextBytes = toBytes(plaintext); + const encrypted = enrico.encryptMessage(plaintextBytes); + + // Alice can decrypt capsule she created + const aliceSk = await (alice as any).keyring.getSecretKeyFromLabel(label); + const plaintextAlice = encrypted.decrypt(aliceSk); + expect(fromBytes(plaintextAlice).endsWith(plaintext)).toBeTruthy(); + + const threshold = 2; + const shares = 3; + const { verifiedKFrags, delegatingKey } = alice.generateKFrags( + bob, + label, + threshold, + shares, + ); + expect(delegatingKey.toCompressedBytes()).toEqual( + policyEncryptingKey.toCompressedBytes(), + ); + + // Bob can decrypt re-encrypted ciphertext + const { verifiedCFrags } = reencryptKFrags( + verifiedKFrags, + encrypted.capsule, + ); + const bobSk = (bob as any).keyring.secretKey; + + const plaintextBob = encrypted.decryptReencrypted( + bobSk, + policyEncryptingKey, + verifiedCFrags, + ); + expect(fromBytes(plaintextBob).endsWith(plaintext)).toBeTruthy(); + + // Bob can decrypt ciphertext and verify origin of the message + const cFragsWithUrsulas = verifiedCFrags.map((cFrag, index) => [ + `0x${index}`, + cFrag, + ]); + const result = new RetrievalResult(Object.fromEntries(cFragsWithUrsulas)); + const pk = PolicyMessageKit.fromMessageKit( + encrypted, + policyEncryptingKey, + threshold, + ).withResult(result); + expect(pk.isDecryptableByReceiver()).toBeTruthy(); + + const decrypted = bob.decrypt(pk); + expect(bytesEqual(decrypted, plaintextBytes)).toBeTruthy(); + }); +}); diff --git a/packages/pre/test/message-kit.test.ts b/packages/pre/test/message-kit.test.ts new file mode 100644 index 000000000..93affd342 --- /dev/null +++ b/packages/pre/test/message-kit.test.ts @@ -0,0 +1,19 @@ +import { beforeAll, describe, expect, it } from 'vitest'; + +import { initialize, MessageKit, toBytes } from '../src'; + +import { fakeBob } from './utils'; + +describe('message kit', () => { + beforeAll(async () => { + await initialize(); + }); + + it('bob decrypts', () => { + const bob = fakeBob(); + const plaintext = toBytes('fake-message'); + const messageKit = new MessageKit(bob.decryptingKey, plaintext, null); + const decrypted = bob['keyring'].decrypt(messageKit); + expect(decrypted).toBeTruthy(); + }); +}); diff --git a/packages/pre/test/pre.test.ts b/packages/pre/test/pre.test.ts index 9fd4423ca..ce6ce5533 100644 --- a/packages/pre/test/pre.test.ts +++ b/packages/pre/test/pre.test.ts @@ -1,5 +1,113 @@ -import { expect, test } from 'vitest'; +import { CapsuleFrag, initialize, reencrypt } from '@nucypher/nucypher-core'; +import { zip } from '@nucypher/shared'; +import { fakeUrsulas } from '@nucypher/test-utils'; +import { beforeAll, describe, expect, it } from 'vitest'; -test('pre', () => { - expect('pre').toBe('pre'); +import { Alice, Bob, Enrico, MessageKit, toBytes } from '../src'; +import { PolicyMessageKit, RetrievalResult } from '../src/kits'; + +import { fakeAlice, fakeBob, reencryptKFrags } from './utils'; + +describe('proxy reencryption', () => { + let alice: Alice; + let bob: Bob; + const plaintext = toBytes('plaintext-message'); + const threshold = 2; + const shares = 3; + const label = 'fake-data-label'; + + beforeAll(async () => { + await initialize(); + bob = fakeBob(); + alice = fakeAlice(); + }); + + it('verifies capsule frags', async () => { + const { capsule } = new MessageKit(bob.decryptingKey, plaintext, null); + const { delegatingKey, verifiedKFrags } = alice.generateKFrags( + bob, + label, + threshold, + shares, + ); + + const { verifiedCFrags } = reencryptKFrags(verifiedKFrags, capsule); + const cFrags = verifiedCFrags.map((verifiedCFrag) => + CapsuleFrag.fromBytes(verifiedCFrag.toBytes()), + ); + const areVerified = cFrags.every((cFrag) => + cFrag.verify( + capsule, + alice.verifyingKey, + delegatingKey, + bob.decryptingKey, + ), + ); + expect(areVerified).toBeTruthy(); + }); + + it('encrypts and decrypts reencrypted message', async () => { + const { verifiedKFrags } = alice.generateKFrags( + bob, + label, + threshold, + shares, + ); + + const policyEncryptingKey = alice.getPolicyEncryptingKeyFromLabel(label); + const enrico = new Enrico(policyEncryptingKey); + const encryptedMessage = enrico.encryptMessage(plaintext); + + const ursulaAddresses = fakeUrsulas(3).map( + (ursula) => ursula.checksumAddress, + ); + const reencrypted = verifiedKFrags.map((kFrag) => + reencrypt(encryptedMessage.capsule, kFrag), + ); + const results = new RetrievalResult( + Object.fromEntries(zip(ursulaAddresses, reencrypted)), + ); + const policyMessageKit = PolicyMessageKit.fromMessageKit( + encryptedMessage, + policyEncryptingKey, + threshold, + ).withResult(results); + expect(policyMessageKit.isDecryptableByReceiver()).toBeTruthy(); + + const bobPlaintext = bob.decrypt(policyMessageKit); + expect(bobPlaintext).toEqual(plaintext); + }); + + it('encrypts and decrypts reencrypted message with conditions', async () => { + const { verifiedKFrags } = alice.generateKFrags( + bob, + label, + threshold, + shares, + ); + + const policyEncryptingKey = alice.getPolicyEncryptingKeyFromLabel(label); + + const enrico = new Enrico(policyEncryptingKey); + const encryptedMessage = enrico.encryptMessage(plaintext); + + const ursulaAddresses = fakeUrsulas(shares).map( + (ursula) => ursula.checksumAddress, + ); + const reencrypted = verifiedKFrags.map((kFrag) => + reencrypt(encryptedMessage.capsule, kFrag), + ); + const results = new RetrievalResult( + Object.fromEntries(zip(ursulaAddresses, reencrypted)), + ); + const policyMessageKit = PolicyMessageKit.fromMessageKit( + encryptedMessage, + policyEncryptingKey, + threshold, + ).withResult(results); + expect(policyMessageKit.isDecryptableByReceiver()).toBeTruthy(); + + const bobPlaintext = bob.decrypt(policyMessageKit); + expect(bobPlaintext).toEqual(plaintext); + }); }); diff --git a/packages/pre/test/utils.ts b/packages/pre/test/utils.ts new file mode 100644 index 000000000..b9090456d --- /dev/null +++ b/packages/pre/test/utils.ts @@ -0,0 +1,92 @@ +// Disabling some of the eslint rules for convenience. +/* eslint-disable @typescript-eslint/no-non-null-assertion */ +/* eslint-disable @typescript-eslint/no-explicit-any */ +/* eslint-disable @typescript-eslint/no-unused-vars */ + +import { + Capsule, + EncryptedTreasureMap, + PublicKey, + reencrypt, + SecretKey, + VerifiedCapsuleFrag, + VerifiedKeyFrag, +} from '@nucypher/nucypher-core'; +import { Ursula } from '@nucypher/shared'; +import { fakeUrsulas, mockGetUrsulas } from '@nucypher/test-utils'; +import { expect, SpyInstance, vi } from 'vitest'; + +import { Alice, Bob, Cohort, toBytes } from '../src'; +import { RemoteBob } from '../src/characters'; +import { BlockchainPolicy, PreEnactedPolicy } from '../src/policy'; + +export const fakeBob = (): Bob => { + const secretKey = SecretKey.fromBEBytes( + toBytes('fake-secret-key-32-bytes-bob-xxx'), + ); + return Bob.fromSecretKey(secretKey); +}; + +export const fakeRemoteBob = (): RemoteBob => { + const { decryptingKey, verifyingKey } = fakeBob(); + return RemoteBob.fromKeys(decryptingKey, verifyingKey); +}; + +export const fakeAlice = (aliceKey = 'fake-secret-key-32-bytes-alice-x') => { + const secretKey = SecretKey.fromBEBytes(toBytes(aliceKey)); + return Alice.fromSecretKey(secretKey); +}; + +export const mockPublishToBlockchain = (): SpyInstance => { + const txHash = '0x1234567890123456789012345678901234567890'; + return vi + .spyOn(PreEnactedPolicy.prototype as any, 'publish') + .mockImplementation(async () => Promise.resolve(txHash)); +}; + +export const mockGenerateKFrags = (withValue?: { + delegatingKey: PublicKey; + verifiedKFrags: VerifiedKeyFrag[]; +}): SpyInstance => { + const spy = vi.spyOn(Alice.prototype as any, 'generateKFrags'); + if (withValue) { + return spy.mockImplementation(() => withValue); + } + return spy; +}; + +export const mockEncryptTreasureMap = ( + withValue?: EncryptedTreasureMap, +): SpyInstance => { + const spy = vi.spyOn(BlockchainPolicy.prototype as any, 'encryptTreasureMap'); + if (withValue) { + return spy.mockImplementation(() => withValue); + } + return spy; +}; + +export const reencryptKFrags = ( + kFrags: readonly VerifiedKeyFrag[], + capsule: Capsule, +): { + verifiedCFrags: VerifiedCapsuleFrag[]; +} => { + if (!kFrags) { + throw new Error('Pass at least one kFrag.'); + } + const verifiedCFrags = kFrags.map((kFrag) => reencrypt(capsule, kFrag)); + return { verifiedCFrags }; +}; + +export const mockMakeTreasureMap = (): SpyInstance => { + return vi.spyOn(BlockchainPolicy.prototype as any, 'makeTreasureMap'); +}; + +export const makeCohort = async (ursulas: Ursula[] = fakeUrsulas()) => { + const getUrsulasSpy = mockGetUrsulas(ursulas); + const porterUri = 'https://_this.should.crash'; + const numUrsulas = ursulas.length; + const cohort = await Cohort.create(porterUri, numUrsulas); + expect(getUrsulasSpy).toHaveBeenCalled(); + return cohort; +}; diff --git a/packages/pre/tsconfig.cjs.json b/packages/pre/tsconfig.cjs.json new file mode 100644 index 000000000..035a2ab62 --- /dev/null +++ b/packages/pre/tsconfig.cjs.json @@ -0,0 +1,7 @@ +{ + "extends": "./tsconfig.es.json", + "compilerOptions": { + "outDir": "dist/cjs", + "module": "CommonJS", + } +} diff --git a/packages/pre/tsconfig.es.json b/packages/pre/tsconfig.es.json new file mode 100644 index 000000000..2ffa9192c --- /dev/null +++ b/packages/pre/tsconfig.es.json @@ -0,0 +1,10 @@ +{ + "extends": "./tsconfig.json", + "include": ["src"], + "compilerOptions": { + "outDir": "dist/es", + "rootDir": "src", + "module": "ES2022", + "target": "ES2022" + } +} diff --git a/packages/pre/tsconfig.json b/packages/pre/tsconfig.json index 8d2d7c3d7..935974c35 100644 --- a/packages/pre/tsconfig.json +++ b/packages/pre/tsconfig.json @@ -3,6 +3,11 @@ "include": ["src", "test"], "compilerOptions": { "esModuleInterop": true, - "skipLibCheck": true, - } + "skipLibCheck": true + }, + "references": [ + { + "path": "../test-utils/tsconfig.es.json" + } + ] } diff --git a/packages/shared/abis/Coordinator.json b/packages/shared/abis/Coordinator.json index a9f0143da..2217b4085 100644 --- a/packages/shared/abis/Coordinator.json +++ b/packages/shared/abis/Coordinator.json @@ -1,1375 +1,1423 @@ [ { + "type": "constructor", + "stateMutability": "nonpayable", "inputs": [ { - "internalType": "contract IAccessControlApplication", - "name": "_stakes", - "type": "address" + "name": "_application", + "type": "address", + "internalType": "contract ITACoChildApplication" }, { - "internalType": "uint32", "name": "_timeout", - "type": "uint32" + "type": "uint32", + "internalType": "uint32" }, { - "internalType": "uint16", "name": "_maxDkgSize", - "type": "uint16" + "type": "uint16", + "internalType": "uint16" }, { - "internalType": "address", "name": "_admin", - "type": "address" + "type": "address", + "internalType": "address" }, { - "internalType": "contract IERC20", "name": "_currency", - "type": "address" + "type": "address", + "internalType": "contract IERC20" }, { - "internalType": "uint256", "name": "_feeRatePerSecond", - "type": "uint256" + "type": "uint256", + "internalType": "uint256" } - ], - "stateMutability": "nonpayable", - "type": "constructor" + ] }, { - "anonymous": false, + "type": "event", + "name": "AggregationPosted", "inputs": [ { - "indexed": true, - "internalType": "uint32", "name": "ritualId", - "type": "uint32" + "type": "uint32", + "internalType": "uint32", + "indexed": true }, { - "indexed": true, - "internalType": "address", "name": "node", - "type": "address" + "type": "address", + "internalType": "address", + "indexed": true }, { - "indexed": false, - "internalType": "bytes32", "name": "aggregatedTranscriptDigest", - "type": "bytes32" + "type": "bytes32", + "internalType": "bytes32", + "indexed": false } ], - "name": "AggregationPosted", - "type": "event" + "anonymous": false }, { - "anonymous": false, - "inputs": [], + "type": "event", "name": "DefaultAdminDelayChangeCanceled", - "type": "event" + "inputs": [], + "anonymous": false }, { - "anonymous": false, + "type": "event", + "name": "DefaultAdminDelayChangeScheduled", "inputs": [ { - "indexed": false, - "internalType": "uint48", "name": "newDelay", - "type": "uint48" + "type": "uint48", + "internalType": "uint48", + "indexed": false }, { - "indexed": false, - "internalType": "uint48", "name": "effectSchedule", - "type": "uint48" + "type": "uint48", + "internalType": "uint48", + "indexed": false } ], - "name": "DefaultAdminDelayChangeScheduled", - "type": "event" + "anonymous": false }, { - "anonymous": false, - "inputs": [], + "type": "event", "name": "DefaultAdminTransferCanceled", - "type": "event" + "inputs": [], + "anonymous": false }, { - "anonymous": false, + "type": "event", + "name": "DefaultAdminTransferScheduled", "inputs": [ { - "indexed": true, - "internalType": "address", "name": "newAdmin", - "type": "address" + "type": "address", + "internalType": "address", + "indexed": true }, { - "indexed": false, - "internalType": "uint48", "name": "acceptSchedule", - "type": "uint48" + "type": "uint48", + "internalType": "uint48", + "indexed": false } ], - "name": "DefaultAdminTransferScheduled", - "type": "event" + "anonymous": false }, { - "anonymous": false, + "type": "event", + "name": "EndRitual", "inputs": [ { - "indexed": true, - "internalType": "uint32", "name": "ritualId", - "type": "uint32" + "type": "uint32", + "internalType": "uint32", + "indexed": true }, { - "indexed": false, - "internalType": "bool", "name": "successful", - "type": "bool" + "type": "bool", + "internalType": "bool", + "indexed": false } ], - "name": "EndRitual", - "type": "event" + "anonymous": false }, { - "anonymous": false, + "type": "event", + "name": "MaxDkgSizeChanged", "inputs": [ { - "indexed": false, - "internalType": "uint16", "name": "oldSize", - "type": "uint16" + "type": "uint16", + "internalType": "uint16", + "indexed": false }, { - "indexed": false, - "internalType": "uint16", "name": "newSize", - "type": "uint16" + "type": "uint16", + "internalType": "uint16", + "indexed": false } ], - "name": "MaxDkgSizeChanged", - "type": "event" + "anonymous": false }, { - "anonymous": false, + "type": "event", + "name": "ParticipantPublicKeySet", "inputs": [ { - "indexed": true, - "internalType": "uint32", "name": "ritualId", - "type": "uint32" + "type": "uint32", + "internalType": "uint32", + "indexed": true }, { - "indexed": true, - "internalType": "address", "name": "participant", - "type": "address" + "type": "address", + "internalType": "address", + "indexed": true }, { + "name": "publicKey", + "type": "tuple", "components": [ { - "internalType": "bytes32", "name": "word0", - "type": "bytes32" + "type": "bytes32", + "internalType": "bytes32" }, { - "internalType": "bytes32", "name": "word1", - "type": "bytes32" + "type": "bytes32", + "internalType": "bytes32" }, { - "internalType": "bytes32", "name": "word2", - "type": "bytes32" + "type": "bytes32", + "internalType": "bytes32" } ], - "indexed": false, "internalType": "struct BLS12381.G2Point", - "name": "publicKey", - "type": "tuple" + "indexed": false } ], - "name": "ParticipantPublicKeySet", - "type": "event" + "anonymous": false }, { - "anonymous": false, + "type": "event", + "name": "RoleAdminChanged", "inputs": [ { - "indexed": true, - "internalType": "bytes32", "name": "role", - "type": "bytes32" + "type": "bytes32", + "internalType": "bytes32", + "indexed": true }, { - "indexed": true, - "internalType": "bytes32", "name": "previousAdminRole", - "type": "bytes32" + "type": "bytes32", + "internalType": "bytes32", + "indexed": true }, { - "indexed": true, - "internalType": "bytes32", "name": "newAdminRole", - "type": "bytes32" + "type": "bytes32", + "internalType": "bytes32", + "indexed": true } ], - "name": "RoleAdminChanged", - "type": "event" + "anonymous": false }, { - "anonymous": false, + "type": "event", + "name": "RoleGranted", "inputs": [ { - "indexed": true, - "internalType": "bytes32", "name": "role", - "type": "bytes32" + "type": "bytes32", + "internalType": "bytes32", + "indexed": true }, { - "indexed": true, - "internalType": "address", "name": "account", - "type": "address" + "type": "address", + "internalType": "address", + "indexed": true }, { - "indexed": true, - "internalType": "address", "name": "sender", - "type": "address" + "type": "address", + "internalType": "address", + "indexed": true } ], - "name": "RoleGranted", - "type": "event" + "anonymous": false }, { - "anonymous": false, + "type": "event", + "name": "RoleRevoked", "inputs": [ { - "indexed": true, - "internalType": "bytes32", "name": "role", - "type": "bytes32" + "type": "bytes32", + "internalType": "bytes32", + "indexed": true }, { - "indexed": true, - "internalType": "address", "name": "account", - "type": "address" + "type": "address", + "internalType": "address", + "indexed": true }, { - "indexed": true, - "internalType": "address", "name": "sender", - "type": "address" + "type": "address", + "internalType": "address", + "indexed": true } ], - "name": "RoleRevoked", - "type": "event" + "anonymous": false }, { - "anonymous": false, + "type": "event", + "name": "StartAggregationRound", "inputs": [ { - "indexed": true, - "internalType": "uint32", "name": "ritualId", - "type": "uint32" + "type": "uint32", + "internalType": "uint32", + "indexed": true } ], - "name": "StartAggregationRound", - "type": "event" + "anonymous": false }, { - "anonymous": false, + "type": "event", + "name": "StartRitual", "inputs": [ { - "indexed": true, - "internalType": "uint32", "name": "ritualId", - "type": "uint32" + "type": "uint32", + "internalType": "uint32", + "indexed": true }, { - "indexed": true, - "internalType": "address", "name": "authority", - "type": "address" + "type": "address", + "internalType": "address", + "indexed": true }, { - "indexed": false, - "internalType": "address[]", "name": "participants", - "type": "address[]" + "type": "address[]", + "internalType": "address[]", + "indexed": false } ], - "name": "StartRitual", - "type": "event" + "anonymous": false }, { - "anonymous": false, + "type": "event", + "name": "TimeoutChanged", "inputs": [ { - "indexed": false, - "internalType": "uint32", "name": "oldTimeout", - "type": "uint32" + "type": "uint32", + "internalType": "uint32", + "indexed": false }, { - "indexed": false, - "internalType": "uint32", "name": "newTimeout", - "type": "uint32" + "type": "uint32", + "internalType": "uint32", + "indexed": false } ], - "name": "TimeoutChanged", - "type": "event" + "anonymous": false }, { - "anonymous": false, + "type": "event", + "name": "TranscriptPosted", "inputs": [ { - "indexed": true, - "internalType": "uint32", "name": "ritualId", - "type": "uint32" + "type": "uint32", + "internalType": "uint32", + "indexed": true }, { - "indexed": true, - "internalType": "address", "name": "node", - "type": "address" + "type": "address", + "internalType": "address", + "indexed": true }, { - "indexed": false, - "internalType": "bytes32", "name": "transcriptDigest", - "type": "bytes32" + "type": "bytes32", + "internalType": "bytes32", + "indexed": false } ], - "name": "TranscriptPosted", - "type": "event" + "anonymous": false }, { - "inputs": [], + "type": "function", "name": "DEFAULT_ADMIN_ROLE", + "stateMutability": "view", + "inputs": [], "outputs": [ { - "internalType": "bytes32", "name": "", - "type": "bytes32" + "type": "bytes32", + "internalType": "bytes32" } - ], - "stateMutability": "view", - "type": "function" + ] }, { - "inputs": [], + "type": "function", "name": "INITIATOR_ROLE", + "stateMutability": "view", + "inputs": [], "outputs": [ { - "internalType": "bytes32", "name": "", - "type": "bytes32" + "type": "bytes32", + "internalType": "bytes32" } - ], - "stateMutability": "view", - "type": "function" + ] }, { - "inputs": [], + "type": "function", "name": "TREASURY_ROLE", + "stateMutability": "view", + "inputs": [], "outputs": [ { - "internalType": "bytes32", "name": "", - "type": "bytes32" + "type": "bytes32", + "internalType": "bytes32" } - ], - "stateMutability": "view", - "type": "function" + ] }, { - "inputs": [], + "type": "function", "name": "acceptDefaultAdminTransfer", - "outputs": [], "stateMutability": "nonpayable", - "type": "function" + "inputs": [], + "outputs": [] }, { - "inputs": [], + "type": "function", "name": "application", + "stateMutability": "view", + "inputs": [], "outputs": [ { - "internalType": "contract IAccessControlApplication", "name": "", - "type": "address" + "type": "address", + "internalType": "contract ITACoChildApplication" } - ], - "stateMutability": "view", - "type": "function" + ] }, { + "type": "function", + "name": "beginDefaultAdminTransfer", + "stateMutability": "nonpayable", "inputs": [ { - "internalType": "address", "name": "newAdmin", - "type": "address" + "type": "address", + "internalType": "address" } ], - "name": "beginDefaultAdminTransfer", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "outputs": [] }, { - "inputs": [], + "type": "function", "name": "cancelDefaultAdminTransfer", - "outputs": [], "stateMutability": "nonpayable", - "type": "function" + "inputs": [], + "outputs": [] }, { + "type": "function", + "name": "changeDefaultAdminDelay", + "stateMutability": "nonpayable", "inputs": [ { - "internalType": "uint48", "name": "newDelay", - "type": "uint48" + "type": "uint48", + "internalType": "uint48" } ], - "name": "changeDefaultAdminDelay", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "outputs": [] }, { + "type": "function", + "name": "cohortFingerprint", + "stateMutability": "pure", "inputs": [ { - "internalType": "address[]", "name": "nodes", - "type": "address[]" + "type": "address[]", + "internalType": "address[]" } ], - "name": "cohortFingerprint", "outputs": [ { - "internalType": "bytes32", "name": "", - "type": "bytes32" + "type": "bytes32", + "internalType": "bytes32" } - ], - "stateMutability": "pure", - "type": "function" + ] }, { - "inputs": [], + "type": "function", "name": "currency", + "stateMutability": "view", + "inputs": [], "outputs": [ { - "internalType": "contract IERC20", "name": "", - "type": "address" + "type": "address", + "internalType": "contract IERC20" } - ], - "stateMutability": "view", - "type": "function" + ] }, { - "inputs": [], + "type": "function", "name": "defaultAdmin", + "stateMutability": "view", + "inputs": [], "outputs": [ { - "internalType": "address", "name": "", - "type": "address" + "type": "address", + "internalType": "address" } - ], - "stateMutability": "view", - "type": "function" + ] }, { - "inputs": [], + "type": "function", "name": "defaultAdminDelay", + "stateMutability": "view", + "inputs": [], "outputs": [ { - "internalType": "uint48", "name": "", - "type": "uint48" + "type": "uint48", + "internalType": "uint48" } - ], - "stateMutability": "view", - "type": "function" + ] }, { - "inputs": [], + "type": "function", "name": "defaultAdminDelayIncreaseWait", + "stateMutability": "view", + "inputs": [], "outputs": [ { - "internalType": "uint48", "name": "", - "type": "uint48" + "type": "uint48", + "internalType": "uint48" } - ], - "stateMutability": "view", - "type": "function" + ] }, { - "inputs": [], + "type": "function", "name": "feeRatePerSecond", + "stateMutability": "view", + "inputs": [], "outputs": [ { - "internalType": "uint256", "name": "", - "type": "uint256" + "type": "uint256", + "internalType": "uint256" } - ], - "stateMutability": "view", - "type": "function" + ] }, { + "type": "function", + "name": "getAuthority", + "stateMutability": "view", "inputs": [ { - "internalType": "uint32", "name": "ritualId", - "type": "uint32" + "type": "uint32", + "internalType": "uint32" } ], - "name": "getAuthority", "outputs": [ { - "internalType": "address", "name": "", - "type": "address" + "type": "address", + "internalType": "address" } - ], - "stateMutability": "view", - "type": "function" + ] }, { + "type": "function", + "name": "getParticipantFromProvider", + "stateMutability": "view", "inputs": [ { - "internalType": "uint32", "name": "ritualId", - "type": "uint32" + "type": "uint32", + "internalType": "uint32" }, { - "internalType": "address", "name": "provider", - "type": "address" + "type": "address", + "internalType": "address" } ], - "name": "getParticipantFromProvider", "outputs": [ { + "name": "", + "type": "tuple", "components": [ { - "internalType": "address", "name": "provider", - "type": "address" + "type": "address", + "internalType": "address" }, { - "internalType": "bool", "name": "aggregated", - "type": "bool" + "type": "bool", + "internalType": "bool" }, { - "internalType": "bytes", "name": "transcript", - "type": "bytes" + "type": "bytes", + "internalType": "bytes" }, { - "internalType": "bytes", "name": "decryptionRequestStaticKey", - "type": "bytes" + "type": "bytes", + "internalType": "bytes" } ], - "internalType": "struct Coordinator.Participant", - "name": "", - "type": "tuple" + "internalType": "struct Coordinator.Participant" } - ], - "stateMutability": "view", - "type": "function" + ] }, { + "type": "function", + "name": "getParticipants", + "stateMutability": "view", "inputs": [ { - "internalType": "uint32", "name": "ritualId", - "type": "uint32" + "type": "uint32", + "internalType": "uint32" } ], - "name": "getParticipants", "outputs": [ { + "name": "", + "type": "tuple[]", "components": [ { - "internalType": "address", "name": "provider", - "type": "address" + "type": "address", + "internalType": "address" }, { - "internalType": "bool", "name": "aggregated", - "type": "bool" + "type": "bool", + "internalType": "bool" }, { - "internalType": "bytes", "name": "transcript", - "type": "bytes" + "type": "bytes", + "internalType": "bytes" }, { - "internalType": "bytes", "name": "decryptionRequestStaticKey", - "type": "bytes" + "type": "bytes", + "internalType": "bytes" } ], - "internalType": "struct Coordinator.Participant[]", - "name": "", - "type": "tuple[]" + "internalType": "struct Coordinator.Participant[]" } - ], - "stateMutability": "view", - "type": "function" + ] }, { + "type": "function", + "name": "getProviderPublicKey", + "stateMutability": "view", "inputs": [ { - "internalType": "address", "name": "_provider", - "type": "address" + "type": "address", + "internalType": "address" }, { - "internalType": "uint256", "name": "_ritualId", - "type": "uint256" + "type": "uint256", + "internalType": "uint256" } ], - "name": "getProviderPublicKey", "outputs": [ { + "name": "", + "type": "tuple", "components": [ { - "internalType": "bytes32", "name": "word0", - "type": "bytes32" + "type": "bytes32", + "internalType": "bytes32" }, { - "internalType": "bytes32", "name": "word1", - "type": "bytes32" + "type": "bytes32", + "internalType": "bytes32" }, { - "internalType": "bytes32", "name": "word2", - "type": "bytes32" + "type": "bytes32", + "internalType": "bytes32" } ], - "internalType": "struct BLS12381.G2Point", - "name": "", - "type": "tuple" + "internalType": "struct BLS12381.G2Point" } - ], - "stateMutability": "view", - "type": "function" + ] }, { + "type": "function", + "name": "getPublicKeyFromRitualId", + "stateMutability": "view", "inputs": [ { - "internalType": "uint32", "name": "ritualId", - "type": "uint32" + "type": "uint32", + "internalType": "uint32" } ], - "name": "getPublicKeyFromRitualId", "outputs": [ { + "name": "dkgPublicKey", + "type": "tuple", "components": [ { - "internalType": "bytes32", "name": "word0", - "type": "bytes32" + "type": "bytes32", + "internalType": "bytes32" }, { - "internalType": "bytes16", "name": "word1", - "type": "bytes16" + "type": "bytes16", + "internalType": "bytes16" } ], - "internalType": "struct BLS12381.G1Point", - "name": "dkgPublicKey", - "type": "tuple" + "internalType": "struct BLS12381.G1Point" } - ], - "stateMutability": "view", - "type": "function" + ] }, { + "type": "function", + "name": "getRitualIdFromPublicKey", + "stateMutability": "view", "inputs": [ { + "name": "dkgPublicKey", + "type": "tuple", "components": [ { - "internalType": "bytes32", "name": "word0", - "type": "bytes32" + "type": "bytes32", + "internalType": "bytes32" }, { - "internalType": "bytes16", "name": "word1", - "type": "bytes16" + "type": "bytes16", + "internalType": "bytes16" } ], - "internalType": "struct BLS12381.G1Point", - "name": "dkgPublicKey", - "type": "tuple" + "internalType": "struct BLS12381.G1Point" } ], - "name": "getRitualIdFromPublicKey", "outputs": [ { - "internalType": "uint32", "name": "ritualId", - "type": "uint32" + "type": "uint32", + "internalType": "uint32" } - ], - "stateMutability": "view", - "type": "function" + ] }, { + "type": "function", + "name": "getRitualInitiationCost", + "stateMutability": "view", "inputs": [ { - "internalType": "address[]", "name": "providers", - "type": "address[]" + "type": "address[]", + "internalType": "address[]" }, { - "internalType": "uint32", "name": "duration", - "type": "uint32" + "type": "uint32", + "internalType": "uint32" } ], - "name": "getRitualInitiationCost", "outputs": [ { - "internalType": "uint256", "name": "", - "type": "uint256" + "type": "uint256", + "internalType": "uint256" } - ], - "stateMutability": "view", - "type": "function" + ] }, { + "type": "function", + "name": "getRitualState", + "stateMutability": "view", "inputs": [ { - "internalType": "uint32", "name": "ritualId", - "type": "uint32" + "type": "uint32", + "internalType": "uint32" } ], - "name": "getRitualState", "outputs": [ { - "internalType": "enum Coordinator.RitualState", "name": "", - "type": "uint8" + "type": "uint8", + "internalType": "enum Coordinator.RitualState" } - ], - "stateMutability": "view", - "type": "function" + ] }, { + "type": "function", + "name": "getRoleAdmin", + "stateMutability": "view", "inputs": [ { - "internalType": "bytes32", "name": "role", - "type": "bytes32" + "type": "bytes32", + "internalType": "bytes32" } ], - "name": "getRoleAdmin", "outputs": [ { - "internalType": "bytes32", "name": "", - "type": "bytes32" + "type": "bytes32", + "internalType": "bytes32" } - ], - "stateMutability": "view", - "type": "function" + ] }, { + "type": "function", + "name": "getThresholdForRitualSize", + "stateMutability": "pure", "inputs": [ { - "internalType": "uint16", "name": "size", - "type": "uint16" + "type": "uint16", + "internalType": "uint16" } ], - "name": "getThresholdForRitualSize", "outputs": [ { - "internalType": "uint16", "name": "", - "type": "uint16" + "type": "uint16", + "internalType": "uint16" } - ], - "stateMutability": "pure", - "type": "function" + ] }, { + "type": "function", + "name": "grantRole", + "stateMutability": "nonpayable", "inputs": [ { - "internalType": "bytes32", "name": "role", - "type": "bytes32" + "type": "bytes32", + "internalType": "bytes32" }, { - "internalType": "address", "name": "account", - "type": "address" + "type": "address", + "internalType": "address" } ], - "name": "grantRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "outputs": [] }, { + "type": "function", + "name": "hasRole", + "stateMutability": "view", "inputs": [ { - "internalType": "bytes32", "name": "role", - "type": "bytes32" + "type": "bytes32", + "internalType": "bytes32" }, { - "internalType": "address", "name": "account", - "type": "address" + "type": "address", + "internalType": "address" } ], - "name": "hasRole", "outputs": [ { - "internalType": "bool", "name": "", - "type": "bool" + "type": "bool", + "internalType": "bool" } - ], - "stateMutability": "view", - "type": "function" + ] }, { + "type": "function", + "name": "initiateRitual", + "stateMutability": "nonpayable", "inputs": [ { - "internalType": "address[]", "name": "providers", - "type": "address[]" + "type": "address[]", + "internalType": "address[]" }, { - "internalType": "address", "name": "authority", - "type": "address" + "type": "address", + "internalType": "address" }, { - "internalType": "uint32", "name": "duration", - "type": "uint32" + "type": "uint32", + "internalType": "uint32" }, { - "internalType": "contract IEncryptionAuthorizer", "name": "accessController", - "type": "address" + "type": "address", + "internalType": "contract IEncryptionAuthorizer" } ], - "name": "initiateRitual", "outputs": [ { - "internalType": "uint32", "name": "", - "type": "uint32" + "type": "uint32", + "internalType": "uint32" + } + ] + }, + { + "type": "function", + "name": "isEncryptionAuthorized", + "stateMutability": "view", + "inputs": [ + { + "name": "ritualId", + "type": "uint32", + "internalType": "uint32" + }, + { + "name": "evidence", + "type": "bytes", + "internalType": "bytes" + }, + { + "name": "ciphertextHeader", + "type": "bytes", + "internalType": "bytes" } ], - "stateMutability": "nonpayable", - "type": "function" + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ] }, { - "inputs": [], + "type": "function", "name": "isInitiationPublic", + "stateMutability": "view", + "inputs": [], "outputs": [ { - "internalType": "bool", "name": "", - "type": "bool" + "type": "bool", + "internalType": "bool" } - ], + ] + }, + { + "type": "function", + "name": "isProviderPublicKeySet", "stateMutability": "view", - "type": "function" + "inputs": [ + { + "name": "_provider", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ] }, { + "type": "function", + "name": "isRitualFinalized", + "stateMutability": "view", "inputs": [ { - "internalType": "uint32", "name": "ritualId", - "type": "uint32" + "type": "uint32", + "internalType": "uint32" } ], - "name": "isRitualFinalized", "outputs": [ { - "internalType": "bool", "name": "", - "type": "bool" + "type": "bool", + "internalType": "bool" } - ], - "stateMutability": "view", - "type": "function" + ] }, { - "inputs": [], + "type": "function", "name": "makeInitiationPublic", - "outputs": [], "stateMutability": "nonpayable", - "type": "function" + "inputs": [], + "outputs": [] }, { - "inputs": [], + "type": "function", "name": "maxDkgSize", + "stateMutability": "view", + "inputs": [], "outputs": [ { - "internalType": "uint16", "name": "", - "type": "uint16" + "type": "uint16", + "internalType": "uint16" } - ], - "stateMutability": "view", - "type": "function" + ] }, { - "inputs": [], + "type": "function", "name": "numberOfRituals", + "stateMutability": "view", + "inputs": [], "outputs": [ { - "internalType": "uint256", "name": "", - "type": "uint256" + "type": "uint256", + "internalType": "uint256" } - ], - "stateMutability": "view", - "type": "function" + ] }, { - "inputs": [], + "type": "function", "name": "owner", + "stateMutability": "view", + "inputs": [], "outputs": [ { - "internalType": "address", "name": "", - "type": "address" + "type": "address", + "internalType": "address" } - ], - "stateMutability": "view", - "type": "function" + ] }, { - "inputs": [], + "type": "function", "name": "pendingDefaultAdmin", + "stateMutability": "view", + "inputs": [], "outputs": [ { - "internalType": "address", "name": "newAdmin", - "type": "address" + "type": "address", + "internalType": "address" }, { - "internalType": "uint48", "name": "schedule", - "type": "uint48" + "type": "uint48", + "internalType": "uint48" } - ], - "stateMutability": "view", - "type": "function" + ] }, { - "inputs": [], + "type": "function", "name": "pendingDefaultAdminDelay", + "stateMutability": "view", + "inputs": [], "outputs": [ { - "internalType": "uint48", "name": "newDelay", - "type": "uint48" + "type": "uint48", + "internalType": "uint48" }, { - "internalType": "uint48", "name": "schedule", - "type": "uint48" + "type": "uint48", + "internalType": "uint48" } - ], - "stateMutability": "view", - "type": "function" + ] }, { + "type": "function", + "name": "pendingFees", + "stateMutability": "view", "inputs": [ { - "internalType": "uint256", "name": "", - "type": "uint256" + "type": "uint256", + "internalType": "uint256" } ], - "name": "pendingFees", "outputs": [ { - "internalType": "uint256", "name": "", - "type": "uint256" + "type": "uint256", + "internalType": "uint256" } - ], - "stateMutability": "view", - "type": "function" + ] }, { + "type": "function", + "name": "postAggregation", + "stateMutability": "nonpayable", "inputs": [ { - "internalType": "uint32", "name": "ritualId", - "type": "uint32" + "type": "uint32", + "internalType": "uint32" }, { - "internalType": "bytes", "name": "aggregatedTranscript", - "type": "bytes" + "type": "bytes", + "internalType": "bytes" }, { + "name": "dkgPublicKey", + "type": "tuple", "components": [ { - "internalType": "bytes32", "name": "word0", - "type": "bytes32" + "type": "bytes32", + "internalType": "bytes32" }, { - "internalType": "bytes16", "name": "word1", - "type": "bytes16" + "type": "bytes16", + "internalType": "bytes16" } ], - "internalType": "struct BLS12381.G1Point", - "name": "dkgPublicKey", - "type": "tuple" + "internalType": "struct BLS12381.G1Point" }, { - "internalType": "bytes", "name": "decryptionRequestStaticKey", - "type": "bytes" + "type": "bytes", + "internalType": "bytes" } ], - "name": "postAggregation", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "outputs": [] }, { + "type": "function", + "name": "postTranscript", + "stateMutability": "nonpayable", "inputs": [ { - "internalType": "uint32", "name": "ritualId", - "type": "uint32" + "type": "uint32", + "internalType": "uint32" }, { - "internalType": "bytes", "name": "transcript", - "type": "bytes" + "type": "bytes", + "internalType": "bytes" } ], - "name": "postTranscript", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "outputs": [] }, { + "type": "function", + "name": "processPendingFee", + "stateMutability": "nonpayable", "inputs": [ { - "internalType": "uint32", "name": "ritualId", - "type": "uint32" + "type": "uint32", + "internalType": "uint32" } ], - "name": "processPendingFee", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "outputs": [] }, { + "type": "function", + "name": "renounceRole", + "stateMutability": "nonpayable", "inputs": [ { - "internalType": "bytes32", "name": "role", - "type": "bytes32" + "type": "bytes32", + "internalType": "bytes32" }, { - "internalType": "address", "name": "account", - "type": "address" + "type": "address", + "internalType": "address" } ], - "name": "renounceRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "outputs": [] }, { + "type": "function", + "name": "revokeRole", + "stateMutability": "nonpayable", "inputs": [ { - "internalType": "bytes32", "name": "role", - "type": "bytes32" + "type": "bytes32", + "internalType": "bytes32" }, { - "internalType": "address", "name": "account", - "type": "address" + "type": "address", + "internalType": "address" } ], - "name": "revokeRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "outputs": [] }, { + "type": "function", + "name": "rituals", + "stateMutability": "view", "inputs": [ { - "internalType": "uint256", "name": "", - "type": "uint256" + "type": "uint256", + "internalType": "uint256" } ], - "name": "rituals", "outputs": [ { - "internalType": "address", "name": "initiator", - "type": "address" + "type": "address", + "internalType": "address" }, { - "internalType": "uint32", "name": "initTimestamp", - "type": "uint32" + "type": "uint32", + "internalType": "uint32" }, { - "internalType": "uint32", "name": "endTimestamp", - "type": "uint32" + "type": "uint32", + "internalType": "uint32" }, { - "internalType": "uint16", "name": "totalTranscripts", - "type": "uint16" + "type": "uint16", + "internalType": "uint16" }, { - "internalType": "uint16", "name": "totalAggregations", - "type": "uint16" + "type": "uint16", + "internalType": "uint16" }, { - "internalType": "address", "name": "authority", - "type": "address" + "type": "address", + "internalType": "address" }, { - "internalType": "uint16", "name": "dkgSize", - "type": "uint16" + "type": "uint16", + "internalType": "uint16" }, { - "internalType": "uint16", "name": "threshold", - "type": "uint16" + "type": "uint16", + "internalType": "uint16" }, { - "internalType": "bool", "name": "aggregationMismatch", - "type": "bool" + "type": "bool", + "internalType": "bool" }, { - "internalType": "contract IEncryptionAuthorizer", "name": "accessController", - "type": "address" + "type": "address", + "internalType": "contract IEncryptionAuthorizer" }, { + "name": "publicKey", + "type": "tuple", "components": [ { - "internalType": "bytes32", "name": "word0", - "type": "bytes32" + "type": "bytes32", + "internalType": "bytes32" }, { - "internalType": "bytes16", "name": "word1", - "type": "bytes16" + "type": "bytes16", + "internalType": "bytes16" } ], - "internalType": "struct BLS12381.G1Point", - "name": "publicKey", - "type": "tuple" + "internalType": "struct BLS12381.G1Point" }, { - "internalType": "bytes", "name": "aggregatedTranscript", - "type": "bytes" + "type": "bytes", + "internalType": "bytes" } - ], - "stateMutability": "view", - "type": "function" + ] }, { - "inputs": [], + "type": "function", "name": "rollbackDefaultAdminDelay", - "outputs": [], "stateMutability": "nonpayable", - "type": "function" + "inputs": [], + "outputs": [] }, { + "type": "function", + "name": "setMaxDkgSize", + "stateMutability": "nonpayable", "inputs": [ { - "internalType": "uint16", "name": "newSize", - "type": "uint16" + "type": "uint16", + "internalType": "uint16" } ], - "name": "setMaxDkgSize", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "outputs": [] }, { + "type": "function", + "name": "setProviderPublicKey", + "stateMutability": "nonpayable", "inputs": [ { + "name": "_publicKey", + "type": "tuple", "components": [ { - "internalType": "bytes32", "name": "word0", - "type": "bytes32" + "type": "bytes32", + "internalType": "bytes32" }, { - "internalType": "bytes32", "name": "word1", - "type": "bytes32" + "type": "bytes32", + "internalType": "bytes32" }, { - "internalType": "bytes32", "name": "word2", - "type": "bytes32" + "type": "bytes32", + "internalType": "bytes32" } ], - "internalType": "struct BLS12381.G2Point", - "name": "_publicKey", - "type": "tuple" + "internalType": "struct BLS12381.G2Point" } ], - "name": "setProviderPublicKey", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "outputs": [] }, { + "type": "function", + "name": "setReimbursementPool", + "stateMutability": "nonpayable", "inputs": [ { - "internalType": "contract IReimbursementPool", "name": "pool", - "type": "address" + "type": "address", + "internalType": "contract IReimbursementPool" } ], - "name": "setReimbursementPool", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "outputs": [] }, { + "type": "function", + "name": "setRitualAuthority", + "stateMutability": "nonpayable", "inputs": [ { - "internalType": "uint32", "name": "ritualId", - "type": "uint32" + "type": "uint32", + "internalType": "uint32" }, { - "internalType": "address", "name": "authority", - "type": "address" + "type": "address", + "internalType": "address" } ], - "name": "setRitualAuthority", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "outputs": [] }, { + "type": "function", + "name": "setTimeout", + "stateMutability": "nonpayable", "inputs": [ { - "internalType": "uint32", "name": "newTimeout", - "type": "uint32" + "type": "uint32", + "internalType": "uint32" } ], - "name": "setTimeout", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "outputs": [] }, { + "type": "function", + "name": "supportsInterface", + "stateMutability": "view", "inputs": [ { - "internalType": "bytes4", "name": "interfaceId", - "type": "bytes4" + "type": "bytes4", + "internalType": "bytes4" } ], - "name": "supportsInterface", "outputs": [ { - "internalType": "bool", "name": "", - "type": "bool" + "type": "bool", + "internalType": "bool" } - ], - "stateMutability": "view", - "type": "function" + ] }, { - "inputs": [], + "type": "function", "name": "timeout", + "stateMutability": "view", + "inputs": [], "outputs": [ { - "internalType": "uint32", "name": "", - "type": "uint32" + "type": "uint32", + "internalType": "uint32" } - ], - "stateMutability": "view", - "type": "function" + ] }, { - "inputs": [], + "type": "function", "name": "totalPendingFees", + "stateMutability": "view", + "inputs": [], "outputs": [ { - "internalType": "uint256", "name": "", - "type": "uint256" + "type": "uint256", + "internalType": "uint256" } - ], - "stateMutability": "view", - "type": "function" + ] }, { + "type": "function", + "name": "withdrawTokens", + "stateMutability": "nonpayable", "inputs": [ { - "internalType": "contract IERC20", "name": "token", - "type": "address" + "type": "address", + "internalType": "contract IERC20" }, { - "internalType": "uint256", "name": "amount", - "type": "uint256" + "type": "uint256", + "internalType": "uint256" } ], - "name": "withdrawTokens", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "outputs": [] } ] diff --git a/packages/shared/package.json b/packages/shared/package.json index 4e2beab12..bc61c6cac 100644 --- a/packages/shared/package.json +++ b/packages/shared/package.json @@ -33,37 +33,31 @@ "clean": "rm -rf dist", "exports:lint": "ts-unused-exports tsconfig.json --ignoreFiles src/index.ts", "postinstall": "pnpm typechain", - "lint": "eslint --ext .ts src test", + "lint": "eslint --ext .ts src", "lint:fix": "pnpm lint --fix", "package-check": "package-check", - "test": "vitest run", "typechain": "typechain --out-dir=./src/contracts/ethers-typechain --target=ethers-v5 \"abis/**/*.json\"", "typedoc": "typedoc" }, "dependencies": { "@ethersproject/abi": "^5.7.0", - "@ethersproject/abstract-signer": "^5.7.0", "@ethersproject/providers": "^5.7.2", - "@nucypher/nucypher-core": "0.13.0-alpha.0", + "@nucypher/nucypher-core": "0.13.0-alpha.1", "axios": "^1.5.0", "deep-equal": "^2.2.1", "ethers": "^5.7.2", - "qs": "^6.10.1", - "semver": "^7.5.2", - "zod": "^3.22.1" + "qs": "^6.10.1" }, "devDependencies": { - "@nucypher/test-utils": "workspace:*", "@typechain/ethers-v5": "^11.1.1", "@types/deep-equal": "^1.0.1", "@types/qs": "^6.9.7", - "@types/semver": "^7.5.0", "cz-conventional-changelog": "^3.0.1", "standard-version": "^9.0.0", "typechain": "^8.3.1" }, "engines": { - "node": ">=16", + "node": ">=18", "pnpm": ">=8.0.0" } } diff --git a/packages/shared/src/characters/cbd-recipient.ts b/packages/shared/src/characters/cbd-recipient.ts deleted file mode 100644 index c9a035523..000000000 --- a/packages/shared/src/characters/cbd-recipient.ts +++ /dev/null @@ -1,205 +0,0 @@ -import { - combineDecryptionSharesSimple, - Context, - DecryptionShareSimple, - EncryptedThresholdDecryptionRequest, - EncryptedThresholdDecryptionResponse, - FerveoVariant, - SessionSharedSecret, - SessionStaticSecret, - ThresholdDecryptionRequest, - ThresholdMessageKit, -} from '@nucypher/nucypher-core'; -import { ethers } from 'ethers'; - -import { ConditionContext } from '../conditions'; -import { - DkgCoordinatorAgent, - DkgParticipant, -} from '../contracts/agents/coordinator'; -import { PorterClient } from '../porter'; -import { fromJSON, objectEquals, toJSON } from '../utils'; - -export type ThresholdDecrypterJSON = { - porterUri: string; - ritualId: number; - threshold: number; -}; - -export class ThresholdDecrypter { - private constructor( - private readonly porter: PorterClient, - private readonly ritualId: number, - private readonly threshold: number, - ) {} - - public static create(porterUri: string, ritualId: number, threshold: number) { - return new ThresholdDecrypter( - new PorterClient(porterUri), - ritualId, - threshold, - ); - } - - // Retrieve and decrypt ciphertext using provider and condition expression - public async retrieveAndDecrypt( - web3Provider: ethers.providers.Provider, - thresholdMessageKit: ThresholdMessageKit, - signer?: ethers.Signer, - ): Promise { - const decryptionShares = await this.retrieve( - web3Provider, - thresholdMessageKit, - signer, - ); - const sharedSecret = combineDecryptionSharesSimple(decryptionShares); - return thresholdMessageKit.decryptWithSharedSecret(sharedSecret); - } - - // Retrieve decryption shares - public async retrieve( - provider: ethers.providers.Provider, - thresholdMessageKit: ThresholdMessageKit, - signer?: ethers.Signer, - ): Promise { - const dkgParticipants = await DkgCoordinatorAgent.getParticipants( - provider, - this.ritualId, - ); - const wasmContext = await ConditionContext.fromConditions( - provider, - thresholdMessageKit.acp.conditions!, - signer, - ).toWASMContext(); - const { sharedSecrets, encryptedRequests } = - await this.makeDecryptionRequests( - this.ritualId, - wasmContext, - dkgParticipants, - thresholdMessageKit, - ); - - const { encryptedResponses, errors } = await this.porter.cbdDecrypt( - encryptedRequests, - this.threshold, - ); - if (Object.keys(encryptedResponses).length < this.threshold) { - throw new Error( - `Threshold of responses not met; CBD decryption failed with errors: ${JSON.stringify( - errors, - )}`, - ); - } - - return this.makeDecryptionShares( - encryptedResponses, - sharedSecrets, - this.ritualId, - ); - } - - private makeDecryptionShares( - encryptedResponses: Record, - sessionSharedSecret: Record, - expectedRitualId: number, - ) { - const decryptedResponses = Object.entries(encryptedResponses).map( - ([ursula, response]) => response.decrypt(sessionSharedSecret[ursula]), - ); - - const ritualIds = decryptedResponses.map(({ ritualId }) => ritualId); - if (ritualIds.some((ritualId) => ritualId !== expectedRitualId)) { - throw new Error( - `Ritual id mismatch. Expected ${expectedRitualId}, got ${ritualIds}`, - ); - } - - return decryptedResponses.map(({ decryptionShare }) => - DecryptionShareSimple.fromBytes(decryptionShare), - ); - } - - private async makeDecryptionRequests( - ritualId: number, - wasmContext: Context, - dkgParticipants: Array, - thresholdMessageKit: ThresholdMessageKit, - ): Promise<{ - sharedSecrets: Record; - encryptedRequests: Record; - }> { - const decryptionRequest = new ThresholdDecryptionRequest( - ritualId, - FerveoVariant.simple, - thresholdMessageKit.ciphertextHeader, - thresholdMessageKit.acp, - wasmContext, - ); - - const ephemeralSessionKey = this.makeSessionKey(); - - // Compute shared secrets for each participant - const sharedSecrets: Record = - Object.fromEntries( - dkgParticipants.map(({ provider, decryptionRequestStaticKey }) => { - const sharedSecret = ephemeralSessionKey.deriveSharedSecret( - decryptionRequestStaticKey, - ); - return [provider, sharedSecret]; - }), - ); - - // Create encrypted requests for each participant - const encryptedRequests: Record< - string, - EncryptedThresholdDecryptionRequest - > = Object.fromEntries( - Object.entries(sharedSecrets).map(([provider, sessionSharedSecret]) => { - const encryptedRequest = decryptionRequest.encrypt( - sessionSharedSecret, - ephemeralSessionKey.publicKey(), - ); - return [provider, encryptedRequest]; - }), - ); - - return { sharedSecrets, encryptedRequests }; - } - - private makeSessionKey() { - // Moving to a separate function to make it easier to mock - return SessionStaticSecret.random(); - } - - public toObj(): ThresholdDecrypterJSON { - return { - porterUri: this.porter.porterUrl.toString(), - ritualId: this.ritualId, - threshold: this.threshold, - }; - } - - public toJSON(): string { - return toJSON(this.toObj()); - } - - public static fromObj({ - porterUri, - ritualId, - threshold, - }: ThresholdDecrypterJSON) { - return new ThresholdDecrypter( - new PorterClient(porterUri), - ritualId, - threshold, - ); - } - - public static fromJSON(json: string) { - return ThresholdDecrypter.fromObj(fromJSON(json)); - } - - public equals(other: ThresholdDecrypter): boolean { - return objectEquals(this.toObj(), other.toObj()); - } -} diff --git a/packages/shared/src/characters/enrico.ts b/packages/shared/src/characters/enrico.ts deleted file mode 100644 index 470e296f8..000000000 --- a/packages/shared/src/characters/enrico.ts +++ /dev/null @@ -1,85 +0,0 @@ -import { - AccessControlPolicy, - DkgPublicKey, - encryptForDkg, - MessageKit, - PublicKey, - SecretKey, - ThresholdMessageKit, -} from '@nucypher/nucypher-core'; -import { arrayify, keccak256 } from 'ethers/lib/utils'; - -import { ConditionExpression } from '../conditions'; -import { Keyring } from '../keyring'; -import { toBytes } from '../utils'; - -export class Enrico { - public readonly encryptingKey: PublicKey | DkgPublicKey; - private readonly keyring: Keyring; - public conditions?: ConditionExpression | undefined; - - constructor( - encryptingKey: PublicKey | DkgPublicKey, - verifyingKey?: SecretKey, - conditions?: ConditionExpression, - ) { - this.encryptingKey = encryptingKey; - this.keyring = new Keyring(verifyingKey ?? SecretKey.random()); - this.conditions = conditions; - } - - public get verifyingKey(): PublicKey { - return this.keyring.publicKey; - } - - public encryptMessagePre( - plaintext: Uint8Array | string, - withConditions?: ConditionExpression, - ): MessageKit { - if (!withConditions) { - withConditions = this.conditions; - } - - if (!(this.encryptingKey instanceof PublicKey)) { - throw new Error('Wrong key type. Use encryptMessageCbd instead.'); - } - - return new MessageKit( - this.encryptingKey, - plaintext instanceof Uint8Array ? plaintext : toBytes(plaintext), - withConditions ? withConditions.toWASMConditions() : null, - ); - } - - public encryptMessageCbd( - plaintext: Uint8Array | string, - conditions?: ConditionExpression, - ): ThresholdMessageKit { - if (!conditions) { - conditions = this.conditions; - } - - if (!conditions) { - throw new Error('Conditions are required for CBD encryption.'); - } - - if (!(this.encryptingKey instanceof DkgPublicKey)) { - throw new Error('Wrong key type. Use encryptMessagePre instead.'); - } - - const [ciphertext, authenticatedData] = encryptForDkg( - plaintext instanceof Uint8Array ? plaintext : toBytes(plaintext), - this.encryptingKey, - conditions.toWASMConditions(), - ); - - const headerHash = keccak256(ciphertext.header.toBytes()); - const authorization = this.keyring.signer.sign(arrayify(headerHash)); - const acp = new AccessControlPolicy( - authenticatedData, - authorization.toBEBytes(), - ); - - return new ThresholdMessageKit(ciphertext, acp); - } -} diff --git a/packages/shared/src/characters/pre-recipient.ts b/packages/shared/src/characters/pre-recipient.ts deleted file mode 100644 index 0c6ecce9d..000000000 --- a/packages/shared/src/characters/pre-recipient.ts +++ /dev/null @@ -1,206 +0,0 @@ -import { - Conditions, - EncryptedTreasureMap, - MessageKit, - PublicKey, - SecretKey, - Signer, -} from '@nucypher/nucypher-core'; -import { ethers } from 'ethers'; - -import { ConditionContext, ConditionExpression } from '../conditions'; -import { Keyring } from '../keyring'; -import { PolicyMessageKit } from '../kits/message'; -import { RetrievalResult } from '../kits/retrieval'; -import { PorterClient } from '../porter'; -import { base64ToU8Receiver, toJSON, zip } from '../utils'; - -export type PreDecrypterJSON = { - porterUri: string; - policyEncryptingKeyBytes: Uint8Array; - encryptedTreasureMapBytes: Uint8Array; - publisherVerifyingKeyBytes: Uint8Array; - bobSecretKeyBytes: Uint8Array; -}; - -export class PreDecrypter { - // private readonly verifyingKey: Keyring; - - constructor( - private readonly porter: PorterClient, - private readonly keyring: Keyring, - private readonly policyEncryptingKey: PublicKey, - private readonly publisherVerifyingKey: PublicKey, - private readonly encryptedTreasureMap: EncryptedTreasureMap, - ) {} - - public static create( - porterUri: string, - secretKey: SecretKey, - policyEncryptingKey: PublicKey, - publisherVerifyingKey: PublicKey, - encryptedTreasureMap: EncryptedTreasureMap, - ): PreDecrypter { - return new PreDecrypter( - new PorterClient(porterUri), - new Keyring(secretKey), - policyEncryptingKey, - publisherVerifyingKey, - encryptedTreasureMap, - ); - } - - public get decryptingKey(): PublicKey { - return this.keyring.publicKey; - } - - public get signer(): Signer { - return this.keyring.signer; - } - - public decrypt(messageKit: MessageKit | PolicyMessageKit): Uint8Array { - return this.keyring.decrypt(messageKit); - } - - public async retrieveAndDecrypt( - provider: ethers.providers.Provider, - signer: ethers.Signer, - messageKits: readonly MessageKit[], - ): Promise { - const policyMessageKits = await this.retrieve( - provider, - signer, - messageKits, - ); - - policyMessageKits.forEach((mk: PolicyMessageKit) => { - if (!mk.isDecryptableByReceiver()) { - const errorMsg = `Not enough cFrags retrieved to open capsule ${mk.capsule}.`; - if (Object.values(mk.errors).length > 0) { - const ursulasWithErrors = Object.entries(mk.errors).map( - ([address, error]) => `${address} - ${error}`, - ); - throw Error( - `${errorMsg} Some Ursulas have failed with errors:\n${ursulasWithErrors.join( - '\n', - )}`, - ); - } else { - throw Error(errorMsg); - } - } - }); - - return policyMessageKits.map((mk) => this.keyring.decrypt(mk)); - } - - public async retrieve( - provider: ethers.providers.Provider, - signer: ethers.Signer, - messageKits: readonly MessageKit[], - ): Promise { - const treasureMap = this.encryptedTreasureMap.decrypt( - this.keyring.secretKey, - this.publisherVerifyingKey, - ); - - // concat into single array of conditions - const conditions = messageKits - .map((mk) => mk.conditions) - .filter((condition): condition is Conditions => !!condition) - .map((condition) => ConditionExpression.fromJSON(condition.toString())) - .reduce((acc: ConditionExpression[], val) => acc.concat(val), []) - .map((condExpr: ConditionExpression) => condExpr.condition); - - const conditionContext = new ConditionContext( - provider, - conditions, - {}, - signer, - ); - - const policyMessageKits = messageKits.map((mk) => - PolicyMessageKit.fromMessageKit( - mk, - this.policyEncryptingKey, - treasureMap.threshold, - ), - ); - - const retrievalKits = policyMessageKits.map((pk) => pk.asRetrievalKit()); - const conditionContextJSON = conditionContext - ? await conditionContext.toJson() - : undefined; - const retrieveCFragsResponses = await this.porter.retrieveCFrags( - treasureMap, - retrievalKits, - this.publisherVerifyingKey, - this.decryptingKey, - this.keyring.publicKey, - conditionContextJSON, - ); - - return zip(policyMessageKits, retrieveCFragsResponses).map((pair) => { - const [messageKit, { cFrags, errors }] = pair; - const vcFrags = Object.keys(cFrags).map((address) => { - const verified = cFrags[address].verify( - messageKit.capsule, - this.publisherVerifyingKey, - this.policyEncryptingKey, - this.decryptingKey, - ); - return [address, verified]; - }); - const retrievalResult = new RetrievalResult( - Object.fromEntries(vcFrags), - errors, - ); - return messageKit.withResult(retrievalResult); - }); - } - - public toObj(): PreDecrypterJSON { - return { - porterUri: this.porter.porterUrl.toString(), - policyEncryptingKeyBytes: this.policyEncryptingKey.toCompressedBytes(), - encryptedTreasureMapBytes: this.encryptedTreasureMap.toBytes(), - publisherVerifyingKeyBytes: - this.publisherVerifyingKey.toCompressedBytes(), - bobSecretKeyBytes: this.keyring.secretKey.toBEBytes(), - }; - } - - public toJSON(): string { - return toJSON(this.toObj()); - } - - public static fromObj({ - porterUri, - policyEncryptingKeyBytes, - encryptedTreasureMapBytes, - publisherVerifyingKeyBytes, - bobSecretKeyBytes, - }: PreDecrypterJSON) { - return new PreDecrypter( - new PorterClient(porterUri), - new Keyring(SecretKey.fromBEBytes(bobSecretKeyBytes)), - PublicKey.fromCompressedBytes(policyEncryptingKeyBytes), - PublicKey.fromCompressedBytes(publisherVerifyingKeyBytes), - EncryptedTreasureMap.fromBytes(encryptedTreasureMapBytes), - ); - } - - public static fromJSON(json: string) { - const config = JSON.parse(json, base64ToU8Receiver); - return PreDecrypter.fromObj(config); - } - - public equals(other: PreDecrypter): boolean { - return [ - this.porter.porterUrl.toString() === other.porter.porterUrl.toString(), - this.policyEncryptingKey.equals(other.policyEncryptingKey), - this.encryptedTreasureMap.equals(other.encryptedTreasureMap), - this.publisherVerifyingKey.equals(other.publisherVerifyingKey), - ].every(Boolean); - } -} diff --git a/packages/shared/src/conditions/index.ts b/packages/shared/src/conditions/index.ts deleted file mode 100644 index c5e5cc257..000000000 --- a/packages/shared/src/conditions/index.ts +++ /dev/null @@ -1,19 +0,0 @@ -// TODO: Do we want structured exports in @nucypher/shared? -import * as base from './base'; -import * as predefined from './predefined'; - -// TODO: Or do we want to export everything from the base and predefined modules? -export * from './base'; -export * from './predefined'; - -export { - CompoundConditionType, - type CompoundConditionProps, -} from './compound-condition'; -export { Condition, type ConditionProps } from './condition'; -export { - ConditionExpression, - type ConditionExpressionJSON, -} from './condition-expr'; -export { ConditionContext, type CustomContextParam } from './context'; -export { base, predefined }; diff --git a/packages/shared/src/contracts/agents/coordinator.ts b/packages/shared/src/contracts/agents/coordinator.ts index 77487650b..f1d613178 100644 --- a/packages/shared/src/contracts/agents/coordinator.ts +++ b/packages/shared/src/contracts/agents/coordinator.ts @@ -1,4 +1,8 @@ -import { DkgPublicKey, SessionStaticKey } from '@nucypher/nucypher-core'; +import { + DkgPublicKey, + SessionStaticKey, + ThresholdMessageKit, +} from '@nucypher/nucypher-core'; import { BigNumberish, ethers } from 'ethers'; import { ChecksumAddress } from '../../types'; @@ -42,8 +46,8 @@ export class DkgCoordinatorAgent { provider: ethers.providers.Provider, ritualId: number, ): Promise { - const Coordinator = await this.connectReadOnly(provider); - const participants = await Coordinator.getParticipants(ritualId); + const coordinator = await this.connectReadOnly(provider); + const participants = await coordinator.getParticipants(ritualId); return participants.map((participant) => { return { @@ -64,8 +68,8 @@ export class DkgCoordinatorAgent { duration: BigNumberish, accessController: string, ): Promise { - const Coordinator = await this.connectReadWrite(provider, signer); - const tx = await Coordinator.initiateRitual( + const coordinator = await this.connectReadWrite(provider, signer); + const tx = await coordinator.initiateRitual( providers, authority, duration, @@ -83,16 +87,16 @@ export class DkgCoordinatorAgent { provider: ethers.providers.Provider, ritualId: number, ): Promise { - const Coordinator = await this.connectReadOnly(provider); - return Coordinator.rituals(ritualId); + const coordinator = await this.connectReadOnly(provider); + return coordinator.rituals(ritualId); } public static async getRitualState( provider: ethers.providers.Provider, ritualId: number, ): Promise { - const Coordinator = await this.connectReadOnly(provider); - return await Coordinator.getRitualState(ritualId); + const coordinator = await this.connectReadOnly(provider); + return await coordinator.getRitualState(ritualId); } public static async onRitualEndEvent( @@ -100,11 +104,11 @@ export class DkgCoordinatorAgent { ritualId: number, callback: (successful: boolean) => void, ): Promise { - const Coordinator = await this.connectReadOnly(provider); + const coordinator = await this.connectReadOnly(provider); // We leave `initiator` undefined because we don't care who the initiator is // We leave `successful` undefined because we don't care if the ritual was successful - const eventFilter = Coordinator.filters.EndRitual(ritualId, undefined); - Coordinator.once(eventFilter, (_ritualId, successful) => { + const eventFilter = coordinator.filters.EndRitual(ritualId, undefined); + coordinator.once(eventFilter, (_ritualId, successful) => { callback(successful); }); } @@ -113,13 +117,26 @@ export class DkgCoordinatorAgent { provider: ethers.providers.Provider, dkgPublicKey: DkgPublicKey, ): Promise { - const Coordinator = await this.connectReadOnly(provider); + const coordinator = await this.connectReadOnly(provider); const dkgPublicKeyBytes = dkgPublicKey.toBytes(); const pointStruct: BLS12381.G1PointStruct = { word0: dkgPublicKeyBytes.slice(0, 32), word1: dkgPublicKeyBytes.slice(32, 48), }; - return await Coordinator.getRitualIdFromPublicKey(pointStruct); + return await coordinator.getRitualIdFromPublicKey(pointStruct); + } + + public static async isEncryptionAuthorized( + provider: ethers.providers.Provider, + ritualId: number, + thresholdMessageKit: ThresholdMessageKit, + ): Promise { + const coordinator = await this.connectReadOnly(provider); + return await coordinator.isEncryptionAuthorized( + ritualId, + thresholdMessageKit.acp.authorization, + thresholdMessageKit.ciphertextHeader.toBytes(), + ); } private static async connectReadOnly(provider: ethers.providers.Provider) { diff --git a/packages/shared/src/contracts/agents/subscription-manager.ts b/packages/shared/src/contracts/agents/subscription-manager.ts index f249d56e8..88113f355 100644 --- a/packages/shared/src/contracts/agents/subscription-manager.ts +++ b/packages/shared/src/contracts/agents/subscription-manager.ts @@ -23,11 +23,11 @@ export class PreSubscriptionManagerAgent { endTimestamp: number, ownerAddress: ChecksumAddress, ): Promise { - const SubscriptionManager = await this.connectReadWrite(provider, signer); + const subscriptionManager = await this.connectReadWrite(provider, signer); const overrides = { value: valueInWei.toString(), }; - const estimatedGas = await SubscriptionManager.estimateGas.createPolicy( + const estimatedGas = await subscriptionManager.estimateGas.createPolicy( ethersUtils.hexlify(policyId), ownerAddress, size, @@ -35,7 +35,7 @@ export class PreSubscriptionManagerAgent { endTimestamp, overrides, ); - const tx = await SubscriptionManager.createPolicy( + const tx = await subscriptionManager.createPolicy( ethersUtils.hexlify(policyId), ownerAddress, size, @@ -53,8 +53,8 @@ export class PreSubscriptionManagerAgent { startTimestamp: number, endTimestamp: number, ): Promise { - const SubscriptionManager = await this.connectReadOnly(provider); - return await SubscriptionManager.getPolicyCost( + const subscriptionManager = await this.connectReadOnly(provider); + return await subscriptionManager.getPolicyCost( size, startTimestamp, endTimestamp, diff --git a/packages/shared/src/contracts/ethers-typechain/Coordinator.ts b/packages/shared/src/contracts/ethers-typechain/Coordinator.ts index c8aa87597..4f6744b86 100644 --- a/packages/shared/src/contracts/ethers-typechain/Coordinator.ts +++ b/packages/shared/src/contracts/ethers-typechain/Coordinator.ts @@ -92,7 +92,9 @@ export interface CoordinatorInterface extends utils.Interface { "grantRole(bytes32,address)": FunctionFragment; "hasRole(bytes32,address)": FunctionFragment; "initiateRitual(address[],address,uint32,address)": FunctionFragment; + "isEncryptionAuthorized(uint32,bytes,bytes)": FunctionFragment; "isInitiationPublic()": FunctionFragment; + "isProviderPublicKeySet(address)": FunctionFragment; "isRitualFinalized(uint32)": FunctionFragment; "makeInitiationPublic()": FunctionFragment; "maxDkgSize()": FunctionFragment; @@ -148,7 +150,9 @@ export interface CoordinatorInterface extends utils.Interface { | "grantRole" | "hasRole" | "initiateRitual" + | "isEncryptionAuthorized" | "isInitiationPublic" + | "isProviderPublicKeySet" | "isRitualFinalized" | "makeInitiationPublic" | "maxDkgSize" @@ -280,10 +284,18 @@ export interface CoordinatorInterface extends utils.Interface { functionFragment: "initiateRitual", values: [string[], string, BigNumberish, string] ): string; + encodeFunctionData( + functionFragment: "isEncryptionAuthorized", + values: [BigNumberish, BytesLike, BytesLike] + ): string; encodeFunctionData( functionFragment: "isInitiationPublic", values?: undefined ): string; + encodeFunctionData( + functionFragment: "isProviderPublicKeySet", + values: [string] + ): string; encodeFunctionData( functionFragment: "isRitualFinalized", values: [BigNumberish] @@ -474,10 +486,18 @@ export interface CoordinatorInterface extends utils.Interface { functionFragment: "initiateRitual", data: BytesLike ): Result; + decodeFunctionResult( + functionFragment: "isEncryptionAuthorized", + data: BytesLike + ): Result; decodeFunctionResult( functionFragment: "isInitiationPublic", data: BytesLike ): Result; + decodeFunctionResult( + functionFragment: "isProviderPublicKeySet", + data: BytesLike + ): Result; decodeFunctionResult( functionFragment: "isRitualFinalized", data: BytesLike @@ -917,8 +937,20 @@ export interface Coordinator extends BaseContract { overrides?: Overrides & { from?: string } ): Promise; + isEncryptionAuthorized( + ritualId: BigNumberish, + evidence: BytesLike, + ciphertextHeader: BytesLike, + overrides?: CallOverrides + ): Promise<[boolean]>; + isInitiationPublic(overrides?: CallOverrides): Promise<[boolean]>; + isProviderPublicKeySet( + _provider: string, + overrides?: CallOverrides + ): Promise<[boolean]>; + isRitualFinalized( ritualId: BigNumberish, overrides?: CallOverrides @@ -1168,8 +1200,20 @@ export interface Coordinator extends BaseContract { overrides?: Overrides & { from?: string } ): Promise; + isEncryptionAuthorized( + ritualId: BigNumberish, + evidence: BytesLike, + ciphertextHeader: BytesLike, + overrides?: CallOverrides + ): Promise; + isInitiationPublic(overrides?: CallOverrides): Promise; + isProviderPublicKeySet( + _provider: string, + overrides?: CallOverrides + ): Promise; + isRitualFinalized( ritualId: BigNumberish, overrides?: CallOverrides @@ -1415,8 +1459,20 @@ export interface Coordinator extends BaseContract { overrides?: CallOverrides ): Promise; + isEncryptionAuthorized( + ritualId: BigNumberish, + evidence: BytesLike, + ciphertextHeader: BytesLike, + overrides?: CallOverrides + ): Promise; + isInitiationPublic(overrides?: CallOverrides): Promise; + isProviderPublicKeySet( + _provider: string, + overrides?: CallOverrides + ): Promise; + isRitualFinalized( ritualId: BigNumberish, overrides?: CallOverrides @@ -1805,8 +1861,20 @@ export interface Coordinator extends BaseContract { overrides?: Overrides & { from?: string } ): Promise; + isEncryptionAuthorized( + ritualId: BigNumberish, + evidence: BytesLike, + ciphertextHeader: BytesLike, + overrides?: CallOverrides + ): Promise; + isInitiationPublic(overrides?: CallOverrides): Promise; + isProviderPublicKeySet( + _provider: string, + overrides?: CallOverrides + ): Promise; + isRitualFinalized( ritualId: BigNumberish, overrides?: CallOverrides @@ -2029,10 +2097,22 @@ export interface Coordinator extends BaseContract { overrides?: Overrides & { from?: string } ): Promise; + isEncryptionAuthorized( + ritualId: BigNumberish, + evidence: BytesLike, + ciphertextHeader: BytesLike, + overrides?: CallOverrides + ): Promise; + isInitiationPublic( overrides?: CallOverrides ): Promise; + isProviderPublicKeySet( + _provider: string, + overrides?: CallOverrides + ): Promise; + isRitualFinalized( ritualId: BigNumberish, overrides?: CallOverrides diff --git a/packages/shared/src/contracts/ethers-typechain/factories/Coordinator__factory.ts b/packages/shared/src/contracts/ethers-typechain/factories/Coordinator__factory.ts index 61b0e22fd..2418b17dc 100644 --- a/packages/shared/src/contracts/ethers-typechain/factories/Coordinator__factory.ts +++ b/packages/shared/src/contracts/ethers-typechain/factories/Coordinator__factory.ts @@ -8,1377 +8,1425 @@ import type { Coordinator, CoordinatorInterface } from "../Coordinator"; const _abi = [ { + type: "constructor", + stateMutability: "nonpayable", inputs: [ { - internalType: "contract IAccessControlApplication", - name: "_stakes", + name: "_application", type: "address", + internalType: "contract ITACoChildApplication", }, { - internalType: "uint32", name: "_timeout", type: "uint32", + internalType: "uint32", }, { - internalType: "uint16", name: "_maxDkgSize", type: "uint16", + internalType: "uint16", }, { - internalType: "address", name: "_admin", type: "address", + internalType: "address", }, { - internalType: "contract IERC20", name: "_currency", type: "address", + internalType: "contract IERC20", }, { - internalType: "uint256", name: "_feeRatePerSecond", type: "uint256", + internalType: "uint256", }, ], - stateMutability: "nonpayable", - type: "constructor", }, { - anonymous: false, + type: "event", + name: "AggregationPosted", inputs: [ { - indexed: true, - internalType: "uint32", name: "ritualId", type: "uint32", + internalType: "uint32", + indexed: true, }, { - indexed: true, - internalType: "address", name: "node", type: "address", + internalType: "address", + indexed: true, }, { - indexed: false, - internalType: "bytes32", name: "aggregatedTranscriptDigest", type: "bytes32", + internalType: "bytes32", + indexed: false, }, ], - name: "AggregationPosted", - type: "event", + anonymous: false, }, { - anonymous: false, - inputs: [], - name: "DefaultAdminDelayChangeCanceled", type: "event", + name: "DefaultAdminDelayChangeCanceled", + inputs: [], + anonymous: false, }, { - anonymous: false, + type: "event", + name: "DefaultAdminDelayChangeScheduled", inputs: [ { - indexed: false, - internalType: "uint48", name: "newDelay", type: "uint48", + internalType: "uint48", + indexed: false, }, { - indexed: false, - internalType: "uint48", name: "effectSchedule", type: "uint48", + internalType: "uint48", + indexed: false, }, ], - name: "DefaultAdminDelayChangeScheduled", - type: "event", + anonymous: false, }, { - anonymous: false, - inputs: [], - name: "DefaultAdminTransferCanceled", type: "event", + name: "DefaultAdminTransferCanceled", + inputs: [], + anonymous: false, }, { - anonymous: false, + type: "event", + name: "DefaultAdminTransferScheduled", inputs: [ { - indexed: true, - internalType: "address", name: "newAdmin", type: "address", + internalType: "address", + indexed: true, }, { - indexed: false, - internalType: "uint48", name: "acceptSchedule", type: "uint48", + internalType: "uint48", + indexed: false, }, ], - name: "DefaultAdminTransferScheduled", - type: "event", + anonymous: false, }, { - anonymous: false, + type: "event", + name: "EndRitual", inputs: [ { - indexed: true, - internalType: "uint32", name: "ritualId", type: "uint32", + internalType: "uint32", + indexed: true, }, { - indexed: false, - internalType: "bool", name: "successful", type: "bool", + internalType: "bool", + indexed: false, }, ], - name: "EndRitual", - type: "event", + anonymous: false, }, { - anonymous: false, + type: "event", + name: "MaxDkgSizeChanged", inputs: [ { - indexed: false, - internalType: "uint16", name: "oldSize", type: "uint16", + internalType: "uint16", + indexed: false, }, { - indexed: false, - internalType: "uint16", name: "newSize", type: "uint16", + internalType: "uint16", + indexed: false, }, ], - name: "MaxDkgSizeChanged", - type: "event", + anonymous: false, }, { - anonymous: false, + type: "event", + name: "ParticipantPublicKeySet", inputs: [ { - indexed: true, - internalType: "uint32", name: "ritualId", type: "uint32", + internalType: "uint32", + indexed: true, }, { - indexed: true, - internalType: "address", name: "participant", type: "address", + internalType: "address", + indexed: true, }, { + name: "publicKey", + type: "tuple", components: [ { - internalType: "bytes32", name: "word0", type: "bytes32", + internalType: "bytes32", }, { - internalType: "bytes32", name: "word1", type: "bytes32", + internalType: "bytes32", }, { - internalType: "bytes32", name: "word2", type: "bytes32", + internalType: "bytes32", }, ], - indexed: false, internalType: "struct BLS12381.G2Point", - name: "publicKey", - type: "tuple", + indexed: false, }, ], - name: "ParticipantPublicKeySet", - type: "event", + anonymous: false, }, { - anonymous: false, + type: "event", + name: "RoleAdminChanged", inputs: [ { - indexed: true, - internalType: "bytes32", name: "role", type: "bytes32", + internalType: "bytes32", + indexed: true, }, { - indexed: true, - internalType: "bytes32", name: "previousAdminRole", type: "bytes32", + internalType: "bytes32", + indexed: true, }, { - indexed: true, - internalType: "bytes32", name: "newAdminRole", type: "bytes32", + internalType: "bytes32", + indexed: true, }, ], - name: "RoleAdminChanged", - type: "event", + anonymous: false, }, { - anonymous: false, + type: "event", + name: "RoleGranted", inputs: [ { - indexed: true, - internalType: "bytes32", name: "role", type: "bytes32", + internalType: "bytes32", + indexed: true, }, { - indexed: true, - internalType: "address", name: "account", type: "address", + internalType: "address", + indexed: true, }, { - indexed: true, - internalType: "address", name: "sender", type: "address", + internalType: "address", + indexed: true, }, ], - name: "RoleGranted", - type: "event", + anonymous: false, }, { - anonymous: false, + type: "event", + name: "RoleRevoked", inputs: [ { - indexed: true, - internalType: "bytes32", name: "role", type: "bytes32", + internalType: "bytes32", + indexed: true, }, { - indexed: true, - internalType: "address", name: "account", type: "address", + internalType: "address", + indexed: true, }, { - indexed: true, - internalType: "address", name: "sender", type: "address", + internalType: "address", + indexed: true, }, ], - name: "RoleRevoked", - type: "event", + anonymous: false, }, { - anonymous: false, + type: "event", + name: "StartAggregationRound", inputs: [ { - indexed: true, - internalType: "uint32", name: "ritualId", type: "uint32", + internalType: "uint32", + indexed: true, }, ], - name: "StartAggregationRound", - type: "event", + anonymous: false, }, { - anonymous: false, + type: "event", + name: "StartRitual", inputs: [ { - indexed: true, - internalType: "uint32", name: "ritualId", type: "uint32", + internalType: "uint32", + indexed: true, }, { - indexed: true, - internalType: "address", name: "authority", type: "address", + internalType: "address", + indexed: true, }, { - indexed: false, - internalType: "address[]", name: "participants", type: "address[]", + internalType: "address[]", + indexed: false, }, ], - name: "StartRitual", - type: "event", + anonymous: false, }, { - anonymous: false, + type: "event", + name: "TimeoutChanged", inputs: [ { - indexed: false, - internalType: "uint32", name: "oldTimeout", type: "uint32", + internalType: "uint32", + indexed: false, }, { - indexed: false, - internalType: "uint32", name: "newTimeout", type: "uint32", + internalType: "uint32", + indexed: false, }, ], - name: "TimeoutChanged", - type: "event", + anonymous: false, }, { - anonymous: false, + type: "event", + name: "TranscriptPosted", inputs: [ { - indexed: true, - internalType: "uint32", name: "ritualId", type: "uint32", + internalType: "uint32", + indexed: true, }, { - indexed: true, - internalType: "address", name: "node", type: "address", + internalType: "address", + indexed: true, }, { - indexed: false, - internalType: "bytes32", name: "transcriptDigest", type: "bytes32", + internalType: "bytes32", + indexed: false, }, ], - name: "TranscriptPosted", - type: "event", + anonymous: false, }, { - inputs: [], + type: "function", name: "DEFAULT_ADMIN_ROLE", + stateMutability: "view", + inputs: [], outputs: [ { - internalType: "bytes32", name: "", type: "bytes32", + internalType: "bytes32", }, ], - stateMutability: "view", - type: "function", }, { - inputs: [], + type: "function", name: "INITIATOR_ROLE", + stateMutability: "view", + inputs: [], outputs: [ { - internalType: "bytes32", name: "", type: "bytes32", + internalType: "bytes32", }, ], - stateMutability: "view", - type: "function", }, { - inputs: [], + type: "function", name: "TREASURY_ROLE", + stateMutability: "view", + inputs: [], outputs: [ { - internalType: "bytes32", name: "", type: "bytes32", + internalType: "bytes32", }, ], - stateMutability: "view", - type: "function", }, { - inputs: [], + type: "function", name: "acceptDefaultAdminTransfer", - outputs: [], stateMutability: "nonpayable", - type: "function", + inputs: [], + outputs: [], }, { - inputs: [], + type: "function", name: "application", + stateMutability: "view", + inputs: [], outputs: [ { - internalType: "contract IAccessControlApplication", name: "", type: "address", + internalType: "contract ITACoChildApplication", }, ], - stateMutability: "view", - type: "function", }, { + type: "function", + name: "beginDefaultAdminTransfer", + stateMutability: "nonpayable", inputs: [ { - internalType: "address", name: "newAdmin", type: "address", + internalType: "address", }, ], - name: "beginDefaultAdminTransfer", outputs: [], - stateMutability: "nonpayable", - type: "function", }, { - inputs: [], + type: "function", name: "cancelDefaultAdminTransfer", - outputs: [], stateMutability: "nonpayable", - type: "function", + inputs: [], + outputs: [], }, { + type: "function", + name: "changeDefaultAdminDelay", + stateMutability: "nonpayable", inputs: [ { - internalType: "uint48", name: "newDelay", type: "uint48", + internalType: "uint48", }, ], - name: "changeDefaultAdminDelay", outputs: [], - stateMutability: "nonpayable", - type: "function", }, { + type: "function", + name: "cohortFingerprint", + stateMutability: "pure", inputs: [ { - internalType: "address[]", name: "nodes", type: "address[]", + internalType: "address[]", }, ], - name: "cohortFingerprint", outputs: [ { - internalType: "bytes32", name: "", type: "bytes32", + internalType: "bytes32", }, ], - stateMutability: "pure", - type: "function", }, { - inputs: [], + type: "function", name: "currency", + stateMutability: "view", + inputs: [], outputs: [ { - internalType: "contract IERC20", name: "", type: "address", + internalType: "contract IERC20", }, ], - stateMutability: "view", - type: "function", }, { - inputs: [], + type: "function", name: "defaultAdmin", + stateMutability: "view", + inputs: [], outputs: [ { - internalType: "address", name: "", type: "address", + internalType: "address", }, ], - stateMutability: "view", - type: "function", }, { - inputs: [], + type: "function", name: "defaultAdminDelay", + stateMutability: "view", + inputs: [], outputs: [ { - internalType: "uint48", name: "", type: "uint48", + internalType: "uint48", }, ], - stateMutability: "view", - type: "function", }, { - inputs: [], + type: "function", name: "defaultAdminDelayIncreaseWait", + stateMutability: "view", + inputs: [], outputs: [ { - internalType: "uint48", name: "", type: "uint48", + internalType: "uint48", }, ], - stateMutability: "view", - type: "function", }, { - inputs: [], + type: "function", name: "feeRatePerSecond", + stateMutability: "view", + inputs: [], outputs: [ { - internalType: "uint256", name: "", type: "uint256", + internalType: "uint256", }, ], - stateMutability: "view", - type: "function", }, { + type: "function", + name: "getAuthority", + stateMutability: "view", inputs: [ { - internalType: "uint32", name: "ritualId", type: "uint32", + internalType: "uint32", }, ], - name: "getAuthority", outputs: [ { - internalType: "address", name: "", type: "address", + internalType: "address", }, ], - stateMutability: "view", - type: "function", }, { + type: "function", + name: "getParticipantFromProvider", + stateMutability: "view", inputs: [ { - internalType: "uint32", name: "ritualId", type: "uint32", + internalType: "uint32", }, { - internalType: "address", name: "provider", type: "address", + internalType: "address", }, ], - name: "getParticipantFromProvider", outputs: [ { + name: "", + type: "tuple", components: [ { - internalType: "address", name: "provider", type: "address", + internalType: "address", }, { - internalType: "bool", name: "aggregated", type: "bool", + internalType: "bool", }, { - internalType: "bytes", name: "transcript", type: "bytes", + internalType: "bytes", }, { - internalType: "bytes", name: "decryptionRequestStaticKey", type: "bytes", + internalType: "bytes", }, ], internalType: "struct Coordinator.Participant", - name: "", - type: "tuple", }, ], - stateMutability: "view", - type: "function", }, { + type: "function", + name: "getParticipants", + stateMutability: "view", inputs: [ { - internalType: "uint32", name: "ritualId", type: "uint32", + internalType: "uint32", }, ], - name: "getParticipants", outputs: [ { + name: "", + type: "tuple[]", components: [ { - internalType: "address", name: "provider", type: "address", + internalType: "address", }, { - internalType: "bool", name: "aggregated", type: "bool", + internalType: "bool", }, { - internalType: "bytes", name: "transcript", type: "bytes", + internalType: "bytes", }, { - internalType: "bytes", name: "decryptionRequestStaticKey", type: "bytes", + internalType: "bytes", }, ], internalType: "struct Coordinator.Participant[]", - name: "", - type: "tuple[]", }, ], - stateMutability: "view", - type: "function", }, { + type: "function", + name: "getProviderPublicKey", + stateMutability: "view", inputs: [ { - internalType: "address", name: "_provider", type: "address", + internalType: "address", }, { - internalType: "uint256", name: "_ritualId", type: "uint256", + internalType: "uint256", }, ], - name: "getProviderPublicKey", outputs: [ { + name: "", + type: "tuple", components: [ { - internalType: "bytes32", name: "word0", type: "bytes32", + internalType: "bytes32", }, { - internalType: "bytes32", name: "word1", type: "bytes32", + internalType: "bytes32", }, { - internalType: "bytes32", name: "word2", type: "bytes32", + internalType: "bytes32", }, ], internalType: "struct BLS12381.G2Point", - name: "", - type: "tuple", }, ], - stateMutability: "view", - type: "function", }, { + type: "function", + name: "getPublicKeyFromRitualId", + stateMutability: "view", inputs: [ { - internalType: "uint32", name: "ritualId", type: "uint32", + internalType: "uint32", }, ], - name: "getPublicKeyFromRitualId", outputs: [ { + name: "dkgPublicKey", + type: "tuple", components: [ { - internalType: "bytes32", name: "word0", type: "bytes32", + internalType: "bytes32", }, { - internalType: "bytes16", name: "word1", type: "bytes16", + internalType: "bytes16", }, ], internalType: "struct BLS12381.G1Point", - name: "dkgPublicKey", - type: "tuple", }, ], - stateMutability: "view", - type: "function", }, { + type: "function", + name: "getRitualIdFromPublicKey", + stateMutability: "view", inputs: [ { + name: "dkgPublicKey", + type: "tuple", components: [ { - internalType: "bytes32", name: "word0", type: "bytes32", + internalType: "bytes32", }, { - internalType: "bytes16", name: "word1", type: "bytes16", + internalType: "bytes16", }, ], internalType: "struct BLS12381.G1Point", - name: "dkgPublicKey", - type: "tuple", }, ], - name: "getRitualIdFromPublicKey", outputs: [ { - internalType: "uint32", name: "ritualId", type: "uint32", + internalType: "uint32", }, ], - stateMutability: "view", - type: "function", }, { + type: "function", + name: "getRitualInitiationCost", + stateMutability: "view", inputs: [ { - internalType: "address[]", name: "providers", type: "address[]", + internalType: "address[]", }, { - internalType: "uint32", name: "duration", type: "uint32", + internalType: "uint32", }, ], - name: "getRitualInitiationCost", outputs: [ { - internalType: "uint256", name: "", type: "uint256", + internalType: "uint256", }, ], - stateMutability: "view", - type: "function", }, { + type: "function", + name: "getRitualState", + stateMutability: "view", inputs: [ { - internalType: "uint32", name: "ritualId", type: "uint32", + internalType: "uint32", }, ], - name: "getRitualState", outputs: [ { - internalType: "enum Coordinator.RitualState", name: "", type: "uint8", + internalType: "enum Coordinator.RitualState", }, ], - stateMutability: "view", - type: "function", }, { + type: "function", + name: "getRoleAdmin", + stateMutability: "view", inputs: [ { - internalType: "bytes32", name: "role", type: "bytes32", + internalType: "bytes32", }, ], - name: "getRoleAdmin", outputs: [ { - internalType: "bytes32", name: "", type: "bytes32", + internalType: "bytes32", }, ], - stateMutability: "view", - type: "function", }, { + type: "function", + name: "getThresholdForRitualSize", + stateMutability: "pure", inputs: [ { - internalType: "uint16", name: "size", type: "uint16", + internalType: "uint16", }, ], - name: "getThresholdForRitualSize", outputs: [ { - internalType: "uint16", name: "", type: "uint16", + internalType: "uint16", }, ], - stateMutability: "pure", - type: "function", }, { + type: "function", + name: "grantRole", + stateMutability: "nonpayable", inputs: [ { - internalType: "bytes32", name: "role", type: "bytes32", + internalType: "bytes32", }, { - internalType: "address", name: "account", type: "address", + internalType: "address", }, ], - name: "grantRole", outputs: [], - stateMutability: "nonpayable", - type: "function", }, { + type: "function", + name: "hasRole", + stateMutability: "view", inputs: [ { - internalType: "bytes32", name: "role", type: "bytes32", + internalType: "bytes32", }, { - internalType: "address", name: "account", type: "address", + internalType: "address", }, ], - name: "hasRole", outputs: [ { - internalType: "bool", name: "", type: "bool", + internalType: "bool", }, ], - stateMutability: "view", - type: "function", }, { + type: "function", + name: "initiateRitual", + stateMutability: "nonpayable", inputs: [ { - internalType: "address[]", name: "providers", type: "address[]", + internalType: "address[]", }, { - internalType: "address", name: "authority", type: "address", + internalType: "address", }, { - internalType: "uint32", name: "duration", type: "uint32", + internalType: "uint32", }, { - internalType: "contract IEncryptionAuthorizer", name: "accessController", type: "address", + internalType: "contract IEncryptionAuthorizer", }, ], - name: "initiateRitual", outputs: [ { - internalType: "uint32", name: "", type: "uint32", + internalType: "uint32", }, ], - stateMutability: "nonpayable", + }, + { type: "function", + name: "isEncryptionAuthorized", + stateMutability: "view", + inputs: [ + { + name: "ritualId", + type: "uint32", + internalType: "uint32", + }, + { + name: "evidence", + type: "bytes", + internalType: "bytes", + }, + { + name: "ciphertextHeader", + type: "bytes", + internalType: "bytes", + }, + ], + outputs: [ + { + name: "", + type: "bool", + internalType: "bool", + }, + ], }, { - inputs: [], + type: "function", name: "isInitiationPublic", + stateMutability: "view", + inputs: [], outputs: [ { - internalType: "bool", name: "", type: "bool", + internalType: "bool", }, ], - stateMutability: "view", + }, + { type: "function", + name: "isProviderPublicKeySet", + stateMutability: "view", + inputs: [ + { + name: "_provider", + type: "address", + internalType: "address", + }, + ], + outputs: [ + { + name: "", + type: "bool", + internalType: "bool", + }, + ], }, { + type: "function", + name: "isRitualFinalized", + stateMutability: "view", inputs: [ { - internalType: "uint32", name: "ritualId", type: "uint32", + internalType: "uint32", }, ], - name: "isRitualFinalized", outputs: [ { - internalType: "bool", name: "", type: "bool", + internalType: "bool", }, ], - stateMutability: "view", - type: "function", }, { - inputs: [], + type: "function", name: "makeInitiationPublic", - outputs: [], stateMutability: "nonpayable", - type: "function", + inputs: [], + outputs: [], }, { - inputs: [], + type: "function", name: "maxDkgSize", + stateMutability: "view", + inputs: [], outputs: [ { - internalType: "uint16", name: "", type: "uint16", + internalType: "uint16", }, ], - stateMutability: "view", - type: "function", }, { - inputs: [], + type: "function", name: "numberOfRituals", + stateMutability: "view", + inputs: [], outputs: [ { - internalType: "uint256", name: "", type: "uint256", + internalType: "uint256", }, ], - stateMutability: "view", - type: "function", }, { - inputs: [], + type: "function", name: "owner", + stateMutability: "view", + inputs: [], outputs: [ { - internalType: "address", name: "", type: "address", + internalType: "address", }, ], - stateMutability: "view", - type: "function", }, { - inputs: [], + type: "function", name: "pendingDefaultAdmin", + stateMutability: "view", + inputs: [], outputs: [ { - internalType: "address", name: "newAdmin", type: "address", + internalType: "address", }, { - internalType: "uint48", name: "schedule", type: "uint48", + internalType: "uint48", }, ], - stateMutability: "view", - type: "function", }, { - inputs: [], + type: "function", name: "pendingDefaultAdminDelay", + stateMutability: "view", + inputs: [], outputs: [ { - internalType: "uint48", name: "newDelay", type: "uint48", + internalType: "uint48", }, { - internalType: "uint48", name: "schedule", type: "uint48", + internalType: "uint48", }, ], - stateMutability: "view", - type: "function", }, { + type: "function", + name: "pendingFees", + stateMutability: "view", inputs: [ { - internalType: "uint256", name: "", type: "uint256", + internalType: "uint256", }, ], - name: "pendingFees", outputs: [ { - internalType: "uint256", name: "", type: "uint256", + internalType: "uint256", }, ], - stateMutability: "view", - type: "function", }, { + type: "function", + name: "postAggregation", + stateMutability: "nonpayable", inputs: [ { - internalType: "uint32", name: "ritualId", type: "uint32", + internalType: "uint32", }, { - internalType: "bytes", name: "aggregatedTranscript", type: "bytes", + internalType: "bytes", }, { + name: "dkgPublicKey", + type: "tuple", components: [ { - internalType: "bytes32", name: "word0", type: "bytes32", + internalType: "bytes32", }, { - internalType: "bytes16", name: "word1", type: "bytes16", + internalType: "bytes16", }, ], internalType: "struct BLS12381.G1Point", - name: "dkgPublicKey", - type: "tuple", }, { - internalType: "bytes", name: "decryptionRequestStaticKey", type: "bytes", + internalType: "bytes", }, ], - name: "postAggregation", outputs: [], - stateMutability: "nonpayable", - type: "function", }, { + type: "function", + name: "postTranscript", + stateMutability: "nonpayable", inputs: [ { - internalType: "uint32", name: "ritualId", type: "uint32", + internalType: "uint32", }, { - internalType: "bytes", name: "transcript", type: "bytes", + internalType: "bytes", }, ], - name: "postTranscript", outputs: [], - stateMutability: "nonpayable", - type: "function", }, { + type: "function", + name: "processPendingFee", + stateMutability: "nonpayable", inputs: [ { - internalType: "uint32", name: "ritualId", type: "uint32", + internalType: "uint32", }, ], - name: "processPendingFee", outputs: [], - stateMutability: "nonpayable", - type: "function", }, { + type: "function", + name: "renounceRole", + stateMutability: "nonpayable", inputs: [ { - internalType: "bytes32", name: "role", type: "bytes32", + internalType: "bytes32", }, { - internalType: "address", name: "account", type: "address", + internalType: "address", }, ], - name: "renounceRole", outputs: [], - stateMutability: "nonpayable", - type: "function", }, { + type: "function", + name: "revokeRole", + stateMutability: "nonpayable", inputs: [ { - internalType: "bytes32", name: "role", type: "bytes32", + internalType: "bytes32", }, { - internalType: "address", name: "account", type: "address", + internalType: "address", }, ], - name: "revokeRole", outputs: [], - stateMutability: "nonpayable", - type: "function", }, { + type: "function", + name: "rituals", + stateMutability: "view", inputs: [ { - internalType: "uint256", name: "", type: "uint256", + internalType: "uint256", }, ], - name: "rituals", outputs: [ { - internalType: "address", name: "initiator", type: "address", + internalType: "address", }, { - internalType: "uint32", name: "initTimestamp", type: "uint32", + internalType: "uint32", }, { - internalType: "uint32", name: "endTimestamp", type: "uint32", + internalType: "uint32", }, { - internalType: "uint16", name: "totalTranscripts", type: "uint16", + internalType: "uint16", }, { - internalType: "uint16", name: "totalAggregations", type: "uint16", + internalType: "uint16", }, { - internalType: "address", name: "authority", type: "address", + internalType: "address", }, { - internalType: "uint16", name: "dkgSize", type: "uint16", + internalType: "uint16", }, { - internalType: "uint16", name: "threshold", type: "uint16", + internalType: "uint16", }, { - internalType: "bool", name: "aggregationMismatch", type: "bool", + internalType: "bool", }, { - internalType: "contract IEncryptionAuthorizer", name: "accessController", type: "address", + internalType: "contract IEncryptionAuthorizer", }, { + name: "publicKey", + type: "tuple", components: [ { - internalType: "bytes32", name: "word0", type: "bytes32", + internalType: "bytes32", }, { - internalType: "bytes16", name: "word1", type: "bytes16", + internalType: "bytes16", }, ], internalType: "struct BLS12381.G1Point", - name: "publicKey", - type: "tuple", }, { - internalType: "bytes", name: "aggregatedTranscript", type: "bytes", + internalType: "bytes", }, ], - stateMutability: "view", - type: "function", }, { - inputs: [], + type: "function", name: "rollbackDefaultAdminDelay", - outputs: [], stateMutability: "nonpayable", - type: "function", + inputs: [], + outputs: [], }, { + type: "function", + name: "setMaxDkgSize", + stateMutability: "nonpayable", inputs: [ { - internalType: "uint16", name: "newSize", type: "uint16", + internalType: "uint16", }, ], - name: "setMaxDkgSize", outputs: [], - stateMutability: "nonpayable", - type: "function", }, { + type: "function", + name: "setProviderPublicKey", + stateMutability: "nonpayable", inputs: [ { + name: "_publicKey", + type: "tuple", components: [ { - internalType: "bytes32", name: "word0", type: "bytes32", + internalType: "bytes32", }, { - internalType: "bytes32", name: "word1", type: "bytes32", + internalType: "bytes32", }, { - internalType: "bytes32", name: "word2", type: "bytes32", + internalType: "bytes32", }, ], internalType: "struct BLS12381.G2Point", - name: "_publicKey", - type: "tuple", }, ], - name: "setProviderPublicKey", outputs: [], - stateMutability: "nonpayable", - type: "function", }, { + type: "function", + name: "setReimbursementPool", + stateMutability: "nonpayable", inputs: [ { - internalType: "contract IReimbursementPool", name: "pool", type: "address", + internalType: "contract IReimbursementPool", }, ], - name: "setReimbursementPool", outputs: [], - stateMutability: "nonpayable", - type: "function", }, { + type: "function", + name: "setRitualAuthority", + stateMutability: "nonpayable", inputs: [ { - internalType: "uint32", name: "ritualId", type: "uint32", + internalType: "uint32", }, { - internalType: "address", name: "authority", type: "address", + internalType: "address", }, ], - name: "setRitualAuthority", outputs: [], - stateMutability: "nonpayable", - type: "function", }, { + type: "function", + name: "setTimeout", + stateMutability: "nonpayable", inputs: [ { - internalType: "uint32", name: "newTimeout", type: "uint32", + internalType: "uint32", }, ], - name: "setTimeout", outputs: [], - stateMutability: "nonpayable", - type: "function", }, { + type: "function", + name: "supportsInterface", + stateMutability: "view", inputs: [ { - internalType: "bytes4", name: "interfaceId", type: "bytes4", + internalType: "bytes4", }, ], - name: "supportsInterface", outputs: [ { - internalType: "bool", name: "", type: "bool", + internalType: "bool", }, ], - stateMutability: "view", - type: "function", }, { - inputs: [], + type: "function", name: "timeout", + stateMutability: "view", + inputs: [], outputs: [ { - internalType: "uint32", name: "", type: "uint32", + internalType: "uint32", }, ], - stateMutability: "view", - type: "function", }, { - inputs: [], + type: "function", name: "totalPendingFees", + stateMutability: "view", + inputs: [], outputs: [ { - internalType: "uint256", name: "", type: "uint256", + internalType: "uint256", }, ], - stateMutability: "view", - type: "function", }, { + type: "function", + name: "withdrawTokens", + stateMutability: "nonpayable", inputs: [ { - internalType: "contract IERC20", name: "token", type: "address", + internalType: "contract IERC20", }, { - internalType: "uint256", name: "amount", type: "uint256", + internalType: "uint256", }, ], - name: "withdrawTokens", outputs: [], - stateMutability: "nonpayable", - type: "function", }, ] as const; diff --git a/packages/shared/src/contracts/registry.ts b/packages/shared/src/contracts/registry.ts index ef3706d2f..d15ffc23e 100644 --- a/packages/shared/src/contracts/registry.ts +++ b/packages/shared/src/contracts/registry.ts @@ -13,7 +13,7 @@ const POLYGON: Contracts = { const MUMBAI: Contracts = { SUBSCRIPTION_MANAGER: '0xb9015d7b35ce7c81dde38ef7136baa3b1044f313', - COORDINATOR: '0x0f019Ade1D34399D946CF2f161386362655Dd1A4', + COORDINATOR: '0x8E49989F9D3aD89c8ab0de21FbA2E00C67ca872F', }; const GOERLI: Contracts = { diff --git a/packages/shared/src/index.ts b/packages/shared/src/index.ts index 6013ef5c8..800d2ac5e 100644 --- a/packages/shared/src/index.ts +++ b/packages/shared/src/index.ts @@ -1,23 +1,9 @@ -export * from './characters'; -export * from './cohort'; -export * from './conditions'; export * from './contracts'; -export * from './dkg'; -export * from './keyring'; -export * from './kits'; -export * from './policy'; export * from './porter'; -export * from './strategy'; export * from './types'; export * from './utils'; export * from './web3'; -// Forming modules for convenience -// TODO: Should we structure shared exports like this? -import * as conditions from './conditions'; - -export { conditions }; - // Re-exports export { Ciphertext, diff --git a/packages/shared/src/strategy/cbd-strategy.ts b/packages/shared/src/strategy/cbd-strategy.ts deleted file mode 100644 index a13bb85d8..000000000 --- a/packages/shared/src/strategy/cbd-strategy.ts +++ /dev/null @@ -1,132 +0,0 @@ -import { DkgPublicKey } from '@nucypher/nucypher-core'; -import { ethers } from 'ethers'; - -import { - ThresholdDecrypter, - ThresholdDecrypterJSON, -} from '../characters/cbd-recipient'; -import { Enrico } from '../characters/enrico'; -import { Cohort, CohortJSON } from '../cohort'; -import { ConditionExpression, ConditionExpressionJSON } from '../conditions'; -import { DkgClient, DkgRitual } from '../dkg'; -import { fromJSON, toJSON } from '../utils'; - -export type CbdStrategyJSON = { - cohort: CohortJSON; - conditionExpr?: ConditionExpressionJSON | undefined; -}; - -export type DeployedStrategyJSON = { - decrypter: ThresholdDecrypterJSON; - dkgPublicKey: Uint8Array; -}; - -export class CbdStrategy { - private constructor(public readonly cohort: Cohort) {} - - public static create(cohort: Cohort) { - return new CbdStrategy(cohort); - } - - public async deploy( - provider: ethers.providers.Provider, - ritualId: number, - ): Promise { - // TODO(#264): Enable ritual initialization - // if (ritualId === undefined) { - // ritualId = await DkgClient.initializeRitual( - // provider, - // this.cohort.ursulaAddresses, - // true - // ); - // } - // if (ritualId === undefined) { - // // Given that we just initialized the ritual, this should never happen - // throw new Error('Ritual ID is undefined'); - // } - const dkgRitual = await DkgClient.getRitual(provider, ritualId); - return DeployedCbdStrategy.create(dkgRitual, this.cohort.porterUri); - } - - public static fromJSON(json: string) { - return CbdStrategy.fromObj(fromJSON(json)); - } - - public toJSON() { - return toJSON(this.toObj()); - } - - public static fromObj({ cohort }: CbdStrategyJSON) { - return new CbdStrategy(Cohort.fromObj(cohort)); - } - - public toObj(): CbdStrategyJSON { - return { - cohort: this.cohort.toObj(), - }; - } - - public equals(other: CbdStrategy) { - return this.cohort.equals(other.cohort); - } -} - -export class DeployedCbdStrategy { - private constructor( - public readonly decrypter: ThresholdDecrypter, - public readonly dkgPublicKey: DkgPublicKey, - ) {} - - public static create(dkgRitual: DkgRitual, porterUri: string) { - const decrypter = ThresholdDecrypter.create( - porterUri, - dkgRitual.id, - dkgRitual.threshold, - ); - return new DeployedCbdStrategy(decrypter, dkgRitual.dkgPublicKey); - } - - // TODO: This is analogous to create() above, is it useful? - public static async fromRitualId( - provider: ethers.providers.Provider, - porterUri: string, - ritualId: number, - ): Promise { - const dkgRitual = await DkgClient.getRitual(provider, ritualId); - return DeployedCbdStrategy.create(dkgRitual, porterUri); - } - - public makeEncrypter(conditionExpr: ConditionExpression): Enrico { - return new Enrico(this.dkgPublicKey, undefined, conditionExpr); - } - - public static fromJSON(json: string) { - const config = fromJSON(json); - return DeployedCbdStrategy.fromObj(config); - } - - public toJSON() { - return toJSON(this.toObj()); - } - - private static fromObj({ decrypter, dkgPublicKey }: DeployedStrategyJSON) { - return new DeployedCbdStrategy( - ThresholdDecrypter.fromObj(decrypter), - DkgPublicKey.fromBytes(dkgPublicKey), - ); - } - - public toObj(): DeployedStrategyJSON { - return { - decrypter: this.decrypter.toObj(), - dkgPublicKey: this.dkgPublicKey.toBytes(), - }; - } - - public equals(other: DeployedCbdStrategy) { - return [ - this.decrypter.equals(other.decrypter), - this.dkgPublicKey.equals(other.dkgPublicKey), - ].every(Boolean); - } -} diff --git a/packages/shared/src/strategy/index.ts b/packages/shared/src/strategy/index.ts deleted file mode 100644 index 7f2257e4e..000000000 --- a/packages/shared/src/strategy/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './cbd-strategy'; -export * from './pre-strategy'; diff --git a/packages/shared/src/strategy/pre-strategy.ts b/packages/shared/src/strategy/pre-strategy.ts deleted file mode 100644 index e0a2f9953..000000000 --- a/packages/shared/src/strategy/pre-strategy.ts +++ /dev/null @@ -1,210 +0,0 @@ -import { PublicKey, SecretKey } from '@nucypher/nucypher-core'; -import { ethers } from 'ethers'; - -import { - Alice, - Bob, - Enrico, - PreDecrypter, - PreDecrypterJSON, -} from '../characters'; -import { Cohort, CohortJSON } from '../cohort'; -import { ConditionExpression } from '../conditions'; -import { EnactedPolicy } from '../policy'; -import { base64ToU8Receiver, toJSON } from '../utils'; - -export type PreStrategyJSON = { - cohort: CohortJSON; - aliceSecretKeyBytes: Uint8Array; - bobSecretKeyBytes: Uint8Array; - startDate: Date; - endDate: Date; -}; - -export type DeployedPreStrategyJSON = { - cohortConfig: CohortJSON; - decrypterJSON: PreDecrypterJSON; - policyKeyBytes: Uint8Array; -}; - -export class PreStrategy { - private constructor( - public readonly cohort: Cohort, - private readonly aliceSecretKey: SecretKey, - private readonly bobSecretKey: SecretKey, - private readonly startDate: Date, - private readonly endDate: Date, - ) {} - - public static create( - cohort: Cohort, - aliceSecretKey?: SecretKey, - bobSecretKey?: SecretKey, - startDate?: Date, - endDate?: Date, - ) { - if (!aliceSecretKey) { - aliceSecretKey = SecretKey.random(); - } - if (!bobSecretKey) { - bobSecretKey = SecretKey.random(); - } - if (!startDate) { - startDate = new Date(Date.now()); - } - if (!endDate) { - endDate = new Date(Date.now() + 1000 * 60 * 60 * 24 * 30); - } - return new PreStrategy( - cohort, - aliceSecretKey, - bobSecretKey, - startDate, - endDate, - ); - } - - public async deploy( - provider: ethers.providers.Provider, - signer: ethers.Signer, - label: string, - threshold = Math.floor(this.cohort.numUrsulas / 2) + 1, - shares = this.cohort.numUrsulas, - ): Promise { - if (shares > this.cohort.numUrsulas) { - throw new Error( - `Threshold ${threshold} cannot be greater than the number of Ursulas in the cohort ${this.cohort.numUrsulas}`, - ); - } - - const porterUri = this.cohort.porterUri; - const alice = Alice.fromSecretKey(this.aliceSecretKey); - const bob = new Bob(this.bobSecretKey); - const policyParams = { - bob, - label, - threshold, - shares, - startDate: this.startDate, - endDate: this.endDate, - }; - const policy = await alice.grant( - provider, - signer, - porterUri, - policyParams, - this.cohort.ursulaAddresses, - ); - return DeployedPreStrategy.create(this.cohort, policy, this.bobSecretKey); - } - - public static fromJSON(json: string) { - const config = JSON.parse(json, base64ToU8Receiver); - config.startDate = new Date(config.startDate); - config.endDate = new Date(config.endDate); - return PreStrategy.fromObj(config); - } - - public toJSON() { - return toJSON(this.toObj()); - } - - public static fromObj({ - cohort, - aliceSecretKeyBytes, - bobSecretKeyBytes, - startDate, - endDate, - }: PreStrategyJSON) { - return new PreStrategy( - Cohort.fromObj(cohort), - SecretKey.fromBEBytes(aliceSecretKeyBytes), - SecretKey.fromBEBytes(bobSecretKeyBytes), - new Date(startDate), - new Date(endDate), - ); - } - - public toObj(): PreStrategyJSON { - return { - cohort: this.cohort.toObj(), - aliceSecretKeyBytes: this.aliceSecretKey.toBEBytes(), - bobSecretKeyBytes: this.bobSecretKey.toBEBytes(), - startDate: this.startDate, - endDate: this.endDate, - }; - } - - public equals(other: PreStrategy) { - return [ - this.cohort.equals(other.cohort), - this.aliceSecretKey.equals(other.aliceSecretKey), - this.bobSecretKey.equals(other.bobSecretKey), - this.startDate.toString() === other.startDate.toString(), - this.endDate.toString() === other.endDate.toString(), - ].every(Boolean); - } -} - -export class DeployedPreStrategy { - private constructor( - public readonly cohort: Cohort, - public readonly decrypter: PreDecrypter, - public readonly policyKey: PublicKey, - ) {} - - public static create( - cohort: Cohort, - policy: EnactedPolicy, - bobSecretKey: SecretKey, - ) { - const decrypter = PreDecrypter.create( - cohort.porterUri, - bobSecretKey, - policy.policyKey, - policy.aliceVerifyingKey, - policy.encryptedTreasureMap, - ); - return new DeployedPreStrategy(cohort, decrypter, policy.policyKey); - } - - public makeEncrypter(conditionExpr: ConditionExpression): Enrico { - return new Enrico(this.policyKey, undefined, conditionExpr); - } - - public static fromJSON(json: string) { - const config = JSON.parse(json, base64ToU8Receiver); - return DeployedPreStrategy.fromObj(config); - } - - public toJSON() { - return toJSON(this.toObj()); - } - - public static fromObj({ - cohortConfig, - decrypterJSON, - policyKeyBytes, - }: DeployedPreStrategyJSON) { - const cohort = Cohort.fromObj(cohortConfig); - const decrypter = PreDecrypter.fromObj(decrypterJSON); - const policyKey = PublicKey.fromCompressedBytes(policyKeyBytes); - return new DeployedPreStrategy(cohort, decrypter, policyKey); - } - - public toObj(): DeployedPreStrategyJSON { - return { - cohortConfig: this.cohort.toObj(), - decrypterJSON: this.decrypter.toObj(), - policyKeyBytes: this.policyKey.toCompressedBytes(), - }; - } - - public equals(other: DeployedPreStrategy) { - return [ - this.cohort.equals(other.cohort), - this.decrypter.equals(other.decrypter), - this.policyKey.equals(other.policyKey), - ].every(Boolean); - } -} diff --git a/packages/shared/src/utils.ts b/packages/shared/src/utils.ts index 01dcd7ef6..918fc11e0 100644 --- a/packages/shared/src/utils.ts +++ b/packages/shared/src/utils.ts @@ -4,6 +4,9 @@ import deepEqual from 'deep-equal'; export const toBytes = (str: string): Uint8Array => new TextEncoder().encode(str); +export const fromBytes = (bytes: Uint8Array): string => + new TextDecoder().decode(bytes); + export const fromHexString = (hexString: string): Uint8Array => { if (hexString.startsWith('0x')) { hexString = hexString.slice(2); @@ -16,10 +19,10 @@ export const toHexString = (bytes: Uint8Array): string => bytes.reduce((str, byte) => str + byte.toString(16).padStart(2, '0'), ''); export const toBase64 = (bytes: Uint8Array): string => - Buffer.from(bytes).toString('base64'); + btoa(String.fromCharCode(...bytes)); export const fromBase64 = (str: string): Uint8Array => - Buffer.from(str, 'base64'); + Uint8Array.from(atob(str), (c) => c.charCodeAt(0)); export const base64ToU8Receiver = (_key: string, value: unknown) => { if (typeof value === 'string' && value.startsWith('base64:')) { diff --git a/packages/shared/src/web3.ts b/packages/shared/src/web3.ts index a55508f8f..c4bdcee12 100644 --- a/packages/shared/src/web3.ts +++ b/packages/shared/src/web3.ts @@ -8,35 +8,9 @@ export enum ChainId { } export const toCanonicalAddress = (address: string): Uint8Array => { - const ETH_ADDRESS_STRING_PREFIX = '0x'; - const nonPrefixed = address.startsWith(ETH_ADDRESS_STRING_PREFIX) - ? address.substring(ETH_ADDRESS_STRING_PREFIX.length) + const ethAddressStringPrefix = '0x'; + const nonPrefixed = address.startsWith(ethAddressStringPrefix) + ? address.substring(ethAddressStringPrefix.length) : address; return fromHexString(nonPrefixed); }; - -export interface Eip712TypedData { - types: { - Wallet: { name: string; type: string }[]; - }; - domain: { - salt: string; - chainId: number; - name: string; - version: string; - }; - message: { - blockHash: string; - address: string; - blockNumber: number; - signatureText: string; - }; -} - -export interface FormattedTypedData extends Eip712TypedData { - primaryType: 'Wallet'; - types: { - EIP712Domain: { name: string; type: string }[]; - Wallet: { name: string; type: string }[]; - }; -} diff --git a/packages/shared/test/docs/cbd.test.ts b/packages/shared/test/docs/cbd.test.ts deleted file mode 100644 index 6e7a078e2..000000000 --- a/packages/shared/test/docs/cbd.test.ts +++ /dev/null @@ -1,149 +0,0 @@ -import { - fakeProvider, - fakeUrsulas, - mockDetectEthereumProvider, - mockEncryptTreasureMap, - mockGenerateKFrags, - mockGetUrsulas, - mockMakeTreasureMap, - mockPublishToBlockchain, - mockRetrieveCFragsRequest, -} from '@nucypher/test-utils'; -import { providers } from 'ethers'; -import { expect, SpyInstance, test, vi } from 'vitest'; - -import { - Cohort, - ConditionExpression, - ContractCondition, - ContractConditionProps, - ERC721Ownership, - getPorterUri, - initialize, - MessageKit, - PreStrategy, - SecretKey, - toBytes, - Ursula, - VerifiedKeyFrag -} from '../../src'; - -// TODO: move to packages/taco - -test('Get Started (CBD PoC)', () => { - function mockRetrieveAndDecrypt( - makeTreasureMapSpy: SpyInstance, - encryptedMessageKit: MessageKit, - ) { - // Setup mocks for `retrieveAndDecrypt` - const ursulaAddresses = ( - makeTreasureMapSpy.mock.calls[0][0] as readonly Ursula[] - ).map((u) => u.checksumAddress); - const verifiedKFrags = makeTreasureMapSpy.mock - .calls[0][1] as readonly VerifiedKeyFrag[]; - return mockRetrieveCFragsRequest( - ursulaAddresses, - verifiedKFrags, - encryptedMessageKit.capsule, - ); - } - - test('can run the get started example', async () => { - const detectEthereumProvider = mockDetectEthereumProvider(); - const mockedUrsulas = fakeUrsulas(); - const getUrsulasSpy = mockGetUrsulas(mockedUrsulas); - const generateKFragsSpy = mockGenerateKFrags(); - const publishToBlockchainSpy = mockPublishToBlockchain(); - const makeTreasureMapSpy = mockMakeTreasureMap(); - const encryptTreasureMapSpy = mockEncryptTreasureMap(); - - vi.spyOn(providers, 'Web3Provider').mockImplementation(() => - fakeProvider(SecretKey.random().toBEBytes()), - ); - - await initialize(); - - // - // Start of the code example - // - - // 2. Build a Cohort - const porterUri = getPorterUri('tapir'); - const numUrsulas = 5; - const newCohort = await Cohort.create(porterUri, numUrsulas); - - // 3. Specify default conditions - const NFTOwnership = new ERC721Ownership({ - contractAddress: '0xBC4CA0EdA7647A8aB7C2061c2E118A18a936f13D', - chain: 5, // Tapir network uses Görli testnet - parameters: [5954], - }); - - const conditions = new ConditionExpression( - NFTOwnership, - // Other conditions can be added here - ); - - // 4. Build a Strategy - const newStrategy = PreStrategy.create(newCohort); - - const MMprovider = await detectEthereumProvider(); - const mumbai = providers.getNetwork(80001); - - const provider = new providers.Web3Provider(MMprovider, mumbai); - const signer = provider.getSigner(); - const newDeployed = await newStrategy.deploy(provider, signer, 'test'); - - // 5. Encrypt the plaintext & update conditions - const NFTBalanceConfig: ContractConditionProps = { - conditionType: 'contract', - contractAddress: '0xBC4CA0EdA7647A8aB7C2061c2E118A18a936f13D', - standardContractType: 'ERC721', - chain: 5, - method: 'balanceOf', - parameters: [':userAddress'], - returnValueTest: { - comparator: '>=', - value: 3, - }, - }; - const NFTBalance = new ContractCondition(NFTBalanceConfig); - const newConditions = new ConditionExpression(NFTBalance); - const plaintext = 'this is a secret'; - const encrypter = newDeployed.makeEncrypter(newConditions); - const encryptedMessageKit = encrypter.encryptMessagePre(plaintext); - - // Mocking - Not a part of any code example - const retrieveCFragsSpy = mockRetrieveAndDecrypt( - makeTreasureMapSpy, - encryptedMessageKit, - ); - - // 6. Request decryption rights - const decryptedMessage = await newDeployed.decrypter.retrieveAndDecrypt( - provider, - signer, - [encryptedMessageKit], - ); - - // - // End of the code example - // - - const expectedAddresses = fakeUrsulas().map((u) => u.checksumAddress); - const condObj = conditions.condition.toObj(); - expect(newCohort.ursulaAddresses).toEqual(expectedAddresses); - expect(condObj.parameters).toEqual([5954]); - expect(condObj.chain).toEqual(5); - expect(condObj.contractAddress).toEqual( - '0xBC4CA0EdA7647A8aB7C2061c2E118A18a936f13D', - ); - expect(publishToBlockchainSpy).toHaveBeenCalled(); - expect(getUrsulasSpy).toHaveBeenCalledTimes(2); - expect(generateKFragsSpy).toHaveBeenCalled(); - expect(encryptTreasureMapSpy).toHaveBeenCalled(); - expect(makeTreasureMapSpy).toHaveBeenCalled(); - expect(retrieveCFragsSpy).toHaveBeenCalled(); - expect(decryptedMessage[0]).toEqual(toBytes(plaintext)); - }); -}); diff --git a/packages/shared/test/integration/dkg-client.test.ts b/packages/shared/test/integration/dkg-client.test.ts deleted file mode 100644 index bc86815bd..000000000 --- a/packages/shared/test/integration/dkg-client.test.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { - fakeProvider, - mockCoordinatorRitual, - mockDkgParticipants, - mockGetParticipants, - mockRitualId, -} from '@nucypher/test-utils'; -import { afterEach, expect, test, vi } from 'vitest'; - -import { DkgCoordinatorAgent, SecretKey } from '../../src'; - -vi.mock('../../src/contracts/agents/coordinator', () => ({ - DkgCoordinatorAgent: { - getRitual: () => Promise.resolve(mockCoordinatorRitual(mockRitualId)), - getParticipants: () => Promise.resolve(mockDkgParticipants(mockRitualId)), - }, -})); - -test('DkgCoordinatorAgent', () => { - afterEach(() => { - vi.restoreAllMocks(); - }); - - test('fetches transcripts from the coordinator', async () => { - const provider = fakeProvider(SecretKey.random().toBEBytes()); - const ritual = await DkgCoordinatorAgent.getRitual(provider, mockRitualId); - expect(ritual).toBeDefined(); - }); - - test('fetches participants from the coordinator', async () => { - const provider = fakeProvider(SecretKey.random().toBEBytes()); - const fakeParticipants = await mockDkgParticipants(mockRitualId); - const getParticipantsSpy = mockGetParticipants( - fakeParticipants.participants, - ); - const participants = await DkgCoordinatorAgent.getParticipants( - provider, - mockRitualId, - ); - expect(getParticipantsSpy).toHaveBeenCalled(); - expect(participants.length).toBeGreaterThan(0); - }); -}); - -// TODO: Fix this test after the DkgClient.verifyRitual() method is implemented -// test('DkgClient', () => { -// test('verifies the dkg ritual', async () => { -// const provider = fakeWeb3Provider(SecretKey.random().toBEBytes()); -// -// const dkgClient = new DkgClient(provider); -// const isValid = await dkgClient.verifyRitual(fakeRitualId); -// expect(isValid).toBeTruthy(); -// }); -// }); diff --git a/packages/shared/test/integration/enrico.test.ts b/packages/shared/test/integration/enrico.test.ts deleted file mode 100644 index 96487cb2e..000000000 --- a/packages/shared/test/integration/enrico.test.ts +++ /dev/null @@ -1,154 +0,0 @@ -// Disabling because we want to access Alice.keyring which is a private property -/* eslint-disable @typescript-eslint/no-explicit-any */ -import { - bytesEqual, - fakeAlice, - fakeBob, - fromBytes, - reencryptKFrags, -} from '@nucypher/test-utils'; -import { expect, test } from 'vitest'; - -import { - ConditionExpression, - Enrico, - ERC721Ownership, - PolicyMessageKit, - RetrievalResult, - toBytes, -} from '../../src'; - -test('enrico', () => { - test('alice decrypts message encrypted by enrico', async () => { - const label = 'fake-label'; - const message = 'fake-message'; - const alice = fakeAlice(); - - const policyKey = alice.getPolicyEncryptingKeyFromLabel(label); - const enrico = new Enrico(policyKey); - const encrypted = enrico.encryptMessagePre(toBytes(message)); - - const aliceKeyring = (alice as any).keyring; - const aliceSk = await aliceKeyring.getSecretKeyFromLabel(label); - const alicePlaintext = encrypted.decrypt(aliceSk); - expect(alicePlaintext).toEqual(alicePlaintext); - }); - - test('bob decrypts reencrypted message', async () => { - const label = 'fake-label'; - const alice = fakeAlice(); - const bob = fakeBob(); - - const policyEncryptingKey = alice.getPolicyEncryptingKeyFromLabel(label); - const enrico = new Enrico(policyEncryptingKey); - - const plaintext = 'Plaintext message'; - const plaintextBytes = toBytes(plaintext); - const encrypted = enrico.encryptMessagePre(plaintextBytes); - - // Alice can decrypt capsule she created - const aliceSk = await (alice as any).keyring.getSecretKeyFromLabel(label); - const plaintextAlice = encrypted.decrypt(aliceSk); - expect(fromBytes(plaintextAlice).endsWith(plaintext)).toBeTruthy(); - - const threshold = 2; - const shares = 3; - const { verifiedKFrags, delegatingKey } = alice.generateKFrags( - bob, - label, - threshold, - shares, - ); - expect(delegatingKey.toCompressedBytes()).toEqual( - policyEncryptingKey.toCompressedBytes(), - ); - - // Bob can decrypt re-encrypted ciphertext - const { verifiedCFrags } = reencryptKFrags( - verifiedKFrags, - encrypted.capsule, - ); - const bobSk = (bob as any).keyring.secretKey; - - const plaintextBob = encrypted.decryptReencrypted( - bobSk, - policyEncryptingKey, - verifiedCFrags, - ); - expect(fromBytes(plaintextBob).endsWith(plaintext)).toBeTruthy(); - - // Bob can decrypt ciphertext and verify origin of the message - const cFragsWithUrsulas = verifiedCFrags.map((cFrag, index) => [ - `0x${index}`, - cFrag, - ]); - const result = new RetrievalResult(Object.fromEntries(cFragsWithUrsulas)); - const pk = PolicyMessageKit.fromMessageKit( - encrypted, - policyEncryptingKey, - threshold, - ).withResult(result); - expect(pk.isDecryptableByReceiver()).toBeTruthy(); - - const decrypted = bob.decrypt(pk); - expect(bytesEqual(decrypted, plaintextBytes)).toBeTruthy(); - }); - - test('enrico generates a message kit with conditions', async () => { - const label = 'fake-label'; - const message = 'fake-message'; - const alice = fakeAlice(); - - const policyKey = alice.getPolicyEncryptingKeyFromLabel(label); - - const ownsBufficornNFT = new ERC721Ownership({ - contractAddress: '0x1e988ba4692e52Bc50b375bcC8585b95c48AaD77', - parameters: [3591], - chain: 5, - }); - - const conditions = new ConditionExpression(ownsBufficornNFT); - - const enrico = new Enrico(policyKey, undefined, conditions); - const encrypted = enrico.encryptMessagePre(toBytes(message)); - - const aliceKeyring = (alice as any).keyring; - const aliceSk = await aliceKeyring.getSecretKeyFromLabel(label); - const alicePlaintext = encrypted.decrypt(aliceSk); - expect(alicePlaintext).toEqual(alicePlaintext); - }); - - test('can overwrite conditions at encryption time', async () => { - const label = 'fake-label'; - const message = 'fake-message'; - const alice = fakeAlice(); - - const policyKey = alice.getPolicyEncryptingKeyFromLabel(label); - - const ownsBufficornNFT = new ERC721Ownership({ - contractAddress: '0x1e988ba4692e52Bc50b375bcC8585b95c48AaD77', - chain: 5, - parameters: [3591], - }); - - const ownsNonsenseNFT = new ERC721Ownership({ - contractAddress: '0x1e988ba4692e52Bc50b375bcC8585b95c48AaD77', - chain: 5, - parameters: [6969], - }); - - const conditions = new ConditionExpression(ownsBufficornNFT); - const updatedConditions = new ConditionExpression(ownsNonsenseNFT); - - const enrico = new Enrico(policyKey, undefined, conditions); - const encrypted = enrico.encryptMessagePre( - toBytes(message), - updatedConditions, - ); - - const aliceKeyring = (alice as any).keyring; - const aliceSk = await aliceKeyring.getSecretKeyFromLabel(label); - const alicePlaintext = encrypted.decrypt(aliceSk); - expect(alicePlaintext).toEqual(alicePlaintext); - }); -}); diff --git a/packages/shared/test/integration/message-kit.test.ts b/packages/shared/test/integration/message-kit.test.ts deleted file mode 100644 index e6445f233..000000000 --- a/packages/shared/test/integration/message-kit.test.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { fakeBob } from '@nucypher/test-utils'; -import { expect, test } from 'vitest'; - -import { MessageKit, toBytes } from '../../src'; - -test('message kit', () => { - test('bob decrypts', () => { - const bob = fakeBob(); - const plaintext = toBytes('fake-message'); - const messageKit = new MessageKit(bob.decryptingKey, plaintext, null); - const decrypted = bob['keyring'].decrypt(messageKit); - expect(decrypted).toBeTruthy(); - }); -}); diff --git a/packages/shared/test/integration/pre.test.ts b/packages/shared/test/integration/pre.test.ts deleted file mode 100644 index c64dddbec..000000000 --- a/packages/shared/test/integration/pre.test.ts +++ /dev/null @@ -1,144 +0,0 @@ -import { CapsuleFrag, reencrypt } from '@nucypher/nucypher-core'; -import { - fakeAlice, - fakeBob, - fakeUrsulas, - reencryptKFrags, -} from '@nucypher/test-utils'; -import { beforeAll, expect, test } from 'vitest'; - -import { - Alice, - Bob, - CompoundCondition, - ConditionExpression, - Enrico, - ERC721Ownership, - initialize, - MessageKit, - PolicyMessageKit, - RetrievalResult, - toBytes, - zip, -} from '../../src'; - -test('proxy reencryption', () => { - let alice: Alice; - let bob: Bob; - const plaintext = toBytes('plaintext-message'); - const threshold = 2; - const shares = 3; - const label = 'fake-data-label'; - - test('verifies capsule frags', async () => { - beforeAll(async () => { - await initialize(); - bob = fakeBob(); - alice = fakeAlice(); - }); - - const { capsule } = new MessageKit(bob.decryptingKey, plaintext, null); - const { delegatingKey, verifiedKFrags } = alice.generateKFrags( - bob, - label, - threshold, - shares, - ); - - const { verifiedCFrags } = reencryptKFrags(verifiedKFrags, capsule); - const cFrags = verifiedCFrags.map((verifiedCFrag) => - CapsuleFrag.fromBytes(verifiedCFrag.toBytes()), - ); - const areVerified = cFrags.every((cFrag) => - cFrag.verify( - capsule, - alice.verifyingKey, - delegatingKey, - bob.decryptingKey, - ), - ); - expect(areVerified).toBeTruthy(); - }); - - test('encrypts and decrypts reencrypted message', async () => { - const { verifiedKFrags } = alice.generateKFrags( - bob, - label, - threshold, - shares, - ); - - const policyEncryptingKey = alice.getPolicyEncryptingKeyFromLabel(label); - const enrico = new Enrico(policyEncryptingKey); - const encryptedMessage = enrico.encryptMessagePre(plaintext); - - const ursulaAddresses = fakeUrsulas().map( - (ursula) => ursula.checksumAddress, - ); - const reencrypted = verifiedKFrags.map((kFrag) => - reencrypt(encryptedMessage.capsule, kFrag), - ); - const results = new RetrievalResult( - Object.fromEntries(zip(ursulaAddresses, reencrypted)), - ); - const policyMessageKit = PolicyMessageKit.fromMessageKit( - encryptedMessage, - policyEncryptingKey, - threshold, - ).withResult(results); - expect(policyMessageKit.isDecryptableByReceiver()).toBeTruthy(); - - const bobPlaintext = bob.decrypt(policyMessageKit); - expect(bobPlaintext).toEqual(plaintext); - }); - - test('encrypts and decrypts reencrypted message with conditions', async () => { - const { verifiedKFrags } = alice.generateKFrags( - bob, - label, - threshold, - shares, - ); - - const policyEncryptingKey = alice.getPolicyEncryptingKeyFromLabel(label); - - const genuineUndead = new ERC721Ownership({ - contractAddress: '0x209e639a0EC166Ac7a1A4bA41968fa967dB30221', - chain: 1, - parameters: [1], - }); - const gnomePals = new ERC721Ownership({ - contractAddress: '0x5dB11d7356aa4C0E85Aa5b255eC2B5F81De6d4dA', - chain: 1, - parameters: [1], - }); - const conditionsSet = new ConditionExpression( - new CompoundCondition({ - operator: 'or', - operands: [genuineUndead.toObj(), gnomePals.toObj()], - }), - ); - - const enrico = new Enrico(policyEncryptingKey, undefined, conditionsSet); - const encryptedMessage = enrico.encryptMessagePre(plaintext); - - const ursulaAddresses = fakeUrsulas().map( - (ursula) => ursula.checksumAddress, - ); - const reencrypted = verifiedKFrags.map((kFrag) => - reencrypt(encryptedMessage.capsule, kFrag), - ); - const results = new RetrievalResult( - Object.fromEntries(zip(ursulaAddresses, reencrypted)), - ); - const policyMessageKit = PolicyMessageKit.fromMessageKit( - encryptedMessage, - policyEncryptingKey, - threshold, - ).withResult(results); - expect(policyMessageKit.isDecryptableByReceiver()).toBeTruthy(); - - const bobPlaintext = bob.decrypt(policyMessageKit); - expect(bobPlaintext).toEqual(plaintext); - }); -}); diff --git a/packages/shared/test/unit/cbd-strategy.test.ts b/packages/shared/test/unit/cbd-strategy.test.ts deleted file mode 100644 index 951ae91a9..000000000 --- a/packages/shared/test/unit/cbd-strategy.test.ts +++ /dev/null @@ -1,190 +0,0 @@ -import { - FerveoVariant, - SecretKey, - SessionStaticSecret, -} from '@nucypher/nucypher-core'; -import { - aliceSecretKeyBytes, - fakeDkgFlow, - fakeDkgRitual, - fakeProvider, - fakeSigner, - fakeTDecFlow, - fakeUrsulas, - makeCohort, - mockCbdDecrypt, - mockDkgParticipants, - mockGetParticipants, - mockGetRitual, - mockGetUrsulas, - mockRandomSessionStaticSecret, -} from '@nucypher/test-utils'; -import { ethers } from 'ethers'; -import { afterEach, beforeAll, expect, test, vi } from 'vitest'; - -import { - CbdStrategy, - ConditionExpression, - DeployedCbdStrategy, - ERC721Ownership, - initialize, - ThresholdDecrypter, - toBytes, -} from '../../src'; - -// Shared test variables -const ownsNFT = new ERC721Ownership({ - contractAddress: '0x1e988ba4692e52Bc50b375bcC8585b95c48AaD77', - parameters: [3591], - chain: 5, -}); -const conditionExpr = new ConditionExpression(ownsNFT); -const ritualId = 0; - -const makeCbdStrategy = async () => { - const ursulas = fakeUrsulas(); - const cohort = await makeCohort(ursulas); - const strategy = CbdStrategy.create(cohort); - expect(strategy.cohort).toEqual(cohort); - return strategy; -}; - -async function makeDeployedCbdStrategy() { - const ursulas = fakeUrsulas(); - const provider = fakeProvider(); - const strategy = await makeCbdStrategy(); - const mockedDkg = fakeDkgFlow(FerveoVariant.precomputed, 0, 4, 4); - const mockedDkgRitual = fakeDkgRitual(mockedDkg); - const getUrsulasSpy = mockGetUrsulas(ursulas); - const getExistingRitualSpy = mockGetRitual(mockedDkgRitual); - - const deployedStrategy = await strategy.deploy(provider, ritualId); - - expect(getUrsulasSpy).toHaveBeenCalled(); - expect(getExistingRitualSpy).toHaveBeenCalled(); - - return { mockedDkg, deployedStrategy }; -} - -test('cbd strategy', () => { - let secretKey; - let provider: ethers.providers.Provider; - let signer: ethers.Signer; - - beforeAll(async () => { - await initialize(); - secretKey = SecretKey.fromBEBytes(aliceSecretKeyBytes); - provider = fakeProvider(secretKey.toBEBytes()); - signer = fakeSigner(secretKey.toBEBytes()); - }); - - test('CbdStrategy', () => { - afterEach(() => { - vi.restoreAllMocks(); - }); - - test('creates a strategy', async () => { - await makeCbdStrategy(); - }); - - test('can deploy and return a CbdDeployedStrategy', async () => { - await makeDeployedCbdStrategy(); - }); - - test('serialization', () => { - test('serializes to a plain object', async () => { - const strategy = await makeCbdStrategy(); - const asObj = strategy.toObj(); - const fromObj = CbdStrategy.fromObj(asObj); - expect(fromObj.equals(strategy)).toBeTruthy(); - }); - - test('serializes to a JSON', async () => { - const strategy = await makeCbdStrategy(); - const asJson = strategy.toJSON(); - const fromJson = CbdStrategy.fromJSON(asJson); - expect(fromJson.equals(strategy)).toBeTruthy(); - }); - }); - }); - - test('CbdDeployedStrategy', () => { - afterEach(() => { - vi.restoreAllMocks(); - }); - - test('can encrypt and decrypt', async () => { - const { mockedDkg, deployedStrategy } = await makeDeployedCbdStrategy(); - - const message = 'this is a secret'; - const thresholdMessageKit = deployedStrategy - .makeEncrypter(conditionExpr) - .encryptMessageCbd(message); - - // Setup mocks for `retrieveAndDecrypt` - const { decryptionShares } = fakeTDecFlow({ - ...mockedDkg, - message: toBytes(message), - dkgPublicKey: mockedDkg.dkg.publicKey(), - thresholdMessageKit, - }); - const { participantSecrets, participants } = mockDkgParticipants( - mockedDkg.ritualId, - ); - const requesterSessionKey = SessionStaticSecret.random(); - const decryptSpy = mockCbdDecrypt( - mockedDkg.ritualId, - decryptionShares, - participantSecrets, - requesterSessionKey.publicKey(), - ); - const getParticipantsSpy = mockGetParticipants(participants); - const getUrsulasSpy = mockGetUrsulas(); - const sessionKeySpy = mockRandomSessionStaticSecret(requesterSessionKey); - - const decryptedMessage = - await deployedStrategy.decrypter.retrieveAndDecrypt( - provider, - thresholdMessageKit, - signer, - ); - expect(getUrsulasSpy).toHaveBeenCalled(); - expect(getParticipantsSpy).toHaveBeenCalled(); - expect(sessionKeySpy).toHaveBeenCalled(); - expect(decryptSpy).toHaveBeenCalled(); - expect(decryptedMessage).toEqual(toBytes(message)); - }); - - test('serialization', () => { - test('serializes to a plaintext object', async () => { - const { deployedStrategy } = await makeDeployedCbdStrategy(); - const asJson = deployedStrategy.toJSON(); - const fromJson = DeployedCbdStrategy.fromJSON(asJson); - expect(fromJson.equals(deployedStrategy)).toBeTruthy(); - }); - - test('serializes to a JSON', async () => { - const { deployedStrategy } = await makeDeployedCbdStrategy(); - const asJson = deployedStrategy.toJSON(); - const fromJson = DeployedCbdStrategy.fromJSON(asJson); - expect(fromJson.equals(deployedStrategy)).toBeTruthy(); - }); - }); - }); - - test('ThresholdDecrypter', () => { - test('serializes to a plain object', async () => { - const { deployedStrategy } = await makeDeployedCbdStrategy(); - const configObj = deployedStrategy.decrypter.toObj(); - const fromObj = ThresholdDecrypter.fromObj(configObj); - expect(fromObj.equals(deployedStrategy.decrypter)).toBeTruthy(); - }); - - test('serializes to a JSON', async () => { - const { deployedStrategy } = await makeDeployedCbdStrategy(); - const configJSON = deployedStrategy.decrypter.toJSON(); - const fromJSON = ThresholdDecrypter.fromJSON(configJSON); - expect(fromJSON.equals(deployedStrategy.decrypter)).toBeTruthy(); - }); - }); -}); diff --git a/packages/shared/test/unit/conditions/base/rpc.test.ts b/packages/shared/test/unit/conditions/base/rpc.test.ts deleted file mode 100644 index 55b1256f9..000000000 --- a/packages/shared/test/unit/conditions/base/rpc.test.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { testRpcConditionObj } from '@nucypher/test-utils'; -import { expect, test } from 'vitest'; - -import { RpcCondition } from '../../../../src/conditions/base'; -import { rpcConditionSchema } from '../../../../src/conditions/base/rpc'; - -test('validation', () => { - test('accepts on a valid schema', () => { - const result = RpcCondition.validate( - rpcConditionSchema, - testRpcConditionObj, - ); - - expect(result.error).toBeUndefined(); - expect(result.data).toEqual(testRpcConditionObj); - }); - - test('rejects an invalid schema', () => { - const badRpcObj = { - ...testRpcConditionObj, - // Intentionally replacing `method` with an invalid method - method: 'fake_invalid_method', - } as unknown as typeof testRpcConditionObj; - - const result = RpcCondition.validate(rpcConditionSchema, badRpcObj); - - expect(result.error).toBeDefined(); - expect(result.data).toBeUndefined(); - expect(result.error?.format()).toMatchObject({ - method: { - _errors: [ - "Invalid enum value. Expected 'eth_getBalance' | 'balanceOf', received 'fake_invalid_method'", - ], - }, - }); - }); -}); diff --git a/packages/shared/test/unit/pre-strategy.test.ts b/packages/shared/test/unit/pre-strategy.test.ts deleted file mode 100644 index 0fb5b6003..000000000 --- a/packages/shared/test/unit/pre-strategy.test.ts +++ /dev/null @@ -1,182 +0,0 @@ -import { SecretKey, VerifiedKeyFrag } from '@nucypher/nucypher-core'; -import { - aliceSecretKeyBytes, - bobSecretKeyBytes, - fakeProvider, - fakeSigner, - fakeUrsulas, - makeCohort, - mockEncryptTreasureMap, - mockGenerateKFrags, - mockGetUrsulas, - mockMakeTreasureMap, - mockPublishToBlockchain, - mockRetrieveCFragsRequest, -} from '@nucypher/test-utils'; -import { afterEach, beforeAll, expect, test, vi } from 'vitest'; - -import { - ConditionExpression, - DeployedPreStrategy, - ERC721Ownership, - initialize, - PreDecrypter, - PreStrategy, - toBytes, - Ursula, -} from '../../src'; - -// Shared test variables -const ownsNFT = new ERC721Ownership({ - contractAddress: '0x1e988ba4692e52Bc50b375bcC8585b95c48AaD77', - parameters: [3591], - chain: 5, -}); -const conditionExpr = new ConditionExpression(ownsNFT); - -const makePreStrategy = async () => { - const aliceSecretKey = SecretKey.fromBEBytes(aliceSecretKeyBytes); - const bobSecretKey = SecretKey.fromBEBytes(bobSecretKeyBytes); - const cohort = await makeCohort(fakeUrsulas()); - const strategy = PreStrategy.create(cohort, aliceSecretKey, bobSecretKey); - expect(strategy.cohort).toEqual(cohort); - return strategy; -}; - -const makeDeployedPreStrategy = async () => { - const aliceSecretKey = SecretKey.fromBEBytes(aliceSecretKeyBytes); - const aliceSigner = fakeSigner(aliceSecretKey.toBEBytes()); - const aliceProvider = fakeProvider(aliceSecretKey.toBEBytes()); - - const strategy = await makePreStrategy(); - const generateKFragsSpy = mockGenerateKFrags(); - const publishToBlockchainSpy = mockPublishToBlockchain(); - const makeTreasureMapSpy = mockMakeTreasureMap(); - const encryptTreasureMapSpy = mockEncryptTreasureMap(); - - const deployedStrategy = await strategy.deploy( - aliceProvider, - aliceSigner, - 'test', - ); - - expect(generateKFragsSpy).toHaveBeenCalled(); - expect(publishToBlockchainSpy).toHaveBeenCalled(); - expect(makeTreasureMapSpy).toHaveBeenCalled(); - expect(encryptTreasureMapSpy).toHaveBeenCalled(); - - expect(deployedStrategy.cohort).toEqual(strategy.cohort); - - const ursulaAddresses = ( - makeTreasureMapSpy.mock.calls[0][0] as readonly Ursula[] - ).map((u) => u.checksumAddress); - const verifiedKFrags = makeTreasureMapSpy.mock - .calls[0][1] as readonly VerifiedKeyFrag[]; - - return { deployedStrategy, ursulaAddresses, verifiedKFrags }; -}; - -test('pre strategy', () => { - beforeAll(async () => { - await initialize(); - }); - - test('PreStrategy', () => { - afterEach(() => { - vi.restoreAllMocks(); - }); - - test('creates a strategy', async () => { - await makePreStrategy(); - }); - - test('deploys a strategy', async () => { - await makeDeployedPreStrategy(); - }); - - test('serialization', () => { - test('serializes to plain object', async () => { - const strategy = await makePreStrategy(); - const asObject = strategy.toObj(); - const fromObject = PreStrategy.fromObj(asObject); - expect(fromObject.equals(strategy)).toBeTruthy(); - }); - - test('serializes to JSON', async () => { - const strategy = await makePreStrategy(); - const asJson = strategy.toJSON(); - const fromJSON = PreStrategy.fromJSON(asJson); - expect(fromJSON.equals(strategy)).toBeTruthy(); - }); - }); - }); - - test('PreDeployedStrategy', () => { - afterEach(() => { - vi.restoreAllMocks(); - }); - - test('encrypts and decrypts', async () => { - const bobSecretKey = SecretKey.fromBEBytes(bobSecretKeyBytes); - const bobSigner = fakeSigner(bobSecretKey.toBEBytes()); - const bobProvider = fakeProvider(bobSecretKey.toBEBytes()); - const { deployedStrategy, ursulaAddresses, verifiedKFrags } = - await makeDeployedPreStrategy(); - - const plaintext = 'this is a secret'; - const encryptedMessageKit = deployedStrategy - .makeEncrypter(conditionExpr) - .encryptMessagePre(plaintext); - - // Setup mocks for `retrieveAndDecrypt` - const getUrsulasSpy = mockGetUrsulas(); - const retrieveCFragsSpy = mockRetrieveCFragsRequest( - ursulaAddresses, - verifiedKFrags, - encryptedMessageKit.capsule, - ); - - const decryptedMessage = - await deployedStrategy.decrypter.retrieveAndDecrypt( - bobProvider, - bobSigner, - [encryptedMessageKit], - ); - expect(getUrsulasSpy).toHaveBeenCalled(); - expect(retrieveCFragsSpy).toHaveBeenCalled(); - expect(decryptedMessage[0]).toEqual(toBytes(plaintext)); - }); - - test('serialization', () => { - test('serializes to a plain object', async () => { - const { deployedStrategy } = await makeDeployedPreStrategy(); - const asObj = deployedStrategy.toObj(); - const fromJson = DeployedPreStrategy.fromObj(asObj); - expect(fromJson.equals(deployedStrategy)).toBeTruthy(); - }); - - test('serializes to a JSON', async () => { - const { deployedStrategy } = await makeDeployedPreStrategy(); - const asJson = deployedStrategy.toJSON(); - const fromJson = DeployedPreStrategy.fromJSON(asJson); - expect(fromJson.equals(deployedStrategy)).toBeTruthy(); - }); - }); - }); - - test('PreDecrypter', () => { - test('serializes to a plain object', async () => { - const { deployedStrategy } = await makeDeployedPreStrategy(); - const asObj = deployedStrategy.decrypter.toObj(); - const fromJson = PreDecrypter.fromObj(asObj); - expect(fromJson.equals(deployedStrategy.decrypter)).toBeTruthy(); - }); - - test('serializes to JSON', async () => { - const { deployedStrategy } = await makeDeployedPreStrategy(); - const asJson = deployedStrategy.decrypter.toJSON(); - const fromJson = PreDecrypter.fromJSON(asJson); - expect(fromJson.equals(deployedStrategy.decrypter)).toBeTruthy(); - }); - }); -}); diff --git a/packages/taco/tsconfig.build.json b/packages/shared/tsconfig.build.json similarity index 62% rename from packages/taco/tsconfig.build.json rename to packages/shared/tsconfig.build.json index dedc2a266..2275c6c5e 100644 --- a/packages/taco/tsconfig.build.json +++ b/packages/shared/tsconfig.build.json @@ -5,9 +5,4 @@ "outDir": "dist", "rootDir": "src" }, - "references": [ - { - "path": "../shared/tsconfig.es.json" - } - ] } diff --git a/packages/shared/typedoc.json b/packages/shared/typedoc.json index 46511121a..4e898ec73 100644 --- a/packages/shared/typedoc.json +++ b/packages/shared/typedoc.json @@ -1,6 +1,6 @@ { "extends": ["../../typedoc.base.json"], "entryPoints": ["src/index.ts"], - "tsconfig": "tsconfig.build.json", + "tsconfig": "tsconfig.es.json", "name": "@nucypher/shared" } diff --git a/packages/taco/package.json b/packages/taco/package.json index 102b1e95f..c5ee587ae 100644 --- a/packages/taco/package.json +++ b/packages/taco/package.json @@ -14,18 +14,22 @@ "author": "Piotr Roslaniec ", "exports": { ".": { - "import": "./dist/index.js", - "require": "./dist/index.js" + "import": "./dist/es/index.js", + "require": "./dist/cjs/index.js" } }, - "main": "./dist/index.js", - "module": "./dist/index.js", - "types": "./dist/index.d.ts", + "main": "./dist/cjs/index.js", + "module": "./dist/es/index.js", + "types": "./dist/cjs/index.d.ts", "files": [ - "dist/**/*" + "dist" ], "scripts": { - "build": "tsc --build ./tsconfig.build.json --verbose", + "prebuild": "pnpm clean", + "build": "pnpm build:module && pnpm build:cjs", + "build:cjs": "tsc --build ./tsconfig.cjs.json --verbose", + "build:module": "tsc --build ./tsconfig.es.json --verbose", + "clean": "rm -rf dist", "exports:lint": "ts-unused-exports tsconfig.json --ignoreFiles src/index.ts", "lint": "eslint --ext .ts src test", "lint:fix": "pnpm lint --fix", @@ -34,17 +38,21 @@ "typedoc": "typedoc" }, "dependencies": { - "@nucypher/nucypher-core": "0.13.0-alpha.0", - "@nucypher/shared": "workspace:*" + "@ethersproject/abstract-signer": "^5.7.0", + "@nucypher/nucypher-core": "0.13.0-alpha.1", + "@nucypher/shared": "workspace:*", + "semver": "^7.5.2", + "zod": "^3.22.1" }, "devDependencies": { - "@nucypher/test-utils": "workspace:*" + "@nucypher/test-utils": "workspace:*", + "@types/semver": "^7.5.0" }, "peerDependencies": { "ethers": "^5.7.2" }, "engines": { - "node": ">=16", + "node": ">=18", "pnpm": ">=8.0.0" } } diff --git a/packages/shared/src/conditions/base/contract.ts b/packages/taco/src/conditions/base/contract.ts similarity index 100% rename from packages/shared/src/conditions/base/contract.ts rename to packages/taco/src/conditions/base/contract.ts diff --git a/packages/shared/src/conditions/base/index.ts b/packages/taco/src/conditions/base/index.ts similarity index 100% rename from packages/shared/src/conditions/base/index.ts rename to packages/taco/src/conditions/base/index.ts diff --git a/packages/shared/src/conditions/base/rpc.ts b/packages/taco/src/conditions/base/rpc.ts similarity index 72% rename from packages/shared/src/conditions/base/rpc.ts rename to packages/taco/src/conditions/base/rpc.ts index da06cbeb0..8850e1a06 100644 --- a/packages/shared/src/conditions/base/rpc.ts +++ b/packages/taco/src/conditions/base/rpc.ts @@ -11,7 +11,11 @@ export const rpcConditionSchema = z.object({ conditionType: z.literal(RpcConditionType).default(RpcConditionType), chain: createUnionSchema(SUPPORTED_CHAIN_IDS), method: z.enum(['eth_getBalance', 'balanceOf']), - parameters: z.array(EthAddressOrUserAddressSchema), + parameters: z.union([ + z.array(EthAddressOrUserAddressSchema).length(1), + // Using tuple here because ordering matters + z.tuple([EthAddressOrUserAddressSchema, z.union([z.string(), z.number()])]), + ]), returnValueTest: returnValueTestSchema, }); diff --git a/packages/shared/src/conditions/base/shared.ts b/packages/taco/src/conditions/base/shared.ts similarity index 100% rename from packages/shared/src/conditions/base/shared.ts rename to packages/taco/src/conditions/base/shared.ts diff --git a/packages/shared/src/conditions/base/time.ts b/packages/taco/src/conditions/base/time.ts similarity index 100% rename from packages/shared/src/conditions/base/time.ts rename to packages/taco/src/conditions/base/time.ts diff --git a/packages/shared/src/conditions/compound-condition.ts b/packages/taco/src/conditions/compound-condition.ts similarity index 100% rename from packages/shared/src/conditions/compound-condition.ts rename to packages/taco/src/conditions/compound-condition.ts diff --git a/packages/shared/src/conditions/condition-expr.ts b/packages/taco/src/conditions/condition-expr.ts similarity index 89% rename from packages/shared/src/conditions/condition-expr.ts rename to packages/taco/src/conditions/condition-expr.ts index efd6def77..f343d6799 100644 --- a/packages/shared/src/conditions/condition-expr.ts +++ b/packages/taco/src/conditions/condition-expr.ts @@ -1,9 +1,8 @@ import { Conditions as WASMConditions } from '@nucypher/nucypher-core'; +import { toJSON } from '@nucypher/shared'; import { ethers } from 'ethers'; import { SemVer } from 'semver'; -import { toJSON } from '../utils'; - import { Condition } from './condition'; import { ConditionContext, CustomContextParam } from './context'; @@ -13,11 +12,11 @@ export type ConditionExpressionJSON = { }; export class ConditionExpression { - public static VERSION = '1.0.0'; + public static version = '1.0.0'; constructor( public readonly condition: Condition, - public readonly version: string = ConditionExpression.VERSION, + public readonly version: string = ConditionExpression.version, ) {} public toObj(): ConditionExpressionJSON { @@ -30,10 +29,10 @@ export class ConditionExpression { public static fromObj(obj: ConditionExpressionJSON): ConditionExpression { const receivedVersion = new SemVer(obj.version); - const currentVersion = new SemVer(ConditionExpression.VERSION); + const currentVersion = new SemVer(ConditionExpression.version); if (receivedVersion.major > currentVersion.major) { throw new Error( - `Version provided, ${obj.version}, is incompatible with current version, ${ConditionExpression.VERSION}`, + `Version provided, ${obj.version}, is incompatible with current version, ${ConditionExpression.version}`, ); } diff --git a/packages/shared/src/conditions/condition.ts b/packages/taco/src/conditions/condition.ts similarity index 97% rename from packages/shared/src/conditions/condition.ts rename to packages/taco/src/conditions/condition.ts index e5c5cc865..4d79e42c6 100644 --- a/packages/shared/src/conditions/condition.ts +++ b/packages/taco/src/conditions/condition.ts @@ -1,7 +1,6 @@ +import { objectEquals } from '@nucypher/shared'; import { z } from 'zod'; -import { objectEquals } from '../utils'; - import { CompoundCondition, ContractCondition, diff --git a/packages/shared/src/conditions/const.ts b/packages/taco/src/conditions/const.ts similarity index 84% rename from packages/shared/src/conditions/const.ts rename to packages/taco/src/conditions/const.ts index 9854c6a13..a7d8dc12c 100644 --- a/packages/shared/src/conditions/const.ts +++ b/packages/taco/src/conditions/const.ts @@ -1,4 +1,4 @@ -import { ChainId } from '../web3'; +import { ChainId } from '@nucypher/shared'; export const USER_ADDRESS_PARAM = ':userAddress'; diff --git a/packages/shared/src/conditions/context/context.ts b/packages/taco/src/conditions/context/context.ts similarity index 92% rename from packages/shared/src/conditions/context/context.ts rename to packages/taco/src/conditions/context/context.ts index a32bd0428..158ccf076 100644 --- a/packages/shared/src/conditions/context/context.ts +++ b/packages/taco/src/conditions/context/context.ts @@ -1,7 +1,7 @@ import { Context, Conditions as WASMConditions } from '@nucypher/nucypher-core'; +import { fromJSON, toJSON } from '@nucypher/shared'; import { ethers } from 'ethers'; -import { fromJSON, toJSON } from '../../utils'; import { Condition } from '../condition'; import { ConditionExpression } from '../condition-expr'; import { USER_ADDRESS_PARAM } from '../const'; @@ -59,32 +59,24 @@ export class ConditionContext { } public toObj = async (): Promise> => { - // First, we want to find all the parameters we need to add - const requestedParameters = new Set(); + const requestedParameters = this.findRequestedParameters(); + const parameters = await this.fillContextParameters(requestedParameters); - // Search conditions for parameters - const conditions = this.conditions.map((cnd) => cnd.toObj()); - const conditionsToCheck = fromJSON( - new WASMConditions(toJSON(conditions)).toString(), + // Ok, so at this point we should have all the parameters we need + // If we don't, we have a problem and we should throw + const missingParameters = Array.from(requestedParameters).filter( + (key) => !parameters[key], ); - for (const cond of conditionsToCheck) { - // Check return value test - const rvt = cond.returnValueTest.value; - if (typeof rvt === 'string' && rvt.startsWith(CONTEXT_PARAM_PREFIX)) { - requestedParameters.add(rvt); - } - - // Check condition parameters - for (const param of cond.parameters ?? []) { - if ( - typeof param === 'string' && - param.startsWith(CONTEXT_PARAM_PREFIX) - ) { - requestedParameters.add(param); - } - } + if (missingParameters.length > 0) { + throw new Error( + `Missing custom context parameter(s): ${missingParameters.join(', ')}`, + ); } + return parameters; + }; + + private async fillContextParameters(requestedParameters: Set) { // Now, we can safely add all the parameters const parameters: Record = {}; @@ -105,20 +97,37 @@ export class ConditionContext { for (const key in this.customParameters) { parameters[key] = this.customParameters[key]; } + return parameters; + } - // Ok, so at this point we should have all the parameters we need - // If we don't, we have a problem and we should throw - const missingParameters = Array.from(requestedParameters).filter( - (key) => !parameters[key], + private findRequestedParameters() { + // First, we want to find all the parameters we need to add + const requestedParameters = new Set(); + + // Search conditions for parameters + const conditions = this.conditions.map((cnd) => cnd.toObj()); + const conditionsToCheck = fromJSON( + new WASMConditions(toJSON(conditions)).toString(), ); - if (missingParameters.length > 0) { - throw new Error( - `Missing custom context parameter(s): ${missingParameters.join(', ')}`, - ); - } + for (const cond of conditionsToCheck) { + // Check return value test + const rvt = cond.returnValueTest.value; + if (typeof rvt === 'string' && rvt.startsWith(CONTEXT_PARAM_PREFIX)) { + requestedParameters.add(rvt); + } - return parameters; - }; + // Check condition parameters + for (const param of cond.parameters ?? []) { + if ( + typeof param === 'string' && + param.startsWith(CONTEXT_PARAM_PREFIX) + ) { + requestedParameters.add(param); + } + } + } + return requestedParameters; + } public async toJson(): Promise { const parameters = await this.toObj(); diff --git a/packages/shared/src/conditions/context/index.ts b/packages/taco/src/conditions/context/index.ts similarity index 100% rename from packages/shared/src/conditions/context/index.ts rename to packages/taco/src/conditions/context/index.ts diff --git a/packages/shared/src/conditions/context/providers.ts b/packages/taco/src/conditions/context/providers.ts similarity index 100% rename from packages/shared/src/conditions/context/providers.ts rename to packages/taco/src/conditions/context/providers.ts diff --git a/packages/taco/src/conditions/index.ts b/packages/taco/src/conditions/index.ts new file mode 100644 index 000000000..fad3849b1 --- /dev/null +++ b/packages/taco/src/conditions/index.ts @@ -0,0 +1,14 @@ +import * as base from './base'; +import * as predefined from './predefined'; + +export * from './base'; +export * from './predefined'; + +export { + CompoundConditionProps, + CompoundConditionType, +} from './compound-condition'; +export { Condition, ConditionProps } from './condition'; +export { ConditionExpression, ConditionExpressionJSON } from './condition-expr'; +export { ConditionContext, CustomContextParam } from './context'; +export { base, predefined }; diff --git a/packages/shared/src/conditions/predefined/erc721.ts b/packages/taco/src/conditions/predefined/erc721.ts similarity index 90% rename from packages/shared/src/conditions/predefined/erc721.ts rename to packages/taco/src/conditions/predefined/erc721.ts index 1a81b8456..b85cc7833 100644 --- a/packages/shared/src/conditions/predefined/erc721.ts +++ b/packages/taco/src/conditions/predefined/erc721.ts @@ -1,5 +1,8 @@ -import { ContractCondition, ContractConditionProps } from '../base'; -import { ContractConditionType } from '../base/contract'; +import { + ContractCondition, + ContractConditionProps, + ContractConditionType, +} from '../base'; import { USER_ADDRESS_PARAM } from '../const'; // TODO: Rewrite these using Zod schemas? diff --git a/packages/shared/src/conditions/predefined/index.ts b/packages/taco/src/conditions/predefined/index.ts similarity index 100% rename from packages/shared/src/conditions/predefined/index.ts rename to packages/taco/src/conditions/predefined/index.ts diff --git a/packages/shared/src/conditions/zod.ts b/packages/taco/src/conditions/zod.ts similarity index 100% rename from packages/shared/src/conditions/zod.ts rename to packages/taco/src/conditions/zod.ts diff --git a/packages/shared/src/dkg.ts b/packages/taco/src/dkg.ts similarity index 97% rename from packages/shared/src/dkg.ts rename to packages/taco/src/dkg.ts index ae4f6970e..6ee67d216 100644 --- a/packages/shared/src/dkg.ts +++ b/packages/taco/src/dkg.ts @@ -1,12 +1,11 @@ import { DkgPublicKey } from '@nucypher/nucypher-core'; -import { BigNumberish, ethers } from 'ethers'; - import { + ChecksumAddress, DkgCoordinatorAgent, DkgRitualState, -} from './contracts/agents/coordinator'; -import { ChecksumAddress } from './types'; -import { fromHexString } from './utils'; + fromHexString, +} from '@nucypher/shared'; +import { BigNumberish, ethers } from 'ethers'; export interface DkgRitualJSON { id: number; diff --git a/packages/taco/src/index.ts b/packages/taco/src/index.ts index b3dec3e3b..b1c36b574 100644 --- a/packages/taco/src/index.ts +++ b/packages/taco/src/index.ts @@ -1,23 +1,7 @@ -import { - Ciphertext, - EncryptedTreasureMap, - HRAC, - MessageKit, - PublicKey, - SecretKey, - Signer, - TreasureMap, -} from '@nucypher/nucypher-core'; +export { DkgPublicKey, ThresholdMessageKit } from '@nucypher/nucypher-core'; -export const core = { - PublicKey, - SecretKey, - EncryptedTreasureMap, - HRAC, - Signer, - TreasureMap, - MessageKit, - Ciphertext, -}; +export { fromBytes, getPorterUri, initialize, toBytes } from '@nucypher/shared'; -export { taco } from './taco'; +export * as conditions from './conditions'; + +export { decrypt, encrypt } from './taco'; diff --git a/packages/taco/src/taco.ts b/packages/taco/src/taco.ts index 7a80f83df..3a23bd132 100644 --- a/packages/taco/src/taco.ts +++ b/packages/taco/src/taco.ts @@ -1,34 +1,77 @@ -import { DkgPublicKey, ThresholdMessageKit } from '@nucypher/nucypher-core'; import { - Condition, - ConditionExpression, - DkgClient, + AccessControlPolicy, + DkgPublicKey, + encryptForDkg, + ThresholdMessageKit, +} from '@nucypher/nucypher-core'; +import { DkgCoordinatorAgent, - Enrico, + fromHexString, getPorterUri, - ThresholdDecrypter, toBytes, } from '@nucypher/shared'; import { ethers } from 'ethers'; +import { keccak256 } from 'ethers/lib/utils'; + +import { Condition, ConditionExpression } from './conditions'; +import { DkgClient } from './dkg'; +import { retrieveAndDecrypt } from './tdec'; export const encrypt = async ( provider: ethers.providers.Provider, - message: string, + message: Uint8Array | string, condition: Condition, ritualId: number, + authSigner: ethers.Signer, ): Promise => { + // TODO(#264): Enable ritual initialization + // if (ritualId === undefined) { + // ritualId = await DkgClient.initializeRitual( + // provider, + // this.cohort.ursulaAddresses, + // true + // ); + // } + // if (ritualId === undefined) { + // // Given that we just initialized the ritual, this should never happen + // throw new Error('Ritual ID is undefined'); + // } const dkgRitual = await DkgClient.getFinalizedRitual(provider, ritualId); - return await encryptLight(message, condition, dkgRitual.dkgPublicKey); + + return await encryptWithPublicKey( + message, + condition, + dkgRitual.dkgPublicKey, + authSigner, + ); }; -export const encryptLight = async ( - message: string, +export const encryptWithPublicKey = async ( + message: Uint8Array | string, condition: Condition, dkgPublicKey: DkgPublicKey, + authSigner: ethers.Signer, ): Promise => { - const encrypter = new Enrico(dkgPublicKey); + if (typeof message === 'string') { + message = toBytes(message); + } + const conditionExpr = new ConditionExpression(condition); - return encrypter.encryptMessageCbd(toBytes(message), conditionExpr); + + const [ciphertext, authenticatedData] = encryptForDkg( + message, + dkgPublicKey, + conditionExpr.toWASMConditions(), + ); + + const headerHash = keccak256(ciphertext.header.toBytes()); + const authorization = await authSigner.signMessage(fromHexString(headerHash)); + const acp = new AccessControlPolicy( + authenticatedData, + fromHexString(authorization), + ); + + return new ThresholdMessageKit(ciphertext, acp); }; export const decrypt = async ( @@ -42,16 +85,18 @@ export const decrypt = async ( messageKit.acp.publicKey, ); const ritual = await DkgClient.getFinalizedRitual(provider, ritualId); - const decrypter = ThresholdDecrypter.create( + return retrieveAndDecrypt( + provider, porterUri, + messageKit, ritualId, ritual.threshold, + signer, ); - return decrypter.retrieveAndDecrypt(provider, messageKit, signer); }; -export const taco = { - encrypt, - encryptLight, - decrypt, -}; +export const isAuthorized = async ( + provider: ethers.providers.Provider, + messageKit: ThresholdMessageKit, + ritualId: number, +) => DkgCoordinatorAgent.isEncryptionAuthorized(provider, ritualId, messageKit); diff --git a/packages/taco/src/tdec.ts b/packages/taco/src/tdec.ts new file mode 100644 index 000000000..1c9c9dfe1 --- /dev/null +++ b/packages/taco/src/tdec.ts @@ -0,0 +1,178 @@ +import { + AccessControlPolicy, + combineDecryptionSharesSimple, + Context, + DecryptionShareSimple, + DkgPublicKey, + EncryptedThresholdDecryptionRequest, + EncryptedThresholdDecryptionResponse, + encryptForDkg, + FerveoVariant, + SessionSharedSecret, + SessionStaticSecret, + ThresholdDecryptionRequest, + ThresholdMessageKit, +} from '@nucypher/nucypher-core'; +import { + DkgCoordinatorAgent, + DkgParticipant, + PorterClient, + toBytes, +} from '@nucypher/shared'; +import { ethers } from 'ethers'; +import { arrayify, keccak256 } from 'ethers/lib/utils'; + +import { ConditionContext, ConditionExpression } from './conditions'; + +export const encryptMessage = async ( + plaintext: Uint8Array | string, + encryptingKey: DkgPublicKey, + conditions: ConditionExpression, + authSigner: ethers.Signer, +): Promise => { + const [ciphertext, authenticatedData] = encryptForDkg( + plaintext instanceof Uint8Array ? plaintext : toBytes(plaintext), + encryptingKey, + conditions.toWASMConditions(), + ); + + const headerHash = keccak256(ciphertext.header.toBytes()); + const authorization = await authSigner.signMessage(arrayify(headerHash)); + const acp = new AccessControlPolicy( + authenticatedData, + toBytes(authorization), + ); + + return new ThresholdMessageKit(ciphertext, acp); +}; + +// Retrieve and decrypt ciphertext using provider and condition expression +export const retrieveAndDecrypt = async ( + provider: ethers.providers.Provider, + porterUri: string, + thresholdMessageKit: ThresholdMessageKit, + ritualId: number, + threshold: number, + signer?: ethers.Signer, +): Promise => { + const decryptionShares = await retrieve( + provider, + porterUri, + thresholdMessageKit, + ritualId, + threshold, + signer, + ); + const sharedSecret = combineDecryptionSharesSimple(decryptionShares); + return thresholdMessageKit.decryptWithSharedSecret(sharedSecret); +}; + +// Retrieve decryption shares +const retrieve = async ( + provider: ethers.providers.Provider, + porterUri: string, + thresholdMessageKit: ThresholdMessageKit, + ritualId: number, + threshold: number, + signer?: ethers.Signer, +): Promise => { + const dkgParticipants = await DkgCoordinatorAgent.getParticipants( + provider, + ritualId, + ); + const wasmContext = await ConditionContext.fromConditions( + provider, + thresholdMessageKit.acp.conditions, + signer, + ).toWASMContext(); + const { sharedSecrets, encryptedRequests } = await makeDecryptionRequests( + ritualId, + wasmContext, + dkgParticipants, + thresholdMessageKit, + ); + + const porter = new PorterClient(porterUri); + const { encryptedResponses, errors } = await porter.cbdDecrypt( + encryptedRequests, + threshold, + ); + if (Object.keys(encryptedResponses).length < threshold) { + throw new Error( + `Threshold of responses not met; CBD decryption failed with errors: ${JSON.stringify( + errors, + )}`, + ); + } + + return makeDecryptionShares(encryptedResponses, sharedSecrets, ritualId); +}; + +const makeDecryptionShares = ( + encryptedResponses: Record, + sessionSharedSecret: Record, + expectedRitualId: number, +) => { + const decryptedResponses = Object.entries(encryptedResponses).map( + ([ursula, response]) => response.decrypt(sessionSharedSecret[ursula]), + ); + + const ritualIds = decryptedResponses.map(({ ritualId }) => ritualId); + if (ritualIds.some((ritualId) => ritualId !== expectedRitualId)) { + throw new Error( + `Ritual id mismatch. Expected ${expectedRitualId}, got ${ritualIds}`, + ); + } + + return decryptedResponses.map(({ decryptionShare }) => + DecryptionShareSimple.fromBytes(decryptionShare), + ); +}; + +const makeDecryptionRequests = async ( + ritualId: number, + wasmContext: Context, + dkgParticipants: Array, + thresholdMessageKit: ThresholdMessageKit, +): Promise<{ + sharedSecrets: Record; + encryptedRequests: Record; +}> => { + const decryptionRequest = new ThresholdDecryptionRequest( + ritualId, + FerveoVariant.simple, + thresholdMessageKit.ciphertextHeader, + thresholdMessageKit.acp, + wasmContext, + ); + + const ephemeralSessionKey = makeSessionKey(); + + // Compute shared secrets for each participant + const sharedSecrets: Record = Object.fromEntries( + dkgParticipants.map(({ provider, decryptionRequestStaticKey }) => { + const sharedSecret = ephemeralSessionKey.deriveSharedSecret( + decryptionRequestStaticKey, + ); + return [provider, sharedSecret]; + }), + ); + + // Create encrypted requests for each participant + const encryptedRequests: Record = + Object.fromEntries( + Object.entries(sharedSecrets).map(([provider, sessionSharedSecret]) => { + const encryptedRequest = decryptionRequest.encrypt( + sessionSharedSecret, + ephemeralSessionKey.publicKey(), + ); + return [provider, encryptedRequest]; + }), + ); + + return { sharedSecrets, encryptedRequests }; +}; + +// Moving to a separate function to make it easier to mock +// TODO: Reconsider this +const makeSessionKey = () => SessionStaticSecret.random(); diff --git a/packages/taco/src/web3.ts b/packages/taco/src/web3.ts new file mode 100644 index 000000000..f8923626b --- /dev/null +++ b/packages/taco/src/web3.ts @@ -0,0 +1,25 @@ +export interface Eip712TypedData { + types: { + Wallet: { name: string; type: string }[]; + }; + domain: { + salt: string; + chainId: number; + name: string; + version: string; + }; + message: { + blockHash: string; + address: string; + blockNumber: number; + signatureText: string; + }; +} + +export interface FormattedTypedData extends Eip712TypedData { + primaryType: 'Wallet'; + types: { + EIP712Domain: { name: string; type: string }[]; + Wallet: { name: string; type: string }[]; + }; +} diff --git a/packages/shared/test/unit/conditions/base/condition.test.ts b/packages/taco/test/conditions/base/condition.test.ts similarity index 56% rename from packages/shared/test/unit/conditions/base/condition.test.ts rename to packages/taco/test/conditions/base/condition.test.ts index 4d4c03a51..9ff10c618 100644 --- a/packages/shared/test/unit/conditions/base/condition.test.ts +++ b/packages/taco/test/conditions/base/condition.test.ts @@ -1,39 +1,36 @@ -import { - TEST_CHAIN_ID, - TEST_CONTRACT_ADDR, - testContractConditionObj, -} from '@nucypher/test-utils'; -import { expect, test } from 'vitest'; +import { TEST_CHAIN_ID, TEST_CONTRACT_ADDR } from '@nucypher/test-utils'; +import { describe, expect, it } from 'vitest'; -import { Condition } from '../../../../src'; -import { ContractCondition } from '../../../../src/conditions/base'; import { + Condition, + ContractCondition, ERC721Balance, ERC721Ownership, -} from '../../../../src/conditions/predefined'; +} from '../../../src/conditions'; +import { testContractConditionObj } from '../../test-utils'; -test('validation', () => { +describe('validation', () => { const condition = new ERC721Balance({ contractAddress: TEST_CONTRACT_ADDR, chain: TEST_CHAIN_ID, }); - test('accepts a correct schema', async () => { + it('accepts a correct schema', async () => { const result = Condition.validate(condition.schema, condition.value); expect(result.error).toBeUndefined(); expect(result.data.contractAddress).toEqual(TEST_CONTRACT_ADDR); }); }); -test('serialization', () => { - test('serializes to a plain object', () => { +describe('serialization', () => { + it('serializes to a plain object', () => { const contract = new ContractCondition(testContractConditionObj); expect(contract.toObj()).toEqual({ ...testContractConditionObj, }); }); - test('serializes predefined conditions', () => { + it('serializes predefined conditions', () => { const contract = new ERC721Ownership(testContractConditionObj); expect(contract.toObj()).toEqual({ ...testContractConditionObj, diff --git a/packages/shared/test/unit/conditions/base/contract.test.ts b/packages/taco/test/conditions/base/contract.test.ts similarity index 89% rename from packages/shared/test/unit/conditions/base/contract.test.ts rename to packages/taco/test/conditions/base/contract.test.ts index ce9449d4c..c4e875c7b 100644 --- a/packages/shared/test/unit/conditions/base/contract.test.ts +++ b/packages/taco/test/conditions/base/contract.test.ts @@ -1,26 +1,20 @@ -import { - fakeProvider, - fakeSigner, - testContractConditionObj, - testFunctionAbi, -} from '@nucypher/test-utils'; -import { beforeAll, expect, test } from 'vitest'; +import { initialize } from '@nucypher/nucypher-core'; +import { fakeProvider, fakeSigner } from '@nucypher/test-utils'; +import { beforeAll, describe, expect, it } from 'vitest'; import { ConditionExpression, ContractCondition, ContractConditionProps, CustomContextParam, - initialize, -} from '../../../../src'; -import { - contractConditionSchema, FunctionAbiProps, -} from '../../../../src/conditions/base/contract'; -import { USER_ADDRESS_PARAM } from '../../../../src/conditions/const'; +} from '../../../src/conditions'; +import { contractConditionSchema } from '../../../src/conditions/base/contract'; +import { USER_ADDRESS_PARAM } from '../../../src/conditions/const'; +import { testContractConditionObj, testFunctionAbi } from '../../test-utils'; -test('validation', () => { - test('accepts on a valid schema', () => { +describe('validation', () => { + it('accepts on a valid schema', () => { const result = ContractCondition.validate( contractConditionSchema, testContractConditionObj, @@ -30,7 +24,7 @@ test('validation', () => { expect(result.data).toEqual(testContractConditionObj); }); - test('rejects an invalid schema', () => { + it('rejects an invalid schema', () => { const badContractCondition = { ...testContractConditionObj, // Intentionally removing `contractAddress` @@ -51,7 +45,7 @@ test('validation', () => { }); }); -test('accepts either standardContractType or functionAbi but not both or none', () => { +describe('accepts either standardContractType or functionAbi but not both or none', () => { const standardContractType = 'ERC20'; const functionAbi = { inputs: [ @@ -73,7 +67,7 @@ test('accepts either standardContractType or functionAbi but not both or none', type: 'function', }; - test('accepts standardContractType', () => { + it('accepts standardContractType', () => { const conditionObj = { ...testContractConditionObj, standardContractType, @@ -88,7 +82,7 @@ test('accepts either standardContractType or functionAbi but not both or none', expect(result.data).toEqual(conditionObj); }); - test('accepts functionAbi', () => { + it('accepts functionAbi', () => { const conditionObj = { ...testContractConditionObj, functionAbi, @@ -103,7 +97,7 @@ test('accepts either standardContractType or functionAbi but not both or none', expect(result.data).toEqual(conditionObj); }); - test('rejects both', () => { + it('rejects both', () => { const conditionObj = { ...testContractConditionObj, standardContractType, @@ -123,7 +117,7 @@ test('accepts either standardContractType or functionAbi but not both or none', }); }); - test('rejects none', () => { + it('rejects none', () => { const conditionObj = { ...testContractConditionObj, standardContractType: undefined, @@ -144,7 +138,7 @@ test('accepts either standardContractType or functionAbi but not both or none', }); }); -test('supports custom function abi', () => { +describe('supports custom function abi', () => { const contractConditionObj: ContractConditionProps = { ...testContractConditionObj, standardContractType: undefined, @@ -167,7 +161,7 @@ test('supports custom function abi', () => { await initialize(); }); - test('accepts custom function abi with a custom parameter', async () => { + it('accepts custom function abi with a custom parameter', async () => { const asJson = await conditionExpr .buildContext(fakeProvider(), {}, fakeSigner()) .withCustomParams(customParams) @@ -178,7 +172,7 @@ test('supports custom function abi', () => { expect(asJson).toContain(myCustomParam); }); - test.each([ + it.each([ { method: 'balanceOf', functionAbi: { @@ -217,7 +211,7 @@ test('supports custom function abi', () => { expect(result.data?.functionAbi).toEqual(functionAbi); }); - test.each([ + it.each([ { method: '1234', badField: 'name', diff --git a/packages/taco/test/conditions/base/rpc.test.ts b/packages/taco/test/conditions/base/rpc.test.ts new file mode 100644 index 000000000..952cada5b --- /dev/null +++ b/packages/taco/test/conditions/base/rpc.test.ts @@ -0,0 +1,86 @@ +import { TEST_CONTRACT_ADDR } from '@nucypher/test-utils'; +import { describe, expect, it } from 'vitest'; + +import { RpcCondition } from '../../../src/conditions'; +import { rpcConditionSchema } from '../../../src/conditions/base/rpc'; +import { testRpcConditionObj } from '../../test-utils'; + +describe('validation', () => { + it('accepts on a valid schema', () => { + const result = RpcCondition.validate( + rpcConditionSchema, + testRpcConditionObj, + ); + + expect(result.error).toBeUndefined(); + expect(result.data).toEqual(testRpcConditionObj); + }); + + it('rejects an invalid schema', () => { + const badRpcObj = { + ...testRpcConditionObj, + // Intentionally replacing `method` with an invalid method + method: 'fake_invalid_method', + } as unknown as typeof testRpcConditionObj; + + const result = RpcCondition.validate(rpcConditionSchema, badRpcObj); + + expect(result.error).toBeDefined(); + expect(result.data).toBeUndefined(); + expect(result.error?.format()).toMatchObject({ + method: { + _errors: [ + "Invalid enum value. Expected 'eth_getBalance' | 'balanceOf', received 'fake_invalid_method'", + ], + }, + }); + }); + + describe('parameters', () => { + it('accepts a single address', () => { + const result = RpcCondition.validate(rpcConditionSchema, { + ...testRpcConditionObj, + parameters: [TEST_CONTRACT_ADDR], + }); + + expect(result.error).toBeUndefined(); + expect(result.data).toEqual({ + ...testRpcConditionObj, + parameters: [TEST_CONTRACT_ADDR], + }); + }); + + it('accepts a single address and a block number', () => { + const result = RpcCondition.validate(rpcConditionSchema, { + ...testRpcConditionObj, + parameters: [TEST_CONTRACT_ADDR, 'latest'], + }); + + expect(result.error).toBeUndefined(); + expect(result.data).toEqual({ + ...testRpcConditionObj, + parameters: [TEST_CONTRACT_ADDR, 'latest'], + }); + }); + + it('rejects on an extra parameter', () => { + const result = RpcCondition.validate(rpcConditionSchema, { + ...testRpcConditionObj, + parameters: [ + TEST_CONTRACT_ADDR, + 'latest', + // Intentionally adding a third, invalid parameter + '0x1234', + ], + }); + + expect(result.error).toBeDefined(); + expect(result.data).toBeUndefined(); + expect(result.error?.format()).toMatchObject({ + parameters: { + _errors: ['Array must contain exactly 1 element(s)'], + }, + }); + }); + }); +}); diff --git a/packages/shared/test/unit/conditions/base/time.test.ts b/packages/taco/test/conditions/base/time.test.ts similarity index 78% rename from packages/shared/test/unit/conditions/base/time.test.ts rename to packages/taco/test/conditions/base/time.test.ts index 2b08a9c34..330b11730 100644 --- a/packages/shared/test/unit/conditions/base/time.test.ts +++ b/packages/taco/test/conditions/base/time.test.ts @@ -1,24 +1,22 @@ -import { expect, test } from 'vitest'; +import { describe, expect, it } from 'vitest'; import { + ReturnValueTestProps, TimeCondition, - TimeConditionProps, -} from '../../../../src/conditions/base'; -import { ReturnValueTestProps } from '../../../../src/conditions/base/shared'; -import { TimeConditionMethod, - timeConditionSchema, + TimeConditionProps, TimeConditionType, -} from '../../../../src/conditions/base/time'; +} from '../../../src/conditions'; +import { timeConditionSchema } from '../../../src/conditions/base/time'; -test('validation', () => { +describe('validation', () => { const returnValueTest: ReturnValueTestProps = { index: 0, comparator: '>', value: '100', }; - test('accepts a valid schema', () => { + it('accepts a valid schema', () => { const conditionObj: TimeConditionProps = { conditionType: TimeConditionType, returnValueTest, @@ -31,7 +29,7 @@ test('validation', () => { expect(result.data).toEqual(conditionObj); }); - test('rejects an invalid schema', () => { + it('rejects an invalid schema', () => { const badObj = { conditionType: TimeConditionType, // Intentionally replacing `returnValueTest` with an invalid test diff --git a/packages/shared/test/unit/conditions/compound-condition.test.ts b/packages/taco/test/conditions/compound-condition.test.ts similarity index 64% rename from packages/shared/test/unit/conditions/compound-condition.test.ts rename to packages/taco/test/conditions/compound-condition.test.ts index b2313591d..b988b994a 100644 --- a/packages/shared/test/unit/conditions/compound-condition.test.ts +++ b/packages/taco/test/conditions/compound-condition.test.ts @@ -1,19 +1,18 @@ -import { - testContractConditionObj, - testRpcConditionObj, - testTimeConditionObj, -} from '@nucypher/test-utils'; -import { expect, test } from 'vitest'; +import { describe, expect, it } from 'vitest'; -import { Condition } from '../../../src'; -import { CompoundCondition } from '../../../src/conditions/base'; +import { CompoundCondition, Condition } from '../../src/conditions'; import { compoundConditionSchema, CompoundConditionType, -} from '../../../src/conditions/compound-condition'; +} from '../../src/conditions/compound-condition'; +import { + testContractConditionObj, + testRpcConditionObj, + testTimeConditionObj, +} from '../test-utils'; -test('validation', () => { - test('accepts or operator', () => { +describe('validation', () => { + it('accepts or operator', () => { const conditionObj = { operator: 'or', operands: [testContractConditionObj, testTimeConditionObj], @@ -27,8 +26,9 @@ test('validation', () => { }); }); - test('accepts and operator', () => { + it('accepts and operator', () => { const conditionObj = { + conditionType: CompoundConditionType, operator: 'and', operands: [testContractConditionObj, testTimeConditionObj], }; @@ -44,8 +44,9 @@ test('validation', () => { }); }); - test('rejects an invalid operator', () => { + it('rejects an invalid operator', () => { const result = CompoundCondition.validate(compoundConditionSchema, { + conditionType: CompoundConditionType, operator: 'not-an-operator', operands: [testRpcConditionObj, testTimeConditionObj], }); @@ -61,7 +62,7 @@ test('validation', () => { }); }); - test('rejects invalid number of operands = 0', () => { + it('rejects invalid number of operands = 0', () => { const result = CompoundCondition.validate(compoundConditionSchema, { operator: 'or', operands: [], @@ -76,7 +77,7 @@ test('validation', () => { }); }); - test('rejects invalid number of operands = 1', () => { + it('rejects invalid number of operands = 1', () => { const result = CompoundCondition.validate(compoundConditionSchema, { operator: 'or', operands: [testRpcConditionObj], @@ -90,8 +91,9 @@ test('validation', () => { }); }); - test('accepts recursive compound conditions', () => { + it('accepts recursive compound conditions', () => { const conditionObj = { + conditionType: CompoundConditionType, operator: 'and', operands: [ testContractConditionObj, @@ -123,4 +125,45 @@ test('validation', () => { ], }); }); + + const multichainCondition = { + conditionType: CompoundConditionType, + operator: 'and', + operands: [1, 137, 5, 80001].map((chain) => ({ + ...testRpcConditionObj, + chain, + })), + }; + + it('accepts on a valid multichain condition schema', () => { + const result = CompoundCondition.validate( + compoundConditionSchema, + multichainCondition, + ); + + expect(result.error).toBeUndefined(); + expect(result.data).toEqual(multichainCondition); + }); + + it('rejects an invalid multichain condition schema', () => { + const badMultichainCondition = { + ...multichainCondition, + operands: [ + ...multichainCondition.operands, + { + // Bad condition + ...testRpcConditionObj, + chain: -1, + }, + ], + }; + + const result = CompoundCondition.validate( + compoundConditionSchema, + badMultichainCondition, + ); + + expect(result.error).toBeDefined(); + expect(result.data).toBeUndefined(); + }); }); diff --git a/packages/shared/test/unit/conditions/condition-expr.test.ts b/packages/taco/test/conditions/condition-expr.test.ts similarity index 85% rename from packages/shared/test/unit/conditions/condition-expr.test.ts rename to packages/taco/test/conditions/condition-expr.test.ts index fba45abbf..4a24fc77c 100644 --- a/packages/shared/test/unit/conditions/condition-expr.test.ts +++ b/packages/taco/test/conditions/condition-expr.test.ts @@ -1,30 +1,31 @@ -import { - TEST_CHAIN_ID, - TEST_CONTRACT_ADDR, - testContractConditionObj, - testFunctionAbi, - testReturnValueTest, - testRpcConditionObj, - testTimeConditionObj, -} from '@nucypher/test-utils'; +import { initialize } from '@nucypher/nucypher-core'; +import { objectEquals, toJSON } from '@nucypher/shared'; +import { TEST_CHAIN_ID, TEST_CONTRACT_ADDR } from '@nucypher/test-utils'; import { SemVer } from 'semver'; -import { expect, test } from 'vitest'; +import { beforeAll, describe, expect, it } from 'vitest'; -import { ConditionExpression, objectEquals, toJSON } from '../../../src'; import { CompoundCondition, + ConditionExpression, ContractCondition, ContractConditionProps, + ERC721Balance, RpcCondition, RpcConditionType, TimeCondition, TimeConditionProps, -} from '../../../src/conditions/base'; -import { USER_ADDRESS_PARAM } from '../../../src/conditions/const'; -import { ERC721Balance } from '../../../src/conditions/predefined'; +} from '../../src/conditions'; +import { USER_ADDRESS_PARAM } from '../../src/conditions/const'; +import { + testContractConditionObj, + testFunctionAbi, + testReturnValueTest, + testRpcConditionObj, + testTimeConditionObj, +} from '../test-utils'; -test('condition set', () => { - const erc721BalanceCondition = new ERC721Balance({ +describe('condition set', () => { + const erc721Balance = new ERC721Balance({ chain: TEST_CHAIN_ID, contractAddress: TEST_CONTRACT_ADDR, }); @@ -63,20 +64,24 @@ test('condition set', () => { ], }); - test('equality', () => { + beforeAll(async () => { + await initialize(); + }); + + describe('equality', () => { const conditionExprCurrentVersion = new ConditionExpression(rpcCondition); - test('same version and condition', () => { + it('same version and condition', () => { const conditionExprSameCurrentVersion = new ConditionExpression( rpcCondition, - ConditionExpression.VERSION, + ConditionExpression.version, ); expect( conditionExprCurrentVersion.equals(conditionExprSameCurrentVersion), ).toBeTruthy(); }); - test('different minor/patch version but same condition', () => { + it('different minor/patch version but same condition', () => { const conditionExprOlderMinorVersion = new ConditionExpression( rpcCondition, '0.1.0', @@ -96,7 +101,7 @@ test('condition set', () => { ).not.toBeTruthy(); }); - test('minor/patch number greater than major; still older', () => { + it('minor/patch number greater than major; still older', () => { const conditionExprOlderMinorVersion = new ConditionExpression( rpcCondition, '0.9.0', @@ -133,8 +138,8 @@ test('condition set', () => { ).not.toBeTruthy(); }); - test.each([ - erc721BalanceCondition, + it.each([ + erc721Balance, contractConditionNoAbi, contractConditionWithAbi, timeCondition, @@ -149,27 +154,22 @@ test('condition set', () => { ).not.toBeTruthy(); }); - test('same contract condition although using erc721 helper', () => { - const erc721ConditionExpr = new ConditionExpression( - erc721BalanceCondition, - ); - const erc721ConditionData = erc721BalanceCondition.toObj(); + it('same contract condition although using erc721 helper', () => { + const conditionExpr = new ConditionExpression(erc721Balance); + const erc721ConditionData = erc721Balance.toObj(); const sameContractCondition = new ContractCondition(erc721ConditionData); const contractConditionExpr = new ConditionExpression( sameContractCondition, ); expect( - objectEquals( - erc721ConditionExpr.toObj(), - contractConditionExpr.toObj(), - ), + objectEquals(conditionExpr.toObj(), contractConditionExpr.toObj()), ).toBeTruthy(); }); }); - test('serialization / deserialization', () => { - test.each([ - erc721BalanceCondition, + describe('serialization / deserialization', () => { + it.each([ + erc721Balance, contractConditionNoAbi, contractConditionWithAbi, rpcCondition, @@ -180,7 +180,7 @@ test('condition set', () => { const conditionExprJson = conditionExpr.toJson(); expect(conditionExprJson).toBeDefined(); expect(conditionExprJson).toContain('version'); - expect(conditionExprJson).toContain(ConditionExpression.VERSION); + expect(conditionExprJson).toContain(ConditionExpression.version); expect(conditionExprJson).toContain('condition'); expect(conditionExprJson).toContain(toJSON(condition.toObj())); @@ -196,15 +196,15 @@ test('condition set', () => { expect(fromWasmConditions.equals(conditionExprFromJson)).toBeTruthy(); }); - test('serializes to and from WASM conditions', () => { - const conditionExpr = new ConditionExpression(erc721BalanceCondition); + it('serializes to and from WASM conditions', () => { + const conditionExpr = new ConditionExpression(erc721Balance); const wasmConditions = conditionExpr.toWASMConditions(); const fromWasm = ConditionExpression.fromWASMConditions(wasmConditions); expect(conditionExpr.equals(fromWasm)).toBeTruthy(); }); - test('incompatible version', () => { - const currentVersion = new SemVer(ConditionExpression.VERSION); + it('incompatible version', () => { + const currentVersion = new SemVer(ConditionExpression.version); const invalidVersion = currentVersion.inc('major'); expect(() => { ConditionExpression.fromObj({ @@ -212,11 +212,11 @@ test('condition set', () => { condition: testTimeConditionObj, }); }).toThrow( - `Version provided, ${invalidVersion}, is incompatible with current version, ${ConditionExpression.VERSION}`, + `Version provided, ${invalidVersion}, is incompatible with current version, ${ConditionExpression.version}`, ); }); - test.each(['version', 'x.y', 'x.y.z', '-1,0.0', '1.0.0.0.0.0.0'])( + it.each(['version', 'x.y', 'x.y.z', '-1,0.0', '1.0.0.0.0.0.0'])( 'invalid versions', (invalidVersion) => { expect(() => { @@ -228,7 +228,7 @@ test('condition set', () => { }, ); - test.each(['_invalid_condition_type_', undefined as unknown as string])( + it.each(['_invalid_condition_type_', undefined as unknown as string])( 'rejects an invalid condition type', (invalidConditionType) => { const conditionObj = { @@ -237,42 +237,40 @@ test('condition set', () => { } as unknown as TimeConditionProps; expect(() => { ConditionExpression.fromObj({ - version: ConditionExpression.VERSION, + version: ConditionExpression.version, condition: conditionObj, }); }).toThrow(`Invalid conditionType: ${invalidConditionType}`); }, ); - test('rejects a mismatched condition type', () => { + it('rejects a mismatched condition type', () => { const conditionObj = { ...testTimeConditionObj, conditionType: RpcConditionType, } as unknown as TimeConditionProps; expect(() => { ConditionExpression.fromObj({ - version: ConditionExpression.VERSION, + version: ConditionExpression.version, condition: conditionObj, }); }).toThrow(/^Invalid condition/); }); - test('erc721 condition serialization', () => { - const conditionExpr = new ConditionExpression(erc721BalanceCondition); + it('erc721 condition serialization', () => { + const conditionExpr = new ConditionExpression(erc721Balance); - const erc721BalanceConditionObj = erc721BalanceCondition.toObj(); + const asObj = erc721Balance.toObj(); const conditionExprJson = conditionExpr.toJson(); expect(conditionExprJson).toBeDefined(); expect(conditionExprJson).toContain('chain'); expect(conditionExprJson).toContain(TEST_CHAIN_ID.toString()); expect(conditionExprJson).toContain('contractAddress'); - expect(conditionExprJson).toContain( - erc721BalanceConditionObj.contractAddress, - ); + expect(conditionExprJson).toContain(asObj.contractAddress); expect(conditionExprJson).toContain('standardContractType'); expect(conditionExprJson).toContain('ERC721'); expect(conditionExprJson).toContain('method'); - expect(conditionExprJson).toContain(erc721BalanceConditionObj.method); + expect(conditionExprJson).toContain(asObj.method); expect(conditionExprJson).toContain('returnValueTest'); expect(conditionExprJson).not.toContain('functionAbi'); @@ -285,7 +283,7 @@ test('condition set', () => { expect(conditionExprFromJson.condition).toBeInstanceOf(ContractCondition); }); - test('contract condition no abi serialization', () => { + it('contract condition no abi serialization', () => { const conditionExpr = new ConditionExpression(contractConditionNoAbi); const conditionExprJson = conditionExpr.toJson(); @@ -317,7 +315,7 @@ test('condition set', () => { expect(conditionExprFromJson.condition).toBeInstanceOf(ContractCondition); }); - test('contract condition with abi serialization', () => { + it('contract condition with abi serialization', () => { const conditionExpr = new ConditionExpression(contractConditionWithAbi); const conditionExprJson = conditionExpr.toJson(); @@ -350,7 +348,7 @@ test('condition set', () => { expect(conditionExprFromJson.condition).toBeInstanceOf(ContractCondition); }); - test('time condition serialization', () => { + it('time condition serialization', () => { const conditionExpr = new ConditionExpression(timeCondition); const conditionExprJson = conditionExpr.toJson(); @@ -373,7 +371,7 @@ test('condition set', () => { expect(conditionExprFromJson.condition).toBeInstanceOf(TimeCondition); }); - test('rpc condition serialization', () => { + it('rpc condition serialization', () => { const conditionExpr = new ConditionExpression(rpcCondition); const conditionExprJson = conditionExpr.toJson(); @@ -397,7 +395,7 @@ test('condition set', () => { expect(conditionExprFromJson.condition).toBeInstanceOf(RpcCondition); }); - test('compound condition serialization', () => { + it('compound condition serialization', () => { const conditionExpr = new ConditionExpression(compoundCondition); const compoundConditionObj = compoundCondition.toObj(); diff --git a/packages/shared/test/unit/conditions/context.test.ts b/packages/taco/test/conditions/context.test.ts similarity index 83% rename from packages/shared/test/unit/conditions/context.test.ts rename to packages/taco/test/conditions/context.test.ts index 8ff23e591..de035f61f 100644 --- a/packages/shared/test/unit/conditions/context.test.ts +++ b/packages/taco/test/conditions/context.test.ts @@ -1,25 +1,24 @@ -import { - fakeProvider, - fakeSigner, - testContractConditionObj, - testFunctionAbi, - testReturnValueTest, - testRpcConditionObj, -} from '@nucypher/test-utils'; +import { initialize } from '@nucypher/nucypher-core'; +import { fakeProvider, fakeSigner } from '@nucypher/test-utils'; import { ethers } from 'ethers'; -import { beforeAll, expect, test } from 'vitest'; +import { beforeAll, describe, expect, it } from 'vitest'; import { ConditionExpression, ContractCondition, CustomContextParam, - initialize, RpcCondition, -} from '../../../src'; -import { USER_ADDRESS_PARAM } from '../../../src/conditions/const'; -import { RESERVED_CONTEXT_PARAMS } from '../../../src/conditions/context/context'; +} from '../../src/conditions'; +import { USER_ADDRESS_PARAM } from '../../src/conditions/const'; +import { RESERVED_CONTEXT_PARAMS } from '../../src/conditions/context/context'; +import { + testContractConditionObj, + testFunctionAbi, + testReturnValueTest, + testRpcConditionObj, +} from '../test-utils'; -test('context', () => { +describe('context', () => { let provider: ethers.providers.Provider; let signer: ethers.Signer; @@ -29,8 +28,8 @@ test('context', () => { signer = fakeSigner(); }); - test('serialization', () => { - test('serializes to json', async () => { + describe('serialization', () => { + it('serializes to json', async () => { const rpcCondition = new RpcCondition({ ...testRpcConditionObj, parameters: [USER_ADDRESS_PARAM], @@ -44,12 +43,13 @@ test('context', () => { rpcCondition, ).buildContext(provider, {}, signer); const asJson = await conditionContext.toJson(); + expect(asJson).toBeDefined(); expect(asJson).toContain(USER_ADDRESS_PARAM); }); }); - test('context parameters', () => { + describe('context parameters', () => { const customParamKey = ':customParam'; const customParams: Record = {}; customParams[customParamKey] = 1234; @@ -65,8 +65,8 @@ test('context', () => { const conditionExpr = new ConditionExpression(contractCondition); const conditionContext = conditionExpr.buildContext(provider, {}, signer); - test('return value test', () => { - test('accepts on a custom context parameters', async () => { + describe('return value test', () => { + it('accepts on a custom context parameters', async () => { const asObj = await conditionContext .withCustomParams(customParams) .toObj(); @@ -74,14 +74,14 @@ test('context', () => { expect(asObj[customParamKey]).toEqual(1234); }); - test('rejects on a missing custom context parameter', async () => { + it('rejects on a missing custom context parameter', async () => { await expect(conditionContext.toObj()).rejects.toThrow( `Missing custom context parameter(s): ${customParamKey}`, ); }); }); - test('rejects on using reserved context parameter', () => { + it('rejects on using reserved context parameter', () => { const badCustomParams: Record = {}; RESERVED_CONTEXT_PARAMS.forEach((reservedParam) => { badCustomParams[reservedParam] = 'this-will-throw'; @@ -93,7 +93,7 @@ test('context', () => { }); }); - test('detects if a signer is required', () => { + it('detects if a signer is required', () => { const conditionObj = { ...testContractConditionObj, returnValueTest: { @@ -110,7 +110,7 @@ test('context', () => { ); }); - test('detects if a signer is not required', () => { + it('detects if a signer is not required', () => { const condition = new RpcCondition(testRpcConditionObj); const conditionExpr = new ConditionExpression(condition); expect( @@ -121,7 +121,7 @@ test('context', () => { expect(conditionExpr.buildContext(provider, {})).toBeDefined(); }); - test('rejects on a missing signer', () => { + it('rejects on a missing signer', () => { const conditionObj = { ...testContractConditionObj, returnValueTest: { @@ -137,7 +137,7 @@ test('context', () => { ); }); - test('rejects on a missing signer', () => { + it('rejects on a missing signer', () => { const conditionObj = { ...testContractConditionObj, returnValueTest: { @@ -153,7 +153,7 @@ test('context', () => { ); }); - test('custom method parameters', () => { + describe('custom method parameters', () => { const contractConditionObj = { ...testContractConditionObj, standardContractType: undefined, // We're going to use a custom function ABI @@ -165,7 +165,7 @@ test('context', () => { }, }; - test('rejects on a missing parameter ', async () => { + it('rejects on a missing parameter ', async () => { const customContractCondition = new ContractCondition({ ...contractConditionObj, parameters: [USER_ADDRESS_PARAM, customParamKey], @@ -179,7 +179,7 @@ test('context', () => { ); }); - test('accepts on a hard-coded parameter', async () => { + it('accepts on a hard-coded parameter', async () => { const customContractCondition = new ContractCondition({ ...contractConditionObj, parameters: [USER_ADDRESS_PARAM, 100], diff --git a/packages/taco/test/dkg-client.test.ts b/packages/taco/test/dkg-client.test.ts new file mode 100644 index 000000000..ca1ac544b --- /dev/null +++ b/packages/taco/test/dkg-client.test.ts @@ -0,0 +1,50 @@ +import { DkgCoordinatorAgent } from '@nucypher/shared'; +import { fakeProvider } from '@nucypher/test-utils'; +import { beforeAll, describe, expect, it } from 'vitest'; + +import { initialize } from '../src'; + +import { + fakeRitualId, + mockDkgParticipants, + mockGetParticipants, + mockGetRitual, +} from './test-utils'; + +describe('DkgCoordinatorAgent', () => { + beforeAll(async () => { + await initialize(); + }); + + it('fetches transcripts from the coordinator', async () => { + const provider = fakeProvider(); + const getRitualSpy = mockGetRitual(); + const ritual = await DkgCoordinatorAgent.getRitual(provider, fakeRitualId); + expect(ritual).toBeDefined(); + expect(getRitualSpy).toHaveBeenCalled(); + }); + + it('fetches participants from the coordinator', async () => { + const provider = fakeProvider(); + const getParticipantsSpy = mockGetParticipants( + (await mockDkgParticipants(fakeRitualId)).participants, + ); + const participants = await DkgCoordinatorAgent.getParticipants( + provider, + fakeRitualId, + ); + expect(getParticipantsSpy).toHaveBeenCalled(); + expect(participants.length).toBeGreaterThan(0); + }); +}); + +// TODO: Fix this test after the DkgClient.verifyRitual() method is implemented +// describe('DkgClient', () => { +// it('verifies the dkg ritual', async () => { +// const provider = fakeWeb3Provider(SecretKey.random().toBEBytes()); +// +// const dkgClient = new DkgClient(provider); +// const isValid = await dkgClient.verifyRitual(fakeRitualId); +// expect(isValid).toBeTruthy(); +// }); +// }); diff --git a/packages/shared/test/unit/ritual.test.ts b/packages/taco/test/ritual.test.ts similarity index 67% rename from packages/shared/test/unit/ritual.test.ts rename to packages/taco/test/ritual.test.ts index d4645920a..32308b270 100644 --- a/packages/shared/test/unit/ritual.test.ts +++ b/packages/taco/test/ritual.test.ts @@ -1,10 +1,13 @@ import { DkgPublicKey } from '@nucypher/nucypher-core'; -import { expect, test } from 'vitest'; +import { fromHexString, initialize } from '@nucypher/shared'; +import { beforeAll, describe, expect, it } from 'vitest'; -import { fromHexString } from '../../src'; +describe('Ritual', () => { + beforeAll(async () => { + await initialize(); + }); -test('Ritual', () => { - test('deserializes pre-made dkg ritual', async () => { + it('deserializes pre-made dkg ritual', async () => { const pkWord1 = fromHexString( '9045795411ed251bf2eecc9415552c41863502a207104ef7ab482bc2364729d9', ); diff --git a/packages/taco/test/taco.test.ts b/packages/taco/test/taco.test.ts index 1309d6c10..6a62e1fdd 100644 --- a/packages/taco/test/taco.test.ts +++ b/packages/taco/test/taco.test.ts @@ -1,58 +1,57 @@ import { FerveoVariant, initialize, - SecretKey, SessionStaticSecret, } from '@nucypher/nucypher-core'; -import { predefined, toBytes } from '@nucypher/shared'; import { aliceSecretKeyBytes, fakeDkgFlow, - fakeDkgRitual, fakePorterUri, fakeProvider, fakeSigner, fakeTDecFlow, mockCbdDecrypt, - mockDkgParticipants, - mockGetFinalizedRitualSpy, - mockGetParticipants, mockGetRitualIdFromPublicKey, - mockRandomSessionStaticSecret, } from '@nucypher/test-utils'; -import { beforeAll, expect, test } from 'vitest'; +import { beforeAll, describe, expect, it } from 'vitest'; import * as taco from '../src'; +import { conditions, toBytes } from '../src'; + +import { + fakeDkgRitual, + mockDkgParticipants, + mockGetFinalizedRitual, + mockGetParticipants, + mockMakeSessionKey, +} from './test-utils'; // Shared test variables -let aliceSecretKey: SecretKey; -let variant: FerveoVariant; const message = 'this is a secret'; -const ownsNFT = new predefined.ERC721Ownership({ +const ownsNFT = new conditions.ERC721Ownership({ contractAddress: '0x1e988ba4692e52Bc50b375bcC8585b95c48AaD77', parameters: [3591], chain: 5, }); -test('taco', () => { +describe('taco', () => { beforeAll(async () => { await initialize(); - aliceSecretKey = SecretKey.fromBEBytes(aliceSecretKeyBytes); - variant = FerveoVariant.precomputed; }); - test('encrypts and decrypts', async () => { - const mockedDkg = fakeDkgFlow(variant, 0, 4, 4); + it('encrypts and decrypts', async () => { + const mockedDkg = fakeDkgFlow(FerveoVariant.precomputed, 0, 4, 4); const mockedDkgRitual = fakeDkgRitual(mockedDkg); - const provider = fakeProvider(aliceSecretKey.toBEBytes()); - const signer = fakeSigner(aliceSecretKey.toBEBytes()); - const getFinalizedRitualSpy = mockGetFinalizedRitualSpy(mockedDkgRitual); + const provider = fakeProvider(aliceSecretKeyBytes); + const signer = fakeSigner(aliceSecretKeyBytes); + const getFinalizedRitualSpy = mockGetFinalizedRitual(mockedDkgRitual); const messageKit = await taco.encrypt( provider, message, ownsNFT, mockedDkg.ritualId, + signer, ); expect(getFinalizedRitualSpy).toHaveBeenCalled(); @@ -62,7 +61,7 @@ test('taco', () => { dkgPublicKey: mockedDkg.dkg.publicKey(), thresholdMessageKit: messageKit, }); - const { participantSecrets, participants } = mockDkgParticipants( + const { participantSecrets, participants } = await mockDkgParticipants( mockedDkg.ritualId, ); const requesterSessionKey = SessionStaticSecret.random(); @@ -73,11 +72,11 @@ test('taco', () => { requesterSessionKey.publicKey(), ); const getParticipantsSpy = mockGetParticipants(participants); - const sessionKeySpy = mockRandomSessionStaticSecret(requesterSessionKey); + const sessionKeySpy = mockMakeSessionKey(requesterSessionKey); const getRitualIdFromPublicKey = mockGetRitualIdFromPublicKey( mockedDkg.ritualId, ); - const getRitualSpy = mockGetFinalizedRitualSpy(mockedDkgRitual); + const getRitualSpy = mockGetFinalizedRitual(mockedDkgRitual); const decryptedMessage = await taco.decrypt( provider, diff --git a/packages/taco/test/test-utils.ts b/packages/taco/test/test-utils.ts new file mode 100644 index 000000000..3ae882033 --- /dev/null +++ b/packages/taco/test/test-utils.ts @@ -0,0 +1,285 @@ +// Disabling some of the eslint rules for convenience. +/* eslint-disable @typescript-eslint/no-non-null-assertion */ +/* eslint-disable @typescript-eslint/no-explicit-any */ +/* eslint-disable @typescript-eslint/no-unused-vars */ + +import { + AggregatedTranscript, + DecryptionShareSimple, + Dkg, + FerveoVariant, + Keypair, + SessionSecretFactory, + SessionStaticSecret, + ThresholdMessageKit, + Transcript, + Validator, + ValidatorMessage, +} from '@nucypher/nucypher-core'; +import { + CoordinatorRitual, + DkgCoordinatorAgent, + DkgParticipant, + DkgRitualState, + toBytes, + toHexString, + zip, +} from '@nucypher/shared'; +import { + fakeDkgFlow, + fakeSigner, + fakeTDecFlow, + TEST_CHAIN_ID, + TEST_CONTRACT_ADDR, +} from '@nucypher/test-utils'; +import { ethers } from 'ethers'; +import { keccak256 } from 'ethers/lib/utils'; +import { SpyInstance, vi } from 'vitest'; + +import { + ConditionExpression, + ContractConditionProps, + ContractConditionType, + ERC721Balance, + FunctionAbiProps, + ReturnValueTestProps, + RpcConditionProps, + RpcConditionType, + TimeConditionMethod, + TimeConditionProps, + TimeConditionType, +} from '../src/conditions'; +import { DkgClient, DkgRitual } from '../src/dkg'; +import { encryptMessage } from '../src/tdec'; + +export const fakeDkgTDecFlowE2E: ( + ritualId?: number, + variant?: FerveoVariant, + conditionExpr?: ConditionExpression, + message?: Uint8Array, + sharesNum?: number, + threshold?: number, +) => Promise<{ + dkg: Dkg; + serverAggregate: AggregatedTranscript; + sharesNum: number; + transcripts: Transcript[]; + validatorKeypairs: Keypair[]; + validators: Validator[]; + ritualId: number; + threshold: number; + receivedMessages: ValidatorMessage[]; + message: Uint8Array; + thresholdMessageKit: ThresholdMessageKit; + decryptionShares: DecryptionShareSimple[]; +}> = async ( + ritualId = 0, + variant: FerveoVariant = FerveoVariant.precomputed, + conditionExpr: ConditionExpression = fakeConditionExpr(), + message = toBytes('fake-message'), + sharesNum = 4, + threshold = 4, +) => { + const ritual = fakeDkgFlow(variant, ritualId, sharesNum, threshold); + const dkgPublicKey = ritual.dkg.publicKey(); + const thresholdMessageKit = await encryptMessage( + message, + dkgPublicKey, + conditionExpr, + fakeSigner(), + ); + + const { decryptionShares } = fakeTDecFlow({ + ...ritual, + message, + dkgPublicKey, + thresholdMessageKit, + }); + + return { + ...ritual, + message, + decryptionShares, + thresholdMessageKit, + }; +}; + +export const fakeCoordinatorRitual = async ( + ritualId: number, +): Promise => { + const ritual = await fakeDkgTDecFlowE2E(); + const dkgPkBytes = ritual.dkg.publicKey().toBytes(); + return { + id: ritualId, + initiator: ritual.validators[0].address.toString(), + dkgSize: ritual.sharesNum, + initTimestamp: 0, + totalTranscripts: ritual.receivedMessages.length, + totalAggregations: ritual.sharesNum, // Assuming the ritual is finished + aggregatedTranscriptHash: keccak256(ritual.serverAggregate.toBytes()), + aggregationMismatch: false, // Assuming the ritual is correct + aggregatedTranscript: toHexString(ritual.serverAggregate.toBytes()), + publicKey: { + word0: toHexString(dkgPkBytes.slice(0, 32)), + word1: toHexString(dkgPkBytes.slice(32, 48)), + }, + publicKeyHash: keccak256(ritual.dkg.publicKey().toBytes()), + }; +}; + +export const mockDkgParticipants = async ( + ritualId: number, +): Promise<{ + participants: DkgParticipant[]; + participantSecrets: Record; +}> => { + const ritual = await fakeDkgTDecFlowE2E(ritualId); + const label = toBytes(`${ritualId}`); + + const participantSecrets: Record = + Object.fromEntries( + ritual.validators.map(({ address }) => { + const participantSecret = SessionSecretFactory.random().makeKey(label); + return [address.toString(), participantSecret]; + }), + ); + + const participants: DkgParticipant[] = zip( + Object.entries(participantSecrets), + ritual.transcripts, + ).map(([[address, secret], transcript]) => { + return { + provider: address, + aggregated: true, // Assuming all validators already contributed to the aggregate + transcript, + decryptionRequestStaticKey: secret.publicKey(), + } as DkgParticipant; + }); + return { participantSecrets, participants }; +}; + +export const fakeRitualId = 0; + +export const fakeDkgRitual = (ritual: { + dkg: Dkg; + sharesNum: number; + threshold: number; +}) => { + return new DkgRitual( + fakeRitualId, + ritual.dkg.publicKey(), + ritual.sharesNum, + ritual.threshold, + DkgRitualState.FINALIZED, + ); +}; + +export const mockGetRitual = (): SpyInstance => { + return vi + .spyOn(DkgCoordinatorAgent, 'getRitual') + .mockImplementation( + (_provider: ethers.providers.Provider, _ritualId: number) => { + return Promise.resolve(fakeCoordinatorRitual(fakeRitualId)); + }, + ); +}; + +export const mockGetFinalizedRitual = (dkgRitual: DkgRitual): SpyInstance => { + return vi.spyOn(DkgClient, 'getFinalizedRitual').mockImplementation(() => { + return Promise.resolve(dkgRitual); + }); +}; + +export const mockIsEncryptionAuthorized = ( + isAuthorized = true, +): SpyInstance => { + return vi + .spyOn(DkgCoordinatorAgent, 'isEncryptionAuthorized') + .mockImplementation(async () => { + return Promise.resolve(isAuthorized); + }); +}; + +export const mockMakeSessionKey = (secret: SessionStaticSecret) => { + return vi + .spyOn(SessionStaticSecret, 'random') + .mockImplementation(() => secret); +}; + +export const testReturnValueTest: ReturnValueTestProps = { + index: 0, + comparator: '>', + value: '100', +}; + +export const testTimeConditionObj: TimeConditionProps = { + conditionType: TimeConditionType, + returnValueTest: { + index: 0, + comparator: '>', + value: '100', + }, + method: TimeConditionMethod, + chain: 5, +}; + +export const testRpcConditionObj: RpcConditionProps = { + conditionType: RpcConditionType, + chain: TEST_CHAIN_ID, + method: 'eth_getBalance', + parameters: ['0x1e988ba4692e52Bc50b375bcC8585b95c48AaD77', 'latest'], + returnValueTest: testReturnValueTest, +}; + +export const testContractConditionObj: ContractConditionProps = { + conditionType: ContractConditionType, + contractAddress: '0x0000000000000000000000000000000000000000', + chain: 5, + standardContractType: 'ERC20', + method: 'balanceOf', + parameters: ['0x1e988ba4692e52Bc50b375bcC8585b95c48AaD77'], + returnValueTest: testReturnValueTest, +}; + +export const testFunctionAbi: FunctionAbiProps = { + name: 'myFunction', + type: 'function', + stateMutability: 'view', + inputs: [ + { + internalType: 'address', + name: 'account', + type: 'address', + }, + { + internalType: 'uint256', + name: 'myCustomParam', + type: 'uint256', + }, + ], + outputs: [ + { + internalType: 'uint256', + name: 'someValue', + type: 'uint256', + }, + ], +}; + +export const fakeConditionExpr = () => { + const condition = new ERC721Balance({ + chain: TEST_CHAIN_ID, + contractAddress: TEST_CONTRACT_ADDR, + }); + return new ConditionExpression(condition); +}; + +export const mockGetParticipants = ( + participants: DkgParticipant[], +): SpyInstance => { + return vi + .spyOn(DkgCoordinatorAgent, 'getParticipants') + .mockImplementation(() => { + return Promise.resolve(participants); + }); +}; diff --git a/packages/taco/tsconfig.cjs.json b/packages/taco/tsconfig.cjs.json new file mode 100644 index 000000000..035a2ab62 --- /dev/null +++ b/packages/taco/tsconfig.cjs.json @@ -0,0 +1,7 @@ +{ + "extends": "./tsconfig.es.json", + "compilerOptions": { + "outDir": "dist/cjs", + "module": "CommonJS", + } +} diff --git a/packages/taco/tsconfig.es.json b/packages/taco/tsconfig.es.json new file mode 100644 index 000000000..2ffa9192c --- /dev/null +++ b/packages/taco/tsconfig.es.json @@ -0,0 +1,10 @@ +{ + "extends": "./tsconfig.json", + "include": ["src"], + "compilerOptions": { + "outDir": "dist/es", + "rootDir": "src", + "module": "ES2022", + "target": "ES2022" + } +} diff --git a/packages/taco/tsconfig.json b/packages/taco/tsconfig.json index 4448fdf2c..aacfbec2c 100644 --- a/packages/taco/tsconfig.json +++ b/packages/taco/tsconfig.json @@ -5,4 +5,9 @@ "esModuleInterop": true, "skipLibCheck": true, }, + "references": [ + { + "path": "../shared/tsconfig.es.json" + } + ] } diff --git a/packages/taco/typedoc.json b/packages/taco/typedoc.json index 5ec0fcc63..f031a066d 100644 --- a/packages/taco/typedoc.json +++ b/packages/taco/typedoc.json @@ -1,6 +1,6 @@ { "extends": ["../../typedoc.base.json"], "entryPoints": ["src/index.ts"], - "tsconfig": "tsconfig.build.json", + "tsconfig": "tsconfig.es.json", "name": "@nucypher/taco" } diff --git a/packages/test-utils/package.json b/packages/test-utils/package.json index c2ed6f69f..b4e16a5b1 100644 --- a/packages/test-utils/package.json +++ b/packages/test-utils/package.json @@ -10,39 +10,33 @@ "author": "Piotr Roslaniec ", "exports": { ".": { - "import": "./dist/index.js", - "require": "./dist/index.js" + "import": "./dist/es/index.js", + "require": "./dist/cjs/index.js" } }, - "main": "./dist/index.js", - "module": "./dist/index.js", - "types": "./dist/index.d.ts", + "main": "./dist/cjs/index.js", + "module": "./dist/es/index.js", + "types": "./dist/cjs/index.d.ts", "files": [ - "dist/**/*" + "dist" ], "scripts": { - "build": "tsc --build ./tsconfig.build.json --verbose", + "build": "pnpm build:module && pnpm build:cjs", + "build:cjs": "tsc --build ./tsconfig.cjs.json --verbose", + "build:module": "tsc --build ./tsconfig.es.json --verbose", "exports:lint": "ts-unused-exports tsconfig.json --ignoreFiles src/index.ts", "lint": "eslint --ext .ts src", "lint:fix": "pnpm lint --fix" }, "dependencies": { - "@nucypher/nucypher-core": "0.13.0-alpha.0", + "@nucypher/nucypher-core": "0.13.0-alpha.1", "@nucypher/shared": "workspace:*", "axios": "^1.5.0", - "ethers": "^5.7.2" - }, - "devDependencies": { - "@typechain/ethers-v5": "^11.1.1", - "@types/deep-equal": "^1.0.1", - "@types/qs": "^6.9.7", - "@types/semver": "^7.5.0", - "cz-conventional-changelog": "^3.0.1", - "standard-version": "^9.0.0", - "typechain": "^8.3.1" + "ethers": "^5.7.2", + "vitest": "^0.34.4" }, "engines": { - "node": ">=16", + "node": ">=18", "pnpm": ">=8.0.0" } } diff --git a/packages/test-utils/src/utils.ts b/packages/test-utils/src/utils.ts index 7c23c0178..91c3df776 100644 --- a/packages/test-utils/src/utils.ts +++ b/packages/test-utils/src/utils.ts @@ -2,6 +2,7 @@ /* eslint-disable @typescript-eslint/no-non-null-assertion */ /* eslint-disable @typescript-eslint/no-explicit-any */ /* eslint-disable @typescript-eslint/no-unused-vars */ + import { AggregatedTranscript, Capsule, @@ -12,14 +13,12 @@ import { Dkg, DkgPublicKey, EncryptedThresholdDecryptionResponse, - EncryptedTreasureMap, EthereumAddress, FerveoVariant, Keypair, - PublicKey, + MessageKit, reencrypt, SecretKey, - SessionSecretFactory, SessionStaticKey, SessionStaticSecret, ThresholdDecryptionResponse, @@ -27,42 +26,23 @@ import { Transcript, Validator, ValidatorMessage, - VerifiedCapsuleFrag, VerifiedKeyFrag, } from '@nucypher/nucypher-core'; import { - Alice, - BlockchainPolicy, - Bob, CbdDecryptResult, ChecksumAddress, - Cohort, - ConditionExpression, - DkgClient, DkgCoordinatorAgent, - DkgParticipant, - DkgRitual, - DkgRitualState, - Enrico, - ERC721Balance, GetUrsulasResult, PorterClient, - PreEnactedPolicy, - RemoteBob, RetrieveCFragsResult, - ThresholdDecrypter, - toBytes, toHexString, Ursula, zip, } from '@nucypher/shared'; import axios from 'axios'; import { ethers, providers, Wallet } from 'ethers'; -import { keccak256 } from 'ethers/lib/utils'; import { expect, SpyInstance, vi } from 'vitest'; -import { TEST_CHAIN_ID, TEST_CONTRACT_ADDR } from './variables'; - export const bytesEqual = (first: Uint8Array, second: Uint8Array): boolean => first.length === second.length && first.every((value, index) => value === second[index]); @@ -72,23 +52,6 @@ export const fromBytes = (bytes: Uint8Array): string => export const fakePorterUri = 'https://_this_should_crash.com/'; -export const fakeBob = (): Bob => { - const secretKey = SecretKey.fromBEBytes( - toBytes('fake-secret-key-32-bytes-bob-xxx'), - ); - return Bob.fromSecretKey(secretKey); -}; - -export const fakeRemoteBob = (): RemoteBob => { - const { decryptingKey, verifyingKey } = fakeBob(); - return RemoteBob.fromKeys(decryptingKey, verifyingKey); -}; - -export const fakeAlice = (aliceKey = 'fake-secret-key-32-bytes-alice-x') => { - const secretKey = SecretKey.fromBEBytes(toBytes(aliceKey)); - return Alice.fromSecretKey(secretKey); -}; - const makeFakeProvider = (timestamp: number, blockNumber: number) => { const block = { timestamp }; return { @@ -134,8 +97,10 @@ export const fakeProvider = ( const genChecksumAddress = (i: number) => '0x' + '0'.repeat(40 - i.toString(16).length) + i.toString(16); + const genEthAddr = (i: number) => EthereumAddress.fromString(genChecksumAddress(i)); + export const fakeUrsulas = (n = 4): Ursula[] => // 0...n-1 Array.from(Array(n).keys()).map((i: number) => ({ @@ -144,9 +109,7 @@ export const fakeUrsulas = (n = 4): Ursula[] => uri: `https://example.${i}.com:9151`, })); -export const mockGetUrsulas = ( - ursulas: Ursula[] = fakeUrsulas(), -): SpyInstance => { +export const mockGetUrsulas = (ursulas: Ursula[] = fakeUrsulas()) => { const fakePorterUrsulas = ( mockUrsulas: readonly Ursula[], ): GetUrsulasResult => { @@ -166,12 +129,6 @@ export const mockGetUrsulas = ( return Promise.resolve({ data: fakePorterUrsulas(ursulas) }); }); }; -export const mockPublishToBlockchain = (): SpyInstance => { - const txHash = '0x1234567890123456789012345678901234567890'; - return vi - .spyOn(PreEnactedPolicy.prototype as any, 'publish') - .mockImplementation(async () => Promise.resolve(txHash)); -}; const fakeCFragResponse = ( ursulas: readonly ChecksumAddress[], @@ -197,43 +154,6 @@ export const mockRetrieveCFragsRequest = ( return Promise.resolve(results); }); }; -export const mockGenerateKFrags = (withValue?: { - delegatingKey: PublicKey; - verifiedKFrags: VerifiedKeyFrag[]; -}): SpyInstance => { - const spy = vi.spyOn(Alice.prototype as any, 'generateKFrags'); - if (withValue) { - return spy.mockImplementation(() => withValue); - } - return spy; -}; - -export const mockEncryptTreasureMap = ( - withValue?: EncryptedTreasureMap, -): SpyInstance => { - const spy = vi.spyOn(BlockchainPolicy.prototype as any, 'encryptTreasureMap'); - if (withValue) { - return spy.mockImplementation(() => withValue); - } - return spy; -}; - -export const reencryptKFrags = ( - kFrags: readonly VerifiedKeyFrag[], - capsule: Capsule, -): { - verifiedCFrags: VerifiedCapsuleFrag[]; -} => { - if (!kFrags) { - throw new Error('Pass at least one kFrag.'); - } - const verifiedCFrags = kFrags.map((kFrag) => reencrypt(capsule, kFrag)); - return { verifiedCFrags }; -}; - -export const mockMakeTreasureMap = (): SpyInstance => { - return vi.spyOn(BlockchainPolicy.prototype as any, 'makeTreasureMap'); -}; export const mockDetectEthereumProvider = (): (() => providers.ExternalProvider) => { @@ -361,140 +281,6 @@ export const fakeTDecFlow = ({ }; }; -const fakeConditionExpr = () => { - const erc721Balance = new ERC721Balance({ - chain: TEST_CHAIN_ID, - contractAddress: TEST_CONTRACT_ADDR, - }); - return new ConditionExpression(erc721Balance); -}; - -export const fakeDkgTDecFlowE2E: ( - ritualId?: number, - variant?: FerveoVariant, - conditionExpr?: ConditionExpression, - message?: Uint8Array, - sharesNum?: number, - threshold?: number, -) => { - dkg: Dkg; - serverAggregate: AggregatedTranscript; - sharesNum: number; - transcripts: Transcript[]; - validatorKeypairs: Keypair[]; - validators: Validator[]; - ritualId: number; - threshold: number; - receivedMessages: ValidatorMessage[]; - message: Uint8Array; - thresholdMessageKit: ThresholdMessageKit; - decryptionShares: DecryptionShareSimple[]; -} = ( - ritualId = 0, - variant: FerveoVariant = FerveoVariant.precomputed, - conditionExpr: ConditionExpression = fakeConditionExpr(), - message = toBytes('fake-message'), - sharesNum = 4, - threshold = 4, -) => { - const ritual = fakeDkgFlow(variant, ritualId, sharesNum, threshold); - const dkgPublicKey = ritual.dkg.publicKey(); - const thresholdMessageKit = new Enrico(dkgPublicKey).encryptMessageCbd( - message, - conditionExpr, - ); - - const { decryptionShares } = fakeTDecFlow({ - ...ritual, - message, - dkgPublicKey, - thresholdMessageKit, - }); - - return { - ...ritual, - message, - decryptionShares, - thresholdMessageKit, - }; -}; - -export const mockCoordinatorRitual = async ( - ritualId: number, -): Promise<{ - aggregationMismatch: boolean; - initTimestamp: number; - aggregatedTranscriptHash: string; - initiator: string; - dkgSize: number; - id: number; - publicKey: { word1: string; word0: string }; - totalTranscripts: number; - aggregatedTranscript: string; - publicKeyHash: string; - totalAggregations: number; -}> => { - const ritual = await fakeDkgTDecFlowE2E(); - const dkgPkBytes = ritual.dkg.publicKey().toBytes(); - return { - id: ritualId, - initiator: ritual.validators[0].address.toString(), - dkgSize: ritual.sharesNum, - initTimestamp: 0, - totalTranscripts: ritual.receivedMessages.length, - totalAggregations: ritual.sharesNum, // Assuming the ritual is finished - aggregatedTranscriptHash: keccak256(ritual.serverAggregate.toBytes()), - aggregationMismatch: false, // Assuming the ritual is correct - aggregatedTranscript: toHexString(ritual.serverAggregate.toBytes()), - publicKey: { - word0: toHexString(dkgPkBytes.slice(0, 32)), - word1: toHexString(dkgPkBytes.slice(32, 48)), - }, - publicKeyHash: keccak256(ritual.dkg.publicKey().toBytes()), - }; -}; - -export const mockDkgParticipants = ( - ritualId: number, -): { - participants: DkgParticipant[]; - participantSecrets: Record; -} => { - const ritual = fakeDkgTDecFlowE2E(ritualId); - const label = toBytes(`${ritualId}`); - - const participantSecrets: Record = - Object.fromEntries( - ritual.validators.map(({ address }) => { - const participantSecret = SessionSecretFactory.random().makeKey(label); - return [address.toString(), participantSecret]; - }), - ); - - const participants: DkgParticipant[] = zip( - Object.entries(participantSecrets), - ritual.transcripts, - ).map(([[address, secret], transcript]) => { - return { - provider: address, - aggregated: true, // Assuming all validators already contributed to the aggregate - transcript, - decryptionRequestStaticKey: secret.publicKey(), - } as DkgParticipant; - }); - return { participantSecrets, participants }; -}; - -export const mockGetParticipants = ( - participants: DkgParticipant[], -): SpyInstance => { - return vi - .spyOn(DkgCoordinatorAgent, 'getParticipants') - .mockImplementation(() => { - return Promise.resolve(participants); - }); -}; - export const mockCbdDecrypt = ( ritualId: number, decryptionShares: (DecryptionSharePrecomputed | DecryptionShareSimple)[], @@ -527,44 +313,6 @@ export const mockCbdDecrypt = ( }); }; -export const mockRandomSessionStaticSecret = ( - secret: SessionStaticSecret, -): SpyInstance => { - return vi - .spyOn(ThresholdDecrypter.prototype as any, 'makeSessionKey') - .mockImplementation(() => secret); -}; - -export const mockRitualId = 0; - -export const fakeDkgRitual = (ritual: { - dkg: Dkg; - sharesNum: number; - threshold: number; -}) => { - return new DkgRitual( - mockRitualId, - ritual.dkg.publicKey(), - ritual.sharesNum, - ritual.threshold, - DkgRitualState.FINALIZED, - ); -}; - -export const mockGetRitual = (dkgRitual: DkgRitual): SpyInstance => { - return vi.spyOn(DkgClient, 'getRitual').mockImplementation(() => { - return Promise.resolve(dkgRitual); - }); -}; - -export const mockGetFinalizedRitualSpy = ( - dkgRitual: DkgRitual, -): SpyInstance => { - return vi.spyOn(DkgClient, 'getFinalizedRitual').mockImplementation(() => { - return Promise.resolve(dkgRitual); - }); -}; - export const mockGetRitualIdFromPublicKey = (ritualId: number): SpyInstance => { return vi .spyOn(DkgCoordinatorAgent, 'getRitualIdFromPublicKey') @@ -573,11 +321,19 @@ export const mockGetRitualIdFromPublicKey = (ritualId: number): SpyInstance => { }); }; -export const makeCohort = async (ursulas: Ursula[] = fakeUrsulas()) => { - const getUrsulasSpy = mockGetUrsulas(ursulas); - const porterUri = 'https://_this.should.crash'; - const numUrsulas = ursulas.length; - const cohort = await Cohort.create(porterUri, numUrsulas); - expect(getUrsulasSpy).toHaveBeenCalled(); - return cohort; +export const mockRetrieveAndDecrypt = ( + makeTreasureMapSpy: SpyInstance, + encryptedMessageKit: MessageKit, +) => { + // Setup mocks for `retrieveAndDecrypt` + const ursulaAddresses = ( + makeTreasureMapSpy.mock.calls[0][0] as readonly Ursula[] + ).map((u) => u.checksumAddress); + const verifiedKFrags = makeTreasureMapSpy.mock + .calls[0][1] as readonly VerifiedKeyFrag[]; + return mockRetrieveCFragsRequest( + ursulaAddresses, + verifiedKFrags, + encryptedMessageKit.capsule, + ); }; diff --git a/packages/test-utils/src/variables.ts b/packages/test-utils/src/variables.ts index 2c0c9984f..3019c09bc 100644 --- a/packages/test-utils/src/variables.ts +++ b/packages/test-utils/src/variables.ts @@ -1,15 +1,3 @@ -import { - ContractConditionProps, - ContractConditionType, - FunctionAbiProps, - ReturnValueTestProps, - RpcConditionProps, - RpcConditionType, - TimeConditionMethod, - TimeConditionProps, - TimeConditionType, -} from '@nucypher/shared'; - export const aliceSecretKeyBytes = new Uint8Array([ 55, 82, 190, 189, 203, 164, 60, 148, 36, 86, 46, 123, 63, 152, 215, 113, 174, 86, 244, 44, 23, 227, 197, 68, 5, 85, 116, 31, 208, 152, 88, 53, @@ -24,63 +12,3 @@ export const TEST_CONTRACT_ADDR = '0x0000000000000000000000000000000000000001'; export const TEST_CONTRACT_ADDR_2 = '0x0000000000000000000000000000000000000002'; export const TEST_CHAIN_ID = 5; - -export const testReturnValueTest: ReturnValueTestProps = { - index: 0, - comparator: '>', - value: '100', -}; - -export const testTimeConditionObj: TimeConditionProps = { - conditionType: TimeConditionType, - returnValueTest: { - index: 0, - comparator: '>', - value: '100', - }, - method: TimeConditionMethod, - chain: 5, -}; - -export const testRpcConditionObj: RpcConditionProps = { - conditionType: RpcConditionType, - chain: TEST_CHAIN_ID, - method: 'eth_getBalance', - parameters: ['0x1e988ba4692e52Bc50b375bcC8585b95c48AaD77'], - returnValueTest: testReturnValueTest, -}; - -export const testContractConditionObj: ContractConditionProps = { - conditionType: ContractConditionType, - contractAddress: '0x0000000000000000000000000000000000000000', - chain: 5, - standardContractType: 'ERC20', - method: 'balanceOf', - parameters: ['0x1e988ba4692e52Bc50b375bcC8585b95c48AaD77'], - returnValueTest: testReturnValueTest, -}; - -export const testFunctionAbi: FunctionAbiProps = { - name: 'myFunction', - type: 'function', - stateMutability: 'view', - inputs: [ - { - internalType: 'address', - name: 'account', - type: 'address', - }, - { - internalType: 'uint256', - name: 'myCustomParam', - type: 'uint256', - }, - ], - outputs: [ - { - internalType: 'uint256', - name: 'someValue', - type: 'uint256', - }, - ], -}; diff --git a/packages/test-utils/tsconfig.build.json b/packages/test-utils/tsconfig.build.json deleted file mode 100644 index dedc2a266..000000000 --- a/packages/test-utils/tsconfig.build.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "extends": "./tsconfig.json", - "include": ["src"], - "compilerOptions": { - "outDir": "dist", - "rootDir": "src" - }, - "references": [ - { - "path": "../shared/tsconfig.es.json" - } - ] -} diff --git a/packages/test-utils/tsconfig.cjs.json b/packages/test-utils/tsconfig.cjs.json new file mode 100644 index 000000000..035a2ab62 --- /dev/null +++ b/packages/test-utils/tsconfig.cjs.json @@ -0,0 +1,7 @@ +{ + "extends": "./tsconfig.es.json", + "compilerOptions": { + "outDir": "dist/cjs", + "module": "CommonJS", + } +} diff --git a/packages/test-utils/tsconfig.es.json b/packages/test-utils/tsconfig.es.json new file mode 100644 index 000000000..2ffa9192c --- /dev/null +++ b/packages/test-utils/tsconfig.es.json @@ -0,0 +1,10 @@ +{ + "extends": "./tsconfig.json", + "include": ["src"], + "compilerOptions": { + "outDir": "dist/es", + "rootDir": "src", + "module": "ES2022", + "target": "ES2022" + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3e967d04a..2e2c27101 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -13,6 +13,10 @@ overrides: importers: .: + dependencies: + '@nucypher/nucypher-core': + specifier: 0.13.0-alpha.1 + version: 0.13.0-alpha.1 devDependencies: '@skypack/package-check': specifier: ^0.2.2 @@ -46,7 +50,7 @@ importers: version: 3.2.0(eslint@8.49.0) eslint-plugin-import: specifier: ^2.28.1 - version: 2.28.1(@typescript-eslint/parser@6.7.0)(eslint-import-resolver-typescript@3.6.0)(eslint@8.49.0) + version: 2.28.1(@typescript-eslint/parser@6.7.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.49.0) eslint-plugin-no-only-tests: specifier: ^3.1.0 version: 3.1.0 @@ -96,11 +100,157 @@ importers: specifier: ^0.34.4 version: 0.34.4 - examples/nextjs: + demos/taco-demo: dependencies: - '@nucypher/shared': + '@nucypher/taco': + specifier: workspace:* + version: link:../../packages/taco + '@usedapp/core': + specifier: ^1.2.13 + version: 1.2.13(ethers@5.7.2)(react@18.2.0) + buffer: + specifier: ^6.0.3 + version: 6.0.3 + ethers: + specifier: ^5.7.1 + version: 5.7.2 + file-loader: + specifier: ^6.2.0 + version: 6.2.0(webpack@5.88.2) + react: + specifier: ^18.2.0 + version: 18.2.0 + react-copy-to-clipboard: + specifier: ^5.1.0 + version: 5.1.0(react@18.2.0) + react-dom: + specifier: ^18.2.0 + version: 18.2.0(react@18.2.0) + react-spinners: + specifier: ^0.13.6 + version: 0.13.8(react-dom@18.2.0)(react@18.2.0) + devDependencies: + '@pmmmwh/react-refresh-webpack-plugin': + specifier: ^0.5.7 + version: 0.5.11(react-refresh@0.14.0)(webpack-dev-server@4.15.1)(webpack@5.88.2) + '@types/react': + specifier: ^18.0.20 + version: 18.2.22 + '@types/react-copy-to-clipboard': + specifier: ^5.0.4 + version: 5.0.5 + '@types/react-dom': + specifier: ^18.0.6 + version: 18.2.7 + copy-webpack-plugin: + specifier: ^11.0.0 + version: 11.0.0(webpack@5.88.2) + esbuild-loader: + specifier: ^2.20.0 + version: 2.21.0(webpack@5.88.2) + html-webpack-plugin: + specifier: ^5.5.0 + version: 5.5.3(webpack@5.88.2) + react-refresh: + specifier: ^0.14.0 + version: 0.14.0 + rimraf: + specifier: ^3.0.2 + version: 3.0.2 + stream-browserify: + specifier: ^3.0.0 + version: 3.0.0 + typescript: + specifier: ^4.8.3 + version: 4.9.5 + webpack: + specifier: ^5.74.0 + version: 5.88.2(webpack-cli@4.10.0) + webpack-cli: + specifier: ^4.10.0 + version: 4.10.0(webpack-dev-server@4.15.1)(webpack@5.88.2) + webpack-dev-server: + specifier: ^4.11.1 + version: 4.15.1(webpack-cli@4.10.0)(webpack@5.88.2) + + demos/taco-nft-demo: + dependencies: + '@nucypher/taco': + specifier: workspace:* + version: link:../../packages/taco + '@usedapp/core': + specifier: ^1.2.13 + version: 1.2.13(ethers@5.7.2)(react@18.2.0) + buffer: + specifier: ^6.0.3 + version: 6.0.3 + ethers: + specifier: ^5.7.1 + version: 5.7.2 + file-loader: + specifier: ^6.2.0 + version: 6.2.0(webpack@5.88.2) + react: + specifier: ^18.2.0 + version: 18.2.0 + react-copy-to-clipboard: + specifier: ^5.1.0 + version: 5.1.0(react@18.2.0) + react-dom: + specifier: ^18.2.0 + version: 18.2.0(react@18.2.0) + react-spinners: + specifier: ^0.13.6 + version: 0.13.8(react-dom@18.2.0)(react@18.2.0) + devDependencies: + '@pmmmwh/react-refresh-webpack-plugin': + specifier: ^0.5.7 + version: 0.5.11(react-refresh@0.14.0)(webpack-dev-server@4.15.1)(webpack@5.88.2) + '@types/react': + specifier: ^18.0.20 + version: 18.2.22 + '@types/react-copy-to-clipboard': + specifier: ^5.0.4 + version: 5.0.5 + '@types/react-dom': + specifier: ^18.0.6 + version: 18.2.7 + copy-webpack-plugin: + specifier: ^11.0.0 + version: 11.0.0(webpack@5.88.2) + esbuild-loader: + specifier: ^2.20.0 + version: 2.21.0(webpack@5.88.2) + html-webpack-plugin: + specifier: ^5.5.0 + version: 5.5.3(webpack@5.88.2) + react-refresh: + specifier: ^0.14.0 + version: 0.14.0 + rimraf: + specifier: ^3.0.2 + version: 3.0.2 + stream-browserify: + specifier: ^3.0.0 + version: 3.0.0 + typescript: + specifier: ^4.8.3 + version: 4.9.5 + webpack: + specifier: ^5.74.0 + version: 5.88.2(webpack-cli@4.10.0) + webpack-cli: + specifier: ^4.10.0 + version: 4.10.0(webpack-dev-server@4.15.1)(webpack@5.88.2) + webpack-dev-server: + specifier: ^4.11.1 + version: 4.15.1(webpack-cli@4.10.0)(webpack@5.88.2) + + examples/pre/nextjs: + dependencies: + '@nucypher/pre': specifier: workspace:* - version: link:../../packages/shared + version: link:../../../packages/pre '@types/node': specifier: 20.6.3 version: 20.6.3 @@ -132,20 +282,23 @@ importers: specifier: 5.2.2 version: 5.2.2 - examples/nodejs: + examples/pre/nodejs: dependencies: - '@nucypher/shared': + '@nucypher/pre': specifier: workspace:* - version: link:../../packages/shared + version: link:../../../packages/pre + dotenv: + specifier: ^16.3.1 + version: 16.3.1 ethers: specifier: ^5.7.2 version: 5.7.2 - examples/react: + examples/pre/react: dependencies: - '@nucypher/shared': + '@nucypher/pre': specifier: workspace:* - version: link:../../packages/shared + version: link:../../../packages/pre ethers: specifier: ^5.7.2 version: 5.7.2 @@ -158,10 +311,10 @@ importers: devDependencies: '@types/node': specifier: ^16.18.50 - version: 16.18.50 + version: 16.18.54 '@types/react': specifier: ^18.2.21 - version: 18.2.21 + version: 18.2.22 '@types/react-dom': specifier: ^18.2.7 version: 18.2.7 @@ -169,11 +322,112 @@ importers: specifier: ^5.0.1 version: 5.0.1(@babel/plugin-syntax-flow@7.22.5)(@babel/plugin-transform-react-jsx@7.22.15)(eslint@8.49.0)(react@18.2.0)(ts-node@10.9.1)(typescript@5.2.2) - examples/webpack-5: + examples/pre/webpack-5: dependencies: - '@nucypher/shared': + '@nucypher/pre': specifier: workspace:* - version: link:../../packages/shared + version: link:../../../packages/pre + ethers: + specifier: ^5.7.2 + version: 5.7.2 + devDependencies: + copy-webpack-plugin: + specifier: ^10.2.4 + version: 10.2.4(webpack@5.88.2) + esbuild-loader: + specifier: ^2.11.0 + version: 2.21.0(webpack@5.88.2) + webpack: + specifier: ^5.4.0 + version: 5.88.2(webpack-cli@4.10.0) + webpack-cli: + specifier: ^4.9.2 + version: 4.10.0(webpack-dev-server@4.15.1)(webpack@5.88.2) + webpack-dev-server: + specifier: ^4.7.4 + version: 4.15.1(webpack-cli@4.10.0)(webpack@5.88.2) + + examples/taco/nextjs: + dependencies: + '@nucypher/taco': + specifier: workspace:* + version: link:../../../packages/taco + '@types/node': + specifier: 20.6.3 + version: 20.6.3 + '@types/react': + specifier: 18.2.22 + version: 18.2.22 + '@types/react-dom': + specifier: 18.2.7 + version: 18.2.7 + eslint: + specifier: 8.49.0 + version: 8.49.0 + eslint-config-next: + specifier: 13.5.2 + version: 13.5.2(eslint@8.49.0)(typescript@5.2.2) + ethers: + specifier: ^5.7.2 + version: 5.7.2 + next: + specifier: 13.5.2 + version: 13.5.2(react-dom@18.2.0)(react@18.2.0) + react: + specifier: 18.2.0 + version: 18.2.0 + react-dom: + specifier: 18.2.0 + version: 18.2.0(react@18.2.0) + typescript: + specifier: 5.2.2 + version: 5.2.2 + + examples/taco/nodejs: + dependencies: + '@nucypher/taco': + specifier: workspace:* + version: link:../../../packages/taco + dotenv: + specifier: ^16.3.1 + version: 16.3.1 + ethers: + specifier: ^5.7.2 + version: 5.7.2 + + examples/taco/react: + dependencies: + '@nucypher/taco': + specifier: workspace:* + version: link:../../../packages/taco + ethers: + specifier: ^5.7.2 + version: 5.7.2 + react: + specifier: ^18.2.0 + version: 18.2.0 + react-dom: + specifier: ^18.2.0 + version: 18.2.0(react@18.2.0) + devDependencies: + '@types/node': + specifier: ^16.18.50 + version: 16.18.54 + '@types/react': + specifier: ^18.2.21 + version: 18.2.22 + '@types/react-dom': + specifier: ^18.2.7 + version: 18.2.7 + react-scripts: + specifier: ^5.0.1 + version: 5.0.1(@babel/plugin-syntax-flow@7.22.5)(@babel/plugin-transform-react-jsx@7.22.15)(eslint@8.49.0)(react@18.2.0)(ts-node@10.9.1)(typescript@5.2.2) + + examples/taco/webpack-5: + dependencies: + '@nucypher/taco': + specifier: workspace:* + version: link:../../../packages/taco ethers: specifier: ^5.7.2 version: 5.7.2 @@ -197,8 +451,8 @@ importers: packages/pre: dependencies: '@nucypher/nucypher-core': - specifier: 0.13.0-alpha.0 - version: 0.13.0-alpha.0 + specifier: 0.13.0-alpha.1 + version: 0.13.0-alpha.1 '@nucypher/shared': specifier: workspace:* version: link:../shared @@ -215,15 +469,12 @@ importers: '@ethersproject/abi': specifier: ^5.7.0 version: 5.7.0 - '@ethersproject/abstract-signer': - specifier: ^5.7.0 - version: 5.7.0 '@ethersproject/providers': specifier: ^5.7.2 version: 5.7.2 '@nucypher/nucypher-core': - specifier: 0.13.0-alpha.0 - version: 0.13.0-alpha.0 + specifier: 0.13.0-alpha.1 + version: 0.13.0-alpha.1 axios: specifier: ^1.5.0 version: 1.5.0 @@ -236,16 +487,7 @@ importers: qs: specifier: ^6.10.1 version: 6.11.2 - semver: - specifier: ^7.5.2 - version: 7.5.4 - zod: - specifier: ^3.22.1 - version: 3.22.2 devDependencies: - '@nucypher/test-utils': - specifier: workspace:* - version: link:../test-utils '@typechain/ethers-v5': specifier: ^11.1.1 version: 11.1.1(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(typechain@8.3.1)(typescript@5.2.2) @@ -255,9 +497,6 @@ importers: '@types/qs': specifier: ^6.9.7 version: 6.9.8 - '@types/semver': - specifier: ^7.5.0 - version: 7.5.1 cz-conventional-changelog: specifier: ^3.0.1 version: 3.3.0 @@ -270,25 +509,37 @@ importers: packages/taco: dependencies: + '@ethersproject/abstract-signer': + specifier: ^5.7.0 + version: 5.7.0 '@nucypher/nucypher-core': - specifier: 0.13.0-alpha.0 - version: 0.13.0-alpha.0 + specifier: 0.13.0-alpha.1 + version: 0.13.0-alpha.1 '@nucypher/shared': specifier: workspace:* version: link:../shared ethers: specifier: ^5.7.2 version: 5.7.2 + semver: + specifier: ^7.5.2 + version: 7.5.4 + zod: + specifier: ^3.22.1 + version: 3.22.2 devDependencies: '@nucypher/test-utils': specifier: workspace:* version: link:../test-utils + '@types/semver': + specifier: ^7.5.0 + version: 7.5.2 packages/test-utils: dependencies: '@nucypher/nucypher-core': - specifier: 0.13.0-alpha.0 - version: 0.13.0-alpha.0 + specifier: 0.13.0-alpha.1 + version: 0.13.0-alpha.1 '@nucypher/shared': specifier: workspace:* version: link:../shared @@ -298,28 +549,9 @@ importers: ethers: specifier: ^5.7.2 version: 5.7.2 - devDependencies: - '@typechain/ethers-v5': - specifier: ^11.1.1 - version: 11.1.1(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(typechain@8.3.1)(typescript@5.2.2) - '@types/deep-equal': - specifier: ^1.0.1 - version: 1.0.1 - '@types/qs': - specifier: ^6.9.7 - version: 6.9.8 - '@types/semver': - specifier: ^7.5.0 - version: 7.5.1 - cz-conventional-changelog: - specifier: ^3.0.1 - version: 3.3.0 - standard-version: - specifier: ^9.0.0 - version: 9.5.0 - typechain: - specifier: ^8.3.1 - version: 8.3.1(typescript@5.2.2) + vitest: + specifier: ^0.34.4 + version: 0.34.4 packages: @@ -338,7 +570,6 @@ packages: dependencies: '@jridgewell/gen-mapping': 0.3.3 '@jridgewell/trace-mapping': 0.3.19 - dev: true /@apideck/better-ajv-errors@0.3.6(ajv@8.12.0): resolution: {integrity: sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==} @@ -358,121 +589,116 @@ packages: dependencies: '@babel/highlight': 7.22.13 chalk: 2.4.2 - dev: true - /@babel/compat-data@7.22.9: - resolution: {integrity: sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==} + /@babel/compat-data@7.22.20: + resolution: {integrity: sha512-BQYjKbpXjoXwFW5jGqiizJQQT/aC7pFm9Ok1OWssonuguICi264lbgMzRp2ZMmRSlfkX6DsWDDcsrctK8Rwfiw==} engines: {node: '>=6.9.0'} - dev: true - /@babel/core@7.22.17: - resolution: {integrity: sha512-2EENLmhpwplDux5PSsZnSbnSkB3tZ6QTksgO25xwEL7pIDcNOMhF5v/s6RzwjMZzZzw9Ofc30gHv5ChCC8pifQ==} + /@babel/core@7.23.0: + resolution: {integrity: sha512-97z/ju/Jy1rZmDxybphrBuI+jtJjFVoz7Mr9yUQVVVi+DNZE333uFQeMOqcCIy1x3WYBIbWftUSLmbNXNT7qFQ==} engines: {node: '>=6.9.0'} dependencies: '@ampproject/remapping': 2.2.1 '@babel/code-frame': 7.22.13 - '@babel/generator': 7.22.15 + '@babel/generator': 7.23.0 '@babel/helper-compilation-targets': 7.22.15 - '@babel/helper-module-transforms': 7.22.17(@babel/core@7.22.17) - '@babel/helpers': 7.22.15 - '@babel/parser': 7.22.16 + '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.0) + '@babel/helpers': 7.23.1 + '@babel/parser': 7.23.0 '@babel/template': 7.22.15 - '@babel/traverse': 7.22.17 - '@babel/types': 7.22.17 - convert-source-map: 1.9.0 + '@babel/traverse': 7.23.0 + '@babel/types': 7.23.0 + convert-source-map: 2.0.0 debug: 4.3.4 gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 transitivePeerDependencies: - supports-color - dev: true - /@babel/eslint-parser@7.22.15(@babel/core@7.22.17)(eslint@8.49.0): + /@babel/eslint-parser@7.22.15(@babel/core@7.23.0)(eslint@8.49.0): resolution: {integrity: sha512-yc8OOBIQk1EcRrpizuARSQS0TWAcOMpEJ1aafhNznaeYkeL+OhqnDObGFylB8ka8VFF/sZc+S4RzHyO+3LjQxg==} engines: {node: ^10.13.0 || ^12.13.0 || >=14.0.0} peerDependencies: '@babel/core': ^7.11.0 eslint: ^7.5.0 || ^8.0.0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.23.0 '@nicolo-ribaudo/eslint-scope-5-internals': 5.1.1-v1 eslint: 8.49.0 eslint-visitor-keys: 2.1.0 semver: 6.3.1 dev: true - /@babel/generator@7.22.15: - resolution: {integrity: sha512-Zu9oWARBqeVOW0dZOjXc3JObrzuqothQ3y/n1kUtrjCoCPLkXUwMvOo/F/TCfoHMbWIFlWwpZtkZVb9ga4U2pA==} + /@babel/generator@7.23.0: + resolution: {integrity: sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.17 + '@babel/types': 7.23.0 '@jridgewell/gen-mapping': 0.3.3 '@jridgewell/trace-mapping': 0.3.19 jsesc: 2.5.2 - dev: true /@babel/helper-annotate-as-pure@7.22.5: resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.17 + '@babel/types': 7.23.0 dev: true /@babel/helper-builder-binary-assignment-operator-visitor@7.22.15: resolution: {integrity: sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.17 + '@babel/types': 7.23.0 dev: true /@babel/helper-compilation-targets@7.22.15: resolution: {integrity: sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/compat-data': 7.22.9 + '@babel/compat-data': 7.22.20 '@babel/helper-validator-option': 7.22.15 - browserslist: 4.21.10 + browserslist: 4.21.11 lru-cache: 5.1.1 semver: 6.3.1 - dev: true - /@babel/helper-create-class-features-plugin@7.22.15(@babel/core@7.22.17): + /@babel/helper-create-class-features-plugin@7.22.15(@babel/core@7.23.0): resolution: {integrity: sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.23.0 '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-environment-visitor': 7.22.5 - '@babel/helper-function-name': 7.22.5 - '@babel/helper-member-expression-to-functions': 7.22.15 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-member-expression-to-functions': 7.23.0 '@babel/helper-optimise-call-expression': 7.22.5 - '@babel/helper-replace-supers': 7.22.9(@babel/core@7.22.17) + '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.0) '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 '@babel/helper-split-export-declaration': 7.22.6 semver: 6.3.1 dev: true - /@babel/helper-create-regexp-features-plugin@7.22.15(@babel/core@7.22.17): + /@babel/helper-create-regexp-features-plugin@7.22.15(@babel/core@7.23.0): resolution: {integrity: sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.23.0 '@babel/helper-annotate-as-pure': 7.22.5 regexpu-core: 5.3.2 semver: 6.3.1 dev: true - /@babel/helper-define-polyfill-provider@0.4.2(@babel/core@7.22.17): + /@babel/helper-define-polyfill-provider@0.4.2(@babel/core@7.23.0): resolution: {integrity: sha512-k0qnnOqHn5dK9pZpfD5XXZ9SojAITdCKRn2Lp6rnDGzIbaP0rHyMPk/4wsSxVBVz4RfN0q6VpXWP2pDGIoQ7hw==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.23.0 '@babel/helper-compilation-targets': 7.22.15 '@babel/helper-plugin-utils': 7.22.5 debug: 4.3.4 @@ -482,59 +708,54 @@ packages: - supports-color dev: true - /@babel/helper-environment-visitor@7.22.5: - resolution: {integrity: sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==} + /@babel/helper-environment-visitor@7.22.20: + resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} engines: {node: '>=6.9.0'} - dev: true - /@babel/helper-function-name@7.22.5: - resolution: {integrity: sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==} + /@babel/helper-function-name@7.23.0: + resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} engines: {node: '>=6.9.0'} dependencies: '@babel/template': 7.22.15 - '@babel/types': 7.22.17 - dev: true + '@babel/types': 7.23.0 /@babel/helper-hoist-variables@7.22.5: resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.17 - dev: true + '@babel/types': 7.23.0 - /@babel/helper-member-expression-to-functions@7.22.15: - resolution: {integrity: sha512-qLNsZbgrNh0fDQBCPocSL8guki1hcPvltGDv/NxvUoABwFq7GkKSu1nRXeJkVZc+wJvne2E0RKQz+2SQrz6eAA==} + /@babel/helper-member-expression-to-functions@7.23.0: + resolution: {integrity: sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.17 + '@babel/types': 7.23.0 dev: true /@babel/helper-module-imports@7.22.15: resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.17 - dev: true + '@babel/types': 7.23.0 - /@babel/helper-module-transforms@7.22.17(@babel/core@7.22.17): - resolution: {integrity: sha512-XouDDhQESrLHTpnBtCKExJdyY4gJCdrvH2Pyv8r8kovX2U8G0dRUOT45T9XlbLtuu9CLXP15eusnkprhoPV5iQ==} + /@babel/helper-module-transforms@7.23.0(@babel/core@7.23.0): + resolution: {integrity: sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.22.17 - '@babel/helper-environment-visitor': 7.22.5 + '@babel/core': 7.23.0 + '@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.15 - dev: true + '@babel/helper-validator-identifier': 7.22.20 /@babel/helper-optimise-call-expression@7.22.5: resolution: {integrity: sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.17 + '@babel/types': 7.23.0 dev: true /@babel/helper-plugin-utils@7.22.5: @@ -542,27 +763,27 @@ packages: engines: {node: '>=6.9.0'} dev: true - /@babel/helper-remap-async-to-generator@7.22.17(@babel/core@7.22.17): - resolution: {integrity: sha512-bxH77R5gjH3Nkde6/LuncQoLaP16THYPscurp1S8z7S9ZgezCyV3G8Hc+TZiCmY8pz4fp8CvKSgtJMW0FkLAxA==} + /@babel/helper-remap-async-to-generator@7.22.20(@babel/core@7.23.0): + resolution: {integrity: sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.23.0 '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-environment-visitor': 7.22.5 - '@babel/helper-wrap-function': 7.22.17 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-wrap-function': 7.22.20 dev: true - /@babel/helper-replace-supers@7.22.9(@babel/core@7.22.17): - resolution: {integrity: sha512-LJIKvvpgPOPUThdYqcX6IXRuIcTkcAub0IaDRGCZH0p5GPUp7PhRU9QVgFcDDd51BaPkk77ZjqFwh6DZTAEmGg==} + /@babel/helper-replace-supers@7.22.20(@babel/core@7.23.0): + resolution: {integrity: sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.22.17 - '@babel/helper-environment-visitor': 7.22.5 - '@babel/helper-member-expression-to-functions': 7.22.15 + '@babel/core': 7.23.0 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-member-expression-to-functions': 7.23.0 '@babel/helper-optimise-call-expression': 7.22.5 dev: true @@ -570,1170 +791,1162 @@ packages: resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.17 - dev: true + '@babel/types': 7.23.0 /@babel/helper-skip-transparent-expression-wrappers@7.22.5: resolution: {integrity: sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.17 + '@babel/types': 7.23.0 dev: true /@babel/helper-split-export-declaration@7.22.6: resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.17 - dev: true + '@babel/types': 7.23.0 /@babel/helper-string-parser@7.22.5: resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==} engines: {node: '>=6.9.0'} - dev: true - /@babel/helper-validator-identifier@7.22.15: - resolution: {integrity: sha512-4E/F9IIEi8WR94324mbDUMo074YTheJmd7eZF5vITTeYchqAi6sYXRLHUVsmkdmY4QjfKTcB2jB7dVP3NaBElQ==} + /@babel/helper-validator-identifier@7.22.20: + resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} engines: {node: '>=6.9.0'} - dev: true /@babel/helper-validator-option@7.22.15: resolution: {integrity: sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==} engines: {node: '>=6.9.0'} - dev: true - /@babel/helper-wrap-function@7.22.17: - resolution: {integrity: sha512-nAhoheCMlrqU41tAojw9GpVEKDlTS8r3lzFmF0lP52LwblCPbuFSO7nGIZoIcoU5NIm1ABrna0cJExE4Ay6l2Q==} + /@babel/helper-wrap-function@7.22.20: + resolution: {integrity: sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-function-name': 7.22.5 + '@babel/helper-function-name': 7.23.0 '@babel/template': 7.22.15 - '@babel/types': 7.22.17 + '@babel/types': 7.23.0 dev: true - /@babel/helpers@7.22.15: - resolution: {integrity: sha512-7pAjK0aSdxOwR+CcYAqgWOGy5dcfvzsTIfFTb2odQqW47MDfv14UaJDY6eng8ylM2EaeKXdxaSWESbkmaQHTmw==} + /@babel/helpers@7.23.1: + resolution: {integrity: sha512-chNpneuK18yW5Oxsr+t553UZzzAs3aZnFm4bxhebsNTeshrC95yA7l5yl7GBAG+JG1rF0F7zzD2EixK9mWSDoA==} engines: {node: '>=6.9.0'} dependencies: '@babel/template': 7.22.15 - '@babel/traverse': 7.22.17 - '@babel/types': 7.22.17 + '@babel/traverse': 7.23.0 + '@babel/types': 7.23.0 transitivePeerDependencies: - supports-color - dev: true /@babel/highlight@7.22.13: resolution: {integrity: sha512-C/BaXcnnvBCmHTpz/VGZ8jgtE2aYlW4hxDhseJAWZb7gqGM/qtCK6iZUb0TyKFf7BOUsBH7Q7fkRsDRhg1XklQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-validator-identifier': 7.22.15 + '@babel/helper-validator-identifier': 7.22.20 chalk: 2.4.2 js-tokens: 4.0.0 - dev: true - /@babel/parser@7.22.16: - resolution: {integrity: sha512-+gPfKv8UWeKKeJTUxe59+OobVcrYHETCsORl61EmSkmgymguYk/X5bp7GuUIXaFsc6y++v8ZxPsLSSuujqDphA==} + /@babel/parser@7.23.0: + resolution: {integrity: sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==} engines: {node: '>=6.0.0'} hasBin: true dependencies: - '@babel/types': 7.22.17 - dev: true + '@babel/types': 7.23.0 - /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.22.15(@babel/core@7.22.17): + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.22.15(@babel/core@7.23.0): resolution: {integrity: sha512-FB9iYlz7rURmRJyXRKEnalYPPdn87H5no108cyuQQyMwlpJ2SJtpIUBI27kdTin956pz+LPypkPVPUTlxOmrsg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.22.15(@babel/core@7.22.17): + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.22.15(@babel/core@7.23.0): resolution: {integrity: sha512-Hyph9LseGvAeeXzikV88bczhsrLrIZqDPxO+sSmAunMPaGrBGhfMWzCPYTtiW9t+HzSE2wtV8e5cc5P6r1xMDQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.13.0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-transform-optional-chaining': 7.22.15(@babel/core@7.22.17) + '@babel/plugin-transform-optional-chaining': 7.23.0(@babel/core@7.23.0) dev: true - /@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.22.17): + /@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.23.0): resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} engines: {node: '>=6.9.0'} deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead. peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 - '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.22.17) + '@babel/core': 7.23.0 + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.0) '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-proposal-decorators@7.22.15(@babel/core@7.22.17): - resolution: {integrity: sha512-kc0VvbbUyKelvzcKOSyQUSVVXS5pT3UhRB0e3c9An86MvLqs+gx0dN4asllrDluqSa3m9YyooXKGOFVomnyFkg==} + /@babel/plugin-proposal-decorators@7.23.0(@babel/core@7.23.0): + resolution: {integrity: sha512-kYsT+f5ARWF6AdFmqoEEp+hpqxEB8vGmRWfw2aj78M2vTwS2uHW91EF58iFm1Z9U8Y/RrLu2XKJn46P9ca1b0w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 - '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.22.17) + '@babel/core': 7.23.0 + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.0) '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-replace-supers': 7.22.9(@babel/core@7.22.17) + '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.0) '@babel/helper-split-export-declaration': 7.22.6 - '@babel/plugin-syntax-decorators': 7.22.10(@babel/core@7.22.17) + '@babel/plugin-syntax-decorators': 7.22.10(@babel/core@7.23.0) dev: true - /@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.22.17): + /@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.23.0): resolution: {integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==} engines: {node: '>=6.9.0'} deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-nullish-coalescing-operator instead. peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.22.17) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.0) dev: true - /@babel/plugin-proposal-numeric-separator@7.18.6(@babel/core@7.22.17): + /@babel/plugin-proposal-numeric-separator@7.18.6(@babel/core@7.23.0): resolution: {integrity: sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==} engines: {node: '>=6.9.0'} deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-numeric-separator instead. peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.22.17) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.0) dev: true - /@babel/plugin-proposal-optional-chaining@7.21.0(@babel/core@7.22.17): + /@babel/plugin-proposal-optional-chaining@7.21.0(@babel/core@7.23.0): resolution: {integrity: sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==} engines: {node: '>=6.9.0'} deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead. peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.22.17) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.0) dev: true - /@babel/plugin-proposal-private-methods@7.18.6(@babel/core@7.22.17): + /@babel/plugin-proposal-private-methods@7.18.6(@babel/core@7.23.0): resolution: {integrity: sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==} engines: {node: '>=6.9.0'} deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-methods instead. peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 - '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.22.17) + '@babel/core': 7.23.0 + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.0) '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.22.17): + /@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.23.0): resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.23.0 dev: true - /@babel/plugin-proposal-private-property-in-object@7.21.11(@babel/core@7.22.17): + /@babel/plugin-proposal-private-property-in-object@7.21.11(@babel/core@7.23.0): resolution: {integrity: sha512-0QZ8qP/3RLDVBwBFoWAwCtgcDZJVwA5LUJRZU8x2YFfKNuFq161wK3cuGrALu5yiPu+vzwTAg/sMWVNeWeNyaw==} engines: {node: '>=6.9.0'} deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-property-in-object instead. peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.23.0 '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.22.17) + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.0) '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.22.17) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.23.0) dev: true - /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.22.17): + /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.23.0): resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.22.17): + /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.23.0): resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.22.17): + /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.23.0): resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.22.17): + /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.23.0): resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-decorators@7.22.10(@babel/core@7.22.17): + /@babel/plugin-syntax-decorators@7.22.10(@babel/core@7.23.0): resolution: {integrity: sha512-z1KTVemBjnz+kSEilAsI4lbkPOl5TvJH7YDSY1CTIzvLWJ+KHXp+mRe8VPmfnyvqOPqar1V2gid2PleKzRUstQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.22.17): + /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.23.0): resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.22.17): + /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.23.0): resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-flow@7.22.5(@babel/core@7.22.17): + /@babel/plugin-syntax-flow@7.22.5(@babel/core@7.23.0): resolution: {integrity: sha512-9RdCl0i+q0QExayk2nOS7853w08yLucnnPML6EN9S8fgMPVtdLDCdx/cOQ/i44Lb9UeQX9A35yaqBBOMMZxPxQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-import-assertions@7.22.5(@babel/core@7.22.17): + /@babel/plugin-syntax-import-assertions@7.22.5(@babel/core@7.23.0): resolution: {integrity: sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-import-attributes@7.22.5(@babel/core@7.22.17): + /@babel/plugin-syntax-import-attributes@7.22.5(@babel/core@7.23.0): resolution: {integrity: sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.22.17): + /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.23.0): resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.22.17): + /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.23.0): resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-jsx@7.22.5(@babel/core@7.22.17): + /@babel/plugin-syntax-jsx@7.22.5(@babel/core@7.23.0): resolution: {integrity: sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.22.17): + /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.23.0): resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.22.17): + /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.23.0): resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.22.17): + /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.23.0): resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.22.17): + /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.23.0): resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.22.17): + /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.23.0): resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.22.17): + /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.23.0): resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.22.17): + /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.23.0): resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.22.17): + /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.23.0): resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-typescript@7.22.5(@babel/core@7.22.17): + /@babel/plugin-syntax-typescript@7.22.5(@babel/core@7.23.0): resolution: {integrity: sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.22.17): + /@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.23.0): resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.22.17 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.22.17) + '@babel/core': 7.23.0 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.0) '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-arrow-functions@7.22.5(@babel/core@7.22.17): + /@babel/plugin-transform-arrow-functions@7.22.5(@babel/core@7.23.0): resolution: {integrity: sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-async-generator-functions@7.22.15(@babel/core@7.22.17): + /@babel/plugin-transform-async-generator-functions@7.22.15(@babel/core@7.23.0): resolution: {integrity: sha512-jBm1Es25Y+tVoTi5rfd5t1KLmL8ogLKpXszboWOTTtGFGz2RKnQe2yn7HbZ+kb/B8N0FVSGQo874NSlOU1T4+w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 - '@babel/helper-environment-visitor': 7.22.5 + '@babel/core': 7.23.0 + '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-remap-async-to-generator': 7.22.17(@babel/core@7.22.17) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.22.17) + '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.23.0) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.0) dev: true - /@babel/plugin-transform-async-to-generator@7.22.5(@babel/core@7.22.17): + /@babel/plugin-transform-async-to-generator@7.22.5(@babel/core@7.23.0): resolution: {integrity: sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.23.0 '@babel/helper-module-imports': 7.22.15 '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-remap-async-to-generator': 7.22.17(@babel/core@7.22.17) + '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.23.0) dev: true - /@babel/plugin-transform-block-scoped-functions@7.22.5(@babel/core@7.22.17): + /@babel/plugin-transform-block-scoped-functions@7.22.5(@babel/core@7.23.0): resolution: {integrity: sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-block-scoping@7.22.15(@babel/core@7.22.17): - resolution: {integrity: sha512-G1czpdJBZCtngoK1sJgloLiOHUnkb/bLZwqVZD8kXmq0ZnVfTTWUcs9OWtp0mBtYJ+4LQY1fllqBkOIPhXmFmw==} + /@babel/plugin-transform-block-scoping@7.23.0(@babel/core@7.23.0): + resolution: {integrity: sha512-cOsrbmIOXmf+5YbL99/S49Y3j46k/T16b9ml8bm9lP6N9US5iQ2yBK7gpui1pg0V/WMcXdkfKbTb7HXq9u+v4g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-class-properties@7.22.5(@babel/core@7.22.17): + /@babel/plugin-transform-class-properties@7.22.5(@babel/core@7.23.0): resolution: {integrity: sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 - '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.22.17) + '@babel/core': 7.23.0 + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.0) '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-class-static-block@7.22.11(@babel/core@7.22.17): + /@babel/plugin-transform-class-static-block@7.22.11(@babel/core@7.23.0): resolution: {integrity: sha512-GMM8gGmqI7guS/llMFk1bJDkKfn3v3C4KHK9Yg1ey5qcHcOlKb0QvcMrgzvxo+T03/4szNh5lghY+fEC98Kq9g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.12.0 dependencies: - '@babel/core': 7.22.17 - '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.22.17) + '@babel/core': 7.23.0 + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.0) '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.22.17) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.23.0) dev: true - /@babel/plugin-transform-classes@7.22.15(@babel/core@7.22.17): + /@babel/plugin-transform-classes@7.22.15(@babel/core@7.23.0): resolution: {integrity: sha512-VbbC3PGjBdE0wAWDdHM9G8Gm977pnYI0XpqMd6LrKISj8/DJXEsWqgRuTYaNE9Bv0JGhTZUzHDlMk18IpOuoqw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.23.0 '@babel/helper-annotate-as-pure': 7.22.5 '@babel/helper-compilation-targets': 7.22.15 - '@babel/helper-environment-visitor': 7.22.5 - '@babel/helper-function-name': 7.22.5 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 '@babel/helper-optimise-call-expression': 7.22.5 '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-replace-supers': 7.22.9(@babel/core@7.22.17) + '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.0) '@babel/helper-split-export-declaration': 7.22.6 globals: 11.12.0 dev: true - /@babel/plugin-transform-computed-properties@7.22.5(@babel/core@7.22.17): + /@babel/plugin-transform-computed-properties@7.22.5(@babel/core@7.23.0): resolution: {integrity: sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 '@babel/template': 7.22.15 dev: true - /@babel/plugin-transform-destructuring@7.22.15(@babel/core@7.22.17): - resolution: {integrity: sha512-HzG8sFl1ZVGTme74Nw+X01XsUTqERVQ6/RLHo3XjGRzm7XD6QTtfS3NJotVgCGy8BzkDqRjRBD8dAyJn5TuvSQ==} + /@babel/plugin-transform-destructuring@7.23.0(@babel/core@7.23.0): + resolution: {integrity: sha512-vaMdgNXFkYrB+8lbgniSYWHsgqK5gjaMNcc84bMIOMRLH0L9AqYq3hwMdvnyqj1OPqea8UtjPEuS/DCenah1wg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-dotall-regex@7.22.5(@babel/core@7.22.17): + /@babel/plugin-transform-dotall-regex@7.22.5(@babel/core@7.23.0): resolution: {integrity: sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.22.17) + '@babel/core': 7.23.0 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.0) '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-duplicate-keys@7.22.5(@babel/core@7.22.17): + /@babel/plugin-transform-duplicate-keys@7.22.5(@babel/core@7.23.0): resolution: {integrity: sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-dynamic-import@7.22.11(@babel/core@7.22.17): + /@babel/plugin-transform-dynamic-import@7.22.11(@babel/core@7.23.0): resolution: {integrity: sha512-g/21plo58sfteWjaO0ZNVb+uEOkJNjAaHhbejrnBmu011l/eNDScmkbjCC3l4FKb10ViaGU4aOkFznSu2zRHgA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.22.17) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.23.0) dev: true - /@babel/plugin-transform-exponentiation-operator@7.22.5(@babel/core@7.22.17): + /@babel/plugin-transform-exponentiation-operator@7.22.5(@babel/core@7.23.0): resolution: {integrity: sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.23.0 '@babel/helper-builder-binary-assignment-operator-visitor': 7.22.15 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-export-namespace-from@7.22.11(@babel/core@7.22.17): + /@babel/plugin-transform-export-namespace-from@7.22.11(@babel/core@7.23.0): resolution: {integrity: sha512-xa7aad7q7OiT8oNZ1mU7NrISjlSkVdMbNxn9IuLZyL9AJEhs1Apba3I+u5riX1dIkdptP5EKDG5XDPByWxtehw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.22.17) + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.23.0) dev: true - /@babel/plugin-transform-flow-strip-types@7.22.5(@babel/core@7.22.17): + /@babel/plugin-transform-flow-strip-types@7.22.5(@babel/core@7.23.0): resolution: {integrity: sha512-tujNbZdxdG0/54g/oua8ISToaXTFBf8EnSb5PgQSciIXWOWKX3S4+JR7ZE9ol8FZwf9kxitzkGQ+QWeov/mCiA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-flow': 7.22.5(@babel/core@7.22.17) + '@babel/plugin-syntax-flow': 7.22.5(@babel/core@7.23.0) dev: true - /@babel/plugin-transform-for-of@7.22.15(@babel/core@7.22.17): + /@babel/plugin-transform-for-of@7.22.15(@babel/core@7.23.0): resolution: {integrity: sha512-me6VGeHsx30+xh9fbDLLPi0J1HzmeIIyenoOQHuw2D4m2SAU3NrspX5XxJLBpqn5yrLzrlw2Iy3RA//Bx27iOA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-function-name@7.22.5(@babel/core@7.22.17): + /@babel/plugin-transform-function-name@7.22.5(@babel/core@7.23.0): resolution: {integrity: sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.23.0 '@babel/helper-compilation-targets': 7.22.15 - '@babel/helper-function-name': 7.22.5 + '@babel/helper-function-name': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-json-strings@7.22.11(@babel/core@7.22.17): + /@babel/plugin-transform-json-strings@7.22.11(@babel/core@7.23.0): resolution: {integrity: sha512-CxT5tCqpA9/jXFlme9xIBCc5RPtdDq3JpkkhgHQqtDdiTnTI0jtZ0QzXhr5DILeYifDPp2wvY2ad+7+hLMW5Pw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.22.17) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.0) dev: true - /@babel/plugin-transform-literals@7.22.5(@babel/core@7.22.17): + /@babel/plugin-transform-literals@7.22.5(@babel/core@7.23.0): resolution: {integrity: sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-logical-assignment-operators@7.22.11(@babel/core@7.22.17): + /@babel/plugin-transform-logical-assignment-operators@7.22.11(@babel/core@7.23.0): resolution: {integrity: sha512-qQwRTP4+6xFCDV5k7gZBF3C31K34ut0tbEcTKxlX/0KXxm9GLcO14p570aWxFvVzx6QAfPgq7gaeIHXJC8LswQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.22.17) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.0) dev: true - /@babel/plugin-transform-member-expression-literals@7.22.5(@babel/core@7.22.17): + /@babel/plugin-transform-member-expression-literals@7.22.5(@babel/core@7.23.0): resolution: {integrity: sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-modules-amd@7.22.5(@babel/core@7.22.17): - resolution: {integrity: sha512-R+PTfLTcYEmb1+kK7FNkhQ1gP4KgjpSO6HfH9+f8/yfp2Nt3ggBjiVpRwmwTlfqZLafYKJACy36yDXlEmI9HjQ==} + /@babel/plugin-transform-modules-amd@7.23.0(@babel/core@7.23.0): + resolution: {integrity: sha512-xWT5gefv2HGSm4QHtgc1sYPbseOyf+FFDo2JbpE25GWl5BqTGO9IMwTYJRoIdjsF85GE+VegHxSCUt5EvoYTAw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 - '@babel/helper-module-transforms': 7.22.17(@babel/core@7.22.17) + '@babel/core': 7.23.0 + '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.0) '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-modules-commonjs@7.22.15(@babel/core@7.22.17): - resolution: {integrity: sha512-jWL4eh90w0HQOTKP2MoXXUpVxilxsB2Vl4ji69rSjS3EcZ/v4sBmn+A3NpepuJzBhOaEBbR7udonlHHn5DWidg==} + /@babel/plugin-transform-modules-commonjs@7.23.0(@babel/core@7.23.0): + resolution: {integrity: sha512-32Xzss14/UVc7k9g775yMIvkVK8xwKE0DPdP5JTapr3+Z9w4tzeOuLNY6BXDQR6BdnzIlXnCGAzsk/ICHBLVWQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 - '@babel/helper-module-transforms': 7.22.17(@babel/core@7.22.17) + '@babel/core': 7.23.0 + '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.0) '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-simple-access': 7.22.5 dev: true - /@babel/plugin-transform-modules-systemjs@7.22.11(@babel/core@7.22.17): - resolution: {integrity: sha512-rIqHmHoMEOhI3VkVf5jQ15l539KrwhzqcBO6wdCNWPWc/JWt9ILNYNUssbRpeq0qWns8svuw8LnMNCvWBIJ8wA==} + /@babel/plugin-transform-modules-systemjs@7.23.0(@babel/core@7.23.0): + resolution: {integrity: sha512-qBej6ctXZD2f+DhlOC9yO47yEYgUh5CZNz/aBoH4j/3NOlRfJXJbY7xDQCqQVf9KbrqGzIWER1f23doHGrIHFg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.23.0 '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-module-transforms': 7.22.17(@babel/core@7.22.17) + '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.0) '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-validator-identifier': 7.22.15 + '@babel/helper-validator-identifier': 7.22.20 dev: true - /@babel/plugin-transform-modules-umd@7.22.5(@babel/core@7.22.17): + /@babel/plugin-transform-modules-umd@7.22.5(@babel/core@7.23.0): resolution: {integrity: sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 - '@babel/helper-module-transforms': 7.22.17(@babel/core@7.22.17) + '@babel/core': 7.23.0 + '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.0) '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.22.17): + /@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.23.0): resolution: {integrity: sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.22.17 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.22.17) + '@babel/core': 7.23.0 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.0) '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-new-target@7.22.5(@babel/core@7.22.17): + /@babel/plugin-transform-new-target@7.22.5(@babel/core@7.23.0): resolution: {integrity: sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-nullish-coalescing-operator@7.22.11(@babel/core@7.22.17): + /@babel/plugin-transform-nullish-coalescing-operator@7.22.11(@babel/core@7.23.0): resolution: {integrity: sha512-YZWOw4HxXrotb5xsjMJUDlLgcDXSfO9eCmdl1bgW4+/lAGdkjaEvOnQ4p5WKKdUgSzO39dgPl0pTnfxm0OAXcg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.22.17) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.0) dev: true - /@babel/plugin-transform-numeric-separator@7.22.11(@babel/core@7.22.17): + /@babel/plugin-transform-numeric-separator@7.22.11(@babel/core@7.23.0): resolution: {integrity: sha512-3dzU4QGPsILdJbASKhF/V2TVP+gJya1PsueQCxIPCEcerqF21oEcrob4mzjsp2Py/1nLfF5m+xYNMDpmA8vffg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.22.17) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.0) dev: true - /@babel/plugin-transform-object-rest-spread@7.22.15(@babel/core@7.22.17): + /@babel/plugin-transform-object-rest-spread@7.22.15(@babel/core@7.23.0): resolution: {integrity: sha512-fEB+I1+gAmfAyxZcX1+ZUwLeAuuf8VIg67CTznZE0MqVFumWkh8xWtn58I4dxdVf080wn7gzWoF8vndOViJe9Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.22.9 - '@babel/core': 7.22.17 + '@babel/compat-data': 7.22.20 + '@babel/core': 7.23.0 '@babel/helper-compilation-targets': 7.22.15 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.22.17) - '@babel/plugin-transform-parameters': 7.22.15(@babel/core@7.22.17) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.0) + '@babel/plugin-transform-parameters': 7.22.15(@babel/core@7.23.0) dev: true - /@babel/plugin-transform-object-super@7.22.5(@babel/core@7.22.17): + /@babel/plugin-transform-object-super@7.22.5(@babel/core@7.23.0): resolution: {integrity: sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-replace-supers': 7.22.9(@babel/core@7.22.17) + '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.0) dev: true - /@babel/plugin-transform-optional-catch-binding@7.22.11(@babel/core@7.22.17): + /@babel/plugin-transform-optional-catch-binding@7.22.11(@babel/core@7.23.0): resolution: {integrity: sha512-rli0WxesXUeCJnMYhzAglEjLWVDF6ahb45HuprcmQuLidBJFWjNnOzssk2kuc6e33FlLaiZhG/kUIzUMWdBKaQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.22.17) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.0) dev: true - /@babel/plugin-transform-optional-chaining@7.22.15(@babel/core@7.22.17): - resolution: {integrity: sha512-ngQ2tBhq5vvSJw2Q2Z9i7ealNkpDMU0rGWnHPKqRZO0tzZ5tlaoz4hDvhXioOoaE0X2vfNss1djwg0DXlfu30A==} + /@babel/plugin-transform-optional-chaining@7.23.0(@babel/core@7.23.0): + resolution: {integrity: sha512-sBBGXbLJjxTzLBF5rFWaikMnOGOk/BmK6vVByIdEggZ7Vn6CvWXZyRkkLFK6WE0IF8jSliyOkUN6SScFgzCM0g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.22.17) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.0) dev: true - /@babel/plugin-transform-parameters@7.22.15(@babel/core@7.22.17): + /@babel/plugin-transform-parameters@7.22.15(@babel/core@7.23.0): resolution: {integrity: sha512-hjk7qKIqhyzhhUvRT683TYQOFa/4cQKwQy7ALvTpODswN40MljzNDa0YldevS6tGbxwaEKVn502JmY0dP7qEtQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-private-methods@7.22.5(@babel/core@7.22.17): + /@babel/plugin-transform-private-methods@7.22.5(@babel/core@7.23.0): resolution: {integrity: sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 - '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.22.17) + '@babel/core': 7.23.0 + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.0) '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-private-property-in-object@7.22.11(@babel/core@7.22.17): + /@babel/plugin-transform-private-property-in-object@7.22.11(@babel/core@7.23.0): resolution: {integrity: sha512-sSCbqZDBKHetvjSwpyWzhuHkmW5RummxJBVbYLkGkaiTOWGxml7SXt0iWa03bzxFIx7wOj3g/ILRd0RcJKBeSQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.23.0 '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.22.17) + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.0) '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.22.17) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.23.0) dev: true - /@babel/plugin-transform-property-literals@7.22.5(@babel/core@7.22.17): + /@babel/plugin-transform-property-literals@7.22.5(@babel/core@7.23.0): resolution: {integrity: sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-react-constant-elements@7.22.5(@babel/core@7.22.17): + /@babel/plugin-transform-react-constant-elements@7.22.5(@babel/core@7.23.0): resolution: {integrity: sha512-BF5SXoO+nX3h5OhlN78XbbDrBOffv+AxPP2ENaJOVqjWCgBDeOY3WcaUcddutGSfoap+5NEQ/q/4I3WZIvgkXA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-react-display-name@7.22.5(@babel/core@7.22.17): + /@babel/plugin-transform-react-display-name@7.22.5(@babel/core@7.23.0): resolution: {integrity: sha512-PVk3WPYudRF5z4GKMEYUrLjPl38fJSKNaEOkFuoprioowGuWN6w2RKznuFNSlJx7pzzXXStPUnNSOEO0jL5EVw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-react-jsx-development@7.22.5(@babel/core@7.22.17): + /@babel/plugin-transform-react-jsx-development@7.22.5(@babel/core@7.23.0): resolution: {integrity: sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 - '@babel/plugin-transform-react-jsx': 7.22.15(@babel/core@7.22.17) + '@babel/core': 7.23.0 + '@babel/plugin-transform-react-jsx': 7.22.15(@babel/core@7.23.0) dev: true - /@babel/plugin-transform-react-jsx@7.22.15(@babel/core@7.22.17): + /@babel/plugin-transform-react-jsx@7.22.15(@babel/core@7.23.0): resolution: {integrity: sha512-oKckg2eZFa8771O/5vi7XeTvmM6+O9cxZu+kanTU7tD4sin5nO/G8jGJhq8Hvt2Z0kUoEDRayuZLaUlYl8QuGA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.23.0 '@babel/helper-annotate-as-pure': 7.22.5 '@babel/helper-module-imports': 7.22.15 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.22.17) - '@babel/types': 7.22.17 + '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.23.0) + '@babel/types': 7.23.0 dev: true - /@babel/plugin-transform-react-pure-annotations@7.22.5(@babel/core@7.22.17): + /@babel/plugin-transform-react-pure-annotations@7.22.5(@babel/core@7.23.0): resolution: {integrity: sha512-gP4k85wx09q+brArVinTXhWiyzLl9UpmGva0+mWyKxk6JZequ05x3eUcIUE+FyttPKJFRRVtAvQaJ6YF9h1ZpA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.23.0 '@babel/helper-annotate-as-pure': 7.22.5 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-regenerator@7.22.10(@babel/core@7.22.17): + /@babel/plugin-transform-regenerator@7.22.10(@babel/core@7.23.0): resolution: {integrity: sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 regenerator-transform: 0.15.2 dev: true - /@babel/plugin-transform-reserved-words@7.22.5(@babel/core@7.22.17): + /@babel/plugin-transform-reserved-words@7.22.5(@babel/core@7.23.0): resolution: {integrity: sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-runtime@7.22.15(@babel/core@7.22.17): + /@babel/plugin-transform-runtime@7.22.15(@babel/core@7.23.0): resolution: {integrity: sha512-tEVLhk8NRZSmwQ0DJtxxhTrCht1HVo8VaMzYT4w6lwyKBuHsgoioAUA7/6eT2fRfc5/23fuGdlwIxXhRVgWr4g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.23.0 '@babel/helper-module-imports': 7.22.15 '@babel/helper-plugin-utils': 7.22.5 - babel-plugin-polyfill-corejs2: 0.4.5(@babel/core@7.22.17) - babel-plugin-polyfill-corejs3: 0.8.3(@babel/core@7.22.17) - babel-plugin-polyfill-regenerator: 0.5.2(@babel/core@7.22.17) + babel-plugin-polyfill-corejs2: 0.4.5(@babel/core@7.23.0) + babel-plugin-polyfill-corejs3: 0.8.4(@babel/core@7.23.0) + babel-plugin-polyfill-regenerator: 0.5.2(@babel/core@7.23.0) semver: 6.3.1 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-transform-shorthand-properties@7.22.5(@babel/core@7.22.17): + /@babel/plugin-transform-shorthand-properties@7.22.5(@babel/core@7.23.0): resolution: {integrity: sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-spread@7.22.5(@babel/core@7.22.17): + /@babel/plugin-transform-spread@7.22.5(@babel/core@7.23.0): resolution: {integrity: sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 dev: true - /@babel/plugin-transform-sticky-regex@7.22.5(@babel/core@7.22.17): + /@babel/plugin-transform-sticky-regex@7.22.5(@babel/core@7.23.0): resolution: {integrity: sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-template-literals@7.22.5(@babel/core@7.22.17): + /@babel/plugin-transform-template-literals@7.22.5(@babel/core@7.23.0): resolution: {integrity: sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-typeof-symbol@7.22.5(@babel/core@7.22.17): + /@babel/plugin-transform-typeof-symbol@7.22.5(@babel/core@7.23.0): resolution: {integrity: sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-typescript@7.22.15(@babel/core@7.22.17): + /@babel/plugin-transform-typescript@7.22.15(@babel/core@7.23.0): resolution: {integrity: sha512-1uirS0TnijxvQLnlv5wQBwOX3E1wCFX7ITv+9pBV2wKEk4K+M5tqDaoNXnTH8tjEIYHLO98MwiTWO04Ggz4XuA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.23.0 '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.22.17) + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.0) '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-typescript': 7.22.5(@babel/core@7.22.17) + '@babel/plugin-syntax-typescript': 7.22.5(@babel/core@7.23.0) dev: true - /@babel/plugin-transform-unicode-escapes@7.22.10(@babel/core@7.22.17): + /@babel/plugin-transform-unicode-escapes@7.22.10(@babel/core@7.23.0): resolution: {integrity: sha512-lRfaRKGZCBqDlRU3UIFovdp9c9mEvlylmpod0/OatICsSfuQ9YFthRo1tpTkGsklEefZdqlEFdY4A2dwTb6ohg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-unicode-property-regex@7.22.5(@babel/core@7.22.17): + /@babel/plugin-transform-unicode-property-regex@7.22.5(@babel/core@7.23.0): resolution: {integrity: sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.22.17) + '@babel/core': 7.23.0 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.0) '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-unicode-regex@7.22.5(@babel/core@7.22.17): + /@babel/plugin-transform-unicode-regex@7.22.5(@babel/core@7.23.0): resolution: {integrity: sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.22.17) + '@babel/core': 7.23.0 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.0) '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-unicode-sets-regex@7.22.5(@babel/core@7.22.17): + /@babel/plugin-transform-unicode-sets-regex@7.22.5(@babel/core@7.23.0): resolution: {integrity: sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.22.17 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.22.17) + '@babel/core': 7.23.0 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.0) '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/preset-env@7.22.15(@babel/core@7.22.17): - resolution: {integrity: sha512-tZFHr54GBkHk6hQuVA8w4Fmq+MSPsfvMG0vPnOYyTnJpyfMqybL8/MbNCPRT9zc2KBO2pe4tq15g6Uno4Jpoag==} + /@babel/preset-env@7.22.20(@babel/core@7.23.0): + resolution: {integrity: sha512-11MY04gGC4kSzlPHRfvVkNAZhUxOvm7DCJ37hPDnUENwe06npjIRAfInEMTGSb4LZK5ZgDFkv5hw0lGebHeTyg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.22.9 - '@babel/core': 7.22.17 + '@babel/compat-data': 7.22.20 + '@babel/core': 7.23.0 '@babel/helper-compilation-targets': 7.22.15 '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-validator-option': 7.22.15 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.22.15(@babel/core@7.22.17) - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.22.15(@babel/core@7.22.17) - '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.22.17) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.22.17) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.22.17) - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.22.17) - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.22.17) - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.22.17) - '@babel/plugin-syntax-import-assertions': 7.22.5(@babel/core@7.22.17) - '@babel/plugin-syntax-import-attributes': 7.22.5(@babel/core@7.22.17) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.22.17) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.22.17) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.22.17) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.22.17) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.22.17) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.22.17) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.22.17) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.22.17) - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.22.17) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.22.17) - '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.22.17) - '@babel/plugin-transform-arrow-functions': 7.22.5(@babel/core@7.22.17) - '@babel/plugin-transform-async-generator-functions': 7.22.15(@babel/core@7.22.17) - '@babel/plugin-transform-async-to-generator': 7.22.5(@babel/core@7.22.17) - '@babel/plugin-transform-block-scoped-functions': 7.22.5(@babel/core@7.22.17) - '@babel/plugin-transform-block-scoping': 7.22.15(@babel/core@7.22.17) - '@babel/plugin-transform-class-properties': 7.22.5(@babel/core@7.22.17) - '@babel/plugin-transform-class-static-block': 7.22.11(@babel/core@7.22.17) - '@babel/plugin-transform-classes': 7.22.15(@babel/core@7.22.17) - '@babel/plugin-transform-computed-properties': 7.22.5(@babel/core@7.22.17) - '@babel/plugin-transform-destructuring': 7.22.15(@babel/core@7.22.17) - '@babel/plugin-transform-dotall-regex': 7.22.5(@babel/core@7.22.17) - '@babel/plugin-transform-duplicate-keys': 7.22.5(@babel/core@7.22.17) - '@babel/plugin-transform-dynamic-import': 7.22.11(@babel/core@7.22.17) - '@babel/plugin-transform-exponentiation-operator': 7.22.5(@babel/core@7.22.17) - '@babel/plugin-transform-export-namespace-from': 7.22.11(@babel/core@7.22.17) - '@babel/plugin-transform-for-of': 7.22.15(@babel/core@7.22.17) - '@babel/plugin-transform-function-name': 7.22.5(@babel/core@7.22.17) - '@babel/plugin-transform-json-strings': 7.22.11(@babel/core@7.22.17) - '@babel/plugin-transform-literals': 7.22.5(@babel/core@7.22.17) - '@babel/plugin-transform-logical-assignment-operators': 7.22.11(@babel/core@7.22.17) - '@babel/plugin-transform-member-expression-literals': 7.22.5(@babel/core@7.22.17) - '@babel/plugin-transform-modules-amd': 7.22.5(@babel/core@7.22.17) - '@babel/plugin-transform-modules-commonjs': 7.22.15(@babel/core@7.22.17) - '@babel/plugin-transform-modules-systemjs': 7.22.11(@babel/core@7.22.17) - '@babel/plugin-transform-modules-umd': 7.22.5(@babel/core@7.22.17) - '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.22.17) - '@babel/plugin-transform-new-target': 7.22.5(@babel/core@7.22.17) - '@babel/plugin-transform-nullish-coalescing-operator': 7.22.11(@babel/core@7.22.17) - '@babel/plugin-transform-numeric-separator': 7.22.11(@babel/core@7.22.17) - '@babel/plugin-transform-object-rest-spread': 7.22.15(@babel/core@7.22.17) - '@babel/plugin-transform-object-super': 7.22.5(@babel/core@7.22.17) - '@babel/plugin-transform-optional-catch-binding': 7.22.11(@babel/core@7.22.17) - '@babel/plugin-transform-optional-chaining': 7.22.15(@babel/core@7.22.17) - '@babel/plugin-transform-parameters': 7.22.15(@babel/core@7.22.17) - '@babel/plugin-transform-private-methods': 7.22.5(@babel/core@7.22.17) - '@babel/plugin-transform-private-property-in-object': 7.22.11(@babel/core@7.22.17) - '@babel/plugin-transform-property-literals': 7.22.5(@babel/core@7.22.17) - '@babel/plugin-transform-regenerator': 7.22.10(@babel/core@7.22.17) - '@babel/plugin-transform-reserved-words': 7.22.5(@babel/core@7.22.17) - '@babel/plugin-transform-shorthand-properties': 7.22.5(@babel/core@7.22.17) - '@babel/plugin-transform-spread': 7.22.5(@babel/core@7.22.17) - '@babel/plugin-transform-sticky-regex': 7.22.5(@babel/core@7.22.17) - '@babel/plugin-transform-template-literals': 7.22.5(@babel/core@7.22.17) - '@babel/plugin-transform-typeof-symbol': 7.22.5(@babel/core@7.22.17) - '@babel/plugin-transform-unicode-escapes': 7.22.10(@babel/core@7.22.17) - '@babel/plugin-transform-unicode-property-regex': 7.22.5(@babel/core@7.22.17) - '@babel/plugin-transform-unicode-regex': 7.22.5(@babel/core@7.22.17) - '@babel/plugin-transform-unicode-sets-regex': 7.22.5(@babel/core@7.22.17) - '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.22.17) - '@babel/types': 7.22.17 - babel-plugin-polyfill-corejs2: 0.4.5(@babel/core@7.22.17) - babel-plugin-polyfill-corejs3: 0.8.3(@babel/core@7.22.17) - babel-plugin-polyfill-regenerator: 0.5.2(@babel/core@7.22.17) + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.22.15(@babel/core@7.23.0) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.22.15(@babel/core@7.23.0) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.23.0) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.0) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.23.0) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.23.0) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.23.0) + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.23.0) + '@babel/plugin-syntax-import-assertions': 7.22.5(@babel/core@7.23.0) + '@babel/plugin-syntax-import-attributes': 7.22.5(@babel/core@7.23.0) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.23.0) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.0) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.0) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.0) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.0) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.0) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.0) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.0) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.23.0) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.23.0) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.23.0) + '@babel/plugin-transform-arrow-functions': 7.22.5(@babel/core@7.23.0) + '@babel/plugin-transform-async-generator-functions': 7.22.15(@babel/core@7.23.0) + '@babel/plugin-transform-async-to-generator': 7.22.5(@babel/core@7.23.0) + '@babel/plugin-transform-block-scoped-functions': 7.22.5(@babel/core@7.23.0) + '@babel/plugin-transform-block-scoping': 7.23.0(@babel/core@7.23.0) + '@babel/plugin-transform-class-properties': 7.22.5(@babel/core@7.23.0) + '@babel/plugin-transform-class-static-block': 7.22.11(@babel/core@7.23.0) + '@babel/plugin-transform-classes': 7.22.15(@babel/core@7.23.0) + '@babel/plugin-transform-computed-properties': 7.22.5(@babel/core@7.23.0) + '@babel/plugin-transform-destructuring': 7.23.0(@babel/core@7.23.0) + '@babel/plugin-transform-dotall-regex': 7.22.5(@babel/core@7.23.0) + '@babel/plugin-transform-duplicate-keys': 7.22.5(@babel/core@7.23.0) + '@babel/plugin-transform-dynamic-import': 7.22.11(@babel/core@7.23.0) + '@babel/plugin-transform-exponentiation-operator': 7.22.5(@babel/core@7.23.0) + '@babel/plugin-transform-export-namespace-from': 7.22.11(@babel/core@7.23.0) + '@babel/plugin-transform-for-of': 7.22.15(@babel/core@7.23.0) + '@babel/plugin-transform-function-name': 7.22.5(@babel/core@7.23.0) + '@babel/plugin-transform-json-strings': 7.22.11(@babel/core@7.23.0) + '@babel/plugin-transform-literals': 7.22.5(@babel/core@7.23.0) + '@babel/plugin-transform-logical-assignment-operators': 7.22.11(@babel/core@7.23.0) + '@babel/plugin-transform-member-expression-literals': 7.22.5(@babel/core@7.23.0) + '@babel/plugin-transform-modules-amd': 7.23.0(@babel/core@7.23.0) + '@babel/plugin-transform-modules-commonjs': 7.23.0(@babel/core@7.23.0) + '@babel/plugin-transform-modules-systemjs': 7.23.0(@babel/core@7.23.0) + '@babel/plugin-transform-modules-umd': 7.22.5(@babel/core@7.23.0) + '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.23.0) + '@babel/plugin-transform-new-target': 7.22.5(@babel/core@7.23.0) + '@babel/plugin-transform-nullish-coalescing-operator': 7.22.11(@babel/core@7.23.0) + '@babel/plugin-transform-numeric-separator': 7.22.11(@babel/core@7.23.0) + '@babel/plugin-transform-object-rest-spread': 7.22.15(@babel/core@7.23.0) + '@babel/plugin-transform-object-super': 7.22.5(@babel/core@7.23.0) + '@babel/plugin-transform-optional-catch-binding': 7.22.11(@babel/core@7.23.0) + '@babel/plugin-transform-optional-chaining': 7.23.0(@babel/core@7.23.0) + '@babel/plugin-transform-parameters': 7.22.15(@babel/core@7.23.0) + '@babel/plugin-transform-private-methods': 7.22.5(@babel/core@7.23.0) + '@babel/plugin-transform-private-property-in-object': 7.22.11(@babel/core@7.23.0) + '@babel/plugin-transform-property-literals': 7.22.5(@babel/core@7.23.0) + '@babel/plugin-transform-regenerator': 7.22.10(@babel/core@7.23.0) + '@babel/plugin-transform-reserved-words': 7.22.5(@babel/core@7.23.0) + '@babel/plugin-transform-shorthand-properties': 7.22.5(@babel/core@7.23.0) + '@babel/plugin-transform-spread': 7.22.5(@babel/core@7.23.0) + '@babel/plugin-transform-sticky-regex': 7.22.5(@babel/core@7.23.0) + '@babel/plugin-transform-template-literals': 7.22.5(@babel/core@7.23.0) + '@babel/plugin-transform-typeof-symbol': 7.22.5(@babel/core@7.23.0) + '@babel/plugin-transform-unicode-escapes': 7.22.10(@babel/core@7.23.0) + '@babel/plugin-transform-unicode-property-regex': 7.22.5(@babel/core@7.23.0) + '@babel/plugin-transform-unicode-regex': 7.22.5(@babel/core@7.23.0) + '@babel/plugin-transform-unicode-sets-regex': 7.22.5(@babel/core@7.23.0) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.23.0) + '@babel/types': 7.23.0 + babel-plugin-polyfill-corejs2: 0.4.5(@babel/core@7.23.0) + babel-plugin-polyfill-corejs3: 0.8.4(@babel/core@7.23.0) + babel-plugin-polyfill-regenerator: 0.5.2(@babel/core@7.23.0) core-js-compat: 3.32.2 semver: 6.3.1 transitivePeerDependencies: - supports-color dev: true - /@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.22.17): + /@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.23.0): resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} peerDependencies: '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 - '@babel/types': 7.22.17 + '@babel/types': 7.23.0 esutils: 2.0.3 dev: true - /@babel/preset-react@7.22.15(@babel/core@7.22.17): + /@babel/preset-react@7.22.15(@babel/core@7.23.0): resolution: {integrity: sha512-Csy1IJ2uEh/PecCBXXoZGAZBeCATTuePzCSB7dLYWS0vOEj6CNpjxIhW4duWwZodBNueH7QO14WbGn8YyeuN9w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-validator-option': 7.22.15 - '@babel/plugin-transform-react-display-name': 7.22.5(@babel/core@7.22.17) - '@babel/plugin-transform-react-jsx': 7.22.15(@babel/core@7.22.17) - '@babel/plugin-transform-react-jsx-development': 7.22.5(@babel/core@7.22.17) - '@babel/plugin-transform-react-pure-annotations': 7.22.5(@babel/core@7.22.17) + '@babel/plugin-transform-react-display-name': 7.22.5(@babel/core@7.23.0) + '@babel/plugin-transform-react-jsx': 7.22.15(@babel/core@7.23.0) + '@babel/plugin-transform-react-jsx-development': 7.22.5(@babel/core@7.23.0) + '@babel/plugin-transform-react-pure-annotations': 7.22.5(@babel/core@7.23.0) dev: true - /@babel/preset-typescript@7.22.15(@babel/core@7.22.17): - resolution: {integrity: sha512-HblhNmh6yM+cU4VwbBRpxFhxsTdfS1zsvH9W+gEjD0ARV9+8B4sNfpI6GuhePti84nuvhiwKS539jKPFHskA9A==} + /@babel/preset-typescript@7.23.0(@babel/core@7.23.0): + resolution: {integrity: sha512-6P6VVa/NM/VlAYj5s2Aq/gdVg8FSENCg3wlZ6Qau9AcPaoF5LbN1nyGlR9DTRIw9PpxI94e+ReydsJHcjwAweg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-validator-option': 7.22.15 - '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.22.17) - '@babel/plugin-transform-modules-commonjs': 7.22.15(@babel/core@7.22.17) - '@babel/plugin-transform-typescript': 7.22.15(@babel/core@7.22.17) + '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.23.0) + '@babel/plugin-transform-modules-commonjs': 7.23.0(@babel/core@7.23.0) + '@babel/plugin-transform-typescript': 7.22.15(@babel/core@7.23.0) dev: true /@babel/regjsgen@0.8.0: @@ -1751,36 +1964,33 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/code-frame': 7.22.13 - '@babel/parser': 7.22.16 - '@babel/types': 7.22.17 - dev: true + '@babel/parser': 7.23.0 + '@babel/types': 7.23.0 - /@babel/traverse@7.22.17: - resolution: {integrity: sha512-xK4Uwm0JnAMvxYZxOVecss85WxTEIbTa7bnGyf/+EgCL5Zt3U7htUpEOWv9detPlamGKuRzCqw74xVglDWpPdg==} + /@babel/traverse@7.23.0: + resolution: {integrity: sha512-t/QaEvyIoIkwzpiZ7aoSKK8kObQYeF7T2v+dazAYCb8SXtp58zEVkWW7zAnju8FNKNdr4ScAOEDmMItbyOmEYw==} engines: {node: '>=6.9.0'} dependencies: '@babel/code-frame': 7.22.13 - '@babel/generator': 7.22.15 - '@babel/helper-environment-visitor': 7.22.5 - '@babel/helper-function-name': 7.22.5 + '@babel/generator': 7.23.0 + '@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.22.16 - '@babel/types': 7.22.17 + '@babel/parser': 7.23.0 + '@babel/types': 7.23.0 debug: 4.3.4 globals: 11.12.0 transitivePeerDependencies: - supports-color - dev: true - /@babel/types@7.22.17: - resolution: {integrity: sha512-YSQPHLFtQNE5xN9tHuZnzu8vPr61wVTBZdfv1meex1NBosa4iT05k/Jw06ddJugi4bk7The/oSwQGFcksmEJQg==} + /@babel/types@7.23.0: + resolution: {integrity: sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==} engines: {node: '>=6.9.0'} dependencies: '@babel/helper-string-parser': 7.22.5 - '@babel/helper-validator-identifier': 7.22.15 + '@babel/helper-validator-identifier': 7.22.20 to-fast-properties: 2.0.0 - dev: true /@bcoe/v8-coverage@0.2.3: resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} @@ -2018,7 +2228,6 @@ packages: /@discoveryjs/json-ext@0.5.7: resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==} engines: {node: '>=10.0.0'} - dev: true /@esbuild/android-arm64@0.16.17: resolution: {integrity: sha512-MIGl6p5sc3RDTLLkYL1MyL8BMRN4tLMRCn+yRJJmEDvYZ2M7tmAf80hx1kbNEUX2KJ50RRtxZ4JHLvCfuB6kBg==} @@ -2035,7 +2244,6 @@ packages: cpu: [arm64] os: [android] requiresBuild: true - dev: true optional: true /@esbuild/android-arm@0.16.17: @@ -2053,7 +2261,6 @@ packages: cpu: [arm] os: [android] requiresBuild: true - dev: true optional: true /@esbuild/android-x64@0.16.17: @@ -2071,7 +2278,6 @@ packages: cpu: [x64] os: [android] requiresBuild: true - dev: true optional: true /@esbuild/darwin-arm64@0.16.17: @@ -2089,7 +2295,6 @@ packages: cpu: [arm64] os: [darwin] requiresBuild: true - dev: true optional: true /@esbuild/darwin-x64@0.16.17: @@ -2107,7 +2312,6 @@ packages: cpu: [x64] os: [darwin] requiresBuild: true - dev: true optional: true /@esbuild/freebsd-arm64@0.16.17: @@ -2125,7 +2329,6 @@ packages: cpu: [arm64] os: [freebsd] requiresBuild: true - dev: true optional: true /@esbuild/freebsd-x64@0.16.17: @@ -2143,7 +2346,6 @@ packages: cpu: [x64] os: [freebsd] requiresBuild: true - dev: true optional: true /@esbuild/linux-arm64@0.16.17: @@ -2161,7 +2363,6 @@ packages: cpu: [arm64] os: [linux] requiresBuild: true - dev: true optional: true /@esbuild/linux-arm@0.16.17: @@ -2179,7 +2380,6 @@ packages: cpu: [arm] os: [linux] requiresBuild: true - dev: true optional: true /@esbuild/linux-ia32@0.16.17: @@ -2197,7 +2397,6 @@ packages: cpu: [ia32] os: [linux] requiresBuild: true - dev: true optional: true /@esbuild/linux-loong64@0.16.17: @@ -2215,7 +2414,6 @@ packages: cpu: [loong64] os: [linux] requiresBuild: true - dev: true optional: true /@esbuild/linux-mips64el@0.16.17: @@ -2233,7 +2431,6 @@ packages: cpu: [mips64el] os: [linux] requiresBuild: true - dev: true optional: true /@esbuild/linux-ppc64@0.16.17: @@ -2251,7 +2448,6 @@ packages: cpu: [ppc64] os: [linux] requiresBuild: true - dev: true optional: true /@esbuild/linux-riscv64@0.16.17: @@ -2269,7 +2465,6 @@ packages: cpu: [riscv64] os: [linux] requiresBuild: true - dev: true optional: true /@esbuild/linux-s390x@0.16.17: @@ -2287,7 +2482,6 @@ packages: cpu: [s390x] os: [linux] requiresBuild: true - dev: true optional: true /@esbuild/linux-x64@0.16.17: @@ -2305,7 +2499,6 @@ packages: cpu: [x64] os: [linux] requiresBuild: true - dev: true optional: true /@esbuild/netbsd-x64@0.16.17: @@ -2323,7 +2516,6 @@ packages: cpu: [x64] os: [netbsd] requiresBuild: true - dev: true optional: true /@esbuild/openbsd-x64@0.16.17: @@ -2341,7 +2533,6 @@ packages: cpu: [x64] os: [openbsd] requiresBuild: true - dev: true optional: true /@esbuild/sunos-x64@0.16.17: @@ -2359,7 +2550,6 @@ packages: cpu: [x64] os: [sunos] requiresBuild: true - dev: true optional: true /@esbuild/win32-arm64@0.16.17: @@ -2377,7 +2567,6 @@ packages: cpu: [arm64] os: [win32] requiresBuild: true - dev: true optional: true /@esbuild/win32-ia32@0.16.17: @@ -2395,7 +2584,6 @@ packages: cpu: [ia32] os: [win32] requiresBuild: true - dev: true optional: true /@esbuild/win32-x64@0.16.17: @@ -2413,7 +2601,6 @@ packages: cpu: [x64] os: [win32] requiresBuild: true - dev: true optional: true /@eslint-community/eslint-utils@4.4.0(eslint@8.49.0): @@ -2922,7 +3109,6 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@sinclair/typebox': 0.27.8 - dev: true /@jest/source-map@27.5.1: resolution: {integrity: sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==} @@ -2969,7 +3155,7 @@ packages: resolution: {integrity: sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.23.0 '@jest/types': 27.5.1 babel-plugin-istanbul: 6.1.1 chalk: 4.1.2 @@ -2995,7 +3181,7 @@ packages: '@types/istanbul-lib-coverage': 2.0.4 '@types/istanbul-reports': 3.0.1 '@types/node': 20.6.3 - '@types/yargs': 16.0.5 + '@types/yargs': 16.0.6 chalk: 4.1.2 dev: true @@ -3007,7 +3193,7 @@ packages: '@types/istanbul-lib-coverage': 2.0.4 '@types/istanbul-reports': 3.0.1 '@types/node': 20.6.3 - '@types/yargs': 17.0.24 + '@types/yargs': 17.0.25 chalk: 4.1.2 dev: true @@ -3018,35 +3204,29 @@ packages: '@jridgewell/set-array': 1.1.2 '@jridgewell/sourcemap-codec': 1.4.15 '@jridgewell/trace-mapping': 0.3.19 - dev: true /@jridgewell/resolve-uri@3.1.1: resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} engines: {node: '>=6.0.0'} - dev: true /@jridgewell/set-array@1.1.2: resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} engines: {node: '>=6.0.0'} - dev: true /@jridgewell/source-map@0.3.5: resolution: {integrity: sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==} dependencies: '@jridgewell/gen-mapping': 0.3.3 '@jridgewell/trace-mapping': 0.3.19 - dev: true /@jridgewell/sourcemap-codec@1.4.15: resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} - dev: true /@jridgewell/trace-mapping@0.3.19: resolution: {integrity: sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==} dependencies: '@jridgewell/resolve-uri': 3.1.1 '@jridgewell/sourcemap-codec': 1.4.15 - dev: true /@jridgewell/trace-mapping@0.3.9: resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} @@ -3057,7 +3237,11 @@ packages: /@leichtgewicht/ip-codec@2.0.4: resolution: {integrity: sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==} - dev: true + + /@metamask/detect-provider@2.0.0: + resolution: {integrity: sha512-sFpN+TX13E9fdBDh9lvQeZdJn4qYoRb/6QF2oZZK/Pn559IhCFacPMU1rMuqyXoFQF3JSJfii2l98B87QDPeCQ==} + engines: {node: '>=14.0.0'} + dev: false /@next/env@13.5.2: resolution: {integrity: sha512-dUseBIQVax+XtdJPzhwww4GetTjlkRSsXeQnisIJWBaHsnxYcN2RGzsPHi58D6qnkATjnhuAtQTJmR1hKYQQPg==} @@ -3174,8 +3358,8 @@ packages: '@nodelib/fs.scandir': 2.1.5 fastq: 1.15.0 - /@nucypher/nucypher-core@0.13.0-alpha.0: - resolution: {integrity: sha512-Nk+BE1iUY4m/ZHtbKRLJkAidXLLpwFmIbXBgS9qJMT1601dYFee/VvP0W6QoiSP9CirtZ730qtltuYb+MIzOfg==} + /@nucypher/nucypher-core@0.13.0-alpha.1: + resolution: {integrity: sha512-uKu/YLTZ6mqkQ2kaQMJs/USUiw9EYFtaZU6FaD8zAN8XKLpHYuYD13BDfU7idR1nZIKjL/E5xIoVJFV3Dx0x2w==} dev: false /@pmmmwh/react-refresh-webpack-plugin@0.5.11(react-refresh@0.11.0)(webpack-dev-server@4.15.1)(webpack@5.88.2): @@ -3218,7 +3402,47 @@ packages: webpack-dev-server: 4.15.1(webpack-cli@4.10.0)(webpack@5.88.2) dev: true - /@rollup/plugin-babel@5.3.1(@babel/core@7.22.17)(rollup@2.79.1): + /@pmmmwh/react-refresh-webpack-plugin@0.5.11(react-refresh@0.14.0)(webpack-dev-server@4.15.1)(webpack@5.88.2): + resolution: {integrity: sha512-7j/6vdTym0+qZ6u4XbSAxrWBGYSdCfTzySkj7WAFgDLmSyWlOrWvpyzxlFh5jtw9dn0oL/jtW+06XfFiisN3JQ==} + engines: {node: '>= 10.13'} + peerDependencies: + '@types/webpack': 4.x || 5.x + react-refresh: '>=0.10.0 <1.0.0' + sockjs-client: ^1.4.0 + type-fest: '>=0.17.0 <5.0.0' + webpack: '>=4.43.0 <6.0.0' + webpack-dev-server: 3.x || 4.x + webpack-hot-middleware: 2.x + webpack-plugin-serve: 0.x || 1.x + peerDependenciesMeta: + '@types/webpack': + optional: true + sockjs-client: + optional: true + type-fest: + optional: true + webpack-dev-server: + optional: true + webpack-hot-middleware: + optional: true + webpack-plugin-serve: + optional: true + dependencies: + ansi-html-community: 0.0.8 + common-path-prefix: 3.0.0 + core-js-pure: 3.32.2 + error-stack-parser: 2.1.4 + find-up: 5.0.0 + html-entities: 2.4.0 + loader-utils: 2.0.4 + react-refresh: 0.14.0 + schema-utils: 3.3.0 + source-map: 0.7.4 + webpack: 5.88.2(webpack-cli@4.10.0) + webpack-dev-server: 4.15.1(webpack-cli@4.10.0)(webpack@5.88.2) + dev: true + + /@rollup/plugin-babel@5.3.1(@babel/core@7.23.0)(rollup@2.79.1): resolution: {integrity: sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==} engines: {node: '>= 10.0.0'} peerDependencies: @@ -3229,7 +3453,7 @@ packages: '@types/babel__core': optional: true dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.23.0 '@babel/helper-module-imports': 7.22.15 '@rollup/pluginutils': 3.1.0(rollup@2.79.1) rollup: 2.79.1 @@ -3272,8 +3496,8 @@ packages: rollup: 2.79.1 dev: true - /@rushstack/eslint-patch@1.3.3: - resolution: {integrity: sha512-0xd7qez0AQ+MbHatZTlI1gu5vkG8r7MYRUJAHPAHJBmGLs16zpkrpAVLvjQKQOqaXPDUBwOiJzNc00znHSCVBw==} + /@rushstack/eslint-patch@1.4.0: + resolution: {integrity: sha512-cEjvTPU32OM9lUFegJagO0mRnIn+rbqrG89vV8/xLnLFX0DoR0r1oy5IlTga71Q7uT3Qus7qm7wgeiMT/+Irlg==} /@sinclair/typebox@0.24.51: resolution: {integrity: sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==} @@ -3281,7 +3505,6 @@ packages: /@sinclair/typebox@0.27.8: resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} - dev: true /@sinonjs/commons@1.8.6: resolution: {integrity: sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==} @@ -3309,7 +3532,7 @@ packages: ejs: 3.1.9 json5: 2.2.3 magic-string: 0.25.9 - string.prototype.matchall: 4.0.9 + string.prototype.matchall: 4.0.10 dev: true /@svgr/babel-plugin-add-jsx-attribute@5.4.0: @@ -3381,14 +3604,14 @@ packages: resolution: {integrity: sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ==} engines: {node: '>=10'} dependencies: - '@babel/types': 7.22.17 + '@babel/types': 7.23.0 dev: true /@svgr/plugin-jsx@5.5.0: resolution: {integrity: sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA==} engines: {node: '>=10'} dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.23.0 '@svgr/babel-preset': 5.5.0 '@svgr/hast-util-to-babel-ast': 5.5.0 svg-parser: 2.0.4 @@ -3409,10 +3632,10 @@ packages: resolution: {integrity: sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g==} engines: {node: '>=10'} dependencies: - '@babel/core': 7.22.17 - '@babel/plugin-transform-react-constant-elements': 7.22.5(@babel/core@7.22.17) - '@babel/preset-env': 7.22.15(@babel/core@7.22.17) - '@babel/preset-react': 7.22.15(@babel/core@7.22.17) + '@babel/core': 7.23.0 + '@babel/plugin-transform-react-constant-elements': 7.22.5(@babel/core@7.23.0) + '@babel/preset-env': 7.22.20(@babel/core@7.23.0) + '@babel/preset-react': 7.22.15(@babel/core@7.23.0) '@svgr/core': 5.5.0 '@svgr/plugin-jsx': 5.5.0 '@svgr/plugin-svgo': 5.5.0 @@ -3474,117 +3697,106 @@ packages: typescript: 5.2.2 dev: true - /@types/babel__core@7.20.1: - resolution: {integrity: sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==} + /@types/babel__core@7.20.2: + resolution: {integrity: sha512-pNpr1T1xLUc2l3xJKuPtsEky3ybxN3m4fJkknfIpTCTfIZCDW57oAg+EfCgIIp2rvCe0Wn++/FfodDS4YXxBwA==} dependencies: - '@babel/parser': 7.22.16 - '@babel/types': 7.22.17 - '@types/babel__generator': 7.6.4 - '@types/babel__template': 7.4.1 - '@types/babel__traverse': 7.20.1 + '@babel/parser': 7.23.0 + '@babel/types': 7.23.0 + '@types/babel__generator': 7.6.5 + '@types/babel__template': 7.4.2 + '@types/babel__traverse': 7.20.2 dev: true - /@types/babel__generator@7.6.4: - resolution: {integrity: sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==} + /@types/babel__generator@7.6.5: + resolution: {integrity: sha512-h9yIuWbJKdOPLJTbmSpPzkF67e659PbQDba7ifWm5BJ8xTv+sDmS7rFmywkWOvXedGTivCdeGSIIX8WLcRTz8w==} dependencies: - '@babel/types': 7.22.17 + '@babel/types': 7.23.0 dev: true - /@types/babel__template@7.4.1: - resolution: {integrity: sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==} + /@types/babel__template@7.4.2: + resolution: {integrity: sha512-/AVzPICMhMOMYoSx9MoKpGDKdBRsIXMNByh1PXSZoa+v6ZoLa8xxtsT/uLQ/NJm0XVAWl/BvId4MlDeXJaeIZQ==} dependencies: - '@babel/parser': 7.22.16 - '@babel/types': 7.22.17 + '@babel/parser': 7.23.0 + '@babel/types': 7.23.0 dev: true - /@types/babel__traverse@7.20.1: - resolution: {integrity: sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg==} + /@types/babel__traverse@7.20.2: + resolution: {integrity: sha512-ojlGK1Hsfce93J0+kn3H5R73elidKUaZonirN33GSmgTUMpzI/MIFfSpF3haANe3G1bEBS9/9/QEqwTzwqFsKw==} dependencies: - '@babel/types': 7.22.17 + '@babel/types': 7.23.0 dev: true - /@types/body-parser@1.19.2: - resolution: {integrity: sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==} + /@types/body-parser@1.19.3: + resolution: {integrity: sha512-oyl4jvAfTGX9Bt6Or4H9ni1Z447/tQuxnZsytsCaExKlmJiU8sFgnIBRzJUpKwB5eWn9HuBYlUlVA74q/yN0eQ==} dependencies: '@types/connect': 3.4.36 '@types/node': 20.6.3 - dev: true - /@types/bonjour@3.5.10: - resolution: {integrity: sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==} + /@types/bonjour@3.5.11: + resolution: {integrity: sha512-isGhjmBtLIxdHBDl2xGwUzEM8AOyOvWsADWq7rqirdi/ZQoHnLWErHvsThcEzTX8juDRiZtzp2Qkv5bgNh6mAg==} dependencies: '@types/node': 20.6.3 - dev: true /@types/chai-subset@1.3.3: resolution: {integrity: sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==} dependencies: '@types/chai': 4.3.6 - dev: true /@types/chai@4.3.6: resolution: {integrity: sha512-VOVRLM1mBxIRxydiViqPcKn6MIxZytrbMpd6RJLIWKxUNr3zux8no0Oc7kJx0WAPIitgZ0gkrDS+btlqQpubpw==} - dev: true /@types/connect-history-api-fallback@1.5.1: resolution: {integrity: sha512-iaQslNbARe8fctL5Lk+DsmgWOM83lM+7FzP0eQUJs1jd3kBE8NWqBTIT2S8SqQOJjxvt2eyIjpOuYeRXq2AdMw==} dependencies: - '@types/express-serve-static-core': 4.17.36 + '@types/express-serve-static-core': 4.17.37 '@types/node': 20.6.3 - dev: true /@types/connect@3.4.36: resolution: {integrity: sha512-P63Zd/JUGq+PdrM1lv0Wv5SBYeA2+CORvbrXbngriYY0jzLUWfQMQQxOhjONEz/wlHOAxOdY7CY65rgQdTjq2w==} dependencies: '@types/node': 20.6.3 - dev: true /@types/deep-equal@1.0.1: resolution: {integrity: sha512-mMUu4nWHLBlHtxXY17Fg6+ucS/MnndyOWyOe7MmwkoMYxvfQU2ajtRaEvqSUv+aVkMqH/C0NCI8UoVfRNQ10yg==} dev: true - /@types/eslint-scope@3.7.4: - resolution: {integrity: sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==} + /@types/eslint-scope@3.7.5: + resolution: {integrity: sha512-JNvhIEyxVW6EoMIFIvj93ZOywYFatlpu9deeH6eSx6PE3WHYvHaQtmHmQeNw7aA81bYGBPPQqdtBm6b1SsQMmA==} dependencies: - '@types/eslint': 8.44.2 - '@types/estree': 1.0.1 - dev: true + '@types/eslint': 8.44.3 + '@types/estree': 1.0.2 - /@types/eslint@8.44.2: - resolution: {integrity: sha512-sdPRb9K6iL5XZOmBubg8yiFp5yS/JdUDQsq5e6h95km91MCYMuvp7mh1fjPEYUhvHepKpZOjnEaMBR4PxjWDzg==} + /@types/eslint@8.44.3: + resolution: {integrity: sha512-iM/WfkwAhwmPff3wZuPLYiHX18HI24jU8k1ZSH7P8FHwxTjZ2P6CoX2wnF43oprR+YXJM6UUxATkNvyv/JHd+g==} dependencies: - '@types/estree': 1.0.1 + '@types/estree': 1.0.2 '@types/json-schema': 7.0.12 - dev: true /@types/estree@0.0.39: resolution: {integrity: sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==} dev: true - /@types/estree@1.0.1: - resolution: {integrity: sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==} - dev: true + /@types/estree@1.0.2: + resolution: {integrity: sha512-VeiPZ9MMwXjO32/Xu7+OwflfmeoRwkE/qzndw42gGtgJwZopBnzy2gD//NN1+go1mADzkDcqf/KnFRSjTJ8xJA==} - /@types/express-serve-static-core@4.17.36: - resolution: {integrity: sha512-zbivROJ0ZqLAtMzgzIUC4oNqDG9iF0lSsAqpOD9kbs5xcIM3dTiyuHvBc7R8MtWBp3AAWGaovJa+wzWPjLYW7Q==} + /@types/express-serve-static-core@4.17.37: + resolution: {integrity: sha512-ZohaCYTgGFcOP7u6aJOhY9uIZQgZ2vxC2yWoArY+FeDXlqeH66ZVBjgvg+RLVAS/DWNq4Ap9ZXu1+SUQiiWYMg==} dependencies: '@types/node': 20.6.3 '@types/qs': 6.9.8 '@types/range-parser': 1.2.4 '@types/send': 0.17.1 - dev: true - /@types/express@4.17.17: - resolution: {integrity: sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==} + /@types/express@4.17.18: + resolution: {integrity: sha512-Sxv8BSLLgsBYmcnGdGjjEjqET2U+AKAdCRODmMiq02FgjwuV75Ut85DRpvFjyw/Mk0vgUOliGRU0UUmuuZHByQ==} dependencies: - '@types/body-parser': 1.19.2 - '@types/express-serve-static-core': 4.17.36 + '@types/body-parser': 1.19.3 + '@types/express-serve-static-core': 4.17.37 '@types/qs': 6.9.8 '@types/serve-static': 1.15.2 - dev: true - /@types/graceful-fs@4.1.6: - resolution: {integrity: sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==} + /@types/graceful-fs@4.1.7: + resolution: {integrity: sha512-MhzcwU8aUygZroVwL2jeYk6JisJrPl/oov/gsgGCue9mkgl9wjGbzReYQClxiUgFDnib9FuHqTndccKeZKxTRw==} dependencies: '@types/node': 20.6.3 dev: true @@ -3593,15 +3805,13 @@ packages: resolution: {integrity: sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==} dev: true - /@types/http-errors@2.0.1: - resolution: {integrity: sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ==} - dev: true + /@types/http-errors@2.0.2: + resolution: {integrity: sha512-lPG6KlZs88gef6aD85z3HNkztpj7w2R7HmR3gygjfXCQmsLloWNARFkMuzKiiY8FGdh1XDpgBdrSf4aKDiA7Kg==} - /@types/http-proxy@1.17.11: - resolution: {integrity: sha512-HC8G7c1WmaF2ekqpnFq626xd3Zz0uvaqFmBJNRZCGEZCXkvSdJoNFn/8Ygbd9fKNQj8UzLdCETaI0UWPAjK7IA==} + /@types/http-proxy@1.17.12: + resolution: {integrity: sha512-kQtujO08dVtQ2wXAuSFfk9ASy3sug4+ogFR8Kd8UgP8PEuc1/G/8yjYRmp//PcDNJEUKOza/MrQu15bouEUCiw==} dependencies: '@types/node': 20.6.3 - dev: true /@types/istanbul-lib-coverage@2.0.4: resolution: {integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==} @@ -3621,7 +3831,6 @@ packages: /@types/json-schema@7.0.12: resolution: {integrity: sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==} - dev: true /@types/json5@0.0.29: resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} @@ -3632,18 +3841,16 @@ packages: /@types/mime@1.3.2: resolution: {integrity: sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==} - dev: true /@types/mime@3.0.1: resolution: {integrity: sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==} - dev: true /@types/minimist@1.2.2: resolution: {integrity: sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==} dev: true - /@types/node@16.18.50: - resolution: {integrity: sha512-OiDU5xRgYTJ203v4cprTs0RwOCd5c5Zjv+K5P8KSqfiCsB1W3LcamTUMcnQarpq5kOYbhHfSOgIEJvdPyb5xyw==} + /@types/node@16.18.54: + resolution: {integrity: sha512-oTmGy68gxZZ21FhTJVVvZBYpQHEBZxHKTsGshobMqm9qWpbqdZsA5jvsuPZcHu0KwpmLrOHWPdEfg7XDpNT9UA==} dev: true /@types/node@20.4.7: @@ -3671,8 +3878,8 @@ packages: resolution: {integrity: sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==} dev: true - /@types/prop-types@15.7.5: - resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==} + /@types/prop-types@15.7.7: + resolution: {integrity: sha512-FbtmBWCcSa2J4zL781Zf1p5YUBXQomPEcep9QZCfRfQgTxz3pJWiDFLebohZ9fFntX5ibzOkSsrJ0TEew8cAog==} /@types/q@1.5.6: resolution: {integrity: sha512-IKjZ8RjTSwD4/YG+2gtj7BPFRB/lNbWKTiSj3M7U/TD2B7HfYCxvp2Zz6xA2WIY7pAuL1QOUPw8gQRbUrrq4fQ==} @@ -3680,10 +3887,14 @@ packages: /@types/qs@6.9.8: resolution: {integrity: sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg==} - dev: true /@types/range-parser@1.2.4: resolution: {integrity: sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==} + + /@types/react-copy-to-clipboard@5.0.5: + resolution: {integrity: sha512-en3JGqPA4RX4aUlo6q6uUbnqLp31Dhm2E/thiMvFTIvU+dUDG249jBG2MJ0rPMXE/MbKVrpmi/1r1G4QLhIHKQ==} + dependencies: + '@types/react': 18.2.22 dev: true /@types/react-dom@18.2.7: @@ -3691,18 +3902,10 @@ packages: dependencies: '@types/react': 18.2.22 - /@types/react@18.2.21: - resolution: {integrity: sha512-neFKG/sBAwGxHgXiIxnbm3/AAVQ/cMRS93hvBpg8xYRbeQSPVABp9U2bRnPf0iI4+Ucdv3plSxKK+3CW2ENJxA==} - dependencies: - '@types/prop-types': 15.7.5 - '@types/scheduler': 0.16.3 - csstype: 3.1.2 - dev: true - /@types/react@18.2.22: resolution: {integrity: sha512-60fLTOLqzarLED2O3UQImc/lsNRgG0jE/a1mPW9KjMemY0LMITWEsbS4VvZ4p6rorEHd5YKxxmMKSDK505GHpA==} dependencies: - '@types/prop-types': 15.7.5 + '@types/prop-types': 15.7.7 '@types/scheduler': 0.16.3 csstype: 3.1.2 @@ -3714,15 +3917,10 @@ packages: /@types/retry@0.12.0: resolution: {integrity: sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==} - dev: true /@types/scheduler@0.16.3: resolution: {integrity: sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==} - /@types/semver@7.5.1: - resolution: {integrity: sha512-cJRQXpObxfNKkFAZbJl2yjWtJCqELQIdShsogr1d2MilP8dKD9TE/nEKHkJgUNHdGKCQaf9HbIynuV2csLGVLg==} - dev: true - /@types/semver@7.5.2: resolution: {integrity: sha512-7aqorHYgdNO4DM36stTiGO3DvKoex9TQRwsJU6vMaFGyqpBA1MNZkz+PG3gaNUPpTAOYhT1WR7M1JyA3fbS9Cw==} dev: true @@ -3732,27 +3930,23 @@ packages: dependencies: '@types/mime': 1.3.2 '@types/node': 20.6.3 - dev: true /@types/serve-index@1.9.1: resolution: {integrity: sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==} dependencies: - '@types/express': 4.17.17 - dev: true + '@types/express': 4.17.18 /@types/serve-static@1.15.2: resolution: {integrity: sha512-J2LqtvFYCzaj8pVYKw8klQXrLLk7TBZmQ4ShlcdkELFKGwGMfevMLneMMRkMgZxotOD9wg497LpC7O8PcvAmfw==} dependencies: - '@types/http-errors': 2.0.1 + '@types/http-errors': 2.0.2 '@types/mime': 3.0.1 '@types/node': 20.6.3 - dev: true /@types/sockjs@0.3.33: resolution: {integrity: sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==} dependencies: '@types/node': 20.6.3 - dev: true /@types/stack-utils@2.0.1: resolution: {integrity: sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==} @@ -3766,22 +3960,21 @@ packages: resolution: {integrity: sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg==} dependencies: '@types/node': 20.6.3 - dev: true - /@types/yargs-parser@21.0.0: - resolution: {integrity: sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==} + /@types/yargs-parser@21.0.1: + resolution: {integrity: sha512-axdPBuLuEJt0c4yI5OZssC19K2Mq1uKdrfZBzuxLvaztgqUtFYZUNw7lETExPYJR9jdEoIg4mb7RQKRQzOkeGQ==} dev: true - /@types/yargs@16.0.5: - resolution: {integrity: sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==} + /@types/yargs@16.0.6: + resolution: {integrity: sha512-oTP7/Q13GSPrgcwEwdlnkoZSQ1Hg9THe644qq8PG6hhJzjZ3qj1JjEFPIwWV/IXVs5XGIVqtkNOS9kh63WIJ+A==} dependencies: - '@types/yargs-parser': 21.0.0 + '@types/yargs-parser': 21.0.1 dev: true - /@types/yargs@17.0.24: - resolution: {integrity: sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==} + /@types/yargs@17.0.25: + resolution: {integrity: sha512-gy7iPgwnzNvxgAEi2bXOHWCVOG6f7xsprVJH4MjlAWeBmJ7vh/Y1kwMtUrs64ztf24zVIRCpr3n/z6gm9QIkgg==} dependencies: - '@types/yargs-parser': 21.0.0 + '@types/yargs-parser': 21.0.1 dev: true /@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.49.0)(typescript@5.2.2): @@ -4053,6 +4246,31 @@ packages: '@typescript-eslint/types': 6.7.0 eslint-visitor-keys: 3.4.3 + /@uniswap/token-lists@1.0.0-beta.33: + resolution: {integrity: sha512-JQkXcpRI3jFG8y3/CGC4TS8NkDgcxXaOQuYW8Qdvd6DcDiIyg2vVYCG9igFEzF0G6UvxgHkBKC7cWCgzZNYvQg==} + engines: {node: '>=10'} + dev: false + + /@usedapp/core@1.2.13(ethers@5.7.2)(react@18.2.0): + resolution: {integrity: sha512-mlWIIXvWdu+f3J0DCNNiPd9blTzuknQvTNy0yX61x/XDoZNqoPfs+0ALMndvmPKN8VMNbo0fwTjoR3R8rNfx9g==} + hasBin: true + peerDependencies: + ethers: ^5 + react: '*' + dependencies: + '@metamask/detect-provider': 2.0.0 + '@uniswap/token-lists': 1.0.0-beta.33 + ethers: 5.7.2 + fetch-mock: 9.11.0 + lodash.merge: 4.6.2 + lodash.pickby: 4.6.0 + nanoid: 3.3.4 + react: 18.2.0 + transitivePeerDependencies: + - node-fetch + - supports-color + dev: false + /@vitest/coverage-v8@0.34.4(vitest@0.34.4): resolution: {integrity: sha512-TZ5ghzhmg3COQqfBShL+zRQEInHmV9TSwghTdfkHpCTyTOr+rxo6x41vCNcVfWysWULtqtBVpY6YFNovxnESfA==} peerDependencies: @@ -4080,7 +4298,6 @@ packages: '@vitest/spy': 0.34.4 '@vitest/utils': 0.34.4 chai: 4.3.8 - dev: true /@vitest/runner@0.34.4: resolution: {integrity: sha512-hwwdB1StERqUls8oV8YcpmTIpVeJMe4WgYuDongVzixl5hlYLT2G8afhcdADeDeqCaAmZcSgLTLtqkjPQF7x+w==} @@ -4088,7 +4305,6 @@ packages: '@vitest/utils': 0.34.4 p-limit: 4.0.0 pathe: 1.1.1 - dev: true /@vitest/snapshot@0.34.4: resolution: {integrity: sha512-GCsh4coc3YUSL/o+BPUo7lHQbzpdttTxL6f4q0jRx2qVGoYz/cyTRDJHbnwks6TILi6560bVWoBpYC10PuTLHw==} @@ -4096,13 +4312,11 @@ packages: magic-string: 0.30.3 pathe: 1.1.1 pretty-format: 29.7.0 - dev: true /@vitest/spy@0.34.4: resolution: {integrity: sha512-PNU+fd7DUPgA3Ya924b1qKuQkonAW6hL7YUjkON3wmBwSTIlhOSpy04SJ0NrRsEbrXgMMj6Morh04BMf8k+w0g==} dependencies: tinyspy: 2.1.1 - dev: true /@vitest/utils@0.34.4: resolution: {integrity: sha512-yR2+5CHhp/K4ySY0Qtd+CAL9f5Yh1aXrKfAT42bq6CtlGPh92jIDDDSg7ydlRow1CP+dys4TrOrbELOyNInHSg==} @@ -4110,26 +4324,21 @@ packages: diff-sequences: 29.6.3 loupe: 2.3.6 pretty-format: 29.7.0 - dev: true /@webassemblyjs/ast@1.11.6: resolution: {integrity: sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==} dependencies: '@webassemblyjs/helper-numbers': 1.11.6 '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - dev: true /@webassemblyjs/floating-point-hex-parser@1.11.6: resolution: {integrity: sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==} - dev: true /@webassemblyjs/helper-api-error@1.11.6: resolution: {integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==} - dev: true /@webassemblyjs/helper-buffer@1.11.6: resolution: {integrity: sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==} - dev: true /@webassemblyjs/helper-numbers@1.11.6: resolution: {integrity: sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==} @@ -4137,11 +4346,9 @@ packages: '@webassemblyjs/floating-point-hex-parser': 1.11.6 '@webassemblyjs/helper-api-error': 1.11.6 '@xtuc/long': 4.2.2 - dev: true /@webassemblyjs/helper-wasm-bytecode@1.11.6: resolution: {integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==} - dev: true /@webassemblyjs/helper-wasm-section@1.11.6: resolution: {integrity: sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==} @@ -4150,23 +4357,19 @@ packages: '@webassemblyjs/helper-buffer': 1.11.6 '@webassemblyjs/helper-wasm-bytecode': 1.11.6 '@webassemblyjs/wasm-gen': 1.11.6 - dev: true /@webassemblyjs/ieee754@1.11.6: resolution: {integrity: sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==} dependencies: '@xtuc/ieee754': 1.2.0 - dev: true /@webassemblyjs/leb128@1.11.6: resolution: {integrity: sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==} dependencies: '@xtuc/long': 4.2.2 - dev: true /@webassemblyjs/utf8@1.11.6: resolution: {integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==} - dev: true /@webassemblyjs/wasm-edit@1.11.6: resolution: {integrity: sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==} @@ -4179,7 +4382,6 @@ packages: '@webassemblyjs/wasm-opt': 1.11.6 '@webassemblyjs/wasm-parser': 1.11.6 '@webassemblyjs/wast-printer': 1.11.6 - dev: true /@webassemblyjs/wasm-gen@1.11.6: resolution: {integrity: sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==} @@ -4189,7 +4391,6 @@ packages: '@webassemblyjs/ieee754': 1.11.6 '@webassemblyjs/leb128': 1.11.6 '@webassemblyjs/utf8': 1.11.6 - dev: true /@webassemblyjs/wasm-opt@1.11.6: resolution: {integrity: sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==} @@ -4198,7 +4399,6 @@ packages: '@webassemblyjs/helper-buffer': 1.11.6 '@webassemblyjs/wasm-gen': 1.11.6 '@webassemblyjs/wasm-parser': 1.11.6 - dev: true /@webassemblyjs/wasm-parser@1.11.6: resolution: {integrity: sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==} @@ -4209,14 +4409,12 @@ packages: '@webassemblyjs/ieee754': 1.11.6 '@webassemblyjs/leb128': 1.11.6 '@webassemblyjs/utf8': 1.11.6 - dev: true /@webassemblyjs/wast-printer@1.11.6: resolution: {integrity: sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==} dependencies: '@webassemblyjs/ast': 1.11.6 '@xtuc/long': 4.2.2 - dev: true /@webpack-cli/configtest@1.2.0(webpack-cli@4.10.0)(webpack@5.88.2): resolution: {integrity: sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg==} @@ -4226,7 +4424,6 @@ packages: dependencies: webpack: 5.88.2(webpack-cli@4.10.0) webpack-cli: 4.10.0(webpack-dev-server@4.15.1)(webpack@5.88.2) - dev: true /@webpack-cli/info@1.5.0(webpack-cli@4.10.0): resolution: {integrity: sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ==} @@ -4235,7 +4432,6 @@ packages: dependencies: envinfo: 7.10.0 webpack-cli: 4.10.0(webpack-dev-server@4.15.1)(webpack@5.88.2) - dev: true /@webpack-cli/serve@1.7.0(webpack-cli@4.10.0)(webpack-dev-server@4.15.1): resolution: {integrity: sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q==} @@ -4248,15 +4444,12 @@ packages: dependencies: webpack-cli: 4.10.0(webpack-dev-server@4.15.1)(webpack@5.88.2) webpack-dev-server: 4.15.1(webpack-cli@4.10.0)(webpack@5.88.2) - dev: true /@xtuc/ieee754@1.2.0: resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} - dev: true /@xtuc/long@4.2.2: resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} - dev: true /JSONStream@1.3.5: resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} @@ -4276,7 +4469,6 @@ packages: dependencies: mime-types: 2.1.35 negotiator: 0.6.3 - dev: true /acorn-globals@6.0.0: resolution: {integrity: sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==} @@ -4291,7 +4483,6 @@ packages: acorn: ^8 dependencies: acorn: 8.10.0 - dev: true /acorn-jsx@5.3.2(acorn@8.10.0): resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} @@ -4308,7 +4499,6 @@ packages: /acorn-walk@8.2.0: resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} engines: {node: '>=0.4.0'} - dev: true /acorn@7.4.1: resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} @@ -4359,7 +4549,6 @@ packages: optional: true dependencies: ajv: 8.12.0 - dev: true /ajv-keywords@3.5.2(ajv@6.12.6): resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} @@ -4367,7 +4556,6 @@ packages: ajv: ^6.9.1 dependencies: ajv: 6.12.6 - dev: true /ajv-keywords@5.1.0(ajv@8.12.0): resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==} @@ -4376,7 +4564,6 @@ packages: dependencies: ajv: 8.12.0 fast-deep-equal: 3.1.3 - dev: true /ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} @@ -4388,12 +4575,12 @@ packages: /ajv@8.12.0: resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} + requiresBuild: true dependencies: fast-deep-equal: 3.1.3 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 uri-js: 4.4.1 - dev: true /ansi-escapes@4.3.2: resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} @@ -4406,7 +4593,6 @@ packages: resolution: {integrity: sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==} engines: {'0': node >= 0.8.0} hasBin: true - dev: true /ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} @@ -4426,7 +4612,6 @@ packages: engines: {node: '>=4'} dependencies: color-convert: 1.9.3 - dev: true /ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} @@ -4437,7 +4622,6 @@ packages: /ansi-styles@5.2.0: resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} engines: {node: '>=10'} - dev: true /any-promise@1.3.0: resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} @@ -4449,7 +4633,6 @@ packages: dependencies: normalize-path: 3.0.0 picomatch: 2.3.1 - dev: true /arg@4.1.3: resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} @@ -4491,11 +4674,9 @@ packages: /array-flatten@1.1.1: resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} - dev: true /array-flatten@2.1.2: resolution: {integrity: sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==} - dev: true /array-ify@1.0.0: resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} @@ -4603,7 +4784,6 @@ packages: /assertion-error@1.1.0: resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} - dev: true /ast-types-flow@0.0.7: resolution: {integrity: sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==} @@ -4625,15 +4805,15 @@ packages: engines: {node: '>= 4.0.0'} dev: true - /autoprefixer@10.4.15(postcss@8.4.29): - resolution: {integrity: sha512-KCuPB8ZCIqFdA4HwKXsvz7j6gvSDNhDP7WnUjBleRkKjPdvCmHFuQ77ocavI8FT6NdvlBnE2UFr2H4Mycn8Vew==} + /autoprefixer@10.4.16(postcss@8.4.29): + resolution: {integrity: sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==} engines: {node: ^10 || ^12 || >=14} hasBin: true peerDependencies: postcss: ^8.1.0 dependencies: - browserslist: 4.21.10 - caniuse-lite: 1.0.30001533 + browserslist: 4.21.11 + caniuse-lite: 1.0.30001539 fraction.js: 4.3.6 normalize-range: 0.1.2 picocolors: 1.0.0 @@ -4645,8 +4825,8 @@ packages: resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} engines: {node: '>= 0.4'} - /axe-core@4.8.1: - resolution: {integrity: sha512-9l850jDDPnKq48nbad8SiEelCv4OrUWrKab/cPj0GScVg6cb6NbCCt/Ulk26QEq5jP9NnGr04Bit1BHyV6r5CQ==} + /axe-core@4.8.2: + resolution: {integrity: sha512-/dlp0fxyM3R8YW7MFzaHWXrf4zzbr0vaYb23VBFCl83R7nWNPg/yaQw2Dc8jzCMmDVLhSdzH8MjrsuIUuvX+6g==} engines: {node: '>=4'} /axios-retry@3.7.0: @@ -4670,18 +4850,18 @@ packages: dependencies: dequal: 2.0.3 - /babel-jest@27.5.1(@babel/core@7.22.17): + /babel-jest@27.5.1(@babel/core@7.23.0): resolution: {integrity: sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} peerDependencies: '@babel/core': ^7.8.0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.23.0 '@jest/transform': 27.5.1 '@jest/types': 27.5.1 - '@types/babel__core': 7.20.1 + '@types/babel__core': 7.20.2 babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 27.5.1(@babel/core@7.22.17) + babel-preset-jest: 27.5.1(@babel/core@7.23.0) chalk: 4.1.2 graceful-fs: 4.2.11 slash: 3.0.0 @@ -4689,14 +4869,14 @@ packages: - supports-color dev: true - /babel-loader@8.3.0(@babel/core@7.22.17)(webpack@5.88.2): + /babel-loader@8.3.0(@babel/core@7.23.0)(webpack@5.88.2): resolution: {integrity: sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q==} engines: {node: '>= 8.9'} peerDependencies: '@babel/core': ^7.0.0 webpack: '>=2' dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.23.0 find-cache-dir: 3.3.2 loader-utils: 2.0.4 make-dir: 3.1.0 @@ -4722,9 +4902,9 @@ packages: engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: '@babel/template': 7.22.15 - '@babel/types': 7.22.17 - '@types/babel__core': 7.20.1 - '@types/babel__traverse': 7.20.1 + '@babel/types': 7.23.0 + '@types/babel__core': 7.20.2 + '@types/babel__traverse': 7.20.2 dev: true /babel-plugin-macros@3.1.0: @@ -4736,46 +4916,46 @@ packages: resolve: 1.22.4 dev: true - /babel-plugin-named-asset-import@0.3.8(@babel/core@7.22.17): + /babel-plugin-named-asset-import@0.3.8(@babel/core@7.23.0): resolution: {integrity: sha512-WXiAc++qo7XcJ1ZnTYGtLxmBCVbddAml3CEXgWaBzNzLNoxtQ8AiGEFDMOhot9XjTCQbvP5E77Fj9Gk924f00Q==} peerDependencies: '@babel/core': ^7.1.0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.23.0 dev: true - /babel-plugin-polyfill-corejs2@0.4.5(@babel/core@7.22.17): + /babel-plugin-polyfill-corejs2@0.4.5(@babel/core@7.23.0): resolution: {integrity: sha512-19hwUH5FKl49JEsvyTcoHakh6BE0wgXLLptIyKZ3PijHc/Ci521wygORCUCCred+E/twuqRyAkE02BAWPmsHOg==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: - '@babel/compat-data': 7.22.9 - '@babel/core': 7.22.17 - '@babel/helper-define-polyfill-provider': 0.4.2(@babel/core@7.22.17) + '@babel/compat-data': 7.22.20 + '@babel/core': 7.23.0 + '@babel/helper-define-polyfill-provider': 0.4.2(@babel/core@7.23.0) semver: 6.3.1 transitivePeerDependencies: - supports-color dev: true - /babel-plugin-polyfill-corejs3@0.8.3(@babel/core@7.22.17): - resolution: {integrity: sha512-z41XaniZL26WLrvjy7soabMXrfPWARN25PZoriDEiLMxAp50AUW3t35BGQUMg5xK3UrpVTtagIDklxYa+MhiNA==} + /babel-plugin-polyfill-corejs3@0.8.4(@babel/core@7.23.0): + resolution: {integrity: sha512-9l//BZZsPR+5XjyJMPtZSK4jv0BsTO1zDac2GC6ygx9WLGlcsnRd1Co0B2zT5fF5Ic6BZy+9m3HNZ3QcOeDKfg==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: - '@babel/core': 7.22.17 - '@babel/helper-define-polyfill-provider': 0.4.2(@babel/core@7.22.17) + '@babel/core': 7.23.0 + '@babel/helper-define-polyfill-provider': 0.4.2(@babel/core@7.23.0) core-js-compat: 3.32.2 transitivePeerDependencies: - supports-color dev: true - /babel-plugin-polyfill-regenerator@0.5.2(@babel/core@7.22.17): + /babel-plugin-polyfill-regenerator@0.5.2(@babel/core@7.23.0): resolution: {integrity: sha512-tAlOptU0Xj34V1Y2PNTL4Y0FOJMDB6bZmoW39FeCQIhigGLkqu3Fj6uiXpxIf6Ij274ENdYx64y6Au+ZKlb1IA==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: - '@babel/core': 7.22.17 - '@babel/helper-define-polyfill-provider': 0.4.2(@babel/core@7.22.17) + '@babel/core': 7.23.0 + '@babel/helper-define-polyfill-provider': 0.4.2(@babel/core@7.23.0) transitivePeerDependencies: - supports-color dev: true @@ -4784,54 +4964,54 @@ packages: resolution: {integrity: sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==} dev: true - /babel-preset-current-node-syntax@1.0.1(@babel/core@7.22.17): + /babel-preset-current-node-syntax@1.0.1(@babel/core@7.23.0): resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.22.17 - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.22.17) - '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.22.17) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.22.17) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.22.17) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.22.17) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.22.17) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.22.17) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.22.17) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.22.17) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.22.17) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.22.17) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.22.17) - dev: true - - /babel-preset-jest@27.5.1(@babel/core@7.22.17): + '@babel/core': 7.23.0 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.0) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.23.0) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.23.0) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.23.0) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.0) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.0) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.0) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.0) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.0) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.0) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.0) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.23.0) + dev: true + + /babel-preset-jest@27.5.1(@babel/core@7.23.0): resolution: {integrity: sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.23.0 babel-plugin-jest-hoist: 27.5.1 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.22.17) + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.23.0) dev: true /babel-preset-react-app@10.0.1: resolution: {integrity: sha512-b0D9IZ1WhhCWkrTXyFuIIgqGzSkRIH5D5AmB0bXbzYAB1OBAwHcUeyWW2LorutLWF5btNo/N7r/cIdmvvKJlYg==} dependencies: - '@babel/core': 7.22.17 - '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.22.17) - '@babel/plugin-proposal-decorators': 7.22.15(@babel/core@7.22.17) - '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.22.17) - '@babel/plugin-proposal-numeric-separator': 7.18.6(@babel/core@7.22.17) - '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.22.17) - '@babel/plugin-proposal-private-methods': 7.18.6(@babel/core@7.22.17) - '@babel/plugin-proposal-private-property-in-object': 7.21.11(@babel/core@7.22.17) - '@babel/plugin-transform-flow-strip-types': 7.22.5(@babel/core@7.22.17) - '@babel/plugin-transform-react-display-name': 7.22.5(@babel/core@7.22.17) - '@babel/plugin-transform-runtime': 7.22.15(@babel/core@7.22.17) - '@babel/preset-env': 7.22.15(@babel/core@7.22.17) - '@babel/preset-react': 7.22.15(@babel/core@7.22.17) - '@babel/preset-typescript': 7.22.15(@babel/core@7.22.17) + '@babel/core': 7.23.0 + '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.23.0) + '@babel/plugin-proposal-decorators': 7.23.0(@babel/core@7.23.0) + '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.23.0) + '@babel/plugin-proposal-numeric-separator': 7.18.6(@babel/core@7.23.0) + '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.23.0) + '@babel/plugin-proposal-private-methods': 7.18.6(@babel/core@7.23.0) + '@babel/plugin-proposal-private-property-in-object': 7.21.11(@babel/core@7.23.0) + '@babel/plugin-transform-flow-strip-types': 7.22.5(@babel/core@7.23.0) + '@babel/plugin-transform-react-display-name': 7.22.5(@babel/core@7.23.0) + '@babel/plugin-transform-runtime': 7.22.15(@babel/core@7.23.0) + '@babel/preset-env': 7.22.20(@babel/core@7.23.0) + '@babel/preset-react': 7.22.15(@babel/core@7.23.0) + '@babel/preset-typescript': 7.23.0(@babel/core@7.23.0) '@babel/runtime': 7.22.15 babel-plugin-macros: 3.1.0 babel-plugin-transform-react-remove-prop-types: 0.4.24 @@ -4844,11 +5024,9 @@ packages: /base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - dev: true /batch@0.6.1: resolution: {integrity: sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==} - dev: true /bech32@1.1.4: resolution: {integrity: sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==} @@ -4866,12 +5044,10 @@ packages: /big.js@5.2.2: resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} - dev: true /binary-extensions@2.2.0: resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} engines: {node: '>=8'} - dev: true /bl@4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} @@ -4909,7 +5085,6 @@ packages: unpipe: 1.0.0 transitivePeerDependencies: - supports-color - dev: true /bonjour-service@1.1.1: resolution: {integrity: sha512-Z/5lQRMOG9k7W+FkeGTNjh7htqn/2LMnfOvBZ8pynNZCM9MwkQkI3zeI4oz09uWdcgmgHugVvBqxGg4VQJ5PCg==} @@ -4918,7 +5093,6 @@ packages: dns-equal: 1.0.0 fast-deep-equal: 3.1.3 multicast-dns: 7.2.5 - dev: true /boolbase@1.0.0: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} @@ -4956,16 +5130,15 @@ packages: resolution: {integrity: sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==} dev: true - /browserslist@4.21.10: - resolution: {integrity: sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==} + /browserslist@4.21.11: + resolution: {integrity: sha512-xn1UXOKUz7DjdGlg9RrUr0GGiWzI97UQJnugHtH0OLDfJB7jMgoIkYvRIEO1l9EeEERVqeqLYOcFBW9ldjypbQ==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - caniuse-lite: 1.0.30001533 - electron-to-chromium: 1.4.516 + caniuse-lite: 1.0.30001539 + electron-to-chromium: 1.4.528 node-releases: 2.0.13 - update-browserslist-db: 1.0.11(browserslist@4.21.10) - dev: true + update-browserslist-db: 1.0.13(browserslist@4.21.11) /bser@2.1.1: resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} @@ -4975,7 +5148,6 @@ packages: /buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - dev: true /buffer@5.7.1: resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} @@ -4984,6 +5156,13 @@ packages: ieee754: 1.2.1 dev: true + /buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + dev: false + /builtin-modules@3.3.0: resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} engines: {node: '>=6'} @@ -5026,17 +5205,14 @@ packages: /bytes@3.0.0: resolution: {integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==} engines: {node: '>= 0.8'} - dev: true /bytes@3.1.2: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} engines: {node: '>= 0.8'} - dev: true /cac@6.7.14: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} - dev: true /cachedir@2.3.0: resolution: {integrity: sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==} @@ -5087,14 +5263,14 @@ packages: /caniuse-api@3.0.0: resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} dependencies: - browserslist: 4.21.10 - caniuse-lite: 1.0.30001533 + browserslist: 4.21.11 + caniuse-lite: 1.0.30001539 lodash.memoize: 4.1.2 lodash.uniq: 4.5.0 dev: true - /caniuse-lite@1.0.30001533: - resolution: {integrity: sha512-9aY/b05NKU4Yl2sbcJhn4A7MsGwR1EPfW/nrqsnqVA0Oq50wpmPaGI+R1Z0UKlUl96oxUkGEOILWtOHck0eCWw==} + /caniuse-lite@1.0.30001539: + resolution: {integrity: sha512-hfS5tE8bnNiNvEOEkm8HElUHroYwlqMMENEzELymy77+tJ6m+gA2krtHl5hxJaj71OlpC2cHZbdSMX1/YEqEkA==} /case-sensitive-paths-webpack-plugin@2.4.0: resolution: {integrity: sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==} @@ -5112,7 +5288,6 @@ packages: loupe: 2.3.6 pathval: 1.1.1 type-detect: 4.0.8 - dev: true /chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} @@ -5121,7 +5296,6 @@ packages: ansi-styles: 3.2.1 escape-string-regexp: 1.0.5 supports-color: 5.5.0 - dev: true /chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} @@ -5146,7 +5320,6 @@ packages: /check-error@1.0.2: resolution: {integrity: sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==} - dev: true /check-types@11.2.3: resolution: {integrity: sha512-+67P1GkJRaxQD6PKK0Et9DhwQB+vGg3PM5+aavopCpZT1lj9jeqfvpgTLAWErNj8qApkkmXlu/Ug74kmhagkXg==} @@ -5165,12 +5338,10 @@ packages: readdirp: 3.6.0 optionalDependencies: fsevents: 2.3.3 - dev: true /chrome-trace-event@1.0.3: resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==} engines: {node: '>=6.0'} - dev: true /ci-info@3.8.0: resolution: {integrity: sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==} @@ -5224,7 +5395,6 @@ packages: is-plain-object: 2.0.4 kind-of: 6.0.3 shallow-clone: 3.0.1 - dev: true /clone@1.0.4: resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} @@ -5253,7 +5423,6 @@ packages: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} dependencies: color-name: 1.1.3 - dev: true /color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} @@ -5263,7 +5432,6 @@ packages: /color-name@1.1.3: resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - dev: true /color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} @@ -5274,7 +5442,6 @@ packages: /colorette@2.0.20: resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} - dev: true /combined-stream@1.0.8: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} @@ -5309,7 +5476,6 @@ packages: /commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - dev: true /commander@4.1.1: resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} @@ -5319,7 +5485,6 @@ packages: /commander@7.2.0: resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} engines: {node: '>= 10'} - dev: true /commander@8.3.0: resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} @@ -5380,7 +5545,6 @@ packages: engines: {node: '>= 0.6'} dependencies: mime-db: 1.52.0 - dev: true /compression@1.7.4: resolution: {integrity: sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==} @@ -5395,7 +5559,6 @@ packages: vary: 1.1.2 transitivePeerDependencies: - supports-color - dev: true /concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} @@ -5417,19 +5580,16 @@ packages: /connect-history-api-fallback@2.0.0: resolution: {integrity: sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==} engines: {node: '>=0.8'} - dev: true /content-disposition@0.5.4: resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} engines: {node: '>= 0.6'} dependencies: safe-buffer: 5.2.1 - dev: true /content-type@1.0.5: resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} engines: {node: '>= 0.6'} - dev: true /conventional-changelog-angular@5.0.13: resolution: {integrity: sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==} @@ -5604,14 +5764,21 @@ packages: resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} dev: true + /convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + /cookie-signature@1.0.6: resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} - dev: true /cookie@0.5.0: resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} engines: {node: '>= 0.6'} - dev: true + + /copy-to-clipboard@3.3.3: + resolution: {integrity: sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==} + dependencies: + toggle-selection: 1.0.6 + dev: false /copy-webpack-plugin@10.2.4(webpack@5.88.2): resolution: {integrity: sha512-xFVltahqlsRcyyJqQbDY6EYTtyQZF9rf+JPjwHObLdPFMEISqkFkr7mFoVOC6BfYS/dNThyoQKvziugm+OnwBg==} @@ -5628,10 +5795,25 @@ packages: webpack: 5.88.2(webpack-cli@4.10.0) dev: true + /copy-webpack-plugin@11.0.0(webpack@5.88.2): + resolution: {integrity: sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==} + engines: {node: '>= 14.15.0'} + peerDependencies: + webpack: ^5.1.0 + dependencies: + fast-glob: 3.3.1 + glob-parent: 6.0.2 + globby: 13.2.2 + normalize-path: 3.0.0 + schema-utils: 4.2.0 + serialize-javascript: 6.0.1 + webpack: 5.88.2(webpack-cli@4.10.0) + dev: true + /core-js-compat@3.32.2: resolution: {integrity: sha512-+GjlguTDINOijtVRUxrQOv3kfu9rl+qPNdX2LTbJ/ZyVTuxK+ksVSAGX1nHstu4hrv1En/uPTtWgq2gI5wt4AQ==} dependencies: - browserslist: 4.21.10 + browserslist: 4.21.11 dev: true /core-js-pure@3.32.2: @@ -5642,11 +5824,9 @@ packages: /core-js@3.32.2: resolution: {integrity: sha512-pxXSw1mYZPDGvTQqEc5vgIb83jGQKFGYWY76z4a7weZXUolw3G+OvpZqSRcfYOoOVUQJYEPsWeQK8pKEnUtWxQ==} requiresBuild: true - dev: true /core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} - dev: true /cosmiconfig-typescript-loader@4.4.0(@types/node@20.4.7)(cosmiconfig@8.3.6)(ts-node@10.9.1)(typescript@5.2.2): resolution: {integrity: sha512-BabizFdC3wBHhbI4kJh0VkQP9GkBfoHPydD0COMce1nJ1kJAB3F2TmJ/I7diULBKtmEWSwEbuN/KDtgnmUUVmw==} @@ -6014,7 +6194,6 @@ packages: optional: true dependencies: ms: 2.0.0 - dev: true /debug@3.2.7: resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} @@ -6063,7 +6242,6 @@ packages: engines: {node: '>=6'} dependencies: type-detect: 4.0.8 - dev: true /deep-equal@2.2.2: resolution: {integrity: sha512-xjVyBf0w5vH0I42jdAZzOKVldmPgSulmiyPRywoyq7HXC9qdgo17kxJE+rdnif5Tz6+pIrpJI8dCpMNLIGkUiA==} @@ -6106,7 +6284,6 @@ packages: engines: {node: '>= 10'} dependencies: execa: 5.1.1 - dev: true /defaults@1.0.4: resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} @@ -6125,7 +6302,6 @@ packages: /define-lazy-prop@2.0.0: resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} engines: {node: '>=8'} - dev: true /define-properties@1.2.1: resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} @@ -6142,12 +6318,10 @@ packages: /depd@1.1.2: resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} engines: {node: '>= 0.6'} - dev: true /depd@2.0.0: resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} engines: {node: '>= 0.8'} - dev: true /dequal@2.0.3: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} @@ -6156,7 +6330,6 @@ packages: /destroy@1.2.0: resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - dev: true /detect-file@1.0.0: resolution: {integrity: sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==} @@ -6185,7 +6358,6 @@ packages: /detect-node@2.1.0: resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} - dev: true /detect-port-alt@1.1.6: resolution: {integrity: sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==} @@ -6210,7 +6382,6 @@ packages: /diff-sequences@29.6.3: resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dev: true /diff@4.0.2: resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} @@ -6229,14 +6400,12 @@ packages: /dns-equal@1.0.0: resolution: {integrity: sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==} - dev: true /dns-packet@5.6.1: resolution: {integrity: sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==} engines: {node: '>=6'} dependencies: '@leichtgewicht/ip-codec': 2.0.4 - dev: true /doctrine@2.1.0: resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} @@ -6331,6 +6500,11 @@ packages: engines: {node: '>=10'} dev: true + /dotenv@16.3.1: + resolution: {integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==} + engines: {node: '>=12'} + dev: false + /dotgitignore@2.1.0: resolution: {integrity: sha512-sCm11ak2oY6DglEPpCB8TixLjWAxd3kJTs6UIcSasNYxXdFPV+YKlye92c8H4kKFqV5qYMIh7d+cYecEg0dIkA==} engines: {node: '>=6'} @@ -6349,7 +6523,6 @@ packages: /ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - dev: true /ejs@3.1.9: resolution: {integrity: sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==} @@ -6359,9 +6532,8 @@ packages: jake: 10.8.7 dev: true - /electron-to-chromium@1.4.516: - resolution: {integrity: sha512-A8xs6nie7jw/9GFRrCPrrE+maux1M3gSnFe1HVstK6ubH+7v5hMDFq3qoNxTRssYyz6jdzk/1wLebT+9tisLKA==} - dev: true + /electron-to-chromium@1.4.528: + resolution: {integrity: sha512-UdREXMXzLkREF4jA8t89FQjA8WHI6ssP38PMY4/4KhXFQbtImnghh4GkCgrtiZwLKUKVD2iTVXvDVQjfomEQuA==} /elliptic@6.5.4: resolution: {integrity: sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==} @@ -6398,12 +6570,10 @@ packages: /emojis-list@3.0.0: resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} engines: {node: '>= 4'} - dev: true /encodeurl@1.0.2: resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} engines: {node: '>= 0.8'} - dev: true /enhanced-resolve@5.15.0: resolution: {integrity: sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==} @@ -6420,7 +6590,6 @@ packages: resolution: {integrity: sha512-ZtUjZO6l5mwTHvc1L9+1q5p/R3wTopcfqMW8r5t8SJSKqeVI/LtajORwRFEKpEFuekjD0VBjwu1HMxL4UalIRw==} engines: {node: '>=4'} hasBin: true - dev: true /error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} @@ -6496,8 +6665,8 @@ packages: stop-iteration-iterator: 1.0.0 dev: false - /es-iterator-helpers@1.0.14: - resolution: {integrity: sha512-JgtVnwiuoRuzLvqelrvN3Xu7H9bu2ap/kQ2CrM62iidP8SKuD99rWU3CJy++s7IVL2qb/AjXPGR/E7i9ngd/Cw==} + /es-iterator-helpers@1.0.15: + resolution: {integrity: sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g==} dependencies: asynciterator.prototype: 1.0.0 call-bind: 1.0.2 @@ -6511,12 +6680,11 @@ packages: has-proto: 1.0.1 has-symbols: 1.0.3 internal-slot: 1.0.5 - iterator.prototype: 1.1.1 + iterator.prototype: 1.1.2 safe-array-concat: 1.0.1 /es-module-lexer@1.3.1: resolution: {integrity: sha512-JUFAyicQV9mXc3YRxPnDlrfBKpqt6hUYzz9/boprUJHs4e4KVr3XwOF70doO6gwXUor6EWZJAyWAfKki84t20Q==} - dev: true /es-set-tostringtag@2.0.1: resolution: {integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==} @@ -6611,21 +6779,17 @@ packages: '@esbuild/win32-arm64': 0.18.20 '@esbuild/win32-ia32': 0.18.20 '@esbuild/win32-x64': 0.18.20 - dev: true /escalade@3.1.1: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} engines: {node: '>=6'} - dev: true /escape-html@1.0.3: resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} - dev: true /escape-string-regexp@1.0.5: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} engines: {node: '>=0.8.0'} - dev: true /escape-string-regexp@2.0.0: resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} @@ -6671,12 +6835,12 @@ packages: optional: true dependencies: '@next/eslint-plugin-next': 13.5.2 - '@rushstack/eslint-patch': 1.3.3 + '@rushstack/eslint-patch': 1.4.0 '@typescript-eslint/parser': 6.7.0(eslint@8.49.0)(typescript@5.2.2) eslint: 8.49.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.0(@typescript-eslint/parser@6.7.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.28.1)(eslint@8.49.0) - eslint-plugin-import: 2.28.1(@typescript-eslint/parser@6.7.0)(eslint-import-resolver-typescript@3.6.0)(eslint@8.49.0) + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.7.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.28.1)(eslint@8.49.0) + eslint-plugin-import: 2.28.1(@typescript-eslint/parser@6.7.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.49.0) eslint-plugin-jsx-a11y: 6.7.1(eslint@8.49.0) eslint-plugin-react: 7.33.2(eslint@8.49.0) eslint-plugin-react-hooks: 4.6.0(eslint@8.49.0) @@ -6705,9 +6869,9 @@ packages: typescript: optional: true dependencies: - '@babel/core': 7.22.17 - '@babel/eslint-parser': 7.22.15(@babel/core@7.22.17)(eslint@8.49.0) - '@rushstack/eslint-patch': 1.3.3 + '@babel/core': 7.23.0 + '@babel/eslint-parser': 7.22.15(@babel/core@7.23.0)(eslint@8.49.0) + '@rushstack/eslint-patch': 1.4.0 '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.49.0)(typescript@5.2.2) '@typescript-eslint/parser': 5.62.0(eslint@8.49.0)(typescript@5.2.2) babel-preset-react-app: 10.0.1 @@ -6749,8 +6913,8 @@ packages: transitivePeerDependencies: - supports-color - /eslint-import-resolver-typescript@3.6.0(@typescript-eslint/parser@6.7.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.28.1)(eslint@8.49.0): - resolution: {integrity: sha512-QTHR9ddNnn35RTxlaEnx2gCxqFlF2SEN0SE2d17SqwyM7YOSI2GHWRYp5BiRkObTUNYPupC/3Fq2a0PpT+EKpg==} + /eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.7.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.28.1)(eslint@8.49.0): + resolution: {integrity: sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: eslint: '*' @@ -6759,10 +6923,10 @@ packages: debug: 4.3.4 enhanced-resolve: 5.15.0 eslint: 8.49.0 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.7.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.0)(eslint@8.49.0) - eslint-plugin-import: 2.28.1(@typescript-eslint/parser@6.7.0)(eslint-import-resolver-typescript@3.6.0)(eslint@8.49.0) + eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.7.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.49.0) + eslint-plugin-import: 2.28.1(@typescript-eslint/parser@6.7.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.49.0) fast-glob: 3.3.1 - get-tsconfig: 4.7.1 + get-tsconfig: 4.7.2 is-core-module: 2.13.0 is-glob: 4.0.3 transitivePeerDependencies: @@ -6800,7 +6964,7 @@ packages: - supports-color dev: true - /eslint-module-utils@2.8.0(@typescript-eslint/parser@6.7.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.0)(eslint@8.49.0): + /eslint-module-utils@2.8.0(@typescript-eslint/parser@6.7.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.49.0): resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} engines: {node: '>=4'} peerDependencies: @@ -6825,7 +6989,7 @@ packages: debug: 3.2.7 eslint: 8.49.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.0(@typescript-eslint/parser@6.7.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.28.1)(eslint@8.49.0) + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.7.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.28.1)(eslint@8.49.0) transitivePeerDependencies: - supports-color @@ -6848,8 +7012,8 @@ packages: '@babel/plugin-transform-react-jsx': ^7.14.9 eslint: ^8.1.0 dependencies: - '@babel/plugin-syntax-flow': 7.22.5(@babel/core@7.22.17) - '@babel/plugin-transform-react-jsx': 7.22.15(@babel/core@7.22.17) + '@babel/plugin-syntax-flow': 7.22.5(@babel/core@7.23.0) + '@babel/plugin-transform-react-jsx': 7.22.15(@babel/core@7.23.0) eslint: 8.49.0 lodash: 4.17.21 string-natural-compare: 3.0.1 @@ -6890,7 +7054,7 @@ packages: - supports-color dev: true - /eslint-plugin-import@2.28.1(@typescript-eslint/parser@6.7.0)(eslint-import-resolver-typescript@3.6.0)(eslint@8.49.0): + /eslint-plugin-import@2.28.1(@typescript-eslint/parser@6.7.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.49.0): resolution: {integrity: sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A==} engines: {node: '>=4'} peerDependencies: @@ -6909,7 +7073,7 @@ packages: doctrine: 2.1.0 eslint: 8.49.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.7.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.0)(eslint@8.49.0) + eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.7.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.49.0) has: 1.0.3 is-core-module: 2.13.0 is-glob: 4.0.3 @@ -6957,7 +7121,7 @@ packages: array-includes: 3.1.7 array.prototype.flatmap: 1.3.2 ast-types-flow: 0.0.7 - axe-core: 4.8.1 + axe-core: 4.8.2 axobject-query: 3.2.1 damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 @@ -6993,7 +7157,7 @@ packages: array.prototype.flatmap: 1.3.2 array.prototype.tosorted: 1.1.2 doctrine: 2.1.0 - es-iterator-helpers: 1.0.14 + es-iterator-helpers: 1.0.15 eslint: 8.49.0 estraverse: 5.3.0 jsx-ast-utils: 3.3.5 @@ -7005,7 +7169,7 @@ packages: prop-types: 15.8.1 resolve: 2.0.0-next.4 semver: 6.3.1 - string.prototype.matchall: 4.0.9 + string.prototype.matchall: 4.0.10 /eslint-plugin-simple-import-sort@10.0.0(eslint@8.49.0): resolution: {integrity: sha512-AeTvO9UCMSNzIHRkg8S6c3RPy5YEwKWSQPx3DYghLedo2ZQxowPFLGDN1AZ2evfg6r6mjBSZSLxLFsWSu3acsw==} @@ -7063,7 +7227,6 @@ packages: dependencies: esrecurse: 4.3.0 estraverse: 4.3.0 - dev: true /eslint-scope@7.2.2: resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} @@ -7088,7 +7251,7 @@ packages: eslint: ^7.0.0 || ^8.0.0 webpack: ^5.0.0 dependencies: - '@types/eslint': 8.44.2 + '@types/eslint': 8.44.3 eslint: 8.49.0 jest-worker: 28.1.3 micromatch: 4.0.5 @@ -7177,7 +7340,6 @@ packages: /estraverse@4.3.0: resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} engines: {node: '>=4.0'} - dev: true /estraverse@5.3.0: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} @@ -7194,7 +7356,6 @@ packages: /etag@1.8.1: resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} engines: {node: '>= 0.6'} - dev: true /ethers@5.7.2: resolution: {integrity: sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==} @@ -7235,12 +7396,10 @@ packages: /eventemitter3@4.0.7: resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} - dev: true /events@3.3.0: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} engines: {node: '>=0.8.x'} - dev: true /execa@5.1.1: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} @@ -7255,7 +7414,6 @@ packages: onetime: 5.1.2 signal-exit: 3.0.7 strip-final-newline: 2.0.0 - dev: true /exit@0.1.2: resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} @@ -7316,7 +7474,6 @@ packages: vary: 1.1.2 transitivePeerDependencies: - supports-color - dev: true /external-editor@3.1.0: resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} @@ -7349,7 +7506,6 @@ packages: /fastest-levenshtein@1.0.16: resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} engines: {node: '>= 4.9.1'} - dev: true /fastq@1.15.0: resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} @@ -7361,7 +7517,6 @@ packages: engines: {node: '>=0.8.0'} dependencies: websocket-driver: 0.7.4 - dev: true /fb-watchman@2.0.2: resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} @@ -7369,6 +7524,29 @@ packages: bser: 2.1.1 dev: true + /fetch-mock@9.11.0: + resolution: {integrity: sha512-PG1XUv+x7iag5p/iNHD4/jdpxL9FtVSqRMUQhPab4hVDt80T1MH5ehzVrL2IdXO9Q2iBggArFvPqjUbHFuI58Q==} + engines: {node: '>=4.0.0'} + peerDependencies: + node-fetch: '*' + peerDependenciesMeta: + node-fetch: + optional: true + dependencies: + '@babel/core': 7.23.0 + '@babel/runtime': 7.22.15 + core-js: 3.32.2 + debug: 4.3.4 + glob-to-regexp: 0.4.1 + is-subset: 0.1.1 + lodash.isequal: 4.5.0 + path-to-regexp: 2.4.0 + querystring: 0.2.1 + whatwg-url: 6.5.0 + transitivePeerDependencies: + - supports-color + dev: false + /figures@3.2.0: resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} engines: {node: '>=8'} @@ -7391,7 +7569,6 @@ packages: loader-utils: 2.0.4 schema-utils: 3.3.0 webpack: 5.88.2(webpack-cli@4.10.0) - dev: true /filelist@1.0.4: resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} @@ -7437,7 +7614,6 @@ packages: unpipe: 1.0.0 transitivePeerDependencies: - supports-color - dev: true /find-cache-dir@3.3.2: resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==} @@ -7486,7 +7662,6 @@ packages: dependencies: locate-path: 5.0.0 path-exists: 4.0.0 - dev: true /find-up@5.0.0: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} @@ -7584,7 +7759,6 @@ packages: /forwarded@0.2.0: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} engines: {node: '>= 0.6'} - dev: true /fraction.js@4.3.6: resolution: {integrity: sha512-n2aZ9tNfYDwaHhvFTkhFErqOMIb8uyzSQ+vGJBjZyanAKZVbGUQ1sngfk9FdkBw7G26O7AgNjLcecLffD1c7eg==} @@ -7593,7 +7767,6 @@ packages: /fresh@0.5.2: resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} engines: {node: '>= 0.6'} - dev: true /fs-extra@10.1.0: resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} @@ -7634,7 +7807,6 @@ packages: /fs-monkey@1.0.4: resolution: {integrity: sha512-INM/fWAxMICjttnD0DX1rBvinKskj5G1w+oy/pnm9u/tSlnBrzFonJMcalKJ30P8RRsPzKcCG7Q8l0jx5Fh9YQ==} - dev: true /fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} @@ -7644,7 +7816,6 @@ packages: engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] requiresBuild: true - dev: true optional: true /function-bind@1.1.1: @@ -7665,7 +7836,6 @@ packages: /gensync@1.0.0-beta.2: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} - dev: true /get-caller-file@2.0.5: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} @@ -7674,7 +7844,6 @@ packages: /get-func-name@2.0.0: resolution: {integrity: sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==} - dev: true /get-intrinsic@1.2.1: resolution: {integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==} @@ -7712,7 +7881,6 @@ packages: /get-stream@6.0.1: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} - dev: true /get-symbol-description@1.0.0: resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} @@ -7721,8 +7889,8 @@ packages: call-bind: 1.0.2 get-intrinsic: 1.2.1 - /get-tsconfig@4.7.1: - resolution: {integrity: sha512-sLtd6Bcwbi9IrAow/raCOTE9pmhvo5ksQo5v2lApUGJMzja64MUYhBp0G6X1S+f7IrBPn1HP+XkS2w2meoGcjg==} + /get-tsconfig@4.7.2: + resolution: {integrity: sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==} dependencies: resolve-pkg-maps: 1.0.0 @@ -7873,7 +8041,6 @@ packages: /globals@11.12.0: resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} engines: {node: '>=4'} - dev: true /globals@13.21.0: resolution: {integrity: sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==} @@ -7952,7 +8119,6 @@ packages: /handle-thing@2.0.1: resolution: {integrity: sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==} - dev: true /handlebars@4.7.8: resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} @@ -7982,7 +8148,6 @@ packages: /has-flag@3.0.0: resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} engines: {node: '>=4'} - dev: true /has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} @@ -8061,7 +8226,6 @@ packages: obuf: 1.1.2 readable-stream: 2.3.8 wbuf: 1.7.3 - dev: true /html-encoding-sniffer@2.0.1: resolution: {integrity: sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==} @@ -8072,7 +8236,6 @@ packages: /html-entities@2.4.0: resolution: {integrity: sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ==} - dev: true /html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} @@ -8089,7 +8252,7 @@ packages: he: 1.2.0 param-case: 3.0.4 relateurl: 0.2.7 - terser: 5.19.4 + terser: 5.20.0 dev: true /html-webpack-plugin@5.5.3(webpack@5.88.2): @@ -8117,7 +8280,6 @@ packages: /http-deceiver@1.2.7: resolution: {integrity: sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==} - dev: true /http-errors@1.6.3: resolution: {integrity: sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==} @@ -8127,7 +8289,6 @@ packages: inherits: 2.0.3 setprototypeof: 1.1.0 statuses: 1.5.0 - dev: true /http-errors@2.0.0: resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} @@ -8138,11 +8299,9 @@ packages: setprototypeof: 1.2.0 statuses: 2.0.1 toidentifier: 1.0.1 - dev: true /http-parser-js@0.5.8: resolution: {integrity: sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==} - dev: true /http-proxy-agent@4.0.1: resolution: {integrity: sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==} @@ -8155,7 +8314,7 @@ packages: - supports-color dev: true - /http-proxy-middleware@2.0.6(@types/express@4.17.17): + /http-proxy-middleware@2.0.6(@types/express@4.17.18): resolution: {integrity: sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==} engines: {node: '>=12.0.0'} peerDependencies: @@ -8164,15 +8323,14 @@ packages: '@types/express': optional: true dependencies: - '@types/express': 4.17.17 - '@types/http-proxy': 1.17.11 + '@types/express': 4.17.18 + '@types/http-proxy': 1.17.12 http-proxy: 1.18.1 is-glob: 4.0.3 is-plain-obj: 3.0.0 micromatch: 4.0.5 transitivePeerDependencies: - debug - dev: true /http-proxy@1.18.1: resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} @@ -8183,7 +8341,6 @@ packages: requires-port: 1.0.0 transitivePeerDependencies: - debug - dev: true /https-proxy-agent@5.0.1: resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} @@ -8198,14 +8355,12 @@ packages: /human-signals@2.1.0: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} engines: {node: '>=10.17.0'} - dev: true /iconv-lite@0.4.24: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} dependencies: safer-buffer: 2.1.2 - dev: true /iconv-lite@0.6.3: resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} @@ -8236,7 +8391,6 @@ packages: /ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - dev: true /ignore@5.2.4: resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} @@ -8260,7 +8414,6 @@ packages: dependencies: pkg-dir: 4.2.0 resolve-cwd: 3.0.0 - dev: true /imurmurhash@0.1.4: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} @@ -8279,7 +8432,6 @@ packages: /inherits@2.0.3: resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==} - dev: true /inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} @@ -8320,17 +8472,14 @@ packages: /interpret@2.2.0: resolution: {integrity: sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==} engines: {node: '>= 0.10'} - dev: true /ipaddr.js@1.9.1: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} engines: {node: '>= 0.10'} - dev: true /ipaddr.js@2.1.0: resolution: {integrity: sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==} engines: {node: '>= 10'} - dev: true /is-arguments@1.1.1: resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} @@ -8367,7 +8516,6 @@ packages: engines: {node: '>=8'} dependencies: binary-extensions: 2.2.0 - dev: true /is-boolean-object@1.1.2: resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} @@ -8395,7 +8543,6 @@ packages: resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} engines: {node: '>=8'} hasBin: true - dev: true /is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} @@ -8476,7 +8623,6 @@ packages: /is-plain-obj@3.0.0: resolution: {integrity: sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==} engines: {node: '>=10'} - dev: true /is-plain-obj@4.1.0: resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} @@ -8488,7 +8634,6 @@ packages: engines: {node: '>=0.10.0'} dependencies: isobject: 3.0.1 - dev: true /is-potential-custom-element-name@1.0.1: resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} @@ -8527,7 +8672,6 @@ packages: /is-stream@2.0.1: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} - dev: true /is-string@1.0.7: resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} @@ -8535,6 +8679,10 @@ packages: dependencies: has-tostringtag: 1.0.0 + /is-subset@0.1.1: + resolution: {integrity: sha512-6Ybun0IkarhmEqxXCNw/C0bna6Zb/TkfUX9UbwJtK6ObwAVCxmAP308WWTHviM/zAqXk05cdhYsUsZeGQh99iw==} + dev: false + /is-symbol@1.0.4: resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} engines: {node: '>= 0.4'} @@ -8591,11 +8739,9 @@ packages: engines: {node: '>=8'} dependencies: is-docker: 2.2.1 - dev: true /isarray@1.0.0: resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} - dev: true /isarray@2.0.5: resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} @@ -8606,7 +8752,6 @@ packages: /isobject@3.0.1: resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} engines: {node: '>=0.10.0'} - dev: true /istanbul-lib-coverage@3.2.0: resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==} @@ -8617,8 +8762,8 @@ packages: resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} engines: {node: '>=8'} dependencies: - '@babel/core': 7.22.17 - '@babel/parser': 7.22.16 + '@babel/core': 7.23.0 + '@babel/parser': 7.23.0 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.0 semver: 6.3.1 @@ -8654,13 +8799,14 @@ packages: istanbul-lib-report: 3.0.1 dev: true - /iterator.prototype@1.1.1: - resolution: {integrity: sha512-9E+nePc8C9cnQldmNl6bgpTY6zI4OPRZd97fhJ/iVZ1GifIUDVV5F6x1nEDqpe8KaMEZGT4xgrwKQDxXnjOIZQ==} + /iterator.prototype@1.1.2: + resolution: {integrity: sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==} 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 /jake@10.8.7: resolution: {integrity: sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==} @@ -8748,10 +8894,10 @@ packages: ts-node: optional: true dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.23.0 '@jest/test-sequencer': 27.5.1 '@jest/types': 27.5.1 - babel-jest: 27.5.1(@babel/core@7.22.17) + babel-jest: 27.5.1(@babel/core@7.23.0) chalk: 4.1.2 ci-info: 3.8.0 deepmerge: 4.3.1 @@ -8848,7 +8994,7 @@ packages: engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: '@jest/types': 27.5.1 - '@types/graceful-fs': 4.1.6 + '@types/graceful-fs': 4.1.7 '@types/node': 20.6.3 anymatch: 3.1.3 fb-watchman: 2.0.2 @@ -9067,16 +9213,16 @@ packages: resolution: {integrity: sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@babel/core': 7.22.17 - '@babel/generator': 7.22.15 - '@babel/plugin-syntax-typescript': 7.22.5(@babel/core@7.22.17) - '@babel/traverse': 7.22.17 - '@babel/types': 7.22.17 + '@babel/core': 7.23.0 + '@babel/generator': 7.23.0 + '@babel/plugin-syntax-typescript': 7.22.5(@babel/core@7.23.0) + '@babel/traverse': 7.23.0 + '@babel/types': 7.23.0 '@jest/transform': 27.5.1 '@jest/types': 27.5.1 - '@types/babel__traverse': 7.20.1 + '@types/babel__traverse': 7.20.2 '@types/prettier': 2.7.3 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.22.17) + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.23.0) chalk: 4.1.2 expect: 27.5.1 graceful-fs: 4.2.11 @@ -9188,7 +9334,6 @@ packages: '@types/node': 20.6.3 merge-stream: 2.0.0 supports-color: 8.1.1 - dev: true /jest-worker@28.1.3: resolution: {integrity: sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==} @@ -9284,7 +9429,7 @@ packages: whatwg-encoding: 1.0.5 whatwg-mimetype: 2.3.0 whatwg-url: 8.7.0 - ws: 7.5.9 + ws: 7.4.6 xml-name-validator: 3.0.0 transitivePeerDependencies: - bufferutil @@ -9301,7 +9446,6 @@ packages: resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} engines: {node: '>=4'} hasBin: true - dev: true /json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} @@ -9312,14 +9456,13 @@ packages: /json-parse-even-better-errors@2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - dev: true /json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} /json-schema-traverse@1.0.0: resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} - dev: true + requiresBuild: true /json-schema@0.4.0: resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} @@ -9342,11 +9485,9 @@ packages: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} engines: {node: '>=6'} hasBin: true - dev: true /jsonc-parser@3.2.0: resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} - dev: true /jsonfile@4.0.0: resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} @@ -9397,7 +9538,6 @@ packages: /kind-of@6.0.3: resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} engines: {node: '>=0.10.0'} - dev: true /kleur@3.0.3: resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} @@ -9427,7 +9567,6 @@ packages: dependencies: picocolors: 1.0.0 shell-quote: 1.8.1 - dev: true /leven@3.1.0: resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} @@ -9471,7 +9610,6 @@ packages: /loader-runner@4.3.0: resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} engines: {node: '>=6.11.5'} - dev: true /loader-utils@2.0.4: resolution: {integrity: sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==} @@ -9480,7 +9618,6 @@ packages: big.js: 5.2.2 emojis-list: 3.0.0 json5: 2.2.3 - dev: true /loader-utils@3.2.1: resolution: {integrity: sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==} @@ -9490,7 +9627,6 @@ packages: /local-pkg@0.4.3: resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==} engines: {node: '>=14'} - dev: true /locate-path@2.0.0: resolution: {integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==} @@ -9513,7 +9649,6 @@ packages: engines: {node: '>=8'} dependencies: p-locate: 4.1.0 - dev: true /locate-path@6.0.0: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} @@ -9533,6 +9668,10 @@ packages: resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} dev: true + /lodash.isequal@4.5.0: + resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} + dev: false + /lodash.ismatch@4.4.0: resolution: {integrity: sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==} dev: true @@ -9560,12 +9699,16 @@ packages: dev: true optional: true + /lodash.pickby@4.6.0: + resolution: {integrity: sha512-AZV+GsS/6ckvPOVQPXSiFFacKvKB4kOQu6ynt9wz0F3LO4R9Ij4K1ddYsIytDpSgLz88JHd9P+oaLeej5/Sl7Q==} + dev: false + /lodash.sortby@4.7.0: resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} - dev: true /lodash.uniq@4.5.0: resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} + requiresBuild: true dev: true /lodash@4.17.21: @@ -9595,7 +9738,6 @@ packages: resolution: {integrity: sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==} dependencies: get-func-name: 2.0.0 - dev: true /lower-case@2.0.2: resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} @@ -9607,7 +9749,6 @@ packages: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} dependencies: yallist: 3.1.1 - dev: true /lru-cache@6.0.0: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} @@ -9630,7 +9771,6 @@ packages: engines: {node: '>=12'} dependencies: '@jridgewell/sourcemap-codec': 1.4.15 - dev: true /make-dir@3.1.0: resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} @@ -9683,14 +9823,12 @@ packages: /media-typer@0.3.0: resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} engines: {node: '>= 0.6'} - dev: true /memfs@3.5.3: resolution: {integrity: sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==} engines: {node: '>= 4.0.0'} dependencies: fs-monkey: 1.0.4 - dev: true /memorystream@0.3.1: resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==} @@ -9716,11 +9854,9 @@ packages: /merge-descriptors@1.0.1: resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} - dev: true /merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} - dev: true /merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} @@ -9733,7 +9869,6 @@ packages: /methods@1.1.2: resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} engines: {node: '>= 0.6'} - dev: true /micromatch@4.0.5: resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} @@ -9756,12 +9891,10 @@ packages: resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} engines: {node: '>=4'} hasBin: true - dev: true /mimic-fn@2.1.0: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} - dev: true /min-indent@1.0.1: resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} @@ -9839,7 +9972,6 @@ packages: pathe: 1.1.1 pkg-types: 1.0.3 ufo: 1.3.0 - dev: true /modify-values@1.0.1: resolution: {integrity: sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==} @@ -9848,7 +9980,6 @@ packages: /ms@2.0.0: resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} - dev: true /ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} @@ -9862,7 +9993,6 @@ packages: dependencies: dns-packet: 5.6.1 thunky: 1.1.0 - dev: true /mute-stream@0.0.8: resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} @@ -9880,6 +10010,12 @@ packages: resolution: {integrity: sha512-wynEP02LmIbLpcYw8uBKpcfF6dmg2vcpKqxeH5UcoKEYdExslsdUA4ugFauuaeYdTB76ez6gJW8XAZ6CgkXYxA==} dev: true + /nanoid@3.3.4: + resolution: {integrity: sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + dev: false + /nanoid@3.3.6: resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -9895,11 +10031,9 @@ packages: /negotiator@0.6.3: resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} engines: {node: '>= 0.6'} - dev: true /neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - dev: true /next@13.5.2(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-vog4UhUaMYAzeqfiAAmgB/QWLW7p01/sg+2vn6bqc/CxHFYizMzLv6gjxKzl31EVFkfl/F+GbxlKizlkTE9RdA==} @@ -9919,7 +10053,7 @@ packages: '@next/env': 13.5.2 '@swc/helpers': 0.5.2 busboy: 1.6.0 - caniuse-lite: 1.0.30001533 + caniuse-lite: 1.0.30001539 postcss: 8.4.14 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -9955,7 +10089,6 @@ packages: /node-forge@1.3.1: resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} engines: {node: '>= 6.13.0'} - dev: true /node-int64@0.4.0: resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} @@ -9963,7 +10096,6 @@ packages: /node-releases@2.0.13: resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==} - dev: true /normalize-package-data@2.5.0: resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} @@ -9987,7 +10119,6 @@ packages: /normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} - dev: true /normalize-range@0.1.2: resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} @@ -10020,7 +10151,6 @@ packages: engines: {node: '>=8'} dependencies: path-key: 3.1.1 - dev: true /nth-check@2.1.1: resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} @@ -10116,19 +10246,16 @@ packages: /obuf@1.1.2: resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} - dev: true /on-finished@2.4.1: resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} engines: {node: '>= 0.8'} dependencies: ee-first: 1.1.1 - dev: true /on-headers@1.0.2: resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} engines: {node: '>= 0.8'} - dev: true /once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} @@ -10140,7 +10267,6 @@ packages: engines: {node: '>=6'} dependencies: mimic-fn: 2.1.0 - dev: true /open@8.4.2: resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} @@ -10149,7 +10275,6 @@ packages: define-lazy-prop: 2.0.0 is-docker: 2.2.1 is-wsl: 2.2.0 - dev: true /optionator@0.8.3: resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} @@ -10206,7 +10331,6 @@ packages: engines: {node: '>=6'} dependencies: p-try: 2.2.0 - dev: true /p-limit@3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} @@ -10219,7 +10343,6 @@ packages: engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: yocto-queue: 1.0.0 - dev: true /p-locate@2.0.0: resolution: {integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==} @@ -10240,7 +10363,6 @@ packages: engines: {node: '>=8'} dependencies: p-limit: 2.3.0 - dev: true /p-locate@5.0.0: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} @@ -10254,7 +10376,6 @@ packages: dependencies: '@types/retry': 0.12.0 retry: 0.13.1 - dev: true /p-try@1.0.0: resolution: {integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==} @@ -10264,7 +10385,6 @@ packages: /p-try@2.2.0: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} - dev: true /param-case@3.0.4: resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} @@ -10309,7 +10429,6 @@ packages: /parseurl@1.3.3: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} engines: {node: '>= 0.8'} - dev: true /pascal-case@3.1.2: resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} @@ -10345,7 +10464,10 @@ packages: /path-to-regexp@0.1.7: resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} - dev: true + + /path-to-regexp@2.4.0: + resolution: {integrity: sha512-G6zHoVqC6GGTQkZwF4lkuEyMbVOjoBKAEybQUypI1WTkqinCOrq2x6U2+phkJ1XsEMTy4LjtwPI7HW+NVrRR2w==} + dev: false /path-type@3.0.0: resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} @@ -10360,11 +10482,9 @@ packages: /pathe@1.1.1: resolution: {integrity: sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==} - dev: true /pathval@1.1.1: resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} - dev: true /performance-now@2.1.0: resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} @@ -10419,7 +10539,6 @@ packages: engines: {node: '>=8'} dependencies: find-up: 4.1.0 - dev: true /pkg-types@1.0.3: resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==} @@ -10427,7 +10546,6 @@ packages: jsonc-parser: 3.2.0 mlly: 1.4.2 pathe: 1.1.1 - dev: true /pkg-up@3.1.0: resolution: {integrity: sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==} @@ -10446,14 +10564,14 @@ packages: postcss-selector-parser: 6.0.13 dev: true - /postcss-browser-comments@4.0.0(browserslist@4.21.10)(postcss@8.4.29): + /postcss-browser-comments@4.0.0(browserslist@4.21.11)(postcss@8.4.29): resolution: {integrity: sha512-X9X9/WN3KIvY9+hNERUqX9gncsgBA25XaeR+jshHz2j8+sYyHktHw1JdKuMjeLpGktXidqDhA7b/qm1mrBDmgg==} engines: {node: '>=8'} peerDependencies: browserslist: '>=4' postcss: '>=8' dependencies: - browserslist: 4.21.10 + browserslist: 4.21.11 postcss: 8.4.29 dev: true @@ -10513,7 +10631,7 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.21.10 + browserslist: 4.21.11 caniuse-api: 3.0.0 colord: 2.9.3 postcss: 8.4.29 @@ -10526,7 +10644,7 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.21.10 + browserslist: 4.21.11 postcss: 8.4.29 postcss-value-parser: 4.2.0 dev: true @@ -10791,7 +10909,7 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.21.10 + browserslist: 4.21.11 caniuse-api: 3.0.0 cssnano-utils: 3.1.0(postcss@8.4.29) postcss: 8.4.29 @@ -10826,7 +10944,7 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.21.10 + browserslist: 4.21.11 cssnano-utils: 3.1.0(postcss@8.4.29) postcss: 8.4.29 postcss-value-parser: 4.2.0 @@ -10969,7 +11087,7 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.21.10 + browserslist: 4.21.11 postcss: 8.4.29 postcss-value-parser: 4.2.0 dev: true @@ -10995,7 +11113,7 @@ packages: postcss-value-parser: 4.2.0 dev: true - /postcss-normalize@10.0.1(browserslist@4.21.10)(postcss@8.4.29): + /postcss-normalize@10.0.1(browserslist@4.21.11)(postcss@8.4.29): resolution: {integrity: sha512-+5w18/rDev5mqERcG3W5GZNMJa1eoYYNGo8gB7tEwaos0ajk3ZXAI4mHGcNT47NE+ZnZD1pEpUOFLvltIwmeJA==} engines: {node: '>= 12'} peerDependencies: @@ -11003,9 +11121,9 @@ packages: postcss: '>= 8' dependencies: '@csstools/normalize.css': 12.0.0 - browserslist: 4.21.10 + browserslist: 4.21.11 postcss: 8.4.29 - postcss-browser-comments: 4.0.0(browserslist@4.21.10)(postcss@8.4.29) + postcss-browser-comments: 4.0.0(browserslist@4.21.11)(postcss@8.4.29) sanitize.css: 13.0.0 dev: true @@ -11077,8 +11195,8 @@ packages: '@csstools/postcss-text-decoration-shorthand': 1.0.0(postcss@8.4.29) '@csstools/postcss-trigonometric-functions': 1.0.2(postcss@8.4.29) '@csstools/postcss-unset-value': 1.0.2(postcss@8.4.29) - autoprefixer: 10.4.15(postcss@8.4.29) - browserslist: 4.21.10 + autoprefixer: 10.4.16(postcss@8.4.29) + browserslist: 4.21.11 css-blank-pseudo: 3.0.3(postcss@8.4.29) css-has-pseudo: 3.0.4(postcss@8.4.29) css-prefers-color-scheme: 6.0.3(postcss@8.4.29) @@ -11131,7 +11249,7 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.21.10 + browserslist: 4.21.11 caniuse-api: 3.0.0 postcss: 8.4.29 dev: true @@ -11221,7 +11339,6 @@ packages: nanoid: 3.3.6 picocolors: 1.0.0 source-map-js: 1.0.2 - dev: true /prelude-ls@1.1.2: resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} @@ -11301,11 +11418,9 @@ packages: '@jest/schemas': 29.6.3 ansi-styles: 5.2.0 react-is: 18.2.0 - dev: true /process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} - dev: true /promise@8.3.0: resolution: {integrity: sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==} @@ -11338,7 +11453,6 @@ packages: dependencies: forwarded: 0.2.0 ipaddr.js: 1.9.1 - dev: true /proxy-from-env@1.1.0: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} @@ -11361,7 +11475,6 @@ packages: engines: {node: '>=0.6'} dependencies: side-channel: 1.0.4 - dev: true /qs@6.11.2: resolution: {integrity: sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==} @@ -11370,6 +11483,12 @@ packages: side-channel: 1.0.4 dev: false + /querystring@0.2.1: + resolution: {integrity: sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg==} + engines: {node: '>=0.4.x'} + deprecated: The querystring API is considered Legacy. new code should use the URLSearchParams API instead. + dev: false + /querystringify@2.2.0: resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} dev: true @@ -11392,12 +11511,10 @@ packages: resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} dependencies: safe-buffer: 5.2.1 - dev: true /range-parser@1.2.1: resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} engines: {node: '>= 0.6'} - dev: true /raw-body@2.5.1: resolution: {integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==} @@ -11407,7 +11524,6 @@ packages: http-errors: 2.0.0 iconv-lite: 0.4.24 unpipe: 1.0.0 - dev: true /react-app-polyfill@3.0.0: resolution: {integrity: sha512-sZ41cxiU5llIB003yxxQBYrARBqe0repqPTTYBTmMqTz9szeBbE37BehCE891NZsmdZqqP+xWKdT3eo3vOzN8w==} @@ -11421,6 +11537,16 @@ packages: whatwg-fetch: 3.6.19 dev: true + /react-copy-to-clipboard@5.1.0(react@18.2.0): + resolution: {integrity: sha512-k61RsNgAayIJNoy9yDsYzDe/yAZAzEbEgcz3DZMhF686LEyukcE1hzurxe85JandPUG+yTfGVFzuEw3xt8WP/A==} + peerDependencies: + react: ^15.3.0 || 16 || 17 || 18 + dependencies: + copy-to-clipboard: 3.3.3 + prop-types: 15.8.1 + react: 18.2.0 + dev: false + /react-dev-utils@12.0.1(eslint@8.49.0)(typescript@5.2.2)(webpack@5.88.2): resolution: {integrity: sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==} engines: {node: '>=14'} @@ -11433,7 +11559,7 @@ packages: dependencies: '@babel/code-frame': 7.22.13 address: 1.2.2 - browserslist: 4.21.10 + browserslist: 4.21.11 chalk: 4.1.2 cross-spawn: 7.0.3 detect-port-alt: 1.1.6 @@ -11486,13 +11612,17 @@ packages: /react-is@18.2.0: resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} - dev: true /react-refresh@0.11.0: resolution: {integrity: sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A==} engines: {node: '>=0.10.0'} dev: true + /react-refresh@0.14.0: + resolution: {integrity: sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==} + engines: {node: '>=0.10.0'} + dev: true + /react-scripts@5.0.1(@babel/plugin-syntax-flow@7.22.5)(@babel/plugin-transform-react-jsx@7.22.15)(eslint@8.49.0)(react@18.2.0)(ts-node@10.9.1)(typescript@5.2.2): resolution: {integrity: sha512-8VAmEm/ZAwQzJ+GOMLbBsTdDKOpuZh7RPs0UymvBR2vRk4iZWCskjbFnxqjrzoIvlNNRZ3QJFx6/qDSi6zSnaQ==} engines: {node: '>=14.0.0'} @@ -11505,15 +11635,15 @@ packages: typescript: optional: true dependencies: - '@babel/core': 7.22.17 + '@babel/core': 7.23.0 '@pmmmwh/react-refresh-webpack-plugin': 0.5.11(react-refresh@0.11.0)(webpack-dev-server@4.15.1)(webpack@5.88.2) '@svgr/webpack': 5.5.0 - babel-jest: 27.5.1(@babel/core@7.22.17) - babel-loader: 8.3.0(@babel/core@7.22.17)(webpack@5.88.2) - babel-plugin-named-asset-import: 0.3.8(@babel/core@7.22.17) + babel-jest: 27.5.1(@babel/core@7.23.0) + babel-loader: 8.3.0(@babel/core@7.23.0)(webpack@5.88.2) + babel-plugin-named-asset-import: 0.3.8(@babel/core@7.23.0) babel-preset-react-app: 10.0.1 bfj: 7.1.0 - browserslist: 4.21.10 + browserslist: 4.21.11 camelcase: 6.3.0 case-sensitive-paths-webpack-plugin: 2.4.0 css-loader: 6.8.1(webpack@5.88.2) @@ -11534,7 +11664,7 @@ packages: postcss: 8.4.29 postcss-flexbugs-fixes: 5.0.2(postcss@8.4.29) postcss-loader: 6.2.1(postcss@8.4.29)(webpack@5.88.2) - postcss-normalize: 10.0.1(browserslist@4.21.10)(postcss@8.4.29) + postcss-normalize: 10.0.1(browserslist@4.21.11)(postcss@8.4.29) postcss-preset-env: 7.8.3(postcss@8.4.29) prompts: 2.4.2 react: 18.2.0 @@ -11590,6 +11720,16 @@ packages: - webpack-plugin-serve dev: true + /react-spinners@0.13.8(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-3e+k56lUkPj0vb5NDXPVFAOkPC//XyhKPJjvcGjyMNPWsBKpplfeyialP74G7H7+It7KzhtET+MvGqbKgAqpZA==} + peerDependencies: + react: ^16.0.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.0.0 || ^17.0.0 || ^18.0.0 + dependencies: + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + /react@18.2.0: resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} engines: {node: '>=0.10.0'} @@ -11648,7 +11788,6 @@ packages: safe-buffer: 5.1.2 string_decoder: 1.1.1 util-deprecate: 1.0.2 - dev: true /readable-stream@3.6.2: resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} @@ -11657,21 +11796,18 @@ packages: inherits: 2.0.4 string_decoder: 1.3.0 util-deprecate: 1.0.2 - dev: true /readdirp@3.6.0: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} dependencies: picomatch: 2.3.1 - dev: true /rechoir@0.7.1: resolution: {integrity: sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==} engines: {node: '>= 0.10'} dependencies: resolve: 1.22.4 - dev: true /recursive-readdir@2.2.3: resolution: {integrity: sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==} @@ -11704,8 +11840,8 @@ packages: globalthis: 1.0.3 which-builtin-type: 1.1.3 - /regenerate-unicode-properties@10.1.0: - resolution: {integrity: sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==} + /regenerate-unicode-properties@10.1.1: + resolution: {integrity: sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==} engines: {node: '>=4'} dependencies: regenerate: 1.4.2 @@ -11755,7 +11891,7 @@ packages: dependencies: '@babel/regjsgen': 0.8.0 regenerate: 1.4.2 - regenerate-unicode-properties: 10.1.0 + regenerate-unicode-properties: 10.1.1 regjsparser: 0.9.1 unicode-match-property-ecmascript: 2.0.0 unicode-match-property-value-ecmascript: 2.1.0 @@ -11791,18 +11927,16 @@ packages: /require-from-string@2.0.2: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} - dev: true + requiresBuild: true /requires-port@1.0.0: resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} - dev: true /resolve-cwd@3.0.0: resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} engines: {node: '>=8'} dependencies: resolve-from: 5.0.0 - dev: true /resolve-dir@1.0.1: resolution: {integrity: sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==} @@ -11819,7 +11953,7 @@ packages: /resolve-from@5.0.0: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} - dev: true + requiresBuild: true /resolve-global@1.0.0: resolution: {integrity: sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==} @@ -11884,7 +12018,6 @@ packages: /retry@0.13.1: resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} engines: {node: '>= 4'} - dev: true /reusify@1.0.4: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} @@ -11906,7 +12039,7 @@ packages: jest-worker: 26.6.2 rollup: 2.79.1 serialize-javascript: 4.0.0 - terser: 5.19.4 + terser: 5.20.0 dev: true /rollup@2.79.1: @@ -11923,7 +12056,6 @@ packages: hasBin: true optionalDependencies: fsevents: 2.3.3 - dev: true /run-async@2.4.1: resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} @@ -11952,11 +12084,9 @@ packages: /safe-buffer@5.1.2: resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} - dev: true /safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - dev: true /safe-regex-test@1.0.0: resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} @@ -11967,7 +12097,6 @@ packages: /safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - dev: true /sanitize.css@13.0.0: resolution: {integrity: sha512-ZRwKbh/eQ6w9vmTjkuG0Ioi3HBwPFce0O+v//ve+aOq1oeCy7jMV2qzzAlpsNuqpqCBjjriM1lbtZbF/Q8jVyA==} @@ -12039,7 +12168,6 @@ packages: '@types/json-schema': 7.0.12 ajv: 6.12.6 ajv-keywords: 3.5.2(ajv@6.12.6) - dev: true /schema-utils@4.2.0: resolution: {integrity: sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==} @@ -12049,21 +12177,18 @@ packages: ajv: 8.12.0 ajv-formats: 2.1.1(ajv@8.12.0) ajv-keywords: 5.1.0(ajv@8.12.0) - dev: true /scrypt-js@3.0.1: resolution: {integrity: sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==} /select-hose@2.0.0: resolution: {integrity: sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==} - dev: true /selfsigned@2.1.1: resolution: {integrity: sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==} engines: {node: '>=10'} dependencies: node-forge: 1.3.1 - dev: true /semver@5.7.2: resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} @@ -12100,7 +12225,6 @@ packages: statuses: 2.0.1 transitivePeerDependencies: - supports-color - dev: true /serialize-javascript@4.0.0: resolution: {integrity: sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==} @@ -12112,7 +12236,6 @@ packages: resolution: {integrity: sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==} dependencies: randombytes: 2.1.0 - dev: true /serve-index@1.9.1: resolution: {integrity: sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==} @@ -12127,7 +12250,6 @@ packages: parseurl: 1.3.3 transitivePeerDependencies: - supports-color - dev: true /serve-static@1.15.0: resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} @@ -12139,7 +12261,6 @@ packages: send: 0.18.0 transitivePeerDependencies: - supports-color - dev: true /set-function-name@2.0.1: resolution: {integrity: sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==} @@ -12151,18 +12272,15 @@ packages: /setprototypeof@1.1.0: resolution: {integrity: sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==} - dev: true /setprototypeof@1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} - dev: true /shallow-clone@3.0.1: resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} engines: {node: '>=8'} dependencies: kind-of: 6.0.3 - dev: true /shebang-command@1.2.0: resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} @@ -12188,7 +12306,6 @@ packages: /shell-quote@1.8.1: resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} - dev: true /shiki@0.14.4: resolution: {integrity: sha512-IXCRip2IQzKwxArNNq1S+On4KPML3Yyn8Zzs/xRgcgOWIr8ntIK3IKzjFPfjy/7kt9ZMjc+FItfqHRBg8b6tNQ==} @@ -12208,11 +12325,9 @@ packages: /siginfo@2.0.0: resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} - dev: true /signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - dev: true /sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} @@ -12233,7 +12348,6 @@ packages: faye-websocket: 0.11.4 uuid: 8.3.2 websocket-driver: 0.7.4 - dev: true /sort-object-keys@1.1.3: resolution: {integrity: sha512-855pvK+VkU7PaKYPc+Jjnmt4EzejQHyhhF33q31qG8x7maDzkeFhAAThdCYay11CISO+qAMwjOBP+fPZe0IPyg==} @@ -12277,12 +12391,10 @@ packages: dependencies: buffer-from: 1.1.2 source-map: 0.6.1 - dev: true /source-map@0.6.1: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} - dev: true /source-map@0.7.4: resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} @@ -12334,7 +12446,6 @@ packages: wbuf: 1.7.3 transitivePeerDependencies: - supports-color - dev: true /spdy@4.0.2: resolution: {integrity: sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==} @@ -12347,7 +12458,6 @@ packages: spdy-transport: 3.0.0 transitivePeerDependencies: - supports-color - dev: true /split2@3.2.2: resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==} @@ -12379,7 +12489,6 @@ packages: /stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} - dev: true /stackframe@1.3.4: resolution: {integrity: sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==} @@ -12415,16 +12524,13 @@ packages: /statuses@1.5.0: resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} engines: {node: '>= 0.6'} - dev: true /statuses@2.0.1: resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} engines: {node: '>= 0.8'} - dev: true /std-env@3.4.3: resolution: {integrity: sha512-f9aPhy8fYBuMN+sNfakZV18U39PbalgjXG3lLB9WkaYTxijru61wb57V9wxxNthXM5Sd88ETBWi29qLAsHO52Q==} - dev: true /stop-iteration-iterator@1.0.0: resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==} @@ -12433,6 +12539,13 @@ packages: internal-slot: 1.0.5 dev: false + /stream-browserify@3.0.0: + resolution: {integrity: sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==} + dependencies: + inherits: 2.0.4 + readable-stream: 3.6.2 + dev: true + /streamsearch@1.1.0: resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} engines: {node: '>=10.0.0'} @@ -12471,8 +12584,8 @@ packages: strip-ansi: 6.0.1 dev: true - /string.prototype.matchall@4.0.9: - resolution: {integrity: sha512-6i5hL3MqG/K2G43mWXWgP+qizFW/QH/7kCNN13JrJS5q48FN5IKksLDscexKP3dnmB6cdm9jlNgAsWNLpSykmA==} + /string.prototype.matchall@4.0.10: + resolution: {integrity: sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==} dependencies: call-bind: 1.0.2 define-properties: 1.2.1 @@ -12481,6 +12594,7 @@ packages: has-symbols: 1.0.3 internal-slot: 1.0.5 regexp.prototype.flags: 1.5.1 + set-function-name: 2.0.1 side-channel: 1.0.4 /string.prototype.padend@3.1.5: @@ -12518,13 +12632,11 @@ packages: resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} dependencies: safe-buffer: 5.1.2 - dev: true /string_decoder@1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} dependencies: safe-buffer: 5.2.1 - dev: true /stringify-object@3.3.0: resolution: {integrity: sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==} @@ -12570,7 +12682,6 @@ packages: /strip-final-newline@2.0.0: resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} engines: {node: '>=6'} - dev: true /strip-indent@3.0.0: resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} @@ -12587,7 +12698,6 @@ packages: resolution: {integrity: sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg==} dependencies: acorn: 8.10.0 - dev: true /strip-outer@1.0.1: resolution: {integrity: sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==} @@ -12628,7 +12738,7 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.21.10 + browserslist: 4.21.11 postcss: 8.4.29 postcss-selector-parser: 6.0.13 dev: true @@ -12652,7 +12762,6 @@ packages: engines: {node: '>=4'} dependencies: has-flag: 3.0.0 - dev: true /supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} @@ -12665,7 +12774,6 @@ packages: engines: {node: '>=10'} dependencies: has-flag: 4.0.0 - dev: true /supports-hyperlinks@2.3.0: resolution: {integrity: sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==} @@ -12815,12 +12923,11 @@ packages: jest-worker: 27.5.1 schema-utils: 3.3.0 serialize-javascript: 6.0.1 - terser: 5.19.4 + terser: 5.20.0 webpack: 5.88.2(webpack-cli@4.10.0) - dev: true - /terser@5.19.4: - resolution: {integrity: sha512-6p1DjHeuluwxDXcuT9VR8p64klWJKo1ILiy19s6C9+0Bh2+NWTX6nD9EPppiER4ICkHDVB1RkVpin/YW2nQn/g==} + /terser@5.20.0: + resolution: {integrity: sha512-e56ETryaQDyebBwJIWYB2TT6f2EZ0fL0sW/JRXNMN26zZdKi2u/E/5my5lG6jNxym6qsrVXfFRmOdV42zlAgLQ==} engines: {node: '>=10'} hasBin: true dependencies: @@ -12828,7 +12935,6 @@ packages: acorn: 8.10.0 commander: 2.20.3 source-map-support: 0.5.21 - dev: true /test-exclude@6.0.0: resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} @@ -12883,21 +12989,17 @@ packages: /thunky@1.1.0: resolution: {integrity: sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==} - dev: true /tinybench@2.5.1: resolution: {integrity: sha512-65NKvSuAVDP/n4CqH+a9w2kTlLReS9vhsAP06MWx+/89nMinJyB2icyl58RIcqCmIggpojIGeuJGhjU1aGMBSg==} - dev: true /tinypool@0.7.0: resolution: {integrity: sha512-zSYNUlYSMhJ6Zdou4cJwo/p7w5nmAH17GRfU/ui3ctvjXFErXXkruT4MWW6poDeXgCaIBlGLrfU6TbTXxyGMww==} engines: {node: '>=14.0.0'} - dev: true /tinyspy@2.1.1: resolution: {integrity: sha512-XPJL2uSzcOyBMky6OFrusqWlzfFrXtE0hPuMgW8A2HmaqrPo4ZQHRN/V0QXN3FSjKxpsbRrFc5LI7KOwBsT1/w==} engines: {node: '>=14.0.0'} - dev: true /tmp@0.0.33: resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} @@ -12913,7 +13015,6 @@ packages: /to-fast-properties@2.0.0: resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} engines: {node: '>=4'} - dev: true /to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} @@ -12921,10 +13022,13 @@ packages: dependencies: is-number: 7.0.0 + /toggle-selection@1.0.6: + resolution: {integrity: sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==} + dev: false + /toidentifier@1.0.1: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} - dev: true /toposort@2.0.2: resolution: {integrity: sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg==} @@ -12944,7 +13048,6 @@ packages: resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} dependencies: punycode: 2.3.0 - dev: true /tr46@2.1.0: resolution: {integrity: sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==} @@ -13098,7 +13201,6 @@ packages: /type-detect@4.0.8: resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} engines: {node: '>=4'} - dev: true /type-fest@0.16.0: resolution: {integrity: sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==} @@ -13135,7 +13237,6 @@ packages: dependencies: media-typer: 0.3.0 mime-types: 2.1.35 - dev: true /typechain@8.3.1(typescript@5.2.2): resolution: {integrity: sha512-fA7clol2IP/56yq6vkMTR+4URF1nGjV82Wx6Rf09EsqD4tkzMAvEaqYxVFCavJm/1xaRga/oD55K+4FtuXwQOQ==} @@ -13247,6 +13348,12 @@ packages: typescript: 5.2.2 dev: true + /typescript@4.9.5: + resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} + engines: {node: '>=4.2.0'} + hasBin: true + dev: true + /typescript@5.2.2: resolution: {integrity: sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==} engines: {node: '>=14.17'} @@ -13264,7 +13371,6 @@ packages: /ufo@1.3.0: resolution: {integrity: sha512-bRn3CsoojyNStCZe0BG0Mt4Nr/4KF+rhFlnNXybgqt5pXHNFRlqinSoQaTrGyzE4X8aHplSb+TorH+COin9Yxw==} - dev: true /uglify-js@3.17.4: resolution: {integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==} @@ -13334,7 +13440,6 @@ packages: /unpipe@1.0.0: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} - dev: true /unquote@1.1.1: resolution: {integrity: sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg==} @@ -13345,16 +13450,15 @@ packages: engines: {node: '>=4'} dev: true - /update-browserslist-db@1.0.11(browserslist@4.21.10): - resolution: {integrity: sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==} + /update-browserslist-db@1.0.13(browserslist@4.21.11): + resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' dependencies: - browserslist: 4.21.10 + browserslist: 4.21.11 escalade: 3.1.1 picocolors: 1.0.0 - dev: true /uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} @@ -13370,7 +13474,6 @@ packages: /util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - dev: true /util.promisify@1.0.1: resolution: {integrity: sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==} @@ -13388,12 +13491,10 @@ packages: /utils-merge@1.0.1: resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} engines: {node: '>= 0.4.0'} - dev: true /uuid@8.3.2: resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} hasBin: true - dev: true /v8-compile-cache-lib@3.0.1: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} @@ -13427,7 +13528,6 @@ packages: /vary@1.1.2: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} - dev: true /vite-node@0.34.4(@types/node@20.6.3): resolution: {integrity: sha512-ho8HtiLc+nsmbwZMw8SlghESEE3KxJNp04F/jPUCLVvaURwt0d+r9LxEqCX5hvrrOQ0GSyxbYr5ZfRYhQ0yVKQ==} @@ -13449,7 +13549,6 @@ packages: - sugarss - supports-color - terser - dev: true /vite@4.4.9(@types/node@20.6.3): resolution: {integrity: sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==} @@ -13485,7 +13584,6 @@ packages: rollup: 3.29.1 optionalDependencies: fsevents: 2.3.3 - dev: true /vitest@0.34.4: resolution: {integrity: sha512-SE/laOsB6995QlbSE6BtkpXDeVNLJc1u2LHRG/OpnN4RsRzM3GQm4nm3PQCK5OBtrsUqnhzLdnT7se3aeNGdlw==} @@ -13550,7 +13648,6 @@ packages: - sugarss - supports-color - terser - dev: true /vscode-oniguruma@1.7.0: resolution: {integrity: sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==} @@ -13591,7 +13688,6 @@ packages: resolution: {integrity: sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==} dependencies: minimalistic-assert: 1.0.1 - dev: true /wcwidth@1.0.1: resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} @@ -13601,7 +13697,6 @@ packages: /webidl-conversions@4.0.2: resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} - dev: true /webidl-conversions@5.0.0: resolution: {integrity: sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==} @@ -13647,7 +13742,6 @@ packages: webpack: 5.88.2(webpack-cli@4.10.0) webpack-dev-server: 4.15.1(webpack-cli@4.10.0)(webpack@5.88.2) webpack-merge: 5.9.0 - dev: true /webpack-dev-middleware@5.3.3(webpack@5.88.2): resolution: {integrity: sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==} @@ -13661,7 +13755,6 @@ packages: range-parser: 1.2.1 schema-utils: 4.2.0 webpack: 5.88.2(webpack-cli@4.10.0) - dev: true /webpack-dev-server@4.15.1(webpack-cli@4.10.0)(webpack@5.88.2): resolution: {integrity: sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA==} @@ -13676,9 +13769,9 @@ packages: webpack-cli: optional: true dependencies: - '@types/bonjour': 3.5.10 + '@types/bonjour': 3.5.11 '@types/connect-history-api-fallback': 1.5.1 - '@types/express': 4.17.17 + '@types/express': 4.17.18 '@types/serve-index': 1.9.1 '@types/serve-static': 1.15.2 '@types/sockjs': 0.3.33 @@ -13693,7 +13786,7 @@ packages: express: 4.18.2 graceful-fs: 4.2.11 html-entities: 2.4.0 - http-proxy-middleware: 2.0.6(@types/express@4.17.17) + http-proxy-middleware: 2.0.6(@types/express@4.17.18) ipaddr.js: 2.1.0 launch-editor: 2.6.0 open: 8.4.2 @@ -13707,13 +13800,12 @@ packages: webpack: 5.88.2(webpack-cli@4.10.0) webpack-cli: 4.10.0(webpack-dev-server@4.15.1)(webpack@5.88.2) webpack-dev-middleware: 5.3.3(webpack@5.88.2) - ws: 8.14.1 + ws: 8.14.2 transitivePeerDependencies: - bufferutil - debug - supports-color - utf-8-validate - dev: true /webpack-manifest-plugin@4.1.1(webpack@5.88.2): resolution: {integrity: sha512-YXUAwxtfKIJIKkhg03MKuiFAD72PlrqCiwdwO4VEXdRO5V0ORCNwaOwAZawPZalCbmH9kBDmXnNeQOw+BIEiow==} @@ -13732,7 +13824,6 @@ packages: dependencies: clone-deep: 4.0.1 wildcard: 2.0.1 - dev: true /webpack-sources@1.4.3: resolution: {integrity: sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==} @@ -13752,7 +13843,6 @@ packages: /webpack-sources@3.2.3: resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} engines: {node: '>=10.13.0'} - dev: true /webpack@5.88.2(webpack-cli@4.10.0): resolution: {integrity: sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==} @@ -13764,14 +13854,14 @@ packages: webpack-cli: optional: true dependencies: - '@types/eslint-scope': 3.7.4 - '@types/estree': 1.0.1 + '@types/eslint-scope': 3.7.5 + '@types/estree': 1.0.2 '@webassemblyjs/ast': 1.11.6 '@webassemblyjs/wasm-edit': 1.11.6 '@webassemblyjs/wasm-parser': 1.11.6 acorn: 8.10.0 acorn-import-assertions: 1.9.0(acorn@8.10.0) - browserslist: 4.21.10 + browserslist: 4.21.11 chrome-trace-event: 1.0.3 enhanced-resolve: 5.15.0 es-module-lexer: 1.3.1 @@ -13793,7 +13883,6 @@ packages: - '@swc/core' - esbuild - uglify-js - dev: true /websocket-driver@0.7.4: resolution: {integrity: sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==} @@ -13802,12 +13891,10 @@ packages: http-parser-js: 0.5.8 safe-buffer: 5.2.1 websocket-extensions: 0.1.4 - dev: true /websocket-extensions@0.1.4: resolution: {integrity: sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==} engines: {node: '>=0.8.0'} - dev: true /whatwg-encoding@1.0.5: resolution: {integrity: sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==} @@ -13823,6 +13910,14 @@ packages: resolution: {integrity: sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==} dev: true + /whatwg-url@6.5.0: + resolution: {integrity: sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==} + dependencies: + lodash.sortby: 4.7.0 + tr46: 1.0.1 + webidl-conversions: 4.0.2 + dev: false + /whatwg-url@7.1.0: resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} dependencies: @@ -13905,11 +14000,9 @@ packages: dependencies: siginfo: 2.0.0 stackback: 0.0.2 - dev: true /wildcard@2.0.1: resolution: {integrity: sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==} - dev: true /word-wrap@1.2.5: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} @@ -13946,10 +14039,10 @@ packages: engines: {node: '>=10.0.0'} dependencies: '@apideck/better-ajv-errors': 0.3.6(ajv@8.12.0) - '@babel/core': 7.22.17 - '@babel/preset-env': 7.22.15(@babel/core@7.22.17) + '@babel/core': 7.23.0 + '@babel/preset-env': 7.22.20(@babel/core@7.23.0) '@babel/runtime': 7.22.15 - '@rollup/plugin-babel': 5.3.1(@babel/core@7.22.17)(rollup@2.79.1) + '@rollup/plugin-babel': 5.3.1(@babel/core@7.23.0)(rollup@2.79.1) '@rollup/plugin-node-resolve': 11.2.1(rollup@2.79.1) '@rollup/plugin-replace': 2.4.2(rollup@2.79.1) '@surma/rollup-plugin-off-main-thread': 2.2.3 @@ -14125,21 +14218,8 @@ packages: utf-8-validate: optional: true - /ws@7.5.9: - resolution: {integrity: sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==} - engines: {node: '>=8.3.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - dev: true - - /ws@8.14.1: - resolution: {integrity: sha512-4OOseMUq8AzRBI/7SLMUwO+FEDnguetSk7KMb1sHwvF2w2Wv5Hoj0nlifx8vtGsftE/jWHojPy8sMMzYLJ2G/A==} + /ws@8.14.2: + resolution: {integrity: sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -14149,7 +14229,6 @@ packages: optional: true utf-8-validate: optional: true - dev: true /xml-name-validator@3.0.0: resolution: {integrity: sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==} @@ -14171,7 +14250,6 @@ packages: /yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - dev: true /yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} @@ -14216,7 +14294,6 @@ packages: /yocto-queue@1.0.0: resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} engines: {node: '>=12.20'} - dev: true /yup@0.32.11: resolution: {integrity: sha512-Z2Fe1bn+eLstG8DRR6FTavGD+MeAwyfmouhHsIUgaADz8jvFKbO/fXc2trJKZg+5EBjh4gGm3iU/t3onKlXHIg==} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 052c35491..f4b55b628 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,4 +1,5 @@ prefer-workspace-packages: true packages: - - "examples/*" - - "packages/*" + - "demos/**/*" + - "examples/**/*" + - "packages/**/*" diff --git a/tsconfig.json b/tsconfig.json index 3ec23cb83..bf242524e 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,7 +1,10 @@ { "compilerOptions": { "declaration": true, - "lib": ["ES2018", "dom"], + "lib": [ + "ES2018", + "dom" + ], "module": "CommonJS", "moduleResolution": "node", "strict": true, @@ -10,8 +13,15 @@ "composite": true, "incremental": true, "exactOptionalPropertyTypes": true, - "noImplicitOverride": true, + "noImplicitOverride": true }, - "include": ["**/*.ts", "**/*.js", "**/.*.js", "scripts/.common.ts"], - "exclude": ["**/node_modules"] + "include": [ + "**/*.ts", + "**/*.js", + "**/.*.js", + "scripts/.common.ts" + ], + "exclude": [ + "**/node_modules" + ] } diff --git a/tsconfig.prod.json b/tsconfig.prod.json index 118e66014..c54331bde 100644 --- a/tsconfig.prod.json +++ b/tsconfig.prod.json @@ -14,7 +14,10 @@ "files": [], "references": [ { - "path": "./packages/pre/tsconfig.build.json" + "path": "./packages/pre/tsconfig.es.json" + }, + { + "path": "./packages/pre/tsconfig.cjs.json" }, { "path": "./packages/shared/tsconfig.es.json" @@ -23,10 +26,16 @@ "path": "./packages/shared/tsconfig.cjs.json" }, { - "path": "./packages/taco/tsconfig.build.json" + "path": "./packages/taco/tsconfig.es.json" + }, + { + "path": "./packages/taco/tsconfig.cjs.json" + }, + { + "path": "./packages/test-utils/tsconfig.es.json" }, { - "path": "./packages/test-utils/tsconfig.build.json" + "path": "./packages/test-utils/tsconfig.cjs.json" } ] } diff --git a/vitest.config.ts b/vitest.config.ts index 99356159d..2b146dac4 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -3,7 +3,7 @@ import { defineConfig } from 'vitest/config'; export default defineConfig({ test: { root: __dirname, - environment: 'node', + environment: 'jsdom', coverage: { enabled: true, reporter: ['text', 'html', 'lcov', 'clover'], diff --git a/yarn.lock b/yarn.lock deleted file mode 100644 index e69de29bb..000000000