From 9b38fef28f9cef3edb4ec2e07514ca3de0b28fd9 Mon Sep 17 00:00:00 2001 From: import this <97586125+serinko@users.noreply.github.com> Date: Fri, 10 Oct 2025 14:38:37 +0000 Subject: [PATCH] [DOCs/operators] QUIC deployment script & docs (#6098) * add quic_bridge_deployment.sh * create a snippet with quick install steps * add quic deployment to changelog * add quic deployment to node config page * add version compatibility callout * last edits and scraped stats update * correct name of QUIC snippet * fix naming * fix naming * re-run python-prebuild.sh aka time-now updated * attempt to fix vercel build the hard way * rerun npm * build with pnpm * restore lock file and rebuild w pnpm * chore: update pnpm lockfile * attempt to fix build * attempt to fix runtime builds * update ci-docs run OS --- .../docs/components/cosmos-kit/index.tsx | 9 +- .../quic-bridge-deployment-script-setup.mdx | 101 ++ .../outputs/api-scraping-outputs/time-now.md | 2 +- .../node-api-check-query-help.md | 2 +- documentation/docs/package.json | 9 +- .../docs/pages/operators/changelog.mdx | 5 + .../nodes/nym-node/configuration.mdx | 4 + documentation/docs/pnpm-lock.yaml | 360 ++++--- .../nym-node-setup/quic_bridge_deployment.sh | 941 ++++++++++++++++++ 9 files changed, 1273 insertions(+), 160 deletions(-) create mode 100644 documentation/docs/components/operators/snippets/quic-bridge-deployment-script-setup.mdx create mode 100644 scripts/nym-node-setup/quic_bridge_deployment.sh diff --git a/documentation/docs/components/cosmos-kit/index.tsx b/documentation/docs/components/cosmos-kit/index.tsx index 0f575ec77a..c77b7e3e1d 100644 --- a/documentation/docs/components/cosmos-kit/index.tsx +++ b/documentation/docs/components/cosmos-kit/index.tsx @@ -11,6 +11,7 @@ import { Alert, AlertTitle } from '@mui/material'; import { Wallet } from '@cosmos-kit/core'; import { CosmosKitLedger } from './ledger'; import { CosmosKitSign } from './sign'; +import type { SignerOptions } from '@cosmos-kit/core'; const CosmosKitSetup: FC<{ children: React.ReactNode }> = ({ children }) => { const assetsFixedUp = React.useMemo(() => { @@ -40,14 +41,16 @@ const CosmosKitSetup: FC<{ children: React.ReactNode }> = ({ children }) => { return chains; }, [chains]); + + // components/cosmos-kit/index.tsx + return ( 'amino', - }} + signerOptions={{ preferredSignType: () => 'amino' }} + throwErrors={false} > {children} diff --git a/documentation/docs/components/operators/snippets/quic-bridge-deployment-script-setup.mdx b/documentation/docs/components/operators/snippets/quic-bridge-deployment-script-setup.mdx new file mode 100644 index 0000000000..f1a11860db --- /dev/null +++ b/documentation/docs/components/operators/snippets/quic-bridge-deployment-script-setup.mdx @@ -0,0 +1,101 @@ +import { Steps } from 'nextra/components'; +import { Callout } from 'nextra/components'; +import { AccordionTemplate } from 'components/accordion-template.tsx'; + + +**QUIC bridge is a requirement for all nodes which enable Wireguard functionality. Note that it this feature is compatible with nodes from `v1.18.0` (platform release [`v2025.17-isabirra`](https://github.com/nymtech/nym/releases/tag/nym-binaries-v2025.17-isabirra)) and newer!** + + +Nym Network uses various [transport bridges](https://github.com/nymtech/nym-bridges/blob/main/README.md) for routing the packets. Right now operators need to configure [our implementation](https://github.com/nymtech/nym-bridges/tree/main/nym-bridge) of general-purpose transport layer network protocol called [QUIC](https://en.wikipedia.org/wiki/QUIC). + +Operators can use [Nym Bridge Configuration Tool](https://github.com/nymtech/nym-bridges/tree/main/bridge-cfg) and compile the [Bridge Runner binary](https://github.com/nymtech/nym-bridges/tree/main/nym-bridge) themselves. + +**We recommend a more convenient QUIC bridge deployment using a script [`quic_bridge_deployment.sh`](https://github.com/nymtech/nym/blob/develop/scripts/nym-node-setup/quic_bridge_deployment.sh), following the steps below.** + + +###### 1. Download [`quic_bridge_deployment.sh`](https://github.com/nymtech/nym/blob/develop/scripts/nym-node-setup/quic_bridge_deployment.sh) script +- SSH to your server +- Download the script and make executable +```sh +wget https://raw.githubusercontent.com/nymtech/nym/refs/heads/develop/scripts/nym-node-setup/quic_bridge_deployment.sh && \ +chmod +x quic_bridge_deployment.sh +``` + + +###### 2. Run the script with `full_bridge_setup` command +- Optional: open `tmux` in case you will need to run another commands on the VPS +- Run the script with a command `full_bridge_setup` +```sh +./nym-node-setup/quic_bridge_deployment.sh full_bridge_setup +``` + +###### 3. Follow the interactive prompts +- When you are asked for bridge binary URL, look here for one to match your system: [builds.ci.nymte.ch/QUIC](https://builds.ci.nymte.ch/QUIC/) +- When you are asked to enter forward address, it's your IPv4 used for bonding the node, alongside port `:51822` (an example: `172.232.238.161:51822`) +- To find out your IP address you can always run: + - IPv4: `curl -4 https://ifconfig.co/ip` + - IPv6: `curl -6 https://ifconfig.co/ip` +- **For all prompts with default options, we highly recommend to stick to default (press enter)** + +###### 4. Restart the node service +- When done with the deployment, please restart your node systemd service +```sh +service nym-node restart && journalctl -u nym-node.service -f --all +``` + + +Congratulation, you deployed QUIC transport bridge! The script offers a standalone tweaks and checks, you can always run it without any argument to see all the options: +```sh +./quic_bridge_deployment.sh +``` +
+ +```shell +root@localhost:~# ./quic_bridge_deployment.sh +iptables-persistent is already installed. +Usage: ./quic_bridge_deployment.sh [command] [options] + +Nym QUIC Bridge Deployment Helper Script + +Bridge Installation & Configuration: + check_bridge_installation - Check bridge installation status + show_bridge_config - Display bridge configuration files + show_bridge_keys - Display bridge key information + show_bridge_info - Show comprehensive bridge information + verify_bridge_prerequisites - Verify all prerequisites are met + +Bridge Setup Commands: + install_bridge_binary - Download and install nym-bridge binary + generate_bridge_keys - Generate ED25519 bridge identity keys + create_client_params - Create client_bridge_params.json + create_bridge_config - Create bridges.toml configuration + create_bridge_service - Create systemd service file + full_bridge_setup - Interactive full bridge setup wizard + +Network Configuration Commands: + adjust_ip_forwarding - Enable IPv4 and IPv6 forwarding + apply_bridge_iptables_rules - Apply iptables rules for QUIC bridge (nymwg) + configure_dns_and_icmp - Allow ICMP ping tests and configure DNS + remove_duplicate_bridge_rules - Remove duplicate iptables rules for nymwg + +Network Inspection Commands: + fetch_and_display_ipv6 - Show IPv6 on default network device + fetch_wg_ipv6_address - Fetch IPv6 for nymwg interface + check_bridge_iptables - Check iptables rules for nymwg + check_ipv6_ipv4_forwarding - Check IPv4 and IPv6 forwarding status + check_ip_routing - Display IP routing tables + +Testing Commands: + perform_pings - Test IPv4 and IPv6 connectivity + test_bridge_connectivity - Comprehensive bridge connectivity test + +Service Management Commands: + check_bridge_service_status - Check nym-bridge and nym-node service status + show_bridge_logs [lines] - Show recent nym-bridge logs (default: 50 lines) + +Quick Start: + 1. Run 'verify_bridge_prerequisites' to check prerequisites + 2. Run 'check_bridge_installation' to verify installation + 3. Run 'test_bridge_connectivity' to test connectivity +``` + diff --git a/documentation/docs/components/outputs/api-scraping-outputs/time-now.md b/documentation/docs/components/outputs/api-scraping-outputs/time-now.md index f520e7ffee..6ed8d8653f 100644 --- a/documentation/docs/components/outputs/api-scraping-outputs/time-now.md +++ b/documentation/docs/components/outputs/api-scraping-outputs/time-now.md @@ -1 +1 @@ -Sunday, October 5th 2025, 09:29:02 UTC +Friday, October 10th 2025, 12:39:08 UTC diff --git a/documentation/docs/components/outputs/command-outputs/node-api-check-query-help.md b/documentation/docs/components/outputs/command-outputs/node-api-check-query-help.md index 999f3d4a6f..bfa068ddb0 100644 --- a/documentation/docs/components/outputs/command-outputs/node-api-check-query-help.md +++ b/documentation/docs/components/outputs/command-outputs/node-api-check-query-help.md @@ -11,7 +11,7 @@ options: --no_routing_history Display node stats without routing history --no_verloc_metrics Display node stats without verloc metrics -m, --markdown Display results in markdown format - -o, --output [OUTPUT] + -o [OUTPUT], --output [OUTPUT] Save results to file (in current dir or supply with path without filename) ``` diff --git a/documentation/docs/package.json b/documentation/docs/package.json index 6be16afb45..8ff630dad4 100644 --- a/documentation/docs/package.json +++ b/documentation/docs/package.json @@ -24,11 +24,11 @@ "@cosmjs/encoding": "^0.32.2", "@cosmjs/proto-signing": "^0.32.2", "@cosmjs/stargate": "^0.32.2", - "@cosmos-kit/core": "^2.8.9", + "@cosmos-kit/core": "^2.16.3", "@cosmos-kit/keplr": "^2.6.9", "@cosmos-kit/keplr-extension": "^2.7.9", "@cosmos-kit/ledger": "^2.6.9", - "@cosmos-kit/react": "^2.10.11", + "@cosmos-kit/react": "^2.22.3", "@emotion/react": "^11.11.1", "@emotion/styled": "^11.11.0", "@interchain-ui/react": "^1.8.0", @@ -54,12 +54,15 @@ "uuid": "^9.0.0" }, "devDependencies": { + "@next/swc-linux-x64-gnu": "15.5.0", "@types/node": "18.11.10", + "@types/react": "^18.3.26", + "@types/react-dom": "^18.3.7", "copy-webpack-plugin": "^11.0.0", "eslint": "8.46.0", "eslint-config-next": "13.4.13", "raw-loader": "^4.0.2", - "typescript": "^4.9.3" + "typescript": "^5.9.3" }, "private": false } diff --git a/documentation/docs/pages/operators/changelog.mdx b/documentation/docs/pages/operators/changelog.mdx index 5e0ffbcbab..5795042992 100644 --- a/documentation/docs/pages/operators/changelog.mdx +++ b/documentation/docs/pages/operators/changelog.mdx @@ -7,6 +7,7 @@ import { AccordionTemplate } from 'components/accordion-template.tsx'; import { Steps } from 'nextra/components'; import AbuseResponse from 'components/operators/templates/dmca_response.md'; import OperatorIntroduction from 'components/operators/templates/provider_introduction.md'; +import QuicDeploymentSteps from 'components/operators/snippets/quic-bridge-deployment-script-setup.mdx'; export const TestingSteps = () => ( @@ -48,6 +49,10 @@ This page displays a full list of all the changes during our release cycle from +## QUIC Transport Bridge Deployment + + + ## `v2025.17-isabirra` - [Release Binaries](https://github.com/nymtech/nym/releases/tag/nym-binaries-v2025.17-isabirra) diff --git a/documentation/docs/pages/operators/nodes/nym-node/configuration.mdx b/documentation/docs/pages/operators/nodes/nym-node/configuration.mdx index 81044db705..69afc1e41d 100644 --- a/documentation/docs/pages/operators/nodes/nym-node/configuration.mdx +++ b/documentation/docs/pages/operators/nodes/nym-node/configuration.mdx @@ -8,6 +8,7 @@ import ExitPolicyStatusOutput from 'components/operators/snippets/wg-exit-policy import ExitPolicyTestOutput from 'components/operators/snippets/wg-exit-policy-test-output.mdx'; import ExitPolicyTestServer from 'components/operators/snippets/wg-exit-policy-testing-from-server.mdx'; import ExitPolicyTestOutside from 'components/operators/snippets/wg-exit-policy-testing-from-outside.mdx'; +import QuicDeploymentSteps from 'components/operators/snippets/quic-bridge-deployment-script-setup.mdx'; export const ManagerIPOutput = () => ( @@ -534,6 +535,9 @@ You can validate the application of the IP tables routes on your `nym-node` by c Your node has successfully implemented wireguard exit policy with the same routing permissions like [Nym exit policy](https://nymtech.net/.wellknown/network-requester/exit-policy.txt) used on 5-hop (Mixnet). +## QUIC Transport Bridge Deployment + + ## Running `nym-node` as a non-root diff --git a/documentation/docs/pnpm-lock.yaml b/documentation/docs/pnpm-lock.yaml index 81d19c0b49..3fa8337bc4 100644 --- a/documentation/docs/pnpm-lock.yaml +++ b/documentation/docs/pnpm-lock.yaml @@ -36,11 +36,11 @@ importers: specifier: ^0.32.2 version: 0.32.4 '@cosmos-kit/core': - specifier: ^2.8.9 + specifier: ^2.16.3 version: 2.16.3 '@cosmos-kit/keplr': specifier: ^2.6.9 - version: 2.15.3(@cosmjs/amino@0.32.4)(@cosmjs/proto-signing@0.32.4)(@walletconnect/sign-client@2.21.8(typescript@4.9.5)(zod@3.25.76))(@walletconnect/types@2.21.8)(starknet@7.6.4)(typescript@4.9.5)(zod@3.25.76) + version: 2.15.3(@cosmjs/amino@0.32.4)(@cosmjs/proto-signing@0.32.4)(@walletconnect/sign-client@2.21.8(typescript@5.9.3)(zod@3.25.76))(@walletconnect/types@2.21.8)(starknet@7.6.4)(typescript@5.9.3)(zod@3.25.76) '@cosmos-kit/keplr-extension': specifier: ^2.7.9 version: 2.15.3(@cosmjs/amino@0.32.4)(@cosmjs/proto-signing@0.32.4)(starknet@7.6.4) @@ -48,38 +48,41 @@ importers: specifier: ^2.6.9 version: 2.14.3(@cosmjs/amino@0.32.4)(@cosmjs/crypto@0.32.4)(@cosmjs/encoding@0.32.4)(@cosmjs/proto-signing@0.32.4) '@cosmos-kit/react': - specifier: ^2.10.11 - version: 2.22.3(@cosmjs/amino@0.32.4)(@cosmjs/proto-signing@0.32.4)(@interchain-ui/react@1.26.3(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^2.22.3 + version: 2.22.3(@cosmjs/amino@0.32.4)(@cosmjs/proto-signing@0.32.4)(@interchain-ui/react@1.26.3(@types/react@18.3.26)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react-dom@18.3.7(@types/react@18.3.26))(@types/react@18.3.26)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@emotion/react': specifier: ^11.11.1 - version: 11.14.0(react@18.3.1) + version: 11.14.0(@types/react@18.3.26)(react@18.3.1) '@emotion/styled': specifier: ^11.11.0 - version: 11.14.1(@emotion/react@11.14.0(react@18.3.1))(react@18.3.1) + version: 11.14.1(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react@18.3.1) '@interchain-ui/react': specifier: ^1.8.0 - version: 1.26.3(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 1.26.3(@types/react@18.3.26)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mui/icons-material': specifier: ^5.14.9 - version: 5.18.0(@mui/material@5.18.0(@emotion/react@11.14.0(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) + version: 5.18.0(@mui/material@5.18.0(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.26)(react@18.3.1) '@mui/lab': specifier: ^5.0.0-alpha.145 - version: 5.0.0-alpha.177(@emotion/react@11.14.0(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(react@18.3.1))(react@18.3.1))(@mui/material@5.18.0(@emotion/react@11.14.0(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 5.0.0-alpha.177(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react@18.3.1))(@mui/material@5.18.0(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.26)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mui/material': specifier: ^5.14.8 - version: 5.18.0(@emotion/react@11.14.0(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 5.18.0(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@nextui-org/accordion': specifier: ^2.0.40 version: 2.2.7(@nextui-org/system@2.4.6(@nextui-org/theme@2.4.5(tailwindcss@4.1.12))(framer-motion@12.23.12(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@nextui-org/theme@2.4.5(tailwindcss@4.1.12))(framer-motion@12.23.12(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@nextui-org/react': specifier: ^2.4.8 - version: 2.6.11(framer-motion@12.23.12(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(tailwindcss@4.1.12) + version: 2.6.11(@types/react@18.3.26)(framer-motion@12.23.12(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(tailwindcss@4.1.12) + '@nymproject/contract-clients': + specifier: '>=1.2.4-rc.2 || ^1' + version: 1.4.1 '@nymproject/mix-fetch-full-fat': - specifier: file:../../dist/wasm/mix-fetch - version: '@nymproject/mix-fetch-wasm@file:../../dist/wasm/mix-fetch' + specifier: '>=1.2.4-rc.2 || ^1' + version: 1.2.3 '@nymproject/sdk-full-fat': - specifier: file:../../dist/wasm/client - version: '@nymproject/nym-client-wasm@file:../../dist/wasm/client' + specifier: '>=1.2.4-rc.2 || ^1' + version: 1.2.3 '@redocly/cli': specifier: ^1.25.15 version: 1.34.5(ajv@8.17.1) @@ -117,9 +120,18 @@ importers: specifier: ^9.0.0 version: 9.0.1 devDependencies: + '@next/swc-linux-x64-gnu': + specifier: 15.5.0 + version: 15.5.0 '@types/node': specifier: 18.11.10 version: 18.11.10 + '@types/react': + specifier: ^18.3.26 + version: 18.3.26 + '@types/react-dom': + specifier: ^18.3.7 + version: 18.3.7(@types/react@18.3.26) copy-webpack-plugin: specifier: ^11.0.0 version: 11.0.0(webpack@5.101.3) @@ -128,13 +140,13 @@ importers: version: 8.46.0 eslint-config-next: specifier: 13.4.13 - version: 13.4.13(eslint@8.46.0)(typescript@4.9.5) + version: 13.4.13(eslint@8.46.0)(typescript@5.9.3) raw-loader: specifier: ^4.0.2 version: 4.0.2(webpack@5.101.3) typescript: - specifier: ^4.9.3 - version: 4.9.5 + specifier: ^5.9.3 + version: 5.9.3 packages: @@ -1664,11 +1676,14 @@ packages: resolution: {integrity: sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==} engines: {node: '>=12.4.0'} - '@nymproject/mix-fetch-wasm@file:../../dist/wasm/mix-fetch': - resolution: {directory: ../../dist/wasm/mix-fetch, type: directory} + '@nymproject/contract-clients@1.4.1': + resolution: {integrity: sha512-HuJZ4Hv+Rl6ZZEtCHKgurNLJapM+QQRJlGkevFH2a4UdqUqF9omUkUi3AVes4679dPoSFgvA7plyVSDBdbgV6w==} - '@nymproject/nym-client-wasm@file:../../dist/wasm/client': - resolution: {directory: ../../dist/wasm/client, type: directory} + '@nymproject/mix-fetch-full-fat@1.2.3': + resolution: {integrity: sha512-5yAQhw33LC0cNsyV0Rj+LIa2kvJY+8jsfgOSr1aeKNfQ7dG4fngWkKnGUbPGzhUTJjqgXPTwNVeJSd6hwGim+g==} + + '@nymproject/sdk-full-fat@1.2.3': + resolution: {integrity: sha512-lheA1Zk020o2t95FPVZfdUR0aSI52aD0aJQs074fjH16QkoNNEMotzhJGAnsnnczVg3bpddKghNpCLyDOWvg9A==} '@opentelemetry/api-logs@0.53.0': resolution: {integrity: sha512-8HArjKx+RaAI8uEIgcORbZIPklyh1YLjPSBus8hjRmvLi6DeFzgOcdZ7KwPabKj8mXF8dX0hyfAyGfycz0DbFw==} @@ -2844,13 +2859,18 @@ packages: '@types/prop-types@15.7.15': resolution: {integrity: sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==} + '@types/react-dom@18.3.7': + resolution: {integrity: sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==} + peerDependencies: + '@types/react': ^18.0.0 + '@types/react-transition-group@4.4.12': resolution: {integrity: sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==} peerDependencies: '@types/react': '*' - '@types/react@19.1.10': - resolution: {integrity: sha512-EhBeSYX0Y6ye8pNebpKrwFJq7BoQ8J5SO6NlvNwwHjSj6adXJViPQrKlsyPw7hLBLvckEMO1yxeGdR82YBBlDg==} + '@types/react@18.3.26': + resolution: {integrity: sha512-RFA/bURkcKzx/X9oumPG9Vp3D3JUgus/d0b67KB0t5S/raciymilkOa66olh78MUI92QLbEJevO7rvqU/kjwKA==} '@types/stylis@4.2.5': resolution: {integrity: sha512-1Xve+NMN7FWjY14vLoY5tL3BVEQ/n42YLwaqJIPYhotZ9uBHt87VceMwWQpzmdEt2TNXIorIFG+YeCUUW7RInw==} @@ -6386,9 +6406,9 @@ packages: typeforce@1.18.0: resolution: {integrity: sha512-7uc1O8h1M1g0rArakJdf0uLRSSgFcYexrVoKo+bzJd32gd4gDy2L/Z+8/FjPnU9ydY3pEnVPtr9FyscYY60K1g==} - typescript@4.9.5: - resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} - engines: {node: '>=4.2.0'} + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + engines: {node: '>=14.17'} hasBin: true ufo@1.6.1: @@ -7159,16 +7179,16 @@ snapshots: - uploadthing - utf-8-validate - '@cosmos-kit/keplr-mobile@2.15.3(@cosmjs/amino@0.32.4)(@cosmjs/proto-signing@0.32.4)(@walletconnect/sign-client@2.21.8(typescript@4.9.5)(zod@3.25.76))(@walletconnect/types@2.21.8)(starknet@7.6.4)(typescript@4.9.5)(zod@3.25.76)': + '@cosmos-kit/keplr-mobile@2.15.3(@cosmjs/amino@0.32.4)(@cosmjs/proto-signing@0.32.4)(@walletconnect/sign-client@2.21.8(typescript@5.9.3)(zod@3.25.76))(@walletconnect/types@2.21.8)(starknet@7.6.4)(typescript@5.9.3)(zod@3.25.76)': dependencies: '@chain-registry/keplr': 1.74.313 '@cosmjs/amino': 0.32.4 '@cosmjs/proto-signing': 0.32.4 '@cosmos-kit/core': 2.16.3 '@cosmos-kit/keplr-extension': 2.15.3(@cosmjs/amino@0.32.4)(@cosmjs/proto-signing@0.32.4)(starknet@7.6.4) - '@cosmos-kit/walletconnect': 2.13.3(@cosmjs/amino@0.32.4)(@walletconnect/types@2.21.8)(typescript@4.9.5)(zod@3.25.76) + '@cosmos-kit/walletconnect': 2.13.3(@cosmjs/amino@0.32.4)(@walletconnect/types@2.21.8)(typescript@5.9.3)(zod@3.25.76) '@keplr-wallet/provider-extension': 0.12.264(starknet@7.6.4) - '@keplr-wallet/wc-client': 0.12.264(@walletconnect/sign-client@2.21.8(typescript@4.9.5)(zod@3.25.76))(@walletconnect/types@2.21.8)(starknet@7.6.4) + '@keplr-wallet/wc-client': 0.12.264(@walletconnect/sign-client@2.21.8(typescript@5.9.3)(zod@3.25.76))(@walletconnect/types@2.21.8)(starknet@7.6.4) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -7199,10 +7219,10 @@ snapshots: - utf-8-validate - zod - '@cosmos-kit/keplr@2.15.3(@cosmjs/amino@0.32.4)(@cosmjs/proto-signing@0.32.4)(@walletconnect/sign-client@2.21.8(typescript@4.9.5)(zod@3.25.76))(@walletconnect/types@2.21.8)(starknet@7.6.4)(typescript@4.9.5)(zod@3.25.76)': + '@cosmos-kit/keplr@2.15.3(@cosmjs/amino@0.32.4)(@cosmjs/proto-signing@0.32.4)(@walletconnect/sign-client@2.21.8(typescript@5.9.3)(zod@3.25.76))(@walletconnect/types@2.21.8)(starknet@7.6.4)(typescript@5.9.3)(zod@3.25.76)': dependencies: '@cosmos-kit/keplr-extension': 2.15.3(@cosmjs/amino@0.32.4)(@cosmjs/proto-signing@0.32.4)(starknet@7.6.4) - '@cosmos-kit/keplr-mobile': 2.15.3(@cosmjs/amino@0.32.4)(@cosmjs/proto-signing@0.32.4)(@walletconnect/sign-client@2.21.8(typescript@4.9.5)(zod@3.25.76))(@walletconnect/types@2.21.8)(starknet@7.6.4)(typescript@4.9.5)(zod@3.25.76) + '@cosmos-kit/keplr-mobile': 2.15.3(@cosmjs/amino@0.32.4)(@cosmjs/proto-signing@0.32.4)(@walletconnect/sign-client@2.21.8(typescript@5.9.3)(zod@3.25.76))(@walletconnect/types@2.21.8)(starknet@7.6.4)(typescript@5.9.3)(zod@3.25.76) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -7270,11 +7290,13 @@ snapshots: - uploadthing - utf-8-validate - '@cosmos-kit/react-lite@2.16.3(@cosmjs/amino@0.32.4)(@cosmjs/proto-signing@0.32.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@cosmos-kit/react-lite@2.16.3(@cosmjs/amino@0.32.4)(@cosmjs/proto-signing@0.32.4)(@types/react-dom@18.3.7(@types/react@18.3.26))(@types/react@18.3.26)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@chain-registry/types': 0.46.15 '@cosmos-kit/core': 2.16.3 '@dao-dao/cosmiframe': 1.0.0(@cosmjs/amino@0.32.4)(@cosmjs/proto-signing@0.32.4) + '@types/react': 18.3.26 + '@types/react-dom': 18.3.7(@types/react@18.3.26) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) transitivePeerDependencies: @@ -7304,13 +7326,15 @@ snapshots: - uploadthing - utf-8-validate - '@cosmos-kit/react@2.22.3(@cosmjs/amino@0.32.4)(@cosmjs/proto-signing@0.32.4)(@interchain-ui/react@1.26.3(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@cosmos-kit/react@2.22.3(@cosmjs/amino@0.32.4)(@cosmjs/proto-signing@0.32.4)(@interchain-ui/react@1.26.3(@types/react@18.3.26)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react-dom@18.3.7(@types/react@18.3.26))(@types/react@18.3.26)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@chain-registry/types': 0.46.15 '@cosmos-kit/core': 2.16.3 - '@cosmos-kit/react-lite': 2.16.3(@cosmjs/amino@0.32.4)(@cosmjs/proto-signing@0.32.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@interchain-ui/react': 1.26.3(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@cosmos-kit/react-lite': 2.16.3(@cosmjs/amino@0.32.4)(@cosmjs/proto-signing@0.32.4)(@types/react-dom@18.3.7(@types/react@18.3.26))(@types/react@18.3.26)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@interchain-ui/react': 1.26.3(@types/react@18.3.26)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@react-icons/all-files': 4.1.0(react@18.3.1) + '@types/react': 18.3.26 + '@types/react-dom': 18.3.7(@types/react@18.3.26) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) transitivePeerDependencies: @@ -7340,14 +7364,14 @@ snapshots: - uploadthing - utf-8-validate - '@cosmos-kit/walletconnect@2.13.3(@cosmjs/amino@0.32.4)(@walletconnect/types@2.21.8)(typescript@4.9.5)(zod@3.25.76)': + '@cosmos-kit/walletconnect@2.13.3(@cosmjs/amino@0.32.4)(@walletconnect/types@2.21.8)(typescript@5.9.3)(zod@3.25.76)': dependencies: '@cosmjs/amino': 0.32.4 '@cosmjs/proto-signing': 0.32.4 '@cosmos-kit/core': 2.16.3 - '@walletconnect/sign-client': 2.21.8(typescript@4.9.5)(zod@3.25.76) + '@walletconnect/sign-client': 2.21.8(typescript@5.9.3)(zod@3.25.76) '@walletconnect/types': 2.21.8 - '@walletconnect/utils': 2.21.8(typescript@4.9.5)(zod@3.25.76) + '@walletconnect/utils': 2.21.8(typescript@5.9.3)(zod@3.25.76) events: 3.3.0 transitivePeerDependencies: - '@azure/app-configuration' @@ -7436,7 +7460,7 @@ snapshots: '@emotion/memoize@0.9.0': {} - '@emotion/react@11.14.0(react@18.3.1)': + '@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1)': dependencies: '@babel/runtime': 7.28.3 '@emotion/babel-plugin': 11.13.5 @@ -7447,6 +7471,8 @@ snapshots: '@emotion/weak-memoize': 0.4.0 hoist-non-react-statics: 3.3.2 react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.26 transitivePeerDependencies: - supports-color @@ -7460,16 +7486,18 @@ snapshots: '@emotion/sheet@1.4.0': {} - '@emotion/styled@11.14.1(@emotion/react@11.14.0(react@18.3.1))(react@18.3.1)': + '@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react@18.3.1)': dependencies: '@babel/runtime': 7.28.3 '@emotion/babel-plugin': 11.13.5 '@emotion/is-prop-valid': 1.3.1 - '@emotion/react': 11.14.0(react@18.3.1) + '@emotion/react': 11.14.0(@types/react@18.3.26)(react@18.3.1) '@emotion/serialize': 1.3.3 '@emotion/use-insertion-effect-with-fallbacks': 1.2.0(react@18.3.1) '@emotion/utils': 1.4.2 react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.26 transitivePeerDependencies: - supports-color @@ -7702,7 +7730,7 @@ snapshots: '@img/sharp-win32-x64@0.34.3': optional: true - '@interchain-ui/react@1.26.3(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@interchain-ui/react@1.26.3(@types/react@18.3.26)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@floating-ui/core': 1.7.3 '@floating-ui/dom': 1.7.3 @@ -7731,7 +7759,7 @@ snapshots: react-aria: 3.42.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react-dom: 18.3.1(react@18.3.1) react-stately: 3.40.0(react@18.3.1) - zustand: 4.5.7(immer@10.1.1)(react@18.3.1) + zustand: 4.5.7(@types/react@18.3.26)(immer@10.1.1)(react@18.3.1) transitivePeerDependencies: - '@types/react' - babel-plugin-macros @@ -7864,11 +7892,11 @@ snapshots: big-integer: 1.6.52 utility-types: 3.11.0 - '@keplr-wallet/wc-client@0.12.264(@walletconnect/sign-client@2.21.8(typescript@4.9.5)(zod@3.25.76))(@walletconnect/types@2.21.8)(starknet@7.6.4)': + '@keplr-wallet/wc-client@0.12.264(@walletconnect/sign-client@2.21.8(typescript@5.9.3)(zod@3.25.76))(@walletconnect/types@2.21.8)(starknet@7.6.4)': dependencies: '@keplr-wallet/provider': 0.12.264(starknet@7.6.4) '@keplr-wallet/types': 0.12.264(starknet@7.6.4) - '@walletconnect/sign-client': 2.21.8(typescript@4.9.5)(zod@3.25.76) + '@walletconnect/sign-client': 2.21.8(typescript@5.9.3)(zod@3.25.76) '@walletconnect/types': 2.21.8 buffer: 6.0.3 deepmerge: 4.3.1 @@ -7938,56 +7966,61 @@ snapshots: '@mdx-js/react@2.3.0(react@18.3.1)': dependencies: '@types/mdx': 2.0.13 - '@types/react': 19.1.10 + '@types/react': 18.3.26 react: 18.3.1 '@msgpack/msgpack@3.1.2': {} - '@mui/base@5.0.0-beta.40-1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@mui/base@5.0.0-beta.40-1(@types/react@18.3.26)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.28.3 '@floating-ui/react-dom': 2.1.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@mui/types': 7.2.24 - '@mui/utils': 5.17.1(react@18.3.1) + '@mui/types': 7.2.24(@types/react@18.3.26) + '@mui/utils': 5.17.1(@types/react@18.3.26)(react@18.3.1) '@popperjs/core': 2.11.8 clsx: 2.1.1 prop-types: 15.8.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - - '@mui/core-downloads-tracker@5.18.0': {} - - '@mui/icons-material@5.18.0(@mui/material@5.18.0(@emotion/react@11.14.0(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)': - dependencies: - '@babel/runtime': 7.28.3 - '@mui/material': 5.18.0(@emotion/react@11.14.0(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - - '@mui/lab@5.0.0-alpha.177(@emotion/react@11.14.0(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(react@18.3.1))(react@18.3.1))(@mui/material@5.18.0(@emotion/react@11.14.0(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@babel/runtime': 7.28.3 - '@mui/base': 5.0.0-beta.40-1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@mui/material': 5.18.0(@emotion/react@11.14.0(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@mui/system': 5.18.0(@emotion/react@11.14.0(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(react@18.3.1))(react@18.3.1))(react@18.3.1) - '@mui/types': 7.2.24 - '@mui/utils': 5.17.1(react@18.3.1) - clsx: 2.1.1 - prop-types: 15.8.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@emotion/react': 11.14.0(react@18.3.1) - '@emotion/styled': 11.14.1(@emotion/react@11.14.0(react@18.3.1))(react@18.3.1) + '@types/react': 18.3.26 - '@mui/material@5.18.0(@emotion/react@11.14.0(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@mui/core-downloads-tracker@5.18.0': {} + + '@mui/icons-material@5.18.0(@mui/material@5.18.0(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.26)(react@18.3.1)': + dependencies: + '@babel/runtime': 7.28.3 + '@mui/material': 5.18.0(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.26 + + '@mui/lab@5.0.0-alpha.177(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react@18.3.1))(@mui/material@5.18.0(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.26)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.28.3 + '@mui/base': 5.0.0-beta.40-1(@types/react@18.3.26)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@mui/material': 5.18.0(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@mui/system': 5.18.0(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react@18.3.1) + '@mui/types': 7.2.24(@types/react@18.3.26) + '@mui/utils': 5.17.1(@types/react@18.3.26)(react@18.3.1) + clsx: 2.1.1 + prop-types: 15.8.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@emotion/react': 11.14.0(@types/react@18.3.26)(react@18.3.1) + '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react@18.3.1) + '@types/react': 18.3.26 + + '@mui/material@5.18.0(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.28.3 '@mui/core-downloads-tracker': 5.18.0 - '@mui/system': 5.18.0(@emotion/react@11.14.0(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(react@18.3.1))(react@18.3.1))(react@18.3.1) - '@mui/types': 7.2.24 - '@mui/utils': 5.17.1(react@18.3.1) + '@mui/system': 5.18.0(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react@18.3.1) + '@mui/types': 7.2.24(@types/react@18.3.26) + '@mui/utils': 5.17.1(@types/react@18.3.26)(react@18.3.1) '@popperjs/core': 2.11.8 - '@types/react-transition-group': 4.4.12 + '@types/react-transition-group': 4.4.12(@types/react@18.3.26) clsx: 2.1.1 csstype: 3.1.3 prop-types: 15.8.1 @@ -7996,17 +8029,20 @@ snapshots: react-is: 19.1.1 react-transition-group: 4.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) optionalDependencies: - '@emotion/react': 11.14.0(react@18.3.1) - '@emotion/styled': 11.14.1(@emotion/react@11.14.0(react@18.3.1))(react@18.3.1) + '@emotion/react': 11.14.0(@types/react@18.3.26)(react@18.3.1) + '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react@18.3.1) + '@types/react': 18.3.26 - '@mui/private-theming@5.17.1(react@18.3.1)': + '@mui/private-theming@5.17.1(@types/react@18.3.26)(react@18.3.1)': dependencies: '@babel/runtime': 7.28.3 - '@mui/utils': 5.17.1(react@18.3.1) + '@mui/utils': 5.17.1(@types/react@18.3.26)(react@18.3.1) prop-types: 15.8.1 react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.26 - '@mui/styled-engine@5.18.0(@emotion/react@11.14.0(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(react@18.3.1))(react@18.3.1))(react@18.3.1)': + '@mui/styled-engine@5.18.0(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.28.3 '@emotion/cache': 11.14.0 @@ -8015,35 +8051,40 @@ snapshots: prop-types: 15.8.1 react: 18.3.1 optionalDependencies: - '@emotion/react': 11.14.0(react@18.3.1) - '@emotion/styled': 11.14.1(@emotion/react@11.14.0(react@18.3.1))(react@18.3.1) + '@emotion/react': 11.14.0(@types/react@18.3.26)(react@18.3.1) + '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react@18.3.1) - '@mui/system@5.18.0(@emotion/react@11.14.0(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(react@18.3.1))(react@18.3.1))(react@18.3.1)': + '@mui/system@5.18.0(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react@18.3.1)': dependencies: '@babel/runtime': 7.28.3 - '@mui/private-theming': 5.17.1(react@18.3.1) - '@mui/styled-engine': 5.18.0(@emotion/react@11.14.0(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(react@18.3.1))(react@18.3.1))(react@18.3.1) - '@mui/types': 7.2.24 - '@mui/utils': 5.17.1(react@18.3.1) + '@mui/private-theming': 5.17.1(@types/react@18.3.26)(react@18.3.1) + '@mui/styled-engine': 5.18.0(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react@18.3.1))(react@18.3.1) + '@mui/types': 7.2.24(@types/react@18.3.26) + '@mui/utils': 5.17.1(@types/react@18.3.26)(react@18.3.1) clsx: 2.1.1 csstype: 3.1.3 prop-types: 15.8.1 react: 18.3.1 optionalDependencies: - '@emotion/react': 11.14.0(react@18.3.1) - '@emotion/styled': 11.14.1(@emotion/react@11.14.0(react@18.3.1))(react@18.3.1) + '@emotion/react': 11.14.0(@types/react@18.3.26)(react@18.3.1) + '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react@18.3.1) + '@types/react': 18.3.26 - '@mui/types@7.2.24': {} + '@mui/types@7.2.24(@types/react@18.3.26)': + optionalDependencies: + '@types/react': 18.3.26 - '@mui/utils@5.17.1(react@18.3.1)': + '@mui/utils@5.17.1(@types/react@18.3.26)(react@18.3.1)': dependencies: '@babel/runtime': 7.28.3 - '@mui/types': 7.2.24 + '@mui/types': 7.2.24(@types/react@18.3.26) '@types/prop-types': 15.7.15 clsx: 2.1.1 prop-types: 15.8.1 react: 18.3.1 react-is: 19.1.1 + optionalDependencies: + '@types/react': 18.3.26 '@napi-rs/simple-git-android-arm-eabi@0.1.22': optional: true @@ -8133,8 +8174,7 @@ snapshots: '@next/swc-linux-arm64-musl@15.5.0': optional: true - '@next/swc-linux-x64-gnu@15.5.0': - optional: true + '@next/swc-linux-x64-gnu@15.5.0': {} '@next/swc-linux-x64-musl@15.5.0': optional: true @@ -8199,12 +8239,12 @@ snapshots: - '@nextui-org/theme' - framer-motion - '@nextui-org/autocomplete@2.3.9(@nextui-org/system@2.4.6(@nextui-org/theme@2.4.5(tailwindcss@4.1.12))(framer-motion@12.23.12(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@nextui-org/theme@2.4.5(tailwindcss@4.1.12))(framer-motion@12.23.12(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@nextui-org/autocomplete@2.3.9(@nextui-org/system@2.4.6(@nextui-org/theme@2.4.5(tailwindcss@4.1.12))(framer-motion@12.23.12(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@nextui-org/theme@2.4.5(tailwindcss@4.1.12))(@types/react@18.3.26)(framer-motion@12.23.12(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@nextui-org/aria-utils': 2.2.7(@nextui-org/theme@2.4.5(tailwindcss@4.1.12))(framer-motion@12.23.12(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@nextui-org/button': 2.2.9(@nextui-org/system@2.4.6(@nextui-org/theme@2.4.5(tailwindcss@4.1.12))(framer-motion@12.23.12(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@nextui-org/theme@2.4.5(tailwindcss@4.1.12))(framer-motion@12.23.12(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@nextui-org/form': 2.1.8(@nextui-org/system@2.4.6(@nextui-org/theme@2.4.5(tailwindcss@4.1.12))(framer-motion@12.23.12(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@nextui-org/theme@2.4.5(tailwindcss@4.1.12))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@nextui-org/input': 2.4.8(@nextui-org/system@2.4.6(@nextui-org/theme@2.4.5(tailwindcss@4.1.12))(framer-motion@12.23.12(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@nextui-org/theme@2.4.5(tailwindcss@4.1.12))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@nextui-org/input': 2.4.8(@nextui-org/system@2.4.6(@nextui-org/theme@2.4.5(tailwindcss@4.1.12))(framer-motion@12.23.12(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@nextui-org/theme@2.4.5(tailwindcss@4.1.12))(@types/react@18.3.26)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@nextui-org/listbox': 2.3.9(@nextui-org/system@2.4.6(@nextui-org/theme@2.4.5(tailwindcss@4.1.12))(framer-motion@12.23.12(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@nextui-org/theme@2.4.5(tailwindcss@4.1.12))(framer-motion@12.23.12(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@nextui-org/popover': 2.3.9(@nextui-org/system@2.4.6(@nextui-org/theme@2.4.5(tailwindcss@4.1.12))(framer-motion@12.23.12(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@nextui-org/theme@2.4.5(tailwindcss@4.1.12))(framer-motion@12.23.12(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@nextui-org/react-utils': 2.1.3(react@18.3.1) @@ -8516,7 +8556,7 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@nextui-org/input@2.4.8(@nextui-org/system@2.4.6(@nextui-org/theme@2.4.5(tailwindcss@4.1.12))(framer-motion@12.23.12(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@nextui-org/theme@2.4.5(tailwindcss@4.1.12))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@nextui-org/input@2.4.8(@nextui-org/system@2.4.6(@nextui-org/theme@2.4.5(tailwindcss@4.1.12))(framer-motion@12.23.12(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@nextui-org/theme@2.4.5(tailwindcss@4.1.12))(@types/react@18.3.26)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@nextui-org/form': 2.1.8(@nextui-org/system@2.4.6(@nextui-org/theme@2.4.5(tailwindcss@4.1.12))(framer-motion@12.23.12(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@nextui-org/theme@2.4.5(tailwindcss@4.1.12))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@nextui-org/react-utils': 2.1.3(react@18.3.1) @@ -8534,7 +8574,7 @@ snapshots: '@react-types/textfield': 3.10.0(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - react-textarea-autosize: 8.5.9(react@18.3.1) + react-textarea-autosize: 8.5.9(@types/react@18.3.26)(react@18.3.1) transitivePeerDependencies: - '@types/react' @@ -8734,11 +8774,11 @@ snapshots: '@nextui-org/shared-utils': 2.1.2 react: 18.3.1 - '@nextui-org/react@2.6.11(framer-motion@12.23.12(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(tailwindcss@4.1.12)': + '@nextui-org/react@2.6.11(@types/react@18.3.26)(framer-motion@12.23.12(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(tailwindcss@4.1.12)': dependencies: '@nextui-org/accordion': 2.2.7(@nextui-org/system@2.4.6(@nextui-org/theme@2.4.5(tailwindcss@4.1.12))(framer-motion@12.23.12(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@nextui-org/theme@2.4.5(tailwindcss@4.1.12))(framer-motion@12.23.12(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@nextui-org/alert': 2.2.9(@nextui-org/system@2.4.6(@nextui-org/theme@2.4.5(tailwindcss@4.1.12))(framer-motion@12.23.12(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@nextui-org/theme@2.4.5(tailwindcss@4.1.12))(framer-motion@12.23.12(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@nextui-org/autocomplete': 2.3.9(@nextui-org/system@2.4.6(@nextui-org/theme@2.4.5(tailwindcss@4.1.12))(framer-motion@12.23.12(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@nextui-org/theme@2.4.5(tailwindcss@4.1.12))(framer-motion@12.23.12(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@nextui-org/autocomplete': 2.3.9(@nextui-org/system@2.4.6(@nextui-org/theme@2.4.5(tailwindcss@4.1.12))(framer-motion@12.23.12(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@nextui-org/theme@2.4.5(tailwindcss@4.1.12))(@types/react@18.3.26)(framer-motion@12.23.12(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@nextui-org/avatar': 2.2.6(@nextui-org/system@2.4.6(@nextui-org/theme@2.4.5(tailwindcss@4.1.12))(framer-motion@12.23.12(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@nextui-org/theme@2.4.5(tailwindcss@4.1.12))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@nextui-org/badge': 2.2.5(@nextui-org/system@2.4.6(@nextui-org/theme@2.4.5(tailwindcss@4.1.12))(framer-motion@12.23.12(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@nextui-org/theme@2.4.5(tailwindcss@4.1.12))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@nextui-org/breadcrumbs': 2.2.6(@nextui-org/system@2.4.6(@nextui-org/theme@2.4.5(tailwindcss@4.1.12))(framer-motion@12.23.12(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@nextui-org/theme@2.4.5(tailwindcss@4.1.12))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -8756,7 +8796,7 @@ snapshots: '@nextui-org/form': 2.1.8(@nextui-org/system@2.4.6(@nextui-org/theme@2.4.5(tailwindcss@4.1.12))(framer-motion@12.23.12(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@nextui-org/theme@2.4.5(tailwindcss@4.1.12))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@nextui-org/framer-utils': 2.1.6(@nextui-org/theme@2.4.5(tailwindcss@4.1.12))(framer-motion@12.23.12(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@nextui-org/image': 2.2.5(@nextui-org/system@2.4.6(@nextui-org/theme@2.4.5(tailwindcss@4.1.12))(framer-motion@12.23.12(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@nextui-org/theme@2.4.5(tailwindcss@4.1.12))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@nextui-org/input': 2.4.8(@nextui-org/system@2.4.6(@nextui-org/theme@2.4.5(tailwindcss@4.1.12))(framer-motion@12.23.12(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@nextui-org/theme@2.4.5(tailwindcss@4.1.12))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@nextui-org/input': 2.4.8(@nextui-org/system@2.4.6(@nextui-org/theme@2.4.5(tailwindcss@4.1.12))(framer-motion@12.23.12(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@nextui-org/theme@2.4.5(tailwindcss@4.1.12))(@types/react@18.3.26)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@nextui-org/input-otp': 2.1.8(@nextui-org/system@2.4.6(@nextui-org/theme@2.4.5(tailwindcss@4.1.12))(framer-motion@12.23.12(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@nextui-org/theme@2.4.5(tailwindcss@4.1.12))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@nextui-org/kbd': 2.2.6(@nextui-org/theme@2.4.5(tailwindcss@4.1.12))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@nextui-org/link': 2.2.7(@nextui-org/system@2.4.6(@nextui-org/theme@2.4.5(tailwindcss@4.1.12))(framer-motion@12.23.12(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@nextui-org/theme@2.4.5(tailwindcss@4.1.12))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -9205,9 +9245,11 @@ snapshots: '@nolyfill/is-core-module@1.0.39': {} - '@nymproject/mix-fetch-wasm@file:../../dist/wasm/mix-fetch': {} + '@nymproject/contract-clients@1.4.1': {} - '@nymproject/nym-client-wasm@file:../../dist/wasm/client': {} + '@nymproject/mix-fetch-full-fat@1.2.3': {} + + '@nymproject/sdk-full-fat@1.2.3': {} '@opentelemetry/api-logs@0.53.0': dependencies: @@ -11169,10 +11211,17 @@ snapshots: '@types/prop-types@15.7.15': {} - '@types/react-transition-group@4.4.12': {} - - '@types/react@19.1.10': + '@types/react-dom@18.3.7(@types/react@18.3.26)': dependencies: + '@types/react': 18.3.26 + + '@types/react-transition-group@4.4.12(@types/react@18.3.26)': + dependencies: + '@types/react': 18.3.26 + + '@types/react@18.3.26': + dependencies: + '@types/prop-types': 15.7.15 csstype: 3.1.3 '@types/stylis@4.2.5': {} @@ -11184,16 +11233,16 @@ snapshots: '@types/unist@3.0.3': {} - '@typescript-eslint/parser@6.21.0(eslint@8.46.0)(typescript@4.9.5)': + '@typescript-eslint/parser@6.21.0(eslint@8.46.0)(typescript@5.9.3)': dependencies: '@typescript-eslint/scope-manager': 6.21.0 '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/typescript-estree': 6.21.0(typescript@4.9.5) + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.9.3) '@typescript-eslint/visitor-keys': 6.21.0 debug: 4.4.1 eslint: 8.46.0 optionalDependencies: - typescript: 4.9.5 + typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -11204,7 +11253,7 @@ snapshots: '@typescript-eslint/types@6.21.0': {} - '@typescript-eslint/typescript-estree@6.21.0(typescript@4.9.5)': + '@typescript-eslint/typescript-estree@6.21.0(typescript@5.9.3)': dependencies: '@typescript-eslint/types': 6.21.0 '@typescript-eslint/visitor-keys': 6.21.0 @@ -11213,9 +11262,9 @@ snapshots: is-glob: 4.0.3 minimatch: 9.0.3 semver: 7.7.2 - ts-api-utils: 1.4.3(typescript@4.9.5) + ts-api-utils: 1.4.3(typescript@5.9.3) optionalDependencies: - typescript: 4.9.5 + typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -11314,7 +11363,7 @@ snapshots: dependencies: '@vanilla-extract/css': 1.17.4(babel-plugin-macros@3.1.0) - '@walletconnect/core@2.21.8(typescript@4.9.5)(zod@3.25.76)': + '@walletconnect/core@2.21.8(typescript@5.9.3)(zod@3.25.76)': dependencies: '@walletconnect/heartbeat': 1.2.2 '@walletconnect/jsonrpc-provider': 1.0.14 @@ -11328,7 +11377,7 @@ snapshots: '@walletconnect/safe-json': 1.0.2 '@walletconnect/time': 1.0.2 '@walletconnect/types': 2.21.8 - '@walletconnect/utils': 2.21.8(typescript@4.9.5)(zod@3.25.76) + '@walletconnect/utils': 2.21.8(typescript@5.9.3)(zod@3.25.76) '@walletconnect/window-getters': 1.0.1 es-toolkit: 1.39.3 events: 3.3.0 @@ -11455,16 +11504,16 @@ snapshots: dependencies: tslib: 1.14.1 - '@walletconnect/sign-client@2.21.8(typescript@4.9.5)(zod@3.25.76)': + '@walletconnect/sign-client@2.21.8(typescript@5.9.3)(zod@3.25.76)': dependencies: - '@walletconnect/core': 2.21.8(typescript@4.9.5)(zod@3.25.76) + '@walletconnect/core': 2.21.8(typescript@5.9.3)(zod@3.25.76) '@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.21.8 - '@walletconnect/utils': 2.21.8(typescript@4.9.5)(zod@3.25.76) + '@walletconnect/utils': 2.21.8(typescript@5.9.3)(zod@3.25.76) events: 3.3.0 transitivePeerDependencies: - '@azure/app-configuration' @@ -11550,7 +11599,7 @@ snapshots: - ioredis - uploadthing - '@walletconnect/utils@2.21.8(typescript@4.9.5)(zod@3.25.76)': + '@walletconnect/utils@2.21.8(typescript@5.9.3)(zod@3.25.76)': dependencies: '@msgpack/msgpack': 3.1.2 '@noble/ciphers': 1.3.0 @@ -11571,7 +11620,7 @@ snapshots: detect-browser: 5.3.0 query-string: 7.1.3 uint8arrays: 3.1.1 - viem: 2.31.0(typescript@4.9.5)(zod@3.25.76) + viem: 2.31.0(typescript@5.9.3)(zod@3.25.76) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -11692,9 +11741,9 @@ snapshots: fs-extra: 10.1.0 yargs: 17.7.2 - abitype@1.0.8(typescript@4.9.5)(zod@3.25.76): + abitype@1.0.8(typescript@5.9.3)(zod@3.25.76): optionalDependencies: - typescript: 4.9.5 + typescript: 5.9.3 zod: 3.25.76 abort-controller@3.0.0: @@ -12710,20 +12759,20 @@ snapshots: escape-string-regexp@5.0.0: {} - eslint-config-next@13.4.13(eslint@8.46.0)(typescript@4.9.5): + eslint-config-next@13.4.13(eslint@8.46.0)(typescript@5.9.3): dependencies: '@next/eslint-plugin-next': 13.4.13 '@rushstack/eslint-patch': 1.12.0 - '@typescript-eslint/parser': 6.21.0(eslint@8.46.0)(typescript@4.9.5) + '@typescript-eslint/parser': 6.21.0(eslint@8.46.0)(typescript@5.9.3) eslint: 8.46.0 eslint-import-resolver-node: 0.3.9 eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0(eslint@8.46.0))(eslint@8.46.0) - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@6.21.0(eslint@8.46.0)(typescript@4.9.5))(eslint-import-resolver-typescript@3.10.1)(eslint@8.46.0) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@6.21.0(eslint@8.46.0)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(eslint@8.46.0))(eslint@8.46.0))(eslint@8.46.0) eslint-plugin-jsx-a11y: 6.10.2(eslint@8.46.0) eslint-plugin-react: 7.37.5(eslint@8.46.0) eslint-plugin-react-hooks: 5.0.0-canary-7118f5dd7-20230705(eslint@8.46.0) optionalDependencies: - typescript: 4.9.5 + typescript: 5.9.3 transitivePeerDependencies: - eslint-import-resolver-webpack - eslint-plugin-import-x @@ -12748,22 +12797,22 @@ snapshots: tinyglobby: 0.2.14 unrs-resolver: 1.11.1 optionalDependencies: - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@6.21.0(eslint@8.46.0)(typescript@4.9.5))(eslint-import-resolver-typescript@3.10.1)(eslint@8.46.0) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@6.21.0(eslint@8.46.0)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(eslint@8.46.0))(eslint@8.46.0))(eslint@8.46.0) transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.1(@typescript-eslint/parser@6.21.0(eslint@8.46.0)(typescript@4.9.5))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(eslint@8.46.0))(eslint@8.46.0))(eslint@8.46.0): + eslint-module-utils@2.12.1(@typescript-eslint/parser@6.21.0(eslint@8.46.0)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(eslint@8.46.0))(eslint@8.46.0))(eslint@8.46.0): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 6.21.0(eslint@8.46.0)(typescript@4.9.5) + '@typescript-eslint/parser': 6.21.0(eslint@8.46.0)(typescript@5.9.3) eslint: 8.46.0 eslint-import-resolver-node: 0.3.9 eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0(eslint@8.46.0))(eslint@8.46.0) transitivePeerDependencies: - supports-color - eslint-plugin-import@2.32.0(@typescript-eslint/parser@6.21.0(eslint@8.46.0)(typescript@4.9.5))(eslint-import-resolver-typescript@3.10.1)(eslint@8.46.0): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@6.21.0(eslint@8.46.0)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(eslint@8.46.0))(eslint@8.46.0))(eslint@8.46.0): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -12774,7 +12823,7 @@ snapshots: doctrine: 2.1.0 eslint: 8.46.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@6.21.0(eslint@8.46.0)(typescript@4.9.5))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(eslint@8.46.0))(eslint@8.46.0))(eslint@8.46.0) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@6.21.0(eslint@8.46.0)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(eslint@8.46.0))(eslint@8.46.0))(eslint@8.46.0) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -12786,7 +12835,7 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 6.21.0(eslint@8.46.0)(typescript@4.9.5) + '@typescript-eslint/parser': 6.21.0(eslint@8.46.0)(typescript@5.9.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack @@ -14655,7 +14704,7 @@ snapshots: object-keys: 1.1.1 safe-push-apply: 1.0.0 - ox@0.7.1(typescript@4.9.5)(zod@3.25.76): + ox@0.7.1(typescript@5.9.3)(zod@3.25.76): dependencies: '@adraffy/ens-normalize': 1.11.0 '@noble/ciphers': 1.3.0 @@ -14663,10 +14712,10 @@ snapshots: '@noble/hashes': 1.8.0 '@scure/bip32': 1.7.0 '@scure/bip39': 1.6.0 - abitype: 1.0.8(typescript@4.9.5)(zod@3.25.76) + abitype: 1.0.8(typescript@5.9.3)(zod@3.25.76) eventemitter3: 5.0.1 optionalDependencies: - typescript: 4.9.5 + typescript: 5.9.3 transitivePeerDependencies: - zod @@ -14978,12 +15027,12 @@ snapshots: prop-types: 15.8.1 react: 18.3.1 - react-textarea-autosize@8.5.9(react@18.3.1): + react-textarea-autosize@8.5.9(@types/react@18.3.26)(react@18.3.1): dependencies: '@babel/runtime': 7.28.3 react: 18.3.1 - use-composed-ref: 1.4.0(react@18.3.1) - use-latest: 1.3.0(react@18.3.1) + use-composed-ref: 1.4.0(@types/react@18.3.26)(react@18.3.1) + use-latest: 1.3.0(@types/react@18.3.26)(react@18.3.1) transitivePeerDependencies: - '@types/react' @@ -15710,9 +15759,9 @@ snapshots: trough@2.2.0: {} - ts-api-utils@1.4.3(typescript@4.9.5): + ts-api-utils@1.4.3(typescript@5.9.3): dependencies: - typescript: 4.9.5 + typescript: 5.9.3 ts-dedent@2.2.0: {} @@ -15776,7 +15825,7 @@ snapshots: typeforce@1.18.0: {} - typescript@4.9.5: {} + typescript@5.9.3: {} ufo@1.6.1: {} @@ -15945,18 +15994,24 @@ snapshots: url-template@2.0.8: {} - use-composed-ref@1.4.0(react@18.3.1): + use-composed-ref@1.4.0(@types/react@18.3.26)(react@18.3.1): dependencies: react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.26 - use-isomorphic-layout-effect@1.2.1(react@18.3.1): + use-isomorphic-layout-effect@1.2.1(@types/react@18.3.26)(react@18.3.1): dependencies: react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.26 - use-latest@1.3.0(react@18.3.1): + use-latest@1.3.0(@types/react@18.3.26)(react@18.3.1): dependencies: react: 18.3.1 - use-isomorphic-layout-effect: 1.2.1(react@18.3.1) + use-isomorphic-layout-effect: 1.2.1(@types/react@18.3.26)(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.26 use-sync-external-store@1.5.0(react@18.3.1): dependencies: @@ -16010,18 +16065,18 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.3 - viem@2.31.0(typescript@4.9.5)(zod@3.25.76): + viem@2.31.0(typescript@5.9.3)(zod@3.25.76): dependencies: '@noble/curves': 1.9.1 '@noble/hashes': 1.8.0 '@scure/bip32': 1.7.0 '@scure/bip39': 1.6.0 - abitype: 1.0.8(typescript@4.9.5)(zod@3.25.76) + abitype: 1.0.8(typescript@5.9.3)(zod@3.25.76) isows: 1.0.7(ws@8.18.2) - ox: 0.7.1(typescript@4.9.5)(zod@3.25.76) + ox: 0.7.1(typescript@5.9.3)(zod@3.25.76) ws: 8.18.2 optionalDependencies: - typescript: 4.9.5 + typescript: 5.9.3 transitivePeerDependencies: - bufferutil - utf-8-validate @@ -16195,10 +16250,11 @@ snapshots: zod@3.25.76: {} - zustand@4.5.7(immer@10.1.1)(react@18.3.1): + zustand@4.5.7(@types/react@18.3.26)(immer@10.1.1)(react@18.3.1): dependencies: use-sync-external-store: 1.5.0(react@18.3.1) optionalDependencies: + '@types/react': 18.3.26 immer: 10.1.1 react: 18.3.1 diff --git a/scripts/nym-node-setup/quic_bridge_deployment.sh b/scripts/nym-node-setup/quic_bridge_deployment.sh new file mode 100644 index 0000000000..9e762ae842 --- /dev/null +++ b/scripts/nym-node-setup/quic_bridge_deployment.sh @@ -0,0 +1,941 @@ + #!/bin/bash +# Nym QUIC Bridge Deployment Helper Script +# This script provides network configuration and troubleshooting tools for Nym QUIC bridges + +network_device=$(ip route show default | awk '/default/ {print $5}') +wg_tunnel_interface="nymwg" + +BRIDGE_CONFIG_DIR="/opt/nym-bridge" +BRIDGE_KEYS_DIR="$BRIDGE_CONFIG_DIR/keys" +BRIDGE_CONFIG="$BRIDGE_CONFIG_DIR/bridges.toml" +CLIENT_PARAMS="$BRIDGE_CONFIG_DIR/client_bridge_params.json" +BRIDGE_BINARY="/usr/local/bin/nym-bridge" + + +if ! dpkg -s iptables-persistent >/dev/null 2>&1; then + echo "Installing iptables-persistent..." + sudo apt-get update + sudo apt-get install -y iptables-persistent +else + echo "iptables-persistent is already installed." +fi + +fetch_and_display_ipv6() { + ipv6_address=$(ip -6 addr show "$network_device" scope global | grep inet6 | awk '{print $2}') + if [[ -z "$ipv6_address" ]]; then + echo "No global IPv6 address found on $network_device." + else + echo "IPv6 address on $network_device: $ipv6_address" + fi +} + +fetch_wg_ipv6_address() { + ipv6_global_address=$(ip -6 addr show "$wg_tunnel_interface" scope global | grep inet6 | awk '{print $2}' | head -n 1) + + if [[ -z "$ipv6_global_address" ]]; then + echo "No globally routable IPv6 address found on $wg_tunnel_interface. Please configure IPv6 or check your network settings." + exit 1 + else + echo "Using IPv6 address: $ipv6_global_address" + fi +} + +adjust_ip_forwarding() { + ipv6_forwarding_setting="net.ipv6.conf.all.forwarding=1" + ipv4_forwarding_setting="net.ipv4.ip_forward=1" + + # Remove duplicate entries for these settings from the file + sudo sed -i "/^net.ipv6.conf.all.forwarding=/d" /etc/sysctl.conf + sudo sed -i "/^net.ipv4.ip_forward=/d" /etc/sysctl.conf + + echo "$ipv6_forwarding_setting" | sudo tee -a /etc/sysctl.conf + echo "$ipv4_forwarding_setting" | sudo tee -a /etc/sysctl.conf + + sudo sysctl -p /etc/sysctl.conf + + echo "IP forwarding enabled for IPv4 and IPv6." +} + +apply_bridge_iptables_rules() { + echo "Applying iptables rules for QUIC bridge ($wg_tunnel_interface)..." + sleep 1 + + # INPUT rules - allow incoming connections TO the bridge from WireGuard clients + # CRITICAL: This allows mobile clients to reach the bandwidth controller at 10.1.0.1:51830 + sudo iptables -I INPUT -i "$wg_tunnel_interface" -j ACCEPT + sudo ip6tables -I INPUT -i "$wg_tunnel_interface" -j ACCEPT + + # NAT rules - for outbound traffic masquerading + sudo iptables -t nat -A POSTROUTING -o "$network_device" -j MASQUERADE + sudo ip6tables -t nat -A POSTROUTING -o "$network_device" -j MASQUERADE + + # FORWARD rules - allow traffic through the bridge + sudo iptables -A FORWARD -i "$wg_tunnel_interface" -o "$network_device" -j ACCEPT + sudo iptables -A FORWARD -i "$network_device" -o "$wg_tunnel_interface" -m state --state RELATED,ESTABLISHED -j ACCEPT + sudo ip6tables -A FORWARD -i "$wg_tunnel_interface" -o "$network_device" -j ACCEPT + sudo ip6tables -A FORWARD -i "$network_device" -o "$wg_tunnel_interface" -m state --state RELATED,ESTABLISHED -j ACCEPT + + # Save rules + sudo iptables-save | sudo tee /etc/iptables/rules.v4 + sudo ip6tables-save | sudo tee /etc/iptables/rules.v6 + + echo "Iptables rules applied successfully for QUIC bridge (including INPUT rules for bandwidth controller)." +} + +check_bridge_iptables() { + echo "Inspecting iptables rules for QUIC bridge ($wg_tunnel_interface)..." + echo "---------------------------------------" + echo "IPv4 INPUT rules (for bandwidth controller):" + iptables -L INPUT -v -n | grep -E "$wg_tunnel_interface|Chain INPUT" | head -20 + echo "---------------------------------------" + echo "IPv4 FORWARD rules:" + iptables -L FORWARD -v -n | awk -v dev="$wg_tunnel_interface" '/^Chain FORWARD/ || $0 ~ dev || $0 ~ "ufw-reject-forward"' + echo "---------------------------------------" + echo "IPv6 INPUT rules (for bandwidth controller):" + ip6tables -L INPUT -v -n | grep -E "$wg_tunnel_interface|Chain INPUT" | head -20 + echo "---------------------------------------" + echo "IPv6 FORWARD rules:" + ip6tables -L FORWARD -v -n | awk -v dev="$wg_tunnel_interface" '/^Chain FORWARD/ || $0 ~ dev || $0 ~ "ufw6-reject-forward"' +} + +remove_duplicate_bridge_rules() { + local script_name=$(basename "$0") + + echo "Removing duplicate iptables rules for $wg_tunnel_interface..." + + iptables-save | grep "$wg_tunnel_interface" | while read -r line; do + sudo iptables -D ${line#-A } 2>/dev/null || echo "Failed to delete rule: $line" + done + + ip6tables-save | grep "$wg_tunnel_interface" | while read -r line; do + sudo ip6tables -D ${line#-A } 2>/dev/null || echo "Failed to delete rule: $line" + done + + echo "Duplicates removed for $wg_tunnel_interface." + echo "!!IMPORTANT!! You need to now reapply the iptables rules." + echo "Run: ./$script_name apply_bridge_iptables_rules" +} + +configure_dns_and_icmp() { + echo "Allowing ICMP (ping)..." + sudo iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT + sudo iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT + sudo ip6tables -A INPUT -p ipv6-icmp -j ACCEPT + sudo ip6tables -A OUTPUT -p ipv6-icmp -j ACCEPT + + echo "Allowing DNS over UDP (port 53)..." + sudo iptables -A INPUT -p udp --dport 53 -j ACCEPT + sudo ip6tables -A INPUT -p udp --dport 53 -j ACCEPT + + echo "Allowing DNS over TCP (port 53)..." + sudo iptables -A INPUT -p tcp --dport 53 -j ACCEPT + sudo ip6tables -A INPUT -p tcp --dport 53 -j ACCEPT + + echo "Saving iptables rules..." + sudo iptables-save | sudo tee /etc/iptables/rules.v4 + sudo ip6tables-save | sudo tee /etc/iptables/rules.v6 + + echo "DNS and ICMP configuration completed." +} + +check_ipv6_ipv4_forwarding() { + result_ipv4=$(cat /proc/sys/net/ipv4/ip_forward) + result_ipv6=$(cat /proc/sys/net/ipv6/conf/all/forwarding) + echo "IPv4 forwarding is $([ "$result_ipv4" == "1" ] && echo "enabled" || echo "not enabled")." + echo "IPv6 forwarding is $([ "$result_ipv6" == "1" ] && echo "enabled" || echo "not enabled")." +} + +check_ip_routing() { + echo "IPv4 routing table:" + ip route + echo "---------------------------------------" + echo "IPv6 routing table:" + ip -6 route +} + +perform_pings() { + echo "Performing IPv4 ping to google.com..." + ping -c 4 google.com + echo "---------------------------------------" + echo "Performing IPv6 ping to google.com..." + ping6 -c 4 google.com +} + +test_bridge_connectivity() { + local green="\033[0;32m" + local reset="\033[0m" + local red="\033[0;31m" + local yellow="\033[0;33m" + + sleep 1 + echo + echo -e "${yellow}Testing QUIC bridge connectivity on $wg_tunnel_interface...${reset}" + echo -e "${yellow}If these tests succeed, it confirms the bridge can reach the outside world via IPv4 and IPv6.${reset}" + echo -e "${yellow}However, external clients may experience different connectivity to your bridge.${reset}" + + ipv4_address=$(ip addr show "$wg_tunnel_interface" | awk '/inet / {print $2}' | cut -d'/' -f1) + ipv6_address=$(ip addr show "$wg_tunnel_interface" | awk '/inet6 / && $2 !~ /^fe80/ {print $2}' | cut -d'/' -f1) + + if [[ -z "$ipv4_address" && -z "$ipv6_address" ]]; then + echo -e "${red}No IP address found on $wg_tunnel_interface. Unable to test connectivity.${reset}" + echo -e "${red}Please verify your bridge configuration and ensure the interface is up.${reset}" + return 1 + fi + + if [[ -n "$ipv4_address" ]]; then + echo + echo -e "------------------------------------" + echo -e "Detected IPv4 address: $ipv4_address" + echo -e "Testing IPv4 connectivity..." + echo + + if ping -c 1 -I "$ipv4_address" google.com >/dev/null 2>&1; then + echo -e "${green}IPv4 connectivity is working. Fetching test data...${reset}" + joke=$(curl -s -H "Accept: application/json" --interface "$ipv4_address" https://icanhazdadjoke.com/ | jq -r .joke) + [[ -n "$joke" && "$joke" != "null" ]] && echo -e "${green}IPv4 test joke: $joke${reset}" || echo -e "${red}Failed to fetch test data via IPv4.${reset}" + else + echo -e "${red}IPv4 connectivity is not working for $wg_tunnel_interface. Verify your routing and NAT settings.${reset}" + fi + else + echo -e "${yellow}No IPv4 address found on $wg_tunnel_interface. Skipping IPv4 test.${reset}" + fi + + if [[ -n "$ipv6_address" ]]; then + echo + echo -e "------------------------------------" + echo -e "Detected IPv6 address: $ipv6_address" + echo -e "Testing IPv6 connectivity..." + echo + + if ping6 -c 1 -I "$ipv6_address" google.com >/dev/null 2>&1; then + echo -e "${green}IPv6 connectivity is working. Fetching test data...${reset}" + joke=$(curl -s -H "Accept: application/json" --interface "$ipv6_address" https://icanhazdadjoke.com/ | jq -r .joke) + [[ -n "$joke" && "$joke" != "null" ]] && echo -e "${green}IPv6 test joke: $joke${reset}" || echo -e "${red}Failed to fetch test data via IPv6.${reset}" + else + echo -e "${red}IPv6 connectivity is not working for $wg_tunnel_interface. Verify your routing and NAT settings.${reset}" + fi + else + echo -e "${yellow}No IPv6 address found on $wg_tunnel_interface. Skipping IPv6 test.${reset}" + fi + + echo -e "${green}Connectivity testing completed for $wg_tunnel_interface.${reset}" + echo -e "------------------------------------" + + sleep 2 + echo + echo + echo -e "${yellow}### Bridge Connectivity Testing Recommendations ###${reset}" + echo -e "${yellow}- Test UDP connectivity on port 51822 (used for Nym QUIC/WireGuard)${reset}" + echo -e "${yellow} From another machine: echo 'test message' | nc -u 51822${reset}" + echo -e "${yellow}- Test bandwidth controller access on port 51830:${reset}" + echo -e "${yellow} From inside the WireGuard tunnel: curl http://10.1.0.1:51830${reset}" + echo -e "${yellow}- If connectivity issues persist, check port forwarding and firewall rules${reset}" + echo +} + +check_bridge_service_status() { + echo "Checking nym-bridge service status..." + systemctl status nym-bridge.service --no-pager + echo "---------------------------------------" + echo "Checking nym-node service status..." + systemctl status nym-node.service --no-pager +} + +show_bridge_logs() { + local lines=${1:-50} + echo "Showing last $lines lines of nym-bridge logs..." + journalctl -u nym-bridge.service -n "$lines" --no-pager +} + +check_bridge_installation() { + local green="\033[0;32m" + local reset="\033[0m" + local red="\033[0;31m" + local yellow="\033[0;33m" + + echo -e "${yellow}=== Nym QUIC Bridge Installation Status ===${reset}" + echo "" + + # Check binary + if [[ -f "$BRIDGE_BINARY" ]]; then + echo -e "${green}✓ Bridge binary found: $BRIDGE_BINARY${reset}" + bridge_version=$($BRIDGE_BINARY --version 2>/dev/null | head -1 || echo "Unable to determine version") + echo " Version: $bridge_version" + else + echo -e "${red}✗ Bridge binary not found at $BRIDGE_BINARY${reset}" + fi + echo "" + + # Check configuration directory + if [[ -d "$BRIDGE_CONFIG_DIR" ]]; then + echo -e "${green}✓ Configuration directory exists: $BRIDGE_CONFIG_DIR${reset}" + else + echo -e "${red}✗ Configuration directory not found: $BRIDGE_CONFIG_DIR${reset}" + fi + echo "" + + # Check keys directory + if [[ -d "$BRIDGE_KEYS_DIR" ]]; then + echo -e "${green}✓ Keys directory exists: $BRIDGE_KEYS_DIR${reset}" + key_count=$(ls -1 "$BRIDGE_KEYS_DIR"/*.pem 2>/dev/null | wc -l) + echo " Keys found: $key_count" + else + echo -e "${red}✗ Keys directory not found: $BRIDGE_KEYS_DIR${reset}" + fi + echo "" + + # Check configuration files + if [[ -f "$BRIDGE_CONFIG" ]]; then + echo -e "${green}✓ Bridge config found: $BRIDGE_CONFIG${reset}" + else + echo -e "${red}✗ Bridge config not found: $BRIDGE_CONFIG${reset}" + fi + + if [[ -f "$CLIENT_PARAMS" ]]; then + echo -e "${green}✓ Client params found: $CLIENT_PARAMS${reset}" + else + echo -e "${red}✗ Client params not found: $CLIENT_PARAMS${reset}" + fi + echo "" + + # Check services + echo -e "${yellow}Service Status:${reset}" + if systemctl is-active --quiet nym-bridge.service; then + echo -e "${green}✓ nym-bridge service is running${reset}" + else + echo -e "${red}✗ nym-bridge service is not running${reset}" + fi + + if systemctl is-active --quiet nym-node.service; then + echo -e "${green}✓ nym-node service is running${reset}" + else + echo -e "${red}✗ nym-node service is not running${reset}" + fi + echo "" +} + +show_bridge_config() { + echo "=== Bridge Configuration ===" + echo "" + + if [[ -f "$BRIDGE_CONFIG" ]]; then + echo "Bridge config ($BRIDGE_CONFIG):" + echo "---------------------------------------" + cat "$BRIDGE_CONFIG" + echo "" + else + echo "Bridge config not found at $BRIDGE_CONFIG" + fi + + if [[ -f "$CLIENT_PARAMS" ]]; then + echo "Client parameters ($CLIENT_PARAMS):" + echo "---------------------------------------" + cat "$CLIENT_PARAMS" + echo "" + else + echo "Client parameters not found at $CLIENT_PARAMS" + fi +} + +show_bridge_keys() { + local green="\033[0;32m" + local reset="\033[0m" + local red="\033[0;31m" + local yellow="\033[0;33m" + + echo -e "${yellow}=== Bridge Keys Information ===${reset}" + echo "" + + if [[ ! -d "$BRIDGE_KEYS_DIR" ]]; then + echo -e "${red}Keys directory not found: $BRIDGE_KEYS_DIR${reset}" + return 1 + fi + + echo "Keys directory: $BRIDGE_KEYS_DIR" + echo "---------------------------------------" + + # List all key files + if ls -1 "$BRIDGE_KEYS_DIR"/*.pem >/dev/null 2>&1; then + for key_file in "$BRIDGE_KEYS_DIR"/*.pem; do + key_name=$(basename "$key_file") + echo -e "${green}Key file: $key_name${reset}" + + # If it's a public key, show the content + if [[ "$key_name" == *"_bridge_identity.pem" ]]; then + echo " Type: ED25519 Bridge Identity (Private)" + echo " Path: $key_file" + + # Extract and show public key + if command -v openssl >/dev/null 2>&1; then + echo -e "${yellow} Public key (base64):${reset}" + openssl pkey -in "$key_file" -pubout 2>/dev/null | grep -v "\---" | base64 -d | tail -c 32 | base64 + fi + fi + echo "" + done + else + echo -e "${red}No key files found in $BRIDGE_KEYS_DIR${reset}" + fi +} + +show_bridge_info() { + local green="\033[0;32m" + local reset="\033[0m" + local yellow="\033[0;33m" + + echo -e "${yellow}=== Nym QUIC Bridge Information ===${reset}" + echo "" + + # Network interfaces + echo -e "${yellow}Network Configuration:${reset}" + echo "Primary network device: $network_device" + echo "WireGuard interface: $wg_tunnel_interface" + + # Show IP addresses + echo "" + echo "IPv4 addresses:" + ip -4 addr show | grep inet | awk '{print " " $2 " on " $NF}' + + echo "" + echo "IPv6 addresses:" + ip -6 addr show scope global | grep inet6 | awk '{print " " $2 " on " $NF}' + + echo "" + echo -e "${yellow}Bridge Paths:${reset}" + echo "Configuration: $BRIDGE_CONFIG_DIR" + echo "Keys: $BRIDGE_KEYS_DIR" + echo "Binary: $BRIDGE_BINARY" + + echo "" + echo -e "${yellow}Important Commands:${reset}" + echo " Check bridge status: systemctl status nym-bridge" + echo " Check nym-node status: systemctl status nym-node" + echo " View bridge logs: journalctl -u nym-bridge -f" + echo " View nym-node logs: journalctl -u nym-node -f" + echo "" +} + +verify_bridge_prerequisites() { + local green="\033[0;32m" + local reset="\033[0m" + local red="\033[0;31m" + local yellow="\033[0;33m" + + echo -e "${yellow}=== Verifying Bridge Prerequisites ===${reset}" + echo "" + + local all_good=true + + # Check IP forwarding + ipv4_forward=$(cat /proc/sys/net/ipv4/ip_forward) + ipv6_forward=$(cat /proc/sys/net/ipv6/conf/all/forwarding) + + if [[ "$ipv4_forward" == "1" ]]; then + echo -e "${green}✓ IPv4 forwarding enabled${reset}" + else + echo -e "${red}✗ IPv4 forwarding disabled${reset}" + echo " Fix: Run 'nym-bridge-helper adjust_ip_forwarding'" + all_good=false + fi + + if [[ "$ipv6_forward" == "1" ]]; then + echo -e "${green}✓ IPv6 forwarding enabled${reset}" + else + echo -e "${red}✗ IPv6 forwarding disabled${reset}" + echo " Fix: Run 'nym-bridge-helper adjust_ip_forwarding'" + all_good=false + fi + + # Check iptables-persistent + if dpkg -s iptables-persistent >/dev/null 2>&1; then + echo -e "${green}✓ iptables-persistent installed${reset}" + else + echo -e "${red}✗ iptables-persistent not installed${reset}" + echo " Fix: This script will auto-install on first run" + all_good=false + fi + + # Check required packages + for pkg in openssl jq curl wg; do + if command -v "$pkg" >/dev/null 2>&1; then + echo -e "${green}✓ $pkg installed${reset}" + else + echo -e "${red}✗ $pkg not installed${reset}" + if [[ "$pkg" == "wg" ]]; then + echo " Install: sudo apt install wireguard-tools" + fi + all_good=false + fi + done + + echo "" + if [[ "$all_good" == true ]]; then + echo -e "${green}All prerequisites satisfied!${reset}" + else + echo -e "${yellow}Some prerequisites need attention. See above for fixes.${reset}" + fi + echo "" +} + +generate_bridge_keys() { + local green="\033[0;32m" + local reset="\033[0m" + local red="\033[0;31m" + local yellow="\033[0;33m" + + echo -e "${yellow}=== Generating Bridge Keys ===${reset}" + echo "" + + # Create directories + sudo mkdir -p "$BRIDGE_CONFIG_DIR" + sudo mkdir -p "$BRIDGE_KEYS_DIR" + sudo chmod 700 "$BRIDGE_KEYS_DIR" + + # Generate ED25519 private key + local key_file="$BRIDGE_KEYS_DIR/ed25519_bridge_identity.pem" + + if [[ -f "$key_file" ]]; then + echo -e "${yellow}Warning: Key file already exists at $key_file${reset}" + read -p "Overwrite existing key? (yes/no): " confirm + if [[ "$confirm" != "yes" ]]; then + echo "Aborted. Keeping existing key." + return 1 + fi + fi + + echo "Generating ED25519 key..." + sudo openssl genpkey -algorithm ED25519 -out "$key_file" + sudo chmod 600 "$key_file" + + echo -e "${green}✓ Bridge key generated at $key_file${reset}" + + # Extract and display public key + echo "" + echo "Extracting public key..." + pubkey=$(sudo openssl pkey -in "$key_file" -pubout 2>/dev/null | grep -v "\---" | base64 -d | tail -c 32 | base64) + echo -e "${green}Public key (base64): $pubkey${reset}" + + echo "" + echo -e "${yellow}Next steps:${reset}" + echo "1. Run 'nym-bridge-helper create_client_params' to generate client parameters" + echo "2. Run 'nym-bridge-helper create_bridge_config' to create bridge configuration" +} + +create_client_params() { + local green="\033[0;32m" + local reset="\033[0m" + local red="\033[0;31m" + local yellow="\033[0;33m" + + echo -e "${yellow}=== Creating Client Bridge Parameters ===${reset}" + echo "" + + # Check if key exists + local key_file="$BRIDGE_KEYS_DIR/ed25519_bridge_identity.pem" + if [[ ! -f "$key_file" ]]; then + echo -e "${red}Error: Bridge key not found at $key_file${reset}" + echo "Run 'nym-bridge-helper generate_bridge_keys' first" + return 1 + fi + + # Get forward address + read -p "Enter forward address (e.g., :51822, can be found by running 'curl -6 https://ifconfig.co/ip'): " forward_addr + if [[ -z "$forward_addr" ]]; then + echo -e "${red}Error: Forward address is required${reset}" + return 1 + fi + + # Extract public key + echo "Extracting public key..." + pubkey=$(sudo openssl pkey -in "$key_file" -pubout 2>/dev/null | grep -v "\---" | base64 -d | tail -c 32 | base64) + + # Create client params JSON + echo "Creating client parameters file..." + sudo tee "$CLIENT_PARAMS" > /dev/null < /dev/null < /dev/null + fi + + sudo tee -a "$BRIDGE_CONFIG" > /dev/null < /dev/null <