diff --git a/.circleci/config.yml b/.circleci/config.yml index 904b2ee007..77d68a28b5 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -266,6 +266,21 @@ jobs: - store_test_results: path: packages/integration-test/reports/ + test-monthly: + docker: + - *node_image + working_directory: *working_directory + resource_class: large + steps: + - attach_workspace: + at: *working_directory + - run: + name: 'Test payment-processor (hinkal)' + no_output_timeout: 30m + command: 'yarn workspace @requestnetwork/payment-processor run test:hinkal' + - store_test_results: + path: packages/payment-processor/reports/ + # Release a next version package everytime we merge to master next-release: docker: @@ -349,3 +364,19 @@ workflows: - test-nightly: requires: - build + + monthly: + triggers: + - schedule: + # This is a cron job for "every 1st day of the month at 22 hours" + cron: '0 22 1 * *' + filters: + branches: + only: + - master + + jobs: + - build + - test-monthly: + requires: + - build diff --git a/packages/payment-processor/package.json b/packages/payment-processor/package.json index 918966d33a..b9f562a5b5 100644 --- a/packages/payment-processor/package.json +++ b/packages/payment-processor/package.json @@ -35,10 +35,12 @@ "lint": "eslint . --fix", "lint:check": "eslint .", "prepare": "yarn run build", - "test": "jest --runInBand", + "test": "jest --testPathIgnorePatterns test/payment/erc-20-private-payment-hinkal.test.ts --runInBand", + "test:hinkal": "jest test/payment/erc-20-private-payment-hinkal.test.ts --runInBand", "test:watch": "yarn test --watch" }, "dependencies": { + "@hinkal/common": "0.2.7", "@openzeppelin/contracts": "4.9.6", "@requestnetwork/currency": "0.23.0", "@requestnetwork/payment-detection": "0.49.0", diff --git a/packages/payment-processor/src/index.ts b/packages/payment-processor/src/index.ts index c1ab446f76..f9aba001e8 100644 --- a/packages/payment-processor/src/index.ts +++ b/packages/payment-processor/src/index.ts @@ -3,6 +3,7 @@ export * from './payment/btc-address-based'; export * from './payment/erc20'; export * from './payment/erc20-proxy'; export * from './payment/erc20-fee-proxy'; +export * from './payment/erc-20-private-payment-hinkal'; export * from './payment/erc777-stream'; export * from './payment/erc777-utils'; export * from './payment/eth-input-data'; diff --git a/packages/payment-processor/src/payment/erc-20-private-payment-hinkal.ts b/packages/payment-processor/src/payment/erc-20-private-payment-hinkal.ts new file mode 100644 index 0000000000..cf0ab0d712 --- /dev/null +++ b/packages/payment-processor/src/payment/erc-20-private-payment-hinkal.ts @@ -0,0 +1,215 @@ +import { Contract, ContractTransaction, Signer, BigNumberish, providers, BigNumber } from 'ethers'; +import { erc20FeeProxyArtifact } from '@requestnetwork/smart-contracts'; +import { + ERC20FeeProxy__factory, + ERC20Proxy__factory, + ERC20__factory, +} from '@requestnetwork/smart-contracts/types'; +import { ClientTypes, ExtensionTypes } from '@requestnetwork/types'; +import { Erc20PaymentNetwork, getPaymentNetworkExtension } from '@requestnetwork/payment-detection'; +import { EvmChains } from '@requestnetwork/currency'; +import { + getAmountToPay, + getProvider, + getRequestPaymentValues, + getSigner, + validateRequest, + validateErc20FeeProxyRequest, + getProxyAddress, +} from './utils'; +import { IPreparedPrivateTransaction } from './prepared-transaction'; + +import { emporiumOp, IHinkal, RelayerTransaction } from '@hinkal/common'; +import { prepareEthersHinkal } from '@hinkal/common/providers/prepareEthersHinkal'; + +/** + * This is a globally accessible state variable exported for use in other parts of the application or tests. + */ +export const hinkalStore: Record = {}; + +/** + * Adds an IHinkal instance to the Hinkal store for a given signer. + * + * This function checks if an IHinkal instance already exists for the provided signer’s address in the `hinkalStore`. + * If it does not exist, it initializes the instance using `prepareEthersHinkal` and stores it. The existing or newly + * created instance is then returned. + * + * @param signer - The signer for which the IHinkal instance should be added or retrieved. + */ +export async function addToHinkalStore(signer: Signer): Promise { + const address = await signer.getAddress(); + if (!hinkalStore[address]) { + hinkalStore[address] = await prepareEthersHinkal(signer); + } + return hinkalStore[address]; +} + +/** + * Sends ERC20 tokens into a Hinkal shielded address. + * + * @param signerOrProvider the Web3 provider, or signer. + * @param tokenAddress - The address of the ERC20 token being sent. + * @param amount - The amount of tokens to send. + * @param recipientInfo - (Optional) The shielded address of the recipient. If provided, the tokens will be deposited into the recipient's shielded balance. If not provided, the deposit will increase the sender's shielded balance. + * + * @returns A promise that resolves to a `ContractTransaction`. + */ +export async function sendToHinkalShieldedAddressFromPublic( + signerOrProvider: providers.Provider | Signer = getProvider(), + tokenAddress: string, + amount: BigNumberish, + recipientInfo?: string, +): Promise { + const signer = getSigner(signerOrProvider); + const hinkalObject = await addToHinkalStore(signer); + + const amountToPay = BigNumber.from(amount).toBigInt(); + if (recipientInfo) { + return hinkalObject.depositForOther([tokenAddress], [amountToPay], recipientInfo); + } else { + return hinkalObject.deposit([tokenAddress], [amountToPay]); + } +} + +/** + * Processes a transaction to pay privately a request through the ERC20 fee proxy contract. + * @param request request to pay. + * @param signerOrProvider the Web3 provider, or signer. Defaults to window.ethereum. + * @param amount optionally, the amount to pay. Defaults to remaining amount of the request. + */ +export async function payErc20ProxyRequestFromHinkalShieldedAddress( + request: ClientTypes.IRequestData, + signerOrProvider: providers.Provider | Signer = getProvider(), + amount?: BigNumberish, +): Promise { + const signer = getSigner(signerOrProvider); + const hinkalObject = await addToHinkalStore(signer); + + const { amountToPay, tokenAddress, ops } = prepareErc20ProxyPaymentFromHinkalShieldedAddress( + request, + amount, + ); + + return hinkalObject.actionPrivateWallet( + [tokenAddress], + [-amountToPay], + [false], + ops, + ) as Promise; +} + +/** + * Processes a transaction to pay privately a request through the ERC20 fee proxy. + * @param request request to pay. + * @param signerOrProvider the Web3 provider, or signer. Defaults to window.ethereum. + * @param amount optionally, the amount to pay. Defaults to remaining amount of the request. + * @param feeAmount optionally, the fee amount to pay. Defaults to the fee amount of the request. + */ +export async function payErc20FeeProxyRequestFromHinkalShieldedAddress( + request: ClientTypes.IRequestData, + signerOrProvider: providers.Provider | Signer = getProvider(), + amount?: BigNumberish, + feeAmount?: BigNumberish, +): Promise { + const signer = getSigner(signerOrProvider); + const hinkalObject = await addToHinkalStore(signer); + + const { amountToPay, tokenAddress, ops } = prepareErc20FeeProxyPaymentFromHinkalShieldedAddress( + request, + amount, + feeAmount, + ); + + return hinkalObject.actionPrivateWallet( + [tokenAddress], + [-amountToPay], + [false], + ops, + ) as Promise; +} + +/** + * Prepare the transaction to privately pay a request through the ERC20 proxy contract, can be used with a Multisig contract. + * @param request request to pay + * @param amount optionally, the amount to pay. Defaults to remaining amount of the request. + */ +export function prepareErc20ProxyPaymentFromHinkalShieldedAddress( + request: ClientTypes.IRequestData, + amount?: BigNumberish, +): IPreparedPrivateTransaction { + validateRequest(request, ExtensionTypes.PAYMENT_NETWORK_ID.ERC20_PROXY_CONTRACT); + + const { value: tokenAddress } = request.currencyInfo; + const proxyAddress = getProxyAddress( + request, + Erc20PaymentNetwork.ERC20ProxyPaymentDetector.getDeploymentInformation, + ); + + const tokenContract = new Contract(tokenAddress, ERC20__factory.createInterface()); + const proxyContract = new Contract(proxyAddress, ERC20Proxy__factory.createInterface()); + + const { paymentReference, paymentAddress } = getRequestPaymentValues(request); + const amountToPay = getAmountToPay(request, amount); + + const ops = [ + emporiumOp(tokenContract, 'approve', [proxyContract.address, amountToPay]), + emporiumOp(proxyContract, 'transferFromWithReference', [ + tokenAddress, + paymentAddress, + amountToPay, + `0x${paymentReference}`, + ]), + ]; + + return { + amountToPay: amountToPay.toBigInt(), + tokenAddress, + ops, + }; +} + +/** + * Prepare the transaction to privately pay a request through the ERC20 fee proxy contract, can be used with a Multisig contract. + * @param request request to pay + * @param amount optionally, the amount to pay. Defaults to remaining amount of the request. + * @param feeAmountOverride optionally, the fee amount to pay. Defaults to the fee amount of the request. + */ +export function prepareErc20FeeProxyPaymentFromHinkalShieldedAddress( + request: ClientTypes.IRequestData, + amount?: BigNumberish, + feeAmountOverride?: BigNumberish, +): IPreparedPrivateTransaction { + validateErc20FeeProxyRequest(request, amount, feeAmountOverride); + + const { value: tokenAddress, network } = request.currencyInfo; + EvmChains.assertChainSupported(network!); + const pn = getPaymentNetworkExtension(request); + const proxyAddress = erc20FeeProxyArtifact.getAddress(network, pn?.version); + + const tokenContract = new Contract(tokenAddress, ERC20__factory.createInterface()); + const proxyContract = new Contract(proxyAddress, ERC20FeeProxy__factory.createInterface()); + + const { paymentReference, paymentAddress, feeAddress, feeAmount } = + getRequestPaymentValues(request); + const amountToPay = getAmountToPay(request, amount); + const feeToPay = String(feeAmountOverride || feeAmount || 0); + const totalAmount = amountToPay.add(BigNumber.from(feeToPay)); + + const ops = [ + emporiumOp(tokenContract, 'approve', [proxyContract.address, totalAmount]), + emporiumOp(proxyContract, 'transferFromWithReferenceAndFee', [ + tokenAddress, + paymentAddress, + amountToPay, + `0x${paymentReference}`, + feeToPay, + feeAddress, + ]), + ]; + + return { + amountToPay: totalAmount.toBigInt(), + tokenAddress, + ops, + }; +} diff --git a/packages/payment-processor/src/payment/prepared-transaction.ts b/packages/payment-processor/src/payment/prepared-transaction.ts index 2684fdeb59..a5acc0e34a 100644 --- a/packages/payment-processor/src/payment/prepared-transaction.ts +++ b/packages/payment-processor/src/payment/prepared-transaction.ts @@ -5,3 +5,13 @@ export interface IPreparedTransaction { data: string; to: string; } + +/** Interface for preparing private transactions using Hinkal middleware */ +export interface IPreparedPrivateTransaction { + /** Amount to pay in base units (e.g., wei for ETH, smallest decimal unit for ERC20 tokens based on their decimals()) */ + amountToPay: bigint; + /** ERC20 token contract address */ + tokenAddress: string; + /** list of operations encoded as HexStrings */ + ops: string[]; +} diff --git a/packages/payment-processor/test/payment/erc-20-private-payment-hinkal.test.ts b/packages/payment-processor/test/payment/erc-20-private-payment-hinkal.test.ts new file mode 100644 index 0000000000..88ae0b6ccf --- /dev/null +++ b/packages/payment-processor/test/payment/erc-20-private-payment-hinkal.test.ts @@ -0,0 +1,259 @@ +import { BigNumber, ethers, providers, Wallet } from 'ethers'; +import { RequestNetwork, Types, Utils } from '@requestnetwork/request-client.js'; +import { CurrencyTypes } from '@requestnetwork/types'; +import { EthereumPrivateKeySignatureProvider } from '@requestnetwork/epk-signature'; +import { + addToHinkalStore, + hinkalStore, + payErc20FeeProxyRequestFromHinkalShieldedAddress, + payErc20ProxyRequestFromHinkalShieldedAddress, + sendToHinkalShieldedAddressFromPublic, +} from '../../src/payment/erc-20-private-payment-hinkal'; +import { getErc20Balance } from '../../src/payment/erc20'; + +// Constants to configure the tests +const currentNetwork: CurrencyTypes.ChainName = 'base'; +const currencyAddress = '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913'; // USDC +const currentCurrenyType = Types.RequestLogic.CURRENCY.ERC20; +const currencyAmount = ethers.utils.parseUnits('0.000001', 6).toBigInt(); +const currentGateway = 'https://sepolia.gateway.request.network'; +const fee = ethers.utils.parseUnits('0.000001', 6).toString(); + +// Payer: +// 1) sends funds from his shielded address to EOA of the payee +// 2) sends funds from his EOA to the shielded address of the payee +// 3) sends funds from hiw EOA to his own shielded address +// Note: to successfully run the tests, you will need to top up payer's EOA address with ETH and USDC on Base +const payerPrivateKey = process.env.HINKAL_TEST_PAYER_PRIVATE_KEY as string; +// Payee: +// 1) receives funds on her public EOA address +// 2) receives funds on her shielded address +// The private key of a public address grant ownership of the corresponding shielded address. In @hinkal/common, a single public address can have only one shielded address. +const payeePrivateKey = process.env.HINKAL_TEST_PAYEE_PRIVATE_KEY as string; + +const RPC_URL = 'https://mainnet.base.org'; // Blockchain RPC endpoint for the Base network + +jest.setTimeout(1000000); // Set Jest timeout for asynchronous operations (e.g., blockchain calls) + +/** + * Function to create a payment request for Hinkal. + * This sets up the Request Network with payer and payee information. + * @param payerWallet The wallet of the payer. + * @param privateKey The private key of the payer (for signing). + * @param type The payment network type (e.g., ERC20_PROXY_CONTRACT). + * @returns A Promise that resolves to the request data with events. + */ +const createRequestForHinkal = async ( + payerWallet: ethers.Wallet, + payeeWallet: ethers.Wallet, + type: Types.Extension.PAYMENT_NETWORK_ID, +): Promise => { + // step 1: Create Signature Provider + const epkSignatureProvider = new EthereumPrivateKeySignatureProvider({ + method: Types.Signature.METHOD.ECDSA, + privateKey: payerWallet.privateKey, + }); + // step 2: create Request Network + const requestClient = new RequestNetwork({ + nodeConnectionConfig: { + baseURL: currentGateway, + }, + signatureProvider: epkSignatureProvider, + }); + + let paymentNetwork; + + // Step 3: Define payment network configuration based on type + if (type === Types.Extension.PAYMENT_NETWORK_ID.ERC20_PROXY_CONTRACT) { + paymentNetwork = { + id: type, + parameters: { + paymentNetworkName: currentNetwork, + paymentAddress: payeeWallet.address, + }, + }; + } else if (type === Types.Extension.PAYMENT_NETWORK_ID.ERC20_FEE_PROXY_CONTRACT) { + paymentNetwork = { + id: type, + parameters: { + paymentNetworkName: currentNetwork, + paymentAddress: payeeWallet.address, + feeAddress: payeeWallet.address, + feeAmount: fee, + }, + }; + } + + // step 4: Create Request Object + const requestCreateParameters: Types.ICreateRequestParameters = { + requestInfo: { + currency: { + type: currentCurrenyType, + value: currencyAddress, + network: currentNetwork, + }, + payee: { + type: Types.Identity.TYPE.ETHEREUM_ADDRESS, + value: payeeWallet.address, + }, + payer: { + type: Types.Identity.TYPE.ETHEREUM_ADDRESS, + value: payerWallet.address, + }, + expectedAmount: currencyAmount.toString(), + timestamp: Utils.getCurrentTimestampInSecond(), + }, + signer: { + type: Types.Identity.TYPE.ETHEREUM_ADDRESS, + value: payerWallet.address, + }, + paymentNetwork, + }; + + // Step 5: create & send request + const request = await requestClient.createRequest(requestCreateParameters); + const requestData = await request.waitForConfirmation(); + return requestData; +}; + +// This function is required to wait for the indexing of shielded balance changes in Hinkal +const waitLittle = (time = 15): Promise => + new Promise((resolve) => { + setTimeout(() => { + resolve(1); + }, time * 1000); + }); + +// Helper function: allows to get a shielded balance of a specific token +const getTokenShieldedBalance = async ( + address: string, + tokenAddress = currencyAddress, +): Promise => { + const balances = await hinkalStore[address].getBalances(); + const tokenBalance = balances.find( + (balance) => balance.token.erc20TokenAddress === tokenAddress, + )?.balance; + + if (tokenBalance === undefined) { + throw new Error(`No balance found for token ${tokenAddress} at address ${address}`); + } + return tokenBalance; +}; + +describe('ERC-20 Private Payments With Hinkal', () => { + let provider: providers.Provider; + let payerWallet: ethers.Wallet; + let payeeWallet: ethers.Wallet; + let payeeShieldedAddress: string; + beforeAll(async () => { + provider = new ethers.providers.JsonRpcProvider(RPC_URL); + payerWallet = new Wallet(payerPrivateKey, provider); + payeeWallet = new Wallet(payeePrivateKey, provider); + await addToHinkalStore(payerWallet); + await addToHinkalStore(payeeWallet); + payeeShieldedAddress = hinkalStore[payeeWallet.address].getRecipientInfo(); + }); + afterAll(async () => { + for (const key in hinkalStore) { + hinkalStore[key].snapshotsClearInterval(); // Clear Hinkal's snapshots interval: needed for jest to finish as a process + } + jest.clearAllTimers(); // Clear any pending Jest timers + }); + + describe('Privacy of a Sender: From Private to Public Transactions', () => { + // Objectives of this test: + // 1. The payer's address should never appear on-chain. + // 2. The payee should successfully receive the funds. + // 3. The transaction should complete successfully. + + it('ERC-20 Proxy: Payer is not the same as Origin/Sender of Transaction', async () => { + const requestData = await createRequestForHinkal( + payerWallet, + payeeWallet, + Types.Extension.PAYMENT_NETWORK_ID.ERC20_PROXY_CONTRACT, + ); + const balanceErc20Before = await getErc20Balance(requestData, payeeWallet.address, provider); + + const tx = await payErc20ProxyRequestFromHinkalShieldedAddress(requestData, payerWallet); + const balanceErc20After = await getErc20Balance(requestData, payeeWallet.address, provider); + + await waitLittle(5); // wait before balance is increased + + expect(tx.status).toBe(1); + expect(tx.from).not.toBe(payerWallet.address); + expect(BigNumber.from(balanceErc20Before).lt(BigNumber.from(balanceErc20After))); + }); + + it('ERC-20 Fee Proxy: Payer is not the same as Origin/Sender of Transaction', async () => { + const requestData = await createRequestForHinkal( + payerWallet, + payeeWallet, + Types.Extension.PAYMENT_NETWORK_ID.ERC20_FEE_PROXY_CONTRACT, + ); + + const balanceErc20Before = await getErc20Balance(requestData, payeeWallet.address, provider); + const tx = await payErc20FeeProxyRequestFromHinkalShieldedAddress(requestData, payerWallet); + const balanceErc20After = await getErc20Balance(requestData, payeeWallet.address, provider); + + await waitLittle(5); // wait before balance is increased + + expect(tx.status).toBe(1); + expect(tx.from).not.toBe(payerWallet.address); + expect(BigNumber.from(balanceErc20Before).lt(BigNumber.from(balanceErc20After))); + }); + }); + + describe('Shielding: Depositing funds from EOA to own shielded address', () => { + it('Payer sends from EOA to its own shielded address', async () => { + // For illustration: we show how payer can send funds to his own shielded address. + // The payer needs to do this to be able to send funds from his shielded address. + + const preUsdcBalance = await getTokenShieldedBalance(payerWallet.address); + + const tx = await sendToHinkalShieldedAddressFromPublic( + payerWallet, + currencyAddress, + currencyAmount, + ); + const waitedTx = await tx.wait(2); + + await waitLittle(7); // wait before balance is increased + + const postUsdcBalance = await getTokenShieldedBalance(payerWallet.address); + + expect(waitedTx.status).toBe(1); + expect(postUsdcBalance - preUsdcBalance).toBe(currencyAmount); // The payer received funds in his shielded address. + }); + }); + + describe('Privacy of a Recipient: From Public to Private Transactions', () => { + beforeAll(async () => { + await addToHinkalStore(payeeWallet); + }); + + it('Payer sends from EOA to the shielded address of the payee', async () => { + // Objectives of this test: + // 1. The payee's address should never appear on-chain. + // 2. The payee should successfully receive the funds. + // 3. The transaction should complete successfully. + + const preUsdcBalance = await getTokenShieldedBalance(payeeWallet.address); + + const tx = await sendToHinkalShieldedAddressFromPublic( + payerWallet, + currencyAddress, + currencyAmount, + payeeShieldedAddress, + ); + + const waitedTx = await tx.wait(2); + await waitLittle(1); // wait before balance is increased + + const postUsdcBalance = await getTokenShieldedBalance(payeeWallet.address); + + expect(waitedTx.status).toBe(1); + expect(payeeShieldedAddress).not.toBe(payeeWallet.address); // trivial check (satisfies 2nd condition) + expect(postUsdcBalance - preUsdcBalance).toBe(currencyAmount); // The payee received funds in their shielded account. + }); + }); +}); diff --git a/yarn.lock b/yarn.lock index 7ce47847eb..e861f42b9e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2951,11 +2951,42 @@ resolved "https://registry.yarnpkg.com/@graphql-typed-document-node/core/-/core-3.2.0.tgz#5f3d96ec6b2354ad6d8a28bf216a1d97b5426861" integrity sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ== +"@hinkal/common@0.2.7": + version "0.2.7" + resolved "https://registry.yarnpkg.com/@hinkal/common/-/common-0.2.7.tgz#0128e0f2a175fb4c6d7ed006a0c886f942e3163d" + integrity sha512-Dqs/7J0/9bNT8j47LNtkEINOOdAz1AIbbMqklRX5ym7KL7wH5LXuP7S9CYX+mmHPTG3/3EVb39oZNDjaRX6m9Q== + dependencies: + async-mutex "^0.4.0" + axios "^1.6.8" + buffer "6.0.3" + circomlibjs-hinkal-fork "^0.0.3" + dotenv "^16.4.5" + idb-keyval "6.2.1" + libsodium-wrappers "^0.7.10" + node-forge "^1.3.1" + process "0.11.10" + snarkjs "0.7.5" + ua-parser-js "^1.0.37" + uuid "^9.0.1" + "@hutson/parse-repository-url@^3.0.0": version "3.0.2" resolved "https://registry.yarnpkg.com/@hutson/parse-repository-url/-/parse-repository-url-3.0.2.tgz#98c23c950a3d9b6c8f0daed06da6c3af06981340" integrity sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q== +"@iden3/bigarray@0.0.2": + version "0.0.2" + resolved "https://registry.yarnpkg.com/@iden3/bigarray/-/bigarray-0.0.2.tgz#6fc4ba5be18daf8a26ee393f2fb62b80d98c05e9" + integrity sha512-Xzdyxqm1bOFF6pdIsiHLLl3HkSLjbhqJHVyqaTxXt3RqXBEnmsUmEW47H7VOi/ak7TdkRpNkxjyK5Zbkm+y52g== + +"@iden3/binfileutils@0.0.12": + version "0.0.12" + resolved "https://registry.yarnpkg.com/@iden3/binfileutils/-/binfileutils-0.0.12.tgz#3772552f57551814ff606fa68ea1e0ef52795ce3" + integrity sha512-naAmzuDufRIcoNfQ1d99d7hGHufLA3wZSibtr4dMe6ZeiOPV1KwOZWTJ1YVz4HbaWlpDuzVU72dS4ATQS4PXBQ== + dependencies: + fastfile "0.0.20" + ffjavascript "^0.3.0" + "@isaacs/cliui@^8.0.2": version "8.0.2" resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" @@ -7383,6 +7414,13 @@ async-limiter@~1.0.0: resolved "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz" integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== +async-mutex@^0.4.0: + version "0.4.1" + resolved "https://registry.yarnpkg.com/async-mutex/-/async-mutex-0.4.1.tgz#bccf55b96f2baf8df90ed798cb5544a1f6ee4c2c" + integrity sha512-WfoBo4E/TbCX1G95XTjbWTE3X2XLG0m1Xbv2cwOtuPdyH9CZvnaA5nCt1ucjaKEgW2A5IF71hxrRhr83Je5xjA== + dependencies: + tslib "^2.4.0" + async@2.6.2: version "2.6.2" resolved "https://registry.yarnpkg.com/async/-/async-2.6.2.tgz#18330ea7e6e313887f5d2f2a904bac6fe4dd5381" @@ -7470,6 +7508,20 @@ axios@^1.0.0, axios@^1.4.0: form-data "^4.0.0" proxy-from-env "^1.1.0" +axios@^1.6.8: + version "1.7.8" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.7.8.tgz#1997b1496b394c21953e68c14aaa51b7b5de3d6e" + integrity sha512-Uu0wb7KNqK2t5K+YQyVCLM76prD5sRFjKHbJYCP1J7JFGEQ6nN7HWn9+04LAeiJ3ji54lgS/gZCH1oxyrf1SPw== + dependencies: + follow-redirects "^1.15.6" + form-data "^4.0.0" + proxy-from-env "^1.1.0" + +b4a@^1.0.1: + version "1.6.7" + resolved "https://registry.yarnpkg.com/b4a/-/b4a-1.6.7.tgz#a99587d4ebbfbd5a6e3b21bdb5d5fa385767abe4" + integrity sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg== + babel-code-frame@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" @@ -8189,6 +8241,17 @@ before-after-hook@^2.2.0: resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-2.2.3.tgz#c51e809c81a4e354084422b9b26bad88249c517c" integrity sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ== +bfj@^7.0.2: + version "7.1.0" + resolved "https://registry.yarnpkg.com/bfj/-/bfj-7.1.0.tgz#c5177d522103f9040e1b12980fe8c38cf41d3f8b" + integrity sha512-I6MMLkn+anzNdCUp9hMRyui1HaNEUCco50lxbvNS4+EyXg8lN3nJ48PjPWtbH8UVS9CuMoaKE9U2V3l29DaRQw== + dependencies: + bluebird "^3.7.2" + check-types "^11.2.3" + hoopy "^0.1.4" + jsonpath "^1.1.1" + tryer "^1.0.1" + big-integer@1.6.36: version "1.6.36" resolved "https://registry.npmjs.org/big-integer/-/big-integer-1.6.36.tgz" @@ -8279,12 +8342,20 @@ bl@^4.0.3, bl@^4.1.0: inherits "^2.0.4" readable-stream "^3.4.0" +blake2b-wasm@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/blake2b-wasm/-/blake2b-wasm-2.4.0.tgz#9115649111edbbd87eb24ce7c04b427e4e2be5be" + integrity sha512-S1kwmW2ZhZFFFOghcx73+ZajEfKBqhP82JMssxtLVMxlaPea1p9uoLiUZ5WYyHn0KddwbLc+0vh4wR0KBNoT5w== + dependencies: + b4a "^1.0.1" + nanoassert "^2.0.0" + blakejs@^1.1.0: version "1.1.0" resolved "https://registry.npmjs.org/blakejs/-/blakejs-1.1.0.tgz" integrity sha1-ad+S75U6qIylGjLfarHFShVfx6U= -bluebird@^3.5.0, bluebird@^3.5.2: +bluebird@^3.5.0, bluebird@^3.5.2, bluebird@^3.7.2: version "3.7.2" resolved "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz" integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== @@ -9217,6 +9288,11 @@ check-error@^1.0.2: dependencies: get-func-name "^2.0.2" +check-types@^11.2.3: + version "11.2.3" + resolved "https://registry.yarnpkg.com/check-types/-/check-types-11.2.3.tgz#1ffdf68faae4e941fce252840b1787b8edc93b71" + integrity sha512-+67P1GkJRaxQD6PKK0Et9DhwQB+vGg3PM5+aavopCpZT1lj9jeqfvpgTLAWErNj8qApkkmXlu/Ug74kmhagkXg== + checkpoint-store@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/checkpoint-store/-/checkpoint-store-1.1.0.tgz#04e4cb516b91433893581e6d4601a78e9552ea06" @@ -9405,6 +9481,20 @@ cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: inherits "^2.0.1" safe-buffer "^5.0.1" +circom_runtime@0.1.28: + version "0.1.28" + resolved "https://registry.yarnpkg.com/circom_runtime/-/circom_runtime-0.1.28.tgz#4ea4606956eeac4499f71f65354f45b54faa93fe" + integrity sha512-ACagpQ7zBRLKDl5xRZ4KpmYIcZDUjOiNRuxvXLqhnnlLSVY1Dbvh73TI853nqoR0oEbihtWmMSjgc5f+pXf/jQ== + dependencies: + ffjavascript "0.3.1" + +circomlibjs-hinkal-fork@^0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/circomlibjs-hinkal-fork/-/circomlibjs-hinkal-fork-0.0.3.tgz#4315276dbcd79b8d720093a72a4028cbcc509077" + integrity sha512-yj8eVrWpbmAQLD+MLwHZ+rhLoSgGT5vhnV3j0Ih7+uclCp3kouXKj1H+/PwbWnIC/ykhTy53dLi0QoChsACXtA== + dependencies: + ffjavascript "^0.3.0" + citty@^0.1.5, citty@^0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/citty/-/citty-0.1.6.tgz#0f7904da1ed4625e1a9ea7e0fa780981aab7c5e4" @@ -11020,6 +11110,11 @@ dotenv@^16.0.0: resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.3.1.tgz#369034de7d7e5b120972693352a3bf112172cc3e" integrity sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ== +dotenv@^16.4.5: + version "16.4.5" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.5.tgz#cdd3b3b604cb327e286b4762e13502f717cb099f" + integrity sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg== + dotignore@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/dotignore/-/dotignore-0.1.2.tgz#f942f2200d28c3a76fbdd6f0ee9f3257c8a2e905" @@ -11094,7 +11189,7 @@ ee-first@1.1.1: resolved "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= -ejs@^3.1.7: +ejs@^3.1.6, ejs@^3.1.7: version "3.1.10" resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.10.tgz#69ab8358b14e896f80cc39e62087b88500c3ac3b" integrity sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA== @@ -11573,7 +11668,7 @@ escape-string-regexp@^2.0.0: resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz" integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== -escodegen@^1.11.1: +escodegen@^1.11.1, escodegen@^1.8.1: version "1.14.3" resolved "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz" integrity sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw== @@ -11820,6 +11915,11 @@ espree@^7.3.0, espree@^7.3.1: acorn-jsx "^5.3.1" eslint-visitor-keys "^1.3.0" +esprima@1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-1.2.2.tgz#76a0fd66fcfe154fd292667dc264019750b1657b" + integrity sha512-+JpPZam9w5DuJ3Q67SqsMGtiHKENSMRVoxvArfJZK01/BfLEObtZ6orJa/MtoGNR/rfMgp5837T41PAmTwAv/A== + esprima@^4.0.0, esprima@^4.0.1: version "4.0.1" resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" @@ -12890,6 +12990,11 @@ fast-url-parser@^1.1.3: dependencies: punycode "^1.3.2" +fastfile@0.0.20: + version "0.0.20" + resolved "https://registry.yarnpkg.com/fastfile/-/fastfile-0.0.20.tgz#794a143d58cfda2e24c298e5ef619c748c8a1879" + integrity sha512-r5ZDbgImvVWCP0lA/cGNgQcZqR+aYdFx3u+CtJqUE510pBUVGMn4ulL/iRTI4tACTYsNJ736uzFxEBXesPAktA== + fastq@^1.6.0: version "1.11.0" resolved "https://registry.npmjs.org/fastq/-/fastq-1.11.0.tgz" @@ -12936,6 +13041,24 @@ fetch-ponyfill@^4.0.0: dependencies: node-fetch "~1.7.1" +ffjavascript@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/ffjavascript/-/ffjavascript-0.3.0.tgz#442cd8fbb1ee4cbb1be9d26fd7b2951a1ea45d6a" + integrity sha512-l7sR5kmU3gRwDy8g0Z2tYBXy5ttmafRPFOqY7S6af5cq51JqJWt5eQ/lSR/rs2wQNbDYaYlQr5O+OSUf/oMLoQ== + dependencies: + wasmbuilder "0.0.16" + wasmcurves "0.2.2" + web-worker "1.2.0" + +ffjavascript@0.3.1, ffjavascript@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/ffjavascript/-/ffjavascript-0.3.1.tgz#3761bbb3f4a67b58a94a463080272bf6b5877b03" + integrity sha512-4PbK1WYodQtuF47D4pRI5KUg3Q392vuP5WjE1THSnceHdXwU3ijaoS0OqxTzLknCtz4Z2TtABzkBdBdMn3B/Aw== + dependencies: + wasmbuilder "0.0.16" + wasmcurves "0.2.2" + web-worker "1.2.0" + figures@3.2.0, figures@^3.0.0, figures@^3.2.0: version "3.2.0" resolved "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz" @@ -14534,6 +14657,11 @@ homedir-polyfill@^1.0.1: dependencies: parse-passwd "^1.0.0" +hoopy@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/hoopy/-/hoopy-0.1.4.tgz#609207d661100033a9a9402ad3dea677381c1b1d" + integrity sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ== + hosted-git-info@^2.1.4, hosted-git-info@^2.6.0: version "2.8.9" resolved "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz" @@ -14803,7 +14931,7 @@ iconv-lite@^0.6.2: dependencies: safer-buffer ">= 2.1.2 < 3.0.0" -idb-keyval@^6.2.1: +idb-keyval@6.2.1, idb-keyval@^6.2.1: version "6.2.1" resolved "https://registry.yarnpkg.com/idb-keyval/-/idb-keyval-6.2.1.tgz#94516d625346d16f56f3b33855da11bfded2db33" integrity sha512-8Sb3veuYCyrZL+VBt9LJfZjLUPWVvqn8tG28VqYNFCo43KHcKuq+b4EiXGeuaLAQWL2YmyDgMp2aSpH9JHsEQg== @@ -16590,6 +16718,15 @@ jsonparse@^1.2.0, jsonparse@^1.3.1: resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" integrity sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg== +jsonpath@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/jsonpath/-/jsonpath-1.1.1.tgz#0ca1ed8fb65bb3309248cc9d5466d12d5b0b9901" + integrity sha512-l6Cg7jRpixfbgoWgkrl77dgEj8RPvND0wMH6TwQmi9Qs4TFfS9u5cUFnbeKTwj5ga5Y3BTGGNI28k117LJ009w== + dependencies: + esprima "1.2.2" + static-eval "2.0.2" + underscore "1.12.1" + jsonpointer@^5.0.0: version "5.0.1" resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-5.0.1.tgz#2110e0af0900fd37467b5907ecd13a7884a1b559" @@ -16988,6 +17125,18 @@ libnpmpublish@7.1.4: sigstore "^1.4.0" ssri "^10.0.1" +libsodium-wrappers@^0.7.10: + version "0.7.15" + resolved "https://registry.yarnpkg.com/libsodium-wrappers/-/libsodium-wrappers-0.7.15.tgz#53f13e483820272a3d55b23be2e34402ac988055" + integrity sha512-E4anqJQwcfiC6+Yrl01C1m8p99wEhLmJSs0VQqST66SbQXXBoaJY0pF4BNjRYa/sOQAxx6lXAaAFIlx+15tXJQ== + dependencies: + libsodium "^0.7.15" + +libsodium@^0.7.15: + version "0.7.15" + resolved "https://registry.yarnpkg.com/libsodium/-/libsodium-0.7.15.tgz#ac284e3dcb1c29ae9526c5581cdada6a072f6d20" + integrity sha512-sZwRknt/tUpE2AwzHq3jEyUU5uvIZHtSssktXq7owd++3CSgn8RGrv6UZJJBpP7+iBghBqe7Z06/2M31rI2NKw== + linebreak@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/linebreak/-/linebreak-1.0.2.tgz" @@ -17302,6 +17451,11 @@ loglevel@^1.6.4: resolved "https://registry.npmjs.org/loglevel/-/loglevel-1.7.1.tgz" integrity sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw== +logplease@^1.2.15: + version "1.2.15" + resolved "https://registry.yarnpkg.com/logplease/-/logplease-1.2.15.tgz#3da442e93751a5992cc19010a826b08d0293c48a" + integrity sha512-jLlHnlsPSJjpwUfcNyUxXCl33AYg2cHhIf9QhGL2T4iPT0XPB+xP1LRKFPgIg1M/sg9kAJvy94w9CzBNrfnstA== + looper@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/looper/-/looper-2.0.0.tgz#66cd0c774af3d4fedac53794f742db56da8f09ec" @@ -18440,6 +18594,11 @@ nano-json-stream-parser@^0.1.2: resolved "https://registry.npmjs.org/nano-json-stream-parser/-/nano-json-stream-parser-0.1.2.tgz" integrity sha1-DMj20OK2IrR5xA1JnEbWS3Vcb18= +nanoassert@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/nanoassert/-/nanoassert-2.0.0.tgz#a05f86de6c7a51618038a620f88878ed1e490c09" + integrity sha512-7vO7n28+aYO4J+8w96AzhmU8G+Y/xpPDJz/se19ICsqj/momRbb9mh9ZUtkoJ5X3nTnPdhEJyc0qnM6yAsHBaA== + nanoid@3.3.3: version "3.3.3" resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz" @@ -20546,6 +20705,16 @@ quote-stream@^1.0.1: minimist "^1.1.3" through2 "^2.0.0" +r1csfile@0.0.48: + version "0.0.48" + resolved "https://registry.yarnpkg.com/r1csfile/-/r1csfile-0.0.48.tgz#a317fc75407a9da92631666c75bdfc13f0a7835a" + integrity sha512-kHRkKUJNaor31l05f2+RFzvcH5XSa7OfEfd/l4hzjte6NL6fjRkSMfZ4BjySW9wmfdwPOtq3mXurzPvPGEf5Tw== + dependencies: + "@iden3/bigarray" "0.0.2" + "@iden3/binfileutils" "0.0.12" + fastfile "0.0.20" + ffjavascript "0.3.0" + radix3@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/radix3/-/radix3-1.1.2.tgz#fd27d2af3896c6bf4bcdfab6427c69c2afc69ec0" @@ -21924,6 +22093,22 @@ snapdragon@^0.8.1: source-map-resolve "^0.5.0" use "^3.1.0" +snarkjs@0.7.5: + version "0.7.5" + resolved "https://registry.yarnpkg.com/snarkjs/-/snarkjs-0.7.5.tgz#334d83b61468bdffbbf922b20734ca47be50b8ab" + integrity sha512-h+3c4rXZKLhLuHk4LHydZCk/h5GcNvk5GjVKRRkHmfb6Ntf8gHOA9zea3g656iclRuhqQ3iKDWFgiD9ypLrKiA== + dependencies: + "@iden3/binfileutils" "0.0.12" + bfj "^7.0.2" + blake2b-wasm "^2.4.0" + circom_runtime "0.1.28" + ejs "^3.1.6" + fastfile "0.0.20" + ffjavascript "0.3.1" + js-sha3 "^0.8.0" + logplease "^1.2.15" + r1csfile "0.0.48" + socks-proxy-agent@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz#dc069ecf34436621acb41e3efa66ca1b5fed15b6" @@ -22297,6 +22482,13 @@ stacktrace-parser@^0.1.10: dependencies: type-fest "^0.7.1" +static-eval@2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/static-eval/-/static-eval-2.0.2.tgz#2d1759306b1befa688938454c546b7871f806a42" + integrity sha512-N/D219Hcr2bPjLxPiV+TQE++Tsmrady7TqAJugLy7Xk1EumfDWS/f5dtBbkRCGE7wKKXuYockQoj8Rm2/pVKyg== + dependencies: + escodegen "^1.8.1" + static-eval@^2.0.5: version "2.1.0" resolved "https://registry.npmjs.org/static-eval/-/static-eval-2.1.0.tgz" @@ -23343,6 +23535,11 @@ try-to-catch@^3.0.0: resolved "https://registry.npmjs.org/try-to-catch/-/try-to-catch-3.0.0.tgz" integrity sha512-eIm6ZXwR35jVF8By/HdbbkcaCDTBI5PpCPkejRKrYp0jyf/DbCCcRhHD7/O9jtFI3ewsqo9WctFEiJTS6i+CQA== +tryer@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8" + integrity sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA== + ts-command-line-args@^2.2.0: version "2.5.1" resolved "https://registry.yarnpkg.com/ts-command-line-args/-/ts-command-line-args-2.5.1.tgz#e64456b580d1d4f6d948824c274cf6fa5f45f7f0" @@ -23908,6 +24105,11 @@ ua-parser-js@^0.7.18: resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.34.tgz#afb439e2e3e394bdc90080acb661a39c685b67d7" integrity sha512-cJMeh/eOILyGu0ejgTKB95yKT3zOenSe9UGE3vj6WfiOwgGYnmATUsnDixMFvdU+rNMvWih83hrUP8VwhF9yXQ== +ua-parser-js@^1.0.37: + version "1.0.39" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-1.0.39.tgz#bfc07f361549bf249bd8f4589a4cccec18fd2018" + integrity sha512-k24RCVWlEcjkdOxYmVJgeD/0a1TiSpqLg+ZalVGV9lsnr4yqu0w7tX/x2xX6G4zpkgQnRf89lxuZ1wsbjXM8lw== + ufo@^1.5.4: version "1.5.4" resolved "https://registry.yarnpkg.com/ufo/-/ufo-1.5.4.tgz#16d6949674ca0c9e0fbbae1fa20a71d7b1ded754" @@ -24370,7 +24572,7 @@ uuid@^3.0.0, uuid@^3.3.2, uuid@^3.3.3: resolved "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== -uuid@^9.0.0: +uuid@^9.0.0, uuid@^9.0.1: version "9.0.1" resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.1.tgz#e188d4c8853cc722220392c424cd637f32293f30" integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA== @@ -24477,6 +24679,18 @@ walker@^1.0.8: dependencies: makeerror "1.0.12" +wasmbuilder@0.0.16: + version "0.0.16" + resolved "https://registry.yarnpkg.com/wasmbuilder/-/wasmbuilder-0.0.16.tgz#f34c1f2c047d2f6e1065cbfec5603988f16d8549" + integrity sha512-Qx3lEFqaVvp1cEYW7Bfi+ebRJrOiwz2Ieu7ZG2l7YyeSJIok/reEQCQCuicj/Y32ITIJuGIM9xZQppGx5LrQdA== + +wasmcurves@0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/wasmcurves/-/wasmcurves-0.2.2.tgz#ca444f6a6f6e2a5cbe6629d98ff478a62b4ccb2b" + integrity sha512-JRY908NkmKjFl4ytnTu5ED6AwPD+8VJ9oc94kdq7h5bIwbj0L4TDJ69mG+2aLs2SoCmGfqIesMWTEJjtYsoQXQ== + dependencies: + wasmbuilder "0.0.16" + watchpack@^2.4.1: version "2.4.2" resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.2.tgz#2feeaed67412e7c33184e5a79ca738fbd38564da" @@ -24497,6 +24711,11 @@ web-streams-polyfill@^3.2.1: resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz#71c2718c52b45fd49dbeee88634b3a60ceab42a6" integrity sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q== +web-worker@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/web-worker/-/web-worker-1.2.0.tgz#5d85a04a7fbc1e7db58f66595d7a3ac7c9c180da" + integrity sha512-PgF341avzqyx60neE9DD+XS26MMNMoUQRz9NOZwW32nPQrF6p77f1htcnjBSEV8BGMKZ16choqUG4hyI0Hx7mA== + web3-bzz@1.10.3: version "1.10.3" resolved "https://registry.yarnpkg.com/web3-bzz/-/web3-bzz-1.10.3.tgz#13942b37757eb850f3500a8e08bf605448b67566"