From edb836a5c0e3b70fe594af144a5c44c0d2249a3b Mon Sep 17 00:00:00 2001 From: Nikita Yutanov Date: Fri, 23 Aug 2024 15:40:07 +0300 Subject: [PATCH 01/38] Init --- frontend/.env.example | 5 + frontend/.eslintrc | 66 + frontend/.gitignore | 27 + frontend/.npmrc | 1 + frontend/.prettierrc | 11 + frontend/Dockerfile | 31 + frontend/README.md | 1 + frontend/codegen.ts | 23 + frontend/index.html | 12 + frontend/package.json | 59 + frontend/pnpm-lock.yaml | 15756 ++++++++++++++++ frontend/public/favicon.svg | 4 + frontend/src/App.tsx | 26 + frontend/src/assets/eth.svg | 9 + frontend/src/assets/logo.svg | 11 + frontend/src/assets/usdc.svg | 8 + frontend/src/assets/vara-logo.svg | 6 + frontend/src/assets/vara-usdc.svg | 8 + frontend/src/assets/vara.svg | 4 + frontend/src/assets/wrapped-eth.svg | 9 + frontend/src/assets/wrapped-vara.svg | 4 + frontend/src/components/card/card.module.scss | 7 + frontend/src/components/card/card.tsx | 16 + frontend/src/components/card/index.ts | 3 + .../components/copy-button/copy-button.tsx | 35 + frontend/src/components/copy-button/copy.svg | 3 + frontend/src/components/copy-button/index.ts | 3 + .../src/components/form/checkbox/checkbox.tsx | 12 + .../src/components/form/checkbox/index.ts | 3 + frontend/src/components/form/index.ts | 9 + frontend/src/components/form/input/index.ts | 3 + frontend/src/components/form/input/input.tsx | 15 + frontend/src/components/form/radio/index.ts | 3 + frontend/src/components/form/radio/radio.tsx | 12 + frontend/src/components/form/select/index.ts | 3 + .../src/components/form/select/select.tsx | 12 + .../src/components/form/textarea/index.ts | 3 + .../src/components/form/textarea/textarea.tsx | 15 + frontend/src/components/form/types.ts | 9 + frontend/src/components/index.ts | 25 + .../layout/container/container.module.scss | 62 + .../components/layout/container/container.tsx | 48 + .../src/components/layout/container/index.ts | 3 + .../error-boundary/error-boundary.module.scss | 12 + .../layout/error-boundary/error-boundary.tsx | 63 + .../components/layout/error-boundary/index.ts | 3 + .../src/components/layout/footer/consts.ts | 72 + .../src/components/layout/footer/discord.svg | 3 + .../layout/footer/footer.module.scss | 52 + .../src/components/layout/footer/footer.tsx | 60 + .../src/components/layout/footer/github.svg | 3 + .../src/components/layout/footer/index.ts | 3 + .../src/components/layout/footer/medium.svg | 5 + .../src/components/layout/footer/telegram.svg | 3 + frontend/src/components/layout/footer/x.svg | 3 + .../src/components/layout/footer/youtube.svg | 3 + .../layout/header/header.module.scss | 37 + .../src/components/layout/header/header.tsx | 31 + .../src/components/layout/header/index.ts | 3 + frontend/src/components/layout/index.ts | 9 + .../components/layout/private-route/index.ts | 3 + .../layout/private-route/private-route.tsx | 14 + .../src/components/layout/skeleton/index.ts | 3 + .../layout/skeleton/skeleton.module.scss | 37 + .../components/layout/skeleton/skeleton.tsx | 23 + .../components/layout/truncated-text/index.ts | 3 + .../truncated-text/truncated-text.module.scss | 7 + .../layout/truncated-text/truncated-text.tsx | 14 + frontend/src/components/link-button/index.ts | 3 + .../components/link-button/link-button.tsx | 45 + frontend/src/components/network-card/index.ts | 3 + .../network-card/network-card.module.scss | 31 + .../components/network-card/network-card.tsx | 23 + frontend/src/consts/index.ts | 26 + frontend/src/consts/spec/index.ts | 4 + frontend/src/consts/spec/network.ts | 16 + frontend/src/consts/spec/spec.ts | 63 + frontend/src/features/faq/assets/arrow.svg | 4 + .../accordion/accordion.module.scss | 52 + .../faq/components/accordion/accordion.tsx | 30 + .../faq/components/accordion/index.ts | 3 + frontend/src/features/faq/components/index.ts | 3 + frontend/src/features/faq/consts.ts | 35 + frontend/src/features/faq/index.ts | 4 + .../src/features/history/assets/arrow.svg | 3 + .../src/features/history/assets/check.svg | 3 + .../src/features/history/assets/clock.svg | 3 + .../src/features/history/components/index.ts | 4 + .../components/latest-transactions/index.ts | 3 + .../latest-transactions.module.scss | 13 + .../latest-transactions.tsx | 38 + .../components/transaction-card/index.ts | 3 + .../components/transaction-card/sources.tsx | 78 + .../components/transaction-card/status.tsx | 19 + .../components/transaction-card/time.tsx | 22 + .../transaction-card.module.scss | 126 + .../transaction-card/transaction-card.tsx | 90 + .../components/transactions-counter/index.ts | 3 + .../transactions-counter.module.scss | 13 + .../transactions-counter.tsx | 18 + frontend/src/features/history/consts/index.ts | 47 + .../src/features/history/consts/queries.ts | 27 + .../history/graphql/fragment-masking.ts | 67 + frontend/src/features/history/graphql/gql.ts | 47 + .../src/features/history/graphql/graphql.ts | 404 + .../src/features/history/graphql/index.ts | 2 + frontend/src/features/history/hooks/index.ts | 4 + .../history/hooks/use-transactions-count.ts | 17 + .../history/hooks/use-transactions.ts | 35 + frontend/src/features/history/index.ts | 5 + frontend/src/features/history/types.ts | 4 + .../features/swap/assets/bridge_vara.meta.txt | 1 + .../bridge_vara_wrapped_tokens.meta.txt | 1 + frontend/src/features/swap/assets/ft.idl | 94 + frontend/src/features/swap/assets/gas.svg | 3 + .../components/balance/balance.module.scss | 30 + .../swap/components/balance/balance.tsx | 47 + .../features/swap/components/balance/index.ts | 3 + .../src/features/swap/components/index.ts | 3 + .../features/swap/components/network/index.ts | 3 + .../components/network/network.module.scss | 17 + .../swap/components/network/network.tsx | 86 + .../swap/components/swap-form/index.ts | 4 + .../components/swap-form/swap-eth-form.tsx | 28 + .../swap-form/swap-form.module.scss | 23 + .../swap/components/swap-form/swap-form.tsx | 107 + .../components/swap-form/swap-vara-form.tsx | 28 + .../features/swap/components/swap/index.ts | 3 + .../swap/components/swap/swap.module.scss | 40 + .../features/swap/components/swap/swap.tsx | 45 + frontend/src/features/swap/consts/abi/abi.ts | 2145 +++ .../swap/consts/abi/fungible-token-abi.ts | 654 + .../src/features/swap/consts/abi/index.ts | 4 + frontend/src/features/swap/consts/eth.ts | 16 + frontend/src/features/swap/consts/form.ts | 42 + frontend/src/features/swap/consts/index.ts | 22 + frontend/src/features/swap/consts/spec.ts | 14 + frontend/src/features/swap/consts/vara.ts | 5 + frontend/src/features/swap/hooks/eth/index.ts | 5 + .../features/swap/hooks/eth/use-approve.ts | 79 + .../swap/hooks/eth/use-eth-account-balance.ts | 29 + .../swap/hooks/eth/use-eth-balance.ts | 13 + .../features/swap/hooks/eth/use-eth-config.ts | 30 + .../hooks/eth/use-fungible-token-balance.ts | 44 + .../swap/hooks/eth/use-handle-eth-submit.ts | 60 + frontend/src/features/swap/hooks/index.ts | 15 + .../src/features/swap/hooks/use-bridge.ts | 30 + .../src/features/swap/hooks/use-swap-form.ts | 97 + .../src/features/swap/hooks/vara/index.ts | 6 + .../hooks/vara/use-derive-balances-all.ts | 19 + .../hooks/vara/use-fungible-token-balance.ts | 55 + .../swap/hooks/vara/use-handle-vara-submit.ts | 37 + .../features/swap/hooks/vara/use-metadata.ts | 23 + .../swap/hooks/vara/use-read-state.ts | 21 + .../swap/hooks/vara/use-send-message.ts | 40 + .../hooks/vara/use-vara-account-balance.ts | 29 + .../swap/hooks/vara/use-vara-balance.ts | 13 + .../swap/hooks/vara/use-vara-config.ts | 26 + frontend/src/features/swap/index.ts | 3 + frontend/src/features/swap/types/form.ts | 11 + frontend/src/features/swap/types/hooks.ts | 33 + frontend/src/features/swap/types/index.ts | 18 + frontend/src/features/swap/types/spec.ts | 23 + frontend/src/features/swap/types/vara.ts | 13 + frontend/src/features/swap/utils.ts | 43 + frontend/src/features/wallet/assets/copy.svg | 8 + .../src/features/wallet/assets/enkrypt.svg | 10 + frontend/src/features/wallet/assets/exit.svg | 3 + .../src/features/wallet/assets/polkadot.svg | 12 + .../src/features/wallet/assets/subwallet.svg | 88 + frontend/src/features/wallet/assets/swap.svg | 3 + .../src/features/wallet/assets/talisman.svg | 12 + .../account-button/account-button.module.scss | 6 + .../account-button/account-button.tsx | 23 + .../wallet/components/account-button/index.ts | 3 + .../src/features/wallet/components/index.ts | 5 + .../components/network-wallet-field/index.ts | 3 + .../network-wallet-field.module.scss | 32 + .../network-wallet-field.tsx | 70 + .../components/network-wallet-modal/index.ts | 3 + .../network-wallet-modal.module.scss | 10 + .../network-wallet-modal.tsx | 43 + .../components/swap-network-button/index.ts | 3 + .../swap-network-button.module.scss | 23 + .../swap-network-button.tsx | 39 + .../wallet/components/wallet-item/index.ts | 3 + .../wallet-item/wallet-item.module.scss | 10 + .../components/wallet-item/wallet-item.tsx | 19 + .../wallet/components/wallet-modal/index.ts | 3 + .../wallet-modal/wallet-modal.module.scss | 58 + .../components/wallet-modal/wallet-modal.tsx | 116 + .../wallet/components/wallet/index.ts | 3 + .../components/wallet/wallet.module.scss | 30 + .../wallet/components/wallet/wallet.tsx | 49 + frontend/src/features/wallet/consts.ts | 17 + frontend/src/features/wallet/hooks/index.ts | 4 + .../features/wallet/hooks/use-account-sync.ts | 30 + .../src/features/wallet/hooks/use-wallet.ts | 20 + frontend/src/features/wallet/index.ts | 3 + frontend/src/features/wallet/types.ts | 5 + frontend/src/hooks/index.ts | 7 + frontend/src/hooks/use-change-effect.ts | 21 + frontend/src/hooks/use-loading.ts | 12 + frontend/src/hooks/use-modal.ts | 12 + frontend/src/index.scss | 55 + frontend/src/main.tsx | 40 + frontend/src/pages/faq/faq.module.scss | 35 + frontend/src/pages/faq/faq.tsx | 26 + frontend/src/pages/faq/index.ts | 3 + frontend/src/pages/home/home.module.scss | 22 + frontend/src/pages/home/home.tsx | 32 + frontend/src/pages/home/index.ts | 3 + frontend/src/pages/index.tsx | 6 + frontend/src/pages/not-found/index.ts | 3 + .../src/pages/not-found/not-found.module.scss | 18 + frontend/src/pages/not-found/not-found.tsx | 19 + frontend/src/pages/transactions/index.ts | 3 + frontend/src/pages/transactions/list/index.ts | 3 + .../pages/transactions/list/list.module.scss | 35 + frontend/src/pages/transactions/list/list.tsx | 49 + frontend/src/pages/transactions/search.svg | 4 + .../transactions/transactions.module.scss | 15 + .../src/pages/transactions/transactions.tsx | 158 + .../src/pages/transactions/use-debounce.ts | 34 + frontend/src/providers.tsx | 95 + frontend/src/types/index.ts | 11 + frontend/src/types/spec.ts | 5 + frontend/src/utils.ts | 36 + frontend/src/vite-env.d.ts | 2 + frontend/tsconfig.json | 29 + frontend/tsconfig.node.json | 10 + frontend/vite.config.ts | 20 + 232 files changed, 24172 insertions(+) create mode 100644 frontend/.env.example create mode 100644 frontend/.eslintrc create mode 100644 frontend/.gitignore create mode 100644 frontend/.npmrc create mode 100644 frontend/.prettierrc create mode 100644 frontend/Dockerfile create mode 100644 frontend/README.md create mode 100644 frontend/codegen.ts create mode 100644 frontend/index.html create mode 100644 frontend/package.json create mode 100644 frontend/pnpm-lock.yaml create mode 100644 frontend/public/favicon.svg create mode 100644 frontend/src/App.tsx create mode 100644 frontend/src/assets/eth.svg create mode 100644 frontend/src/assets/logo.svg create mode 100644 frontend/src/assets/usdc.svg create mode 100644 frontend/src/assets/vara-logo.svg create mode 100644 frontend/src/assets/vara-usdc.svg create mode 100644 frontend/src/assets/vara.svg create mode 100644 frontend/src/assets/wrapped-eth.svg create mode 100644 frontend/src/assets/wrapped-vara.svg create mode 100644 frontend/src/components/card/card.module.scss create mode 100644 frontend/src/components/card/card.tsx create mode 100644 frontend/src/components/card/index.ts create mode 100644 frontend/src/components/copy-button/copy-button.tsx create mode 100644 frontend/src/components/copy-button/copy.svg create mode 100644 frontend/src/components/copy-button/index.ts create mode 100644 frontend/src/components/form/checkbox/checkbox.tsx create mode 100644 frontend/src/components/form/checkbox/index.ts create mode 100644 frontend/src/components/form/index.ts create mode 100644 frontend/src/components/form/input/index.ts create mode 100644 frontend/src/components/form/input/input.tsx create mode 100644 frontend/src/components/form/radio/index.ts create mode 100644 frontend/src/components/form/radio/radio.tsx create mode 100644 frontend/src/components/form/select/index.ts create mode 100644 frontend/src/components/form/select/select.tsx create mode 100644 frontend/src/components/form/textarea/index.ts create mode 100644 frontend/src/components/form/textarea/textarea.tsx create mode 100644 frontend/src/components/form/types.ts create mode 100644 frontend/src/components/index.ts create mode 100644 frontend/src/components/layout/container/container.module.scss create mode 100644 frontend/src/components/layout/container/container.tsx create mode 100644 frontend/src/components/layout/container/index.ts create mode 100644 frontend/src/components/layout/error-boundary/error-boundary.module.scss create mode 100644 frontend/src/components/layout/error-boundary/error-boundary.tsx create mode 100644 frontend/src/components/layout/error-boundary/index.ts create mode 100644 frontend/src/components/layout/footer/consts.ts create mode 100644 frontend/src/components/layout/footer/discord.svg create mode 100644 frontend/src/components/layout/footer/footer.module.scss create mode 100644 frontend/src/components/layout/footer/footer.tsx create mode 100644 frontend/src/components/layout/footer/github.svg create mode 100644 frontend/src/components/layout/footer/index.ts create mode 100644 frontend/src/components/layout/footer/medium.svg create mode 100644 frontend/src/components/layout/footer/telegram.svg create mode 100644 frontend/src/components/layout/footer/x.svg create mode 100644 frontend/src/components/layout/footer/youtube.svg create mode 100644 frontend/src/components/layout/header/header.module.scss create mode 100644 frontend/src/components/layout/header/header.tsx create mode 100644 frontend/src/components/layout/header/index.ts create mode 100644 frontend/src/components/layout/index.ts create mode 100644 frontend/src/components/layout/private-route/index.ts create mode 100644 frontend/src/components/layout/private-route/private-route.tsx create mode 100644 frontend/src/components/layout/skeleton/index.ts create mode 100644 frontend/src/components/layout/skeleton/skeleton.module.scss create mode 100644 frontend/src/components/layout/skeleton/skeleton.tsx create mode 100644 frontend/src/components/layout/truncated-text/index.ts create mode 100644 frontend/src/components/layout/truncated-text/truncated-text.module.scss create mode 100644 frontend/src/components/layout/truncated-text/truncated-text.tsx create mode 100644 frontend/src/components/link-button/index.ts create mode 100644 frontend/src/components/link-button/link-button.tsx create mode 100644 frontend/src/components/network-card/index.ts create mode 100644 frontend/src/components/network-card/network-card.module.scss create mode 100644 frontend/src/components/network-card/network-card.tsx create mode 100644 frontend/src/consts/index.ts create mode 100644 frontend/src/consts/spec/index.ts create mode 100644 frontend/src/consts/spec/network.ts create mode 100644 frontend/src/consts/spec/spec.ts create mode 100644 frontend/src/features/faq/assets/arrow.svg create mode 100644 frontend/src/features/faq/components/accordion/accordion.module.scss create mode 100644 frontend/src/features/faq/components/accordion/accordion.tsx create mode 100644 frontend/src/features/faq/components/accordion/index.ts create mode 100644 frontend/src/features/faq/components/index.ts create mode 100644 frontend/src/features/faq/consts.ts create mode 100644 frontend/src/features/faq/index.ts create mode 100644 frontend/src/features/history/assets/arrow.svg create mode 100644 frontend/src/features/history/assets/check.svg create mode 100644 frontend/src/features/history/assets/clock.svg create mode 100644 frontend/src/features/history/components/index.ts create mode 100644 frontend/src/features/history/components/latest-transactions/index.ts create mode 100644 frontend/src/features/history/components/latest-transactions/latest-transactions.module.scss create mode 100644 frontend/src/features/history/components/latest-transactions/latest-transactions.tsx create mode 100644 frontend/src/features/history/components/transaction-card/index.ts create mode 100644 frontend/src/features/history/components/transaction-card/sources.tsx create mode 100644 frontend/src/features/history/components/transaction-card/status.tsx create mode 100644 frontend/src/features/history/components/transaction-card/time.tsx create mode 100644 frontend/src/features/history/components/transaction-card/transaction-card.module.scss create mode 100644 frontend/src/features/history/components/transaction-card/transaction-card.tsx create mode 100644 frontend/src/features/history/components/transactions-counter/index.ts create mode 100644 frontend/src/features/history/components/transactions-counter/transactions-counter.module.scss create mode 100644 frontend/src/features/history/components/transactions-counter/transactions-counter.tsx create mode 100644 frontend/src/features/history/consts/index.ts create mode 100644 frontend/src/features/history/consts/queries.ts create mode 100644 frontend/src/features/history/graphql/fragment-masking.ts create mode 100644 frontend/src/features/history/graphql/gql.ts create mode 100644 frontend/src/features/history/graphql/graphql.ts create mode 100644 frontend/src/features/history/graphql/index.ts create mode 100644 frontend/src/features/history/hooks/index.ts create mode 100644 frontend/src/features/history/hooks/use-transactions-count.ts create mode 100644 frontend/src/features/history/hooks/use-transactions.ts create mode 100644 frontend/src/features/history/index.ts create mode 100644 frontend/src/features/history/types.ts create mode 100644 frontend/src/features/swap/assets/bridge_vara.meta.txt create mode 100644 frontend/src/features/swap/assets/bridge_vara_wrapped_tokens.meta.txt create mode 100644 frontend/src/features/swap/assets/ft.idl create mode 100644 frontend/src/features/swap/assets/gas.svg create mode 100644 frontend/src/features/swap/components/balance/balance.module.scss create mode 100644 frontend/src/features/swap/components/balance/balance.tsx create mode 100644 frontend/src/features/swap/components/balance/index.ts create mode 100644 frontend/src/features/swap/components/index.ts create mode 100644 frontend/src/features/swap/components/network/index.ts create mode 100644 frontend/src/features/swap/components/network/network.module.scss create mode 100644 frontend/src/features/swap/components/network/network.tsx create mode 100644 frontend/src/features/swap/components/swap-form/index.ts create mode 100644 frontend/src/features/swap/components/swap-form/swap-eth-form.tsx create mode 100644 frontend/src/features/swap/components/swap-form/swap-form.module.scss create mode 100644 frontend/src/features/swap/components/swap-form/swap-form.tsx create mode 100644 frontend/src/features/swap/components/swap-form/swap-vara-form.tsx create mode 100644 frontend/src/features/swap/components/swap/index.ts create mode 100644 frontend/src/features/swap/components/swap/swap.module.scss create mode 100644 frontend/src/features/swap/components/swap/swap.tsx create mode 100644 frontend/src/features/swap/consts/abi/abi.ts create mode 100644 frontend/src/features/swap/consts/abi/fungible-token-abi.ts create mode 100644 frontend/src/features/swap/consts/abi/index.ts create mode 100644 frontend/src/features/swap/consts/eth.ts create mode 100644 frontend/src/features/swap/consts/form.ts create mode 100644 frontend/src/features/swap/consts/index.ts create mode 100644 frontend/src/features/swap/consts/spec.ts create mode 100644 frontend/src/features/swap/consts/vara.ts create mode 100644 frontend/src/features/swap/hooks/eth/index.ts create mode 100644 frontend/src/features/swap/hooks/eth/use-approve.ts create mode 100644 frontend/src/features/swap/hooks/eth/use-eth-account-balance.ts create mode 100644 frontend/src/features/swap/hooks/eth/use-eth-balance.ts create mode 100644 frontend/src/features/swap/hooks/eth/use-eth-config.ts create mode 100644 frontend/src/features/swap/hooks/eth/use-fungible-token-balance.ts create mode 100644 frontend/src/features/swap/hooks/eth/use-handle-eth-submit.ts create mode 100644 frontend/src/features/swap/hooks/index.ts create mode 100644 frontend/src/features/swap/hooks/use-bridge.ts create mode 100644 frontend/src/features/swap/hooks/use-swap-form.ts create mode 100644 frontend/src/features/swap/hooks/vara/index.ts create mode 100644 frontend/src/features/swap/hooks/vara/use-derive-balances-all.ts create mode 100644 frontend/src/features/swap/hooks/vara/use-fungible-token-balance.ts create mode 100644 frontend/src/features/swap/hooks/vara/use-handle-vara-submit.ts create mode 100644 frontend/src/features/swap/hooks/vara/use-metadata.ts create mode 100644 frontend/src/features/swap/hooks/vara/use-read-state.ts create mode 100644 frontend/src/features/swap/hooks/vara/use-send-message.ts create mode 100644 frontend/src/features/swap/hooks/vara/use-vara-account-balance.ts create mode 100644 frontend/src/features/swap/hooks/vara/use-vara-balance.ts create mode 100644 frontend/src/features/swap/hooks/vara/use-vara-config.ts create mode 100644 frontend/src/features/swap/index.ts create mode 100644 frontend/src/features/swap/types/form.ts create mode 100644 frontend/src/features/swap/types/hooks.ts create mode 100644 frontend/src/features/swap/types/index.ts create mode 100644 frontend/src/features/swap/types/spec.ts create mode 100644 frontend/src/features/swap/types/vara.ts create mode 100644 frontend/src/features/swap/utils.ts create mode 100644 frontend/src/features/wallet/assets/copy.svg create mode 100644 frontend/src/features/wallet/assets/enkrypt.svg create mode 100644 frontend/src/features/wallet/assets/exit.svg create mode 100644 frontend/src/features/wallet/assets/polkadot.svg create mode 100644 frontend/src/features/wallet/assets/subwallet.svg create mode 100644 frontend/src/features/wallet/assets/swap.svg create mode 100644 frontend/src/features/wallet/assets/talisman.svg create mode 100644 frontend/src/features/wallet/components/account-button/account-button.module.scss create mode 100644 frontend/src/features/wallet/components/account-button/account-button.tsx create mode 100644 frontend/src/features/wallet/components/account-button/index.ts create mode 100644 frontend/src/features/wallet/components/index.ts create mode 100644 frontend/src/features/wallet/components/network-wallet-field/index.ts create mode 100644 frontend/src/features/wallet/components/network-wallet-field/network-wallet-field.module.scss create mode 100644 frontend/src/features/wallet/components/network-wallet-field/network-wallet-field.tsx create mode 100644 frontend/src/features/wallet/components/network-wallet-modal/index.ts create mode 100644 frontend/src/features/wallet/components/network-wallet-modal/network-wallet-modal.module.scss create mode 100644 frontend/src/features/wallet/components/network-wallet-modal/network-wallet-modal.tsx create mode 100644 frontend/src/features/wallet/components/swap-network-button/index.ts create mode 100644 frontend/src/features/wallet/components/swap-network-button/swap-network-button.module.scss create mode 100644 frontend/src/features/wallet/components/swap-network-button/swap-network-button.tsx create mode 100644 frontend/src/features/wallet/components/wallet-item/index.ts create mode 100644 frontend/src/features/wallet/components/wallet-item/wallet-item.module.scss create mode 100644 frontend/src/features/wallet/components/wallet-item/wallet-item.tsx create mode 100644 frontend/src/features/wallet/components/wallet-modal/index.ts create mode 100644 frontend/src/features/wallet/components/wallet-modal/wallet-modal.module.scss create mode 100644 frontend/src/features/wallet/components/wallet-modal/wallet-modal.tsx create mode 100644 frontend/src/features/wallet/components/wallet/index.ts create mode 100644 frontend/src/features/wallet/components/wallet/wallet.module.scss create mode 100644 frontend/src/features/wallet/components/wallet/wallet.tsx create mode 100644 frontend/src/features/wallet/consts.ts create mode 100644 frontend/src/features/wallet/hooks/index.ts create mode 100644 frontend/src/features/wallet/hooks/use-account-sync.ts create mode 100644 frontend/src/features/wallet/hooks/use-wallet.ts create mode 100644 frontend/src/features/wallet/index.ts create mode 100644 frontend/src/features/wallet/types.ts create mode 100644 frontend/src/hooks/index.ts create mode 100644 frontend/src/hooks/use-change-effect.ts create mode 100644 frontend/src/hooks/use-loading.ts create mode 100644 frontend/src/hooks/use-modal.ts create mode 100644 frontend/src/index.scss create mode 100644 frontend/src/main.tsx create mode 100644 frontend/src/pages/faq/faq.module.scss create mode 100644 frontend/src/pages/faq/faq.tsx create mode 100644 frontend/src/pages/faq/index.ts create mode 100644 frontend/src/pages/home/home.module.scss create mode 100644 frontend/src/pages/home/home.tsx create mode 100644 frontend/src/pages/home/index.ts create mode 100644 frontend/src/pages/index.tsx create mode 100644 frontend/src/pages/not-found/index.ts create mode 100644 frontend/src/pages/not-found/not-found.module.scss create mode 100644 frontend/src/pages/not-found/not-found.tsx create mode 100644 frontend/src/pages/transactions/index.ts create mode 100644 frontend/src/pages/transactions/list/index.ts create mode 100644 frontend/src/pages/transactions/list/list.module.scss create mode 100644 frontend/src/pages/transactions/list/list.tsx create mode 100644 frontend/src/pages/transactions/search.svg create mode 100644 frontend/src/pages/transactions/transactions.module.scss create mode 100644 frontend/src/pages/transactions/transactions.tsx create mode 100644 frontend/src/pages/transactions/use-debounce.ts create mode 100644 frontend/src/providers.tsx create mode 100644 frontend/src/types/index.ts create mode 100644 frontend/src/types/spec.ts create mode 100644 frontend/src/utils.ts create mode 100644 frontend/src/vite-env.d.ts create mode 100644 frontend/tsconfig.json create mode 100644 frontend/tsconfig.node.json create mode 100644 frontend/vite.config.ts diff --git a/frontend/.env.example b/frontend/.env.example new file mode 100644 index 00000000..88aad6fe --- /dev/null +++ b/frontend/.env.example @@ -0,0 +1,5 @@ +VITE_VARA_NODE_ADDRESS= +VITE_ETH_NODE_ADDRESS= +VITE_ETH_CHAIN_ID= +VITE_WALLET_CONNECT_PROJECT_ID= +VITE_INDEXER_ADDRESS= diff --git a/frontend/.eslintrc b/frontend/.eslintrc new file mode 100644 index 00000000..55cccdc1 --- /dev/null +++ b/frontend/.eslintrc @@ -0,0 +1,66 @@ +{ + "root": true, + "env": { "browser": true, "es2020": true }, + + "extends": [ + "eslint:recommended", + "plugin:react/recommended", + "plugin:react-hooks/recommended", + "plugin:react/jsx-runtime", + "plugin:import/recommended", + "plugin:jsx-a11y/recommended", + "prettier" + ], + + "settings": { + "ecmaVersion": "latest", + "react": { + "version": "detect" + }, + "import/resolver": { + "typescript": true + } + }, + + "plugins": ["react", "react-hooks", "import", "jsx-a11y", "react-refresh"], + + "overrides": [ + { + "files": ["*.ts", "*.tsx"], + + "parser": "@typescript-eslint/parser", + "parserOptions": { "project": ["./tsconfig.json", "./tsconfig.node.json"] }, + + "extends": [ + "plugin:@typescript-eslint/eslint-recommended", + "plugin:@typescript-eslint/recommended", + "plugin:@typescript-eslint/recommended-requiring-type-checking", + "plugin:import/typescript" + ], + + "plugins": ["@typescript-eslint/eslint-plugin"], + + "rules": { + // airbnb cfg + "no-shadow": "error", + "no-shadow-restricted-names": "error", + + // dx + "@typescript-eslint/no-unused-vars": "warn", + + // react-hook-form onSubmit + "@typescript-eslint/no-misused-promises": [2, { "checksVoidReturn": { "attributes": false } }], + + // import sort + "import/order": [ + 1, + { + "groups": ["external", "builtin", "internal", "parent", "sibling", "index"], + "newlines-between": "always", + "alphabetize": { "order": "asc" } + } + ] + } + } + ] +} diff --git a/frontend/.gitignore b/frontend/.gitignore new file mode 100644 index 00000000..6758dcbc --- /dev/null +++ b/frontend/.gitignore @@ -0,0 +1,27 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +.env* +!.env.example + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/frontend/.npmrc b/frontend/.npmrc new file mode 100644 index 00000000..cffe8cde --- /dev/null +++ b/frontend/.npmrc @@ -0,0 +1 @@ +save-exact=true diff --git a/frontend/.prettierrc b/frontend/.prettierrc new file mode 100644 index 00000000..3ad86440 --- /dev/null +++ b/frontend/.prettierrc @@ -0,0 +1,11 @@ +{ + "singleQuote": true, + "trailingComma": "all", + "endOfLine": "lf", + "printWidth": 120, + "semi": true, + "bracketSpacing": true, + "bracketSameLine": true, + "arrowParens": "always", + "tabWidth": 2 +} diff --git a/frontend/Dockerfile b/frontend/Dockerfile new file mode 100644 index 00000000..95e2b2f7 --- /dev/null +++ b/frontend/Dockerfile @@ -0,0 +1,31 @@ +FROM node:18-alpine + +COPY ./frontend /opt + +RUN apk update + +RUN apk add xsel + +RUN npm install -g pnpm + +ARG VITE_VARA_NODE_ADDRESS \ + VITE_ETH_NODE_ADDRESS \ + VITE_ETH_CHAIN_ID \ + VITE_INDEXER_ADDRESS \ + VITE_WALLET_CONNECT_PROJECT_ID +ENV VITE_VARA_NODE_ADDRESS=${VITE_VARA_NODE_ADDRESS} \ + VITE_ETH_NODE_ADDRESS=${VITE_ETH_NODE_ADDRESS} \ + VITE_ETH_CHAIN_ID=${VITE_ETH_CHAIN_ID} \ + VITE_WALLET_CONNECT_PROJECT_ID=${VITE_WALLET_CONNECT_PROJECT_ID} \ + VITE_INDEXER_ADDRESS=${VITE_INDEXER_ADDRESS} \ + DISABLE_ESLINT_PLUGIN=true + +WORKDIR /opt + +RUN pnpm install + +RUN pnpm build + +RUN npm install --global serve + +CMD ["serve", "-s", "/opt/dist"] diff --git a/frontend/README.md b/frontend/README.md new file mode 100644 index 00000000..00b820e4 --- /dev/null +++ b/frontend/README.md @@ -0,0 +1 @@ +# Vara Network Bridge diff --git a/frontend/codegen.ts b/frontend/codegen.ts new file mode 100644 index 00000000..501b6458 --- /dev/null +++ b/frontend/codegen.ts @@ -0,0 +1,23 @@ +import { CodegenConfig } from '@graphql-codegen/cli'; +import { loadEnv } from 'vite'; + +const config: CodegenConfig = { + schema: loadEnv('', process.cwd(), '').VITE_INDEXER_ADDRESS, + documents: ['src/**/*.{ts,tsx}'], + ignoreNoDocuments: true, // for better experience with the watcher + generates: { + './src/features/history/graphql/': { + preset: 'client', + plugins: [], + config: { + scalars: { + DateTime: 'string', // custom subsquid scalars + BigInt: 'string', + }, + avoidOptionals: true, + }, + }, + }, +}; + +export default config; diff --git a/frontend/index.html b/frontend/index.html new file mode 100644 index 00000000..86e4253a --- /dev/null +++ b/frontend/index.html @@ -0,0 +1,12 @@ + + + + + + Vara Network Bridge + + +
+ + + diff --git a/frontend/package.json b/frontend/package.json new file mode 100644 index 00000000..c788d920 --- /dev/null +++ b/frontend/package.json @@ -0,0 +1,59 @@ +{ + "name": "frontend", + "private": true, + "version": "0.0.1", + "type": "module", + "scripts": { + "start": "vite --open --port 3000", + "build": "tsc && vite build", + "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0", + "preview": "vite preview", + "codegen": "graphql-codegen" + }, + "dependencies": { + "@gear-js/api": "0.38.1", + "@gear-js/react-hooks": "0.10.7", + "@gear-js/vara-ui": "0.0.10", + "@hookform/resolvers": "3.3.4", + "@polkadot/api": "11.0.2", + "@polkadot/react-identicon": "3.6.5", + "@tanstack/react-query": "5.40.0", + "@web3modal/wagmi": "4.2.3", + "graphql": "16.8.1", + "graphql-request": "6.1.0", + "react": "18.2.0", + "react-dom": "18.2.0", + "react-hook-form": "7.51.3", + "react-number-format": "5.3.4", + "react-router-dom": "6.22.3", + "sails-js": "0.1.4", + "viem": "2.9.19", + "wagmi": "2.5.20", + "zod": "3.22.4" + }, + "devDependencies": { + "@graphql-codegen/cli": "5.0.2", + "@graphql-codegen/client-preset": "4.2.5", + "@graphql-typed-document-node/core": "3.2.0", + "@polkadot/types": "11.0.2", + "@types/react": "18.2.79", + "@types/react-dom": "18.2.25", + "@typescript-eslint/eslint-plugin": "7.7.0", + "@typescript-eslint/parser": "7.7.0", + "@vitejs/plugin-react": "4.2.1", + "eslint": "8.57.0", + "eslint-config-prettier": "9.1.0", + "eslint-import-resolver-typescript": "3.6.1", + "eslint-plugin-import": "2.29.1", + "eslint-plugin-jsx-a11y": "6.8.0", + "eslint-plugin-react": "7.34.1", + "eslint-plugin-react-hooks": "4.6.0", + "eslint-plugin-react-refresh": "0.4.6", + "sass": "1.75.0", + "typescript": "5.4.5", + "vite": "5.2.8", + "vite-plugin-checker": "0.6.4", + "vite-plugin-node-polyfills": "0.21.0", + "vite-plugin-svgr": "4.2.0" + } +} diff --git a/frontend/pnpm-lock.yaml b/frontend/pnpm-lock.yaml new file mode 100644 index 00000000..36fd8bdd --- /dev/null +++ b/frontend/pnpm-lock.yaml @@ -0,0 +1,15756 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@gear-js/api': + specifier: 0.38.1 + version: 0.38.1(@polkadot/api@11.0.2(bufferutil@4.0.8)(utf-8-validate@6.0.3))(@polkadot/wasm-crypto@7.3.2(@polkadot/util@12.6.2)(@polkadot/x-randomvalues@12.6.2(@polkadot/util@12.6.2)(@polkadot/wasm-util@7.3.2(@polkadot/util@12.6.2))))(rxjs@7.8.1) + '@gear-js/react-hooks': + specifier: 0.10.7 + version: 0.10.7(@gear-js/api@0.38.1(@polkadot/api@11.0.2(bufferutil@4.0.8)(utf-8-validate@6.0.3))(@polkadot/wasm-crypto@7.3.2(@polkadot/util@12.6.2)(@polkadot/x-randomvalues@12.6.2(@polkadot/util@12.6.2)(@polkadot/wasm-util@7.3.2(@polkadot/util@12.6.2))))(rxjs@7.8.1))(@polkadot/api@11.0.2(bufferutil@4.0.8)(utf-8-validate@6.0.3))(@polkadot/extension-dapp@0.46.5(@polkadot/api@11.0.2(bufferutil@4.0.8)(utf-8-validate@6.0.3))(@polkadot/util-crypto@12.6.2(@polkadot/util@12.6.2))(@polkadot/util@12.6.2)(bufferutil@4.0.8)(utf-8-validate@6.0.3))(bufferutil@4.0.8)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(utf-8-validate@6.0.3) + '@gear-js/vara-ui': + specifier: 0.0.10 + version: 0.0.10(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@hookform/resolvers': + specifier: 3.3.4 + version: 3.3.4(react-hook-form@7.51.3(react@18.2.0)) + '@polkadot/api': + specifier: 11.0.2 + version: 11.0.2(bufferutil@4.0.8)(utf-8-validate@6.0.3) + '@polkadot/react-identicon': + specifier: 3.6.5 + version: 3.6.5(@polkadot/keyring@12.6.2(@polkadot/util-crypto@12.6.2(@polkadot/util@12.6.2))(@polkadot/util@12.6.2))(@polkadot/networks@12.6.2)(@polkadot/util-crypto@12.6.2(@polkadot/util@12.6.2))(@polkadot/util@12.6.2)(react-dom@18.2.0(react@18.2.0))(react-is@18.2.0)(react@18.2.0) + '@tanstack/react-query': + specifier: 5.40.0 + version: 5.40.0(react@18.2.0) + '@web3modal/wagmi': + specifier: 4.2.3 + version: 4.2.3(@react-native-async-storage/async-storage@1.23.1(react-native@0.73.6(@babel/core@7.24.4)(@babel/preset-env@7.24.4(@babel/core@7.24.4))(bufferutil@4.0.8)(react@18.2.0)(utf-8-validate@6.0.3)))(@types/react@18.2.79)(@wagmi/connectors@4.1.26(@react-native-async-storage/async-storage@1.23.1(react-native@0.73.6(@babel/core@7.24.4)(@babel/preset-env@7.24.4(@babel/core@7.24.4))(bufferutil@4.0.8)(react@18.2.0)(utf-8-validate@6.0.3)))(@types/react@18.2.79)(@wagmi/core@2.6.17(@tanstack/query-core@5.40.0)(@types/react@18.2.79)(bufferutil@4.0.8)(react@18.2.0)(typescript@5.4.5)(utf-8-validate@6.0.3)(viem@2.9.19(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.22.4))(zod@3.22.4))(bufferutil@4.0.8)(react-dom@18.2.0(react@18.2.0))(react-native@0.73.6(@babel/core@7.24.4)(@babel/preset-env@7.24.4(@babel/core@7.24.4))(bufferutil@4.0.8)(react@18.2.0)(utf-8-validate@6.0.3))(react@18.2.0)(rollup@4.14.3)(typescript@5.4.5)(utf-8-validate@6.0.3)(viem@2.9.19(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.22.4))(zod@3.22.4))(@wagmi/core@2.6.17(@tanstack/query-core@5.40.0)(@types/react@18.2.79)(bufferutil@4.0.8)(react@18.2.0)(typescript@5.4.5)(utf-8-validate@6.0.3)(viem@2.9.19(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.22.4))(zod@3.22.4))(bufferutil@4.0.8)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(utf-8-validate@6.0.3)(viem@2.9.19(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.22.4)) + graphql: + specifier: 16.8.1 + version: 16.8.1 + graphql-request: + specifier: 6.1.0 + version: 6.1.0(graphql@16.8.1) + react: + specifier: 18.2.0 + version: 18.2.0 + react-dom: + specifier: 18.2.0 + version: 18.2.0(react@18.2.0) + react-hook-form: + specifier: 7.51.3 + version: 7.51.3(react@18.2.0) + react-number-format: + specifier: 5.3.4 + version: 5.3.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + react-router-dom: + specifier: 6.22.3 + version: 6.22.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + sails-js: + specifier: 0.1.4 + version: 0.1.4(@gear-js/api@0.38.1(@polkadot/api@11.0.2(bufferutil@4.0.8)(utf-8-validate@6.0.3))(@polkadot/wasm-crypto@7.3.2(@polkadot/util@12.6.2)(@polkadot/x-randomvalues@12.6.2(@polkadot/util@12.6.2)(@polkadot/wasm-util@7.3.2(@polkadot/util@12.6.2))))(rxjs@7.8.1))(@polkadot/api@11.0.2(bufferutil@4.0.8)(utf-8-validate@6.0.3))(@polkadot/types@11.0.2) + viem: + specifier: 2.9.19 + version: 2.9.19(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.22.4) + wagmi: + specifier: 2.5.20 + version: 2.5.20(@react-native-async-storage/async-storage@1.23.1(react-native@0.73.6(@babel/core@7.24.4)(@babel/preset-env@7.24.4(@babel/core@7.24.4))(bufferutil@4.0.8)(react@18.2.0)(utf-8-validate@6.0.3)))(@tanstack/query-core@5.40.0)(@tanstack/react-query@5.40.0(react@18.2.0))(@types/react@18.2.79)(bufferutil@4.0.8)(react-dom@18.2.0(react@18.2.0))(react-native@0.73.6(@babel/core@7.24.4)(@babel/preset-env@7.24.4(@babel/core@7.24.4))(bufferutil@4.0.8)(react@18.2.0)(utf-8-validate@6.0.3))(react@18.2.0)(rollup@4.14.3)(typescript@5.4.5)(utf-8-validate@6.0.3)(viem@2.9.19(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.22.4))(zod@3.22.4) + zod: + specifier: 3.22.4 + version: 3.22.4 + devDependencies: + '@graphql-codegen/cli': + specifier: 5.0.2 + version: 5.0.2(@parcel/watcher@2.4.1)(@types/node@20.12.7)(bufferutil@4.0.8)(graphql@16.8.1)(typescript@5.4.5)(utf-8-validate@6.0.3) + '@graphql-codegen/client-preset': + specifier: 4.2.5 + version: 4.2.5(graphql@16.8.1) + '@graphql-typed-document-node/core': + specifier: 3.2.0 + version: 3.2.0(graphql@16.8.1) + '@polkadot/types': + specifier: 11.0.2 + version: 11.0.2 + '@types/react': + specifier: 18.2.79 + version: 18.2.79 + '@types/react-dom': + specifier: 18.2.25 + version: 18.2.25 + '@typescript-eslint/eslint-plugin': + specifier: 7.7.0 + version: 7.7.0(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/parser': + specifier: 7.7.0 + version: 7.7.0(eslint@8.57.0)(typescript@5.4.5) + '@vitejs/plugin-react': + specifier: 4.2.1 + version: 4.2.1(vite@5.2.8(@types/node@20.12.7)(sass@1.75.0)(terser@5.30.3)) + eslint: + specifier: 8.57.0 + version: 8.57.0 + eslint-config-prettier: + specifier: 9.1.0 + version: 9.1.0(eslint@8.57.0) + eslint-import-resolver-typescript: + specifier: 3.6.1 + version: 3.6.1(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.4.5))(eslint-plugin-import@2.29.1)(eslint@8.57.0) + eslint-plugin-import: + specifier: 2.29.1 + version: 2.29.1(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + eslint-plugin-jsx-a11y: + specifier: 6.8.0 + version: 6.8.0(eslint@8.57.0) + eslint-plugin-react: + specifier: 7.34.1 + version: 7.34.1(eslint@8.57.0) + eslint-plugin-react-hooks: + specifier: 4.6.0 + version: 4.6.0(eslint@8.57.0) + eslint-plugin-react-refresh: + specifier: 0.4.6 + version: 0.4.6(eslint@8.57.0) + sass: + specifier: 1.75.0 + version: 1.75.0 + typescript: + specifier: 5.4.5 + version: 5.4.5 + vite: + specifier: 5.2.8 + version: 5.2.8(@types/node@20.12.7)(sass@1.75.0)(terser@5.30.3) + vite-plugin-checker: + specifier: 0.6.4 + version: 0.6.4(eslint@8.57.0)(optionator@0.9.3)(typescript@5.4.5)(vite@5.2.8(@types/node@20.12.7)(sass@1.75.0)(terser@5.30.3)) + vite-plugin-node-polyfills: + specifier: 0.21.0 + version: 0.21.0(rollup@4.14.3)(vite@5.2.8(@types/node@20.12.7)(sass@1.75.0)(terser@5.30.3)) + vite-plugin-svgr: + specifier: 4.2.0 + version: 4.2.0(rollup@4.14.3)(typescript@5.4.5)(vite@5.2.8(@types/node@20.12.7)(sass@1.75.0)(terser@5.30.3)) + +packages: + + '@aashutoshrathi/word-wrap@1.2.6': + resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} + engines: {node: '>=0.10.0'} + + '@adraffy/ens-normalize@1.10.0': + resolution: {integrity: sha512-nA9XHtlAkYfJxY7bce8DcN7eKxWWCWkU+1GR9d+U6MbNpfwQp8TI7vqOsBsMcHoT4mBu2kypKoSKnghEzOOq5Q==} + + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + + '@ardatan/relay-compiler@12.0.0': + resolution: {integrity: sha512-9anThAaj1dQr6IGmzBMcfzOQKTa5artjuPmw8NYK/fiGEMjADbSguBY2FMDykt+QhilR3wc9VA/3yVju7JHg7Q==} + hasBin: true + peerDependencies: + graphql: '*' + + '@ardatan/sync-fetch@0.0.1': + resolution: {integrity: sha512-xhlTqH0m31mnsG0tIP4ETgfSB6gXDaYYsUWTrlUV93fFQPI9dd8hE0Ot6MHLCtqgB32hwJAC3YZMWlXZw7AleA==} + engines: {node: '>=14'} + + '@babel/code-frame@7.24.2': + resolution: {integrity: sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.24.4': + resolution: {integrity: sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.24.4': + resolution: {integrity: sha512-MBVlMXP+kkl5394RBLSxxk/iLTeVGuXTV3cIDXavPpMMqnSnt6apKgan/U8O3USWZCWZT/TbgfEpKa4uMgN4Dg==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.24.4': + resolution: {integrity: sha512-Xd6+v6SnjWVx/nus+y0l1sxMOTOMBkyL4+BIdbALyatQnAe/SRVjANeDPSCYaX+i1iJmuGSKf3Z+E+V/va1Hvw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-annotate-as-pure@7.22.5': + resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-builder-binary-assignment-operator-visitor@7.22.15': + resolution: {integrity: sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.23.6': + resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-create-class-features-plugin@7.24.4': + resolution: {integrity: sha512-lG75yeuUSVu0pIcbhiYMXBXANHrpUPaOfu7ryAzskCgKUHuAxRQI5ssrtmF0X9UXldPlvT0XM/A4F44OXRt6iQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-create-regexp-features-plugin@7.22.15': + resolution: {integrity: sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-define-polyfill-provider@0.6.1': + resolution: {integrity: sha512-o7SDgTJuvx5vLKD6SFvkydkSMBvahDKGiNJzG22IZYXhiqoe9efY7zocICBgzHV4IRg5wdgl2nEL/tulKIEIbA==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + '@babel/helper-environment-visitor@7.22.20': + resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-function-name@7.23.0': + resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-hoist-variables@7.22.5': + resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-member-expression-to-functions@7.23.0': + resolution: {integrity: sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.24.3': + resolution: {integrity: sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.23.3': + resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-optimise-call-expression@7.22.5': + resolution: {integrity: sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-plugin-utils@7.24.0': + resolution: {integrity: sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==} + engines: {node: '>=6.9.0'} + + '@babel/helper-remap-async-to-generator@7.22.20': + resolution: {integrity: sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-replace-supers@7.24.1': + resolution: {integrity: sha512-QCR1UqC9BzG5vZl8BMicmZ28RuUBnHhAMddD8yHFHDRH9lLTZ9uUPehX8ctVPT8l0TKblJidqcgUUKGVrePleQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-simple-access@7.22.5': + resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} + engines: {node: '>=6.9.0'} + + '@babel/helper-skip-transparent-expression-wrappers@7.22.5': + resolution: {integrity: sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==} + engines: {node: '>=6.9.0'} + + '@babel/helper-split-export-declaration@7.22.6': + resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.24.1': + resolution: {integrity: sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.22.20': + resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.23.5': + resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-wrap-function@7.22.20': + resolution: {integrity: sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.24.4': + resolution: {integrity: sha512-FewdlZbSiwaVGlgT1DPANDuCHaDMiOo+D/IDYRFYjHOuv66xMSJ7fQwwODwRNAPkADIO/z1EoF/l2BCWlWABDw==} + engines: {node: '>=6.9.0'} + + '@babel/highlight@7.24.2': + resolution: {integrity: sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.24.4': + resolution: {integrity: sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.24.4': + resolution: {integrity: sha512-qpl6vOOEEzTLLcsuqYYo8yDtrTocmu2xkGvgNebvPjT9DTtfFYGmgDqY+rBYXNlqL4s9qLDn6xkrJv4RxAPiTA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.24.1': + resolution: {integrity: sha512-y4HqEnkelJIOQGd+3g1bTeKsA5c6qM7eOn7VggGVbBc0y8MLSKHacwcIE2PplNlQSj0PqS9rrXL/nkPVK+kUNg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.24.1': + resolution: {integrity: sha512-Hj791Ii4ci8HqnaKHAlLNs+zaLXb0EzSDhiAWp5VNlyvCNymYfacs64pxTxbH1znW/NcArSmwpmG9IKE/TUVVQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.13.0 + + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.24.1': + resolution: {integrity: sha512-m9m/fXsXLiHfwdgydIFnpk+7jlVbnvlK5B2EKiPdLUb6WX654ZaaEWJUjk8TftRbZpK0XibovlLWX4KIZhV6jw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-proposal-async-generator-functions@7.20.7': + resolution: {integrity: sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==} + 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-async-generator-functions instead. + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-proposal-class-properties@7.18.6': + 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 + + '@babel/plugin-proposal-export-default-from@7.24.1': + resolution: {integrity: sha512-+0hrgGGV3xyYIjOrD/bUZk/iUwOIGuoANfRfVg1cPhYBxF+TIXSEcc42DqzBICmWsnAQ+SfKedY0bj8QD+LuMg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-proposal-nullish-coalescing-operator@7.18.6': + 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 + + '@babel/plugin-proposal-numeric-separator@7.18.6': + 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 + + '@babel/plugin-proposal-object-rest-spread@7.20.7': + resolution: {integrity: sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==} + 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-object-rest-spread instead. + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-proposal-optional-catch-binding@7.18.6': + resolution: {integrity: sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==} + 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-catch-binding instead. + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-proposal-optional-chaining@7.21.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 + + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2': + resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-async-generators@7.8.4': + resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-class-properties@7.12.13': + resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-class-static-block@7.14.5': + resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-dynamic-import@7.8.3': + resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-export-default-from@7.24.1': + resolution: {integrity: sha512-cNXSxv9eTkGUtd0PsNMK8Yx5xeScxfpWOUAxE+ZPAXXEcAMOC3fk7LRdXq5fvpra2pLx2p1YtkAhpUbB2SwaRA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-export-namespace-from@7.8.3': + resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-flow@7.24.1': + resolution: {integrity: sha512-sxi2kLTI5DeW5vDtMUsk4mTPwvlUDbjOnoWayhynCwrw4QXRld4QEYwqzY8JmQXaJUtgUuCIurtSRH5sn4c7mA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-assertions@7.24.1': + resolution: {integrity: sha512-IuwnI5XnuF189t91XbxmXeCDz3qs6iDRO7GJ++wcfgeXNs/8FmIlKcpDSXNVyuLQxlwvskmI3Ct73wUODkJBlQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-attributes@7.24.1': + resolution: {integrity: sha512-zhQTMH0X2nVLnb04tz+s7AMuasX8U0FnpE+nHTOhSOINjWMnopoZTxtIKsd45n4GQ/HIZLyfIpoul8e2m0DnRA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-meta@7.10.4': + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-json-strings@7.8.3': + resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-jsx@7.24.1': + resolution: {integrity: sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-logical-assignment-operators@7.10.4': + resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3': + resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-numeric-separator@7.10.4': + resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-object-rest-spread@7.8.3': + resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-optional-catch-binding@7.8.3': + resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-optional-chaining@7.8.3': + resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-private-property-in-object@7.14.5': + resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-top-level-await@7.14.5': + resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-typescript@7.24.1': + resolution: {integrity: sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-unicode-sets-regex@7.18.6': + resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-transform-arrow-functions@7.24.1': + resolution: {integrity: sha512-ngT/3NkRhsaep9ck9uj2Xhv9+xB1zShY3tM3g6om4xxCELwCDN4g4Aq5dRn48+0hasAql7s2hdBOysCfNpr4fw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-async-generator-functions@7.24.3': + resolution: {integrity: sha512-Qe26CMYVjpQxJ8zxM1340JFNjZaF+ISWpr1Kt/jGo+ZTUzKkfw/pphEWbRCb+lmSM6k/TOgfYLvmbHkUQ0asIg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-async-to-generator@7.24.1': + resolution: {integrity: sha512-AawPptitRXp1y0n4ilKcGbRYWfbbzFWz2NqNu7dacYDtFtz0CMjG64b3LQsb3KIgnf4/obcUL78hfaOS7iCUfw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-block-scoped-functions@7.24.1': + resolution: {integrity: sha512-TWWC18OShZutrv9C6mye1xwtam+uNi2bnTOCBUd5sZxyHOiWbU6ztSROofIMrK84uweEZC219POICK/sTYwfgg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-block-scoping@7.24.4': + resolution: {integrity: sha512-nIFUZIpGKDf9O9ttyRXpHFpKC+X3Y5mtshZONuEUYBomAKoM4y029Jr+uB1bHGPhNmK8YXHevDtKDOLmtRrp6g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-class-properties@7.24.1': + resolution: {integrity: sha512-OMLCXi0NqvJfORTaPQBwqLXHhb93wkBKZ4aNwMl6WtehO7ar+cmp+89iPEQPqxAnxsOKTaMcs3POz3rKayJ72g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-class-static-block@7.24.4': + resolution: {integrity: sha512-B8q7Pz870Hz/q9UgP8InNpY01CSLDSCyqX7zcRuv3FcPl87A2G17lASroHWaCtbdIcbYzOZ7kWmXFKbijMSmFg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.12.0 + + '@babel/plugin-transform-classes@7.24.1': + resolution: {integrity: sha512-ZTIe3W7UejJd3/3R4p7ScyyOoafetUShSf4kCqV0O7F/RiHxVj/wRaRnQlrGwflvcehNA8M42HkAiEDYZu2F1Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-computed-properties@7.24.1': + resolution: {integrity: sha512-5pJGVIUfJpOS+pAqBQd+QMaTD2vCL/HcePooON6pDpHgRp4gNRmzyHTPIkXntwKsq3ayUFVfJaIKPw2pOkOcTw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-destructuring@7.24.1': + resolution: {integrity: sha512-ow8jciWqNxR3RYbSNVuF4U2Jx130nwnBnhRw6N6h1bOejNkABmcI5X5oz29K4alWX7vf1C+o6gtKXikzRKkVdw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-dotall-regex@7.24.1': + resolution: {integrity: sha512-p7uUxgSoZwZ2lPNMzUkqCts3xlp8n+o05ikjy7gbtFJSt9gdU88jAmtfmOxHM14noQXBxfgzf2yRWECiNVhTCw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-duplicate-keys@7.24.1': + resolution: {integrity: sha512-msyzuUnvsjsaSaocV6L7ErfNsa5nDWL1XKNnDePLgmz+WdU4w/J8+AxBMrWfi9m4IxfL5sZQKUPQKDQeeAT6lA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-dynamic-import@7.24.1': + resolution: {integrity: sha512-av2gdSTyXcJVdI+8aFZsCAtR29xJt0S5tas+Ef8NvBNmD1a+N/3ecMLeMBgfcK+xzsjdLDT6oHt+DFPyeqUbDA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-exponentiation-operator@7.24.1': + resolution: {integrity: sha512-U1yX13dVBSwS23DEAqU+Z/PkwE9/m7QQy8Y9/+Tdb8UWYaGNDYwTLi19wqIAiROr8sXVum9A/rtiH5H0boUcTw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-export-namespace-from@7.24.1': + resolution: {integrity: sha512-Ft38m/KFOyzKw2UaJFkWG9QnHPG/Q/2SkOrRk4pNBPg5IPZ+dOxcmkK5IyuBcxiNPyyYowPGUReyBvrvZs7IlQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-flow-strip-types@7.24.1': + resolution: {integrity: sha512-iIYPIWt3dUmUKKE10s3W+jsQ3icFkw0JyRVyY1B7G4yK/nngAOHLVx8xlhA6b/Jzl/Y0nis8gjqhqKtRDQqHWQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-for-of@7.24.1': + resolution: {integrity: sha512-OxBdcnF04bpdQdR3i4giHZNZQn7cm8RQKcSwA17wAAqEELo1ZOwp5FFgeptWUQXFyT9kwHo10aqqauYkRZPCAg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-function-name@7.24.1': + resolution: {integrity: sha512-BXmDZpPlh7jwicKArQASrj8n22/w6iymRnvHYYd2zO30DbE277JO20/7yXJT3QxDPtiQiOxQBbZH4TpivNXIxA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-json-strings@7.24.1': + resolution: {integrity: sha512-U7RMFmRvoasscrIFy5xA4gIp8iWnWubnKkKuUGJjsuOH7GfbMkB+XZzeslx2kLdEGdOJDamEmCqOks6e8nv8DQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-literals@7.24.1': + resolution: {integrity: sha512-zn9pwz8U7nCqOYIiBaOxoQOtYmMODXTJnkxG4AtX8fPmnCRYWBOHD0qcpwS9e2VDSp1zNJYpdnFMIKb8jmwu6g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-logical-assignment-operators@7.24.1': + resolution: {integrity: sha512-OhN6J4Bpz+hIBqItTeWJujDOfNP+unqv/NJgyhlpSqgBTPm37KkMmZV6SYcOj+pnDbdcl1qRGV/ZiIjX9Iy34w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-member-expression-literals@7.24.1': + resolution: {integrity: sha512-4ojai0KysTWXzHseJKa1XPNXKRbuUrhkOPY4rEGeR+7ChlJVKxFa3H3Bz+7tWaGKgJAXUWKOGmltN+u9B3+CVg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-amd@7.24.1': + resolution: {integrity: sha512-lAxNHi4HVtjnHd5Rxg3D5t99Xm6H7b04hUS7EHIXcUl2EV4yl1gWdqZrNzXnSrHveL9qMdbODlLF55mvgjAfaQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-commonjs@7.24.1': + resolution: {integrity: sha512-szog8fFTUxBfw0b98gEWPaEqF42ZUD/T3bkynW/wtgx2p/XCP55WEsb+VosKceRSd6njipdZvNogqdtI4Q0chw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-systemjs@7.24.1': + resolution: {integrity: sha512-mqQ3Zh9vFO1Tpmlt8QPnbwGHzNz3lpNEMxQb1kAemn/erstyqw1r9KeOlOfo3y6xAnFEcOv2tSyrXfmMk+/YZA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-umd@7.24.1': + resolution: {integrity: sha512-tuA3lpPj+5ITfcCluy6nWonSL7RvaG0AOTeAuvXqEKS34lnLzXpDb0dcP6K8jD0zWZFNDVly90AGFJPnm4fOYg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-named-capturing-groups-regex@7.22.5': + resolution: {integrity: sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-transform-new-target@7.24.1': + resolution: {integrity: sha512-/rurytBM34hYy0HKZQyA0nHbQgQNFm4Q/BOc9Hflxi2X3twRof7NaE5W46j4kQitm7SvACVRXsa6N/tSZxvPug==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-nullish-coalescing-operator@7.24.1': + resolution: {integrity: sha512-iQ+caew8wRrhCikO5DrUYx0mrmdhkaELgFa+7baMcVuhxIkN7oxt06CZ51D65ugIb1UWRQ8oQe+HXAVM6qHFjw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-numeric-separator@7.24.1': + resolution: {integrity: sha512-7GAsGlK4cNL2OExJH1DzmDeKnRv/LXq0eLUSvudrehVA5Rgg4bIrqEUW29FbKMBRT0ztSqisv7kjP+XIC4ZMNw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-object-rest-spread@7.24.1': + resolution: {integrity: sha512-XjD5f0YqOtebto4HGISLNfiNMTTs6tbkFf2TOqJlYKYmbo+mN9Dnpl4SRoofiziuOWMIyq3sZEUqLo3hLITFEA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-object-super@7.24.1': + resolution: {integrity: sha512-oKJqR3TeI5hSLRxudMjFQ9re9fBVUU0GICqM3J1mi8MqlhVr6hC/ZN4ttAyMuQR6EZZIY6h/exe5swqGNNIkWQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-optional-catch-binding@7.24.1': + resolution: {integrity: sha512-oBTH7oURV4Y+3EUrf6cWn1OHio3qG/PVwO5J03iSJmBg6m2EhKjkAu/xuaXaYwWW9miYtvbWv4LNf0AmR43LUA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-optional-chaining@7.24.1': + resolution: {integrity: sha512-n03wmDt+987qXwAgcBlnUUivrZBPZ8z1plL0YvgQalLm+ZE5BMhGm94jhxXtA1wzv1Cu2aaOv1BM9vbVttrzSg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-parameters@7.24.1': + resolution: {integrity: sha512-8Jl6V24g+Uw5OGPeWNKrKqXPDw2YDjLc53ojwfMcKwlEoETKU9rU0mHUtcg9JntWI/QYzGAXNWEcVHZ+fR+XXg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-private-methods@7.24.1': + resolution: {integrity: sha512-tGvisebwBO5em4PaYNqt4fkw56K2VALsAbAakY0FjTYqJp7gfdrgr7YX76Or8/cpik0W6+tj3rZ0uHU9Oil4tw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-private-property-in-object@7.24.1': + resolution: {integrity: sha512-pTHxDVa0BpUbvAgX3Gat+7cSciXqUcY9j2VZKTbSB6+VQGpNgNO9ailxTGHSXlqOnX1Hcx1Enme2+yv7VqP9bg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-property-literals@7.24.1': + resolution: {integrity: sha512-LetvD7CrHmEx0G442gOomRr66d7q8HzzGGr4PMHGr+5YIm6++Yke+jxj246rpvsbyhJwCLxcTn6zW1P1BSenqA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-display-name@7.24.1': + resolution: {integrity: sha512-mvoQg2f9p2qlpDQRBC7M3c3XTr0k7cp/0+kFKKO/7Gtu0LSw16eKB+Fabe2bDT/UpsyasTBBkAnbdsLrkD5XMw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx-self@7.24.1': + resolution: {integrity: sha512-kDJgnPujTmAZ/9q2CN4m2/lRsUUPDvsG3+tSHWUJIzMGTt5U/b/fwWd3RO3n+5mjLrsBrVa5eKFRVSQbi3dF1w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx-source@7.24.1': + resolution: {integrity: sha512-1v202n7aUq4uXAieRTKcwPzNyphlCuqHHDcdSNc+vdhoTEZcFMh+L5yZuCmGaIO7bs1nJUNfHB89TZyoL48xNA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx@7.23.4': + resolution: {integrity: sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-regenerator@7.24.1': + resolution: {integrity: sha512-sJwZBCzIBE4t+5Q4IGLaaun5ExVMRY0lYwos/jNecjMrVCygCdph3IKv0tkP5Fc87e/1+bebAmEAGBfnRD+cnw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-reserved-words@7.24.1': + resolution: {integrity: sha512-JAclqStUfIwKN15HrsQADFgeZt+wexNQ0uLhuqvqAUFoqPMjEcFCYZBhq0LUdz6dZK/mD+rErhW71fbx8RYElg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-runtime@7.24.3': + resolution: {integrity: sha512-J0BuRPNlNqlMTRJ72eVptpt9VcInbxO6iP3jaxr+1NPhC0UkKL+6oeX6VXMEYdADnuqmMmsBspt4d5w8Y/TCbQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-shorthand-properties@7.24.1': + resolution: {integrity: sha512-LyjVB1nsJ6gTTUKRjRWx9C1s9hE7dLfP/knKdrfeH9UPtAGjYGgxIbFfx7xyLIEWs7Xe1Gnf8EWiUqfjLhInZA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-spread@7.24.1': + resolution: {integrity: sha512-KjmcIM+fxgY+KxPVbjelJC6hrH1CgtPmTvdXAfn3/a9CnWGSTY7nH4zm5+cjmWJybdcPSsD0++QssDsjcpe47g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-sticky-regex@7.24.1': + resolution: {integrity: sha512-9v0f1bRXgPVcPrngOQvLXeGNNVLc8UjMVfebo9ka0WF3/7+aVUHmaJVT3sa0XCzEFioPfPHZiOcYG9qOsH63cw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-template-literals@7.24.1': + resolution: {integrity: sha512-WRkhROsNzriarqECASCNu/nojeXCDTE/F2HmRgOzi7NGvyfYGq1NEjKBK3ckLfRgGc6/lPAqP0vDOSw3YtG34g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-typeof-symbol@7.24.1': + resolution: {integrity: sha512-CBfU4l/A+KruSUoW+vTQthwcAdwuqbpRNB8HQKlZABwHRhsdHZ9fezp4Sn18PeAlYxTNiLMlx4xUBV3AWfg1BA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-typescript@7.24.4': + resolution: {integrity: sha512-79t3CQ8+oBGk/80SQ8MN3Bs3obf83zJ0YZjDmDaEZN8MqhMI760apl5z6a20kFeMXBwJX99VpKT8CKxEBp5H1g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-escapes@7.24.1': + resolution: {integrity: sha512-RlkVIcWT4TLI96zM660S877E7beKlQw7Ig+wqkKBiWfj0zH5Q4h50q6er4wzZKRNSYpfo6ILJ+hrJAGSX2qcNw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-property-regex@7.24.1': + resolution: {integrity: sha512-Ss4VvlfYV5huWApFsF8/Sq0oXnGO+jB+rijFEFugTd3cwSObUSnUi88djgR5528Csl0uKlrI331kRqe56Ov2Ng==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-regex@7.24.1': + resolution: {integrity: sha512-2A/94wgZgxfTsiLaQ2E36XAOdcZmGAaEEgVmxQWwZXWkGhvoHbaqXcKnU8zny4ycpu3vNqg0L/PcCiYtHtA13g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-sets-regex@7.24.1': + resolution: {integrity: sha512-fqj4WuzzS+ukpgerpAoOnMfQXwUHFxXUZUE84oL2Kao2N8uSlvcpnAidKASgsNgzZHBsHWvcm8s9FPWUhAb8fA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/preset-env@7.24.4': + resolution: {integrity: sha512-7Kl6cSmYkak0FK/FXjSEnLJ1N9T/WA2RkMhu17gZ/dsxKJUuTYNIylahPTzqpLyJN4WhDif8X0XK1R8Wsguo/A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/preset-flow@7.24.1': + resolution: {integrity: sha512-sWCV2G9pcqZf+JHyv/RyqEIpFypxdCSxWIxQjpdaQxenNog7cN1pr76hg8u0Fz8Qgg0H4ETkGcJnXL8d4j0PPA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/preset-modules@0.1.6-no-external-plugins': + 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 + + '@babel/preset-typescript@7.24.1': + resolution: {integrity: sha512-1DBaMmRDpuYQBPWD8Pf/WEwCrtgRHxsZnP4mIy9G/X+hFfbI47Q2G4t1Paakld84+qsk2fSsUPMKg71jkoOOaQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/register@7.23.7': + resolution: {integrity: sha512-EjJeB6+kvpk+Y5DAkEAmbOBEFkh9OASx0huoEkqYTFxAZHzOAX2Oh5uwAUuL2rUddqfM0SA+KPXV2TbzoZ2kvQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/regjsgen@0.8.0': + resolution: {integrity: sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==} + + '@babel/runtime@7.24.4': + resolution: {integrity: sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA==} + engines: {node: '>=6.9.0'} + + '@babel/template@7.24.0': + resolution: {integrity: sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.24.1': + resolution: {integrity: sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.24.0': + resolution: {integrity: sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==} + engines: {node: '>=6.9.0'} + + '@coinbase/wallet-sdk@3.9.1': + resolution: {integrity: sha512-cGUE8wm1/cMI8irRMVOqbFWYcnNugqCtuy2lnnHfgloBg+GRLs9RsrkOUDMdv/StfUeeKhCDyYudsXXvcL1xIA==} + + '@discoveryjs/json-ext@0.5.7': + resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==} + engines: {node: '>=10.0.0'} + + '@emotion/babel-plugin@11.11.0': + resolution: {integrity: sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==} + + '@emotion/cache@11.11.0': + resolution: {integrity: sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==} + + '@emotion/hash@0.9.1': + resolution: {integrity: sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==} + + '@emotion/is-prop-valid@1.2.1': + resolution: {integrity: sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw==} + + '@emotion/is-prop-valid@1.2.2': + resolution: {integrity: sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==} + + '@emotion/memoize@0.8.1': + resolution: {integrity: sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==} + + '@emotion/react@11.11.4': + resolution: {integrity: sha512-t8AjMlF0gHpvvxk5mAtCqR4vmxiGHCeJBaQO6gncUSdklELOgtwjerNY2yuJNfwnc6vi16U/+uMF+afIawJ9iw==} + peerDependencies: + '@types/react': '*' + react: '>=16.8.0' + peerDependenciesMeta: + '@types/react': + optional: true + + '@emotion/serialize@1.1.4': + resolution: {integrity: sha512-RIN04MBT8g+FnDwgvIUi8czvr1LU1alUMI05LekWB5DGyTm8cCBMCRpq3GqaiyEDRptEXOyXnvZ58GZYu4kBxQ==} + + '@emotion/sheet@1.2.2': + resolution: {integrity: sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==} + + '@emotion/styled@11.11.5': + resolution: {integrity: sha512-/ZjjnaNKvuMPxcIiUkf/9SHoG4Q196DRl1w82hQ3WCsjo1IUR8uaGWrC6a87CrYAW0Kb/pK7hk8BnLgLRi9KoQ==} + peerDependencies: + '@emotion/react': ^11.0.0-rc.0 + '@types/react': '*' + react: '>=16.8.0' + peerDependenciesMeta: + '@types/react': + optional: true + + '@emotion/unitless@0.8.0': + resolution: {integrity: sha512-VINS5vEYAscRl2ZUDiT3uMPlrFQupiKgHz5AA4bCH1miKBg4qtwkim1qPmJj/4WG6TreYMY111rEFsjupcOKHw==} + + '@emotion/unitless@0.8.1': + resolution: {integrity: sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==} + + '@emotion/use-insertion-effect-with-fallbacks@1.0.1': + resolution: {integrity: sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==} + peerDependencies: + react: '>=16.8.0' + + '@emotion/utils@1.2.1': + resolution: {integrity: sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==} + + '@emotion/weak-memoize@0.3.1': + resolution: {integrity: sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==} + + '@esbuild/aix-ppc64@0.20.2': + resolution: {integrity: sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.20.2': + resolution: {integrity: sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.20.2': + resolution: {integrity: sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.20.2': + resolution: {integrity: sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.20.2': + resolution: {integrity: sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.20.2': + resolution: {integrity: sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.20.2': + resolution: {integrity: sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.20.2': + resolution: {integrity: sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.20.2': + resolution: {integrity: sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.20.2': + resolution: {integrity: sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.20.2': + resolution: {integrity: sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.20.2': + resolution: {integrity: sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.20.2': + resolution: {integrity: sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.20.2': + resolution: {integrity: sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.20.2': + resolution: {integrity: sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.20.2': + resolution: {integrity: sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.20.2': + resolution: {integrity: sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-x64@0.20.2': + resolution: {integrity: sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-x64@0.20.2': + resolution: {integrity: sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.20.2': + resolution: {integrity: sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.20.2': + resolution: {integrity: sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.20.2': + resolution: {integrity: sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.20.2': + resolution: {integrity: sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@eslint-community/eslint-utils@4.4.0': + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.10.0': + resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/eslintrc@2.1.4': + resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@eslint/js@8.57.0': + resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@ethereumjs/common@3.2.0': + resolution: {integrity: sha512-pksvzI0VyLgmuEF2FA/JR/4/y6hcPq8OUail3/AvycBaW1d5VSauOZzqGvJ3RTmR4MU35lWE8KseKOsEhrFRBA==} + + '@ethereumjs/rlp@4.0.1': + resolution: {integrity: sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw==} + engines: {node: '>=14'} + hasBin: true + + '@ethereumjs/tx@4.2.0': + resolution: {integrity: sha512-1nc6VO4jtFd172BbSnTnDQVr9IYBFl1y4xPzZdtkrkKIncBCkdbgfdRV+MiTkJYAtTxvV12GRZLqBFT1PNK6Yw==} + engines: {node: '>=14'} + + '@ethereumjs/util@8.1.0': + resolution: {integrity: sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA==} + engines: {node: '>=14'} + + '@gear-js/api@0.38.1': + resolution: {integrity: sha512-SghbC+9Jc5YsNjuO/I3cHMlBXkUZK8OgpI7bXyP3fetQo/Ls4/cgv4JD/XX2S7Y/UpG+gSdSEXaxpU1g7OYK7A==} + peerDependencies: + '@polkadot/api': 11.0.2 + '@polkadot/wasm-crypto': 7.3.2 + rxjs: 7.8.1 + + '@gear-js/react-hooks@0.10.7': + resolution: {integrity: sha512-Bmm5AoFvrfYzR3MTSDsCM/ibhOB8471gJH5T14yyJOP6l8YjFiDqLj1ohF1hjyJeYe1EfGwhlvO45AJuDTLGrA==} + peerDependencies: + '@gear-js/api': 0.38.1 + '@polkadot/api': 11.0.2 + '@polkadot/extension-dapp': 0.46.5 + react: 18.2.0 + react-dom: 18.2.0 + + '@gear-js/vara-ui@0.0.10': + resolution: {integrity: sha512-5f6FamMaRNM1uF6X8qZwVVf5p/tS0S8/0x+O/wr+2bnDL4qlK+kBhhhuGzIyBATFoEDOo1fKvEriHnuOFw/GSA==} + peerDependencies: + react: ^18.2.0 + react-dom: ^18.2.0 + + '@graphql-codegen/add@5.0.2': + resolution: {integrity: sha512-ouBkSvMFUhda5VoKumo/ZvsZM9P5ZTyDsI8LW18VxSNWOjrTeLXBWHG8Gfaai0HwhflPtCYVABbriEcOmrRShQ==} + peerDependencies: + graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 + + '@graphql-codegen/cli@5.0.2': + resolution: {integrity: sha512-MBIaFqDiLKuO4ojN6xxG9/xL9wmfD3ZjZ7RsPjwQnSHBCUXnEkdKvX+JVpx87Pq29Ycn8wTJUguXnTZ7Di0Mlw==} + hasBin: true + peerDependencies: + '@parcel/watcher': ^2.1.0 + graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 + peerDependenciesMeta: + '@parcel/watcher': + optional: true + + '@graphql-codegen/client-preset@4.2.5': + resolution: {integrity: sha512-hAdB6HN8EDmkoBtr0bPUN/7NH6svzqbcTDMWBCRXPESXkl7y80po+IXrXUjsSrvhKG8xkNXgJNz/2mjwHzywcA==} + peerDependencies: + graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 + + '@graphql-codegen/core@4.0.2': + resolution: {integrity: sha512-IZbpkhwVqgizcjNiaVzNAzm/xbWT6YnGgeOLwVjm4KbJn3V2jchVtuzHH09G5/WkkLSk2wgbXNdwjM41JxO6Eg==} + peerDependencies: + graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 + + '@graphql-codegen/gql-tag-operations@4.0.6': + resolution: {integrity: sha512-y6iXEDpDNjwNxJw3WZqX1/Znj0QHW7+y8O+t2V8qvbTT+3kb2lr9ntc8By7vCr6ctw9tXI4XKaJgpTstJDOwFA==} + peerDependencies: + graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 + + '@graphql-codegen/plugin-helpers@5.0.3': + resolution: {integrity: sha512-yZ1rpULIWKBZqCDlvGIJRSyj1B2utkEdGmXZTBT/GVayP4hyRYlkd36AJV/LfEsVD8dnsKL5rLz2VTYmRNlJ5Q==} + peerDependencies: + graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 + + '@graphql-codegen/schema-ast@4.0.2': + resolution: {integrity: sha512-5mVAOQQK3Oz7EtMl/l3vOQdc2aYClUzVDHHkMvZlunc+KlGgl81j8TLa+X7ANIllqU4fUEsQU3lJmk4hXP6K7Q==} + peerDependencies: + graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 + + '@graphql-codegen/typed-document-node@5.0.6': + resolution: {integrity: sha512-US0J95hOE2/W/h42w4oiY+DFKG7IetEN1mQMgXXeat1w6FAR5PlIz4JrRrEkiVfVetZ1g7K78SOwBD8/IJnDiA==} + peerDependencies: + graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 + + '@graphql-codegen/typescript-operations@4.2.0': + resolution: {integrity: sha512-lmuwYb03XC7LNRS8oo9M4/vlOrq/wOKmTLBHlltK2YJ1BO/4K/Q9Jdv/jDmJpNydHVR1fmeF4wAfsIp1f9JibA==} + peerDependencies: + graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 + + '@graphql-codegen/typescript@4.0.6': + resolution: {integrity: sha512-IBG4N+Blv7KAL27bseruIoLTjORFCT3r+QYyMC3g11uY3/9TPpaUyjSdF70yBe5GIQ6dAgDU+ENUC1v7EPi0rw==} + peerDependencies: + graphql: ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 + + '@graphql-codegen/visitor-plugin-common@5.1.0': + resolution: {integrity: sha512-eamQxtA9bjJqI2lU5eYoA1GbdMIRT2X8m8vhWYsVQVWD3qM7sx/IqJU0kx0J3Vd4/CSd36BzL6RKwksibytDIg==} + peerDependencies: + graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 + + '@graphql-tools/apollo-engine-loader@8.0.1': + resolution: {integrity: sha512-NaPeVjtrfbPXcl+MLQCJLWtqe2/E4bbAqcauEOQ+3sizw1Fc2CNmhHRF8a6W4D0ekvTRRXAMptXYgA2uConbrA==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + + '@graphql-tools/batch-execute@9.0.4': + resolution: {integrity: sha512-kkebDLXgDrep5Y0gK1RN3DMUlLqNhg60OAz0lTCqrYeja6DshxLtLkj+zV4mVbBA4mQOEoBmw6g1LZs3dA84/w==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + + '@graphql-tools/code-file-loader@8.1.1': + resolution: {integrity: sha512-q4KN25EPSUztc8rA8YUU3ufh721Yk12xXDbtUA+YstczWS7a1RJlghYMFEfR1HsHSYbF7cUqkbnTKSGM3o52bQ==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + + '@graphql-tools/delegate@10.0.9': + resolution: {integrity: sha512-H+jGPLB0X23wlslw1JuB3y5j35NwZLUGhmjgaLYKkquAI/rtcs4+UwoW3hZ4SCN7h2LAKDa6HhsYYCRXyhdePA==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + + '@graphql-tools/documents@1.0.0': + resolution: {integrity: sha512-rHGjX1vg/nZ2DKqRGfDPNC55CWZBMldEVcH+91BThRa6JeT80NqXknffLLEZLRUxyikCfkwMsk6xR3UNMqG0Rg==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + + '@graphql-tools/executor-graphql-ws@1.1.2': + resolution: {integrity: sha512-+9ZK0rychTH1LUv4iZqJ4ESbmULJMTsv3XlFooPUngpxZkk00q6LqHKJRrsLErmQrVaC7cwQCaRBJa0teK17Lg==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + + '@graphql-tools/executor-http@1.0.9': + resolution: {integrity: sha512-+NXaZd2MWbbrWHqU4EhXcrDbogeiCDmEbrAN+rMn4Nu2okDjn2MTFDbTIab87oEubQCH4Te1wDkWPKrzXup7+Q==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + + '@graphql-tools/executor-legacy-ws@1.0.6': + resolution: {integrity: sha512-lDSxz9VyyquOrvSuCCnld3256Hmd+QI2lkmkEv7d4mdzkxkK4ddAWW1geQiWrQvWmdsmcnGGlZ7gDGbhEExwqg==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + + '@graphql-tools/executor@1.2.6': + resolution: {integrity: sha512-+1kjfqzM5T2R+dCw7F4vdJ3CqG+fY/LYJyhNiWEFtq0ToLwYzR/KKyD8YuzTirEjSxWTVlcBh7endkx5n5F6ew==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + + '@graphql-tools/git-loader@8.0.5': + resolution: {integrity: sha512-P97/1mhruDiA6D5WUmx3n/aeGPLWj2+4dpzDOxFGGU+z9NcI/JdygMkeFpGZNHeJfw+kHfxgPcMPnxHcyhAoVA==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + + '@graphql-tools/github-loader@8.0.1': + resolution: {integrity: sha512-W4dFLQJ5GtKGltvh/u1apWRFKBQOsDzFxO9cJkOYZj1VzHCpRF43uLST4VbCfWve+AwBqOuKr7YgkHoxpRMkcg==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + + '@graphql-tools/graphql-file-loader@8.0.1': + resolution: {integrity: sha512-7gswMqWBabTSmqbaNyWSmRRpStWlcCkBc73E6NZNlh4YNuiyKOwbvSkOUYFOqFMfEL+cFsXgAvr87Vz4XrYSbA==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + + '@graphql-tools/graphql-tag-pluck@8.3.0': + resolution: {integrity: sha512-gNqukC+s7iHC7vQZmx1SEJQmLnOguBq+aqE2zV2+o1hxkExvKqyFli1SY/9gmukFIKpKutCIj+8yLOM+jARutw==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + + '@graphql-tools/import@7.0.1': + resolution: {integrity: sha512-935uAjAS8UAeXThqHfYVr4HEAp6nHJ2sximZKO1RzUTq5WoALMAhhGARl0+ecm6X+cqNUwIChJbjtaa6P/ML0w==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + + '@graphql-tools/json-file-loader@8.0.1': + resolution: {integrity: sha512-lAy2VqxDAHjVyqeJonCP6TUemrpYdDuKt25a10X6zY2Yn3iFYGnuIDQ64cv3ytyGY6KPyPB+Kp+ZfOkNDG3FQA==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + + '@graphql-tools/load@8.0.2': + resolution: {integrity: sha512-S+E/cmyVmJ3CuCNfDuNF2EyovTwdWfQScXv/2gmvJOti2rGD8jTt9GYVzXaxhblLivQR9sBUCNZu/w7j7aXUCA==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + + '@graphql-tools/merge@9.0.4': + resolution: {integrity: sha512-MivbDLUQ+4Q8G/Hp/9V72hbn810IJDEZQ57F01sHnlrrijyadibfVhaQfW/pNH+9T/l8ySZpaR/DpL5i+ruZ+g==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + + '@graphql-tools/optimize@2.0.0': + resolution: {integrity: sha512-nhdT+CRGDZ+bk68ic+Jw1OZ99YCDIKYA5AlVAnBHJvMawSx9YQqQAIj4refNc1/LRieGiuWvhbG3jvPVYho0Dg==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + + '@graphql-tools/prisma-loader@8.0.4': + resolution: {integrity: sha512-hqKPlw8bOu/GRqtYr0+dINAI13HinTVYBDqhwGAPIFmLr5s+qKskzgCiwbsckdrb5LWVFmVZc+UXn80OGiyBzg==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + + '@graphql-tools/relay-operation-optimizer@7.0.1': + resolution: {integrity: sha512-y0ZrQ/iyqWZlsS/xrJfSir3TbVYJTYmMOu4TaSz6F4FRDTQ3ie43BlKkhf04rC28pnUOS4BO9pDcAo1D30l5+A==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + + '@graphql-tools/schema@10.0.3': + resolution: {integrity: sha512-p28Oh9EcOna6i0yLaCFOnkcBDQECVf3SCexT6ktb86QNj9idnkhI+tCxnwZDh58Qvjd2nURdkbevvoZkvxzCog==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + + '@graphql-tools/url-loader@8.0.2': + resolution: {integrity: sha512-1dKp2K8UuFn7DFo1qX5c1cyazQv2h2ICwA9esHblEqCYrgf69Nk8N7SODmsfWg94OEaI74IqMoM12t7eIGwFzQ==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + + '@graphql-tools/utils@10.2.0': + resolution: {integrity: sha512-HYV7dO6pNA2nGKawygaBpk8y+vXOUjjzzO43W/Kb7EPRmXUEQKjHxPYRvQbiF72u1N3XxwGK5jnnFk9WVhUwYw==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + + '@graphql-tools/wrap@10.0.5': + resolution: {integrity: sha512-Cbr5aYjr3HkwdPvetZp1cpDWTGdD1Owgsb3z/ClzhmrboiK86EnQDxDvOJiQkDCPWE9lNBwj8Y4HfxroY0D9DQ==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + + '@graphql-typed-document-node/core@3.2.0': + resolution: {integrity: sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==} + peerDependencies: + graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + + '@hapi/hoek@9.3.0': + resolution: {integrity: sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==} + + '@hapi/topo@5.1.0': + resolution: {integrity: sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==} + + '@hookform/resolvers@3.3.4': + resolution: {integrity: sha512-o5cgpGOuJYrd+iMKvkttOclgwRW86EsWJZZRC23prf0uU2i48Htq4PuT73AVb9ionFyZrwYEITuOFGF+BydEtQ==} + peerDependencies: + react-hook-form: ^7.0.0 + + '@humanwhocodes/config-array@0.11.14': + resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} + engines: {node: '>=10.10.0'} + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/object-schema@2.0.3': + resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} + + '@isaacs/ttlcache@1.4.1': + resolution: {integrity: sha512-RQgQ4uQ+pLbqXfOmieB91ejmLwvSgv9nLx6sT6sD83s7umBypgg+OIBOBbEUiJXrfpnp9j0mRhYYdzp9uqq3lA==} + engines: {node: '>=12'} + + '@jest/create-cache-key-function@29.7.0': + resolution: {integrity: sha512-4QqS3LY5PBmTRHj9sAg1HLoPzqAI0uOX6wI/TRqHIcOxlFidy6YEmCQJk6FSZjNLGCeubDMfmkWL+qaLKhSGQA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/environment@29.7.0': + resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/fake-timers@29.7.0': + resolution: {integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/schemas@29.6.3': + resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/types@26.6.2': + resolution: {integrity: sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==} + engines: {node: '>= 10.14.2'} + + '@jest/types@29.6.3': + resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jridgewell/gen-mapping@0.3.5': + resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} + engines: {node: '>=6.0.0'} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + + '@jridgewell/source-map@0.3.6': + resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} + + '@jridgewell/sourcemap-codec@1.4.15': + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + + '@kamilkisiela/fast-url-parser@1.1.4': + resolution: {integrity: sha512-gbkePEBupNydxCelHCESvFSFM8XPh1Zs/OAVRW/rKpEqPAl5PbOM90Si8mv9bvnR53uPD2s/FiRxdvSejpRJew==} + + '@lit-labs/ssr-dom-shim@1.2.0': + resolution: {integrity: sha512-yWJKmpGE6lUURKAaIltoPIE/wrbY3TEkqQt+X0m+7fQNnAv0keydnYvbiJFP1PnMhizmIWRWOG5KLhYyc/xl+g==} + + '@lit/reactive-element@1.6.3': + resolution: {integrity: sha512-QuTgnG52Poic7uM1AN5yJ09QMe0O28e10XzSvWDz02TJiiKee4stsiownEIadWm8nYzyDAyT+gKzUoZmiWQtsQ==} + + '@lit/reactive-element@2.0.4': + resolution: {integrity: sha512-GFn91inaUa2oHLak8awSIigYz0cU0Payr1rcFsrkf5OJ5eSPxElyZfKh0f2p9FsTiZWXQdWGJeXZICEfXXYSXQ==} + + '@metamask/eth-json-rpc-provider@1.0.1': + resolution: {integrity: sha512-whiUMPlAOrVGmX8aKYVPvlKyG4CpQXiNNyt74vE1xb5sPvmx5oA7B/kOi/JdBvhGQq97U1/AVdXEdk2zkP8qyA==} + engines: {node: '>=14.0.0'} + + '@metamask/json-rpc-engine@7.3.3': + resolution: {integrity: sha512-dwZPq8wx9yV3IX2caLi9q9xZBw2XeIoYqdyihDDDpuHVCEiqadJLwqM3zy+uwf6F1QYQ65A8aOMQg1Uw7LMLNg==} + engines: {node: '>=16.0.0'} + + '@metamask/object-multiplex@1.3.0': + resolution: {integrity: sha512-czcQeVYdSNtabd+NcYQnrM69MciiJyd1qvKH8WM2Id3C0ZiUUX5Xa/MK+/VUk633DBhVOwdNzAKIQ33lGyA+eQ==} + engines: {node: '>=12.0.0'} + + '@metamask/onboarding@1.0.1': + resolution: {integrity: sha512-FqHhAsCI+Vacx2qa5mAFcWNSrTcVGMNjzxVgaX8ECSny/BJ9/vgXP9V7WF/8vb9DltPeQkxr+Fnfmm6GHfmdTQ==} + + '@metamask/post-message-stream@6.2.0': + resolution: {integrity: sha512-WunZ0bruClF862mvbKQGETn5SM0XKGmocPMQR1Ew6sYix9/FDzeoZnoI8RkXk01E+70FCdxhTE/r8kk5SFOuTw==} + engines: {node: '>=14.0.0'} + + '@metamask/providers@10.2.1': + resolution: {integrity: sha512-p2TXw2a1Nb8czntDGfeIYQnk4LLVbd5vlcb3GY//lylYlKdSqp+uUTegCvxiFblRDOT68jsY8Ib1VEEzVUOolA==} + engines: {node: '>=14.0.0'} + + '@metamask/rpc-errors@6.2.1': + resolution: {integrity: sha512-VTgWkjWLzb0nupkFl1duQi9Mk8TGT9rsdnQg6DeRrYEFxtFOh0IF8nAwxM/4GWqDl6uIB06lqUBgUrAVWl62Bw==} + engines: {node: '>=16.0.0'} + + '@metamask/safe-event-emitter@2.0.0': + resolution: {integrity: sha512-/kSXhY692qiV1MXu6EeOZvg5nECLclxNXcKCxJ3cXQgYuRymRHpdx/t7JXfsK+JLjwA1e1c1/SBrlQYpusC29Q==} + + '@metamask/safe-event-emitter@3.1.1': + resolution: {integrity: sha512-ihb3B0T/wJm1eUuArYP4lCTSEoZsClHhuWyfo/kMX3m/odpqNcPfsz5O2A3NT7dXCAgWPGDQGPqygCpgeniKMw==} + engines: {node: '>=12.0.0'} + + '@metamask/sdk-communication-layer@0.14.3': + resolution: {integrity: sha512-yjSbj8y7fFbQXv2HBzUX6D9C8BimkCYP6BDV7hdw53W8b/GlYCtXVxUFajQ9tuO1xPTRjR/xt/dkdr2aCi6WGw==} + + '@metamask/sdk-install-modal-web@0.14.1': + resolution: {integrity: sha512-emT8HKbnfVwGhPxyUfMja6DWzvtJvDEBQxqCVx93H0HsyrrOzOC43iGCAosslw6o5h7gOfRKLqWmK8V7jQAS2Q==} + + '@metamask/sdk@0.14.3': + resolution: {integrity: sha512-BYLs//nY2wioVSih78gOQI6sLIYY3vWkwVqXGYUgkBV+bi49bv+9S0m+hZ2cwiRaxfMYtKs0KvhAQ8weiYwDrg==} + peerDependencies: + react: ^18.2.0 + react-native: '*' + peerDependenciesMeta: + react: + optional: true + react-native: + optional: true + + '@metamask/utils@5.0.2': + resolution: {integrity: sha512-yfmE79bRQtnMzarnKfX7AEJBwFTxvTyw3nBQlu/5rmGXrjAeAMltoGxO62TFurxrQAFMNa/fEjIHNvungZp0+g==} + engines: {node: '>=14.0.0'} + + '@metamask/utils@8.4.0': + resolution: {integrity: sha512-dbIc3C7alOe0agCuBHM1h71UaEaEqOk2W8rAtEn8QGz4haH2Qq7MoK6i7v2guzvkJVVh79c+QCzIqphC3KvrJg==} + engines: {node: '>=16.0.0'} + + '@motionone/animation@10.17.0': + resolution: {integrity: sha512-ANfIN9+iq1kGgsZxs+Nz96uiNcPLGTXwfNo2Xz/fcJXniPYpaz/Uyrfa+7I5BPLxCP82sh7quVDudf1GABqHbg==} + + '@motionone/dom@10.17.0': + resolution: {integrity: sha512-cMm33swRlCX/qOPHWGbIlCl0K9Uwi6X5RiL8Ma6OrlJ/TP7Q+Np5GE4xcZkFptysFjMTi4zcZzpnNQGQ5D6M0Q==} + + '@motionone/easing@10.17.0': + resolution: {integrity: sha512-Bxe2wSuLu/qxqW4rBFS5m9tMLOw+QBh8v5A7Z5k4Ul4sTj5jAOfZG5R0bn5ywmk+Fs92Ij1feZ5pmC4TeXA8Tg==} + + '@motionone/generators@10.17.0': + resolution: {integrity: sha512-T6Uo5bDHrZWhIfxG/2Aut7qyWQyJIWehk6OB4qNvr/jwA/SRmixwbd7SOrxZi1z5rH3LIeFFBKK1xHnSbGPZSQ==} + + '@motionone/svelte@10.16.4': + resolution: {integrity: sha512-zRVqk20lD1xqe+yEDZhMYgftsuHc25+9JSo+r0a0OWUJFocjSV9D/+UGhX4xgJsuwB9acPzXLr20w40VnY2PQA==} + + '@motionone/types@10.17.0': + resolution: {integrity: sha512-EgeeqOZVdRUTEHq95Z3t8Rsirc7chN5xFAPMYFobx8TPubkEfRSm5xihmMUkbaR2ErKJTUw3347QDPTHIW12IA==} + + '@motionone/utils@10.17.0': + resolution: {integrity: sha512-bGwrki4896apMWIj9yp5rAS2m0xyhxblg6gTB/leWDPt+pb410W8lYWsxyurX+DH+gO1zsQsfx2su/c1/LtTpg==} + + '@motionone/vue@10.16.4': + resolution: {integrity: sha512-z10PF9JV6SbjFq+/rYabM+8CVlMokgl8RFGvieSGNTmrkQanfHn+15XBrhG3BgUfvmTeSeyShfOHpG0i9zEdcg==} + deprecated: Motion One for Vue is deprecated. Use Oku Motion instead https://oku-ui.com/motion + + '@noble/curves@1.2.0': + resolution: {integrity: sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==} + + '@noble/curves@1.3.0': + resolution: {integrity: sha512-t01iSXPuN+Eqzb4eBX0S5oubSqXbK/xXa1Ne18Hj8f9pStxztHCE2gfboSp/dZRLSqfuLpRK2nDXDK+W9puocA==} + + '@noble/curves@1.4.0': + resolution: {integrity: sha512-p+4cb332SFCrReJkCYe8Xzm0OWi4Jji5jVdIZRL/PmacmDkFNw6MrrV+gGpiPxLHbV+zKFRywUWbaseT+tZRXg==} + + '@noble/hashes@1.3.2': + resolution: {integrity: sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==} + engines: {node: '>= 16'} + + '@noble/hashes@1.3.3': + resolution: {integrity: sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA==} + engines: {node: '>= 16'} + + '@noble/hashes@1.4.0': + resolution: {integrity: sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==} + engines: {node: '>= 16'} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@parcel/watcher-android-arm64@2.4.1': + resolution: {integrity: sha512-LOi/WTbbh3aTn2RYddrO8pnapixAziFl6SMxHM69r3tvdSm94JtCenaKgk1GRg5FJ5wpMCpHeW+7yqPlvZv7kg==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [android] + + '@parcel/watcher-darwin-arm64@2.4.1': + resolution: {integrity: sha512-ln41eihm5YXIY043vBrrHfn94SIBlqOWmoROhsMVTSXGh0QahKGy77tfEywQ7v3NywyxBBkGIfrWRHm0hsKtzA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [darwin] + + '@parcel/watcher-darwin-x64@2.4.1': + resolution: {integrity: sha512-yrw81BRLjjtHyDu7J61oPuSoeYWR3lDElcPGJyOvIXmor6DEo7/G2u1o7I38cwlcoBHQFULqF6nesIX3tsEXMg==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [darwin] + + '@parcel/watcher-freebsd-x64@2.4.1': + resolution: {integrity: sha512-TJa3Pex/gX3CWIx/Co8k+ykNdDCLx+TuZj3f3h7eOjgpdKM+Mnix37RYsYU4LHhiYJz3DK5nFCCra81p6g050w==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [freebsd] + + '@parcel/watcher-linux-arm-glibc@2.4.1': + resolution: {integrity: sha512-4rVYDlsMEYfa537BRXxJ5UF4ddNwnr2/1O4MHM5PjI9cvV2qymvhwZSFgXqbS8YoTk5i/JR0L0JDs69BUn45YA==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + + '@parcel/watcher-linux-arm64-glibc@2.4.1': + resolution: {integrity: sha512-BJ7mH985OADVLpbrzCLgrJ3TOpiZggE9FMblfO65PlOCdG++xJpKUJ0Aol74ZUIYfb8WsRlUdgrZxKkz3zXWYA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + + '@parcel/watcher-linux-arm64-musl@2.4.1': + resolution: {integrity: sha512-p4Xb7JGq3MLgAfYhslU2SjoV9G0kI0Xry0kuxeG/41UfpjHGOhv7UoUDAz/jb1u2elbhazy4rRBL8PegPJFBhA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + + '@parcel/watcher-linux-x64-glibc@2.4.1': + resolution: {integrity: sha512-s9O3fByZ/2pyYDPoLM6zt92yu6P4E39a03zvO0qCHOTjxmt3GHRMLuRZEWhWLASTMSrrnVNWdVI/+pUElJBBBg==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + + '@parcel/watcher-linux-x64-musl@2.4.1': + resolution: {integrity: sha512-L2nZTYR1myLNST0O632g0Dx9LyMNHrn6TOt76sYxWLdff3cB22/GZX2UPtJnaqQPdCRoszoY5rcOj4oMTtp5fQ==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + + '@parcel/watcher-wasm@2.4.1': + resolution: {integrity: sha512-/ZR0RxqxU/xxDGzbzosMjh4W6NdYFMqq2nvo2b8SLi7rsl/4jkL8S5stIikorNkdR50oVDvqb/3JT05WM+CRRA==} + engines: {node: '>= 10.0.0'} + bundledDependencies: + - napi-wasm + + '@parcel/watcher-win32-arm64@2.4.1': + resolution: {integrity: sha512-Uq2BPp5GWhrq/lcuItCHoqxjULU1QYEcyjSO5jqqOK8RNFDBQnenMMx4gAl3v8GiWa59E9+uDM7yZ6LxwUIfRg==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [win32] + + '@parcel/watcher-win32-ia32@2.4.1': + resolution: {integrity: sha512-maNRit5QQV2kgHFSYwftmPBxiuK5u4DXjbXx7q6eKjq5dsLXZ4FJiVvlcw35QXzk0KrUecJmuVFbj4uV9oYrcw==} + engines: {node: '>= 10.0.0'} + cpu: [ia32] + os: [win32] + + '@parcel/watcher-win32-x64@2.4.1': + resolution: {integrity: sha512-+DvS92F9ezicfswqrvIRM2njcYJbd5mb9CUgtrHCHmvn7pPPa+nMDRu1o1bYYz/l5IB2NVGNJWiH7h1E58IF2A==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [win32] + + '@parcel/watcher@2.4.1': + resolution: {integrity: sha512-HNjmfLQEVRZmHRET336f20H/8kOozUGwk7yajvsonjNxbj2wBTK1WsQuHkD5yYh9RxFGL2EyDHryOihOwUoKDA==} + engines: {node: '>= 10.0.0'} + + '@peculiar/asn1-schema@2.3.8': + resolution: {integrity: sha512-ULB1XqHKx1WBU/tTFIA+uARuRoBVZ4pNdOA878RDrRbBfBGcSzi5HBkdScC6ZbHn8z7L8gmKCgPC1LHRrP46tA==} + + '@peculiar/json-schema@1.1.12': + resolution: {integrity: sha512-coUfuoMeIB7B8/NMekxaDzLhaYmp0HZNPEjYRm9goRou8UZIC3z21s0sL9AWoCw4EG876QyO3kYrc61WNF9B/w==} + engines: {node: '>=8.0.0'} + + '@peculiar/webcrypto@1.4.6': + resolution: {integrity: sha512-YBcMfqNSwn3SujUJvAaySy5tlYbYm6tVt9SKoXu8BaTdKGROiJDgPR3TXpZdAKUfklzm3lRapJEAltiMQtBgZg==} + engines: {node: '>=10.12.0'} + + '@polkadot-api/client@0.0.1-492c132563ea6b40ae1fc5470dec4cd18768d182.1.0': + resolution: {integrity: sha512-0fqK6pUKcGHSG2pBvY+gfSS+1mMdjd/qRygAcKI5d05tKsnZLRnmhb9laDguKmGEIB0Bz9vQqNK3gIN/cfvVwg==} + peerDependencies: + rxjs: '>=7.8.0' + + '@polkadot-api/json-rpc-provider-proxy@0.0.1': + resolution: {integrity: sha512-gmVDUP8LpCH0BXewbzqXF2sdHddq1H1q+XrAW2of+KZj4woQkIGBRGTJHeBEVHe30EB+UejR1N2dT4PO/RvDdg==} + + '@polkadot-api/json-rpc-provider-proxy@0.0.1-492c132563ea6b40ae1fc5470dec4cd18768d182.1.0': + resolution: {integrity: sha512-0hZ8vtjcsyCX8AyqP2sqUHa1TFFfxGWmlXJkit0Nqp9b32MwZqn5eaUAiV2rNuEpoglKOdKnkGtUF8t5MoodKw==} + + '@polkadot-api/json-rpc-provider@0.0.1': + resolution: {integrity: sha512-/SMC/l7foRjpykLTUTacIH05H3mr9ip8b5xxfwXlVezXrNVLp3Cv0GX6uItkKd+ZjzVPf3PFrDF2B2/HLSNESA==} + + '@polkadot-api/json-rpc-provider@0.0.1-492c132563ea6b40ae1fc5470dec4cd18768d182.1.0': + resolution: {integrity: sha512-EaUS9Fc3wsiUr6ZS43PQqaRScW7kM6DYbuM/ou0aYjm8N9MBqgDbGm2oL6RE1vAVmOfEuHcXZuZkhzWtyvQUtA==} + + '@polkadot-api/metadata-builders@0.0.1': + resolution: {integrity: sha512-GCI78BHDzXAF/L2pZD6Aod/yl82adqQ7ftNmKg51ixRL02JpWUA+SpUKTJE5MY1p8kiJJIo09P2um24SiJHxNA==} + + '@polkadot-api/metadata-builders@0.0.1-492c132563ea6b40ae1fc5470dec4cd18768d182.1.0': + resolution: {integrity: sha512-BD7rruxChL1VXt0icC2gD45OtT9ofJlql0qIllHSRYgama1CR2Owt+ApInQxB+lWqM+xNOznZRpj8CXNDvKIMg==} + + '@polkadot-api/observable-client@0.1.0': + resolution: {integrity: sha512-GBCGDRztKorTLna/unjl/9SWZcRmvV58o9jwU2Y038VuPXZcr01jcw/1O3x+yeAuwyGzbucI/mLTDa1QoEml3A==} + peerDependencies: + rxjs: '>=7.8.0' + + '@polkadot-api/substrate-bindings@0.0.1': + resolution: {integrity: sha512-bAe7a5bOPnuFVmpv7y4BBMRpNTnMmE0jtTqRUw/+D8ZlEHNVEJQGr4wu3QQCl7k1GnSV1wfv3mzIbYjErEBocg==} + + '@polkadot-api/substrate-bindings@0.0.1-492c132563ea6b40ae1fc5470dec4cd18768d182.1.0': + resolution: {integrity: sha512-N4vdrZopbsw8k57uG58ofO7nLXM4Ai7835XqakN27MkjXMp5H830A1KJE0L9sGQR7ukOCDEIHHcwXVrzmJ/PBg==} + + '@polkadot-api/substrate-client@0.0.1': + resolution: {integrity: sha512-9Bg9SGc3AwE+wXONQoW8GC00N3v6lCZLW74HQzqB6ROdcm5VAHM4CB/xRzWSUF9CXL78ugiwtHx3wBcpx4H4Wg==} + + '@polkadot-api/substrate-client@0.0.1-492c132563ea6b40ae1fc5470dec4cd18768d182.1.0': + resolution: {integrity: sha512-lcdvd2ssUmB1CPzF8s2dnNOqbrDa+nxaaGbuts+Vo8yjgSKwds2Lo7Oq+imZN4VKW7t9+uaVcKFLMF7PdH0RWw==} + + '@polkadot-api/utils@0.0.1': + resolution: {integrity: sha512-3j+pRmlF9SgiYDabSdZsBSsN5XHbpXOAce1lWj56IEEaFZVjsiCaxDOA7C9nCcgfVXuvnbxqqEGQvnY+QfBAUw==} + + '@polkadot-api/utils@0.0.1-492c132563ea6b40ae1fc5470dec4cd18768d182.1.0': + resolution: {integrity: sha512-0CYaCjfLQJTCRCiYvZ81OncHXEKPzAexCMoVloR+v2nl/O2JRya/361MtPkeNLC6XBoaEgLAG9pWQpH3WePzsw==} + + '@polkadot/api-augment@11.0.2': + resolution: {integrity: sha512-Icrwk9DxcWlMxl0UFhIthYX+TzFGhxC2zwCaIgUbE5l1hoRFWl+K4BbLOtNdGTr6jkEkJizdnzbXvxWMYHZEOA==} + engines: {node: '>=18'} + + '@polkadot/api-base@11.0.2': + resolution: {integrity: sha512-Sz1z6KHe+AyiQRxwSXU2KM0KSKZ97sc1WBEhqqkGuR3YdaV2Pt++ixSJe1FXt5/YyMI/KU0W8GSciK6Kydgxgw==} + engines: {node: '>=18'} + + '@polkadot/api-derive@11.0.2': + resolution: {integrity: sha512-1E3alBICLBbsNJ4HvJkyIuCznuOgksS6cQ+H57K0d9NCC4xZcCqreHm+VTlZh3HZjDgw4CPDRvhgCDvDOP8KpA==} + engines: {node: '>=18'} + + '@polkadot/api@11.0.2': + resolution: {integrity: sha512-LG4gwlev+SC2WolWMX0CaUZJyZWxXbsCe5h58zFxXucQuiPAvkn0QrnSTC3hB3qywsxK6aeuQ9E2vrQYcN7EMg==} + engines: {node: '>=18'} + + '@polkadot/extension-dapp@0.46.5': + resolution: {integrity: sha512-9Efm3oorx6orq1eue+tTk5rxuGFFCUdRxiZbdQMKiVl3lZnwBn0M61ceE3xXcf/oIwAm8RhUpQdwcbZfupJRgw==} + engines: {node: '>=16'} + peerDependencies: + '@polkadot/api': '*' + '@polkadot/util': '*' + '@polkadot/util-crypto': '*' + + '@polkadot/extension-inject@0.46.5': + resolution: {integrity: sha512-QcpkCMuv7iFbWjufkw14JRozpEYFyjP0H8KOJ8IsHGfPd2DPiismQ0NXr+AS7f6U+0I+Rhv9E4dnXxtJPROVMQ==} + engines: {node: '>=16'} + peerDependencies: + '@polkadot/api': '*' + '@polkadot/util': '*' + + '@polkadot/keyring@12.6.2': + resolution: {integrity: sha512-O3Q7GVmRYm8q7HuB3S0+Yf/q/EB2egKRRU3fv9b3B7V+A52tKzA+vIwEmNVaD1g5FKW9oB97rmpggs0zaKFqHw==} + engines: {node: '>=18'} + peerDependencies: + '@polkadot/util': 12.6.2 + '@polkadot/util-crypto': 12.6.2 + + '@polkadot/networks@12.6.2': + resolution: {integrity: sha512-1oWtZm1IvPWqvMrldVH6NI2gBoCndl5GEwx7lAuQWGr7eNL+6Bdc5K3Z9T0MzFvDGoi2/CBqjX9dRKo39pDC/w==} + engines: {node: '>=18'} + + '@polkadot/react-identicon@3.6.5': + resolution: {integrity: sha512-a2kV2GRgJaxQIuay6CDpIsYB+L8/erth+v9t48H+TX5y87FadBIqj6F7LsaOD5HJ8dsXrDaPOx5f7SsoKAGm6A==} + engines: {node: '>=18'} + peerDependencies: + '@polkadot/keyring': '*' + '@polkadot/util': '*' + '@polkadot/util-crypto': '*' + react: '*' + react-dom: '*' + react-is: '*' + + '@polkadot/rpc-augment@11.0.2': + resolution: {integrity: sha512-QcT9U2hINcjynJhHC4AhoHNgZR5JymDkuhAIOVYsNb1BUcDzoud5lvfK+ISfw2kVPAyCdx3kHodFPhdNdPGHUg==} + engines: {node: '>=18'} + + '@polkadot/rpc-core@11.0.2': + resolution: {integrity: sha512-kC+85+WIc/uKColIGzrnRjM47N+AjbujRkTf0n9ldwtAIYJnq+B09R3Qjmk+kXrdW5fes85L/WigqwkohMfNkw==} + engines: {node: '>=18'} + + '@polkadot/rpc-provider@10.12.6': + resolution: {integrity: sha512-xLmzb2rMQXEWQlrIDY3E3IXo1jcV9+Vy3A8zMw/s/UIrwXZ3I0TefP8+mXcqEjLkkz7zwldDQvHfdmtnxdE14g==} + engines: {node: '>=18'} + + '@polkadot/rpc-provider@11.0.2': + resolution: {integrity: sha512-EHoWs27r+V8NKexawcTkDzSJtYAXmkz8/zge+Ctm0PzdxtP740U9xvbK7uZ0INXeLIPdKKk7n9lGib3fhnXRvQ==} + engines: {node: '>=18'} + + '@polkadot/types-augment@10.12.6': + resolution: {integrity: sha512-eUNanLs0w7SQLlsjFs7kTPfOTclfjllJxghwRqWZFHWjUbVcGcPwr8ITv/mfx1WTCqUqLMe6K8CPJ7BSggAWBA==} + engines: {node: '>=18'} + + '@polkadot/types-augment@11.0.2': + resolution: {integrity: sha512-36C1LNWrd/IJu4y4xJFsklw7qmyBMnH16WLkIoma7W7tCkPyuvKpl9btTcNpY9UE0FLb3AEhO0shrz3KUANk/g==} + engines: {node: '>=18'} + + '@polkadot/types-codec@10.12.6': + resolution: {integrity: sha512-yCzKdj/mLhjSG3mR1XhQdzzpAy0Exv9UuEhGQHPpdjkF0CCfVgsFoOAF3ScsSzwacJxGgxPWvlk849DfTrBYGA==} + engines: {node: '>=18'} + + '@polkadot/types-codec@11.0.2': + resolution: {integrity: sha512-OL7jM9JNzmRo+gLNIWllvyv3I4k+2dywKchC9gw/D5OCkFD+B5T3oHUw99zzER0C/r7/vTH9RM3w79yeW0UYKA==} + engines: {node: '>=18'} + + '@polkadot/types-create@10.12.6': + resolution: {integrity: sha512-byuPy7IUFjzoxG3qrP4kEScfR92KFOAkaJksNT4kDZILPCeZSPPN7cLqdejypwDBqJthTJM0LqKK4g+eHGKdvw==} + engines: {node: '>=18'} + + '@polkadot/types-create@11.0.2': + resolution: {integrity: sha512-yx5Gef3QkbJjzbEGoyOxv74XslGEK1Uo0IC8qSmwHsqO2+QoAEU7uJ9QpSNxHAcRrjx1W3+MdJAsfXtnwOiOeQ==} + engines: {node: '>=18'} + + '@polkadot/types-known@11.0.2': + resolution: {integrity: sha512-c89H2y2mMCjuf5X9tTadwHpJtnQvfVxlJLTlrGElfImzWNgRetIjH65Zgy/uh/I9LqTxRlk5y3ZhBMZgL/ybbg==} + engines: {node: '>=18'} + + '@polkadot/types-support@10.12.6': + resolution: {integrity: sha512-SMq/hUZJLCZXq26pNDaxgXNJqAJD8YhVXWXulCg0YvbIoVwEkFE66TEkUbtoRLKcsZXbPdxJ3JfSoa9r6Ewhnw==} + engines: {node: '>=18'} + + '@polkadot/types-support@11.0.2': + resolution: {integrity: sha512-p26QwtEniCyqUX9WoMtEp5LRdrmvvUf8s8Dx6P3W8/lU+hYeKQjeGCudWoudSXIYpsfTliLEowoxmjx4Wn4GIw==} + engines: {node: '>=18'} + + '@polkadot/types@10.12.6': + resolution: {integrity: sha512-ByjvZkKJclHSWEETk1m9HPYn/IdIyjWONOdy7Ih+/Nd0wVIahvXDYbV4CXe25xO0RhfFJzkGIZP+LFHL5F63Uw==} + engines: {node: '>=18'} + + '@polkadot/types@11.0.2': + resolution: {integrity: sha512-jYORxnbR9cOoLW2KI7OAbHlC8bQr+Anj34CqgtlEikRSZBlmmx1CLD08hZSnSHkVAQgqHB6SLfFIW5VTI2YaqA==} + engines: {node: '>=18'} + + '@polkadot/ui-settings@3.6.5': + resolution: {integrity: sha512-pRDwnXAsIrkARanL9BLDvg5u9PG7nnSDQkKmqYJiWbTW6G+ohOgBitlctjBnWASqjYMZLSRBY0MKwYrRrxJgVw==} + engines: {node: '>=18'} + peerDependencies: + '@polkadot/networks': '*' + '@polkadot/util': '*' + + '@polkadot/ui-shared@3.6.5': + resolution: {integrity: sha512-ZBkOcKxun+lwCkokDDX71Ajir9yNYc0VuyUik+76xFvoHYkKdQ+qInv2GS6caWAtTSfIxb4EKNN2Euc9m8un1A==} + engines: {node: '>=18'} + peerDependencies: + '@polkadot/util': '*' + '@polkadot/util-crypto': '*' + + '@polkadot/util-crypto@12.6.2': + resolution: {integrity: sha512-FEWI/dJ7wDMNN1WOzZAjQoIcCP/3vz3wvAp5QQm+lOrzOLj0iDmaIGIcBkz8HVm3ErfSe/uKP0KS4jgV/ib+Mg==} + engines: {node: '>=18'} + peerDependencies: + '@polkadot/util': 12.6.2 + + '@polkadot/util@12.6.2': + resolution: {integrity: sha512-l8TubR7CLEY47240uki0TQzFvtnxFIO7uI/0GoWzpYD/O62EIAMRsuY01N4DuwgKq2ZWD59WhzsLYmA5K6ksdw==} + engines: {node: '>=18'} + + '@polkadot/wasm-bridge@7.3.2': + resolution: {integrity: sha512-AJEXChcf/nKXd5Q/YLEV5dXQMle3UNT7jcXYmIffZAo/KI394a+/24PaISyQjoNC0fkzS1Q8T5pnGGHmXiVz2g==} + engines: {node: '>=18'} + peerDependencies: + '@polkadot/util': '*' + '@polkadot/x-randomvalues': '*' + + '@polkadot/wasm-crypto-asmjs@7.3.2': + resolution: {integrity: sha512-QP5eiUqUFur/2UoF2KKKYJcesc71fXhQFLT3D4ZjG28Mfk2ZPI0QNRUfpcxVQmIUpV5USHg4geCBNuCYsMm20Q==} + engines: {node: '>=18'} + peerDependencies: + '@polkadot/util': '*' + + '@polkadot/wasm-crypto-init@7.3.2': + resolution: {integrity: sha512-FPq73zGmvZtnuJaFV44brze3Lkrki3b4PebxCy9Fplw8nTmisKo9Xxtfew08r0njyYh+uiJRAxPCXadkC9sc8g==} + engines: {node: '>=18'} + peerDependencies: + '@polkadot/util': '*' + '@polkadot/x-randomvalues': '*' + + '@polkadot/wasm-crypto-wasm@7.3.2': + resolution: {integrity: sha512-15wd0EMv9IXs5Abp1ZKpKKAVyZPhATIAHfKsyoWCEFDLSOA0/K0QGOxzrAlsrdUkiKZOq7uzSIgIDgW8okx2Mw==} + engines: {node: '>=18'} + peerDependencies: + '@polkadot/util': '*' + + '@polkadot/wasm-crypto@7.3.2': + resolution: {integrity: sha512-+neIDLSJ6jjVXsjyZ5oLSv16oIpwp+PxFqTUaZdZDoA2EyFRQB8pP7+qLsMNk+WJuhuJ4qXil/7XiOnZYZ+wxw==} + engines: {node: '>=18'} + peerDependencies: + '@polkadot/util': '*' + '@polkadot/x-randomvalues': '*' + + '@polkadot/wasm-util@7.3.2': + resolution: {integrity: sha512-bmD+Dxo1lTZyZNxbyPE380wd82QsX+43mgCm40boyKrRppXEyQmWT98v/Poc7chLuskYb6X8IQ6lvvK2bGR4Tg==} + engines: {node: '>=18'} + peerDependencies: + '@polkadot/util': '*' + + '@polkadot/x-bigint@12.6.2': + resolution: {integrity: sha512-HSIk60uFPX4GOFZSnIF7VYJz7WZA7tpFJsne7SzxOooRwMTWEtw3fUpFy5cYYOeLh17/kHH1Y7SVcuxzVLc74Q==} + engines: {node: '>=18'} + + '@polkadot/x-fetch@12.6.2': + resolution: {integrity: sha512-8wM/Z9JJPWN1pzSpU7XxTI1ldj/AfC8hKioBlUahZ8gUiJaOF7K9XEFCrCDLis/A1BoOu7Ne6WMx/vsJJIbDWw==} + engines: {node: '>=18'} + + '@polkadot/x-global@12.6.2': + resolution: {integrity: sha512-a8d6m+PW98jmsYDtAWp88qS4dl8DyqUBsd0S+WgyfSMtpEXu6v9nXDgPZgwF5xdDvXhm+P0ZfVkVTnIGrScb5g==} + engines: {node: '>=18'} + + '@polkadot/x-randomvalues@12.6.2': + resolution: {integrity: sha512-Vr8uG7rH2IcNJwtyf5ebdODMcr0XjoCpUbI91Zv6AlKVYOGKZlKLYJHIwpTaKKB+7KPWyQrk4Mlym/rS7v9feg==} + engines: {node: '>=18'} + peerDependencies: + '@polkadot/util': 12.6.2 + '@polkadot/wasm-util': '*' + + '@polkadot/x-textdecoder@12.6.2': + resolution: {integrity: sha512-M1Bir7tYvNappfpFWXOJcnxUhBUFWkUFIdJSyH0zs5LmFtFdbKAeiDXxSp2Swp5ddOZdZgPac294/o2TnQKN1w==} + engines: {node: '>=18'} + + '@polkadot/x-textencoder@12.6.2': + resolution: {integrity: sha512-4N+3UVCpI489tUJ6cv3uf0PjOHvgGp9Dl+SZRLgFGt9mvxnvpW/7+XBADRMtlG4xi5gaRK7bgl5bmY6OMDsNdw==} + engines: {node: '>=18'} + + '@polkadot/x-ws@12.6.2': + resolution: {integrity: sha512-cGZWo7K5eRRQCRl2LrcyCYsrc3lRbTlixZh3AzgU8uX4wASVGRlNWi/Hf4TtHNe1ExCDmxabJzdIsABIfrr7xw==} + engines: {node: '>=18'} + + '@react-native-async-storage/async-storage@1.23.1': + resolution: {integrity: sha512-Qd2kQ3yi6Y3+AcUlrHxSLlnBvpdCEMVGFlVBneVOjaFaPU61g1huc38g339ysXspwY1QZA2aNhrk/KlHGO+ewA==} + peerDependencies: + react-native: ^0.0.0-0 || >=0.60 <1.0 + + '@react-native-community/cli-clean@12.3.6': + resolution: {integrity: sha512-gUU29ep8xM0BbnZjwz9MyID74KKwutq9x5iv4BCr2im6nly4UMf1B1D+V225wR7VcDGzbgWjaezsJShLLhC5ig==} + + '@react-native-community/cli-config@12.3.6': + resolution: {integrity: sha512-JGWSYQ9EAK6m2v0abXwFLEfsqJ1zkhzZ4CV261QZF9MoUNB6h57a274h1MLQR9mG6Tsh38wBUuNfEPUvS1vYew==} + + '@react-native-community/cli-debugger-ui@12.3.6': + resolution: {integrity: sha512-SjUKKsx5FmcK9G6Pb6UBFT0s9JexVStK5WInmANw75Hm7YokVvHEgtprQDz2Uvy5znX5g2ujzrkIU//T15KQzA==} + + '@react-native-community/cli-doctor@12.3.6': + resolution: {integrity: sha512-fvBDv2lTthfw4WOQKkdTop2PlE9GtfrlNnpjB818MhcdEnPjfQw5YaTUcnNEGsvGomdCs1MVRMgYXXwPSN6OvQ==} + + '@react-native-community/cli-hermes@12.3.6': + resolution: {integrity: sha512-sNGwfOCl8OAIjWCkwuLpP8NZbuO0dhDI/2W7NeOGDzIBsf4/c4MptTrULWtGIH9okVPLSPX0NnRyGQ+mSwWyuQ==} + + '@react-native-community/cli-platform-android@12.3.6': + resolution: {integrity: sha512-DeDDAB8lHpuGIAPXeeD9Qu2+/wDTFPo99c8uSW49L0hkmZJixzvvvffbGQAYk32H0TmaI7rzvzH+qzu7z3891g==} + + '@react-native-community/cli-platform-ios@12.3.6': + resolution: {integrity: sha512-3eZ0jMCkKUO58wzPWlvAPRqezVKm9EPZyaPyHbRPWU8qw7JqkvnRlWIaYDGpjCJgVW4k2hKsEursLtYKb188tg==} + + '@react-native-community/cli-plugin-metro@12.3.6': + resolution: {integrity: sha512-3jxSBQt4fkS+KtHCPSyB5auIT+KKIrPCv9Dk14FbvOaEh9erUWEm/5PZWmtboW1z7CYeNbFMeXm9fM2xwtVOpg==} + + '@react-native-community/cli-server-api@12.3.6': + resolution: {integrity: sha512-80NIMzo8b2W+PL0Jd7NjiJW9mgaT8Y8wsIT/lh6mAvYH7mK0ecDJUYUTAAv79Tbo1iCGPAr3T295DlVtS8s4yQ==} + + '@react-native-community/cli-tools@12.3.6': + resolution: {integrity: sha512-FPEvZn19UTMMXUp/piwKZSh8cMEfO8G3KDtOwo53O347GTcwNrKjgZGtLSPELBX2gr+YlzEft3CoRv2Qmo83fQ==} + + '@react-native-community/cli-types@12.3.6': + resolution: {integrity: sha512-xPqTgcUtZowQ8WKOkI9TLGBwH2bGggOC4d2FFaIRST3gTcjrEeGRNeR5aXCzJFIgItIft8sd7p2oKEdy90+01Q==} + + '@react-native-community/cli@12.3.6': + resolution: {integrity: sha512-647OSi6xBb8FbwFqX9zsJxOzu685AWtrOUWHfOkbKD+5LOpGORw+GQo0F9rWZnB68rLQyfKUZWJeaD00pGv5fw==} + engines: {node: '>=18'} + hasBin: true + + '@react-native/assets-registry@0.73.1': + resolution: {integrity: sha512-2FgAbU7uKM5SbbW9QptPPZx8N9Ke2L7bsHb+EhAanZjFZunA9PaYtyjUQ1s7HD+zDVqOQIvjkpXSv7Kejd2tqg==} + engines: {node: '>=18'} + + '@react-native/babel-plugin-codegen@0.73.4': + resolution: {integrity: sha512-XzRd8MJGo4Zc5KsphDHBYJzS1ryOHg8I2gOZDAUCGcwLFhdyGu1zBNDJYH2GFyDrInn9TzAbRIf3d4O+eltXQQ==} + engines: {node: '>=18'} + + '@react-native/babel-preset@0.73.21': + resolution: {integrity: sha512-WlFttNnySKQMeujN09fRmrdWqh46QyJluM5jdtDNrkl/2Hx6N4XeDUGhABvConeK95OidVO7sFFf7sNebVXogA==} + engines: {node: '>=18'} + peerDependencies: + '@babel/core': '*' + + '@react-native/codegen@0.73.3': + resolution: {integrity: sha512-sxslCAAb8kM06vGy9Jyh4TtvjhcP36k/rvj2QE2Jdhdm61KvfafCATSIsOfc0QvnduWFcpXUPvAVyYwuv7PYDg==} + engines: {node: '>=18'} + peerDependencies: + '@babel/preset-env': ^7.1.6 + + '@react-native/community-cli-plugin@0.73.17': + resolution: {integrity: sha512-F3PXZkcHg+1ARIr6FRQCQiB7ZAA+MQXGmq051metRscoLvgYJwj7dgC8pvgy0kexzUkHu5BNKrZeySzUft3xuQ==} + engines: {node: '>=18'} + + '@react-native/debugger-frontend@0.73.3': + resolution: {integrity: sha512-RgEKnWuoo54dh7gQhV7kvzKhXZEhpF9LlMdZolyhGxHsBqZ2gXdibfDlfcARFFifPIiaZ3lXuOVVa4ei+uPgTw==} + engines: {node: '>=18'} + + '@react-native/dev-middleware@0.73.8': + resolution: {integrity: sha512-oph4NamCIxkMfUL/fYtSsE+JbGOnrlawfQ0kKtDQ5xbOjPKotKoXqrs1eGwozNKv7FfQ393stk1by9a6DyASSg==} + engines: {node: '>=18'} + + '@react-native/gradle-plugin@0.73.4': + resolution: {integrity: sha512-PMDnbsZa+tD55Ug+W8CfqXiGoGneSSyrBZCMb5JfiB3AFST3Uj5e6lw8SgI/B6SKZF7lG0BhZ6YHZsRZ5MlXmg==} + engines: {node: '>=18'} + + '@react-native/js-polyfills@0.73.1': + resolution: {integrity: sha512-ewMwGcumrilnF87H4jjrnvGZEaPFCAC4ebraEK+CurDDmwST/bIicI4hrOAv+0Z0F7DEK4O4H7r8q9vH7IbN4g==} + engines: {node: '>=18'} + + '@react-native/metro-babel-transformer@0.73.15': + resolution: {integrity: sha512-LlkSGaXCz+xdxc9819plmpsl4P4gZndoFtpjN3GMBIu6f7TBV0GVbyJAU4GE8fuAWPVSVL5ArOcdkWKSbI1klw==} + engines: {node: '>=18'} + peerDependencies: + '@babel/core': '*' + + '@react-native/normalize-colors@0.73.2': + resolution: {integrity: sha512-bRBcb2T+I88aG74LMVHaKms2p/T8aQd8+BZ7LuuzXlRfog1bMWWn/C5i0HVuvW4RPtXQYgIlGiXVDy9Ir1So/w==} + + '@react-native/virtualized-lists@0.73.4': + resolution: {integrity: sha512-HpmLg1FrEiDtrtAbXiwCgXFYyloK/dOIPIuWW3fsqukwJEWAiTzm1nXGJ7xPU5XTHiWZ4sKup5Ebaj8z7iyWog==} + engines: {node: '>=18'} + peerDependencies: + react-native: '*' + + '@remix-run/router@1.15.3': + resolution: {integrity: sha512-Oy8rmScVrVxWZVOpEF57ovlnhpZ8CCPlnIIumVcV9nFdiSIrus99+Lw78ekXyGvVDlIsFJbSfmSovJUhCWYV3w==} + engines: {node: '>=14.0.0'} + + '@repeaterjs/repeater@3.0.5': + resolution: {integrity: sha512-l3YHBLAol6d/IKnB9LhpD0cEZWAoe3eFKUyTYWmFmCO2Q/WOckxLQAUyMZWwZV2M/m3+4vgRoaolFqaII82/TA==} + + '@rollup/plugin-inject@5.0.5': + resolution: {integrity: sha512-2+DEJbNBoPROPkgTDNe8/1YXWcqxbN5DTjASVIOx8HS+pITXushyNiBV56RB08zuptzz8gT3YfkqriTBVycepg==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/pluginutils@5.1.0': + resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/rollup-android-arm-eabi@4.14.3': + resolution: {integrity: sha512-X9alQ3XM6I9IlSlmC8ddAvMSyG1WuHk5oUnXGw+yUBs3BFoTizmG1La/Gr8fVJvDWAq+zlYTZ9DBgrlKRVY06g==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.14.3': + resolution: {integrity: sha512-eQK5JIi+POhFpzk+LnjKIy4Ks+pwJ+NXmPxOCSvOKSNRPONzKuUvWE+P9JxGZVxrtzm6BAYMaL50FFuPe0oWMQ==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.14.3': + resolution: {integrity: sha512-Od4vE6f6CTT53yM1jgcLqNfItTsLt5zE46fdPaEmeFHvPs5SjZYlLpHrSiHEKR1+HdRfxuzXHjDOIxQyC3ptBA==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.14.3': + resolution: {integrity: sha512-0IMAO21axJeNIrvS9lSe/PGthc8ZUS+zC53O0VhF5gMxfmcKAP4ESkKOCwEi6u2asUrt4mQv2rjY8QseIEb1aw==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-linux-arm-gnueabihf@4.14.3': + resolution: {integrity: sha512-ge2DC7tHRHa3caVEoSbPRJpq7azhG+xYsd6u2MEnJ6XzPSzQsTKyXvh6iWjXRf7Rt9ykIUWHtl0Uz3T6yXPpKw==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.14.3': + resolution: {integrity: sha512-ljcuiDI4V3ySuc7eSk4lQ9wU8J8r8KrOUvB2U+TtK0TiW6OFDmJ+DdIjjwZHIw9CNxzbmXY39wwpzYuFDwNXuw==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.14.3': + resolution: {integrity: sha512-Eci2us9VTHm1eSyn5/eEpaC7eP/mp5n46gTRB3Aar3BgSvDQGJZuicyq6TsH4HngNBgVqC5sDYxOzTExSU+NjA==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.14.3': + resolution: {integrity: sha512-UrBoMLCq4E92/LCqlh+blpqMz5h1tJttPIniwUgOFJyjWI1qrtrDhhpHPuFxULlUmjFHfloWdixtDhSxJt5iKw==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-powerpc64le-gnu@4.14.3': + resolution: {integrity: sha512-5aRjvsS8q1nWN8AoRfrq5+9IflC3P1leMoy4r2WjXyFqf3qcqsxRCfxtZIV58tCxd+Yv7WELPcO9mY9aeQyAmw==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.14.3': + resolution: {integrity: sha512-sk/Qh1j2/RJSX7FhEpJn8n0ndxy/uf0kI/9Zc4b1ELhqULVdTfN6HL31CDaTChiBAOgLcsJ1sgVZjWv8XNEsAQ==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.14.3': + resolution: {integrity: sha512-jOO/PEaDitOmY9TgkxF/TQIjXySQe5KVYB57H/8LRP/ux0ZoO8cSHCX17asMSv3ruwslXW/TLBcxyaUzGRHcqg==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.14.3': + resolution: {integrity: sha512-8ybV4Xjy59xLMyWo3GCfEGqtKV5M5gCSrZlxkPGvEPCGDLNla7v48S662HSGwRd6/2cSneMQWiv+QzcttLrrOA==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.14.3': + resolution: {integrity: sha512-s+xf1I46trOY10OqAtZ5Rm6lzHre/UiLA1J2uOhCFXWkbZrJRkYBPO6FhvGfHmdtQ3Bx793MNa7LvoWFAm93bg==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-win32-arm64-msvc@4.14.3': + resolution: {integrity: sha512-+4h2WrGOYsOumDQ5S2sYNyhVfrue+9tc9XcLWLh+Kw3UOxAvrfOrSMFon60KspcDdytkNDh7K2Vs6eMaYImAZg==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.14.3': + resolution: {integrity: sha512-T1l7y/bCeL/kUwh9OD4PQT4aM7Bq43vX05htPJJ46RTI4r5KNt6qJRzAfNfM+OYMNEVBWQzR2Gyk+FXLZfogGw==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.14.3': + resolution: {integrity: sha512-/BypzV0H1y1HzgYpxqRaXGBRqfodgoBBCcsrujT6QRcakDQdfU+Lq9PENPh5jB4I44YWq+0C2eHsHya+nZY1sA==} + cpu: [x64] + os: [win32] + + '@safe-global/safe-apps-provider@0.18.1': + resolution: {integrity: sha512-V4a05A3EgJcriqtDoJklDz1BOinWhC6P0hjUSxshA4KOZM7rGPCTto/usXs09zr1vvL28evl/NldSTv97j2bmg==} + + '@safe-global/safe-apps-sdk@8.1.0': + resolution: {integrity: sha512-XJbEPuaVc7b9n23MqlF6c+ToYIS3f7P2Sel8f3cSBQ9WORE4xrSuvhMpK9fDSFqJ7by/brc+rmJR/5HViRr0/w==} + + '@safe-global/safe-gateway-typescript-sdk@3.19.0': + resolution: {integrity: sha512-TRlP05KY6t3wjLJ74FiirWlEt3xTclnUQM2YdYto1jx5G1o0meMnugIUZXhzm7Bs3rDEDNhz/aDf2KMSZtoCFg==} + engines: {node: '>=16'} + + '@scure/base@1.1.6': + resolution: {integrity: sha512-ok9AWwhcgYuGG3Zfhyqg+zwl+Wn5uE+dwC0NV/2qQkx4dABbb/bx96vWu8NSj+BNjjSjno+JRYRjle1jV08k3g==} + + '@scure/bip32@1.3.2': + resolution: {integrity: sha512-N1ZhksgwD3OBlwTv3R6KFEcPojl/W4ElJOeCZdi+vuI5QmTFwLq3OFf2zd2ROpKvxFdgZ6hUpb0dx9bVNEwYCA==} + + '@scure/bip32@1.3.3': + resolution: {integrity: sha512-LJaN3HwRbfQK0X1xFSi0Q9amqOgzQnnDngIt+ZlsBC3Bm7/nE7K0kwshZHyaru79yIVRv/e1mQAjZyuZG6jOFQ==} + + '@scure/bip39@1.2.1': + resolution: {integrity: sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg==} + + '@scure/bip39@1.2.2': + resolution: {integrity: sha512-HYf9TUXG80beW+hGAt3TRM8wU6pQoYur9iNypTROm42dorCGmLnFe3eWjz3gOq6G62H2WRh0FCzAR1PI+29zIA==} + + '@sideway/address@4.1.5': + resolution: {integrity: sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==} + + '@sideway/formula@3.0.1': + resolution: {integrity: sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==} + + '@sideway/pinpoint@2.0.0': + resolution: {integrity: sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==} + + '@sinclair/typebox@0.27.8': + resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + + '@sinonjs/commons@3.0.1': + resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} + + '@sinonjs/fake-timers@10.3.0': + resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} + + '@socket.io/component-emitter@3.1.1': + resolution: {integrity: sha512-dzJtaDAAoXx4GCOJpbB2eG/Qj8VDpdwkLsWGzGm+0L7E8/434RyMbAHmk9ubXWVAb9nXmc44jUf8GKqVDiKezg==} + + '@stablelib/aead@1.0.1': + resolution: {integrity: sha512-q39ik6sxGHewqtO0nP4BuSe3db5G1fEJE8ukvngS2gLkBXyy6E7pLubhbYgnkDFv6V8cWaxcE4Xn0t6LWcJkyg==} + + '@stablelib/binary@1.0.1': + resolution: {integrity: sha512-ClJWvmL6UBM/wjkvv/7m5VP3GMr9t0osr4yVgLZsLCOz4hGN9gIAFEqnJ0TsSMAN+n840nf2cHZnA5/KFqHC7Q==} + + '@stablelib/bytes@1.0.1': + resolution: {integrity: sha512-Kre4Y4kdwuqL8BR2E9hV/R5sOrUj6NanZaZis0V6lX5yzqC3hBuVSDXUIBqQv/sCpmuWRiHLwqiT1pqqjuBXoQ==} + + '@stablelib/chacha20poly1305@1.0.1': + resolution: {integrity: sha512-MmViqnqHd1ymwjOQfghRKw2R/jMIGT3wySN7cthjXCBdO+qErNPUBnRzqNpnvIwg7JBCg3LdeCZZO4de/yEhVA==} + + '@stablelib/chacha@1.0.1': + resolution: {integrity: sha512-Pmlrswzr0pBzDofdFuVe1q7KdsHKhhU24e8gkEwnTGOmlC7PADzLVxGdn2PoNVBBabdg0l/IfLKg6sHAbTQugg==} + + '@stablelib/constant-time@1.0.1': + resolution: {integrity: sha512-tNOs3uD0vSJcK6z1fvef4Y+buN7DXhzHDPqRLSXUel1UfqMB1PWNsnnAezrKfEwTLpN0cGH2p9NNjs6IqeD0eg==} + + '@stablelib/ed25519@1.0.3': + resolution: {integrity: sha512-puIMWaX9QlRsbhxfDc5i+mNPMY+0TmQEskunY1rZEBPi1acBCVQAhnsk/1Hk50DGPtVsZtAWQg4NHGlVaO9Hqg==} + + '@stablelib/hash@1.0.1': + resolution: {integrity: sha512-eTPJc/stDkdtOcrNMZ6mcMK1e6yBbqRBaNW55XA1jU8w/7QdnCF0CmMmOD1m7VSkBR44PWrMHU2l6r8YEQHMgg==} + + '@stablelib/hkdf@1.0.1': + resolution: {integrity: sha512-SBEHYE16ZXlHuaW5RcGk533YlBj4grMeg5TooN80W3NpcHRtLZLLXvKyX0qcRFxf+BGDobJLnwkvgEwHIDBR6g==} + + '@stablelib/hmac@1.0.1': + resolution: {integrity: sha512-V2APD9NSnhVpV/QMYgCVMIYKiYG6LSqw1S65wxVoirhU/51ACio6D4yDVSwMzuTJXWZoVHbDdINioBwKy5kVmA==} + + '@stablelib/int@1.0.1': + resolution: {integrity: sha512-byr69X/sDtDiIjIV6m4roLVWnNNlRGzsvxw+agj8CIEazqWGOQp2dTYgQhtyVXV9wpO6WyXRQUzLV/JRNumT2w==} + + '@stablelib/keyagreement@1.0.1': + resolution: {integrity: sha512-VKL6xBwgJnI6l1jKrBAfn265cspaWBPAPEc62VBQrWHLqVgNRE09gQ/AnOEyKUWrrqfD+xSQ3u42gJjLDdMDQg==} + + '@stablelib/poly1305@1.0.1': + resolution: {integrity: sha512-1HlG3oTSuQDOhSnLwJRKeTRSAdFNVB/1djy2ZbS35rBSJ/PFqx9cf9qatinWghC2UbfOYD8AcrtbUQl8WoxabA==} + + '@stablelib/random@1.0.2': + resolution: {integrity: sha512-rIsE83Xpb7clHPVRlBj8qNe5L8ISQOzjghYQm/dZ7VaM2KHYwMW5adjQjrzTZCchFnNCNhkwtnOBa9HTMJCI8w==} + + '@stablelib/sha256@1.0.1': + resolution: {integrity: sha512-GIIH3e6KH+91FqGV42Kcj71Uefd/QEe7Dy42sBTeqppXV95ggCcxLTk39bEr+lZfJmp+ghsR07J++ORkRELsBQ==} + + '@stablelib/sha512@1.0.1': + resolution: {integrity: sha512-13gl/iawHV9zvDKciLo1fQ8Bgn2Pvf7OV6amaRVKiq3pjQ3UmEpXxWiAfV8tYjUpeZroBxtyrwtdooQT/i3hzw==} + + '@stablelib/wipe@1.0.1': + resolution: {integrity: sha512-WfqfX/eXGiAd3RJe4VU2snh/ZPwtSjLG4ynQ/vYzvghTh7dHFcI1wl+nrkWG6lGhukOxOsUHfv8dUXr58D0ayg==} + + '@stablelib/x25519@1.0.3': + resolution: {integrity: sha512-KnTbKmUhPhHavzobclVJQG5kuivH+qDLpe84iRqX3CLrKp881cF160JvXJ+hjn1aMyCwYOKeIZefIH/P5cJoRw==} + + '@substrate/connect-extension-protocol@2.0.0': + resolution: {integrity: sha512-nKu8pDrE3LNCEgJjZe1iGXzaD6OSIDD4Xzz/yo4KO9mQ6LBvf49BVrt4qxBFGL6++NneLiWUZGoh+VSd4PyVIg==} + + '@substrate/connect-known-chains@1.1.4': + resolution: {integrity: sha512-iT+BdKqvKl/uBLd8BAJysFM1BaMZXRkaXBP2B7V7ob/EyNs5h0EMhTVbO6MJxV/IEOg5OKsyl6FUqQK7pKnqyw==} + + '@substrate/connect@0.8.10': + resolution: {integrity: sha512-DIyQ13DDlXqVFnLV+S6/JDgiGowVRRrh18kahieJxhgvzcWicw5eLc6jpfQ0moVVLBYkO7rctB5Wreldwpva8w==} + + '@substrate/connect@0.8.8': + resolution: {integrity: sha512-zwaxuNEVI9bGt0rT8PEJiXOyebLIo6QN1SyiAHRPBOl6g3Sy0KKdSN8Jmyn++oXhVRD8aIe75/V8ZkS81T+BPQ==} + + '@substrate/light-client-extension-helpers@0.0.4': + resolution: {integrity: sha512-vfKcigzL0SpiK+u9sX6dq2lQSDtuFLOxIJx2CKPouPEHIs8C+fpsufn52r19GQn+qDhU8POMPHOVoqLktj8UEA==} + peerDependencies: + smoldot: 2.x + + '@substrate/light-client-extension-helpers@0.0.6': + resolution: {integrity: sha512-girltEuxQ1BvkJWmc8JJlk4ZxnlGXc/wkLcNguhY+UoDEMBK0LsdtfzQKIfrIehi4QdeSBlFEFBoI4RqPmsZzA==} + peerDependencies: + smoldot: 2.x + + '@substrate/ss58-registry@1.47.0': + resolution: {integrity: sha512-6kuIJedRcisUJS2pgksEH2jZf3hfSIVzqtFzs/AyjTW3ETbMg5q1Bb7VWa0WYaT6dTrEXp/6UoXM5B9pSIUmcw==} + + '@svgr/babel-plugin-add-jsx-attribute@8.0.0': + resolution: {integrity: sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-plugin-remove-jsx-attribute@8.0.0': + resolution: {integrity: sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0': + resolution: {integrity: sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-plugin-replace-jsx-attribute-value@8.0.0': + resolution: {integrity: sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-plugin-svg-dynamic-title@8.0.0': + resolution: {integrity: sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-plugin-svg-em-dimensions@8.0.0': + resolution: {integrity: sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-plugin-transform-react-native-svg@8.1.0': + resolution: {integrity: sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-plugin-transform-svg-component@8.0.0': + resolution: {integrity: sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==} + engines: {node: '>=12'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-preset@8.1.0': + resolution: {integrity: sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/core@8.1.0': + resolution: {integrity: sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==} + engines: {node: '>=14'} + + '@svgr/hast-util-to-babel-ast@8.0.0': + resolution: {integrity: sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==} + engines: {node: '>=14'} + + '@svgr/plugin-jsx@8.1.0': + resolution: {integrity: sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA==} + engines: {node: '>=14'} + peerDependencies: + '@svgr/core': '*' + + '@tanstack/query-core@5.40.0': + resolution: {integrity: sha512-eD8K8jsOIq0Z5u/QbvOmfvKKE/XC39jA7yv4hgpl/1SRiU+J8QCIwgM/mEHuunQsL87dcvnHqSVLmf9pD4CiaA==} + + '@tanstack/react-query@5.40.0': + resolution: {integrity: sha512-iv/W0Axc4aXhFzkrByToE1JQqayxTPNotCoSCnarR/A1vDIHaoKpg7FTIfP3Ev2mbKn1yrxq0ZKYUdLEJxs6Tg==} + peerDependencies: + react: ^18.0.0 + + '@types/babel__core@7.20.5': + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + + '@types/babel__generator@7.6.8': + resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} + + '@types/babel__template@7.4.4': + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + + '@types/babel__traverse@7.20.5': + resolution: {integrity: sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==} + + '@types/bn.js@5.1.5': + resolution: {integrity: sha512-V46N0zwKRF5Q00AZ6hWtN0T8gGmDUaUzLWQvHFo5yThtVwK/VCenFY3wXVbOvNfajEpsTfQM4IN9k/d6gUVX3A==} + + '@types/chrome@0.0.136': + resolution: {integrity: sha512-XDEiRhLkMd+SB7Iw3ZUIj/fov3wLd4HyTdLltVszkgl1dBfc3Rb7oPMVZ2Mz2TLqnF7Ow+StbR8E7r9lqpb4DA==} + + '@types/debug@4.1.12': + resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + + '@types/dom-screen-wake-lock@1.0.3': + resolution: {integrity: sha512-3Iten7X3Zgwvk6kh6/NRdwN7WbZ760YgFCsF5AxDifltUQzW1RaW+WRmcVtgwFzLjaNu64H+0MPJ13yRa8g3Dw==} + + '@types/eslint-scope@3.7.7': + resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} + + '@types/eslint@8.56.9': + resolution: {integrity: sha512-W4W3KcqzjJ0sHg2vAq9vfml6OhsJ53TcUjUqfzzZf/EChUtwspszj/S0pzMxnfRcO55/iGq47dscXw71Fxc4Zg==} + + '@types/estree@1.0.5': + resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + + '@types/filesystem@0.0.36': + resolution: {integrity: sha512-vPDXOZuannb9FZdxgHnqSwAG/jvdGM8Wq+6N4D/d80z+D4HWH+bItqsZaVRQykAn6WEVeEkLm2oQigyHtgb0RA==} + + '@types/filewriter@0.0.33': + resolution: {integrity: sha512-xFU8ZXTw4gd358lb2jw25nxY9QAgqn2+bKKjKOYfNCzN4DKCFetK7sPtrlpg66Ywe3vWY9FNxprZawAh9wfJ3g==} + + '@types/har-format@1.2.15': + resolution: {integrity: sha512-RpQH4rXLuvTXKR0zqHq3go0RVXYv/YVqv4TnPH95VbwUxZdQlK1EtcMvQvMpDngHbt13Csh9Z4qT9AbkiQH5BA==} + + '@types/istanbul-lib-coverage@2.0.6': + resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} + + '@types/istanbul-lib-report@3.0.3': + resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} + + '@types/istanbul-reports@3.0.4': + resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} + + '@types/js-yaml@4.0.9': + resolution: {integrity: sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/json5@0.0.29': + resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + + '@types/ms@0.7.34': + resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} + + '@types/node@20.12.7': + resolution: {integrity: sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==} + + '@types/parse-json@4.0.2': + resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} + + '@types/prop-types@15.7.12': + resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==} + + '@types/react-dom@18.2.25': + resolution: {integrity: sha512-o/V48vf4MQh7juIKZU2QGDfli6p1+OOi5oXx36Hffpc9adsHeXjVp8rHuPkjd8VT8sOJ2Zp05HR7CdpGTIUFUA==} + + '@types/react@18.2.79': + resolution: {integrity: sha512-RwGAGXPl9kSXwdNTafkOEuFrTBD5SA2B3iEB96xi8+xu5ddUa/cpvyVCSNn+asgLCTHkb5ZxN8gbuibYJi4s1w==} + + '@types/secp256k1@4.0.6': + resolution: {integrity: sha512-hHxJU6PAEUn0TP4S/ZOzuTUvJWuZ6eIKeNKb5RBpODvSl6hp1Wrw4s7ATY50rklRCScUDpHzVA/DQdSjJ3UoYQ==} + + '@types/semver@7.5.8': + resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} + + '@types/stack-utils@2.0.3': + resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} + + '@types/stylis@4.2.0': + resolution: {integrity: sha512-n4sx2bqL0mW1tvDf/loQ+aMX7GQD3lc3fkCMC55VFNDu/vBOabO+LTIeXKM14xK0ppk5TUGcWRjiSpIlUpghKw==} + + '@types/trusted-types@2.0.7': + resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} + + '@types/ws@8.5.10': + resolution: {integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==} + + '@types/yargs-parser@21.0.3': + resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} + + '@types/yargs@15.0.19': + resolution: {integrity: sha512-2XUaGVmyQjgyAZldf0D0c14vvo/yv0MhQBSTJcejMMaitsn3nxCB6TmH4G0ZQf+uxROOa9mpanoSm8h6SG/1ZA==} + + '@types/yargs@17.0.32': + resolution: {integrity: sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==} + + '@typescript-eslint/eslint-plugin@7.7.0': + resolution: {integrity: sha512-GJWR0YnfrKnsRoluVO3PRb9r5aMZriiMMM/RHj5nnTrBy1/wIgk76XCtCKcnXGjpZQJQRFtGV9/0JJ6n30uwpQ==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + '@typescript-eslint/parser': ^7.0.0 + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/parser@7.7.0': + resolution: {integrity: sha512-fNcDm3wSwVM8QYL4HKVBggdIPAy9Q41vcvC/GtDobw3c4ndVT3K6cqudUmjHPw8EAp4ufax0o58/xvWaP2FmTg==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/scope-manager@7.7.0': + resolution: {integrity: sha512-/8INDn0YLInbe9Wt7dK4cXLDYp0fNHP5xKLHvZl3mOT5X17rK/YShXaiNmorl+/U4VKCVIjJnx4Ri5b0y+HClw==} + engines: {node: ^18.18.0 || >=20.0.0} + + '@typescript-eslint/type-utils@7.7.0': + resolution: {integrity: sha512-bOp3ejoRYrhAlnT/bozNQi3nio9tIgv3U5C0mVDdZC7cpcQEDZXvq8inrHYghLVwuNABRqrMW5tzAv88Vy77Sg==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/types@7.7.0': + resolution: {integrity: sha512-G01YPZ1Bd2hn+KPpIbrAhEWOn5lQBrjxkzHkWvP6NucMXFtfXoevK82hzQdpfuQYuhkvFDeQYbzXCjR1z9Z03w==} + engines: {node: ^18.18.0 || >=20.0.0} + + '@typescript-eslint/typescript-estree@7.7.0': + resolution: {integrity: sha512-8p71HQPE6CbxIBy2kWHqM1KGrC07pk6RJn40n0DSc6bMOBBREZxSDJ+BmRzc8B5OdaMh1ty3mkuWRg4sCFiDQQ==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/utils@7.7.0': + resolution: {integrity: sha512-LKGAXMPQs8U/zMRFXDZOzmMKgFv3COlxUQ+2NMPhbqgVm6R1w+nU1i4836Pmxu9jZAuIeyySNrN/6Rc657ggig==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + + '@typescript-eslint/visitor-keys@7.7.0': + resolution: {integrity: sha512-h0WHOj8MhdhY8YWkzIF30R379y0NqyOHExI9N9KCzvmu05EgG4FumeYa3ccfKUSphyWkWQE1ybVrgz/Pbam6YA==} + engines: {node: ^18.18.0 || >=20.0.0} + + '@ungap/structured-clone@1.2.0': + resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + + '@vitejs/plugin-react@4.2.1': + resolution: {integrity: sha512-oojO9IDc4nCUUi8qIR11KoQm0XFFLIwsRBwHRR4d/88IWghn1y6ckz/bJ8GHDCsYEJee8mDzqtJxh15/cisJNQ==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^4.2.0 || ^5.0.0 + + '@wagmi/connectors@4.1.26': + resolution: {integrity: sha512-0bANLzi4gZcszPnCj3l7+DPztCG+L+W1Zm/a02YmEh2MaQC/blBsbAdb2JALdW66HJJE8m4cNZjPJPTsS2/MQQ==} + peerDependencies: + '@wagmi/core': 2.6.17 + typescript: '>=5.0.4' + viem: 2.x + peerDependenciesMeta: + typescript: + optional: true + + '@wagmi/core@2.6.17': + resolution: {integrity: sha512-Ghr7PlD5HO1YJrsaC52j/csgaigBAiTR7cFiwrY7WdwvWLsR5na4Dv6KfHTU3d3al0CKDLanQdRS5nB4mX1M+g==} + peerDependencies: + '@tanstack/query-core': '>=5.0.0' + typescript: '>=5.0.4' + viem: 2.x + peerDependenciesMeta: + '@tanstack/query-core': + optional: true + typescript: + optional: true + + '@walletconnect/core@2.11.2': + resolution: {integrity: sha512-bB4SiXX8hX3/hyBfVPC5gwZCXCl+OPj+/EDVM71iAO3TDsh78KPbrVAbDnnsbHzZVHlsMohtXX3j5XVsheN3+g==} + + '@walletconnect/core@2.13.0': + resolution: {integrity: sha512-blDuZxQenjeXcVJvHxPznTNl6c/2DO4VNrFnus+qHmO6OtT5lZRowdMtlCaCNb1q0OxzgrmBDcTOCbFcCpio/g==} + + '@walletconnect/environment@1.0.1': + resolution: {integrity: sha512-T426LLZtHj8e8rYnKfzsw1aG6+M0BT1ZxayMdv/p8yM0MU+eJDISqNY3/bccxRr4LrF9csq02Rhqt08Ibl0VRg==} + + '@walletconnect/ethereum-provider@2.11.2': + resolution: {integrity: sha512-BUDqee0Uy2rCZVkW5Ao3q6Ado/3fePYnFdryVF+YL6bPhj+xQZ5OfKodl+uvs7Rwq++O5wTX2RqOTzpW7+v+Mg==} + + '@walletconnect/ethereum-provider@2.13.0': + resolution: {integrity: sha512-dnpW8mmLpWl1AZUYGYZpaAfGw1HFkL0WSlhk5xekx3IJJKn4pLacX2QeIOo0iNkzNQxZfux1AK4Grl1DvtzZEA==} + + '@walletconnect/events@1.0.1': + resolution: {integrity: sha512-NPTqaoi0oPBVNuLv7qPaJazmGHs5JGyO8eEAk5VGKmJzDR7AHzD4k6ilox5kxk1iwiOnFopBOOMLs86Oa76HpQ==} + + '@walletconnect/heartbeat@1.2.1': + resolution: {integrity: sha512-yVzws616xsDLJxuG/28FqtZ5rzrTA4gUjdEMTbWB5Y8V1XHRmqq4efAxCw5ie7WjbXFSUyBHaWlMR+2/CpQC5Q==} + + '@walletconnect/heartbeat@1.2.2': + resolution: {integrity: sha512-uASiRmC5MwhuRuf05vq4AT48Pq8RMi876zV8rr8cV969uTOzWdB/k+Lj5yI2PBtB1bGQisGen7MM1GcZlQTBXw==} + + '@walletconnect/jsonrpc-http-connection@1.0.7': + resolution: {integrity: sha512-qlfh8fCfu8LOM9JRR9KE0s0wxP6ZG9/Jom8M0qsoIQeKF3Ni0FyV4V1qy/cc7nfI46SLQLSl4tgWSfLiE1swyQ==} + + '@walletconnect/jsonrpc-http-connection@1.0.8': + resolution: {integrity: sha512-+B7cRuaxijLeFDJUq5hAzNyef3e3tBDIxyaCNmFtjwnod5AGis3RToNqzFU33vpVcxFhofkpE7Cx+5MYejbMGw==} + + '@walletconnect/jsonrpc-provider@1.0.13': + resolution: {integrity: sha512-K73EpThqHnSR26gOyNEL+acEex3P7VWZe6KE12ZwKzAt2H4e5gldZHbjsu2QR9cLeJ8AXuO7kEMOIcRv1QEc7g==} + + '@walletconnect/jsonrpc-provider@1.0.14': + resolution: {integrity: sha512-rtsNY1XqHvWj0EtITNeuf8PHMvlCLiS3EjQL+WOkxEOA4KPxsohFnBDeyPYiNm4ZvkQdLnece36opYidmtbmow==} + + '@walletconnect/jsonrpc-types@1.0.3': + resolution: {integrity: sha512-iIQ8hboBl3o5ufmJ8cuduGad0CQm3ZlsHtujv9Eu16xq89q+BG7Nh5VLxxUgmtpnrePgFkTwXirCTkwJH1v+Yw==} + + '@walletconnect/jsonrpc-types@1.0.4': + resolution: {integrity: sha512-P6679fG/M+wuWg9TY8mh6xFSdYnFyFjwFelxyISxMDrlbXokorEVXYOxiqEbrU3x1BmBoCAJJ+vtEaEoMlpCBQ==} + + '@walletconnect/jsonrpc-utils@1.0.8': + resolution: {integrity: sha512-vdeb03bD8VzJUL6ZtzRYsFMq1eZQcM3EAzT0a3st59dyLfJ0wq+tKMpmGH7HlB7waD858UWgfIcudbPFsbzVdw==} + + '@walletconnect/jsonrpc-ws-connection@1.0.14': + resolution: {integrity: sha512-Jsl6fC55AYcbkNVkwNM6Jo+ufsuCQRqViOQ8ZBPH9pRREHH9welbBiszuTLqEJiQcO/6XfFDl6bzCJIkrEi8XA==} + + '@walletconnect/keyvaluestorage@1.1.1': + resolution: {integrity: sha512-V7ZQq2+mSxAq7MrRqDxanTzu2RcElfK1PfNYiaVnJgJ7Q7G7hTVwF8voIBx92qsRyGHZihrwNPHuZd1aKkd0rA==} + peerDependencies: + '@react-native-async-storage/async-storage': 1.x + peerDependenciesMeta: + '@react-native-async-storage/async-storage': + optional: true + + '@walletconnect/logger@2.1.2': + resolution: {integrity: sha512-aAb28I3S6pYXZHQm5ESB+V6rDqIYfsnHaQyzFbwUUBFY4H0OXx/YtTl8lvhUNhMMfb9UxbwEBS253TlXUYJWSw==} + + '@walletconnect/modal-core@2.6.2': + resolution: {integrity: sha512-cv8ibvdOJQv2B+nyxP9IIFdxvQznMz8OOr/oR/AaUZym4hjXNL/l1a2UlSQBXrVjo3xxbouMxLb3kBsHoYP2CA==} + + '@walletconnect/modal-ui@2.6.2': + resolution: {integrity: sha512-rbdstM1HPGvr7jprQkyPggX7rP4XiCG85ZA+zWBEX0dVQg8PpAgRUqpeub4xQKDgY7pY/xLRXSiCVdWGqvG2HA==} + + '@walletconnect/modal@2.6.2': + resolution: {integrity: sha512-eFopgKi8AjKf/0U4SemvcYw9zlLpx9njVN8sf6DAkowC2Md0gPU/UNEbH1Wwj407pEKnEds98pKWib1NN1ACoA==} + + '@walletconnect/relay-api@1.0.10': + resolution: {integrity: sha512-tqrdd4zU9VBNqUaXXQASaexklv6A54yEyQQEXYOCr+Jz8Ket0dmPBDyg19LVSNUN2cipAghQc45/KVmfFJ0cYw==} + + '@walletconnect/relay-api@1.0.9': + resolution: {integrity: sha512-Q3+rylJOqRkO1D9Su0DPE3mmznbAalYapJ9qmzDgK28mYF9alcP3UwG/og5V7l7CFOqzCLi7B8BvcBUrpDj0Rg==} + + '@walletconnect/relay-auth@1.0.4': + resolution: {integrity: sha512-kKJcS6+WxYq5kshpPaxGHdwf5y98ZwbfuS4EE/NkQzqrDFm5Cj+dP8LofzWvjrrLkZq7Afy7WrQMXdLy8Sx7HQ==} + + '@walletconnect/safe-json@1.0.2': + resolution: {integrity: sha512-Ogb7I27kZ3LPC3ibn8ldyUr5544t3/STow9+lzz7Sfo808YD7SBWk7SAsdBFlYgP2zDRy2hS3sKRcuSRM0OTmA==} + + '@walletconnect/sign-client@2.11.2': + resolution: {integrity: sha512-MfBcuSz2GmMH+P7MrCP46mVE5qhP0ZyWA0FyIH6/WuxQ6G+MgKsGfaITqakpRPsykWOJq8tXMs3XvUPDU413OQ==} + + '@walletconnect/sign-client@2.13.0': + resolution: {integrity: sha512-En7KSvNUlQFx20IsYGsFgkNJ2lpvDvRsSFOT5PTdGskwCkUfOpB33SQJ6nCrN19gyoKPNvWg80Cy6MJI0TjNYA==} + + '@walletconnect/time@1.0.2': + resolution: {integrity: sha512-uzdd9woDcJ1AaBZRhqy5rNC9laqWGErfc4dxA9a87mPdKOgWMD85mcFo9dIYIts/Jwocfwn07EC6EzclKubk/g==} + + '@walletconnect/types@2.11.2': + resolution: {integrity: sha512-p632MFB+lJbip2cvtXPBQslpUdiw1sDtQ5y855bOlAGquay+6fZ4h1DcDePeKQDQM3P77ax2a9aNPZxV6y/h1Q==} + + '@walletconnect/types@2.12.0': + resolution: {integrity: sha512-uhB3waGmujQVJcPgJvGOpB8RalgYSBT+HpmVbfl4Qe0xJyqpRUo4bPjQa0UYkrHaW20xIw94OuP4+FMLYdeemg==} + + '@walletconnect/types@2.13.0': + resolution: {integrity: sha512-MWaVT0FkZwzYbD3tvk8F+2qpPlz1LUSWHuqbINUtMXnSzJtXN49Y99fR7FuBhNFtDalfuWsEK17GrNA+KnAsPQ==} + + '@walletconnect/universal-provider@2.11.2': + resolution: {integrity: sha512-cNtIn5AVoDxKAJ4PmB8m5adnf5mYQMUamEUPKMVvOPscfGtIMQEh9peKsh2AN5xcRVDbgluC01Id545evFyymw==} + + '@walletconnect/universal-provider@2.13.0': + resolution: {integrity: sha512-B5QvO8pnk5Bqn4aIt0OukGEQn2Auk9VbHfhQb9cGwgmSCd1GlprX/Qblu4gyT5+TjHMb1Gz5UssUaZWTWbDhBg==} + + '@walletconnect/utils@2.11.2': + resolution: {integrity: sha512-LyfdmrnZY6dWqlF4eDrx5jpUwsB2bEPjoqR5Z6rXPiHJKUOdJt7az+mNOn5KTSOlRpd1DmozrBrWr+G9fFLYVw==} + + '@walletconnect/utils@2.12.0': + resolution: {integrity: sha512-GIpfHUe1Bjp1Tjda0SkJEizKOT2biuv7VPFnKsOLT1T+8QxEP9NruC+K2UUEvijS1Qr/LKH9P5004RYNgrch+w==} + + '@walletconnect/utils@2.13.0': + resolution: {integrity: sha512-q1eDCsRHj5iLe7fF8RroGoPZpdo2CYMZzQSrw1iqL+2+GOeqapxxuJ1vaJkmDUkwgklfB22ufqG6KQnz78sD4w==} + + '@walletconnect/window-getters@1.0.1': + resolution: {integrity: sha512-vHp+HqzGxORPAN8gY03qnbTMnhqIwjeRJNOMOAzePRg4xVEEE2WvYsI9G2NMjOknA8hnuYbU3/hwLcKbjhc8+Q==} + + '@walletconnect/window-metadata@1.0.1': + resolution: {integrity: sha512-9koTqyGrM2cqFRW517BPY/iEtUDx2r1+Pwwu5m7sJ7ka79wi3EyqhqcICk/yDmv6jAS1rjKgTKXlEhanYjijcA==} + + '@web3modal/common@4.2.3': + resolution: {integrity: sha512-n0lvhoRjViqxmkgpy+iEM6E3HBylUgdxUDJU4hUxGmmrbGZGEP7USBRnQOEgXLqLCtWvxKjUAO33JBV/De+Osw==} + + '@web3modal/core@4.2.3': + resolution: {integrity: sha512-UykKZTELBpb6ey+IV6fkHWsLkjrIdILmRYzhlznyTPbm9qX5pOR9tH0Z3QGUo7YPFmUqMRH1tC9Irsr3SgIbbw==} + + '@web3modal/polyfills@4.2.3': + resolution: {integrity: sha512-RiGxh2hMLSD1s2aTjoejNK/UL377CJhGf5tzmdF1m5xsYHpil+Dnulpio8Yojnm27cOqQD+QiaYUKnHOxErLjQ==} + + '@web3modal/scaffold-react@4.2.3': + resolution: {integrity: sha512-WRA244mO3qa9wnJtRa+mfXHkfW92VEkEt+HagLQuUcSRTQJH0Q95UF+EXZZ/r1mKbqdqIbpguewuF0dRtL/YrQ==} + peerDependencies: + react: '>=17' + react-dom: '>=17' + peerDependenciesMeta: + react: + optional: true + react-dom: + optional: true + + '@web3modal/scaffold-utils@4.2.3': + resolution: {integrity: sha512-z6t0ggYg1/8hpaKHUm77z2VyacjIZEZTI8IHSQYmHuRFGu5oDPJeAr1thr475JXdoGLYr08hwquZyed/ZINAvw==} + + '@web3modal/scaffold-vue@4.2.3': + resolution: {integrity: sha512-0mlx/t0A7srcuFcxP3xuUt2ACFUUcAhyRIsNImtQHPq7QHx7i5zvabQ38iplDsWS0TA7j83hW5gxHycppa5PXg==} + peerDependencies: + vue: '>=3' + peerDependenciesMeta: + vue: + optional: true + + '@web3modal/scaffold@4.2.3': + resolution: {integrity: sha512-8K+IV+luDUvppKgmlgdA+RbQGT2STdRrgHVHFRsAqsORFoLiIYvlrpQlxvV7J5Xc1bgKEn3KvEXC+BH2NMqF4w==} + + '@web3modal/siwe@4.2.3': + resolution: {integrity: sha512-uPma0U/OxAy3LwnF7pCYYX8tn+ONBYNcssuVZxEGsusJD1kF4ueS8lK7eyQogyK5nXqOGdNESOjY1NImNNjMVw==} + + '@web3modal/ui@4.2.3': + resolution: {integrity: sha512-QPPgE0hii1gpAldTdnrP63D/ryI78Ohz99zRBp8vi81lawot7rbdUbryMoX13hMPCW9vW7JYyvX+jJN7uO3QwA==} + + '@web3modal/wagmi@4.2.3': + resolution: {integrity: sha512-oisBCMrOYn8TBgNaSPrumvMmTGox6+3Ii92zxQJalW5U/K9iBTxoejHT033Ss7mFEFybilcfXBAvGNFXfQmtkA==} + peerDependencies: + '@wagmi/connectors': '>=4' + '@wagmi/core': '>=2.0.0' + react: '>=17' + react-dom: '>=17' + viem: '>=2.0.0' + vue: '>=3' + peerDependenciesMeta: + react: + optional: true + react-dom: + optional: true + vue: + optional: true + + '@web3modal/wallet@4.2.3': + resolution: {integrity: sha512-V+VpwmhQl9qeJMpzNkjpAaxercAsrr1O9oGRjrjD+c0q72NfdcbTalWSbjSQmqabI1M6N06Hw94FkAQuEfVGsg==} + + '@webassemblyjs/ast@1.12.1': + resolution: {integrity: sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==} + + '@webassemblyjs/floating-point-hex-parser@1.11.6': + resolution: {integrity: sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==} + + '@webassemblyjs/helper-api-error@1.11.6': + resolution: {integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==} + + '@webassemblyjs/helper-buffer@1.12.1': + resolution: {integrity: sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==} + + '@webassemblyjs/helper-numbers@1.11.6': + resolution: {integrity: sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==} + + '@webassemblyjs/helper-wasm-bytecode@1.11.6': + resolution: {integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==} + + '@webassemblyjs/helper-wasm-section@1.12.1': + resolution: {integrity: sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==} + + '@webassemblyjs/ieee754@1.11.6': + resolution: {integrity: sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==} + + '@webassemblyjs/leb128@1.11.6': + resolution: {integrity: sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==} + + '@webassemblyjs/utf8@1.11.6': + resolution: {integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==} + + '@webassemblyjs/wasm-edit@1.12.1': + resolution: {integrity: sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==} + + '@webassemblyjs/wasm-gen@1.12.1': + resolution: {integrity: sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==} + + '@webassemblyjs/wasm-opt@1.12.1': + resolution: {integrity: sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==} + + '@webassemblyjs/wasm-parser@1.12.1': + resolution: {integrity: sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==} + + '@webassemblyjs/wast-printer@1.12.1': + resolution: {integrity: sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==} + + '@webpack-cli/configtest@2.1.1': + resolution: {integrity: sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==} + engines: {node: '>=14.15.0'} + peerDependencies: + webpack: 5.x.x + webpack-cli: 5.x.x + + '@webpack-cli/info@2.0.2': + resolution: {integrity: sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==} + engines: {node: '>=14.15.0'} + peerDependencies: + webpack: 5.x.x + webpack-cli: 5.x.x + + '@webpack-cli/serve@2.0.5': + resolution: {integrity: sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==} + engines: {node: '>=14.15.0'} + peerDependencies: + webpack: 5.x.x + webpack-cli: 5.x.x + webpack-dev-server: '*' + peerDependenciesMeta: + webpack-dev-server: + optional: true + + '@whatwg-node/events@0.0.3': + resolution: {integrity: sha512-IqnKIDWfXBJkvy/k6tzskWTc2NK3LcqHlb+KHGCrjOCH4jfQckRX0NAiIcC/vIqQkzLYw2r2CTSwAxcrtcD6lA==} + + '@whatwg-node/events@0.1.1': + resolution: {integrity: sha512-AyQEn5hIPV7Ze+xFoXVU3QTHXVbWPrzaOkxtENMPMuNL6VVHrp4hHfDt9nrQpjO7BgvuM95dMtkycX5M/DZR3w==} + engines: {node: '>=16.0.0'} + + '@whatwg-node/fetch@0.8.8': + resolution: {integrity: sha512-CdcjGC2vdKhc13KKxgsc6/616BQ7ooDIgPeTuAiE8qfCnS0mGzcfCOoZXypQSz73nxI+GWc7ZReIAVhxoE1KCg==} + + '@whatwg-node/fetch@0.9.17': + resolution: {integrity: sha512-TDYP3CpCrxwxpiNY0UMNf096H5Ihf67BK1iKGegQl5u9SlpEDYrvnV71gWBGJm+Xm31qOy8ATgma9rm8Pe7/5Q==} + engines: {node: '>=16.0.0'} + + '@whatwg-node/node-fetch@0.3.6': + resolution: {integrity: sha512-w9wKgDO4C95qnXZRwZTfCmLWqyRnooGjcIwG0wADWjw9/HN0p7dtvtgSvItZtUyNteEvgTrd8QojNEqV6DAGTA==} + + '@whatwg-node/node-fetch@0.5.11': + resolution: {integrity: sha512-LS8tSomZa3YHnntpWt3PP43iFEEl6YeIsvDakczHBKlay5LdkXFr8w7v8H6akpG5nRrzydyB0k1iE2eoL6aKIQ==} + engines: {node: '>=16.0.0'} + + '@xtuc/ieee754@1.2.0': + resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} + + '@xtuc/long@4.2.2': + resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} + + abitype@0.9.8: + resolution: {integrity: sha512-puLifILdm+8sjyss4S+fsUN09obiT1g2YW6CtcQF+QDzxR0euzgEB29MZujC6zMk2a6SVmtttq1fc6+YFA7WYQ==} + peerDependencies: + typescript: '>=5.0.4' + zod: ^3 >=3.19.1 + peerDependenciesMeta: + typescript: + optional: true + zod: + optional: true + + abitype@1.0.0: + resolution: {integrity: sha512-NMeMah//6bJ56H5XRj8QCV4AwuW6hB6zqz2LnhhLdcWVQOsXki6/Pn3APeqxCma62nXIcmZWdu1DlHWS74umVQ==} + peerDependencies: + typescript: '>=5.0.4' + zod: ^3 >=3.22.0 + peerDependenciesMeta: + typescript: + optional: true + zod: + optional: true + + abort-controller@3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} + + accepts@1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} + + acorn-import-assertions@1.9.0: + resolution: {integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==} + peerDependencies: + acorn: ^8 + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn@8.11.3: + resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} + engines: {node: '>=0.4.0'} + hasBin: true + + agent-base@7.1.1: + resolution: {integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==} + engines: {node: '>= 14'} + + aggregate-error@3.1.0: + resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} + engines: {node: '>=8'} + + ajv-keywords@3.5.2: + resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} + peerDependencies: + ajv: ^6.9.1 + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + anser@1.4.10: + resolution: {integrity: sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww==} + + ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + + ansi-fragments@0.2.1: + resolution: {integrity: sha512-DykbNHxuXQwUDRv5ibc2b0x7uw7wmwOGLBUd5RmaQ5z8Lhx19vwvKV+FAsM5rEA6dEcHxX+/Ad5s9eF2k2bB+w==} + + ansi-regex@4.1.1: + resolution: {integrity: sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==} + engines: {node: '>=6'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + appdirsjs@1.2.7: + resolution: {integrity: sha512-Quji6+8kLBC3NnBeo14nPDq0+2jUs5s3/xEye+udFHumHhRk4M7aAMXp/PBJqkKYGuuyR9M/6Dq7d2AViiGmhw==} + + argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + aria-query@5.3.0: + resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} + + array-buffer-byte-length@1.0.1: + resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} + engines: {node: '>= 0.4'} + + array-includes@3.1.8: + resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} + engines: {node: '>= 0.4'} + + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + + array.prototype.findlast@1.2.5: + resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} + engines: {node: '>= 0.4'} + + array.prototype.findlastindex@1.2.5: + resolution: {integrity: sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==} + engines: {node: '>= 0.4'} + + array.prototype.flat@1.3.2: + resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} + engines: {node: '>= 0.4'} + + array.prototype.flatmap@1.3.2: + resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} + engines: {node: '>= 0.4'} + + array.prototype.toreversed@1.1.2: + resolution: {integrity: sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==} + + array.prototype.tosorted@1.1.3: + resolution: {integrity: sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg==} + + arraybuffer.prototype.slice@1.0.3: + resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} + engines: {node: '>= 0.4'} + + asap@2.0.6: + resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} + + asn1.js@4.10.1: + resolution: {integrity: sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==} + + asn1js@3.0.5: + resolution: {integrity: sha512-FVnvrKJwpt9LP2lAMl8qZswRNm3T4q9CON+bxldk2iwk3FFpuwhx2FfinyitizWHsVYyaY+y5JzDR0rCMV5yTQ==} + engines: {node: '>=12.0.0'} + + assert@2.1.0: + resolution: {integrity: sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==} + + ast-types-flow@0.0.8: + resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} + + ast-types@0.15.2: + resolution: {integrity: sha512-c27loCv9QkZinsa5ProX751khO9DJl/AcB5c2KNtA6NRvHKS0PgLfcftz72KVq504vB0Gku5s2kUZzDBvQWvHg==} + engines: {node: '>=4'} + + astral-regex@1.0.0: + resolution: {integrity: sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==} + engines: {node: '>=4'} + + astral-regex@2.0.0: + resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} + engines: {node: '>=8'} + + async-limiter@1.0.1: + resolution: {integrity: sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==} + + async-mutex@0.2.6: + resolution: {integrity: sha512-Hs4R+4SPgamu6rSGW8C7cV9gaWUKEHykfzCCvIRuaVv636Ju10ZdeUbvb4TBEW0INuq2DHZqXbK4Nd3yG4RaRw==} + + atomic-sleep@1.0.0: + resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} + engines: {node: '>=8.0.0'} + + auto-bind@4.0.0: + resolution: {integrity: sha512-Hdw8qdNiqdJ8LqT0iK0sVzkFbzg6fhnQqqfWhBDxcHZvU75+B+ayzTy8x+k5Ix0Y92XOhOUlx74ps+bA6BeYMQ==} + engines: {node: '>=8'} + + available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + + axe-core@4.7.0: + resolution: {integrity: sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ==} + engines: {node: '>=4'} + + axobject-query@3.2.1: + resolution: {integrity: sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==} + + babel-core@7.0.0-bridge.0: + resolution: {integrity: sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + babel-plugin-macros@3.1.0: + resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} + engines: {node: '>=10', npm: '>=6'} + + babel-plugin-polyfill-corejs2@0.4.10: + resolution: {integrity: sha512-rpIuu//y5OX6jVU+a5BCn1R5RSZYWAl2Nar76iwaOdycqb6JPxediskWFMMl7stfwNJR4b7eiQvh5fB5TEQJTQ==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + babel-plugin-polyfill-corejs3@0.10.4: + resolution: {integrity: sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + babel-plugin-polyfill-regenerator@0.6.1: + resolution: {integrity: sha512-JfTApdE++cgcTWjsiCQlLyFBMbTUft9ja17saCc93lgV33h4tuCVj7tlvu//qpLwaG+3yEz7/KhahGrUMkVq9g==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + babel-plugin-syntax-trailing-function-commas@7.0.0-beta.0: + resolution: {integrity: sha512-Xj9XuRuz3nTSbaTXWv3itLOcxyF4oPD8douBBmj7U9BBC6nEBYfyOJYQMf/8PJAFotC62UY5dFfIGEPr7WswzQ==} + + babel-plugin-transform-flow-enums@0.0.2: + resolution: {integrity: sha512-g4aaCrDDOsWjbm0PUUeVnkcVd6AKJsVc/MbnPhEotEpkeJQP6b8nzewohQi7+QS8UyPehOhGWn0nOwjvWpmMvQ==} + + babel-preset-fbjs@3.4.0: + resolution: {integrity: sha512-9ywCsCvo1ojrw0b+XYk7aFvTH6D9064t0RIL1rtMf3nsa02Xw41MS7sZw216Im35xj/UY0PDBQsa1brUDDF1Ow==} + peerDependencies: + '@babel/core': ^7.0.0 + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + bignumber.js@9.1.2: + resolution: {integrity: sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==} + + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + + bn.js@4.12.0: + resolution: {integrity: sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==} + + bn.js@5.2.1: + resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==} + + bowser@2.11.0: + resolution: {integrity: sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==} + + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + + braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + + brorand@1.1.0: + resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==} + + browser-resolve@2.0.0: + resolution: {integrity: sha512-7sWsQlYL2rGLy2IWm8WL8DCTJvYLc/qlOnsakDac87SOoCd16WLsaAMdCiAqsTNHIe+SXfaqyxyo6THoWqs8WQ==} + + browserify-aes@1.2.0: + resolution: {integrity: sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==} + + browserify-cipher@1.0.1: + resolution: {integrity: sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==} + + browserify-des@1.0.2: + resolution: {integrity: sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==} + + browserify-rsa@4.1.0: + resolution: {integrity: sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==} + + browserify-sign@4.2.3: + resolution: {integrity: sha512-JWCZW6SKhfhjJxO8Tyiiy+XYB7cqd2S5/+WeYHsKdNKFlCBhKbblba1A/HN/90YwtxKc8tCErjffZl++UNmGiw==} + engines: {node: '>= 0.12'} + + browserify-zlib@0.2.0: + resolution: {integrity: sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==} + + browserslist@4.23.0: + resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + bser@2.1.1: + resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + buffer-xor@1.0.3: + resolution: {integrity: sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==} + + buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + + buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + + bufferutil@4.0.8: + resolution: {integrity: sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw==} + engines: {node: '>=6.14.2'} + + builtin-status-codes@3.0.0: + resolution: {integrity: sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==} + + busboy@1.6.0: + resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} + engines: {node: '>=10.16.0'} + + bytes@3.0.0: + resolution: {integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==} + engines: {node: '>= 0.8'} + + call-bind@1.0.7: + resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} + engines: {node: '>= 0.4'} + + caller-callsite@2.0.0: + resolution: {integrity: sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==} + engines: {node: '>=4'} + + caller-path@2.0.0: + resolution: {integrity: sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A==} + engines: {node: '>=4'} + + callsites@2.0.0: + resolution: {integrity: sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ==} + engines: {node: '>=4'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + camel-case@4.1.2: + resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} + + camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + + camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + + camelize@1.0.1: + resolution: {integrity: sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==} + + caniuse-lite@1.0.30001610: + resolution: {integrity: sha512-QFutAY4NgaelojVMjY63o6XlZyORPaLfyMnsl3HgnWdJUcX6K0oaJymHjH8PT5Gk7sTm8rvC/c5COUQKXqmOMA==} + + canvas-renderer@2.2.1: + resolution: {integrity: sha512-RrBgVL5qCEDIXpJ6NrzyRNoTnXxYarqm/cS/W6ERhUJts5UQtt/XPEosGN3rqUkZ4fjBArlnCbsISJ+KCFnIAg==} + + capital-case@1.0.4: + resolution: {integrity: sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==} + + chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + change-case-all@1.0.15: + resolution: {integrity: sha512-3+GIFhk3sNuvFAJKU46o26OdzudQlPNBCu1ZQi3cMeMHhty1bhDxu2WrEilVNYaGvqUtR1VSigFcJOiS13dRhQ==} + + change-case@4.1.2: + resolution: {integrity: sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==} + + chardet@0.7.0: + resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + + chrome-launcher@0.15.2: + resolution: {integrity: sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ==} + engines: {node: '>=12.13.0'} + hasBin: true + + chrome-trace-event@1.0.3: + resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==} + engines: {node: '>=6.0'} + + chromium-edge-launcher@1.0.0: + resolution: {integrity: sha512-pgtgjNKZ7i5U++1g1PWv75umkHvhVTDOQIZ+sjeUX9483S7Y6MUvO0lrd7ShGlQlFHMN4SwKTCq/X8hWrbv2KA==} + + ci-info@2.0.0: + resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==} + + ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + engines: {node: '>=8'} + + cipher-base@1.0.4: + resolution: {integrity: sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==} + + citty@0.1.6: + resolution: {integrity: sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==} + + clean-stack@2.2.0: + resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} + engines: {node: '>=6'} + + cli-cursor@3.1.0: + resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} + engines: {node: '>=8'} + + cli-spinners@2.9.2: + resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} + engines: {node: '>=6'} + + cli-truncate@2.1.0: + resolution: {integrity: sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==} + engines: {node: '>=8'} + + cli-width@3.0.0: + resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} + engines: {node: '>= 10'} + + clipboardy@4.0.0: + resolution: {integrity: sha512-5mOlNS0mhX0707P2I0aZ2V/cmHUEO/fL7VFLqszkhUsxt7RwnmrInf/eEQKlf5GzvYeHIjT+Ov1HRfNmymlG0w==} + engines: {node: '>=18'} + + cliui@6.0.0: + resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + clone-deep@4.0.1: + resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} + engines: {node: '>=6'} + + clone@1.0.4: + resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} + engines: {node: '>=0.8'} + + clsx@1.2.1: + resolution: {integrity: sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==} + engines: {node: '>=6'} + + color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + colord@2.9.3: + resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==} + + colorette@1.4.0: + resolution: {integrity: sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==} + + colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + + command-exists@1.2.9: + resolution: {integrity: sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==} + + commander@10.0.1: + resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} + engines: {node: '>=14'} + + commander@12.0.0: + resolution: {integrity: sha512-MwVNWlYjDTtOjX5PiD7o5pK0UrFU/OYgcJfjjK4RaHZETNtjJqrZa9Y9ds88+A+f+d5lv+561eZ+yCKoS3gbAA==} + engines: {node: '>=18'} + + commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + + commander@8.3.0: + resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} + engines: {node: '>= 12'} + + commander@9.5.0: + resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} + engines: {node: ^12.20.0 || >=14} + + common-tags@1.8.2: + resolution: {integrity: sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==} + engines: {node: '>=4.0.0'} + + commondir@1.0.1: + resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} + + compressible@2.0.18: + resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} + engines: {node: '>= 0.6'} + + compression@1.7.4: + resolution: {integrity: sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==} + engines: {node: '>= 0.8.0'} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + connect@3.7.0: + resolution: {integrity: sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==} + engines: {node: '>= 0.10.0'} + + consola@3.2.3: + resolution: {integrity: sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==} + engines: {node: ^14.18.0 || >=16.10.0} + + console-browserify@1.2.0: + resolution: {integrity: sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==} + + constant-case@3.0.4: + resolution: {integrity: sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==} + + constants-browserify@1.0.0: + resolution: {integrity: sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==} + + convert-source-map@1.9.0: + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + cookie-es@1.1.0: + resolution: {integrity: sha512-L2rLOcK0wzWSfSDA33YR+PUHDG10a8px7rUHKWbGLP4YfbsMed2KFUw5fczvDPbT98DDe3LEzviswl810apTEw==} + + copy-to-clipboard@3.3.3: + resolution: {integrity: sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==} + + core-js-compat@3.37.0: + resolution: {integrity: sha512-vYq4L+T8aS5UuFg4UwDhc7YNRWVeVZwltad9C/jV3R2LgVOpS9BDr7l/WL6BN0dbV3k1XejPTHqqEzJgsa0frA==} + + core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + + cosmiconfig@5.2.1: + resolution: {integrity: sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==} + engines: {node: '>=4'} + + cosmiconfig@7.1.0: + resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} + engines: {node: '>=10'} + + cosmiconfig@8.3.6: + resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + + crc-32@1.2.2: + resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} + engines: {node: '>=0.8'} + hasBin: true + + create-ecdh@4.0.4: + resolution: {integrity: sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==} + + create-hash@1.2.0: + resolution: {integrity: sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==} + + create-hmac@1.1.7: + resolution: {integrity: sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==} + + create-require@1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + + cross-fetch@3.1.8: + resolution: {integrity: sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==} + + cross-fetch@4.0.0: + resolution: {integrity: sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==} + + cross-inspect@1.0.0: + resolution: {integrity: sha512-4PFfn4b5ZN6FMNGSZlyb7wUhuN8wvj8t/VQHZdM4JsDcruGJ8L2kf9zao98QIrBPFCpdk27qst/AGTl7pL3ypQ==} + engines: {node: '>=16.0.0'} + + cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + + crossws@0.2.4: + resolution: {integrity: sha512-DAxroI2uSOgUKLz00NX6A8U/8EE3SZHmIND+10jkVSaypvyt57J5JEOxAQOL6lQxyzi/wZbTIwssU1uy69h5Vg==} + peerDependencies: + uWebSockets.js: '*' + peerDependenciesMeta: + uWebSockets.js: + optional: true + + crypto-browserify@3.12.0: + resolution: {integrity: sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==} + + css-color-keywords@1.0.0: + resolution: {integrity: sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==} + engines: {node: '>=4'} + + css-to-react-native@3.2.0: + resolution: {integrity: sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==} + + csstype@3.1.2: + resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==} + + csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + + damerau-levenshtein@1.0.8: + resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} + + data-uri-to-buffer@4.0.1: + resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} + engines: {node: '>= 12'} + + data-view-buffer@1.0.1: + resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} + engines: {node: '>= 0.4'} + + data-view-byte-length@1.0.1: + resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} + engines: {node: '>= 0.4'} + + data-view-byte-offset@1.0.0: + resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} + engines: {node: '>= 0.4'} + + dataloader@2.2.2: + resolution: {integrity: sha512-8YnDaaf7N3k/q5HnTJVuzSyLETjoZjVmHc4AeKAzOvKHEFQKcn64OKBfzHYtE9zGjctNM7V9I0MfnUVLpi7M5g==} + + date-fns@2.30.0: + resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} + engines: {node: '>=0.11'} + + dayjs@1.11.10: + resolution: {integrity: sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==} + + debounce@1.2.1: + resolution: {integrity: sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==} + + debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decamelize@1.2.0: + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} + engines: {node: '>=0.10.0'} + + decode-uri-component@0.2.2: + resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} + engines: {node: '>=0.10'} + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + + defaults@1.0.4: + resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-lazy-prop@2.0.0: + resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} + engines: {node: '>=8'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + + defu@6.1.4: + resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} + + denodeify@1.2.1: + resolution: {integrity: sha512-KNTihKNmQENUZeKu5fzfpzRqR5S2VMp4gl9RFHiWzj9DfvYQPMJ6XHKNaQxaGCXwPk6y9yme3aUoaiAe+KX+vg==} + + depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + + dependency-graph@0.11.0: + resolution: {integrity: sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==} + engines: {node: '>= 0.6.0'} + + deprecated-react-native-prop-types@5.0.0: + resolution: {integrity: sha512-cIK8KYiiGVOFsKdPMmm1L3tA/Gl+JopXL6F5+C7x39MyPsQYnP57Im/D6bNUzcborD7fcMwiwZqcBdBXXZucYQ==} + engines: {node: '>=18'} + + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + + des.js@1.1.0: + resolution: {integrity: sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==} + + destr@2.0.3: + resolution: {integrity: sha512-2N3BOUU4gYMpTP24s5rF5iP7BDr7uNTCs4ozw3kf/eKfvWSIu93GEBi5m427YoyJoeOzQ5smuu4nNAPGb8idSQ==} + + destroy@1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + detect-browser@5.3.0: + resolution: {integrity: sha512-53rsFbGdwMwlF7qvCt0ypLM5V5/Mbl0szB7GPN8y9NCcbknYOeVVXdrXEq+90IwAfrrzt6Hd+u2E2ntakICU8w==} + + detect-indent@6.1.0: + resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} + engines: {node: '>=8'} + + detect-libc@1.0.3: + resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} + engines: {node: '>=0.10'} + hasBin: true + + diffie-hellman@5.0.3: + resolution: {integrity: sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==} + + dijkstrajs@1.0.3: + resolution: {integrity: sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==} + + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + + doctrine@2.1.0: + resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} + engines: {node: '>=0.10.0'} + + doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + + dom-helpers@5.2.1: + resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==} + + domain-browser@4.23.0: + resolution: {integrity: sha512-ArzcM/II1wCCujdCNyQjXrAFwS4mrLh4C7DZWlaI8mdh7h3BfKdNd3bKXITfl2PT9FtfQqaGvhi1vPRQPimjGA==} + engines: {node: '>=10'} + + dot-case@3.0.4: + resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} + + dotenv@16.4.5: + resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} + engines: {node: '>=12'} + + dset@3.1.3: + resolution: {integrity: sha512-20TuZZHCEZ2O71q9/+8BwKwZ0QtD9D8ObhrihJPr+vLLYlSuAU3/zL4cSlgbfeoGHTjCSJBa7NGcrF9/Bx/WJQ==} + engines: {node: '>=4'} + + duplexify@4.1.3: + resolution: {integrity: sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==} + + eciesjs@0.3.18: + resolution: {integrity: sha512-RQhegEtLSyIiGJmFTZfvCTHER/fymipXFVx6OwSRYD6hOuy+6Kjpk0dGvIfP9kxn/smBpxQy71uxpGO406ITCw==} + + ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + + electron-to-chromium@1.4.736: + resolution: {integrity: sha512-Rer6wc3ynLelKNM4lOCg7/zPQj8tPOCB2hzD32PX9wd3hgRRi9MxEbmkFCokzcEhRVMiOVLjnL9ig9cefJ+6+Q==} + + elliptic@6.5.5: + resolution: {integrity: sha512-7EjbcmUm17NQFu4Pmgmq2olYMj8nwMnpcddByChSUjArp8F5DQWcIcpriwO4ZToLNAJig0yiyjswfyGNje/ixw==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + encode-utf8@1.0.3: + resolution: {integrity: sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==} + + encodeurl@1.0.2: + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + engines: {node: '>= 0.8'} + + end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + + engine.io-client@6.5.3: + resolution: {integrity: sha512-9Z0qLB0NIisTRt1DZ/8U2k12RJn8yls/nXMZLn+/N8hANT3TcYjKFKcwbw5zFQiN4NTde3TSY9zb79e1ij6j9Q==} + + engine.io-parser@5.2.2: + resolution: {integrity: sha512-RcyUFKA93/CXH20l4SoVvzZfrSDMOTUS3bWVpTt2FuFP+XYrL8i8oonHP7WInRyVHXh0n/ORtoeiE1os+8qkSw==} + engines: {node: '>=10.0.0'} + + enhanced-resolve@5.16.0: + resolution: {integrity: sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA==} + engines: {node: '>=10.13.0'} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + envinfo@7.12.0: + resolution: {integrity: sha512-Iw9rQJBGpJRd3rwXm9ft/JiGoAZmLxxJZELYDQoPRZ4USVhkKtIcNBPw6U+/K2mBpaqM25JSV6Yl4Az9vO2wJg==} + engines: {node: '>=4'} + hasBin: true + + error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + + error-stack-parser@2.1.4: + resolution: {integrity: sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==} + + errorhandler@1.5.1: + resolution: {integrity: sha512-rcOwbfvP1WTViVoUjcfZicVzjhjTuhSMntHh6mW3IrEiyE6mJyXvsToJUJGlGlw/2xU9P5whlWNGlIDVeCiT4A==} + engines: {node: '>= 0.8'} + + es-abstract@1.23.3: + resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==} + engines: {node: '>= 0.4'} + + es-define-property@1.0.0: + resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-iterator-helpers@1.0.18: + resolution: {integrity: sha512-scxAJaewsahbqTYrGKJihhViaM6DDZDDoucfvzNbK0pOren1g/daDQ3IAhzn+1G14rBG7w+i5N+qul60++zlKA==} + engines: {node: '>= 0.4'} + + es-module-lexer@1.5.0: + resolution: {integrity: sha512-pqrTKmwEIgafsYZAGw9kszYzmagcE/n4dbgwGWLEXg7J4QFJVQRBld8j3Q3GNez79jzxZshq0bcT962QHOghjw==} + + es-object-atoms@1.0.0: + resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.0.3: + resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} + engines: {node: '>= 0.4'} + + es-shim-unscopables@1.0.2: + resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} + + es-to-primitive@1.2.1: + resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} + engines: {node: '>= 0.4'} + + esbuild@0.20.2: + resolution: {integrity: sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==} + engines: {node: '>=12'} + hasBin: true + + escalade@3.1.2: + resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} + engines: {node: '>=6'} + + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + + escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + escape-string-regexp@2.0.0: + resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} + engines: {node: '>=8'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + eslint-config-prettier@9.1.0: + resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + + eslint-import-resolver-node@0.3.9: + resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} + + eslint-import-resolver-typescript@3.6.1: + resolution: {integrity: sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + eslint: '*' + eslint-plugin-import: '*' + + eslint-module-utils@2.8.1: + resolution: {integrity: sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: '*' + eslint-import-resolver-node: '*' + eslint-import-resolver-typescript: '*' + eslint-import-resolver-webpack: '*' + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint: + optional: true + eslint-import-resolver-node: + optional: true + eslint-import-resolver-typescript: + optional: true + eslint-import-resolver-webpack: + optional: true + + eslint-plugin-import@2.29.1: + resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + + eslint-plugin-jsx-a11y@6.8.0: + resolution: {integrity: sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA==} + engines: {node: '>=4.0'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + + eslint-plugin-react-hooks@4.6.0: + resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==} + engines: {node: '>=10'} + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 + + eslint-plugin-react-refresh@0.4.6: + resolution: {integrity: sha512-NjGXdm7zgcKRkKMua34qVO9doI7VOxZ6ancSvBELJSSoX97jyndXcSoa8XBh69JoB31dNz3EEzlMcizZl7LaMA==} + peerDependencies: + eslint: '>=7' + + eslint-plugin-react@7.34.1: + resolution: {integrity: sha512-N97CxlouPT1AHt8Jn0mhhN2RrADlUAsk1/atcT2KyA/l9Q/E6ll7OIGwNumFmWfZ9skV3XXccYS19h80rHtgkw==} + engines: {node: '>=4'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + + eslint-scope@5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + + eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint@8.57.0: + resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + + espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + esquery@1.5.0: + resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + + eth-block-tracker@7.1.0: + resolution: {integrity: sha512-8YdplnuE1IK4xfqpf4iU7oBxnOYAc35934o083G8ao+8WM8QQtt/mVlAY6yIAdY1eMeLqg4Z//PZjJGmWGPMRg==} + engines: {node: '>=14.0.0'} + + eth-json-rpc-filters@6.0.1: + resolution: {integrity: sha512-ITJTvqoCw6OVMLs7pI8f4gG92n/St6x80ACtHodeS+IXmO0w+t1T5OOzfSt7KLSMLRkVUoexV7tztLgDxg+iig==} + engines: {node: '>=14.0.0'} + + eth-query@2.1.2: + resolution: {integrity: sha512-srES0ZcvwkR/wd5OQBRA1bIJMww1skfGS0s8wlwK3/oNP4+wnds60krvu5R1QbpRQjMmpG5OMIWro5s7gvDPsA==} + + eth-rpc-errors@4.0.3: + resolution: {integrity: sha512-Z3ymjopaoft7JDoxZcEb3pwdGh7yiYMhOwm2doUt6ASXlMavpNlK6Cre0+IMl2VSGyEU9rkiperQhp5iRxn5Pg==} + + ethereum-blockies-base64@1.0.2: + resolution: {integrity: sha512-Vg2HTm7slcWNKaRhCUl/L3b4KrB8ohQXdd5Pu3OI897EcR6tVRvUqdTwAyx+dnmoDzj8e2bwBLDQ50ByFmcz6w==} + + ethereum-cryptography@2.1.3: + resolution: {integrity: sha512-BlwbIL7/P45W8FGW2r7LGuvoEZ+7PWsniMvQ4p5s2xCyw9tmaDlpfsN9HjAucbF+t/qpVHwZUisgfK24TCW8aA==} + + event-target-shim@5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} + + eventemitter2@6.4.9: + resolution: {integrity: sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg==} + + eventemitter3@5.0.1: + resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + + events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + + evp_bytestokey@1.0.3: + resolution: {integrity: sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==} + + execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + + execa@8.0.1: + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} + engines: {node: '>=16.17'} + + extension-port-stream@2.1.1: + resolution: {integrity: sha512-qknp5o5rj2J9CRKfVB8KJr+uXQlrojNZzdESUPhKYLXf97TPcGf6qWWKmpsNNtUyOdzFhab1ON0jzouNxHHvow==} + engines: {node: '>=12.0.0'} + + external-editor@3.1.0: + resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} + engines: {node: '>=4'} + + extract-files@11.0.0: + resolution: {integrity: sha512-FuoE1qtbJ4bBVvv94CC7s0oTnKUGvQs+Rjf1L2SJFfS+HTVVjhPFtehPdQ0JiGPqVNfSSZvL5yzHHQq2Z4WNhQ==} + engines: {node: ^12.20 || >= 14.13} + + fast-decode-uri-component@1.0.1: + resolution: {integrity: sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==} + + fast-deep-equal@2.0.1: + resolution: {integrity: sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w==} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fast-querystring@1.1.2: + resolution: {integrity: sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==} + + fast-redact@3.5.0: + resolution: {integrity: sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==} + engines: {node: '>=6'} + + fast-safe-stringify@2.1.1: + resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} + + fast-url-parser@1.1.3: + resolution: {integrity: sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ==} + + fast-xml-parser@4.3.6: + resolution: {integrity: sha512-M2SovcRxD4+vC493Uc2GZVcZaj66CCJhWurC4viynVSTvrpErCShNcDz1lAho6n9REQKvL/ll4A4/fw6Y9z8nw==} + hasBin: true + + fastest-levenshtein@1.0.16: + resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} + engines: {node: '>= 4.9.1'} + + fastq@1.17.1: + resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + + fb-watchman@2.0.2: + resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} + + fbjs-css-vars@1.0.2: + resolution: {integrity: sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==} + + fbjs@3.0.5: + resolution: {integrity: sha512-ztsSx77JBtkuMrEypfhgc3cI0+0h+svqeie7xHbh1k/IKdcydnvadp/mUaGgjAOXQmQSxsqgaRhS3q9fy+1kxg==} + + fetch-blob@3.2.0: + resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} + engines: {node: ^12.20 || >= 14.13} + + figures@3.2.0: + resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} + engines: {node: '>=8'} + + file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + + fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + + filter-obj@1.1.0: + resolution: {integrity: sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==} + engines: {node: '>=0.10.0'} + + finalhandler@1.1.2: + resolution: {integrity: sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==} + engines: {node: '>= 0.8'} + + find-cache-dir@2.1.0: + resolution: {integrity: sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==} + engines: {node: '>=6'} + + find-root@1.1.0: + resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} + + find-up@3.0.0: + resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} + engines: {node: '>=6'} + + find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} + + flat@5.0.2: + resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} + hasBin: true + + flatted@3.3.1: + resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} + + flow-enums-runtime@0.0.6: + resolution: {integrity: sha512-3PYnM29RFXwvAN6Pc/scUfkI7RwhQ/xqyLUyPNlXUp9S40zI8nup9tUSrTLSVnWGBN38FNiGWbwZOB6uR4OGdw==} + + flow-parser@0.206.0: + resolution: {integrity: sha512-HVzoK3r6Vsg+lKvlIZzaWNBVai+FXTX1wdYhz/wVlH13tb/gOdLXmlTqy6odmTBhT5UoWUbq0k8263Qhr9d88w==} + engines: {node: '>=0.4.0'} + + for-each@0.3.3: + resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + + formdata-polyfill@4.0.10: + resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} + engines: {node: '>=12.20.0'} + + fresh@0.5.2: + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} + + fs-extra@11.2.0: + resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} + engines: {node: '>=14.14'} + + fs-extra@8.1.0: + resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} + engines: {node: '>=6 <7 || >=8'} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + function.prototype.name@1.1.6: + resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} + engines: {node: '>= 0.4'} + + functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + + futoin-hkdf@1.5.3: + resolution: {integrity: sha512-SewY5KdMpaoCeh7jachEWFsh1nNlaDjNHZXWqL5IGwtpEYHTgkr2+AMCgNwKWkcc0wpSYrZfR7he4WdmHFtDxQ==} + engines: {node: '>=8'} + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-intrinsic@1.2.4: + resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} + engines: {node: '>= 0.4'} + + get-port-please@3.1.2: + resolution: {integrity: sha512-Gxc29eLs1fbn6LQ4jSU4vXjlwyZhF5HsGuMAa7gqBP4Rw4yxxltyDUuF5MBclFzDTXO+ACchGQoeela4DSfzdQ==} + + get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + + get-stream@8.0.1: + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} + engines: {node: '>=16'} + + get-symbol-description@1.0.2: + resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} + engines: {node: '>= 0.4'} + + get-tsconfig@4.7.3: + resolution: {integrity: sha512-ZvkrzoUA0PQZM6fy6+/Hce561s+faD1rsNwhnO5FelNjyy7EMGJ3Rz1AQ8GYDWjhRs/7dBLOEJvhK8MiEJOAFg==} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob-to-regexp@0.4.1: + resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + + globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + + globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} + + globalthis@1.0.3: + resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} + engines: {node: '>= 0.4'} + + globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + + gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + + graphql-config@5.0.3: + resolution: {integrity: sha512-BNGZaoxIBkv9yy6Y7omvsaBUHOzfFcII3UN++tpH8MGOKFPFkCPZuwx09ggANMt8FgyWP1Od8SWPmrUEZca4NQ==} + engines: {node: '>= 16.0.0'} + peerDependencies: + cosmiconfig-toml-loader: ^1.0.0 + graphql: ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 + peerDependenciesMeta: + cosmiconfig-toml-loader: + optional: true + + graphql-request@6.1.0: + resolution: {integrity: sha512-p+XPfS4q7aIpKVcgmnZKhMNqhltk20hfXtkaIkTfjjmiKMJ5xrt5c743cL03y/K7y1rg3WrIC49xGiEQ4mxdNw==} + peerDependencies: + graphql: 14 - 16 + + graphql-tag@2.12.6: + resolution: {integrity: sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg==} + engines: {node: '>=10'} + peerDependencies: + graphql: ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 + + graphql-ws@5.16.0: + resolution: {integrity: sha512-Ju2RCU2dQMgSKtArPbEtsK5gNLnsQyTNIo/T7cZNp96niC1x0KdJNZV0TIoilceBPQwfb5itrGl8pkFeOUMl4A==} + engines: {node: '>=10'} + peerDependencies: + graphql: '>=0.11 <=16' + + graphql@16.8.1: + resolution: {integrity: sha512-59LZHPdGZVh695Ud9lRzPBVTtlX9ZCV150Er2W43ro37wVof0ctenSaskPPjN7lVTIN8mSZt8PHUNKZuNQUuxw==} + engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} + + h3@1.11.1: + resolution: {integrity: sha512-AbaH6IDnZN6nmbnJOH72y3c5Wwh9P97soSVdGSBbcDACRdkC0FEWf25pzx4f/NuOCK6quHmW18yF2Wx+G4Zi1A==} + + has-bigints@1.0.2: + resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + + has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-proto@1.0.3: + resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} + engines: {node: '>= 0.4'} + + has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hash-base@3.0.4: + resolution: {integrity: sha512-EeeoJKjTyt868liAlVmcv2ZsUfGHlE3Q+BICOXcZiwN3osr5Q/zFGYmTJpoIzuaSTAwndFy+GqhEwlU4L3j4Ow==} + engines: {node: '>=4'} + + hash-base@3.1.0: + resolution: {integrity: sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==} + engines: {node: '>=4'} + + hash.js@1.1.7: + resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + header-case@2.0.4: + resolution: {integrity: sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==} + + hermes-estree@0.15.0: + resolution: {integrity: sha512-lLYvAd+6BnOqWdnNbP/Q8xfl8LOGw4wVjfrNd9Gt8eoFzhNBRVD95n4l2ksfMVOoxuVyegs85g83KS9QOsxbVQ==} + + hermes-estree@0.20.1: + resolution: {integrity: sha512-SQpZK4BzR48kuOg0v4pb3EAGNclzIlqMj3Opu/mu7bbAoFw6oig6cEt/RAi0zTFW/iW6Iz9X9ggGuZTAZ/yZHg==} + + hermes-parser@0.15.0: + resolution: {integrity: sha512-Q1uks5rjZlE9RjMMjSUCkGrEIPI5pKJILeCtK1VmTj7U4pf3wVPoo+cxfu+s4cBAPy2JzikIIdCZgBoR6x7U1Q==} + + hermes-parser@0.20.1: + resolution: {integrity: sha512-BL5P83cwCogI8D7rrDCgsFY0tdYUtmFP9XaXtl2IQjC+2Xo+4okjfXintlTxcIwl4qeGddEl28Z11kbVIw0aNA==} + + hermes-profile-transformer@0.0.6: + resolution: {integrity: sha512-cnN7bQUm65UWOy6cbGcCcZ3rpwW8Q/j4OP5aWRhEry4Z2t2aR1cjrbp0BS+KiBN0smvP1caBgAuxutvyvJILzQ==} + engines: {node: '>=8'} + + hey-listen@1.0.8: + resolution: {integrity: sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q==} + + hmac-drbg@1.0.1: + resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} + + hoist-non-react-statics@3.3.2: + resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} + + html-parse-stringify@3.0.1: + resolution: {integrity: sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==} + + http-errors@2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + + http-proxy-agent@7.0.2: + resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} + engines: {node: '>= 14'} + + http-shutdown@1.2.2: + resolution: {integrity: sha512-S9wWkJ/VSY9/k4qcjG318bqJNruzE4HySUhFYknwmu6LBP97KLLfwNf+n4V1BHurvFNkSKLFnK/RsuUnRTf9Vw==} + engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + + https-browserify@1.0.0: + resolution: {integrity: sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==} + + https-proxy-agent@7.0.4: + resolution: {integrity: sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==} + engines: {node: '>= 14'} + + human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + + human-signals@5.0.0: + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} + engines: {node: '>=16.17.0'} + + i18next-browser-languagedetector@7.2.1: + resolution: {integrity: sha512-h/pM34bcH6tbz8WgGXcmWauNpQupCGr25XPp9cZwZInR9XHSjIFDYp1SIok7zSPsTOMxdvuLyu86V+g2Kycnfw==} + + i18next@22.5.1: + resolution: {integrity: sha512-8TGPgM3pAD+VRsMtUMNknRz3kzqwp/gPALrWMsDnmC1mKqJwpWyooQRLMcbTwq8z8YwSmuj+ZYvc+xCuEpkssA==} + + iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + + idb-keyval@6.2.1: + resolution: {integrity: sha512-8Sb3veuYCyrZL+VBt9LJfZjLUPWVvqn8tG28VqYNFCo43KHcKuq+b4EiXGeuaLAQWL2YmyDgMp2aSpH9JHsEQg==} + + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + ignore@5.3.1: + resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} + engines: {node: '>= 4'} + + image-size@1.1.1: + resolution: {integrity: sha512-541xKlUw6jr/6gGuk92F+mYM5zaFAc5ahphvkqvNe2bQ6gVBkd6bfrmVJ2t4KDAfikAYZyIqTnktX3i6/aQDrQ==} + engines: {node: '>=16.x'} + hasBin: true + + immutable@3.7.6: + resolution: {integrity: sha512-AizQPcaofEtO11RZhPPHBOJRdo/20MKQF9mBLnVkBoyHi1/zXK8fzVdnEpSV9gxqtnh6Qomfp3F0xT5qP/vThw==} + engines: {node: '>=0.8.0'} + + immutable@4.3.5: + resolution: {integrity: sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw==} + + import-fresh@2.0.0: + resolution: {integrity: sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==} + engines: {node: '>=4'} + + import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + + import-from@4.0.0: + resolution: {integrity: sha512-P9J71vT5nLlDeV8FHs5nNxaLbrpfAV5cF5srvbZfpwpcJoM/xZR3hiv+q+SAnuSmuGbXMWud063iIMx/V/EWZQ==} + engines: {node: '>=12.2'} + + import-local@3.1.0: + resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==} + engines: {node: '>=8'} + hasBin: true + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + inquirer@8.2.6: + resolution: {integrity: sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg==} + engines: {node: '>=12.0.0'} + + internal-slot@1.0.7: + resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} + engines: {node: '>= 0.4'} + + interpret@3.1.1: + resolution: {integrity: sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==} + engines: {node: '>=10.13.0'} + + invariant@2.2.4: + resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} + + iron-webcrypto@1.1.0: + resolution: {integrity: sha512-5vgYsCakNlaQub1orZK5QmNYhwYtcllTkZBp5sfIaCqY93Cf6l+v2rtE+E4TMbcfjxDMCdrO8wmp7+ZvhDECLA==} + + is-absolute@1.0.0: + resolution: {integrity: sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==} + engines: {node: '>=0.10.0'} + + is-arguments@1.1.1: + resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} + engines: {node: '>= 0.4'} + + is-array-buffer@3.0.4: + resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} + engines: {node: '>= 0.4'} + + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + is-async-function@2.0.0: + resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==} + engines: {node: '>= 0.4'} + + is-bigint@1.0.4: + resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-boolean-object@1.1.2: + resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} + engines: {node: '>= 0.4'} + + is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + + is-core-module@2.13.1: + resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} + + is-data-view@1.0.1: + resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} + engines: {node: '>= 0.4'} + + is-date-object@1.0.5: + resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} + engines: {node: '>= 0.4'} + + is-directory@0.3.1: + resolution: {integrity: sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==} + engines: {node: '>=0.10.0'} + + is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + + is-docker@3.0.0: + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-finalizationregistry@1.0.2: + resolution: {integrity: sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==} + + is-fullwidth-code-point@2.0.0: + resolution: {integrity: sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==} + engines: {node: '>=4'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-generator-function@1.0.10: + resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} + engines: {node: '>= 0.4'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + hasBin: true + + is-interactive@1.0.0: + resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} + engines: {node: '>=8'} + + is-lower-case@2.0.2: + resolution: {integrity: sha512-bVcMJy4X5Og6VZfdOZstSexlEy20Sr0k/p/b2IlQJlfdKAQuMpiv5w2Ccxb8sKdRUNAG1PnHVHjFSdRDVS6NlQ==} + + is-map@2.0.3: + resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} + engines: {node: '>= 0.4'} + + is-nan@1.3.2: + resolution: {integrity: sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==} + engines: {node: '>= 0.4'} + + is-negative-zero@2.0.3: + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} + engines: {node: '>= 0.4'} + + is-number-object@1.0.7: + resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} + engines: {node: '>= 0.4'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + + is-plain-obj@2.1.0: + resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} + engines: {node: '>=8'} + + is-plain-object@2.0.4: + resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} + engines: {node: '>=0.10.0'} + + is-regex@1.1.4: + resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} + engines: {node: '>= 0.4'} + + is-relative@1.0.0: + resolution: {integrity: sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==} + engines: {node: '>=0.10.0'} + + is-set@2.0.3: + resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} + engines: {node: '>= 0.4'} + + is-shared-array-buffer@1.0.3: + resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} + engines: {node: '>= 0.4'} + + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + + is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + is-string@1.0.7: + resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} + engines: {node: '>= 0.4'} + + is-symbol@1.0.4: + resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} + engines: {node: '>= 0.4'} + + is-typed-array@1.1.13: + resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} + engines: {node: '>= 0.4'} + + is-unc-path@1.0.0: + resolution: {integrity: sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==} + engines: {node: '>=0.10.0'} + + is-unicode-supported@0.1.0: + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} + engines: {node: '>=10'} + + is-upper-case@2.0.2: + resolution: {integrity: sha512-44pxmxAvnnAOwBg4tHPnkfvgjPwbc5QIsSstNU+YcJ1ovxVzCWpSGosPJOZh/a1tdl81fbgnLc9LLv+x2ywbPQ==} + + is-weakmap@2.0.2: + resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} + engines: {node: '>= 0.4'} + + is-weakref@1.0.2: + resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + + is-weakset@2.0.3: + resolution: {integrity: sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==} + engines: {node: '>= 0.4'} + + is-windows@1.0.2: + resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} + engines: {node: '>=0.10.0'} + + is-wsl@1.1.0: + resolution: {integrity: sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==} + engines: {node: '>=4'} + + is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + + is-wsl@3.1.0: + resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} + engines: {node: '>=16'} + + is64bit@2.0.0: + resolution: {integrity: sha512-jv+8jaWCl0g2lSBkNSVXdzfBA0npK1HGC2KtWM9FumFRoGS94g3NbCCLVnCYHLjp4GrW2KZeeSTMo5ddtznmGw==} + engines: {node: '>=18'} + + isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + + isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + isobject@3.0.1: + resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} + engines: {node: '>=0.10.0'} + + isomorphic-timers-promises@1.0.1: + resolution: {integrity: sha512-u4sej9B1LPSxTGKB/HiuzvEQnXH0ECYkSVQU39koSwmFAxhlEAFl9RdTvLv4TOTQUgBS5O3O5fwUxk6byBZ+IQ==} + engines: {node: '>=10'} + + isomorphic-unfetch@3.1.0: + resolution: {integrity: sha512-geDJjpoZ8N0kWexiwkX8F9NkTsXhetLPVbZFQ+JTW239QNOwvB0gniuR1Wc6f0AMTn7/mFGyXvHTifrCp/GH8Q==} + + isomorphic-ws@5.0.0: + resolution: {integrity: sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==} + peerDependencies: + ws: '*' + + isows@1.0.3: + resolution: {integrity: sha512-2cKei4vlmg2cxEjm3wVSqn8pcoRF/LX/wpifuuNquFO4SQmPwarClT+SUCA2lt+l581tTeZIPIZuIDo2jWN1fg==} + peerDependencies: + ws: '*' + + iterator.prototype@1.1.2: + resolution: {integrity: sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==} + + jdenticon@3.2.0: + resolution: {integrity: sha512-z6Iq3fTODUMSOiR2nNYrqigS6Y0GvdXfyQWrUby7htDHvX7GNEwaWR4hcaL+FmhEgBe08Xkup/BKxXQhDJByPA==} + engines: {node: '>=6.4.0'} + hasBin: true + + jest-environment-node@29.7.0: + resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-get-type@29.6.3: + resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-message-util@29.7.0: + resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-mock@29.7.0: + resolution: {integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-util@29.7.0: + resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-validate@29.7.0: + resolution: {integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-worker@27.5.1: + resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} + engines: {node: '>= 10.13.0'} + + jest-worker@29.7.0: + resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jiti@1.21.0: + resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==} + hasBin: true + + joi@17.12.3: + resolution: {integrity: sha512-2RRziagf555owrm9IRVtdKynOBeITiDpuZqIpgwqXShPncPKNiRQoiGsl/T8SQdq+8ugRzH2LqY67irr2y/d+g==} + + jose@5.2.4: + resolution: {integrity: sha512-6ScbIk2WWCeXkmzF6bRPmEuaqy1m8SbsRFMa/FLrSCkGIhj8OLVG/IH+XHVmNMx/KUo8cVWEE6oKR4dJ+S0Rkg==} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + jsc-android@250231.0.0: + resolution: {integrity: sha512-rS46PvsjYmdmuz1OAWXY/1kCYG7pnf1TBqeTiOJr1iDz7s5DLxxC9n/ZMknLDxzYzNVfI7R95MH10emSSG1Wuw==} + + jsc-safe-url@0.2.4: + resolution: {integrity: sha512-0wM3YBWtYePOjfyXQH5MWQ8H7sdk5EXSwZvmSLKk2RboVQ2Bu239jycHDz5J/8Blf3K0Qnoy2b6xD+z10MFB+Q==} + + jscodeshift@0.14.0: + resolution: {integrity: sha512-7eCC1knD7bLUPuSCwXsMZUH51O8jIcoVyKtI6P0XM0IVzlGjckPy3FIwQlorzbN0Sg79oK+RlohN32Mqf/lrYA==} + hasBin: true + peerDependencies: + '@babel/preset-env': ^7.1.6 + + jsesc@0.5.0: + resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} + hasBin: true + + jsesc@2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-parse-better-errors@1.0.2: + resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + json-rpc-engine@6.1.0: + resolution: {integrity: sha512-NEdLrtrq1jUZyfjkr9OCz9EzCNhnRyWtt1PAnvnhwy6e8XETS0Dtc+ZNCO2gvuAoKsIn2+vCSowXTYE4CkgnAQ==} + engines: {node: '>=10.0.0'} + + json-rpc-middleware-stream@4.2.3: + resolution: {integrity: sha512-4iFb0yffm5vo3eFKDbQgke9o17XBcLQ2c3sONrXSbcOLzP8LTojqo8hRGVgtJShhm5q4ZDSNq039fAx9o65E1w==} + engines: {node: '>=14.0.0'} + + json-rpc-random-id@1.0.1: + resolution: {integrity: sha512-RJ9YYNCkhVDBuP4zN5BBtYAzEl03yq/jIIsyif0JY9qyJuQQZNeDK7anAPKKlyEtLSj2s8h6hNh2F8zO5q7ScA==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + json-stringify-safe@5.0.1: + resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + + json-to-pretty-yaml@1.2.2: + resolution: {integrity: sha512-rvm6hunfCcqegwYaG5T4yKJWxc9FXFgBVrcTZ4XfSVRwa5HA/Xs+vB/Eo9treYYHCeNM0nrSUr82V/M31Urc7A==} + engines: {node: '>= 0.2.0'} + + json5@1.0.2: + resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} + hasBin: true + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + jsonc-parser@3.2.1: + resolution: {integrity: sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==} + + jsonfile@4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + + jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + + jsx-ast-utils@3.3.5: + resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} + engines: {node: '>=4.0'} + + keccak@3.0.4: + resolution: {integrity: sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q==} + engines: {node: '>=10.0.0'} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + keyvaluestorage-interface@1.0.0: + resolution: {integrity: sha512-8t6Q3TclQ4uZynJY9IGr2+SsIGwK9JHcO6ootkHCGA0CrQCRy+VkouYNO2xicET6b9al7QKzpebNow+gkpCL8g==} + + kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + + kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + + language-subtag-registry@0.3.22: + resolution: {integrity: sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==} + + language-tags@1.0.9: + resolution: {integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==} + engines: {node: '>=0.10'} + + leven@3.1.0: + resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} + engines: {node: '>=6'} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + lighthouse-logger@1.4.2: + resolution: {integrity: sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + listhen@1.7.2: + resolution: {integrity: sha512-7/HamOm5YD9Wb7CFgAZkKgVPA96WwhcTQoqtm2VTZGVbVVn3IWKRBTgrU7cchA3Q8k9iCsG8Osoi9GX4JsGM9g==} + hasBin: true + + listr2@4.0.5: + resolution: {integrity: sha512-juGHV1doQdpNT3GSTs9IUN43QJb7KHdF9uqg7Vufs/tG9VTzpFphqF4pm/ICdAABGQxsyNn9CiYA3StkI6jpwA==} + engines: {node: '>=12'} + peerDependencies: + enquirer: '>= 2.3.0 < 3' + peerDependenciesMeta: + enquirer: + optional: true + + lit-element@3.3.3: + resolution: {integrity: sha512-XbeRxmTHubXENkV4h8RIPyr8lXc+Ff28rkcQzw3G6up2xg5E8Zu1IgOWIwBLEQsu3cOVFqdYwiVi0hv0SlpqUA==} + + lit-element@4.0.5: + resolution: {integrity: sha512-iTWskWZEtn9SyEf4aBG6rKT8GABZMrTWop1+jopsEOgEcugcXJGKuX5bEbkq9qfzY+XB4MAgCaSPwnNpdsNQ3Q==} + + lit-html@2.8.0: + resolution: {integrity: sha512-o9t+MQM3P4y7M7yNzqAyjp7z+mQGa4NS4CxiyLqFPyFWyc4O+nodLrkrxSaCTrla6M5YOLaT3RpbbqjszB5g3Q==} + + lit-html@3.1.3: + resolution: {integrity: sha512-FwIbqDD8O/8lM4vUZ4KvQZjPPNx7V1VhT7vmRB8RBAO0AU6wuTVdoXiu2CivVjEGdugvcbPNBLtPE1y0ifplHA==} + + lit@2.8.0: + resolution: {integrity: sha512-4Sc3OFX9QHOJaHbmTMk28SYgVxLN3ePDjg7hofEft2zWlehFL3LiAuapWc4U/kYwMYJSh2hTCPZ6/LIC7ii0MA==} + + lit@3.1.0: + resolution: {integrity: sha512-rzo/hmUqX8zmOdamDAeydfjsGXbbdtAFqMhmocnh2j9aDYqbu0fjXygjCa0T99Od9VQ/2itwaGrjZz/ZELVl7w==} + + loader-runner@4.3.0: + resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} + engines: {node: '>=6.11.5'} + + locate-path@3.0.0: + resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} + engines: {node: '>=6'} + + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash.debounce@4.0.8: + resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + + lodash.isequal@4.5.0: + resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lodash.sortby@4.7.0: + resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} + + lodash.throttle@4.1.1: + resolution: {integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + log-symbols@4.1.0: + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + engines: {node: '>=10'} + + log-update@4.0.0: + resolution: {integrity: sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==} + engines: {node: '>=10'} + + logkitty@0.7.1: + resolution: {integrity: sha512-/3ER20CTTbahrCrpYfPn7Xavv9diBROZpoXGVZDWMw4b/X4uuUwAC0ki85tgsdMRONURyIJbcOvS94QsUBYPbQ==} + hasBin: true + + loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + + lower-case-first@2.0.2: + resolution: {integrity: sha512-EVm/rR94FJTZi3zefZ82fLWab+GX14LJN4HrWBcuo6Evmsl9hEfnqxgcHCKb9q+mNf6EVdsjx/qucYFIIB84pg==} + + lower-case@2.0.2: + resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} + + lru-cache@10.2.0: + resolution: {integrity: sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==} + engines: {node: 14 || >=16.14} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + + magic-string@0.30.9: + resolution: {integrity: sha512-S1+hd+dIrC8EZqKyT9DstTH/0Z+f76kmmvZnkfQVmOpDEF9iVgdYif3Q/pIWHmCoo59bQVGW0kVL3e2nl+9+Sw==} + engines: {node: '>=12'} + + make-dir@2.1.0: + resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} + engines: {node: '>=6'} + + makeerror@1.0.12: + resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} + + map-cache@0.2.2: + resolution: {integrity: sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==} + engines: {node: '>=0.10.0'} + + marky@1.2.5: + resolution: {integrity: sha512-q9JtQJKjpsVxCRVgQ+WapguSbKC3SQ5HEzFGPAJMStgh3QjCawp00UKv3MTTAArTmGmmPUvllHZoNbZ3gs0I+Q==} + + md5.js@1.3.5: + resolution: {integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==} + + memoize-one@5.2.1: + resolution: {integrity: sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==} + + merge-options@3.0.4: + resolution: {integrity: sha512-2Sug1+knBjkaMsMgf1ctR1Ujx+Ayku4EdJN4Z+C2+JzoeF7A3OZ9KM2GY0CpQS51NR61LTurMJrRKPhSs3ZRTQ==} + engines: {node: '>=10'} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + meros@1.3.0: + resolution: {integrity: sha512-2BNGOimxEz5hmjUG2FwoxCt5HN7BXdaWyFqEwxPTrJzVdABtrL4TiHTcsWSFAxPQ/tOnEaQEJh3qWq71QRMY+w==} + engines: {node: '>=13'} + peerDependencies: + '@types/node': '>=13' + peerDependenciesMeta: + '@types/node': + optional: true + + metro-babel-transformer@0.80.8: + resolution: {integrity: sha512-TTzNwRZb2xxyv4J/+yqgtDAP2qVqH3sahsnFu6Xv4SkLqzrivtlnyUbaeTdJ9JjtADJUEjCbgbFgUVafrXdR9Q==} + engines: {node: '>=18'} + + metro-cache-key@0.80.8: + resolution: {integrity: sha512-qWKzxrLsRQK5m3oH8ePecqCc+7PEhR03cJE6Z6AxAj0idi99dHOSitTmY0dclXVB9vP2tQIAE8uTd8xkYGk8fA==} + engines: {node: '>=18'} + + metro-cache@0.80.8: + resolution: {integrity: sha512-5svz+89wSyLo7BxdiPDlwDTgcB9kwhNMfNhiBZPNQQs1vLFXxOkILwQiV5F2EwYT9DEr6OPZ0hnJkZfRQ8lDYQ==} + engines: {node: '>=18'} + + metro-config@0.80.8: + resolution: {integrity: sha512-VGQJpfJawtwRzGzGXVUoohpIkB0iPom4DmSbAppKfumdhtLA8uVeEPp2GM61kL9hRvdbMhdWA7T+hZFDlo4mJA==} + engines: {node: '>=18'} + + metro-core@0.80.8: + resolution: {integrity: sha512-g6lud55TXeISRTleW6SHuPFZHtYrpwNqbyFIVd9j9Ofrb5IReiHp9Zl8xkAfZQp8v6ZVgyXD7c130QTsCz+vBw==} + engines: {node: '>=18'} + + metro-file-map@0.80.8: + resolution: {integrity: sha512-eQXMFM9ogTfDs2POq7DT2dnG7rayZcoEgRbHPXvhUWkVwiKkro2ngcBE++ck/7A36Cj5Ljo79SOkYwHaWUDYDw==} + engines: {node: '>=18'} + + metro-minify-terser@0.80.8: + resolution: {integrity: sha512-y8sUFjVvdeUIINDuW1sejnIjkZfEF+7SmQo0EIpYbWmwh+kq/WMj74yVaBWuqNjirmUp1YNfi3alT67wlbBWBQ==} + engines: {node: '>=18'} + + metro-resolver@0.80.8: + resolution: {integrity: sha512-JdtoJkP27GGoZ2HJlEsxs+zO7jnDUCRrmwXJozTlIuzLHMRrxgIRRby9fTCbMhaxq+iA9c+wzm3iFb4NhPmLbQ==} + engines: {node: '>=18'} + + metro-runtime@0.80.8: + resolution: {integrity: sha512-2oScjfv6Yb79PelU1+p8SVrCMW9ZjgEiipxq7jMRn8mbbtWzyv3g8Mkwr+KwOoDFI/61hYPUbY8cUnu278+x1g==} + engines: {node: '>=18'} + + metro-source-map@0.80.8: + resolution: {integrity: sha512-+OVISBkPNxjD4eEKhblRpBf463nTMk3KMEeYS8Z4xM/z3qujGJGSsWUGRtH27+c6zElaSGtZFiDMshEb8mMKQg==} + engines: {node: '>=18'} + + metro-symbolicate@0.80.8: + resolution: {integrity: sha512-nwhYySk79jQhwjL9QmOUo4wS+/0Au9joEryDWw7uj4kz2yvw1uBjwmlql3BprQCBzRdB3fcqOP8kO8Es+vE31g==} + engines: {node: '>=18'} + hasBin: true + + metro-transform-plugins@0.80.8: + resolution: {integrity: sha512-sSu8VPL9Od7w98MftCOkQ1UDeySWbsIAS5I54rW22BVpPnI3fQ42srvqMLaJUQPjLehUanq8St6OMBCBgH/UWw==} + engines: {node: '>=18'} + + metro-transform-worker@0.80.8: + resolution: {integrity: sha512-+4FG3TQk3BTbNqGkFb2uCaxYTfsbuFOCKMMURbwu0ehCP8ZJuTUramkaNZoATS49NSAkRgUltgmBa4YaKZ5mqw==} + engines: {node: '>=18'} + + metro@0.80.8: + resolution: {integrity: sha512-in7S0W11mg+RNmcXw+2d9S3zBGmCARDxIwoXJAmLUQOQoYsRP3cpGzyJtc7WOw8+FXfpgXvceD0u+PZIHXEL7g==} + engines: {node: '>=18'} + hasBin: true + + micro-ftch@0.3.1: + resolution: {integrity: sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg==} + + micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + + miller-rabin@4.0.1: + resolution: {integrity: sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==} + hasBin: true + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mime@1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + + mime@2.6.0: + resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} + engines: {node: '>=4.0.0'} + hasBin: true + + mime@3.0.0: + resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} + engines: {node: '>=10.0.0'} + hasBin: true + + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + + minimalistic-assert@1.0.1: + resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} + + minimalistic-crypto-utils@1.0.1: + resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@4.2.3: + resolution: {integrity: sha512-lIUdtK5hdofgCTu3aT0sOaHsYR37viUuIc0rwnnDXImbwFRcumyLMeZaM0t0I/fgxS6s6JMfu0rLD1Wz9pv1ng==} + engines: {node: '>=10'} + + minimatch@9.0.4: + resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==} + engines: {node: '>=16 || 14 >=14.17'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + mipd@0.0.5: + resolution: {integrity: sha512-gbKA784D2WKb5H/GtqEv+Ofd1S9Zj+Z/PGDIl1u1QAbswkxD28BQ5bSXQxkeBzPBABg1iDSbiwGG1XqlOxRspA==} + peerDependencies: + typescript: '>=5.0.4' + peerDependenciesMeta: + typescript: + optional: true + + mkdirp@0.5.6: + resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} + hasBin: true + + mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + + mlly@1.6.1: + resolution: {integrity: sha512-vLgaHvaeunuOXHSmEbZ9izxPx3USsk8KCQ8iC+aTlp5sKRSoZvwhHh5L9VbKSaVC6sJDqbyohIS76E2VmHIPAA==} + + mock-socket@9.3.1: + resolution: {integrity: sha512-qxBgB7Qa2sEQgHFjj0dSigq7fX4k6Saisd5Nelwp2q8mlbAFh5dHV9JTTlF8viYJLSSWgMCZFUom8PJcMNBoJw==} + engines: {node: '>= 8'} + + motion@10.16.2: + resolution: {integrity: sha512-p+PurYqfUdcJZvtnmAqu5fJgV2kR0uLFQuBKtLeFVTrYEVllI99tiOTSefVNYuip9ELTEkepIIDftNdze76NAQ==} + + mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + + ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + + ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + multiformats@9.9.0: + resolution: {integrity: sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==} + + mute-stream@0.0.8: + resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} + + nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + nanoid@5.0.1: + resolution: {integrity: sha512-vWeVtV5Cw68aML/QaZvqN/3QQXc6fBfIieAlu05m7FZW2Dgb+3f0xc0TTxuJW+7u30t7iSDTV/j3kVI0oJqIfQ==} + engines: {node: ^18 || >=20} + hasBin: true + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + negotiator@0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + + neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + + no-case@3.0.4: + resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + + nocache@3.0.4: + resolution: {integrity: sha512-WDD0bdg9mbq6F4mRxEYcPWwfA1vxd0mrvKOyxI7Xj/atfRHVeutzuWByG//jfm4uPzp0y4Kj051EORCBSQMycw==} + engines: {node: '>=12.0.0'} + + nock@13.5.4: + resolution: {integrity: sha512-yAyTfdeNJGGBFxWdzSKCBYxs5FxLbCg5X5Q4ets974hcQzG1+qCxvIyOo4j2Ry6MUlhWVMX4OoYDefAIIwupjw==} + engines: {node: '>= 10.13'} + + node-abort-controller@3.1.1: + resolution: {integrity: sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==} + + node-addon-api@2.0.2: + resolution: {integrity: sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==} + + node-addon-api@5.1.0: + resolution: {integrity: sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==} + + node-addon-api@7.1.0: + resolution: {integrity: sha512-mNcltoe1R8o7STTegSOHdnJNN7s5EUvhoS7ShnTHDyOSd+8H+UdWODq6qSv67PjC8Zc5JRT8+oLAMCr0SIXw7g==} + engines: {node: ^16 || ^18 || >= 20} + + node-dir@0.1.17: + resolution: {integrity: sha512-tmPX422rYgofd4epzrNoOXiE8XFZYOcCq1vD7MAXCDO+O+zndlA2ztdKKMa+EeuBG5tHETpr4ml4RGgpqDCCAg==} + engines: {node: '>= 0.10.5'} + + node-domexception@1.0.0: + resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} + engines: {node: '>=10.5.0'} + + node-fetch-native@1.6.4: + resolution: {integrity: sha512-IhOigYzAKHd244OC0JIMIUrjzctirCmPkaIfhDeGcEETWof5zKYUW7e7MYvChGWh/4CJeXEgsRyGzuF334rOOQ==} + + node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + + node-fetch@3.3.2: + resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + node-forge@1.3.1: + resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} + engines: {node: '>= 6.13.0'} + + node-gyp-build@4.8.0: + resolution: {integrity: sha512-u6fs2AEUljNho3EYTJNBfImO5QTo/J/1Etd+NVdCj7qWKUSN/bSLkZwhDv7I+w/MSC6qJ4cknepkAYykDdK8og==} + hasBin: true + + node-int64@0.4.0: + resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} + + node-releases@2.0.14: + resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} + + node-stdlib-browser@1.2.0: + resolution: {integrity: sha512-VSjFxUhRhkyed8AtLwSCkMrJRfQ3e2lGtG3sP6FEgaLKBBbxM/dLfjRe1+iLhjvyLFW3tBQ8+c0pcOtXGbAZJg==} + engines: {node: '>=10'} + + node-stream-zip@1.15.0: + resolution: {integrity: sha512-LN4fydt9TqhZhThkZIVQnF9cwjU3qmUH9h78Mx/K7d3VvfRqqwthLwJEUOEL0QPZ0XQmNN7be5Ggit5+4dq3Bw==} + engines: {node: '>=0.12.0'} + + normalize-path@2.1.1: + resolution: {integrity: sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==} + engines: {node: '>=0.10.0'} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + + npm-run-path@5.3.0: + resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + nullthrows@1.1.1: + resolution: {integrity: sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==} + + ob1@0.80.8: + resolution: {integrity: sha512-QHJQk/lXMmAW8I7AIM3in1MSlwe1umR72Chhi8B7Xnq6mzjhBKkA6Fy/zAhQnGkA4S912EPCEvTij5yh+EQTAA==} + engines: {node: '>=18'} + + obj-multiplex@1.0.0: + resolution: {integrity: sha512-0GNJAOsHoBHeNTvl5Vt6IWnpUEcc3uSRxzBri7EDyIcMgYvnY2JL2qdeV5zTMjWQX5OHcD5amcW2HFfDh0gjIA==} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-inspect@1.13.1: + resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} + + object-is@1.1.6: + resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==} + engines: {node: '>= 0.4'} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + object.assign@4.1.5: + resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} + engines: {node: '>= 0.4'} + + object.entries@1.1.8: + resolution: {integrity: sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==} + engines: {node: '>= 0.4'} + + object.fromentries@2.0.8: + resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} + engines: {node: '>= 0.4'} + + object.groupby@1.0.3: + resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} + engines: {node: '>= 0.4'} + + object.hasown@1.1.4: + resolution: {integrity: sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg==} + engines: {node: '>= 0.4'} + + object.values@1.2.0: + resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==} + engines: {node: '>= 0.4'} + + ofetch@1.3.4: + resolution: {integrity: sha512-KLIET85ik3vhEfS+3fDlc/BAZiAp+43QEC/yCo5zkNoY2YaKvNkOaFr/6wCFgFH1kuYQM5pMNi0Tg8koiIemtw==} + + ohash@1.1.3: + resolution: {integrity: sha512-zuHHiGTYTA1sYJ/wZN+t5HKZaH23i4yI1HMwbuXm24Nid7Dv0KcuRlKoNKS9UNfAVSBlnGLcuQrnOKWOZoEGaw==} + + on-exit-leak-free@0.2.0: + resolution: {integrity: sha512-dqaz3u44QbRXQooZLTUKU41ZrzYrcvLISVgbrzbyCMxpmSLJvZ3ZamIJIZ29P6OhZIkNIQKosdeM6t1LYbA9hg==} + + on-finished@2.3.0: + resolution: {integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==} + engines: {node: '>= 0.8'} + + on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + + on-headers@1.0.2: + resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} + engines: {node: '>= 0.8'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + + onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + + open@6.4.0: + resolution: {integrity: sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==} + engines: {node: '>=8'} + + open@7.4.2: + resolution: {integrity: sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==} + engines: {node: '>=8'} + + open@8.4.2: + resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} + engines: {node: '>=12'} + + optionator@0.9.3: + resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} + engines: {node: '>= 0.8.0'} + + ora@5.4.1: + resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} + engines: {node: '>=10'} + + os-browserify@0.3.0: + resolution: {integrity: sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==} + + os-tmpdir@1.0.2: + resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} + engines: {node: '>=0.10.0'} + + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@3.0.0: + resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} + engines: {node: '>=6'} + + p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + p-map@4.0.0: + resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} + engines: {node: '>=10'} + + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + pako@1.0.11: + resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} + + param-case@3.0.4: + resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-asn1@5.1.7: + resolution: {integrity: sha512-CTM5kuWR3sx9IFamcl5ErfPl6ea/N8IYwiJ+vpeB2g+1iknv7zBl5uPwbMbRVznRVbrNY6lGuDoE5b30grmbqg==} + engines: {node: '>= 0.10'} + + parse-filepath@1.0.2: + resolution: {integrity: sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q==} + engines: {node: '>=0.8'} + + parse-json@4.0.0: + resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} + engines: {node: '>=4'} + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + + parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + + pascal-case@3.1.2: + resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} + + path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + + path-case@3.0.4: + resolution: {integrity: sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==} + + path-exists@3.0.0: + resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} + engines: {node: '>=4'} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-root-regex@0.1.2: + resolution: {integrity: sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==} + engines: {node: '>=0.10.0'} + + path-root@0.1.1: + resolution: {integrity: sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg==} + engines: {node: '>=0.10.0'} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + pathe@1.1.2: + resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + + pbkdf2@3.1.2: + resolution: {integrity: sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==} + engines: {node: '>=0.12'} + + picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + pify@3.0.0: + resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} + engines: {node: '>=4'} + + pify@4.0.1: + resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} + engines: {node: '>=6'} + + pify@5.0.0: + resolution: {integrity: sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==} + engines: {node: '>=10'} + + pino-abstract-transport@0.5.0: + resolution: {integrity: sha512-+KAgmVeqXYbTtU2FScx1XS3kNyfZ5TrXY07V96QnUSFqo2gAqlvmaxH67Lj7SWazqsMabf+58ctdTcBgnOLUOQ==} + + pino-std-serializers@4.0.0: + resolution: {integrity: sha512-cK0pekc1Kjy5w9V2/n+8MkZwusa6EyyxfeQCB799CQRhRt/CqYKiWs5adeu8Shve2ZNffvfC/7J64A2PJo1W/Q==} + + pino@7.11.0: + resolution: {integrity: sha512-dMACeu63HtRLmCG8VKdy4cShCPKaYDR4youZqoSWLxl5Gu99HUw8bw75thbPv9Nip+H+QYX8o3ZJbTdVZZ2TVg==} + hasBin: true + + pirates@4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + engines: {node: '>= 6'} + + pkg-dir@3.0.0: + resolution: {integrity: sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==} + engines: {node: '>=6'} + + pkg-dir@4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} + + pkg-dir@5.0.0: + resolution: {integrity: sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==} + engines: {node: '>=10'} + + pkg-types@1.0.3: + resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==} + + pngjs@5.0.0: + resolution: {integrity: sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==} + engines: {node: '>=10.13.0'} + + pnglib@0.0.1: + resolution: {integrity: sha512-95ChzOoYLOPIyVmL+Y6X+abKGXUJlvOVLkB1QQkyXl7Uczc6FElUy/x01NS7r2GX6GRezloO/ecCX9h4U9KadA==} + + pony-cause@2.1.11: + resolution: {integrity: sha512-M7LhCsdNbNgiLYiP4WjsfLUuFmCfnjdF6jKe2R9NKl4WFN+HZPGHJZ9lnLP7f9ZnKe3U9nuWD0szirmj+migUg==} + engines: {node: '>=12.0.0'} + + possible-typed-array-names@1.0.0: + resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} + engines: {node: '>= 0.4'} + + postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + + postcss@8.4.31: + resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} + engines: {node: ^10 || ^12 || >=14} + + postcss@8.4.38: + resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} + engines: {node: ^10 || ^12 || >=14} + + preact@10.20.2: + resolution: {integrity: sha512-S1d1ernz3KQ+Y2awUxKakpfOg2CEmJmwOP+6igPx6dgr6pgDvenqYviyokWso2rhHvGtTlWWnJDa7RaPbQerTg==} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + pretty-format@26.6.2: + resolution: {integrity: sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==} + engines: {node: '>= 10'} + + pretty-format@29.7.0: + resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + process-nextick-args@1.0.7: + resolution: {integrity: sha512-yN0WQmuCX63LP/TMvAg31nvT6m4vDqJEiiv2CAZqWOGNWutc9DfDk1NPYYmKUFmaVM2UwDowH4u5AHWYP/jxKw==} + + process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + + process-warning@1.0.0: + resolution: {integrity: sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q==} + + process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + + promise@7.3.1: + resolution: {integrity: sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==} + + promise@8.3.0: + resolution: {integrity: sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==} + + prompts@2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + + prop-types@15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + + propagate@2.0.1: + resolution: {integrity: sha512-vGrhOavPSTz4QVNuBNdcNXePNdNMaO1xj9yBeH1ScQPjk/rhg9sSlCXPhMkFuaNNW/syTvYqsnbIJxMBfRbbag==} + engines: {node: '>= 8'} + + proxy-compare@2.5.1: + resolution: {integrity: sha512-oyfc0Tx87Cpwva5ZXezSp5V9vht1c7dZBhvuV/y3ctkgMVUmiAGDVeeB0dKhGSyT0v1ZTEQYpe/RXlBVBNuCLA==} + + public-encrypt@4.0.3: + resolution: {integrity: sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==} + + pump@3.0.0: + resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + + punycode@1.4.1: + resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + pvtsutils@1.3.5: + resolution: {integrity: sha512-ARvb14YB9Nm2Xi6nBq1ZX6dAM0FsJnuk+31aUp4TrcZEdKUlSqOqsxJHUPJDNE3qiIp+iUPEIeR6Je/tgV7zsA==} + + pvutils@1.1.3: + resolution: {integrity: sha512-pMpnA0qRdFp32b1sJl1wOJNxZLQ2cbQx+k6tjNtZ8CpvVhNqEPRgivZ2WOUev2YMajecdH7ctUPDvEe87nariQ==} + engines: {node: '>=6.0.0'} + + qr-code-styling@1.6.0-rc.1: + resolution: {integrity: sha512-ModRIiW6oUnsP18QzrRYZSc/CFKFKIdj7pUs57AEVH20ajlglRpN3HukjHk0UbNMTlKGuaYl7Gt6/O5Gg2NU2Q==} + + qrcode-generator@1.4.4: + resolution: {integrity: sha512-HM7yY8O2ilqhmULxGMpcHSF1EhJJ9yBj8gvDEuZ6M+KGJ0YY2hKpnXvRD+hZPLrDVck3ExIGhmPtSdcjC+guuw==} + + qrcode-terminal-nooctal@0.12.1: + resolution: {integrity: sha512-jy/kkD0iIMDjTucB+5T6KBsnirlhegDH47vHgrj5MejchSQmi/EAMM0xMFeePgV9CJkkAapNakpVUWYgHvtdKg==} + hasBin: true + + qrcode@1.5.3: + resolution: {integrity: sha512-puyri6ApkEHYiVl4CFzo1tDkAZ+ATcnbJrJ6RiBM1Fhctdn/ix9MTE3hRph33omisEbC/2fcfemsseiKgBPKZg==} + engines: {node: '>=10.13.0'} + hasBin: true + + qs@6.12.1: + resolution: {integrity: sha512-zWmv4RSuB9r2mYQw3zxQuHWeU+42aKi1wWig/j4ele4ygELZ7PEO6MM7rim9oAQH2A5MWfsAVf/jPvTPgCbvUQ==} + engines: {node: '>=0.6'} + + query-string@7.1.3: + resolution: {integrity: sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg==} + engines: {node: '>=6'} + + querystring-es3@0.2.1: + resolution: {integrity: sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==} + engines: {node: '>=0.4.x'} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + queue@6.0.2: + resolution: {integrity: sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==} + + quick-format-unescaped@4.0.4: + resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} + + radix3@1.1.2: + resolution: {integrity: sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==} + + randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + + randomfill@1.0.4: + resolution: {integrity: sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==} + + range-parser@1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + + react-copy-to-clipboard@5.1.0: + resolution: {integrity: sha512-k61RsNgAayIJNoy9yDsYzDe/yAZAzEbEgcz3DZMhF686LEyukcE1hzurxe85JandPUG+yTfGVFzuEw3xt8WP/A==} + peerDependencies: + react: ^15.3.0 || 16 || 17 || 18 + + react-devtools-core@4.28.5: + resolution: {integrity: sha512-cq/o30z9W2Wb4rzBefjv5fBalHU0rJGZCHAkf/RHSBWSSYwh8PlQTqqOJmgIIbBtpj27T6FIPXeomIjZtCNVqA==} + + react-dom@18.2.0: + resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} + peerDependencies: + react: ^18.2.0 + + react-hook-form@7.51.3: + resolution: {integrity: sha512-cvJ/wbHdhYx8aviSWh28w9ImjmVsb5Y05n1+FW786vEZQJV5STNM0pW6ujS+oiBecb0ARBxJFyAnXj9+GHXACQ==} + engines: {node: '>=12.22.0'} + peerDependencies: + react: ^16.8.0 || ^17 || ^18 + + react-i18next@13.5.0: + resolution: {integrity: sha512-CFJ5NDGJ2MUyBohEHxljOq/39NQ972rh1ajnadG9BjTk+UXbHLq4z5DKEbEQBDoIhUmmbuS/fIMJKo6VOax1HA==} + peerDependencies: + i18next: '>= 23.2.3' + react: '>= 16.8.0' + react-dom: '*' + react-native: '*' + peerDependenciesMeta: + react-dom: + optional: true + react-native: + optional: true + + react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + + react-is@17.0.2: + resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + + react-is@18.2.0: + resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} + + react-native-webview@11.26.1: + resolution: {integrity: sha512-hC7BkxOpf+z0UKhxFSFTPAM4shQzYmZHoELa6/8a/MspcjEP7ukYKpuSUTLDywQditT8yI9idfcKvfZDKQExGw==} + peerDependencies: + react: '*' + react-native: '*' + + react-native@0.73.6: + resolution: {integrity: sha512-oqmZe8D2/VolIzSPZw+oUd6j/bEmeRHwsLn1xLA5wllEYsZ5zNuMsDus235ONOnCRwexqof/J3aztyQswSmiaA==} + engines: {node: '>=18'} + hasBin: true + peerDependencies: + react: 18.2.0 + + react-number-format@5.3.4: + resolution: {integrity: sha512-2hHN5mbLuCDUx19bv0Q8wet67QqYK6xmtLQeY5xx+h7UXiMmRtaCwqko4mMPoKXLc6xAzwRrutg8XbTRlsfjRg==} + peerDependencies: + react: ^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 + react-dom: ^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 + + react-refresh@0.14.0: + resolution: {integrity: sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==} + engines: {node: '>=0.10.0'} + + react-router-dom@6.22.3: + resolution: {integrity: sha512-7ZILI7HjcE+p31oQvwbokjk6OA/bnFxrhJ19n82Ex9Ph8fNAq+Hm/7KchpMGlTgWhUxRHMMCut+vEtNpWpowKw==} + engines: {node: '>=14.0.0'} + peerDependencies: + react: '>=16.8' + react-dom: '>=16.8' + + react-router@6.22.3: + resolution: {integrity: sha512-dr2eb3Mj5zK2YISHK++foM9w4eBnO23eKnZEDs7c880P6oKbrjz/Svg9+nxqtHQK+oMW4OtjZca0RqPglXxguQ==} + engines: {node: '>=14.0.0'} + peerDependencies: + react: '>=16.8' + + react-shallow-renderer@16.15.0: + resolution: {integrity: sha512-oScf2FqQ9LFVQgA73vr86xl2NaOIX73rh+YFqcOp68CWj56tSfgtGKrEbyhCj0rSijyG9M1CYprTh39fBi5hzA==} + peerDependencies: + react: ^16.0.0 || ^17.0.0 || ^18.0.0 + + react-transition-group@4.4.5: + resolution: {integrity: sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==} + peerDependencies: + react: '>=16.6.0' + react-dom: '>=16.6.0' + + react@18.2.0: + resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} + engines: {node: '>=0.10.0'} + + readable-stream@2.3.3: + resolution: {integrity: sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==} + + readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + readline@1.3.0: + resolution: {integrity: sha512-k2d6ACCkiNYz222Fs/iNze30rRJ1iIicW7JuX/7/cozvih6YCkFZH+J6mAFDVgv0dRBaAyr4jDqC95R2y4IADg==} + + real-require@0.1.0: + resolution: {integrity: sha512-r/H9MzAWtrv8aSVjPCMFpDMl5q66GqtmmRkRjpHTsp4zBAa+snZyiQNlMONiUmEJcsnaw0wCauJ2GWODr/aFkg==} + engines: {node: '>= 12.13.0'} + + recast@0.21.5: + resolution: {integrity: sha512-hjMmLaUXAm1hIuTqOdeYObMslq/q+Xff6QE3Y2P+uoHAg2nmVlLBps2hzh1UJDdMtDTMXOFewK6ky51JQIeECg==} + engines: {node: '>= 4'} + + rechoir@0.8.0: + resolution: {integrity: sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==} + engines: {node: '>= 10.13.0'} + + reflect.getprototypeof@1.0.6: + resolution: {integrity: sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==} + engines: {node: '>= 0.4'} + + regenerate-unicode-properties@10.1.1: + resolution: {integrity: sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==} + engines: {node: '>=4'} + + regenerate@1.4.2: + resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} + + regenerator-runtime@0.13.11: + resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} + + regenerator-runtime@0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + + regenerator-transform@0.15.2: + resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} + + regexp.prototype.flags@1.5.2: + resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} + engines: {node: '>= 0.4'} + + regexpu-core@5.3.2: + resolution: {integrity: sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==} + engines: {node: '>=4'} + + regjsparser@0.9.1: + resolution: {integrity: sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==} + hasBin: true + + relay-runtime@12.0.0: + resolution: {integrity: sha512-QU6JKr1tMsry22DXNy9Whsq5rmvwr3LSZiiWV/9+DFpuTWvp+WFhobWMc8TC4OjKFfNhEZy7mOiqUAn5atQtug==} + + remedial@1.0.8: + resolution: {integrity: sha512-/62tYiOe6DzS5BqVsNpH/nkGlX45C/Sp6V+NtiN6JQNS1Viay7cWkazmRkrQrdFj2eshDe96SIQNIoMxqhzBOg==} + + remove-trailing-separator@1.1.0: + resolution: {integrity: sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==} + + remove-trailing-spaces@1.0.8: + resolution: {integrity: sha512-O3vsMYfWighyFbTd8hk8VaSj9UAGENxAtX+//ugIst2RMk5e03h6RoIS+0ylsFxY1gvmPuAY/PO4It+gPEeySA==} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + require-main-filename@2.0.0: + resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} + + resolve-cwd@3.0.0: + resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} + engines: {node: '>=8'} + + resolve-from@3.0.0: + resolution: {integrity: sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==} + engines: {node: '>=4'} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + + resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + hasBin: true + + resolve@2.0.0-next.5: + resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} + hasBin: true + + restore-cursor@3.1.0: + resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} + engines: {node: '>=8'} + + reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rfdc@1.3.1: + resolution: {integrity: sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==} + + rimraf@2.6.3: + resolution: {integrity: sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true + + ripemd160@2.0.2: + resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==} + + rollup-plugin-visualizer@5.12.0: + resolution: {integrity: sha512-8/NU9jXcHRs7Nnj07PF2o4gjxmm9lXIrZ8r175bT9dK8qoLlvKTwRMArRCMgpMGlq8CTLugRvEmyMeMXIU2pNQ==} + engines: {node: '>=14'} + hasBin: true + peerDependencies: + rollup: 2.x || 3.x || 4.x + peerDependenciesMeta: + rollup: + optional: true + + rollup@4.14.3: + resolution: {integrity: sha512-ag5tTQKYsj1bhrFC9+OEWqb5O6VYgtQDO9hPDBMmIbePwhfSr+ExlcU741t8Dhw5DkPCQf6noz0jb36D6W9/hw==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + run-async@2.4.1: + resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} + engines: {node: '>=0.12.0'} + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + rxjs@7.8.1: + resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + + safe-array-concat@1.1.2: + resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} + engines: {node: '>=0.4'} + + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safe-regex-test@1.0.3: + resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} + engines: {node: '>= 0.4'} + + safe-stable-stringify@2.4.3: + resolution: {integrity: sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==} + engines: {node: '>=10'} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + sails-js@0.1.4: + resolution: {integrity: sha512-fxv+RNhjskoHNpxNpaE09zEYbtbf3pWhkho4QWdPvjdLx725s47n/W1gzPccuWLi8fBCnKAQz3CfNi17FiRKjg==} + hasBin: true + peerDependencies: + '@gear-js/api': ^0.38.0 + '@polkadot/api': ^11.0.1 + '@polkadot/types': ^11.0.1 + + sass@1.75.0: + resolution: {integrity: sha512-ShMYi3WkrDWxExyxSZPst4/okE9ts46xZmJDSawJQrnte7M1V9fScVB+uNXOVKRBt0PggHOwoZcn8mYX4trnBw==} + engines: {node: '>=14.0.0'} + hasBin: true + + scale-ts@1.6.0: + resolution: {integrity: sha512-Ja5VCjNZR8TGKhUumy9clVVxcDpM+YFjAnkMuwQy68Hixio3VRRvWdE3g8T/yC+HXA0ZDQl2TGyUmtmbcVl40Q==} + + scheduler@0.23.0: + resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} + + scheduler@0.24.0-canary-efb381bbf-20230505: + resolution: {integrity: sha512-ABvovCDe/k9IluqSh4/ISoq8tIJnW8euVAWYt5j/bg6dRnqwQwiGO1F/V4AyK96NGF/FB04FhOUDuWj8IKfABA==} + + schema-utils@3.3.0: + resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} + engines: {node: '>= 10.13.0'} + + scuid@1.1.0: + resolution: {integrity: sha512-MuCAyrGZcTLfQoH2XoBlQ8C6bzwN88XT/0slOGz0pn8+gIP85BOAfYa44ZXQUTOwRwPU0QvgU+V+OSajl/59Xg==} + + secp256k1@5.0.0: + resolution: {integrity: sha512-TKWX8xvoGHrxVdqbYeZM9w+izTF4b9z3NhSaDkdn81btvuh+ivbIMGT/zQvDtTFWhRlThpoz6LEYTr7n8A5GcA==} + engines: {node: '>=14.0.0'} + + semver@5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + hasBin: true + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.6.0: + resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} + engines: {node: '>=10'} + hasBin: true + + send@0.18.0: + resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} + engines: {node: '>= 0.8.0'} + + sentence-case@3.0.4: + resolution: {integrity: sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==} + + serialize-error@2.1.0: + resolution: {integrity: sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw==} + engines: {node: '>=0.10.0'} + + serialize-javascript@6.0.2: + resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + + serve-static@1.15.0: + resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} + engines: {node: '>= 0.8.0'} + + set-blocking@2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + + set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} + + setimmediate@1.0.5: + resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} + + setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + + sha.js@2.4.11: + resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==} + hasBin: true + + shallow-clone@3.0.1: + resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} + engines: {node: '>=8'} + + shallowequal@1.1.0: + resolution: {integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + shell-quote@1.8.1: + resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} + + side-channel@1.0.6: + resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} + engines: {node: '>= 0.4'} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + signedsource@1.0.0: + resolution: {integrity: sha512-6+eerH9fEnNmi/hyM1DXcRK3pWdoMQtlkQ+ns0ntzunjKqp5i3sKCc80ym8Fib3iaYhdJUOPdhlJWj1tvge2Ww==} + + sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + slice-ansi@2.1.0: + resolution: {integrity: sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==} + engines: {node: '>=6'} + + slice-ansi@3.0.0: + resolution: {integrity: sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==} + engines: {node: '>=8'} + + slice-ansi@4.0.0: + resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} + engines: {node: '>=10'} + + smoldot@2.0.22: + resolution: {integrity: sha512-B50vRgTY6v3baYH6uCgL15tfaag5tcS2o/P5q1OiXcKGv1axZDfz2dzzMuIkVpyMR2ug11F6EAtQlmYBQd292g==} + + snake-case@3.0.4: + resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} + + socket.io-client@4.7.5: + resolution: {integrity: sha512-sJ/tqHOCe7Z50JCBCXrsY3I2k03iOiUe+tj1OmKeD2lXPiGH/RUCdTZFoqVyN7l1MnpIzPrGtLcijffmeouNlQ==} + engines: {node: '>=10.0.0'} + + socket.io-parser@4.2.4: + resolution: {integrity: sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==} + engines: {node: '>=10.0.0'} + + sonic-boom@2.8.0: + resolution: {integrity: sha512-kuonw1YOYYNOve5iHdSahXPOK49GqwA+LZhI6Wz/l0rP57iKyXXIHaRagOBHAPmGwJC6od2Z9zgvZ5loSgMlVg==} + + source-map-js@1.2.0: + resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} + engines: {node: '>=0.10.0'} + + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + + source-map@0.5.7: + resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} + engines: {node: '>=0.10.0'} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + source-map@0.7.4: + resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} + engines: {node: '>= 8'} + + split-on-first@1.1.0: + resolution: {integrity: sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==} + engines: {node: '>=6'} + + split2@4.2.0: + resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} + engines: {node: '>= 10.x'} + + sponge-case@1.0.1: + resolution: {integrity: sha512-dblb9Et4DAtiZ5YSUZHLl4XhH4uK80GhAZrVXdN4O2P4gQ40Wa5UIOPUHlA/nFd2PLblBZWUioLMMAVrgpoYcA==} + + sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + + stack-utils@2.0.6: + resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} + engines: {node: '>=10'} + + stackframe@1.3.4: + resolution: {integrity: sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==} + + stacktrace-parser@0.1.10: + resolution: {integrity: sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==} + engines: {node: '>=6'} + + statuses@1.5.0: + resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} + engines: {node: '>= 0.6'} + + statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + + std-env@3.7.0: + resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} + + store@2.0.12: + resolution: {integrity: sha512-eO9xlzDpXLiMr9W1nQ3Nfp9EzZieIQc10zPPMP5jsVV7bLOziSFFBP0XoDXACEIFtdI+rIz0NwWVA/QVJ8zJtw==} + + stream-browserify@3.0.0: + resolution: {integrity: sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==} + + stream-http@3.2.0: + resolution: {integrity: sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==} + + stream-shift@1.0.3: + resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} + + streamsearch@1.1.0: + resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} + engines: {node: '>=10.0.0'} + + strict-uri-encode@2.0.0: + resolution: {integrity: sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==} + engines: {node: '>=4'} + + string-env-interpolation@1.0.1: + resolution: {integrity: sha512-78lwMoCcn0nNu8LszbP1UA7g55OeE4v7rCeWnM5B453rnNr4aq+5it3FEYtZrSEiMvHZOZ9Jlqb0OD0M2VInqg==} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string.prototype.matchall@4.0.11: + resolution: {integrity: sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==} + engines: {node: '>= 0.4'} + + string.prototype.trim@1.2.9: + resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} + engines: {node: '>= 0.4'} + + string.prototype.trimend@1.0.8: + resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} + + string.prototype.trimstart@1.0.8: + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} + + string_decoder@1.0.3: + resolution: {integrity: sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==} + + string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + strip-ansi@5.2.0: + resolution: {integrity: sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==} + engines: {node: '>=6'} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + + strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + + strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + strnum@1.0.5: + resolution: {integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==} + + styled-components@6.1.8: + resolution: {integrity: sha512-PQ6Dn+QxlWyEGCKDS71NGsXoVLKfE1c3vApkvDYS5KAK+V8fNWGhbSUEo9Gg2iaID2tjLXegEW3bZDUGpofRWw==} + engines: {node: '>= 16'} + peerDependencies: + react: '>= 16.8.0' + react-dom: '>= 16.8.0' + + stylis@4.2.0: + resolution: {integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==} + + stylis@4.3.1: + resolution: {integrity: sha512-EQepAV+wMsIaGVGX1RECzgrcqRRU/0sYOHkeLsZ3fzHaHXZy4DaOOX0vOlGQdlsjkh3mFHAIlVimpwAs4dslyQ==} + + sudo-prompt@9.2.1: + resolution: {integrity: sha512-Mu7R0g4ig9TUuGSxJavny5Rv0egCEtpZRNMrZaYS1vxkiIxGiGUwoezU3LazIQ+KE04hTrTfNPgxU5gzi7F5Pw==} + + superstruct@1.0.4: + resolution: {integrity: sha512-7JpaAoX2NGyoFlI9NBh66BQXGONc+uE+MRS5i2iOBKuS4e+ccgMDjATgZldkah+33DakBxDHiss9kvUcGAO8UQ==} + engines: {node: '>=14.0.0'} + + supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + svg-parser@2.0.4: + resolution: {integrity: sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==} + + swap-case@2.0.2: + resolution: {integrity: sha512-kc6S2YS/2yXbtkSMunBtKdah4VFETZ8Oh6ONSmSd9bRxhqTrtARUCBUiWXH3xVPpvR7tz2CSnkuXVE42EcGnMw==} + + system-architecture@0.1.0: + resolution: {integrity: sha512-ulAk51I9UVUyJgxlv9M6lFot2WP3e7t8Kz9+IS6D4rVba1tR9kON+Ey69f+1R4Q8cd45Lod6a4IcJIxnzGc/zA==} + engines: {node: '>=18'} + + tapable@2.2.1: + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + engines: {node: '>=6'} + + temp-dir@2.0.0: + resolution: {integrity: sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==} + engines: {node: '>=8'} + + temp@0.8.4: + resolution: {integrity: sha512-s0ZZzd0BzYv5tLSptZooSjK8oj6C+c19p7Vqta9+6NPOf7r+fxq0cJe6/oN4LTC79sy5NY8ucOJNgwsKCSbfqg==} + engines: {node: '>=6.0.0'} + + terser-webpack-plugin@5.3.10: + resolution: {integrity: sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==} + engines: {node: '>= 10.13.0'} + peerDependencies: + '@swc/core': '*' + esbuild: '*' + uglify-js: '*' + webpack: ^5.1.0 + peerDependenciesMeta: + '@swc/core': + optional: true + esbuild: + optional: true + uglify-js: + optional: true + + terser@5.30.3: + resolution: {integrity: sha512-STdUgOUx8rLbMGO9IOwHLpCqolkDITFFQSMYYwKE1N2lY6MVSaeoi10z/EhWxRc6ybqoVmKSkhKYH/XUpl7vSA==} + engines: {node: '>=10'} + hasBin: true + + text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + + thread-stream@0.15.2: + resolution: {integrity: sha512-UkEhKIg2pD+fjkHQKyJO3yoIvAP3N6RlNFt2dUhcS1FGvCD1cQa1M/PGknCLFIyZdtJOWQjejp7bdNqmN7zwdA==} + + throat@5.0.0: + resolution: {integrity: sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==} + + through2@2.0.5: + resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} + + through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + + timers-browserify@2.0.12: + resolution: {integrity: sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==} + engines: {node: '>=0.6.0'} + + tiny-invariant@1.3.3: + resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} + + title-case@3.0.3: + resolution: {integrity: sha512-e1zGYRvbffpcHIrnuqT0Dh+gEJtDaxDSoG4JAIpq4oDFyooziLBIiYQv0GBT4FUAnUop5uZ1hiIAj7oAF6sOCA==} + + tmp@0.0.33: + resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} + engines: {node: '>=0.6.0'} + + tmpl@1.0.5: + resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} + + to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + toggle-selection@1.0.6: + resolution: {integrity: sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==} + + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + + ts-api-utils@1.3.0: + resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} + engines: {node: '>=16'} + peerDependencies: + typescript: '>=4.2.0' + + ts-log@2.2.5: + resolution: {integrity: sha512-PGcnJoTBnVGy6yYNFxWVNkdcAuAMstvutN9MgDJIV6L0oG8fB+ZNNy1T+wJzah8RPGor1mZuPQkVfXNDpy9eHA==} + + tsconfig-paths@3.15.0: + resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} + + tslib@1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + + tslib@2.5.0: + resolution: {integrity: sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==} + + tslib@2.6.2: + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + + tty-browserify@0.0.1: + resolution: {integrity: sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==} + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + + type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + + type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + + type-fest@0.7.1: + resolution: {integrity: sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==} + engines: {node: '>=8'} + + typed-array-buffer@1.0.2: + resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} + engines: {node: '>= 0.4'} + + typed-array-byte-length@1.0.1: + resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} + engines: {node: '>= 0.4'} + + typed-array-byte-offset@1.0.2: + resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} + engines: {node: '>= 0.4'} + + typed-array-length@1.0.6: + resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} + engines: {node: '>= 0.4'} + + typescript@5.4.5: + resolution: {integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==} + engines: {node: '>=14.17'} + hasBin: true + + ua-parser-js@1.0.37: + resolution: {integrity: sha512-bhTyI94tZofjo+Dn8SN6Zv8nBDvyXTymAdM3LDI/0IboIUwTu1rEhW7v2TfiVsoYWgkQ4kOVqnI8APUFbIQIFQ==} + + ufo@1.5.3: + resolution: {integrity: sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==} + + uint8arrays@3.1.0: + resolution: {integrity: sha512-ei5rfKtoRO8OyOIor2Rz5fhzjThwIHJZ3uyDPnDHTXbP0aMQ1RN/6AI5B5d9dBxJOU+BvOAk7ZQ1xphsX8Lrog==} + + uint8arrays@3.1.1: + resolution: {integrity: sha512-+QJa8QRnbdXVpHYjLoTpJIdCTiw9Ir62nocClWuXIq2JIh4Uta0cQsTSpFL678p2CN8B+XSApwcU+pQEqVpKWg==} + + unbox-primitive@1.0.2: + resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + + unc-path-regex@0.1.2: + resolution: {integrity: sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==} + engines: {node: '>=0.10.0'} + + uncrypto@0.1.3: + resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==} + + undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + + unenv@1.9.0: + resolution: {integrity: sha512-QKnFNznRxmbOF1hDgzpqrlIf6NC5sbZ2OJ+5Wl3OX8uM+LUJXbj4TXvLJCtwbPTmbMHCLIz6JLKNinNsMShK9g==} + + unfetch@4.2.0: + resolution: {integrity: sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA==} + + unicode-canonical-property-names-ecmascript@2.0.0: + resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==} + engines: {node: '>=4'} + + unicode-match-property-ecmascript@2.0.0: + resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} + engines: {node: '>=4'} + + unicode-match-property-value-ecmascript@2.1.0: + resolution: {integrity: sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==} + engines: {node: '>=4'} + + unicode-property-aliases-ecmascript@2.1.0: + resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==} + engines: {node: '>=4'} + + universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + + unixify@1.0.0: + resolution: {integrity: sha512-6bc58dPYhCMHHuwxldQxO3RRNZ4eCogZ/st++0+fcC1nr0jiGUtAdBJ2qzmLQWSxbtz42pWt4QQMiZ9HvZf5cg==} + engines: {node: '>=0.10.0'} + + unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + + unstorage@1.10.2: + resolution: {integrity: sha512-cULBcwDqrS8UhlIysUJs2Dk0Mmt8h7B0E6mtR+relW9nZvsf/u4SkAYyNliPiPW7XtFNb5u3IUMkxGxFTTRTgQ==} + peerDependencies: + '@azure/app-configuration': ^1.5.0 + '@azure/cosmos': ^4.0.0 + '@azure/data-tables': ^13.2.2 + '@azure/identity': ^4.0.1 + '@azure/keyvault-secrets': ^4.8.0 + '@azure/storage-blob': ^12.17.0 + '@capacitor/preferences': ^5.0.7 + '@netlify/blobs': ^6.5.0 || ^7.0.0 + '@planetscale/database': ^1.16.0 + '@upstash/redis': ^1.28.4 + '@vercel/kv': ^1.0.1 + idb-keyval: ^6.2.1 + ioredis: ^5.3.2 + peerDependenciesMeta: + '@azure/app-configuration': + optional: true + '@azure/cosmos': + optional: true + '@azure/data-tables': + optional: true + '@azure/identity': + optional: true + '@azure/keyvault-secrets': + optional: true + '@azure/storage-blob': + optional: true + '@capacitor/preferences': + optional: true + '@netlify/blobs': + optional: true + '@planetscale/database': + optional: true + '@upstash/redis': + optional: true + '@vercel/kv': + optional: true + idb-keyval: + optional: true + ioredis: + optional: true + + untun@0.1.3: + resolution: {integrity: sha512-4luGP9LMYszMRZwsvyUd9MrxgEGZdZuZgpVQHEEX0lCYFESasVRvZd0EYpCkOIbJKHMuv0LskpXc/8Un+MJzEQ==} + hasBin: true + + update-browserslist-db@1.0.13: + resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + upper-case-first@2.0.2: + resolution: {integrity: sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==} + + upper-case@2.0.2: + resolution: {integrity: sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==} + + uqr@0.1.2: + resolution: {integrity: sha512-MJu7ypHq6QasgF5YRTjqscSzQp/W11zoUk6kvmlH+fmWEs63Y0Eib13hYFwAzagRJcVY8WVnlV+eBDUGMJ5IbA==} + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + url@0.11.3: + resolution: {integrity: sha512-6hxOLGfZASQK/cijlZnZJTq8OXAkt/3YGfQX45vvMYXpZoo8NdWZcY73K108Jf759lS1Bv/8wXnHDTSz17dSRw==} + + urlpattern-polyfill@10.0.0: + resolution: {integrity: sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg==} + + urlpattern-polyfill@8.0.2: + resolution: {integrity: sha512-Qp95D4TPJl1kC9SKigDcqgyM2VDVO4RiJc2d4qe5GrYm+zbIQCWWKAFaJNQ4BhdFeDGwBmAxqJBwWSJDb9T3BQ==} + + use-sync-external-store@1.2.0: + resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + + utf-8-validate@6.0.3: + resolution: {integrity: sha512-uIuGf9TWQ/y+0Lp+KGZCMuJWc3N9BHA+l/UmHd/oUHwJJDeysyTRxNQVkbzsIWfGFbRe3OcgML/i0mvVRPOyDA==} + engines: {node: '>=6.14.2'} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + util@0.12.5: + resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} + + utils-merge@1.0.1: + resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} + engines: {node: '>= 0.4.0'} + + uuid@8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + hasBin: true + + uuid@9.0.1: + resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} + hasBin: true + + valtio@1.11.2: + resolution: {integrity: sha512-1XfIxnUXzyswPAPXo1P3Pdx2mq/pIqZICkWN60Hby0d9Iqb+MEIpqgYVlbflvHdrp2YR/q3jyKWRPJJ100yxaw==} + engines: {node: '>=12.20.0'} + peerDependencies: + '@types/react': '>=16.8' + react: '>=16.8' + peerDependenciesMeta: + '@types/react': + optional: true + react: + optional: true + + value-or-promise@1.0.12: + resolution: {integrity: sha512-Z6Uz+TYwEqE7ZN50gwn+1LCVo9ZVrpxRPOhOLnncYkY1ZzOYtrX8Fwf/rFktZ8R5mJms6EZf5TqNOMeZmnPq9Q==} + engines: {node: '>=12'} + + vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + + viem@1.21.4: + resolution: {integrity: sha512-BNVYdSaUjeS2zKQgPs+49e5JKocfo60Ib2yiXOWBT6LuVxY1I/6fFX3waEtpXvL1Xn4qu+BVitVtMh9lyThyhQ==} + peerDependencies: + typescript: '>=5.0.4' + peerDependenciesMeta: + typescript: + optional: true + + viem@2.9.19: + resolution: {integrity: sha512-1txsVoTz9+XGQpuN62wcDXasNtalW52UR41KnzwWTwHtV2cDcGuVuS/j/hcuQdZ7pU8X8jtq2IrwwR4jjKpy9Q==} + peerDependencies: + typescript: '>=5.0.4' + peerDependenciesMeta: + typescript: + optional: true + + vite-plugin-checker@0.6.4: + resolution: {integrity: sha512-2zKHH5oxr+ye43nReRbC2fny1nyARwhxdm0uNYp/ERy4YvU9iZpNOsueoi/luXw5gnpqRSvjcEPxXbS153O2wA==} + engines: {node: '>=14.16'} + peerDependencies: + eslint: '>=7' + meow: ^9.0.0 + optionator: ^0.9.1 + stylelint: '>=13' + typescript: '*' + vite: '>=2.0.0' + vls: '*' + vti: '*' + vue-tsc: '>=1.3.9' + peerDependenciesMeta: + eslint: + optional: true + meow: + optional: true + optionator: + optional: true + stylelint: + optional: true + typescript: + optional: true + vls: + optional: true + vti: + optional: true + vue-tsc: + optional: true + + vite-plugin-node-polyfills@0.21.0: + resolution: {integrity: sha512-Sk4DiKnmxN8E0vhgEhzLudfJQfaT8k4/gJ25xvUPG54KjLJ6HAmDKbr4rzDD/QWEY+Lwg80KE85fGYBQihEPQA==} + peerDependencies: + vite: ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 + + vite-plugin-svgr@4.2.0: + resolution: {integrity: sha512-SC7+FfVtNQk7So0XMjrrtLAbEC8qjFPifyD7+fs/E6aaNdVde6umlVVh0QuwDLdOMu7vp5RiGFsB70nj5yo0XA==} + peerDependencies: + vite: ^2.6.0 || 3 || 4 || 5 + + vite@5.2.8: + resolution: {integrity: sha512-OyZR+c1CE8yeHw5V5t59aXsUPPVTHMDjEZz8MgguLL/Q7NblxhZUlTu9xSPqlsUO/y+X7dlU05jdhvyycD55DA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + + vlq@1.0.1: + resolution: {integrity: sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==} + + vm-browserify@1.1.2: + resolution: {integrity: sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==} + + void-elements@3.1.0: + resolution: {integrity: sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==} + engines: {node: '>=0.10.0'} + + vscode-jsonrpc@6.0.0: + resolution: {integrity: sha512-wnJA4BnEjOSyFMvjZdpiOwhSq9uDoK8e/kpRJDTaMYzwlkrhG1fwDIZI94CLsLzlCK5cIbMMtFlJlfR57Lavmg==} + engines: {node: '>=8.0.0 || >=10.0.0'} + + vscode-languageclient@7.0.0: + resolution: {integrity: sha512-P9AXdAPlsCgslpP9pRxYPqkNYV7Xq8300/aZDpO35j1fJm/ncize8iGswzYlcvFw5DQUx4eVk+KvfXdL0rehNg==} + engines: {vscode: ^1.52.0} + + vscode-languageserver-protocol@3.16.0: + resolution: {integrity: sha512-sdeUoAawceQdgIfTI+sdcwkiK2KU+2cbEYA0agzM2uqaUy2UpnnGHtWTHVEtS0ES4zHU0eMFRGN+oQgDxlD66A==} + + vscode-languageserver-textdocument@1.0.11: + resolution: {integrity: sha512-X+8T3GoiwTVlJbicx/sIAF+yuJAqz8VvwJyoMVhwEMoEKE/fkDmrqUgDMyBECcM2A2frVZIUj5HI/ErRXCfOeA==} + + vscode-languageserver-types@3.16.0: + resolution: {integrity: sha512-k8luDIWJWyenLc5ToFQQMaSrqCHiLwyKPHKPQZ5zz21vM+vIVUSvsRpcbiECH4WR88K2XZqc4ScRcZ7nk/jbeA==} + + vscode-languageserver@7.0.0: + resolution: {integrity: sha512-60HTx5ID+fLRcgdHfmz0LDZAXYEV68fzwG0JWwEPBode9NuMYTIxuYXPg4ngO8i8+Ou0lM7y6GzaYWbiDL0drw==} + hasBin: true + + vscode-uri@3.0.8: + resolution: {integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==} + + wagmi@2.5.20: + resolution: {integrity: sha512-K/9qk6+t/+NKFdbQyB7LtFgl3UXnGjvgyzAyfMQ+dF56uTSJipQwc94CSlN8kdQXTIOvhUSK2P7WJrdTEd15AA==} + peerDependencies: + '@tanstack/react-query': '>=5.0.0' + react: '>=18' + typescript: '>=5.0.4' + viem: 2.x + peerDependenciesMeta: + typescript: + optional: true + + walker@1.0.8: + resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} + + watchpack@2.4.1: + resolution: {integrity: sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==} + engines: {node: '>=10.13.0'} + + wcwidth@1.0.1: + resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + + web-streams-polyfill@3.3.3: + resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} + engines: {node: '>= 8'} + + webcrypto-core@1.7.9: + resolution: {integrity: sha512-FE+a4PPkOmBbgNDIyRmcHhgXn+2ClRl3JzJdDu/P4+B8y81LqKe6RAsI9b3lAOHe1T1BMkSjsRHTYRikImZnVA==} + + webextension-polyfill-ts@0.25.0: + resolution: {integrity: sha512-ikQhwwHYkpBu00pFaUzIKY26I6L87DeRI+Q6jBT1daZUNuu8dSrg5U9l/ZbqdaQ1M/TTSPKeAa3kolP5liuedw==} + deprecated: This project has moved to @types/webextension-polyfill + + webextension-polyfill@0.11.0: + resolution: {integrity: sha512-YUBSKQA0iCx2YtM75VFgvvcx1hLKaGGiph6a6UaUdSgk32VT9SzrcDAKBjeGHXoAZTnNBqS5skA4VfoKMXhEBA==} + + webextension-polyfill@0.7.0: + resolution: {integrity: sha512-su48BkMLxqzTTvPSE1eWxKToPS2Tv5DLGxKexLEVpwFd6Po6N8hhSLIvG6acPAg7qERoEaDL+Y5HQJeJeml5Aw==} + + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + + webpack-cli@5.1.4: + resolution: {integrity: sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==} + engines: {node: '>=14.15.0'} + hasBin: true + peerDependencies: + '@webpack-cli/generators': '*' + webpack: 5.x.x + webpack-bundle-analyzer: '*' + webpack-dev-server: '*' + peerDependenciesMeta: + '@webpack-cli/generators': + optional: true + webpack-bundle-analyzer: + optional: true + webpack-dev-server: + optional: true + + webpack-merge@5.10.0: + resolution: {integrity: sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==} + engines: {node: '>=10.0.0'} + + webpack-sources@3.2.3: + resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} + engines: {node: '>=10.13.0'} + + webpack@5.91.0: + resolution: {integrity: sha512-rzVwlLeBWHJbmgTC/8TvAcu5vpJNII+MelQpylD4jNERPwpBJOE2lEcko1zJX3QJeLjTTAnQxn/OJ8bjDzVQaw==} + engines: {node: '>=10.13.0'} + hasBin: true + peerDependencies: + webpack-cli: '*' + peerDependenciesMeta: + webpack-cli: + optional: true + + whatwg-fetch@3.6.20: + resolution: {integrity: sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==} + + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + + which-boxed-primitive@1.0.2: + resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + + which-builtin-type@1.1.3: + resolution: {integrity: sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==} + engines: {node: '>= 0.4'} + + which-collection@1.0.2: + resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} + engines: {node: '>= 0.4'} + + which-module@2.0.1: + resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} + + which-typed-array@1.1.15: + resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} + engines: {node: '>= 0.4'} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + wildcard@2.0.1: + resolution: {integrity: sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==} + + wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + write-file-atomic@2.4.3: + resolution: {integrity: sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==} + + ws@6.2.2: + resolution: {integrity: sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + 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 + + ws@8.11.0: + resolution: {integrity: sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + ws@8.13.0: + resolution: {integrity: sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + ws@8.16.0: + resolution: {integrity: sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + xmlhttprequest-ssl@2.0.0: + resolution: {integrity: sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==} + engines: {node: '>=0.4.0'} + + xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + + y18n@4.0.3: + resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + yaml-ast-parser@0.0.43: + resolution: {integrity: sha512-2PTINUwsRqSd+s8XxKaJWQlUuEMHJQyEuh2edBbW8KNJz0SJPwUSD2zRWqezFEdN7IzAgeuYHFUCF7o8zRdZ0A==} + + yaml@1.10.2: + resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} + engines: {node: '>= 6'} + + yaml@2.4.1: + resolution: {integrity: sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg==} + engines: {node: '>= 14'} + hasBin: true + + yargs-parser@18.1.3: + resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} + engines: {node: '>=6'} + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@15.4.1: + resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} + engines: {node: '>=8'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + zod@3.22.4: + resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} + + zustand@4.4.1: + resolution: {integrity: sha512-QCPfstAS4EBiTQzlaGP1gmorkh/UL1Leaj2tdj+zZCZ/9bm0WS7sI2wnfD5lpOszFqWJ1DcPnGoY8RDL61uokw==} + engines: {node: '>=12.7.0'} + peerDependencies: + '@types/react': '>=16.8' + immer: '>=9.0' + react: '>=16.8' + peerDependenciesMeta: + '@types/react': + optional: true + immer: + optional: true + react: + optional: true + +snapshots: + + '@aashutoshrathi/word-wrap@1.2.6': {} + + '@adraffy/ens-normalize@1.10.0': {} + + '@ampproject/remapping@2.3.0': + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + + '@ardatan/relay-compiler@12.0.0(graphql@16.8.1)': + dependencies: + '@babel/core': 7.24.4 + '@babel/generator': 7.24.4 + '@babel/parser': 7.24.4 + '@babel/runtime': 7.24.4 + '@babel/traverse': 7.24.1 + '@babel/types': 7.24.0 + babel-preset-fbjs: 3.4.0(@babel/core@7.24.4) + chalk: 4.1.2 + fb-watchman: 2.0.2 + fbjs: 3.0.5 + glob: 7.2.3 + graphql: 16.8.1 + immutable: 3.7.6 + invariant: 2.2.4 + nullthrows: 1.1.1 + relay-runtime: 12.0.0 + signedsource: 1.0.0 + yargs: 15.4.1 + transitivePeerDependencies: + - encoding + - supports-color + + '@ardatan/sync-fetch@0.0.1': + dependencies: + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + + '@babel/code-frame@7.24.2': + dependencies: + '@babel/highlight': 7.24.2 + picocolors: 1.0.0 + + '@babel/compat-data@7.24.4': {} + + '@babel/core@7.24.4': + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.24.2 + '@babel/generator': 7.24.4 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.4) + '@babel/helpers': 7.24.4 + '@babel/parser': 7.24.4 + '@babel/template': 7.24.0 + '@babel/traverse': 7.24.1 + '@babel/types': 7.24.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 + + '@babel/generator@7.24.4': + dependencies: + '@babel/types': 7.24.0 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 2.5.2 + + '@babel/helper-annotate-as-pure@7.22.5': + dependencies: + '@babel/types': 7.24.0 + + '@babel/helper-builder-binary-assignment-operator-visitor@7.22.15': + dependencies: + '@babel/types': 7.24.0 + + '@babel/helper-compilation-targets@7.23.6': + dependencies: + '@babel/compat-data': 7.24.4 + '@babel/helper-validator-option': 7.23.5 + browserslist: 4.23.0 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-create-class-features-plugin@7.24.4(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-annotate-as-pure': 7.22.5 + '@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.24.1(@babel/core@7.24.4) + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + semver: 6.3.1 + + '@babel/helper-create-regexp-features-plugin@7.22.15(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-annotate-as-pure': 7.22.5 + regexpu-core: 5.3.2 + semver: 6.3.1 + + '@babel/helper-define-polyfill-provider@0.6.1(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-plugin-utils': 7.24.0 + debug: 4.3.4 + lodash.debounce: 4.0.8 + resolve: 1.22.8 + transitivePeerDependencies: + - supports-color + + '@babel/helper-environment-visitor@7.22.20': {} + + '@babel/helper-function-name@7.23.0': + dependencies: + '@babel/template': 7.24.0 + '@babel/types': 7.24.0 + + '@babel/helper-hoist-variables@7.22.5': + dependencies: + '@babel/types': 7.24.0 + + '@babel/helper-member-expression-to-functions@7.23.0': + dependencies: + '@babel/types': 7.24.0 + + '@babel/helper-module-imports@7.24.3': + dependencies: + '@babel/types': 7.24.0 + + '@babel/helper-module-transforms@7.23.3(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-module-imports': 7.24.3 + '@babel/helper-simple-access': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/helper-validator-identifier': 7.22.20 + + '@babel/helper-optimise-call-expression@7.22.5': + dependencies: + '@babel/types': 7.24.0 + + '@babel/helper-plugin-utils@7.24.0': {} + + '@babel/helper-remap-async-to-generator@7.22.20(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-wrap-function': 7.22.20 + + '@babel/helper-replace-supers@7.24.1(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-member-expression-to-functions': 7.23.0 + '@babel/helper-optimise-call-expression': 7.22.5 + + '@babel/helper-simple-access@7.22.5': + dependencies: + '@babel/types': 7.24.0 + + '@babel/helper-skip-transparent-expression-wrappers@7.22.5': + dependencies: + '@babel/types': 7.24.0 + + '@babel/helper-split-export-declaration@7.22.6': + dependencies: + '@babel/types': 7.24.0 + + '@babel/helper-string-parser@7.24.1': {} + + '@babel/helper-validator-identifier@7.22.20': {} + + '@babel/helper-validator-option@7.23.5': {} + + '@babel/helper-wrap-function@7.22.20': + dependencies: + '@babel/helper-function-name': 7.23.0 + '@babel/template': 7.24.0 + '@babel/types': 7.24.0 + + '@babel/helpers@7.24.4': + dependencies: + '@babel/template': 7.24.0 + '@babel/traverse': 7.24.1 + '@babel/types': 7.24.0 + transitivePeerDependencies: + - supports-color + + '@babel/highlight@7.24.2': + dependencies: + '@babel/helper-validator-identifier': 7.22.20 + chalk: 2.4.2 + js-tokens: 4.0.0 + picocolors: 1.0.0 + + '@babel/parser@7.24.4': + dependencies: + '@babel/types': 7.24.0 + + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.24.4(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-plugin-utils': 7.24.0 + + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.24.1(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.24.1(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/plugin-transform-optional-chaining': 7.24.1(@babel/core@7.24.4) + + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.24.1(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-plugin-utils': 7.24.0 + + '@babel/plugin-proposal-async-generator-functions@7.20.7(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.24.4) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.4) + + '@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-create-class-features-plugin': 7.24.4(@babel/core@7.24.4) + '@babel/helper-plugin-utils': 7.24.0 + + '@babel/plugin-proposal-export-default-from@7.24.1(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/plugin-syntax-export-default-from': 7.24.1(@babel/core@7.24.4) + + '@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.4) + + '@babel/plugin-proposal-numeric-separator@7.18.6(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.4) + + '@babel/plugin-proposal-object-rest-spread@7.20.7(@babel/core@7.24.4)': + dependencies: + '@babel/compat-data': 7.24.4 + '@babel/core': 7.24.4 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.4) + '@babel/plugin-transform-parameters': 7.24.1(@babel/core@7.24.4) + + '@babel/plugin-proposal-optional-catch-binding@7.18.6(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.4) + + '@babel/plugin-proposal-optional-chaining@7.21.0(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.4) + + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + + '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + + '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + + '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + + '@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + + '@babel/plugin-syntax-export-default-from@7.24.1(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + + '@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + + '@babel/plugin-syntax-flow@7.24.1(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + + '@babel/plugin-syntax-import-assertions@7.24.1(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + + '@babel/plugin-syntax-import-attributes@7.24.1(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + + '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + + '@babel/plugin-syntax-jsx@7.24.1(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + + '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + + '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + + '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + + '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + + '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + + '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + + '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + + '@babel/plugin-syntax-typescript@7.24.1(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + + '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.4) + '@babel/helper-plugin-utils': 7.24.0 + + '@babel/plugin-transform-arrow-functions@7.24.1(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + + '@babel/plugin-transform-async-generator-functions@7.24.3(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.24.4) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.4) + + '@babel/plugin-transform-async-to-generator@7.24.1(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-module-imports': 7.24.3 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.24.4) + + '@babel/plugin-transform-block-scoped-functions@7.24.1(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + + '@babel/plugin-transform-block-scoping@7.24.4(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + + '@babel/plugin-transform-class-properties@7.24.1(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-create-class-features-plugin': 7.24.4(@babel/core@7.24.4) + '@babel/helper-plugin-utils': 7.24.0 + + '@babel/plugin-transform-class-static-block@7.24.4(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-create-class-features-plugin': 7.24.4(@babel/core@7.24.4) + '@babel/helper-plugin-utils': 7.24.0 + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.24.4) + + '@babel/plugin-transform-classes@7.24.1(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-replace-supers': 7.24.1(@babel/core@7.24.4) + '@babel/helper-split-export-declaration': 7.22.6 + globals: 11.12.0 + + '@babel/plugin-transform-computed-properties@7.24.1(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/template': 7.24.0 + + '@babel/plugin-transform-destructuring@7.24.1(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + + '@babel/plugin-transform-dotall-regex@7.24.1(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.4) + '@babel/helper-plugin-utils': 7.24.0 + + '@babel/plugin-transform-duplicate-keys@7.24.1(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + + '@babel/plugin-transform-dynamic-import@7.24.1(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.24.4) + + '@babel/plugin-transform-exponentiation-operator@7.24.1(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-builder-binary-assignment-operator-visitor': 7.22.15 + '@babel/helper-plugin-utils': 7.24.0 + + '@babel/plugin-transform-export-namespace-from@7.24.1(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.24.4) + + '@babel/plugin-transform-flow-strip-types@7.24.1(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/plugin-syntax-flow': 7.24.1(@babel/core@7.24.4) + + '@babel/plugin-transform-for-of@7.24.1(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + + '@babel/plugin-transform-function-name@7.24.1(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-plugin-utils': 7.24.0 + + '@babel/plugin-transform-json-strings@7.24.1(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.4) + + '@babel/plugin-transform-literals@7.24.1(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + + '@babel/plugin-transform-logical-assignment-operators@7.24.1(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.4) + + '@babel/plugin-transform-member-expression-literals@7.24.1(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + + '@babel/plugin-transform-modules-amd@7.24.1(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.4) + '@babel/helper-plugin-utils': 7.24.0 + + '@babel/plugin-transform-modules-commonjs@7.24.1(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.4) + '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-simple-access': 7.22.5 + + '@babel/plugin-transform-modules-systemjs@7.24.1(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.4) + '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-validator-identifier': 7.22.20 + + '@babel/plugin-transform-modules-umd@7.24.1(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.4) + '@babel/helper-plugin-utils': 7.24.0 + + '@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.4) + '@babel/helper-plugin-utils': 7.24.0 + + '@babel/plugin-transform-new-target@7.24.1(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + + '@babel/plugin-transform-nullish-coalescing-operator@7.24.1(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.4) + + '@babel/plugin-transform-numeric-separator@7.24.1(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.4) + + '@babel/plugin-transform-object-rest-spread@7.24.1(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.4) + '@babel/plugin-transform-parameters': 7.24.1(@babel/core@7.24.4) + + '@babel/plugin-transform-object-super@7.24.1(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-replace-supers': 7.24.1(@babel/core@7.24.4) + + '@babel/plugin-transform-optional-catch-binding@7.24.1(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.4) + + '@babel/plugin-transform-optional-chaining@7.24.1(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.4) + + '@babel/plugin-transform-parameters@7.24.1(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + + '@babel/plugin-transform-private-methods@7.24.1(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-create-class-features-plugin': 7.24.4(@babel/core@7.24.4) + '@babel/helper-plugin-utils': 7.24.0 + + '@babel/plugin-transform-private-property-in-object@7.24.1(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-create-class-features-plugin': 7.24.4(@babel/core@7.24.4) + '@babel/helper-plugin-utils': 7.24.0 + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.24.4) + + '@babel/plugin-transform-property-literals@7.24.1(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + + '@babel/plugin-transform-react-display-name@7.24.1(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + + '@babel/plugin-transform-react-jsx-self@7.24.1(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + + '@babel/plugin-transform-react-jsx-source@7.24.1(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + + '@babel/plugin-transform-react-jsx@7.23.4(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-module-imports': 7.24.3 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/plugin-syntax-jsx': 7.24.1(@babel/core@7.24.4) + '@babel/types': 7.24.0 + + '@babel/plugin-transform-regenerator@7.24.1(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + regenerator-transform: 0.15.2 + + '@babel/plugin-transform-reserved-words@7.24.1(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + + '@babel/plugin-transform-runtime@7.24.3(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-module-imports': 7.24.3 + '@babel/helper-plugin-utils': 7.24.0 + babel-plugin-polyfill-corejs2: 0.4.10(@babel/core@7.24.4) + babel-plugin-polyfill-corejs3: 0.10.4(@babel/core@7.24.4) + babel-plugin-polyfill-regenerator: 0.6.1(@babel/core@7.24.4) + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-shorthand-properties@7.24.1(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + + '@babel/plugin-transform-spread@7.24.1(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + + '@babel/plugin-transform-sticky-regex@7.24.1(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + + '@babel/plugin-transform-template-literals@7.24.1(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + + '@babel/plugin-transform-typeof-symbol@7.24.1(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + + '@babel/plugin-transform-typescript@7.24.4(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-create-class-features-plugin': 7.24.4(@babel/core@7.24.4) + '@babel/helper-plugin-utils': 7.24.0 + '@babel/plugin-syntax-typescript': 7.24.1(@babel/core@7.24.4) + + '@babel/plugin-transform-unicode-escapes@7.24.1(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + + '@babel/plugin-transform-unicode-property-regex@7.24.1(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.4) + '@babel/helper-plugin-utils': 7.24.0 + + '@babel/plugin-transform-unicode-regex@7.24.1(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.4) + '@babel/helper-plugin-utils': 7.24.0 + + '@babel/plugin-transform-unicode-sets-regex@7.24.1(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.4) + '@babel/helper-plugin-utils': 7.24.0 + + '@babel/preset-env@7.24.4(@babel/core@7.24.4)': + dependencies: + '@babel/compat-data': 7.24.4 + '@babel/core': 7.24.4 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-validator-option': 7.23.5 + '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.24.4(@babel/core@7.24.4) + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.24.4) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.4) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.24.4) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.24.4) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.24.4) + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.24.4) + '@babel/plugin-syntax-import-assertions': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-syntax-import-attributes': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.24.4) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.4) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.4) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.4) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.4) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.4) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.4) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.4) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.24.4) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.24.4) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.24.4) + '@babel/plugin-transform-arrow-functions': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-async-generator-functions': 7.24.3(@babel/core@7.24.4) + '@babel/plugin-transform-async-to-generator': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-block-scoped-functions': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-block-scoping': 7.24.4(@babel/core@7.24.4) + '@babel/plugin-transform-class-properties': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-class-static-block': 7.24.4(@babel/core@7.24.4) + '@babel/plugin-transform-classes': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-computed-properties': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-destructuring': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-dotall-regex': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-duplicate-keys': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-dynamic-import': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-exponentiation-operator': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-export-namespace-from': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-for-of': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-function-name': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-json-strings': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-literals': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-logical-assignment-operators': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-member-expression-literals': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-modules-amd': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-modules-commonjs': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-modules-systemjs': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-modules-umd': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.24.4) + '@babel/plugin-transform-new-target': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-nullish-coalescing-operator': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-numeric-separator': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-object-rest-spread': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-object-super': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-optional-catch-binding': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-optional-chaining': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-parameters': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-private-methods': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-private-property-in-object': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-property-literals': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-regenerator': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-reserved-words': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-shorthand-properties': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-spread': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-sticky-regex': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-template-literals': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-typeof-symbol': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-unicode-escapes': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-unicode-property-regex': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-unicode-regex': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-unicode-sets-regex': 7.24.1(@babel/core@7.24.4) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.24.4) + babel-plugin-polyfill-corejs2: 0.4.10(@babel/core@7.24.4) + babel-plugin-polyfill-corejs3: 0.10.4(@babel/core@7.24.4) + babel-plugin-polyfill-regenerator: 0.6.1(@babel/core@7.24.4) + core-js-compat: 3.37.0 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/preset-flow@7.24.1(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-validator-option': 7.23.5 + '@babel/plugin-transform-flow-strip-types': 7.24.1(@babel/core@7.24.4) + + '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/types': 7.24.0 + esutils: 2.0.3 + + '@babel/preset-typescript@7.24.1(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-validator-option': 7.23.5 + '@babel/plugin-syntax-jsx': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-modules-commonjs': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-typescript': 7.24.4(@babel/core@7.24.4) + + '@babel/register@7.23.7(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + clone-deep: 4.0.1 + find-cache-dir: 2.1.0 + make-dir: 2.1.0 + pirates: 4.0.6 + source-map-support: 0.5.21 + + '@babel/regjsgen@0.8.0': {} + + '@babel/runtime@7.24.4': + dependencies: + regenerator-runtime: 0.14.1 + + '@babel/template@7.24.0': + dependencies: + '@babel/code-frame': 7.24.2 + '@babel/parser': 7.24.4 + '@babel/types': 7.24.0 + + '@babel/traverse@7.24.1': + dependencies: + '@babel/code-frame': 7.24.2 + '@babel/generator': 7.24.4 + '@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.24.4 + '@babel/types': 7.24.0 + debug: 4.3.4 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.24.0': + dependencies: + '@babel/helper-string-parser': 7.24.1 + '@babel/helper-validator-identifier': 7.22.20 + to-fast-properties: 2.0.0 + + '@coinbase/wallet-sdk@3.9.1': + dependencies: + bn.js: 5.2.1 + buffer: 6.0.3 + clsx: 1.2.1 + eth-block-tracker: 7.1.0 + eth-json-rpc-filters: 6.0.1 + eventemitter3: 5.0.1 + keccak: 3.0.4 + preact: 10.20.2 + sha.js: 2.4.11 + transitivePeerDependencies: + - supports-color + + '@discoveryjs/json-ext@0.5.7': {} + + '@emotion/babel-plugin@11.11.0': + dependencies: + '@babel/helper-module-imports': 7.24.3 + '@babel/runtime': 7.24.4 + '@emotion/hash': 0.9.1 + '@emotion/memoize': 0.8.1 + '@emotion/serialize': 1.1.4 + babel-plugin-macros: 3.1.0 + convert-source-map: 1.9.0 + escape-string-regexp: 4.0.0 + find-root: 1.1.0 + source-map: 0.5.7 + stylis: 4.2.0 + + '@emotion/cache@11.11.0': + dependencies: + '@emotion/memoize': 0.8.1 + '@emotion/sheet': 1.2.2 + '@emotion/utils': 1.2.1 + '@emotion/weak-memoize': 0.3.1 + stylis: 4.2.0 + + '@emotion/hash@0.9.1': {} + + '@emotion/is-prop-valid@1.2.1': + dependencies: + '@emotion/memoize': 0.8.1 + + '@emotion/is-prop-valid@1.2.2': + dependencies: + '@emotion/memoize': 0.8.1 + + '@emotion/memoize@0.8.1': {} + + '@emotion/react@11.11.4(@types/react@18.2.79)(react@18.2.0)': + dependencies: + '@babel/runtime': 7.24.4 + '@emotion/babel-plugin': 11.11.0 + '@emotion/cache': 11.11.0 + '@emotion/serialize': 1.1.4 + '@emotion/use-insertion-effect-with-fallbacks': 1.0.1(react@18.2.0) + '@emotion/utils': 1.2.1 + '@emotion/weak-memoize': 0.3.1 + hoist-non-react-statics: 3.3.2 + react: 18.2.0 + optionalDependencies: + '@types/react': 18.2.79 + + '@emotion/serialize@1.1.4': + dependencies: + '@emotion/hash': 0.9.1 + '@emotion/memoize': 0.8.1 + '@emotion/unitless': 0.8.1 + '@emotion/utils': 1.2.1 + csstype: 3.1.3 + + '@emotion/sheet@1.2.2': {} + + '@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.79)(react@18.2.0))(@types/react@18.2.79)(react@18.2.0)': + dependencies: + '@babel/runtime': 7.24.4 + '@emotion/babel-plugin': 11.11.0 + '@emotion/is-prop-valid': 1.2.2 + '@emotion/react': 11.11.4(@types/react@18.2.79)(react@18.2.0) + '@emotion/serialize': 1.1.4 + '@emotion/use-insertion-effect-with-fallbacks': 1.0.1(react@18.2.0) + '@emotion/utils': 1.2.1 + react: 18.2.0 + optionalDependencies: + '@types/react': 18.2.79 + + '@emotion/unitless@0.8.0': {} + + '@emotion/unitless@0.8.1': {} + + '@emotion/use-insertion-effect-with-fallbacks@1.0.1(react@18.2.0)': + dependencies: + react: 18.2.0 + + '@emotion/utils@1.2.1': {} + + '@emotion/weak-memoize@0.3.1': {} + + '@esbuild/aix-ppc64@0.20.2': + optional: true + + '@esbuild/android-arm64@0.20.2': + optional: true + + '@esbuild/android-arm@0.20.2': + optional: true + + '@esbuild/android-x64@0.20.2': + optional: true + + '@esbuild/darwin-arm64@0.20.2': + optional: true + + '@esbuild/darwin-x64@0.20.2': + optional: true + + '@esbuild/freebsd-arm64@0.20.2': + optional: true + + '@esbuild/freebsd-x64@0.20.2': + optional: true + + '@esbuild/linux-arm64@0.20.2': + optional: true + + '@esbuild/linux-arm@0.20.2': + optional: true + + '@esbuild/linux-ia32@0.20.2': + optional: true + + '@esbuild/linux-loong64@0.20.2': + optional: true + + '@esbuild/linux-mips64el@0.20.2': + optional: true + + '@esbuild/linux-ppc64@0.20.2': + optional: true + + '@esbuild/linux-riscv64@0.20.2': + optional: true + + '@esbuild/linux-s390x@0.20.2': + optional: true + + '@esbuild/linux-x64@0.20.2': + optional: true + + '@esbuild/netbsd-x64@0.20.2': + optional: true + + '@esbuild/openbsd-x64@0.20.2': + optional: true + + '@esbuild/sunos-x64@0.20.2': + optional: true + + '@esbuild/win32-arm64@0.20.2': + optional: true + + '@esbuild/win32-ia32@0.20.2': + optional: true + + '@esbuild/win32-x64@0.20.2': + optional: true + + '@eslint-community/eslint-utils@4.4.0(eslint@8.57.0)': + dependencies: + eslint: 8.57.0 + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.10.0': {} + + '@eslint/eslintrc@2.1.4': + dependencies: + ajv: 6.12.6 + debug: 4.3.4 + espree: 9.6.1 + globals: 13.24.0 + ignore: 5.3.1 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/js@8.57.0': {} + + '@ethereumjs/common@3.2.0': + dependencies: + '@ethereumjs/util': 8.1.0 + crc-32: 1.2.2 + + '@ethereumjs/rlp@4.0.1': {} + + '@ethereumjs/tx@4.2.0': + dependencies: + '@ethereumjs/common': 3.2.0 + '@ethereumjs/rlp': 4.0.1 + '@ethereumjs/util': 8.1.0 + ethereum-cryptography: 2.1.3 + + '@ethereumjs/util@8.1.0': + dependencies: + '@ethereumjs/rlp': 4.0.1 + ethereum-cryptography: 2.1.3 + micro-ftch: 0.3.1 + + '@gear-js/api@0.38.1(@polkadot/api@11.0.2(bufferutil@4.0.8)(utf-8-validate@6.0.3))(@polkadot/wasm-crypto@7.3.2(@polkadot/util@12.6.2)(@polkadot/x-randomvalues@12.6.2(@polkadot/util@12.6.2)(@polkadot/wasm-util@7.3.2(@polkadot/util@12.6.2))))(rxjs@7.8.1)': + dependencies: + '@polkadot/api': 11.0.2(bufferutil@4.0.8)(utf-8-validate@6.0.3) + '@polkadot/wasm-crypto': 7.3.2(@polkadot/util@12.6.2)(@polkadot/x-randomvalues@12.6.2(@polkadot/util@12.6.2)(@polkadot/wasm-util@7.3.2(@polkadot/util@12.6.2))) + rxjs: 7.8.1 + + '@gear-js/react-hooks@0.10.7(@gear-js/api@0.38.1(@polkadot/api@11.0.2(bufferutil@4.0.8)(utf-8-validate@6.0.3))(@polkadot/wasm-crypto@7.3.2(@polkadot/util@12.6.2)(@polkadot/x-randomvalues@12.6.2(@polkadot/util@12.6.2)(@polkadot/wasm-util@7.3.2(@polkadot/util@12.6.2))))(rxjs@7.8.1))(@polkadot/api@11.0.2(bufferutil@4.0.8)(utf-8-validate@6.0.3))(@polkadot/extension-dapp@0.46.5(@polkadot/api@11.0.2(bufferutil@4.0.8)(utf-8-validate@6.0.3))(@polkadot/util-crypto@12.6.2(@polkadot/util@12.6.2))(@polkadot/util@12.6.2)(bufferutil@4.0.8)(utf-8-validate@6.0.3))(bufferutil@4.0.8)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(utf-8-validate@6.0.3)': + dependencies: + '@gear-js/api': 0.38.1(@polkadot/api@11.0.2(bufferutil@4.0.8)(utf-8-validate@6.0.3))(@polkadot/wasm-crypto@7.3.2(@polkadot/util@12.6.2)(@polkadot/x-randomvalues@12.6.2(@polkadot/util@12.6.2)(@polkadot/wasm-util@7.3.2(@polkadot/util@12.6.2))))(rxjs@7.8.1) + '@polkadot/api': 11.0.2(bufferutil@4.0.8)(utf-8-validate@6.0.3) + '@polkadot/api-derive': 11.0.2(bufferutil@4.0.8)(utf-8-validate@6.0.3) + '@polkadot/extension-dapp': 0.46.5(@polkadot/api@11.0.2(bufferutil@4.0.8)(utf-8-validate@6.0.3))(@polkadot/util-crypto@12.6.2(@polkadot/util@12.6.2))(@polkadot/util@12.6.2)(bufferutil@4.0.8)(utf-8-validate@6.0.3) + '@polkadot/extension-inject': 0.46.5(@polkadot/api@11.0.2(bufferutil@4.0.8)(utf-8-validate@6.0.3))(@polkadot/util@12.6.2)(bufferutil@4.0.8)(utf-8-validate@6.0.3) + '@polkadot/util': 12.6.2 + '@substrate/connect': 0.8.10(bufferutil@4.0.8)(utf-8-validate@6.0.3) + bignumber.js: 9.1.2 + nanoid: 5.0.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-transition-group: 4.4.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + '@gear-js/vara-ui@0.0.10(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + dependencies: + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + + '@graphql-codegen/add@5.0.2(graphql@16.8.1)': + dependencies: + '@graphql-codegen/plugin-helpers': 5.0.3(graphql@16.8.1) + graphql: 16.8.1 + tslib: 2.6.2 + + '@graphql-codegen/cli@5.0.2(@parcel/watcher@2.4.1)(@types/node@20.12.7)(bufferutil@4.0.8)(graphql@16.8.1)(typescript@5.4.5)(utf-8-validate@6.0.3)': + dependencies: + '@babel/generator': 7.24.4 + '@babel/template': 7.24.0 + '@babel/types': 7.24.0 + '@graphql-codegen/client-preset': 4.2.5(graphql@16.8.1) + '@graphql-codegen/core': 4.0.2(graphql@16.8.1) + '@graphql-codegen/plugin-helpers': 5.0.3(graphql@16.8.1) + '@graphql-tools/apollo-engine-loader': 8.0.1(graphql@16.8.1) + '@graphql-tools/code-file-loader': 8.1.1(graphql@16.8.1) + '@graphql-tools/git-loader': 8.0.5(graphql@16.8.1) + '@graphql-tools/github-loader': 8.0.1(@types/node@20.12.7)(graphql@16.8.1) + '@graphql-tools/graphql-file-loader': 8.0.1(graphql@16.8.1) + '@graphql-tools/json-file-loader': 8.0.1(graphql@16.8.1) + '@graphql-tools/load': 8.0.2(graphql@16.8.1) + '@graphql-tools/prisma-loader': 8.0.4(@types/node@20.12.7)(bufferutil@4.0.8)(graphql@16.8.1)(utf-8-validate@6.0.3) + '@graphql-tools/url-loader': 8.0.2(@types/node@20.12.7)(bufferutil@4.0.8)(graphql@16.8.1)(utf-8-validate@6.0.3) + '@graphql-tools/utils': 10.2.0(graphql@16.8.1) + '@whatwg-node/fetch': 0.8.8 + chalk: 4.1.2 + cosmiconfig: 8.3.6(typescript@5.4.5) + debounce: 1.2.1 + detect-indent: 6.1.0 + graphql: 16.8.1 + graphql-config: 5.0.3(@types/node@20.12.7)(bufferutil@4.0.8)(graphql@16.8.1)(typescript@5.4.5)(utf-8-validate@6.0.3) + inquirer: 8.2.6 + is-glob: 4.0.3 + jiti: 1.21.0 + json-to-pretty-yaml: 1.2.2 + listr2: 4.0.5 + log-symbols: 4.1.0 + micromatch: 4.0.5 + shell-quote: 1.8.1 + string-env-interpolation: 1.0.1 + ts-log: 2.2.5 + tslib: 2.6.2 + yaml: 2.4.1 + yargs: 17.7.2 + optionalDependencies: + '@parcel/watcher': 2.4.1 + transitivePeerDependencies: + - '@types/node' + - bufferutil + - cosmiconfig-toml-loader + - encoding + - enquirer + - supports-color + - typescript + - utf-8-validate + + '@graphql-codegen/client-preset@4.2.5(graphql@16.8.1)': + dependencies: + '@babel/helper-plugin-utils': 7.24.0 + '@babel/template': 7.24.0 + '@graphql-codegen/add': 5.0.2(graphql@16.8.1) + '@graphql-codegen/gql-tag-operations': 4.0.6(graphql@16.8.1) + '@graphql-codegen/plugin-helpers': 5.0.3(graphql@16.8.1) + '@graphql-codegen/typed-document-node': 5.0.6(graphql@16.8.1) + '@graphql-codegen/typescript': 4.0.6(graphql@16.8.1) + '@graphql-codegen/typescript-operations': 4.2.0(graphql@16.8.1) + '@graphql-codegen/visitor-plugin-common': 5.1.0(graphql@16.8.1) + '@graphql-tools/documents': 1.0.0(graphql@16.8.1) + '@graphql-tools/utils': 10.2.0(graphql@16.8.1) + '@graphql-typed-document-node/core': 3.2.0(graphql@16.8.1) + graphql: 16.8.1 + tslib: 2.6.2 + transitivePeerDependencies: + - encoding + - supports-color + + '@graphql-codegen/core@4.0.2(graphql@16.8.1)': + dependencies: + '@graphql-codegen/plugin-helpers': 5.0.3(graphql@16.8.1) + '@graphql-tools/schema': 10.0.3(graphql@16.8.1) + '@graphql-tools/utils': 10.2.0(graphql@16.8.1) + graphql: 16.8.1 + tslib: 2.6.2 + + '@graphql-codegen/gql-tag-operations@4.0.6(graphql@16.8.1)': + dependencies: + '@graphql-codegen/plugin-helpers': 5.0.3(graphql@16.8.1) + '@graphql-codegen/visitor-plugin-common': 5.1.0(graphql@16.8.1) + '@graphql-tools/utils': 10.2.0(graphql@16.8.1) + auto-bind: 4.0.0 + graphql: 16.8.1 + tslib: 2.6.2 + transitivePeerDependencies: + - encoding + - supports-color + + '@graphql-codegen/plugin-helpers@5.0.3(graphql@16.8.1)': + dependencies: + '@graphql-tools/utils': 10.2.0(graphql@16.8.1) + change-case-all: 1.0.15 + common-tags: 1.8.2 + graphql: 16.8.1 + import-from: 4.0.0 + lodash: 4.17.21 + tslib: 2.6.2 + + '@graphql-codegen/schema-ast@4.0.2(graphql@16.8.1)': + dependencies: + '@graphql-codegen/plugin-helpers': 5.0.3(graphql@16.8.1) + '@graphql-tools/utils': 10.2.0(graphql@16.8.1) + graphql: 16.8.1 + tslib: 2.6.2 + + '@graphql-codegen/typed-document-node@5.0.6(graphql@16.8.1)': + dependencies: + '@graphql-codegen/plugin-helpers': 5.0.3(graphql@16.8.1) + '@graphql-codegen/visitor-plugin-common': 5.1.0(graphql@16.8.1) + auto-bind: 4.0.0 + change-case-all: 1.0.15 + graphql: 16.8.1 + tslib: 2.6.2 + transitivePeerDependencies: + - encoding + - supports-color + + '@graphql-codegen/typescript-operations@4.2.0(graphql@16.8.1)': + dependencies: + '@graphql-codegen/plugin-helpers': 5.0.3(graphql@16.8.1) + '@graphql-codegen/typescript': 4.0.6(graphql@16.8.1) + '@graphql-codegen/visitor-plugin-common': 5.1.0(graphql@16.8.1) + auto-bind: 4.0.0 + graphql: 16.8.1 + tslib: 2.6.2 + transitivePeerDependencies: + - encoding + - supports-color + + '@graphql-codegen/typescript@4.0.6(graphql@16.8.1)': + dependencies: + '@graphql-codegen/plugin-helpers': 5.0.3(graphql@16.8.1) + '@graphql-codegen/schema-ast': 4.0.2(graphql@16.8.1) + '@graphql-codegen/visitor-plugin-common': 5.1.0(graphql@16.8.1) + auto-bind: 4.0.0 + graphql: 16.8.1 + tslib: 2.6.2 + transitivePeerDependencies: + - encoding + - supports-color + + '@graphql-codegen/visitor-plugin-common@5.1.0(graphql@16.8.1)': + dependencies: + '@graphql-codegen/plugin-helpers': 5.0.3(graphql@16.8.1) + '@graphql-tools/optimize': 2.0.0(graphql@16.8.1) + '@graphql-tools/relay-operation-optimizer': 7.0.1(graphql@16.8.1) + '@graphql-tools/utils': 10.2.0(graphql@16.8.1) + auto-bind: 4.0.0 + change-case-all: 1.0.15 + dependency-graph: 0.11.0 + graphql: 16.8.1 + graphql-tag: 2.12.6(graphql@16.8.1) + parse-filepath: 1.0.2 + tslib: 2.6.2 + transitivePeerDependencies: + - encoding + - supports-color + + '@graphql-tools/apollo-engine-loader@8.0.1(graphql@16.8.1)': + dependencies: + '@ardatan/sync-fetch': 0.0.1 + '@graphql-tools/utils': 10.2.0(graphql@16.8.1) + '@whatwg-node/fetch': 0.9.17 + graphql: 16.8.1 + tslib: 2.6.2 + transitivePeerDependencies: + - encoding + + '@graphql-tools/batch-execute@9.0.4(graphql@16.8.1)': + dependencies: + '@graphql-tools/utils': 10.2.0(graphql@16.8.1) + dataloader: 2.2.2 + graphql: 16.8.1 + tslib: 2.6.2 + value-or-promise: 1.0.12 + + '@graphql-tools/code-file-loader@8.1.1(graphql@16.8.1)': + dependencies: + '@graphql-tools/graphql-tag-pluck': 8.3.0(graphql@16.8.1) + '@graphql-tools/utils': 10.2.0(graphql@16.8.1) + globby: 11.1.0 + graphql: 16.8.1 + tslib: 2.6.2 + unixify: 1.0.0 + transitivePeerDependencies: + - supports-color + + '@graphql-tools/delegate@10.0.9(graphql@16.8.1)': + dependencies: + '@graphql-tools/batch-execute': 9.0.4(graphql@16.8.1) + '@graphql-tools/executor': 1.2.6(graphql@16.8.1) + '@graphql-tools/schema': 10.0.3(graphql@16.8.1) + '@graphql-tools/utils': 10.2.0(graphql@16.8.1) + dataloader: 2.2.2 + graphql: 16.8.1 + tslib: 2.6.2 + + '@graphql-tools/documents@1.0.0(graphql@16.8.1)': + dependencies: + graphql: 16.8.1 + lodash.sortby: 4.7.0 + tslib: 2.6.2 + + '@graphql-tools/executor-graphql-ws@1.1.2(bufferutil@4.0.8)(graphql@16.8.1)(utf-8-validate@6.0.3)': + dependencies: + '@graphql-tools/utils': 10.2.0(graphql@16.8.1) + '@types/ws': 8.5.10 + graphql: 16.8.1 + graphql-ws: 5.16.0(graphql@16.8.1) + isomorphic-ws: 5.0.0(ws@8.16.0(bufferutil@4.0.8)(utf-8-validate@6.0.3)) + tslib: 2.6.2 + ws: 8.16.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@graphql-tools/executor-http@1.0.9(@types/node@20.12.7)(graphql@16.8.1)': + dependencies: + '@graphql-tools/utils': 10.2.0(graphql@16.8.1) + '@repeaterjs/repeater': 3.0.5 + '@whatwg-node/fetch': 0.9.17 + extract-files: 11.0.0 + graphql: 16.8.1 + meros: 1.3.0(@types/node@20.12.7) + tslib: 2.6.2 + value-or-promise: 1.0.12 + transitivePeerDependencies: + - '@types/node' + + '@graphql-tools/executor-legacy-ws@1.0.6(bufferutil@4.0.8)(graphql@16.8.1)(utf-8-validate@6.0.3)': + dependencies: + '@graphql-tools/utils': 10.2.0(graphql@16.8.1) + '@types/ws': 8.5.10 + graphql: 16.8.1 + isomorphic-ws: 5.0.0(ws@8.16.0(bufferutil@4.0.8)(utf-8-validate@6.0.3)) + tslib: 2.6.2 + ws: 8.16.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@graphql-tools/executor@1.2.6(graphql@16.8.1)': + dependencies: + '@graphql-tools/utils': 10.2.0(graphql@16.8.1) + '@graphql-typed-document-node/core': 3.2.0(graphql@16.8.1) + '@repeaterjs/repeater': 3.0.5 + graphql: 16.8.1 + tslib: 2.6.2 + value-or-promise: 1.0.12 + + '@graphql-tools/git-loader@8.0.5(graphql@16.8.1)': + dependencies: + '@graphql-tools/graphql-tag-pluck': 8.3.0(graphql@16.8.1) + '@graphql-tools/utils': 10.2.0(graphql@16.8.1) + graphql: 16.8.1 + is-glob: 4.0.3 + micromatch: 4.0.5 + tslib: 2.6.2 + unixify: 1.0.0 + transitivePeerDependencies: + - supports-color + + '@graphql-tools/github-loader@8.0.1(@types/node@20.12.7)(graphql@16.8.1)': + dependencies: + '@ardatan/sync-fetch': 0.0.1 + '@graphql-tools/executor-http': 1.0.9(@types/node@20.12.7)(graphql@16.8.1) + '@graphql-tools/graphql-tag-pluck': 8.3.0(graphql@16.8.1) + '@graphql-tools/utils': 10.2.0(graphql@16.8.1) + '@whatwg-node/fetch': 0.9.17 + graphql: 16.8.1 + tslib: 2.6.2 + value-or-promise: 1.0.12 + transitivePeerDependencies: + - '@types/node' + - encoding + - supports-color + + '@graphql-tools/graphql-file-loader@8.0.1(graphql@16.8.1)': + dependencies: + '@graphql-tools/import': 7.0.1(graphql@16.8.1) + '@graphql-tools/utils': 10.2.0(graphql@16.8.1) + globby: 11.1.0 + graphql: 16.8.1 + tslib: 2.6.2 + unixify: 1.0.0 + + '@graphql-tools/graphql-tag-pluck@8.3.0(graphql@16.8.1)': + dependencies: + '@babel/core': 7.24.4 + '@babel/parser': 7.24.4 + '@babel/plugin-syntax-import-assertions': 7.24.1(@babel/core@7.24.4) + '@babel/traverse': 7.24.1 + '@babel/types': 7.24.0 + '@graphql-tools/utils': 10.2.0(graphql@16.8.1) + graphql: 16.8.1 + tslib: 2.6.2 + transitivePeerDependencies: + - supports-color + + '@graphql-tools/import@7.0.1(graphql@16.8.1)': + dependencies: + '@graphql-tools/utils': 10.2.0(graphql@16.8.1) + graphql: 16.8.1 + resolve-from: 5.0.0 + tslib: 2.6.2 + + '@graphql-tools/json-file-loader@8.0.1(graphql@16.8.1)': + dependencies: + '@graphql-tools/utils': 10.2.0(graphql@16.8.1) + globby: 11.1.0 + graphql: 16.8.1 + tslib: 2.6.2 + unixify: 1.0.0 + + '@graphql-tools/load@8.0.2(graphql@16.8.1)': + dependencies: + '@graphql-tools/schema': 10.0.3(graphql@16.8.1) + '@graphql-tools/utils': 10.2.0(graphql@16.8.1) + graphql: 16.8.1 + p-limit: 3.1.0 + tslib: 2.6.2 + + '@graphql-tools/merge@9.0.4(graphql@16.8.1)': + dependencies: + '@graphql-tools/utils': 10.2.0(graphql@16.8.1) + graphql: 16.8.1 + tslib: 2.6.2 + + '@graphql-tools/optimize@2.0.0(graphql@16.8.1)': + dependencies: + graphql: 16.8.1 + tslib: 2.6.2 + + '@graphql-tools/prisma-loader@8.0.4(@types/node@20.12.7)(bufferutil@4.0.8)(graphql@16.8.1)(utf-8-validate@6.0.3)': + dependencies: + '@graphql-tools/url-loader': 8.0.2(@types/node@20.12.7)(bufferutil@4.0.8)(graphql@16.8.1)(utf-8-validate@6.0.3) + '@graphql-tools/utils': 10.2.0(graphql@16.8.1) + '@types/js-yaml': 4.0.9 + '@whatwg-node/fetch': 0.9.17 + chalk: 4.1.2 + debug: 4.3.4 + dotenv: 16.4.5 + graphql: 16.8.1 + graphql-request: 6.1.0(graphql@16.8.1) + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.4 + jose: 5.2.4 + js-yaml: 4.1.0 + lodash: 4.17.21 + scuid: 1.1.0 + tslib: 2.6.2 + yaml-ast-parser: 0.0.43 + transitivePeerDependencies: + - '@types/node' + - bufferutil + - encoding + - supports-color + - utf-8-validate + + '@graphql-tools/relay-operation-optimizer@7.0.1(graphql@16.8.1)': + dependencies: + '@ardatan/relay-compiler': 12.0.0(graphql@16.8.1) + '@graphql-tools/utils': 10.2.0(graphql@16.8.1) + graphql: 16.8.1 + tslib: 2.6.2 + transitivePeerDependencies: + - encoding + - supports-color + + '@graphql-tools/schema@10.0.3(graphql@16.8.1)': + dependencies: + '@graphql-tools/merge': 9.0.4(graphql@16.8.1) + '@graphql-tools/utils': 10.2.0(graphql@16.8.1) + graphql: 16.8.1 + tslib: 2.6.2 + value-or-promise: 1.0.12 + + '@graphql-tools/url-loader@8.0.2(@types/node@20.12.7)(bufferutil@4.0.8)(graphql@16.8.1)(utf-8-validate@6.0.3)': + dependencies: + '@ardatan/sync-fetch': 0.0.1 + '@graphql-tools/delegate': 10.0.9(graphql@16.8.1) + '@graphql-tools/executor-graphql-ws': 1.1.2(bufferutil@4.0.8)(graphql@16.8.1)(utf-8-validate@6.0.3) + '@graphql-tools/executor-http': 1.0.9(@types/node@20.12.7)(graphql@16.8.1) + '@graphql-tools/executor-legacy-ws': 1.0.6(bufferutil@4.0.8)(graphql@16.8.1)(utf-8-validate@6.0.3) + '@graphql-tools/utils': 10.2.0(graphql@16.8.1) + '@graphql-tools/wrap': 10.0.5(graphql@16.8.1) + '@types/ws': 8.5.10 + '@whatwg-node/fetch': 0.9.17 + graphql: 16.8.1 + isomorphic-ws: 5.0.0(ws@8.16.0(bufferutil@4.0.8)(utf-8-validate@6.0.3)) + tslib: 2.6.2 + value-or-promise: 1.0.12 + ws: 8.16.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) + transitivePeerDependencies: + - '@types/node' + - bufferutil + - encoding + - utf-8-validate + + '@graphql-tools/utils@10.2.0(graphql@16.8.1)': + dependencies: + '@graphql-typed-document-node/core': 3.2.0(graphql@16.8.1) + cross-inspect: 1.0.0 + dset: 3.1.3 + graphql: 16.8.1 + tslib: 2.6.2 + + '@graphql-tools/wrap@10.0.5(graphql@16.8.1)': + dependencies: + '@graphql-tools/delegate': 10.0.9(graphql@16.8.1) + '@graphql-tools/schema': 10.0.3(graphql@16.8.1) + '@graphql-tools/utils': 10.2.0(graphql@16.8.1) + graphql: 16.8.1 + tslib: 2.6.2 + value-or-promise: 1.0.12 + + '@graphql-typed-document-node/core@3.2.0(graphql@16.8.1)': + dependencies: + graphql: 16.8.1 + + '@hapi/hoek@9.3.0': {} + + '@hapi/topo@5.1.0': + dependencies: + '@hapi/hoek': 9.3.0 + + '@hookform/resolvers@3.3.4(react-hook-form@7.51.3(react@18.2.0))': + dependencies: + react-hook-form: 7.51.3(react@18.2.0) + + '@humanwhocodes/config-array@0.11.14': + dependencies: + '@humanwhocodes/object-schema': 2.0.3 + debug: 4.3.4 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/object-schema@2.0.3': {} + + '@isaacs/ttlcache@1.4.1': {} + + '@jest/create-cache-key-function@29.7.0': + dependencies: + '@jest/types': 29.6.3 + + '@jest/environment@29.7.0': + dependencies: + '@jest/fake-timers': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 20.12.7 + jest-mock: 29.7.0 + + '@jest/fake-timers@29.7.0': + dependencies: + '@jest/types': 29.6.3 + '@sinonjs/fake-timers': 10.3.0 + '@types/node': 20.12.7 + jest-message-util: 29.7.0 + jest-mock: 29.7.0 + jest-util: 29.7.0 + + '@jest/schemas@29.6.3': + dependencies: + '@sinclair/typebox': 0.27.8 + + '@jest/types@26.6.2': + dependencies: + '@types/istanbul-lib-coverage': 2.0.6 + '@types/istanbul-reports': 3.0.4 + '@types/node': 20.12.7 + '@types/yargs': 15.0.19 + chalk: 4.1.2 + + '@jest/types@29.6.3': + dependencies: + '@jest/schemas': 29.6.3 + '@types/istanbul-lib-coverage': 2.0.6 + '@types/istanbul-reports': 3.0.4 + '@types/node': 20.12.7 + '@types/yargs': 17.0.32 + chalk: 4.1.2 + + '@jridgewell/gen-mapping@0.3.5': + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/set-array@1.2.1': {} + + '@jridgewell/source-map@0.3.6': + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/sourcemap-codec@1.4.15': {} + + '@jridgewell/trace-mapping@0.3.25': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + + '@kamilkisiela/fast-url-parser@1.1.4': {} + + '@lit-labs/ssr-dom-shim@1.2.0': {} + + '@lit/reactive-element@1.6.3': + dependencies: + '@lit-labs/ssr-dom-shim': 1.2.0 + + '@lit/reactive-element@2.0.4': + dependencies: + '@lit-labs/ssr-dom-shim': 1.2.0 + + '@metamask/eth-json-rpc-provider@1.0.1': + dependencies: + '@metamask/json-rpc-engine': 7.3.3 + '@metamask/safe-event-emitter': 3.1.1 + '@metamask/utils': 5.0.2 + transitivePeerDependencies: + - supports-color + + '@metamask/json-rpc-engine@7.3.3': + dependencies: + '@metamask/rpc-errors': 6.2.1 + '@metamask/safe-event-emitter': 3.1.1 + '@metamask/utils': 8.4.0 + transitivePeerDependencies: + - supports-color + + '@metamask/object-multiplex@1.3.0': + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + readable-stream: 2.3.8 + + '@metamask/onboarding@1.0.1': + dependencies: + bowser: 2.11.0 + + '@metamask/post-message-stream@6.2.0': + dependencies: + '@metamask/utils': 5.0.2 + readable-stream: 2.3.3 + transitivePeerDependencies: + - supports-color + + '@metamask/providers@10.2.1': + dependencies: + '@metamask/object-multiplex': 1.3.0 + '@metamask/safe-event-emitter': 2.0.0 + '@types/chrome': 0.0.136 + detect-browser: 5.3.0 + eth-rpc-errors: 4.0.3 + extension-port-stream: 2.1.1 + fast-deep-equal: 2.0.1 + is-stream: 2.0.1 + json-rpc-engine: 6.1.0 + json-rpc-middleware-stream: 4.2.3 + pump: 3.0.0 + webextension-polyfill-ts: 0.25.0 + transitivePeerDependencies: + - '@swc/core' + - '@webpack-cli/generators' + - esbuild + - uglify-js + - webpack-bundle-analyzer + - webpack-dev-server + + '@metamask/rpc-errors@6.2.1': + dependencies: + '@metamask/utils': 8.4.0 + fast-safe-stringify: 2.1.1 + transitivePeerDependencies: + - supports-color + + '@metamask/safe-event-emitter@2.0.0': {} + + '@metamask/safe-event-emitter@3.1.1': {} + + '@metamask/sdk-communication-layer@0.14.3': + dependencies: + bufferutil: 4.0.8 + cross-fetch: 3.1.8 + date-fns: 2.30.0 + eciesjs: 0.3.18 + eventemitter2: 6.4.9 + socket.io-client: 4.7.5(bufferutil@4.0.8)(utf-8-validate@6.0.3) + utf-8-validate: 6.0.3 + uuid: 8.3.2 + transitivePeerDependencies: + - encoding + - supports-color + + '@metamask/sdk-install-modal-web@0.14.1(@types/react@18.2.79)(react-native@0.73.6(@babel/core@7.24.4)(@babel/preset-env@7.24.4(@babel/core@7.24.4))(bufferutil@4.0.8)(react@18.2.0)(utf-8-validate@6.0.3))': + dependencies: + '@emotion/react': 11.11.4(@types/react@18.2.79)(react@18.2.0) + '@emotion/styled': 11.11.5(@emotion/react@11.11.4(@types/react@18.2.79)(react@18.2.0))(@types/react@18.2.79)(react@18.2.0) + i18next: 22.5.1 + qr-code-styling: 1.6.0-rc.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-i18next: 13.5.0(i18next@22.5.1)(react-dom@18.2.0(react@18.2.0))(react-native@0.73.6(@babel/core@7.24.4)(@babel/preset-env@7.24.4(@babel/core@7.24.4))(bufferutil@4.0.8)(react@18.2.0)(utf-8-validate@6.0.3))(react@18.2.0) + transitivePeerDependencies: + - '@types/react' + - react-native + + '@metamask/sdk@0.14.3(@types/react@18.2.79)(bufferutil@4.0.8)(react-dom@18.2.0(react@18.2.0))(react-native@0.73.6(@babel/core@7.24.4)(@babel/preset-env@7.24.4(@babel/core@7.24.4))(bufferutil@4.0.8)(react@18.2.0)(utf-8-validate@6.0.3))(react@18.2.0)(rollup@4.14.3)(utf-8-validate@6.0.3)': + dependencies: + '@metamask/onboarding': 1.0.1 + '@metamask/post-message-stream': 6.2.0 + '@metamask/providers': 10.2.1 + '@metamask/sdk-communication-layer': 0.14.3 + '@metamask/sdk-install-modal-web': 0.14.1(@types/react@18.2.79)(react-native@0.73.6(@babel/core@7.24.4)(@babel/preset-env@7.24.4(@babel/core@7.24.4))(bufferutil@4.0.8)(react@18.2.0)(utf-8-validate@6.0.3)) + '@react-native-async-storage/async-storage': 1.23.1(react-native@0.73.6(@babel/core@7.24.4)(@babel/preset-env@7.24.4(@babel/core@7.24.4))(bufferutil@4.0.8)(react@18.2.0)(utf-8-validate@6.0.3)) + '@types/dom-screen-wake-lock': 1.0.3 + bowser: 2.11.0 + cross-fetch: 4.0.0 + eciesjs: 0.3.18 + eth-rpc-errors: 4.0.3 + eventemitter2: 6.4.9 + extension-port-stream: 2.1.1 + i18next: 22.5.1 + i18next-browser-languagedetector: 7.2.1 + obj-multiplex: 1.0.0 + pump: 3.0.0 + qrcode-terminal-nooctal: 0.12.1 + react-i18next: 13.5.0(i18next@22.5.1)(react-dom@18.2.0(react@18.2.0))(react-native@0.73.6(@babel/core@7.24.4)(@babel/preset-env@7.24.4(@babel/core@7.24.4))(bufferutil@4.0.8)(react@18.2.0)(utf-8-validate@6.0.3))(react@18.2.0) + react-native-webview: 11.26.1(react-native@0.73.6(@babel/core@7.24.4)(@babel/preset-env@7.24.4(@babel/core@7.24.4))(bufferutil@4.0.8)(react@18.2.0)(utf-8-validate@6.0.3))(react@18.2.0) + readable-stream: 2.3.8 + rollup-plugin-visualizer: 5.12.0(rollup@4.14.3) + socket.io-client: 4.7.5(bufferutil@4.0.8)(utf-8-validate@6.0.3) + util: 0.12.5 + uuid: 8.3.2 + optionalDependencies: + react: 18.2.0 + react-native: 0.73.6(@babel/core@7.24.4)(@babel/preset-env@7.24.4(@babel/core@7.24.4))(bufferutil@4.0.8)(react@18.2.0)(utf-8-validate@6.0.3) + transitivePeerDependencies: + - '@swc/core' + - '@types/react' + - '@webpack-cli/generators' + - bufferutil + - encoding + - esbuild + - react-dom + - rollup + - supports-color + - uglify-js + - utf-8-validate + - webpack-bundle-analyzer + - webpack-dev-server + + '@metamask/utils@5.0.2': + dependencies: + '@ethereumjs/tx': 4.2.0 + '@types/debug': 4.1.12 + debug: 4.3.4 + semver: 7.6.0 + superstruct: 1.0.4 + transitivePeerDependencies: + - supports-color + + '@metamask/utils@8.4.0': + dependencies: + '@ethereumjs/tx': 4.2.0 + '@noble/hashes': 1.4.0 + '@scure/base': 1.1.6 + '@types/debug': 4.1.12 + debug: 4.3.4 + pony-cause: 2.1.11 + semver: 7.6.0 + superstruct: 1.0.4 + uuid: 9.0.1 + transitivePeerDependencies: + - supports-color + + '@motionone/animation@10.17.0': + dependencies: + '@motionone/easing': 10.17.0 + '@motionone/types': 10.17.0 + '@motionone/utils': 10.17.0 + tslib: 2.6.2 + + '@motionone/dom@10.17.0': + dependencies: + '@motionone/animation': 10.17.0 + '@motionone/generators': 10.17.0 + '@motionone/types': 10.17.0 + '@motionone/utils': 10.17.0 + hey-listen: 1.0.8 + tslib: 2.6.2 + + '@motionone/easing@10.17.0': + dependencies: + '@motionone/utils': 10.17.0 + tslib: 2.6.2 + + '@motionone/generators@10.17.0': + dependencies: + '@motionone/types': 10.17.0 + '@motionone/utils': 10.17.0 + tslib: 2.6.2 + + '@motionone/svelte@10.16.4': + dependencies: + '@motionone/dom': 10.17.0 + tslib: 2.6.2 + + '@motionone/types@10.17.0': {} + + '@motionone/utils@10.17.0': + dependencies: + '@motionone/types': 10.17.0 + hey-listen: 1.0.8 + tslib: 2.6.2 + + '@motionone/vue@10.16.4': + dependencies: + '@motionone/dom': 10.17.0 + tslib: 2.6.2 + + '@noble/curves@1.2.0': + dependencies: + '@noble/hashes': 1.3.2 + + '@noble/curves@1.3.0': + dependencies: + '@noble/hashes': 1.3.3 + + '@noble/curves@1.4.0': + dependencies: + '@noble/hashes': 1.4.0 + + '@noble/hashes@1.3.2': {} + + '@noble/hashes@1.3.3': {} + + '@noble/hashes@1.4.0': {} + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.17.1 + + '@parcel/watcher-android-arm64@2.4.1': + optional: true + + '@parcel/watcher-darwin-arm64@2.4.1': + optional: true + + '@parcel/watcher-darwin-x64@2.4.1': + optional: true + + '@parcel/watcher-freebsd-x64@2.4.1': + optional: true + + '@parcel/watcher-linux-arm-glibc@2.4.1': + optional: true + + '@parcel/watcher-linux-arm64-glibc@2.4.1': + optional: true + + '@parcel/watcher-linux-arm64-musl@2.4.1': + optional: true + + '@parcel/watcher-linux-x64-glibc@2.4.1': + optional: true + + '@parcel/watcher-linux-x64-musl@2.4.1': + optional: true + + '@parcel/watcher-wasm@2.4.1': + dependencies: + is-glob: 4.0.3 + micromatch: 4.0.5 + + '@parcel/watcher-win32-arm64@2.4.1': + optional: true + + '@parcel/watcher-win32-ia32@2.4.1': + optional: true + + '@parcel/watcher-win32-x64@2.4.1': + optional: true + + '@parcel/watcher@2.4.1': + dependencies: + detect-libc: 1.0.3 + is-glob: 4.0.3 + micromatch: 4.0.5 + node-addon-api: 7.1.0 + optionalDependencies: + '@parcel/watcher-android-arm64': 2.4.1 + '@parcel/watcher-darwin-arm64': 2.4.1 + '@parcel/watcher-darwin-x64': 2.4.1 + '@parcel/watcher-freebsd-x64': 2.4.1 + '@parcel/watcher-linux-arm-glibc': 2.4.1 + '@parcel/watcher-linux-arm64-glibc': 2.4.1 + '@parcel/watcher-linux-arm64-musl': 2.4.1 + '@parcel/watcher-linux-x64-glibc': 2.4.1 + '@parcel/watcher-linux-x64-musl': 2.4.1 + '@parcel/watcher-win32-arm64': 2.4.1 + '@parcel/watcher-win32-ia32': 2.4.1 + '@parcel/watcher-win32-x64': 2.4.1 + + '@peculiar/asn1-schema@2.3.8': + dependencies: + asn1js: 3.0.5 + pvtsutils: 1.3.5 + tslib: 2.6.2 + + '@peculiar/json-schema@1.1.12': + dependencies: + tslib: 2.6.2 + + '@peculiar/webcrypto@1.4.6': + dependencies: + '@peculiar/asn1-schema': 2.3.8 + '@peculiar/json-schema': 1.1.12 + pvtsutils: 1.3.5 + tslib: 2.6.2 + webcrypto-core: 1.7.9 + + '@polkadot-api/client@0.0.1-492c132563ea6b40ae1fc5470dec4cd18768d182.1.0(rxjs@7.8.1)': + dependencies: + '@polkadot-api/metadata-builders': 0.0.1-492c132563ea6b40ae1fc5470dec4cd18768d182.1.0 + '@polkadot-api/substrate-bindings': 0.0.1-492c132563ea6b40ae1fc5470dec4cd18768d182.1.0 + '@polkadot-api/substrate-client': 0.0.1-492c132563ea6b40ae1fc5470dec4cd18768d182.1.0 + '@polkadot-api/utils': 0.0.1-492c132563ea6b40ae1fc5470dec4cd18768d182.1.0 + rxjs: 7.8.1 + optional: true + + '@polkadot-api/json-rpc-provider-proxy@0.0.1': {} + + '@polkadot-api/json-rpc-provider-proxy@0.0.1-492c132563ea6b40ae1fc5470dec4cd18768d182.1.0': + optional: true + + '@polkadot-api/json-rpc-provider@0.0.1': {} + + '@polkadot-api/json-rpc-provider@0.0.1-492c132563ea6b40ae1fc5470dec4cd18768d182.1.0': + optional: true + + '@polkadot-api/metadata-builders@0.0.1': + dependencies: + '@polkadot-api/substrate-bindings': 0.0.1 + '@polkadot-api/utils': 0.0.1 + + '@polkadot-api/metadata-builders@0.0.1-492c132563ea6b40ae1fc5470dec4cd18768d182.1.0': + dependencies: + '@polkadot-api/substrate-bindings': 0.0.1-492c132563ea6b40ae1fc5470dec4cd18768d182.1.0 + '@polkadot-api/utils': 0.0.1-492c132563ea6b40ae1fc5470dec4cd18768d182.1.0 + optional: true + + '@polkadot-api/observable-client@0.1.0(rxjs@7.8.1)': + dependencies: + '@polkadot-api/metadata-builders': 0.0.1 + '@polkadot-api/substrate-bindings': 0.0.1 + '@polkadot-api/substrate-client': 0.0.1 + '@polkadot-api/utils': 0.0.1 + rxjs: 7.8.1 + + '@polkadot-api/substrate-bindings@0.0.1': + dependencies: + '@noble/hashes': 1.4.0 + '@polkadot-api/utils': 0.0.1 + '@scure/base': 1.1.6 + scale-ts: 1.6.0 + + '@polkadot-api/substrate-bindings@0.0.1-492c132563ea6b40ae1fc5470dec4cd18768d182.1.0': + dependencies: + '@noble/hashes': 1.4.0 + '@polkadot-api/utils': 0.0.1-492c132563ea6b40ae1fc5470dec4cd18768d182.1.0 + '@scure/base': 1.1.6 + scale-ts: 1.6.0 + optional: true + + '@polkadot-api/substrate-client@0.0.1': {} + + '@polkadot-api/substrate-client@0.0.1-492c132563ea6b40ae1fc5470dec4cd18768d182.1.0': + optional: true + + '@polkadot-api/utils@0.0.1': {} + + '@polkadot-api/utils@0.0.1-492c132563ea6b40ae1fc5470dec4cd18768d182.1.0': + optional: true + + '@polkadot/api-augment@11.0.2(bufferutil@4.0.8)(utf-8-validate@6.0.3)': + dependencies: + '@polkadot/api-base': 11.0.2(bufferutil@4.0.8)(utf-8-validate@6.0.3) + '@polkadot/rpc-augment': 11.0.2(bufferutil@4.0.8)(utf-8-validate@6.0.3) + '@polkadot/types': 11.0.2 + '@polkadot/types-augment': 11.0.2 + '@polkadot/types-codec': 11.0.2 + '@polkadot/util': 12.6.2 + tslib: 2.6.2 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + '@polkadot/api-base@11.0.2(bufferutil@4.0.8)(utf-8-validate@6.0.3)': + dependencies: + '@polkadot/rpc-core': 11.0.2(bufferutil@4.0.8)(utf-8-validate@6.0.3) + '@polkadot/types': 11.0.2 + '@polkadot/util': 12.6.2 + rxjs: 7.8.1 + tslib: 2.6.2 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + '@polkadot/api-derive@11.0.2(bufferutil@4.0.8)(utf-8-validate@6.0.3)': + dependencies: + '@polkadot/api': 11.0.2(bufferutil@4.0.8)(utf-8-validate@6.0.3) + '@polkadot/api-augment': 11.0.2(bufferutil@4.0.8)(utf-8-validate@6.0.3) + '@polkadot/api-base': 11.0.2(bufferutil@4.0.8)(utf-8-validate@6.0.3) + '@polkadot/rpc-core': 11.0.2(bufferutil@4.0.8)(utf-8-validate@6.0.3) + '@polkadot/types': 11.0.2 + '@polkadot/types-codec': 11.0.2 + '@polkadot/util': 12.6.2 + '@polkadot/util-crypto': 12.6.2(@polkadot/util@12.6.2) + rxjs: 7.8.1 + tslib: 2.6.2 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + '@polkadot/api@11.0.2(bufferutil@4.0.8)(utf-8-validate@6.0.3)': + dependencies: + '@polkadot/api-augment': 11.0.2(bufferutil@4.0.8)(utf-8-validate@6.0.3) + '@polkadot/api-base': 11.0.2(bufferutil@4.0.8)(utf-8-validate@6.0.3) + '@polkadot/api-derive': 11.0.2(bufferutil@4.0.8)(utf-8-validate@6.0.3) + '@polkadot/keyring': 12.6.2(@polkadot/util-crypto@12.6.2(@polkadot/util@12.6.2))(@polkadot/util@12.6.2) + '@polkadot/rpc-augment': 11.0.2(bufferutil@4.0.8)(utf-8-validate@6.0.3) + '@polkadot/rpc-core': 11.0.2(bufferutil@4.0.8)(utf-8-validate@6.0.3) + '@polkadot/rpc-provider': 11.0.2(bufferutil@4.0.8)(utf-8-validate@6.0.3) + '@polkadot/types': 11.0.2 + '@polkadot/types-augment': 11.0.2 + '@polkadot/types-codec': 11.0.2 + '@polkadot/types-create': 11.0.2 + '@polkadot/types-known': 11.0.2 + '@polkadot/util': 12.6.2 + '@polkadot/util-crypto': 12.6.2(@polkadot/util@12.6.2) + eventemitter3: 5.0.1 + rxjs: 7.8.1 + tslib: 2.6.2 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + '@polkadot/extension-dapp@0.46.5(@polkadot/api@11.0.2(bufferutil@4.0.8)(utf-8-validate@6.0.3))(@polkadot/util-crypto@12.6.2(@polkadot/util@12.6.2))(@polkadot/util@12.6.2)(bufferutil@4.0.8)(utf-8-validate@6.0.3)': + dependencies: + '@polkadot/api': 11.0.2(bufferutil@4.0.8)(utf-8-validate@6.0.3) + '@polkadot/extension-inject': 0.46.5(@polkadot/api@11.0.2(bufferutil@4.0.8)(utf-8-validate@6.0.3))(@polkadot/util@12.6.2)(bufferutil@4.0.8)(utf-8-validate@6.0.3) + '@polkadot/util': 12.6.2 + '@polkadot/util-crypto': 12.6.2(@polkadot/util@12.6.2) + tslib: 2.6.2 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + '@polkadot/extension-inject@0.46.5(@polkadot/api@11.0.2(bufferutil@4.0.8)(utf-8-validate@6.0.3))(@polkadot/util@12.6.2)(bufferutil@4.0.8)(utf-8-validate@6.0.3)': + dependencies: + '@polkadot/api': 11.0.2(bufferutil@4.0.8)(utf-8-validate@6.0.3) + '@polkadot/rpc-provider': 10.12.6(bufferutil@4.0.8)(utf-8-validate@6.0.3) + '@polkadot/types': 10.12.6 + '@polkadot/util': 12.6.2 + '@polkadot/util-crypto': 12.6.2(@polkadot/util@12.6.2) + '@polkadot/x-global': 12.6.2 + tslib: 2.6.2 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + '@polkadot/keyring@12.6.2(@polkadot/util-crypto@12.6.2(@polkadot/util@12.6.2))(@polkadot/util@12.6.2)': + dependencies: + '@polkadot/util': 12.6.2 + '@polkadot/util-crypto': 12.6.2(@polkadot/util@12.6.2) + tslib: 2.6.2 + + '@polkadot/networks@12.6.2': + dependencies: + '@polkadot/util': 12.6.2 + '@substrate/ss58-registry': 1.47.0 + tslib: 2.6.2 + + '@polkadot/react-identicon@3.6.5(@polkadot/keyring@12.6.2(@polkadot/util-crypto@12.6.2(@polkadot/util@12.6.2))(@polkadot/util@12.6.2))(@polkadot/networks@12.6.2)(@polkadot/util-crypto@12.6.2(@polkadot/util@12.6.2))(@polkadot/util@12.6.2)(react-dom@18.2.0(react@18.2.0))(react-is@18.2.0)(react@18.2.0)': + dependencies: + '@polkadot/keyring': 12.6.2(@polkadot/util-crypto@12.6.2(@polkadot/util@12.6.2))(@polkadot/util@12.6.2) + '@polkadot/ui-settings': 3.6.5(@polkadot/networks@12.6.2)(@polkadot/util@12.6.2) + '@polkadot/ui-shared': 3.6.5(@polkadot/util-crypto@12.6.2(@polkadot/util@12.6.2))(@polkadot/util@12.6.2) + '@polkadot/util': 12.6.2 + '@polkadot/util-crypto': 12.6.2(@polkadot/util@12.6.2) + ethereum-blockies-base64: 1.0.2 + jdenticon: 3.2.0 + react: 18.2.0 + react-copy-to-clipboard: 5.1.0(react@18.2.0) + react-dom: 18.2.0(react@18.2.0) + react-is: 18.2.0 + styled-components: 6.1.8(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + tslib: 2.6.2 + transitivePeerDependencies: + - '@polkadot/networks' + + '@polkadot/rpc-augment@11.0.2(bufferutil@4.0.8)(utf-8-validate@6.0.3)': + dependencies: + '@polkadot/rpc-core': 11.0.2(bufferutil@4.0.8)(utf-8-validate@6.0.3) + '@polkadot/types': 11.0.2 + '@polkadot/types-codec': 11.0.2 + '@polkadot/util': 12.6.2 + tslib: 2.6.2 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + '@polkadot/rpc-core@11.0.2(bufferutil@4.0.8)(utf-8-validate@6.0.3)': + dependencies: + '@polkadot/rpc-augment': 11.0.2(bufferutil@4.0.8)(utf-8-validate@6.0.3) + '@polkadot/rpc-provider': 11.0.2(bufferutil@4.0.8)(utf-8-validate@6.0.3) + '@polkadot/types': 11.0.2 + '@polkadot/util': 12.6.2 + rxjs: 7.8.1 + tslib: 2.6.2 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + '@polkadot/rpc-provider@10.12.6(bufferutil@4.0.8)(utf-8-validate@6.0.3)': + dependencies: + '@polkadot/keyring': 12.6.2(@polkadot/util-crypto@12.6.2(@polkadot/util@12.6.2))(@polkadot/util@12.6.2) + '@polkadot/types': 10.12.6 + '@polkadot/types-support': 10.12.6 + '@polkadot/util': 12.6.2 + '@polkadot/util-crypto': 12.6.2(@polkadot/util@12.6.2) + '@polkadot/x-fetch': 12.6.2 + '@polkadot/x-global': 12.6.2 + '@polkadot/x-ws': 12.6.2(bufferutil@4.0.8)(utf-8-validate@6.0.3) + eventemitter3: 5.0.1 + mock-socket: 9.3.1 + nock: 13.5.4 + tslib: 2.6.2 + optionalDependencies: + '@substrate/connect': 0.8.8(bufferutil@4.0.8)(utf-8-validate@6.0.3) + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + '@polkadot/rpc-provider@11.0.2(bufferutil@4.0.8)(utf-8-validate@6.0.3)': + dependencies: + '@polkadot/keyring': 12.6.2(@polkadot/util-crypto@12.6.2(@polkadot/util@12.6.2))(@polkadot/util@12.6.2) + '@polkadot/types': 11.0.2 + '@polkadot/types-support': 11.0.2 + '@polkadot/util': 12.6.2 + '@polkadot/util-crypto': 12.6.2(@polkadot/util@12.6.2) + '@polkadot/x-fetch': 12.6.2 + '@polkadot/x-global': 12.6.2 + '@polkadot/x-ws': 12.6.2(bufferutil@4.0.8)(utf-8-validate@6.0.3) + eventemitter3: 5.0.1 + mock-socket: 9.3.1 + nock: 13.5.4 + tslib: 2.6.2 + optionalDependencies: + '@substrate/connect': 0.8.10(bufferutil@4.0.8)(utf-8-validate@6.0.3) + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + '@polkadot/types-augment@10.12.6': + dependencies: + '@polkadot/types': 10.12.6 + '@polkadot/types-codec': 10.12.6 + '@polkadot/util': 12.6.2 + tslib: 2.6.2 + + '@polkadot/types-augment@11.0.2': + dependencies: + '@polkadot/types': 11.0.2 + '@polkadot/types-codec': 11.0.2 + '@polkadot/util': 12.6.2 + tslib: 2.6.2 + + '@polkadot/types-codec@10.12.6': + dependencies: + '@polkadot/util': 12.6.2 + '@polkadot/x-bigint': 12.6.2 + tslib: 2.6.2 + + '@polkadot/types-codec@11.0.2': + dependencies: + '@polkadot/util': 12.6.2 + '@polkadot/x-bigint': 12.6.2 + tslib: 2.6.2 + + '@polkadot/types-create@10.12.6': + dependencies: + '@polkadot/types-codec': 10.12.6 + '@polkadot/util': 12.6.2 + tslib: 2.6.2 + + '@polkadot/types-create@11.0.2': + dependencies: + '@polkadot/types-codec': 11.0.2 + '@polkadot/util': 12.6.2 + tslib: 2.6.2 + + '@polkadot/types-known@11.0.2': + dependencies: + '@polkadot/networks': 12.6.2 + '@polkadot/types': 11.0.2 + '@polkadot/types-codec': 11.0.2 + '@polkadot/types-create': 11.0.2 + '@polkadot/util': 12.6.2 + tslib: 2.6.2 + + '@polkadot/types-support@10.12.6': + dependencies: + '@polkadot/util': 12.6.2 + tslib: 2.6.2 + + '@polkadot/types-support@11.0.2': + dependencies: + '@polkadot/util': 12.6.2 + tslib: 2.6.2 + + '@polkadot/types@10.12.6': + dependencies: + '@polkadot/keyring': 12.6.2(@polkadot/util-crypto@12.6.2(@polkadot/util@12.6.2))(@polkadot/util@12.6.2) + '@polkadot/types-augment': 10.12.6 + '@polkadot/types-codec': 10.12.6 + '@polkadot/types-create': 10.12.6 + '@polkadot/util': 12.6.2 + '@polkadot/util-crypto': 12.6.2(@polkadot/util@12.6.2) + rxjs: 7.8.1 + tslib: 2.6.2 + + '@polkadot/types@11.0.2': + dependencies: + '@polkadot/keyring': 12.6.2(@polkadot/util-crypto@12.6.2(@polkadot/util@12.6.2))(@polkadot/util@12.6.2) + '@polkadot/types-augment': 11.0.2 + '@polkadot/types-codec': 11.0.2 + '@polkadot/types-create': 11.0.2 + '@polkadot/util': 12.6.2 + '@polkadot/util-crypto': 12.6.2(@polkadot/util@12.6.2) + rxjs: 7.8.1 + tslib: 2.6.2 + + '@polkadot/ui-settings@3.6.5(@polkadot/networks@12.6.2)(@polkadot/util@12.6.2)': + dependencies: + '@polkadot/networks': 12.6.2 + '@polkadot/util': 12.6.2 + eventemitter3: 5.0.1 + store: 2.0.12 + tslib: 2.6.2 + + '@polkadot/ui-shared@3.6.5(@polkadot/util-crypto@12.6.2(@polkadot/util@12.6.2))(@polkadot/util@12.6.2)': + dependencies: + '@polkadot/util': 12.6.2 + '@polkadot/util-crypto': 12.6.2(@polkadot/util@12.6.2) + colord: 2.9.3 + tslib: 2.6.2 + + '@polkadot/util-crypto@12.6.2(@polkadot/util@12.6.2)': + dependencies: + '@noble/curves': 1.4.0 + '@noble/hashes': 1.4.0 + '@polkadot/networks': 12.6.2 + '@polkadot/util': 12.6.2 + '@polkadot/wasm-crypto': 7.3.2(@polkadot/util@12.6.2)(@polkadot/x-randomvalues@12.6.2(@polkadot/util@12.6.2)(@polkadot/wasm-util@7.3.2(@polkadot/util@12.6.2))) + '@polkadot/wasm-util': 7.3.2(@polkadot/util@12.6.2) + '@polkadot/x-bigint': 12.6.2 + '@polkadot/x-randomvalues': 12.6.2(@polkadot/util@12.6.2)(@polkadot/wasm-util@7.3.2(@polkadot/util@12.6.2)) + '@scure/base': 1.1.6 + tslib: 2.6.2 + + '@polkadot/util@12.6.2': + dependencies: + '@polkadot/x-bigint': 12.6.2 + '@polkadot/x-global': 12.6.2 + '@polkadot/x-textdecoder': 12.6.2 + '@polkadot/x-textencoder': 12.6.2 + '@types/bn.js': 5.1.5 + bn.js: 5.2.1 + tslib: 2.6.2 + + '@polkadot/wasm-bridge@7.3.2(@polkadot/util@12.6.2)(@polkadot/x-randomvalues@12.6.2(@polkadot/util@12.6.2)(@polkadot/wasm-util@7.3.2(@polkadot/util@12.6.2)))': + dependencies: + '@polkadot/util': 12.6.2 + '@polkadot/wasm-util': 7.3.2(@polkadot/util@12.6.2) + '@polkadot/x-randomvalues': 12.6.2(@polkadot/util@12.6.2)(@polkadot/wasm-util@7.3.2(@polkadot/util@12.6.2)) + tslib: 2.6.2 + + '@polkadot/wasm-crypto-asmjs@7.3.2(@polkadot/util@12.6.2)': + dependencies: + '@polkadot/util': 12.6.2 + tslib: 2.6.2 + + '@polkadot/wasm-crypto-init@7.3.2(@polkadot/util@12.6.2)(@polkadot/x-randomvalues@12.6.2(@polkadot/util@12.6.2)(@polkadot/wasm-util@7.3.2(@polkadot/util@12.6.2)))': + dependencies: + '@polkadot/util': 12.6.2 + '@polkadot/wasm-bridge': 7.3.2(@polkadot/util@12.6.2)(@polkadot/x-randomvalues@12.6.2(@polkadot/util@12.6.2)(@polkadot/wasm-util@7.3.2(@polkadot/util@12.6.2))) + '@polkadot/wasm-crypto-asmjs': 7.3.2(@polkadot/util@12.6.2) + '@polkadot/wasm-crypto-wasm': 7.3.2(@polkadot/util@12.6.2) + '@polkadot/wasm-util': 7.3.2(@polkadot/util@12.6.2) + '@polkadot/x-randomvalues': 12.6.2(@polkadot/util@12.6.2)(@polkadot/wasm-util@7.3.2(@polkadot/util@12.6.2)) + tslib: 2.6.2 + + '@polkadot/wasm-crypto-wasm@7.3.2(@polkadot/util@12.6.2)': + dependencies: + '@polkadot/util': 12.6.2 + '@polkadot/wasm-util': 7.3.2(@polkadot/util@12.6.2) + tslib: 2.6.2 + + '@polkadot/wasm-crypto@7.3.2(@polkadot/util@12.6.2)(@polkadot/x-randomvalues@12.6.2(@polkadot/util@12.6.2)(@polkadot/wasm-util@7.3.2(@polkadot/util@12.6.2)))': + dependencies: + '@polkadot/util': 12.6.2 + '@polkadot/wasm-bridge': 7.3.2(@polkadot/util@12.6.2)(@polkadot/x-randomvalues@12.6.2(@polkadot/util@12.6.2)(@polkadot/wasm-util@7.3.2(@polkadot/util@12.6.2))) + '@polkadot/wasm-crypto-asmjs': 7.3.2(@polkadot/util@12.6.2) + '@polkadot/wasm-crypto-init': 7.3.2(@polkadot/util@12.6.2)(@polkadot/x-randomvalues@12.6.2(@polkadot/util@12.6.2)(@polkadot/wasm-util@7.3.2(@polkadot/util@12.6.2))) + '@polkadot/wasm-crypto-wasm': 7.3.2(@polkadot/util@12.6.2) + '@polkadot/wasm-util': 7.3.2(@polkadot/util@12.6.2) + '@polkadot/x-randomvalues': 12.6.2(@polkadot/util@12.6.2)(@polkadot/wasm-util@7.3.2(@polkadot/util@12.6.2)) + tslib: 2.6.2 + + '@polkadot/wasm-util@7.3.2(@polkadot/util@12.6.2)': + dependencies: + '@polkadot/util': 12.6.2 + tslib: 2.6.2 + + '@polkadot/x-bigint@12.6.2': + dependencies: + '@polkadot/x-global': 12.6.2 + tslib: 2.6.2 + + '@polkadot/x-fetch@12.6.2': + dependencies: + '@polkadot/x-global': 12.6.2 + node-fetch: 3.3.2 + tslib: 2.6.2 + + '@polkadot/x-global@12.6.2': + dependencies: + tslib: 2.6.2 + + '@polkadot/x-randomvalues@12.6.2(@polkadot/util@12.6.2)(@polkadot/wasm-util@7.3.2(@polkadot/util@12.6.2))': + dependencies: + '@polkadot/util': 12.6.2 + '@polkadot/wasm-util': 7.3.2(@polkadot/util@12.6.2) + '@polkadot/x-global': 12.6.2 + tslib: 2.6.2 + + '@polkadot/x-textdecoder@12.6.2': + dependencies: + '@polkadot/x-global': 12.6.2 + tslib: 2.6.2 + + '@polkadot/x-textencoder@12.6.2': + dependencies: + '@polkadot/x-global': 12.6.2 + tslib: 2.6.2 + + '@polkadot/x-ws@12.6.2(bufferutil@4.0.8)(utf-8-validate@6.0.3)': + dependencies: + '@polkadot/x-global': 12.6.2 + tslib: 2.6.2 + ws: 8.16.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@react-native-async-storage/async-storage@1.23.1(react-native@0.73.6(@babel/core@7.24.4)(@babel/preset-env@7.24.4(@babel/core@7.24.4))(bufferutil@4.0.8)(react@18.2.0)(utf-8-validate@6.0.3))': + dependencies: + merge-options: 3.0.4 + react-native: 0.73.6(@babel/core@7.24.4)(@babel/preset-env@7.24.4(@babel/core@7.24.4))(bufferutil@4.0.8)(react@18.2.0)(utf-8-validate@6.0.3) + + '@react-native-community/cli-clean@12.3.6': + dependencies: + '@react-native-community/cli-tools': 12.3.6 + chalk: 4.1.2 + execa: 5.1.1 + transitivePeerDependencies: + - encoding + + '@react-native-community/cli-config@12.3.6': + dependencies: + '@react-native-community/cli-tools': 12.3.6 + chalk: 4.1.2 + cosmiconfig: 5.2.1 + deepmerge: 4.3.1 + glob: 7.2.3 + joi: 17.12.3 + transitivePeerDependencies: + - encoding + + '@react-native-community/cli-debugger-ui@12.3.6': + dependencies: + serve-static: 1.15.0 + transitivePeerDependencies: + - supports-color + + '@react-native-community/cli-doctor@12.3.6': + dependencies: + '@react-native-community/cli-config': 12.3.6 + '@react-native-community/cli-platform-android': 12.3.6 + '@react-native-community/cli-platform-ios': 12.3.6 + '@react-native-community/cli-tools': 12.3.6 + chalk: 4.1.2 + command-exists: 1.2.9 + deepmerge: 4.3.1 + envinfo: 7.12.0 + execa: 5.1.1 + hermes-profile-transformer: 0.0.6 + node-stream-zip: 1.15.0 + ora: 5.4.1 + semver: 7.6.0 + strip-ansi: 5.2.0 + wcwidth: 1.0.1 + yaml: 2.4.1 + transitivePeerDependencies: + - encoding + + '@react-native-community/cli-hermes@12.3.6': + dependencies: + '@react-native-community/cli-platform-android': 12.3.6 + '@react-native-community/cli-tools': 12.3.6 + chalk: 4.1.2 + hermes-profile-transformer: 0.0.6 + transitivePeerDependencies: + - encoding + + '@react-native-community/cli-platform-android@12.3.6': + dependencies: + '@react-native-community/cli-tools': 12.3.6 + chalk: 4.1.2 + execa: 5.1.1 + fast-xml-parser: 4.3.6 + glob: 7.2.3 + logkitty: 0.7.1 + transitivePeerDependencies: + - encoding + + '@react-native-community/cli-platform-ios@12.3.6': + dependencies: + '@react-native-community/cli-tools': 12.3.6 + chalk: 4.1.2 + execa: 5.1.1 + fast-xml-parser: 4.3.6 + glob: 7.2.3 + ora: 5.4.1 + transitivePeerDependencies: + - encoding + + '@react-native-community/cli-plugin-metro@12.3.6': {} + + '@react-native-community/cli-server-api@12.3.6(bufferutil@4.0.8)(utf-8-validate@6.0.3)': + dependencies: + '@react-native-community/cli-debugger-ui': 12.3.6 + '@react-native-community/cli-tools': 12.3.6 + compression: 1.7.4 + connect: 3.7.0 + errorhandler: 1.5.1 + nocache: 3.0.4 + pretty-format: 26.6.2 + serve-static: 1.15.0 + ws: 7.5.9(bufferutil@4.0.8)(utf-8-validate@6.0.3) + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - utf-8-validate + + '@react-native-community/cli-tools@12.3.6': + dependencies: + appdirsjs: 1.2.7 + chalk: 4.1.2 + find-up: 5.0.0 + mime: 2.6.0 + node-fetch: 2.7.0 + open: 6.4.0 + ora: 5.4.1 + semver: 7.6.0 + shell-quote: 1.8.1 + sudo-prompt: 9.2.1 + transitivePeerDependencies: + - encoding + + '@react-native-community/cli-types@12.3.6': + dependencies: + joi: 17.12.3 + + '@react-native-community/cli@12.3.6(bufferutil@4.0.8)(utf-8-validate@6.0.3)': + dependencies: + '@react-native-community/cli-clean': 12.3.6 + '@react-native-community/cli-config': 12.3.6 + '@react-native-community/cli-debugger-ui': 12.3.6 + '@react-native-community/cli-doctor': 12.3.6 + '@react-native-community/cli-hermes': 12.3.6 + '@react-native-community/cli-plugin-metro': 12.3.6 + '@react-native-community/cli-server-api': 12.3.6(bufferutil@4.0.8)(utf-8-validate@6.0.3) + '@react-native-community/cli-tools': 12.3.6 + '@react-native-community/cli-types': 12.3.6 + chalk: 4.1.2 + commander: 9.5.0 + deepmerge: 4.3.1 + execa: 5.1.1 + find-up: 4.1.0 + fs-extra: 8.1.0 + graceful-fs: 4.2.11 + prompts: 2.4.2 + semver: 7.6.0 + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - utf-8-validate + + '@react-native/assets-registry@0.73.1': {} + + '@react-native/babel-plugin-codegen@0.73.4(@babel/preset-env@7.24.4(@babel/core@7.24.4))': + dependencies: + '@react-native/codegen': 0.73.3(@babel/preset-env@7.24.4(@babel/core@7.24.4)) + transitivePeerDependencies: + - '@babel/preset-env' + - supports-color + + '@react-native/babel-preset@0.73.21(@babel/core@7.24.4)(@babel/preset-env@7.24.4(@babel/core@7.24.4))': + dependencies: + '@babel/core': 7.24.4 + '@babel/plugin-proposal-async-generator-functions': 7.20.7(@babel/core@7.24.4) + '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.24.4) + '@babel/plugin-proposal-export-default-from': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.24.4) + '@babel/plugin-proposal-numeric-separator': 7.18.6(@babel/core@7.24.4) + '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.24.4) + '@babel/plugin-proposal-optional-catch-binding': 7.18.6(@babel/core@7.24.4) + '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.24.4) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.24.4) + '@babel/plugin-syntax-export-default-from': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-syntax-flow': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.4) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.4) + '@babel/plugin-transform-arrow-functions': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-async-to-generator': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-block-scoping': 7.24.4(@babel/core@7.24.4) + '@babel/plugin-transform-classes': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-computed-properties': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-destructuring': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-flow-strip-types': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-function-name': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-literals': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-modules-commonjs': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.24.4) + '@babel/plugin-transform-parameters': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-private-methods': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-private-property-in-object': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-react-display-name': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-react-jsx': 7.23.4(@babel/core@7.24.4) + '@babel/plugin-transform-react-jsx-self': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-react-jsx-source': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-runtime': 7.24.3(@babel/core@7.24.4) + '@babel/plugin-transform-shorthand-properties': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-spread': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-sticky-regex': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-typescript': 7.24.4(@babel/core@7.24.4) + '@babel/plugin-transform-unicode-regex': 7.24.1(@babel/core@7.24.4) + '@babel/template': 7.24.0 + '@react-native/babel-plugin-codegen': 0.73.4(@babel/preset-env@7.24.4(@babel/core@7.24.4)) + babel-plugin-transform-flow-enums: 0.0.2(@babel/core@7.24.4) + react-refresh: 0.14.0 + transitivePeerDependencies: + - '@babel/preset-env' + - supports-color + + '@react-native/codegen@0.73.3(@babel/preset-env@7.24.4(@babel/core@7.24.4))': + dependencies: + '@babel/parser': 7.24.4 + '@babel/preset-env': 7.24.4(@babel/core@7.24.4) + flow-parser: 0.206.0 + glob: 7.2.3 + invariant: 2.2.4 + jscodeshift: 0.14.0(@babel/preset-env@7.24.4(@babel/core@7.24.4)) + mkdirp: 0.5.6 + nullthrows: 1.1.1 + transitivePeerDependencies: + - supports-color + + '@react-native/community-cli-plugin@0.73.17(@babel/core@7.24.4)(@babel/preset-env@7.24.4(@babel/core@7.24.4))(bufferutil@4.0.8)(utf-8-validate@6.0.3)': + dependencies: + '@react-native-community/cli-server-api': 12.3.6(bufferutil@4.0.8)(utf-8-validate@6.0.3) + '@react-native-community/cli-tools': 12.3.6 + '@react-native/dev-middleware': 0.73.8(bufferutil@4.0.8)(utf-8-validate@6.0.3) + '@react-native/metro-babel-transformer': 0.73.15(@babel/core@7.24.4)(@babel/preset-env@7.24.4(@babel/core@7.24.4)) + chalk: 4.1.2 + execa: 5.1.1 + metro: 0.80.8(bufferutil@4.0.8)(utf-8-validate@6.0.3) + metro-config: 0.80.8(bufferutil@4.0.8)(utf-8-validate@6.0.3) + metro-core: 0.80.8 + node-fetch: 2.7.0 + readline: 1.3.0 + transitivePeerDependencies: + - '@babel/core' + - '@babel/preset-env' + - bufferutil + - encoding + - supports-color + - utf-8-validate + + '@react-native/debugger-frontend@0.73.3': {} + + '@react-native/dev-middleware@0.73.8(bufferutil@4.0.8)(utf-8-validate@6.0.3)': + dependencies: + '@isaacs/ttlcache': 1.4.1 + '@react-native/debugger-frontend': 0.73.3 + chrome-launcher: 0.15.2 + chromium-edge-launcher: 1.0.0 + connect: 3.7.0 + debug: 2.6.9 + node-fetch: 2.7.0 + open: 7.4.2 + serve-static: 1.15.0 + temp-dir: 2.0.0 + ws: 6.2.2(bufferutil@4.0.8)(utf-8-validate@6.0.3) + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - utf-8-validate + + '@react-native/gradle-plugin@0.73.4': {} + + '@react-native/js-polyfills@0.73.1': {} + + '@react-native/metro-babel-transformer@0.73.15(@babel/core@7.24.4)(@babel/preset-env@7.24.4(@babel/core@7.24.4))': + dependencies: + '@babel/core': 7.24.4 + '@react-native/babel-preset': 0.73.21(@babel/core@7.24.4)(@babel/preset-env@7.24.4(@babel/core@7.24.4)) + hermes-parser: 0.15.0 + nullthrows: 1.1.1 + transitivePeerDependencies: + - '@babel/preset-env' + - supports-color + + '@react-native/normalize-colors@0.73.2': {} + + '@react-native/virtualized-lists@0.73.4(react-native@0.73.6(@babel/core@7.24.4)(@babel/preset-env@7.24.4(@babel/core@7.24.4))(bufferutil@4.0.8)(react@18.2.0)(utf-8-validate@6.0.3))': + dependencies: + invariant: 2.2.4 + nullthrows: 1.1.1 + react-native: 0.73.6(@babel/core@7.24.4)(@babel/preset-env@7.24.4(@babel/core@7.24.4))(bufferutil@4.0.8)(react@18.2.0)(utf-8-validate@6.0.3) + + '@remix-run/router@1.15.3': {} + + '@repeaterjs/repeater@3.0.5': {} + + '@rollup/plugin-inject@5.0.5(rollup@4.14.3)': + dependencies: + '@rollup/pluginutils': 5.1.0(rollup@4.14.3) + estree-walker: 2.0.2 + magic-string: 0.30.9 + optionalDependencies: + rollup: 4.14.3 + + '@rollup/pluginutils@5.1.0(rollup@4.14.3)': + dependencies: + '@types/estree': 1.0.5 + estree-walker: 2.0.2 + picomatch: 2.3.1 + optionalDependencies: + rollup: 4.14.3 + + '@rollup/rollup-android-arm-eabi@4.14.3': + optional: true + + '@rollup/rollup-android-arm64@4.14.3': + optional: true + + '@rollup/rollup-darwin-arm64@4.14.3': + optional: true + + '@rollup/rollup-darwin-x64@4.14.3': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.14.3': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.14.3': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.14.3': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.14.3': + optional: true + + '@rollup/rollup-linux-powerpc64le-gnu@4.14.3': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.14.3': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.14.3': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.14.3': + optional: true + + '@rollup/rollup-linux-x64-musl@4.14.3': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.14.3': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.14.3': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.14.3': + optional: true + + '@safe-global/safe-apps-provider@0.18.1(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.22.4)': + dependencies: + '@safe-global/safe-apps-sdk': 8.1.0(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.22.4) + events: 3.3.0 + transitivePeerDependencies: + - bufferutil + - typescript + - utf-8-validate + - zod + + '@safe-global/safe-apps-sdk@8.1.0(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.22.4)': + dependencies: + '@safe-global/safe-gateway-typescript-sdk': 3.19.0 + viem: 1.21.4(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.22.4) + transitivePeerDependencies: + - bufferutil + - typescript + - utf-8-validate + - zod + + '@safe-global/safe-gateway-typescript-sdk@3.19.0': {} + + '@scure/base@1.1.6': {} + + '@scure/bip32@1.3.2': + dependencies: + '@noble/curves': 1.2.0 + '@noble/hashes': 1.3.2 + '@scure/base': 1.1.6 + + '@scure/bip32@1.3.3': + dependencies: + '@noble/curves': 1.3.0 + '@noble/hashes': 1.3.3 + '@scure/base': 1.1.6 + + '@scure/bip39@1.2.1': + dependencies: + '@noble/hashes': 1.3.2 + '@scure/base': 1.1.6 + + '@scure/bip39@1.2.2': + dependencies: + '@noble/hashes': 1.3.3 + '@scure/base': 1.1.6 + + '@sideway/address@4.1.5': + dependencies: + '@hapi/hoek': 9.3.0 + + '@sideway/formula@3.0.1': {} + + '@sideway/pinpoint@2.0.0': {} + + '@sinclair/typebox@0.27.8': {} + + '@sinonjs/commons@3.0.1': + dependencies: + type-detect: 4.0.8 + + '@sinonjs/fake-timers@10.3.0': + dependencies: + '@sinonjs/commons': 3.0.1 + + '@socket.io/component-emitter@3.1.1': {} + + '@stablelib/aead@1.0.1': {} + + '@stablelib/binary@1.0.1': + dependencies: + '@stablelib/int': 1.0.1 + + '@stablelib/bytes@1.0.1': {} + + '@stablelib/chacha20poly1305@1.0.1': + dependencies: + '@stablelib/aead': 1.0.1 + '@stablelib/binary': 1.0.1 + '@stablelib/chacha': 1.0.1 + '@stablelib/constant-time': 1.0.1 + '@stablelib/poly1305': 1.0.1 + '@stablelib/wipe': 1.0.1 + + '@stablelib/chacha@1.0.1': + dependencies: + '@stablelib/binary': 1.0.1 + '@stablelib/wipe': 1.0.1 + + '@stablelib/constant-time@1.0.1': {} + + '@stablelib/ed25519@1.0.3': + dependencies: + '@stablelib/random': 1.0.2 + '@stablelib/sha512': 1.0.1 + '@stablelib/wipe': 1.0.1 + + '@stablelib/hash@1.0.1': {} + + '@stablelib/hkdf@1.0.1': + dependencies: + '@stablelib/hash': 1.0.1 + '@stablelib/hmac': 1.0.1 + '@stablelib/wipe': 1.0.1 + + '@stablelib/hmac@1.0.1': + dependencies: + '@stablelib/constant-time': 1.0.1 + '@stablelib/hash': 1.0.1 + '@stablelib/wipe': 1.0.1 + + '@stablelib/int@1.0.1': {} + + '@stablelib/keyagreement@1.0.1': + dependencies: + '@stablelib/bytes': 1.0.1 + + '@stablelib/poly1305@1.0.1': + dependencies: + '@stablelib/constant-time': 1.0.1 + '@stablelib/wipe': 1.0.1 + + '@stablelib/random@1.0.2': + dependencies: + '@stablelib/binary': 1.0.1 + '@stablelib/wipe': 1.0.1 + + '@stablelib/sha256@1.0.1': + dependencies: + '@stablelib/binary': 1.0.1 + '@stablelib/hash': 1.0.1 + '@stablelib/wipe': 1.0.1 + + '@stablelib/sha512@1.0.1': + dependencies: + '@stablelib/binary': 1.0.1 + '@stablelib/hash': 1.0.1 + '@stablelib/wipe': 1.0.1 + + '@stablelib/wipe@1.0.1': {} + + '@stablelib/x25519@1.0.3': + dependencies: + '@stablelib/keyagreement': 1.0.1 + '@stablelib/random': 1.0.2 + '@stablelib/wipe': 1.0.1 + + '@substrate/connect-extension-protocol@2.0.0': {} + + '@substrate/connect-known-chains@1.1.4': {} + + '@substrate/connect@0.8.10(bufferutil@4.0.8)(utf-8-validate@6.0.3)': + dependencies: + '@substrate/connect-extension-protocol': 2.0.0 + '@substrate/connect-known-chains': 1.1.4 + '@substrate/light-client-extension-helpers': 0.0.6(smoldot@2.0.22(bufferutil@4.0.8)(utf-8-validate@6.0.3)) + smoldot: 2.0.22(bufferutil@4.0.8)(utf-8-validate@6.0.3) + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@substrate/connect@0.8.8(bufferutil@4.0.8)(utf-8-validate@6.0.3)': + dependencies: + '@substrate/connect-extension-protocol': 2.0.0 + '@substrate/connect-known-chains': 1.1.4 + '@substrate/light-client-extension-helpers': 0.0.4(smoldot@2.0.22(bufferutil@4.0.8)(utf-8-validate@6.0.3)) + smoldot: 2.0.22(bufferutil@4.0.8)(utf-8-validate@6.0.3) + transitivePeerDependencies: + - bufferutil + - utf-8-validate + optional: true + + '@substrate/light-client-extension-helpers@0.0.4(smoldot@2.0.22(bufferutil@4.0.8)(utf-8-validate@6.0.3))': + dependencies: + '@polkadot-api/client': 0.0.1-492c132563ea6b40ae1fc5470dec4cd18768d182.1.0(rxjs@7.8.1) + '@polkadot-api/json-rpc-provider': 0.0.1-492c132563ea6b40ae1fc5470dec4cd18768d182.1.0 + '@polkadot-api/json-rpc-provider-proxy': 0.0.1-492c132563ea6b40ae1fc5470dec4cd18768d182.1.0 + '@polkadot-api/substrate-client': 0.0.1-492c132563ea6b40ae1fc5470dec4cd18768d182.1.0 + '@substrate/connect-extension-protocol': 2.0.0 + '@substrate/connect-known-chains': 1.1.4 + rxjs: 7.8.1 + smoldot: 2.0.22(bufferutil@4.0.8)(utf-8-validate@6.0.3) + optional: true + + '@substrate/light-client-extension-helpers@0.0.6(smoldot@2.0.22(bufferutil@4.0.8)(utf-8-validate@6.0.3))': + dependencies: + '@polkadot-api/json-rpc-provider': 0.0.1 + '@polkadot-api/json-rpc-provider-proxy': 0.0.1 + '@polkadot-api/observable-client': 0.1.0(rxjs@7.8.1) + '@polkadot-api/substrate-client': 0.0.1 + '@substrate/connect-extension-protocol': 2.0.0 + '@substrate/connect-known-chains': 1.1.4 + rxjs: 7.8.1 + smoldot: 2.0.22(bufferutil@4.0.8)(utf-8-validate@6.0.3) + + '@substrate/ss58-registry@1.47.0': {} + + '@svgr/babel-plugin-add-jsx-attribute@8.0.0(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + + '@svgr/babel-plugin-remove-jsx-attribute@8.0.0(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + + '@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + + '@svgr/babel-plugin-replace-jsx-attribute-value@8.0.0(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + + '@svgr/babel-plugin-svg-dynamic-title@8.0.0(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + + '@svgr/babel-plugin-svg-em-dimensions@8.0.0(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + + '@svgr/babel-plugin-transform-react-native-svg@8.1.0(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + + '@svgr/babel-plugin-transform-svg-component@8.0.0(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + + '@svgr/babel-preset@8.1.0(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + '@svgr/babel-plugin-add-jsx-attribute': 8.0.0(@babel/core@7.24.4) + '@svgr/babel-plugin-remove-jsx-attribute': 8.0.0(@babel/core@7.24.4) + '@svgr/babel-plugin-remove-jsx-empty-expression': 8.0.0(@babel/core@7.24.4) + '@svgr/babel-plugin-replace-jsx-attribute-value': 8.0.0(@babel/core@7.24.4) + '@svgr/babel-plugin-svg-dynamic-title': 8.0.0(@babel/core@7.24.4) + '@svgr/babel-plugin-svg-em-dimensions': 8.0.0(@babel/core@7.24.4) + '@svgr/babel-plugin-transform-react-native-svg': 8.1.0(@babel/core@7.24.4) + '@svgr/babel-plugin-transform-svg-component': 8.0.0(@babel/core@7.24.4) + + '@svgr/core@8.1.0(typescript@5.4.5)': + dependencies: + '@babel/core': 7.24.4 + '@svgr/babel-preset': 8.1.0(@babel/core@7.24.4) + camelcase: 6.3.0 + cosmiconfig: 8.3.6(typescript@5.4.5) + snake-case: 3.0.4 + transitivePeerDependencies: + - supports-color + - typescript + + '@svgr/hast-util-to-babel-ast@8.0.0': + dependencies: + '@babel/types': 7.24.0 + entities: 4.5.0 + + '@svgr/plugin-jsx@8.1.0(@svgr/core@8.1.0(typescript@5.4.5))': + dependencies: + '@babel/core': 7.24.4 + '@svgr/babel-preset': 8.1.0(@babel/core@7.24.4) + '@svgr/core': 8.1.0(typescript@5.4.5) + '@svgr/hast-util-to-babel-ast': 8.0.0 + svg-parser: 2.0.4 + transitivePeerDependencies: + - supports-color + + '@tanstack/query-core@5.40.0': {} + + '@tanstack/react-query@5.40.0(react@18.2.0)': + dependencies: + '@tanstack/query-core': 5.40.0 + react: 18.2.0 + + '@types/babel__core@7.20.5': + dependencies: + '@babel/parser': 7.24.4 + '@babel/types': 7.24.0 + '@types/babel__generator': 7.6.8 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.20.5 + + '@types/babel__generator@7.6.8': + dependencies: + '@babel/types': 7.24.0 + + '@types/babel__template@7.4.4': + dependencies: + '@babel/parser': 7.24.4 + '@babel/types': 7.24.0 + + '@types/babel__traverse@7.20.5': + dependencies: + '@babel/types': 7.24.0 + + '@types/bn.js@5.1.5': + dependencies: + '@types/node': 20.12.7 + + '@types/chrome@0.0.136': + dependencies: + '@types/filesystem': 0.0.36 + '@types/har-format': 1.2.15 + + '@types/debug@4.1.12': + dependencies: + '@types/ms': 0.7.34 + + '@types/dom-screen-wake-lock@1.0.3': {} + + '@types/eslint-scope@3.7.7': + dependencies: + '@types/eslint': 8.56.9 + '@types/estree': 1.0.5 + + '@types/eslint@8.56.9': + dependencies: + '@types/estree': 1.0.5 + '@types/json-schema': 7.0.15 + + '@types/estree@1.0.5': {} + + '@types/filesystem@0.0.36': + dependencies: + '@types/filewriter': 0.0.33 + + '@types/filewriter@0.0.33': {} + + '@types/har-format@1.2.15': {} + + '@types/istanbul-lib-coverage@2.0.6': {} + + '@types/istanbul-lib-report@3.0.3': + dependencies: + '@types/istanbul-lib-coverage': 2.0.6 + + '@types/istanbul-reports@3.0.4': + dependencies: + '@types/istanbul-lib-report': 3.0.3 + + '@types/js-yaml@4.0.9': {} + + '@types/json-schema@7.0.15': {} + + '@types/json5@0.0.29': {} + + '@types/ms@0.7.34': {} + + '@types/node@20.12.7': + dependencies: + undici-types: 5.26.5 + + '@types/parse-json@4.0.2': {} + + '@types/prop-types@15.7.12': {} + + '@types/react-dom@18.2.25': + dependencies: + '@types/react': 18.2.79 + + '@types/react@18.2.79': + dependencies: + '@types/prop-types': 15.7.12 + csstype: 3.1.3 + + '@types/secp256k1@4.0.6': + dependencies: + '@types/node': 20.12.7 + + '@types/semver@7.5.8': {} + + '@types/stack-utils@2.0.3': {} + + '@types/stylis@4.2.0': {} + + '@types/trusted-types@2.0.7': {} + + '@types/ws@8.5.10': + dependencies: + '@types/node': 20.12.7 + + '@types/yargs-parser@21.0.3': {} + + '@types/yargs@15.0.19': + dependencies: + '@types/yargs-parser': 21.0.3 + + '@types/yargs@17.0.32': + dependencies: + '@types/yargs-parser': 21.0.3 + + '@typescript-eslint/eslint-plugin@7.7.0(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5)': + dependencies: + '@eslint-community/regexpp': 4.10.0 + '@typescript-eslint/parser': 7.7.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/scope-manager': 7.7.0 + '@typescript-eslint/type-utils': 7.7.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/utils': 7.7.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/visitor-keys': 7.7.0 + debug: 4.3.4 + eslint: 8.57.0 + graphemer: 1.4.0 + ignore: 5.3.1 + natural-compare: 1.4.0 + semver: 7.6.0 + ts-api-utils: 1.3.0(typescript@5.4.5) + optionalDependencies: + typescript: 5.4.5 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.4.5)': + dependencies: + '@typescript-eslint/scope-manager': 7.7.0 + '@typescript-eslint/types': 7.7.0 + '@typescript-eslint/typescript-estree': 7.7.0(typescript@5.4.5) + '@typescript-eslint/visitor-keys': 7.7.0 + debug: 4.3.4 + eslint: 8.57.0 + optionalDependencies: + typescript: 5.4.5 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@7.7.0': + dependencies: + '@typescript-eslint/types': 7.7.0 + '@typescript-eslint/visitor-keys': 7.7.0 + + '@typescript-eslint/type-utils@7.7.0(eslint@8.57.0)(typescript@5.4.5)': + dependencies: + '@typescript-eslint/typescript-estree': 7.7.0(typescript@5.4.5) + '@typescript-eslint/utils': 7.7.0(eslint@8.57.0)(typescript@5.4.5) + debug: 4.3.4 + eslint: 8.57.0 + ts-api-utils: 1.3.0(typescript@5.4.5) + optionalDependencies: + typescript: 5.4.5 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/types@7.7.0': {} + + '@typescript-eslint/typescript-estree@7.7.0(typescript@5.4.5)': + dependencies: + '@typescript-eslint/types': 7.7.0 + '@typescript-eslint/visitor-keys': 7.7.0 + debug: 4.3.4 + globby: 11.1.0 + is-glob: 4.0.3 + minimatch: 9.0.4 + semver: 7.6.0 + ts-api-utils: 1.3.0(typescript@5.4.5) + optionalDependencies: + typescript: 5.4.5 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@7.7.0(eslint@8.57.0)(typescript@5.4.5)': + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + '@types/json-schema': 7.0.15 + '@types/semver': 7.5.8 + '@typescript-eslint/scope-manager': 7.7.0 + '@typescript-eslint/types': 7.7.0 + '@typescript-eslint/typescript-estree': 7.7.0(typescript@5.4.5) + eslint: 8.57.0 + semver: 7.6.0 + transitivePeerDependencies: + - supports-color + - typescript + + '@typescript-eslint/visitor-keys@7.7.0': + dependencies: + '@typescript-eslint/types': 7.7.0 + eslint-visitor-keys: 3.4.3 + + '@ungap/structured-clone@1.2.0': {} + + '@vitejs/plugin-react@4.2.1(vite@5.2.8(@types/node@20.12.7)(sass@1.75.0)(terser@5.30.3))': + dependencies: + '@babel/core': 7.24.4 + '@babel/plugin-transform-react-jsx-self': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-react-jsx-source': 7.24.1(@babel/core@7.24.4) + '@types/babel__core': 7.20.5 + react-refresh: 0.14.0 + vite: 5.2.8(@types/node@20.12.7)(sass@1.75.0)(terser@5.30.3) + transitivePeerDependencies: + - supports-color + + '@wagmi/connectors@4.1.26(@react-native-async-storage/async-storage@1.23.1(react-native@0.73.6(@babel/core@7.24.4)(@babel/preset-env@7.24.4(@babel/core@7.24.4))(bufferutil@4.0.8)(react@18.2.0)(utf-8-validate@6.0.3)))(@types/react@18.2.79)(@wagmi/core@2.6.17(@tanstack/query-core@5.40.0)(@types/react@18.2.79)(bufferutil@4.0.8)(react@18.2.0)(typescript@5.4.5)(utf-8-validate@6.0.3)(viem@2.9.19(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.22.4))(zod@3.22.4))(bufferutil@4.0.8)(react-dom@18.2.0(react@18.2.0))(react-native@0.73.6(@babel/core@7.24.4)(@babel/preset-env@7.24.4(@babel/core@7.24.4))(bufferutil@4.0.8)(react@18.2.0)(utf-8-validate@6.0.3))(react@18.2.0)(rollup@4.14.3)(typescript@5.4.5)(utf-8-validate@6.0.3)(viem@2.9.19(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.22.4))(zod@3.22.4)': + dependencies: + '@coinbase/wallet-sdk': 3.9.1 + '@metamask/sdk': 0.14.3(@types/react@18.2.79)(bufferutil@4.0.8)(react-dom@18.2.0(react@18.2.0))(react-native@0.73.6(@babel/core@7.24.4)(@babel/preset-env@7.24.4(@babel/core@7.24.4))(bufferutil@4.0.8)(react@18.2.0)(utf-8-validate@6.0.3))(react@18.2.0)(rollup@4.14.3)(utf-8-validate@6.0.3) + '@safe-global/safe-apps-provider': 0.18.1(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.22.4) + '@safe-global/safe-apps-sdk': 8.1.0(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.22.4) + '@wagmi/core': 2.6.17(@tanstack/query-core@5.40.0)(@types/react@18.2.79)(bufferutil@4.0.8)(react@18.2.0)(typescript@5.4.5)(utf-8-validate@6.0.3)(viem@2.9.19(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.22.4))(zod@3.22.4) + '@walletconnect/ethereum-provider': 2.11.2(@react-native-async-storage/async-storage@1.23.1(react-native@0.73.6(@babel/core@7.24.4)(@babel/preset-env@7.24.4(@babel/core@7.24.4))(bufferutil@4.0.8)(react@18.2.0)(utf-8-validate@6.0.3)))(@types/react@18.2.79)(bufferutil@4.0.8)(react@18.2.0)(utf-8-validate@6.0.3) + '@walletconnect/modal': 2.6.2(@types/react@18.2.79)(react@18.2.0) + viem: 2.9.19(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.22.4) + optionalDependencies: + typescript: 5.4.5 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@swc/core' + - '@types/react' + - '@upstash/redis' + - '@vercel/kv' + - '@webpack-cli/generators' + - bufferutil + - encoding + - esbuild + - ioredis + - react + - react-dom + - react-native + - rollup + - supports-color + - uWebSockets.js + - uglify-js + - utf-8-validate + - webpack-bundle-analyzer + - webpack-dev-server + - zod + + '@wagmi/core@2.6.17(@tanstack/query-core@5.40.0)(@types/react@18.2.79)(bufferutil@4.0.8)(react@18.2.0)(typescript@5.4.5)(utf-8-validate@6.0.3)(viem@2.9.19(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.22.4))(zod@3.22.4)': + dependencies: + eventemitter3: 5.0.1 + mipd: 0.0.5(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.22.4) + viem: 2.9.19(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.22.4) + zustand: 4.4.1(@types/react@18.2.79)(react@18.2.0) + optionalDependencies: + '@tanstack/query-core': 5.40.0 + typescript: 5.4.5 + transitivePeerDependencies: + - '@types/react' + - bufferutil + - immer + - react + - utf-8-validate + - zod + + '@walletconnect/core@2.11.2(@react-native-async-storage/async-storage@1.23.1(react-native@0.73.6(@babel/core@7.24.4)(@babel/preset-env@7.24.4(@babel/core@7.24.4))(bufferutil@4.0.8)(react@18.2.0)(utf-8-validate@6.0.3)))(bufferutil@4.0.8)(utf-8-validate@6.0.3)': + dependencies: + '@walletconnect/heartbeat': 1.2.1 + '@walletconnect/jsonrpc-provider': 1.0.13 + '@walletconnect/jsonrpc-types': 1.0.3 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/jsonrpc-ws-connection': 1.0.14(bufferutil@4.0.8)(utf-8-validate@6.0.3) + '@walletconnect/keyvaluestorage': 1.1.1(@react-native-async-storage/async-storage@1.23.1(react-native@0.73.6(@babel/core@7.24.4)(@babel/preset-env@7.24.4(@babel/core@7.24.4))(bufferutil@4.0.8)(react@18.2.0)(utf-8-validate@6.0.3))) + '@walletconnect/logger': 2.1.2 + '@walletconnect/relay-api': 1.0.9 + '@walletconnect/relay-auth': 1.0.4 + '@walletconnect/safe-json': 1.0.2 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.11.2(@react-native-async-storage/async-storage@1.23.1(react-native@0.73.6(@babel/core@7.24.4)(@babel/preset-env@7.24.4(@babel/core@7.24.4))(bufferutil@4.0.8)(react@18.2.0)(utf-8-validate@6.0.3))) + '@walletconnect/utils': 2.11.2(@react-native-async-storage/async-storage@1.23.1(react-native@0.73.6(@babel/core@7.24.4)(@babel/preset-env@7.24.4(@babel/core@7.24.4))(bufferutil@4.0.8)(react@18.2.0)(utf-8-validate@6.0.3))) + events: 3.3.0 + isomorphic-unfetch: 3.1.0 + lodash.isequal: 4.5.0 + uint8arrays: 3.1.1 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/kv' + - bufferutil + - encoding + - ioredis + - uWebSockets.js + - utf-8-validate + + '@walletconnect/core@2.13.0(@react-native-async-storage/async-storage@1.23.1(react-native@0.73.6(@babel/core@7.24.4)(@babel/preset-env@7.24.4(@babel/core@7.24.4))(bufferutil@4.0.8)(react@18.2.0)(utf-8-validate@6.0.3)))(bufferutil@4.0.8)(utf-8-validate@6.0.3)': + dependencies: + '@walletconnect/heartbeat': 1.2.2 + '@walletconnect/jsonrpc-provider': 1.0.14 + '@walletconnect/jsonrpc-types': 1.0.4 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/jsonrpc-ws-connection': 1.0.14(bufferutil@4.0.8)(utf-8-validate@6.0.3) + '@walletconnect/keyvaluestorage': 1.1.1(@react-native-async-storage/async-storage@1.23.1(react-native@0.73.6(@babel/core@7.24.4)(@babel/preset-env@7.24.4(@babel/core@7.24.4))(bufferutil@4.0.8)(react@18.2.0)(utf-8-validate@6.0.3))) + '@walletconnect/logger': 2.1.2 + '@walletconnect/relay-api': 1.0.10 + '@walletconnect/relay-auth': 1.0.4 + '@walletconnect/safe-json': 1.0.2 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.13.0(@react-native-async-storage/async-storage@1.23.1(react-native@0.73.6(@babel/core@7.24.4)(@babel/preset-env@7.24.4(@babel/core@7.24.4))(bufferutil@4.0.8)(react@18.2.0)(utf-8-validate@6.0.3))) + '@walletconnect/utils': 2.13.0(@react-native-async-storage/async-storage@1.23.1(react-native@0.73.6(@babel/core@7.24.4)(@babel/preset-env@7.24.4(@babel/core@7.24.4))(bufferutil@4.0.8)(react@18.2.0)(utf-8-validate@6.0.3))) + events: 3.3.0 + isomorphic-unfetch: 3.1.0 + lodash.isequal: 4.5.0 + uint8arrays: 3.1.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/kv' + - bufferutil + - encoding + - ioredis + - uWebSockets.js + - utf-8-validate + + '@walletconnect/environment@1.0.1': + dependencies: + tslib: 1.14.1 + + '@walletconnect/ethereum-provider@2.11.2(@react-native-async-storage/async-storage@1.23.1(react-native@0.73.6(@babel/core@7.24.4)(@babel/preset-env@7.24.4(@babel/core@7.24.4))(bufferutil@4.0.8)(react@18.2.0)(utf-8-validate@6.0.3)))(@types/react@18.2.79)(bufferutil@4.0.8)(react@18.2.0)(utf-8-validate@6.0.3)': + dependencies: + '@walletconnect/jsonrpc-http-connection': 1.0.7 + '@walletconnect/jsonrpc-provider': 1.0.13 + '@walletconnect/jsonrpc-types': 1.0.3 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/modal': 2.6.2(@types/react@18.2.79)(react@18.2.0) + '@walletconnect/sign-client': 2.11.2(@react-native-async-storage/async-storage@1.23.1(react-native@0.73.6(@babel/core@7.24.4)(@babel/preset-env@7.24.4(@babel/core@7.24.4))(bufferutil@4.0.8)(react@18.2.0)(utf-8-validate@6.0.3)))(bufferutil@4.0.8)(utf-8-validate@6.0.3) + '@walletconnect/types': 2.11.2(@react-native-async-storage/async-storage@1.23.1(react-native@0.73.6(@babel/core@7.24.4)(@babel/preset-env@7.24.4(@babel/core@7.24.4))(bufferutil@4.0.8)(react@18.2.0)(utf-8-validate@6.0.3))) + '@walletconnect/universal-provider': 2.11.2(@react-native-async-storage/async-storage@1.23.1(react-native@0.73.6(@babel/core@7.24.4)(@babel/preset-env@7.24.4(@babel/core@7.24.4))(bufferutil@4.0.8)(react@18.2.0)(utf-8-validate@6.0.3)))(bufferutil@4.0.8)(utf-8-validate@6.0.3) + '@walletconnect/utils': 2.11.2(@react-native-async-storage/async-storage@1.23.1(react-native@0.73.6(@babel/core@7.24.4)(@babel/preset-env@7.24.4(@babel/core@7.24.4))(bufferutil@4.0.8)(react@18.2.0)(utf-8-validate@6.0.3))) + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/kv' + - bufferutil + - encoding + - ioredis + - react + - uWebSockets.js + - utf-8-validate + + '@walletconnect/ethereum-provider@2.13.0(@react-native-async-storage/async-storage@1.23.1(react-native@0.73.6(@babel/core@7.24.4)(@babel/preset-env@7.24.4(@babel/core@7.24.4))(bufferutil@4.0.8)(react@18.2.0)(utf-8-validate@6.0.3)))(@types/react@18.2.79)(bufferutil@4.0.8)(react@18.2.0)(utf-8-validate@6.0.3)': + dependencies: + '@walletconnect/jsonrpc-http-connection': 1.0.8 + '@walletconnect/jsonrpc-provider': 1.0.14 + '@walletconnect/jsonrpc-types': 1.0.4 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/modal': 2.6.2(@types/react@18.2.79)(react@18.2.0) + '@walletconnect/sign-client': 2.13.0(@react-native-async-storage/async-storage@1.23.1(react-native@0.73.6(@babel/core@7.24.4)(@babel/preset-env@7.24.4(@babel/core@7.24.4))(bufferutil@4.0.8)(react@18.2.0)(utf-8-validate@6.0.3)))(bufferutil@4.0.8)(utf-8-validate@6.0.3) + '@walletconnect/types': 2.13.0(@react-native-async-storage/async-storage@1.23.1(react-native@0.73.6(@babel/core@7.24.4)(@babel/preset-env@7.24.4(@babel/core@7.24.4))(bufferutil@4.0.8)(react@18.2.0)(utf-8-validate@6.0.3))) + '@walletconnect/universal-provider': 2.13.0(@react-native-async-storage/async-storage@1.23.1(react-native@0.73.6(@babel/core@7.24.4)(@babel/preset-env@7.24.4(@babel/core@7.24.4))(bufferutil@4.0.8)(react@18.2.0)(utf-8-validate@6.0.3)))(bufferutil@4.0.8)(utf-8-validate@6.0.3) + '@walletconnect/utils': 2.13.0(@react-native-async-storage/async-storage@1.23.1(react-native@0.73.6(@babel/core@7.24.4)(@babel/preset-env@7.24.4(@babel/core@7.24.4))(bufferutil@4.0.8)(react@18.2.0)(utf-8-validate@6.0.3))) + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/kv' + - bufferutil + - encoding + - ioredis + - react + - uWebSockets.js + - utf-8-validate + + '@walletconnect/events@1.0.1': + dependencies: + keyvaluestorage-interface: 1.0.0 + tslib: 1.14.1 + + '@walletconnect/heartbeat@1.2.1': + dependencies: + '@walletconnect/events': 1.0.1 + '@walletconnect/time': 1.0.2 + tslib: 1.14.1 + + '@walletconnect/heartbeat@1.2.2': + dependencies: + '@walletconnect/events': 1.0.1 + '@walletconnect/time': 1.0.2 + events: 3.3.0 + + '@walletconnect/jsonrpc-http-connection@1.0.7': + dependencies: + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/safe-json': 1.0.2 + cross-fetch: 3.1.8 + tslib: 1.14.1 + transitivePeerDependencies: + - encoding + + '@walletconnect/jsonrpc-http-connection@1.0.8': + dependencies: + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/safe-json': 1.0.2 + cross-fetch: 3.1.8 + events: 3.3.0 + transitivePeerDependencies: + - encoding + + '@walletconnect/jsonrpc-provider@1.0.13': + dependencies: + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/safe-json': 1.0.2 + tslib: 1.14.1 + + '@walletconnect/jsonrpc-provider@1.0.14': + dependencies: + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/safe-json': 1.0.2 + events: 3.3.0 + + '@walletconnect/jsonrpc-types@1.0.3': + dependencies: + keyvaluestorage-interface: 1.0.0 + tslib: 1.14.1 + + '@walletconnect/jsonrpc-types@1.0.4': + dependencies: + events: 3.3.0 + keyvaluestorage-interface: 1.0.0 + + '@walletconnect/jsonrpc-utils@1.0.8': + dependencies: + '@walletconnect/environment': 1.0.1 + '@walletconnect/jsonrpc-types': 1.0.4 + tslib: 1.14.1 + + '@walletconnect/jsonrpc-ws-connection@1.0.14(bufferutil@4.0.8)(utf-8-validate@6.0.3)': + dependencies: + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/safe-json': 1.0.2 + events: 3.3.0 + ws: 7.5.9(bufferutil@4.0.8)(utf-8-validate@6.0.3) + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@walletconnect/keyvaluestorage@1.1.1(@react-native-async-storage/async-storage@1.23.1(react-native@0.73.6(@babel/core@7.24.4)(@babel/preset-env@7.24.4(@babel/core@7.24.4))(bufferutil@4.0.8)(react@18.2.0)(utf-8-validate@6.0.3)))': + dependencies: + '@walletconnect/safe-json': 1.0.2 + idb-keyval: 6.2.1 + unstorage: 1.10.2(idb-keyval@6.2.1) + optionalDependencies: + '@react-native-async-storage/async-storage': 1.23.1(react-native@0.73.6(@babel/core@7.24.4)(@babel/preset-env@7.24.4(@babel/core@7.24.4))(bufferutil@4.0.8)(react@18.2.0)(utf-8-validate@6.0.3)) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@netlify/blobs' + - '@planetscale/database' + - '@upstash/redis' + - '@vercel/kv' + - ioredis + - uWebSockets.js + + '@walletconnect/logger@2.1.2': + dependencies: + '@walletconnect/safe-json': 1.0.2 + pino: 7.11.0 + + '@walletconnect/modal-core@2.6.2(@types/react@18.2.79)(react@18.2.0)': + dependencies: + valtio: 1.11.2(@types/react@18.2.79)(react@18.2.0) + transitivePeerDependencies: + - '@types/react' + - react + + '@walletconnect/modal-ui@2.6.2(@types/react@18.2.79)(react@18.2.0)': + dependencies: + '@walletconnect/modal-core': 2.6.2(@types/react@18.2.79)(react@18.2.0) + lit: 2.8.0 + motion: 10.16.2 + qrcode: 1.5.3 + transitivePeerDependencies: + - '@types/react' + - react + + '@walletconnect/modal@2.6.2(@types/react@18.2.79)(react@18.2.0)': + dependencies: + '@walletconnect/modal-core': 2.6.2(@types/react@18.2.79)(react@18.2.0) + '@walletconnect/modal-ui': 2.6.2(@types/react@18.2.79)(react@18.2.0) + transitivePeerDependencies: + - '@types/react' + - react + + '@walletconnect/relay-api@1.0.10': + dependencies: + '@walletconnect/jsonrpc-types': 1.0.4 + + '@walletconnect/relay-api@1.0.9': + dependencies: + '@walletconnect/jsonrpc-types': 1.0.3 + tslib: 1.14.1 + + '@walletconnect/relay-auth@1.0.4': + dependencies: + '@stablelib/ed25519': 1.0.3 + '@stablelib/random': 1.0.2 + '@walletconnect/safe-json': 1.0.2 + '@walletconnect/time': 1.0.2 + tslib: 1.14.1 + uint8arrays: 3.1.1 + + '@walletconnect/safe-json@1.0.2': + dependencies: + tslib: 1.14.1 + + '@walletconnect/sign-client@2.11.2(@react-native-async-storage/async-storage@1.23.1(react-native@0.73.6(@babel/core@7.24.4)(@babel/preset-env@7.24.4(@babel/core@7.24.4))(bufferutil@4.0.8)(react@18.2.0)(utf-8-validate@6.0.3)))(bufferutil@4.0.8)(utf-8-validate@6.0.3)': + dependencies: + '@walletconnect/core': 2.11.2(@react-native-async-storage/async-storage@1.23.1(react-native@0.73.6(@babel/core@7.24.4)(@babel/preset-env@7.24.4(@babel/core@7.24.4))(bufferutil@4.0.8)(react@18.2.0)(utf-8-validate@6.0.3)))(bufferutil@4.0.8)(utf-8-validate@6.0.3) + '@walletconnect/events': 1.0.1 + '@walletconnect/heartbeat': 1.2.1 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/logger': 2.1.2 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.11.2(@react-native-async-storage/async-storage@1.23.1(react-native@0.73.6(@babel/core@7.24.4)(@babel/preset-env@7.24.4(@babel/core@7.24.4))(bufferutil@4.0.8)(react@18.2.0)(utf-8-validate@6.0.3))) + '@walletconnect/utils': 2.11.2(@react-native-async-storage/async-storage@1.23.1(react-native@0.73.6(@babel/core@7.24.4)(@babel/preset-env@7.24.4(@babel/core@7.24.4))(bufferutil@4.0.8)(react@18.2.0)(utf-8-validate@6.0.3))) + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/kv' + - bufferutil + - encoding + - ioredis + - uWebSockets.js + - utf-8-validate + + '@walletconnect/sign-client@2.13.0(@react-native-async-storage/async-storage@1.23.1(react-native@0.73.6(@babel/core@7.24.4)(@babel/preset-env@7.24.4(@babel/core@7.24.4))(bufferutil@4.0.8)(react@18.2.0)(utf-8-validate@6.0.3)))(bufferutil@4.0.8)(utf-8-validate@6.0.3)': + dependencies: + '@walletconnect/core': 2.13.0(@react-native-async-storage/async-storage@1.23.1(react-native@0.73.6(@babel/core@7.24.4)(@babel/preset-env@7.24.4(@babel/core@7.24.4))(bufferutil@4.0.8)(react@18.2.0)(utf-8-validate@6.0.3)))(bufferutil@4.0.8)(utf-8-validate@6.0.3) + '@walletconnect/events': 1.0.1 + '@walletconnect/heartbeat': 1.2.2 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/logger': 2.1.2 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.13.0(@react-native-async-storage/async-storage@1.23.1(react-native@0.73.6(@babel/core@7.24.4)(@babel/preset-env@7.24.4(@babel/core@7.24.4))(bufferutil@4.0.8)(react@18.2.0)(utf-8-validate@6.0.3))) + '@walletconnect/utils': 2.13.0(@react-native-async-storage/async-storage@1.23.1(react-native@0.73.6(@babel/core@7.24.4)(@babel/preset-env@7.24.4(@babel/core@7.24.4))(bufferutil@4.0.8)(react@18.2.0)(utf-8-validate@6.0.3))) + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/kv' + - bufferutil + - encoding + - ioredis + - uWebSockets.js + - utf-8-validate + + '@walletconnect/time@1.0.2': + dependencies: + tslib: 1.14.1 + + '@walletconnect/types@2.11.2(@react-native-async-storage/async-storage@1.23.1(react-native@0.73.6(@babel/core@7.24.4)(@babel/preset-env@7.24.4(@babel/core@7.24.4))(bufferutil@4.0.8)(react@18.2.0)(utf-8-validate@6.0.3)))': + dependencies: + '@walletconnect/events': 1.0.1 + '@walletconnect/heartbeat': 1.2.1 + '@walletconnect/jsonrpc-types': 1.0.3 + '@walletconnect/keyvaluestorage': 1.1.1(@react-native-async-storage/async-storage@1.23.1(react-native@0.73.6(@babel/core@7.24.4)(@babel/preset-env@7.24.4(@babel/core@7.24.4))(bufferutil@4.0.8)(react@18.2.0)(utf-8-validate@6.0.3))) + '@walletconnect/logger': 2.1.2 + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/kv' + - ioredis + - uWebSockets.js + + '@walletconnect/types@2.12.0(@react-native-async-storage/async-storage@1.23.1(react-native@0.73.6(@babel/core@7.24.4)(@babel/preset-env@7.24.4(@babel/core@7.24.4))(bufferutil@4.0.8)(react@18.2.0)(utf-8-validate@6.0.3)))': + dependencies: + '@walletconnect/events': 1.0.1 + '@walletconnect/heartbeat': 1.2.1 + '@walletconnect/jsonrpc-types': 1.0.3 + '@walletconnect/keyvaluestorage': 1.1.1(@react-native-async-storage/async-storage@1.23.1(react-native@0.73.6(@babel/core@7.24.4)(@babel/preset-env@7.24.4(@babel/core@7.24.4))(bufferutil@4.0.8)(react@18.2.0)(utf-8-validate@6.0.3))) + '@walletconnect/logger': 2.1.2 + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/kv' + - ioredis + - uWebSockets.js + + '@walletconnect/types@2.13.0(@react-native-async-storage/async-storage@1.23.1(react-native@0.73.6(@babel/core@7.24.4)(@babel/preset-env@7.24.4(@babel/core@7.24.4))(bufferutil@4.0.8)(react@18.2.0)(utf-8-validate@6.0.3)))': + dependencies: + '@walletconnect/events': 1.0.1 + '@walletconnect/heartbeat': 1.2.2 + '@walletconnect/jsonrpc-types': 1.0.4 + '@walletconnect/keyvaluestorage': 1.1.1(@react-native-async-storage/async-storage@1.23.1(react-native@0.73.6(@babel/core@7.24.4)(@babel/preset-env@7.24.4(@babel/core@7.24.4))(bufferutil@4.0.8)(react@18.2.0)(utf-8-validate@6.0.3))) + '@walletconnect/logger': 2.1.2 + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/kv' + - ioredis + - uWebSockets.js + + '@walletconnect/universal-provider@2.11.2(@react-native-async-storage/async-storage@1.23.1(react-native@0.73.6(@babel/core@7.24.4)(@babel/preset-env@7.24.4(@babel/core@7.24.4))(bufferutil@4.0.8)(react@18.2.0)(utf-8-validate@6.0.3)))(bufferutil@4.0.8)(utf-8-validate@6.0.3)': + dependencies: + '@walletconnect/jsonrpc-http-connection': 1.0.7 + '@walletconnect/jsonrpc-provider': 1.0.13 + '@walletconnect/jsonrpc-types': 1.0.3 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/logger': 2.1.2 + '@walletconnect/sign-client': 2.11.2(@react-native-async-storage/async-storage@1.23.1(react-native@0.73.6(@babel/core@7.24.4)(@babel/preset-env@7.24.4(@babel/core@7.24.4))(bufferutil@4.0.8)(react@18.2.0)(utf-8-validate@6.0.3)))(bufferutil@4.0.8)(utf-8-validate@6.0.3) + '@walletconnect/types': 2.11.2(@react-native-async-storage/async-storage@1.23.1(react-native@0.73.6(@babel/core@7.24.4)(@babel/preset-env@7.24.4(@babel/core@7.24.4))(bufferutil@4.0.8)(react@18.2.0)(utf-8-validate@6.0.3))) + '@walletconnect/utils': 2.11.2(@react-native-async-storage/async-storage@1.23.1(react-native@0.73.6(@babel/core@7.24.4)(@babel/preset-env@7.24.4(@babel/core@7.24.4))(bufferutil@4.0.8)(react@18.2.0)(utf-8-validate@6.0.3))) + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/kv' + - bufferutil + - encoding + - ioredis + - uWebSockets.js + - utf-8-validate + + '@walletconnect/universal-provider@2.13.0(@react-native-async-storage/async-storage@1.23.1(react-native@0.73.6(@babel/core@7.24.4)(@babel/preset-env@7.24.4(@babel/core@7.24.4))(bufferutil@4.0.8)(react@18.2.0)(utf-8-validate@6.0.3)))(bufferutil@4.0.8)(utf-8-validate@6.0.3)': + dependencies: + '@walletconnect/jsonrpc-http-connection': 1.0.8 + '@walletconnect/jsonrpc-provider': 1.0.14 + '@walletconnect/jsonrpc-types': 1.0.4 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/logger': 2.1.2 + '@walletconnect/sign-client': 2.13.0(@react-native-async-storage/async-storage@1.23.1(react-native@0.73.6(@babel/core@7.24.4)(@babel/preset-env@7.24.4(@babel/core@7.24.4))(bufferutil@4.0.8)(react@18.2.0)(utf-8-validate@6.0.3)))(bufferutil@4.0.8)(utf-8-validate@6.0.3) + '@walletconnect/types': 2.13.0(@react-native-async-storage/async-storage@1.23.1(react-native@0.73.6(@babel/core@7.24.4)(@babel/preset-env@7.24.4(@babel/core@7.24.4))(bufferutil@4.0.8)(react@18.2.0)(utf-8-validate@6.0.3))) + '@walletconnect/utils': 2.13.0(@react-native-async-storage/async-storage@1.23.1(react-native@0.73.6(@babel/core@7.24.4)(@babel/preset-env@7.24.4(@babel/core@7.24.4))(bufferutil@4.0.8)(react@18.2.0)(utf-8-validate@6.0.3))) + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/kv' + - bufferutil + - encoding + - ioredis + - uWebSockets.js + - utf-8-validate + + '@walletconnect/utils@2.11.2(@react-native-async-storage/async-storage@1.23.1(react-native@0.73.6(@babel/core@7.24.4)(@babel/preset-env@7.24.4(@babel/core@7.24.4))(bufferutil@4.0.8)(react@18.2.0)(utf-8-validate@6.0.3)))': + dependencies: + '@stablelib/chacha20poly1305': 1.0.1 + '@stablelib/hkdf': 1.0.1 + '@stablelib/random': 1.0.2 + '@stablelib/sha256': 1.0.1 + '@stablelib/x25519': 1.0.3 + '@walletconnect/relay-api': 1.0.9 + '@walletconnect/safe-json': 1.0.2 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.11.2(@react-native-async-storage/async-storage@1.23.1(react-native@0.73.6(@babel/core@7.24.4)(@babel/preset-env@7.24.4(@babel/core@7.24.4))(bufferutil@4.0.8)(react@18.2.0)(utf-8-validate@6.0.3))) + '@walletconnect/window-getters': 1.0.1 + '@walletconnect/window-metadata': 1.0.1 + detect-browser: 5.3.0 + query-string: 7.1.3 + uint8arrays: 3.1.1 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/kv' + - ioredis + - uWebSockets.js + + '@walletconnect/utils@2.12.0(@react-native-async-storage/async-storage@1.23.1(react-native@0.73.6(@babel/core@7.24.4)(@babel/preset-env@7.24.4(@babel/core@7.24.4))(bufferutil@4.0.8)(react@18.2.0)(utf-8-validate@6.0.3)))': + dependencies: + '@stablelib/chacha20poly1305': 1.0.1 + '@stablelib/hkdf': 1.0.1 + '@stablelib/random': 1.0.2 + '@stablelib/sha256': 1.0.1 + '@stablelib/x25519': 1.0.3 + '@walletconnect/relay-api': 1.0.9 + '@walletconnect/safe-json': 1.0.2 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.12.0(@react-native-async-storage/async-storage@1.23.1(react-native@0.73.6(@babel/core@7.24.4)(@babel/preset-env@7.24.4(@babel/core@7.24.4))(bufferutil@4.0.8)(react@18.2.0)(utf-8-validate@6.0.3))) + '@walletconnect/window-getters': 1.0.1 + '@walletconnect/window-metadata': 1.0.1 + detect-browser: 5.3.0 + query-string: 7.1.3 + uint8arrays: 3.1.1 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/kv' + - ioredis + - uWebSockets.js + + '@walletconnect/utils@2.13.0(@react-native-async-storage/async-storage@1.23.1(react-native@0.73.6(@babel/core@7.24.4)(@babel/preset-env@7.24.4(@babel/core@7.24.4))(bufferutil@4.0.8)(react@18.2.0)(utf-8-validate@6.0.3)))': + dependencies: + '@stablelib/chacha20poly1305': 1.0.1 + '@stablelib/hkdf': 1.0.1 + '@stablelib/random': 1.0.2 + '@stablelib/sha256': 1.0.1 + '@stablelib/x25519': 1.0.3 + '@walletconnect/relay-api': 1.0.10 + '@walletconnect/safe-json': 1.0.2 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.13.0(@react-native-async-storage/async-storage@1.23.1(react-native@0.73.6(@babel/core@7.24.4)(@babel/preset-env@7.24.4(@babel/core@7.24.4))(bufferutil@4.0.8)(react@18.2.0)(utf-8-validate@6.0.3))) + '@walletconnect/window-getters': 1.0.1 + '@walletconnect/window-metadata': 1.0.1 + detect-browser: 5.3.0 + query-string: 7.1.3 + uint8arrays: 3.1.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/kv' + - ioredis + - uWebSockets.js + + '@walletconnect/window-getters@1.0.1': + dependencies: + tslib: 1.14.1 + + '@walletconnect/window-metadata@1.0.1': + dependencies: + '@walletconnect/window-getters': 1.0.1 + tslib: 1.14.1 + + '@web3modal/common@4.2.3': + dependencies: + bignumber.js: 9.1.2 + dayjs: 1.11.10 + + '@web3modal/core@4.2.3(@types/react@18.2.79)(react@18.2.0)': + dependencies: + '@web3modal/common': 4.2.3 + '@web3modal/wallet': 4.2.3 + valtio: 1.11.2(@types/react@18.2.79)(react@18.2.0) + transitivePeerDependencies: + - '@types/react' + - react + + '@web3modal/polyfills@4.2.3': + dependencies: + buffer: 6.0.3 + + '@web3modal/scaffold-react@4.2.3(@react-native-async-storage/async-storage@1.23.1(react-native@0.73.6(@babel/core@7.24.4)(@babel/preset-env@7.24.4(@babel/core@7.24.4))(bufferutil@4.0.8)(react@18.2.0)(utf-8-validate@6.0.3)))(@types/react@18.2.79)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + dependencies: + '@web3modal/scaffold': 4.2.3(@react-native-async-storage/async-storage@1.23.1(react-native@0.73.6(@babel/core@7.24.4)(@babel/preset-env@7.24.4(@babel/core@7.24.4))(bufferutil@4.0.8)(react@18.2.0)(utf-8-validate@6.0.3)))(@types/react@18.2.79)(react@18.2.0) + optionalDependencies: + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/kv' + - ioredis + - uWebSockets.js + + '@web3modal/scaffold-utils@4.2.3(@types/react@18.2.79)(react@18.2.0)': + dependencies: + '@web3modal/core': 4.2.3(@types/react@18.2.79)(react@18.2.0) + '@web3modal/polyfills': 4.2.3 + valtio: 1.11.2(@types/react@18.2.79)(react@18.2.0) + transitivePeerDependencies: + - '@types/react' + - react + + '@web3modal/scaffold-vue@4.2.3(@react-native-async-storage/async-storage@1.23.1(react-native@0.73.6(@babel/core@7.24.4)(@babel/preset-env@7.24.4(@babel/core@7.24.4))(bufferutil@4.0.8)(react@18.2.0)(utf-8-validate@6.0.3)))(@types/react@18.2.79)(react@18.2.0)': + dependencies: + '@web3modal/scaffold': 4.2.3(@react-native-async-storage/async-storage@1.23.1(react-native@0.73.6(@babel/core@7.24.4)(@babel/preset-env@7.24.4(@babel/core@7.24.4))(bufferutil@4.0.8)(react@18.2.0)(utf-8-validate@6.0.3)))(@types/react@18.2.79)(react@18.2.0) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/kv' + - ioredis + - react + - uWebSockets.js + + '@web3modal/scaffold@4.2.3(@react-native-async-storage/async-storage@1.23.1(react-native@0.73.6(@babel/core@7.24.4)(@babel/preset-env@7.24.4(@babel/core@7.24.4))(bufferutil@4.0.8)(react@18.2.0)(utf-8-validate@6.0.3)))(@types/react@18.2.79)(react@18.2.0)': + dependencies: + '@web3modal/common': 4.2.3 + '@web3modal/core': 4.2.3(@types/react@18.2.79)(react@18.2.0) + '@web3modal/siwe': 4.2.3(@react-native-async-storage/async-storage@1.23.1(react-native@0.73.6(@babel/core@7.24.4)(@babel/preset-env@7.24.4(@babel/core@7.24.4))(bufferutil@4.0.8)(react@18.2.0)(utf-8-validate@6.0.3)))(@types/react@18.2.79)(react@18.2.0) + '@web3modal/ui': 4.2.3 + '@web3modal/wallet': 4.2.3 + lit: 3.1.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/kv' + - ioredis + - react + - uWebSockets.js + + '@web3modal/siwe@4.2.3(@react-native-async-storage/async-storage@1.23.1(react-native@0.73.6(@babel/core@7.24.4)(@babel/preset-env@7.24.4(@babel/core@7.24.4))(bufferutil@4.0.8)(react@18.2.0)(utf-8-validate@6.0.3)))(@types/react@18.2.79)(react@18.2.0)': + dependencies: + '@walletconnect/utils': 2.12.0(@react-native-async-storage/async-storage@1.23.1(react-native@0.73.6(@babel/core@7.24.4)(@babel/preset-env@7.24.4(@babel/core@7.24.4))(bufferutil@4.0.8)(react@18.2.0)(utf-8-validate@6.0.3))) + '@web3modal/core': 4.2.3(@types/react@18.2.79)(react@18.2.0) + '@web3modal/scaffold-utils': 4.2.3(@types/react@18.2.79)(react@18.2.0) + lit: 3.1.0 + valtio: 1.11.2(@types/react@18.2.79)(react@18.2.0) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/kv' + - ioredis + - react + - uWebSockets.js + + '@web3modal/ui@4.2.3': + dependencies: + lit: 3.1.0 + qrcode: 1.5.3 + + ? '@web3modal/wagmi@4.2.3(@react-native-async-storage/async-storage@1.23.1(react-native@0.73.6(@babel/core@7.24.4)(@babel/preset-env@7.24.4(@babel/core@7.24.4))(bufferutil@4.0.8)(react@18.2.0)(utf-8-validate@6.0.3)))(@types/react@18.2.79)(@wagmi/connectors@4.1.26(@react-native-async-storage/async-storage@1.23.1(react-native@0.73.6(@babel/core@7.24.4)(@babel/preset-env@7.24.4(@babel/core@7.24.4))(bufferutil@4.0.8)(react@18.2.0)(utf-8-validate@6.0.3)))(@types/react@18.2.79)(@wagmi/core@2.6.17(@tanstack/query-core@5.40.0)(@types/react@18.2.79)(bufferutil@4.0.8)(react@18.2.0)(typescript@5.4.5)(utf-8-validate@6.0.3)(viem@2.9.19(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.22.4))(zod@3.22.4))(bufferutil@4.0.8)(react-dom@18.2.0(react@18.2.0))(react-native@0.73.6(@babel/core@7.24.4)(@babel/preset-env@7.24.4(@babel/core@7.24.4))(bufferutil@4.0.8)(react@18.2.0)(utf-8-validate@6.0.3))(react@18.2.0)(rollup@4.14.3)(typescript@5.4.5)(utf-8-validate@6.0.3)(viem@2.9.19(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.22.4))(zod@3.22.4))(@wagmi/core@2.6.17(@tanstack/query-core@5.40.0)(@types/react@18.2.79)(bufferutil@4.0.8)(react@18.2.0)(typescript@5.4.5)(utf-8-validate@6.0.3)(viem@2.9.19(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.22.4))(zod@3.22.4))(bufferutil@4.0.8)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(utf-8-validate@6.0.3)(viem@2.9.19(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.22.4))' + : dependencies: + '@wagmi/connectors': 4.1.26(@react-native-async-storage/async-storage@1.23.1(react-native@0.73.6(@babel/core@7.24.4)(@babel/preset-env@7.24.4(@babel/core@7.24.4))(bufferutil@4.0.8)(react@18.2.0)(utf-8-validate@6.0.3)))(@types/react@18.2.79)(@wagmi/core@2.6.17(@tanstack/query-core@5.40.0)(@types/react@18.2.79)(bufferutil@4.0.8)(react@18.2.0)(typescript@5.4.5)(utf-8-validate@6.0.3)(viem@2.9.19(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.22.4))(zod@3.22.4))(bufferutil@4.0.8)(react-dom@18.2.0(react@18.2.0))(react-native@0.73.6(@babel/core@7.24.4)(@babel/preset-env@7.24.4(@babel/core@7.24.4))(bufferutil@4.0.8)(react@18.2.0)(utf-8-validate@6.0.3))(react@18.2.0)(rollup@4.14.3)(typescript@5.4.5)(utf-8-validate@6.0.3)(viem@2.9.19(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.22.4))(zod@3.22.4) + '@wagmi/core': 2.6.17(@tanstack/query-core@5.40.0)(@types/react@18.2.79)(bufferutil@4.0.8)(react@18.2.0)(typescript@5.4.5)(utf-8-validate@6.0.3)(viem@2.9.19(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.22.4))(zod@3.22.4) + '@walletconnect/ethereum-provider': 2.13.0(@react-native-async-storage/async-storage@1.23.1(react-native@0.73.6(@babel/core@7.24.4)(@babel/preset-env@7.24.4(@babel/core@7.24.4))(bufferutil@4.0.8)(react@18.2.0)(utf-8-validate@6.0.3)))(@types/react@18.2.79)(bufferutil@4.0.8)(react@18.2.0)(utf-8-validate@6.0.3) + '@web3modal/polyfills': 4.2.3 + '@web3modal/scaffold': 4.2.3(@react-native-async-storage/async-storage@1.23.1(react-native@0.73.6(@babel/core@7.24.4)(@babel/preset-env@7.24.4(@babel/core@7.24.4))(bufferutil@4.0.8)(react@18.2.0)(utf-8-validate@6.0.3)))(@types/react@18.2.79)(react@18.2.0) + '@web3modal/scaffold-react': 4.2.3(@react-native-async-storage/async-storage@1.23.1(react-native@0.73.6(@babel/core@7.24.4)(@babel/preset-env@7.24.4(@babel/core@7.24.4))(bufferutil@4.0.8)(react@18.2.0)(utf-8-validate@6.0.3)))(@types/react@18.2.79)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@web3modal/scaffold-utils': 4.2.3(@types/react@18.2.79)(react@18.2.0) + '@web3modal/scaffold-vue': 4.2.3(@react-native-async-storage/async-storage@1.23.1(react-native@0.73.6(@babel/core@7.24.4)(@babel/preset-env@7.24.4(@babel/core@7.24.4))(bufferutil@4.0.8)(react@18.2.0)(utf-8-validate@6.0.3)))(@types/react@18.2.79)(react@18.2.0) + '@web3modal/siwe': 4.2.3(@react-native-async-storage/async-storage@1.23.1(react-native@0.73.6(@babel/core@7.24.4)(@babel/preset-env@7.24.4(@babel/core@7.24.4))(bufferutil@4.0.8)(react@18.2.0)(utf-8-validate@6.0.3)))(@types/react@18.2.79)(react@18.2.0) + viem: 2.9.19(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.22.4) + optionalDependencies: + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/kv' + - bufferutil + - encoding + - ioredis + - uWebSockets.js + - utf-8-validate + + '@web3modal/wallet@4.2.3': + dependencies: + '@web3modal/polyfills': 4.2.3 + zod: 3.22.4 + + '@webassemblyjs/ast@1.12.1': + dependencies: + '@webassemblyjs/helper-numbers': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + + '@webassemblyjs/floating-point-hex-parser@1.11.6': {} + + '@webassemblyjs/helper-api-error@1.11.6': {} + + '@webassemblyjs/helper-buffer@1.12.1': {} + + '@webassemblyjs/helper-numbers@1.11.6': + dependencies: + '@webassemblyjs/floating-point-hex-parser': 1.11.6 + '@webassemblyjs/helper-api-error': 1.11.6 + '@xtuc/long': 4.2.2 + + '@webassemblyjs/helper-wasm-bytecode@1.11.6': {} + + '@webassemblyjs/helper-wasm-section@1.12.1': + dependencies: + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/helper-buffer': 1.12.1 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/wasm-gen': 1.12.1 + + '@webassemblyjs/ieee754@1.11.6': + dependencies: + '@xtuc/ieee754': 1.2.0 + + '@webassemblyjs/leb128@1.11.6': + dependencies: + '@xtuc/long': 4.2.2 + + '@webassemblyjs/utf8@1.11.6': {} + + '@webassemblyjs/wasm-edit@1.12.1': + dependencies: + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/helper-buffer': 1.12.1 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/helper-wasm-section': 1.12.1 + '@webassemblyjs/wasm-gen': 1.12.1 + '@webassemblyjs/wasm-opt': 1.12.1 + '@webassemblyjs/wasm-parser': 1.12.1 + '@webassemblyjs/wast-printer': 1.12.1 + + '@webassemblyjs/wasm-gen@1.12.1': + dependencies: + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/ieee754': 1.11.6 + '@webassemblyjs/leb128': 1.11.6 + '@webassemblyjs/utf8': 1.11.6 + + '@webassemblyjs/wasm-opt@1.12.1': + dependencies: + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/helper-buffer': 1.12.1 + '@webassemblyjs/wasm-gen': 1.12.1 + '@webassemblyjs/wasm-parser': 1.12.1 + + '@webassemblyjs/wasm-parser@1.12.1': + dependencies: + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/helper-api-error': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/ieee754': 1.11.6 + '@webassemblyjs/leb128': 1.11.6 + '@webassemblyjs/utf8': 1.11.6 + + '@webassemblyjs/wast-printer@1.12.1': + dependencies: + '@webassemblyjs/ast': 1.12.1 + '@xtuc/long': 4.2.2 + + '@webpack-cli/configtest@2.1.1(webpack-cli@5.1.4(webpack@5.91.0))(webpack@5.91.0(webpack-cli@5.1.4))': + dependencies: + webpack: 5.91.0(webpack-cli@5.1.4) + webpack-cli: 5.1.4(webpack@5.91.0) + + '@webpack-cli/info@2.0.2(webpack-cli@5.1.4(webpack@5.91.0))(webpack@5.91.0(webpack-cli@5.1.4))': + dependencies: + webpack: 5.91.0(webpack-cli@5.1.4) + webpack-cli: 5.1.4(webpack@5.91.0) + + '@webpack-cli/serve@2.0.5(webpack-cli@5.1.4(webpack@5.91.0))(webpack@5.91.0(webpack-cli@5.1.4))': + dependencies: + webpack: 5.91.0(webpack-cli@5.1.4) + webpack-cli: 5.1.4(webpack@5.91.0) + + '@whatwg-node/events@0.0.3': {} + + '@whatwg-node/events@0.1.1': {} + + '@whatwg-node/fetch@0.8.8': + dependencies: + '@peculiar/webcrypto': 1.4.6 + '@whatwg-node/node-fetch': 0.3.6 + busboy: 1.6.0 + urlpattern-polyfill: 8.0.2 + web-streams-polyfill: 3.3.3 + + '@whatwg-node/fetch@0.9.17': + dependencies: + '@whatwg-node/node-fetch': 0.5.11 + urlpattern-polyfill: 10.0.0 + + '@whatwg-node/node-fetch@0.3.6': + dependencies: + '@whatwg-node/events': 0.0.3 + busboy: 1.6.0 + fast-querystring: 1.1.2 + fast-url-parser: 1.1.3 + tslib: 2.6.2 + + '@whatwg-node/node-fetch@0.5.11': + dependencies: + '@kamilkisiela/fast-url-parser': 1.1.4 + '@whatwg-node/events': 0.1.1 + busboy: 1.6.0 + fast-querystring: 1.1.2 + tslib: 2.6.2 + + '@xtuc/ieee754@1.2.0': {} + + '@xtuc/long@4.2.2': {} + + abitype@0.9.8(typescript@5.4.5)(zod@3.22.4): + optionalDependencies: + typescript: 5.4.5 + zod: 3.22.4 + + abitype@1.0.0(typescript@5.4.5)(zod@3.22.4): + optionalDependencies: + typescript: 5.4.5 + zod: 3.22.4 + + abort-controller@3.0.0: + dependencies: + event-target-shim: 5.0.1 + + accepts@1.3.8: + dependencies: + mime-types: 2.1.35 + negotiator: 0.6.3 + + acorn-import-assertions@1.9.0(acorn@8.11.3): + dependencies: + acorn: 8.11.3 + + acorn-jsx@5.3.2(acorn@8.11.3): + dependencies: + acorn: 8.11.3 + + acorn@8.11.3: {} + + agent-base@7.1.1: + dependencies: + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + + aggregate-error@3.1.0: + dependencies: + clean-stack: 2.2.0 + indent-string: 4.0.0 + + ajv-keywords@3.5.2(ajv@6.12.6): + dependencies: + ajv: 6.12.6 + + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + anser@1.4.10: {} + + ansi-escapes@4.3.2: + dependencies: + type-fest: 0.21.3 + + ansi-fragments@0.2.1: + dependencies: + colorette: 1.4.0 + slice-ansi: 2.1.0 + strip-ansi: 5.2.0 + + ansi-regex@4.1.1: {} + + ansi-regex@5.0.1: {} + + ansi-styles@3.2.1: + dependencies: + color-convert: 1.9.3 + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@5.2.0: {} + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + appdirsjs@1.2.7: {} + + argparse@1.0.10: + dependencies: + sprintf-js: 1.0.3 + + argparse@2.0.1: {} + + aria-query@5.3.0: + dependencies: + dequal: 2.0.3 + + array-buffer-byte-length@1.0.1: + dependencies: + call-bind: 1.0.7 + is-array-buffer: 3.0.4 + + array-includes@3.1.8: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-object-atoms: 1.0.0 + get-intrinsic: 1.2.4 + is-string: 1.0.7 + + array-union@2.1.0: {} + + array.prototype.findlast@1.2.5: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + es-shim-unscopables: 1.0.2 + + array.prototype.findlastindex@1.2.5: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + es-shim-unscopables: 1.0.2 + + array.prototype.flat@1.3.2: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-shim-unscopables: 1.0.2 + + array.prototype.flatmap@1.3.2: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-shim-unscopables: 1.0.2 + + array.prototype.toreversed@1.1.2: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-shim-unscopables: 1.0.2 + + array.prototype.tosorted@1.1.3: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + es-shim-unscopables: 1.0.2 + + arraybuffer.prototype.slice@1.0.3: + dependencies: + array-buffer-byte-length: 1.0.1 + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + is-array-buffer: 3.0.4 + is-shared-array-buffer: 1.0.3 + + asap@2.0.6: {} + + asn1.js@4.10.1: + dependencies: + bn.js: 4.12.0 + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + + asn1js@3.0.5: + dependencies: + pvtsutils: 1.3.5 + pvutils: 1.1.3 + tslib: 2.6.2 + + assert@2.1.0: + dependencies: + call-bind: 1.0.7 + is-nan: 1.3.2 + object-is: 1.1.6 + object.assign: 4.1.5 + util: 0.12.5 + + ast-types-flow@0.0.8: {} + + ast-types@0.15.2: + dependencies: + tslib: 2.6.2 + + astral-regex@1.0.0: {} + + astral-regex@2.0.0: {} + + async-limiter@1.0.1: {} + + async-mutex@0.2.6: + dependencies: + tslib: 2.6.2 + + atomic-sleep@1.0.0: {} + + auto-bind@4.0.0: {} + + available-typed-arrays@1.0.7: + dependencies: + possible-typed-array-names: 1.0.0 + + axe-core@4.7.0: {} + + axobject-query@3.2.1: + dependencies: + dequal: 2.0.3 + + babel-core@7.0.0-bridge.0(@babel/core@7.24.4): + dependencies: + '@babel/core': 7.24.4 + + babel-plugin-macros@3.1.0: + dependencies: + '@babel/runtime': 7.24.4 + cosmiconfig: 7.1.0 + resolve: 1.22.8 + + babel-plugin-polyfill-corejs2@0.4.10(@babel/core@7.24.4): + dependencies: + '@babel/compat-data': 7.24.4 + '@babel/core': 7.24.4 + '@babel/helper-define-polyfill-provider': 0.6.1(@babel/core@7.24.4) + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + babel-plugin-polyfill-corejs3@0.10.4(@babel/core@7.24.4): + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-define-polyfill-provider': 0.6.1(@babel/core@7.24.4) + core-js-compat: 3.37.0 + transitivePeerDependencies: + - supports-color + + babel-plugin-polyfill-regenerator@0.6.1(@babel/core@7.24.4): + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-define-polyfill-provider': 0.6.1(@babel/core@7.24.4) + transitivePeerDependencies: + - supports-color + + babel-plugin-syntax-trailing-function-commas@7.0.0-beta.0: {} + + babel-plugin-transform-flow-enums@0.0.2(@babel/core@7.24.4): + dependencies: + '@babel/plugin-syntax-flow': 7.24.1(@babel/core@7.24.4) + transitivePeerDependencies: + - '@babel/core' + + babel-preset-fbjs@3.4.0(@babel/core@7.24.4): + dependencies: + '@babel/core': 7.24.4 + '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.24.4) + '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.24.4) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.24.4) + '@babel/plugin-syntax-flow': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-syntax-jsx': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.4) + '@babel/plugin-transform-arrow-functions': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-block-scoped-functions': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-block-scoping': 7.24.4(@babel/core@7.24.4) + '@babel/plugin-transform-classes': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-computed-properties': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-destructuring': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-flow-strip-types': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-for-of': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-function-name': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-literals': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-member-expression-literals': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-modules-commonjs': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-object-super': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-parameters': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-property-literals': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-react-display-name': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-react-jsx': 7.23.4(@babel/core@7.24.4) + '@babel/plugin-transform-shorthand-properties': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-spread': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-template-literals': 7.24.1(@babel/core@7.24.4) + babel-plugin-syntax-trailing-function-commas: 7.0.0-beta.0 + + balanced-match@1.0.2: {} + + base64-js@1.5.1: {} + + bignumber.js@9.1.2: {} + + binary-extensions@2.3.0: {} + + bl@4.1.0: + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + + bn.js@4.12.0: {} + + bn.js@5.2.1: {} + + bowser@2.11.0: {} + + brace-expansion@1.1.11: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.0.1: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.2: + dependencies: + fill-range: 7.0.1 + + brorand@1.1.0: {} + + browser-resolve@2.0.0: + dependencies: + resolve: 1.22.8 + + browserify-aes@1.2.0: + dependencies: + buffer-xor: 1.0.3 + cipher-base: 1.0.4 + create-hash: 1.2.0 + evp_bytestokey: 1.0.3 + inherits: 2.0.4 + safe-buffer: 5.2.1 + + browserify-cipher@1.0.1: + dependencies: + browserify-aes: 1.2.0 + browserify-des: 1.0.2 + evp_bytestokey: 1.0.3 + + browserify-des@1.0.2: + dependencies: + cipher-base: 1.0.4 + des.js: 1.1.0 + inherits: 2.0.4 + safe-buffer: 5.2.1 + + browserify-rsa@4.1.0: + dependencies: + bn.js: 5.2.1 + randombytes: 2.1.0 + + browserify-sign@4.2.3: + dependencies: + bn.js: 5.2.1 + browserify-rsa: 4.1.0 + create-hash: 1.2.0 + create-hmac: 1.1.7 + elliptic: 6.5.5 + hash-base: 3.0.4 + inherits: 2.0.4 + parse-asn1: 5.1.7 + readable-stream: 2.3.8 + safe-buffer: 5.2.1 + + browserify-zlib@0.2.0: + dependencies: + pako: 1.0.11 + + browserslist@4.23.0: + dependencies: + caniuse-lite: 1.0.30001610 + electron-to-chromium: 1.4.736 + node-releases: 2.0.14 + update-browserslist-db: 1.0.13(browserslist@4.23.0) + + bser@2.1.1: + dependencies: + node-int64: 0.4.0 + + buffer-from@1.1.2: {} + + buffer-xor@1.0.3: {} + + buffer@5.7.1: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + buffer@6.0.3: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + bufferutil@4.0.8: + dependencies: + node-gyp-build: 4.8.0 + + builtin-status-codes@3.0.0: {} + + busboy@1.6.0: + dependencies: + streamsearch: 1.1.0 + + bytes@3.0.0: {} + + call-bind@1.0.7: + dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + set-function-length: 1.2.2 + + caller-callsite@2.0.0: + dependencies: + callsites: 2.0.0 + + caller-path@2.0.0: + dependencies: + caller-callsite: 2.0.0 + + callsites@2.0.0: {} + + callsites@3.1.0: {} + + camel-case@4.1.2: + dependencies: + pascal-case: 3.1.2 + tslib: 2.6.2 + + camelcase@5.3.1: {} + + camelcase@6.3.0: {} + + camelize@1.0.1: {} + + caniuse-lite@1.0.30001610: {} + + canvas-renderer@2.2.1: + dependencies: + '@types/node': 20.12.7 + + capital-case@1.0.4: + dependencies: + no-case: 3.0.4 + tslib: 2.6.2 + upper-case-first: 2.0.2 + + chalk@2.4.2: + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + change-case-all@1.0.15: + dependencies: + change-case: 4.1.2 + is-lower-case: 2.0.2 + is-upper-case: 2.0.2 + lower-case: 2.0.2 + lower-case-first: 2.0.2 + sponge-case: 1.0.1 + swap-case: 2.0.2 + title-case: 3.0.3 + upper-case: 2.0.2 + upper-case-first: 2.0.2 + + change-case@4.1.2: + dependencies: + camel-case: 4.1.2 + capital-case: 1.0.4 + constant-case: 3.0.4 + dot-case: 3.0.4 + header-case: 2.0.4 + no-case: 3.0.4 + param-case: 3.0.4 + pascal-case: 3.1.2 + path-case: 3.0.4 + sentence-case: 3.0.4 + snake-case: 3.0.4 + tslib: 2.6.2 + + chardet@0.7.0: {} + + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + chrome-launcher@0.15.2: + dependencies: + '@types/node': 20.12.7 + escape-string-regexp: 4.0.0 + is-wsl: 2.2.0 + lighthouse-logger: 1.4.2 + transitivePeerDependencies: + - supports-color + + chrome-trace-event@1.0.3: {} + + chromium-edge-launcher@1.0.0: + dependencies: + '@types/node': 20.12.7 + escape-string-regexp: 4.0.0 + is-wsl: 2.2.0 + lighthouse-logger: 1.4.2 + mkdirp: 1.0.4 + rimraf: 3.0.2 + transitivePeerDependencies: + - supports-color + + ci-info@2.0.0: {} + + ci-info@3.9.0: {} + + cipher-base@1.0.4: + dependencies: + inherits: 2.0.4 + safe-buffer: 5.2.1 + + citty@0.1.6: + dependencies: + consola: 3.2.3 + + clean-stack@2.2.0: {} + + cli-cursor@3.1.0: + dependencies: + restore-cursor: 3.1.0 + + cli-spinners@2.9.2: {} + + cli-truncate@2.1.0: + dependencies: + slice-ansi: 3.0.0 + string-width: 4.2.3 + + cli-width@3.0.0: {} + + clipboardy@4.0.0: + dependencies: + execa: 8.0.1 + is-wsl: 3.1.0 + is64bit: 2.0.0 + + cliui@6.0.0: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 6.2.0 + + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + clone-deep@4.0.1: + dependencies: + is-plain-object: 2.0.4 + kind-of: 6.0.3 + shallow-clone: 3.0.1 + + clone@1.0.4: {} + + clsx@1.2.1: {} + + color-convert@1.9.3: + dependencies: + color-name: 1.1.3 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.3: {} + + color-name@1.1.4: {} + + colord@2.9.3: {} + + colorette@1.4.0: {} + + colorette@2.0.20: {} + + command-exists@1.2.9: {} + + commander@10.0.1: {} + + commander@12.0.0: {} + + commander@2.20.3: {} + + commander@8.3.0: {} + + commander@9.5.0: {} + + common-tags@1.8.2: {} + + commondir@1.0.1: {} + + compressible@2.0.18: + dependencies: + mime-db: 1.52.0 + + compression@1.7.4: + dependencies: + accepts: 1.3.8 + bytes: 3.0.0 + compressible: 2.0.18 + debug: 2.6.9 + on-headers: 1.0.2 + safe-buffer: 5.1.2 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + + concat-map@0.0.1: {} + + connect@3.7.0: + dependencies: + debug: 2.6.9 + finalhandler: 1.1.2 + parseurl: 1.3.3 + utils-merge: 1.0.1 + transitivePeerDependencies: + - supports-color + + consola@3.2.3: {} + + console-browserify@1.2.0: {} + + constant-case@3.0.4: + dependencies: + no-case: 3.0.4 + tslib: 2.6.2 + upper-case: 2.0.2 + + constants-browserify@1.0.0: {} + + convert-source-map@1.9.0: {} + + convert-source-map@2.0.0: {} + + cookie-es@1.1.0: {} + + copy-to-clipboard@3.3.3: + dependencies: + toggle-selection: 1.0.6 + + core-js-compat@3.37.0: + dependencies: + browserslist: 4.23.0 + + core-util-is@1.0.3: {} + + cosmiconfig@5.2.1: + dependencies: + import-fresh: 2.0.0 + is-directory: 0.3.1 + js-yaml: 3.14.1 + parse-json: 4.0.0 + + cosmiconfig@7.1.0: + dependencies: + '@types/parse-json': 4.0.2 + import-fresh: 3.3.0 + parse-json: 5.2.0 + path-type: 4.0.0 + yaml: 1.10.2 + + cosmiconfig@8.3.6(typescript@5.4.5): + dependencies: + import-fresh: 3.3.0 + js-yaml: 4.1.0 + parse-json: 5.2.0 + path-type: 4.0.0 + optionalDependencies: + typescript: 5.4.5 + + crc-32@1.2.2: {} + + create-ecdh@4.0.4: + dependencies: + bn.js: 4.12.0 + elliptic: 6.5.5 + + create-hash@1.2.0: + dependencies: + cipher-base: 1.0.4 + inherits: 2.0.4 + md5.js: 1.3.5 + ripemd160: 2.0.2 + sha.js: 2.4.11 + + create-hmac@1.1.7: + dependencies: + cipher-base: 1.0.4 + create-hash: 1.2.0 + inherits: 2.0.4 + ripemd160: 2.0.2 + safe-buffer: 5.2.1 + sha.js: 2.4.11 + + create-require@1.1.1: {} + + cross-fetch@3.1.8: + dependencies: + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + + cross-fetch@4.0.0: + dependencies: + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + + cross-inspect@1.0.0: + dependencies: + tslib: 2.6.2 + + cross-spawn@7.0.3: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + crossws@0.2.4: {} + + crypto-browserify@3.12.0: + dependencies: + browserify-cipher: 1.0.1 + browserify-sign: 4.2.3 + create-ecdh: 4.0.4 + create-hash: 1.2.0 + create-hmac: 1.1.7 + diffie-hellman: 5.0.3 + inherits: 2.0.4 + pbkdf2: 3.1.2 + public-encrypt: 4.0.3 + randombytes: 2.1.0 + randomfill: 1.0.4 + + css-color-keywords@1.0.0: {} + + css-to-react-native@3.2.0: + dependencies: + camelize: 1.0.1 + css-color-keywords: 1.0.0 + postcss-value-parser: 4.2.0 + + csstype@3.1.2: {} + + csstype@3.1.3: {} + + damerau-levenshtein@1.0.8: {} + + data-uri-to-buffer@4.0.1: {} + + data-view-buffer@1.0.1: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + + data-view-byte-length@1.0.1: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + + data-view-byte-offset@1.0.0: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + + dataloader@2.2.2: {} + + date-fns@2.30.0: + dependencies: + '@babel/runtime': 7.24.4 + + dayjs@1.11.10: {} + + debounce@1.2.1: {} + + debug@2.6.9: + dependencies: + ms: 2.0.0 + + debug@3.2.7: + dependencies: + ms: 2.1.3 + + debug@4.3.4: + dependencies: + ms: 2.1.2 + + decamelize@1.2.0: {} + + decode-uri-component@0.2.2: {} + + deep-is@0.1.4: {} + + deepmerge@4.3.1: {} + + defaults@1.0.4: + dependencies: + clone: 1.0.4 + + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 + gopd: 1.0.1 + + define-lazy-prop@2.0.0: {} + + define-properties@1.2.1: + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + + defu@6.1.4: {} + + denodeify@1.2.1: {} + + depd@2.0.0: {} + + dependency-graph@0.11.0: {} + + deprecated-react-native-prop-types@5.0.0: + dependencies: + '@react-native/normalize-colors': 0.73.2 + invariant: 2.2.4 + prop-types: 15.8.1 + + dequal@2.0.3: {} + + des.js@1.1.0: + dependencies: + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + + destr@2.0.3: {} + + destroy@1.2.0: {} + + detect-browser@5.3.0: {} + + detect-indent@6.1.0: {} + + detect-libc@1.0.3: {} + + diffie-hellman@5.0.3: + dependencies: + bn.js: 4.12.0 + miller-rabin: 4.0.1 + randombytes: 2.1.0 + + dijkstrajs@1.0.3: {} + + dir-glob@3.0.1: + dependencies: + path-type: 4.0.0 + + doctrine@2.1.0: + dependencies: + esutils: 2.0.3 + + doctrine@3.0.0: + dependencies: + esutils: 2.0.3 + + dom-helpers@5.2.1: + dependencies: + '@babel/runtime': 7.24.4 + csstype: 3.1.3 + + domain-browser@4.23.0: {} + + dot-case@3.0.4: + dependencies: + no-case: 3.0.4 + tslib: 2.6.2 + + dotenv@16.4.5: {} + + dset@3.1.3: {} + + duplexify@4.1.3: + dependencies: + end-of-stream: 1.4.4 + inherits: 2.0.4 + readable-stream: 3.6.2 + stream-shift: 1.0.3 + + eciesjs@0.3.18: + dependencies: + '@types/secp256k1': 4.0.6 + futoin-hkdf: 1.5.3 + secp256k1: 5.0.0 + + ee-first@1.1.1: {} + + electron-to-chromium@1.4.736: {} + + elliptic@6.5.5: + dependencies: + bn.js: 4.12.0 + brorand: 1.1.0 + hash.js: 1.1.7 + hmac-drbg: 1.0.1 + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + minimalistic-crypto-utils: 1.0.1 + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + encode-utf8@1.0.3: {} + + encodeurl@1.0.2: {} + + end-of-stream@1.4.4: + dependencies: + once: 1.4.0 + + engine.io-client@6.5.3(bufferutil@4.0.8)(utf-8-validate@6.0.3): + dependencies: + '@socket.io/component-emitter': 3.1.1 + debug: 4.3.4 + engine.io-parser: 5.2.2 + ws: 8.11.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) + xmlhttprequest-ssl: 2.0.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + engine.io-parser@5.2.2: {} + + enhanced-resolve@5.16.0: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.2.1 + + entities@4.5.0: {} + + envinfo@7.12.0: {} + + error-ex@1.3.2: + dependencies: + is-arrayish: 0.2.1 + + error-stack-parser@2.1.4: + dependencies: + stackframe: 1.3.4 + + errorhandler@1.5.1: + dependencies: + accepts: 1.3.8 + escape-html: 1.0.3 + + es-abstract@1.23.3: + dependencies: + array-buffer-byte-length: 1.0.1 + arraybuffer.prototype.slice: 1.0.3 + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 + data-view-buffer: 1.0.1 + data-view-byte-length: 1.0.1 + data-view-byte-offset: 1.0.0 + es-define-property: 1.0.0 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + es-set-tostringtag: 2.0.3 + es-to-primitive: 1.2.1 + function.prototype.name: 1.1.6 + get-intrinsic: 1.2.4 + get-symbol-description: 1.0.2 + globalthis: 1.0.3 + gopd: 1.0.1 + has-property-descriptors: 1.0.2 + has-proto: 1.0.3 + has-symbols: 1.0.3 + hasown: 2.0.2 + internal-slot: 1.0.7 + is-array-buffer: 3.0.4 + is-callable: 1.2.7 + is-data-view: 1.0.1 + is-negative-zero: 2.0.3 + is-regex: 1.1.4 + is-shared-array-buffer: 1.0.3 + is-string: 1.0.7 + is-typed-array: 1.1.13 + is-weakref: 1.0.2 + object-inspect: 1.13.1 + object-keys: 1.1.1 + object.assign: 4.1.5 + regexp.prototype.flags: 1.5.2 + safe-array-concat: 1.1.2 + safe-regex-test: 1.0.3 + string.prototype.trim: 1.2.9 + string.prototype.trimend: 1.0.8 + string.prototype.trimstart: 1.0.8 + typed-array-buffer: 1.0.2 + typed-array-byte-length: 1.0.1 + typed-array-byte-offset: 1.0.2 + typed-array-length: 1.0.6 + unbox-primitive: 1.0.2 + which-typed-array: 1.1.15 + + es-define-property@1.0.0: + dependencies: + get-intrinsic: 1.2.4 + + es-errors@1.3.0: {} + + es-iterator-helpers@1.0.18: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + es-set-tostringtag: 2.0.3 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + globalthis: 1.0.3 + has-property-descriptors: 1.0.2 + has-proto: 1.0.3 + has-symbols: 1.0.3 + internal-slot: 1.0.7 + iterator.prototype: 1.1.2 + safe-array-concat: 1.1.2 + + es-module-lexer@1.5.0: {} + + es-object-atoms@1.0.0: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.0.3: + dependencies: + get-intrinsic: 1.2.4 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + es-shim-unscopables@1.0.2: + dependencies: + hasown: 2.0.2 + + es-to-primitive@1.2.1: + dependencies: + is-callable: 1.2.7 + is-date-object: 1.0.5 + is-symbol: 1.0.4 + + esbuild@0.20.2: + optionalDependencies: + '@esbuild/aix-ppc64': 0.20.2 + '@esbuild/android-arm': 0.20.2 + '@esbuild/android-arm64': 0.20.2 + '@esbuild/android-x64': 0.20.2 + '@esbuild/darwin-arm64': 0.20.2 + '@esbuild/darwin-x64': 0.20.2 + '@esbuild/freebsd-arm64': 0.20.2 + '@esbuild/freebsd-x64': 0.20.2 + '@esbuild/linux-arm': 0.20.2 + '@esbuild/linux-arm64': 0.20.2 + '@esbuild/linux-ia32': 0.20.2 + '@esbuild/linux-loong64': 0.20.2 + '@esbuild/linux-mips64el': 0.20.2 + '@esbuild/linux-ppc64': 0.20.2 + '@esbuild/linux-riscv64': 0.20.2 + '@esbuild/linux-s390x': 0.20.2 + '@esbuild/linux-x64': 0.20.2 + '@esbuild/netbsd-x64': 0.20.2 + '@esbuild/openbsd-x64': 0.20.2 + '@esbuild/sunos-x64': 0.20.2 + '@esbuild/win32-arm64': 0.20.2 + '@esbuild/win32-ia32': 0.20.2 + '@esbuild/win32-x64': 0.20.2 + + escalade@3.1.2: {} + + escape-html@1.0.3: {} + + escape-string-regexp@1.0.5: {} + + escape-string-regexp@2.0.0: {} + + escape-string-regexp@4.0.0: {} + + eslint-config-prettier@9.1.0(eslint@8.57.0): + dependencies: + eslint: 8.57.0 + + eslint-import-resolver-node@0.3.9: + dependencies: + debug: 3.2.7 + is-core-module: 2.13.1 + resolve: 1.22.8 + transitivePeerDependencies: + - supports-color + + eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.4.5))(eslint-plugin-import@2.29.1)(eslint@8.57.0): + dependencies: + debug: 4.3.4 + enhanced-resolve: 5.16.0 + eslint: 8.57.0 + eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.4.5))(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + fast-glob: 3.3.2 + get-tsconfig: 4.7.3 + is-core-module: 2.13.1 + is-glob: 4.0.3 + transitivePeerDependencies: + - '@typescript-eslint/parser' + - eslint-import-resolver-node + - eslint-import-resolver-webpack + - supports-color + + eslint-module-utils@2.8.1(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.4.5))(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0): + dependencies: + debug: 3.2.7 + optionalDependencies: + '@typescript-eslint/parser': 7.7.0(eslint@8.57.0)(typescript@5.4.5) + eslint: 8.57.0 + eslint-import-resolver-node: 0.3.9 + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.4.5))(eslint-plugin-import@2.29.1)(eslint@8.57.0) + transitivePeerDependencies: + - supports-color + + eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0): + dependencies: + array-includes: 3.1.8 + array.prototype.findlastindex: 1.2.5 + array.prototype.flat: 1.3.2 + array.prototype.flatmap: 1.3.2 + debug: 3.2.7 + doctrine: 2.1.0 + eslint: 8.57.0 + eslint-import-resolver-node: 0.3.9 + eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.4.5))(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0) + hasown: 2.0.2 + is-core-module: 2.13.1 + is-glob: 4.0.3 + minimatch: 3.1.2 + object.fromentries: 2.0.8 + object.groupby: 1.0.3 + object.values: 1.2.0 + semver: 6.3.1 + tsconfig-paths: 3.15.0 + optionalDependencies: + '@typescript-eslint/parser': 7.7.0(eslint@8.57.0)(typescript@5.4.5) + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + + eslint-plugin-jsx-a11y@6.8.0(eslint@8.57.0): + dependencies: + '@babel/runtime': 7.24.4 + aria-query: 5.3.0 + array-includes: 3.1.8 + array.prototype.flatmap: 1.3.2 + ast-types-flow: 0.0.8 + axe-core: 4.7.0 + axobject-query: 3.2.1 + damerau-levenshtein: 1.0.8 + emoji-regex: 9.2.2 + es-iterator-helpers: 1.0.18 + eslint: 8.57.0 + hasown: 2.0.2 + jsx-ast-utils: 3.3.5 + language-tags: 1.0.9 + minimatch: 3.1.2 + object.entries: 1.1.8 + object.fromentries: 2.0.8 + + eslint-plugin-react-hooks@4.6.0(eslint@8.57.0): + dependencies: + eslint: 8.57.0 + + eslint-plugin-react-refresh@0.4.6(eslint@8.57.0): + dependencies: + eslint: 8.57.0 + + eslint-plugin-react@7.34.1(eslint@8.57.0): + dependencies: + array-includes: 3.1.8 + array.prototype.findlast: 1.2.5 + array.prototype.flatmap: 1.3.2 + array.prototype.toreversed: 1.1.2 + array.prototype.tosorted: 1.1.3 + doctrine: 2.1.0 + es-iterator-helpers: 1.0.18 + eslint: 8.57.0 + estraverse: 5.3.0 + jsx-ast-utils: 3.3.5 + minimatch: 3.1.2 + object.entries: 1.1.8 + object.fromentries: 2.0.8 + object.hasown: 1.1.4 + object.values: 1.2.0 + prop-types: 15.8.1 + resolve: 2.0.0-next.5 + semver: 6.3.1 + string.prototype.matchall: 4.0.11 + + eslint-scope@5.1.1: + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + + eslint-scope@7.2.2: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-visitor-keys@3.4.3: {} + + eslint@8.57.0: + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + '@eslint-community/regexpp': 4.10.0 + '@eslint/eslintrc': 2.1.4 + '@eslint/js': 8.57.0 + '@humanwhocodes/config-array': 0.11.14 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + '@ungap/structured-clone': 1.2.0 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.4 + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.5.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.24.0 + graphemer: 1.4.0 + ignore: 5.3.1 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.3 + strip-ansi: 6.0.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + + espree@9.6.1: + dependencies: + acorn: 8.11.3 + acorn-jsx: 5.3.2(acorn@8.11.3) + eslint-visitor-keys: 3.4.3 + + esprima@4.0.1: {} + + esquery@1.5.0: + dependencies: + estraverse: 5.3.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@4.3.0: {} + + estraverse@5.3.0: {} + + estree-walker@2.0.2: {} + + esutils@2.0.3: {} + + etag@1.8.1: {} + + eth-block-tracker@7.1.0: + dependencies: + '@metamask/eth-json-rpc-provider': 1.0.1 + '@metamask/safe-event-emitter': 3.1.1 + '@metamask/utils': 5.0.2 + json-rpc-random-id: 1.0.1 + pify: 3.0.0 + transitivePeerDependencies: + - supports-color + + eth-json-rpc-filters@6.0.1: + dependencies: + '@metamask/safe-event-emitter': 3.1.1 + async-mutex: 0.2.6 + eth-query: 2.1.2 + json-rpc-engine: 6.1.0 + pify: 5.0.0 + + eth-query@2.1.2: + dependencies: + json-rpc-random-id: 1.0.1 + xtend: 4.0.2 + + eth-rpc-errors@4.0.3: + dependencies: + fast-safe-stringify: 2.1.1 + + ethereum-blockies-base64@1.0.2: + dependencies: + pnglib: 0.0.1 + + ethereum-cryptography@2.1.3: + dependencies: + '@noble/curves': 1.3.0 + '@noble/hashes': 1.3.3 + '@scure/bip32': 1.3.3 + '@scure/bip39': 1.2.2 + + event-target-shim@5.0.1: {} + + eventemitter2@6.4.9: {} + + eventemitter3@5.0.1: {} + + events@3.3.0: {} + + evp_bytestokey@1.0.3: + dependencies: + md5.js: 1.3.5 + safe-buffer: 5.2.1 + + execa@5.1.1: + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + + execa@8.0.1: + dependencies: + cross-spawn: 7.0.3 + get-stream: 8.0.1 + human-signals: 5.0.0 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.3.0 + onetime: 6.0.0 + signal-exit: 4.1.0 + strip-final-newline: 3.0.0 + + extension-port-stream@2.1.1: + dependencies: + webextension-polyfill: 0.11.0 + transitivePeerDependencies: + - '@swc/core' + - '@webpack-cli/generators' + - esbuild + - uglify-js + - webpack-bundle-analyzer + - webpack-dev-server + + external-editor@3.1.0: + dependencies: + chardet: 0.7.0 + iconv-lite: 0.4.24 + tmp: 0.0.33 + + extract-files@11.0.0: {} + + fast-decode-uri-component@1.0.1: {} + + fast-deep-equal@2.0.1: {} + + fast-deep-equal@3.1.3: {} + + fast-glob@3.3.2: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + + fast-querystring@1.1.2: + dependencies: + fast-decode-uri-component: 1.0.1 + + fast-redact@3.5.0: {} + + fast-safe-stringify@2.1.1: {} + + fast-url-parser@1.1.3: + dependencies: + punycode: 1.4.1 + + fast-xml-parser@4.3.6: + dependencies: + strnum: 1.0.5 + + fastest-levenshtein@1.0.16: {} + + fastq@1.17.1: + dependencies: + reusify: 1.0.4 + + fb-watchman@2.0.2: + dependencies: + bser: 2.1.1 + + fbjs-css-vars@1.0.2: {} + + fbjs@3.0.5: + dependencies: + cross-fetch: 3.1.8 + fbjs-css-vars: 1.0.2 + loose-envify: 1.4.0 + object-assign: 4.1.1 + promise: 7.3.1 + setimmediate: 1.0.5 + ua-parser-js: 1.0.37 + transitivePeerDependencies: + - encoding + + fetch-blob@3.2.0: + dependencies: + node-domexception: 1.0.0 + web-streams-polyfill: 3.3.3 + + figures@3.2.0: + dependencies: + escape-string-regexp: 1.0.5 + + file-entry-cache@6.0.1: + dependencies: + flat-cache: 3.2.0 + + fill-range@7.0.1: + dependencies: + to-regex-range: 5.0.1 + + filter-obj@1.1.0: {} + + finalhandler@1.1.2: + dependencies: + debug: 2.6.9 + encodeurl: 1.0.2 + escape-html: 1.0.3 + on-finished: 2.3.0 + parseurl: 1.3.3 + statuses: 1.5.0 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + + find-cache-dir@2.1.0: + dependencies: + commondir: 1.0.1 + make-dir: 2.1.0 + pkg-dir: 3.0.0 + + find-root@1.1.0: {} + + find-up@3.0.0: + dependencies: + locate-path: 3.0.0 + + find-up@4.1.0: + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + flat-cache@3.2.0: + dependencies: + flatted: 3.3.1 + keyv: 4.5.4 + rimraf: 3.0.2 + + flat@5.0.2: {} + + flatted@3.3.1: {} + + flow-enums-runtime@0.0.6: {} + + flow-parser@0.206.0: {} + + for-each@0.3.3: + dependencies: + is-callable: 1.2.7 + + formdata-polyfill@4.0.10: + dependencies: + fetch-blob: 3.2.0 + + fresh@0.5.2: {} + + fs-extra@11.2.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + + fs-extra@8.1.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + + fs.realpath@1.0.0: {} + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + function.prototype.name@1.1.6: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + functions-have-names: 1.2.3 + + functions-have-names@1.2.3: {} + + futoin-hkdf@1.5.3: {} + + gensync@1.0.0-beta.2: {} + + get-caller-file@2.0.5: {} + + get-intrinsic@1.2.4: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + has-proto: 1.0.3 + has-symbols: 1.0.3 + hasown: 2.0.2 + + get-port-please@3.1.2: {} + + get-stream@6.0.1: {} + + get-stream@8.0.1: {} + + get-symbol-description@1.0.2: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + + get-tsconfig@4.7.3: + dependencies: + resolve-pkg-maps: 1.0.0 + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + glob-to-regexp@0.4.1: {} + + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + globals@11.12.0: {} + + globals@13.24.0: + dependencies: + type-fest: 0.20.2 + + globalthis@1.0.3: + dependencies: + define-properties: 1.2.1 + + globby@11.1.0: + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.2 + ignore: 5.3.1 + merge2: 1.4.1 + slash: 3.0.0 + + gopd@1.0.1: + dependencies: + get-intrinsic: 1.2.4 + + graceful-fs@4.2.11: {} + + graphemer@1.4.0: {} + + graphql-config@5.0.3(@types/node@20.12.7)(bufferutil@4.0.8)(graphql@16.8.1)(typescript@5.4.5)(utf-8-validate@6.0.3): + dependencies: + '@graphql-tools/graphql-file-loader': 8.0.1(graphql@16.8.1) + '@graphql-tools/json-file-loader': 8.0.1(graphql@16.8.1) + '@graphql-tools/load': 8.0.2(graphql@16.8.1) + '@graphql-tools/merge': 9.0.4(graphql@16.8.1) + '@graphql-tools/url-loader': 8.0.2(@types/node@20.12.7)(bufferutil@4.0.8)(graphql@16.8.1)(utf-8-validate@6.0.3) + '@graphql-tools/utils': 10.2.0(graphql@16.8.1) + cosmiconfig: 8.3.6(typescript@5.4.5) + graphql: 16.8.1 + jiti: 1.21.0 + minimatch: 4.2.3 + string-env-interpolation: 1.0.1 + tslib: 2.6.2 + transitivePeerDependencies: + - '@types/node' + - bufferutil + - encoding + - typescript + - utf-8-validate + + graphql-request@6.1.0(graphql@16.8.1): + dependencies: + '@graphql-typed-document-node/core': 3.2.0(graphql@16.8.1) + cross-fetch: 3.1.8 + graphql: 16.8.1 + transitivePeerDependencies: + - encoding + + graphql-tag@2.12.6(graphql@16.8.1): + dependencies: + graphql: 16.8.1 + tslib: 2.6.2 + + graphql-ws@5.16.0(graphql@16.8.1): + dependencies: + graphql: 16.8.1 + + graphql@16.8.1: {} + + h3@1.11.1: + dependencies: + cookie-es: 1.1.0 + crossws: 0.2.4 + defu: 6.1.4 + destr: 2.0.3 + iron-webcrypto: 1.1.0 + ohash: 1.1.3 + radix3: 1.1.2 + ufo: 1.5.3 + uncrypto: 0.1.3 + unenv: 1.9.0 + transitivePeerDependencies: + - uWebSockets.js + + has-bigints@1.0.2: {} + + has-flag@3.0.0: {} + + has-flag@4.0.0: {} + + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.0 + + has-proto@1.0.3: {} + + has-symbols@1.0.3: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.0.3 + + hash-base@3.0.4: + dependencies: + inherits: 2.0.4 + safe-buffer: 5.2.1 + + hash-base@3.1.0: + dependencies: + inherits: 2.0.4 + readable-stream: 3.6.2 + safe-buffer: 5.2.1 + + hash.js@1.1.7: + dependencies: + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + header-case@2.0.4: + dependencies: + capital-case: 1.0.4 + tslib: 2.6.2 + + hermes-estree@0.15.0: {} + + hermes-estree@0.20.1: {} + + hermes-parser@0.15.0: + dependencies: + hermes-estree: 0.15.0 + + hermes-parser@0.20.1: + dependencies: + hermes-estree: 0.20.1 + + hermes-profile-transformer@0.0.6: + dependencies: + source-map: 0.7.4 + + hey-listen@1.0.8: {} + + hmac-drbg@1.0.1: + dependencies: + hash.js: 1.1.7 + minimalistic-assert: 1.0.1 + minimalistic-crypto-utils: 1.0.1 + + hoist-non-react-statics@3.3.2: + dependencies: + react-is: 16.13.1 + + html-parse-stringify@3.0.1: + dependencies: + void-elements: 3.1.0 + + http-errors@2.0.0: + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + + http-proxy-agent@7.0.2: + dependencies: + agent-base: 7.1.1 + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + + http-shutdown@1.2.2: {} + + https-browserify@1.0.0: {} + + https-proxy-agent@7.0.4: + dependencies: + agent-base: 7.1.1 + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + + human-signals@2.1.0: {} + + human-signals@5.0.0: {} + + i18next-browser-languagedetector@7.2.1: + dependencies: + '@babel/runtime': 7.24.4 + + i18next@22.5.1: + dependencies: + '@babel/runtime': 7.24.4 + + iconv-lite@0.4.24: + dependencies: + safer-buffer: 2.1.2 + + idb-keyval@6.2.1: {} + + ieee754@1.2.1: {} + + ignore@5.3.1: {} + + image-size@1.1.1: + dependencies: + queue: 6.0.2 + + immutable@3.7.6: {} + + immutable@4.3.5: {} + + import-fresh@2.0.0: + dependencies: + caller-path: 2.0.0 + resolve-from: 3.0.0 + + import-fresh@3.3.0: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + import-from@4.0.0: {} + + import-local@3.1.0: + dependencies: + pkg-dir: 4.2.0 + resolve-cwd: 3.0.0 + + imurmurhash@0.1.4: {} + + indent-string@4.0.0: {} + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + + inquirer@8.2.6: + dependencies: + ansi-escapes: 4.3.2 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-width: 3.0.0 + external-editor: 3.1.0 + figures: 3.2.0 + lodash: 4.17.21 + mute-stream: 0.0.8 + ora: 5.4.1 + run-async: 2.4.1 + rxjs: 7.8.1 + string-width: 4.2.3 + strip-ansi: 6.0.1 + through: 2.3.8 + wrap-ansi: 6.2.0 + + internal-slot@1.0.7: + dependencies: + es-errors: 1.3.0 + hasown: 2.0.2 + side-channel: 1.0.6 + + interpret@3.1.1: {} + + invariant@2.2.4: + dependencies: + loose-envify: 1.4.0 + + iron-webcrypto@1.1.0: {} + + is-absolute@1.0.0: + dependencies: + is-relative: 1.0.0 + is-windows: 1.0.2 + + is-arguments@1.1.1: + dependencies: + call-bind: 1.0.7 + has-tostringtag: 1.0.2 + + is-array-buffer@3.0.4: + dependencies: + call-bind: 1.0.7 + get-intrinsic: 1.2.4 + + is-arrayish@0.2.1: {} + + is-async-function@2.0.0: + dependencies: + has-tostringtag: 1.0.2 + + is-bigint@1.0.4: + dependencies: + has-bigints: 1.0.2 + + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + + is-boolean-object@1.1.2: + dependencies: + call-bind: 1.0.7 + has-tostringtag: 1.0.2 + + is-callable@1.2.7: {} + + is-core-module@2.13.1: + dependencies: + hasown: 2.0.2 + + is-data-view@1.0.1: + dependencies: + is-typed-array: 1.1.13 + + is-date-object@1.0.5: + dependencies: + has-tostringtag: 1.0.2 + + is-directory@0.3.1: {} + + is-docker@2.2.1: {} + + is-docker@3.0.0: {} + + is-extglob@2.1.1: {} + + is-finalizationregistry@1.0.2: + dependencies: + call-bind: 1.0.7 + + is-fullwidth-code-point@2.0.0: {} + + is-fullwidth-code-point@3.0.0: {} + + is-generator-function@1.0.10: + dependencies: + has-tostringtag: 1.0.2 + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-inside-container@1.0.0: + dependencies: + is-docker: 3.0.0 + + is-interactive@1.0.0: {} + + is-lower-case@2.0.2: + dependencies: + tslib: 2.6.2 + + is-map@2.0.3: {} + + is-nan@1.3.2: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + + is-negative-zero@2.0.3: {} + + is-number-object@1.0.7: + dependencies: + has-tostringtag: 1.0.2 + + is-number@7.0.0: {} + + is-path-inside@3.0.3: {} + + is-plain-obj@2.1.0: {} + + is-plain-object@2.0.4: + dependencies: + isobject: 3.0.1 + + is-regex@1.1.4: + dependencies: + call-bind: 1.0.7 + has-tostringtag: 1.0.2 + + is-relative@1.0.0: + dependencies: + is-unc-path: 1.0.0 + + is-set@2.0.3: {} + + is-shared-array-buffer@1.0.3: + dependencies: + call-bind: 1.0.7 + + is-stream@2.0.1: {} + + is-stream@3.0.0: {} + + is-string@1.0.7: + dependencies: + has-tostringtag: 1.0.2 + + is-symbol@1.0.4: + dependencies: + has-symbols: 1.0.3 + + is-typed-array@1.1.13: + dependencies: + which-typed-array: 1.1.15 + + is-unc-path@1.0.0: + dependencies: + unc-path-regex: 0.1.2 + + is-unicode-supported@0.1.0: {} + + is-upper-case@2.0.2: + dependencies: + tslib: 2.6.2 + + is-weakmap@2.0.2: {} + + is-weakref@1.0.2: + dependencies: + call-bind: 1.0.7 + + is-weakset@2.0.3: + dependencies: + call-bind: 1.0.7 + get-intrinsic: 1.2.4 + + is-windows@1.0.2: {} + + is-wsl@1.1.0: {} + + is-wsl@2.2.0: + dependencies: + is-docker: 2.2.1 + + is-wsl@3.1.0: + dependencies: + is-inside-container: 1.0.0 + + is64bit@2.0.0: + dependencies: + system-architecture: 0.1.0 + + isarray@1.0.0: {} + + isarray@2.0.5: {} + + isexe@2.0.0: {} + + isobject@3.0.1: {} + + isomorphic-timers-promises@1.0.1: {} + + isomorphic-unfetch@3.1.0: + dependencies: + node-fetch: 2.7.0 + unfetch: 4.2.0 + transitivePeerDependencies: + - encoding + + isomorphic-ws@5.0.0(ws@8.16.0(bufferutil@4.0.8)(utf-8-validate@6.0.3)): + dependencies: + ws: 8.16.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) + + isows@1.0.3(ws@8.13.0(bufferutil@4.0.8)(utf-8-validate@6.0.3)): + dependencies: + ws: 8.13.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) + + iterator.prototype@1.1.2: + dependencies: + define-properties: 1.2.1 + get-intrinsic: 1.2.4 + has-symbols: 1.0.3 + reflect.getprototypeof: 1.0.6 + set-function-name: 2.0.2 + + jdenticon@3.2.0: + dependencies: + canvas-renderer: 2.2.1 + + jest-environment-node@29.7.0: + dependencies: + '@jest/environment': 29.7.0 + '@jest/fake-timers': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 20.12.7 + jest-mock: 29.7.0 + jest-util: 29.7.0 + + jest-get-type@29.6.3: {} + + jest-message-util@29.7.0: + dependencies: + '@babel/code-frame': 7.24.2 + '@jest/types': 29.6.3 + '@types/stack-utils': 2.0.3 + chalk: 4.1.2 + graceful-fs: 4.2.11 + micromatch: 4.0.5 + pretty-format: 29.7.0 + slash: 3.0.0 + stack-utils: 2.0.6 + + jest-mock@29.7.0: + dependencies: + '@jest/types': 29.6.3 + '@types/node': 20.12.7 + jest-util: 29.7.0 + + jest-util@29.7.0: + dependencies: + '@jest/types': 29.6.3 + '@types/node': 20.12.7 + chalk: 4.1.2 + ci-info: 3.9.0 + graceful-fs: 4.2.11 + picomatch: 2.3.1 + + jest-validate@29.7.0: + dependencies: + '@jest/types': 29.6.3 + camelcase: 6.3.0 + chalk: 4.1.2 + jest-get-type: 29.6.3 + leven: 3.1.0 + pretty-format: 29.7.0 + + jest-worker@27.5.1: + dependencies: + '@types/node': 20.12.7 + merge-stream: 2.0.0 + supports-color: 8.1.1 + + jest-worker@29.7.0: + dependencies: + '@types/node': 20.12.7 + jest-util: 29.7.0 + merge-stream: 2.0.0 + supports-color: 8.1.1 + + jiti@1.21.0: {} + + joi@17.12.3: + dependencies: + '@hapi/hoek': 9.3.0 + '@hapi/topo': 5.1.0 + '@sideway/address': 4.1.5 + '@sideway/formula': 3.0.1 + '@sideway/pinpoint': 2.0.0 + + jose@5.2.4: {} + + js-tokens@4.0.0: {} + + js-yaml@3.14.1: + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + jsc-android@250231.0.0: {} + + jsc-safe-url@0.2.4: {} + + jscodeshift@0.14.0(@babel/preset-env@7.24.4(@babel/core@7.24.4)): + dependencies: + '@babel/core': 7.24.4 + '@babel/parser': 7.24.4 + '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.24.4) + '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.24.4) + '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.24.4) + '@babel/plugin-transform-modules-commonjs': 7.24.1(@babel/core@7.24.4) + '@babel/preset-env': 7.24.4(@babel/core@7.24.4) + '@babel/preset-flow': 7.24.1(@babel/core@7.24.4) + '@babel/preset-typescript': 7.24.1(@babel/core@7.24.4) + '@babel/register': 7.23.7(@babel/core@7.24.4) + babel-core: 7.0.0-bridge.0(@babel/core@7.24.4) + chalk: 4.1.2 + flow-parser: 0.206.0 + graceful-fs: 4.2.11 + micromatch: 4.0.5 + neo-async: 2.6.2 + node-dir: 0.1.17 + recast: 0.21.5 + temp: 0.8.4 + write-file-atomic: 2.4.3 + transitivePeerDependencies: + - supports-color + + jsesc@0.5.0: {} + + jsesc@2.5.2: {} + + json-buffer@3.0.1: {} + + json-parse-better-errors@1.0.2: {} + + json-parse-even-better-errors@2.3.1: {} + + json-rpc-engine@6.1.0: + dependencies: + '@metamask/safe-event-emitter': 2.0.0 + eth-rpc-errors: 4.0.3 + + json-rpc-middleware-stream@4.2.3: + dependencies: + '@metamask/safe-event-emitter': 3.1.1 + json-rpc-engine: 6.1.0 + readable-stream: 2.3.8 + + json-rpc-random-id@1.0.1: {} + + json-schema-traverse@0.4.1: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + + json-stringify-safe@5.0.1: {} + + json-to-pretty-yaml@1.2.2: + dependencies: + remedial: 1.0.8 + remove-trailing-spaces: 1.0.8 + + json5@1.0.2: + dependencies: + minimist: 1.2.8 + + json5@2.2.3: {} + + jsonc-parser@3.2.1: {} + + jsonfile@4.0.0: + optionalDependencies: + graceful-fs: 4.2.11 + + jsonfile@6.1.0: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + + jsx-ast-utils@3.3.5: + dependencies: + array-includes: 3.1.8 + array.prototype.flat: 1.3.2 + object.assign: 4.1.5 + object.values: 1.2.0 + + keccak@3.0.4: + dependencies: + node-addon-api: 2.0.2 + node-gyp-build: 4.8.0 + readable-stream: 3.6.2 + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + keyvaluestorage-interface@1.0.0: {} + + kind-of@6.0.3: {} + + kleur@3.0.3: {} + + language-subtag-registry@0.3.22: {} + + language-tags@1.0.9: + dependencies: + language-subtag-registry: 0.3.22 + + leven@3.1.0: {} + + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + lighthouse-logger@1.4.2: + dependencies: + debug: 2.6.9 + marky: 1.2.5 + transitivePeerDependencies: + - supports-color + + lines-and-columns@1.2.4: {} + + listhen@1.7.2: + dependencies: + '@parcel/watcher': 2.4.1 + '@parcel/watcher-wasm': 2.4.1 + citty: 0.1.6 + clipboardy: 4.0.0 + consola: 3.2.3 + crossws: 0.2.4 + defu: 6.1.4 + get-port-please: 3.1.2 + h3: 1.11.1 + http-shutdown: 1.2.2 + jiti: 1.21.0 + mlly: 1.6.1 + node-forge: 1.3.1 + pathe: 1.1.2 + std-env: 3.7.0 + ufo: 1.5.3 + untun: 0.1.3 + uqr: 0.1.2 + transitivePeerDependencies: + - uWebSockets.js + + listr2@4.0.5: + dependencies: + cli-truncate: 2.1.0 + colorette: 2.0.20 + log-update: 4.0.0 + p-map: 4.0.0 + rfdc: 1.3.1 + rxjs: 7.8.1 + through: 2.3.8 + wrap-ansi: 7.0.0 + + lit-element@3.3.3: + dependencies: + '@lit-labs/ssr-dom-shim': 1.2.0 + '@lit/reactive-element': 1.6.3 + lit-html: 2.8.0 + + lit-element@4.0.5: + dependencies: + '@lit-labs/ssr-dom-shim': 1.2.0 + '@lit/reactive-element': 2.0.4 + lit-html: 3.1.3 + + lit-html@2.8.0: + dependencies: + '@types/trusted-types': 2.0.7 + + lit-html@3.1.3: + dependencies: + '@types/trusted-types': 2.0.7 + + lit@2.8.0: + dependencies: + '@lit/reactive-element': 1.6.3 + lit-element: 3.3.3 + lit-html: 2.8.0 + + lit@3.1.0: + dependencies: + '@lit/reactive-element': 2.0.4 + lit-element: 4.0.5 + lit-html: 3.1.3 + + loader-runner@4.3.0: {} + + locate-path@3.0.0: + dependencies: + p-locate: 3.0.0 + path-exists: 3.0.0 + + locate-path@5.0.0: + dependencies: + p-locate: 4.1.0 + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + lodash.debounce@4.0.8: {} + + lodash.isequal@4.5.0: {} + + lodash.merge@4.6.2: {} + + lodash.sortby@4.7.0: {} + + lodash.throttle@4.1.1: {} + + lodash@4.17.21: {} + + log-symbols@4.1.0: + dependencies: + chalk: 4.1.2 + is-unicode-supported: 0.1.0 + + log-update@4.0.0: + dependencies: + ansi-escapes: 4.3.2 + cli-cursor: 3.1.0 + slice-ansi: 4.0.0 + wrap-ansi: 6.2.0 + + logkitty@0.7.1: + dependencies: + ansi-fragments: 0.2.1 + dayjs: 1.11.10 + yargs: 15.4.1 + + loose-envify@1.4.0: + dependencies: + js-tokens: 4.0.0 + + lower-case-first@2.0.2: + dependencies: + tslib: 2.6.2 + + lower-case@2.0.2: + dependencies: + tslib: 2.6.2 + + lru-cache@10.2.0: {} + + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + + lru-cache@6.0.0: + dependencies: + yallist: 4.0.0 + + magic-string@0.30.9: + dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 + + make-dir@2.1.0: + dependencies: + pify: 4.0.1 + semver: 5.7.2 + + makeerror@1.0.12: + dependencies: + tmpl: 1.0.5 + + map-cache@0.2.2: {} + + marky@1.2.5: {} + + md5.js@1.3.5: + dependencies: + hash-base: 3.1.0 + inherits: 2.0.4 + safe-buffer: 5.2.1 + + memoize-one@5.2.1: {} + + merge-options@3.0.4: + dependencies: + is-plain-obj: 2.1.0 + + merge-stream@2.0.0: {} + + merge2@1.4.1: {} + + meros@1.3.0(@types/node@20.12.7): + optionalDependencies: + '@types/node': 20.12.7 + + metro-babel-transformer@0.80.8: + dependencies: + '@babel/core': 7.24.4 + hermes-parser: 0.20.1 + nullthrows: 1.1.1 + transitivePeerDependencies: + - supports-color + + metro-cache-key@0.80.8: {} + + metro-cache@0.80.8: + dependencies: + metro-core: 0.80.8 + rimraf: 3.0.2 + + metro-config@0.80.8(bufferutil@4.0.8)(utf-8-validate@6.0.3): + dependencies: + connect: 3.7.0 + cosmiconfig: 5.2.1 + jest-validate: 29.7.0 + metro: 0.80.8(bufferutil@4.0.8)(utf-8-validate@6.0.3) + metro-cache: 0.80.8 + metro-core: 0.80.8 + metro-runtime: 0.80.8 + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - utf-8-validate + + metro-core@0.80.8: + dependencies: + lodash.throttle: 4.1.1 + metro-resolver: 0.80.8 + + metro-file-map@0.80.8: + dependencies: + anymatch: 3.1.3 + debug: 2.6.9 + fb-watchman: 2.0.2 + graceful-fs: 4.2.11 + invariant: 2.2.4 + jest-worker: 29.7.0 + micromatch: 4.0.5 + node-abort-controller: 3.1.1 + nullthrows: 1.1.1 + walker: 1.0.8 + optionalDependencies: + fsevents: 2.3.3 + transitivePeerDependencies: + - supports-color + + metro-minify-terser@0.80.8: + dependencies: + terser: 5.30.3 + + metro-resolver@0.80.8: {} + + metro-runtime@0.80.8: + dependencies: + '@babel/runtime': 7.24.4 + + metro-source-map@0.80.8: + dependencies: + '@babel/traverse': 7.24.1 + '@babel/types': 7.24.0 + invariant: 2.2.4 + metro-symbolicate: 0.80.8 + nullthrows: 1.1.1 + ob1: 0.80.8 + source-map: 0.5.7 + vlq: 1.0.1 + transitivePeerDependencies: + - supports-color + + metro-symbolicate@0.80.8: + dependencies: + invariant: 2.2.4 + metro-source-map: 0.80.8 + nullthrows: 1.1.1 + source-map: 0.5.7 + through2: 2.0.5 + vlq: 1.0.1 + transitivePeerDependencies: + - supports-color + + metro-transform-plugins@0.80.8: + dependencies: + '@babel/core': 7.24.4 + '@babel/generator': 7.24.4 + '@babel/template': 7.24.0 + '@babel/traverse': 7.24.1 + nullthrows: 1.1.1 + transitivePeerDependencies: + - supports-color + + metro-transform-worker@0.80.8(bufferutil@4.0.8)(utf-8-validate@6.0.3): + dependencies: + '@babel/core': 7.24.4 + '@babel/generator': 7.24.4 + '@babel/parser': 7.24.4 + '@babel/types': 7.24.0 + metro: 0.80.8(bufferutil@4.0.8)(utf-8-validate@6.0.3) + metro-babel-transformer: 0.80.8 + metro-cache: 0.80.8 + metro-cache-key: 0.80.8 + metro-minify-terser: 0.80.8 + metro-source-map: 0.80.8 + metro-transform-plugins: 0.80.8 + nullthrows: 1.1.1 + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - utf-8-validate + + metro@0.80.8(bufferutil@4.0.8)(utf-8-validate@6.0.3): + dependencies: + '@babel/code-frame': 7.24.2 + '@babel/core': 7.24.4 + '@babel/generator': 7.24.4 + '@babel/parser': 7.24.4 + '@babel/template': 7.24.0 + '@babel/traverse': 7.24.1 + '@babel/types': 7.24.0 + accepts: 1.3.8 + chalk: 4.1.2 + ci-info: 2.0.0 + connect: 3.7.0 + debug: 2.6.9 + denodeify: 1.2.1 + error-stack-parser: 2.1.4 + graceful-fs: 4.2.11 + hermes-parser: 0.20.1 + image-size: 1.1.1 + invariant: 2.2.4 + jest-worker: 29.7.0 + jsc-safe-url: 0.2.4 + lodash.throttle: 4.1.1 + metro-babel-transformer: 0.80.8 + metro-cache: 0.80.8 + metro-cache-key: 0.80.8 + metro-config: 0.80.8(bufferutil@4.0.8)(utf-8-validate@6.0.3) + metro-core: 0.80.8 + metro-file-map: 0.80.8 + metro-resolver: 0.80.8 + metro-runtime: 0.80.8 + metro-source-map: 0.80.8 + metro-symbolicate: 0.80.8 + metro-transform-plugins: 0.80.8 + metro-transform-worker: 0.80.8(bufferutil@4.0.8)(utf-8-validate@6.0.3) + mime-types: 2.1.35 + node-fetch: 2.7.0 + nullthrows: 1.1.1 + rimraf: 3.0.2 + serialize-error: 2.1.0 + source-map: 0.5.7 + strip-ansi: 6.0.1 + throat: 5.0.0 + ws: 7.5.9(bufferutil@4.0.8)(utf-8-validate@6.0.3) + yargs: 17.7.2 + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - utf-8-validate + + micro-ftch@0.3.1: {} + + micromatch@4.0.5: + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + + miller-rabin@4.0.1: + dependencies: + bn.js: 4.12.0 + brorand: 1.1.0 + + mime-db@1.52.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + mime@1.6.0: {} + + mime@2.6.0: {} + + mime@3.0.0: {} + + mimic-fn@2.1.0: {} + + mimic-fn@4.0.0: {} + + minimalistic-assert@1.0.1: {} + + minimalistic-crypto-utils@1.0.1: {} + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.11 + + minimatch@4.2.3: + dependencies: + brace-expansion: 1.1.11 + + minimatch@9.0.4: + dependencies: + brace-expansion: 2.0.1 + + minimist@1.2.8: {} + + mipd@0.0.5(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.22.4): + dependencies: + viem: 1.21.4(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.22.4) + optionalDependencies: + typescript: 5.4.5 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + - zod + + mkdirp@0.5.6: + dependencies: + minimist: 1.2.8 + + mkdirp@1.0.4: {} + + mlly@1.6.1: + dependencies: + acorn: 8.11.3 + pathe: 1.1.2 + pkg-types: 1.0.3 + ufo: 1.5.3 + + mock-socket@9.3.1: {} + + motion@10.16.2: + dependencies: + '@motionone/animation': 10.17.0 + '@motionone/dom': 10.17.0 + '@motionone/svelte': 10.16.4 + '@motionone/types': 10.17.0 + '@motionone/utils': 10.17.0 + '@motionone/vue': 10.16.4 + + mri@1.2.0: {} + + ms@2.0.0: {} + + ms@2.1.2: {} + + ms@2.1.3: {} + + multiformats@9.9.0: {} + + mute-stream@0.0.8: {} + + nanoid@3.3.7: {} + + nanoid@5.0.1: {} + + natural-compare@1.4.0: {} + + negotiator@0.6.3: {} + + neo-async@2.6.2: {} + + no-case@3.0.4: + dependencies: + lower-case: 2.0.2 + tslib: 2.6.2 + + nocache@3.0.4: {} + + nock@13.5.4: + dependencies: + debug: 4.3.4 + json-stringify-safe: 5.0.1 + propagate: 2.0.1 + transitivePeerDependencies: + - supports-color + + node-abort-controller@3.1.1: {} + + node-addon-api@2.0.2: {} + + node-addon-api@5.1.0: {} + + node-addon-api@7.1.0: {} + + node-dir@0.1.17: + dependencies: + minimatch: 3.1.2 + + node-domexception@1.0.0: {} + + node-fetch-native@1.6.4: {} + + node-fetch@2.7.0: + dependencies: + whatwg-url: 5.0.0 + + node-fetch@3.3.2: + dependencies: + data-uri-to-buffer: 4.0.1 + fetch-blob: 3.2.0 + formdata-polyfill: 4.0.10 + + node-forge@1.3.1: {} + + node-gyp-build@4.8.0: {} + + node-int64@0.4.0: {} + + node-releases@2.0.14: {} + + node-stdlib-browser@1.2.0: + dependencies: + assert: 2.1.0 + browser-resolve: 2.0.0 + browserify-zlib: 0.2.0 + buffer: 5.7.1 + console-browserify: 1.2.0 + constants-browserify: 1.0.0 + create-require: 1.1.1 + crypto-browserify: 3.12.0 + domain-browser: 4.23.0 + events: 3.3.0 + https-browserify: 1.0.0 + isomorphic-timers-promises: 1.0.1 + os-browserify: 0.3.0 + path-browserify: 1.0.1 + pkg-dir: 5.0.0 + process: 0.11.10 + punycode: 1.4.1 + querystring-es3: 0.2.1 + readable-stream: 3.6.2 + stream-browserify: 3.0.0 + stream-http: 3.2.0 + string_decoder: 1.3.0 + timers-browserify: 2.0.12 + tty-browserify: 0.0.1 + url: 0.11.3 + util: 0.12.5 + vm-browserify: 1.1.2 + + node-stream-zip@1.15.0: {} + + normalize-path@2.1.1: + dependencies: + remove-trailing-separator: 1.1.0 + + normalize-path@3.0.0: {} + + npm-run-path@4.0.1: + dependencies: + path-key: 3.1.1 + + npm-run-path@5.3.0: + dependencies: + path-key: 4.0.0 + + nullthrows@1.1.1: {} + + ob1@0.80.8: {} + + obj-multiplex@1.0.0: + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + readable-stream: 2.3.8 + + object-assign@4.1.1: {} + + object-inspect@1.13.1: {} + + object-is@1.1.6: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + + object-keys@1.1.1: {} + + object.assign@4.1.5: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + has-symbols: 1.0.3 + object-keys: 1.1.1 + + object.entries@1.1.8: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 + + object.fromentries@2.0.8: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-object-atoms: 1.0.0 + + object.groupby@1.0.3: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + + object.hasown@1.1.4: + dependencies: + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-object-atoms: 1.0.0 + + object.values@1.2.0: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 + + ofetch@1.3.4: + dependencies: + destr: 2.0.3 + node-fetch-native: 1.6.4 + ufo: 1.5.3 + + ohash@1.1.3: {} + + on-exit-leak-free@0.2.0: {} + + on-finished@2.3.0: + dependencies: + ee-first: 1.1.1 + + on-finished@2.4.1: + dependencies: + ee-first: 1.1.1 + + on-headers@1.0.2: {} + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + onetime@5.1.2: + dependencies: + mimic-fn: 2.1.0 + + onetime@6.0.0: + dependencies: + mimic-fn: 4.0.0 + + open@6.4.0: + dependencies: + is-wsl: 1.1.0 + + open@7.4.2: + dependencies: + is-docker: 2.2.1 + is-wsl: 2.2.0 + + open@8.4.2: + dependencies: + define-lazy-prop: 2.0.0 + is-docker: 2.2.1 + is-wsl: 2.2.0 + + optionator@0.9.3: + dependencies: + '@aashutoshrathi/word-wrap': 1.2.6 + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + + ora@5.4.1: + dependencies: + bl: 4.1.0 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-spinners: 2.9.2 + is-interactive: 1.0.0 + is-unicode-supported: 0.1.0 + log-symbols: 4.1.0 + strip-ansi: 6.0.1 + wcwidth: 1.0.1 + + os-browserify@0.3.0: {} + + os-tmpdir@1.0.2: {} + + p-limit@2.3.0: + dependencies: + p-try: 2.2.0 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-locate@3.0.0: + dependencies: + p-limit: 2.3.0 + + p-locate@4.1.0: + dependencies: + p-limit: 2.3.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + p-map@4.0.0: + dependencies: + aggregate-error: 3.1.0 + + p-try@2.2.0: {} + + pako@1.0.11: {} + + param-case@3.0.4: + dependencies: + dot-case: 3.0.4 + tslib: 2.6.2 + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + parse-asn1@5.1.7: + dependencies: + asn1.js: 4.10.1 + browserify-aes: 1.2.0 + evp_bytestokey: 1.0.3 + hash-base: 3.0.4 + pbkdf2: 3.1.2 + safe-buffer: 5.2.1 + + parse-filepath@1.0.2: + dependencies: + is-absolute: 1.0.0 + map-cache: 0.2.2 + path-root: 0.1.1 + + parse-json@4.0.0: + dependencies: + error-ex: 1.3.2 + json-parse-better-errors: 1.0.2 + + parse-json@5.2.0: + dependencies: + '@babel/code-frame': 7.24.2 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + + parseurl@1.3.3: {} + + pascal-case@3.1.2: + dependencies: + no-case: 3.0.4 + tslib: 2.6.2 + + path-browserify@1.0.1: {} + + path-case@3.0.4: + dependencies: + dot-case: 3.0.4 + tslib: 2.6.2 + + path-exists@3.0.0: {} + + path-exists@4.0.0: {} + + path-is-absolute@1.0.1: {} + + path-key@3.1.1: {} + + path-key@4.0.0: {} + + path-parse@1.0.7: {} + + path-root-regex@0.1.2: {} + + path-root@0.1.1: + dependencies: + path-root-regex: 0.1.2 + + path-type@4.0.0: {} + + pathe@1.1.2: {} + + pbkdf2@3.1.2: + dependencies: + create-hash: 1.2.0 + create-hmac: 1.1.7 + ripemd160: 2.0.2 + safe-buffer: 5.2.1 + sha.js: 2.4.11 + + picocolors@1.0.0: {} + + picomatch@2.3.1: {} + + pify@3.0.0: {} + + pify@4.0.1: {} + + pify@5.0.0: {} + + pino-abstract-transport@0.5.0: + dependencies: + duplexify: 4.1.3 + split2: 4.2.0 + + pino-std-serializers@4.0.0: {} + + pino@7.11.0: + dependencies: + atomic-sleep: 1.0.0 + fast-redact: 3.5.0 + on-exit-leak-free: 0.2.0 + pino-abstract-transport: 0.5.0 + pino-std-serializers: 4.0.0 + process-warning: 1.0.0 + quick-format-unescaped: 4.0.4 + real-require: 0.1.0 + safe-stable-stringify: 2.4.3 + sonic-boom: 2.8.0 + thread-stream: 0.15.2 + + pirates@4.0.6: {} + + pkg-dir@3.0.0: + dependencies: + find-up: 3.0.0 + + pkg-dir@4.2.0: + dependencies: + find-up: 4.1.0 + + pkg-dir@5.0.0: + dependencies: + find-up: 5.0.0 + + pkg-types@1.0.3: + dependencies: + jsonc-parser: 3.2.1 + mlly: 1.6.1 + pathe: 1.1.2 + + pngjs@5.0.0: {} + + pnglib@0.0.1: {} + + pony-cause@2.1.11: {} + + possible-typed-array-names@1.0.0: {} + + postcss-value-parser@4.2.0: {} + + postcss@8.4.31: + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.0 + source-map-js: 1.2.0 + + postcss@8.4.38: + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.0 + source-map-js: 1.2.0 + + preact@10.20.2: {} + + prelude-ls@1.2.1: {} + + pretty-format@26.6.2: + dependencies: + '@jest/types': 26.6.2 + ansi-regex: 5.0.1 + ansi-styles: 4.3.0 + react-is: 17.0.2 + + pretty-format@29.7.0: + dependencies: + '@jest/schemas': 29.6.3 + ansi-styles: 5.2.0 + react-is: 18.2.0 + + process-nextick-args@1.0.7: {} + + process-nextick-args@2.0.1: {} + + process-warning@1.0.0: {} + + process@0.11.10: {} + + promise@7.3.1: + dependencies: + asap: 2.0.6 + + promise@8.3.0: + dependencies: + asap: 2.0.6 + + prompts@2.4.2: + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + + prop-types@15.8.1: + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react-is: 16.13.1 + + propagate@2.0.1: {} + + proxy-compare@2.5.1: {} + + public-encrypt@4.0.3: + dependencies: + bn.js: 4.12.0 + browserify-rsa: 4.1.0 + create-hash: 1.2.0 + parse-asn1: 5.1.7 + randombytes: 2.1.0 + safe-buffer: 5.2.1 + + pump@3.0.0: + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + + punycode@1.4.1: {} + + punycode@2.3.1: {} + + pvtsutils@1.3.5: + dependencies: + tslib: 2.6.2 + + pvutils@1.1.3: {} + + qr-code-styling@1.6.0-rc.1: + dependencies: + qrcode-generator: 1.4.4 + + qrcode-generator@1.4.4: {} + + qrcode-terminal-nooctal@0.12.1: {} + + qrcode@1.5.3: + dependencies: + dijkstrajs: 1.0.3 + encode-utf8: 1.0.3 + pngjs: 5.0.0 + yargs: 15.4.1 + + qs@6.12.1: + dependencies: + side-channel: 1.0.6 + + query-string@7.1.3: + dependencies: + decode-uri-component: 0.2.2 + filter-obj: 1.1.0 + split-on-first: 1.1.0 + strict-uri-encode: 2.0.0 + + querystring-es3@0.2.1: {} + + queue-microtask@1.2.3: {} + + queue@6.0.2: + dependencies: + inherits: 2.0.4 + + quick-format-unescaped@4.0.4: {} + + radix3@1.1.2: {} + + randombytes@2.1.0: + dependencies: + safe-buffer: 5.2.1 + + randomfill@1.0.4: + dependencies: + randombytes: 2.1.0 + safe-buffer: 5.2.1 + + range-parser@1.2.1: {} + + react-copy-to-clipboard@5.1.0(react@18.2.0): + dependencies: + copy-to-clipboard: 3.3.3 + prop-types: 15.8.1 + react: 18.2.0 + + react-devtools-core@4.28.5(bufferutil@4.0.8)(utf-8-validate@6.0.3): + dependencies: + shell-quote: 1.8.1 + ws: 7.5.9(bufferutil@4.0.8)(utf-8-validate@6.0.3) + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + react-dom@18.2.0(react@18.2.0): + dependencies: + loose-envify: 1.4.0 + react: 18.2.0 + scheduler: 0.23.0 + + react-hook-form@7.51.3(react@18.2.0): + dependencies: + react: 18.2.0 + + react-i18next@13.5.0(i18next@22.5.1)(react-dom@18.2.0(react@18.2.0))(react-native@0.73.6(@babel/core@7.24.4)(@babel/preset-env@7.24.4(@babel/core@7.24.4))(bufferutil@4.0.8)(react@18.2.0)(utf-8-validate@6.0.3))(react@18.2.0): + dependencies: + '@babel/runtime': 7.24.4 + html-parse-stringify: 3.0.1 + i18next: 22.5.1 + react: 18.2.0 + optionalDependencies: + react-dom: 18.2.0(react@18.2.0) + react-native: 0.73.6(@babel/core@7.24.4)(@babel/preset-env@7.24.4(@babel/core@7.24.4))(bufferutil@4.0.8)(react@18.2.0)(utf-8-validate@6.0.3) + + react-is@16.13.1: {} + + react-is@17.0.2: {} + + react-is@18.2.0: {} + + react-native-webview@11.26.1(react-native@0.73.6(@babel/core@7.24.4)(@babel/preset-env@7.24.4(@babel/core@7.24.4))(bufferutil@4.0.8)(react@18.2.0)(utf-8-validate@6.0.3))(react@18.2.0): + dependencies: + escape-string-regexp: 2.0.0 + invariant: 2.2.4 + react: 18.2.0 + react-native: 0.73.6(@babel/core@7.24.4)(@babel/preset-env@7.24.4(@babel/core@7.24.4))(bufferutil@4.0.8)(react@18.2.0)(utf-8-validate@6.0.3) + + react-native@0.73.6(@babel/core@7.24.4)(@babel/preset-env@7.24.4(@babel/core@7.24.4))(bufferutil@4.0.8)(react@18.2.0)(utf-8-validate@6.0.3): + dependencies: + '@jest/create-cache-key-function': 29.7.0 + '@react-native-community/cli': 12.3.6(bufferutil@4.0.8)(utf-8-validate@6.0.3) + '@react-native-community/cli-platform-android': 12.3.6 + '@react-native-community/cli-platform-ios': 12.3.6 + '@react-native/assets-registry': 0.73.1 + '@react-native/codegen': 0.73.3(@babel/preset-env@7.24.4(@babel/core@7.24.4)) + '@react-native/community-cli-plugin': 0.73.17(@babel/core@7.24.4)(@babel/preset-env@7.24.4(@babel/core@7.24.4))(bufferutil@4.0.8)(utf-8-validate@6.0.3) + '@react-native/gradle-plugin': 0.73.4 + '@react-native/js-polyfills': 0.73.1 + '@react-native/normalize-colors': 0.73.2 + '@react-native/virtualized-lists': 0.73.4(react-native@0.73.6(@babel/core@7.24.4)(@babel/preset-env@7.24.4(@babel/core@7.24.4))(bufferutil@4.0.8)(react@18.2.0)(utf-8-validate@6.0.3)) + abort-controller: 3.0.0 + anser: 1.4.10 + ansi-regex: 5.0.1 + base64-js: 1.5.1 + chalk: 4.1.2 + deprecated-react-native-prop-types: 5.0.0 + event-target-shim: 5.0.1 + flow-enums-runtime: 0.0.6 + invariant: 2.2.4 + jest-environment-node: 29.7.0 + jsc-android: 250231.0.0 + memoize-one: 5.2.1 + metro-runtime: 0.80.8 + metro-source-map: 0.80.8 + mkdirp: 0.5.6 + nullthrows: 1.1.1 + pretty-format: 26.6.2 + promise: 8.3.0 + react: 18.2.0 + react-devtools-core: 4.28.5(bufferutil@4.0.8)(utf-8-validate@6.0.3) + react-refresh: 0.14.0 + react-shallow-renderer: 16.15.0(react@18.2.0) + regenerator-runtime: 0.13.11 + scheduler: 0.24.0-canary-efb381bbf-20230505 + stacktrace-parser: 0.1.10 + whatwg-fetch: 3.6.20 + ws: 6.2.2(bufferutil@4.0.8)(utf-8-validate@6.0.3) + yargs: 17.7.2 + transitivePeerDependencies: + - '@babel/core' + - '@babel/preset-env' + - bufferutil + - encoding + - supports-color + - utf-8-validate + + react-number-format@5.3.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + dependencies: + prop-types: 15.8.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + + react-refresh@0.14.0: {} + + react-router-dom@6.22.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + dependencies: + '@remix-run/router': 1.15.3 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-router: 6.22.3(react@18.2.0) + + react-router@6.22.3(react@18.2.0): + dependencies: + '@remix-run/router': 1.15.3 + react: 18.2.0 + + react-shallow-renderer@16.15.0(react@18.2.0): + dependencies: + object-assign: 4.1.1 + react: 18.2.0 + react-is: 18.2.0 + + react-transition-group@4.4.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + dependencies: + '@babel/runtime': 7.24.4 + dom-helpers: 5.2.1 + loose-envify: 1.4.0 + prop-types: 15.8.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + + react@18.2.0: + dependencies: + loose-envify: 1.4.0 + + readable-stream@2.3.3: + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 1.0.7 + safe-buffer: 5.1.2 + string_decoder: 1.0.3 + util-deprecate: 1.0.2 + + readable-stream@2.3.8: + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + readdirp@3.6.0: + dependencies: + picomatch: 2.3.1 + + readline@1.3.0: {} + + real-require@0.1.0: {} + + recast@0.21.5: + dependencies: + ast-types: 0.15.2 + esprima: 4.0.1 + source-map: 0.6.1 + tslib: 2.6.2 + + rechoir@0.8.0: + dependencies: + resolve: 1.22.8 + + reflect.getprototypeof@1.0.6: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + globalthis: 1.0.3 + which-builtin-type: 1.1.3 + + regenerate-unicode-properties@10.1.1: + dependencies: + regenerate: 1.4.2 + + regenerate@1.4.2: {} + + regenerator-runtime@0.13.11: {} + + regenerator-runtime@0.14.1: {} + + regenerator-transform@0.15.2: + dependencies: + '@babel/runtime': 7.24.4 + + regexp.prototype.flags@1.5.2: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-errors: 1.3.0 + set-function-name: 2.0.2 + + regexpu-core@5.3.2: + dependencies: + '@babel/regjsgen': 0.8.0 + regenerate: 1.4.2 + 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 + + regjsparser@0.9.1: + dependencies: + jsesc: 0.5.0 + + relay-runtime@12.0.0: + dependencies: + '@babel/runtime': 7.24.4 + fbjs: 3.0.5 + invariant: 2.2.4 + transitivePeerDependencies: + - encoding + + remedial@1.0.8: {} + + remove-trailing-separator@1.1.0: {} + + remove-trailing-spaces@1.0.8: {} + + require-directory@2.1.1: {} + + require-main-filename@2.0.0: {} + + resolve-cwd@3.0.0: + dependencies: + resolve-from: 5.0.0 + + resolve-from@3.0.0: {} + + resolve-from@4.0.0: {} + + resolve-from@5.0.0: {} + + resolve-pkg-maps@1.0.0: {} + + resolve@1.22.8: + dependencies: + is-core-module: 2.13.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + resolve@2.0.0-next.5: + dependencies: + is-core-module: 2.13.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + restore-cursor@3.1.0: + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + + reusify@1.0.4: {} + + rfdc@1.3.1: {} + + rimraf@2.6.3: + dependencies: + glob: 7.2.3 + + rimraf@3.0.2: + dependencies: + glob: 7.2.3 + + ripemd160@2.0.2: + dependencies: + hash-base: 3.1.0 + inherits: 2.0.4 + + rollup-plugin-visualizer@5.12.0(rollup@4.14.3): + dependencies: + open: 8.4.2 + picomatch: 2.3.1 + source-map: 0.7.4 + yargs: 17.7.2 + optionalDependencies: + rollup: 4.14.3 + + rollup@4.14.3: + dependencies: + '@types/estree': 1.0.5 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.14.3 + '@rollup/rollup-android-arm64': 4.14.3 + '@rollup/rollup-darwin-arm64': 4.14.3 + '@rollup/rollup-darwin-x64': 4.14.3 + '@rollup/rollup-linux-arm-gnueabihf': 4.14.3 + '@rollup/rollup-linux-arm-musleabihf': 4.14.3 + '@rollup/rollup-linux-arm64-gnu': 4.14.3 + '@rollup/rollup-linux-arm64-musl': 4.14.3 + '@rollup/rollup-linux-powerpc64le-gnu': 4.14.3 + '@rollup/rollup-linux-riscv64-gnu': 4.14.3 + '@rollup/rollup-linux-s390x-gnu': 4.14.3 + '@rollup/rollup-linux-x64-gnu': 4.14.3 + '@rollup/rollup-linux-x64-musl': 4.14.3 + '@rollup/rollup-win32-arm64-msvc': 4.14.3 + '@rollup/rollup-win32-ia32-msvc': 4.14.3 + '@rollup/rollup-win32-x64-msvc': 4.14.3 + fsevents: 2.3.3 + + run-async@2.4.1: {} + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + rxjs@7.8.1: + dependencies: + tslib: 2.6.2 + + safe-array-concat@1.1.2: + dependencies: + call-bind: 1.0.7 + get-intrinsic: 1.2.4 + has-symbols: 1.0.3 + isarray: 2.0.5 + + safe-buffer@5.1.2: {} + + safe-buffer@5.2.1: {} + + safe-regex-test@1.0.3: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-regex: 1.1.4 + + safe-stable-stringify@2.4.3: {} + + safer-buffer@2.1.2: {} + + sails-js@0.1.4(@gear-js/api@0.38.1(@polkadot/api@11.0.2(bufferutil@4.0.8)(utf-8-validate@6.0.3))(@polkadot/wasm-crypto@7.3.2(@polkadot/util@12.6.2)(@polkadot/x-randomvalues@12.6.2(@polkadot/util@12.6.2)(@polkadot/wasm-util@7.3.2(@polkadot/util@12.6.2))))(rxjs@7.8.1))(@polkadot/api@11.0.2(bufferutil@4.0.8)(utf-8-validate@6.0.3))(@polkadot/types@11.0.2): + dependencies: + '@gear-js/api': 0.38.1(@polkadot/api@11.0.2(bufferutil@4.0.8)(utf-8-validate@6.0.3))(@polkadot/wasm-crypto@7.3.2(@polkadot/util@12.6.2)(@polkadot/x-randomvalues@12.6.2(@polkadot/util@12.6.2)(@polkadot/wasm-util@7.3.2(@polkadot/util@12.6.2))))(rxjs@7.8.1) + '@polkadot/api': 11.0.2(bufferutil@4.0.8)(utf-8-validate@6.0.3) + '@polkadot/types': 11.0.2 + commander: 12.0.0 + + sass@1.75.0: + dependencies: + chokidar: 3.6.0 + immutable: 4.3.5 + source-map-js: 1.2.0 + + scale-ts@1.6.0: {} + + scheduler@0.23.0: + dependencies: + loose-envify: 1.4.0 + + scheduler@0.24.0-canary-efb381bbf-20230505: + dependencies: + loose-envify: 1.4.0 + + schema-utils@3.3.0: + dependencies: + '@types/json-schema': 7.0.15 + ajv: 6.12.6 + ajv-keywords: 3.5.2(ajv@6.12.6) + + scuid@1.1.0: {} + + secp256k1@5.0.0: + dependencies: + elliptic: 6.5.5 + node-addon-api: 5.1.0 + node-gyp-build: 4.8.0 + + semver@5.7.2: {} + + semver@6.3.1: {} + + semver@7.6.0: + dependencies: + lru-cache: 6.0.0 + + send@0.18.0: + dependencies: + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 0.5.2 + http-errors: 2.0.0 + mime: 1.6.0 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.1 + transitivePeerDependencies: + - supports-color + + sentence-case@3.0.4: + dependencies: + no-case: 3.0.4 + tslib: 2.6.2 + upper-case-first: 2.0.2 + + serialize-error@2.1.0: {} + + serialize-javascript@6.0.2: + dependencies: + randombytes: 2.1.0 + + serve-static@1.15.0: + dependencies: + encodeurl: 1.0.2 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 0.18.0 + transitivePeerDependencies: + - supports-color + + set-blocking@2.0.0: {} + + set-function-length@1.2.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + gopd: 1.0.1 + has-property-descriptors: 1.0.2 + + set-function-name@2.0.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.2 + + setimmediate@1.0.5: {} + + setprototypeof@1.2.0: {} + + sha.js@2.4.11: + dependencies: + inherits: 2.0.4 + safe-buffer: 5.2.1 + + shallow-clone@3.0.1: + dependencies: + kind-of: 6.0.3 + + shallowequal@1.1.0: {} + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + shell-quote@1.8.1: {} + + side-channel@1.0.6: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + object-inspect: 1.13.1 + + signal-exit@3.0.7: {} + + signal-exit@4.1.0: {} + + signedsource@1.0.0: {} + + sisteransi@1.0.5: {} + + slash@3.0.0: {} + + slice-ansi@2.1.0: + dependencies: + ansi-styles: 3.2.1 + astral-regex: 1.0.0 + is-fullwidth-code-point: 2.0.0 + + slice-ansi@3.0.0: + dependencies: + ansi-styles: 4.3.0 + astral-regex: 2.0.0 + is-fullwidth-code-point: 3.0.0 + + slice-ansi@4.0.0: + dependencies: + ansi-styles: 4.3.0 + astral-regex: 2.0.0 + is-fullwidth-code-point: 3.0.0 + + smoldot@2.0.22(bufferutil@4.0.8)(utf-8-validate@6.0.3): + dependencies: + ws: 8.16.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + snake-case@3.0.4: + dependencies: + dot-case: 3.0.4 + tslib: 2.6.2 + + socket.io-client@4.7.5(bufferutil@4.0.8)(utf-8-validate@6.0.3): + dependencies: + '@socket.io/component-emitter': 3.1.1 + debug: 4.3.4 + engine.io-client: 6.5.3(bufferutil@4.0.8)(utf-8-validate@6.0.3) + socket.io-parser: 4.2.4 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + socket.io-parser@4.2.4: + dependencies: + '@socket.io/component-emitter': 3.1.1 + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + + sonic-boom@2.8.0: + dependencies: + atomic-sleep: 1.0.0 + + source-map-js@1.2.0: {} + + source-map-support@0.5.21: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map@0.5.7: {} + + source-map@0.6.1: {} + + source-map@0.7.4: {} + + split-on-first@1.1.0: {} + + split2@4.2.0: {} + + sponge-case@1.0.1: + dependencies: + tslib: 2.6.2 + + sprintf-js@1.0.3: {} + + stack-utils@2.0.6: + dependencies: + escape-string-regexp: 2.0.0 + + stackframe@1.3.4: {} + + stacktrace-parser@0.1.10: + dependencies: + type-fest: 0.7.1 + + statuses@1.5.0: {} + + statuses@2.0.1: {} + + std-env@3.7.0: {} + + store@2.0.12: {} + + stream-browserify@3.0.0: + dependencies: + inherits: 2.0.4 + readable-stream: 3.6.2 + + stream-http@3.2.0: + dependencies: + builtin-status-codes: 3.0.0 + inherits: 2.0.4 + readable-stream: 3.6.2 + xtend: 4.0.2 + + stream-shift@1.0.3: {} + + streamsearch@1.1.0: {} + + strict-uri-encode@2.0.0: {} + + string-env-interpolation@1.0.1: {} + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string.prototype.matchall@4.0.11: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + get-intrinsic: 1.2.4 + gopd: 1.0.1 + has-symbols: 1.0.3 + internal-slot: 1.0.7 + regexp.prototype.flags: 1.5.2 + set-function-name: 2.0.2 + side-channel: 1.0.6 + + string.prototype.trim@1.2.9: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-object-atoms: 1.0.0 + + string.prototype.trimend@1.0.8: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 + + string.prototype.trimstart@1.0.8: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 + + string_decoder@1.0.3: + dependencies: + safe-buffer: 5.1.2 + + string_decoder@1.1.1: + dependencies: + safe-buffer: 5.1.2 + + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + + strip-ansi@5.2.0: + dependencies: + ansi-regex: 4.1.1 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-bom@3.0.0: {} + + strip-final-newline@2.0.0: {} + + strip-final-newline@3.0.0: {} + + strip-json-comments@3.1.1: {} + + strnum@1.0.5: {} + + styled-components@6.1.8(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + dependencies: + '@emotion/is-prop-valid': 1.2.1 + '@emotion/unitless': 0.8.0 + '@types/stylis': 4.2.0 + css-to-react-native: 3.2.0 + csstype: 3.1.2 + postcss: 8.4.31 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + shallowequal: 1.1.0 + stylis: 4.3.1 + tslib: 2.5.0 + + stylis@4.2.0: {} + + stylis@4.3.1: {} + + sudo-prompt@9.2.1: {} + + superstruct@1.0.4: {} + + supports-color@5.5.0: + dependencies: + has-flag: 3.0.0 + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-color@8.1.1: + dependencies: + has-flag: 4.0.0 + + supports-preserve-symlinks-flag@1.0.0: {} + + svg-parser@2.0.4: {} + + swap-case@2.0.2: + dependencies: + tslib: 2.6.2 + + system-architecture@0.1.0: {} + + tapable@2.2.1: {} + + temp-dir@2.0.0: {} + + temp@0.8.4: + dependencies: + rimraf: 2.6.3 + + terser-webpack-plugin@5.3.10(webpack@5.91.0(webpack-cli@5.1.4)): + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + jest-worker: 27.5.1 + schema-utils: 3.3.0 + serialize-javascript: 6.0.2 + terser: 5.30.3 + webpack: 5.91.0(webpack-cli@5.1.4) + + terser@5.30.3: + dependencies: + '@jridgewell/source-map': 0.3.6 + acorn: 8.11.3 + commander: 2.20.3 + source-map-support: 0.5.21 + + text-table@0.2.0: {} + + thread-stream@0.15.2: + dependencies: + real-require: 0.1.0 + + throat@5.0.0: {} + + through2@2.0.5: + dependencies: + readable-stream: 2.3.8 + xtend: 4.0.2 + + through@2.3.8: {} + + timers-browserify@2.0.12: + dependencies: + setimmediate: 1.0.5 + + tiny-invariant@1.3.3: {} + + title-case@3.0.3: + dependencies: + tslib: 2.6.2 + + tmp@0.0.33: + dependencies: + os-tmpdir: 1.0.2 + + tmpl@1.0.5: {} + + to-fast-properties@2.0.0: {} + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + toggle-selection@1.0.6: {} + + toidentifier@1.0.1: {} + + tr46@0.0.3: {} + + ts-api-utils@1.3.0(typescript@5.4.5): + dependencies: + typescript: 5.4.5 + + ts-log@2.2.5: {} + + tsconfig-paths@3.15.0: + dependencies: + '@types/json5': 0.0.29 + json5: 1.0.2 + minimist: 1.2.8 + strip-bom: 3.0.0 + + tslib@1.14.1: {} + + tslib@2.5.0: {} + + tslib@2.6.2: {} + + tty-browserify@0.0.1: {} + + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + type-detect@4.0.8: {} + + type-fest@0.20.2: {} + + type-fest@0.21.3: {} + + type-fest@0.7.1: {} + + typed-array-buffer@1.0.2: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-typed-array: 1.1.13 + + typed-array-byte-length@1.0.1: + dependencies: + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-proto: 1.0.3 + is-typed-array: 1.1.13 + + typed-array-byte-offset@1.0.2: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-proto: 1.0.3 + is-typed-array: 1.1.13 + + typed-array-length@1.0.6: + dependencies: + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-proto: 1.0.3 + is-typed-array: 1.1.13 + possible-typed-array-names: 1.0.0 + + typescript@5.4.5: {} + + ua-parser-js@1.0.37: {} + + ufo@1.5.3: {} + + uint8arrays@3.1.0: + dependencies: + multiformats: 9.9.0 + + uint8arrays@3.1.1: + dependencies: + multiformats: 9.9.0 + + unbox-primitive@1.0.2: + dependencies: + call-bind: 1.0.7 + has-bigints: 1.0.2 + has-symbols: 1.0.3 + which-boxed-primitive: 1.0.2 + + unc-path-regex@0.1.2: {} + + uncrypto@0.1.3: {} + + undici-types@5.26.5: {} + + unenv@1.9.0: + dependencies: + consola: 3.2.3 + defu: 6.1.4 + mime: 3.0.0 + node-fetch-native: 1.6.4 + pathe: 1.1.2 + + unfetch@4.2.0: {} + + unicode-canonical-property-names-ecmascript@2.0.0: {} + + unicode-match-property-ecmascript@2.0.0: + dependencies: + unicode-canonical-property-names-ecmascript: 2.0.0 + unicode-property-aliases-ecmascript: 2.1.0 + + unicode-match-property-value-ecmascript@2.1.0: {} + + unicode-property-aliases-ecmascript@2.1.0: {} + + universalify@0.1.2: {} + + universalify@2.0.1: {} + + unixify@1.0.0: + dependencies: + normalize-path: 2.1.1 + + unpipe@1.0.0: {} + + unstorage@1.10.2(idb-keyval@6.2.1): + dependencies: + anymatch: 3.1.3 + chokidar: 3.6.0 + destr: 2.0.3 + h3: 1.11.1 + listhen: 1.7.2 + lru-cache: 10.2.0 + mri: 1.2.0 + node-fetch-native: 1.6.4 + ofetch: 1.3.4 + ufo: 1.5.3 + optionalDependencies: + idb-keyval: 6.2.1 + transitivePeerDependencies: + - uWebSockets.js + + untun@0.1.3: + dependencies: + citty: 0.1.6 + consola: 3.2.3 + pathe: 1.1.2 + + update-browserslist-db@1.0.13(browserslist@4.23.0): + dependencies: + browserslist: 4.23.0 + escalade: 3.1.2 + picocolors: 1.0.0 + + upper-case-first@2.0.2: + dependencies: + tslib: 2.6.2 + + upper-case@2.0.2: + dependencies: + tslib: 2.6.2 + + uqr@0.1.2: {} + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + url@0.11.3: + dependencies: + punycode: 1.4.1 + qs: 6.12.1 + + urlpattern-polyfill@10.0.0: {} + + urlpattern-polyfill@8.0.2: {} + + use-sync-external-store@1.2.0(react@18.2.0): + dependencies: + react: 18.2.0 + + utf-8-validate@6.0.3: + dependencies: + node-gyp-build: 4.8.0 + + util-deprecate@1.0.2: {} + + util@0.12.5: + dependencies: + inherits: 2.0.4 + is-arguments: 1.1.1 + is-generator-function: 1.0.10 + is-typed-array: 1.1.13 + which-typed-array: 1.1.15 + + utils-merge@1.0.1: {} + + uuid@8.3.2: {} + + uuid@9.0.1: {} + + valtio@1.11.2(@types/react@18.2.79)(react@18.2.0): + dependencies: + proxy-compare: 2.5.1 + use-sync-external-store: 1.2.0(react@18.2.0) + optionalDependencies: + '@types/react': 18.2.79 + react: 18.2.0 + + value-or-promise@1.0.12: {} + + vary@1.1.2: {} + + viem@1.21.4(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.22.4): + dependencies: + '@adraffy/ens-normalize': 1.10.0 + '@noble/curves': 1.2.0 + '@noble/hashes': 1.3.2 + '@scure/bip32': 1.3.2 + '@scure/bip39': 1.2.1 + abitype: 0.9.8(typescript@5.4.5)(zod@3.22.4) + isows: 1.0.3(ws@8.13.0(bufferutil@4.0.8)(utf-8-validate@6.0.3)) + ws: 8.13.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) + optionalDependencies: + typescript: 5.4.5 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + - zod + + viem@2.9.19(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.22.4): + dependencies: + '@adraffy/ens-normalize': 1.10.0 + '@noble/curves': 1.2.0 + '@noble/hashes': 1.3.2 + '@scure/bip32': 1.3.2 + '@scure/bip39': 1.2.1 + abitype: 1.0.0(typescript@5.4.5)(zod@3.22.4) + isows: 1.0.3(ws@8.13.0(bufferutil@4.0.8)(utf-8-validate@6.0.3)) + ws: 8.13.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) + optionalDependencies: + typescript: 5.4.5 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + - zod + + vite-plugin-checker@0.6.4(eslint@8.57.0)(optionator@0.9.3)(typescript@5.4.5)(vite@5.2.8(@types/node@20.12.7)(sass@1.75.0)(terser@5.30.3)): + dependencies: + '@babel/code-frame': 7.24.2 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + chokidar: 3.6.0 + commander: 8.3.0 + fast-glob: 3.3.2 + fs-extra: 11.2.0 + npm-run-path: 4.0.1 + semver: 7.6.0 + strip-ansi: 6.0.1 + tiny-invariant: 1.3.3 + vite: 5.2.8(@types/node@20.12.7)(sass@1.75.0)(terser@5.30.3) + vscode-languageclient: 7.0.0 + vscode-languageserver: 7.0.0 + vscode-languageserver-textdocument: 1.0.11 + vscode-uri: 3.0.8 + optionalDependencies: + eslint: 8.57.0 + optionator: 0.9.3 + typescript: 5.4.5 + + vite-plugin-node-polyfills@0.21.0(rollup@4.14.3)(vite@5.2.8(@types/node@20.12.7)(sass@1.75.0)(terser@5.30.3)): + dependencies: + '@rollup/plugin-inject': 5.0.5(rollup@4.14.3) + node-stdlib-browser: 1.2.0 + vite: 5.2.8(@types/node@20.12.7)(sass@1.75.0)(terser@5.30.3) + transitivePeerDependencies: + - rollup + + vite-plugin-svgr@4.2.0(rollup@4.14.3)(typescript@5.4.5)(vite@5.2.8(@types/node@20.12.7)(sass@1.75.0)(terser@5.30.3)): + dependencies: + '@rollup/pluginutils': 5.1.0(rollup@4.14.3) + '@svgr/core': 8.1.0(typescript@5.4.5) + '@svgr/plugin-jsx': 8.1.0(@svgr/core@8.1.0(typescript@5.4.5)) + vite: 5.2.8(@types/node@20.12.7)(sass@1.75.0)(terser@5.30.3) + transitivePeerDependencies: + - rollup + - supports-color + - typescript + + vite@5.2.8(@types/node@20.12.7)(sass@1.75.0)(terser@5.30.3): + dependencies: + esbuild: 0.20.2 + postcss: 8.4.38 + rollup: 4.14.3 + optionalDependencies: + '@types/node': 20.12.7 + fsevents: 2.3.3 + sass: 1.75.0 + terser: 5.30.3 + + vlq@1.0.1: {} + + vm-browserify@1.1.2: {} + + void-elements@3.1.0: {} + + vscode-jsonrpc@6.0.0: {} + + vscode-languageclient@7.0.0: + dependencies: + minimatch: 3.1.2 + semver: 7.6.0 + vscode-languageserver-protocol: 3.16.0 + + vscode-languageserver-protocol@3.16.0: + dependencies: + vscode-jsonrpc: 6.0.0 + vscode-languageserver-types: 3.16.0 + + vscode-languageserver-textdocument@1.0.11: {} + + vscode-languageserver-types@3.16.0: {} + + vscode-languageserver@7.0.0: + dependencies: + vscode-languageserver-protocol: 3.16.0 + + vscode-uri@3.0.8: {} + + wagmi@2.5.20(@react-native-async-storage/async-storage@1.23.1(react-native@0.73.6(@babel/core@7.24.4)(@babel/preset-env@7.24.4(@babel/core@7.24.4))(bufferutil@4.0.8)(react@18.2.0)(utf-8-validate@6.0.3)))(@tanstack/query-core@5.40.0)(@tanstack/react-query@5.40.0(react@18.2.0))(@types/react@18.2.79)(bufferutil@4.0.8)(react-dom@18.2.0(react@18.2.0))(react-native@0.73.6(@babel/core@7.24.4)(@babel/preset-env@7.24.4(@babel/core@7.24.4))(bufferutil@4.0.8)(react@18.2.0)(utf-8-validate@6.0.3))(react@18.2.0)(rollup@4.14.3)(typescript@5.4.5)(utf-8-validate@6.0.3)(viem@2.9.19(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.22.4))(zod@3.22.4): + dependencies: + '@tanstack/react-query': 5.40.0(react@18.2.0) + '@wagmi/connectors': 4.1.26(@react-native-async-storage/async-storage@1.23.1(react-native@0.73.6(@babel/core@7.24.4)(@babel/preset-env@7.24.4(@babel/core@7.24.4))(bufferutil@4.0.8)(react@18.2.0)(utf-8-validate@6.0.3)))(@types/react@18.2.79)(@wagmi/core@2.6.17(@tanstack/query-core@5.40.0)(@types/react@18.2.79)(bufferutil@4.0.8)(react@18.2.0)(typescript@5.4.5)(utf-8-validate@6.0.3)(viem@2.9.19(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.22.4))(zod@3.22.4))(bufferutil@4.0.8)(react-dom@18.2.0(react@18.2.0))(react-native@0.73.6(@babel/core@7.24.4)(@babel/preset-env@7.24.4(@babel/core@7.24.4))(bufferutil@4.0.8)(react@18.2.0)(utf-8-validate@6.0.3))(react@18.2.0)(rollup@4.14.3)(typescript@5.4.5)(utf-8-validate@6.0.3)(viem@2.9.19(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.22.4))(zod@3.22.4) + '@wagmi/core': 2.6.17(@tanstack/query-core@5.40.0)(@types/react@18.2.79)(bufferutil@4.0.8)(react@18.2.0)(typescript@5.4.5)(utf-8-validate@6.0.3)(viem@2.9.19(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.22.4))(zod@3.22.4) + react: 18.2.0 + use-sync-external-store: 1.2.0(react@18.2.0) + viem: 2.9.19(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.22.4) + optionalDependencies: + typescript: 5.4.5 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@swc/core' + - '@tanstack/query-core' + - '@types/react' + - '@upstash/redis' + - '@vercel/kv' + - '@webpack-cli/generators' + - bufferutil + - encoding + - esbuild + - immer + - ioredis + - react-dom + - react-native + - rollup + - supports-color + - uWebSockets.js + - uglify-js + - utf-8-validate + - webpack-bundle-analyzer + - webpack-dev-server + - zod + + walker@1.0.8: + dependencies: + makeerror: 1.0.12 + + watchpack@2.4.1: + dependencies: + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + + wcwidth@1.0.1: + dependencies: + defaults: 1.0.4 + + web-streams-polyfill@3.3.3: {} + + webcrypto-core@1.7.9: + dependencies: + '@peculiar/asn1-schema': 2.3.8 + '@peculiar/json-schema': 1.1.12 + asn1js: 3.0.5 + pvtsutils: 1.3.5 + tslib: 2.6.2 + + webextension-polyfill-ts@0.25.0: + dependencies: + webextension-polyfill: 0.7.0 + + webextension-polyfill@0.11.0: + dependencies: + webpack: 5.91.0(webpack-cli@5.1.4) + webpack-cli: 5.1.4(webpack@5.91.0) + transitivePeerDependencies: + - '@swc/core' + - '@webpack-cli/generators' + - esbuild + - uglify-js + - webpack-bundle-analyzer + - webpack-dev-server + + webextension-polyfill@0.7.0: {} + + webidl-conversions@3.0.1: {} + + webpack-cli@5.1.4(webpack@5.91.0): + dependencies: + '@discoveryjs/json-ext': 0.5.7 + '@webpack-cli/configtest': 2.1.1(webpack-cli@5.1.4(webpack@5.91.0))(webpack@5.91.0(webpack-cli@5.1.4)) + '@webpack-cli/info': 2.0.2(webpack-cli@5.1.4(webpack@5.91.0))(webpack@5.91.0(webpack-cli@5.1.4)) + '@webpack-cli/serve': 2.0.5(webpack-cli@5.1.4(webpack@5.91.0))(webpack@5.91.0(webpack-cli@5.1.4)) + colorette: 2.0.20 + commander: 10.0.1 + cross-spawn: 7.0.3 + envinfo: 7.12.0 + fastest-levenshtein: 1.0.16 + import-local: 3.1.0 + interpret: 3.1.1 + rechoir: 0.8.0 + webpack: 5.91.0(webpack-cli@5.1.4) + webpack-merge: 5.10.0 + + webpack-merge@5.10.0: + dependencies: + clone-deep: 4.0.1 + flat: 5.0.2 + wildcard: 2.0.1 + + webpack-sources@3.2.3: {} + + webpack@5.91.0(webpack-cli@5.1.4): + dependencies: + '@types/eslint-scope': 3.7.7 + '@types/estree': 1.0.5 + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/wasm-edit': 1.12.1 + '@webassemblyjs/wasm-parser': 1.12.1 + acorn: 8.11.3 + acorn-import-assertions: 1.9.0(acorn@8.11.3) + browserslist: 4.23.0 + chrome-trace-event: 1.0.3 + enhanced-resolve: 5.16.0 + es-module-lexer: 1.5.0 + eslint-scope: 5.1.1 + events: 3.3.0 + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + json-parse-even-better-errors: 2.3.1 + loader-runner: 4.3.0 + mime-types: 2.1.35 + neo-async: 2.6.2 + schema-utils: 3.3.0 + tapable: 2.2.1 + terser-webpack-plugin: 5.3.10(webpack@5.91.0(webpack-cli@5.1.4)) + watchpack: 2.4.1 + webpack-sources: 3.2.3 + optionalDependencies: + webpack-cli: 5.1.4(webpack@5.91.0) + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + + whatwg-fetch@3.6.20: {} + + whatwg-url@5.0.0: + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + + which-boxed-primitive@1.0.2: + dependencies: + is-bigint: 1.0.4 + is-boolean-object: 1.1.2 + is-number-object: 1.0.7 + is-string: 1.0.7 + is-symbol: 1.0.4 + + which-builtin-type@1.1.3: + dependencies: + function.prototype.name: 1.1.6 + has-tostringtag: 1.0.2 + is-async-function: 2.0.0 + is-date-object: 1.0.5 + is-finalizationregistry: 1.0.2 + is-generator-function: 1.0.10 + is-regex: 1.1.4 + is-weakref: 1.0.2 + isarray: 2.0.5 + which-boxed-primitive: 1.0.2 + which-collection: 1.0.2 + which-typed-array: 1.1.15 + + which-collection@1.0.2: + dependencies: + is-map: 2.0.3 + is-set: 2.0.3 + is-weakmap: 2.0.2 + is-weakset: 2.0.3 + + which-module@2.0.1: {} + + which-typed-array@1.1.15: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-tostringtag: 1.0.2 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + wildcard@2.0.1: {} + + wrap-ansi@6.2.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrappy@1.0.2: {} + + write-file-atomic@2.4.3: + dependencies: + graceful-fs: 4.2.11 + imurmurhash: 0.1.4 + signal-exit: 3.0.7 + + ws@6.2.2(bufferutil@4.0.8)(utf-8-validate@6.0.3): + dependencies: + async-limiter: 1.0.1 + optionalDependencies: + bufferutil: 4.0.8 + utf-8-validate: 6.0.3 + + ws@7.5.9(bufferutil@4.0.8)(utf-8-validate@6.0.3): + optionalDependencies: + bufferutil: 4.0.8 + utf-8-validate: 6.0.3 + + ws@8.11.0(bufferutil@4.0.8)(utf-8-validate@6.0.3): + optionalDependencies: + bufferutil: 4.0.8 + utf-8-validate: 6.0.3 + + ws@8.13.0(bufferutil@4.0.8)(utf-8-validate@6.0.3): + optionalDependencies: + bufferutil: 4.0.8 + utf-8-validate: 6.0.3 + + ws@8.16.0(bufferutil@4.0.8)(utf-8-validate@6.0.3): + optionalDependencies: + bufferutil: 4.0.8 + utf-8-validate: 6.0.3 + + xmlhttprequest-ssl@2.0.0: {} + + xtend@4.0.2: {} + + y18n@4.0.3: {} + + y18n@5.0.8: {} + + yallist@3.1.1: {} + + yallist@4.0.0: {} + + yaml-ast-parser@0.0.43: {} + + yaml@1.10.2: {} + + yaml@2.4.1: {} + + yargs-parser@18.1.3: + dependencies: + camelcase: 5.3.1 + decamelize: 1.2.0 + + yargs-parser@21.1.1: {} + + yargs@15.4.1: + dependencies: + cliui: 6.0.0 + decamelize: 1.2.0 + find-up: 4.1.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + require-main-filename: 2.0.0 + set-blocking: 2.0.0 + string-width: 4.2.3 + which-module: 2.0.1 + y18n: 4.0.3 + yargs-parser: 18.1.3 + + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.1.2 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + + yocto-queue@0.1.0: {} + + zod@3.22.4: {} + + zustand@4.4.1(@types/react@18.2.79)(react@18.2.0): + dependencies: + use-sync-external-store: 1.2.0(react@18.2.0) + optionalDependencies: + '@types/react': 18.2.79 + react: 18.2.0 diff --git a/frontend/public/favicon.svg b/frontend/public/favicon.svg new file mode 100644 index 00000000..825d766f --- /dev/null +++ b/frontend/public/favicon.svg @@ -0,0 +1,4 @@ + + + + diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx new file mode 100644 index 00000000..383e52b7 --- /dev/null +++ b/frontend/src/App.tsx @@ -0,0 +1,26 @@ +import { Outlet, ScrollRestoration } from 'react-router-dom'; + +import { ErrorBoundary, Footer, Header } from './components'; +import { withProviders } from './providers'; + +function Component() { + return ( + <> +
+ +
+ + + + + +
+ +
+ + ); +} + +const App = withProviders(Component); + +export { App }; diff --git a/frontend/src/assets/eth.svg b/frontend/src/assets/eth.svg new file mode 100644 index 00000000..37181822 --- /dev/null +++ b/frontend/src/assets/eth.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/frontend/src/assets/logo.svg b/frontend/src/assets/logo.svg new file mode 100644 index 00000000..488a7479 --- /dev/null +++ b/frontend/src/assets/logo.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/frontend/src/assets/usdc.svg b/frontend/src/assets/usdc.svg new file mode 100644 index 00000000..56a84034 --- /dev/null +++ b/frontend/src/assets/usdc.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/frontend/src/assets/vara-logo.svg b/frontend/src/assets/vara-logo.svg new file mode 100644 index 00000000..1c458ddd --- /dev/null +++ b/frontend/src/assets/vara-logo.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/frontend/src/assets/vara-usdc.svg b/frontend/src/assets/vara-usdc.svg new file mode 100644 index 00000000..2bc41366 --- /dev/null +++ b/frontend/src/assets/vara-usdc.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/frontend/src/assets/vara.svg b/frontend/src/assets/vara.svg new file mode 100644 index 00000000..e9cf75b0 --- /dev/null +++ b/frontend/src/assets/vara.svg @@ -0,0 +1,4 @@ + + + + diff --git a/frontend/src/assets/wrapped-eth.svg b/frontend/src/assets/wrapped-eth.svg new file mode 100644 index 00000000..f8633274 --- /dev/null +++ b/frontend/src/assets/wrapped-eth.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/frontend/src/assets/wrapped-vara.svg b/frontend/src/assets/wrapped-vara.svg new file mode 100644 index 00000000..615ceb59 --- /dev/null +++ b/frontend/src/assets/wrapped-vara.svg @@ -0,0 +1,4 @@ + + + + diff --git a/frontend/src/components/card/card.module.scss b/frontend/src/components/card/card.module.scss new file mode 100644 index 00000000..bca8e264 --- /dev/null +++ b/frontend/src/components/card/card.module.scss @@ -0,0 +1,7 @@ +.card { + padding: 20px 24px; + + border-radius: 8px; + border: 1px solid #e5e5e7; + background-color: #fff; +} diff --git a/frontend/src/components/card/card.tsx b/frontend/src/components/card/card.tsx new file mode 100644 index 00000000..08c8b797 --- /dev/null +++ b/frontend/src/components/card/card.tsx @@ -0,0 +1,16 @@ +import { ReactNode } from 'react'; + +import { cx } from '@/utils'; + +import styles from './card.module.scss'; + +type Props = { + children: ReactNode; + className?: string; +}; + +function Card({ children, className }: Props) { + return
{children}
; +} + +export { Card }; diff --git a/frontend/src/components/card/index.ts b/frontend/src/components/card/index.ts new file mode 100644 index 00000000..3940fe87 --- /dev/null +++ b/frontend/src/components/card/index.ts @@ -0,0 +1,3 @@ +import { Card } from './card'; + +export { Card }; diff --git a/frontend/src/components/copy-button/copy-button.tsx b/frontend/src/components/copy-button/copy-button.tsx new file mode 100644 index 00000000..468d8191 --- /dev/null +++ b/frontend/src/components/copy-button/copy-button.tsx @@ -0,0 +1,35 @@ +import { useAlert } from '@gear-js/react-hooks'; +import { Button } from '@gear-js/vara-ui'; + +import { SVGComponent } from '@/types'; +import { logger } from '@/utils'; + +import CopySVG from './copy.svg?react'; + +type Props = { + value: string; + SVG?: SVGComponent; + onCopy?: () => void; +}; + +function CopyButton({ value, SVG = CopySVG, onCopy = () => {} }: Props) { + const alert = useAlert(); + + const onSuccess = () => { + alert.success('Copied'); + onCopy(); + }; + + const onError = (error: unknown) => { + const message = error instanceof Error ? error.message : 'Unexpected error copying to clipboard'; + + alert.error(message); + logger.error('Copy to clipboard', error instanceof Error ? error : new Error(message)); + }; + + const copyToClipboard = () => navigator.clipboard.writeText(value).then(onSuccess, onError); + + return + + {isOpen &&

{text}

} + + ); +} + +export { Accordion }; diff --git a/frontend/src/features/faq/components/accordion/index.ts b/frontend/src/features/faq/components/accordion/index.ts new file mode 100644 index 00000000..1e7eda82 --- /dev/null +++ b/frontend/src/features/faq/components/accordion/index.ts @@ -0,0 +1,3 @@ +import { Accordion } from './accordion'; + +export { Accordion }; diff --git a/frontend/src/features/faq/components/index.ts b/frontend/src/features/faq/components/index.ts new file mode 100644 index 00000000..1e7eda82 --- /dev/null +++ b/frontend/src/features/faq/components/index.ts @@ -0,0 +1,3 @@ +import { Accordion } from './accordion'; + +export { Accordion }; diff --git a/frontend/src/features/faq/consts.ts b/frontend/src/features/faq/consts.ts new file mode 100644 index 00000000..e513c695 --- /dev/null +++ b/frontend/src/features/faq/consts.ts @@ -0,0 +1,35 @@ +const QUESTIONS = [ + { + question: 'What is Vara Network Bridge?', + answer: + 'Vara Network Bridge is a bridge system enabling the transfer of wrapped tokens between Vara Network and Ethereum mainnet.', + }, + { + question: + 'What is the intermediate course? What is the intermediate course? What is the intermediate course? What is the intermediate course?', + answer: + 'This is an advanced development course for graduates of the Basic Course. The course is for individuals who have completed the introductory level and are ready to delve deeper into implementing programs using Vara.', + }, + { + question: 'What is Vara Network Bridge?', + answer: + 'Vara Network Bridge is a bridge system enabling the transfer of wrapped tokens between Vara Network and Ethereum mainnet.', + }, + { + question: 'What is the intermediate course?', + answer: + 'This is an advanced development course for graduates of the Basic Course. The course is for individuals who have completed the introductory level and are ready to delve deeper into implementing programs using Vara.', + }, + { + question: 'What is Vara Network Bridge?', + answer: + 'Vara Network Bridge is a bridge system enabling the transfer of wrapped tokens between Vara Network and Ethereum mainnet.', + }, + { + question: 'What is the intermediate course?', + answer: + 'This is an advanced development course for graduates of the Basic Course. The course is for individuals who have completed the introductory level and are ready to delve deeper into implementing programs using Vara.', + }, +]; + +export { QUESTIONS }; diff --git a/frontend/src/features/faq/index.ts b/frontend/src/features/faq/index.ts new file mode 100644 index 00000000..88f83975 --- /dev/null +++ b/frontend/src/features/faq/index.ts @@ -0,0 +1,4 @@ +import { Accordion } from './components'; +import { QUESTIONS } from './consts'; + +export { Accordion, QUESTIONS }; diff --git a/frontend/src/features/history/assets/arrow.svg b/frontend/src/features/history/assets/arrow.svg new file mode 100644 index 00000000..480c1aea --- /dev/null +++ b/frontend/src/features/history/assets/arrow.svg @@ -0,0 +1,3 @@ + + + diff --git a/frontend/src/features/history/assets/check.svg b/frontend/src/features/history/assets/check.svg new file mode 100644 index 00000000..66fb8e96 --- /dev/null +++ b/frontend/src/features/history/assets/check.svg @@ -0,0 +1,3 @@ + + + diff --git a/frontend/src/features/history/assets/clock.svg b/frontend/src/features/history/assets/clock.svg new file mode 100644 index 00000000..bdfa5f45 --- /dev/null +++ b/frontend/src/features/history/assets/clock.svg @@ -0,0 +1,3 @@ + + + diff --git a/frontend/src/features/history/components/index.ts b/frontend/src/features/history/components/index.ts new file mode 100644 index 00000000..51cd9d2e --- /dev/null +++ b/frontend/src/features/history/components/index.ts @@ -0,0 +1,4 @@ +import { LatestTransactions } from './latest-transactions'; +import { TransactionsCounter } from './transactions-counter'; + +export { LatestTransactions, TransactionsCounter }; diff --git a/frontend/src/features/history/components/latest-transactions/index.ts b/frontend/src/features/history/components/latest-transactions/index.ts new file mode 100644 index 00000000..646ef5b6 --- /dev/null +++ b/frontend/src/features/history/components/latest-transactions/index.ts @@ -0,0 +1,3 @@ +import { LatestTransactions } from './latest-transactions'; + +export { LatestTransactions }; diff --git a/frontend/src/features/history/components/latest-transactions/latest-transactions.module.scss b/frontend/src/features/history/components/latest-transactions/latest-transactions.module.scss new file mode 100644 index 00000000..52606fda --- /dev/null +++ b/frontend/src/features/history/components/latest-transactions/latest-transactions.module.scss @@ -0,0 +1,13 @@ +.list { + display: flex; + flex-direction: column; + gap: 8px; +} + +.text { + padding: 32px 0; + + text-align: center; + font-size: 18px; + line-height: 130%; +} diff --git a/frontend/src/features/history/components/latest-transactions/latest-transactions.tsx b/frontend/src/features/history/components/latest-transactions/latest-transactions.tsx new file mode 100644 index 00000000..ccc9c278 --- /dev/null +++ b/frontend/src/features/history/components/latest-transactions/latest-transactions.tsx @@ -0,0 +1,38 @@ +import { useQuery } from '@tanstack/react-query'; +import request from 'graphql-request'; + +import { TELEPORTS_QUERY, REFETCH_INTERVAL, LATEST_TRANSACTIONS_LIMIT, INDEXER_ADDRESS } from '../../consts'; +import { TransactionCard } from '../transaction-card'; + +import styles from './latest-transactions.module.scss'; + +function LatestTransactions() { + const { data, isLoading } = useQuery({ + queryKey: ['latestTransactions'], + queryFn: () => + request(INDEXER_ADDRESS, TELEPORTS_QUERY, { limit: LATEST_TRANSACTIONS_LIMIT, offset: 0, where: null }), + refetchInterval: REFETCH_INTERVAL, + }); + + const transactions = data?.teleports; + + const renderTransactions = () => + transactions?.map((transaction) => ( +
  • + +
  • + )); + + const renderSkeletons = () => + new Array(LATEST_TRANSACTIONS_LIMIT).fill(null).map((_, index) => ( +
  • + +
  • + )); + + if (!isLoading && !transactions?.length) return

    No transactions found at the moment.

    ; + + return
      {isLoading ? renderSkeletons() : renderTransactions()}
    ; +} + +export { LatestTransactions }; diff --git a/frontend/src/features/history/components/transaction-card/index.ts b/frontend/src/features/history/components/transaction-card/index.ts new file mode 100644 index 00000000..9e1709ab --- /dev/null +++ b/frontend/src/features/history/components/transaction-card/index.ts @@ -0,0 +1,3 @@ +import { TransactionCard } from './transaction-card'; + +export { TransactionCard }; diff --git a/frontend/src/features/history/components/transaction-card/sources.tsx b/frontend/src/features/history/components/transaction-card/sources.tsx new file mode 100644 index 00000000..ba4736de --- /dev/null +++ b/frontend/src/features/history/components/transaction-card/sources.tsx @@ -0,0 +1,78 @@ +import { getVaraAddress } from '@gear-js/react-hooks'; +import { formatUnits } from 'viem'; + +import { TruncatedText, Skeleton } from '@/components'; +import { NETWORK_NAME, SPEC } from '@/consts'; +import { cx } from '@/utils'; + +import ArrowSVG from '../../assets/arrow.svg?react'; +import { DIRECTION_NETWORK_NAME, DIRECTION_NETWORK_SVG } from '../../consts'; +import { Direction, Teleport } from '../../types'; + +import styles from './transaction-card.module.scss'; + +type Props = Pick & { + isCompact?: boolean; +}; + +function Sources({ direction, from, to, amount, isCompact, pair }: Props) { + const networkName = DIRECTION_NETWORK_NAME[direction]; + const isVaraNetwork = networkName === NETWORK_NAME.VARA; + + const bridge = SPEC[pair as keyof typeof SPEC]; // assertion cuz usdt bridge is not yet implemented + const fromBridge = bridge[networkName]; + const toBridge = bridge[isVaraNetwork ? NETWORK_NAME.ETH : NETWORK_NAME.VARA]; + + const { symbol: fromSymbol, SVG: FromCoinSVG, decimals } = fromBridge; + const { symbol: toSymbol, SVG: ToCoinSVG } = toBridge; + + const FromNetworkSVG = DIRECTION_NETWORK_SVG[direction]; + const ToNetworkSVG = DIRECTION_NETWORK_SVG[isVaraNetwork ? Direction.EthToVara : Direction.VaraToEth]; + + const formattedFromAddress = isVaraNetwork ? getVaraAddress(from) : `0x${from}`; + const formattedToAddress = isVaraNetwork ? `0x${to}` : getVaraAddress(to); + + const formattedAmount = formatUnits(BigInt(amount), decimals); + + return ( +
    +
    +
    + + +
    + +
    + {formattedAmount ? ( + + ) : ( + + )} + + +
    +
    + + + +
    +
    + + +
    + +
    + {formattedAmount ? ( + + ) : ( + + )} + + +
    +
    +
    + ); +} + +export { Sources }; diff --git a/frontend/src/features/history/components/transaction-card/status.tsx b/frontend/src/features/history/components/transaction-card/status.tsx new file mode 100644 index 00000000..f6ed25f9 --- /dev/null +++ b/frontend/src/features/history/components/transaction-card/status.tsx @@ -0,0 +1,19 @@ +import { cx } from '@/utils'; + +import { STATUS_SVG } from '../../consts'; +import { Teleport } from '../../types'; + +import styles from './transaction-card.module.scss'; + +function Status({ status }: Pick) { + const StatusSVG = STATUS_SVG[status]; + + return ( +
    + + {status.split(/(?=[A-Z])/).join(' ')} +
    + ); +} + +export { Status }; diff --git a/frontend/src/features/history/components/transaction-card/time.tsx b/frontend/src/features/history/components/transaction-card/time.tsx new file mode 100644 index 00000000..aaf14d3e --- /dev/null +++ b/frontend/src/features/history/components/transaction-card/time.tsx @@ -0,0 +1,22 @@ +import { cx } from '@/utils'; + +import ClockSVG from '../../assets/clock.svg?react'; +import { Teleport } from '../../types'; + +import styles from './transaction-card.module.scss'; + +type Props = Pick & { + isCompact?: boolean; +}; + +function Time({ timestamp, isCompact }: Props) { + const date = new Date(timestamp).toLocaleString(); + + return ( +

    + {date} +

    + ); +} + +export { Time }; diff --git a/frontend/src/features/history/components/transaction-card/transaction-card.module.scss b/frontend/src/features/history/components/transaction-card/transaction-card.module.scss new file mode 100644 index 00000000..c04bc6cc --- /dev/null +++ b/frontend/src/features/history/components/transaction-card/transaction-card.module.scss @@ -0,0 +1,126 @@ +.compactCard, +.wideCard { + white-space: nowrap; + + svg, + .icons { + flex-shrink: 0; + } +} + +.compactCard { + display: flex; + align-items: center; + justify-content: space-between; + gap: 16px; +} + +.wideCard { + display: grid; + grid-template-columns: minmax(0, 1.5fr) minmax(0, 1fr) minmax(0, 3fr) minmax(0, 1.5fr); + align-items: center; + gap: 48px; +} + +.blockhash { + display: flex; + align-items: center; + gap: 8px; + + font-size: 16px; + line-height: 150%; + + span { + text-decoration: underline; + } +} + +.sources { + display: flex; + align-items: center; + gap: 16px; + + &.compact { + width: 65%; + } +} + +.source { + width: calc(50% - 24px); + + display: flex; + align-items: center; + gap: 8px; + + > div { + overflow: hidden; + } + + svg { + width: 32px; + height: 32px; + + border-radius: 50%; + + &:last-child { + margin-left: -12px; + box-shadow: -2px 0px 0px 0px rgba(0, 0, 0, 0.1); + } + } +} + +.amount { + font-size: 16px; + font-weight: 600; + line-height: 150%; +} + +.address, +.date { + color: #838897; + line-height: 141.667%; + letter-spacing: -0.5px; +} + +.date { + text-align: center; + font-size: 16px; + + &.compact { + font-size: 12px; + } +} + +.status { + margin-bottom: 4px; + padding: 2px 16px; + + display: flex; + align-items: center; + justify-content: center; + gap: 8px; + + font-size: 12px; + font-weight: 600; + line-height: 150%; + + border-radius: 4px; + + &.Completed { + color: #13bc9d; + + background-color: rgba(14, 211, 163, 0.07); + } + + &.InProgress { + color: #838897; + + background-color: rgba(131, 136, 151, 0.07); + } +} + +.date { + display: flex; + align-items: center; + gap: 4px; +} diff --git a/frontend/src/features/history/components/transaction-card/transaction-card.tsx b/frontend/src/features/history/components/transaction-card/transaction-card.tsx new file mode 100644 index 00000000..6cba36ef --- /dev/null +++ b/frontend/src/features/history/components/transaction-card/transaction-card.tsx @@ -0,0 +1,90 @@ +import { Card, CopyButton, Skeleton, TruncatedText } from '@/components'; + +import ArrowSVG from '../../assets/arrow.svg?react'; +import { Teleport } from '../../types'; + +import { Sources } from './sources'; +import { Status } from './status'; +import { Time } from './time'; +import styles from './transaction-card.module.scss'; + +type Props = Pick & { + isCompact?: boolean; +}; + +function TransactionCard({ amount, from, to, status, timestamp, direction, blockhash, pair, isCompact }: Props) { + if (isCompact) + return ( + + + +
    + +
    +
    + ); + + return ( + + + ); +} + +function TransactionCardSkeleton() { + return ( + // TODO: make detailed + + +
    +
    +
    + + +
    + +
    +

    0.0000 Unit

    + +
    +
    + + + +
    +
    + + +
    + +
    +

    0.0000 Unit

    + +
    +
    +
    + +
    +
    Status
    + +

    + 01.01.1970 00:00:00 +

    +
    +
    +
    + ); +} + +TransactionCard.Skeleton = TransactionCardSkeleton; + +export { TransactionCard }; diff --git a/frontend/src/features/history/components/transactions-counter/index.ts b/frontend/src/features/history/components/transactions-counter/index.ts new file mode 100644 index 00000000..5de3d249 --- /dev/null +++ b/frontend/src/features/history/components/transactions-counter/index.ts @@ -0,0 +1,3 @@ +import { TransactionsCounter } from './transactions-counter'; + +export { TransactionsCounter }; diff --git a/frontend/src/features/history/components/transactions-counter/transactions-counter.module.scss b/frontend/src/features/history/components/transactions-counter/transactions-counter.module.scss new file mode 100644 index 00000000..54a67ff7 --- /dev/null +++ b/frontend/src/features/history/components/transactions-counter/transactions-counter.module.scss @@ -0,0 +1,13 @@ +.text { + font-size: 24px; + font-weight: 700; + line-height: 116.667%; + letter-spacing: -1px; +} + +.heading { + color: #838897; + font-size: 12px; + line-height: 150%; + letter-spacing: -0.5px; +} diff --git a/frontend/src/features/history/components/transactions-counter/transactions-counter.tsx b/frontend/src/features/history/components/transactions-counter/transactions-counter.tsx new file mode 100644 index 00000000..2b73e6c6 --- /dev/null +++ b/frontend/src/features/history/components/transactions-counter/transactions-counter.tsx @@ -0,0 +1,18 @@ +import { Skeleton } from '@/components'; + +import { useTransactionsCount } from '../../hooks'; + +import styles from './transactions-counter.module.scss'; + +function TransactionsCounter() { + const [count, isCountLoading] = useTransactionsCount(); + + return ( +
    +

    {isCountLoading ? : count}

    +

    Transactions (All time)

    +
    + ); +} + +export { TransactionsCounter }; diff --git a/frontend/src/features/history/consts/index.ts b/frontend/src/features/history/consts/index.ts new file mode 100644 index 00000000..289311aa --- /dev/null +++ b/frontend/src/features/history/consts/index.ts @@ -0,0 +1,47 @@ +import EthSVG from '@/assets/eth.svg?react'; +import VaraSVG from '@/assets/vara.svg?react'; +import { NETWORK_NAME } from '@/consts'; + +import CheckSVG from '../assets/check.svg?react'; +import ClockSVG from '../assets/clock.svg?react'; +import { Direction, Status } from '../types'; + +import { TELEPORTS_QUERY } from './queries'; + +const INDEXER_ADDRESS = import.meta.env.VITE_INDEXER_ADDRESS as string; + +const REFETCH_INTERVAL = 10000; +const LATEST_TRANSACTIONS_LIMIT = 5; +const TRANSACTIONS_LIMIT = 12; + +const NETWORK_NAME_DIRECTION = { + [NETWORK_NAME.VARA]: Direction.VaraToEth, + [NETWORK_NAME.ETH]: Direction.EthToVara, +}; + +const DIRECTION_NETWORK_NAME = { + [Direction.VaraToEth]: NETWORK_NAME.VARA, + [Direction.EthToVara]: NETWORK_NAME.ETH, +} as const; + +const DIRECTION_NETWORK_SVG = { + [Direction.VaraToEth]: VaraSVG, + [Direction.EthToVara]: EthSVG, +} as const; + +const STATUS_SVG = { + [Status.Completed]: CheckSVG, + [Status.InProgress]: ClockSVG, +} as const; + +export { + INDEXER_ADDRESS, + TELEPORTS_QUERY, + REFETCH_INTERVAL, + TRANSACTIONS_LIMIT, + LATEST_TRANSACTIONS_LIMIT, + NETWORK_NAME_DIRECTION, + DIRECTION_NETWORK_NAME, + DIRECTION_NETWORK_SVG, + STATUS_SVG, +}; diff --git a/frontend/src/features/history/consts/queries.ts b/frontend/src/features/history/consts/queries.ts new file mode 100644 index 00000000..647ccc13 --- /dev/null +++ b/frontend/src/features/history/consts/queries.ts @@ -0,0 +1,27 @@ +import { graphql } from '../graphql'; + +const TELEPORTS_QUERY = graphql(` + query TeleportsQuery($limit: Int!, $offset: Int!, $where: TeleportWhereInput) { + teleports(limit: $limit, offset: $offset, orderBy: timestamp_DESC, where: $where) { + amount + blockhash + direction + from + id + status + timestamp + to + pair + } + } +`); + +const TELEPORTS_CONNECTION_QUERY = graphql(` + query TeleportsConnectionQuery($where: TeleportWhereInput) { + teleportsConnection(orderBy: timestamp_DESC, where: $where) { + totalCount + } + } +`); + +export { TELEPORTS_QUERY, TELEPORTS_CONNECTION_QUERY }; diff --git a/frontend/src/features/history/graphql/fragment-masking.ts b/frontend/src/features/history/graphql/fragment-masking.ts new file mode 100644 index 00000000..fbedede1 --- /dev/null +++ b/frontend/src/features/history/graphql/fragment-masking.ts @@ -0,0 +1,67 @@ +/* eslint-disable */ +import { ResultOf, DocumentTypeDecoration, TypedDocumentNode } from '@graphql-typed-document-node/core'; +import { FragmentDefinitionNode } from 'graphql'; +import { Incremental } from './graphql'; + + +export type FragmentType> = TDocumentType extends DocumentTypeDecoration< + infer TType, + any +> + ? [TType] extends [{ ' $fragmentName'?: infer TKey }] + ? TKey extends string + ? { ' $fragmentRefs'?: { [key in TKey]: TType } } + : never + : never + : never; + +// return non-nullable if `fragmentType` is non-nullable +export function useFragment( + _documentNode: DocumentTypeDecoration, + fragmentType: FragmentType> +): TType; +// return nullable if `fragmentType` is nullable +export function useFragment( + _documentNode: DocumentTypeDecoration, + fragmentType: FragmentType> | null | undefined +): TType | null | undefined; +// return array of non-nullable if `fragmentType` is array of non-nullable +export function useFragment( + _documentNode: DocumentTypeDecoration, + fragmentType: ReadonlyArray>> +): ReadonlyArray; +// return array of nullable if `fragmentType` is array of nullable +export function useFragment( + _documentNode: DocumentTypeDecoration, + fragmentType: ReadonlyArray>> | null | undefined +): ReadonlyArray | null | undefined; +export function useFragment( + _documentNode: DocumentTypeDecoration, + fragmentType: FragmentType> | ReadonlyArray>> | null | undefined +): TType | ReadonlyArray | null | undefined { + return fragmentType as any; +} + + +export function makeFragmentData< + F extends DocumentTypeDecoration, + FT extends ResultOf +>(data: FT, _fragment: F): FragmentType { + return data as FragmentType; +} +export function isFragmentReady( + queryNode: DocumentTypeDecoration, + fragmentNode: TypedDocumentNode, + data: FragmentType, any>> | null | undefined +): data is FragmentType { + const deferredFields = (queryNode as { __meta__?: { deferredFields: Record } }).__meta__ + ?.deferredFields; + + if (!deferredFields) return true; + + const fragDef = fragmentNode.definitions[0] as FragmentDefinitionNode | undefined; + const fragName = fragDef?.name?.value; + + const fields = (fragName && deferredFields[fragName]) || []; + return fields.length > 0 && fields.every(field => data && field in data); +} diff --git a/frontend/src/features/history/graphql/gql.ts b/frontend/src/features/history/graphql/gql.ts new file mode 100644 index 00000000..270cd327 --- /dev/null +++ b/frontend/src/features/history/graphql/gql.ts @@ -0,0 +1,47 @@ +/* eslint-disable */ +import * as types from './graphql'; +import { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core'; + +/** + * Map of all GraphQL operations in the project. + * + * This map has several performance disadvantages: + * 1. It is not tree-shakeable, so it will include all operations in the project. + * 2. It is not minifiable, so the string of a GraphQL query will be multiple times inside the bundle. + * 3. It does not support dead code elimination, so it will add unused operations. + * + * Therefore it is highly recommended to use the babel or swc plugin for production. + */ +const documents = { + "\n query TeleportsQuery($limit: Int!, $offset: Int!, $where: TeleportWhereInput) {\n teleports(limit: $limit, offset: $offset, orderBy: timestamp_DESC, where: $where) {\n amount\n blockhash\n direction\n from\n id\n status\n timestamp\n to\n pair\n }\n }\n": types.TeleportsQueryDocument, + "\n query TeleportsConnectionQuery($where: TeleportWhereInput) {\n teleportsConnection(orderBy: timestamp_DESC, where: $where) {\n totalCount\n }\n }\n": types.TeleportsConnectionQueryDocument, +}; + +/** + * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. + * + * + * @example + * ```ts + * const query = graphql(`query GetUser($id: ID!) { user(id: $id) { name } }`); + * ``` + * + * The query argument is unknown! + * Please regenerate the types. + */ +export function graphql(source: string): unknown; + +/** + * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. + */ +export function graphql(source: "\n query TeleportsQuery($limit: Int!, $offset: Int!, $where: TeleportWhereInput) {\n teleports(limit: $limit, offset: $offset, orderBy: timestamp_DESC, where: $where) {\n amount\n blockhash\n direction\n from\n id\n status\n timestamp\n to\n pair\n }\n }\n"): (typeof documents)["\n query TeleportsQuery($limit: Int!, $offset: Int!, $where: TeleportWhereInput) {\n teleports(limit: $limit, offset: $offset, orderBy: timestamp_DESC, where: $where) {\n amount\n blockhash\n direction\n from\n id\n status\n timestamp\n to\n pair\n }\n }\n"]; +/** + * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. + */ +export function graphql(source: "\n query TeleportsConnectionQuery($where: TeleportWhereInput) {\n teleportsConnection(orderBy: timestamp_DESC, where: $where) {\n totalCount\n }\n }\n"): (typeof documents)["\n query TeleportsConnectionQuery($where: TeleportWhereInput) {\n teleportsConnection(orderBy: timestamp_DESC, where: $where) {\n totalCount\n }\n }\n"]; + +export function graphql(source: string) { + return (documents as any)[source] ?? {}; +} + +export type DocumentType> = TDocumentNode extends DocumentNode< infer TType, any> ? TType : never; \ No newline at end of file diff --git a/frontend/src/features/history/graphql/graphql.ts b/frontend/src/features/history/graphql/graphql.ts new file mode 100644 index 00000000..009c3fcf --- /dev/null +++ b/frontend/src/features/history/graphql/graphql.ts @@ -0,0 +1,404 @@ +/* eslint-disable */ +import { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core'; +export type Maybe = T | null; +export type InputMaybe = Maybe; +export type Exact = { [K in keyof T]: T[K] }; +export type MakeOptional = Omit & { [SubKey in K]?: Maybe }; +export type MakeMaybe = Omit & { [SubKey in K]: Maybe }; +export type MakeEmpty = { [_ in K]?: never }; +export type Incremental = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never }; +/** All built-in and custom scalars, mapped to their actual values */ +export type Scalars = { + ID: { input: string; output: string; } + String: { input: string; output: string; } + Boolean: { input: boolean; output: boolean; } + Int: { input: number; output: number; } + Float: { input: number; output: number; } + /** Big number integer */ + BigInt: { input: string; output: string; } + /** A date-time string in simplified extended ISO 8601 format (YYYY-MM-DDTHH:mm:ss.sssZ) */ + DateTime: { input: string; output: string; } +}; + +export enum Direction { + EthToVara = 'EthToVara', + VaraToEth = 'VaraToEth' +} + +export type NotUpdatedCompleted = { + __typename?: 'NotUpdatedCompleted'; + id: Scalars['String']['output']; + side: Side; +}; + +export type NotUpdatedCompletedEdge = { + __typename?: 'NotUpdatedCompletedEdge'; + cursor: Scalars['String']['output']; + node: NotUpdatedCompleted; +}; + +export enum NotUpdatedCompletedOrderByInput { + IdAsc = 'id_ASC', + IdAscNullsFirst = 'id_ASC_NULLS_FIRST', + IdDesc = 'id_DESC', + IdDescNullsLast = 'id_DESC_NULLS_LAST', + SideAsc = 'side_ASC', + SideAscNullsFirst = 'side_ASC_NULLS_FIRST', + SideDesc = 'side_DESC', + SideDescNullsLast = 'side_DESC_NULLS_LAST' +} + +export type NotUpdatedCompletedWhereInput = { + AND: InputMaybe>; + OR: InputMaybe>; + id_contains: InputMaybe; + id_containsInsensitive: InputMaybe; + id_endsWith: InputMaybe; + id_eq: InputMaybe; + id_gt: InputMaybe; + id_gte: InputMaybe; + id_in: InputMaybe>; + id_isNull: InputMaybe; + id_lt: InputMaybe; + id_lte: InputMaybe; + id_not_contains: InputMaybe; + id_not_containsInsensitive: InputMaybe; + id_not_endsWith: InputMaybe; + id_not_eq: InputMaybe; + id_not_in: InputMaybe>; + id_not_startsWith: InputMaybe; + id_startsWith: InputMaybe; + side_eq: InputMaybe; + side_in: InputMaybe>; + side_isNull: InputMaybe; + side_not_eq: InputMaybe; + side_not_in: InputMaybe>; +}; + +export type NotUpdatedCompletedsConnection = { + __typename?: 'NotUpdatedCompletedsConnection'; + edges: Array; + pageInfo: PageInfo; + totalCount: Scalars['Int']['output']; +}; + +export type PageInfo = { + __typename?: 'PageInfo'; + endCursor: Scalars['String']['output']; + hasNextPage: Scalars['Boolean']['output']; + hasPreviousPage: Scalars['Boolean']['output']; + startCursor: Scalars['String']['output']; +}; + +export enum Pair { + EthWrappedEth = 'EthWrappedEth', + UsdcWrappedUsdc = 'USDCWrappedUSDC', + UsdtWrappedUsdt = 'USDTWrappedUSDT', + VaraWrappedVara = 'VaraWrappedVara' +} + +export type Query = { + __typename?: 'Query'; + notUpdatedCompletedById: Maybe; + /** @deprecated Use notUpdatedCompletedById */ + notUpdatedCompletedByUniqueInput: Maybe; + notUpdatedCompleteds: Array; + notUpdatedCompletedsConnection: NotUpdatedCompletedsConnection; + squidStatus: Maybe; + teleportById: Maybe; + /** @deprecated Use teleportById */ + teleportByUniqueInput: Maybe; + teleports: Array; + teleportsConnection: TeleportsConnection; +}; + + +export type QueryNotUpdatedCompletedByIdArgs = { + id: Scalars['String']['input']; +}; + + +export type QueryNotUpdatedCompletedByUniqueInputArgs = { + where: WhereIdInput; +}; + + +export type QueryNotUpdatedCompletedsArgs = { + limit: InputMaybe; + offset: InputMaybe; + orderBy: InputMaybe>; + where: InputMaybe; +}; + + +export type QueryNotUpdatedCompletedsConnectionArgs = { + after: InputMaybe; + first: InputMaybe; + orderBy: Array; + where: InputMaybe; +}; + + +export type QueryTeleportByIdArgs = { + id: Scalars['String']['input']; +}; + + +export type QueryTeleportByUniqueInputArgs = { + where: WhereIdInput; +}; + + +export type QueryTeleportsArgs = { + limit: InputMaybe; + offset: InputMaybe; + orderBy: InputMaybe>; + where: InputMaybe; +}; + + +export type QueryTeleportsConnectionArgs = { + after: InputMaybe; + first: InputMaybe; + orderBy: Array; + where: InputMaybe; +}; + +export enum Side { + Eth = 'Eth', + Vara = 'Vara' +} + +export type SquidStatus = { + __typename?: 'SquidStatus'; + /** The height of the processed part of the chain */ + height: Maybe; +}; + +export enum Status { + Completed = 'Completed', + InProgress = 'InProgress' +} + +export type Teleport = { + __typename?: 'Teleport'; + amount: Scalars['BigInt']['output']; + block: Scalars['BigInt']['output']; + blockhash: Scalars['String']['output']; + direction: Direction; + from: Scalars['String']['output']; + id: Scalars['String']['output']; + nonce: Scalars['BigInt']['output']; + pair: Pair; + status: Status; + timestamp: Scalars['DateTime']['output']; + to: Scalars['String']['output']; +}; + +export type TeleportEdge = { + __typename?: 'TeleportEdge'; + cursor: Scalars['String']['output']; + node: Teleport; +}; + +export enum TeleportOrderByInput { + AmountAsc = 'amount_ASC', + AmountAscNullsFirst = 'amount_ASC_NULLS_FIRST', + AmountDesc = 'amount_DESC', + AmountDescNullsLast = 'amount_DESC_NULLS_LAST', + BlockAsc = 'block_ASC', + BlockAscNullsFirst = 'block_ASC_NULLS_FIRST', + BlockDesc = 'block_DESC', + BlockDescNullsLast = 'block_DESC_NULLS_LAST', + BlockhashAsc = 'blockhash_ASC', + BlockhashAscNullsFirst = 'blockhash_ASC_NULLS_FIRST', + BlockhashDesc = 'blockhash_DESC', + BlockhashDescNullsLast = 'blockhash_DESC_NULLS_LAST', + DirectionAsc = 'direction_ASC', + DirectionAscNullsFirst = 'direction_ASC_NULLS_FIRST', + DirectionDesc = 'direction_DESC', + DirectionDescNullsLast = 'direction_DESC_NULLS_LAST', + FromAsc = 'from_ASC', + FromAscNullsFirst = 'from_ASC_NULLS_FIRST', + FromDesc = 'from_DESC', + FromDescNullsLast = 'from_DESC_NULLS_LAST', + IdAsc = 'id_ASC', + IdAscNullsFirst = 'id_ASC_NULLS_FIRST', + IdDesc = 'id_DESC', + IdDescNullsLast = 'id_DESC_NULLS_LAST', + NonceAsc = 'nonce_ASC', + NonceAscNullsFirst = 'nonce_ASC_NULLS_FIRST', + NonceDesc = 'nonce_DESC', + NonceDescNullsLast = 'nonce_DESC_NULLS_LAST', + PairAsc = 'pair_ASC', + PairAscNullsFirst = 'pair_ASC_NULLS_FIRST', + PairDesc = 'pair_DESC', + PairDescNullsLast = 'pair_DESC_NULLS_LAST', + StatusAsc = 'status_ASC', + StatusAscNullsFirst = 'status_ASC_NULLS_FIRST', + StatusDesc = 'status_DESC', + StatusDescNullsLast = 'status_DESC_NULLS_LAST', + TimestampAsc = 'timestamp_ASC', + TimestampAscNullsFirst = 'timestamp_ASC_NULLS_FIRST', + TimestampDesc = 'timestamp_DESC', + TimestampDescNullsLast = 'timestamp_DESC_NULLS_LAST', + ToAsc = 'to_ASC', + ToAscNullsFirst = 'to_ASC_NULLS_FIRST', + ToDesc = 'to_DESC', + ToDescNullsLast = 'to_DESC_NULLS_LAST' +} + +export type TeleportWhereInput = { + AND: InputMaybe>; + OR: InputMaybe>; + amount_eq: InputMaybe; + amount_gt: InputMaybe; + amount_gte: InputMaybe; + amount_in: InputMaybe>; + amount_isNull: InputMaybe; + amount_lt: InputMaybe; + amount_lte: InputMaybe; + amount_not_eq: InputMaybe; + amount_not_in: InputMaybe>; + block_eq: InputMaybe; + block_gt: InputMaybe; + block_gte: InputMaybe; + block_in: InputMaybe>; + block_isNull: InputMaybe; + block_lt: InputMaybe; + block_lte: InputMaybe; + block_not_eq: InputMaybe; + block_not_in: InputMaybe>; + blockhash_contains: InputMaybe; + blockhash_containsInsensitive: InputMaybe; + blockhash_endsWith: InputMaybe; + blockhash_eq: InputMaybe; + blockhash_gt: InputMaybe; + blockhash_gte: InputMaybe; + blockhash_in: InputMaybe>; + blockhash_isNull: InputMaybe; + blockhash_lt: InputMaybe; + blockhash_lte: InputMaybe; + blockhash_not_contains: InputMaybe; + blockhash_not_containsInsensitive: InputMaybe; + blockhash_not_endsWith: InputMaybe; + blockhash_not_eq: InputMaybe; + blockhash_not_in: InputMaybe>; + blockhash_not_startsWith: InputMaybe; + blockhash_startsWith: InputMaybe; + direction_eq: InputMaybe; + direction_in: InputMaybe>; + direction_isNull: InputMaybe; + direction_not_eq: InputMaybe; + direction_not_in: InputMaybe>; + from_contains: InputMaybe; + from_containsInsensitive: InputMaybe; + from_endsWith: InputMaybe; + from_eq: InputMaybe; + from_gt: InputMaybe; + from_gte: InputMaybe; + from_in: InputMaybe>; + from_isNull: InputMaybe; + from_lt: InputMaybe; + from_lte: InputMaybe; + from_not_contains: InputMaybe; + from_not_containsInsensitive: InputMaybe; + from_not_endsWith: InputMaybe; + from_not_eq: InputMaybe; + from_not_in: InputMaybe>; + from_not_startsWith: InputMaybe; + from_startsWith: InputMaybe; + id_contains: InputMaybe; + id_containsInsensitive: InputMaybe; + id_endsWith: InputMaybe; + id_eq: InputMaybe; + id_gt: InputMaybe; + id_gte: InputMaybe; + id_in: InputMaybe>; + id_isNull: InputMaybe; + id_lt: InputMaybe; + id_lte: InputMaybe; + id_not_contains: InputMaybe; + id_not_containsInsensitive: InputMaybe; + id_not_endsWith: InputMaybe; + id_not_eq: InputMaybe; + id_not_in: InputMaybe>; + id_not_startsWith: InputMaybe; + id_startsWith: InputMaybe; + nonce_eq: InputMaybe; + nonce_gt: InputMaybe; + nonce_gte: InputMaybe; + nonce_in: InputMaybe>; + nonce_isNull: InputMaybe; + nonce_lt: InputMaybe; + nonce_lte: InputMaybe; + nonce_not_eq: InputMaybe; + nonce_not_in: InputMaybe>; + pair_eq: InputMaybe; + pair_in: InputMaybe>; + pair_isNull: InputMaybe; + pair_not_eq: InputMaybe; + pair_not_in: InputMaybe>; + status_eq: InputMaybe; + status_in: InputMaybe>; + status_isNull: InputMaybe; + status_not_eq: InputMaybe; + status_not_in: InputMaybe>; + timestamp_eq: InputMaybe; + timestamp_gt: InputMaybe; + timestamp_gte: InputMaybe; + timestamp_in: InputMaybe>; + timestamp_isNull: InputMaybe; + timestamp_lt: InputMaybe; + timestamp_lte: InputMaybe; + timestamp_not_eq: InputMaybe; + timestamp_not_in: InputMaybe>; + to_contains: InputMaybe; + to_containsInsensitive: InputMaybe; + to_endsWith: InputMaybe; + to_eq: InputMaybe; + to_gt: InputMaybe; + to_gte: InputMaybe; + to_in: InputMaybe>; + to_isNull: InputMaybe; + to_lt: InputMaybe; + to_lte: InputMaybe; + to_not_contains: InputMaybe; + to_not_containsInsensitive: InputMaybe; + to_not_endsWith: InputMaybe; + to_not_eq: InputMaybe; + to_not_in: InputMaybe>; + to_not_startsWith: InputMaybe; + to_startsWith: InputMaybe; +}; + +export type TeleportsConnection = { + __typename?: 'TeleportsConnection'; + edges: Array; + pageInfo: PageInfo; + totalCount: Scalars['Int']['output']; +}; + +export type WhereIdInput = { + id: Scalars['String']['input']; +}; + +export type TeleportsQueryQueryVariables = Exact<{ + limit: Scalars['Int']['input']; + offset: Scalars['Int']['input']; + where: InputMaybe; +}>; + + +export type TeleportsQueryQuery = { __typename?: 'Query', teleports: Array<{ __typename?: 'Teleport', amount: string, blockhash: string, direction: Direction, from: string, id: string, status: Status, timestamp: string, to: string, pair: Pair }> }; + +export type TeleportsConnectionQueryQueryVariables = Exact<{ + where: InputMaybe; +}>; + + +export type TeleportsConnectionQueryQuery = { __typename?: 'Query', teleportsConnection: { __typename?: 'TeleportsConnection', totalCount: number } }; + + +export const TeleportsQueryDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"TeleportsQuery"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"limit"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"Int"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"offset"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"Int"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"where"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"TeleportWhereInput"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"teleports"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"limit"},"value":{"kind":"Variable","name":{"kind":"Name","value":"limit"}}},{"kind":"Argument","name":{"kind":"Name","value":"offset"},"value":{"kind":"Variable","name":{"kind":"Name","value":"offset"}}},{"kind":"Argument","name":{"kind":"Name","value":"orderBy"},"value":{"kind":"EnumValue","value":"timestamp_DESC"}},{"kind":"Argument","name":{"kind":"Name","value":"where"},"value":{"kind":"Variable","name":{"kind":"Name","value":"where"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"amount"}},{"kind":"Field","name":{"kind":"Name","value":"blockhash"}},{"kind":"Field","name":{"kind":"Name","value":"direction"}},{"kind":"Field","name":{"kind":"Name","value":"from"}},{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"status"}},{"kind":"Field","name":{"kind":"Name","value":"timestamp"}},{"kind":"Field","name":{"kind":"Name","value":"to"}},{"kind":"Field","name":{"kind":"Name","value":"pair"}}]}}]}}]} as unknown as DocumentNode; +export const TeleportsConnectionQueryDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"TeleportsConnectionQuery"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"where"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"TeleportWhereInput"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"teleportsConnection"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"orderBy"},"value":{"kind":"EnumValue","value":"timestamp_DESC"}},{"kind":"Argument","name":{"kind":"Name","value":"where"},"value":{"kind":"Variable","name":{"kind":"Name","value":"where"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"totalCount"}}]}}]}}]} as unknown as DocumentNode; \ No newline at end of file diff --git a/frontend/src/features/history/graphql/index.ts b/frontend/src/features/history/graphql/index.ts new file mode 100644 index 00000000..f5159916 --- /dev/null +++ b/frontend/src/features/history/graphql/index.ts @@ -0,0 +1,2 @@ +export * from "./fragment-masking"; +export * from "./gql"; \ No newline at end of file diff --git a/frontend/src/features/history/hooks/index.ts b/frontend/src/features/history/hooks/index.ts new file mode 100644 index 00000000..94a5db9a --- /dev/null +++ b/frontend/src/features/history/hooks/index.ts @@ -0,0 +1,4 @@ +import { useTransactions } from './use-transactions'; +import { useTransactionsCount } from './use-transactions-count'; + +export { useTransactionsCount, useTransactions }; diff --git a/frontend/src/features/history/hooks/use-transactions-count.ts b/frontend/src/features/history/hooks/use-transactions-count.ts new file mode 100644 index 00000000..3d74de0e --- /dev/null +++ b/frontend/src/features/history/hooks/use-transactions-count.ts @@ -0,0 +1,17 @@ +import { useQuery } from '@tanstack/react-query'; +import request from 'graphql-request'; + +import { INDEXER_ADDRESS } from '../consts'; +import { TELEPORTS_CONNECTION_QUERY } from '../consts/queries'; +import { TeleportWhereInput } from '../graphql/graphql'; + +function useTransactionsCount(where: TeleportWhereInput | null = null) { + const { data, isLoading } = useQuery({ + queryKey: ['transactionsCount', where], + queryFn: () => request(INDEXER_ADDRESS, TELEPORTS_CONNECTION_QUERY, { where }), + }); + + return [data?.teleportsConnection.totalCount, isLoading] as const; +} + +export { useTransactionsCount }; diff --git a/frontend/src/features/history/hooks/use-transactions.ts b/frontend/src/features/history/hooks/use-transactions.ts new file mode 100644 index 00000000..2d356ece --- /dev/null +++ b/frontend/src/features/history/hooks/use-transactions.ts @@ -0,0 +1,35 @@ +import { useInfiniteQuery } from '@tanstack/react-query'; +import request from 'graphql-request'; + +import { isUndefined } from '@/utils'; + +import { INDEXER_ADDRESS, TELEPORTS_QUERY, TRANSACTIONS_LIMIT } from '../consts'; +import { TeleportWhereInput, TeleportsQueryQuery } from '../graphql/graphql'; + +function useTransactions(transactionsCount: number | undefined, filters: TeleportWhereInput) { + const isTransactionsCount = !isUndefined(transactionsCount); + + const getNextPageParam = (lastPage: TeleportsQueryQuery, allPages: TeleportsQueryQuery[]) => { + if (!isTransactionsCount) throw new Error('Transactions count is not defined'); + + const lastPageCount = lastPage.teleports.length; + const fetchedCount = (allPages.length - 1) * TRANSACTIONS_LIMIT + lastPageCount; + + return fetchedCount < transactionsCount ? fetchedCount : undefined; + }; + + const { data, fetchNextPage, isFetching, hasNextPage } = useInfiniteQuery({ + queryKey: ['transactions', filters], + queryFn: ({ pageParam }) => + request(INDEXER_ADDRESS, TELEPORTS_QUERY, { limit: TRANSACTIONS_LIMIT, offset: pageParam, where: filters }), + initialPageParam: 0, + getNextPageParam, + enabled: isTransactionsCount, + }); + + const transactions = data?.pages.flatMap((page) => page.teleports); + + return [transactions, isFetching, hasNextPage, fetchNextPage] as const; +} + +export { useTransactions }; diff --git a/frontend/src/features/history/index.ts b/frontend/src/features/history/index.ts new file mode 100644 index 00000000..50eb927b --- /dev/null +++ b/frontend/src/features/history/index.ts @@ -0,0 +1,5 @@ +import { LatestTransactions, TransactionsCounter } from './components'; +import { NETWORK_NAME_DIRECTION } from './consts'; +import { useTransactions, useTransactionsCount } from './hooks'; + +export { LatestTransactions, TransactionsCounter, useTransactions, useTransactionsCount, NETWORK_NAME_DIRECTION }; diff --git a/frontend/src/features/history/types.ts b/frontend/src/features/history/types.ts new file mode 100644 index 00000000..7c703cf7 --- /dev/null +++ b/frontend/src/features/history/types.ts @@ -0,0 +1,4 @@ +import { Teleport, Direction, Status } from './graphql/graphql'; + +export { Direction, Status }; +export type { Teleport }; diff --git a/frontend/src/features/swap/assets/bridge_vara.meta.txt b/frontend/src/features/swap/assets/bridge_vara.meta.txt new file mode 100644 index 00000000..f1049188 --- /dev/null +++ b/frontend/src/features/swap/assets/bridge_vara.meta.txt @@ -0,0 +1 @@ +000200010000000000010900000001120000000001130000000000011400000001150000008d34680008386272696467655f766172615f696f28496e6974436f6e666967000018014876616c696461746f725f7075625f6b6579730401305665633c4163746f7249643e0001406272696467655f617574686f7269747908011c4163746f724964000140656d657267656e63795f61646d696e730401305665633c4163746f7249643e000118636f6e666967140118436f6e666967000130696e5f6d6967726174696f6e200110626f6f6c0001246272696467655f69641801107531323800000400000208000810106773746418636f6d6d6f6e287072696d6974697665731c4163746f724964000004000c01205b75383b2033325d00000c0000032000000010001000000503001408386272696467655f766172615f696f18436f6e66696700001801286d696e5f616d6f756e741801107531323800015c6d696e5f76616c696461746f72735f726571756972656410010875380001446761735f666f725f6d6967726174696f6e1c010c75363400010c6665651801107531323800016876616c696461746f725f61737369676e65645f6164647265737308011c4163746f72496400014866616c6c6261636b5f726563697069656e7408011c4163746f72496400001800000507001c00000506002000000500002408386272696467655f766172615f696f30427269646765416374696f6e000168405472616e73697456617261546f457468080124726563697069656e74280118537472696e67000118616d6f756e7418011075313238000000545472616e736974457468546f5661726142617463680c012474656c65706f7274732c01585665633c457468546f566172615472616e736665723e00013c7369676e6174757265735f646174613c01305665633c536967446174613e0001686c6173745f65786563757465645f6574685f6e6f6e63655f6964340110553235360001004855706461746556616c696461746f724b65790401446e65775f76616c696461746f725f6b657908011c4163746f7249640002003853746172744d6967726174696f6e0003004c53657450726576696f7573436f6e747261637404014470726576696f75735f636f6e747261637408011c4163746f724964000400344d6967726174654e6f6e6365730401306e65775f636f6e747261637408011c4163746f724964000500245365744e6f6e636573080144766172615f746f5f6574685f6e6f6e6365340110553235360001446574685f746f5f766172615f6e6f6e63653401105532353600060030456e644d6967726174696f6e00070054557064617465427269646765417574686f726974790401506e65775f6272696467655f617574686f7269747908011c4163746f72496400080044416464456d657267656e637941646d696e04014c6e65775f656d657267656e63795f61646d696e08011c4163746f7249640009005052656d6f7665456d657267656e637941646d696e040164656d657267656e63795f61646d696e5f746f5f72656d6f766508011c4163746f724964000a003441646456616c696461746f72730401486e65775f76616c696461746f725f6b6579730401305665633c4163746f7249643e000b004052656d6f766556616c696461746f727304016076616c696461746f725f6b6579735f746f5f72656d6f76650401305665633c4163746f7249643e000c002455706461746546656504011c6e65775f66656518011075313238000d003c5570646174654d696e416d6f756e740401286d696e5f616d6f756e7418011075313238000e006c5570646174654d696e56616c696461746f7273526571756972656404015c6d696e5f76616c696461746f72735f72657175697265641001087538000f007855706461746556616c696461746f7241737369676e65644164647265737304012c6e65775f6164647265737308011c4163746f7249640010005c55706461746546616c6c6261636b526563697069656e7404012c6e65775f6164647265737308011c4163746f724964001100544163746976617465456d657267656e637953746f700012005c44656163746976617465456d657267656e637953746f7000130054557064617465476173466f724d6967726174696f6e0401446761735f666f725f6d6967726174696f6e1c010c7536340014002c576974686472617746656504011c6163636f756e7408011c4163746f7249640015004453657456617261546f4574684e6f6e6365040144766172615f746f5f6574685f6e6f6e63653401105532353600160044536574457468546f566172614e6f6e63650401446574685f746f5f766172615f6e6f6e63653401105532353600170038436c6561725661726151756575650401686c6173745f65786563757465645f6574685f6e6f6e63655f6964340110553235360018002853657442616c616e6365001900002800000502002c00000230003008386272696467655f766172615f696f44457468546f566172615472616e73666572000010011873656e646572280118537472696e67000124726563697069656e7408011c4163746f724964000118616d6f756e74340110553235360001206e6f6e63655f696434011055323536000034083c7072696d69746976655f74797065731055323536000004003801205b7536343b20345d000038000003040000001c003c00000240004008386272696467655f766172615f696f1c53696744617461000008011c7075625f6b657908011c4163746f7249640001247369676e617475726544011c5665633c75383e00004400000210004808386272696467655f766172615f696f2c4272696467654576656e740001084454656c65706f727456617261546f45746810011873656e64657208011c4163746f724964000124726563697069656e74280118537472696e67000118616d6f756e74340110553235360001206e6f6e63655f6964340110553235360000004c5472616e736974746564457468546f5661726104012474656c65706f7274732c01585665633c457468546f566172615472616e736665723e000100004c0000040c2c3418005008386272696467655f766172615f696f285374617465517565727900013c2042726964676549640000004447657456617261546f4574684e6f6e636500010044476574457468546f566172614e6f6e63650002007047657456617261546f4574685472616e7366657273496e52616e676508012866726f6d5f696e64657834011055323536000120746f5f696e646578340110553235360003004c47657456616c696461746f725075624b6579730004005c4765744d696e56616c696461746f7252657175697265640005002c5661726142616c616e636500060060476574416c6c56617261546f4574685472616e73666572730007003c456d657267656e637941646d696e730008003c427269646765417574686f7269747900090018537461747573000a002c496e4d6967726174696f6e000b005850726576696f7573427269646765436f6e7472616374000c0018436f6e666967000d002846656542616c616e6365000e00005408386272696467655f766172615f696f2853746174655265706c7900013c2042726964676549640400180110753132380000003856617261546f4574684e6f6e636504003401105532353600010038457468546f566172614e6f6e63650400340110553235360002006456617261546f4574685472616e7366657273496e52616e67650801247472616e73666572735801585665633c56617261546f4574685472616e736665723e0001886c6173745f65786563757465645f6574685f746f5f766172615f6e6f6e63655f6964340110553235360003004056616c696461746f725075624b65797304000401305665633c4163746f7249643e000400504d696e56616c696461746f725265717569726564040010010875380005002c5661726142616c616e636504001801107531323800060054416c6c56617261546f4574685472616e736665727304005801585665633c56617261546f4574685472616e736665723e0007003c456d657267656e637941646d696e7304000401305665633c4163746f7249643e0008003c427269646765417574686f72697479040008011c4163746f724964000900185374617475730400600118537461747573000a002c496e4d6967726174696f6e0400200110626f6f6c000b005850726576696f7573427269646765436f6e7472616374040064013c4f7074696f6e3c4163746f7249643e000c0018436f6e6669670400140118436f6e666967000d002846656542616c616e6365040018011075313238000e0000580000025c005c08386272696467655f766172615f696f4456617261546f4574685472616e73666572000010011873656e64657208011c4163746f724964000124726563697069656e74280118537472696e67000118616d6f756e74340110553235360001206e6f6e63655f69643401105532353600006008386272696467655f766172615f696f185374617475730001081841637469766500000040456d657267656e637953746f70706564000100006404184f7074696f6e04045401080108104e6f6e6500000010536f6d650400080000010000 \ No newline at end of file diff --git a/frontend/src/features/swap/assets/bridge_vara_wrapped_tokens.meta.txt b/frontend/src/features/swap/assets/bridge_vara_wrapped_tokens.meta.txt new file mode 100644 index 00000000..c4cb4c90 --- /dev/null +++ b/frontend/src/features/swap/assets/bridge_vara_wrapped_tokens.meta.txt @@ -0,0 +1 @@ +000200010000000000010c0000000114000000000115000000000001160000000117000000ed478c0008746272696467655f777261707065645f746f6b656e735f766172615f696f28496e6974436f6e666967000018014876616c696461746f725f7075625f6b6579730401305665633c4163746f7249643e0001406272696467655f617574686f7269747908011c4163746f724964000140656d657267656e63795f61646d696e730401305665633c4163746f7249643e000118636f6e666967140118436f6e666967000130696e5f6d6967726174696f6e2c0110626f6f6c0001246272696467655f69642001107531323800000400000208000810106773746418636f6d6d6f6e287072696d6974697665731c4163746f724964000004000c01205b75383b2033325d00000c0000032000000010001000000503001408746272696467655f777261707065645f746f6b656e735f766172615f696f18436f6e666967000034015c6d696e5f76616c696461746f72735f7265717569726564100108753800012c66745f746f6b656e5f696408011c4163746f7249640001546761735f666f725f746f6b656e5f6d696e74696e6718010c7536340001546761735f666f725f746f6b656e5f6275726e696e6718010c7536340001586761735f666f725f62617463685f7472616e7366657218010c75363400015c6761735f666f725f7472616e736665725f746f5f65746818010c7536340001347265706c795f74696d656f75741c010c7533320001347265706c795f6465706f73697418010c7536340001446761735f666f725f6d6967726174696f6e18010c75363400010c666565200110753132380001286d696e5f616d6f756e742401105532353600016876616c696461746f725f61737369676e65645f6164647265737308011c4163746f72496400014866616c6c6261636b5f726563697069656e7408011c4163746f72496400001800000506001c000005050020000005070024083c7072696d69746976655f74797065731055323536000004002801205b7536343b20345d0000280000030400000018002c00000500003008746272696467655f777261707065645f746f6b656e735f766172615f696f30427269646765416374696f6e000180405472616e73697456617261546f457468080124726563697069656e74340118537472696e67000118616d6f756e7424011055323536000000545472616e736974457468546f5661726142617463680c012474656c65706f7274733801585665633c457468546f566172615472616e736665723e00013c7369676e6174757265735f646174614001305665633c536967446174613e0001686c6173745f65786563757465645f6574685f6e6f6e63655f6964240110553235360001004855706461746556616c696461746f724b65790401446e65775f76616c696461746f725f6b657908011c4163746f7249640002003853746172744d6967726174696f6e0003004c53657450726576696f7573436f6e747261637404014470726576696f75735f636f6e747261637408011c4163746f724964000400344d6967726174654e6f6e6365730401306e65775f636f6e747261637408011c4163746f724964000500245365744e6f6e636573080144766172615f746f5f6574685f6e6f6e6365240110553235360001446574685f746f5f766172615f6e6f6e63652401105532353600060030456e644d6967726174696f6e00070054557064617465427269646765417574686f726974790401506e65775f6272696467655f617574686f7269747908011c4163746f72496400080044416464456d657267656e637941646d696e04014c6e65775f656d657267656e63795f61646d696e08011c4163746f7249640009005052656d6f7665456d657267656e637941646d696e040164656d657267656e63795f61646d696e5f746f5f72656d6f766508011c4163746f724964000a003441646456616c696461746f72730401486e65775f76616c696461746f725f6b6579730401305665633c4163746f7249643e000b004052656d6f766556616c696461746f727304016076616c696461746f725f6b6579735f746f5f72656d6f76650401305665633c4163746f7249643e000c002455706461746546656504011c6e65775f66656520011075313238000d003c5570646174654d696e416d6f756e740401286d696e5f616d6f756e7424011055323536000e006c5570646174654d696e56616c696461746f7273526571756972656404015c6d696e5f76616c696461746f72735f72657175697265641001087538000f007855706461746556616c696461746f7241737369676e65644164647265737304012c6e65775f6164647265737308011c4163746f7249640010005c55706461746546616c6c6261636b526563697069656e7404012c6e65775f6164647265737308011c4163746f724964001100544163746976617465456d657267656e637953746f700012005c44656163746976617465456d657267656e637953746f7000130054557064617465476173466f724d6967726174696f6e0401446761735f666f725f6d6967726174696f6e18010c7536340014002c576974686472617746656504011c6163636f756e7408011c4163746f7249640015004453657456617261546f4574684e6f6e6365040144766172615f746f5f6574685f6e6f6e63652401105532353600160044536574457468546f566172614e6f6e63650401446574685f746f5f766172615f6e6f6e63652401105532353600170038436c6561725661726151756575650401686c6173745f65786563757465645f6574685f6e6f6e63655f6964240110553235360018003c5570646174654674546f6b656e496404012c66745f746f6b656e5f696408011c4163746f72496400190060557064617465476173466f72546f6b656e4d696e74696e670401546761735f666f725f746f6b656e5f6d696e74696e6718010c753634001a0060557064617465476173466f72546f6b656e4275726e696e670401546761735f666f725f746f6b656e5f6275726e696e6718010c753634001b0064557064617465476173466f725472616e73666572546f45746804015c6761735f666f725f7472616e736665725f746f5f65746818010c753634001c00485570646174655265706c7954696d656f75740401347265706c795f74696d656f75741c010c753332001d00485570646174655265706c794465706f7369740401347265706c795f6465706f73697418010c753634001e0038436f6d706c657465416374696f6e0401186d73675f69644c01244d6573736167654964001f0000340000050200380000023c003c08746272696467655f777261707065645f746f6b656e735f766172615f696f44457468546f566172615472616e73666572000010011873656e646572340118537472696e67000124726563697069656e7408011c4163746f724964000118616d6f756e74240110553235360001206e6f6e63655f69642401105532353600004000000244004408746272696467655f777261707065645f746f6b656e735f766172615f696f1c53696744617461000008011c7075625f6b657908011c4163746f7249640001247369676e617475726548011c5665633c75383e00004800000210004c10106773746418636f6d6d6f6e287072696d697469766573244d6573736167654964000004000c01205b75383b2033325d00005008746272696467655f777261707065645f746f6b656e735f766172615f696f2c4272696467654576656e740001084454656c65706f727456617261546f45746810011873656e64657208011c4163746f724964000124726563697069656e74340118537472696e67000118616d6f756e74240110553235360001206e6f6e63655f6964240110553235360000004c5472616e736974746564457468546f5661726104012474656c65706f7274733801585665633c457468546f566172615472616e736665723e00010000540000040c382420005808746272696467655f777261707065645f746f6b656e735f766172615f696f28537461746551756572790001402042726964676549640000004447657456617261546f4574684e6f6e636500010044476574457468546f566172614e6f6e63650002007047657456617261546f4574685472616e7366657273496e52616e676508012866726f6d5f696e64657824011055323536000120746f5f696e646578240110553235360003004c47657456616c696461746f725075624b6579730004005c4765744d696e56616c696461746f72526571756972656400050018436f6e66696700060060476574416c6c56617261546f4574685472616e73666572730007003c456d657267656e637941646d696e730008003c427269646765417574686f7269747900090018537461747573000a002c496e4d6967726174696f6e000b005850726576696f7573427269646765436f6e7472616374000c002846656542616c616e6365000d00384d73674964546f5061796c6f6164000e004c57616974696e675265706c79546f4d73674964000f00005c08746272696467655f777261707065645f746f6b656e735f766172615f696f2853746174655265706c790001402042726964676549640400200110753132380000003856617261546f4574684e6f6e636504002401105532353600010038457468546f566172614e6f6e63650400240110553235360002006456617261546f4574685472616e7366657273496e52616e67650801247472616e73666572736001585665633c56617261546f4574685472616e736665723e0001886c6173745f65786563757465645f6574685f746f5f766172615f6e6f6e63655f6964240110553235360003004056616c696461746f725075624b65797304000401305665633c4163746f7249643e000400504d696e56616c696461746f7252657175697265640400100108753800050054416c6c56617261546f4574685472616e736665727304006001585665633c56617261546f4574685472616e736665723e0006003c456d657267656e637941646d696e7304000401305665633c4163746f7249643e0007003c427269646765417574686f72697479040008011c4163746f7249640008001853746174757304006801185374617475730009002c496e4d6967726174696f6e04002c0110626f6f6c000a005850726576696f7573427269646765436f6e747261637404006c013c4f7074696f6e3c4163746f7249643e000b0018436f6e6669670400140118436f6e666967000c002846656542616c616e6365040020011075313238000d00384d73674964546f5061796c6f616404007001cc5665633c284d65737361676549642c20284d6573736167655374617475732c20416374696f6e546f436f6d706c65746529293e000e004c57616974696e675265706c79546f4d73674964040084016c5665633c284d65737361676549642c204d6573736167654964293e000f00006000000264006408746272696467655f777261707065645f746f6b656e735f766172615f696f4456617261546f4574685472616e73666572000010011873656e64657208011c4163746f724964000124726563697069656e74340118537472696e67000118616d6f756e74240110553235360001206e6f6e63655f69642401105532353600006808746272696467655f777261707065645f746f6b656e735f766172615f696f185374617475730001081841637469766500000040456d657267656e637953746f70706564000100006c04184f7074696f6e04045401080108104e6f6e6500000010536f6d65040008000001000070000002740074000004084c780078000004087c80007c08746272696467655f777261707065645f746f6b656e735f766172615f696f344d65737361676553746174757300010c24496e50726f636573730000001c537563636573730001001c4661696c757265000200008008746272696467655f777261707065645f746f6b656e735f766172615f696f40416374696f6e546f436f6d706c65746500010858436f6d706c657465457468546f5661726142617463680c012474656c65706f7274733801585665633c457468546f566172615472616e736665723e0001446574685f746f5f766172615f6e6f6e6365240110553235360001686c6173745f65786563757465645f6574685f6e6f6e63655f69642401105532353600000044436f6d706c65746556617261546f4574680c011873656e64657208011c4163746f724964000124726563697069656e74340118537472696e67000118616d6f756e74240110553235360001000084000002880088000004084c4c00 \ No newline at end of file diff --git a/frontend/src/features/swap/assets/ft.idl b/frontend/src/features/swap/assets/ft.idl new file mode 100644 index 00000000..98b10aa2 --- /dev/null +++ b/frontend/src/features/swap/assets/ft.idl @@ -0,0 +1,94 @@ +type Init = struct { + name: str, + symbol: str, + decimals: u8, + description: str, + external_links: ExternalLinks, + initial_supply: u256, + max_supply: u256, + admin_id: ActorId, +}; + +type ExternalLinks = struct { + image: str, + website: opt str, + telegram: opt str, + twitter: opt str, + discord: opt str, + tokenomics: opt str, +}; + +type ActorId = struct { + [u8, 32], +}; + +type Role = enum { + Admin, + Burner, + Minter, +}; + +type Error = enum { + Paused, +}; + +constructor { + New : (init: Init); +}; + +service Admin { + AllowancesReserve : (additional: u32) -> null; + BalancesReserve : (additional: u32) -> null; + Burn : (from: actor_id, value: u256) -> bool; + GrantRole : (to: actor_id, role: Role) -> bool; + Kill : (inheritor: actor_id) -> null; + Mint : (to: actor_id, value: u256) -> bool; + MintBatch : (to: vec actor_id, values: vec u256) -> bool; + RemoveRole : (from: actor_id, role: Role) -> bool; + TransferToUsers : (to: vec actor_id, value: u256) -> bool; + query Allowances : (skip: u32, take: u32) -> vec struct { struct { actor_id, actor_id }, u256 }; + query Balances : (skip: u32, take: u32) -> vec struct { actor_id, u256 }; + query Description : () -> str; + query ExternalLinks : () -> ExternalLinks; + query MapsData : () -> struct { struct { u32, u32 }, struct { u32, u32 } }; + query MaxSupply : () -> u256; + + events { + BatchMinted: struct { to: vec actor_id, values: vec u256 }; + Minted: struct { to: actor_id, value: u256 }; + Burned: struct { from: actor_id, value: u256 }; + Killed: struct { inheritor: actor_id }; + TransferredToUsers: struct { from: actor_id, to: vec actor_id, value: u256 }; + } +}; + +service Erc20 { + Approve : (spender: actor_id, value: u256) -> bool; + Transfer : (to: actor_id, value: u256) -> bool; + TransferFrom : (from: actor_id, to: actor_id, value: u256) -> bool; + query Allowance : (owner: actor_id, spender: actor_id) -> u256; + query BalanceOf : (owner: actor_id) -> u256; + query Decimals : () -> u8; + query Name : () -> str; + query Symbol : () -> str; + query TotalSupply : () -> u256; + + events { + Approval: struct { owner: actor_id, spender: actor_id, value: u256 }; + Transfer: struct { from: actor_id, to: actor_id, value: u256 }; + } +}; + +service Pausable { + DelegateAdmin : (actor: actor_id) -> bool; + Pause : () -> bool; + Unpause : () -> bool; + query EnsureUnpaused : () -> result (null, Error); + query IsPaused : () -> bool; + + events { + Paused; + Unpaused; + } +}; + diff --git a/frontend/src/features/swap/assets/gas.svg b/frontend/src/features/swap/assets/gas.svg new file mode 100644 index 00000000..91dbcd39 --- /dev/null +++ b/frontend/src/features/swap/assets/gas.svg @@ -0,0 +1,3 @@ + + + diff --git a/frontend/src/features/swap/components/balance/balance.module.scss b/frontend/src/features/swap/components/balance/balance.module.scss new file mode 100644 index 00000000..1cc2a46e --- /dev/null +++ b/frontend/src/features/swap/components/balance/balance.module.scss @@ -0,0 +1,30 @@ +.container { + display: flex; + align-items: center; + gap: 16px; +} + +.balance { + display: flex; + flex-direction: column; + gap: 2px; + + letter-spacing: 0.15px; + white-space: nowrap; +} + +.header { + display: flex; + align-items: center; + gap: 10px; + + font-size: 12px; + + button { + color: #0ed3a3; + } +} + +.heading { + color: #313635; +} diff --git a/frontend/src/features/swap/components/balance/balance.tsx b/frontend/src/features/swap/components/balance/balance.tsx new file mode 100644 index 00000000..3fef4371 --- /dev/null +++ b/frontend/src/features/swap/components/balance/balance.tsx @@ -0,0 +1,47 @@ +import { Button } from '@gear-js/vara-ui'; + +import { Skeleton } from '@/components'; +import { SVGComponent } from '@/types'; + +import styles from './balance.module.scss'; + +type Props = { + value: string | undefined; + unit: string; + isLoading: boolean; + heading?: string; + SVG?: SVGComponent; + onMaxButtonClick?: () => void; +}; + +function Balance({ heading = 'Balance', value, unit, isLoading, SVG, onMaxButtonClick }: Props) { + return ( +
    + {SVG && } + +
    +
    + {heading}: + + {Boolean(onMaxButtonClick) && ( +
    + +

    + {isLoading && } + {!isLoading && !value && } + {value && `${value} ${unit}`} +

    +
    +
    + ); +} + +export { Balance }; diff --git a/frontend/src/features/swap/components/balance/index.ts b/frontend/src/features/swap/components/balance/index.ts new file mode 100644 index 00000000..d35c5d08 --- /dev/null +++ b/frontend/src/features/swap/components/balance/index.ts @@ -0,0 +1,3 @@ +import { Balance } from './balance'; + +export { Balance }; diff --git a/frontend/src/features/swap/components/index.ts b/frontend/src/features/swap/components/index.ts new file mode 100644 index 00000000..9546a8ba --- /dev/null +++ b/frontend/src/features/swap/components/index.ts @@ -0,0 +1,3 @@ +import { Swap } from './swap'; + +export { Swap }; diff --git a/frontend/src/features/swap/components/network/index.ts b/frontend/src/features/swap/components/network/index.ts new file mode 100644 index 00000000..d1a5332e --- /dev/null +++ b/frontend/src/features/swap/components/network/index.ts @@ -0,0 +1,3 @@ +import { Network } from './network'; + +export { Network }; diff --git a/frontend/src/features/swap/components/network/network.module.scss b/frontend/src/features/swap/components/network/network.module.scss new file mode 100644 index 00000000..90c3b98d --- /dev/null +++ b/frontend/src/features/swap/components/network/network.module.scss @@ -0,0 +1,17 @@ +.network { + display: grid; + grid-template-columns: 2.5fr 7.5fr; + align-items: center; + gap: 32px; +} + +.inputs { + display: flex; + flex-direction: column; + gap: 24px; +} + +.input { + display: flex; + gap: 16px; +} diff --git a/frontend/src/features/swap/components/network/network.tsx b/frontend/src/features/swap/components/network/network.tsx new file mode 100644 index 00000000..1de13d33 --- /dev/null +++ b/frontend/src/features/swap/components/network/network.tsx @@ -0,0 +1,86 @@ +import { Input, Select, SelectProps } from '@gear-js/vara-ui'; +import { Controller } from 'react-hook-form'; +import { NumericFormat } from 'react-number-format'; +import { SourceType } from 'react-number-format/types/types'; + +import EthSVG from '@/assets/eth.svg?react'; +import VaraSVG from '@/assets/vara.svg?react'; +import { NetworkCard } from '@/components'; +import { Pair, SVGComponent } from '@/types'; + +import { FIELD_NAME } from '../../consts'; + +import styles from './network.module.scss'; + +type Props = { + name: string; + SVG: SVGComponent; + options: SelectProps['options']; + selectValue: Pair; + inputName: typeof FIELD_NAME.VALUE | typeof FIELD_NAME.EXPECTED_VALUE; + onChange: (value: string) => void; + onSelectChange: (value: Pair) => void; + renderBalance?: () => JSX.Element; +}; + +function Network({ + name, + SVG, + options, + selectValue, + inputName, + onChange, + onSelectChange, + renderBalance = () => <>, +}: Props) { + return ( +
    + + +
    + + + +
    + +
    + + +
    + + + ); +} + +export { SwapForm }; diff --git a/frontend/src/features/swap/components/swap-form/swap-vara-form.tsx b/frontend/src/features/swap/components/swap-form/swap-vara-form.tsx new file mode 100644 index 00000000..b8e4e80d --- /dev/null +++ b/frontend/src/features/swap/components/swap-form/swap-vara-form.tsx @@ -0,0 +1,28 @@ +import { useAccount } from '@gear-js/react-hooks'; + +import { NETWORK_NAME } from '@/consts'; + +import { useHandleVaraSubmit, useVaraBalance, useVaraConfig } from '../../hooks'; + +import { SwapForm } from './swap-form'; + +type Props = { + renderSwapNetworkButton: () => JSX.Element; +}; + +function SwapVaraForm({ renderSwapNetworkButton }: Props) { + const { account } = useAccount(); + + return ( + + ); +} + +export { SwapVaraForm }; diff --git a/frontend/src/features/swap/components/swap/index.ts b/frontend/src/features/swap/components/swap/index.ts new file mode 100644 index 00000000..9546a8ba --- /dev/null +++ b/frontend/src/features/swap/components/swap/index.ts @@ -0,0 +1,3 @@ +import { Swap } from './swap'; + +export { Swap }; diff --git a/frontend/src/features/swap/components/swap/swap.module.scss b/frontend/src/features/swap/components/swap/swap.module.scss new file mode 100644 index 00000000..130dc9ae --- /dev/null +++ b/frontend/src/features/swap/components/swap/swap.module.scss @@ -0,0 +1,40 @@ +.card { + border-radius: 12px; + + position: relative; + + &::after { + content: ''; + position: absolute; + z-index: -1; + + padding: 1px; /* border thickness */ + border-radius: inherit; + + inset: 0; + mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0); + mask-composite: exclude; + + background-image: linear-gradient(180deg, rgba(225, 225, 227, 0) 0%, #e1e1e3 39%); + } + + &.active { + &::after { + background-image: linear-gradient(180deg, rgba(0, 255, 196, 0) 0%, #00ffc4 39%); + } + } +} + +.header { + padding: 24px 32px 0; + + display: grid; + grid-template-columns: 2.5fr 7.5fr; + align-items: center; + gap: 32px; +} + +.label { + font-size: 16px; + font-weight: 500; +} diff --git a/frontend/src/features/swap/components/swap/swap.tsx b/frontend/src/features/swap/components/swap/swap.tsx new file mode 100644 index 00000000..d42a8140 --- /dev/null +++ b/frontend/src/features/swap/components/swap/swap.tsx @@ -0,0 +1,45 @@ +import { useAccount } from '@gear-js/react-hooks'; +import { useMemo, useState } from 'react'; + +import { useEthAccount } from '@/hooks'; +import { cx } from '@/utils'; + +import { SwapEthForm, SwapVaraForm } from '../swap-form'; + +import styles from './swap.module.scss'; + +type Props = { + renderWalletField: () => JSX.Element | null; + renderSwapNetworkButton: (onClick: () => void) => JSX.Element; +}; + +function Swap({ renderWalletField, renderSwapNetworkButton }: Props) { + const { account } = useAccount(); + const ethAccount = useEthAccount(); + + const [isEthNetwork, setIsEthNetwork] = useState(ethAccount.isConnected); + + const Form = useMemo(() => { + // since eth account is reconnecting immediately without any visible loading state, + // and in swap form vara is the first network by default, + // check for loading status (isAccountReady || ethAccount.isReconnecting) is minor and can be neglected + if (ethAccount.isConnected) return SwapEthForm; + if (account) return SwapVaraForm; + + return isEthNetwork ? SwapEthForm : SwapVaraForm; + }, [isEthNetwork, ethAccount, account]); + + return ( +
    +
    +

    From wallet:

    + + {renderWalletField()} +
    + +
    renderSwapNetworkButton(() => setIsEthNetwork((prevValue) => !prevValue))} /> +
    + ); +} + +export { Swap }; diff --git a/frontend/src/features/swap/consts/abi/abi.ts b/frontend/src/features/swap/consts/abi/abi.ts new file mode 100644 index 00000000..5bd5b2c1 --- /dev/null +++ b/frontend/src/features/swap/consts/abi/abi.ts @@ -0,0 +1,2145 @@ +const ABI = [ + { + inputs: [ + { + internalType: 'uint256', + name: '_bridgeId', + type: 'uint256', + }, + { + internalType: 'address', + name: '_addressOfToken', + type: 'address', + }, + { + internalType: 'uint8', + name: '_signaturesThreshold', + type: 'uint8', + }, + { + internalType: 'uint256', + name: '_minAmount', + type: 'uint256', + }, + { + internalType: 'uint256', + name: '_fee', + type: 'uint256', + }, + { + components: [ + { + internalType: 'uint256', + name: 'x', + type: 'uint256', + }, + { + internalType: 'uint256', + name: 'y', + type: 'uint256', + }, + ], + internalType: 'struct LibSecp256k1.Point[]', + name: '_configAuthorityKeys', + type: 'tuple[]', + }, + { + internalType: 'address[]', + name: '_emergencyAdmins', + type: 'address[]', + }, + { + internalType: 'address[]', + name: '_validatorPublicKeys', + type: 'address[]', + }, + { + internalType: 'uint8', + name: '_minValidatorsRequired', + type: 'uint8', + }, + { + internalType: 'bool', + name: '_requireMigration', + type: 'bool', + }, + ], + stateMutability: 'nonpayable', + type: 'constructor', + }, + { + inputs: [], + name: 'AccessControlBadConfirmation', + type: 'error', + }, + { + inputs: [ + { + internalType: 'address', + name: 'account', + type: 'address', + }, + { + internalType: 'bytes32', + name: 'neededRole', + type: 'bytes32', + }, + ], + name: 'AccessControlUnauthorizedAccount', + type: 'error', + }, + { + inputs: [ + { + internalType: 'uint256', + name: 'feeBalance', + type: 'uint256', + }, + { + internalType: 'uint256', + name: 'amount', + type: 'uint256', + }, + ], + name: 'AmountExceedsAvailableFeeBalance', + type: 'error', + }, + { + inputs: [], + name: 'AuthorityKeyAlreadyExists', + type: 'error', + }, + { + inputs: [], + name: 'CallerNotValidator', + type: 'error', + }, + { + inputs: [], + name: 'ContractAlreadyInEmergencyMode', + type: 'error', + }, + { + inputs: [], + name: 'ContractInMigration', + type: 'error', + }, + { + inputs: [], + name: 'DuplicatePublicKeyIDs', + type: 'error', + }, + { + inputs: [], + name: 'DuplicateSignaturesDetected', + type: 'error', + }, + { + inputs: [], + name: 'ECDSAInvalidSignature', + type: 'error', + }, + { + inputs: [ + { + internalType: 'uint256', + name: 'length', + type: 'uint256', + }, + ], + name: 'ECDSAInvalidSignatureLength', + type: 'error', + }, + { + inputs: [ + { + internalType: 'bytes32', + name: 's', + type: 'bytes32', + }, + ], + name: 'ECDSAInvalidSignatureS', + type: 'error', + }, + { + inputs: [], + name: 'EmergencyStopActive', + type: 'error', + }, + { + inputs: [], + name: 'ErrorDuringMigration', + type: 'error', + }, + { + inputs: [ + { + internalType: 'address', + name: 'to', + type: 'address', + }, + ], + name: 'EtherSendFailure', + type: 'error', + }, + { + inputs: [], + name: 'IndexOutOfBounds', + type: 'error', + }, + { + inputs: [ + { + internalType: 'uint256', + name: 'provided', + type: 'uint256', + }, + { + internalType: 'uint256', + name: 'required', + type: 'uint256', + }, + ], + name: 'InsufficientFee', + type: 'error', + }, + { + inputs: [ + { + internalType: 'uint256', + name: 'required', + type: 'uint256', + }, + ], + name: 'InsufficientSigners', + type: 'error', + }, + { + inputs: [ + { + internalType: 'uint8', + name: 'threshold', + type: 'uint8', + }, + { + internalType: 'uint256', + name: 'signersAmount', + type: 'uint256', + }, + ], + name: 'InsufficientSignersError', + type: 'error', + }, + { + inputs: [ + { + internalType: 'uint256', + name: 'from', + type: 'uint256', + }, + { + internalType: 'uint256', + name: 'to', + type: 'uint256', + }, + ], + name: 'InvalidIndexRange', + type: 'error', + }, + { + inputs: [], + name: 'MigrationNotActive', + type: 'error', + }, + { + inputs: [], + name: 'MigrationOfNullElements', + type: 'error', + }, + { + inputs: [ + { + internalType: 'address', + name: '', + type: 'address', + }, + ], + name: 'NonAuthorisedValidator', + type: 'error', + }, + { + inputs: [], + name: 'NonSequentialNonceArray', + type: 'error', + }, + { + inputs: [ + { + internalType: 'address', + name: 'caller', + type: 'address', + }, + ], + name: 'NotAuthority', + type: 'error', + }, + { + inputs: [ + { + internalType: 'address', + name: '', + type: 'address', + }, + ], + name: 'NotEmerencyAdmin', + type: 'error', + }, + { + inputs: [ + { + internalType: 'address', + name: 'caller', + type: 'address', + }, + ], + name: 'NotEmergencyAdmin', + type: 'error', + }, + { + inputs: [ + { + internalType: 'uint256', + name: 'amount', + type: 'uint256', + }, + { + internalType: 'uint256', + name: 'balance', + type: 'uint256', + }, + ], + name: 'NotEnoughBalance', + type: 'error', + }, + { + inputs: [], + name: 'NotInEmergencyStop', + type: 'error', + }, + { + inputs: [], + name: 'PointNotOnCurve', + type: 'error', + }, + { + inputs: [], + name: 'ReentrancyGuardReentrantCall', + type: 'error', + }, + { + inputs: [ + { + internalType: 'address', + name: 'expected', + type: 'address', + }, + { + internalType: 'address', + name: 'provided', + type: 'address', + }, + ], + name: 'SignatureMismatch', + type: 'error', + }, + { + inputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256', + }, + ], + name: 'SignersReducedBelowThreshold', + type: 'error', + }, + { + inputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256', + }, + ], + name: 'ThresholdExceedsSignerCount', + type: 'error', + }, + { + inputs: [ + { + internalType: 'uint256', + name: 'amount', + type: 'uint256', + }, + { + internalType: 'uint256', + name: 'minAmount', + type: 'uint256', + }, + ], + name: 'TooLowAmount', + type: 'error', + }, + { + inputs: [], + name: 'TransfersArrayEmpty', + type: 'error', + }, + { + inputs: [], + name: 'TryingToMigrateNullElement', + type: 'error', + }, + { + inputs: [ + { + internalType: 'address', + name: 'expectedPreviousContract', + type: 'address', + }, + { + internalType: 'address', + name: 'attemptedFrom', + type: 'address', + }, + ], + name: 'UnauthorizedMigration', + type: 'error', + }, + { + inputs: [ + { + internalType: 'address', + name: '', + type: 'address', + }, + ], + name: 'ValidatorExists', + type: 'error', + }, + { + inputs: [ + { + internalType: 'uint256', + name: 'validatorsRequired', + type: 'uint256', + }, + ], + name: 'ValidatorsNotReached', + type: 'error', + }, + { + inputs: [ + { + internalType: 'string', + name: '', + type: 'string', + }, + ], + name: 'VaraAddressNotValid', + type: 'error', + }, + { + inputs: [ + { + internalType: 'string', + name: '', + type: 'string', + }, + ], + name: 'VerificationFailed', + type: 'error', + }, + { + inputs: [ + { + internalType: 'uint256', + name: 'expected', + type: 'uint256', + }, + { + internalType: 'uint256', + name: 'provided', + type: 'uint256', + }, + ], + name: 'WrongMinNonceId', + type: 'error', + }, + { + inputs: [], + name: 'ZeroAmount', + type: 'error', + }, + { + inputs: [], + name: 'ZeroSignatureThreshold', + type: 'error', + }, + { + inputs: [], + name: 'ZeroThreshold', + type: 'error', + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: 'address', + name: 'sender', + type: 'address', + }, + { + indexed: false, + internalType: 'string', + name: 'recipient', + type: 'string', + }, + { + indexed: false, + internalType: 'uint256', + name: 'amount', + type: 'uint256', + }, + { + indexed: false, + internalType: 'uint256', + name: 'nonceId', + type: 'uint256', + }, + ], + name: 'EthToVaraTransferEvent', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'address', + name: 'to', + type: 'address', + }, + { + indexed: false, + internalType: 'uint256', + name: 'amount', + type: 'uint256', + }, + ], + name: 'EtherWithdrawn', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: 'uint256', + name: 'newFee', + type: 'uint256', + }, + ], + name: 'FeeUpdated', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'address', + name: 'sender', + type: 'address', + }, + { + indexed: false, + internalType: 'uint256', + name: 'amount', + type: 'uint256', + }, + ], + name: 'Received', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'bytes32', + name: 'role', + type: 'bytes32', + }, + { + indexed: true, + internalType: 'bytes32', + name: 'previousAdminRole', + type: 'bytes32', + }, + { + indexed: true, + internalType: 'bytes32', + name: 'newAdminRole', + type: 'bytes32', + }, + ], + name: 'RoleAdminChanged', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'bytes32', + name: 'role', + type: 'bytes32', + }, + { + indexed: true, + internalType: 'address', + name: 'account', + type: 'address', + }, + { + indexed: true, + internalType: 'address', + name: 'sender', + type: 'address', + }, + ], + name: 'RoleGranted', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'bytes32', + name: 'role', + type: 'bytes32', + }, + { + indexed: true, + internalType: 'address', + name: 'account', + type: 'address', + }, + { + indexed: true, + internalType: 'address', + name: 'sender', + type: 'address', + }, + ], + name: 'RoleRevoked', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + components: [ + { + internalType: 'string', + name: 'sender', + type: 'string', + }, + { + internalType: 'address payable', + name: 'recipient', + type: 'address', + }, + { + internalType: 'uint256', + name: 'amount', + type: 'uint256', + }, + { + internalType: 'uint256', + name: 'nonceId', + type: 'uint256', + }, + ], + indexed: false, + internalType: 'struct Bridge.VaraToEthTransfer[]', + name: 'varaToEthTransfers', + type: 'tuple[]', + }, + ], + name: 'VaraToEthTransferEvent', + type: 'event', + }, + { + inputs: [], + name: 'DEFAULT_ADMIN_ROLE', + outputs: [ + { + internalType: 'bytes32', + name: '', + type: 'bytes32', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'EMERGENCY_ADMIN_ROLE', + outputs: [ + { + internalType: 'bytes32', + name: '', + type: 'bytes32', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'bytes32', + name: 'signature', + type: 'bytes32', + }, + { + internalType: 'bytes20', + name: 'commitmentAggregated', + type: 'bytes20', + }, + { + internalType: 'bytes20', + name: 'commitmentSigners', + type: 'bytes20', + }, + { + internalType: 'uint256[]', + name: 'pubKeysIds', + type: 'uint256[]', + }, + ], + name: 'activateEmergencyStopByConfigAuthority', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [], + name: 'activeEmergencyStopByEmergencyAdmin', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'bytes32', + name: 'signature', + type: 'bytes32', + }, + { + internalType: 'bytes20', + name: 'commitmentAggregated', + type: 'bytes20', + }, + { + internalType: 'bytes20', + name: 'commitmentSigners', + type: 'bytes20', + }, + { + internalType: 'uint256[]', + name: 'pubKeysIds', + type: 'uint256[]', + }, + { + components: [ + { + internalType: 'uint256', + name: 'x', + type: 'uint256', + }, + { + internalType: 'uint256', + name: 'y', + type: 'uint256', + }, + ], + internalType: 'struct LibSecp256k1.Point', + name: '_configAuthorityKey', + type: 'tuple', + }, + ], + name: 'addConfigAuthorityKey', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'bytes32', + name: 'signature', + type: 'bytes32', + }, + { + internalType: 'bytes20', + name: 'commitmentAggregated', + type: 'bytes20', + }, + { + internalType: 'bytes20', + name: 'commitmentSigners', + type: 'bytes20', + }, + { + internalType: 'uint256[]', + name: 'pubKeysIds', + type: 'uint256[]', + }, + { + internalType: 'address', + name: 'newValidatorAddress', + type: 'address', + }, + ], + name: 'addValidator', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [], + name: 'addressOfToken', + outputs: [ + { + internalType: 'address', + name: '', + type: 'address', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'authorityNonce', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'bridgeId', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'bytes[]', + name: 'signatures', + type: 'bytes[]', + }, + ], + name: 'checkUniqueness', + outputs: [ + { + internalType: 'bool', + name: '', + type: 'bool', + }, + ], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256', + }, + ], + name: 'configAuthorityKeys', + outputs: [ + { + internalType: 'uint256', + name: 'x', + type: 'uint256', + }, + { + internalType: 'uint256', + name: 'y', + type: 'uint256', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'bytes32', + name: 'signature', + type: 'bytes32', + }, + { + internalType: 'bytes20', + name: 'commitmentAggregated', + type: 'bytes20', + }, + { + internalType: 'bytes20', + name: 'commitmentSigners', + type: 'bytes20', + }, + { + internalType: 'uint256[]', + name: 'pubKeysIds', + type: 'uint256[]', + }, + ], + name: 'deactivateEmergencyStop', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [], + name: 'emergencyStopped', + outputs: [ + { + internalType: 'bool', + name: '', + type: 'bool', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'bytes32', + name: 'signature', + type: 'bytes32', + }, + { + internalType: 'bytes20', + name: 'commitmentAggregated', + type: 'bytes20', + }, + { + internalType: 'bytes20', + name: 'commitmentSigners', + type: 'bytes20', + }, + { + internalType: 'uint256[]', + name: 'pubKeysIds', + type: 'uint256[]', + }, + ], + name: 'endMigration', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [], + name: 'ethToVaraNonce', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256', + }, + ], + name: 'ethToVaraTransfers', + outputs: [ + { + internalType: 'address', + name: 'sender', + type: 'address', + }, + { + internalType: 'string', + name: 'recipient', + type: 'string', + }, + { + internalType: 'uint256', + name: 'amount', + type: 'uint256', + }, + { + internalType: 'uint256', + name: 'nonceId', + type: 'uint256', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'fee', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'feeBalance', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'getAllValidatorPublicKeys', + outputs: [ + { + internalType: 'address[]', + name: '', + type: 'address[]', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'getAuthorityEthAddresses', + outputs: [ + { + internalType: 'address[]', + name: '', + type: 'address[]', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'getConfigAuthorityKeys', + outputs: [ + { + components: [ + { + internalType: 'uint256', + name: 'x', + type: 'uint256', + }, + { + internalType: 'uint256', + name: 'y', + type: 'uint256', + }, + ], + internalType: 'struct LibSecp256k1.Point[]', + name: '', + type: 'tuple[]', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'uint256', + name: 'fromIndex', + type: 'uint256', + }, + { + internalType: 'uint256', + name: 'toIndex', + type: 'uint256', + }, + ], + name: 'getEthToVaraTransfersInRange', + outputs: [ + { + components: [ + { + internalType: 'address', + name: 'sender', + type: 'address', + }, + { + internalType: 'string', + name: 'recipient', + type: 'string', + }, + { + internalType: 'uint256', + name: 'amount', + type: 'uint256', + }, + { + internalType: 'uint256', + name: 'nonceId', + type: 'uint256', + }, + ], + internalType: 'struct Bridge.EthToVaraTransfer[]', + name: '', + type: 'tuple[]', + }, + { + internalType: 'uint256', + name: '', + type: 'uint256', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'getLastEthToVaraNonce', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'getLastVaraToEthNonce', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'bytes32', + name: 'role', + type: 'bytes32', + }, + ], + name: 'getRoleAdmin', + outputs: [ + { + internalType: 'bytes32', + name: '', + type: 'bytes32', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'bytes32', + name: 'signature', + type: 'bytes32', + }, + { + internalType: 'bytes20', + name: 'commitmentAggregated', + type: 'bytes20', + }, + { + internalType: 'bytes20', + name: 'commitmentSigners', + type: 'bytes20', + }, + { + internalType: 'uint256[]', + name: 'pubKeysIds', + type: 'uint256[]', + }, + { + internalType: 'address', + name: 'newEmergencyAdmin', + type: 'address', + }, + ], + name: 'grantEmergencyAdminRole', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'bytes32', + name: 'role', + type: 'bytes32', + }, + { + internalType: 'address', + name: 'account', + type: 'address', + }, + ], + name: 'grantRole', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'bytes32', + name: 'role', + type: 'bytes32', + }, + { + internalType: 'address', + name: 'account', + type: 'address', + }, + ], + name: 'hasRole', + outputs: [ + { + internalType: 'bool', + name: '', + type: 'bool', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'inMigration', + outputs: [ + { + internalType: 'bool', + name: '', + type: 'bool', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + components: [ + { + internalType: 'uint256', + name: 'x', + type: 'uint256', + }, + { + internalType: 'uint256', + name: 'y', + type: 'uint256', + }, + ], + internalType: 'struct LibSecp256k1.Point', + name: '_configAuthorityKey', + type: 'tuple', + }, + ], + name: 'isKeyNotPresent', + outputs: [ + { + internalType: 'bool', + name: '', + type: 'bool', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'string', + name: '_addr', + type: 'string', + }, + ], + name: 'isValidVaraAddress', + outputs: [ + { + internalType: 'bool', + name: '', + type: 'bool', + }, + ], + stateMutability: 'pure', + type: 'function', + }, + { + inputs: [ + { + internalType: 'address', + name: '_validator', + type: 'address', + }, + ], + name: 'isValidator', + outputs: [ + { + internalType: 'bool', + name: '', + type: 'bool', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'uint256', + name: 'authorityKeyId', + type: 'uint256', + }, + { + internalType: 'address', + name: 'newContract', + type: 'address', + }, + { + internalType: 'uint256', + name: 'start', + type: 'uint256', + }, + { + internalType: 'uint256', + name: 'count', + type: 'uint256', + }, + ], + name: 'migrateEthToVaraTransfers', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'uint256', + name: 'authorityKeyId', + type: 'uint256', + }, + { + internalType: 'address', + name: 'newContract', + type: 'address', + }, + ], + name: 'migrateNonces', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [], + name: 'minAmount', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'minValidatorsRequired', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'previousContract', + outputs: [ + { + internalType: 'address', + name: '', + type: 'address', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + components: [ + { + internalType: 'address', + name: 'sender', + type: 'address', + }, + { + internalType: 'string', + name: 'recipient', + type: 'string', + }, + { + internalType: 'uint256', + name: 'amount', + type: 'uint256', + }, + { + internalType: 'uint256', + name: 'nonceId', + type: 'uint256', + }, + ], + internalType: 'struct Bridge.EthToVaraTransfer[]', + name: 'transfers', + type: 'tuple[]', + }, + ], + name: 'receiveEthToVaraTransfers', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'bytes32', + name: 'signature', + type: 'bytes32', + }, + { + internalType: 'bytes20', + name: 'commitmentAggregated', + type: 'bytes20', + }, + { + internalType: 'bytes20', + name: 'commitmentSigners', + type: 'bytes20', + }, + { + internalType: 'uint256[]', + name: 'pubKeysIds', + type: 'uint256[]', + }, + { + internalType: 'uint256', + name: '_configAuthorityKeyId', + type: 'uint256', + }, + ], + name: 'removeConfigAuthorityKey', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'bytes32', + name: 'signature', + type: 'bytes32', + }, + { + internalType: 'bytes20', + name: 'commitmentAggregated', + type: 'bytes20', + }, + { + internalType: 'bytes20', + name: 'commitmentSigners', + type: 'bytes20', + }, + { + internalType: 'uint256[]', + name: 'pubKeysIds', + type: 'uint256[]', + }, + { + internalType: 'address', + name: 'validatorAddress', + type: 'address', + }, + ], + name: 'removeValidator', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'bytes32', + name: 'role', + type: 'bytes32', + }, + { + internalType: 'address', + name: 'callerConfirmation', + type: 'address', + }, + ], + name: 'renounceRole', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'bytes32', + name: 'signature', + type: 'bytes32', + }, + { + internalType: 'bytes20', + name: 'commitmentAggregated', + type: 'bytes20', + }, + { + internalType: 'bytes20', + name: 'commitmentSigners', + type: 'bytes20', + }, + { + internalType: 'uint256[]', + name: 'pubKeysIds', + type: 'uint256[]', + }, + { + internalType: 'address', + name: 'emergencyAdmin', + type: 'address', + }, + ], + name: 'revokeEmergencyAdminRole', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'bytes32', + name: 'role', + type: 'bytes32', + }, + { + internalType: 'address', + name: 'account', + type: 'address', + }, + ], + name: 'revokeRole', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'uint256', + name: '_ethToVaraNonce', + type: 'uint256', + }, + { + internalType: 'uint256', + name: '_varaToEthNonce', + type: 'uint256', + }, + ], + name: 'setNonces', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'bytes32', + name: 'signature', + type: 'bytes32', + }, + { + internalType: 'bytes20', + name: 'commitmentAggregated', + type: 'bytes20', + }, + { + internalType: 'bytes20', + name: 'commitmentSigners', + type: 'bytes20', + }, + { + internalType: 'uint256[]', + name: 'pubKeysIds', + type: 'uint256[]', + }, + { + internalType: 'address', + name: '_previousContract', + type: 'address', + }, + ], + name: 'setPreviousContract', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [], + name: 'signaturesThreshold', + outputs: [ + { + internalType: 'uint8', + name: '', + type: 'uint8', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + components: [ + { + internalType: 'address', + name: 'sender', + type: 'address', + }, + { + internalType: 'string', + name: 'recipient', + type: 'string', + }, + { + internalType: 'uint256', + name: 'amount', + type: 'uint256', + }, + { + internalType: 'uint256', + name: 'nonceId', + type: 'uint256', + }, + ], + internalType: 'struct Bridge.EthToVaraTransfer[]', + name: 'transfers', + type: 'tuple[]', + }, + ], + name: 'sortTransactionNonces', + outputs: [ + { + internalType: 'uint256[]', + name: '', + type: 'uint256[]', + }, + ], + stateMutability: 'pure', + type: 'function', + }, + { + inputs: [ + { + components: [ + { + internalType: 'string', + name: 'sender', + type: 'string', + }, + { + internalType: 'address payable', + name: 'recipient', + type: 'address', + }, + { + internalType: 'uint256', + name: 'amount', + type: 'uint256', + }, + { + internalType: 'uint256', + name: 'nonceId', + type: 'uint256', + }, + ], + internalType: 'struct Bridge.VaraToEthTransfer[]', + name: 'transfers', + type: 'tuple[]', + }, + ], + name: 'sortTransactionNonces', + outputs: [ + { + internalType: 'uint256[]', + name: '', + type: 'uint256[]', + }, + ], + stateMutability: 'pure', + type: 'function', + }, + { + inputs: [ + { + internalType: 'bytes32', + name: 'signature', + type: 'bytes32', + }, + { + internalType: 'bytes20', + name: 'commitmentAggregated', + type: 'bytes20', + }, + { + internalType: 'bytes20', + name: 'commitmentSigners', + type: 'bytes20', + }, + { + internalType: 'uint256[]', + name: 'pubKeysIds', + type: 'uint256[]', + }, + ], + name: 'startMigration', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'bytes4', + name: 'interfaceId', + type: 'bytes4', + }, + ], + name: 'supportsInterface', + outputs: [ + { + internalType: 'bool', + name: '', + type: 'bool', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'string', + name: '_recipient', + type: 'string', + }, + { + internalType: 'uint256', + name: '_amount', + type: 'uint256', + }, + ], + name: 'transitEthToVara', + outputs: [], + stateMutability: 'payable', + type: 'function', + }, + { + inputs: [ + { + components: [ + { + internalType: 'string', + name: 'sender', + type: 'string', + }, + { + internalType: 'address payable', + name: 'recipient', + type: 'address', + }, + { + internalType: 'uint256', + name: 'amount', + type: 'uint256', + }, + { + internalType: 'uint256', + name: 'nonceId', + type: 'uint256', + }, + ], + internalType: 'struct Bridge.VaraToEthTransfer[]', + name: '_varaToEthTransfers', + type: 'tuple[]', + }, + { + internalType: 'bytes[]', + name: 'signatures', + type: 'bytes[]', + }, + { + internalType: 'uint256', + name: 'lastExecutedVaraNonceId', + type: 'uint256', + }, + ], + name: 'transitVaraToEthBatch', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'bytes32', + name: 'signature', + type: 'bytes32', + }, + { + internalType: 'bytes20', + name: 'commitmentAggregated', + type: 'bytes20', + }, + { + internalType: 'bytes20', + name: 'commitmentSigners', + type: 'bytes20', + }, + { + internalType: 'uint256[]', + name: 'pubKeysIds', + type: 'uint256[]', + }, + { + internalType: 'uint256', + name: 'newFee', + type: 'uint256', + }, + ], + name: 'updateFee', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'bytes32', + name: 'signature', + type: 'bytes32', + }, + { + internalType: 'bytes20', + name: 'commitmentAggregated', + type: 'bytes20', + }, + { + internalType: 'bytes20', + name: 'commitmentSigners', + type: 'bytes20', + }, + { + internalType: 'uint256[]', + name: 'pubKeysIds', + type: 'uint256[]', + }, + { + internalType: 'uint256', + name: '_minAmount', + type: 'uint256', + }, + ], + name: 'updateMinAmount', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'bytes32', + name: 'signature', + type: 'bytes32', + }, + { + internalType: 'bytes20', + name: 'commitmentAggregated', + type: 'bytes20', + }, + { + internalType: 'bytes20', + name: 'commitmentSigners', + type: 'bytes20', + }, + { + internalType: 'uint256[]', + name: 'pubKeysIds', + type: 'uint256[]', + }, + { + internalType: 'uint8', + name: '_minValidatorsRequired', + type: 'uint8', + }, + ], + name: 'updateMinValidatorsRequired', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'bytes32', + name: 'signature', + type: 'bytes32', + }, + { + internalType: 'bytes20', + name: 'commitmentAggregated', + type: 'bytes20', + }, + { + internalType: 'bytes20', + name: 'commitmentSigners', + type: 'bytes20', + }, + { + internalType: 'uint256[]', + name: 'pubKeysIds', + type: 'uint256[]', + }, + { + internalType: 'uint8', + name: '_newThreshold', + type: 'uint8', + }, + ], + name: 'updateSignaturesThreshold', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'address', + name: 'newValidatorAddress', + type: 'address', + }, + ], + name: 'updateValidatorKey', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'bytes32', + name: 'signature', + type: 'bytes32', + }, + { + internalType: 'bytes20', + name: 'commitmentAggregated', + type: 'bytes20', + }, + { + internalType: 'bytes20', + name: 'commitmentSigners', + type: 'bytes20', + }, + { + internalType: 'uint256[]', + name: 'pubKeysIds', + type: 'uint256[]', + }, + { + components: [ + { + internalType: 'address', + name: 'previousValidatorAddress', + type: 'address', + }, + { + internalType: 'address', + name: 'newValidatorAddress', + type: 'address', + }, + ], + internalType: 'struct Bridge.ValidatorKeyUpdateByAutority[]', + name: 'validatorKeyUpdate', + type: 'tuple[]', + }, + ], + name: 'updateValidatorKeysByAuthority', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'address', + name: '', + type: 'address', + }, + ], + name: 'validatorIndices', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256', + }, + ], + name: 'validatorPublicKeysArray', + outputs: [ + { + internalType: 'address', + name: '', + type: 'address', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'varaToEthNonce', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'address payable', + name: '_to', + type: 'address', + }, + { + internalType: 'uint256', + name: '_amount', + type: 'uint256', + }, + { + internalType: 'bytes32', + name: 'signature', + type: 'bytes32', + }, + { + internalType: 'bytes20', + name: 'commitmentAggregated', + type: 'bytes20', + }, + { + internalType: 'bytes20', + name: 'commitmentSigners', + type: 'bytes20', + }, + { + internalType: 'uint256[]', + name: 'pubKeysIds', + type: 'uint256[]', + }, + ], + name: 'withdrawEther', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, +] as const; + +export { ABI }; diff --git a/frontend/src/features/swap/consts/abi/fungible-token-abi.ts b/frontend/src/features/swap/consts/abi/fungible-token-abi.ts new file mode 100644 index 00000000..d3e6b299 --- /dev/null +++ b/frontend/src/features/swap/consts/abi/fungible-token-abi.ts @@ -0,0 +1,654 @@ +const FUNGIBLE_TOKEN_ABI = [ + { + inputs: [ + { + internalType: 'string', + name: '_name', + type: 'string', + }, + { + internalType: 'string', + name: '_symbol', + type: 'string', + }, + ], + stateMutability: 'nonpayable', + type: 'constructor', + }, + { + inputs: [], + name: 'AccessControlBadConfirmation', + type: 'error', + }, + { + inputs: [ + { + internalType: 'address', + name: 'account', + type: 'address', + }, + { + internalType: 'bytes32', + name: 'neededRole', + type: 'bytes32', + }, + ], + name: 'AccessControlUnauthorizedAccount', + type: 'error', + }, + { + inputs: [ + { + internalType: 'address', + name: 'spender', + type: 'address', + }, + { + internalType: 'uint256', + name: 'allowance', + type: 'uint256', + }, + { + internalType: 'uint256', + name: 'needed', + type: 'uint256', + }, + ], + name: 'ERC20InsufficientAllowance', + type: 'error', + }, + { + inputs: [ + { + internalType: 'address', + name: 'sender', + type: 'address', + }, + { + internalType: 'uint256', + name: 'balance', + type: 'uint256', + }, + { + internalType: 'uint256', + name: 'needed', + type: 'uint256', + }, + ], + name: 'ERC20InsufficientBalance', + type: 'error', + }, + { + inputs: [ + { + internalType: 'address', + name: 'approver', + type: 'address', + }, + ], + name: 'ERC20InvalidApprover', + type: 'error', + }, + { + inputs: [ + { + internalType: 'address', + name: 'receiver', + type: 'address', + }, + ], + name: 'ERC20InvalidReceiver', + type: 'error', + }, + { + inputs: [ + { + internalType: 'address', + name: 'sender', + type: 'address', + }, + ], + name: 'ERC20InvalidSender', + type: 'error', + }, + { + inputs: [ + { + internalType: 'address', + name: 'spender', + type: 'address', + }, + ], + name: 'ERC20InvalidSpender', + type: 'error', + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'address', + name: 'owner', + type: 'address', + }, + { + indexed: true, + internalType: 'address', + name: 'spender', + type: 'address', + }, + { + indexed: false, + internalType: 'uint256', + name: 'value', + type: 'uint256', + }, + ], + name: 'Approval', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'bytes32', + name: 'role', + type: 'bytes32', + }, + { + indexed: true, + internalType: 'bytes32', + name: 'previousAdminRole', + type: 'bytes32', + }, + { + indexed: true, + internalType: 'bytes32', + name: 'newAdminRole', + type: 'bytes32', + }, + ], + name: 'RoleAdminChanged', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'bytes32', + name: 'role', + type: 'bytes32', + }, + { + indexed: true, + internalType: 'address', + name: 'account', + type: 'address', + }, + { + indexed: true, + internalType: 'address', + name: 'sender', + type: 'address', + }, + ], + name: 'RoleGranted', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'bytes32', + name: 'role', + type: 'bytes32', + }, + { + indexed: true, + internalType: 'address', + name: 'account', + type: 'address', + }, + { + indexed: true, + internalType: 'address', + name: 'sender', + type: 'address', + }, + ], + name: 'RoleRevoked', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'address', + name: 'from', + type: 'address', + }, + { + indexed: true, + internalType: 'address', + name: 'to', + type: 'address', + }, + { + indexed: false, + internalType: 'uint256', + name: 'value', + type: 'uint256', + }, + ], + name: 'Transfer', + type: 'event', + }, + { + inputs: [], + name: 'ADMIN', + outputs: [ + { + internalType: 'bytes32', + name: '', + type: 'bytes32', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'BURNER', + outputs: [ + { + internalType: 'bytes32', + name: '', + type: 'bytes32', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'DEFAULT_ADMIN_ROLE', + outputs: [ + { + internalType: 'bytes32', + name: '', + type: 'bytes32', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'MINTER', + outputs: [ + { + internalType: 'bytes32', + name: '', + type: 'bytes32', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'address', + name: 'owner', + type: 'address', + }, + { + internalType: 'address', + name: 'spender', + type: 'address', + }, + ], + name: 'allowance', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'address', + name: 'spender', + type: 'address', + }, + { + internalType: 'uint256', + name: 'value', + type: 'uint256', + }, + ], + name: 'approve', + outputs: [ + { + internalType: 'bool', + name: '', + type: 'bool', + }, + ], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'address', + name: 'account', + type: 'address', + }, + ], + name: 'balanceOf', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'address', + name: '_from', + type: 'address', + }, + { + internalType: 'uint256', + name: '_value', + type: 'uint256', + }, + ], + name: 'burn', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [], + name: 'decimals', + outputs: [ + { + internalType: 'uint8', + name: '', + type: 'uint8', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'bytes32', + name: 'role', + type: 'bytes32', + }, + ], + name: 'getRoleAdmin', + outputs: [ + { + internalType: 'bytes32', + name: '', + type: 'bytes32', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'address', + name: 'burner', + type: 'address', + }, + ], + name: 'grantBurnerRole', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'address', + name: 'minter', + type: 'address', + }, + ], + name: 'grantMinterRole', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'bytes32', + name: 'role', + type: 'bytes32', + }, + { + internalType: 'address', + name: 'account', + type: 'address', + }, + ], + name: 'grantRole', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'bytes32', + name: 'role', + type: 'bytes32', + }, + { + internalType: 'address', + name: 'account', + type: 'address', + }, + ], + name: 'hasRole', + outputs: [ + { + internalType: 'bool', + name: '', + type: 'bool', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'address', + name: '_to', + type: 'address', + }, + { + internalType: 'uint256', + name: '_value', + type: 'uint256', + }, + ], + name: 'mint', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [], + name: 'name', + outputs: [ + { + internalType: 'string', + name: '', + type: 'string', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'bytes32', + name: 'role', + type: 'bytes32', + }, + { + internalType: 'address', + name: 'callerConfirmation', + type: 'address', + }, + ], + name: 'renounceRole', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'bytes32', + name: 'role', + type: 'bytes32', + }, + { + internalType: 'address', + name: 'account', + type: 'address', + }, + ], + name: 'revokeRole', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'bytes4', + name: 'interfaceId', + type: 'bytes4', + }, + ], + name: 'supportsInterface', + outputs: [ + { + internalType: 'bool', + name: '', + type: 'bool', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'symbol', + outputs: [ + { + internalType: 'string', + name: '', + type: 'string', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'totalSupply', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'address', + name: 'to', + type: 'address', + }, + { + internalType: 'uint256', + name: 'value', + type: 'uint256', + }, + ], + name: 'transfer', + outputs: [ + { + internalType: 'bool', + name: '', + type: 'bool', + }, + ], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'address', + name: 'from', + type: 'address', + }, + { + internalType: 'address', + name: 'to', + type: 'address', + }, + { + internalType: 'uint256', + name: 'value', + type: 'uint256', + }, + ], + name: 'transferFrom', + outputs: [ + { + internalType: 'bool', + name: '', + type: 'bool', + }, + ], + stateMutability: 'nonpayable', + type: 'function', + }, +] as const; + +export { FUNGIBLE_TOKEN_ABI }; diff --git a/frontend/src/features/swap/consts/abi/index.ts b/frontend/src/features/swap/consts/abi/index.ts new file mode 100644 index 00000000..1f4bec57 --- /dev/null +++ b/frontend/src/features/swap/consts/abi/index.ts @@ -0,0 +1,4 @@ +import { ABI } from './abi'; +import { FUNGIBLE_TOKEN_ABI } from './fungible-token-abi'; + +export { ABI, FUNGIBLE_TOKEN_ABI }; diff --git a/frontend/src/features/swap/consts/eth.ts b/frontend/src/features/swap/consts/eth.ts new file mode 100644 index 00000000..316d7a53 --- /dev/null +++ b/frontend/src/features/swap/consts/eth.ts @@ -0,0 +1,16 @@ +const FUNCTION_NAME = { + TRANSIT: 'transitEthToVara', + FEE: 'fee', + MIN_AMOUNT: 'minAmount', + + FUNGIBLE_TOKEN_ADDRESS: 'addressOfToken', + FUNGIBLE_TOKEN_BALANCE: 'balanceOf', // fungible token abi + FUNGIBLE_TOKEN_APPROVE: 'approve', // fungible token abi + FUNGIBLE_TOKEN_DECIMALS: 'decimals', // fungible token abi +} as const; + +const EVENT_NAME = { + APPROVAL: 'Approval', +} as const; + +export { FUNCTION_NAME, EVENT_NAME }; diff --git a/frontend/src/features/swap/consts/form.ts b/frontend/src/features/swap/consts/form.ts new file mode 100644 index 00000000..6248f714 --- /dev/null +++ b/frontend/src/features/swap/consts/form.ts @@ -0,0 +1,42 @@ +import { getVaraAddress } from '@gear-js/react-hooks'; +import { isAddress as isEthAddress } from 'viem'; +import { z } from 'zod'; + +import { isValidAddress as isSubstrateAddress } from '@/utils'; + +const FIELD_NAME = { + VALUE: 'amount', + EXPECTED_VALUE: 'expectedAmount', + ADDRESS: 'accountAddress', +} as const; + +const DEFAULT_VALUES = { + [FIELD_NAME.VALUE]: '', + [FIELD_NAME.EXPECTED_VALUE]: '', + [FIELD_NAME.ADDRESS]: '', +}; + +const ERROR_MESSAGE = { + NO_BALANCE: 'Insufficient balance', + INVALID_ADDRESS: 'Invalid address', + MIN_VALUE: (value: string) => `Minimum value is ${value}`, +} as const; + +const VARA_ADDRESS_SCHEMA = z + .string() + .trim() + .refine((value) => isSubstrateAddress(value), { message: ERROR_MESSAGE.INVALID_ADDRESS }) + .transform((value) => getVaraAddress(value)); + +const ETH_ADDRESS_SCHEMA = z + .string() + .trim() + .refine((value) => isEthAddress(value), { message: ERROR_MESSAGE.INVALID_ADDRESS }) + .transform((value) => value.replace('0x', '')); + +const ADDRESS_SCHEMA = { + VARA: VARA_ADDRESS_SCHEMA, + ETH: ETH_ADDRESS_SCHEMA, +}; + +export { FIELD_NAME, ERROR_MESSAGE, DEFAULT_VALUES, ADDRESS_SCHEMA }; diff --git a/frontend/src/features/swap/consts/index.ts b/frontend/src/features/swap/consts/index.ts new file mode 100644 index 00000000..e92a471f --- /dev/null +++ b/frontend/src/features/swap/consts/index.ts @@ -0,0 +1,22 @@ +import { ABI, FUNGIBLE_TOKEN_ABI } from './abi'; +import { FUNCTION_NAME, EVENT_NAME } from './eth'; +import { FIELD_NAME, DEFAULT_VALUES, ADDRESS_SCHEMA, ERROR_MESSAGE } from './form'; +import { TOKEN_TYPE, METADATA_URL } from './spec'; +import { STATE_FUNCTION } from './vara'; + +const BALANCE_REFETCH_INTERVAL = 10000; + +export { + ABI, + FUNGIBLE_TOKEN_ABI, + FIELD_NAME, + DEFAULT_VALUES, + ADDRESS_SCHEMA, + FUNCTION_NAME, + EVENT_NAME, + ERROR_MESSAGE, + BALANCE_REFETCH_INTERVAL, + STATE_FUNCTION, + TOKEN_TYPE, + METADATA_URL, +}; diff --git a/frontend/src/features/swap/consts/spec.ts b/frontend/src/features/swap/consts/spec.ts new file mode 100644 index 00000000..22c5afce --- /dev/null +++ b/frontend/src/features/swap/consts/spec.ts @@ -0,0 +1,14 @@ +import bridgeMetadataUrl from '../assets/bridge_vara.meta.txt'; +import ftBridgeMetadataUrl from '../assets/bridge_vara_wrapped_tokens.meta.txt'; + +const TOKEN_TYPE = { + NATIVE: 'native', + FUNGIBLE: 'fungible', +} as const; + +const METADATA_URL = { + [TOKEN_TYPE.NATIVE]: bridgeMetadataUrl, + [TOKEN_TYPE.FUNGIBLE]: ftBridgeMetadataUrl, +} as const; + +export { TOKEN_TYPE, METADATA_URL }; diff --git a/frontend/src/features/swap/consts/vara.ts b/frontend/src/features/swap/consts/vara.ts new file mode 100644 index 00000000..eeab4bed --- /dev/null +++ b/frontend/src/features/swap/consts/vara.ts @@ -0,0 +1,5 @@ +const STATE_FUNCTION = { + CONFIG: 'config', +} as const; + +export { STATE_FUNCTION }; diff --git a/frontend/src/features/swap/hooks/eth/index.ts b/frontend/src/features/swap/hooks/eth/index.ts new file mode 100644 index 00000000..7859b0d4 --- /dev/null +++ b/frontend/src/features/swap/hooks/eth/index.ts @@ -0,0 +1,5 @@ +import { useEthBalance } from './use-eth-balance'; +import { useEthConfig } from './use-eth-config'; +import { useHandleEthSubmit } from './use-handle-eth-submit'; + +export { useEthBalance, useHandleEthSubmit, useEthConfig }; diff --git a/frontend/src/features/swap/hooks/eth/use-approve.ts b/frontend/src/features/swap/hooks/eth/use-approve.ts new file mode 100644 index 00000000..a7d471f4 --- /dev/null +++ b/frontend/src/features/swap/hooks/eth/use-approve.ts @@ -0,0 +1,79 @@ +import { HexString } from '@gear-js/api'; +import { useAlert } from '@gear-js/react-hooks'; +import { BaseError, useConfig, useWriteContract } from 'wagmi'; +import { watchContractEvent } from 'wagmi/actions'; + +import { useEthAccount, useLoading } from '@/hooks'; +import { logger } from '@/utils'; + +import { FUNGIBLE_TOKEN_ABI, FUNCTION_NAME, EVENT_NAME } from '../../consts'; + +function useApprove(address: HexString | undefined) { + const alert = useAlert(); + const ethAccount = useEthAccount(); + const config = useConfig(); + const { writeContract } = useWriteContract(); + const [isPending, enablePending, disablePending] = useLoading(); + + const abi = FUNGIBLE_TOKEN_ABI; + + const handleError = (message: string) => { + disablePending(); + + logger.error(FUNCTION_NAME.FUNGIBLE_TOKEN_APPROVE, new Error(message)); + alert.error(message); + }; + + const watch = (bridgeAddress: HexString, amount: bigint, onSuccess: () => void) => { + const owner = ethAccount.address; + const spender = bridgeAddress; + + // maybe better to use waitForTransactionReceipt, + // but feels like it's getting fired before approval in contract + const unwatch = watchContractEvent(config, { + address, + abi, + eventName: EVENT_NAME.APPROVAL, + args: { owner, spender }, + + onLogs: (logs) => + logs.forEach(({ args: { value } }) => { + disablePending(); + unwatch(); + + if (!value || value < amount) return handleError('Approved value is less than the required amount'); + + onSuccess(); + }), + + onError: ({ message }) => { + unwatch(); + handleError(message); + }, + }); + }; + + const write = (bridgeAddress: HexString, amount: bigint, onSuccess: () => void) => { + if (!address) throw new Error('Fungible token address is not defined'); + + enablePending(); + logger.info(FUNCTION_NAME.FUNGIBLE_TOKEN_APPROVE, `\naddress: ${address}\nargs: [${bridgeAddress}, ${amount}]`); + + writeContract( + { + address, + abi, + functionName: FUNCTION_NAME.FUNGIBLE_TOKEN_APPROVE, + args: [bridgeAddress, amount], + }, + { + onSuccess: () => watch(bridgeAddress, amount, onSuccess), + onError: (error) => handleError((error as BaseError).shortMessage || error.message), + }, + ); + }; + + return { write, isPending }; +} + +export { useApprove }; diff --git a/frontend/src/features/swap/hooks/eth/use-eth-account-balance.ts b/frontend/src/features/swap/hooks/eth/use-eth-account-balance.ts new file mode 100644 index 00000000..3875a1c4 --- /dev/null +++ b/frontend/src/features/swap/hooks/eth/use-eth-account-balance.ts @@ -0,0 +1,29 @@ +import { formatEther } from 'viem'; +import { useBalance } from 'wagmi'; + +import { useEthAccount } from '@/hooks'; + +const withPrecision = (value: string) => { + // simplest solution without rounding for now + const digitsCount = 3; + + return value.slice(0, value.indexOf('.') + digitsCount + 1); +}; + +function useEthAccountBalance(isEnabled: boolean) { + const ethAccount = useEthAccount(); + + const { data, isPending } = useBalance({ + address: ethAccount?.address, + query: { enabled: isEnabled }, + }); + + const { decimals, value } = data || {}; + + const formattedValue = data ? withPrecision(formatEther(data.value)) : undefined; + const isLoading = isPending; + + return { value, formattedValue, decimals, isLoading }; +} + +export { useEthAccountBalance }; diff --git a/frontend/src/features/swap/hooks/eth/use-eth-balance.ts b/frontend/src/features/swap/hooks/eth/use-eth-balance.ts new file mode 100644 index 00000000..e9aa4d11 --- /dev/null +++ b/frontend/src/features/swap/hooks/eth/use-eth-balance.ts @@ -0,0 +1,13 @@ +import { Config } from '../../types'; + +import { useEthAccountBalance } from './use-eth-account-balance'; +import { useFungibleTokenBalance } from './use-fungible-token-balance'; + +function useEthBalance({ ftAddress, isLoading }: Config) { + const accountBalance = useEthAccountBalance(!isLoading && !ftAddress); + const fungibleTokenBalance = useFungibleTokenBalance(ftAddress); + + return ftAddress ? fungibleTokenBalance : accountBalance; +} + +export { useEthBalance }; diff --git a/frontend/src/features/swap/hooks/eth/use-eth-config.ts b/frontend/src/features/swap/hooks/eth/use-eth-config.ts new file mode 100644 index 00000000..f96163d5 --- /dev/null +++ b/frontend/src/features/swap/hooks/eth/use-eth-config.ts @@ -0,0 +1,30 @@ +import { formatEther } from 'viem'; +import { useReadContracts } from 'wagmi'; + +import { isUndefined } from '@/utils'; + +import { ABI, FUNCTION_NAME } from '../../consts'; +import { Contract } from '../../types'; + +function useEthConfig({ address }: Contract) { + // TODO: logger + const abi = ABI; + + const { data, isLoading } = useReadContracts({ + contracts: [ + { abi, address, functionName: FUNCTION_NAME.FEE }, + { abi, address, functionName: FUNCTION_NAME.MIN_AMOUNT }, + { abi, address, functionName: FUNCTION_NAME.FUNGIBLE_TOKEN_ADDRESS }, + ], + }); + + const fee = data?.[0]?.result; + const minValue = data?.[1]?.result; + const ftAddress = data?.[2]?.result; + + const formattedFee = !isUndefined(fee) ? formatEther(fee) : undefined; + + return { fee: { value: fee, formattedValue: formattedFee }, minValue, ftAddress, isLoading }; +} + +export { useEthConfig }; diff --git a/frontend/src/features/swap/hooks/eth/use-fungible-token-balance.ts b/frontend/src/features/swap/hooks/eth/use-fungible-token-balance.ts new file mode 100644 index 00000000..04bcee40 --- /dev/null +++ b/frontend/src/features/swap/hooks/eth/use-fungible-token-balance.ts @@ -0,0 +1,44 @@ +import { HexString } from '@gear-js/api'; +import { formatUnits } from 'viem'; +import { useReadContracts } from 'wagmi'; + +import { useEthAccount } from '@/hooks'; +import { isUndefined } from '@/utils'; + +import { FUNCTION_NAME, FUNGIBLE_TOKEN_ABI, BALANCE_REFETCH_INTERVAL } from '../../consts'; + +const abi = FUNGIBLE_TOKEN_ABI; + +function useFungibleTokenBalance(address: HexString | undefined) { + const ethAccount = useEthAccount(); + + // TODO: logger + const { data, isPending } = useReadContracts({ + contracts: [ + { + address, + abi, + functionName: FUNCTION_NAME.FUNGIBLE_TOKEN_BALANCE, + args: ethAccount.address ? [ethAccount.address] : undefined, + }, + + { address, abi, functionName: FUNCTION_NAME.FUNGIBLE_TOKEN_DECIMALS }, + ], + + query: { + refetchInterval: BALANCE_REFETCH_INTERVAL, + enabled: Boolean(address) && Boolean(ethAccount.address), + }, + }); + + const value = data?.[0].result; + const decimals = data?.[1].result; + + const formattedValue = !isUndefined(value) && !isUndefined(decimals) ? formatUnits(value, decimals) : undefined; + + const isLoading = ethAccount.isConnected && isPending; + + return { value, formattedValue, decimals, isLoading }; +} + +export { useFungibleTokenBalance }; diff --git a/frontend/src/features/swap/hooks/eth/use-handle-eth-submit.ts b/frontend/src/features/swap/hooks/eth/use-handle-eth-submit.ts new file mode 100644 index 00000000..102fe157 --- /dev/null +++ b/frontend/src/features/swap/hooks/eth/use-handle-eth-submit.ts @@ -0,0 +1,60 @@ +import { useAlert } from '@gear-js/react-hooks'; +import { BaseError } from 'viem'; +import { useWriteContract } from 'wagmi'; + +import { isUndefined, logger } from '@/utils'; + +import { FUNCTION_NAME, ABI } from '../../consts'; +import { Config, Contract, FormattedValues } from '../../types'; + +import { useApprove } from './use-approve'; + +function useHandleEthSubmit({ address: bridgeAddress }: Contract, { fee, ftAddress }: Config) { + const alert = useAlert(); + const { writeContract, isPending } = useWriteContract(); + const approve = useApprove(ftAddress); + + const onSubmit = ({ amount: _amount, expectedAmount, accountAddress }: FormattedValues, onSuccess: () => void) => { + if (isUndefined(fee.value)) throw new Error('Fee is not defined'); + + const address = bridgeAddress; + const amount = expectedAmount; + + const isNativeToken = !ftAddress; + const value = isNativeToken ? _amount : fee.value; + + const transit = () => { + logger.info( + FUNCTION_NAME.TRANSIT, + `\naddress: ${address}\nargs: [${accountAddress}, ${amount}]\nvalue: ${value}\nisNativeToken: ${isNativeToken}`, + ); + + writeContract( + { + abi: ABI, + address, + functionName: FUNCTION_NAME.TRANSIT, + args: [accountAddress, amount], + value, + }, + { + onSuccess, + onError: (error) => { + const errorMessage = (error as BaseError).shortMessage || error.message; + + logger.error(FUNCTION_NAME.TRANSIT, error); + alert.error(errorMessage); + }, + }, + ); + }; + + return isNativeToken ? transit() : approve.write(address, amount, transit); + }; + + const isSubmitting = approve.isPending || isPending; + + return { onSubmit, isSubmitting }; +} + +export { useHandleEthSubmit }; diff --git a/frontend/src/features/swap/hooks/index.ts b/frontend/src/features/swap/hooks/index.ts new file mode 100644 index 00000000..73aedb20 --- /dev/null +++ b/frontend/src/features/swap/hooks/index.ts @@ -0,0 +1,15 @@ +import { useEthConfig, useEthBalance, useHandleEthSubmit } from './eth'; +import { useBridge } from './use-bridge'; +import { useSwapForm } from './use-swap-form'; +import { useVaraConfig, useVaraBalance, useHandleVaraSubmit } from './vara'; + +export { + useEthConfig, + useEthBalance, + useHandleEthSubmit, + useSwapForm, + useVaraConfig, + useVaraBalance, + useHandleVaraSubmit, + useBridge, +}; diff --git a/frontend/src/features/swap/hooks/use-bridge.ts b/frontend/src/features/swap/hooks/use-bridge.ts new file mode 100644 index 00000000..6a406a4d --- /dev/null +++ b/frontend/src/features/swap/hooks/use-bridge.ts @@ -0,0 +1,30 @@ +import { useMemo, useState } from 'react'; + +import { NETWORK_NAME, NETWORK_NATIVE_SYMBOL, SPEC } from '@/consts'; + +import { METADATA_URL } from '../consts'; +import { NetworkName } from '../types'; +import { getOptions } from '../utils'; + +import { useMetadata } from './vara'; + +function useBridge(networkName: NetworkName) { + const isVaraNetwork = networkName === NETWORK_NAME.VARA; + + const { varaOptions, ethOptions } = useMemo(getOptions, []); + const options = { from: isVaraNetwork ? varaOptions : ethOptions, to: isVaraNetwork ? ethOptions : varaOptions }; + + const [pair, setPair] = useState(options.from[0].value); + const bridge = SPEC[pair][networkName]; + const { address } = bridge; + + const metadata = useMetadata(isVaraNetwork ? METADATA_URL[bridge.tokenType] : undefined); + const contract = { address, metadata }; + + const nativeSymbol = NETWORK_NATIVE_SYMBOL[networkName]; + const symbol = { value: bridge.symbol, native: nativeSymbol }; + + return { contract, options, symbol, pair: { value: pair, set: setPair } }; +} + +export { useBridge }; diff --git a/frontend/src/features/swap/hooks/use-swap-form.ts b/frontend/src/features/swap/hooks/use-swap-form.ts new file mode 100644 index 00000000..57f8f4da --- /dev/null +++ b/frontend/src/features/swap/hooks/use-swap-form.ts @@ -0,0 +1,97 @@ +import { useAlert } from '@gear-js/react-hooks'; +import { zodResolver } from '@hookform/resolvers/zod'; +import { useEffect } from 'react'; +import { useForm } from 'react-hook-form'; +import { formatUnits, parseUnits } from 'viem'; +import { z } from 'zod'; + +import { isUndefined } from '@/utils'; + +import { FIELD_NAME, DEFAULT_VALUES, ADDRESS_SCHEMA } from '../consts'; +import { FormattedValues } from '../types'; +import { getAmountSchema } from '../utils'; + +type Values = { + value: bigint | undefined; + formattedValue: string | undefined; +}; + +function useSwapForm( + isVaraNetwork: boolean, + balance: Values & { decimals: number | undefined }, + fee: bigint | undefined, + minValue: bigint | undefined, + disabled: boolean, + onSubmit: (values: FormattedValues, reset: () => void) => void, +) { + const { decimals } = balance; + + const alert = useAlert(); + + const valueSchema = getAmountSchema(balance.value, minValue, fee, decimals); + const expectedValueSchema = getAmountSchema(balance.value, minValue, BigInt(0), decimals); + + const addressSchema = isVaraNetwork ? ADDRESS_SCHEMA.ETH : ADDRESS_SCHEMA.VARA; + + const schema = z.object({ + [FIELD_NAME.VALUE]: valueSchema, + [FIELD_NAME.EXPECTED_VALUE]: expectedValueSchema, + [FIELD_NAME.ADDRESS]: addressSchema, + }); + + const form = useForm>({ + defaultValues: DEFAULT_VALUES, + resolver: zodResolver(schema), + }); + + const { setValue, reset, formState } = form; + const shouldValidate = formState.isSubmitted; // validating only if validation was already fired + + const setOriginalValue = (value: string) => setValue(FIELD_NAME.VALUE, value, { shouldValidate }); + const setExpectedValue = (value: string) => setValue(FIELD_NAME.EXPECTED_VALUE, value, { shouldValidate }); + + const getValueWithFee = (value: string, operator: '+' | '-' = '+') => { + if (isUndefined(fee)) throw new Error('Fee is not defined'); + if (isUndefined(decimals)) throw new Error('Decimals is not defined'); + if (!value) return value; + + const chainValue = parseUnits(value, decimals); + const valueWithFee = operator === '+' ? chainValue + fee : chainValue - fee; + + return valueWithFee < 0 ? '0' : formatUnits(valueWithFee, decimals); + }; + + const onValueChange = (value: string) => setExpectedValue(getValueWithFee(value, '-')); + const onExpectedValueChange = (value: string) => setOriginalValue(getValueWithFee(value)); + + const handleSubmit = form.handleSubmit((values) => { + const onSuccess = () => { + reset(); + alert.success('Successful transaction'); + }; + + onSubmit(values, onSuccess); + }); + + useEffect(() => { + reset(); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [disabled]); + + const setMaxBalance = () => { + if (!balance.formattedValue) throw new Error('Balance is not defined'); + + setOriginalValue(balance.formattedValue); + onValueChange(balance.formattedValue); + }; + + return { + form, + onValueChange, + onExpectedValueChange, + handleSubmit, + setMaxBalance, + }; +} + +export { useSwapForm }; diff --git a/frontend/src/features/swap/hooks/vara/index.ts b/frontend/src/features/swap/hooks/vara/index.ts new file mode 100644 index 00000000..49576de1 --- /dev/null +++ b/frontend/src/features/swap/hooks/vara/index.ts @@ -0,0 +1,6 @@ +import { useHandleVaraSubmit } from './use-handle-vara-submit'; +import { useMetadata } from './use-metadata'; +import { useVaraBalance } from './use-vara-balance'; +import { useVaraConfig } from './use-vara-config'; + +export { useVaraConfig, useVaraBalance, useHandleVaraSubmit, useMetadata }; diff --git a/frontend/src/features/swap/hooks/vara/use-derive-balances-all.ts b/frontend/src/features/swap/hooks/vara/use-derive-balances-all.ts new file mode 100644 index 00000000..2cbd97c6 --- /dev/null +++ b/frontend/src/features/swap/hooks/vara/use-derive-balances-all.ts @@ -0,0 +1,19 @@ +import { useApi } from '@gear-js/react-hooks'; +import { useQuery } from '@tanstack/react-query'; + +import { BALANCE_REFETCH_INTERVAL } from '../../consts'; + +function useDeriveBalancesAll(accountAddress: string | undefined) { + const { api, isApiReady } = useApi(); + + const isEnabled = isApiReady && !!accountAddress; + + return useQuery({ + queryKey: ['deriveBalancesAll', isApiReady, accountAddress], + queryFn: () => (isEnabled ? api.derive.balances.all(accountAddress) : null), + enabled: isEnabled, + refetchInterval: BALANCE_REFETCH_INTERVAL, + }); +} + +export { useDeriveBalancesAll }; diff --git a/frontend/src/features/swap/hooks/vara/use-fungible-token-balance.ts b/frontend/src/features/swap/hooks/vara/use-fungible-token-balance.ts new file mode 100644 index 00000000..feb4b509 --- /dev/null +++ b/frontend/src/features/swap/hooks/vara/use-fungible-token-balance.ts @@ -0,0 +1,55 @@ +import { HexString } from '@gear-js/api'; +import { useAccount, useApi } from '@gear-js/react-hooks'; +import { useQuery } from '@tanstack/react-query'; +import { Sails } from 'sails-js'; +import { formatUnits } from 'viem'; + +import { isUndefined } from '@/utils'; + +import fungibleTokenIdlUrl from '../../assets/ft.idl?url'; +import { BALANCE_REFETCH_INTERVAL } from '../../consts'; + +function useFungibleTokenBalance(address: HexString | undefined) { + const { api, isApiReady } = useApi(); + + const { account } = useAccount(); + const { decodedAddress } = account || {}; + + const getBalance = async () => { + if (!isApiReady) throw new Error('API is not initialized'); + if (!decodedAddress) throw new Error('Account is not found'); + if (!address) throw new Error('Fungible token address is not found'); + + const response = await fetch(fungibleTokenIdlUrl); + const idl = await response.text(); + + const sails = (await Sails.new()).setApi(api).setProgramId(address); + const parsedIdl = sails.parseIdl(idl); + + const { BalanceOf, Decimals } = parsedIdl.services.Erc20.queries; + + const balance = await BalanceOf(decodedAddress, undefined, undefined, decodedAddress); + const decimals = await Decimals(decodedAddress); + + return { balance: BigInt(balance), decimals }; + }; + + // TODO: logger + const { data, isPending } = useQuery({ + queryKey: ['varaFungibleTokenBalance', address, decodedAddress], + queryFn: getBalance, + enabled: isApiReady && Boolean(account) && Boolean(address), + refetchInterval: BALANCE_REFETCH_INTERVAL, + }); + + const { balance, decimals } = data || {}; + + const value = balance; + const formattedValue = !isUndefined(balance) && !isUndefined(decimals) ? formatUnits(balance, decimals) : undefined; + + const isLoading = isPending; + + return { value, formattedValue, decimals, isLoading }; +} + +export { useFungibleTokenBalance }; diff --git a/frontend/src/features/swap/hooks/vara/use-handle-vara-submit.ts b/frontend/src/features/swap/hooks/vara/use-handle-vara-submit.ts new file mode 100644 index 00000000..09f5018d --- /dev/null +++ b/frontend/src/features/swap/hooks/vara/use-handle-vara-submit.ts @@ -0,0 +1,37 @@ +import { isUndefined, logger } from '@/utils'; + +import { Config, Contract, FormattedValues } from '../../types'; + +import { useSendMessage } from './use-send-message'; + +function useHandleVaraSubmit({ address, metadata }: Contract, { fee, ftAddress }: Config) { + const isNativeToken = !ftAddress; + + const { sendMessage, isPending } = useSendMessage(address, metadata, { + disableAlerts: true, + isMaxGasLimit: !isNativeToken, + }); + + const onSubmit = ({ amount: _amount, expectedAmount, accountAddress }: FormattedValues, onSuccess: () => void) => { + if (isUndefined(fee.value)) throw new Error('Fee is not defined'); + + const amount = String(expectedAmount); // TODO: fix after @gear-js/react-hooks bigint support + const recipient = accountAddress; + const payload = { TransitVaraToEth: { amount, recipient } }; + + const value = String(isNativeToken ? _amount : fee.value); // TODO: fix after @gear-js/react-hooks bigint support + + logger.info( + 'TransitVaraToEth', + `\nprogramId:${address}\namount: ${amount}\nrecipient: ${recipient}\nvalue: ${value}\nisNativeToken: ${isNativeToken}`, + ); + + sendMessage({ payload, value, onSuccess }); + }; + + const isSubmitting = isPending; + + return { onSubmit, isSubmitting }; +} + +export { useHandleVaraSubmit }; diff --git a/frontend/src/features/swap/hooks/vara/use-metadata.ts b/frontend/src/features/swap/hooks/vara/use-metadata.ts new file mode 100644 index 00000000..ed80dafe --- /dev/null +++ b/frontend/src/features/swap/hooks/vara/use-metadata.ts @@ -0,0 +1,23 @@ +import { ProgramMetadata } from '@gear-js/api'; +import { useQuery } from '@tanstack/react-query'; + +function useMetadata(url: string | undefined) { + const getMetadata = async () => { + if (!url) throw new Error('Metadata URL is not found'); + + const response = await fetch(url); + const text = await response.text(); + + return ProgramMetadata.from(`0x${text}`); + }; + + const { data } = useQuery({ + queryKey: ['metadata', url], + queryFn: getMetadata, + enabled: Boolean(url), + }); + + return data; +} + +export { useMetadata }; diff --git a/frontend/src/features/swap/hooks/vara/use-read-state.ts b/frontend/src/features/swap/hooks/vara/use-read-state.ts new file mode 100644 index 00000000..027bbb19 --- /dev/null +++ b/frontend/src/features/swap/hooks/vara/use-read-state.ts @@ -0,0 +1,21 @@ +import { HexString, ProgramMetadata } from '@gear-js/api'; +import { useApi } from '@gear-js/react-hooks'; +import { AnyJson } from '@polkadot/types/types'; +import { useQuery } from '@tanstack/react-query'; + +import { isUndefined } from '@/utils'; + +function useReadState(programId: HexString | undefined, metadata: ProgramMetadata | undefined, payload: AnyJson) { + const { api, isApiReady } = useApi(); + + const isEnabled = isApiReady && programId && metadata && !isUndefined(payload); + + return useQuery({ + queryKey: ['readState', isApiReady, programId, metadata, payload], + queryFn: async () => + isEnabled ? ((await api.programState.read({ programId, payload }, metadata)).toHuman() as T) : null, + enabled: isEnabled, + }); +} + +export { useReadState }; diff --git a/frontend/src/features/swap/hooks/vara/use-send-message.ts b/frontend/src/features/swap/hooks/vara/use-send-message.ts new file mode 100644 index 00000000..c925f2e4 --- /dev/null +++ b/frontend/src/features/swap/hooks/vara/use-send-message.ts @@ -0,0 +1,40 @@ +import { HexString, ProgramMetadata } from '@gear-js/api'; +import { + SendMessageWithGasOptions, + UseSendMessageWithGasOptions, + useSendMessageWithGas as useGearSendMessageWithGas, +} from '@gear-js/react-hooks'; + +import { useLoading } from '@/hooks'; + +function useSendMessage( + programId: HexString, + metadata: ProgramMetadata | undefined, + options?: UseSendMessageWithGasOptions, +) { + const sendMessage = useGearSendMessageWithGas(programId, metadata, options); + + const [isLoading, enableLoading, disableLoading] = useLoading(); + + return { + sendMessage: (args: SendMessageWithGasOptions) => { + enableLoading(); + + const onSuccess = (messageId: HexString) => { + args.onSuccess?.(messageId); + disableLoading(); + }; + + const onError = () => { + args.onError?.(); + disableLoading(); + }; + + sendMessage({ ...args, onSuccess, onError }); + }, + + isPending: isLoading, + }; +} + +export { useSendMessage }; diff --git a/frontend/src/features/swap/hooks/vara/use-vara-account-balance.ts b/frontend/src/features/swap/hooks/vara/use-vara-account-balance.ts new file mode 100644 index 00000000..98481858 --- /dev/null +++ b/frontend/src/features/swap/hooks/vara/use-vara-account-balance.ts @@ -0,0 +1,29 @@ +import { useAccount, useApi, useBalanceFormat } from '@gear-js/react-hooks'; +import { useMemo } from 'react'; + +import { useDeriveBalancesAll } from './use-derive-balances-all'; + +function useVaraAccountBalance(isEnabled: boolean) { + const { api } = useApi(); + const { account, isAccountReady } = useAccount(); + const { data, isPending } = useDeriveBalancesAll(isEnabled ? account?.address : undefined); + const { getFormattedBalance } = useBalanceFormat(); + + const { freeBalance } = data || {}; + const value = freeBalance?.toBigInt(); + const formattedValue = value ? getFormattedBalance(value).value : undefined; + + // cuz swap vara form is rendered by default without login and we have to handle empty balance state + const isLoading = useMemo(() => { + if (!isAccountReady) return true; + if (!account) return false; + + return isPending; + }, [account, isAccountReady, isPending]); + + const [decimals] = api?.registry.chainDecimals || [undefined]; + + return { value, formattedValue, decimals, isLoading }; +} + +export { useVaraAccountBalance }; diff --git a/frontend/src/features/swap/hooks/vara/use-vara-balance.ts b/frontend/src/features/swap/hooks/vara/use-vara-balance.ts new file mode 100644 index 00000000..4e04ef25 --- /dev/null +++ b/frontend/src/features/swap/hooks/vara/use-vara-balance.ts @@ -0,0 +1,13 @@ +import { Config } from '../../types'; + +import { useFungibleTokenBalance } from './use-fungible-token-balance'; +import { useVaraAccountBalance } from './use-vara-account-balance'; + +function useVaraBalance({ ftAddress, isLoading }: Config) { + const accountBalance = useVaraAccountBalance(!isLoading && !ftAddress); + const fungibleTokenBalance = useFungibleTokenBalance(ftAddress); + + return ftAddress ? fungibleTokenBalance : accountBalance; +} + +export { useVaraBalance }; diff --git a/frontend/src/features/swap/hooks/vara/use-vara-config.ts b/frontend/src/features/swap/hooks/vara/use-vara-config.ts new file mode 100644 index 00000000..c12e8409 --- /dev/null +++ b/frontend/src/features/swap/hooks/vara/use-vara-config.ts @@ -0,0 +1,26 @@ +import { useBalanceFormat, withoutCommas } from '@gear-js/react-hooks'; + +import { isUndefined } from '@/utils'; + +import { STATE_FUNCTION } from '../../consts'; +import { ConfigState, Contract } from '../../types'; + +import { useReadState } from './use-read-state'; + +function useVaraConfig({ address, metadata }: Contract) { + const { getFormattedBalance } = useBalanceFormat(); + + const { data, isPending } = useReadState(address, metadata, STATE_FUNCTION.CONFIG); + + const config = data?.Config; + const fee = config ? BigInt(withoutCommas(config.fee)) : undefined; + const minValue = config ? BigInt(withoutCommas(config.minAmount)) : undefined; + const ftAddress = config?.ftTokenId; + + const formattedFee = !isUndefined(fee) ? getFormattedBalance(fee).value : undefined; + const isLoading = isPending; + + return { fee: { value: fee, formattedValue: formattedFee }, minValue, ftAddress, isLoading }; +} + +export { useVaraConfig }; diff --git a/frontend/src/features/swap/index.ts b/frontend/src/features/swap/index.ts new file mode 100644 index 00000000..827ee75f --- /dev/null +++ b/frontend/src/features/swap/index.ts @@ -0,0 +1,3 @@ +import { Swap } from './components'; + +export { Swap }; diff --git a/frontend/src/features/swap/types/form.ts b/frontend/src/features/swap/types/form.ts new file mode 100644 index 00000000..ccf32a50 --- /dev/null +++ b/frontend/src/features/swap/types/form.ts @@ -0,0 +1,11 @@ +import { DEFAULT_VALUES, FIELD_NAME } from '../consts'; + +type Values = typeof DEFAULT_VALUES; + +type FormattedValues = { + [FIELD_NAME.VALUE]: bigint; + [FIELD_NAME.EXPECTED_VALUE]: bigint; + [FIELD_NAME.ADDRESS]: string; +}; + +export type { Values, FormattedValues }; diff --git a/frontend/src/features/swap/types/hooks.ts b/frontend/src/features/swap/types/hooks.ts new file mode 100644 index 00000000..b3dda45d --- /dev/null +++ b/frontend/src/features/swap/types/hooks.ts @@ -0,0 +1,33 @@ +import { HexString } from '@gear-js/api'; + +import { FormattedValues } from './form'; +import { Contract } from './spec'; + +type BalanceValues = { + value: bigint | undefined; + formattedValue: string | undefined; +}; + +type Config = { + fee: BalanceValues; + minValue: bigint | undefined; + ftAddress: HexString | undefined; + isLoading: boolean; +}; + +type UseBalance = (config: Config) => BalanceValues & { + decimals: number | undefined; + isLoading: boolean; +}; + +type UseConfig = (contract: Contract) => Config; + +type UseHandleSubmit = ( + contract: Contract, + config: Config, +) => { + onSubmit: (values: FormattedValues, reset: () => void) => void; + isSubmitting: boolean; +}; + +export type { Config, UseBalance, UseConfig, UseHandleSubmit }; diff --git a/frontend/src/features/swap/types/index.ts b/frontend/src/features/swap/types/index.ts new file mode 100644 index 00000000..9efe7ccb --- /dev/null +++ b/frontend/src/features/swap/types/index.ts @@ -0,0 +1,18 @@ +import { Values, FormattedValues } from './form'; +import { Config, UseBalance, UseConfig, UseHandleSubmit } from './hooks'; +import { NetworkName, TokenType, Bridge, Contract } from './spec'; +import { ConfigState } from './vara'; + +export type { + ConfigState, + NetworkName, + TokenType, + Bridge, + Contract, + Config, + UseBalance, + UseConfig, + UseHandleSubmit, + Values, + FormattedValues, +}; diff --git a/frontend/src/features/swap/types/spec.ts b/frontend/src/features/swap/types/spec.ts new file mode 100644 index 00000000..1a739e2b --- /dev/null +++ b/frontend/src/features/swap/types/spec.ts @@ -0,0 +1,23 @@ +import { HexString, ProgramMetadata } from '@gear-js/api'; + +import { NETWORK_NAME } from '@/consts'; + +import { TOKEN_TYPE } from '../consts'; + +type NetworkName = (typeof NETWORK_NAME)[keyof typeof NETWORK_NAME]; +type TokenType = (typeof TOKEN_TYPE)[keyof typeof TOKEN_TYPE]; + +type Bridge = { + network: NetworkName; + address: HexString; + symbol: string; + tokenType: TokenType; + decimals: number; +}; + +type Contract = { + address: HexString; + metadata?: ProgramMetadata | undefined; +}; + +export type { NetworkName, TokenType, Bridge, Contract }; diff --git a/frontend/src/features/swap/types/vara.ts b/frontend/src/features/swap/types/vara.ts new file mode 100644 index 00000000..5f522cf9 --- /dev/null +++ b/frontend/src/features/swap/types/vara.ts @@ -0,0 +1,13 @@ +import { HexString } from '@gear-js/api'; + +type ConfigState = { + Config: { + minAmount: string; + minValidatorsRequired: string; + gasForMigration: string; + fee: string; + ftTokenId?: HexString; + }; +}; + +export type { ConfigState }; diff --git a/frontend/src/features/swap/utils.ts b/frontend/src/features/swap/utils.ts new file mode 100644 index 00000000..46c5ac93 --- /dev/null +++ b/frontend/src/features/swap/utils.ts @@ -0,0 +1,43 @@ +import { getTypedEntries } from '@gear-js/react-hooks'; +import { formatUnits, parseUnits } from 'viem'; +import { z } from 'zod'; + +import { NETWORK_NAME, SPEC } from '@/consts'; +import { Pair } from '@/types'; +import { isUndefined } from '@/utils'; + +import { ERROR_MESSAGE } from './consts'; + +const getAmountSchema = ( + balanceValue: bigint | undefined, + _minValue: bigint | undefined, + feeValue: bigint | undefined, + decimals: number | undefined, +) => { + if (isUndefined(balanceValue) || isUndefined(_minValue) || isUndefined(feeValue) || isUndefined(decimals)) + return z.bigint(); + + const minValue = _minValue + feeValue; + const formattedMinValue = formatUnits(minValue, decimals); + + return z + .string() + .trim() // TODO: required field check + .transform((value) => parseUnits(value, decimals)) // if fraction is > decimals, value will be rounded + .refine((value) => value <= balanceValue, { message: ERROR_MESSAGE.NO_BALANCE }) + .refine((value) => value >= minValue, { message: ERROR_MESSAGE.MIN_VALUE(formattedMinValue) }); +}; + +const getOptions = () => { + const varaOptions: { label: string; value: Pair }[] = []; + const ethOptions: { label: string; value: Pair }[] = []; + + getTypedEntries(SPEC).forEach(([pair, bridge]) => { + varaOptions.push({ label: bridge[NETWORK_NAME.VARA].symbol, value: pair }); + ethOptions.push({ label: bridge[NETWORK_NAME.ETH].symbol, value: pair }); + }); + + return { varaOptions, ethOptions }; +}; + +export { getAmountSchema, getOptions }; diff --git a/frontend/src/features/wallet/assets/copy.svg b/frontend/src/features/wallet/assets/copy.svg new file mode 100644 index 00000000..35e5778d --- /dev/null +++ b/frontend/src/features/wallet/assets/copy.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/frontend/src/features/wallet/assets/enkrypt.svg b/frontend/src/features/wallet/assets/enkrypt.svg new file mode 100644 index 00000000..77ecb833 --- /dev/null +++ b/frontend/src/features/wallet/assets/enkrypt.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/frontend/src/features/wallet/assets/exit.svg b/frontend/src/features/wallet/assets/exit.svg new file mode 100644 index 00000000..b8c91bbe --- /dev/null +++ b/frontend/src/features/wallet/assets/exit.svg @@ -0,0 +1,3 @@ + + + diff --git a/frontend/src/features/wallet/assets/polkadot.svg b/frontend/src/features/wallet/assets/polkadot.svg new file mode 100644 index 00000000..62946202 --- /dev/null +++ b/frontend/src/features/wallet/assets/polkadot.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/frontend/src/features/wallet/assets/subwallet.svg b/frontend/src/features/wallet/assets/subwallet.svg new file mode 100644 index 00000000..b9a16e35 --- /dev/null +++ b/frontend/src/features/wallet/assets/subwallet.svg @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/frontend/src/features/wallet/assets/swap.svg b/frontend/src/features/wallet/assets/swap.svg new file mode 100644 index 00000000..7f9affd1 --- /dev/null +++ b/frontend/src/features/wallet/assets/swap.svg @@ -0,0 +1,3 @@ + + + diff --git a/frontend/src/features/wallet/assets/talisman.svg b/frontend/src/features/wallet/assets/talisman.svg new file mode 100644 index 00000000..86e00c75 --- /dev/null +++ b/frontend/src/features/wallet/assets/talisman.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/frontend/src/features/wallet/components/account-button/account-button.module.scss b/frontend/src/features/wallet/components/account-button/account-button.module.scss new file mode 100644 index 00000000..ecf76511 --- /dev/null +++ b/frontend/src/features/wallet/components/account-button/account-button.module.scss @@ -0,0 +1,6 @@ +.button { + /* identicon override */ + > div { + cursor: pointer; + } +} diff --git a/frontend/src/features/wallet/components/account-button/account-button.tsx b/frontend/src/features/wallet/components/account-button/account-button.tsx new file mode 100644 index 00000000..ed2228a5 --- /dev/null +++ b/frontend/src/features/wallet/components/account-button/account-button.tsx @@ -0,0 +1,23 @@ +import { Button, ButtonProps } from '@gear-js/vara-ui'; +import { Identicon } from '@polkadot/react-identicon'; + +import styles from './account-button.module.scss'; + +type Props = { + name: string | undefined; + address: string; + color?: ButtonProps['color']; + size?: ButtonProps['size']; + block?: ButtonProps['block']; + onClick: () => void; +}; + +function AccountButton({ address, name, color, size, block, onClick }: Props) { + return ( + + ); +} + +export { AccountButton }; diff --git a/frontend/src/features/wallet/components/account-button/index.ts b/frontend/src/features/wallet/components/account-button/index.ts new file mode 100644 index 00000000..ae1232b0 --- /dev/null +++ b/frontend/src/features/wallet/components/account-button/index.ts @@ -0,0 +1,3 @@ +import { AccountButton } from './account-button'; + +export { AccountButton }; diff --git a/frontend/src/features/wallet/components/index.ts b/frontend/src/features/wallet/components/index.ts new file mode 100644 index 00000000..abedb1d1 --- /dev/null +++ b/frontend/src/features/wallet/components/index.ts @@ -0,0 +1,5 @@ +import { NetworkWalletField } from './network-wallet-field'; +import { SwapNetworkButton } from './swap-network-button'; +import { Wallet } from './wallet'; + +export { Wallet, NetworkWalletField, SwapNetworkButton }; diff --git a/frontend/src/features/wallet/components/network-wallet-field/index.ts b/frontend/src/features/wallet/components/network-wallet-field/index.ts new file mode 100644 index 00000000..13e36fcc --- /dev/null +++ b/frontend/src/features/wallet/components/network-wallet-field/index.ts @@ -0,0 +1,3 @@ +import { NetworkWalletField } from './network-wallet-field'; + +export { NetworkWalletField }; diff --git a/frontend/src/features/wallet/components/network-wallet-field/network-wallet-field.module.scss b/frontend/src/features/wallet/components/network-wallet-field/network-wallet-field.module.scss new file mode 100644 index 00000000..304e9922 --- /dev/null +++ b/frontend/src/features/wallet/components/network-wallet-field/network-wallet-field.module.scss @@ -0,0 +1,32 @@ +.field, +.wallet { + overflow: hidden; +} + +.field { + display: flex; + gap: 16px; +} + +.wallet { + padding: 9px 16px; + + display: flex; + align-items: center; + gap: 10px; + + font-weight: 700; + letter-spacing: 0.42px; + + border-radius: 6px; + background-image: linear-gradient(0deg, #f5f6f8 0%, #f5f6f8 100%), linear-gradient(270deg, #cfcfcf 0%, #cfcfcf 100%); + + img { + width: 16px; + height: 16px; + } + + svg { + flex-shrink: 0; + } +} diff --git a/frontend/src/features/wallet/components/network-wallet-field/network-wallet-field.tsx b/frontend/src/features/wallet/components/network-wallet-field/network-wallet-field.tsx new file mode 100644 index 00000000..84d07ffc --- /dev/null +++ b/frontend/src/features/wallet/components/network-wallet-field/network-wallet-field.tsx @@ -0,0 +1,70 @@ +import { useAccount } from '@gear-js/react-hooks'; +import { Button } from '@gear-js/vara-ui'; +import { useWalletInfo, useWeb3Modal } from '@web3modal/wagmi/react'; + +import { Skeleton, TruncatedText } from '@/components'; +import { useEthAccount, useModal } from '@/hooks'; + +import { WALLET } from '../../consts'; +import { useAccountSync } from '../../hooks'; +import { WalletId } from '../../types'; +import { NetworkWalletModal } from '../network-wallet-modal'; +import { WalletModal } from '../wallet-modal'; + +import styles from './network-wallet-field.module.scss'; + +function NetworkWalletField() { + useAccountSync(); + + const { account, isAccountReady } = useAccount(); + const wallet = account ? WALLET[account.meta.source as WalletId] : undefined; + const { SVG } = wallet || {}; + + const ethAccount = useEthAccount(); + const { walletInfo: ethWallet } = useWalletInfo(); + + const [isModalOpen, openModal, closeModal] = useModal(); + const [isSubstrateModalOpen, openSubstrateModal, closeSubstrateModal] = useModal(); + const { open: openEthModal } = useWeb3Modal(); + + const isConnected = Boolean(account || ethAccount.address); + + const handleButtonClick = () => { + if (account) return openSubstrateModal(); + if (ethAccount.address) return openEthModal(); + + return openModal(); + }; + + // it's probably worth to check isConnecting too, but there is a bug: + // no extensions -> open any wallet's QR code -> close modal -> isConnecting is still true + if (!isAccountReady || ethAccount.isReconnecting) return ; + + return ( + <> +
    + {isConnected && ( +
    + {SVG && } + {ethWallet && wallet} + + {account && } + {ethAccount.address && } +
    + )} + +
    + + {isModalOpen && } + {isSubstrateModalOpen && } + + ); +} + +export { NetworkWalletField }; diff --git a/frontend/src/features/wallet/components/network-wallet-modal/index.ts b/frontend/src/features/wallet/components/network-wallet-modal/index.ts new file mode 100644 index 00000000..f1611a8f --- /dev/null +++ b/frontend/src/features/wallet/components/network-wallet-modal/index.ts @@ -0,0 +1,3 @@ +import { NetworkWalletModal } from './network-wallet-modal'; + +export { NetworkWalletModal }; diff --git a/frontend/src/features/wallet/components/network-wallet-modal/network-wallet-modal.module.scss b/frontend/src/features/wallet/components/network-wallet-modal/network-wallet-modal.module.scss new file mode 100644 index 00000000..41a6ed20 --- /dev/null +++ b/frontend/src/features/wallet/components/network-wallet-modal/network-wallet-modal.module.scss @@ -0,0 +1,10 @@ +.modal { + display: flex; + flex-direction: column; + gap: 16px; + + button svg { + width: 32px; + height: 32px; + } +} diff --git a/frontend/src/features/wallet/components/network-wallet-modal/network-wallet-modal.tsx b/frontend/src/features/wallet/components/network-wallet-modal/network-wallet-modal.tsx new file mode 100644 index 00000000..5c48dbac --- /dev/null +++ b/frontend/src/features/wallet/components/network-wallet-modal/network-wallet-modal.tsx @@ -0,0 +1,43 @@ +import { useAccount } from '@gear-js/react-hooks'; +import { Button, Modal, ModalProps } from '@gear-js/vara-ui'; +import { useWeb3Modal } from '@web3modal/wagmi/react'; +import { useEffect } from 'react'; + +import EthSVG from '@/assets/eth.svg?react'; +import VaraSVG from '@/assets/vara.svg?react'; +import { useEthAccount, useModal } from '@/hooks'; + +import { WalletModal } from '../wallet-modal'; + +import styles from './network-wallet-modal.module.scss'; + +type Props = Pick; + +function NetworkWalletModal({ close }: Props) { + const { account } = useAccount(); + const ethAccount = useEthAccount(); + + const [isSubstrateModalOpen, openSubstrateModal, closeSubstrateModal] = useModal(); + const { open: openEthModal } = useWeb3Modal(); + + useEffect(() => { + if (!account && !ethAccount.isConnected) return; + + close(); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [account, ethAccount.isConnected]); + + return ( + <> + + {/* TODO: NetworkCard */} + + + ); + }); + + const getAccounts = () => + walletAccounts?.map((_account) => { + const { address, meta } = _account; + + const isActive = address === account?.address; + const color = isActive ? 'primary' : 'light'; + + const handleClick = () => { + if (isActive) return; + + login(_account); + close(); + }; + + return ( +
  • + + +
  • + ); + }); + + const handleLogoutButtonClick = () => { + logout(); + close(); + }; + + return ( + + + + {account &&
    + ) : null + }> + {extensions?.length ? ( +
      {getAccounts() || getWallets()}
    + ) : ( +
    +

    A compatible wallet wasn't found or is disabled.

    +

    + Please, install it following the{' '} + + instructions + + . +

    +
    + )} + + ); +} + +export { WalletModal }; diff --git a/frontend/src/features/wallet/components/wallet/index.ts b/frontend/src/features/wallet/components/wallet/index.ts new file mode 100644 index 00000000..c7f5f475 --- /dev/null +++ b/frontend/src/features/wallet/components/wallet/index.ts @@ -0,0 +1,3 @@ +import { Wallet } from './wallet'; + +export { Wallet }; diff --git a/frontend/src/features/wallet/components/wallet/wallet.module.scss b/frontend/src/features/wallet/components/wallet/wallet.module.scss new file mode 100644 index 00000000..534f97b5 --- /dev/null +++ b/frontend/src/features/wallet/components/wallet/wallet.module.scss @@ -0,0 +1,30 @@ +.wallet { + display: flex; + align-items: center; + gap: 24px; +} + +.balance { + display: flex; + align-items: center; + gap: 10px; + + .text { + display: flex; + align-items: flex-end; + gap: 4px; + } + + .value { + font-size: 16px; + font-weight: 600; + line-height: 100%; + } + + .unit { + font-size: 12px; + font-weight: 300; + color: rgba(0, 0, 0, 0.7); + line-height: 100%; + } +} diff --git a/frontend/src/features/wallet/components/wallet/wallet.tsx b/frontend/src/features/wallet/components/wallet/wallet.tsx new file mode 100644 index 00000000..93075f9d --- /dev/null +++ b/frontend/src/features/wallet/components/wallet/wallet.tsx @@ -0,0 +1,49 @@ +import { useAccount, useAccountDeriveBalancesAll, useApi, useBalanceFormat } from '@gear-js/react-hooks'; +import { Button } from '@gear-js/vara-ui'; + +import VaraSVG from '@/assets/vara.svg?react'; +import { useModal } from '@/hooks'; + +import { AccountButton } from '../account-button'; +import { WalletModal } from '../wallet-modal'; + +import styles from './wallet.module.scss'; + +function Wallet() { + const { isApiReady } = useApi(); + const { account, isAccountReady } = useAccount(); + const balances = useAccountDeriveBalancesAll(); + const [isModalOpen, openModal, closeModal] = useModal(); + + const { getFormattedBalance } = useBalanceFormat(); + const balance = isApiReady && balances ? getFormattedBalance(balances.freeBalance) : null; + + return isAccountReady ? ( + <> + {account ? ( +
    + {balances && ( + + + + {balance && ( + + {balance.value} + {balance.unit} + + )} + + )} + + +
    + ) : ( + @@ -78,26 +77,25 @@ function WalletModal({ close }: Props) { close(); }; - return ( - - - - {account && + + {account &&
    diff --git a/frontend/src/features/swap/consts/abi/abi.ts b/frontend/src/features/swap/consts/abi/abi.ts index 5bd5b2c1..68bb8688 100644 --- a/frontend/src/features/swap/consts/abi/abi.ts +++ b/frontend/src/features/swap/consts/abi/abi.ts @@ -22,26 +22,14 @@ const ABI = [ type: 'uint256', }, { - internalType: 'uint256', - name: '_fee', - type: 'uint256', + internalType: 'address', + name: '_feeProvider', + type: 'address', }, { - components: [ - { - internalType: 'uint256', - name: 'x', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'y', - type: 'uint256', - }, - ], - internalType: 'struct LibSecp256k1.Point[]', - name: '_configAuthorityKeys', - type: 'tuple[]', + internalType: 'address[]', + name: '_authorityKeys', + type: 'address[]', }, { internalType: 'address[]', @@ -88,6 +76,17 @@ const ABI = [ name: 'AccessControlUnauthorizedAccount', type: 'error', }, + { + inputs: [ + { + internalType: 'uint256', + name: 'minimumAmount', + type: 'uint256', + }, + ], + name: 'AmountBelowMinimum', + type: 'error', + }, { inputs: [ { @@ -109,6 +108,11 @@ const ABI = [ name: 'AuthorityKeyAlreadyExists', type: 'error', }, + { + inputs: [], + name: 'AuthorityKeyDoesNotExist', + type: 'error', + }, { inputs: [], name: 'CallerNotValidator', @@ -134,6 +138,17 @@ const ABI = [ name: 'DuplicateSignaturesDetected', type: 'error', }, + { + inputs: [ + { + internalType: 'address', + name: 'validatorAddress', + type: 'address', + }, + ], + name: 'DuplicateValidatorAddress', + type: 'error', + }, { inputs: [], name: 'ECDSAInvalidSignature', @@ -182,11 +197,6 @@ const ABI = [ name: 'EtherSendFailure', type: 'error', }, - { - inputs: [], - name: 'IndexOutOfBounds', - type: 'error', - }, { inputs: [ { @@ -230,6 +240,11 @@ const ABI = [ name: 'InsufficientSignersError', type: 'error', }, + { + inputs: [], + name: 'InvalidFeeProviderSignature', + type: 'error', + }, { inputs: [ { @@ -331,6 +346,11 @@ const ABI = [ name: 'PointNotOnCurve', type: 'error', }, + { + inputs: [], + name: 'QueueNotEmpty', + type: 'error', + }, { inputs: [], name: 'ReentrancyGuardReentrantCall', @@ -352,6 +372,33 @@ const ABI = [ name: 'SignatureMismatch', type: 'error', }, + { + inputs: [ + { + internalType: 'uint256', + name: 'currentTimestamp', + type: 'uint256', + }, + { + internalType: 'uint256', + name: 'deadline', + type: 'uint256', + }, + ], + name: 'SignatureOutOfDate', + type: 'error', + }, + { + inputs: [ + { + internalType: 'uint256', + name: 'signaturesRequired', + type: 'uint256', + }, + ], + name: 'SignaturesThresholdNotReached', + type: 'error', + }, { inputs: [ { @@ -427,17 +474,6 @@ const ABI = [ name: 'ValidatorExists', type: 'error', }, - { - inputs: [ - { - internalType: 'uint256', - name: 'validatorsRequired', - type: 'uint256', - }, - ], - name: 'ValidatorsNotReached', - type: 'error', - }, { inputs: [ { @@ -481,6 +517,11 @@ const ABI = [ name: 'ZeroAmount', type: 'error', }, + { + inputs: [], + name: 'ZeroFee', + type: 'error', + }, { inputs: [], name: 'ZeroSignatureThreshold', @@ -522,25 +563,6 @@ const ABI = [ name: 'EthToVaraTransferEvent', type: 'event', }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'to', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'EtherWithdrawn', - type: 'event', - }, { anonymous: false, inputs: [ @@ -712,24 +734,9 @@ const ABI = [ { inputs: [ { - internalType: 'bytes32', - name: 'signature', - type: 'bytes32', - }, - { - internalType: 'bytes20', - name: 'commitmentAggregated', - type: 'bytes20', - }, - { - internalType: 'bytes20', - name: 'commitmentSigners', - type: 'bytes20', - }, - { - internalType: 'uint256[]', - name: 'pubKeysIds', - type: 'uint256[]', + internalType: 'bytes[]', + name: 'signatures', + type: 'bytes[]', }, ], name: 'activateEmergencyStopByConfigAuthority', @@ -747,44 +754,17 @@ const ABI = [ { inputs: [ { - internalType: 'bytes32', - name: 'signature', - type: 'bytes32', - }, - { - internalType: 'bytes20', - name: 'commitmentAggregated', - type: 'bytes20', - }, - { - internalType: 'bytes20', - name: 'commitmentSigners', - type: 'bytes20', - }, - { - internalType: 'uint256[]', - name: 'pubKeysIds', - type: 'uint256[]', + internalType: 'bytes[]', + name: 'signatures', + type: 'bytes[]', }, { - components: [ - { - internalType: 'uint256', - name: 'x', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'y', - type: 'uint256', - }, - ], - internalType: 'struct LibSecp256k1.Point', - name: '_configAuthorityKey', - type: 'tuple', + internalType: 'address', + name: '_authorityKey', + type: 'address', }, ], - name: 'addConfigAuthorityKey', + name: 'addAuthorityKey', outputs: [], stateMutability: 'nonpayable', type: 'function', @@ -792,32 +772,17 @@ const ABI = [ { inputs: [ { - internalType: 'bytes32', - name: 'signature', - type: 'bytes32', - }, - { - internalType: 'bytes20', - name: 'commitmentAggregated', - type: 'bytes20', - }, - { - internalType: 'bytes20', - name: 'commitmentSigners', - type: 'bytes20', - }, - { - internalType: 'uint256[]', - name: 'pubKeysIds', - type: 'uint256[]', + internalType: 'bytes[]', + name: 'signatures', + type: 'bytes[]', }, { - internalType: 'address', - name: 'newValidatorAddress', - type: 'address', + internalType: 'address[]', + name: 'newValidatorAddresses', + type: 'address[]', }, ], - name: 'addValidator', + name: 'addValidators', outputs: [], stateMutability: 'nonpayable', type: 'function', @@ -836,26 +801,19 @@ const ABI = [ type: 'function', }, { - inputs: [], - name: 'authorityNonce', - outputs: [ + inputs: [ { internalType: 'uint256', name: '', type: 'uint256', }, ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'bridgeId', + name: 'authorityKeys', outputs: [ { - internalType: 'uint256', + internalType: 'address', name: '', - type: 'uint256', + type: 'address', }, ], stateMutability: 'view', @@ -864,40 +822,42 @@ const ABI = [ { inputs: [ { - internalType: 'bytes[]', - name: 'signatures', - type: 'bytes[]', + internalType: 'address', + name: '', + type: 'address', }, ], - name: 'checkUniqueness', + name: 'authorityKeysIndices', outputs: [ { - internalType: 'bool', + internalType: 'uint256', name: '', - type: 'bool', + type: 'uint256', }, ], - stateMutability: 'nonpayable', + stateMutability: 'view', type: 'function', }, { - inputs: [ + inputs: [], + name: 'authorityNonce', + outputs: [ { internalType: 'uint256', name: '', type: 'uint256', }, ], - name: 'configAuthorityKeys', + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'bridgeId', outputs: [ { internalType: 'uint256', - name: 'x', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'y', + name: '', type: 'uint256', }, ], @@ -907,24 +867,27 @@ const ABI = [ { inputs: [ { - internalType: 'bytes32', - name: 'signature', - type: 'bytes32', - }, - { - internalType: 'bytes20', - name: 'commitmentAggregated', - type: 'bytes20', + internalType: 'bytes[]', + name: 'signatures', + type: 'bytes[]', }, { - internalType: 'bytes20', - name: 'commitmentSigners', - type: 'bytes20', + internalType: 'uint256', + name: '_lastExecutedVaraNonceId', + type: 'uint256', }, + ], + name: 'clearEthToVaraTransfers', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ { - internalType: 'uint256[]', - name: 'pubKeysIds', - type: 'uint256[]', + internalType: 'bytes[]', + name: 'signatures', + type: 'bytes[]', }, ], name: 'deactivateEmergencyStop', @@ -948,24 +911,9 @@ const ABI = [ { inputs: [ { - internalType: 'bytes32', - name: 'signature', - type: 'bytes32', - }, - { - internalType: 'bytes20', - name: 'commitmentAggregated', - type: 'bytes20', - }, - { - internalType: 'bytes20', - name: 'commitmentSigners', - type: 'bytes20', - }, - { - internalType: 'uint256[]', - name: 'pubKeysIds', - type: 'uint256[]', + internalType: 'bytes[]', + name: 'signatures', + type: 'bytes[]', }, ], name: 'endMigration', @@ -1022,7 +970,7 @@ const ABI = [ }, { inputs: [], - name: 'fee', + name: 'feeBalance', outputs: [ { internalType: 'uint256', @@ -1035,12 +983,12 @@ const ABI = [ }, { inputs: [], - name: 'feeBalance', + name: 'feeProvider', outputs: [ { - internalType: 'uint256', + internalType: 'address', name: '', - type: 'uint256', + type: 'address', }, ], stateMutability: 'view', @@ -1061,7 +1009,7 @@ const ABI = [ }, { inputs: [], - name: 'getAuthorityEthAddresses', + name: 'getAuthorityKeys', outputs: [ { internalType: 'address[]', @@ -1073,51 +1021,26 @@ const ABI = [ type: 'function', }, { - inputs: [], - name: 'getConfigAuthorityKeys', + inputs: [ + { + internalType: 'uint256', + name: 'fromIndex', + type: 'uint256', + }, + { + internalType: 'uint256', + name: 'toIndex', + type: 'uint256', + }, + ], + name: 'getEthToVaraTransfersInRange', outputs: [ { components: [ { - internalType: 'uint256', - name: 'x', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'y', - type: 'uint256', - }, - ], - internalType: 'struct LibSecp256k1.Point[]', - name: '', - type: 'tuple[]', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'fromIndex', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'toIndex', - type: 'uint256', - }, - ], - name: 'getEthToVaraTransfersInRange', - outputs: [ - { - components: [ - { - internalType: 'address', - name: 'sender', - type: 'address', + internalType: 'address', + name: 'sender', + type: 'address', }, { internalType: 'string', @@ -1148,32 +1071,6 @@ const ABI = [ stateMutability: 'view', type: 'function', }, - { - inputs: [], - name: 'getLastEthToVaraNonce', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'getLastVaraToEthNonce', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, { inputs: [ { @@ -1196,24 +1093,9 @@ const ABI = [ { inputs: [ { - internalType: 'bytes32', - name: 'signature', - type: 'bytes32', - }, - { - internalType: 'bytes20', - name: 'commitmentAggregated', - type: 'bytes20', - }, - { - internalType: 'bytes20', - name: 'commitmentSigners', - type: 'bytes20', - }, - { - internalType: 'uint256[]', - name: 'pubKeysIds', - type: 'uint256[]', + internalType: 'bytes[]', + name: 'signatures', + type: 'bytes[]', }, { internalType: 'address', @@ -1282,69 +1164,13 @@ const ABI = [ type: 'function', }, { - inputs: [ - { - components: [ - { - internalType: 'uint256', - name: 'x', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'y', - type: 'uint256', - }, - ], - internalType: 'struct LibSecp256k1.Point', - name: '_configAuthorityKey', - type: 'tuple', - }, - ], - name: 'isKeyNotPresent', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'string', - name: '_addr', - type: 'string', - }, - ], - name: 'isValidVaraAddress', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'pure', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '_validator', - type: 'address', - }, - ], - name: 'isValidator', + inputs: [], + name: 'lastExecutedVaraNonceId', outputs: [ { - internalType: 'bool', + internalType: 'uint256', name: '', - type: 'bool', + type: 'uint256', }, ], stateMutability: 'view', @@ -1352,46 +1178,26 @@ const ABI = [ }, { inputs: [ - { - internalType: 'uint256', - name: 'authorityKeyId', - type: 'uint256', - }, { internalType: 'address', name: 'newContract', type: 'address', }, - { - internalType: 'uint256', - name: 'start', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'count', - type: 'uint256', - }, ], - name: 'migrateEthToVaraTransfers', + name: 'migrateNonces', outputs: [], stateMutability: 'nonpayable', type: 'function', }, { inputs: [ - { - internalType: 'uint256', - name: 'authorityKeyId', - type: 'uint256', - }, { internalType: 'address', name: 'newContract', type: 'address', }, ], - name: 'migrateNonces', + name: 'migrateTokenBalance', outputs: [], stateMutability: 'nonpayable', type: 'function', @@ -1438,67 +1244,17 @@ const ABI = [ { inputs: [ { - components: [ - { - internalType: 'address', - name: 'sender', - type: 'address', - }, - { - internalType: 'string', - name: 'recipient', - type: 'string', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'nonceId', - type: 'uint256', - }, - ], - internalType: 'struct Bridge.EthToVaraTransfer[]', - name: 'transfers', - type: 'tuple[]', - }, - ], - name: 'receiveEthToVaraTransfers', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'bytes32', - name: 'signature', - type: 'bytes32', - }, - { - internalType: 'bytes20', - name: 'commitmentAggregated', - type: 'bytes20', - }, - { - internalType: 'bytes20', - name: 'commitmentSigners', - type: 'bytes20', - }, - { - internalType: 'uint256[]', - name: 'pubKeysIds', - type: 'uint256[]', + internalType: 'bytes[]', + name: 'signatures', + type: 'bytes[]', }, { - internalType: 'uint256', - name: '_configAuthorityKeyId', - type: 'uint256', + internalType: 'address', + name: '_authorityKey', + type: 'address', }, ], - name: 'removeConfigAuthorityKey', + name: 'removeAuthorityKey', outputs: [], stateMutability: 'nonpayable', type: 'function', @@ -1506,32 +1262,17 @@ const ABI = [ { inputs: [ { - internalType: 'bytes32', - name: 'signature', - type: 'bytes32', - }, - { - internalType: 'bytes20', - name: 'commitmentAggregated', - type: 'bytes20', - }, - { - internalType: 'bytes20', - name: 'commitmentSigners', - type: 'bytes20', - }, - { - internalType: 'uint256[]', - name: 'pubKeysIds', - type: 'uint256[]', + internalType: 'bytes[]', + name: 'signatures', + type: 'bytes[]', }, { - internalType: 'address', - name: 'validatorAddress', - type: 'address', + internalType: 'address[]', + name: 'validatorAddresses', + type: 'address[]', }, ], - name: 'removeValidator', + name: 'removeValidators', outputs: [], stateMutability: 'nonpayable', type: 'function', @@ -1557,24 +1298,9 @@ const ABI = [ { inputs: [ { - internalType: 'bytes32', - name: 'signature', - type: 'bytes32', - }, - { - internalType: 'bytes20', - name: 'commitmentAggregated', - type: 'bytes20', - }, - { - internalType: 'bytes20', - name: 'commitmentSigners', - type: 'bytes20', - }, - { - internalType: 'uint256[]', - name: 'pubKeysIds', - type: 'uint256[]', + internalType: 'bytes[]', + name: 'signatures', + type: 'bytes[]', }, { internalType: 'address', @@ -1626,24 +1352,9 @@ const ABI = [ { inputs: [ { - internalType: 'bytes32', - name: 'signature', - type: 'bytes32', - }, - { - internalType: 'bytes20', - name: 'commitmentAggregated', - type: 'bytes20', - }, - { - internalType: 'bytes20', - name: 'commitmentSigners', - type: 'bytes20', - }, - { - internalType: 'uint256[]', - name: 'pubKeysIds', - type: 'uint256[]', + internalType: 'bytes[]', + name: 'signatures', + type: 'bytes[]', }, { internalType: 'address', @@ -1672,106 +1383,9 @@ const ABI = [ { inputs: [ { - components: [ - { - internalType: 'address', - name: 'sender', - type: 'address', - }, - { - internalType: 'string', - name: 'recipient', - type: 'string', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'nonceId', - type: 'uint256', - }, - ], - internalType: 'struct Bridge.EthToVaraTransfer[]', - name: 'transfers', - type: 'tuple[]', - }, - ], - name: 'sortTransactionNonces', - outputs: [ - { - internalType: 'uint256[]', - name: '', - type: 'uint256[]', - }, - ], - stateMutability: 'pure', - type: 'function', - }, - { - inputs: [ - { - components: [ - { - internalType: 'string', - name: 'sender', - type: 'string', - }, - { - internalType: 'address payable', - name: 'recipient', - type: 'address', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'nonceId', - type: 'uint256', - }, - ], - internalType: 'struct Bridge.VaraToEthTransfer[]', - name: 'transfers', - type: 'tuple[]', - }, - ], - name: 'sortTransactionNonces', - outputs: [ - { - internalType: 'uint256[]', - name: '', - type: 'uint256[]', - }, - ], - stateMutability: 'pure', - type: 'function', - }, - { - inputs: [ - { - internalType: 'bytes32', - name: 'signature', - type: 'bytes32', - }, - { - internalType: 'bytes20', - name: 'commitmentAggregated', - type: 'bytes20', - }, - { - internalType: 'bytes20', - name: 'commitmentSigners', - type: 'bytes20', - }, - { - internalType: 'uint256[]', - name: 'pubKeysIds', - type: 'uint256[]', + internalType: 'bytes[]', + name: 'signatures', + type: 'bytes[]', }, ], name: 'startMigration', @@ -1800,6 +1414,26 @@ const ABI = [ }, { inputs: [ + { + internalType: 'uint256', + name: 'fee', + type: 'uint256', + }, + { + internalType: 'uint256', + name: 'mortality', + type: 'uint256', + }, + { + internalType: 'uint256', + name: 'timestamp', + type: 'uint256', + }, + { + internalType: 'bytes', + name: 'signature', + type: 'bytes', + }, { internalType: 'string', name: '_recipient', @@ -1852,7 +1486,7 @@ const ABI = [ }, { internalType: 'uint256', - name: 'lastExecutedVaraNonceId', + name: '_lastExecutedVaraNonceId', type: 'uint256', }, ], @@ -1864,32 +1498,17 @@ const ABI = [ { inputs: [ { - internalType: 'bytes32', - name: 'signature', - type: 'bytes32', - }, - { - internalType: 'bytes20', - name: 'commitmentAggregated', - type: 'bytes20', - }, - { - internalType: 'bytes20', - name: 'commitmentSigners', - type: 'bytes20', - }, - { - internalType: 'uint256[]', - name: 'pubKeysIds', - type: 'uint256[]', + internalType: 'bytes[]', + name: 'signatures', + type: 'bytes[]', }, { - internalType: 'uint256', - name: 'newFee', - type: 'uint256', + internalType: 'address', + name: '_feeProvider', + type: 'address', }, ], - name: 'updateFee', + name: 'updateFeeProvider', outputs: [], stateMutability: 'nonpayable', type: 'function', @@ -1897,24 +1516,9 @@ const ABI = [ { inputs: [ { - internalType: 'bytes32', - name: 'signature', - type: 'bytes32', - }, - { - internalType: 'bytes20', - name: 'commitmentAggregated', - type: 'bytes20', - }, - { - internalType: 'bytes20', - name: 'commitmentSigners', - type: 'bytes20', - }, - { - internalType: 'uint256[]', - name: 'pubKeysIds', - type: 'uint256[]', + internalType: 'bytes[]', + name: 'signatures', + type: 'bytes[]', }, { internalType: 'uint256', @@ -1930,24 +1534,9 @@ const ABI = [ { inputs: [ { - internalType: 'bytes32', - name: 'signature', - type: 'bytes32', - }, - { - internalType: 'bytes20', - name: 'commitmentAggregated', - type: 'bytes20', - }, - { - internalType: 'bytes20', - name: 'commitmentSigners', - type: 'bytes20', - }, - { - internalType: 'uint256[]', - name: 'pubKeysIds', - type: 'uint256[]', + internalType: 'bytes[]', + name: 'signatures', + type: 'bytes[]', }, { internalType: 'uint8', @@ -1963,24 +1552,9 @@ const ABI = [ { inputs: [ { - internalType: 'bytes32', - name: 'signature', - type: 'bytes32', - }, - { - internalType: 'bytes20', - name: 'commitmentAggregated', - type: 'bytes20', - }, - { - internalType: 'bytes20', - name: 'commitmentSigners', - type: 'bytes20', - }, - { - internalType: 'uint256[]', - name: 'pubKeysIds', - type: 'uint256[]', + internalType: 'bytes[]', + name: 'signatures', + type: 'bytes[]', }, { internalType: 'uint8', @@ -2006,51 +1580,6 @@ const ABI = [ stateMutability: 'nonpayable', type: 'function', }, - { - inputs: [ - { - internalType: 'bytes32', - name: 'signature', - type: 'bytes32', - }, - { - internalType: 'bytes20', - name: 'commitmentAggregated', - type: 'bytes20', - }, - { - internalType: 'bytes20', - name: 'commitmentSigners', - type: 'bytes20', - }, - { - internalType: 'uint256[]', - name: 'pubKeysIds', - type: 'uint256[]', - }, - { - components: [ - { - internalType: 'address', - name: 'previousValidatorAddress', - type: 'address', - }, - { - internalType: 'address', - name: 'newValidatorAddress', - type: 'address', - }, - ], - internalType: 'struct Bridge.ValidatorKeyUpdateByAutority[]', - name: 'validatorKeyUpdate', - type: 'tuple[]', - }, - ], - name: 'updateValidatorKeysByAuthority', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, { inputs: [ { @@ -2104,6 +1633,11 @@ const ABI = [ }, { inputs: [ + { + internalType: 'bytes[]', + name: 'signatures', + type: 'bytes[]', + }, { internalType: 'address payable', name: '_to', @@ -2114,28 +1648,8 @@ const ABI = [ name: '_amount', type: 'uint256', }, - { - internalType: 'bytes32', - name: 'signature', - type: 'bytes32', - }, - { - internalType: 'bytes20', - name: 'commitmentAggregated', - type: 'bytes20', - }, - { - internalType: 'bytes20', - name: 'commitmentSigners', - type: 'bytes20', - }, - { - internalType: 'uint256[]', - name: 'pubKeysIds', - type: 'uint256[]', - }, ], - name: 'withdrawEther', + name: 'withdrawFee', outputs: [], stateMutability: 'nonpayable', type: 'function', diff --git a/frontend/src/features/swap/consts/eth.ts b/frontend/src/features/swap/consts/eth.ts index 316d7a53..ec92b2bb 100644 --- a/frontend/src/features/swap/consts/eth.ts +++ b/frontend/src/features/swap/consts/eth.ts @@ -1,6 +1,5 @@ const FUNCTION_NAME = { TRANSIT: 'transitEthToVara', - FEE: 'fee', MIN_AMOUNT: 'minAmount', FUNGIBLE_TOKEN_ADDRESS: 'addressOfToken', diff --git a/frontend/src/features/swap/consts/index.ts b/frontend/src/features/swap/consts/index.ts index e92a471f..cf5ac47c 100644 --- a/frontend/src/features/swap/consts/index.ts +++ b/frontend/src/features/swap/consts/index.ts @@ -1,7 +1,7 @@ import { ABI, FUNGIBLE_TOKEN_ABI } from './abi'; import { FUNCTION_NAME, EVENT_NAME } from './eth'; import { FIELD_NAME, DEFAULT_VALUES, ADDRESS_SCHEMA, ERROR_MESSAGE } from './form'; -import { TOKEN_TYPE, METADATA_URL } from './spec'; +import { TOKEN_TYPE, IDL_URL } from './spec'; import { STATE_FUNCTION } from './vara'; const BALANCE_REFETCH_INTERVAL = 10000; @@ -18,5 +18,5 @@ export { BALANCE_REFETCH_INTERVAL, STATE_FUNCTION, TOKEN_TYPE, - METADATA_URL, + IDL_URL, }; diff --git a/frontend/src/features/swap/consts/spec.ts b/frontend/src/features/swap/consts/spec.ts index 22c5afce..6e49368f 100644 --- a/frontend/src/features/swap/consts/spec.ts +++ b/frontend/src/features/swap/consts/spec.ts @@ -1,14 +1,9 @@ -import bridgeMetadataUrl from '../assets/bridge_vara.meta.txt'; -import ftBridgeMetadataUrl from '../assets/bridge_vara_wrapped_tokens.meta.txt'; +import IDL_URL from '../assets/vara-bridge.idl?url'; +// @deprecated const TOKEN_TYPE = { NATIVE: 'native', FUNGIBLE: 'fungible', } as const; -const METADATA_URL = { - [TOKEN_TYPE.NATIVE]: bridgeMetadataUrl, - [TOKEN_TYPE.FUNGIBLE]: ftBridgeMetadataUrl, -} as const; - -export { TOKEN_TYPE, METADATA_URL }; +export { TOKEN_TYPE, IDL_URL }; diff --git a/frontend/src/features/swap/consts/vara.ts b/frontend/src/features/swap/consts/vara.ts index eeab4bed..11b568de 100644 --- a/frontend/src/features/swap/consts/vara.ts +++ b/frontend/src/features/swap/consts/vara.ts @@ -1,5 +1,5 @@ const STATE_FUNCTION = { - CONFIG: 'config', + CONFIG: 'Config', } as const; export { STATE_FUNCTION }; diff --git a/frontend/src/features/swap/hooks/eth/use-eth-config.ts b/frontend/src/features/swap/hooks/eth/use-eth-config.ts index f96163d5..f791e461 100644 --- a/frontend/src/features/swap/hooks/eth/use-eth-config.ts +++ b/frontend/src/features/swap/hooks/eth/use-eth-config.ts @@ -1,8 +1,5 @@ -import { formatEther } from 'viem'; import { useReadContracts } from 'wagmi'; -import { isUndefined } from '@/utils'; - import { ABI, FUNCTION_NAME } from '../../consts'; import { Contract } from '../../types'; @@ -12,19 +9,15 @@ function useEthConfig({ address }: Contract) { const { data, isLoading } = useReadContracts({ contracts: [ - { abi, address, functionName: FUNCTION_NAME.FEE }, { abi, address, functionName: FUNCTION_NAME.MIN_AMOUNT }, { abi, address, functionName: FUNCTION_NAME.FUNGIBLE_TOKEN_ADDRESS }, ], }); - const fee = data?.[0]?.result; - const minValue = data?.[1]?.result; - const ftAddress = data?.[2]?.result; - - const formattedFee = !isUndefined(fee) ? formatEther(fee) : undefined; + const minValue = data?.[0]?.result; + const ftAddress = data?.[1]?.result; - return { fee: { value: fee, formattedValue: formattedFee }, minValue, ftAddress, isLoading }; + return { minValue, ftAddress, isLoading }; } export { useEthConfig }; diff --git a/frontend/src/features/swap/hooks/eth/use-handle-eth-submit.ts b/frontend/src/features/swap/hooks/eth/use-handle-eth-submit.ts index 102fe157..88f23ca1 100644 --- a/frontend/src/features/swap/hooks/eth/use-handle-eth-submit.ts +++ b/frontend/src/features/swap/hooks/eth/use-handle-eth-submit.ts @@ -5,28 +5,34 @@ import { useWriteContract } from 'wagmi'; import { isUndefined, logger } from '@/utils'; import { FUNCTION_NAME, ABI } from '../../consts'; -import { Config, Contract, FormattedValues } from '../../types'; +import { Config, Contract, FeeCalculator, FormattedValues } from '../../types'; import { useApprove } from './use-approve'; -function useHandleEthSubmit({ address: bridgeAddress }: Contract, { fee, ftAddress }: Config) { +function useHandleEthSubmit( + { address: bridgeAddress }: Contract, + { ftAddress }: Config, + feeCalculatorData?: FeeCalculator, +) { const alert = useAlert(); const { writeContract, isPending } = useWriteContract(); const approve = useApprove(ftAddress); const onSubmit = ({ amount: _amount, expectedAmount, accountAddress }: FormattedValues, onSuccess: () => void) => { - if (isUndefined(fee.value)) throw new Error('Fee is not defined'); + if (isUndefined(feeCalculatorData)) throw new Error('FeeCalculatorData is not defined'); + const { fee, mortality, timestamp, signature } = feeCalculatorData || {}; const address = bridgeAddress; const amount = expectedAmount; const isNativeToken = !ftAddress; - const value = isNativeToken ? _amount : fee.value; + const value = isNativeToken ? _amount + fee.value : fee.value; const transit = () => { logger.info( FUNCTION_NAME.TRANSIT, - `\naddress: ${address}\nargs: [${accountAddress}, ${amount}]\nvalue: ${value}\nisNativeToken: ${isNativeToken}`, + `\naddress: ${address}\nargs: [\nfee: ${fee.value}\nmortality: ${mortality}\ntimestamp: ${timestamp}\nsignature: ${signature}\n${accountAddress} \namount: ${amount}\n]` + + `\nvalue: ${value}\nisNativeToken: ${isNativeToken}`, ); writeContract( @@ -34,7 +40,7 @@ function useHandleEthSubmit({ address: bridgeAddress }: Contract, { fee, ftAddre abi: ABI, address, functionName: FUNCTION_NAME.TRANSIT, - args: [accountAddress, amount], + args: [fee.value, BigInt(mortality), BigInt(timestamp), signature, accountAddress, amount], value, }, { diff --git a/frontend/src/features/swap/hooks/index.ts b/frontend/src/features/swap/hooks/index.ts index 73aedb20..e0e6d6ac 100644 --- a/frontend/src/features/swap/hooks/index.ts +++ b/frontend/src/features/swap/hooks/index.ts @@ -1,6 +1,7 @@ import { useEthConfig, useEthBalance, useHandleEthSubmit } from './eth'; import { useBridge } from './use-bridge'; import { useSwapForm } from './use-swap-form'; +import { useFeeCalculator } from './use-fee-calculator'; import { useVaraConfig, useVaraBalance, useHandleVaraSubmit } from './vara'; export { @@ -12,4 +13,5 @@ export { useVaraBalance, useHandleVaraSubmit, useBridge, + useFeeCalculator, }; diff --git a/frontend/src/features/swap/hooks/use-bridge.ts b/frontend/src/features/swap/hooks/use-bridge.ts index 6a406a4d..4a096787 100644 --- a/frontend/src/features/swap/hooks/use-bridge.ts +++ b/frontend/src/features/swap/hooks/use-bridge.ts @@ -2,11 +2,11 @@ import { useMemo, useState } from 'react'; import { NETWORK_NAME, NETWORK_NATIVE_SYMBOL, SPEC } from '@/consts'; -import { METADATA_URL } from '../consts'; +import { IDL_URL } from '../consts'; import { NetworkName } from '../types'; import { getOptions } from '../utils'; -import { useMetadata } from './vara'; +import { useSails } from './vara'; function useBridge(networkName: NetworkName) { const isVaraNetwork = networkName === NETWORK_NAME.VARA; @@ -18,8 +18,8 @@ function useBridge(networkName: NetworkName) { const bridge = SPEC[pair][networkName]; const { address } = bridge; - const metadata = useMetadata(isVaraNetwork ? METADATA_URL[bridge.tokenType] : undefined); - const contract = { address, metadata }; + const sails = useSails(isVaraNetwork ? IDL_URL : undefined); + const contract = { address, sails }; const nativeSymbol = NETWORK_NATIVE_SYMBOL[networkName]; const symbol = { value: bridge.symbol, native: nativeSymbol }; diff --git a/frontend/src/features/swap/hooks/use-fee-calculator.ts b/frontend/src/features/swap/hooks/use-fee-calculator.ts new file mode 100644 index 00000000..f8ae0178 --- /dev/null +++ b/frontend/src/features/swap/hooks/use-fee-calculator.ts @@ -0,0 +1,54 @@ +import { useAlert } from '@gear-js/react-hooks'; +import { useQuery } from '@tanstack/react-query'; +import { useEffect } from 'react'; +import { FEE_CALCULATOR_URL, FEE_DECIMALS, NETWORK_NAME } from '@/consts'; +import { NetworkName, FeeCalculator } from '../types'; +import { FeeCalculatorResponse } from '../types/hooks'; +import { formatUnits } from 'viem'; + +type Params = { + networkName: NetworkName; +}; + +function useFeeCalculator({ networkName }: Params) { + const targetNetwork = networkName === NETWORK_NAME.VARA ? 'eth' : 'vara'; + const alert = useAlert(); + + const getFee = async () => { + const response = await fetch(`${FEE_CALCULATOR_URL}/${targetNetwork}`); + if (!response.ok) throw new Error('Fee calculator is not available'); + + const json = (await response.json()) as FeeCalculatorResponse; + + return json; + }; + + const prepareData = (originalData: FeeCalculatorResponse) => { + const value = BigInt(originalData.fee); + return { + ...originalData, + fee: { + value: value, + formattedValue: formatUnits(value, FEE_DECIMALS[networkName]), + }, + } as FeeCalculator; + }; + + const { data, refetch, isFetching, error } = useQuery({ + queryKey: ['feeCalculator', targetNetwork], + queryFn: getFee, + select: prepareData, + }); + + useEffect(() => { + if (error) { + alert.error('Fee calculator is not available'); + } + }, [error]); + + const isFeeLoading = isFetching; + + return { feeCalculatorData: data, isFeeLoading, refetch, error }; +} + +export { useFeeCalculator }; diff --git a/frontend/src/features/swap/hooks/vara/index.ts b/frontend/src/features/swap/hooks/vara/index.ts index 49576de1..4a87fc51 100644 --- a/frontend/src/features/swap/hooks/vara/index.ts +++ b/frontend/src/features/swap/hooks/vara/index.ts @@ -1,6 +1,6 @@ import { useHandleVaraSubmit } from './use-handle-vara-submit'; -import { useMetadata } from './use-metadata'; +import { useSails } from './use-sails'; import { useVaraBalance } from './use-vara-balance'; import { useVaraConfig } from './use-vara-config'; -export { useVaraConfig, useVaraBalance, useHandleVaraSubmit, useMetadata }; +export { useVaraConfig, useVaraBalance, useHandleVaraSubmit, useSails }; diff --git a/frontend/src/features/swap/hooks/vara/use-extrinsic-failed-message.ts b/frontend/src/features/swap/hooks/vara/use-extrinsic-failed-message.ts new file mode 100644 index 00000000..1b341ffc --- /dev/null +++ b/frontend/src/features/swap/hooks/vara/use-extrinsic-failed-message.ts @@ -0,0 +1,18 @@ +import { useApi } from '@gear-js/react-hooks'; +import { Event } from '@polkadot/types/interfaces'; + +function useExtrinsicFailedMessage() { + const { api, isApiReady } = useApi(); + + const getExtrinsicFailedMessage = (event: Event) => { + if (!isApiReady) throw new Error('API is not initialized'); + + const { docs, method } = api.getExtrinsicFailedError(event); + + return `${method}: ${docs}`; + }; + + return getExtrinsicFailedMessage; +} + +export { useExtrinsicFailedMessage }; diff --git a/frontend/src/features/swap/hooks/vara/use-fungible-token-balance.ts b/frontend/src/features/swap/hooks/vara/use-fungible-token-balance.ts index feb4b509..90f357a4 100644 --- a/frontend/src/features/swap/hooks/vara/use-fungible-token-balance.ts +++ b/frontend/src/features/swap/hooks/vara/use-fungible-token-balance.ts @@ -6,7 +6,7 @@ import { formatUnits } from 'viem'; import { isUndefined } from '@/utils'; -import fungibleTokenIdlUrl from '../../assets/ft.idl?url'; +import fungibleTokenIdlUrl from '../../assets/vft.idl?url'; import { BALANCE_REFETCH_INTERVAL } from '../../consts'; function useFungibleTokenBalance(address: HexString | undefined) { @@ -26,7 +26,7 @@ function useFungibleTokenBalance(address: HexString | undefined) { const sails = (await Sails.new()).setApi(api).setProgramId(address); const parsedIdl = sails.parseIdl(idl); - const { BalanceOf, Decimals } = parsedIdl.services.Erc20.queries; + const { BalanceOf, Decimals } = parsedIdl.services.Vft.queries; const balance = await BalanceOf(decodedAddress, undefined, undefined, decodedAddress); const decimals = await Decimals(decodedAddress); diff --git a/frontend/src/features/swap/hooks/vara/use-handle-vara-submit.ts b/frontend/src/features/swap/hooks/vara/use-handle-vara-submit.ts index 09f5018d..7c5cace8 100644 --- a/frontend/src/features/swap/hooks/vara/use-handle-vara-submit.ts +++ b/frontend/src/features/swap/hooks/vara/use-handle-vara-submit.ts @@ -1,32 +1,36 @@ import { isUndefined, logger } from '@/utils'; -import { Config, Contract, FormattedValues } from '../../types'; +import { Config, Contract, FormattedValues, FeeCalculator } from '../../types'; import { useSendMessage } from './use-send-message'; -function useHandleVaraSubmit({ address, metadata }: Contract, { fee, ftAddress }: Config) { +function useHandleVaraSubmit({ address, sails }: Contract, { ftAddress }: Config, feeCalculatorData?: FeeCalculator) { const isNativeToken = !ftAddress; - const { sendMessage, isPending } = useSendMessage(address, metadata, { - disableAlerts: true, - isMaxGasLimit: !isNativeToken, - }); + // For fungble token contracts gas calculation does not work cuz contracts check the amount of gas applied + const gasLimit = isNativeToken ? undefined : BigInt(100_000_000_000); + const { sendMessage, isPending } = useSendMessage(gasLimit); const onSubmit = ({ amount: _amount, expectedAmount, accountAddress }: FormattedValues, onSuccess: () => void) => { - if (isUndefined(fee.value)) throw new Error('Fee is not defined'); + if (isUndefined(sails)) throw new Error('Sails is not defined'); + if (isUndefined(feeCalculatorData)) throw new Error('FeeCalculatorData is not defined'); + const { fee, mortality, timestamp, signature } = feeCalculatorData; - const amount = String(expectedAmount); // TODO: fix after @gear-js/react-hooks bigint support + const amount = expectedAmount; const recipient = accountAddress; - const payload = { TransitVaraToEth: { amount, recipient } }; - const value = String(isNativeToken ? _amount : fee.value); // TODO: fix after @gear-js/react-hooks bigint support + const value = isNativeToken ? _amount + fee.value : fee.value; logger.info( 'TransitVaraToEth', - `\nprogramId:${address}\namount: ${amount}\nrecipient: ${recipient}\nvalue: ${value}\nisNativeToken: ${isNativeToken}`, + `\nprogramId:${address}\namount: ${amount}\nrecipient: ${recipient}\nvalue: ${value}\nisNativeToken: ${isNativeToken}` + + `\nfee: ${fee.value}\nmortality: ${mortality}\ntimestamp: ${timestamp}\nsignature: ${signature}`, ); - sendMessage({ payload, value, onSuccess }); + const { TransitVaraToEth } = sails.services.VaraBridge.functions; + const transaction = TransitVaraToEth(fee.value, mortality, timestamp, signature, recipient, amount); + + return sendMessage(transaction, value, { onSuccess }); }; const isSubmitting = isPending; diff --git a/frontend/src/features/swap/hooks/vara/use-metadata.ts b/frontend/src/features/swap/hooks/vara/use-metadata.ts deleted file mode 100644 index ed80dafe..00000000 --- a/frontend/src/features/swap/hooks/vara/use-metadata.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { ProgramMetadata } from '@gear-js/api'; -import { useQuery } from '@tanstack/react-query'; - -function useMetadata(url: string | undefined) { - const getMetadata = async () => { - if (!url) throw new Error('Metadata URL is not found'); - - const response = await fetch(url); - const text = await response.text(); - - return ProgramMetadata.from(`0x${text}`); - }; - - const { data } = useQuery({ - queryKey: ['metadata', url], - queryFn: getMetadata, - enabled: Boolean(url), - }); - - return data; -} - -export { useMetadata }; diff --git a/frontend/src/features/swap/hooks/vara/use-read-state.ts b/frontend/src/features/swap/hooks/vara/use-read-state.ts index 027bbb19..029d669a 100644 --- a/frontend/src/features/swap/hooks/vara/use-read-state.ts +++ b/frontend/src/features/swap/hooks/vara/use-read-state.ts @@ -1,19 +1,24 @@ -import { HexString, ProgramMetadata } from '@gear-js/api'; -import { useApi } from '@gear-js/react-hooks'; -import { AnyJson } from '@polkadot/types/types'; +import { Sails } from 'sails-js'; +import { HexString } from '@gear-js/api'; +import { useAccount } from '@gear-js/react-hooks'; import { useQuery } from '@tanstack/react-query'; import { isUndefined } from '@/utils'; -function useReadState(programId: HexString | undefined, metadata: ProgramMetadata | undefined, payload: AnyJson) { - const { api, isApiReady } = useApi(); +function useReadState(programId: HexString | undefined, sails: Sails | undefined, queryName: string) { + const { account } = useAccount(); - const isEnabled = isApiReady && programId && metadata && !isUndefined(payload); + const isEnabled = programId && account && sails && !isUndefined(queryName); return useQuery({ - queryKey: ['readState', isApiReady, programId, metadata, payload], - queryFn: async () => - isEnabled ? ((await api.programState.read({ programId, payload }, metadata)).toHuman() as T) : null, + queryKey: ['readState', isEnabled, programId, queryName], + queryFn: async () => { + if (!isEnabled) { + return null; + } + sails.setProgramId(programId); + return (await sails.services.VaraBridge.queries.Config(account.decodedAddress)) as T; + }, enabled: isEnabled, }); } diff --git a/frontend/src/features/swap/hooks/vara/use-sails.ts b/frontend/src/features/swap/hooks/vara/use-sails.ts new file mode 100644 index 00000000..fb983788 --- /dev/null +++ b/frontend/src/features/swap/hooks/vara/use-sails.ts @@ -0,0 +1,30 @@ +import { Sails } from 'sails-js'; +import { useQuery } from '@tanstack/react-query'; +import { useApi } from '@gear-js/react-hooks'; + +function useSails(url: string | undefined) { + const { api } = useApi(); + + const getSails = async () => { + if (!url) throw new Error('IDL URL is not found'); + if (!api) throw new Error('Api is not initialized'); + + const response = await fetch(url); + const idl = await response.text(); + const sails = await Sails.new(); + sails.parseIdl(idl); + sails.setApi(api); + + return sails; + }; + + const { data } = useQuery({ + queryKey: ['sails', url], + queryFn: getSails, + enabled: Boolean(url && api), + }); + + return data; +} + +export { useSails }; diff --git a/frontend/src/features/swap/hooks/vara/use-send-message.ts b/frontend/src/features/swap/hooks/vara/use-send-message.ts index c925f2e4..04d8acb1 100644 --- a/frontend/src/features/swap/hooks/vara/use-send-message.ts +++ b/frontend/src/features/swap/hooks/vara/use-send-message.ts @@ -1,27 +1,34 @@ -import { HexString, ProgramMetadata } from '@gear-js/api'; -import { - SendMessageWithGasOptions, - UseSendMessageWithGasOptions, - useSendMessageWithGas as useGearSendMessageWithGas, -} from '@gear-js/react-hooks'; +import { useAccount } from '@gear-js/react-hooks'; +import { TransactionBuilder } from 'sails-js'; import { useLoading } from '@/hooks'; +import { isUndefined } from '@/utils'; -function useSendMessage( - programId: HexString, - metadata: ProgramMetadata | undefined, - options?: UseSendMessageWithGasOptions, -) { - const sendMessage = useGearSendMessageWithGas(programId, metadata, options); +import { Options, useSignAndSend } from './use-sign-and-send'; +function useSendMessage(gasLimit?: bigint) { + const { account } = useAccount(); const [isLoading, enableLoading, disableLoading] = useLoading(); + const signAndSend = useSignAndSend(); return { - sendMessage: (args: SendMessageWithGasOptions) => { + sendMessage: async (transaction: TransactionBuilder, value: bigint, args: Partial) => { + if (isUndefined(account)) throw new Error('Account is not defined'); enableLoading(); - const onSuccess = (messageId: HexString) => { - args.onSuccess?.(messageId); + const { signer } = account; + transaction.withAccount(account.address, { signer }); + await transaction.withValue(value); + + if (gasLimit) { + await transaction.withGas(gasLimit); + } else { + await transaction.calculateGas(); + } + const { extrinsic } = transaction; + + const onSuccess = () => { + args.onSuccess?.(); disableLoading(); }; @@ -30,7 +37,11 @@ function useSendMessage( disableLoading(); }; - sendMessage({ ...args, onSuccess, onError }); + const onFinally = () => { + disableLoading(); + }; + + signAndSend(extrinsic, { ...args, onSuccess, onError, onFinally }); }, isPending: isLoading, diff --git a/frontend/src/features/swap/hooks/vara/use-sign-and-send.tsx b/frontend/src/features/swap/hooks/vara/use-sign-and-send.tsx new file mode 100644 index 00000000..c740323f --- /dev/null +++ b/frontend/src/features/swap/hooks/vara/use-sign-and-send.tsx @@ -0,0 +1,110 @@ +import { + DEFAULT_ERROR_OPTIONS, + DEFAULT_SUCCESS_OPTIONS, + DefaultTemplateOptions, + useAccount, + useAlert, +} from '@gear-js/react-hooks'; +import { SubmittableExtrinsic } from '@polkadot/api/types'; +import { Event } from '@polkadot/types/interfaces'; +import { ISubmittableResult } from '@polkadot/types/types'; +import { ReactNode } from 'react'; + +import { useExtrinsicFailedMessage } from './use-extrinsic-failed-message'; + +type Extrinsic = SubmittableExtrinsic<'promise', ISubmittableResult>; + +type Options = { + successAlert: ReactNode; + onSuccess: () => void; + onError: () => void; + onFinally: () => void; + onFinalized: (value: ISubmittableResult) => void; +}; + +const DEFAULT_OPTIONS = { + successAlert: 'Success', + onSuccess: () => {}, + onError: () => {}, + onFinally: () => {}, + onFinalized: () => {}, +} as const; + +function useSignAndSend() { + const { account } = useAccount(); + const alert = useAlert(); + const getExtrinsicFailedMessage = useExtrinsicFailedMessage(); + + const handleEvent = (event: Event, method: string, options: Options) => { + const { successAlert, onSuccess, onError, onFinally } = options; + const alertOptions = { title: `${event.section}.${event.method}` }; + + if (event.method === 'ExtrinsicFailed') { + const message = getExtrinsicFailedMessage(event); + alert.error(message, alertOptions); + + onError(); + onFinally(); + return; + } + + if (event.method === method) { + alert.success(successAlert, alertOptions); + + onSuccess(); + onFinally(); + } + }; + + const handleStatus = (result: ISubmittableResult, method: string, options: Options, alertId: string) => { + const { events, status } = result; + const { isInvalid, isReady, isInBlock, isFinalized } = status; + const { onError, onFinally, onFinalized } = options; + + if (isInvalid) { + alert.update(alertId, 'Transaction error. Status: isInvalid', DEFAULT_ERROR_OPTIONS as DefaultTemplateOptions); + + onError(); + onFinally(); + return; + } + + if (isReady) return alert.update(alertId, 'Ready'); + if (isInBlock) return alert.update(alertId, 'InBlock'); + + if (isFinalized) { + alert.update(alertId, 'Finalized', DEFAULT_SUCCESS_OPTIONS as DefaultTemplateOptions); + + onFinalized(result); + + events.forEach(({ event }) => handleEvent(event, method, options)); + } + }; + + const signAndSend = (extrinsic: Extrinsic, options?: Partial) => { + if (!account) throw new Error('Account is not found'); + const { address, signer } = account; + + const optionsWithDefaults = { ...DEFAULT_OPTIONS, ...options }; + const { onError, onFinally } = optionsWithDefaults; + + const alertTitle = `${extrinsic.method.section}.${extrinsic.method.method}`; + const alertId = alert.loading(`SignIn`, { title: alertTitle }); + + extrinsic + .signAndSend(address, { signer }, (result) => handleStatus(result, 'MessageQueued', optionsWithDefaults, alertId)) + .catch((error: unknown) => { + const message = error instanceof Error ? error.message : String(error); + alert.update(alertId, message, DEFAULT_ERROR_OPTIONS as DefaultTemplateOptions); + + onError(); + onFinally(); + }); + }; + + return signAndSend; +} + +export { useSignAndSend }; + +export type { Options }; diff --git a/frontend/src/features/swap/hooks/vara/use-vara-account-balance.ts b/frontend/src/features/swap/hooks/vara/use-vara-account-balance.ts index 98481858..5d2fe307 100644 --- a/frontend/src/features/swap/hooks/vara/use-vara-account-balance.ts +++ b/frontend/src/features/swap/hooks/vara/use-vara-account-balance.ts @@ -11,7 +11,7 @@ function useVaraAccountBalance(isEnabled: boolean) { const { freeBalance } = data || {}; const value = freeBalance?.toBigInt(); - const formattedValue = value ? getFormattedBalance(value).value : undefined; + const formattedValue = value !== undefined ? getFormattedBalance(value).value : undefined; // cuz swap vara form is rendered by default without login and we have to handle empty balance state const isLoading = useMemo(() => { diff --git a/frontend/src/features/swap/hooks/vara/use-vara-config.ts b/frontend/src/features/swap/hooks/vara/use-vara-config.ts index c12e8409..988ec417 100644 --- a/frontend/src/features/swap/hooks/vara/use-vara-config.ts +++ b/frontend/src/features/swap/hooks/vara/use-vara-config.ts @@ -1,26 +1,17 @@ -import { useBalanceFormat, withoutCommas } from '@gear-js/react-hooks'; - -import { isUndefined } from '@/utils'; - import { STATE_FUNCTION } from '../../consts'; import { ConfigState, Contract } from '../../types'; import { useReadState } from './use-read-state'; -function useVaraConfig({ address, metadata }: Contract) { - const { getFormattedBalance } = useBalanceFormat(); - - const { data, isPending } = useReadState(address, metadata, STATE_FUNCTION.CONFIG); +function useVaraConfig({ address, sails }: Contract) { + const { data: config, isPending } = useReadState(address, sails, STATE_FUNCTION.CONFIG); - const config = data?.Config; - const fee = config ? BigInt(withoutCommas(config.fee)) : undefined; - const minValue = config ? BigInt(withoutCommas(config.minAmount)) : undefined; - const ftAddress = config?.ftTokenId; + const minValue = config ? BigInt(config.min_amount) : undefined; + const ftAddress = BigInt(config?.ft_token_id || 0) === 0n ? undefined : config?.ft_token_id; - const formattedFee = !isUndefined(fee) ? getFormattedBalance(fee).value : undefined; const isLoading = isPending; - return { fee: { value: fee, formattedValue: formattedFee }, minValue, ftAddress, isLoading }; + return { minValue, ftAddress, isLoading }; } export { useVaraConfig }; diff --git a/frontend/src/features/swap/types/hooks.ts b/frontend/src/features/swap/types/hooks.ts index b3dda45d..79d9ea47 100644 --- a/frontend/src/features/swap/types/hooks.ts +++ b/frontend/src/features/swap/types/hooks.ts @@ -9,12 +9,27 @@ type BalanceValues = { }; type Config = { - fee: BalanceValues; minValue: bigint | undefined; ftAddress: HexString | undefined; isLoading: boolean; }; +type FeeCalculatorResponse = { + fee: string; + mortality: number; + timestamp: number; + bytes: string; + signature: HexString; +}; + +type FeeCalculator = { + fee: { value: bigint; formattedValue: string }; + mortality: number; + timestamp: number; + bytes: string; + signature: HexString; +}; + type UseBalance = (config: Config) => BalanceValues & { decimals: number | undefined; isLoading: boolean; @@ -25,9 +40,10 @@ type UseConfig = (contract: Contract) => Config; type UseHandleSubmit = ( contract: Contract, config: Config, + feeCalculator?: FeeCalculator, ) => { onSubmit: (values: FormattedValues, reset: () => void) => void; isSubmitting: boolean; }; -export type { Config, UseBalance, UseConfig, UseHandleSubmit }; +export type { Config, UseBalance, UseConfig, UseHandleSubmit, FeeCalculatorResponse, FeeCalculator }; diff --git a/frontend/src/features/swap/types/index.ts b/frontend/src/features/swap/types/index.ts index 9efe7ccb..22c16753 100644 --- a/frontend/src/features/swap/types/index.ts +++ b/frontend/src/features/swap/types/index.ts @@ -1,5 +1,5 @@ import { Values, FormattedValues } from './form'; -import { Config, UseBalance, UseConfig, UseHandleSubmit } from './hooks'; +import { Config, UseBalance, UseConfig, UseHandleSubmit, FeeCalculator, FeeCalculatorResponse } from './hooks'; import { NetworkName, TokenType, Bridge, Contract } from './spec'; import { ConfigState } from './vara'; @@ -10,6 +10,8 @@ export type { Bridge, Contract, Config, + FeeCalculator, + FeeCalculatorResponse, UseBalance, UseConfig, UseHandleSubmit, diff --git a/frontend/src/features/swap/types/spec.ts b/frontend/src/features/swap/types/spec.ts index 1a739e2b..91c1c770 100644 --- a/frontend/src/features/swap/types/spec.ts +++ b/frontend/src/features/swap/types/spec.ts @@ -1,4 +1,5 @@ -import { HexString, ProgramMetadata } from '@gear-js/api'; +import { Sails } from 'sails-js'; +import { HexString } from '@gear-js/api'; import { NETWORK_NAME } from '@/consts'; @@ -17,7 +18,7 @@ type Bridge = { type Contract = { address: HexString; - metadata?: ProgramMetadata | undefined; + sails?: Sails | undefined; }; export type { NetworkName, TokenType, Bridge, Contract }; diff --git a/frontend/src/features/swap/types/vara.ts b/frontend/src/features/swap/types/vara.ts index 5f522cf9..c83b4dc7 100644 --- a/frontend/src/features/swap/types/vara.ts +++ b/frontend/src/features/swap/types/vara.ts @@ -1,13 +1,10 @@ import { HexString } from '@gear-js/api'; type ConfigState = { - Config: { - minAmount: string; - minValidatorsRequired: string; - gasForMigration: string; - fee: string; - ftTokenId?: HexString; - }; + min_amount: number; + min_validators_required: 3; + gas_for_migration: number; + ft_token_id?: HexString; }; export type { ConfigState }; diff --git a/frontend/src/features/swap/utils.ts b/frontend/src/features/swap/utils.ts index 46c5ac93..bdde4fa4 100644 --- a/frontend/src/features/swap/utils.ts +++ b/frontend/src/features/swap/utils.ts @@ -7,6 +7,7 @@ import { Pair } from '@/types'; import { isUndefined } from '@/utils'; import { ERROR_MESSAGE } from './consts'; +import { NetworkName } from './types'; const getAmountSchema = ( balanceValue: bigint | undefined, @@ -40,4 +41,9 @@ const getOptions = () => { return { varaOptions, ethOptions }; }; -export { getAmountSchema, getOptions }; +const getNormalizedTime = (networkName: NetworkName, time?: number) => { + const toMilisecondsMultiplier = networkName === NETWORK_NAME.VARA ? 1 : 1000; + return isUndefined(time) ? undefined : time * toMilisecondsMultiplier; +}; + +export { getAmountSchema, getOptions, getNormalizedTime }; diff --git a/frontend/src/features/wallet/components/wallet-modal/wallet-modal.tsx b/frontend/src/features/wallet/components/wallet-modal/wallet-modal.tsx index 78706890..2313d1b0 100644 --- a/frontend/src/features/wallet/components/wallet-modal/wallet-modal.tsx +++ b/frontend/src/features/wallet/components/wallet-modal/wallet-modal.tsx @@ -100,7 +100,7 @@ function WalletModal({ close }: Props) {

    A compatible wallet wasn't found or is disabled.

    Please, install it following the{' '} - + instructions . From 3ff9b53154a4a65f87f81a9e87c4ca69a64a5437 Mon Sep 17 00:00:00 2001 From: Nikita Yutanov Date: Mon, 26 Aug 2024 18:55:42 +0300 Subject: [PATCH 06/38] Update balance and config hooks --- .../swap/components/swap-form/swap-form.tsx | 43 +- frontend/src/features/swap/consts/index.ts | 4 + .../swap/consts/sails/bridging-payment.ts | 373 ++++++++++++++ .../swap/consts/sails/extended_vft.ts | 484 ++++++++++++++++++ .../src/features/swap/consts/sails/index.ts | 5 + .../features/swap/consts/sails/vft-gateway.ts | 384 ++++++++++++++ .../swap/hooks/eth/use-eth-balance.ts | 4 +- .../features/swap/hooks/eth/use-eth-config.ts | 26 +- .../swap/hooks/eth/use-handle-eth-submit.ts | 20 +- frontend/src/features/swap/hooks/index.ts | 2 - .../features/swap/hooks/use-fee-calculator.ts | 54 -- .../hooks/vara/use-fungible-token-balance.ts | 60 +-- .../swap/hooks/vara/use-handle-vara-submit.ts | 15 +- .../swap/hooks/vara/use-vara-balance.ts | 4 +- .../swap/hooks/vara/use-vara-config.ts | 32 +- frontend/src/features/swap/types/hooks.ts | 31 +- frontend/src/features/swap/types/index.ts | 4 +- frontend/src/features/swap/types/spec.ts | 2 +- frontend/src/features/swap/utils.ts | 8 +- 19 files changed, 1355 insertions(+), 200 deletions(-) create mode 100644 frontend/src/features/swap/consts/sails/bridging-payment.ts create mode 100644 frontend/src/features/swap/consts/sails/extended_vft.ts create mode 100644 frontend/src/features/swap/consts/sails/index.ts create mode 100644 frontend/src/features/swap/consts/sails/vft-gateway.ts delete mode 100644 frontend/src/features/swap/hooks/use-fee-calculator.ts diff --git a/frontend/src/features/swap/components/swap-form/swap-form.tsx b/frontend/src/features/swap/components/swap-form/swap-form.tsx index 6d2c6e8e..4cbc7f8d 100644 --- a/frontend/src/features/swap/components/swap-form/swap-form.tsx +++ b/frontend/src/features/swap/components/swap-form/swap-form.tsx @@ -1,4 +1,3 @@ -import { useAlert } from '@gear-js/react-hooks'; import { Button } from '@gear-js/vara-ui'; import { FormProvider } from 'react-hook-form'; @@ -7,11 +6,9 @@ import { NETWORK_NAME } from '@/consts'; import GasSVG from '../../assets/gas.svg?react'; import { FIELD_NAME } from '../../consts'; -import { useSwapForm, useBridge, useFeeCalculator } from '../../hooks'; +import { useSwapForm, useBridge } from '../../hooks'; import { NetworkName, UseBalance, UseConfig, UseHandleSubmit } from '../../types'; -import { getNormalizedTime } from '../../utils'; import { Balance } from '../balance'; -import { FeeLoader } from '../fee-loader'; import { Network } from '../network'; import styles from './swap-form.module.scss'; @@ -28,28 +25,23 @@ type Props = { function SwapForm({ networkName, disabled, useHandleSubmit, useBalance, useConfig, renderSwapNetworkButton }: Props) { // TODO: isVaraNetwork and isNativeToken can be use explicitly in some of the hooks const isVaraNetwork = networkName === NETWORK_NAME.VARA; - const alert = useAlert(); - - const { feeCalculatorData, isFeeLoading, refetch, error } = useFeeCalculator({ networkName }); - const { fee, mortality, timestamp } = feeCalculatorData || {}; const FromNetwork = isVaraNetwork ? Network.Vara : Network.Eth; const ToNetwork = isVaraNetwork ? Network.Eth : Network.Vara; const { contract, options, symbol, pair } = useBridge(networkName); - const config = useConfig(contract); - const { minValue } = config; + const config = useConfig(contract?.address); - const balance = useBalance(config); + const balance = useBalance('0x00', false); - const { onSubmit, isSubmitting } = useHandleSubmit(contract, config, feeCalculatorData); + const { onSubmit, isSubmitting } = useHandleSubmit(contract, '0x00'); const { form, onValueChange, onExpectedValueChange, handleSubmit, setMaxBalance } = useSwapForm( isVaraNetwork, balance, BigInt(0), - minValue, + BigInt(0), disabled, onSubmit, ); @@ -63,12 +55,6 @@ function SwapForm({ networkName, disabled, useHandleSubmit, useBalance, useConfi /> ); - const onTimeEnd = () => { - refetch().catch(() => { - alert.error('Unable to fetch fee data'); - }); - }; - return (

    @@ -98,26 +84,13 @@ function SwapForm({ networkName, disabled, useHandleSubmit, useBalance, useConfi
    -
    - - -
    +
    diff --git a/frontend/src/features/swap/consts/index.ts b/frontend/src/features/swap/consts/index.ts index cf5ac47c..7b5c3351 100644 --- a/frontend/src/features/swap/consts/index.ts +++ b/frontend/src/features/swap/consts/index.ts @@ -1,6 +1,7 @@ import { ABI, FUNGIBLE_TOKEN_ABI } from './abi'; import { FUNCTION_NAME, EVENT_NAME } from './eth'; import { FIELD_NAME, DEFAULT_VALUES, ADDRESS_SCHEMA, ERROR_MESSAGE } from './form'; +import { BridgingPaymentProgram, VftGatewayProgram, VftProgram } from './sails'; import { TOKEN_TYPE, IDL_URL } from './spec'; import { STATE_FUNCTION } from './vara'; @@ -19,4 +20,7 @@ export { STATE_FUNCTION, TOKEN_TYPE, IDL_URL, + BridgingPaymentProgram, + VftGatewayProgram, + VftProgram, }; diff --git a/frontend/src/features/swap/consts/sails/bridging-payment.ts b/frontend/src/features/swap/consts/sails/bridging-payment.ts new file mode 100644 index 00000000..a48f2ce8 --- /dev/null +++ b/frontend/src/features/swap/consts/sails/bridging-payment.ts @@ -0,0 +1,373 @@ +/* eslint-disable @typescript-eslint/no-floating-promises */ +/* eslint-disable @typescript-eslint/no-explicit-any */ + +import { GearApi, decodeAddress } from '@gear-js/api'; +import { TypeRegistry } from '@polkadot/types'; +import { + ActorId, + H160, + TransactionBuilder, + MessageId, + getServiceNamePrefix, + getFnNamePrefix, + ZERO_ADDRESS, +} from 'sails-js'; + +export interface InitConfig { + admin_address: ActorId; + vft_gateway_address: ActorId; + config: Config; +} + +export interface Config { + fee: number | string | bigint; + gas_for_reply_deposit: number | string | bigint; + gas_to_send_request_to_gateway: number | string | bigint; + gas_to_transfer_tokens: number | string | bigint; + reply_timeout: number; + gas_for_request_to_gateway_msg: number | string | bigint; +} + +export interface MessageInfo { + status: MessageStatus; + details: TransactionDetails; +} + +export type MessageStatus = + | { sendingMessageToTransferTokens: null } + | { tokenTransferCompleted: boolean } + | { waitingReplyFromTokenTransfer: null } + | { sendingMessageToGateway: null } + | { gatewayMessageProcessingCompleted: [number | string | bigint, H160] } + | { waitingReplyFromGateway: null } + | { messageToGatewayStep: null } + | { returnTokensBackStep: null } + | { sendingMessageToTransferTokensBack: null } + | { waitingReplyFromTokenTransferBack: null } + | { tokenTransferBackCompleted: null } + | { messageProcessedWithSuccess: [number | string | bigint, H160] }; + +export type TransactionDetails = + | { transfer: { sender: ActorId; receiver: ActorId; amount: number | string | bigint; token_id: ActorId } } + | { + sendMessageToGateway: { + sender: ActorId; + vara_token_id: ActorId; + amount: number | string | bigint; + receiver: H160; + attached_value: number | string | bigint; + }; + }; + +export class Program { + public readonly registry: TypeRegistry; + public readonly bridgingPayment: BridgingPayment; + + constructor(public api: GearApi, public programId?: `0x${string}`) { + const types: Record = { + InitConfig: { admin_address: '[u8;32]', vft_gateway_address: '[u8;32]', config: 'Config' }, + Config: { + fee: 'u128', + gas_for_reply_deposit: 'u64', + gas_to_send_request_to_gateway: 'u64', + gas_to_transfer_tokens: 'u64', + reply_timeout: 'u32', + gas_for_request_to_gateway_msg: 'u64', + }, + MessageInfo: { status: 'MessageStatus', details: 'TransactionDetails' }, + MessageStatus: { + _enum: { + SendingMessageToTransferTokens: 'Null', + TokenTransferCompleted: 'bool', + WaitingReplyFromTokenTransfer: 'Null', + SendingMessageToGateway: 'Null', + GatewayMessageProcessingCompleted: '(U256, H160)', + WaitingReplyFromGateway: 'Null', + MessageToGatewayStep: 'Null', + ReturnTokensBackStep: 'Null', + SendingMessageToTransferTokensBack: 'Null', + WaitingReplyFromTokenTransferBack: 'Null', + TokenTransferBackCompleted: 'Null', + MessageProcessedWithSuccess: '(U256, H160)', + }, + }, + TransactionDetails: { + _enum: { + Transfer: { sender: '[u8;32]', receiver: '[u8;32]', amount: 'U256', token_id: '[u8;32]' }, + SendMessageToGateway: { + sender: '[u8;32]', + vara_token_id: '[u8;32]', + amount: 'U256', + receiver: 'H160', + attached_value: 'u128', + }, + }, + }, + }; + + this.registry = new TypeRegistry(); + this.registry.setKnownTypes({ types }); + this.registry.register(types); + + this.bridgingPayment = new BridgingPayment(this); + } + + newCtorFromCode(code: Uint8Array | Buffer, init_config: InitConfig): TransactionBuilder { + const builder = new TransactionBuilder( + this.api, + this.registry, + 'upload_program', + ['New', init_config], + '(String, InitConfig)', + 'String', + code, + ); + + this.programId = builder.programId; + return builder; + } + + newCtorFromCodeId(codeId: `0x${string}`, init_config: InitConfig) { + const builder = new TransactionBuilder( + this.api, + this.registry, + 'create_program', + ['New', init_config], + '(String, InitConfig)', + 'String', + codeId, + ); + + this.programId = builder.programId; + return builder; + } +} + +export class BridgingPayment { + constructor(private _program: Program) {} + + public continueTransaction(msg_id: MessageId): TransactionBuilder { + if (!this._program.programId) throw new Error('Program ID is not set'); + return new TransactionBuilder( + this._program.api, + this._program.registry, + 'send_message', + ['BridgingPayment', 'ContinueTransaction', msg_id], + '(String, String, [u8;32])', + 'Null', + this._program.programId, + ); + } + + public reclaimFee(): TransactionBuilder { + if (!this._program.programId) throw new Error('Program ID is not set'); + return new TransactionBuilder( + this._program.api, + this._program.registry, + 'send_message', + ['BridgingPayment', 'ReclaimFee'], + '(String, String)', + 'Null', + this._program.programId, + ); + } + + public requestToGateway( + amount: number | string | bigint, + receiver: H160, + vara_token_id: ActorId, + ): TransactionBuilder { + if (!this._program.programId) throw new Error('Program ID is not set'); + return new TransactionBuilder( + this._program.api, + this._program.registry, + 'send_message', + ['BridgingPayment', 'RequestToGateway', amount, receiver, vara_token_id], + '(String, String, U256, H160, [u8;32])', + 'Null', + this._program.programId, + ); + } + + public returnTokens(msg_id: MessageId): TransactionBuilder { + if (!this._program.programId) throw new Error('Program ID is not set'); + return new TransactionBuilder( + this._program.api, + this._program.registry, + 'send_message', + ['BridgingPayment', 'ReturnTokens', msg_id], + '(String, String, [u8;32])', + 'Null', + this._program.programId, + ); + } + + public setFee(fee: number | string | bigint): TransactionBuilder { + if (!this._program.programId) throw new Error('Program ID is not set'); + return new TransactionBuilder( + this._program.api, + this._program.registry, + 'send_message', + ['BridgingPayment', 'SetFee', fee], + '(String, String, u128)', + 'Null', + this._program.programId, + ); + } + + public updateConfig( + fee: number | string | bigint | null, + gas_for_reply_deposit: number | string | bigint | null, + gas_to_send_request_to_gateway: number | string | bigint | null, + gas_to_transfer_tokens: number | string | bigint | null, + reply_timeout: number | null, + gas_for_request_to_gateway_msg: number | string | bigint | null, + ): TransactionBuilder { + if (!this._program.programId) throw new Error('Program ID is not set'); + return new TransactionBuilder( + this._program.api, + this._program.registry, + 'send_message', + [ + 'BridgingPayment', + 'UpdateConfig', + fee, + gas_for_reply_deposit, + gas_to_send_request_to_gateway, + gas_to_transfer_tokens, + reply_timeout, + gas_for_request_to_gateway_msg, + ], + '(String, String, Option, Option, Option, Option, Option, Option)', + 'Null', + this._program.programId, + ); + } + + public updateVftGatewayAddress(new_vft_gateway_address: ActorId): TransactionBuilder { + if (!this._program.programId) throw new Error('Program ID is not set'); + return new TransactionBuilder( + this._program.api, + this._program.registry, + 'send_message', + ['BridgingPayment', 'UpdateVftGatewayAddress', new_vft_gateway_address], + '(String, String, [u8;32])', + 'Null', + this._program.programId, + ); + } + + public async adminAddress( + originAddress?: string, + value?: number | string | bigint, + atBlock?: `0x${string}`, + ): Promise { + const payload = this._program.registry.createType('(String, String)', ['BridgingPayment', 'AdminAddress']).toHex(); + const reply = await this._program.api.message.calculateReply({ + destination: this._program.programId!, + origin: originAddress ? decodeAddress(originAddress) : ZERO_ADDRESS, + payload, + value: value || 0, + gasLimit: this._program.api.blockGasLimit.toBigInt(), + at: atBlock, + }); + if (!reply.code.isSuccess) throw new Error(this._program.registry.createType('String', reply.payload).toString()); + const result = this._program.registry.createType('(String, String, [u8;32])', reply.payload); + return result[2].toJSON() as unknown as ActorId; + } + + public async getConfig( + originAddress?: string, + value?: number | string | bigint, + atBlock?: `0x${string}`, + ): Promise { + const payload = this._program.registry.createType('(String, String)', ['BridgingPayment', 'GetConfig']).toHex(); + const reply = await this._program.api.message.calculateReply({ + destination: this._program.programId!, + origin: originAddress ? decodeAddress(originAddress) : ZERO_ADDRESS, + payload, + value: value || 0, + gasLimit: this._program.api.blockGasLimit.toBigInt(), + at: atBlock, + }); + if (!reply.code.isSuccess) throw new Error(this._program.registry.createType('String', reply.payload).toString()); + const result = this._program.registry.createType('(String, String, Config)', reply.payload); + return result[2].toJSON() as unknown as Config; + } + + public async msgTrackerState( + originAddress?: string, + value?: number | string | bigint, + atBlock?: `0x${string}`, + ): Promise> { + const payload = this._program.registry + .createType('(String, String)', ['BridgingPayment', 'MsgTrackerState']) + .toHex(); + const reply = await this._program.api.message.calculateReply({ + destination: this._program.programId!, + origin: originAddress ? decodeAddress(originAddress) : ZERO_ADDRESS, + payload, + value: value || 0, + gasLimit: this._program.api.blockGasLimit.toBigInt(), + at: atBlock, + }); + if (!reply.code.isSuccess) throw new Error(this._program.registry.createType('String', reply.payload).toString()); + const result = this._program.registry.createType('(String, String, Vec<([u8;32], MessageInfo)>)', reply.payload); + return result[2].toJSON() as unknown as Array<[MessageId, MessageInfo]>; + } + + public async vftGatewayAddress( + originAddress?: string, + value?: number | string | bigint, + atBlock?: `0x${string}`, + ): Promise { + const payload = this._program.registry + .createType('(String, String)', ['BridgingPayment', 'VftGatewayAddress']) + .toHex(); + const reply = await this._program.api.message.calculateReply({ + destination: this._program.programId!, + origin: originAddress ? decodeAddress(originAddress) : ZERO_ADDRESS, + payload, + value: value || 0, + gasLimit: this._program.api.blockGasLimit.toBigInt(), + at: atBlock, + }); + if (!reply.code.isSuccess) throw new Error(this._program.registry.createType('String', reply.payload).toString()); + const result = this._program.registry.createType('(String, String, [u8;32])', reply.payload); + return result[2].toJSON() as unknown as ActorId; + } + + public subscribeToTeleportVaraToEthEvent( + callback: (data: { + nonce: number | string | bigint; + sender: ActorId; + amount: number | string | bigint; + receiver: H160; + eth_token_id: H160; + }) => void | Promise, + ): Promise<() => void> { + return this._program.api.gearEvents.subscribeToGearEvent('UserMessageSent', ({ data: { message } }) => { + if (!message.source.eq(this._program.programId) || !message.destination.eq(ZERO_ADDRESS)) { + return; + } + + const payload = message.payload.toHex(); + if (getServiceNamePrefix(payload) === 'BridgingPayment' && getFnNamePrefix(payload) === 'TeleportVaraToEth') { + callback( + this._program.registry + .createType( + '(String, String, {"nonce":"U256","sender":"[u8;32]","amount":"U256","receiver":"H160","eth_token_id":"H160"})', + message.payload, + )[2] + .toJSON() as unknown as { + nonce: number | string | bigint; + sender: ActorId; + amount: number | string | bigint; + receiver: H160; + eth_token_id: H160; + }, + ); + } + }); + } +} diff --git a/frontend/src/features/swap/consts/sails/extended_vft.ts b/frontend/src/features/swap/consts/sails/extended_vft.ts new file mode 100644 index 00000000..4ef93056 --- /dev/null +++ b/frontend/src/features/swap/consts/sails/extended_vft.ts @@ -0,0 +1,484 @@ +/* eslint-disable @typescript-eslint/no-floating-promises */ +/* eslint-disable @typescript-eslint/no-explicit-any */ + +import { GearApi, decodeAddress } from '@gear-js/api'; +import { TypeRegistry } from '@polkadot/types'; +import { TransactionBuilder, ActorId, getServiceNamePrefix, getFnNamePrefix, ZERO_ADDRESS } from 'sails-js'; + +export class Program { + public readonly registry: TypeRegistry; + public readonly vft: Vft; + + constructor(public api: GearApi, public programId?: `0x${string}`) { + const types: Record = {}; + + this.registry = new TypeRegistry(); + this.registry.setKnownTypes({ types }); + this.registry.register(types); + + this.vft = new Vft(this); + } + + newCtorFromCode(code: Uint8Array | Buffer, name: string, symbol: string, decimals: number): TransactionBuilder { + const builder = new TransactionBuilder( + this.api, + this.registry, + 'upload_program', + ['New', name, symbol, decimals], + '(String, String, String, u8)', + 'String', + code, + ); + + this.programId = builder.programId; + return builder; + } + + newCtorFromCodeId(codeId: `0x${string}`, name: string, symbol: string, decimals: number) { + const builder = new TransactionBuilder( + this.api, + this.registry, + 'create_program', + ['New', name, symbol, decimals], + '(String, String, String, u8)', + 'String', + codeId, + ); + + this.programId = builder.programId; + return builder; + } +} + +export class Vft { + constructor(private _program: Program) {} + + public burn(from: ActorId, value: number | string | bigint): TransactionBuilder { + if (!this._program.programId) throw new Error('Program ID is not set'); + return new TransactionBuilder( + this._program.api, + this._program.registry, + 'send_message', + ['Vft', 'Burn', from, value], + '(String, String, [u8;32], U256)', + 'bool', + this._program.programId, + ); + } + + public expandBalanceCapacity(additional_capacity: number): TransactionBuilder { + if (!this._program.programId) throw new Error('Program ID is not set'); + return new TransactionBuilder( + this._program.api, + this._program.registry, + 'send_message', + ['Vft', 'ExpandBalanceCapacity', additional_capacity], + '(String, String, u32)', + 'Null', + this._program.programId, + ); + } + + public grantAdminRole(to: ActorId): TransactionBuilder { + if (!this._program.programId) throw new Error('Program ID is not set'); + return new TransactionBuilder( + this._program.api, + this._program.registry, + 'send_message', + ['Vft', 'GrantAdminRole', to], + '(String, String, [u8;32])', + 'Null', + this._program.programId, + ); + } + + public grantBurnerRole(to: ActorId): TransactionBuilder { + if (!this._program.programId) throw new Error('Program ID is not set'); + return new TransactionBuilder( + this._program.api, + this._program.registry, + 'send_message', + ['Vft', 'GrantBurnerRole', to], + '(String, String, [u8;32])', + 'Null', + this._program.programId, + ); + } + + public grantMinterRole(to: ActorId): TransactionBuilder { + if (!this._program.programId) throw new Error('Program ID is not set'); + return new TransactionBuilder( + this._program.api, + this._program.registry, + 'send_message', + ['Vft', 'GrantMinterRole', to], + '(String, String, [u8;32])', + 'Null', + this._program.programId, + ); + } + + public mint(to: ActorId, value: number | string | bigint): TransactionBuilder { + if (!this._program.programId) throw new Error('Program ID is not set'); + return new TransactionBuilder( + this._program.api, + this._program.registry, + 'send_message', + ['Vft', 'Mint', to, value], + '(String, String, [u8;32], U256)', + 'bool', + this._program.programId, + ); + } + + public revokeAdminRole(from: ActorId): TransactionBuilder { + if (!this._program.programId) throw new Error('Program ID is not set'); + return new TransactionBuilder( + this._program.api, + this._program.registry, + 'send_message', + ['Vft', 'RevokeAdminRole', from], + '(String, String, [u8;32])', + 'Null', + this._program.programId, + ); + } + + public revokeBurnerRole(from: ActorId): TransactionBuilder { + if (!this._program.programId) throw new Error('Program ID is not set'); + return new TransactionBuilder( + this._program.api, + this._program.registry, + 'send_message', + ['Vft', 'RevokeBurnerRole', from], + '(String, String, [u8;32])', + 'Null', + this._program.programId, + ); + } + + public revokeMinterRole(from: ActorId): TransactionBuilder { + if (!this._program.programId) throw new Error('Program ID is not set'); + return new TransactionBuilder( + this._program.api, + this._program.registry, + 'send_message', + ['Vft', 'RevokeMinterRole', from], + '(String, String, [u8;32])', + 'Null', + this._program.programId, + ); + } + + public approve(spender: ActorId, value: number | string | bigint): TransactionBuilder { + if (!this._program.programId) throw new Error('Program ID is not set'); + return new TransactionBuilder( + this._program.api, + this._program.registry, + 'send_message', + ['Vft', 'Approve', spender, value], + '(String, String, [u8;32], U256)', + 'bool', + this._program.programId, + ); + } + + public transfer(to: ActorId, value: number | string | bigint): TransactionBuilder { + if (!this._program.programId) throw new Error('Program ID is not set'); + return new TransactionBuilder( + this._program.api, + this._program.registry, + 'send_message', + ['Vft', 'Transfer', to, value], + '(String, String, [u8;32], U256)', + 'bool', + this._program.programId, + ); + } + + public transferFrom(from: ActorId, to: ActorId, value: number | string | bigint): TransactionBuilder { + if (!this._program.programId) throw new Error('Program ID is not set'); + return new TransactionBuilder( + this._program.api, + this._program.registry, + 'send_message', + ['Vft', 'TransferFrom', from, to, value], + '(String, String, [u8;32], [u8;32], U256)', + 'bool', + this._program.programId, + ); + } + + public async admins( + originAddress?: string, + value?: number | string | bigint, + atBlock?: `0x${string}`, + ): Promise> { + const payload = this._program.registry.createType('(String, String)', ['Vft', 'Admins']).toHex(); + const reply = await this._program.api.message.calculateReply({ + destination: this._program.programId!, + origin: originAddress ? decodeAddress(originAddress) : ZERO_ADDRESS, + payload, + value: value || 0, + gasLimit: this._program.api.blockGasLimit.toBigInt(), + at: atBlock, + }); + if (!reply.code.isSuccess) throw new Error(this._program.registry.createType('String', reply.payload).toString()); + const result = this._program.registry.createType('(String, String, Vec<[u8;32]>)', reply.payload); + return result[2].toJSON() as unknown as Array; + } + + public async amountOfUsers( + originAddress?: string, + value?: number | string | bigint, + atBlock?: `0x${string}`, + ): Promise { + const payload = this._program.registry.createType('(String, String)', ['Vft', 'AmountOfUsers']).toHex(); + const reply = await this._program.api.message.calculateReply({ + destination: this._program.programId!, + origin: originAddress ? decodeAddress(originAddress) : ZERO_ADDRESS, + payload, + value: value || 0, + gasLimit: this._program.api.blockGasLimit.toBigInt(), + at: atBlock, + }); + if (!reply.code.isSuccess) throw new Error(this._program.registry.createType('String', reply.payload).toString()); + const result = this._program.registry.createType('(String, String, u128)', reply.payload); + return result[2].toBigInt() as unknown as bigint; + } + + public async burners( + originAddress?: string, + value?: number | string | bigint, + atBlock?: `0x${string}`, + ): Promise> { + const payload = this._program.registry.createType('(String, String)', ['Vft', 'Burners']).toHex(); + const reply = await this._program.api.message.calculateReply({ + destination: this._program.programId!, + origin: originAddress ? decodeAddress(originAddress) : ZERO_ADDRESS, + payload, + value: value || 0, + gasLimit: this._program.api.blockGasLimit.toBigInt(), + at: atBlock, + }); + if (!reply.code.isSuccess) throw new Error(this._program.registry.createType('String', reply.payload).toString()); + const result = this._program.registry.createType('(String, String, Vec<[u8;32]>)', reply.payload); + return result[2].toJSON() as unknown as Array; + } + + public async minters( + originAddress?: string, + value?: number | string | bigint, + atBlock?: `0x${string}`, + ): Promise> { + const payload = this._program.registry.createType('(String, String)', ['Vft', 'Minters']).toHex(); + const reply = await this._program.api.message.calculateReply({ + destination: this._program.programId!, + origin: originAddress ? decodeAddress(originAddress) : ZERO_ADDRESS, + payload, + value: value || 0, + gasLimit: this._program.api.blockGasLimit.toBigInt(), + at: atBlock, + }); + if (!reply.code.isSuccess) throw new Error(this._program.registry.createType('String', reply.payload).toString()); + const result = this._program.registry.createType('(String, String, Vec<[u8;32]>)', reply.payload); + return result[2].toJSON() as unknown as Array; + } + + public async allowance( + owner: ActorId, + spender: ActorId, + originAddress?: string, + value?: number | string | bigint, + atBlock?: `0x${string}`, + ): Promise { + const payload = this._program.registry + .createType('(String, String, [u8;32], [u8;32])', ['Vft', 'Allowance', owner, spender]) + .toHex(); + const reply = await this._program.api.message.calculateReply({ + destination: this._program.programId!, + origin: originAddress ? decodeAddress(originAddress) : ZERO_ADDRESS, + payload, + value: value || 0, + gasLimit: this._program.api.blockGasLimit.toBigInt(), + at: atBlock, + }); + if (!reply.code.isSuccess) throw new Error(this._program.registry.createType('String', reply.payload).toString()); + const result = this._program.registry.createType('(String, String, U256)', reply.payload); + return result[2].toBigInt() as unknown as bigint; + } + + public async balanceOf( + account: ActorId, + originAddress?: string, + value?: number | string | bigint, + atBlock?: `0x${string}`, + ): Promise { + const payload = this._program.registry + .createType('(String, String, [u8;32])', ['Vft', 'BalanceOf', account]) + .toHex(); + const reply = await this._program.api.message.calculateReply({ + destination: this._program.programId!, + origin: originAddress ? decodeAddress(originAddress) : ZERO_ADDRESS, + payload, + value: value || 0, + gasLimit: this._program.api.blockGasLimit.toBigInt(), + at: atBlock, + }); + if (!reply.code.isSuccess) throw new Error(this._program.registry.createType('String', reply.payload).toString()); + const result = this._program.registry.createType('(String, String, U256)', reply.payload); + return result[2].toBigInt() as unknown as bigint; + } + + public async decimals( + originAddress?: string, + value?: number | string | bigint, + atBlock?: `0x${string}`, + ): Promise { + const payload = this._program.registry.createType('(String, String)', ['Vft', 'Decimals']).toHex(); + const reply = await this._program.api.message.calculateReply({ + destination: this._program.programId!, + origin: originAddress ? decodeAddress(originAddress) : ZERO_ADDRESS, + payload, + value: value || 0, + gasLimit: this._program.api.blockGasLimit.toBigInt(), + at: atBlock, + }); + if (!reply.code.isSuccess) throw new Error(this._program.registry.createType('String', reply.payload).toString()); + const result = this._program.registry.createType('(String, String, u8)', reply.payload); + return result[2].toNumber() as unknown as number; + } + + public async name( + originAddress?: string, + value?: number | string | bigint, + atBlock?: `0x${string}`, + ): Promise { + const payload = this._program.registry.createType('(String, String)', ['Vft', 'Name']).toHex(); + const reply = await this._program.api.message.calculateReply({ + destination: this._program.programId!, + origin: originAddress ? decodeAddress(originAddress) : ZERO_ADDRESS, + payload, + value: value || 0, + gasLimit: this._program.api.blockGasLimit.toBigInt(), + at: atBlock, + }); + if (!reply.code.isSuccess) throw new Error(this._program.registry.createType('String', reply.payload).toString()); + const result = this._program.registry.createType('(String, String, String)', reply.payload); + return result[2].toString() as unknown as string; + } + + public async symbol( + originAddress?: string, + value?: number | string | bigint, + atBlock?: `0x${string}`, + ): Promise { + const payload = this._program.registry.createType('(String, String)', ['Vft', 'Symbol']).toHex(); + const reply = await this._program.api.message.calculateReply({ + destination: this._program.programId!, + origin: originAddress ? decodeAddress(originAddress) : ZERO_ADDRESS, + payload, + value: value || 0, + gasLimit: this._program.api.blockGasLimit.toBigInt(), + at: atBlock, + }); + if (!reply.code.isSuccess) throw new Error(this._program.registry.createType('String', reply.payload).toString()); + const result = this._program.registry.createType('(String, String, String)', reply.payload); + return result[2].toString() as unknown as string; + } + + public async totalSupply( + originAddress?: string, + value?: number | string | bigint, + atBlock?: `0x${string}`, + ): Promise { + const payload = this._program.registry.createType('(String, String)', ['Vft', 'TotalSupply']).toHex(); + const reply = await this._program.api.message.calculateReply({ + destination: this._program.programId!, + origin: originAddress ? decodeAddress(originAddress) : ZERO_ADDRESS, + payload, + value: value || 0, + gasLimit: this._program.api.blockGasLimit.toBigInt(), + at: atBlock, + }); + if (!reply.code.isSuccess) throw new Error(this._program.registry.createType('String', reply.payload).toString()); + const result = this._program.registry.createType('(String, String, U256)', reply.payload); + return result[2].toBigInt() as unknown as bigint; + } + + public subscribeToMintedEvent( + callback: (data: { to: ActorId; value: number | string | bigint }) => void | Promise, + ): Promise<() => void> { + return this._program.api.gearEvents.subscribeToGearEvent('UserMessageSent', ({ data: { message } }) => { + if (!message.source.eq(this._program.programId) || !message.destination.eq(ZERO_ADDRESS)) { + return; + } + + const payload = message.payload.toHex(); + if (getServiceNamePrefix(payload) === 'Vft' && getFnNamePrefix(payload) === 'Minted') { + callback( + this._program.registry + .createType('(String, String, {"to":"[u8;32]","value":"U256"})', message.payload)[2] + .toJSON() as unknown as { to: ActorId; value: number | string | bigint }, + ); + } + }); + } + + public subscribeToBurnedEvent( + callback: (data: { from: ActorId; value: number | string | bigint }) => void | Promise, + ): Promise<() => void> { + return this._program.api.gearEvents.subscribeToGearEvent('UserMessageSent', ({ data: { message } }) => { + if (!message.source.eq(this._program.programId) || !message.destination.eq(ZERO_ADDRESS)) { + return; + } + + const payload = message.payload.toHex(); + if (getServiceNamePrefix(payload) === 'Vft' && getFnNamePrefix(payload) === 'Burned') { + callback( + this._program.registry + .createType('(String, String, {"from":"[u8;32]","value":"U256"})', message.payload)[2] + .toJSON() as unknown as { from: ActorId; value: number | string | bigint }, + ); + } + }); + } + + public subscribeToApprovalEvent( + callback: (data: { owner: ActorId; spender: ActorId; value: number | string | bigint }) => void | Promise, + ): Promise<() => void> { + return this._program.api.gearEvents.subscribeToGearEvent('UserMessageSent', ({ data: { message } }) => { + if (!message.source.eq(this._program.programId) || !message.destination.eq(ZERO_ADDRESS)) { + return; + } + + const payload = message.payload.toHex(); + if (getServiceNamePrefix(payload) === 'Vft' && getFnNamePrefix(payload) === 'Approval') { + callback( + this._program.registry + .createType('(String, String, {"owner":"[u8;32]","spender":"[u8;32]","value":"U256"})', message.payload)[2] + .toJSON() as unknown as { owner: ActorId; spender: ActorId; value: number | string | bigint }, + ); + } + }); + } + + public subscribeToTransferEvent( + callback: (data: { from: ActorId; to: ActorId; value: number | string | bigint }) => void | Promise, + ): Promise<() => void> { + return this._program.api.gearEvents.subscribeToGearEvent('UserMessageSent', ({ data: { message } }) => { + if (!message.source.eq(this._program.programId) || !message.destination.eq(ZERO_ADDRESS)) { + return; + } + + const payload = message.payload.toHex(); + if (getServiceNamePrefix(payload) === 'Vft' && getFnNamePrefix(payload) === 'Transfer') { + callback( + this._program.registry + .createType('(String, String, {"from":"[u8;32]","to":"[u8;32]","value":"U256"})', message.payload)[2] + .toJSON() as unknown as { from: ActorId; to: ActorId; value: number | string | bigint }, + ); + } + }); + } +} diff --git a/frontend/src/features/swap/consts/sails/index.ts b/frontend/src/features/swap/consts/sails/index.ts new file mode 100644 index 00000000..678d4be7 --- /dev/null +++ b/frontend/src/features/swap/consts/sails/index.ts @@ -0,0 +1,5 @@ +import { Program as BridgingPaymentProgram } from './bridging-payment'; +import { Program as VftProgram } from './extended_vft'; +import { Program as VftGatewayProgram } from './vft-gateway'; + +export { BridgingPaymentProgram, VftGatewayProgram, VftProgram }; diff --git a/frontend/src/features/swap/consts/sails/vft-gateway.ts b/frontend/src/features/swap/consts/sails/vft-gateway.ts new file mode 100644 index 00000000..3b58cbaf --- /dev/null +++ b/frontend/src/features/swap/consts/sails/vft-gateway.ts @@ -0,0 +1,384 @@ +/* eslint-disable @typescript-eslint/no-floating-promises */ +/* eslint-disable @typescript-eslint/no-explicit-any */ + +import { GearApi, decodeAddress } from '@gear-js/api'; +import { TypeRegistry } from '@polkadot/types'; +import { H160, ActorId, TransactionBuilder, MessageId, ZERO_ADDRESS } from 'sails-js'; + +export interface InitConfig { + receiver_contract_address: H160; + gear_bridge_builtin: ActorId; + config: Config; +} + +export interface Config { + gas_to_burn_tokens: number | string | bigint; + gas_for_reply_deposit: number | string | bigint; + gas_to_mint_tokens: number | string | bigint; + gas_to_send_request_to_builtin: number | string | bigint; + reply_timeout: number; + gas_for_transfer_to_eth_msg: number | string | bigint; +} + +export type Error = + | 'sendError' + | 'replyError' + | 'burnTokensDecodeError' + | 'errorDuringTokensBurn' + | 'requestToBuiltinSendError' + | 'requestToBuiltinReplyError' + | 'builtinDecodeError' + | 'payloadSizeError' + | 'mintTokensDecodeError' + | 'replyTimeoutError' + | 'errorDuringTokensMint' + | 'noCorrespondingEthAddress' + | 'replyHook' + | 'messageNotFound' + | 'invalidMessageStatus' + | 'messageFailed' + | 'burnTokensFailed' + | 'bridgeBuiltinMessageFailed' + | 'tokensRefundedError'; + +export interface MessageInfo { + status: MessageStatus; + details: TransactionDetails; +} + +export type MessageStatus = + | { sendingMessageToBurnTokens: null } + | { tokenBurnCompleted: boolean } + | { waitingReplyFromBurn: null } + | { sendingMessageToBridgeBuiltin: null } + | { bridgeResponseReceived: number | string | bigint | null } + | { waitingReplyFromBuiltin: null } + | { bridgeBuiltinStep: null } + | { sendingMessageToMintTokens: null } + | { tokenMintCompleted: null } + | { waitingReplyFromMint: null } + | { mintTokensStep: null } + | { messageProcessedWithSuccess: number | string | bigint }; + +export interface TransactionDetails { + vara_token_id: ActorId; + sender: ActorId; + amount: number | string | bigint; + receiver: H160; +} + +export class Program { + public readonly registry: TypeRegistry; + public readonly vftGateway: VftGateway; + + constructor(public api: GearApi, public programId?: `0x${string}`) { + const types: Record = { + InitConfig: { receiver_contract_address: 'H160', gear_bridge_builtin: '[u8;32]', config: 'Config' }, + Config: { + gas_to_burn_tokens: 'u64', + gas_for_reply_deposit: 'u64', + gas_to_mint_tokens: 'u64', + gas_to_send_request_to_builtin: 'u64', + reply_timeout: 'u32', + gas_for_transfer_to_eth_msg: 'u64', + }, + Error: { + _enum: [ + 'SendError', + 'ReplyError', + 'BurnTokensDecodeError', + 'ErrorDuringTokensBurn', + 'RequestToBuiltinSendError', + 'RequestToBuiltinReplyError', + 'BuiltinDecodeError', + 'PayloadSizeError', + 'MintTokensDecodeError', + 'ReplyTimeoutError', + 'ErrorDuringTokensMint', + 'NoCorrespondingEthAddress', + 'ReplyHook', + 'MessageNotFound', + 'InvalidMessageStatus', + 'MessageFailed', + 'BurnTokensFailed', + 'BridgeBuiltinMessageFailed', + 'TokensRefundedError', + ], + }, + MessageInfo: { status: 'MessageStatus', details: 'TransactionDetails' }, + MessageStatus: { + _enum: { + SendingMessageToBurnTokens: 'Null', + TokenBurnCompleted: 'bool', + WaitingReplyFromBurn: 'Null', + SendingMessageToBridgeBuiltin: 'Null', + BridgeResponseReceived: 'Option', + WaitingReplyFromBuiltin: 'Null', + BridgeBuiltinStep: 'Null', + SendingMessageToMintTokens: 'Null', + TokenMintCompleted: 'Null', + WaitingReplyFromMint: 'Null', + MintTokensStep: 'Null', + MessageProcessedWithSuccess: 'U256', + }, + }, + TransactionDetails: { vara_token_id: '[u8;32]', sender: '[u8;32]', amount: 'U256', receiver: 'H160' }, + }; + + this.registry = new TypeRegistry(); + this.registry.setKnownTypes({ types }); + this.registry.register(types); + + this.vftGateway = new VftGateway(this); + } + + newCtorFromCode(code: Uint8Array | Buffer, init_config: InitConfig): TransactionBuilder { + const builder = new TransactionBuilder( + this.api, + this.registry, + 'upload_program', + ['New', init_config], + '(String, InitConfig)', + 'String', + code, + ); + + this.programId = builder.programId; + return builder; + } + + newCtorFromCodeId(codeId: `0x${string}`, init_config: InitConfig) { + const builder = new TransactionBuilder( + this.api, + this.registry, + 'create_program', + ['New', init_config], + '(String, InitConfig)', + 'String', + codeId, + ); + + this.programId = builder.programId; + return builder; + } +} + +export class VftGateway { + constructor(private _program: Program) {} + + public handleInterruptedTransfer( + msg_id: MessageId, + ): TransactionBuilder<{ ok: [number | string | bigint, H160] } | { err: Error }> { + if (!this._program.programId) throw new Error('Program ID is not set'); + return new TransactionBuilder<{ ok: [number | string | bigint, H160] } | { err: Error }>( + this._program.api, + this._program.registry, + 'send_message', + ['VftGateway', 'HandleInterruptedTransfer', msg_id], + '(String, String, [u8;32])', + 'Result<(U256, H160), Error>', + this._program.programId, + ); + } + + public mapVaraToEthAddress(vara_token_id: ActorId, eth_token_id: H160): TransactionBuilder { + if (!this._program.programId) throw new Error('Program ID is not set'); + return new TransactionBuilder( + this._program.api, + this._program.registry, + 'send_message', + ['VftGateway', 'MapVaraToEthAddress', vara_token_id, eth_token_id], + '(String, String, [u8;32], H160)', + 'Null', + this._program.programId, + ); + } + + public removeVaraToEthAddress(vara_token_id: ActorId): TransactionBuilder { + if (!this._program.programId) throw new Error('Program ID is not set'); + return new TransactionBuilder( + this._program.api, + this._program.registry, + 'send_message', + ['VftGateway', 'RemoveVaraToEthAddress', vara_token_id], + '(String, String, [u8;32])', + 'Null', + this._program.programId, + ); + } + + public transferVaraToEth( + vara_token_id: ActorId, + amount: number | string | bigint, + receiver: H160, + ): TransactionBuilder<{ ok: [number | string | bigint, H160] } | { err: Error }> { + if (!this._program.programId) throw new Error('Program ID is not set'); + return new TransactionBuilder<{ ok: [number | string | bigint, H160] } | { err: Error }>( + this._program.api, + this._program.registry, + 'send_message', + ['VftGateway', 'TransferVaraToEth', vara_token_id, amount, receiver], + '(String, String, [u8;32], U256, H160)', + 'Result<(U256, H160), Error>', + this._program.programId, + ); + } + + public updateConfig( + gas_to_burn_tokens: number | string | bigint | null, + gas_to_mint_tokens: number | string | bigint | null, + gas_for_reply_deposit: number | string | bigint | null, + gas_to_send_request_to_builtin: number | string | bigint | null, + reply_timeout: number | null, + gas_for_transfer_to_eth_msg: number | string | bigint | null, + ): TransactionBuilder { + if (!this._program.programId) throw new Error('Program ID is not set'); + return new TransactionBuilder( + this._program.api, + this._program.registry, + 'send_message', + [ + 'VftGateway', + 'UpdateConfig', + gas_to_burn_tokens, + gas_to_mint_tokens, + gas_for_reply_deposit, + gas_to_send_request_to_builtin, + reply_timeout, + gas_for_transfer_to_eth_msg, + ], + '(String, String, Option, Option, Option, Option, Option, Option)', + 'Null', + this._program.programId, + ); + } + + public updateReceiverContractAddress(new_receiver_contract_address: H160): TransactionBuilder { + if (!this._program.programId) throw new Error('Program ID is not set'); + return new TransactionBuilder( + this._program.api, + this._program.registry, + 'send_message', + ['VftGateway', 'UpdateReceiverContractAddress', new_receiver_contract_address], + '(String, String, H160)', + 'Null', + this._program.programId, + ); + } + + public async admin( + originAddress?: string, + value?: number | string | bigint, + atBlock?: `0x${string}`, + ): Promise { + const payload = this._program.registry.createType('(String, String)', ['VftGateway', 'Admin']).toHex(); + const reply = await this._program.api.message.calculateReply({ + destination: this._program.programId!, + origin: originAddress ? decodeAddress(originAddress) : ZERO_ADDRESS, + payload, + value: value || 0, + gasLimit: this._program.api.blockGasLimit.toBigInt(), + at: atBlock, + }); + if (!reply.code.isSuccess) throw new Error(this._program.registry.createType('String', reply.payload).toString()); + const result = this._program.registry.createType('(String, String, [u8;32])', reply.payload); + return result[2].toJSON() as unknown as ActorId; + } + + public async gearBridgeBuiltin( + originAddress?: string, + value?: number | string | bigint, + atBlock?: `0x${string}`, + ): Promise { + const payload = this._program.registry.createType('(String, String)', ['VftGateway', 'GearBridgeBuiltin']).toHex(); + const reply = await this._program.api.message.calculateReply({ + destination: this._program.programId!, + origin: originAddress ? decodeAddress(originAddress) : ZERO_ADDRESS, + payload, + value: value || 0, + gasLimit: this._program.api.blockGasLimit.toBigInt(), + at: atBlock, + }); + if (!reply.code.isSuccess) throw new Error(this._program.registry.createType('String', reply.payload).toString()); + const result = this._program.registry.createType('(String, String, [u8;32])', reply.payload); + return result[2].toJSON() as unknown as ActorId; + } + + public async getConfig( + originAddress?: string, + value?: number | string | bigint, + atBlock?: `0x${string}`, + ): Promise { + const payload = this._program.registry.createType('(String, String)', ['VftGateway', 'GetConfig']).toHex(); + const reply = await this._program.api.message.calculateReply({ + destination: this._program.programId!, + origin: originAddress ? decodeAddress(originAddress) : ZERO_ADDRESS, + payload, + value: value || 0, + gasLimit: this._program.api.blockGasLimit.toBigInt(), + at: atBlock, + }); + if (!reply.code.isSuccess) throw new Error(this._program.registry.createType('String', reply.payload).toString()); + const result = this._program.registry.createType('(String, String, Config)', reply.payload); + return result[2].toJSON() as unknown as Config; + } + + public async msgTrackerState( + originAddress?: string, + value?: number | string | bigint, + atBlock?: `0x${string}`, + ): Promise> { + const payload = this._program.registry.createType('(String, String)', ['VftGateway', 'MsgTrackerState']).toHex(); + const reply = await this._program.api.message.calculateReply({ + destination: this._program.programId!, + origin: originAddress ? decodeAddress(originAddress) : ZERO_ADDRESS, + payload, + value: value || 0, + gasLimit: this._program.api.blockGasLimit.toBigInt(), + at: atBlock, + }); + if (!reply.code.isSuccess) throw new Error(this._program.registry.createType('String', reply.payload).toString()); + const result = this._program.registry.createType('(String, String, Vec<([u8;32], MessageInfo)>)', reply.payload); + return result[2].toJSON() as unknown as Array<[MessageId, MessageInfo]>; + } + + public async receiverContractAddress( + originAddress?: string, + value?: number | string | bigint, + atBlock?: `0x${string}`, + ): Promise { + const payload = this._program.registry + .createType('(String, String)', ['VftGateway', 'ReceiverContractAddress']) + .toHex(); + const reply = await this._program.api.message.calculateReply({ + destination: this._program.programId!, + origin: originAddress ? decodeAddress(originAddress) : ZERO_ADDRESS, + payload, + value: value || 0, + gasLimit: this._program.api.blockGasLimit.toBigInt(), + at: atBlock, + }); + if (!reply.code.isSuccess) throw new Error(this._program.registry.createType('String', reply.payload).toString()); + const result = this._program.registry.createType('(String, String, H160)', reply.payload); + return result[2].toJSON() as unknown as H160; + } + + public async varaToEthAddresses( + originAddress?: string, + value?: number | string | bigint, + atBlock?: `0x${string}`, + ): Promise> { + const payload = this._program.registry.createType('(String, String)', ['VftGateway', 'VaraToEthAddresses']).toHex(); + const reply = await this._program.api.message.calculateReply({ + destination: this._program.programId!, + origin: originAddress ? decodeAddress(originAddress) : ZERO_ADDRESS, + payload, + value: value || 0, + gasLimit: this._program.api.blockGasLimit.toBigInt(), + at: atBlock, + }); + if (!reply.code.isSuccess) throw new Error(this._program.registry.createType('String', reply.payload).toString()); + const result = this._program.registry.createType('(String, String, Vec<([u8;32], H160)>)', reply.payload); + return result[2].toJSON() as unknown as Array<[ActorId, H160]>; + } +} diff --git a/frontend/src/features/swap/hooks/eth/use-eth-balance.ts b/frontend/src/features/swap/hooks/eth/use-eth-balance.ts index e9aa4d11..11e278b6 100644 --- a/frontend/src/features/swap/hooks/eth/use-eth-balance.ts +++ b/frontend/src/features/swap/hooks/eth/use-eth-balance.ts @@ -1,9 +1,9 @@ -import { Config } from '../../types'; +import { HexString } from '@gear-js/api'; import { useEthAccountBalance } from './use-eth-account-balance'; import { useFungibleTokenBalance } from './use-fungible-token-balance'; -function useEthBalance({ ftAddress, isLoading }: Config) { +function useEthBalance(ftAddress: HexString | undefined, isLoading: boolean) { const accountBalance = useEthAccountBalance(!isLoading && !ftAddress); const fungibleTokenBalance = useFungibleTokenBalance(ftAddress); diff --git a/frontend/src/features/swap/hooks/eth/use-eth-config.ts b/frontend/src/features/swap/hooks/eth/use-eth-config.ts index f791e461..e671077d 100644 --- a/frontend/src/features/swap/hooks/eth/use-eth-config.ts +++ b/frontend/src/features/swap/hooks/eth/use-eth-config.ts @@ -1,23 +1,27 @@ -import { useReadContracts } from 'wagmi'; +import { HexString } from '@gear-js/api'; +import { formatEther } from 'viem'; +import { useReadContract } from 'wagmi'; + +import { isUndefined } from '@/utils'; import { ABI, FUNCTION_NAME } from '../../consts'; -import { Contract } from '../../types'; -function useEthConfig({ address }: Contract) { +function useEthConfig(address: HexString | undefined) { // TODO: logger const abi = ABI; - const { data, isLoading } = useReadContracts({ - contracts: [ - { abi, address, functionName: FUNCTION_NAME.MIN_AMOUNT }, - { abi, address, functionName: FUNCTION_NAME.FUNGIBLE_TOKEN_ADDRESS }, - ], + const { data, isLoading } = useReadContract({ + abi, + address, + functionName: FUNCTION_NAME.MIN_AMOUNT, }); - const minValue = data?.[0]?.result; - const ftAddress = data?.[1]?.result; + const fee = { + value: data, + formattedValue: !isUndefined(data) ? formatEther(data) : undefined, + }; - return { minValue, ftAddress, isLoading }; + return { fee, isLoading }; } export { useEthConfig }; diff --git a/frontend/src/features/swap/hooks/eth/use-handle-eth-submit.ts b/frontend/src/features/swap/hooks/eth/use-handle-eth-submit.ts index 88f23ca1..1b949b60 100644 --- a/frontend/src/features/swap/hooks/eth/use-handle-eth-submit.ts +++ b/frontend/src/features/swap/hooks/eth/use-handle-eth-submit.ts @@ -1,26 +1,22 @@ +import { HexString } from '@gear-js/api'; import { useAlert } from '@gear-js/react-hooks'; import { BaseError } from 'viem'; import { useWriteContract } from 'wagmi'; -import { isUndefined, logger } from '@/utils'; +import { logger } from '@/utils'; import { FUNCTION_NAME, ABI } from '../../consts'; -import { Config, Contract, FeeCalculator, FormattedValues } from '../../types'; +import { Contract, FormattedValues } from '../../types'; import { useApprove } from './use-approve'; -function useHandleEthSubmit( - { address: bridgeAddress }: Contract, - { ftAddress }: Config, - feeCalculatorData?: FeeCalculator, -) { +function useHandleEthSubmit({ address: bridgeAddress }: Contract, ftAddress: HexString | undefined) { const alert = useAlert(); const { writeContract, isPending } = useWriteContract(); const approve = useApprove(ftAddress); const onSubmit = ({ amount: _amount, expectedAmount, accountAddress }: FormattedValues, onSuccess: () => void) => { - if (isUndefined(feeCalculatorData)) throw new Error('FeeCalculatorData is not defined'); - const { fee, mortality, timestamp, signature } = feeCalculatorData || {}; + const fee = { value: BigInt(0) }; const address = bridgeAddress; const amount = expectedAmount; @@ -31,7 +27,7 @@ function useHandleEthSubmit( const transit = () => { logger.info( FUNCTION_NAME.TRANSIT, - `\naddress: ${address}\nargs: [\nfee: ${fee.value}\nmortality: ${mortality}\ntimestamp: ${timestamp}\nsignature: ${signature}\n${accountAddress} \namount: ${amount}\n]` + + `\naddress: ${address}\nargs: [\nfee: ${fee.value}\namount: ${amount}]` + `\nvalue: ${value}\nisNativeToken: ${isNativeToken}`, ); @@ -40,7 +36,9 @@ function useHandleEthSubmit( abi: ABI, address, functionName: FUNCTION_NAME.TRANSIT, - args: [fee.value, BigInt(mortality), BigInt(timestamp), signature, accountAddress, amount], + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + args: [fee.value, accountAddress, amount], value, }, { diff --git a/frontend/src/features/swap/hooks/index.ts b/frontend/src/features/swap/hooks/index.ts index e0e6d6ac..73aedb20 100644 --- a/frontend/src/features/swap/hooks/index.ts +++ b/frontend/src/features/swap/hooks/index.ts @@ -1,7 +1,6 @@ import { useEthConfig, useEthBalance, useHandleEthSubmit } from './eth'; import { useBridge } from './use-bridge'; import { useSwapForm } from './use-swap-form'; -import { useFeeCalculator } from './use-fee-calculator'; import { useVaraConfig, useVaraBalance, useHandleVaraSubmit } from './vara'; export { @@ -13,5 +12,4 @@ export { useVaraBalance, useHandleVaraSubmit, useBridge, - useFeeCalculator, }; diff --git a/frontend/src/features/swap/hooks/use-fee-calculator.ts b/frontend/src/features/swap/hooks/use-fee-calculator.ts deleted file mode 100644 index f8ae0178..00000000 --- a/frontend/src/features/swap/hooks/use-fee-calculator.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { useAlert } from '@gear-js/react-hooks'; -import { useQuery } from '@tanstack/react-query'; -import { useEffect } from 'react'; -import { FEE_CALCULATOR_URL, FEE_DECIMALS, NETWORK_NAME } from '@/consts'; -import { NetworkName, FeeCalculator } from '../types'; -import { FeeCalculatorResponse } from '../types/hooks'; -import { formatUnits } from 'viem'; - -type Params = { - networkName: NetworkName; -}; - -function useFeeCalculator({ networkName }: Params) { - const targetNetwork = networkName === NETWORK_NAME.VARA ? 'eth' : 'vara'; - const alert = useAlert(); - - const getFee = async () => { - const response = await fetch(`${FEE_CALCULATOR_URL}/${targetNetwork}`); - if (!response.ok) throw new Error('Fee calculator is not available'); - - const json = (await response.json()) as FeeCalculatorResponse; - - return json; - }; - - const prepareData = (originalData: FeeCalculatorResponse) => { - const value = BigInt(originalData.fee); - return { - ...originalData, - fee: { - value: value, - formattedValue: formatUnits(value, FEE_DECIMALS[networkName]), - }, - } as FeeCalculator; - }; - - const { data, refetch, isFetching, error } = useQuery({ - queryKey: ['feeCalculator', targetNetwork], - queryFn: getFee, - select: prepareData, - }); - - useEffect(() => { - if (error) { - alert.error('Fee calculator is not available'); - } - }, [error]); - - const isFeeLoading = isFetching; - - return { feeCalculatorData: data, isFeeLoading, refetch, error }; -} - -export { useFeeCalculator }; diff --git a/frontend/src/features/swap/hooks/vara/use-fungible-token-balance.ts b/frontend/src/features/swap/hooks/vara/use-fungible-token-balance.ts index 90f357a4..157178e0 100644 --- a/frontend/src/features/swap/hooks/vara/use-fungible-token-balance.ts +++ b/frontend/src/features/swap/hooks/vara/use-fungible-token-balance.ts @@ -1,53 +1,45 @@ import { HexString } from '@gear-js/api'; -import { useAccount, useApi } from '@gear-js/react-hooks'; -import { useQuery } from '@tanstack/react-query'; -import { Sails } from 'sails-js'; +import { useAccount, useProgram, useProgramQuery } from '@gear-js/react-hooks'; import { formatUnits } from 'viem'; import { isUndefined } from '@/utils'; -import fungibleTokenIdlUrl from '../../assets/vft.idl?url'; -import { BALANCE_REFETCH_INTERVAL } from '../../consts'; +import { BALANCE_REFETCH_INTERVAL, VftProgram } from '../../consts'; -function useFungibleTokenBalance(address: HexString | undefined) { - const { api, isApiReady } = useApi(); - - const { account } = useAccount(); - const { decodedAddress } = account || {}; - - const getBalance = async () => { - if (!isApiReady) throw new Error('API is not initialized'); - if (!decodedAddress) throw new Error('Account is not found'); - if (!address) throw new Error('Fungible token address is not found'); - - const response = await fetch(fungibleTokenIdlUrl); - const idl = await response.text(); +const SERVICE_NAME = 'vft'; - const sails = (await Sails.new()).setApi(api).setProgramId(address); - const parsedIdl = sails.parseIdl(idl); +const QUERY_NAME = { + BALANCE: 'balanceOf', + DECIMALS: 'decimals', +} as const; - const { BalanceOf, Decimals } = parsedIdl.services.Vft.queries; - - const balance = await BalanceOf(decodedAddress, undefined, undefined, decodedAddress); - const decimals = await Decimals(decodedAddress); +function useFungibleTokenBalance(address: HexString | undefined) { + const { account } = useAccount(); - return { balance: BigInt(balance), decimals }; - }; + const { data: program } = useProgram({ + library: VftProgram, + id: address, + }); - // TODO: logger - const { data, isPending } = useQuery({ - queryKey: ['varaFungibleTokenBalance', address, decodedAddress], - queryFn: getBalance, - enabled: isApiReady && Boolean(account) && Boolean(address), - refetchInterval: BALANCE_REFETCH_INTERVAL, + const { data: balance, isPending: isBalancePending } = useProgramQuery({ + program, + serviceName: SERVICE_NAME, + functionName: QUERY_NAME.BALANCE, + args: [account!.decodedAddress], + query: { enabled: Boolean(account), refetchInterval: BALANCE_REFETCH_INTERVAL }, }); - const { balance, decimals } = data || {}; + const { data: decimals, isPending: isDecimalsPending } = useProgramQuery({ + program, + serviceName: SERVICE_NAME, + functionName: QUERY_NAME.DECIMALS, + args: [], + }); const value = balance; const formattedValue = !isUndefined(balance) && !isUndefined(decimals) ? formatUnits(balance, decimals) : undefined; - const isLoading = isPending; + const isLoading = isBalancePending || isDecimalsPending; return { value, formattedValue, decimals, isLoading }; } diff --git a/frontend/src/features/swap/hooks/vara/use-handle-vara-submit.ts b/frontend/src/features/swap/hooks/vara/use-handle-vara-submit.ts index 7c5cace8..1ea873d6 100644 --- a/frontend/src/features/swap/hooks/vara/use-handle-vara-submit.ts +++ b/frontend/src/features/swap/hooks/vara/use-handle-vara-submit.ts @@ -1,10 +1,12 @@ +import { HexString } from '@gear-js/api'; + import { isUndefined, logger } from '@/utils'; -import { Config, Contract, FormattedValues, FeeCalculator } from '../../types'; +import { Contract, FormattedValues } from '../../types'; import { useSendMessage } from './use-send-message'; -function useHandleVaraSubmit({ address, sails }: Contract, { ftAddress }: Config, feeCalculatorData?: FeeCalculator) { +function useHandleVaraSubmit({ address, sails }: Contract, ftAddress: HexString | undefined) { const isNativeToken = !ftAddress; // For fungble token contracts gas calculation does not work cuz contracts check the amount of gas applied @@ -13,8 +15,8 @@ function useHandleVaraSubmit({ address, sails }: Contract, { ftAddress }: Config const onSubmit = ({ amount: _amount, expectedAmount, accountAddress }: FormattedValues, onSuccess: () => void) => { if (isUndefined(sails)) throw new Error('Sails is not defined'); - if (isUndefined(feeCalculatorData)) throw new Error('FeeCalculatorData is not defined'); - const { fee, mortality, timestamp, signature } = feeCalculatorData; + + const fee = { value: BigInt(0) }; const amount = expectedAmount; const recipient = accountAddress; @@ -23,12 +25,11 @@ function useHandleVaraSubmit({ address, sails }: Contract, { ftAddress }: Config logger.info( 'TransitVaraToEth', - `\nprogramId:${address}\namount: ${amount}\nrecipient: ${recipient}\nvalue: ${value}\nisNativeToken: ${isNativeToken}` + - `\nfee: ${fee.value}\nmortality: ${mortality}\ntimestamp: ${timestamp}\nsignature: ${signature}`, + `\nprogramId:${address}\namount: ${amount}\nrecipient: ${recipient}\nvalue: ${value}\nisNativeToken: ${isNativeToken}\nfee: ${fee.value}`, ); const { TransitVaraToEth } = sails.services.VaraBridge.functions; - const transaction = TransitVaraToEth(fee.value, mortality, timestamp, signature, recipient, amount); + const transaction = TransitVaraToEth(fee.value, recipient, amount); return sendMessage(transaction, value, { onSuccess }); }; diff --git a/frontend/src/features/swap/hooks/vara/use-vara-balance.ts b/frontend/src/features/swap/hooks/vara/use-vara-balance.ts index 4e04ef25..0ee2c571 100644 --- a/frontend/src/features/swap/hooks/vara/use-vara-balance.ts +++ b/frontend/src/features/swap/hooks/vara/use-vara-balance.ts @@ -1,9 +1,9 @@ -import { Config } from '../../types'; +import { HexString } from '@gear-js/api'; import { useFungibleTokenBalance } from './use-fungible-token-balance'; import { useVaraAccountBalance } from './use-vara-account-balance'; -function useVaraBalance({ ftAddress, isLoading }: Config) { +function useVaraBalance(ftAddress: HexString | undefined, isLoading: boolean) { const accountBalance = useVaraAccountBalance(!isLoading && !ftAddress); const fungibleTokenBalance = useFungibleTokenBalance(ftAddress); diff --git a/frontend/src/features/swap/hooks/vara/use-vara-config.ts b/frontend/src/features/swap/hooks/vara/use-vara-config.ts index 988ec417..b90e51c0 100644 --- a/frontend/src/features/swap/hooks/vara/use-vara-config.ts +++ b/frontend/src/features/swap/hooks/vara/use-vara-config.ts @@ -1,17 +1,33 @@ -import { STATE_FUNCTION } from '../../consts'; -import { ConfigState, Contract } from '../../types'; +import { HexString } from '@gear-js/api'; +import { useBalanceFormat, useProgram, useProgramQuery } from '@gear-js/react-hooks'; -import { useReadState } from './use-read-state'; +import { isUndefined } from '@/utils'; -function useVaraConfig({ address, sails }: Contract) { - const { data: config, isPending } = useReadState(address, sails, STATE_FUNCTION.CONFIG); +import { BridgingPaymentProgram } from '../../consts'; - const minValue = config ? BigInt(config.min_amount) : undefined; - const ftAddress = BigInt(config?.ft_token_id || 0) === 0n ? undefined : config?.ft_token_id; +function useVaraConfig(id: HexString | undefined) { + const { getFormattedBalance } = useBalanceFormat(); + + const { data: program } = useProgram({ + library: BridgingPaymentProgram, + id, + }); + + const { data: config, isPending } = useProgramQuery({ + program, + serviceName: 'bridgingPayment', + functionName: 'getConfig', + args: [], + }); + + const fee = { + value: !isUndefined(config?.fee) ? BigInt(config.fee) : undefined, + formattedValue: !isUndefined(config?.fee) ? getFormattedBalance(config.fee).value : undefined, + }; const isLoading = isPending; - return { minValue, ftAddress, isLoading }; + return { fee, isLoading }; } export { useVaraConfig }; diff --git a/frontend/src/features/swap/types/hooks.ts b/frontend/src/features/swap/types/hooks.ts index 79d9ea47..815a3586 100644 --- a/frontend/src/features/swap/types/hooks.ts +++ b/frontend/src/features/swap/types/hooks.ts @@ -9,41 +9,26 @@ type BalanceValues = { }; type Config = { - minValue: bigint | undefined; - ftAddress: HexString | undefined; + fee: BalanceValues; isLoading: boolean; }; -type FeeCalculatorResponse = { - fee: string; - mortality: number; - timestamp: number; - bytes: string; - signature: HexString; -}; - -type FeeCalculator = { - fee: { value: bigint; formattedValue: string }; - mortality: number; - timestamp: number; - bytes: string; - signature: HexString; -}; - -type UseBalance = (config: Config) => BalanceValues & { +type UseBalance = ( + ftAddress: HexString | undefined, + isLoading: boolean, +) => BalanceValues & { decimals: number | undefined; isLoading: boolean; }; -type UseConfig = (contract: Contract) => Config; +type UseConfig = (id: HexString) => Config; type UseHandleSubmit = ( contract: Contract, - config: Config, - feeCalculator?: FeeCalculator, + ftAddress: HexString | undefined, ) => { onSubmit: (values: FormattedValues, reset: () => void) => void; isSubmitting: boolean; }; -export type { Config, UseBalance, UseConfig, UseHandleSubmit, FeeCalculatorResponse, FeeCalculator }; +export type { Config, UseBalance, UseConfig, UseHandleSubmit }; diff --git a/frontend/src/features/swap/types/index.ts b/frontend/src/features/swap/types/index.ts index 22c16753..9efe7ccb 100644 --- a/frontend/src/features/swap/types/index.ts +++ b/frontend/src/features/swap/types/index.ts @@ -1,5 +1,5 @@ import { Values, FormattedValues } from './form'; -import { Config, UseBalance, UseConfig, UseHandleSubmit, FeeCalculator, FeeCalculatorResponse } from './hooks'; +import { Config, UseBalance, UseConfig, UseHandleSubmit } from './hooks'; import { NetworkName, TokenType, Bridge, Contract } from './spec'; import { ConfigState } from './vara'; @@ -10,8 +10,6 @@ export type { Bridge, Contract, Config, - FeeCalculator, - FeeCalculatorResponse, UseBalance, UseConfig, UseHandleSubmit, diff --git a/frontend/src/features/swap/types/spec.ts b/frontend/src/features/swap/types/spec.ts index 91c1c770..5b63c015 100644 --- a/frontend/src/features/swap/types/spec.ts +++ b/frontend/src/features/swap/types/spec.ts @@ -1,5 +1,5 @@ -import { Sails } from 'sails-js'; import { HexString } from '@gear-js/api'; +import { Sails } from 'sails-js'; import { NETWORK_NAME } from '@/consts'; diff --git a/frontend/src/features/swap/utils.ts b/frontend/src/features/swap/utils.ts index bdde4fa4..46c5ac93 100644 --- a/frontend/src/features/swap/utils.ts +++ b/frontend/src/features/swap/utils.ts @@ -7,7 +7,6 @@ import { Pair } from '@/types'; import { isUndefined } from '@/utils'; import { ERROR_MESSAGE } from './consts'; -import { NetworkName } from './types'; const getAmountSchema = ( balanceValue: bigint | undefined, @@ -41,9 +40,4 @@ const getOptions = () => { return { varaOptions, ethOptions }; }; -const getNormalizedTime = (networkName: NetworkName, time?: number) => { - const toMilisecondsMultiplier = networkName === NETWORK_NAME.VARA ? 1 : 1000; - return isUndefined(time) ? undefined : time * toMilisecondsMultiplier; -}; - -export { getAmountSchema, getOptions, getNormalizedTime }; +export { getAmountSchema, getOptions }; From 0fc25e568c4ca260601630f71431b64816c4cec9 Mon Sep 17 00:00:00 2001 From: Nikita Yutanov Date: Tue, 27 Aug 2024 15:50:03 +0300 Subject: [PATCH 07/38] Add tokens fetch --- frontend/src/assets/logo.svg | 13 +- .../swap/components/network/network.tsx | 11 +- .../components/swap-form/swap-eth-form.tsx | 3 +- .../swap/components/swap-form/swap-form.tsx | 44 +++---- .../components/swap-form/swap-vara-form.tsx | 3 +- frontend/src/features/swap/hooks/eth/index.ts | 3 +- .../features/swap/hooks/eth/use-eth-config.ts | 27 ---- .../swap/hooks/eth/use-handle-eth-submit.ts | 6 +- frontend/src/features/swap/hooks/index.ts | 3 +- .../src/features/swap/hooks/use-bridge.ts | 118 +++++++++++++++--- .../swap/hooks/vara/use-handle-vara-submit.ts | 7 +- .../swap/hooks/vara/use-vara-config.ts | 8 +- frontend/src/features/swap/types/hooks.ts | 3 +- 13 files changed, 151 insertions(+), 98 deletions(-) delete mode 100644 frontend/src/features/swap/hooks/eth/use-eth-config.ts diff --git a/frontend/src/assets/logo.svg b/frontend/src/assets/logo.svg index 488a7479..cb8f584a 100644 --- a/frontend/src/assets/logo.svg +++ b/frontend/src/assets/logo.svg @@ -1,11 +1,4 @@ - - - - - - - - - - + + + diff --git a/frontend/src/features/swap/components/network/network.tsx b/frontend/src/features/swap/components/network/network.tsx index 1de13d33..048dac80 100644 --- a/frontend/src/features/swap/components/network/network.tsx +++ b/frontend/src/features/swap/components/network/network.tsx @@ -1,4 +1,5 @@ import { Input, Select, SelectProps } from '@gear-js/vara-ui'; +import { ReactNode } from 'react'; import { Controller } from 'react-hook-form'; import { NumericFormat } from 'react-number-format'; import { SourceType } from 'react-number-format/types/types'; @@ -6,7 +7,7 @@ import { SourceType } from 'react-number-format/types/types'; import EthSVG from '@/assets/eth.svg?react'; import VaraSVG from '@/assets/vara.svg?react'; import { NetworkCard } from '@/components'; -import { Pair, SVGComponent } from '@/types'; +import { SVGComponent } from '@/types'; import { FIELD_NAME } from '../../consts'; @@ -16,11 +17,11 @@ type Props = { name: string; SVG: SVGComponent; options: SelectProps['options']; - selectValue: Pair; + selectValue: string; inputName: typeof FIELD_NAME.VALUE | typeof FIELD_NAME.EXPECTED_VALUE; onChange: (value: string) => void; - onSelectChange: (value: Pair) => void; - renderBalance?: () => JSX.Element; + onSelectChange: (value: string) => void; + renderBalance?: () => ReactNode; }; function Network({ @@ -38,7 +39,7 @@ function Network({
    - onSelectChange(target.value)} />
    ); diff --git a/frontend/src/features/swap/components/swap-form/swap-form.tsx b/frontend/src/features/swap/components/swap-form/swap-form.tsx index 4cbc7f8d..2aab7edd 100644 --- a/frontend/src/features/swap/components/swap-form/swap-form.tsx +++ b/frontend/src/features/swap/components/swap-form/swap-form.tsx @@ -6,8 +6,8 @@ import { NETWORK_NAME } from '@/consts'; import GasSVG from '../../assets/gas.svg?react'; import { FIELD_NAME } from '../../consts'; -import { useSwapForm, useBridge } from '../../hooks'; -import { NetworkName, UseBalance, UseConfig, UseHandleSubmit } from '../../types'; +import { useSwapForm, useBridge, useVaraConfig } from '../../hooks'; +import { NetworkName, UseBalance, UseHandleSubmit } from '../../types'; import { Balance } from '../balance'; import { Network } from '../network'; @@ -17,25 +17,20 @@ type Props = { networkName: NetworkName; disabled: boolean; useBalance: UseBalance; - useConfig: UseConfig; useHandleSubmit: UseHandleSubmit; renderSwapNetworkButton: () => JSX.Element; }; -function SwapForm({ networkName, disabled, useHandleSubmit, useBalance, useConfig, renderSwapNetworkButton }: Props) { +function SwapForm({ networkName, disabled, useHandleSubmit, useBalance, renderSwapNetworkButton }: Props) { // TODO: isVaraNetwork and isNativeToken can be use explicitly in some of the hooks const isVaraNetwork = networkName === NETWORK_NAME.VARA; - const FromNetwork = isVaraNetwork ? Network.Vara : Network.Eth; const ToNetwork = isVaraNetwork ? Network.Eth : Network.Vara; - const { contract, options, symbol, pair } = useBridge(networkName); - - const config = useConfig(contract?.address); - - const balance = useBalance('0x00', false); - - const { onSubmit, isSubmitting } = useHandleSubmit(contract, '0x00'); + const { address, options, symbol, pair } = useBridge(networkName === 'vara' ? 0 : 1); + const config = useVaraConfig(isVaraNetwork); + const balance = useBalance(address, false); + const { onSubmit, isSubmitting } = useHandleSubmit(address, '0x00'); const { form, onValueChange, onExpectedValueChange, handleSubmit, setMaxBalance } = useSwapForm( isVaraNetwork, @@ -46,14 +41,15 @@ function SwapForm({ networkName, disabled, useHandleSubmit, useBalance, useConfi onSubmit, ); - const renderFromBalance = () => ( - - ); + const renderFromBalance = () => + symbol.value && ( + + ); return ( @@ -84,7 +80,13 @@ function SwapForm({ networkName, disabled, useHandleSubmit, useBalance, useConfi
    - +
    diff --git a/frontend/src/features/swap/hooks/use-bridge.ts b/frontend/src/features/swap/hooks/use-bridge.ts index 93a26561..86f6facb 100644 --- a/frontend/src/features/swap/hooks/use-bridge.ts +++ b/frontend/src/features/swap/hooks/use-bridge.ts @@ -43,7 +43,7 @@ function useTokens() { const { api, isApiReady } = useApi(); - const { data } = useQuery({ + const { data, isPending } = useQuery({ queryKey: ['options', ftAdresses], queryFn: () => { @@ -53,6 +53,7 @@ function useTokens() { const varaAddress = addressPair[0].toString() as HexString; const ethAddress = addressPair[1].toString() as HexString; + // TODO: read decimals only for selected? const vftProgram = new VftProgram(api, varaAddress); const varaSymbol = await vftProgram.vft.symbol(); const varaDecimals = await vftProgram.vft.decimals(); @@ -81,10 +82,12 @@ function useTokens() { enabled: isApiReady && Boolean(ftAdresses), }); - return data; + const isLoading = isPending; + + return { data, isLoading }; } -const getOptions = (data: ReturnType) => { +const getOptions = (data: ReturnType['data']) => { const varaOptions: { label: string; value: string }[] = []; const ethOptions: { label: string; value: string }[] = []; @@ -102,16 +105,16 @@ function useBridge(networkIndex: number) { const tokens = useTokens(); const [pair, setPair] = useState('0'); - const { varaOptions, ethOptions } = getOptions(tokens); + const { varaOptions, ethOptions } = getOptions(tokens.data); const options = { from: isVaraNetwork ? varaOptions : ethOptions, to: isVaraNetwork ? ethOptions : varaOptions }; - const bridge = tokens?.[Number(pair)][networkIndex]; + const bridge = tokens.data?.[Number(pair)][networkIndex]; const { address } = bridge || {}; const nativeSymbol = isVaraNetwork ? 'VARA' : 'ETH'; const symbol = { value: bridge?.symbol, native: nativeSymbol }; - return { address, options, symbol, pair: { value: pair, set: setPair } }; + return { address, options, symbol, pair: { value: pair, set: setPair }, isLoading: tokens.isLoading }; } export { useBridge }; From 8427eb599ad624f51334f52f242009c48eb525d8 Mon Sep 17 00:00:00 2001 From: Nikita Yutanov Date: Wed, 28 Aug 2024 17:21:10 +0300 Subject: [PATCH 13/38] Add vara submit approve --- frontend/.env.example | 1 + .../swap/components/balance/balance.tsx | 4 +- .../swap/components/swap-form/swap-form.tsx | 28 +++-- frontend/src/features/swap/consts/index.ts | 2 + frontend/src/features/swap/hooks/eth/index.ts | 4 +- .../features/swap/hooks/eth/use-approve.ts | 18 +-- .../swap/hooks/eth/use-eth-account-balance.ts | 29 ----- .../swap/hooks/eth/use-eth-balance.ts | 13 --- .../swap/hooks/eth/use-handle-eth-submit.ts | 38 +++--- frontend/src/features/swap/hooks/index.ts | 4 +- .../src/features/swap/hooks/use-swap-form.ts | 25 +--- .../src/features/swap/hooks/vara/index.ts | 5 +- .../hooks/vara/use-derive-balances-all.ts | 19 --- .../vara/use-extrinsic-failed-message.ts | 18 --- .../swap/hooks/vara/use-handle-vara-submit.ts | 68 ++++++++--- .../src/features/swap/hooks/vara/use-sails.ts | 30 ----- .../swap/hooks/vara/use-send-message.ts | 51 -------- .../swap/hooks/vara/use-sign-and-send.tsx | 110 ------------------ .../hooks/vara/use-vara-account-balance.ts | 29 ----- .../swap/hooks/vara/use-vara-balance.ts | 13 --- frontend/src/features/swap/types/hooks.ts | 7 +- frontend/src/features/swap/utils.ts | 2 +- 22 files changed, 106 insertions(+), 412 deletions(-) delete mode 100644 frontend/src/features/swap/hooks/eth/use-eth-account-balance.ts delete mode 100644 frontend/src/features/swap/hooks/eth/use-eth-balance.ts delete mode 100644 frontend/src/features/swap/hooks/vara/use-derive-balances-all.ts delete mode 100644 frontend/src/features/swap/hooks/vara/use-extrinsic-failed-message.ts delete mode 100644 frontend/src/features/swap/hooks/vara/use-sails.ts delete mode 100644 frontend/src/features/swap/hooks/vara/use-send-message.ts delete mode 100644 frontend/src/features/swap/hooks/vara/use-sign-and-send.tsx delete mode 100644 frontend/src/features/swap/hooks/vara/use-vara-account-balance.ts delete mode 100644 frontend/src/features/swap/hooks/vara/use-vara-balance.ts diff --git a/frontend/.env.example b/frontend/.env.example index cd267770..e245a3c1 100644 --- a/frontend/.env.example +++ b/frontend/.env.example @@ -4,3 +4,4 @@ VITE_ETH_CHAIN_ID= VITE_WALLET_CONNECT_PROJECT_ID= VITE_INDEXER_ADDRESS= VITE_BRIDGING_PAYMENT_CONTRACT_ADDRESS= +VITE_ERC20_TREASURY_CONTRACT_ADDRESS= diff --git a/frontend/src/features/swap/components/balance/balance.tsx b/frontend/src/features/swap/components/balance/balance.tsx index 3fef4371..ec3b6e31 100644 --- a/frontend/src/features/swap/components/balance/balance.tsx +++ b/frontend/src/features/swap/components/balance/balance.tsx @@ -7,7 +7,7 @@ import styles from './balance.module.scss'; type Props = { value: string | undefined; - unit: string; + unit: string | undefined; isLoading: boolean; heading?: string; SVG?: SVGComponent; @@ -37,7 +37,7 @@ function Balance({ heading = 'Balance', value, unit, isLoading, SVG, onMaxButton

    {isLoading && } {!isLoading && !value && } - {value && `${value} ${unit}`} + {value && unit && `${value} ${unit}`}

    diff --git a/frontend/src/features/swap/components/swap-form/swap-form.tsx b/frontend/src/features/swap/components/swap-form/swap-form.tsx index eac8af71..29f33d42 100644 --- a/frontend/src/features/swap/components/swap-form/swap-form.tsx +++ b/frontend/src/features/swap/components/swap-form/swap-form.tsx @@ -21,33 +21,31 @@ type Props = { }; function SwapForm({ networkIndex, disabled, useHandleSubmit, useBalance, renderSwapNetworkButton }: Props) { - // TODO: isVaraNetwork and isNativeToken can be use explicitly in some of the hooks const isVaraNetwork = networkIndex === NETWORK_INDEX.VARA; const FromNetwork = isVaraNetwork ? Network.Vara : Network.Eth; const ToNetwork = isVaraNetwork ? Network.Eth : Network.Vara; const { address, options, symbol, pair, ...bridge } = useBridge(networkIndex); - const config = useVaraConfig(isVaraNetwork); - const balance = useBalance(address, false); - const { onSubmit, isSubmitting } = useHandleSubmit(address, '0x00'); + const { fee, ...config } = useVaraConfig(isVaraNetwork); + const balance = useBalance(address); + const { onSubmit, isSubmitting } = useHandleSubmit(address, fee.value); const { form, onValueChange, onExpectedValueChange, handleSubmit, setMaxBalance } = useSwapForm( isVaraNetwork, balance, - config.fee.value, + fee.value, disabled, onSubmit, ); - const renderFromBalance = () => - symbol.value && ( - - ); + const renderFromBalance = () => ( + + ); return ( @@ -81,7 +79,7 @@ function SwapForm({ networkIndex, disabled, useHandleSubmit, useBalance, renderS diff --git a/frontend/src/features/swap/consts/index.ts b/frontend/src/features/swap/consts/index.ts index a2343fea..31012e64 100644 --- a/frontend/src/features/swap/consts/index.ts +++ b/frontend/src/features/swap/consts/index.ts @@ -6,6 +6,7 @@ import { FIELD_NAME, DEFAULT_VALUES, ADDRESS_SCHEMA, ERROR_MESSAGE } from './for import { BridgingPaymentProgram, VftGatewayProgram, VftProgram } from './sails'; const BRIDGING_PAYMENT_CONTRACT_ADDRESS = import.meta.env.VITE_BRIDGING_PAYMENT_CONTRACT_ADDRESS as HexString; +const ERC20_TREASURY_CONTRACT_ADDRESS = import.meta.env.VITE_ERC20_TREASURY_CONTRACT_ADDRESS as HexString; const NETWORK_INDEX = { VARA: 0, @@ -16,6 +17,7 @@ const BALANCE_REFETCH_INTERVAL = 10000; export { BRIDGING_PAYMENT_CONTRACT_ADDRESS, + ERC20_TREASURY_CONTRACT_ADDRESS, ERC20_TREASURY_ABI, FUNGIBLE_TOKEN_ABI, FIELD_NAME, diff --git a/frontend/src/features/swap/hooks/eth/index.ts b/frontend/src/features/swap/hooks/eth/index.ts index a6e6dc7b..eef73b5c 100644 --- a/frontend/src/features/swap/hooks/eth/index.ts +++ b/frontend/src/features/swap/hooks/eth/index.ts @@ -1,4 +1,4 @@ -import { useEthBalance } from './use-eth-balance'; +import { useFungibleTokenBalance } from './use-fungible-token-balance'; import { useHandleEthSubmit } from './use-handle-eth-submit'; -export { useEthBalance, useHandleEthSubmit }; +export { useFungibleTokenBalance, useHandleEthSubmit }; diff --git a/frontend/src/features/swap/hooks/eth/use-approve.ts b/frontend/src/features/swap/hooks/eth/use-approve.ts index a7d471f4..66501b2a 100644 --- a/frontend/src/features/swap/hooks/eth/use-approve.ts +++ b/frontend/src/features/swap/hooks/eth/use-approve.ts @@ -6,7 +6,7 @@ import { watchContractEvent } from 'wagmi/actions'; import { useEthAccount, useLoading } from '@/hooks'; import { logger } from '@/utils'; -import { FUNGIBLE_TOKEN_ABI, FUNCTION_NAME, EVENT_NAME } from '../../consts'; +import { FUNGIBLE_TOKEN_ABI, FUNCTION_NAME, EVENT_NAME, ERC20_TREASURY_CONTRACT_ADDRESS } from '../../consts'; function useApprove(address: HexString | undefined) { const alert = useAlert(); @@ -24,9 +24,9 @@ function useApprove(address: HexString | undefined) { alert.error(message); }; - const watch = (bridgeAddress: HexString, amount: bigint, onSuccess: () => void) => { + const watch = (amount: bigint, onSuccess: () => void) => { const owner = ethAccount.address; - const spender = bridgeAddress; + const spender = ERC20_TREASURY_CONTRACT_ADDRESS; // maybe better to use waitForTransactionReceipt, // but feels like it's getting fired before approval in contract @@ -53,21 +53,25 @@ function useApprove(address: HexString | undefined) { }); }; - const write = (bridgeAddress: HexString, amount: bigint, onSuccess: () => void) => { + const write = (amount: bigint, onSuccess: () => void) => { if (!address) throw new Error('Fungible token address is not defined'); enablePending(); - logger.info(FUNCTION_NAME.FUNGIBLE_TOKEN_APPROVE, `\naddress: ${address}\nargs: [${bridgeAddress}, ${amount}]`); + + logger.info( + FUNCTION_NAME.FUNGIBLE_TOKEN_APPROVE, + `\naddress: ${address}\nargs: [${ERC20_TREASURY_CONTRACT_ADDRESS}, ${amount}]`, + ); writeContract( { address, abi, functionName: FUNCTION_NAME.FUNGIBLE_TOKEN_APPROVE, - args: [bridgeAddress, amount], + args: [ERC20_TREASURY_CONTRACT_ADDRESS, amount], }, { - onSuccess: () => watch(bridgeAddress, amount, onSuccess), + onSuccess: () => watch(amount, onSuccess), onError: (error) => handleError((error as BaseError).shortMessage || error.message), }, ); diff --git a/frontend/src/features/swap/hooks/eth/use-eth-account-balance.ts b/frontend/src/features/swap/hooks/eth/use-eth-account-balance.ts deleted file mode 100644 index 3875a1c4..00000000 --- a/frontend/src/features/swap/hooks/eth/use-eth-account-balance.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { formatEther } from 'viem'; -import { useBalance } from 'wagmi'; - -import { useEthAccount } from '@/hooks'; - -const withPrecision = (value: string) => { - // simplest solution without rounding for now - const digitsCount = 3; - - return value.slice(0, value.indexOf('.') + digitsCount + 1); -}; - -function useEthAccountBalance(isEnabled: boolean) { - const ethAccount = useEthAccount(); - - const { data, isPending } = useBalance({ - address: ethAccount?.address, - query: { enabled: isEnabled }, - }); - - const { decimals, value } = data || {}; - - const formattedValue = data ? withPrecision(formatEther(data.value)) : undefined; - const isLoading = isPending; - - return { value, formattedValue, decimals, isLoading }; -} - -export { useEthAccountBalance }; diff --git a/frontend/src/features/swap/hooks/eth/use-eth-balance.ts b/frontend/src/features/swap/hooks/eth/use-eth-balance.ts deleted file mode 100644 index 11e278b6..00000000 --- a/frontend/src/features/swap/hooks/eth/use-eth-balance.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { HexString } from '@gear-js/api'; - -import { useEthAccountBalance } from './use-eth-account-balance'; -import { useFungibleTokenBalance } from './use-fungible-token-balance'; - -function useEthBalance(ftAddress: HexString | undefined, isLoading: boolean) { - const accountBalance = useEthAccountBalance(!isLoading && !ftAddress); - const fungibleTokenBalance = useFungibleTokenBalance(ftAddress); - - return ftAddress ? fungibleTokenBalance : accountBalance; -} - -export { useEthBalance }; diff --git a/frontend/src/features/swap/hooks/eth/use-handle-eth-submit.ts b/frontend/src/features/swap/hooks/eth/use-handle-eth-submit.ts index 3021f432..81c40e52 100644 --- a/frontend/src/features/swap/hooks/eth/use-handle-eth-submit.ts +++ b/frontend/src/features/swap/hooks/eth/use-handle-eth-submit.ts @@ -2,35 +2,36 @@ import { HexString } from '@gear-js/api'; import { useAlert } from '@gear-js/react-hooks'; import { BaseError } from 'viem'; import { useWriteContract } from 'wagmi'; +import { WriteContractErrorType } from 'wagmi/actions'; import { logger } from '@/utils'; -import { FUNCTION_NAME, ERC20_TREASURY_ABI } from '../../consts'; +import { FUNCTION_NAME, ERC20_TREASURY_ABI, ERC20_TREASURY_CONTRACT_ADDRESS } from '../../consts'; import { FormattedValues } from '../../types'; import { useApprove } from './use-approve'; -function useHandleEthSubmit(bridgeAddress: HexString | undefined, ftAddress: HexString | undefined) { +function useHandleEthSubmit(ftAddress: HexString | undefined) { const alert = useAlert(); const { writeContract, isPending } = useWriteContract(); const approve = useApprove(ftAddress); - const onSubmit = ({ amount: _amount, expectedAmount, accountAddress }: FormattedValues, onSuccess: () => void) => { - if (!ftAddress || !bridgeAddress) throw new Error('Bridge address is not defined'); + const onError = (error: WriteContractErrorType) => { + const errorMessage = (error as BaseError).shortMessage || error.message; - const fee = { value: BigInt(0) }; + logger.error(FUNCTION_NAME.DEPOSIT, error); + alert.error(errorMessage); + }; - const address = bridgeAddress; - const amount = expectedAmount; + const onSubmit = ({ amount, accountAddress }: FormattedValues, onSuccess: () => void) => { + if (!ftAddress) throw new Error('Fungible token address is not defined'); - const isNativeToken = !ftAddress; - const value = isNativeToken ? _amount + fee.value : fee.value; + const address = ERC20_TREASURY_CONTRACT_ADDRESS; - const transit = () => { + const deposit = () => { logger.info( FUNCTION_NAME.DEPOSIT, - `\naddress: ${address}\nargs: [\nfee: ${fee.value}\namount: ${amount}]` + - `\nvalue: ${value}\nisNativeToken: ${isNativeToken}`, + `\naddress: ${address}\nargs: [ftAddress: ${ftAddress}, amount: ${amount}, accountAddress: ${accountAddress}]`, ); writeContract( @@ -38,22 +39,13 @@ function useHandleEthSubmit(bridgeAddress: HexString | undefined, ftAddress: Hex abi: ERC20_TREASURY_ABI, address, functionName: FUNCTION_NAME.DEPOSIT, - args: [ftAddress, amount, accountAddress], }, - { - onSuccess, - onError: (error) => { - const errorMessage = (error as BaseError).shortMessage || error.message; - - logger.error(FUNCTION_NAME.DEPOSIT, error); - alert.error(errorMessage); - }, - }, + { onSuccess, onError }, ); }; - return isNativeToken ? transit() : approve.write(address, amount, transit); + approve.write(amount, deposit); }; const isSubmitting = approve.isPending || isPending; diff --git a/frontend/src/features/swap/hooks/index.ts b/frontend/src/features/swap/hooks/index.ts index b59c0f11..e44f7292 100644 --- a/frontend/src/features/swap/hooks/index.ts +++ b/frontend/src/features/swap/hooks/index.ts @@ -1,7 +1,7 @@ -import { useEthBalance, useHandleEthSubmit } from './eth'; +import { useFungibleTokenBalance as useEthBalance, useHandleEthSubmit } from './eth'; import { useBridge } from './use-bridge'; import { useSwapForm } from './use-swap-form'; -import { useVaraConfig, useVaraBalance, useHandleVaraSubmit } from './vara'; +import { useVaraConfig, useFungibleTokenBalance as useVaraBalance, useHandleVaraSubmit } from './vara'; export { useEthBalance, diff --git a/frontend/src/features/swap/hooks/use-swap-form.ts b/frontend/src/features/swap/hooks/use-swap-form.ts index 78695c5e..47fead69 100644 --- a/frontend/src/features/swap/hooks/use-swap-form.ts +++ b/frontend/src/features/swap/hooks/use-swap-form.ts @@ -2,11 +2,8 @@ import { useAlert } from '@gear-js/react-hooks'; import { zodResolver } from '@hookform/resolvers/zod'; import { useEffect } from 'react'; import { useForm } from 'react-hook-form'; -import { formatUnits, parseUnits } from 'viem'; import { z } from 'zod'; -import { isUndefined } from '@/utils'; - import { FIELD_NAME, DEFAULT_VALUES, ADDRESS_SCHEMA } from '../consts'; import { FormattedValues } from '../types'; import { getAmountSchema } from '../utils'; @@ -23,13 +20,10 @@ function useSwapForm( disabled: boolean, onSubmit: (values: FormattedValues, reset: () => void) => void, ) { - const { decimals } = balance; - const alert = useAlert(); - const valueSchema = getAmountSchema(balance.value, fee, decimals); - const expectedValueSchema = getAmountSchema(balance.value, BigInt(0), decimals); - + const valueSchema = getAmountSchema(balance.value, fee, balance.decimals); + const expectedValueSchema = getAmountSchema(balance.value, BigInt(0), balance.decimals); const addressSchema = isVaraNetwork ? ADDRESS_SCHEMA.ETH : ADDRESS_SCHEMA.VARA; const schema = z.object({ @@ -49,19 +43,8 @@ function useSwapForm( const setOriginalValue = (value: string) => setValue(FIELD_NAME.VALUE, value, { shouldValidate }); const setExpectedValue = (value: string) => setValue(FIELD_NAME.EXPECTED_VALUE, value, { shouldValidate }); - const getValueWithFee = (value: string, operator: '+' | '-' = '+') => { - if (isUndefined(fee)) throw new Error('Fee is not defined'); - if (isUndefined(decimals)) throw new Error('Decimals is not defined'); - if (!value) return value; - - const chainValue = parseUnits(value, decimals); - const valueWithFee = operator === '+' ? chainValue + fee : chainValue - fee; - - return valueWithFee < 0 ? '0' : formatUnits(valueWithFee, decimals); - }; - - const onValueChange = (value: string) => setExpectedValue(getValueWithFee(value, '-')); - const onExpectedValueChange = (value: string) => setOriginalValue(getValueWithFee(value)); + const onValueChange = (value: string) => setExpectedValue(value); + const onExpectedValueChange = (value: string) => setOriginalValue(value); const handleSubmit = form.handleSubmit((values) => { const onSuccess = () => { diff --git a/frontend/src/features/swap/hooks/vara/index.ts b/frontend/src/features/swap/hooks/vara/index.ts index 4a87fc51..2e304e95 100644 --- a/frontend/src/features/swap/hooks/vara/index.ts +++ b/frontend/src/features/swap/hooks/vara/index.ts @@ -1,6 +1,5 @@ +import { useFungibleTokenBalance } from './use-fungible-token-balance'; import { useHandleVaraSubmit } from './use-handle-vara-submit'; -import { useSails } from './use-sails'; -import { useVaraBalance } from './use-vara-balance'; import { useVaraConfig } from './use-vara-config'; -export { useVaraConfig, useVaraBalance, useHandleVaraSubmit, useSails }; +export { useVaraConfig, useFungibleTokenBalance, useHandleVaraSubmit }; diff --git a/frontend/src/features/swap/hooks/vara/use-derive-balances-all.ts b/frontend/src/features/swap/hooks/vara/use-derive-balances-all.ts deleted file mode 100644 index 2cbd97c6..00000000 --- a/frontend/src/features/swap/hooks/vara/use-derive-balances-all.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { useApi } from '@gear-js/react-hooks'; -import { useQuery } from '@tanstack/react-query'; - -import { BALANCE_REFETCH_INTERVAL } from '../../consts'; - -function useDeriveBalancesAll(accountAddress: string | undefined) { - const { api, isApiReady } = useApi(); - - const isEnabled = isApiReady && !!accountAddress; - - return useQuery({ - queryKey: ['deriveBalancesAll', isApiReady, accountAddress], - queryFn: () => (isEnabled ? api.derive.balances.all(accountAddress) : null), - enabled: isEnabled, - refetchInterval: BALANCE_REFETCH_INTERVAL, - }); -} - -export { useDeriveBalancesAll }; diff --git a/frontend/src/features/swap/hooks/vara/use-extrinsic-failed-message.ts b/frontend/src/features/swap/hooks/vara/use-extrinsic-failed-message.ts deleted file mode 100644 index 1b341ffc..00000000 --- a/frontend/src/features/swap/hooks/vara/use-extrinsic-failed-message.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { useApi } from '@gear-js/react-hooks'; -import { Event } from '@polkadot/types/interfaces'; - -function useExtrinsicFailedMessage() { - const { api, isApiReady } = useApi(); - - const getExtrinsicFailedMessage = (event: Event) => { - if (!isApiReady) throw new Error('API is not initialized'); - - const { docs, method } = api.getExtrinsicFailedError(event); - - return `${method}: ${docs}`; - }; - - return getExtrinsicFailedMessage; -} - -export { useExtrinsicFailedMessage }; diff --git a/frontend/src/features/swap/hooks/vara/use-handle-vara-submit.ts b/frontend/src/features/swap/hooks/vara/use-handle-vara-submit.ts index db22000b..8b2a01ad 100644 --- a/frontend/src/features/swap/hooks/vara/use-handle-vara-submit.ts +++ b/frontend/src/features/swap/hooks/vara/use-handle-vara-submit.ts @@ -1,42 +1,72 @@ import { HexString } from '@gear-js/api'; +import { useAlert, useProgram, useSendProgramTransaction } from '@gear-js/react-hooks'; import { isUndefined, logger } from '@/utils'; +import { BRIDGING_PAYMENT_CONTRACT_ADDRESS, BridgingPaymentProgram, VftProgram } from '../../consts'; import { FormattedValues } from '../../types'; -import { useSails } from './use-sails'; -import { useSendMessage } from './use-send-message'; +function useSendBridgingPaymentRequest() { + const { data: program } = useProgram({ + library: BridgingPaymentProgram, + id: BRIDGING_PAYMENT_CONTRACT_ADDRESS, + }); -function useHandleVaraSubmit(address: HexString | undefined, ftAddress: HexString | undefined) { - const isNativeToken = !ftAddress; + return useSendProgramTransaction({ + program, + serviceName: 'bridgingPayment', + functionName: 'requestToGateway', + }); +} - // For fungble token contracts gas calculation does not work cuz contracts check the amount of gas applied - const gasLimit = isNativeToken ? undefined : BigInt(100_000_000_000); - const { sendMessage, isPending } = useSendMessage(gasLimit); - const sails = useSails('./test.ts'); +function useSendVftApprove(ftAddress: HexString | undefined) { + const { data: program } = useProgram({ + library: VftProgram, + id: ftAddress, + query: { enabled: Boolean(ftAddress) }, + }); - const onSubmit = ({ amount: _amount, expectedAmount, accountAddress }: FormattedValues, onSuccess: () => void) => { - if (isUndefined(sails)) throw new Error('Sails is not defined'); + return useSendProgramTransaction({ + program, + serviceName: 'vft', + functionName: 'approve', + }); +} - const fee = { value: BigInt(0) }; +function useHandleVaraSubmit(ftAddress: HexString | undefined, feeValue: bigint | undefined) { + const alert = useAlert(); - const amount = expectedAmount; - const recipient = accountAddress; + const bridgingPaymentRequest = useSendBridgingPaymentRequest(); + const vftApprove = useSendVftApprove(ftAddress); - const value = isNativeToken ? _amount + fee.value : fee.value; + const onSubmit = async ({ amount, accountAddress }: FormattedValues, onSuccess: () => void) => { + if (isUndefined(feeValue)) throw new Error('Fee is not found'); + if (!ftAddress) throw new Error('Fungible token address is not found'); + + const recipient = accountAddress; + const value = feeValue; logger.info( 'TransitVaraToEth', - `\nprogramId:${address}\namount: ${amount}\nrecipient: ${recipient}\nvalue: ${value}\nisNativeToken: ${isNativeToken}\nfee: ${fee.value}`, + `\nprogramId:${ftAddress}\namount: ${amount}\nrecipient: ${recipient}\nvalue: ${value}\nfee: ${feeValue}`, ); - const { TransitVaraToEth } = sails.services.VaraBridge.functions; - const transaction = TransitVaraToEth(fee.value, recipient, amount); + try { + await vftApprove.sendTransactionAsync({ args: [BRIDGING_PAYMENT_CONTRACT_ADDRESS, amount] }); + + await bridgingPaymentRequest.sendTransactionAsync({ + args: [amount, recipient, ftAddress], + gasLimit: BigInt(350000000000), + value, + }); - return sendMessage(transaction, value, { onSuccess }); + onSuccess(); + } catch (error) { + alert.error(error instanceof Error ? error.message : String(error)); + } }; - const isSubmitting = isPending; + const isSubmitting = bridgingPaymentRequest.isPending || vftApprove.isPending; return { onSubmit, isSubmitting }; } diff --git a/frontend/src/features/swap/hooks/vara/use-sails.ts b/frontend/src/features/swap/hooks/vara/use-sails.ts deleted file mode 100644 index 9bf51f0c..00000000 --- a/frontend/src/features/swap/hooks/vara/use-sails.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { useApi } from '@gear-js/react-hooks'; -import { useQuery } from '@tanstack/react-query'; -import { Sails } from 'sails-js'; - -function useSails(url: string | undefined) { - const { api } = useApi(); - - const getSails = async () => { - if (!url) throw new Error('IDL URL is not found'); - if (!api) throw new Error('Api is not initialized'); - - const response = await fetch(url); - const idl = await response.text(); - const sails = await Sails.new(); - sails.parseIdl(idl); - sails.setApi(api); - - return sails; - }; - - const { data } = useQuery({ - queryKey: ['sails', url], - queryFn: getSails, - enabled: Boolean(url && api), - }); - - return data; -} - -export { useSails }; diff --git a/frontend/src/features/swap/hooks/vara/use-send-message.ts b/frontend/src/features/swap/hooks/vara/use-send-message.ts deleted file mode 100644 index 04d8acb1..00000000 --- a/frontend/src/features/swap/hooks/vara/use-send-message.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { useAccount } from '@gear-js/react-hooks'; -import { TransactionBuilder } from 'sails-js'; - -import { useLoading } from '@/hooks'; -import { isUndefined } from '@/utils'; - -import { Options, useSignAndSend } from './use-sign-and-send'; - -function useSendMessage(gasLimit?: bigint) { - const { account } = useAccount(); - const [isLoading, enableLoading, disableLoading] = useLoading(); - const signAndSend = useSignAndSend(); - - return { - sendMessage: async (transaction: TransactionBuilder, value: bigint, args: Partial) => { - if (isUndefined(account)) throw new Error('Account is not defined'); - enableLoading(); - - const { signer } = account; - transaction.withAccount(account.address, { signer }); - await transaction.withValue(value); - - if (gasLimit) { - await transaction.withGas(gasLimit); - } else { - await transaction.calculateGas(); - } - const { extrinsic } = transaction; - - const onSuccess = () => { - args.onSuccess?.(); - disableLoading(); - }; - - const onError = () => { - args.onError?.(); - disableLoading(); - }; - - const onFinally = () => { - disableLoading(); - }; - - signAndSend(extrinsic, { ...args, onSuccess, onError, onFinally }); - }, - - isPending: isLoading, - }; -} - -export { useSendMessage }; diff --git a/frontend/src/features/swap/hooks/vara/use-sign-and-send.tsx b/frontend/src/features/swap/hooks/vara/use-sign-and-send.tsx deleted file mode 100644 index c740323f..00000000 --- a/frontend/src/features/swap/hooks/vara/use-sign-and-send.tsx +++ /dev/null @@ -1,110 +0,0 @@ -import { - DEFAULT_ERROR_OPTIONS, - DEFAULT_SUCCESS_OPTIONS, - DefaultTemplateOptions, - useAccount, - useAlert, -} from '@gear-js/react-hooks'; -import { SubmittableExtrinsic } from '@polkadot/api/types'; -import { Event } from '@polkadot/types/interfaces'; -import { ISubmittableResult } from '@polkadot/types/types'; -import { ReactNode } from 'react'; - -import { useExtrinsicFailedMessage } from './use-extrinsic-failed-message'; - -type Extrinsic = SubmittableExtrinsic<'promise', ISubmittableResult>; - -type Options = { - successAlert: ReactNode; - onSuccess: () => void; - onError: () => void; - onFinally: () => void; - onFinalized: (value: ISubmittableResult) => void; -}; - -const DEFAULT_OPTIONS = { - successAlert: 'Success', - onSuccess: () => {}, - onError: () => {}, - onFinally: () => {}, - onFinalized: () => {}, -} as const; - -function useSignAndSend() { - const { account } = useAccount(); - const alert = useAlert(); - const getExtrinsicFailedMessage = useExtrinsicFailedMessage(); - - const handleEvent = (event: Event, method: string, options: Options) => { - const { successAlert, onSuccess, onError, onFinally } = options; - const alertOptions = { title: `${event.section}.${event.method}` }; - - if (event.method === 'ExtrinsicFailed') { - const message = getExtrinsicFailedMessage(event); - alert.error(message, alertOptions); - - onError(); - onFinally(); - return; - } - - if (event.method === method) { - alert.success(successAlert, alertOptions); - - onSuccess(); - onFinally(); - } - }; - - const handleStatus = (result: ISubmittableResult, method: string, options: Options, alertId: string) => { - const { events, status } = result; - const { isInvalid, isReady, isInBlock, isFinalized } = status; - const { onError, onFinally, onFinalized } = options; - - if (isInvalid) { - alert.update(alertId, 'Transaction error. Status: isInvalid', DEFAULT_ERROR_OPTIONS as DefaultTemplateOptions); - - onError(); - onFinally(); - return; - } - - if (isReady) return alert.update(alertId, 'Ready'); - if (isInBlock) return alert.update(alertId, 'InBlock'); - - if (isFinalized) { - alert.update(alertId, 'Finalized', DEFAULT_SUCCESS_OPTIONS as DefaultTemplateOptions); - - onFinalized(result); - - events.forEach(({ event }) => handleEvent(event, method, options)); - } - }; - - const signAndSend = (extrinsic: Extrinsic, options?: Partial) => { - if (!account) throw new Error('Account is not found'); - const { address, signer } = account; - - const optionsWithDefaults = { ...DEFAULT_OPTIONS, ...options }; - const { onError, onFinally } = optionsWithDefaults; - - const alertTitle = `${extrinsic.method.section}.${extrinsic.method.method}`; - const alertId = alert.loading(`SignIn`, { title: alertTitle }); - - extrinsic - .signAndSend(address, { signer }, (result) => handleStatus(result, 'MessageQueued', optionsWithDefaults, alertId)) - .catch((error: unknown) => { - const message = error instanceof Error ? error.message : String(error); - alert.update(alertId, message, DEFAULT_ERROR_OPTIONS as DefaultTemplateOptions); - - onError(); - onFinally(); - }); - }; - - return signAndSend; -} - -export { useSignAndSend }; - -export type { Options }; diff --git a/frontend/src/features/swap/hooks/vara/use-vara-account-balance.ts b/frontend/src/features/swap/hooks/vara/use-vara-account-balance.ts deleted file mode 100644 index 5d2fe307..00000000 --- a/frontend/src/features/swap/hooks/vara/use-vara-account-balance.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { useAccount, useApi, useBalanceFormat } from '@gear-js/react-hooks'; -import { useMemo } from 'react'; - -import { useDeriveBalancesAll } from './use-derive-balances-all'; - -function useVaraAccountBalance(isEnabled: boolean) { - const { api } = useApi(); - const { account, isAccountReady } = useAccount(); - const { data, isPending } = useDeriveBalancesAll(isEnabled ? account?.address : undefined); - const { getFormattedBalance } = useBalanceFormat(); - - const { freeBalance } = data || {}; - const value = freeBalance?.toBigInt(); - const formattedValue = value !== undefined ? getFormattedBalance(value).value : undefined; - - // cuz swap vara form is rendered by default without login and we have to handle empty balance state - const isLoading = useMemo(() => { - if (!isAccountReady) return true; - if (!account) return false; - - return isPending; - }, [account, isAccountReady, isPending]); - - const [decimals] = api?.registry.chainDecimals || [undefined]; - - return { value, formattedValue, decimals, isLoading }; -} - -export { useVaraAccountBalance }; diff --git a/frontend/src/features/swap/hooks/vara/use-vara-balance.ts b/frontend/src/features/swap/hooks/vara/use-vara-balance.ts deleted file mode 100644 index 0ee2c571..00000000 --- a/frontend/src/features/swap/hooks/vara/use-vara-balance.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { HexString } from '@gear-js/api'; - -import { useFungibleTokenBalance } from './use-fungible-token-balance'; -import { useVaraAccountBalance } from './use-vara-account-balance'; - -function useVaraBalance(ftAddress: HexString | undefined, isLoading: boolean) { - const accountBalance = useVaraAccountBalance(!isLoading && !ftAddress); - const fungibleTokenBalance = useFungibleTokenBalance(ftAddress); - - return ftAddress ? fungibleTokenBalance : accountBalance; -} - -export { useVaraBalance }; diff --git a/frontend/src/features/swap/types/hooks.ts b/frontend/src/features/swap/types/hooks.ts index e39f8159..f5b8469b 100644 --- a/frontend/src/features/swap/types/hooks.ts +++ b/frontend/src/features/swap/types/hooks.ts @@ -7,17 +7,14 @@ type BalanceValues = { formattedValue: string | undefined; }; -type UseBalance = ( - ftAddress: HexString | undefined, - isLoading: boolean, -) => BalanceValues & { +type UseBalance = (ftAddress: HexString | undefined) => BalanceValues & { decimals: number | undefined; isLoading: boolean; }; type UseHandleSubmit = ( - address: HexString | undefined, ftAddress: HexString | undefined, + feeValue?: bigint | undefined, ) => { onSubmit: (values: FormattedValues, reset: () => void) => void; isSubmitting: boolean; diff --git a/frontend/src/features/swap/utils.ts b/frontend/src/features/swap/utils.ts index 34644501..3d10ccd7 100644 --- a/frontend/src/features/swap/utils.ts +++ b/frontend/src/features/swap/utils.ts @@ -16,7 +16,7 @@ const getAmountSchema = ( .string() .trim() // TODO: required field check .transform((value) => parseUnits(value, decimals)) // if fraction is > decimals, value will be rounded - .refine((value) => value <= balanceValue, { message: ERROR_MESSAGE.NO_BALANCE }); + .refine((value) => value + feeValue <= balanceValue, { message: ERROR_MESSAGE.NO_BALANCE }); }; export { getAmountSchema }; From 2c6b20bdf41c699bd88b65cc737b2ed904ab763c Mon Sep 17 00:00:00 2001 From: Nikita Yutanov Date: Tue, 3 Sep 2024 02:03:13 +0300 Subject: [PATCH 14/38] Optimize state reading --- .../swap/components/swap-form/swap-form.tsx | 6 +- frontend/src/features/swap/consts/index.ts | 3 + frontend/src/features/swap/consts/vara.ts | 15 +++ .../src/features/swap/hooks/use-bridge.ts | 120 ++---------------- .../src/features/swap/hooks/use-ft-symbols.ts | 40 ++++++ .../src/features/swap/hooks/vara/index.ts | 3 +- .../swap/hooks/vara/use-ft-addresses.ts | 38 ++++++ .../hooks/vara/use-fungible-token-balance.ts | 13 +- .../swap/hooks/vara/use-vara-config.ts | 6 +- frontend/src/features/swap/utils.ts | 18 ++- 10 files changed, 138 insertions(+), 124 deletions(-) create mode 100644 frontend/src/features/swap/consts/vara.ts create mode 100644 frontend/src/features/swap/hooks/use-ft-symbols.ts create mode 100644 frontend/src/features/swap/hooks/vara/use-ft-addresses.ts diff --git a/frontend/src/features/swap/components/swap-form/swap-form.tsx b/frontend/src/features/swap/components/swap-form/swap-form.tsx index 29f33d42..05b0d1ee 100644 --- a/frontend/src/features/swap/components/swap-form/swap-form.tsx +++ b/frontend/src/features/swap/components/swap-form/swap-form.tsx @@ -25,7 +25,7 @@ function SwapForm({ networkIndex, disabled, useHandleSubmit, useBalance, renderS const FromNetwork = isVaraNetwork ? Network.Vara : Network.Eth; const ToNetwork = isVaraNetwork ? Network.Eth : Network.Vara; - const { address, options, symbol, pair, ...bridge } = useBridge(networkIndex); + const { address, options, symbol, pair, nativeSymbol, ...bridge } = useBridge(networkIndex); const { fee, ...config } = useVaraConfig(isVaraNetwork); const balance = useBalance(address); const { onSubmit, isSubmitting } = useHandleSubmit(address, fee.value); @@ -41,7 +41,7 @@ function SwapForm({ networkIndex, disabled, useHandleSubmit, useBalance, renderS const renderFromBalance = () => ( @@ -81,7 +81,7 @@ function SwapForm({ networkIndex, disabled, useHandleSubmit, useBalance, renderS heading="Expected Fee" value={fee.formattedValue} isLoading={config.isLoading} - unit={symbol.native} + unit={nativeSymbol} />
    - symbols && decimals && - } + renderItem={(transaction) => } fetchMore={fetchNextPage} skeleton={{ rowsCount: TRANSACTIONS_LIMIT, From cd7b6be9940f45edc74a593e209b53a750c41e1f Mon Sep 17 00:00:00 2001 From: Nikita Yutanov Date: Wed, 20 Nov 2024 00:20:33 +0300 Subject: [PATCH 30/38] add transaction card block explorer link --- .../transaction-card/transaction-card.module.scss | 7 ++++++- .../components/transaction-card/transaction-card.tsx | 12 +++++++++--- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/frontend/src/features/history/components/transaction-card/transaction-card.module.scss b/frontend/src/features/history/components/transaction-card/transaction-card.module.scss index 17662579..e76ef37b 100644 --- a/frontend/src/features/history/components/transaction-card/transaction-card.module.scss +++ b/frontend/src/features/history/components/transaction-card/transaction-card.module.scss @@ -29,7 +29,12 @@ font-size: 16px; line-height: 150%; - span { + a { text-decoration: underline; + transition: 0.25s color; + + &:hover { + color: #13bc9d; + } } } diff --git a/frontend/src/features/history/components/transaction-card/transaction-card.tsx b/frontend/src/features/history/components/transaction-card/transaction-card.tsx index 47125443..fbbeaf6f 100644 --- a/frontend/src/features/history/components/transaction-card/transaction-card.tsx +++ b/frontend/src/features/history/components/transaction-card/transaction-card.tsx @@ -1,8 +1,8 @@ import { HexString } from '@gear-js/api'; -import { Card, CopyButton, Skeleton, TruncatedText } from '@/components'; +import { Card, CopyButton, Skeleton } from '@/components'; -import { Transfer } from '../../types'; +import { Network, Transfer } from '../../types'; import { TransactionDate } from '../transaction-date'; import { TransactionPair } from '../transaction-pair'; import { TransactionStatus } from '../transaction-status'; @@ -27,12 +27,18 @@ type Props = Pick< }; function TransactionCard({ status, timestamp, blockNumber, ...props }: Props) { + const explorerUrl = + props.sourceNetwork === Network.Gear ? 'https://vara.subscan.io/block' : 'https://etherscan.io/block'; + return (

    - + + {blockNumber} + +

    From 5a3ca3ffc5500c2471776c9f25d242b9bb6e970f Mon Sep 17 00:00:00 2001 From: Nikita Yutanov Date: Wed, 20 Nov 2024 17:20:50 +0300 Subject: [PATCH 31/38] await eth bridging request result --- .../swap/hooks/eth/use-handle-eth-submit.ts | 24 +++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/frontend/src/features/swap/hooks/eth/use-handle-eth-submit.ts b/frontend/src/features/swap/hooks/eth/use-handle-eth-submit.ts index 7d948fe7..edf1456e 100644 --- a/frontend/src/features/swap/hooks/eth/use-handle-eth-submit.ts +++ b/frontend/src/features/swap/hooks/eth/use-handle-eth-submit.ts @@ -1,6 +1,7 @@ import { HexString } from '@gear-js/api'; import { useMutation } from '@tanstack/react-query'; -import { useWriteContract } from 'wagmi'; +import { useConfig, useWriteContract } from 'wagmi'; +import { watchContractEvent } from 'wagmi/actions'; import { isUndefined } from '@/utils'; @@ -16,6 +17,7 @@ function useHandleEthSubmit( ) { const { writeContractAsync } = useWriteContract(); const approve = useApprove(ftAddress); + const config = useConfig(); const requestBridging = (amount: bigint, accountAddress: HexString) => { if (!ftAddress) throw new Error('Fungible token address is not defined'); @@ -30,6 +32,24 @@ function useHandleEthSubmit( }); }; + const watch = () => + new Promise((resolve, reject) => { + const onError = (error: Error) => { + unwatch(); + reject(error); + }; + + const onLogs = () => { + unwatch(); + resolve(); + }; + + const address = ETH_BRIDGING_PAYMENT_CONTRACT_ADDRESS; + const abi = BRIDGING_PAYMENT_ABI; + + const unwatch = watchContractEvent(config, { address, abi, eventName: 'FeePaid', onLogs, onError }); + }); + const onSubmit = async ({ amount, accountAddress }: FormattedValues) => { if (isUndefined(allowance.data)) throw new Error('Allowance is not defined'); @@ -38,7 +58,7 @@ function useHandleEthSubmit( await allowance.refetch(); // TODO: replace with queryClient.setQueryData after @gear-js/react-hooks update to return QueryKey } - return requestBridging(amount, accountAddress); + return requestBridging(amount, accountAddress).then(() => watch()); }; const submit = useMutation({ mutationFn: onSubmit }); From bc7aba0a68e7cef78e6c28b1cb33c659af61dfa0 Mon Sep 17 00:00:00 2001 From: Nikita Yutanov Date: Wed, 20 Nov 2024 17:28:50 +0300 Subject: [PATCH 32/38] fix allowance refetch on successful bridge request --- frontend/src/features/swap/consts/index.ts | 2 ++ frontend/src/features/swap/hooks/eth/use-eth-ft-allowance.ts | 3 +++ frontend/src/features/swap/hooks/eth/use-handle-eth-submit.ts | 4 +++- .../src/features/swap/hooks/vara/use-handle-vara-submit.ts | 2 +- .../src/features/swap/hooks/vara/use-vara-ft-allowance.ts | 4 +++- 5 files changed, 12 insertions(+), 3 deletions(-) diff --git a/frontend/src/features/swap/consts/index.ts b/frontend/src/features/swap/consts/index.ts index cb382466..107eb45e 100644 --- a/frontend/src/features/swap/consts/index.ts +++ b/frontend/src/features/swap/consts/index.ts @@ -10,6 +10,7 @@ const NETWORK_INDEX = { }; const BALANCE_REFETCH_INTERVAL = 10000; +const ALLOWANCE_REFETCH_INTERVAL = BALANCE_REFETCH_INTERVAL; export { ETH_BRIDGING_PAYMENT_CONTRACT_ADDRESS, @@ -20,6 +21,7 @@ export { EVENT_NAME, ERROR_MESSAGE, BALANCE_REFETCH_INTERVAL, + ALLOWANCE_REFETCH_INTERVAL, NETWORK_INDEX, SERVICE_NAME, QUERY_NAME, diff --git a/frontend/src/features/swap/hooks/eth/use-eth-ft-allowance.ts b/frontend/src/features/swap/hooks/eth/use-eth-ft-allowance.ts index 2894f854..9a80d41c 100644 --- a/frontend/src/features/swap/hooks/eth/use-eth-ft-allowance.ts +++ b/frontend/src/features/swap/hooks/eth/use-eth-ft-allowance.ts @@ -4,6 +4,8 @@ import { useReadContract } from 'wagmi'; import { FUNGIBLE_TOKEN_ABI } from '@/consts'; import { useEthAccount } from '@/hooks'; +import { ALLOWANCE_REFETCH_INTERVAL } from '../../consts'; + import { useERC20ManagerAddress } from './use-erc20-manager-address'; function useEthFTAllowance(address: HexString | undefined) { @@ -15,6 +17,7 @@ function useEthFTAllowance(address: HexString | undefined) { abi: FUNGIBLE_TOKEN_ABI, functionName: 'allowance', args: ethAccount.address && erc20ManagerAddress ? [ethAccount.address, erc20ManagerAddress] : undefined, + query: { refetchInterval: ALLOWANCE_REFETCH_INTERVAL }, }); } diff --git a/frontend/src/features/swap/hooks/eth/use-handle-eth-submit.ts b/frontend/src/features/swap/hooks/eth/use-handle-eth-submit.ts index edf1456e..c4362c9b 100644 --- a/frontend/src/features/swap/hooks/eth/use-handle-eth-submit.ts +++ b/frontend/src/features/swap/hooks/eth/use-handle-eth-submit.ts @@ -58,7 +58,9 @@ function useHandleEthSubmit( await allowance.refetch(); // TODO: replace with queryClient.setQueryData after @gear-js/react-hooks update to return QueryKey } - return requestBridging(amount, accountAddress).then(() => watch()); + return requestBridging(amount, accountAddress) + .then(() => watch()) + .then(() => allowance.refetch()); }; const submit = useMutation({ mutationFn: onSubmit }); diff --git a/frontend/src/features/swap/hooks/vara/use-handle-vara-submit.ts b/frontend/src/features/swap/hooks/vara/use-handle-vara-submit.ts index 30c71516..bae6159a 100644 --- a/frontend/src/features/swap/hooks/vara/use-handle-vara-submit.ts +++ b/frontend/src/features/swap/hooks/vara/use-handle-vara-submit.ts @@ -61,7 +61,7 @@ function useHandleVaraSubmit( await allowance.refetch(); // TODO: replace with queryClient.setQueryData after @gear-js/react-hooks update to return QueryKey } - return sendBridgingPaymentRequest(amount, accountAddress); + return sendBridgingPaymentRequest(amount, accountAddress).then(() => allowance.refetch()); }; const submit = useMutation({ mutationFn: onSubmit }); diff --git a/frontend/src/features/swap/hooks/vara/use-vara-ft-allowance.ts b/frontend/src/features/swap/hooks/vara/use-vara-ft-allowance.ts index cea182f5..c622edac 100644 --- a/frontend/src/features/swap/hooks/vara/use-vara-ft-allowance.ts +++ b/frontend/src/features/swap/hooks/vara/use-vara-ft-allowance.ts @@ -3,6 +3,8 @@ import { useAccount, useProgram, useProgramQuery } from '@gear-js/react-hooks'; import { BRIDGING_PAYMENT_CONTRACT_ADDRESS, VftProgram } from '@/consts'; +import { ALLOWANCE_REFETCH_INTERVAL } from '../../consts'; + function useVaraFTAllowance(address: HexString | undefined) { const { account } = useAccount(); @@ -17,7 +19,7 @@ function useVaraFTAllowance(address: HexString | undefined) { functionName: 'allowance', // TODO: remove assertion after @gear-js/react-hooks update to support empty args args: [account?.decodedAddress as HexString, BRIDGING_PAYMENT_CONTRACT_ADDRESS], - query: { enabled: Boolean(account) }, + query: { enabled: Boolean(account), refetchInterval: ALLOWANCE_REFETCH_INTERVAL }, }); } From fb0b78665e58af1287e2b7cf8e4dda59da67f8df Mon Sep 17 00:00:00 2001 From: Nikita Yutanov Date: Wed, 20 Nov 2024 17:54:26 +0300 Subject: [PATCH 33/38] remove redudant decimals query --- .../swap/components/swap-form/swap-form.tsx | 7 +++--- .../swap/hooks/eth/use-eth-ft-balance.ts | 25 ++++++------------- .../src/features/swap/hooks/use-bridge.ts | 5 ++-- .../src/features/swap/hooks/use-swap-form.ts | 7 +++--- .../swap/hooks/vara/use-vara-ft-balance.ts | 18 ++++--------- frontend/src/features/swap/types/hooks.ts | 6 +++-- 6 files changed, 28 insertions(+), 40 deletions(-) diff --git a/frontend/src/features/swap/components/swap-form/swap-form.tsx b/frontend/src/features/swap/components/swap-form/swap-form.tsx index 1f36afbf..e1dcbf15 100644 --- a/frontend/src/features/swap/components/swap-form/swap-form.tsx +++ b/frontend/src/features/swap/components/swap-form/swap-form.tsx @@ -38,10 +38,10 @@ function SwapForm({ const FromNetwork = isVaraNetwork ? Network.Vara : Network.Eth; const ToNetwork = isVaraNetwork ? Network.Eth : Network.Vara; - const { address, options, symbol, pair, ...bridge } = useBridge(networkIndex); + const { address, options, symbol, pair, decimals, ...bridge } = useBridge(networkIndex); const { fee, ...config } = useFee(); const accountBalance = useAccountBalance(); - const ftBalance = useFTBalance(address); + const ftBalance = useFTBalance(address, decimals); const allowance = useFTAllowance(address); const [{ mutateAsync: onSubmit, ...submit }, approve] = useHandleSubmit(address, fee.value, allowance); @@ -49,6 +49,7 @@ function SwapForm({ isVaraNetwork, accountBalance, ftBalance, + decimals, fee.value, disabled, onSubmit, @@ -126,7 +127,7 @@ function SwapForm({ getOptions(addresses, symbols), [addresses, symbols]); const options = { from: isVaraNetwork ? varaOptions : ethOptions, to: isVaraNetwork ? ethOptions : varaOptions }; @@ -18,8 +18,9 @@ function useBridge(networkIndex: number) { const pairIndex = Number(pair); const address = addresses?.[pairIndex][networkIndex].toString() as HexString | undefined; const symbol = address ? symbols?.[address] : undefined; + const decimals = address ? tokenDecimals?.[address] : undefined; - return { address, options, symbol, pair: { value: pair, set: setPair }, isLoading }; + return { address, options, symbol, decimals, pair: { value: pair, set: setPair }, isLoading }; } export { useBridge }; diff --git a/frontend/src/features/swap/hooks/use-swap-form.ts b/frontend/src/features/swap/hooks/use-swap-form.ts index 5520bf8c..a6cb7dd8 100644 --- a/frontend/src/features/swap/hooks/use-swap-form.ts +++ b/frontend/src/features/swap/hooks/use-swap-form.ts @@ -20,15 +20,16 @@ type Values = { function useSwapForm( isVaraNetwork: boolean, accountBalance: Values, - ftBalance: Values & { decimals: number | undefined }, + ftBalance: Values, + decimals: number | undefined, fee: bigint | undefined, disabled: boolean, onSubmit: (values: FormattedValues) => Promise, ) { const alert = useAlert(); - const valueSchema = getAmountSchema(accountBalance.value, ftBalance.value, fee, ftBalance.decimals); - const expectedValueSchema = getAmountSchema(accountBalance.value, ftBalance.value, BigInt(0), ftBalance.decimals); + const valueSchema = getAmountSchema(accountBalance.value, ftBalance.value, fee, decimals); + const expectedValueSchema = getAmountSchema(accountBalance.value, ftBalance.value, BigInt(0), decimals); const addressSchema = isVaraNetwork ? ADDRESS_SCHEMA.ETH : ADDRESS_SCHEMA.VARA; const schema = z.object({ diff --git a/frontend/src/features/swap/hooks/vara/use-vara-ft-balance.ts b/frontend/src/features/swap/hooks/vara/use-vara-ft-balance.ts index d7ad037e..a443c9bc 100644 --- a/frontend/src/features/swap/hooks/vara/use-vara-ft-balance.ts +++ b/frontend/src/features/swap/hooks/vara/use-vara-ft-balance.ts @@ -7,7 +7,7 @@ import { isUndefined } from '@/utils'; import { BALANCE_REFETCH_INTERVAL, QUERY_NAME, SERVICE_NAME } from '../../consts'; -function useVaraFTBalance(address: HexString | undefined) { +function useVaraFTBalance(address: HexString | undefined, decimals: number | undefined) { const { account } = useAccount(); const { data: program } = useProgram({ @@ -15,7 +15,7 @@ function useVaraFTBalance(address: HexString | undefined) { id: address, }); - const { data: balance, isPending: isBalancePending } = useProgramQuery({ + const { data, isPending } = useProgramQuery({ program, serviceName: SERVICE_NAME.VFT, functionName: QUERY_NAME.BALANCE, @@ -23,17 +23,9 @@ function useVaraFTBalance(address: HexString | undefined) { query: { enabled: Boolean(account), refetchInterval: BALANCE_REFETCH_INTERVAL }, }); - const { data: decimals, isPending: isDecimalsPending } = useProgramQuery({ - program, - serviceName: SERVICE_NAME.VFT, - functionName: QUERY_NAME.DECIMALS, - args: [], - }); - - const value = balance; - const formattedValue = !isUndefined(balance) && !isUndefined(decimals) ? formatUnits(balance, decimals) : undefined; - - const isLoading = isBalancePending || isDecimalsPending; + const value = data; + const formattedValue = !isUndefined(value) && !isUndefined(decimals) ? formatUnits(value, decimals) : undefined; + const isLoading = isPending; return { value, formattedValue, decimals, isLoading }; } diff --git a/frontend/src/features/swap/types/hooks.ts b/frontend/src/features/swap/types/hooks.ts index ce7001a9..c8dc34c5 100644 --- a/frontend/src/features/swap/types/hooks.ts +++ b/frontend/src/features/swap/types/hooks.ts @@ -11,8 +11,10 @@ type UseAccountBalance = () => BalanceValues & { isLoading: boolean; }; -type UseFTBalance = (ftAddress: HexString | undefined) => BalanceValues & { - decimals: number | undefined; +type UseFTBalance = ( + ftAddress: HexString | undefined, + decimals: number | undefined, +) => BalanceValues & { isLoading: boolean; }; From 2d9a04824c0a64afbd806eb5ab7460e8fae16e37 Mon Sep 17 00:00:00 2001 From: Nikita Yutanov Date: Wed, 20 Nov 2024 18:04:46 +0300 Subject: [PATCH 34/38] fix no account form loading state --- .../ft-allowance-tip/ft-allowance-tip.tsx | 17 ++++++++++++++--- .../swap/components/swap-form/swap-form.tsx | 1 + .../swap/hooks/eth/use-eth-ft-balance.ts | 3 +-- .../swap/hooks/vara/use-vara-ft-balance.ts | 3 +-- 4 files changed, 17 insertions(+), 7 deletions(-) diff --git a/frontend/src/features/swap/components/ft-allowance-tip/ft-allowance-tip.tsx b/frontend/src/features/swap/components/ft-allowance-tip/ft-allowance-tip.tsx index 852380c6..844ac58d 100644 --- a/frontend/src/features/swap/components/ft-allowance-tip/ft-allowance-tip.tsx +++ b/frontend/src/features/swap/components/ft-allowance-tip/ft-allowance-tip.tsx @@ -13,11 +13,22 @@ type Props = { symbol: string | undefined; amount: string; isVaraNetwork: boolean; + isLoading: boolean; }; -function FTAllowanceTip({ allowance, decimals, symbol, amount, isVaraNetwork }: Props) { - const isLoading = isUndefined(allowance) || !decimals || !symbol; - if (isLoading) return ; +function FTAllowanceTip({ allowance, decimals, symbol, amount, isVaraNetwork, isLoading }: Props) { + const isEmpty = isUndefined(allowance) || !decimals || !symbol; + + if (isLoading || isEmpty) + return ( + + ); const formattedAllowance = formatUnits(allowance, decimals); const contractName = isVaraNetwork ? 'VFT' : 'ERC20'; diff --git a/frontend/src/features/swap/components/swap-form/swap-form.tsx b/frontend/src/features/swap/components/swap-form/swap-form.tsx index e1dcbf15..b0bc6945 100644 --- a/frontend/src/features/swap/components/swap-form/swap-form.tsx +++ b/frontend/src/features/swap/components/swap-form/swap-form.tsx @@ -131,6 +131,7 @@ function SwapForm({ symbol={symbol} amount={amount} isVaraNetwork={isVaraNetwork} + isLoading={bridge.isLoading || allowance.isLoading} /> diff --git a/frontend/src/features/swap/hooks/eth/use-eth-ft-balance.ts b/frontend/src/features/swap/hooks/eth/use-eth-ft-balance.ts index 3a9e2249..f07c760d 100644 --- a/frontend/src/features/swap/hooks/eth/use-eth-ft-balance.ts +++ b/frontend/src/features/swap/hooks/eth/use-eth-ft-balance.ts @@ -15,7 +15,7 @@ function useEthFTBalance(address: HexString | undefined, decimals: number | unde const ethAccount = useEthAccount(); // TODO: logger - const { data, isPending } = useReadContract({ + const { data, isLoading } = useReadContract({ address, abi, functionName: FUNCTION_NAME.FUNGIBLE_TOKEN_BALANCE, @@ -29,7 +29,6 @@ function useEthFTBalance(address: HexString | undefined, decimals: number | unde const value = data; const formattedValue = !isUndefined(value) && !isUndefined(decimals) ? formatUnits(value, decimals) : undefined; - const isLoading = ethAccount.isConnected && isPending; return { value, formattedValue, decimals, isLoading }; } diff --git a/frontend/src/features/swap/hooks/vara/use-vara-ft-balance.ts b/frontend/src/features/swap/hooks/vara/use-vara-ft-balance.ts index a443c9bc..8098b409 100644 --- a/frontend/src/features/swap/hooks/vara/use-vara-ft-balance.ts +++ b/frontend/src/features/swap/hooks/vara/use-vara-ft-balance.ts @@ -15,7 +15,7 @@ function useVaraFTBalance(address: HexString | undefined, decimals: number | und id: address, }); - const { data, isPending } = useProgramQuery({ + const { data, isLoading } = useProgramQuery({ program, serviceName: SERVICE_NAME.VFT, functionName: QUERY_NAME.BALANCE, @@ -25,7 +25,6 @@ function useVaraFTBalance(address: HexString | undefined, decimals: number | und const value = data; const formattedValue = !isUndefined(value) && !isUndefined(decimals) ? formatUnits(value, decimals) : undefined; - const isLoading = isPending; return { value, formattedValue, decimals, isLoading }; } From 5b61c5b6e634773099ee147bab681ce2371d31a2 Mon Sep 17 00:00:00 2001 From: Nikita Yutanov Date: Wed, 20 Nov 2024 18:22:16 +0300 Subject: [PATCH 35/38] update docker env --- .github/workflows/k8s-deploy.yml | 2 +- frontend/Dockerfile | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/k8s-deploy.yml b/.github/workflows/k8s-deploy.yml index 11e43968..aa63d67a 100644 --- a/.github/workflows/k8s-deploy.yml +++ b/.github/workflows/k8s-deploy.yml @@ -79,7 +79,7 @@ jobs: VITE_WALLET_CONNECT_PROJECT_ID=${{ secrets.VITE_WALLET_CONNECT_PROJECT_ID }} VITE_INDEXER_ADDRESS=${{ secrets.VITE_INDEXER_ADDRESS }} VITE_BRIDGING_PAYMENT_CONTRACT_ADDRESS=${{ secrets.VITE_BRIDGING_PAYMENT_CONTRACT_ADDRESS }} - VITE_ERC20_TREASURY_CONTRACT_ADDRESS=${{ secrets.VITE_ERC20_TREASURY_CONTRACT_ADDRESS }} + VITE_ETH_BRIDGING_PAYMENT_CONTRACT_ADDRESS=${{ secrets.VITE_ETH_BRIDGING_PAYMENT_CONTRACT_ADDRESS }} deploy-to-k8s: needs: [prepair, build-and-push-image] diff --git a/frontend/Dockerfile b/frontend/Dockerfile index 3bd873d6..bb92a326 100644 --- a/frontend/Dockerfile +++ b/frontend/Dockerfile @@ -17,7 +17,7 @@ ARG VITE_VARA_NODE_ADDRESS \ VITE_WALLET_CONNECT_PROJECT_ID \ VITE_INDEXER_ADDRESS \ VITE_BRIDGING_PAYMENT_CONTRACT_ADDRESS \ - VITE_ERC20_TREASURY_CONTRACT_ADDRESS + VITE_ETH_BRIDGING_PAYMENT_CONTRACT_ADDRESS ENV VITE_VARA_NODE_ADDRESS=${VITE_VARA_NODE_ADDRESS} \ VITE_ETH_NODE_ADDRESS=${VITE_ETH_NODE_ADDRESS} \ @@ -25,7 +25,7 @@ ENV VITE_VARA_NODE_ADDRESS=${VITE_VARA_NODE_ADDRESS} \ VITE_WALLET_CONNECT_PROJECT_ID=${VITE_WALLET_CONNECT_PROJECT_ID} \ VITE_INDEXER_ADDRESS=${VITE_INDEXER_ADDRESS} \ VITE_BRIDGING_PAYMENT_CONTRACT_ADDRESS=${VITE_BRIDGING_PAYMENT_CONTRACT_ADDRESS} \ - VITE_ERC20_TREASURY_CONTRACT_ADDRESS=${VITE_ERC20_TREASURY_CONTRACT_ADDRESS} + VITE_ETH_BRIDGING_PAYMENT_CONTRACT_ADDRESS=${VITE_ETH_BRIDGING_PAYMENT_CONTRACT_ADDRESS} RUN pnpm install From 875e74088d29760ededc7485f3ae1b8ba8adb565 Mon Sep 17 00:00:00 2001 From: Nikita Yutanov Date: Thu, 21 Nov 2024 01:10:23 +0300 Subject: [PATCH 36/38] remove allowance refetch --- .../swap/components/swap-form/swap-form.tsx | 2 +- .../swap/hooks/eth/use-handle-eth-submit.ts | 19 +++++-------------- .../swap/hooks/vara/use-handle-vara-submit.ts | 12 +++++------- frontend/src/features/swap/types/hooks.ts | 2 +- 4 files changed, 12 insertions(+), 23 deletions(-) diff --git a/frontend/src/features/swap/components/swap-form/swap-form.tsx b/frontend/src/features/swap/components/swap-form/swap-form.tsx index b0bc6945..4bc31b84 100644 --- a/frontend/src/features/swap/components/swap-form/swap-form.tsx +++ b/frontend/src/features/swap/components/swap-form/swap-form.tsx @@ -43,7 +43,7 @@ function SwapForm({ const accountBalance = useAccountBalance(); const ftBalance = useFTBalance(address, decimals); const allowance = useFTAllowance(address); - const [{ mutateAsync: onSubmit, ...submit }, approve] = useHandleSubmit(address, fee.value, allowance); + const [{ mutateAsync: onSubmit, ...submit }, approve] = useHandleSubmit(address, fee.value, allowance.data); const { form, amount, onValueChange, onExpectedValueChange, handleSubmit, setMaxBalance } = useSwapForm( isVaraNetwork, diff --git a/frontend/src/features/swap/hooks/eth/use-handle-eth-submit.ts b/frontend/src/features/swap/hooks/eth/use-handle-eth-submit.ts index c4362c9b..f0a1d9df 100644 --- a/frontend/src/features/swap/hooks/eth/use-handle-eth-submit.ts +++ b/frontend/src/features/swap/hooks/eth/use-handle-eth-submit.ts @@ -6,15 +6,11 @@ import { watchContractEvent } from 'wagmi/actions'; import { isUndefined } from '@/utils'; import { BRIDGING_PAYMENT_ABI, ETH_BRIDGING_PAYMENT_CONTRACT_ADDRESS } from '../../consts'; -import { FormattedValues, UseFTAllowance } from '../../types'; +import { FormattedValues } from '../../types'; import { useApprove } from './use-approve'; -function useHandleEthSubmit( - ftAddress: HexString | undefined, - fee: bigint | undefined, - allowance: ReturnType, -) { +function useHandleEthSubmit(ftAddress: HexString | undefined, fee: bigint | undefined, allowance: bigint | undefined) { const { writeContractAsync } = useWriteContract(); const approve = useApprove(ftAddress); const config = useConfig(); @@ -51,16 +47,11 @@ function useHandleEthSubmit( }); const onSubmit = async ({ amount, accountAddress }: FormattedValues) => { - if (isUndefined(allowance.data)) throw new Error('Allowance is not defined'); + if (isUndefined(allowance)) throw new Error('Allowance is not defined'); - if (amount > allowance.data) { - await approve.mutateAsync(amount); - await allowance.refetch(); // TODO: replace with queryClient.setQueryData after @gear-js/react-hooks update to return QueryKey - } + if (amount > allowance) await approve.mutateAsync(amount); - return requestBridging(amount, accountAddress) - .then(() => watch()) - .then(() => allowance.refetch()); + return requestBridging(amount, accountAddress).then(() => watch()); }; const submit = useMutation({ mutationFn: onSubmit }); diff --git a/frontend/src/features/swap/hooks/vara/use-handle-vara-submit.ts b/frontend/src/features/swap/hooks/vara/use-handle-vara-submit.ts index bae6159a..5ea36c30 100644 --- a/frontend/src/features/swap/hooks/vara/use-handle-vara-submit.ts +++ b/frontend/src/features/swap/hooks/vara/use-handle-vara-submit.ts @@ -6,7 +6,7 @@ import { BRIDGING_PAYMENT_CONTRACT_ADDRESS, BridgingPaymentProgram, VftProgram } import { isUndefined } from '@/utils'; import { FUNCTION_NAME, SERVICE_NAME } from '../../consts/vara'; -import { FormattedValues, UseFTAllowance } from '../../types'; +import { FormattedValues } from '../../types'; function useSendBridgingPaymentRequest() { const { data: program } = useProgram({ @@ -37,7 +37,7 @@ function useSendVftApprove(ftAddress: HexString | undefined) { function useHandleVaraSubmit( ftAddress: HexString | undefined, feeValue: bigint | undefined, - allowance: ReturnType, + allowance: bigint | undefined, ) { const bridgingPaymentRequest = useSendBridgingPaymentRequest(); const vftApprove = useSendVftApprove(ftAddress); @@ -54,14 +54,12 @@ function useHandleVaraSubmit( const onSubmit = async ({ amount, accountAddress }: FormattedValues) => { if (isUndefined(feeValue)) throw new Error('Fee is not found'); - if (isUndefined(allowance.data)) throw new Error('Allowance is not found'); + if (isUndefined(allowance)) throw new Error('Allowance is not found'); - if (amount > allowance.data) { + if (amount > allowance) await vftApprove.sendTransactionAsync({ args: [BRIDGING_PAYMENT_CONTRACT_ADDRESS, amount] }); - await allowance.refetch(); // TODO: replace with queryClient.setQueryData after @gear-js/react-hooks update to return QueryKey - } - return sendBridgingPaymentRequest(amount, accountAddress).then(() => allowance.refetch()); + return sendBridgingPaymentRequest(amount, accountAddress); }; const submit = useMutation({ mutationFn: onSubmit }); diff --git a/frontend/src/features/swap/types/hooks.ts b/frontend/src/features/swap/types/hooks.ts index c8dc34c5..813353c0 100644 --- a/frontend/src/features/swap/types/hooks.ts +++ b/frontend/src/features/swap/types/hooks.ts @@ -26,7 +26,7 @@ type UseFee = () => { type UseHandleSubmit = ( ftAddress: HexString | undefined, feeValue: bigint | undefined, - allowance: ReturnType, + allowance: bigint | undefined, ) => Readonly< [ { From 00b0ca2fdaf0602362adfe11e354f531bbe0dac8 Mon Sep 17 00:00:00 2001 From: Nikita Yutanov Date: Thu, 21 Nov 2024 16:23:03 +0300 Subject: [PATCH 37/38] remove refetch intervals --- .../latest-transactions.tsx | 22 ++++++++++++----- frontend/src/features/history/consts/index.ts | 3 +-- .../src/features/history/consts/queries.ts | 3 +-- frontend/src/features/swap/consts/index.ts | 5 ---- .../swap/hooks/eth/use-eth-account-balance.ts | 6 +++-- .../swap/hooks/eth/use-eth-ft-allowance.ts | 13 ++++++---- .../swap/hooks/eth/use-eth-ft-balance.ts | 13 +++++----- .../hooks/vara/use-derive-balances-all.ts | 24 ------------------- .../hooks/vara/use-vara-account-balance.ts | 10 ++++---- .../swap/hooks/vara/use-vara-ft-allowance.ts | 5 ++-- .../swap/hooks/vara/use-vara-ft-balance.ts | 5 ++-- frontend/src/hooks/index.ts | 3 ++- frontend/src/hooks/use-invalidate-on-block.ts | 12 ++++++++++ 13 files changed, 59 insertions(+), 65 deletions(-) delete mode 100644 frontend/src/features/swap/hooks/vara/use-derive-balances-all.ts create mode 100644 frontend/src/hooks/use-invalidate-on-block.ts diff --git a/frontend/src/features/history/components/latest-transactions/latest-transactions.tsx b/frontend/src/features/history/components/latest-transactions/latest-transactions.tsx index 57a34cb9..e01800f8 100644 --- a/frontend/src/features/history/components/latest-transactions/latest-transactions.tsx +++ b/frontend/src/features/history/components/latest-transactions/latest-transactions.tsx @@ -1,23 +1,33 @@ import { useQuery } from '@tanstack/react-query'; import { request } from 'graphql-request'; +import { useMemo } from 'react'; -import { useTokens } from '@/hooks'; +import { useInvalidateOnBlock, useTokens } from '@/hooks'; -import { TRANSFERS_QUERY, REFETCH_INTERVAL, LATEST_TRANSACTIONS_LIMIT, INDEXER_ADDRESS } from '../../consts'; +import { TRANSFERS_QUERY, LATEST_TRANSACTIONS_LIMIT, INDEXER_ADDRESS } from '../../consts'; import { TransactionCard } from '../transaction-card'; import styles from './latest-transactions.module.scss'; -function LatestTransactions() { - const { data, isLoading: isTransactionsQueryLoading } = useQuery({ - queryKey: ['latestTransactions'], +function useLatestTransactions() { + const queryKey = useMemo(() => ['latestTransactions'], []); + + const query = useQuery({ + queryKey, queryFn: () => request(INDEXER_ADDRESS, TRANSFERS_QUERY, { limit: LATEST_TRANSACTIONS_LIMIT, offset: 0, where: null }), - refetchInterval: REFETCH_INTERVAL, select: ({ transfers }) => transfers, }); + useInvalidateOnBlock({ queryKey }); + + return query; +} + +function LatestTransactions() { + const { data, isLoading: isTransactionsQueryLoading } = useLatestTransactions(); const { decimals, symbols, isLoading: isTokensQueryLoading } = useTokens(); + const isLoading = isTransactionsQueryLoading || isTokensQueryLoading; const renderTransactions = () => diff --git a/frontend/src/features/history/consts/index.ts b/frontend/src/features/history/consts/index.ts index be2e3318..c37d3257 100644 --- a/frontend/src/features/history/consts/index.ts +++ b/frontend/src/features/history/consts/index.ts @@ -1,11 +1,10 @@ import { INDEXER_ADDRESS } from './env'; import { FIELD_NAME, DEFAULT_VALUES, TIMESTAMP_OPTIONS, STATUS_OPTIONS } from './filters'; -import { REFETCH_INTERVAL, TRANSACTIONS_LIMIT, LATEST_TRANSACTIONS_LIMIT, TRANSFERS_QUERY } from './queries'; +import { TRANSACTIONS_LIMIT, LATEST_TRANSACTIONS_LIMIT, TRANSFERS_QUERY } from './queries'; export { INDEXER_ADDRESS, TRANSFERS_QUERY, - REFETCH_INTERVAL, TRANSACTIONS_LIMIT, LATEST_TRANSACTIONS_LIMIT, FIELD_NAME, diff --git a/frontend/src/features/history/consts/queries.ts b/frontend/src/features/history/consts/queries.ts index 18df386b..7e78e087 100644 --- a/frontend/src/features/history/consts/queries.ts +++ b/frontend/src/features/history/consts/queries.ts @@ -1,6 +1,5 @@ import { graphql } from '../graphql'; -const REFETCH_INTERVAL = 10000; const LATEST_TRANSACTIONS_LIMIT = 5; const TRANSACTIONS_LIMIT = 12; @@ -30,4 +29,4 @@ const TRANSFERS_CONNECTION_QUERY = graphql(` } `); -export { REFETCH_INTERVAL, TRANSACTIONS_LIMIT, LATEST_TRANSACTIONS_LIMIT, TRANSFERS_QUERY, TRANSFERS_CONNECTION_QUERY }; +export { TRANSACTIONS_LIMIT, LATEST_TRANSACTIONS_LIMIT, TRANSFERS_QUERY, TRANSFERS_CONNECTION_QUERY }; diff --git a/frontend/src/features/swap/consts/index.ts b/frontend/src/features/swap/consts/index.ts index 107eb45e..b658996e 100644 --- a/frontend/src/features/swap/consts/index.ts +++ b/frontend/src/features/swap/consts/index.ts @@ -9,9 +9,6 @@ const NETWORK_INDEX = { ETH: 1, }; -const BALANCE_REFETCH_INTERVAL = 10000; -const ALLOWANCE_REFETCH_INTERVAL = BALANCE_REFETCH_INTERVAL; - export { ETH_BRIDGING_PAYMENT_CONTRACT_ADDRESS, BRIDGING_PAYMENT_ABI, @@ -20,8 +17,6 @@ export { ADDRESS_SCHEMA, EVENT_NAME, ERROR_MESSAGE, - BALANCE_REFETCH_INTERVAL, - ALLOWANCE_REFETCH_INTERVAL, NETWORK_INDEX, SERVICE_NAME, QUERY_NAME, diff --git a/frontend/src/features/swap/hooks/eth/use-eth-account-balance.ts b/frontend/src/features/swap/hooks/eth/use-eth-account-balance.ts index 27e32373..e53f2910 100644 --- a/frontend/src/features/swap/hooks/eth/use-eth-account-balance.ts +++ b/frontend/src/features/swap/hooks/eth/use-eth-account-balance.ts @@ -1,7 +1,7 @@ import { formatEther } from 'viem'; import { useBalance } from 'wagmi'; -import { useEthAccount } from '@/hooks'; +import { useEthAccount, useInvalidateOnBlock } from '@/hooks'; const withPrecision = (value: string) => { // simplest solution without rounding for now @@ -13,10 +13,12 @@ const withPrecision = (value: string) => { function useEthAccountBalance() { const ethAccount = useEthAccount(); - const { data, isPending } = useBalance({ + const { data, isPending, queryKey } = useBalance({ address: ethAccount?.address, }); + useInvalidateOnBlock({ queryKey }); + const { value } = data || {}; const formattedValue = data ? withPrecision(formatEther(data.value)) : undefined; const isLoading = isPending; diff --git a/frontend/src/features/swap/hooks/eth/use-eth-ft-allowance.ts b/frontend/src/features/swap/hooks/eth/use-eth-ft-allowance.ts index 9a80d41c..3e407d0e 100644 --- a/frontend/src/features/swap/hooks/eth/use-eth-ft-allowance.ts +++ b/frontend/src/features/swap/hooks/eth/use-eth-ft-allowance.ts @@ -2,9 +2,7 @@ import { HexString } from '@gear-js/api'; import { useReadContract } from 'wagmi'; import { FUNGIBLE_TOKEN_ABI } from '@/consts'; -import { useEthAccount } from '@/hooks'; - -import { ALLOWANCE_REFETCH_INTERVAL } from '../../consts'; +import { useEthAccount, useInvalidateOnBlock } from '@/hooks'; import { useERC20ManagerAddress } from './use-erc20-manager-address'; @@ -12,13 +10,18 @@ function useEthFTAllowance(address: HexString | undefined) { const { data: erc20ManagerAddress } = useERC20ManagerAddress(); const ethAccount = useEthAccount(); - return useReadContract({ + const state = useReadContract({ address, abi: FUNGIBLE_TOKEN_ABI, functionName: 'allowance', args: ethAccount.address && erc20ManagerAddress ? [ethAccount.address, erc20ManagerAddress] : undefined, - query: { refetchInterval: ALLOWANCE_REFETCH_INTERVAL }, }); + + const { queryKey } = state; + + useInvalidateOnBlock({ queryKey }); + + return state; } export { useEthFTAllowance }; diff --git a/frontend/src/features/swap/hooks/eth/use-eth-ft-balance.ts b/frontend/src/features/swap/hooks/eth/use-eth-ft-balance.ts index f07c760d..894f1fe4 100644 --- a/frontend/src/features/swap/hooks/eth/use-eth-ft-balance.ts +++ b/frontend/src/features/swap/hooks/eth/use-eth-ft-balance.ts @@ -3,30 +3,29 @@ import { formatUnits } from 'viem'; import { useReadContract } from 'wagmi'; import { FUNGIBLE_TOKEN_ABI } from '@/consts'; -import { useEthAccount } from '@/hooks'; +import { useEthAccount, useInvalidateOnBlock } from '@/hooks'; import { isUndefined } from '@/utils'; -import { BALANCE_REFETCH_INTERVAL } from '../../consts'; import { FUNCTION_NAME } from '../../consts/eth'; const abi = FUNGIBLE_TOKEN_ABI; function useEthFTBalance(address: HexString | undefined, decimals: number | undefined) { const ethAccount = useEthAccount(); + const enabled = Boolean(address) && Boolean(ethAccount.address); // TODO: logger - const { data, isLoading } = useReadContract({ + const { data, isLoading, queryKey } = useReadContract({ address, abi, functionName: FUNCTION_NAME.FUNGIBLE_TOKEN_BALANCE, args: ethAccount.address ? [ethAccount.address] : undefined, - query: { - refetchInterval: BALANCE_REFETCH_INTERVAL, - enabled: Boolean(address) && Boolean(ethAccount.address), - }, + query: { enabled }, }); + useInvalidateOnBlock({ queryKey, enabled }); + const value = data; const formattedValue = !isUndefined(value) && !isUndefined(decimals) ? formatUnits(value, decimals) : undefined; diff --git a/frontend/src/features/swap/hooks/vara/use-derive-balances-all.ts b/frontend/src/features/swap/hooks/vara/use-derive-balances-all.ts deleted file mode 100644 index 2029c4b2..00000000 --- a/frontend/src/features/swap/hooks/vara/use-derive-balances-all.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { useApi } from '@gear-js/react-hooks'; -import { useQuery } from '@tanstack/react-query'; - -import { BALANCE_REFETCH_INTERVAL } from '../../consts'; - -function useDeriveBalancesAll(accountAddress: string | undefined) { - const { api, isApiReady } = useApi(); - - const getDeriveBalancesAll = async () => { - if (!isApiReady) throw new Error('API is not initialized'); - if (!accountAddress) throw new Error('Account is not found'); - - return api.derive.balances.all(accountAddress); - }; - - return useQuery({ - queryKey: ['deriveBalancesAll', isApiReady, accountAddress], - queryFn: getDeriveBalancesAll, - enabled: isApiReady && Boolean(accountAddress), - refetchInterval: BALANCE_REFETCH_INTERVAL, - }); -} - -export { useDeriveBalancesAll }; diff --git a/frontend/src/features/swap/hooks/vara/use-vara-account-balance.ts b/frontend/src/features/swap/hooks/vara/use-vara-account-balance.ts index 60322676..aceec1f2 100644 --- a/frontend/src/features/swap/hooks/vara/use-vara-account-balance.ts +++ b/frontend/src/features/swap/hooks/vara/use-vara-account-balance.ts @@ -1,13 +1,11 @@ -import { useAccount, useBalanceFormat } from '@gear-js/react-hooks'; +import { useAccount, useBalanceFormat, useDeriveBalancesAll } from '@gear-js/react-hooks'; import { useMemo } from 'react'; -import { useDeriveBalancesAll } from './use-derive-balances-all'; - function useVaraAccountBalance() { const { account, isAccountReady } = useAccount(); const { getFormattedBalance } = useBalanceFormat(); - const { data, isPending } = useDeriveBalancesAll(account?.address); + const data = useDeriveBalancesAll(account?.address); const { freeBalance } = data || {}; const value = freeBalance?.toBigInt(); const formattedValue = value !== undefined ? getFormattedBalance(value).value : undefined; @@ -17,8 +15,8 @@ function useVaraAccountBalance() { if (!isAccountReady) return true; if (!account) return false; - return isPending; - }, [account, isAccountReady, isPending]); + return !data; + }, [account, isAccountReady, data]); return { value, formattedValue, isLoading }; } diff --git a/frontend/src/features/swap/hooks/vara/use-vara-ft-allowance.ts b/frontend/src/features/swap/hooks/vara/use-vara-ft-allowance.ts index c622edac..a81d213c 100644 --- a/frontend/src/features/swap/hooks/vara/use-vara-ft-allowance.ts +++ b/frontend/src/features/swap/hooks/vara/use-vara-ft-allowance.ts @@ -3,8 +3,6 @@ import { useAccount, useProgram, useProgramQuery } from '@gear-js/react-hooks'; import { BRIDGING_PAYMENT_CONTRACT_ADDRESS, VftProgram } from '@/consts'; -import { ALLOWANCE_REFETCH_INTERVAL } from '../../consts'; - function useVaraFTAllowance(address: HexString | undefined) { const { account } = useAccount(); @@ -19,7 +17,8 @@ function useVaraFTAllowance(address: HexString | undefined) { functionName: 'allowance', // TODO: remove assertion after @gear-js/react-hooks update to support empty args args: [account?.decodedAddress as HexString, BRIDGING_PAYMENT_CONTRACT_ADDRESS], - query: { enabled: Boolean(account), refetchInterval: ALLOWANCE_REFETCH_INTERVAL }, + query: { enabled: Boolean(account) }, + watch: true, }); } diff --git a/frontend/src/features/swap/hooks/vara/use-vara-ft-balance.ts b/frontend/src/features/swap/hooks/vara/use-vara-ft-balance.ts index 8098b409..719c5a0a 100644 --- a/frontend/src/features/swap/hooks/vara/use-vara-ft-balance.ts +++ b/frontend/src/features/swap/hooks/vara/use-vara-ft-balance.ts @@ -5,7 +5,7 @@ import { formatUnits } from 'viem'; import { VftProgram } from '@/consts'; import { isUndefined } from '@/utils'; -import { BALANCE_REFETCH_INTERVAL, QUERY_NAME, SERVICE_NAME } from '../../consts'; +import { QUERY_NAME, SERVICE_NAME } from '../../consts'; function useVaraFTBalance(address: HexString | undefined, decimals: number | undefined) { const { account } = useAccount(); @@ -20,7 +20,8 @@ function useVaraFTBalance(address: HexString | undefined, decimals: number | und serviceName: SERVICE_NAME.VFT, functionName: QUERY_NAME.BALANCE, args: [account?.decodedAddress || '0x00'], - query: { enabled: Boolean(account), refetchInterval: BALANCE_REFETCH_INTERVAL }, + query: { enabled: Boolean(account) }, + watch: true, }); const value = data; diff --git a/frontend/src/hooks/index.ts b/frontend/src/hooks/index.ts index 557beb31..7bac87fb 100644 --- a/frontend/src/hooks/index.ts +++ b/frontend/src/hooks/index.ts @@ -2,5 +2,6 @@ import { useAccount as useEthAccount } from 'wagmi'; import { useChangeEffect, useLoading, useModal, useDebounce } from './common'; import { useTokens } from './tokens'; +import { useInvalidateOnBlock } from './use-invalidate-on-block'; -export { useEthAccount, useModal, useLoading, useChangeEffect, useDebounce, useTokens }; +export { useEthAccount, useModal, useLoading, useChangeEffect, useDebounce, useTokens, useInvalidateOnBlock }; diff --git a/frontend/src/hooks/use-invalidate-on-block.ts b/frontend/src/hooks/use-invalidate-on-block.ts new file mode 100644 index 00000000..239125e7 --- /dev/null +++ b/frontend/src/hooks/use-invalidate-on-block.ts @@ -0,0 +1,12 @@ +import { QueryKey, useQueryClient } from '@tanstack/react-query'; +import { useWatchBlockNumber } from 'wagmi'; + +function useInvalidateOnBlock({ queryKey, enabled }: { queryKey: QueryKey; enabled?: boolean }) { + const queryClient = useQueryClient(); + + const onBlockNumber = () => void queryClient.invalidateQueries({ queryKey }, { cancelRefetch: false }); + + useWatchBlockNumber({ enabled, onBlockNumber }); +} + +export { useInvalidateOnBlock }; From 681fc654d24ff46a5933fbfe63bbd79bf7aa4aa5 Mon Sep 17 00:00:00 2001 From: Nikita Yutanov Date: Mon, 25 Nov 2024 13:30:56 +0300 Subject: [PATCH 38/38] migrate to vft manager --- frontend/src/consts/index.ts | 4 +- frontend/src/consts/sails/bridging-payment.ts | 176 +-------- frontend/src/consts/sails/index.ts | 4 +- .../sails/{vft-gateway.ts => vft-manager.ts} | 363 +++++++++++++----- .../src/features/history/utils/filters.ts | 2 +- frontend/src/features/swap/consts/vara.ts | 3 - .../swap/hooks/vara/use-handle-vara-submit.ts | 2 +- frontend/src/features/swap/utils.ts | 5 +- frontend/src/hooks/tokens/use-ft-addresses.ts | 16 +- frontend/src/hooks/tokens/use-ft-decimals.ts | 2 +- frontend/src/hooks/tokens/use-ft-symbols.ts | 2 +- 11 files changed, 299 insertions(+), 280 deletions(-) rename frontend/src/consts/sails/{vft-gateway.ts => vft-manager.ts} (52%) diff --git a/frontend/src/consts/index.ts b/frontend/src/consts/index.ts index 2afa7d79..98ab6fbe 100644 --- a/frontend/src/consts/index.ts +++ b/frontend/src/consts/index.ts @@ -1,7 +1,7 @@ import { FUNGIBLE_TOKEN_ABI } from './abi'; import { VARA_NODE_ADDRESS, ETH_NODE_ADDRESS, ETH_CHAIN_ID, BRIDGING_PAYMENT_CONTRACT_ADDRESS } from './env'; import { ROUTE } from './routing'; -import { BridgingPaymentProgram, VftGatewayProgram, VftProgram } from './sails'; +import { BridgingPaymentProgram, VftManagerProgram, VftProgram } from './sails'; export { FUNGIBLE_TOKEN_ABI, @@ -11,6 +11,6 @@ export { BRIDGING_PAYMENT_CONTRACT_ADDRESS, ROUTE, BridgingPaymentProgram, - VftGatewayProgram, + VftManagerProgram, VftProgram, }; diff --git a/frontend/src/consts/sails/bridging-payment.ts b/frontend/src/consts/sails/bridging-payment.ts index a48f2ce8..3ba3eeef 100644 --- a/frontend/src/consts/sails/bridging-payment.ts +++ b/frontend/src/consts/sails/bridging-payment.ts @@ -1,107 +1,36 @@ /* eslint-disable @typescript-eslint/no-floating-promises */ /* eslint-disable @typescript-eslint/no-explicit-any */ - import { GearApi, decodeAddress } from '@gear-js/api'; import { TypeRegistry } from '@polkadot/types'; -import { - ActorId, - H160, - TransactionBuilder, - MessageId, - getServiceNamePrefix, - getFnNamePrefix, - ZERO_ADDRESS, -} from 'sails-js'; +import { TransactionBuilder, H160, ActorId, getServiceNamePrefix, getFnNamePrefix, ZERO_ADDRESS } from 'sails-js'; export interface InitConfig { admin_address: ActorId; - vft_gateway_address: ActorId; + vft_manager_address: ActorId; config: Config; } export interface Config { fee: number | string | bigint; gas_for_reply_deposit: number | string | bigint; - gas_to_send_request_to_gateway: number | string | bigint; - gas_to_transfer_tokens: number | string | bigint; + gas_to_send_request_to_vft_manager: number | string | bigint; reply_timeout: number; - gas_for_request_to_gateway_msg: number | string | bigint; -} - -export interface MessageInfo { - status: MessageStatus; - details: TransactionDetails; + gas_for_request_to_vft_manager_msg: number | string | bigint; } -export type MessageStatus = - | { sendingMessageToTransferTokens: null } - | { tokenTransferCompleted: boolean } - | { waitingReplyFromTokenTransfer: null } - | { sendingMessageToGateway: null } - | { gatewayMessageProcessingCompleted: [number | string | bigint, H160] } - | { waitingReplyFromGateway: null } - | { messageToGatewayStep: null } - | { returnTokensBackStep: null } - | { sendingMessageToTransferTokensBack: null } - | { waitingReplyFromTokenTransferBack: null } - | { tokenTransferBackCompleted: null } - | { messageProcessedWithSuccess: [number | string | bigint, H160] }; - -export type TransactionDetails = - | { transfer: { sender: ActorId; receiver: ActorId; amount: number | string | bigint; token_id: ActorId } } - | { - sendMessageToGateway: { - sender: ActorId; - vara_token_id: ActorId; - amount: number | string | bigint; - receiver: H160; - attached_value: number | string | bigint; - }; - }; - export class Program { public readonly registry: TypeRegistry; public readonly bridgingPayment: BridgingPayment; constructor(public api: GearApi, public programId?: `0x${string}`) { const types: Record = { - InitConfig: { admin_address: '[u8;32]', vft_gateway_address: '[u8;32]', config: 'Config' }, + InitConfig: { admin_address: '[u8;32]', vft_manager_address: '[u8;32]', config: 'Config' }, Config: { fee: 'u128', gas_for_reply_deposit: 'u64', - gas_to_send_request_to_gateway: 'u64', - gas_to_transfer_tokens: 'u64', + gas_to_send_request_to_vft_manager: 'u64', reply_timeout: 'u32', - gas_for_request_to_gateway_msg: 'u64', - }, - MessageInfo: { status: 'MessageStatus', details: 'TransactionDetails' }, - MessageStatus: { - _enum: { - SendingMessageToTransferTokens: 'Null', - TokenTransferCompleted: 'bool', - WaitingReplyFromTokenTransfer: 'Null', - SendingMessageToGateway: 'Null', - GatewayMessageProcessingCompleted: '(U256, H160)', - WaitingReplyFromGateway: 'Null', - MessageToGatewayStep: 'Null', - ReturnTokensBackStep: 'Null', - SendingMessageToTransferTokensBack: 'Null', - WaitingReplyFromTokenTransferBack: 'Null', - TokenTransferBackCompleted: 'Null', - MessageProcessedWithSuccess: '(U256, H160)', - }, - }, - TransactionDetails: { - _enum: { - Transfer: { sender: '[u8;32]', receiver: '[u8;32]', amount: 'U256', token_id: '[u8;32]' }, - SendMessageToGateway: { - sender: '[u8;32]', - vara_token_id: '[u8;32]', - amount: 'U256', - receiver: 'H160', - attached_value: 'u128', - }, - }, + gas_for_request_to_vft_manager_msg: 'u64', }, }; @@ -146,14 +75,18 @@ export class Program { export class BridgingPayment { constructor(private _program: Program) {} - public continueTransaction(msg_id: MessageId): TransactionBuilder { + public makeRequest( + amount: number | string | bigint, + receiver: H160, + vara_token_id: ActorId, + ): TransactionBuilder { if (!this._program.programId) throw new Error('Program ID is not set'); return new TransactionBuilder( this._program.api, this._program.registry, 'send_message', - ['BridgingPayment', 'ContinueTransaction', msg_id], - '(String, String, [u8;32])', + ['BridgingPayment', 'MakeRequest', amount, receiver, vara_token_id], + '(String, String, U256, H160, [u8;32])', 'Null', this._program.programId, ); @@ -172,31 +105,14 @@ export class BridgingPayment { ); } - public requestToGateway( - amount: number | string | bigint, - receiver: H160, - vara_token_id: ActorId, - ): TransactionBuilder { - if (!this._program.programId) throw new Error('Program ID is not set'); - return new TransactionBuilder( - this._program.api, - this._program.registry, - 'send_message', - ['BridgingPayment', 'RequestToGateway', amount, receiver, vara_token_id], - '(String, String, U256, H160, [u8;32])', - 'Null', - this._program.programId, - ); - } - - public returnTokens(msg_id: MessageId): TransactionBuilder { + public setConfig(config: Config): TransactionBuilder { if (!this._program.programId) throw new Error('Program ID is not set'); return new TransactionBuilder( this._program.api, this._program.registry, 'send_message', - ['BridgingPayment', 'ReturnTokens', msg_id], - '(String, String, [u8;32])', + ['BridgingPayment', 'SetConfig', config], + '(String, String, Config)', 'Null', this._program.programId, ); @@ -215,42 +131,13 @@ export class BridgingPayment { ); } - public updateConfig( - fee: number | string | bigint | null, - gas_for_reply_deposit: number | string | bigint | null, - gas_to_send_request_to_gateway: number | string | bigint | null, - gas_to_transfer_tokens: number | string | bigint | null, - reply_timeout: number | null, - gas_for_request_to_gateway_msg: number | string | bigint | null, - ): TransactionBuilder { + public updateVftManagerAddress(new_vft_manager_address: ActorId): TransactionBuilder { if (!this._program.programId) throw new Error('Program ID is not set'); return new TransactionBuilder( this._program.api, this._program.registry, 'send_message', - [ - 'BridgingPayment', - 'UpdateConfig', - fee, - gas_for_reply_deposit, - gas_to_send_request_to_gateway, - gas_to_transfer_tokens, - reply_timeout, - gas_for_request_to_gateway_msg, - ], - '(String, String, Option, Option, Option, Option, Option, Option)', - 'Null', - this._program.programId, - ); - } - - public updateVftGatewayAddress(new_vft_gateway_address: ActorId): TransactionBuilder { - if (!this._program.programId) throw new Error('Program ID is not set'); - return new TransactionBuilder( - this._program.api, - this._program.registry, - 'send_message', - ['BridgingPayment', 'UpdateVftGatewayAddress', new_vft_gateway_address], + ['BridgingPayment', 'UpdateVftManagerAddress', new_vft_manager_address], '(String, String, [u8;32])', 'Null', this._program.programId, @@ -295,34 +182,13 @@ export class BridgingPayment { return result[2].toJSON() as unknown as Config; } - public async msgTrackerState( - originAddress?: string, - value?: number | string | bigint, - atBlock?: `0x${string}`, - ): Promise> { - const payload = this._program.registry - .createType('(String, String)', ['BridgingPayment', 'MsgTrackerState']) - .toHex(); - const reply = await this._program.api.message.calculateReply({ - destination: this._program.programId!, - origin: originAddress ? decodeAddress(originAddress) : ZERO_ADDRESS, - payload, - value: value || 0, - gasLimit: this._program.api.blockGasLimit.toBigInt(), - at: atBlock, - }); - if (!reply.code.isSuccess) throw new Error(this._program.registry.createType('String', reply.payload).toString()); - const result = this._program.registry.createType('(String, String, Vec<([u8;32], MessageInfo)>)', reply.payload); - return result[2].toJSON() as unknown as Array<[MessageId, MessageInfo]>; - } - - public async vftGatewayAddress( + public async vftManagerAddress( originAddress?: string, value?: number | string | bigint, atBlock?: `0x${string}`, ): Promise { const payload = this._program.registry - .createType('(String, String)', ['BridgingPayment', 'VftGatewayAddress']) + .createType('(String, String)', ['BridgingPayment', 'VftManagerAddress']) .toHex(); const reply = await this._program.api.message.calculateReply({ destination: this._program.programId!, diff --git a/frontend/src/consts/sails/index.ts b/frontend/src/consts/sails/index.ts index 678d4be7..15cefabd 100644 --- a/frontend/src/consts/sails/index.ts +++ b/frontend/src/consts/sails/index.ts @@ -1,5 +1,5 @@ import { Program as BridgingPaymentProgram } from './bridging-payment'; import { Program as VftProgram } from './extended_vft'; -import { Program as VftGatewayProgram } from './vft-gateway'; +import { Program as VftManagerProgram } from './vft-manager'; -export { BridgingPaymentProgram, VftGatewayProgram, VftProgram }; +export { BridgingPaymentProgram, VftManagerProgram, VftProgram }; diff --git a/frontend/src/consts/sails/vft-gateway.ts b/frontend/src/consts/sails/vft-manager.ts similarity index 52% rename from frontend/src/consts/sails/vft-gateway.ts rename to frontend/src/consts/sails/vft-manager.ts index 3b58cbaf..92c05389 100644 --- a/frontend/src/consts/sails/vft-gateway.ts +++ b/frontend/src/consts/sails/vft-manager.ts @@ -1,135 +1,169 @@ /* eslint-disable @typescript-eslint/no-floating-promises */ /* eslint-disable @typescript-eslint/no-explicit-any */ - import { GearApi, decodeAddress } from '@gear-js/api'; import { TypeRegistry } from '@polkadot/types'; -import { H160, ActorId, TransactionBuilder, MessageId, ZERO_ADDRESS } from 'sails-js'; +import { + TransactionBuilder, + H160, + MessageId, + ActorId, + getServiceNamePrefix, + getFnNamePrefix, + ZERO_ADDRESS, +} from 'sails-js'; export interface InitConfig { - receiver_contract_address: H160; + erc20_manager_address: H160; gear_bridge_builtin: ActorId; + eth_client: ActorId; config: Config; } export interface Config { - gas_to_burn_tokens: number | string | bigint; + gas_for_token_ops: number | string | bigint; gas_for_reply_deposit: number | string | bigint; - gas_to_mint_tokens: number | string | bigint; + gas_for_submit_receipt: number | string | bigint; gas_to_send_request_to_builtin: number | string | bigint; reply_timeout: number; - gas_for_transfer_to_eth_msg: number | string | bigint; + gas_for_request_bridging: number | string | bigint; } export type Error = - | 'sendError' - | 'replyError' - | 'burnTokensDecodeError' - | 'errorDuringTokensBurn' - | 'requestToBuiltinSendError' - | 'requestToBuiltinReplyError' - | 'builtinDecodeError' - | 'payloadSizeError' - | 'mintTokensDecodeError' - | 'replyTimeoutError' - | 'errorDuringTokensMint' + | 'sendFailure' + | 'replyFailure' + | 'burnTokensDecode' + | 'transferFromDecode' + | 'builtinDecode' + | 'mintTokensDecode' + | 'replyTimeout' | 'noCorrespondingEthAddress' | 'replyHook' | 'messageNotFound' | 'invalidMessageStatus' | 'messageFailed' | 'burnTokensFailed' + | 'lockTokensFailed' | 'bridgeBuiltinMessageFailed' - | 'tokensRefundedError'; + | 'tokensRefunded' + | 'notEthClient' + | 'notEnoughGas' + | 'noCorrespondingVaraAddress' + | 'notSupportedEvent'; + +export type TokenSupply = 'ethereum' | 'gear'; export interface MessageInfo { status: MessageStatus; - details: TransactionDetails; + details: TxDetails; } export type MessageStatus = - | { sendingMessageToBurnTokens: null } - | { tokenBurnCompleted: boolean } - | { waitingReplyFromBurn: null } | { sendingMessageToBridgeBuiltin: null } | { bridgeResponseReceived: number | string | bigint | null } | { waitingReplyFromBuiltin: null } | { bridgeBuiltinStep: null } + | { sendingMessageToBurnTokens: null } + | { tokenBurnCompleted: boolean } + | { waitingReplyFromBurn: null } | { sendingMessageToMintTokens: null } | { tokenMintCompleted: null } | { waitingReplyFromMint: null } | { mintTokensStep: null } + | { sendingMessageToLockTokens: null } + | { tokenLockCompleted: boolean } + | { waitingReplyFromLock: null } + | { sendingMessageToUnlockTokens: null } + | { tokenUnlockCompleted: null } + | { waitingReplyFromUnlock: null } + | { unlockTokensStep: null } | { messageProcessedWithSuccess: number | string | bigint }; -export interface TransactionDetails { - vara_token_id: ActorId; - sender: ActorId; - amount: number | string | bigint; - receiver: H160; -} +export type TxDetails = + | { requestBridging: { vara_token_id: ActorId; sender: ActorId; amount: number | string | bigint; receiver: H160 } } + | { submitReceipt: { vara_token_id: ActorId; receiver: ActorId; amount: number | string | bigint } }; export class Program { public readonly registry: TypeRegistry; - public readonly vftGateway: VftGateway; + public readonly vftManager: VftManager; constructor(public api: GearApi, public programId?: `0x${string}`) { const types: Record = { - InitConfig: { receiver_contract_address: 'H160', gear_bridge_builtin: '[u8;32]', config: 'Config' }, + InitConfig: { + erc20_manager_address: 'H160', + gear_bridge_builtin: '[u8;32]', + eth_client: '[u8;32]', + config: 'Config', + }, Config: { - gas_to_burn_tokens: 'u64', + gas_for_token_ops: 'u64', gas_for_reply_deposit: 'u64', - gas_to_mint_tokens: 'u64', + gas_for_submit_receipt: 'u64', gas_to_send_request_to_builtin: 'u64', reply_timeout: 'u32', - gas_for_transfer_to_eth_msg: 'u64', + gas_for_request_bridging: 'u64', }, Error: { _enum: [ - 'SendError', - 'ReplyError', - 'BurnTokensDecodeError', - 'ErrorDuringTokensBurn', - 'RequestToBuiltinSendError', - 'RequestToBuiltinReplyError', - 'BuiltinDecodeError', - 'PayloadSizeError', - 'MintTokensDecodeError', - 'ReplyTimeoutError', - 'ErrorDuringTokensMint', + 'SendFailure', + 'ReplyFailure', + 'BurnTokensDecode', + 'TransferFromDecode', + 'BuiltinDecode', + 'MintTokensDecode', + 'ReplyTimeout', 'NoCorrespondingEthAddress', 'ReplyHook', 'MessageNotFound', 'InvalidMessageStatus', 'MessageFailed', 'BurnTokensFailed', + 'LockTokensFailed', 'BridgeBuiltinMessageFailed', - 'TokensRefundedError', + 'TokensRefunded', + 'NotEthClient', + 'NotEnoughGas', + 'NoCorrespondingVaraAddress', + 'NotSupportedEvent', ], }, - MessageInfo: { status: 'MessageStatus', details: 'TransactionDetails' }, + TokenSupply: { _enum: ['Ethereum', 'Gear'] }, + MessageInfo: { status: 'MessageStatus', details: 'TxDetails' }, MessageStatus: { _enum: { - SendingMessageToBurnTokens: 'Null', - TokenBurnCompleted: 'bool', - WaitingReplyFromBurn: 'Null', SendingMessageToBridgeBuiltin: 'Null', BridgeResponseReceived: 'Option', WaitingReplyFromBuiltin: 'Null', BridgeBuiltinStep: 'Null', + SendingMessageToBurnTokens: 'Null', + TokenBurnCompleted: 'bool', + WaitingReplyFromBurn: 'Null', SendingMessageToMintTokens: 'Null', TokenMintCompleted: 'Null', WaitingReplyFromMint: 'Null', MintTokensStep: 'Null', + SendingMessageToLockTokens: 'Null', + TokenLockCompleted: 'bool', + WaitingReplyFromLock: 'Null', + SendingMessageToUnlockTokens: 'Null', + TokenUnlockCompleted: 'Null', + WaitingReplyFromUnlock: 'Null', + UnlockTokensStep: 'Null', MessageProcessedWithSuccess: 'U256', }, }, - TransactionDetails: { vara_token_id: '[u8;32]', sender: '[u8;32]', amount: 'U256', receiver: 'H160' }, + TxDetails: { + _enum: { + RequestBridging: { vara_token_id: '[u8;32]', sender: '[u8;32]', amount: 'U256', receiver: 'H160' }, + SubmitReceipt: { vara_token_id: '[u8;32]', receiver: '[u8;32]', amount: 'U256' }, + }, + }, }; this.registry = new TypeRegistry(); this.registry.setKnownTypes({ types }); this.registry.register(types); - this.vftGateway = new VftGateway(this); + this.vftManager = new VftManager(this); } newCtorFromCode(code: Uint8Array | Buffer, init_config: InitConfig): TransactionBuilder { @@ -163,7 +197,7 @@ export class Program { } } -export class VftGateway { +export class VftManager { constructor(private _program: Program) {} public handleInterruptedTransfer( @@ -174,21 +208,25 @@ export class VftGateway { this._program.api, this._program.registry, 'send_message', - ['VftGateway', 'HandleInterruptedTransfer', msg_id], + ['VftManager', 'HandleInterruptedTransfer', msg_id], '(String, String, [u8;32])', 'Result<(U256, H160), Error>', this._program.programId, ); } - public mapVaraToEthAddress(vara_token_id: ActorId, eth_token_id: H160): TransactionBuilder { + public mapVaraToEthAddress( + vara_token_id: ActorId, + eth_token_id: H160, + supply_type: TokenSupply, + ): TransactionBuilder { if (!this._program.programId) throw new Error('Program ID is not set'); return new TransactionBuilder( this._program.api, this._program.registry, 'send_message', - ['VftGateway', 'MapVaraToEthAddress', vara_token_id, eth_token_id], - '(String, String, [u8;32], H160)', + ['VftManager', 'MapVaraToEthAddress', vara_token_id, eth_token_id, supply_type], + '(String, String, [u8;32], H160, TokenSupply)', 'Null', this._program.programId, ); @@ -200,14 +238,20 @@ export class VftGateway { this._program.api, this._program.registry, 'send_message', - ['VftGateway', 'RemoveVaraToEthAddress', vara_token_id], + ['VftManager', 'RemoveVaraToEthAddress', vara_token_id], '(String, String, [u8;32])', 'Null', this._program.programId, ); } - public transferVaraToEth( + /** + * Request bridging of tokens from gear to ethereum. It involves locking/burning + * `vft` tokens (specific operation depends on the token supply type) and sending + * request to the bridge built-in actor. + */ + public requestBridging( + sender: ActorId, vara_token_id: ActorId, amount: number | string | bigint, receiver: H160, @@ -217,61 +261,76 @@ export class VftGateway { this._program.api, this._program.registry, 'send_message', - ['VftGateway', 'TransferVaraToEth', vara_token_id, amount, receiver], - '(String, String, [u8;32], U256, H160)', + ['VftManager', 'RequestBridging', sender, vara_token_id, amount, receiver], + '(String, String, [u8;32], [u8;32], U256, H160)', 'Result<(U256, H160), Error>', this._program.programId, ); } - public updateConfig( - gas_to_burn_tokens: number | string | bigint | null, - gas_to_mint_tokens: number | string | bigint | null, - gas_for_reply_deposit: number | string | bigint | null, - gas_to_send_request_to_builtin: number | string | bigint | null, - reply_timeout: number | null, - gas_for_transfer_to_eth_msg: number | string | bigint | null, - ): TransactionBuilder { + /** + * Submit rlp-encoded transaction receipt. This receipt is decoded under the hood + * and checked that it's a valid receipt from tx send to `ERC20Manager` contract. + * This entrypoint can be called only by `ethereum-event-client`. + */ + public submitReceipt(receipt_rlp: `0x${string}`): TransactionBuilder<{ ok: null } | { err: Error }> { + if (!this._program.programId) throw new Error('Program ID is not set'); + return new TransactionBuilder<{ ok: null } | { err: Error }>( + this._program.api, + this._program.registry, + 'send_message', + ['VftManager', 'SubmitReceipt', receipt_rlp], + '(String, String, Vec)', + 'Result', + this._program.programId, + ); + } + + public updateConfig(config: Config): TransactionBuilder { if (!this._program.programId) throw new Error('Program ID is not set'); return new TransactionBuilder( this._program.api, this._program.registry, 'send_message', - [ - 'VftGateway', - 'UpdateConfig', - gas_to_burn_tokens, - gas_to_mint_tokens, - gas_for_reply_deposit, - gas_to_send_request_to_builtin, - reply_timeout, - gas_for_transfer_to_eth_msg, - ], - '(String, String, Option, Option, Option, Option, Option, Option)', + ['VftManager', 'UpdateConfig', config], + '(String, String, Config)', 'Null', this._program.programId, ); } - public updateReceiverContractAddress(new_receiver_contract_address: H160): TransactionBuilder { + public updateErc20ManagerAddress(new_erc20_manager_address: H160): TransactionBuilder { if (!this._program.programId) throw new Error('Program ID is not set'); return new TransactionBuilder( this._program.api, this._program.registry, 'send_message', - ['VftGateway', 'UpdateReceiverContractAddress', new_receiver_contract_address], + ['VftManager', 'UpdateErc20ManagerAddress', new_erc20_manager_address], '(String, String, H160)', 'Null', this._program.programId, ); } + public updateEthClient(eth_client_new: ActorId): TransactionBuilder { + if (!this._program.programId) throw new Error('Program ID is not set'); + return new TransactionBuilder( + this._program.api, + this._program.registry, + 'send_message', + ['VftManager', 'UpdateEthClient', eth_client_new], + '(String, String, [u8;32])', + 'Null', + this._program.programId, + ); + } + public async admin( originAddress?: string, value?: number | string | bigint, atBlock?: `0x${string}`, ): Promise { - const payload = this._program.registry.createType('(String, String)', ['VftGateway', 'Admin']).toHex(); + const payload = this._program.registry.createType('(String, String)', ['VftManager', 'Admin']).toHex(); const reply = await this._program.api.message.calculateReply({ destination: this._program.programId!, origin: originAddress ? decodeAddress(originAddress) : ZERO_ADDRESS, @@ -285,12 +344,33 @@ export class VftGateway { return result[2].toJSON() as unknown as ActorId; } - public async gearBridgeBuiltin( + public async erc20ManagerAddress( + originAddress?: string, + value?: number | string | bigint, + atBlock?: `0x${string}`, + ): Promise { + const payload = this._program.registry + .createType('(String, String)', ['VftManager', 'Erc20ManagerAddress']) + .toHex(); + const reply = await this._program.api.message.calculateReply({ + destination: this._program.programId!, + origin: originAddress ? decodeAddress(originAddress) : ZERO_ADDRESS, + payload, + value: value || 0, + gasLimit: this._program.api.blockGasLimit.toBigInt(), + at: atBlock, + }); + if (!reply.code.isSuccess) throw new Error(this._program.registry.createType('String', reply.payload).toString()); + const result = this._program.registry.createType('(String, String, H160)', reply.payload); + return result[2].toJSON() as unknown as H160; + } + + public async ethClient( originAddress?: string, value?: number | string | bigint, atBlock?: `0x${string}`, ): Promise { - const payload = this._program.registry.createType('(String, String)', ['VftGateway', 'GearBridgeBuiltin']).toHex(); + const payload = this._program.registry.createType('(String, String)', ['VftManager', 'EthClient']).toHex(); const reply = await this._program.api.message.calculateReply({ destination: this._program.programId!, origin: originAddress ? decodeAddress(originAddress) : ZERO_ADDRESS, @@ -304,12 +384,12 @@ export class VftGateway { return result[2].toJSON() as unknown as ActorId; } - public async getConfig( + public async gearBridgeBuiltin( originAddress?: string, value?: number | string | bigint, atBlock?: `0x${string}`, - ): Promise { - const payload = this._program.registry.createType('(String, String)', ['VftGateway', 'GetConfig']).toHex(); + ): Promise { + const payload = this._program.registry.createType('(String, String)', ['VftManager', 'GearBridgeBuiltin']).toHex(); const reply = await this._program.api.message.calculateReply({ destination: this._program.programId!, origin: originAddress ? decodeAddress(originAddress) : ZERO_ADDRESS, @@ -319,16 +399,16 @@ export class VftGateway { at: atBlock, }); if (!reply.code.isSuccess) throw new Error(this._program.registry.createType('String', reply.payload).toString()); - const result = this._program.registry.createType('(String, String, Config)', reply.payload); - return result[2].toJSON() as unknown as Config; + const result = this._program.registry.createType('(String, String, [u8;32])', reply.payload); + return result[2].toJSON() as unknown as ActorId; } - public async msgTrackerState( + public async getConfig( originAddress?: string, value?: number | string | bigint, atBlock?: `0x${string}`, - ): Promise> { - const payload = this._program.registry.createType('(String, String)', ['VftGateway', 'MsgTrackerState']).toHex(); + ): Promise { + const payload = this._program.registry.createType('(String, String)', ['VftManager', 'GetConfig']).toHex(); const reply = await this._program.api.message.calculateReply({ destination: this._program.programId!, origin: originAddress ? decodeAddress(originAddress) : ZERO_ADDRESS, @@ -338,18 +418,16 @@ export class VftGateway { at: atBlock, }); if (!reply.code.isSuccess) throw new Error(this._program.registry.createType('String', reply.payload).toString()); - const result = this._program.registry.createType('(String, String, Vec<([u8;32], MessageInfo)>)', reply.payload); - return result[2].toJSON() as unknown as Array<[MessageId, MessageInfo]>; + const result = this._program.registry.createType('(String, String, Config)', reply.payload); + return result[2].toJSON() as unknown as Config; } - public async receiverContractAddress( + public async msgTrackerState( originAddress?: string, value?: number | string | bigint, atBlock?: `0x${string}`, - ): Promise { - const payload = this._program.registry - .createType('(String, String)', ['VftGateway', 'ReceiverContractAddress']) - .toHex(); + ): Promise> { + const payload = this._program.registry.createType('(String, String)', ['VftManager', 'MsgTrackerState']).toHex(); const reply = await this._program.api.message.calculateReply({ destination: this._program.programId!, origin: originAddress ? decodeAddress(originAddress) : ZERO_ADDRESS, @@ -359,16 +437,16 @@ export class VftGateway { at: atBlock, }); if (!reply.code.isSuccess) throw new Error(this._program.registry.createType('String', reply.payload).toString()); - const result = this._program.registry.createType('(String, String, H160)', reply.payload); - return result[2].toJSON() as unknown as H160; + const result = this._program.registry.createType('(String, String, Vec<([u8;32], MessageInfo)>)', reply.payload); + return result[2].toJSON() as unknown as Array<[MessageId, MessageInfo]>; } public async varaToEthAddresses( originAddress?: string, value?: number | string | bigint, atBlock?: `0x${string}`, - ): Promise> { - const payload = this._program.registry.createType('(String, String)', ['VftGateway', 'VaraToEthAddresses']).toHex(); + ): Promise> { + const payload = this._program.registry.createType('(String, String)', ['VftManager', 'VaraToEthAddresses']).toHex(); const reply = await this._program.api.message.calculateReply({ destination: this._program.programId!, origin: originAddress ? decodeAddress(originAddress) : ZERO_ADDRESS, @@ -378,7 +456,82 @@ export class VftGateway { at: atBlock, }); if (!reply.code.isSuccess) throw new Error(this._program.registry.createType('String', reply.payload).toString()); - const result = this._program.registry.createType('(String, String, Vec<([u8;32], H160)>)', reply.payload); - return result[2].toJSON() as unknown as Array<[ActorId, H160]>; + const result = this._program.registry.createType( + '(String, String, Vec<([u8;32], H160, TokenSupply)>)', + reply.payload, + ); + return result[2].toJSON() as unknown as Array<[ActorId, H160, TokenSupply]>; + } + + public subscribeToTokenMappingAddedEvent( + callback: (data: { vara_token_id: ActorId; eth_token_id: H160 }) => void | Promise, + ): Promise<() => void> { + return this._program.api.gearEvents.subscribeToGearEvent('UserMessageSent', ({ data: { message } }) => { + if (!message.source.eq(this._program.programId) || !message.destination.eq(ZERO_ADDRESS)) { + return; + } + + const payload = message.payload.toHex(); + if (getServiceNamePrefix(payload) === 'VftManager' && getFnNamePrefix(payload) === 'TokenMappingAdded') { + callback( + this._program.registry + .createType('(String, String, {"vara_token_id":"[u8;32]","eth_token_id":"H160"})', message.payload)[2] + .toJSON() as unknown as { vara_token_id: ActorId; eth_token_id: H160 }, + ); + } + }); + } + + public subscribeToTokenMappingRemovedEvent( + callback: (data: { vara_token_id: ActorId; eth_token_id: H160 }) => void | Promise, + ): Promise<() => void> { + return this._program.api.gearEvents.subscribeToGearEvent('UserMessageSent', ({ data: { message } }) => { + if (!message.source.eq(this._program.programId) || !message.destination.eq(ZERO_ADDRESS)) { + return; + } + + const payload = message.payload.toHex(); + if (getServiceNamePrefix(payload) === 'VftManager' && getFnNamePrefix(payload) === 'TokenMappingRemoved') { + callback( + this._program.registry + .createType('(String, String, {"vara_token_id":"[u8;32]","eth_token_id":"H160"})', message.payload)[2] + .toJSON() as unknown as { vara_token_id: ActorId; eth_token_id: H160 }, + ); + } + }); + } + + public subscribeToBridgingRequestedEvent( + callback: (data: { + nonce: number | string | bigint; + vara_token_id: ActorId; + amount: number | string | bigint; + sender: ActorId; + receiver: H160; + }) => void | Promise, + ): Promise<() => void> { + return this._program.api.gearEvents.subscribeToGearEvent('UserMessageSent', ({ data: { message } }) => { + if (!message.source.eq(this._program.programId) || !message.destination.eq(ZERO_ADDRESS)) { + return; + } + + const payload = message.payload.toHex(); + if (getServiceNamePrefix(payload) === 'VftManager' && getFnNamePrefix(payload) === 'BridgingRequested') { + callback( + this._program.registry + .createType( + '(String, String, {"nonce":"U256","vara_token_id":"[u8;32]","amount":"U256","sender":"[u8;32]","receiver":"H160"})', + message.payload, + )[2] + .toJSON() as unknown as { + nonce: number | string | bigint; + vara_token_id: ActorId; + amount: number | string | bigint; + sender: ActorId; + receiver: H160; + }, + ); + } + }); } } diff --git a/frontend/src/features/history/utils/filters.ts b/frontend/src/features/history/utils/filters.ts index b9ee4df5..82773363 100644 --- a/frontend/src/features/history/utils/filters.ts +++ b/frontend/src/features/history/utils/filters.ts @@ -4,7 +4,7 @@ import { ActorId, H160 } from 'sails-js'; const getLastDaysISOTimestamp = (daysCount: number) => new Date(Date.now() - daysCount * 24 * 60 * 60 * 1000).toISOString(); -const getAssetOptions = (addresses: [ActorId, H160][], symbols: Record) => { +const getAssetOptions = (addresses: [ActorId, H160, 'ethereum' | 'gear'][], symbols: Record) => { const options = [] as { label: string; value: string }[]; for (const pair of addresses) { diff --git a/frontend/src/features/swap/consts/vara.ts b/frontend/src/features/swap/consts/vara.ts index 91579c9b..558a2508 100644 --- a/frontend/src/features/swap/consts/vara.ts +++ b/frontend/src/features/swap/consts/vara.ts @@ -1,16 +1,13 @@ const SERVICE_NAME = { BRIDGING_PAYMENT: 'bridgingPayment', - VFT_GATEWAY: 'vftGateway', VFT: 'vft', } as const; const FUNCTION_NAME = { - REQUEST_TO_GATEWAY: 'requestToGateway', APPROVE: 'approve', } as const; const QUERY_NAME = { - VFT_GATEWAY_ADDRESS: 'vftGatewayAddress', FT_ADDRESSES: 'varaToEthAddresses', BALANCE: 'balanceOf', DECIMALS: 'decimals', diff --git a/frontend/src/features/swap/hooks/vara/use-handle-vara-submit.ts b/frontend/src/features/swap/hooks/vara/use-handle-vara-submit.ts index 5ea36c30..2df92cb0 100644 --- a/frontend/src/features/swap/hooks/vara/use-handle-vara-submit.ts +++ b/frontend/src/features/swap/hooks/vara/use-handle-vara-submit.ts @@ -17,7 +17,7 @@ function useSendBridgingPaymentRequest() { return useSendProgramTransaction({ program, serviceName: SERVICE_NAME.BRIDGING_PAYMENT, - functionName: FUNCTION_NAME.REQUEST_TO_GATEWAY, + functionName: 'makeRequest', }); } diff --git a/frontend/src/features/swap/utils.ts b/frontend/src/features/swap/utils.ts index f9806ff7..d3228dc1 100644 --- a/frontend/src/features/swap/utils.ts +++ b/frontend/src/features/swap/utils.ts @@ -24,7 +24,10 @@ const getAmountSchema = ( .refine(() => feeValue <= accountBalanceValue, { message: ERROR_MESSAGE.NO_ACCOUNT_BALANCE }); }; -const getOptions = (addresses: [ActorId, H160][] | undefined, symbols: Record | undefined) => { +const getOptions = ( + addresses: [ActorId, H160, 'ethereum' | 'gear'][] | undefined, + symbols: Record | undefined, +) => { const varaOptions: { label: string; value: string }[] = []; const ethOptions: { label: string; value: string }[] = []; diff --git a/frontend/src/hooks/tokens/use-ft-addresses.ts b/frontend/src/hooks/tokens/use-ft-addresses.ts index 7ab3e313..eb20cd01 100644 --- a/frontend/src/hooks/tokens/use-ft-addresses.ts +++ b/frontend/src/hooks/tokens/use-ft-addresses.ts @@ -1,7 +1,7 @@ import { HexString } from '@gear-js/api'; import { useProgram, useProgramQuery } from '@gear-js/react-hooks'; -import { BridgingPaymentProgram, BRIDGING_PAYMENT_CONTRACT_ADDRESS, VftGatewayProgram } from '@/consts'; +import { BridgingPaymentProgram, BRIDGING_PAYMENT_CONTRACT_ADDRESS, VftManagerProgram } from '@/consts'; function useFTAddresses() { const { data: program } = useProgram({ @@ -9,21 +9,21 @@ function useFTAddresses() { id: BRIDGING_PAYMENT_CONTRACT_ADDRESS, }); - const { data: vftGatewayAddress } = useProgramQuery({ + const { data: vftManagerAddress } = useProgramQuery({ program, serviceName: 'bridgingPayment', - functionName: 'vftGatewayAddress', + functionName: 'vftManagerAddress', args: [], }); - const { data: vftGatewayProgram } = useProgram({ - library: VftGatewayProgram, - id: vftGatewayAddress?.toString() as HexString, + const { data: vftManagerProgram } = useProgram({ + library: VftManagerProgram, + id: vftManagerAddress?.toString() as HexString, }); return useProgramQuery({ - program: vftGatewayProgram, - serviceName: 'vftGateway', + program: vftManagerProgram, + serviceName: 'vftManager', functionName: 'varaToEthAddresses', args: [], }); diff --git a/frontend/src/hooks/tokens/use-ft-decimals.ts b/frontend/src/hooks/tokens/use-ft-decimals.ts index f06d8fb2..5b962ba8 100644 --- a/frontend/src/hooks/tokens/use-ft-decimals.ts +++ b/frontend/src/hooks/tokens/use-ft-decimals.ts @@ -7,7 +7,7 @@ import { readContract } from 'wagmi/actions'; import { VftProgram, FUNGIBLE_TOKEN_ABI } from '@/consts'; -function useFTDecimals(addresses: [ActorId, H160][] | undefined) { +function useFTDecimals(addresses: [ActorId, H160, 'ethereum' | 'gear'][] | undefined) { const { api, isApiReady } = useApi(); const wagmiConfig = useConfig(); diff --git a/frontend/src/hooks/tokens/use-ft-symbols.ts b/frontend/src/hooks/tokens/use-ft-symbols.ts index f99aec15..ba1483f3 100644 --- a/frontend/src/hooks/tokens/use-ft-symbols.ts +++ b/frontend/src/hooks/tokens/use-ft-symbols.ts @@ -7,7 +7,7 @@ import { readContract } from 'wagmi/actions'; import { VftProgram, FUNGIBLE_TOKEN_ABI } from '@/consts'; -function useFTSymbols(addresses: [ActorId, H160][] | undefined) { +function useFTSymbols(addresses: [ActorId, H160, 'ethereum' | 'gear'][] | undefined) { const { api, isApiReady } = useApi(); const wagmiConfig = useConfig();