Compare commits

..

50 Commits

Author SHA1 Message Date
Jon Häggblad 21f1fa94de wip 2025-03-21 17:23:56 +01:00
Jon Häggblad 8ed09d74b3 Add RUSTUP_PERMIT_COPY_RENAME to ci-lint-typescript 2025-03-21 11:39:58 +01:00
dynco-nym 3f05c0d4b9 Add concurrency limit to CI (#5651) 2025-03-20 20:13:41 +01:00
Jon Häggblad 1a37e60483 Add max_retransmissions flag on each message (#5642) 2025-03-20 19:54:07 +01:00
Yana Matrosova 0abc07c96f Merge pull request #5636 from nymtech/BugFix/explorer_styling_broken
/ regenerated yarn.lock
2025-03-20 19:08:02 +02:00
Jon Häggblad 04664c8ae1 Rework IPR codec to extract out timer and implement AsyncWrite (#5632)
* Update ipr codec

* Tweak conditional

* Fix sending empty packet for flush

* Remove unneeded log

* Bump mix_traffic and real_message channel from size 1 to 8
2025-03-20 15:59:44 +01:00
import this 4da68438c0 [DOCs/operators]: Monor fix (#5650) 2025-03-20 13:13:55 +01:00
import this 2b83442a6d [DOCs/operators]: Updates and release notes for v2025.5-chokito (#5648)
* replace dead token page with live dashboard

* add dev release notes

* fix urls

* add IPv6 KVM guide

* simplify node setup command

* add operator updates

* PR finished: add WG exit policy steps andfinish changelog

* PR finished: fix typo

* add components to the branch

* fix styling
2025-03-20 10:55:33 +00:00
Yana f982cb49c2 Fix NS api endpoint for dev and prod, add env variables 2025-03-20 11:57:50 +02:00
dependabot[bot] 0c05727e58 build(deps): bump dtolnay/rust-toolchain from 1.90.0 to 1.100.0 (#5638)
Bumps [dtolnay/rust-toolchain](https://github.com/dtolnay/rust-toolchain) from 1.90.0 to 1.100.0.
- [Release notes](https://github.com/dtolnay/rust-toolchain/releases)
- [Commits](https://github.com/dtolnay/rust-toolchain/compare/1.90.0...1.100.0)

---
updated-dependencies:
- dependency-name: dtolnay/rust-toolchain
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-03-20 09:52:50 +00:00
Jon Häggblad 3c432ac073 Clean stale partially received buffers (#5536)
* Clean stale partially received buffers

* Tweak timeout

* Do cleanup after handling new messages instead of in the select loop

* Debug logging and remove unreachable

* Downgrade log

* Tweak logs

* tweak whitespace

* Only run the stale check every 10 sec
2025-03-20 10:01:42 +01:00
Yana 52ffd2e798 fix build 2025-03-19 15:30:39 +02:00
dependabot[bot] be8c7b4953 build(deps): bump golang.org/x/net from 0.23.0 to 0.36.0 in /wasm/mix-fetch/go-mix-conn (#5613)
* build(deps): bump golang.org/x/net in /wasm/mix-fetch/go-mix-conn

Bumps [golang.org/x/net](https://github.com/golang/net) from 0.23.0 to 0.36.0.
- [Commits](https://github.com/golang/net/compare/v0.23.0...v0.36.0)

---
updated-dependencies:
- dependency-name: golang.org/x/net
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>

* update used go compiler

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Jędrzej Stuczyński <jedrzej.stuczynski@gmail.com>
2025-03-19 11:00:55 +00:00
dependabot[bot] 8e4bc12b87 Bump http-proxy-middleware from 2.0.6 to 2.0.7 (#5019)
Bumps [http-proxy-middleware](https://github.com/chimurai/http-proxy-middleware) from 2.0.6 to 2.0.7.
- [Release notes](https://github.com/chimurai/http-proxy-middleware/releases)
- [Changelog](https://github.com/chimurai/http-proxy-middleware/blob/v2.0.7/CHANGELOG.md)
- [Commits](https://github.com/chimurai/http-proxy-middleware/compare/v2.0.6...v2.0.7)

---
updated-dependencies:
- dependency-name: http-proxy-middleware
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-03-19 10:10:17 +00:00
dependabot[bot] 4895820985 build(deps): bump next from 13.5.7 to 14.2.15 in /documentation/docs (#5281)
Bumps [next](https://github.com/vercel/next.js) from 13.5.7 to 14.2.15.
- [Release notes](https://github.com/vercel/next.js/releases)
- [Changelog](https://github.com/vercel/next.js/blob/canary/release.js)
- [Commits](https://github.com/vercel/next.js/compare/v13.5.7...v14.2.15)

---
updated-dependencies:
- dependency-name: next
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-03-19 10:10:02 +00:00
dependabot[bot] 8500618fe9 build(deps): bump next from 14.1.4 to 14.2.21 in /explorer-nextjs (#5308)
Bumps [next](https://github.com/vercel/next.js) from 14.1.4 to 14.2.21.
- [Release notes](https://github.com/vercel/next.js/releases)
- [Changelog](https://github.com/vercel/next.js/blob/canary/release.js)
- [Commits](https://github.com/vercel/next.js/compare/v14.1.4...v14.2.21)

---
updated-dependencies:
- dependency-name: next
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-03-19 10:09:54 +00:00
dependabot[bot] a5b390b98f build(deps): bump nanoid from 3.3.7 to 3.3.8 in /documentation/docs (#5335)
Bumps [nanoid](https://github.com/ai/nanoid) from 3.3.7 to 3.3.8.
- [Release notes](https://github.com/ai/nanoid/releases)
- [Changelog](https://github.com/ai/nanoid/blob/main/CHANGELOG.md)
- [Commits](https://github.com/ai/nanoid/compare/3.3.7...3.3.8)

---
updated-dependencies:
- dependency-name: nanoid
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-03-19 10:09:46 +00:00
dependabot[bot] ff66674f61 build(deps): bump store2 from 2.14.3 to 2.14.4 (#5391)
Bumps [store2](https://github.com/nbubna/store) from 2.14.3 to 2.14.4.
- [Commits](https://github.com/nbubna/store/compare/2.14.3...2.14.4)

---
updated-dependencies:
- dependency-name: store2
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-03-19 10:09:38 +00:00
dependabot[bot] a7cf34e812 build(deps): bump @octokit/plugin-paginate-rest and @actions/github (#5488)
Bumps [@octokit/plugin-paginate-rest](https://github.com/octokit/plugin-paginate-rest.js) to 9.2.2 and updates ancestor dependency [@actions/github](https://github.com/actions/toolkit/tree/HEAD/packages/github). These dependencies need to be updated together.


Updates `@octokit/plugin-paginate-rest` from 9.2.1 to 9.2.2
- [Release notes](https://github.com/octokit/plugin-paginate-rest.js/releases)
- [Commits](https://github.com/octokit/plugin-paginate-rest.js/compare/v9.2.1...v9.2.2)

Updates `@actions/github` from 5.1.1 to 6.0.0
- [Changelog](https://github.com/actions/toolkit/blob/main/packages/github/RELEASES.md)
- [Commits](https://github.com/actions/toolkit/commits/HEAD/packages/github)

---
updated-dependencies:
- dependency-name: "@octokit/plugin-paginate-rest"
  dependency-type: indirect
- dependency-name: "@actions/github"
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-03-19 10:09:05 +00:00
dependabot[bot] a85dad6bd7 build(deps): bump braces in /sdk/typescript/packages/mix-fetch-node (#5612)
Bumps [braces](https://github.com/micromatch/braces) from 3.0.2 to 3.0.3.
- [Changelog](https://github.com/micromatch/braces/blob/master/CHANGELOG.md)
- [Commits](https://github.com/micromatch/braces/compare/3.0.2...3.0.3)

---
updated-dependencies:
- dependency-name: braces
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-03-19 10:08:56 +00:00
dependabot[bot] 5b8a14f74b build(deps-dev): bump ws in /wasm/client/internal-dev (#5614)
Bumps [ws](https://github.com/websockets/ws) from 8.13.0 to 8.18.1.
- [Release notes](https://github.com/websockets/ws/releases)
- [Commits](https://github.com/websockets/ws/compare/8.13.0...8.18.1)

---
updated-dependencies:
- dependency-name: ws
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-03-19 10:08:45 +00:00
dependabot[bot] 730c2efea6 build(deps-dev): bump webpack in /wasm/client/internal-dev (#5615)
Bumps [webpack](https://github.com/webpack/webpack) from 5.77.0 to 5.98.0.
- [Release notes](https://github.com/webpack/webpack/releases)
- [Commits](https://github.com/webpack/webpack/compare/v5.77.0...v5.98.0)

---
updated-dependencies:
- dependency-name: webpack
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-03-19 10:08:36 +00:00
dependabot[bot] c9d6a8cc25 build(deps): bump @babel/runtime in /testnet-faucet (#5621)
Bumps [@babel/runtime](https://github.com/babel/babel/tree/HEAD/packages/babel-runtime) from 7.16.3 to 7.26.10.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.26.10/packages/babel-runtime)

---
updated-dependencies:
- dependency-name: "@babel/runtime"
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-03-19 10:06:52 +00:00
Jon Häggblad 230b2b1784 Upgrade sha2 to workspace version or validator-client (#5644) 2025-03-19 10:46:15 +01:00
Jon Häggblad e4e9615535 Add RUSTUP_PERMIT_COPY_RENAME in two workflows that we forgot about (#5646) 2025-03-19 09:18:25 +01:00
mfahampshire a19ee8f2aa fix accidental localhost link (#5643) 2025-03-18 17:23:22 +01:00
benedetta davico abfc68108a Merge pull request #5497 from helicopter-1/spelling
Corrected typos
2025-03-18 16:53:37 +01:00
Yana 7bf1adff28 Fixes 2025-03-18 17:45:38 +02:00
dependabot[bot] ed90e358fb build(deps): bump zeroize from 1.6.0 to 1.8.1 (#5630)
Bumps [zeroize](https://github.com/RustCrypto/utils) from 1.6.0 to 1.8.1.
- [Commits](https://github.com/RustCrypto/utils/compare/zeroize-v1.6.0...zeroize-v1.8.1)

---
updated-dependencies:
- dependency-name: zeroize
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-03-18 15:23:16 +01:00
benedetta davico c7d0e26946 Merge pull request #5640 from nymtech/release/2025.5-chokito
Merge chokito to develop
2025-03-18 14:50:45 +01:00
Jon Häggblad 8d65c25986 Remove explorer-api from the main workspace (#5635) 2025-03-18 14:09:24 +01:00
benedetta davico a143d5f4f6 Merge pull request #5557 from nymtech/feature/exit-policies
Wireguard exit policies (and tests)
2025-03-18 12:29:40 +01:00
dependabot[bot] c041d11673 build(deps): bump zip from 2.2.2 to 2.4.1 (#5639)
Bumps [zip](https://github.com/zip-rs/zip2) from 2.2.2 to 2.4.1.
- [Release notes](https://github.com/zip-rs/zip2/releases)
- [Changelog](https://github.com/zip-rs/zip2/blob/master/CHANGELOG.md)
- [Commits](https://github.com/zip-rs/zip2/compare/v2.2.2...v2.4.1)

---
updated-dependencies:
- dependency-name: zip
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-03-18 10:59:08 +01:00
benedettadavico 82e82943aa update changelog 2025-03-18 10:39:55 +01:00
RadekSabacky e4fd87be2c / regenerated yarn.lock 2025-03-17 19:04:51 +01:00
dependabot[bot] 19ffe217f1 build(deps): bump http from 1.2.0 to 1.3.1 (#5626) 2025-03-17 18:47:40 +01:00
dependabot[bot] 079bfa52e7 build(deps): bump the patch-updates group with 8 updates (#5624)
Bumps the patch-updates group with 8 updates:

| Package | From | To |
| --- | --- | --- |
| [async-trait](https://github.com/dtolnay/async-trait) | `0.1.87` | `0.1.88` |
| [clap](https://github.com/clap-rs/clap) | `4.5.31` | `4.5.32` |
| [env_logger](https://github.com/rust-cli/env_logger) | `0.11.6` | `0.11.7` |
| [http-body-util](https://github.com/hyperium/http-body) | `0.1.2` | `0.1.3` |
| [quote](https://github.com/dtolnay/quote) | `1.0.39` | `1.0.40` |
| [tokio](https://github.com/tokio-rs/tokio) | `1.44.0` | `1.44.1` |
| [tokio-util](https://github.com/tokio-rs/tokio) | `0.7.13` | `0.7.14` |
| [indexed_db_futures](https://github.com/Alorel/rust-indexed-db) | `0.6.0` | `0.6.1` |


Updates `async-trait` from 0.1.87 to 0.1.88
- [Release notes](https://github.com/dtolnay/async-trait/releases)
- [Commits](https://github.com/dtolnay/async-trait/compare/0.1.87...0.1.88)

Updates `clap` from 4.5.31 to 4.5.32
- [Release notes](https://github.com/clap-rs/clap/releases)
- [Changelog](https://github.com/clap-rs/clap/blob/master/CHANGELOG.md)
- [Commits](https://github.com/clap-rs/clap/compare/v4.5.31...clap_complete-v4.5.32)

Updates `env_logger` from 0.11.6 to 0.11.7
- [Release notes](https://github.com/rust-cli/env_logger/releases)
- [Changelog](https://github.com/rust-cli/env_logger/blob/main/CHANGELOG.md)
- [Commits](https://github.com/rust-cli/env_logger/compare/v0.11.6...v0.11.7)

Updates `http-body-util` from 0.1.2 to 0.1.3
- [Release notes](https://github.com/hyperium/http-body/releases)
- [Commits](https://github.com/hyperium/http-body/compare/http-body-util-v0.1.2...http-body-util-v0.1.3)

Updates `quote` from 1.0.39 to 1.0.40
- [Release notes](https://github.com/dtolnay/quote/releases)
- [Commits](https://github.com/dtolnay/quote/compare/1.0.39...1.0.40)

Updates `tokio` from 1.44.0 to 1.44.1
- [Release notes](https://github.com/tokio-rs/tokio/releases)
- [Commits](https://github.com/tokio-rs/tokio/compare/tokio-1.44.0...tokio-1.44.1)

Updates `tokio-util` from 0.7.13 to 0.7.14
- [Release notes](https://github.com/tokio-rs/tokio/releases)
- [Commits](https://github.com/tokio-rs/tokio/compare/tokio-util-0.7.13...tokio-util-0.7.14)

Updates `indexed_db_futures` from 0.6.0 to 0.6.1
- [Release notes](https://github.com/Alorel/rust-indexed-db/releases)
- [Commits](https://github.com/Alorel/rust-indexed-db/compare/v0.6.0...v0.6.1)

---
updated-dependencies:
- dependency-name: async-trait
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: patch-updates
- dependency-name: clap
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: patch-updates
- dependency-name: env_logger
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: patch-updates
- dependency-name: http-body-util
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: patch-updates
- dependency-name: quote
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: patch-updates
- dependency-name: tokio
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: patch-updates
- dependency-name: tokio-util
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: patch-updates
- dependency-name: indexed_db_futures
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: patch-updates
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-03-17 16:30:29 +01:00
dependabot[bot] be9a2c26e7 build(deps): bump once_cell from 1.20.3 to 1.21.1 (#5629)
Bumps [once_cell](https://github.com/matklad/once_cell) from 1.20.3 to 1.21.1.
- [Changelog](https://github.com/matklad/once_cell/blob/master/CHANGELOG.md)
- [Commits](https://github.com/matklad/once_cell/compare/v1.20.3...v1.21.1)

---
updated-dependencies:
- dependency-name: once_cell
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-03-17 16:29:02 +01:00
mfahampshire d6f3eb6411 Max/new explorer url (#5522)
* new api link for explorer v2

* remove footer add explorer to navbar

* include image

* @ fix menu icons

* + explorer link in footer

---------

Co-authored-by: RadekSabacky <radek@nymtech.net>
2025-03-17 14:15:10 +00:00
dependabot[bot] 144f3bed9c build(deps): bump celes from 2.5.0 to 2.6.0 (#5627)
Bumps [celes](https://github.com/mikelodder7/celes) from 2.5.0 to 2.6.0.
- [Commits](https://github.com/mikelodder7/celes/commits)

---
updated-dependencies:
- dependency-name: celes
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-03-17 13:46:33 +01:00
dependabot[bot] c1174e64d4 build(deps): bump humantime from 2.1.0 to 2.2.0 (#5625) 2025-03-17 12:59:56 +01:00
dependabot[bot] 312ecbe4dc build(deps): bump tempfile from 3.18.0 to 3.19.0 (#5631) 2025-03-17 12:53:24 +01:00
dependabot[bot] d2afa587e4 build(deps): bump uuid from 1.15.1 to 1.16.0 (#5628) 2025-03-17 12:52:17 +01:00
Tommy Verrall 224c4c1870 fix tests and ensure everything is working... 2025-03-17 11:07:54 +01:00
dynco-nym 3f8abdb74f Add /v3/nym-nodes (#5569)
* Add /v3/nym-nodes
- returns extended node info from local DB
- endpoint caching
- add bond_info & self_described to DB nym_nodes
- update mixnode & gateway bond status on data refresh
- add `active` column to DB nym_nodes
- use only active & bonded nodes in scraping/testrun tasks

* Improve log

* PR feedback
- remove active field from nym_nodes
- delete obsolete nym_nodes

* node-status-api: cargo sqlx prepare

* Remove guardrails in CI file

* Revert "node-status-api: cargo sqlx prepare"

This reverts commit 1fcd895f0d.

* Try to ignore sqlx files

* cargo sqlx prepare

* Repair harbor tag check

* Try without checkout action

* add awk

* Update log
2025-03-15 00:17:40 +01:00
dynco-nym 3baac1292d Add workflow to check if tag exists (#5617)
* Add workflow

* Check harbor for tag

* Remove leftover comments

* Try out cargo metadata

* Revert "Try out cargo metadata"

This reverts commit b83fbad1ca.
2025-03-14 16:31:49 +01:00
Fouad dc88650d6d Explorer V2 (#5548)
* remove pnpm lock file (should only be using yarn)

* Add lefthook configuration for pre-commit checks

* Add explorer-v2 to package.json dependencies

* add explorer v2

* update explorer v2 package name

* + basepath
+ redirect to basepath
+ blog icons refactor
+ icons refactor

* Add Getting Started instructions to README

* fix noise graph bug and line graph UI

* Delete unused translations, clean up console logs

* / test image url

* update yarn.lock

---------

Co-authored-by: RadekSabacky <radek@nymtech.net>
Co-authored-by: windy-ux <75579979+windy-ux@users.noreply.github.com>
Co-authored-by: Yana <iana.matrosova@gmail.com>
Co-authored-by: Mark Sinclair <mmsinclair@users.noreply.github.com>
2025-03-13 11:31:59 +00:00
Tommy Verrall 681c054890 rename file 2025-03-04 18:08:26 +01:00
Tommy Verrall f623bbd57c wireguard exit policy rules 2025-03-04 18:06:01 +01:00
helicopter-1 d4d576f363 Fix typos in CHANGELOG.md 2025-02-20 21:28:47 +01:00
372 changed files with 70300 additions and 12650 deletions
+1
View File
@@ -1 +1,2 @@
nym-validator-rewarder/.sqlx/** diff=nodiff
nym-node-status-api/nym-node-status-api/.sqlx/** diff=nodiff
+149 -265
View File
@@ -9,7 +9,7 @@
"version": "1.0.0",
"dependencies": {
"@actions/core": "^1.10.1",
"@actions/github": "^5.1.1",
"@actions/github": "^6.0.0",
"@octokit/auth-action": "^4.0.1",
"@octokit/rest": "^20.0.2",
"hasha": "^5.2.0",
@@ -29,22 +29,34 @@
}
},
"node_modules/@actions/github": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/@actions/github/-/github-5.1.1.tgz",
"integrity": "sha512-Nk59rMDoJaV+mHCOJPXuvB1zIbomlKS0dmSIqPGxd0enAXBnOfn4VWF+CGtRCwXZG9Epa54tZA7VIRlJDS8A6g==",
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/@actions/github/-/github-6.0.0.tgz",
"integrity": "sha512-alScpSVnYmjNEXboZjarjukQEzgCRmjMv6Xj47fsdnqGS73bjJNDpiiXmp8jr0UZLdUB6d9jW63IcmddUP+l0g==",
"license": "MIT",
"dependencies": {
"@actions/http-client": "^2.0.1",
"@octokit/core": "^3.6.0",
"@octokit/plugin-paginate-rest": "^2.17.0",
"@octokit/plugin-rest-endpoint-methods": "^5.13.0"
"@actions/http-client": "^2.2.0",
"@octokit/core": "^5.0.1",
"@octokit/plugin-paginate-rest": "^9.0.0",
"@octokit/plugin-rest-endpoint-methods": "^10.0.0"
}
},
"node_modules/@actions/http-client": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-2.1.1.tgz",
"integrity": "sha512-qhrkRMB40bbbLo7gF+0vu+X+UawOvQQqNAA/5Unx774RS8poaOhThDOG6BGmxvAnxhQnDp2BG/ZUm65xZILTpw==",
"version": "2.2.3",
"resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-2.2.3.tgz",
"integrity": "sha512-mx8hyJi/hjFvbPokCg4uRd4ZX78t+YyRPtnKWwIl+RzNaVuFpQHfmlGVfsKEJN8LwTCvL+DfVgAM04XaHkm6bA==",
"license": "MIT",
"dependencies": {
"tunnel": "^0.0.6"
"tunnel": "^0.0.6",
"undici": "^5.25.4"
}
},
"node_modules/@fastify/busboy": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz",
"integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==",
"license": "MIT",
"engines": {
"node": ">=14"
}
},
"node_modules/@octokit/auth-action": {
@@ -59,14 +71,6 @@
"node": ">= 18"
}
},
"node_modules/@octokit/auth-action/node_modules/@octokit/auth-token": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-4.0.0.tgz",
"integrity": "sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA==",
"engines": {
"node": ">= 18"
}
},
"node_modules/@octokit/auth-action/node_modules/@octokit/openapi-types": {
"version": "20.0.0",
"resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-20.0.0.tgz",
@@ -81,115 +85,152 @@
}
},
"node_modules/@octokit/auth-token": {
"version": "2.5.0",
"resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.5.0.tgz",
"integrity": "sha512-r5FVUJCOLl19AxiuZD2VRZ/ORjp/4IN98Of6YJoJOkY75CIBuYfmiNHGrDwXr+aLGG55igl9QrxX3hbiXlLb+g==",
"dependencies": {
"@octokit/types": "^6.0.3"
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-4.0.0.tgz",
"integrity": "sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA==",
"license": "MIT",
"engines": {
"node": ">= 18"
}
},
"node_modules/@octokit/core": {
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/@octokit/core/-/core-3.6.0.tgz",
"integrity": "sha512-7RKRKuA4xTjMhY+eG3jthb3hlZCsOwg3rztWh75Xc+ShDWOfDDATWbeZpAHBNRpm4Tv9WgBMOy1zEJYXG6NJ7Q==",
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/@octokit/core/-/core-5.2.0.tgz",
"integrity": "sha512-1LFfa/qnMQvEOAdzlQymH0ulepxbxnCYAKJZfMci/5XJyIHWgEYnDmgnKakbTh7CH2tFQ5O60oYDvns4i9RAIg==",
"license": "MIT",
"dependencies": {
"@octokit/auth-token": "^2.4.4",
"@octokit/graphql": "^4.5.8",
"@octokit/request": "^5.6.3",
"@octokit/request-error": "^2.0.5",
"@octokit/types": "^6.0.3",
"@octokit/auth-token": "^4.0.0",
"@octokit/graphql": "^7.1.0",
"@octokit/request": "^8.3.1",
"@octokit/request-error": "^5.1.0",
"@octokit/types": "^13.0.0",
"before-after-hook": "^2.2.0",
"universal-user-agent": "^6.0.0"
},
"engines": {
"node": ">= 18"
}
},
"node_modules/@octokit/endpoint": {
"version": "6.0.12",
"resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.12.tgz",
"integrity": "sha512-lF3puPwkQWGfkMClXb4k/eUT/nZKQfxinRWJrdZaJO85Dqwo/G0yOC434Jr2ojwafWJMYqFGFa5ms4jJUgujdA==",
"version": "9.0.6",
"resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-9.0.6.tgz",
"integrity": "sha512-H1fNTMA57HbkFESSt3Y9+FBICv+0jFceJFPWDePYlR/iMGrwM5ph+Dd4XRQs+8X+PUFURLQgX9ChPfhJ/1uNQw==",
"license": "MIT",
"dependencies": {
"@octokit/types": "^6.0.3",
"is-plain-object": "^5.0.0",
"@octokit/types": "^13.1.0",
"universal-user-agent": "^6.0.0"
},
"engines": {
"node": ">= 18"
}
},
"node_modules/@octokit/graphql": {
"version": "4.8.0",
"resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-4.8.0.tgz",
"integrity": "sha512-0gv+qLSBLKF0z8TKaSKTsS39scVKF9dbMxJpj3U0vC7wjNWFuIpL/z76Qe2fiuCbDRcJSavkXsVtMS6/dtQQsg==",
"version": "7.1.0",
"resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-7.1.0.tgz",
"integrity": "sha512-r+oZUH7aMFui1ypZnAvZmn0KSqAUgE1/tUXIWaqUCa1758ts/Jio84GZuzsvUkme98kv0WFY8//n0J1Z+vsIsQ==",
"license": "MIT",
"dependencies": {
"@octokit/request": "^5.6.0",
"@octokit/types": "^6.0.3",
"@octokit/request": "^8.3.0",
"@octokit/types": "^13.0.0",
"universal-user-agent": "^6.0.0"
},
"engines": {
"node": ">= 18"
}
},
"node_modules/@octokit/openapi-types": {
"version": "12.11.0",
"resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-12.11.0.tgz",
"integrity": "sha512-VsXyi8peyRq9PqIz/tpqiL2w3w80OgVMwBHltTml3LmVvXiphgeqmY9mvBw9Wu7e0QWk/fqD37ux8yP5uVekyQ=="
"version": "23.0.1",
"resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-23.0.1.tgz",
"integrity": "sha512-izFjMJ1sir0jn0ldEKhZ7xegCTj/ObmEDlEfpFrx4k/JyZSMRHbO3/rBwgE7f3m2DHt+RrNGIVw4wSmwnm3t/g==",
"license": "MIT"
},
"node_modules/@octokit/plugin-paginate-rest": {
"version": "2.21.3",
"resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.21.3.tgz",
"integrity": "sha512-aCZTEf0y2h3OLbrgKkrfFdjRL6eSOo8komneVQJnYecAxIej7Bafor2xhuDJOIFau4pk0i/P28/XgtbyPF0ZHw==",
"version": "9.2.2",
"resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-9.2.2.tgz",
"integrity": "sha512-u3KYkGF7GcZnSD/3UP0S7K5XUFT2FkOQdcfXZGZQPGv3lm4F2Xbf71lvjldr8c1H3nNbF+33cLEkWYbokGWqiQ==",
"license": "MIT",
"dependencies": {
"@octokit/types": "^6.40.0"
"@octokit/types": "^12.6.0"
},
"engines": {
"node": ">= 18"
},
"peerDependencies": {
"@octokit/core": ">=2"
"@octokit/core": "5"
}
},
"node_modules/@octokit/plugin-paginate-rest/node_modules/@octokit/openapi-types": {
"version": "20.0.0",
"resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-20.0.0.tgz",
"integrity": "sha512-EtqRBEjp1dL/15V7WiX5LJMIxxkdiGJnabzYx5Apx4FkQIFgAfKumXeYAqqJCj1s+BMX4cPFIFC4OLCR6stlnA==",
"license": "MIT"
},
"node_modules/@octokit/plugin-paginate-rest/node_modules/@octokit/types": {
"version": "12.6.0",
"resolved": "https://registry.npmjs.org/@octokit/types/-/types-12.6.0.tgz",
"integrity": "sha512-1rhSOfRa6H9w4YwK0yrf5faDaDTb+yLyBUKOCV4xtCDB5VmIPqd/v9yr9o6SAzOAlRxMiRiCic6JVM1/kunVkw==",
"license": "MIT",
"dependencies": {
"@octokit/openapi-types": "^20.0.0"
}
},
"node_modules/@octokit/plugin-rest-endpoint-methods": {
"version": "5.16.2",
"resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-5.16.2.tgz",
"integrity": "sha512-8QFz29Fg5jDuTPXVtey05BLm7OB+M8fnvE64RNegzX7U+5NUXcOcnpTIK0YfSHBg8gYd0oxIq3IZTe9SfPZiRw==",
"version": "10.4.1",
"resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-10.4.1.tgz",
"integrity": "sha512-xV1b+ceKV9KytQe3zCVqjg+8GTGfDYwaT1ATU5isiUyVtlVAO3HNdzpS4sr4GBx4hxQ46s7ITtZrAsxG22+rVg==",
"license": "MIT",
"dependencies": {
"@octokit/types": "^6.39.0",
"deprecation": "^2.3.1"
"@octokit/types": "^12.6.0"
},
"engines": {
"node": ">= 18"
},
"peerDependencies": {
"@octokit/core": ">=3"
"@octokit/core": "5"
}
},
"node_modules/@octokit/plugin-rest-endpoint-methods/node_modules/@octokit/openapi-types": {
"version": "20.0.0",
"resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-20.0.0.tgz",
"integrity": "sha512-EtqRBEjp1dL/15V7WiX5LJMIxxkdiGJnabzYx5Apx4FkQIFgAfKumXeYAqqJCj1s+BMX4cPFIFC4OLCR6stlnA==",
"license": "MIT"
},
"node_modules/@octokit/plugin-rest-endpoint-methods/node_modules/@octokit/types": {
"version": "12.6.0",
"resolved": "https://registry.npmjs.org/@octokit/types/-/types-12.6.0.tgz",
"integrity": "sha512-1rhSOfRa6H9w4YwK0yrf5faDaDTb+yLyBUKOCV4xtCDB5VmIPqd/v9yr9o6SAzOAlRxMiRiCic6JVM1/kunVkw==",
"license": "MIT",
"dependencies": {
"@octokit/openapi-types": "^20.0.0"
}
},
"node_modules/@octokit/request": {
"version": "5.6.3",
"resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.6.3.tgz",
"integrity": "sha512-bFJl0I1KVc9jYTe9tdGGpAMPy32dLBXXo1dS/YwSCTL/2nd9XeHsY616RE3HPXDVk+a+dBuzyz5YdlXwcDTr2A==",
"version": "8.4.1",
"resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.4.1.tgz",
"integrity": "sha512-qnB2+SY3hkCmBxZsR/MPCybNmbJe4KAlfWErXq+rBKkQJlbjdJeS85VI9r8UqeLYLvnAenU8Q1okM/0MBsAGXw==",
"license": "MIT",
"dependencies": {
"@octokit/endpoint": "^6.0.1",
"@octokit/request-error": "^2.1.0",
"@octokit/types": "^6.16.1",
"is-plain-object": "^5.0.0",
"node-fetch": "^2.6.7",
"@octokit/endpoint": "^9.0.6",
"@octokit/request-error": "^5.1.1",
"@octokit/types": "^13.1.0",
"universal-user-agent": "^6.0.0"
},
"engines": {
"node": ">= 18"
}
},
"node_modules/@octokit/request-error": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-2.1.0.tgz",
"integrity": "sha512-1VIvgXxs9WHSjicsRwq8PlR2LR2x6DwsJAaFgzdi0JfJoGSO8mYI/cHJQ+9FbN21aa+DrgNLnwObmyeSC8Rmpg==",
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-5.1.1.tgz",
"integrity": "sha512-v9iyEQJH6ZntoENr9/yXxjuezh4My67CBSu9r6Ve/05Iu5gNgnisNWOsoJHTP6k0Rr0+HQIpnH+kyammu90q/g==",
"license": "MIT",
"dependencies": {
"@octokit/types": "^6.0.3",
"@octokit/types": "^13.1.0",
"deprecation": "^2.0.0",
"once": "^1.4.0"
}
},
"node_modules/@octokit/request/node_modules/node-fetch": {
"version": "2.7.0",
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz",
"integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==",
"dependencies": {
"whatwg-url": "^5.0.0"
},
"engines": {
"node": "4.x || >=6.0.0"
},
"peerDependencies": {
"encoding": "^0.1.0"
},
"peerDependenciesMeta": {
"encoding": {
"optional": true
}
"node": ">= 18"
}
},
"node_modules/@octokit/rest": {
@@ -206,89 +247,6 @@
"node": ">= 18"
}
},
"node_modules/@octokit/rest/node_modules/@octokit/auth-token": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-4.0.0.tgz",
"integrity": "sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA==",
"engines": {
"node": ">= 18"
}
},
"node_modules/@octokit/rest/node_modules/@octokit/core": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/@octokit/core/-/core-5.0.0.tgz",
"integrity": "sha512-YbAtMWIrbZ9FCXbLwT9wWB8TyLjq9mxpKdgB3dUNxQcIVTf9hJ70gRPwAcqGZdY6WdJPZ0I7jLaaNDCiloGN2A==",
"dependencies": {
"@octokit/auth-token": "^4.0.0",
"@octokit/graphql": "^7.0.0",
"@octokit/request": "^8.0.2",
"@octokit/request-error": "^5.0.0",
"@octokit/types": "^11.0.0",
"before-after-hook": "^2.2.0",
"universal-user-agent": "^6.0.0"
},
"engines": {
"node": ">= 18"
}
},
"node_modules/@octokit/rest/node_modules/@octokit/endpoint": {
"version": "9.0.0",
"resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-9.0.0.tgz",
"integrity": "sha512-szrQhiqJ88gghWY2Htt8MqUDO6++E/EIXqJ2ZEp5ma3uGS46o7LZAzSLt49myB7rT+Hfw5Y6gO3LmOxGzHijAQ==",
"dependencies": {
"@octokit/types": "^11.0.0",
"is-plain-object": "^5.0.0",
"universal-user-agent": "^6.0.0"
},
"engines": {
"node": ">= 18"
}
},
"node_modules/@octokit/rest/node_modules/@octokit/graphql": {
"version": "7.0.1",
"resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-7.0.1.tgz",
"integrity": "sha512-T5S3oZ1JOE58gom6MIcrgwZXzTaxRnxBso58xhozxHpOqSTgDS6YNeEUvZ/kRvXgPrRz/KHnZhtb7jUMRi9E6w==",
"dependencies": {
"@octokit/request": "^8.0.1",
"@octokit/types": "^11.0.0",
"universal-user-agent": "^6.0.0"
},
"engines": {
"node": ">= 18"
}
},
"node_modules/@octokit/rest/node_modules/@octokit/openapi-types": {
"version": "18.0.0",
"resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-18.0.0.tgz",
"integrity": "sha512-V8GImKs3TeQRxRtXFpG2wl19V7444NIOTDF24AWuIbmNaNYOQMWRbjcGDXV5B+0n887fgDcuMNOmlul+k+oJtw=="
},
"node_modules/@octokit/rest/node_modules/@octokit/plugin-paginate-rest": {
"version": "9.2.1",
"resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-9.2.1.tgz",
"integrity": "sha512-wfGhE/TAkXZRLjksFXuDZdmGnJQHvtU/joFQdweXUgzo1XwvBCD4o4+75NtFfjfLK5IwLf9vHTfSiU3sLRYpRw==",
"dependencies": {
"@octokit/types": "^12.6.0"
},
"engines": {
"node": ">= 18"
},
"peerDependencies": {
"@octokit/core": "5"
}
},
"node_modules/@octokit/rest/node_modules/@octokit/plugin-paginate-rest/node_modules/@octokit/openapi-types": {
"version": "20.0.0",
"resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-20.0.0.tgz",
"integrity": "sha512-EtqRBEjp1dL/15V7WiX5LJMIxxkdiGJnabzYx5Apx4FkQIFgAfKumXeYAqqJCj1s+BMX4cPFIFC4OLCR6stlnA=="
},
"node_modules/@octokit/rest/node_modules/@octokit/plugin-paginate-rest/node_modules/@octokit/types": {
"version": "12.6.0",
"resolved": "https://registry.npmjs.org/@octokit/types/-/types-12.6.0.tgz",
"integrity": "sha512-1rhSOfRa6H9w4YwK0yrf5faDaDTb+yLyBUKOCV4xtCDB5VmIPqd/v9yr9o6SAzOAlRxMiRiCic6JVM1/kunVkw==",
"dependencies": {
"@octokit/openapi-types": "^20.0.0"
}
},
"node_modules/@octokit/rest/node_modules/@octokit/plugin-request-log": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-4.0.0.tgz",
@@ -300,75 +258,13 @@
"@octokit/core": ">=5"
}
},
"node_modules/@octokit/rest/node_modules/@octokit/plugin-rest-endpoint-methods": {
"version": "10.4.1",
"resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-10.4.1.tgz",
"integrity": "sha512-xV1b+ceKV9KytQe3zCVqjg+8GTGfDYwaT1ATU5isiUyVtlVAO3HNdzpS4sr4GBx4hxQ46s7ITtZrAsxG22+rVg==",
"dependencies": {
"@octokit/types": "^12.6.0"
},
"engines": {
"node": ">= 18"
},
"peerDependencies": {
"@octokit/core": "5"
}
},
"node_modules/@octokit/rest/node_modules/@octokit/plugin-rest-endpoint-methods/node_modules/@octokit/openapi-types": {
"version": "20.0.0",
"resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-20.0.0.tgz",
"integrity": "sha512-EtqRBEjp1dL/15V7WiX5LJMIxxkdiGJnabzYx5Apx4FkQIFgAfKumXeYAqqJCj1s+BMX4cPFIFC4OLCR6stlnA=="
},
"node_modules/@octokit/rest/node_modules/@octokit/plugin-rest-endpoint-methods/node_modules/@octokit/types": {
"version": "12.6.0",
"resolved": "https://registry.npmjs.org/@octokit/types/-/types-12.6.0.tgz",
"integrity": "sha512-1rhSOfRa6H9w4YwK0yrf5faDaDTb+yLyBUKOCV4xtCDB5VmIPqd/v9yr9o6SAzOAlRxMiRiCic6JVM1/kunVkw==",
"dependencies": {
"@octokit/openapi-types": "^20.0.0"
}
},
"node_modules/@octokit/rest/node_modules/@octokit/request": {
"version": "8.1.1",
"resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.1.1.tgz",
"integrity": "sha512-8N+tdUz4aCqQmXl8FpHYfKG9GelDFd7XGVzyN8rc6WxVlYcfpHECnuRkgquzz+WzvHTK62co5di8gSXnzASZPQ==",
"dependencies": {
"@octokit/endpoint": "^9.0.0",
"@octokit/request-error": "^5.0.0",
"@octokit/types": "^11.1.0",
"is-plain-object": "^5.0.0",
"universal-user-agent": "^6.0.0"
},
"engines": {
"node": ">= 18"
}
},
"node_modules/@octokit/rest/node_modules/@octokit/request-error": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-5.0.0.tgz",
"integrity": "sha512-1ue0DH0Lif5iEqT52+Rf/hf0RmGO9NWFjrzmrkArpG9trFfDM/efx00BJHdLGuro4BR/gECxCU2Twf5OKrRFsQ==",
"dependencies": {
"@octokit/types": "^11.0.0",
"deprecation": "^2.0.0",
"once": "^1.4.0"
},
"engines": {
"node": ">= 18"
}
},
"node_modules/@octokit/rest/node_modules/@octokit/types": {
"version": "11.1.0",
"resolved": "https://registry.npmjs.org/@octokit/types/-/types-11.1.0.tgz",
"integrity": "sha512-Fz0+7GyLm/bHt8fwEqgvRBWwIV1S6wRRyq+V6exRKLVWaKGsuy6H9QFYeBVDV7rK6fO3XwHgQOPxv+cLj2zpXQ==",
"dependencies": {
"@octokit/openapi-types": "^18.0.0"
}
},
"node_modules/@octokit/types": {
"version": "6.41.0",
"resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.41.0.tgz",
"integrity": "sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==",
"version": "13.8.0",
"resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.8.0.tgz",
"integrity": "sha512-x7DjTIbEpEWXK99DMd01QfWy0hd5h4EN+Q7shkdKds3otGQP+oWE/y0A76i1OvH9fygo4ddvNf7ZvF0t78P98A==",
"license": "MIT",
"dependencies": {
"@octokit/openapi-types": "^12.11.0"
"@octokit/openapi-types": "^23.0.1"
}
},
"node_modules/@vercel/ncc": {
@@ -396,7 +292,8 @@
"node_modules/deprecation": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz",
"integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ=="
"integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==",
"license": "ISC"
},
"node_modules/fetch-blob": {
"version": "3.2.0",
@@ -446,14 +343,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/is-plain-object": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz",
"integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/is-stream": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
@@ -504,15 +393,11 @@
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
"integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
"license": "ISC",
"dependencies": {
"wrappy": "1"
}
},
"node_modules/tr46": {
"version": "0.0.3",
"resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
"integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="
},
"node_modules/tunnel": {
"version": "0.0.6",
"resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz",
@@ -529,6 +414,18 @@
"node": ">=8"
}
},
"node_modules/undici": {
"version": "5.28.5",
"resolved": "https://registry.npmjs.org/undici/-/undici-5.28.5.tgz",
"integrity": "sha512-zICwjrDrcrUE0pyyJc1I2QzBkLM8FINsgOrt6WjA+BgajVq9Nxu2PbFFXUrAggLfDXlZGZBVZYw7WNV5KiBiBA==",
"license": "MIT",
"dependencies": {
"@fastify/busboy": "^2.0.0"
},
"engines": {
"node": ">=14.0"
}
},
"node_modules/universal-user-agent": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz",
@@ -550,24 +447,11 @@
"node": ">= 8"
}
},
"node_modules/webidl-conversions": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
"integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="
},
"node_modules/whatwg-url": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
"integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
"dependencies": {
"tr46": "~0.0.3",
"webidl-conversions": "^3.0.0"
}
},
"node_modules/wrappy": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
"integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
"integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
"license": "ISC"
}
}
}
@@ -11,7 +11,7 @@
},
"dependencies": {
"@actions/core": "^1.10.1",
"@actions/github": "^5.1.1",
"@actions/github": "^6.0.0",
"@octokit/auth-action": "^4.0.1",
"@octokit/rest": "^20.0.2",
"hasha": "^5.2.0",
+6
View File
@@ -27,6 +27,12 @@ on:
- '.github/workflows/ci-build.yml'
workflow_dispatch:
concurrency:
# only 1 concurrent `ci-build` allowed per branch
# https://docs.github.com/en/actions/writing-workflows/workflow-syntax-for-github-actions#example-using-concurrency-and-the-default-behavior
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs:
build:
strategy:
@@ -0,0 +1,57 @@
name: ci-check-ns-api-version
on:
pull_request:
paths:
- "nym-node-status-api/**"
env:
WORKING_DIRECTORY: "nym-node-status-api/nym-node-status-api"
jobs:
check-if-tag-exists:
runs-on: arc-ubuntu-22.04-dind
steps:
- name: Checkout repo
uses: actions/checkout@v4
- name: Get version from cargo.toml
uses: mikefarah/yq@v4.45.1
id: get_version
with:
cmd: yq -oy '.package.version' ${{ env.WORKING_DIRECTORY }}/Cargo.toml
- name: Check if git tag exists
run: |
TAG=${{ env.WORKING_DIRECTORY }}-${{ steps.get_version.outputs.result }}
if [[ -z "$TAG" ]]; then
echo "Tag is empty"
exit 1
fi
git ls-remote --tags origin | awk '{print $2}'
if git ls-remote --tags origin | awk '{print $2}' | grep -q "refs/tags/$TAG$" ; then
echo "Tag '$TAG' ALREADY EXISTS on the remote"
exit 1
else
echo "Tag '$TAG' does not exist on the remote"
fi
- name: Check if harbor tag exists
run: |
TAG=${{ steps.get_version.outputs.result }}
registry=https://harbor.nymte.ch
repo_name=nym/node-status-api
if [[ -z $TAG ]]; then
echo "Tag is empty"
exit 1
fi
curl -su ${{ secrets.HARBOR_ROBOT_USERNAME }}:${{ secrets.HARBOR_ROBOT_SECRET }} "$registry/v2/$repo_name/tags/list" | jq
exists=$(curl -su ${{ secrets.HARBOR_ROBOT_USERNAME }}:${{ secrets.HARBOR_ROBOT_SECRET }} "$registry/v2/$repo_name/tags/list" | jq --arg tag $TAG '.tags | contains([$tag])' )
if [[ $exists = "true" ]]; then
echo "Version '$TAG' defined in Cargo.toml ALREADY EXISTS as tag in harbor repo"
exit 1
elif [[ $exists = "false" ]]; then
echo "Version '$TAG' doesn't exist on the remote"
else
echo "Unknown output '$exists'"
exit 1
fi
+2
View File
@@ -11,6 +11,8 @@ on:
jobs:
build:
runs-on: arc-ubuntu-20.04
env:
RUSTUP_PERMIT_COPY_RENAME: 1
defaults:
run:
working-directory: documentation/docs
+3 -1
View File
@@ -16,6 +16,8 @@ on:
jobs:
build:
runs-on: arc-ubuntu-20.04
env:
RUSTUP_PERMIT_COPY_RENAME: 1
steps:
- uses: actions/checkout@v4
- uses: rlespinasse/github-slug-action@v3.x
@@ -42,7 +44,7 @@ jobs:
- name: Set up Go
uses: actions/setup-go@v5
with:
go-version: '1.20'
go-version: "1.23.7"
- name: Install
run: yarn
+1
View File
@@ -14,6 +14,7 @@ jobs:
runs-on: arc-ubuntu-20.04
env:
CARGO_TERM_COLOR: always
RUSTUP_PERMIT_COPY_RENAME: 1
steps:
- name: Install Dependencies (Linux)
run: sudo apt-get update && sudo apt-get -y install libwebkit2gtk-4.0-dev build-essential curl wget libssl-dev libgtk-3-dev squashfs-tools
+2 -1
View File
@@ -14,6 +14,7 @@ jobs:
runs-on: arc-ubuntu-20.04
env:
CARGO_TERM_COLOR: always
RUSTUP_PERMIT_COPY_RENAME: 1
steps:
- uses: actions/checkout@v4
@@ -32,7 +33,7 @@ jobs:
- name: Set up Go
uses: actions/setup-go@v5
with:
go-version: '1.20'
go-version: "1.23.7"
- name: Install wasm-pack
run: curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | sh
@@ -49,7 +49,7 @@ jobs:
"build-tools;$SDK_BUILDTOOLS_VERSION"
- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@1.90.0
uses: dtolnay/rust-toolchain@1.100.0
- name: Install rust android targets
run: |
+1 -6
View File
@@ -31,12 +31,7 @@ jobs:
- name: Set up Go
uses: actions/setup-go@v5
with:
go-version: "1.20"
- name: Install TinyGo
uses: acifani/setup-tinygo@v2
with:
tinygo-version: "0.27.0"
go-version: "1.23.7"
- name: Install dependencies
run: yarn
+108 -10
View File
@@ -4,6 +4,104 @@ Post 1.0.0 release, the changelog format is based on [Keep a Changelog](https://
## [Unreleased]
## [2025.5-chokito] (2025-03-18)
- build(deps): bump braces from 3.0.2 to 3.0.3 in /sdk/typescript/packages/nodejs-client ([#5611])
- build(deps-dev): bump webpack-dev-middleware from 5.3.3 to 5.3.4 in /wasm/client/internal-dev ([#5610])
- Export lane queue lengths in sdk ([#5609])
- Chore/more payment watcher debug endpoints ([#5608])
- build(deps): bump @babel/helpers from 7.24.4 to 7.26.10 ([#5606])
- Chore/update bls12 381 fork ([#5605])
- chore: change auth v2 timestamp skew and allow values from the future ([#5604])
- Chore/payment watcher debug endpoints ([#5601])
- Allow resetting all SURB sender tags ([#5600])
- introduce internal tool for checking signer status ([#5598])
- build(deps-dev): bump webpack from 5.77.0 to 5.98.0 in /wasm/mix-fetch/internal-dev ([#5597])
- build(deps): bump body-parser and express in /wasm/mix-fetch/internal-dev ([#5596])
- build(deps): bump serve-static and express in /wasm/mix-fetch/internal-dev ([#5594])
- build(deps-dev): bump ws from 8.13.0 to 8.18.1 in /wasm/mix-fetch/internal-dev ([#5593])
- build(deps): bump cookie and express in /wasm/client/internal-dev ([#5592])
- build(deps): bump cookie and express in /wasm/mix-fetch/internal-dev ([#5591])
- build(deps): bump braces from 3.0.2 to 3.0.3 in /wasm/zknym-lib/internal-dev ([#5590])
- build(deps): bump webpack-dev-middleware from 5.3.3 to 5.3.4 in /wasm/zknym-lib/internal-dev ([#5589])
- build(deps): bump tempfile from 3.17.1 to 3.18.0 ([#5588])
- build(deps): bump tokio from 1.43.0 to 1.44.0 ([#5587])
- build(deps): bump the patch-updates group with 8 updates ([#5585])
- build(deps): bump ring from 0.17.9 to 0.17.13 ([#5583])
- delete double memo field in send modal ([#5578])
- Server Side internal DoT/DoH opt out ([#5577])
- Rust SDK SURB example: change hardcoded file to tempdir ([#5576])
- Add /v3/nym-nodes ([#5569])
- chore: start sending v2 sphinx packets ([#5554])
- build(deps): bump the patch-updates group across 1 directory with 14 updates ([#5549])
- build(deps): bump uuid from 1.13.2 to 1.15.1 ([#5542])
- build(deps): bump rs_merkle from 1.4.2 to 1.5.0 ([#5541])
- feature: v2 authentication request ([#5537])
- Set RUSTUP_PERMIT_COPY_RENAME ([#5533])
- feature: disallow routing mix packets to nodes not present in the topology ([#5526])
- Make "Memo" visible per default on send NYM ([#5524])
- feat: make sure any terminated task kills the watcher and write run info to db ([#5517])
- Another total_stake SQL fix ([#5516])
- Fix total_stake on SQL update ([#5514])
- build(deps): bump flate2 from 1.0.35 to 1.1.0 ([#5510])
- build(deps): bump itertools from 0.13.0 to 0.14.0 ([#5509])
- build(deps): bump the patch-updates group with 2 updates ([#5505])
- Treat gateways as Nym Nodes ([#5504])
- Update version in Cargo.toml ([#5503])
- feat: use ct_eq for checking bearer token ([#5501])
- Add extra args for the probe ([#5499])
- Fix stats bug & remove HM caching ([#5495])
- fix: Cargo.lock for contracts ([#5489])
- Display error messages if IPv4 or IPv6 address not found on nymtun0 ([#5465])
[#5611]: https://github.com/nymtech/nym/pull/5611
[#5610]: https://github.com/nymtech/nym/pull/5610
[#5609]: https://github.com/nymtech/nym/pull/5609
[#5608]: https://github.com/nymtech/nym/pull/5608
[#5606]: https://github.com/nymtech/nym/pull/5606
[#5605]: https://github.com/nymtech/nym/pull/5605
[#5604]: https://github.com/nymtech/nym/pull/5604
[#5601]: https://github.com/nymtech/nym/pull/5601
[#5600]: https://github.com/nymtech/nym/pull/5600
[#5598]: https://github.com/nymtech/nym/pull/5598
[#5597]: https://github.com/nymtech/nym/pull/5597
[#5596]: https://github.com/nymtech/nym/pull/5596
[#5594]: https://github.com/nymtech/nym/pull/5594
[#5593]: https://github.com/nymtech/nym/pull/5593
[#5592]: https://github.com/nymtech/nym/pull/5592
[#5591]: https://github.com/nymtech/nym/pull/5591
[#5590]: https://github.com/nymtech/nym/pull/5590
[#5589]: https://github.com/nymtech/nym/pull/5589
[#5588]: https://github.com/nymtech/nym/pull/5588
[#5587]: https://github.com/nymtech/nym/pull/5587
[#5585]: https://github.com/nymtech/nym/pull/5585
[#5583]: https://github.com/nymtech/nym/pull/5583
[#5578]: https://github.com/nymtech/nym/pull/5578
[#5577]: https://github.com/nymtech/nym/pull/5577
[#5576]: https://github.com/nymtech/nym/pull/5576
[#5569]: https://github.com/nymtech/nym/pull/5569
[#5554]: https://github.com/nymtech/nym/pull/5554
[#5549]: https://github.com/nymtech/nym/pull/5549
[#5542]: https://github.com/nymtech/nym/pull/5542
[#5541]: https://github.com/nymtech/nym/pull/5541
[#5537]: https://github.com/nymtech/nym/pull/5537
[#5533]: https://github.com/nymtech/nym/pull/5533
[#5526]: https://github.com/nymtech/nym/pull/5526
[#5524]: https://github.com/nymtech/nym/pull/5524
[#5517]: https://github.com/nymtech/nym/pull/5517
[#5516]: https://github.com/nymtech/nym/pull/5516
[#5514]: https://github.com/nymtech/nym/pull/5514
[#5510]: https://github.com/nymtech/nym/pull/5510
[#5509]: https://github.com/nymtech/nym/pull/5509
[#5505]: https://github.com/nymtech/nym/pull/5505
[#5504]: https://github.com/nymtech/nym/pull/5504
[#5503]: https://github.com/nymtech/nym/pull/5503
[#5501]: https://github.com/nymtech/nym/pull/5501
[#5499]: https://github.com/nymtech/nym/pull/5499
[#5495]: https://github.com/nymtech/nym/pull/5495
[#5489]: https://github.com/nymtech/nym/pull/5489
[#5465]: https://github.com/nymtech/nym/pull/5465
## [2025.4-dorina-patched] (2025-03-06)
- use legacy crypto for constructing SURB headers ([#5579])
@@ -160,7 +258,7 @@ Post 1.0.0 release, the changelog format is based on [Keep a Changelog](https://
- Downgrade harmless log message from info to debug ([#5403])
- Redirect from mixnode page to nodes page ([#5397])
- chore :update version of chain watcher and validator rewarder ([#5394])
- bugfix: correctly handle ingore epoch roles flag ([#5390])
- bugfix: correctly handle ignore epoch roles flag ([#5390])
- bugfix: terminate mixnet socket listener on shutdown ([#5389])
- feat: make client ignore dual mode nodes by default ([#5388])
- Handle ecash network errors differently ([#5378])
@@ -181,7 +279,7 @@ Post 1.0.0 release, the changelog format is based on [Keep a Changelog](https://
- Use expect in geodata test to give error message on failure ([#5314])
- feature: periodically remove stale gateway messages ([#5312])
- build(deps): bump the patch-updates group across 1 directory with 35 updates ([#5310])
- Add dependabot assignes for the root cargo ecosystem ([#5297])
- Add dependabot assigns for the root cargo ecosystem ([#5297])
- Move tun constants to network defaults ([#5286])
- Include IPINFO_API_TOKEN in nightly CI ([#5285])
- Nyx Chain Watcher ([#5274])
@@ -234,7 +332,7 @@ Post 1.0.0 release, the changelog format is based on [Keep a Changelog](https://
## [2025.1-reeses] (2025-01-15)
- Feture/legacy alert ([#5346])
- Feature, Future/legacy alert ([#5346])
- chore: readjusted --mode behaviour to fix the regression ([#5331])
- chore: apply 1.84 linter suggestions ([#5330])
- bugfix: make sure refresh data key matches bond info ([#5329])
@@ -314,7 +412,7 @@ Post 1.0.0 release, the changelog format is based on [Keep a Changelog](https://
## [2024.14-crunch-patched] (2024-12-17)
- Fixes an issue to allow previously registred clients to connect to latest nym-nodes
- Fixes an issue to allow previously registered clients to connect to latest nym-nodes
- Fixes compatibility issues between nym-nodes and older clients
## [2024.14-crunch] (2024-12-11)
@@ -322,7 +420,7 @@ Post 1.0.0 release, the changelog format is based on [Keep a Changelog](https://
- Merge/release/2024.14-crunch ([#5242])
- bugfix: added explicit openapi servers to account for route prefixes ([#5237])
- Further config score adjustments ([#5225])
- feature: remve any filtering on node semver ([#5224])
- feature: remove any filtering on node semver ([#5224])
- Backport #5218 ([#5220])
- Derive serialize for UserAgent (#5210) ([#5217])
- dont consider legacy nodes for rewarded set selection ([#5215])
@@ -501,7 +599,7 @@ Post 1.0.0 release, the changelog format is based on [Keep a Changelog](https://
- bugfix/feature: added NymApiClient method to get all skimmed nodes ([#5062])
- Merge1/release/2024.13 magura ([#5061])
- added hacky routes to return nymnodes alongside legacy nodes ([#5051])
- bugfix: mark migrated gateways as rewarded in the previous epoch in case theyre in the rewarded set ([#5049])
- bugfix: mark migrated gateways as rewarded in the previous epoch in case they're, their, there in the rewarded set ([#5049])
- bugfix: adjust runtime storage migration ([#5047])
- bugfix: supersede 'cb13be27f8f61d9ae74d924e85d2e6787895eb14' by using… ([#5046])
- bugfix: restore default http port for nym-api ([#5045])
@@ -562,7 +660,7 @@ Post 1.0.0 release, the changelog format is based on [Keep a Changelog](https://
- Fix broken build after merge ([#4937])
- bugfix: correctly paginate through 'search_tx' endpoint ([#4936])
- Add more conversions for responses of authenticator messages ([#4929])
- Directory Sevices v2.1 ([#4903])
- Directory Services, Devices v2.1 ([#4903])
- Migrate Legacy Node (Frontend) ([#4826])
- Fix critical issues SI84 and SI85 from Cure53 ([#4758])
@@ -946,7 +1044,7 @@ Post 1.0.0 release, the changelog format is based on [Keep a Changelog](https://
- Remove stale peers ([#4640])
- Add generic wg private network routing ([#4636])
- Feature/new node endpoints ([#4635])
- standarised ContractBuildInformation and added it to all contracts ([#4631])
- standardised ContractBuildInformation and added it to all contracts ([#4631])
- validate nym-node public ips on startup ([#4630])
- Bump defguard wg ([#4625])
- Fix cargo warnings ([#4624])
@@ -1567,7 +1665,7 @@ Post 1.0.0 release, the changelog format is based on [Keep a Changelog](https://
- clean-up nym-api startup arguments/flags to use clap 3 and its macro-derived arguments ([#2772])
- renamed all references to validator_api to nym_api
- renamed all references to nymd to nyxd ([#2696])
- all-binaries: standarised argument names (note: old names should still be accepted) ([#2762]
- all-binaries: standardised argument names (note: old names should still be accepted) ([#2762]
### Fixed
@@ -2072,7 +2170,7 @@ The release also include some additional work for distributed key generation in
- Explorer UI tests missing data-testid [\#903](https://github.com/nymtech/nym/pull/903) ([tommyv1987](https://github.com/tommyv1987))
- Fix up Nym-Wallet README.md [\#899](https://github.com/nymtech/nym/pull/899) ([tommyv1987](https://github.com/tommyv1987))
- Feature/batch delegator rewarding [\#898](https://github.com/nymtech/nym/pull/898) ([jstuczyn](https://github.com/jstuczyn))
- Bug mapp nodemap [\#897](https://github.com/nymtech/nym/pull/897) ([Aid19801](https://github.com/Aid19801))
- Bug map nodemap [\#897](https://github.com/nymtech/nym/pull/897) ([Aid19801](https://github.com/Aid19801))
- Bug fix/macos keyboard shortcuts [\#896](https://github.com/nymtech/nym/pull/896) ([fmtabbara](https://github.com/fmtabbara))
- Add a Mobile Nav to the Network Explorer [\#895](https://github.com/nymtech/nym/pull/895) ([Aid19801](https://github.com/Aid19801))
- Only use ts-rs in tests [\#894](https://github.com/nymtech/nym/pull/894) ([durch](https://github.com/durch))
Generated
+134 -594
View File
File diff suppressed because it is too large Load Diff
+13 -14
View File
@@ -98,9 +98,9 @@ members = [
"common/wireguard",
"common/wireguard-types",
"documentation/autodoc",
"explorer-api",
"explorer-api/explorer-api-requests",
"explorer-api/explorer-client",
# "explorer-api",
# "explorer-api/explorer-api-requests",
# "explorer-api/explorer-client",
"gateway",
"integrations/bity",
"nym-api",
@@ -153,7 +153,6 @@ members = [
default-members = [
"clients/native",
"clients/socks5",
"explorer-api",
"nym-api",
"nym-credential-proxy/nym-credential-proxy",
"nym-node",
@@ -194,7 +193,7 @@ ammonia = "4"
anyhow = "1.0.97"
arc-swap = "1.7.1"
argon2 = "0.5.0"
async-trait = "0.1.87"
async-trait = "0.1.88"
axum = "0.7.5"
axum-client-ip = "0.6.1"
axum-extra = "0.9.4"
@@ -211,13 +210,13 @@ bs58 = "0.5.1"
bytecodec = "0.4.15"
bytes = "1.10.1"
cargo_metadata = "0.18.1"
celes = "2.5.0"
celes = "2.6.0"
cfg-if = "1.0.0"
chacha20 = "0.9.0"
chacha20poly1305 = "0.10.1"
chrono = "0.4.40"
cipher = "0.4.3"
clap = "4.5.31"
clap = "4.5.32"
clap_complete = "4.5"
clap_complete_fig = "4.5"
colored = "2.2"
@@ -242,7 +241,7 @@ dotenvy = "0.15.6"
ecdsa = "0.16"
ed25519-dalek = "2.1"
encoding_rs = "0.8.35"
env_logger = "0.11.6"
env_logger = "0.11.7"
envy = "0.4"
etherparse = "0.13.0"
eyre = "0.6.9"
@@ -264,7 +263,7 @@ http = "1"
http-body-util = "0.1"
httpcodec = "0.2.3"
human-repr = "1.1.0"
humantime = "2.1.0"
humantime = "2.2.0"
humantime-serde = "1.1.1"
hyper = "1.6.0"
hyper-util = "0.1"
@@ -285,7 +284,7 @@ moka = { version = "0.12", features = ["future"] }
nix = "0.27.1"
notify = "5.1.0"
okapi = "0.7.0"
once_cell = "1.20.3"
once_cell = "1.21.1"
opentelemetry = "0.19.0"
opentelemetry-jaeger = "0.18.0"
parking_lot = "0.12.3"
@@ -331,7 +330,7 @@ syn = "1"
sysinfo = "0.33.0"
tap = "1.0.1"
tar = "0.4.44"
tempfile = "3.18"
tempfile = "3.19"
thiserror = "2.0"
time = "0.3.39"
tokio = "1.44"
@@ -340,7 +339,7 @@ tokio-stream = "0.1.17"
tokio-test = "0.4.4"
tokio-tun = "0.11.5"
tokio-tungstenite = { version = "0.20.1" }
tokio-util = "0.7.13"
tokio-util = "0.7.14"
toml = "0.8.20"
tower = "0.5.2"
tower-http = "0.5.2"
@@ -362,7 +361,7 @@ vergen = { version = "=8.3.1", default-features = false }
walkdir = "2"
wasm-bindgen-test = "0.3.49"
x25519-dalek = "2.0.0"
zeroize = "1.6.0"
zeroize = "1.8.1"
prometheus = { version = "0.13.0" }
@@ -403,7 +402,7 @@ prost = { version = "0.13", default-features = false }
gloo-utils = "0.2.0"
gloo-net = "0.6.0"
indexed_db_futures = "0.6.0"
indexed_db_futures = "0.6.1"
js-sys = "0.3.76"
serde-wasm-bindgen = "0.6.5"
tsify = "0.4.5"
+10
View File
@@ -67,3 +67,13 @@ As a general approach, licensing is as follows this pattern:
- documentation is Apache 2.0 or CC0-1.0
Nym Node Operators and Validators Terms and Conditions can be found [here](https://nym.com/operators-validators-terms).
## Getting Started
```bash
yarn install
```
```bash
yarn build
```
@@ -139,8 +139,6 @@ where
let gateway_setup = GatewaySetup::New {
specification: selection_spec,
available_gateways,
#[cfg(unix)]
connection_fd_callback: None,
};
let init_details =
@@ -187,8 +187,6 @@ where
let gateway_setup = GatewaySetup::New {
specification: selection_spec,
available_gateways,
#[cfg(unix)]
connection_fd_callback: None,
};
let init_details =
@@ -28,6 +28,7 @@ pub enum InputMessage {
recipient: Recipient,
data: Vec<u8>,
lane: TransmissionLane,
max_retransmissions: Option<u32>,
},
/// Creates a message used for a duplex anonymous communication where the recipient
@@ -43,6 +44,7 @@ pub enum InputMessage {
data: Vec<u8>,
reply_surbs: u32,
lane: TransmissionLane,
max_retransmissions: Option<u32>,
},
/// Attempt to use our internally received and stored `ReplySurb` to send the message back
@@ -53,6 +55,7 @@ pub enum InputMessage {
recipient_tag: AnonymousSenderTag,
data: Vec<u8>,
lane: TransmissionLane,
max_retransmissions: Option<u32>,
},
MessageWrapper {
@@ -92,6 +95,7 @@ impl InputMessage {
recipient,
data,
lane,
max_retransmissions: None,
};
if let Some(packet_type) = packet_type {
InputMessage::new_wrapper(message, packet_type)
@@ -112,28 +116,7 @@ impl InputMessage {
data,
reply_surbs,
lane,
};
if let Some(packet_type) = packet_type {
InputMessage::new_wrapper(message, packet_type)
} else {
message
}
}
// IMHO `new_anonymous` should take `mix_hops: Option<u8>` as an argument instead of creating
// this function, but that would potentially break backwards compatibility with the current API
pub fn new_anonymous_with_custom_hops(
recipient: Recipient,
data: Vec<u8>,
reply_surbs: u32,
lane: TransmissionLane,
packet_type: Option<PacketType>,
) -> Self {
let message = InputMessage::Anonymous {
recipient,
data,
reply_surbs,
lane,
max_retransmissions: None,
};
if let Some(packet_type) = packet_type {
InputMessage::new_wrapper(message, packet_type)
@@ -152,6 +135,7 @@ impl InputMessage {
recipient_tag,
data,
lane,
max_retransmissions: None,
};
if let Some(packet_type) = packet_type {
InputMessage::new_wrapper(message, packet_type)
@@ -169,4 +153,34 @@ impl InputMessage {
InputMessage::MessageWrapper { message, .. } => message.lane(),
}
}
pub fn set_max_retransmissions(&mut self, max_retransmissions: u32) -> &mut Self {
match self {
InputMessage::Regular {
max_retransmissions: m,
..
}
| InputMessage::Anonymous {
max_retransmissions: m,
..
}
| InputMessage::Reply {
max_retransmissions: m,
..
} => {
*m = Some(max_retransmissions);
}
InputMessage::Premade { .. } => {}
InputMessage::MessageWrapper { message, .. } => {
message.set_max_retransmissions(max_retransmissions);
}
}
self
}
pub fn with_max_retransmissions(mut self, max_retransmissions: u32) -> Self {
self.set_max_retransmissions(max_retransmissions);
self
}
}
@@ -52,7 +52,7 @@ impl MixTrafficController {
let (message_sender, message_receiver) =
tokio::sync::mpsc::channel(MIX_MESSAGE_RECEIVER_BUFFER_SIZE);
let (client_sender, client_receiver) = tokio::sync::mpsc::channel(1);
let (client_sender, client_receiver) = tokio::sync::mpsc::channel(8);
(
MixTrafficController {
@@ -77,7 +77,7 @@ impl MixTrafficController {
) {
let (message_sender, message_receiver) =
tokio::sync::mpsc::channel(MIX_MESSAGE_RECEIVER_BUFFER_SIZE);
let (client_sender, client_receiver) = tokio::sync::mpsc::channel(1);
let (client_sender, client_receiver) = tokio::sync::mpsc::channel(8);
(
MixTrafficController {
gateway_transceiver,
@@ -222,9 +222,6 @@ impl ActionController {
// note: when the entry expires it's automatically removed from pending_acks_timers
fn handle_expired_ack_timer(&mut self, expired_ack: Expired<FragmentIdentifier>) {
// I'm honestly not sure how to handle it, because getting it means other things in our
// system are already misbehaving. If we ever see this panic, then I guess we should worry
// about it. Perhaps just reschedule it at later point?
let frag_id = expired_ack.into_inner();
trace!("{frag_id} has expired");
@@ -65,11 +65,12 @@ where
recipient_tag: AnonymousSenderTag,
data: Vec<u8>,
lane: TransmissionLane,
max_retransmissions: Option<u32>,
) {
// offload reply handling to the dedicated task
if let Err(err) = self
.reply_controller_sender
.send_reply(recipient_tag, data, lane)
if let Err(err) =
self.reply_controller_sender
.send_reply(recipient_tag, data, lane, max_retransmissions)
{
if !self.task_client.is_shutdown_poll() {
error!("failed to send a reply - {err}");
@@ -83,10 +84,11 @@ where
content: Vec<u8>,
lane: TransmissionLane,
packet_type: PacketType,
max_retransmissions: Option<u32>,
) {
if let Err(err) = self
.message_handler
.try_send_plain_message(recipient, content, lane, packet_type)
.try_send_plain_message(recipient, content, lane, packet_type, max_retransmissions)
.await
{
warn!("failed to send a plain message - {err}")
@@ -100,10 +102,18 @@ where
reply_surbs: u32,
lane: TransmissionLane,
packet_type: PacketType,
max_retransmissions: Option<u32>,
) {
if let Err(err) = self
.message_handler
.try_send_message_with_reply_surbs(recipient, content, reply_surbs, lane, packet_type)
.try_send_message_with_reply_surbs(
recipient,
content,
reply_surbs,
lane,
packet_type,
max_retransmissions,
)
.await
{
warn!("failed to send a repliable message - {err}")
@@ -116,25 +126,42 @@ where
recipient,
data,
lane,
max_retransmissions,
} => {
self.handle_plain_message(recipient, data, lane, PacketType::Mix)
.await
self.handle_plain_message(
recipient,
data,
lane,
PacketType::Mix,
max_retransmissions,
)
.await
}
InputMessage::Anonymous {
recipient,
data,
reply_surbs,
lane,
max_retransmissions,
} => {
self.handle_repliable_message(recipient, data, reply_surbs, lane, PacketType::Mix)
.await
self.handle_repliable_message(
recipient,
data,
reply_surbs,
lane,
PacketType::Mix,
max_retransmissions,
)
.await
}
InputMessage::Reply {
recipient_tag,
data,
lane,
max_retransmissions,
} => {
self.handle_reply(recipient_tag, data, lane).await;
self.handle_reply(recipient_tag, data, lane, max_retransmissions)
.await;
}
InputMessage::Premade { msgs, lane } => self.handle_premade_packets(msgs, lane).await,
InputMessage::MessageWrapper {
@@ -145,25 +172,42 @@ where
recipient,
data,
lane,
max_retransmissions,
} => {
self.handle_plain_message(recipient, data, lane, packet_type)
.await
self.handle_plain_message(
recipient,
data,
lane,
packet_type,
max_retransmissions,
)
.await
}
InputMessage::Anonymous {
recipient,
data,
reply_surbs,
lane,
max_retransmissions,
} => {
self.handle_repliable_message(recipient, data, reply_surbs, lane, packet_type)
.await
self.handle_repliable_message(
recipient,
data,
reply_surbs,
lane,
packet_type,
max_retransmissions,
)
.await
}
InputMessage::Reply {
recipient_tag,
data,
lane,
max_retransmissions,
} => {
self.handle_reply(recipient_tag, data, lane).await;
self.handle_reply(recipient_tag, data, lane, max_retransmissions)
.await;
}
InputMessage::Premade { msgs, lane } => {
self.handle_premade_packets(msgs, lane).await
@@ -72,6 +72,7 @@ pub struct PendingAcknowledgement {
delay: SphinxDelay,
destination: PacketDestination,
retransmissions: u32,
max_retransmissions: Option<u32>,
}
impl PendingAcknowledgement {
@@ -80,12 +81,14 @@ impl PendingAcknowledgement {
message_chunk: Fragment,
delay: SphinxDelay,
recipient: Recipient,
max_retransmissions: Option<u32>,
) -> Self {
PendingAcknowledgement {
message_chunk,
delay,
destination: PacketDestination::KnownRecipient(recipient.into()),
retransmissions: 0,
max_retransmissions,
}
}
@@ -94,6 +97,7 @@ impl PendingAcknowledgement {
delay: SphinxDelay,
recipient_tag: AnonymousSenderTag,
extra_surb_request: bool,
max_retransmissions: Option<u32>,
) -> Self {
PendingAcknowledgement {
message_chunk,
@@ -103,6 +107,7 @@ impl PendingAcknowledgement {
extra_surb_request,
},
retransmissions: 0,
max_retransmissions,
}
}
@@ -118,6 +123,18 @@ impl PendingAcknowledgement {
self.delay = new_delay;
self.retransmissions += 1;
}
pub(crate) fn reached_max_retransmissions(
&self,
global_max_retransmissions: Option<u32>,
) -> bool {
let reached_local_max = self
.max_retransmissions
.is_some_and(|limit| self.retransmissions >= limit);
let reached_global_max =
global_max_retransmissions.is_some_and(|limit| self.retransmissions >= limit);
reached_local_max || reached_global_max
}
}
/// AcknowledgementControllerConnectors represents set of channels for communication with
@@ -79,17 +79,15 @@ where
let frag_id = timed_out_ack.message_chunk.fragment_identifier();
if let Some(limit) = self.maximum_retransmissions {
if timed_out_ack.retransmissions >= limit {
warn!("reached maximum number of allowed retransmissions for the packet");
if let Err(err) = self
.action_sender
.unbounded_send(Action::new_remove(frag_id))
{
error!("Failed to send remove action to the controller: {err}");
}
return;
if timed_out_ack.reached_max_retransmissions(self.maximum_retransmissions) {
debug!("reached maximum number of allowed retransmissions for the packet");
if let Err(err) = self
.action_sender
.unbounded_send(Action::new_remove(frag_id))
{
error!("Failed to send remove action to the controller: {err}");
}
return;
}
let maybe_prepared_fragment = match &timed_out_ack.destination {
@@ -6,6 +6,7 @@ use crate::client::real_messages_control::real_traffic_stream::{
BatchRealMessageSender, RealMessage,
};
use crate::client::real_messages_control::{AckActionSender, Action};
use crate::client::replies::reply_controller::MaxRetransmissions;
use crate::client::replies::reply_storage::{ReceivedReplySurbsMap, SentReplyKeys, UsedSenderTags};
use crate::client::topology_control::{TopologyAccessor, TopologyReadPermit};
use log::{debug, error, info, trace, warn};
@@ -142,6 +143,12 @@ impl Config {
}
}
#[derive(Clone)]
pub(crate) struct FragmentWithMaxRetransmissions {
pub(crate) fragment: Fragment,
pub(crate) max_retransmissions: MaxRetransmissions,
}
#[derive(Clone)]
pub(crate) struct MessageHandler<R> {
config: Config,
@@ -198,10 +205,10 @@ where
trace!("we already had sender tag for {recipient}");
existing
} else {
info!("creating new sender tag for {recipient}");
debug!("creating new sender tag for {recipient}");
let new_tag = AnonymousSenderTag::new_random(&mut self.rng);
self.tag_storage.insert_new(recipient, new_tag);
info!("we'll be using {new_tag} for all anonymous messages sent to {recipient}");
info!("using {new_tag} for all anonymous messages sent to {recipient}");
new_tag
}
}
@@ -294,8 +301,14 @@ where
Some(chunk.fragment_identifier()),
);
let delay = prepared_fragment.total_delay;
let pending_ack =
PendingAcknowledgement::new_anonymous(chunk, delay, target, is_extra_surb_request);
let max_retransmissions = None;
let pending_ack = PendingAcknowledgement::new_anonymous(
chunk,
delay,
target,
is_extra_surb_request,
max_retransmissions,
);
let lane = if is_extra_surb_request {
TransmissionLane::ReplySurbRequest
@@ -350,7 +363,7 @@ where
pub(crate) async fn try_send_reply_chunks_on_lane(
&mut self,
target: AnonymousSenderTag,
fragments: Vec<Fragment>,
fragments: Vec<FragmentWithMaxRetransmissions>,
reply_surbs: Vec<ReplySurb>,
lane: TransmissionLane,
) -> Result<(), SurbWrappedPreparationError> {
@@ -367,12 +380,12 @@ where
pub(crate) async fn try_send_reply_chunks(
&mut self,
target: AnonymousSenderTag,
fragments: Vec<(TransmissionLane, Fragment)>,
fragments: Vec<(TransmissionLane, FragmentWithMaxRetransmissions)>,
reply_surbs: Vec<ReplySurb>,
) -> Result<(), SurbWrappedPreparationError> {
let prepared_fragments = self
.prepare_reply_chunks_for_sending(
fragments.iter().map(|(_, f)| f.clone()).collect(),
fragments.iter().map(|(_, f)| f.fragment.clone()).collect(),
reply_surbs,
)
.await?;
@@ -382,12 +395,21 @@ where
for (raw, prepared) in fragments.into_iter().zip(prepared_fragments.into_iter()) {
let lane = raw.0;
let fragment = raw.1;
let FragmentWithMaxRetransmissions {
fragment,
max_retransmissions,
} = raw.1;
let real_message =
RealMessage::new(prepared.mix_packet, Some(prepared.fragment_identifier));
let delay = prepared.total_delay;
let pending_ack = PendingAcknowledgement::new_anonymous(fragment, delay, target, false);
let pending_ack = PendingAcknowledgement::new_anonymous(
fragment,
delay,
target,
false,
max_retransmissions,
);
let entry = to_forward.entry(lane).or_default();
entry.push(real_message);
@@ -416,10 +438,17 @@ where
message: Vec<u8>,
lane: TransmissionLane,
packet_type: PacketType,
max_retransmissions: Option<u32>,
) -> Result<(), PreparationError> {
let message = NymMessage::new_plain(message);
self.try_split_and_send_non_reply_message(message, recipient, lane, packet_type)
.await
self.try_split_and_send_non_reply_message(
message,
recipient,
lane,
packet_type,
max_retransmissions,
)
.await
}
pub(crate) async fn try_split_and_send_non_reply_message(
@@ -428,6 +457,7 @@ where
recipient: Recipient,
lane: TransmissionLane,
packet_type: PacketType,
max_retransmissions: Option<u32>,
) -> Result<(), PreparationError> {
debug!("Sending non-reply message with packet type {packet_type}");
// TODO: I really dislike existence of this assertion, it implies code has to be re-organised
@@ -467,7 +497,8 @@ where
Some(fragment.fragment_identifier()),
);
let delay = prepared_fragment.total_delay;
let pending_ack = PendingAcknowledgement::new_known(fragment, delay, recipient);
let pending_ack =
PendingAcknowledgement::new_known(fragment, delay, recipient, max_retransmissions);
real_messages.push(real_message);
pending_acks.push(pending_ack);
@@ -495,11 +526,15 @@ where
reply_surbs,
));
// When sending SURBs we want to retransmit
let max_retransmissions = None;
self.try_split_and_send_non_reply_message(
message,
recipient,
TransmissionLane::AdditionalReplySurbs,
packet_type,
max_retransmissions,
)
.await?;
@@ -516,6 +551,7 @@ where
num_reply_surbs: u32,
lane: TransmissionLane,
packet_type: PacketType,
max_retransmissions: Option<u32>,
) -> Result<(), SurbWrappedPreparationError> {
debug!("Sending message with reply SURBs with packet type {packet_type}");
let sender_tag = self.get_or_create_sender_tag(&recipient);
@@ -526,8 +562,14 @@ where
let message =
NymMessage::new_repliable(RepliableMessage::new_data(message, sender_tag, reply_surbs));
self.try_split_and_send_non_reply_message(message, recipient, lane, packet_type)
.await?;
self.try_split_and_send_non_reply_message(
message,
recipient,
lane,
packet_type,
max_retransmissions,
)
.await?;
log::trace!("storing {} reply keys", reply_keys.len());
self.reply_key_storage.insert_multiple(reply_keys);
@@ -153,7 +153,7 @@ impl RealMessagesController<OsRng> {
let rng = OsRng;
// create channels for inter-task communication
let (real_message_sender, real_message_receiver) = tokio::sync::mpsc::channel(1);
let (real_message_sender, real_message_receiver) = tokio::sync::mpsc::channel(8);
let (sent_notifier_tx, sent_notifier_rx) = mpsc::unbounded();
let (ack_action_tx, ack_action_rx) = mpsc::unbounded();
let ack_controller_connectors = AcknowledgementControllerConnectors::new(
@@ -23,6 +23,10 @@ use nym_statistics_common::clients::{packet_statistics::PacketStatisticsEvent, C
use nym_task::TaskClient;
use std::collections::HashSet;
use std::sync::Arc;
use std::time::{Duration, Instant};
// The interval at which we check for stale buffers
const STALE_BUFFER_CHECK_INTERVAL: Duration = Duration::from_secs(10);
// Buffer Requests to say "hey, send any reconstructed messages to this channel"
// or to say "hey, I'm going offline, don't send anything more to me. Just buffer them instead"
@@ -48,6 +52,9 @@ struct ReceivedMessagesBufferInner<R: MessageReceiver> {
recently_reconstructed: HashSet<i32>,
stats_tx: ClientStatsSender,
// Periodically check for stale buffers to clean up
last_stale_check: Instant,
}
impl<R: MessageReceiver> ReceivedMessagesBufferInner<R> {
@@ -96,9 +103,10 @@ impl<R: MessageReceiver> ReceivedMessagesBufferInner<R> {
}
None
}
_ => unreachable!(
"no other error kind should have been returned here! If so, it's a bug!"
),
_ => {
error!("unexpected error occurred during message reconstruction: {err}");
None
}
},
Ok(reconstruction_result) => match reconstruction_result {
Some((reconstructed_message, used_sets)) => {
@@ -144,6 +152,16 @@ impl<R: MessageReceiver> ReceivedMessagesBufferInner<R> {
self.recover_from_fragment(fragment_data, raw_fragment_size)
}
fn cleanup_stale_buffers(&mut self) {
let now = Instant::now();
if now - self.last_stale_check > STALE_BUFFER_CHECK_INTERVAL {
self.last_stale_check = now;
self.message_receiver
.reconstructor()
.cleanup_stale_buffers();
}
}
}
#[derive(Debug, Clone)]
@@ -172,6 +190,7 @@ impl<R: MessageReceiver> ReceivedMessagesBuffer<R> {
message_sender: None,
recently_reconstructed: HashSet::new(),
stats_tx,
last_stale_check: Instant::now(),
})),
reply_key_storage,
reply_controller_sender,
@@ -392,6 +411,11 @@ impl<R: MessageReceiver> ReceivedMessagesBuffer<R> {
}
}
// Cleanup stale buffers, if there are any fragments that simply never arrived.
// We do this here as part of handling new received fragments so that we can keep the event
// loop focused on processing new messages.
inner_guard.cleanup_stale_buffers();
drop(inner_guard);
if !completed_messages.is_empty() {
@@ -2,7 +2,9 @@
// SPDX-License-Identifier: Apache-2.0
use crate::client::real_messages_control::acknowledgement_control::PendingAcknowledgement;
use crate::client::real_messages_control::message_handler::{MessageHandler, PreparationError};
use crate::client::real_messages_control::message_handler::{
FragmentWithMaxRetransmissions, MessageHandler, PreparationError,
};
use crate::client::replies::reply_storage::CombinedReplyStorage;
use futures::channel::oneshot;
use futures::StreamExt;
@@ -10,7 +12,7 @@ use log::{debug, error, info, trace, warn};
use nym_sphinx::addressing::clients::Recipient;
use nym_sphinx::anonymous_replies::requests::AnonymousSenderTag;
use nym_sphinx::anonymous_replies::ReplySurb;
use nym_sphinx::chunking::fragment::{Fragment, FragmentIdentifier};
use nym_sphinx::chunking::fragment::FragmentIdentifier;
use nym_task::connections::{ConnectionId, TransmissionLane};
use nym_task::TaskClient;
use rand::{CryptoRng, Rng};
@@ -49,6 +51,8 @@ impl Config {
// - replies to "give additional surbs" requests
// - will reply to future heartbeats
pub type MaxRetransmissions = Option<u32>;
// TODO: this should be split into ingress and egress controllers
// because currently its trying to perform two distinct jobs
pub struct ReplyController<R> {
@@ -59,7 +63,8 @@ pub struct ReplyController<R> {
// of surbs required to send the message through
// expected_reliability: f32,
request_receiver: ReplyControllerReceiver,
pending_replies: HashMap<AnonymousSenderTag, TransmissionBuffer<Fragment>>,
pending_replies:
HashMap<AnonymousSenderTag, TransmissionBuffer<FragmentWithMaxRetransmissions>>,
/// Retransmission packets that have already timed out and are waiting for additional reply SURBs
/// so that they could be sent back to the network. Once we receive more SURBs, we should send them ASAP.
@@ -96,7 +101,7 @@ where
}
}
fn insert_pending_replies<I: IntoIterator<Item = Fragment>>(
fn insert_pending_replies<I: IntoIterator<Item = FragmentWithMaxRetransmissions>>(
&mut self,
recipient: &AnonymousSenderTag,
fragments: I,
@@ -112,7 +117,7 @@ where
fn re_insert_pending_replies(
&mut self,
recipient: &AnonymousSenderTag,
fragments: Vec<(TransmissionLane, Fragment)>,
fragments: Vec<(TransmissionLane, FragmentWithMaxRetransmissions)>,
) {
trace!("re-inserting pending replies for {recipient}");
// the buffer should ALWAYS exist at this point, if it doesn't, it's a bug...
@@ -205,6 +210,7 @@ where
recipient_tag: AnonymousSenderTag,
data: Vec<u8>,
lane: TransmissionLane,
max_retransmissions: Option<u32>,
) {
if !self
.full_reply_storage
@@ -242,7 +248,14 @@ where
.get_reply_surbs(&recipient_tag, max_to_send);
if let Some(reply_surbs) = surbs {
let to_send = fragments.drain(..max_to_send).collect::<Vec<_>>();
let to_send = fragments
.drain(..max_to_send)
.map(|f| FragmentWithMaxRetransmissions {
fragment: f,
max_retransmissions,
})
.collect::<Vec<_>>();
if let Err(err) = self
.message_handler
.try_send_reply_chunks_on_lane(
@@ -276,6 +289,13 @@ where
"buffering {no_fragments} fragments for {recipient_tag}",
no_fragments = fragments.len()
);
let fragments: Vec<_> = fragments
.into_iter()
.map(|fragment| FragmentWithMaxRetransmissions {
fragment,
max_retransmissions,
})
.collect();
self.insert_pending_replies(&recipient_tag, fragments, lane);
}
@@ -409,7 +429,7 @@ where
&mut self,
from: &AnonymousSenderTag,
amount: usize,
) -> Option<Vec<(TransmissionLane, Fragment)>> {
) -> Option<Vec<(TransmissionLane, FragmentWithMaxRetransmissions)>> {
// if possible, pop all pending replies, if not, pop only entries for which we'd have a reply surb
let total = self.pending_replies.get(from)?.total_size();
trace!("pending queue has {total} elements");
@@ -689,7 +709,11 @@ where
recipient,
message,
lane,
} => self.handle_send_reply(recipient, message, lane).await,
max_retransmissions,
} => {
self.handle_send_reply(recipient, message, lane, max_retransmissions)
.await
}
ReplyControllerMessage::AdditionalSurbs {
sender_tag,
reply_surbs,
@@ -66,12 +66,14 @@ impl ReplyControllerSender {
recipient: AnonymousSenderTag,
message: Vec<u8>,
lane: TransmissionLane,
max_retransmissions: Option<u32>,
) -> Result<(), ReplyControllerSenderError> {
self.0
.unbounded_send(ReplyControllerMessage::SendReply {
recipient,
message,
lane,
max_retransmissions,
})
.map_err(ReplyControllerSenderError::SendReply)
}
@@ -160,6 +162,7 @@ pub enum ReplyControllerMessage {
recipient: AnonymousSenderTag,
message: Vec<u8>,
lane: TransmissionLane,
max_retransmissions: Option<u32>,
},
AdditionalSurbs {
+2 -10
View File
@@ -11,8 +11,6 @@ use nym_topology::node::RoutingNode;
use nym_validator_client::client::IdentityKeyRef;
use nym_validator_client::UserAgent;
use rand::{seq::SliceRandom, Rng};
#[cfg(unix)]
use std::os::fd::RawFd;
use std::{sync::Arc, time::Duration};
use tungstenite::Message;
use url::Url;
@@ -315,15 +313,9 @@ pub(super) async fn register_with_gateway(
gateway_id: identity::PublicKey,
gateway_listener: Url,
our_identity: Arc<identity::KeyPair>,
#[cfg(unix)] connection_fd_callback: Option<Arc<dyn Fn(RawFd) + Send + Sync>>,
) -> Result<RegistrationResult, ClientCoreError> {
let mut gateway_client = GatewayClient::new_init(
gateway_listener,
gateway_id,
our_identity.clone(),
#[cfg(unix)]
connection_fd_callback,
);
let mut gateway_client =
GatewayClient::new_init(gateway_listener, gateway_id, our_identity.clone());
gateway_client.establish_connection().await.map_err(|err| {
log::warn!("Failed to establish connection with gateway!");
+4 -22
View File
@@ -23,8 +23,6 @@ use nym_topology::node::RoutingNode;
use rand::rngs::OsRng;
use rand::{CryptoRng, RngCore};
use serde::Serialize;
#[cfg(unix)]
use std::{os::fd::RawFd, sync::Arc};
pub mod helpers;
pub mod types;
@@ -55,7 +53,6 @@ async fn setup_new_gateway<K, D>(
details_store: &D,
selection_specification: GatewaySelectionSpecification,
available_gateways: Vec<RoutingNode>,
#[cfg(unix)] connection_fd_callback: Option<Arc<dyn Fn(RawFd) + Send + Sync>>,
) -> Result<InitialisationResult, ClientCoreError>
where
K: KeyStore,
@@ -111,14 +108,9 @@ where
// if we're using a 'normal' gateway setup, do register
let our_identity = client_keys.identity_keypair();
let registration = helpers::register_with_gateway(
gateway_id,
gateway_listener.clone(),
our_identity,
#[cfg(unix)]
connection_fd_callback,
)
.await?;
let registration =
helpers::register_with_gateway(gateway_id, gateway_listener.clone(), our_identity)
.await?;
(
GatewayDetails::new_remote(
gateway_id,
@@ -211,19 +203,9 @@ where
GatewaySetup::New {
specification,
available_gateways,
#[cfg(unix)]
connection_fd_callback,
} => {
log::debug!("GatewaySetup::New with spec: {specification:?}");
setup_new_gateway(
key_store,
details_store,
specification,
available_gateways,
#[cfg(unix)]
connection_fd_callback,
)
.await
setup_new_gateway(key_store, details_store, specification, available_gateways).await
}
GatewaySetup::ReuseConnection {
authenticated_ephemeral_client,
-10
View File
@@ -18,8 +18,6 @@ use nym_validator_client::client::IdentityKey;
use nym_validator_client::nyxd::AccountId;
use serde::Serialize;
use std::fmt::{Debug, Display};
#[cfg(unix)]
use std::os::fd::RawFd;
use std::sync::Arc;
use time::OffsetDateTime;
use url::Url;
@@ -210,10 +208,6 @@ pub enum GatewaySetup {
// TODO: seems to be a bit inefficient to pass them by value
available_gateways: Vec<RoutingNode>,
/// Callback useful for allowing initial connection to gateway
#[cfg(unix)]
connection_fd_callback: Option<Arc<dyn Fn(RawFd) + Send + Sync>>,
},
ReuseConnection {
@@ -237,8 +231,6 @@ impl Debug for GatewaySetup {
GatewaySetup::New {
specification,
available_gateways,
#[cfg(unix)]
connection_fd_callback: _,
} => f
.debug_struct("GatewaySetup::New")
.field("specification", specification)
@@ -278,8 +270,6 @@ impl GatewaySetup {
additional_data: None,
},
available_gateways: vec![],
#[cfg(unix)]
connection_fd_callback: None,
}
}
@@ -1065,7 +1065,6 @@ impl GatewayClient<InitOnly, EphemeralCredentialStorage> {
gateway_listener: Url,
gateway_identity: identity::PublicKey,
local_identity: Arc<identity::KeyPair>,
#[cfg(unix)] connection_fd_callback: Option<Arc<dyn Fn(RawFd) + Send + Sync>>,
) -> Self {
log::trace!("Initialising gateway client");
use futures::channel::mpsc;
@@ -1091,7 +1090,7 @@ impl GatewayClient<InitOnly, EphemeralCredentialStorage> {
stats_reporter: ClientStatsSender::new(None, task_client.clone()),
negotiated_protocol: None,
#[cfg(unix)]
connection_fd_callback,
connection_fd_callback: None,
task_client,
}
}
@@ -38,8 +38,7 @@ pub(crate) async fn connect_async(
// Do a DNS lookup for the domain using our custom DNS resolver
resolver
.resolve_str(domain)
.await
.inspect_err(|err| tracing::error!("Resolve error {err}"))?
.await?
.into_iter()
.map(|a| SocketAddr::new(a, port))
.collect()
@@ -50,27 +49,20 @@ pub(crate) async fn connect_async(
address: endpoint.to_owned(),
});
for sock_addr in sock_addrs {
tracing::info!("Trying with {sock_addr}");
let socket = if sock_addr.is_ipv4() {
TcpSocket::new_v4()
} else {
TcpSocket::new_v6()
}
.map_err(|err| {
tracing::error!("Couldn't create the socket");
GatewayClientError::NetworkConnectionFailed {
address: endpoint.to_owned(),
source: err.into(),
}
.map_err(|err| GatewayClientError::NetworkConnectionFailed {
address: endpoint.to_owned(),
source: err.into(),
})?;
tracing::info!("Preparing to call callback");
#[cfg(unix)]
if let Some(callback) = connection_fd_callback.as_ref() {
tracing::info!("Calling callback");
callback.as_ref()(socket.as_raw_fd());
}
tracing::info!("Preparing to connect");
match socket.connect(sock_addr).await {
Ok(s) => {
@@ -56,7 +56,7 @@ cw4 = { workspace = true }
cw-controllers = { workspace = true }
prost = { workspace = true, default-features = false }
flate2 = { workspace = true }
sha2 = { version = "0.9.5" }
sha2 = { workspace = true }
itertools = { workspace = true }
zeroize = { workspace = true, features = ["zeroize_derive"] }
cosmwasm-std = { workspace = true }
+151 -40
View File
@@ -23,14 +23,14 @@ const LENGTH_PREFIX_SIZE: usize = 2;
// long for the buffer to fill up, since this kills latency.
pub struct MultiIpPacketCodec {
buffer: BytesMut,
buffer_timeout: tokio::time::Interval,
pub counter: u64,
}
impl MultiIpPacketCodec {
pub fn new(buffer_timeout: Duration) -> Self {
pub fn new() -> Self {
MultiIpPacketCodec {
buffer: BytesMut::new(),
buffer_timeout: tokio::time::interval(buffer_timeout),
counter: 0,
}
}
@@ -40,56 +40,87 @@ impl MultiIpPacketCodec {
bundled_packets.extend_from_slice(&packet);
bundled_packets.freeze()
}
}
// Append a packet to the buffer and return the buffer if it's full
pub fn append_packet(&mut self, packet: Bytes) -> Option<Bytes> {
let mut bundled_packets = BytesMut::new();
self.encode(packet, &mut bundled_packets).unwrap();
if bundled_packets.is_empty() {
None
} else {
// log::info!("Sphinx packet utilization: {:.2}", self.buffer.len() as f64 / MAX_PACKET_SIZE as f64);
Some(bundled_packets.freeze())
impl Default for MultiIpPacketCodec {
fn default() -> Self {
Self::new()
}
}
/// The packet that we encode and decode with the MultiIpPacketCodec into bundled multi-ip packets.
/// The data here is the actual IP packet that we want to send, not the bundled packets.
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum IprPacket {
Data(Bytes),
Flush,
}
impl IprPacket {
pub fn as_bytes(&self) -> &[u8] {
match self {
IprPacket::Data(bytes) => bytes.as_ref(),
IprPacket::Flush => &[],
}
}
// Flush the current buffer and return it.
pub fn flush_current_buffer(&mut self) -> Bytes {
let mut output_buffer = BytesMut::new();
std::mem::swap(&mut output_buffer, &mut self.buffer);
output_buffer.freeze()
}
// Wait for the buffer_timeout to tick and then flush the buffer.
// This is useful when we want to send the buffer even if it's not full.
pub async fn buffer_timeout(&mut self) -> Option<Bytes> {
// Wait for buffer_timeout to tick
let _ = self.buffer_timeout.tick().await;
// Flush the buffer and return it
let packets = self.flush_current_buffer();
if packets.is_empty() {
None
} else {
Some(packets)
pub fn into_bytes(self) -> Bytes {
match self {
IprPacket::Data(bytes) => bytes,
IprPacket::Flush => Bytes::new(),
}
}
}
impl Encoder<Bytes> for MultiIpPacketCodec {
impl From<Bytes> for IprPacket {
fn from(bytes: Bytes) -> Self {
IprPacket::Data(bytes)
}
}
impl From<Vec<u8>> for IprPacket {
fn from(bytes: Vec<u8>) -> Self {
IprPacket::Data(Bytes::from(bytes))
}
}
impl Encoder<IprPacket> for MultiIpPacketCodec {
type Error = Error;
fn encode(&mut self, packet: Bytes, dst: &mut BytesMut) -> Result<(), Self::Error> {
if self.buffer.is_empty() {
self.buffer_timeout.reset();
}
fn encode(&mut self, packet: IprPacket, dst: &mut BytesMut) -> Result<(), Self::Error> {
let packet = match packet {
IprPacket::Flush => {
dst.extend_from_slice(&self.buffer);
self.counter += 1;
println!("Encoding packet: {}", self.counter);
self.buffer = BytesMut::new();
return Ok(());
}
IprPacket::Data(packet) => packet,
};
let packet_size = packet.len();
// If the existing buffer is empty, and the packet is too large, send it directly
if self.buffer.is_empty() && packet_size + LENGTH_PREFIX_SIZE > MAX_PACKET_SIZE {
// Add the packet size
dst.extend_from_slice(&(packet_size as u16).to_be_bytes());
// Add the packet to the buffer
dst.extend_from_slice(&packet);
self.counter += 1;
println!("Encoding packet: {}", self.counter);
return Ok(());
}
// If the packet doesn't fit in the existing buffer, send what we have now in the buffer
// and then add it to the next buffer
if self.buffer.len() + packet_size + LENGTH_PREFIX_SIZE > MAX_PACKET_SIZE {
// If the packet doesn't fit in the buffer, send the buffer and then add it to the buffer
// Send the existing buffer
dst.extend_from_slice(&self.buffer);
self.counter += 1;
println!("Encoding packet: {}", self.counter);
// Start a new buffer
self.buffer = BytesMut::new();
self.buffer_timeout.reset();
}
// Add the packet size
@@ -103,7 +134,7 @@ impl Encoder<Bytes> for MultiIpPacketCodec {
}
impl Decoder for MultiIpPacketCodec {
type Item = Bytes;
type Item = IprPacket;
type Error = Error;
fn decode(&mut self, src: &mut BytesMut) -> Result<Option<Self::Item>, Self::Error> {
@@ -125,6 +156,86 @@ impl Decoder for MultiIpPacketCodec {
// Read the packet
let packet = src.split_to(packet_size);
Ok(Some(packet.freeze()))
Ok(Some(IprPacket::Data(packet.freeze())))
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_multi_ip_packet_codec_max_packet_size() {
let mut codec = MultiIpPacketCodec::new();
let mut buffer = BytesMut::new();
// A packet size that is large enough that two packets won't fit in the buffer
const PACKET_SIZE: usize = MAX_PACKET_SIZE - 100;
let packet1 = IprPacket::from(Bytes::from_static(&[0u8; PACKET_SIZE]));
let packet2 = IprPacket::from(Bytes::from_static(&[0u8; PACKET_SIZE]));
codec.encode(packet1.clone(), &mut buffer).unwrap();
assert_eq!(buffer.len(), 0);
codec.encode(packet2.clone(), &mut buffer).unwrap();
assert_eq!(buffer.len(), LENGTH_PREFIX_SIZE + PACKET_SIZE);
// First is the length prefix
assert_eq!(buffer[..2], (PACKET_SIZE as u16).to_be_bytes());
// Next is the packet
assert_eq!(&buffer[2..], packet1.as_bytes());
}
#[test]
fn encode_and_then_decode() {
let mut codec = MultiIpPacketCodec::new();
let mut buffer = BytesMut::new();
let packet = IprPacket::from(Bytes::from_static(&[0u8; 1000]));
codec.encode(packet.clone(), &mut buffer).unwrap();
codec.encode(packet.clone(), &mut buffer).unwrap();
let mut decoded_packets = Vec::new();
while let Some(decoded_packet) = codec.decode(&mut buffer).unwrap() {
decoded_packets.push(decoded_packet);
}
assert_eq!(decoded_packets.len(), 1);
assert_eq!(decoded_packets[0].as_bytes(), packet.as_bytes());
}
#[test]
fn encode_a_packat_that_is_too_large() {
let mut codec = MultiIpPacketCodec::new();
let mut buffer = BytesMut::new();
let packet = IprPacket::from(Bytes::from_static(
&[0u8; MAX_PACKET_SIZE + MAX_PACKET_SIZE],
));
codec.encode(packet, &mut buffer).unwrap();
assert_eq!(
buffer.len(),
MAX_PACKET_SIZE + MAX_PACKET_SIZE + LENGTH_PREFIX_SIZE
);
codec.encode(IprPacket::Flush, &mut buffer).unwrap();
assert_eq!(
buffer.len(),
MAX_PACKET_SIZE + MAX_PACKET_SIZE + LENGTH_PREFIX_SIZE
);
}
#[test]
fn check_that_max_size_does_not_flush() {
let mut codec = MultiIpPacketCodec::new();
let mut buffer = BytesMut::new();
let packet = IprPacket::from(Bytes::from_static(&[0u8; MAX_PACKET_SIZE - 2]));
codec.encode(packet.clone(), &mut buffer).unwrap();
assert_eq!(buffer.len(), 0);
let packet = IprPacket::from(Bytes::from_static(&[0u8; MAX_PACKET_SIZE - 2]));
codec.encode(packet.clone(), &mut buffer).unwrap();
assert_eq!(buffer.len(), MAX_PACKET_SIZE);
}
}
@@ -4,6 +4,7 @@ use crate::fragment::Fragment;
use crate::{monitoring, ChunkingError};
use log::*;
use std::collections::HashMap;
use std::time::{Duration, Instant};
// TODO: perhaps a more sophisticated approach with writing to disk periodically in case
// we're receiving fast & furious in uncompressed 4K - we don't want to keep that in memory;
@@ -31,6 +32,9 @@ struct ReconstructionBuffer {
/// appropriately resized and all missing fragments are set to a `None`, thus keeping
/// everything in order the whole time, allowing for O(1) insertions and O(n) reconstruction.
fragments: Vec<Option<Fragment>>,
/// The timestamp of the last received fragment. Used for cleaning up stale buffers.
last_fragment_timestamp: Instant,
}
/// Type alias representing fully reconstructed message - its original data and list of all
@@ -56,6 +60,7 @@ impl ReconstructionBuffer {
previous_fragments_set_id: None,
next_fragments_set_id: None,
fragments: fragments_buffer,
last_fragment_timestamp: Instant::now(),
}
}
@@ -99,6 +104,8 @@ impl ReconstructionBuffer {
/// `previous_fragments_set_id` and `next_fragments_set_id` are set for the ease
/// of access.
fn insert_fragment(&mut self, fragment: Fragment) {
self.last_fragment_timestamp = Instant::now();
// all fragments in the buffer should always have the same id as before inserting an element,
// the correct buffer instance is looked up based on the fragment to be inserted.
debug_assert!({
@@ -158,6 +165,10 @@ pub struct MessageReconstructor {
}
impl MessageReconstructor {
// We want to be very conservative here. We remove these to avoid memory leaks, but it's okay
// to wait for a long time before we do so.
const INCOMPLETE_MESSAGE_TIMEOUT: Duration = Duration::from_secs(30 * 60);
/// Creates an empty `MessageReconstructor`.
pub fn new() -> Self {
Default::default()
@@ -296,6 +307,25 @@ impl MessageReconstructor {
pub fn recover_fragment(&self, fragment_data: Vec<u8>) -> Result<Fragment, ChunkingError> {
Fragment::try_from_bytes(&fragment_data)
}
pub fn cleanup_stale_buffers(&mut self) {
trace!("Cleaning up stale buffers");
let now = Instant::now();
self.reconstructed_sets.retain(|_, set_buf| {
let keep = now.duration_since(set_buf.last_fragment_timestamp)
< Self::INCOMPLETE_MESSAGE_TIMEOUT;
if !keep {
debug!(
"Removing stale buffer for set id {:?}",
set_buf
.fragments
.first()
.and_then(|f| f.as_ref().map(|f| f.id()))
);
}
keep
});
}
}
#[cfg(test)]
@@ -508,6 +538,8 @@ mod reconstruction_buffer {
#[cfg(test)]
mod message_reconstructor {
use std::time::Instant;
use super::*;
use crate::fragment::unlinked_fragment_payload_max_len;
use crate::set::{max_one_way_linked_set_payload_length, two_way_linked_set_payload_length};
@@ -869,6 +901,7 @@ mod message_reconstructor {
previous_fragments_set_id: None,
next_fragments_set_id: None,
fragments: vec![],
last_fragment_timestamp: Instant::now(),
},
);
@@ -879,6 +912,7 @@ mod message_reconstructor {
previous_fragments_set_id: None,
next_fragments_set_id: None,
fragments: vec![],
last_fragment_timestamp: Instant::now(),
},
);
@@ -1006,6 +1040,7 @@ mod message_reconstructor {
previous_fragments_set_id: None,
next_fragments_set_id: Some(1234),
fragments: vec![],
last_fragment_timestamp: Instant::now(),
},
);
@@ -1016,6 +1051,7 @@ mod message_reconstructor {
previous_fragments_set_id: Some(12345),
next_fragments_set_id: Some(123),
fragments: vec![],
last_fragment_timestamp: Instant::now(),
},
);
@@ -1026,6 +1062,7 @@ mod message_reconstructor {
previous_fragments_set_id: Some(1234),
next_fragments_set_id: Some(12),
fragments: vec![],
last_fragment_timestamp: Instant::now(),
},
);
@@ -1036,6 +1073,7 @@ mod message_reconstructor {
previous_fragments_set_id: Some(123),
next_fragments_set_id: None,
fragments: vec![],
last_fragment_timestamp: Instant::now(),
},
);
@@ -1083,6 +1121,7 @@ mod message_reconstructor {
previous_fragments_set_id: None,
next_fragments_set_id: Some(1234),
fragments: vec![],
last_fragment_timestamp: Instant::now(),
},
);
reconstructor.reconstructed_sets.insert(
@@ -1092,6 +1131,7 @@ mod message_reconstructor {
previous_fragments_set_id: Some(12345),
next_fragments_set_id: None,
fragments: vec![],
last_fragment_timestamp: Instant::now(),
},
);
assert_eq!(reconstructor.previous_linked_set_id(12345), None);
@@ -1139,6 +1179,7 @@ mod message_reconstructor {
previous_fragments_set_id: None,
next_fragments_set_id: Some(1234),
fragments: vec![],
last_fragment_timestamp: Instant::now(),
},
);
reconstructor.reconstructed_sets.insert(
@@ -1148,6 +1189,7 @@ mod message_reconstructor {
previous_fragments_set_id: Some(12345),
next_fragments_set_id: None,
fragments: vec![],
last_fragment_timestamp: Instant::now(),
},
);
assert_eq!(reconstructor.next_linked_set_id(12345), Some(1234));
+32 -1
View File
@@ -2,7 +2,12 @@
// SPDX-License-Identifier: Apache-2.0
use futures::channel::mpsc;
use std::collections::HashMap;
use std::{
collections::HashMap,
time::{Duration, Instant},
};
const LANE_CONSIDERED_CLEAR: usize = 10;
pub type ConnectionId = u64;
@@ -67,6 +72,32 @@ impl LaneQueueLengths {
}
}
}
pub fn total(&self) -> usize {
match self.0.lock() {
Ok(inner) => inner.values().sum(),
Err(err) => {
log::warn!("Failed to get total queue length: {err}");
0
}
}
}
pub async fn wait_until_clear(&self, lane: &TransmissionLane, timeout: Option<Duration>) {
let total_time_waited = Instant::now();
loop {
let lane_length = self.get(lane).unwrap_or_default();
if lane_length < LANE_CONSIDERED_CLEAR {
break;
}
if timeout.is_some_and(|timeout| total_time_waited.elapsed() > timeout) {
log::warn!("Timeout reached while waiting for queue to clear");
break;
}
log::trace!("Waiting for queue to clear ({} items left)", lane_length);
tokio::time::sleep(Duration::from_millis(100)).await;
}
}
}
impl Default for LaneQueueLengths {
@@ -0,0 +1,23 @@
import Image from "next/image";
import Link from "next/link";
import explorerLogo from "../public/images/smiley.png";
export const Explorer = () => {
return (
<Link
href={"https://nym.com/explorer"}
target="_blank"
rel="noopener noreferrer"
>
<Image
src={explorerLogo}
style = {{
marginRight: "0.6rem"
}}
alt={"Network Explorer"}
width={24}
height={24}
/>
</Link>
);
};
+1 -1
View File
@@ -5,7 +5,7 @@ const links = [
["Matrix", "https://matrix.to/#/#dev:nymtech.chat"],
["GitHub", "https://nymtech.net/go/github/nym"],
["Nym Wallet", "https://nymtech.net/download/wallet"],
["Nym Explorer", "https://explorer.nymtech.net/"],
["Nym Explorer", "https://nym.com/explorer/"],
["Nym Blog", "https://nymtech.medium.com/"],
["Twitter", "https://nymtech.net/go/x"],
["Telegram", "https://nymtech.net/go/telegram"],
@@ -6,10 +6,6 @@ import { useTheme } from "@mui/material/styles";
import Image from "next/image";
import Link from "next/link";
// import networkDocs from "../public/images/landing/network-docs.png";
// import developerDocs from "../public/images/landing/developer-docs.png";
// import sdkDocs from "../public/images/landing/sdk-docs.png";
// import operatorGuide from "../public/images/landing/operator-guide.png";
import networkDocs from "../public/images/landing/Vector1.png";
import developerDocs from "../public/images/landing/Vector2.png";
import sdkDocs from "../public/images/landing/Vector3.png";
@@ -41,13 +37,6 @@ export const LandingPage = () => {
href: "/developers",
icon: sdkDocs,
},
// {
// text: "SDKs",
// description: "Rust and Typescript SDK docs",
// href: "/developers/rust",
// icon: sdkDocs,
// },
{
text: "APIs",
description: "Interactive API specs for Nym infrastructure",
@@ -1,7 +1,7 @@
import { Box } from "@mui/material";
import Image from "next/image";
import Link from "next/link";
import matrixLogo from "../public/images/matrix-logo.png";
export const Matrix = () => {
return (
<Link
@@ -9,7 +9,14 @@ export const Matrix = () => {
target="_blank"
rel="noopener noreferrer"
>
<Image src={matrixLogo} alt={"Matrix Logo"} width={20} height={24} />
<Image src={matrixLogo}
style = {{
marginRight: "0.6rem"
}}
alt={"Matrix Logo"}
width={20}
height={24}
/>
</Link>
);
};
@@ -5,7 +5,7 @@ If you run a `nym-node` for the first time, you will need to specify a few param
To initialise and test run with yur node with all needed options, use this command:
```sh
./nym-node run --id <ID> --mode entry-gateway --public-ips "$(curl -4 https://ifconfig.me)" --hostname "<HOSTNAME>" --http-bind-address 0.0.0.0:8080 --mixnet-bind-address 0.0.0.0:1789 --location <LOCATION> --accept-operator-terms-and-conditions --wireguard-enabled true
./nym-node run --id <ID> --mode entry-gateway --public-ips "$(curl -4 https://ifconfig.me)" --hostname "<HOSTNAME>" --location <LOCATION> --accept-operator-terms-and-conditions --wireguard-enabled true
```
If you prefer to have a generic local identifier set to `default-nym-node`, skip `--id` option.
@@ -18,7 +18,7 @@ In any case `--public-ips` is a necessity for your node to bond to API and commu
Adding `--init-only` option results in `nym-node` initialising a configuration file `config.toml` without running - a good option for an initial node setup. Remember that if you using this flag on a node which already has a config file, this will not over-write the values, unless used with a specified flag `--write-changes` (`-w`) - a good option for introducing changes to your `config.toml` file.
```sh
./nym-node run --id <ID> --init-only --mode entry-gateway --public-ips "$(curl -4 https://ifconfig.me)" --hostname "<HOSTNAME>" --http-bind-address 0.0.0.0:8080 --mixnet-bind-address 0.0.0.0:1789 --location <LOCATION> --wireguard-enabled true
./nym-node run --id <ID> --init-only --mode entry-gateway --public-ips "$(curl -4 https://ifconfig.me)" --hostname "<HOSTNAME>" --location <LOCATION> --wireguard-enabled true
```
In the example above we dropped `--accept-operator-terms-and-conditions` as the flag must be added to a running command explicitly and it is not stored in the config, `--init-only` will not run the node.
@@ -5,7 +5,7 @@ If you run a `nym-node` for the first time, you will need to specify a few param
To initialise and test run your node, use this command:
```sh
./nym-node run --id <ID> --mode exit-gateway --public-ips "$(curl -4 https://ifconfig.me)" --hostname "<HOSTNAME>" --http-bind-address 0.0.0.0:8080 --mixnet-bind-address 0.0.0.0:1789 --location <LOCATION> --accept-operator-terms-and-conditions --wireguard-enabled true
./nym-node run --id <ID> --mode exit-gateway --public-ips "$(curl -4 https://ifconfig.me)" --hostname "<HOSTNAME>" --location <LOCATION> --accept-operator-terms-and-conditions --wireguard-enabled true
```
If you prefer to have a generic local identifier set to `default-nym-node`, skip `--id` option.
@@ -19,7 +19,7 @@ In any case `--public-ips` is a necessity for your node to bond to API and commu
Adding `--init-only` option results in `nym-node` initialising a configuration file `config.toml` without running - a good option for an initial node setup. Remember that if you using this flag on a node which already has a config file, this will not over-write the values, unless used with a specified flag `--write-changes` (`-w`) - a good option for introducing changes to your `config.toml` file.
```sh
./nym-node run --id <ID> --init-only --mode exit-gateway --public-ips "$(curl -4 https://ifconfig.me)" --hostname "<HOSTNAME>" --http-bind-address 0.0.0.0:8080 --mixnet-bind-address 0.0.0.0:1789 --location <LOCATION> --wireguard-enabled true
./nym-node run --id <ID> --init-only --mode exit-gateway --public-ips "$(curl -4 https://ifconfig.me)" --hostname "<HOSTNAME>" --location <LOCATION> --wireguard-enabled true
```
In the example above we dropped `--accept-operator-terms-and-conditions` as the flag must be added to a running command explicitly and it is not stored in the config, `--init-only` will not run the node.
@@ -6,7 +6,7 @@ If you run a `nym-node` for the first time, you will need to specify a few param
To initialise and run your node, use this command:
```sh
./nym-node run --mode mixnode --mixnet-bind-address 0.0.0.0:1789 --verloc-bind-address 0.0.0.0:1790 --http-bind-address 0.0.0.0:8080 --public-ips "$(curl -4 https://ifconfig.me)" --accept-operator-terms-and-conditions
./nym-node run --mode mixnode --public-ips "$(curl -4 https://ifconfig.me)" --accept-operator-terms-and-conditions
```
**Init only**
@@ -15,7 +15,7 @@ Adding `--init-only` option results in `nym-node` initialising a configuration f
Initialise only with a custom `--id` and `--init-only` command:
```sh
./nym-node run --mode mixnode --id <ID> --init-only --mixnet-bind-address 0.0.0.0:1789 --verloc-bind-address 0.0.0.0:1790 --http-bind-address 0.0.0.0:8080 --public-ips "$(curl -4 https://ifconfig.me)" --accept-operator-terms-and-conditions
./nym-node run --mode mixnode --id <ID> --init-only --public-ips "$(curl -4 https://ifconfig.me)" --accept-operator-terms-and-conditions
```
If you prefer to have a generic local identifier set to `default-nym-node`, skip `--id` option.
@@ -7,7 +7,7 @@ You will need to rent a VPS to run your node on. One key reason for this is that
Tor community created a very helpful table called [*Good Bad ISPs*](https://community.torproject.org/relay/community-resources/good-bad-isps/), you can use that one as a guideline for your choice of ISP for your VPS.
**Update:** Nym community started an ISP table called [*Where to host your nym node?*](../../community-counsel/isp-list.mdx), check it out and add your findings!
**Update:** Nym community initiated an ISP table called [*Where to host your nym node?*](https://nym.com/docs/operators/community-counsel/isp-list), check it out and add your findings!
<div>
<Tabs items={[
@@ -0,0 +1,432 @@
```console
iptables-persistent is already installed.
Configuring IP forwarding...
net.ipv6.conf.all.forwarding=1
net.ipv4.ip_forward=1
net.ipv6.conf.all.forwarding = 1
net.ipv4.ip_forward = 1
IP forwarding configured successfully.
Creating Nym exit policy chain...
Creating chain NYM-EXIT...
Creating chain NYM-EXIT in ip6tables...
Linking NYM-EXIT to FORWARD chain...
Linking NYM-EXIT to IPv6 FORWARD chain...
Setting up NAT rules...
IPv4 NAT rule already exists.
IPv6 NAT rule already exists.
Configuring DNS and ICMP rules...
Added IPv6 ICMP rule (allow ping6).
Added IPv6 DNS rule (UDP).
Added IPv6 DNS rule (TCP).
Applying Spamhaus blocklist...
Downloading exit policy from https://nymtech.net/.wellknown/network-requester/exit-policy.txt
Processing 429 blocklist rules...
Blocklist applied successfully.
Applying allowed ports...
Adding rules for SILC (Port: 706)
Added: NYM-EXIT tcp port 706
Added: NYM-EXIT tcp port 706
Added: NYM-EXIT udp port 706
Added: NYM-EXIT udp port 706
Adding rules for PostgreSQL (Port: 5432)
Added: NYM-EXIT tcp port 5432
Added: NYM-EXIT tcp port 5432
Added: NYM-EXIT udp port 5432
Added: NYM-EXIT udp port 5432
Adding rules for CPanel (Port: 2082-2083)
Added: NYM-EXIT tcp port range 2082:2083
Added: NYM-EXIT tcp port range 2082:2083
Added: NYM-EXIT udp port range 2082:2083
Added: NYM-EXIT udp port range 2082:2083
Adding rules for Zcash (Port: 8232-8233)
Added: NYM-EXIT tcp port range 8232:8233
Added: NYM-EXIT tcp port range 8232:8233
Added: NYM-EXIT udp port range 8232:8233
Added: NYM-EXIT udp port range 8232:8233
Adding rules for VLSILicenseManager (Port: 1500)
Added: NYM-EXIT tcp port 1500
Added: NYM-EXIT tcp port 1500
Added: NYM-EXIT udp port 1500
Added: NYM-EXIT udp port 1500
Adding rules for NTP (Port: 123)
Added: NYM-EXIT tcp port 123
Added: NYM-EXIT tcp port 123
Added: NYM-EXIT udp port 123
Added: NYM-EXIT udp port 123
Adding rules for PKTKRB (Port: 1293)
Added: NYM-EXIT tcp port 1293
Added: NYM-EXIT tcp port 1293
Added: NYM-EXIT udp port 1293
Added: NYM-EXIT udp port 1293
Adding rules for OpenPGP (Port: 11371)
Added: NYM-EXIT tcp port 11371
Added: NYM-EXIT tcp port 11371
Added: NYM-EXIT udp port 11371
Added: NYM-EXIT udp port 11371
Adding rules for HTTPS (Port: 443)
Added: NYM-EXIT tcp port 443
Added: NYM-EXIT tcp port 443
Added: NYM-EXIT udp port 443
Added: NYM-EXIT udp port 443
Adding rules for POP3 (Port: 110)
Added: NYM-EXIT tcp port 110
Added: NYM-EXIT tcp port 110
Added: NYM-EXIT udp port 110
Added: NYM-EXIT udp port 110
Adding rules for OpenVPN (Port: 1194)
Added: NYM-EXIT tcp port 1194
Added: NYM-EXIT tcp port 1194
Added: NYM-EXIT udp port 1194
Added: NYM-EXIT udp port 1194
Adding rules for XboxLive (Port: 3074)
Added: NYM-EXIT tcp port 3074
Added: NYM-EXIT tcp port 3074
Added: NYM-EXIT udp port 3074
Added: NYM-EXIT udp port 3074
Adding rules for OracleDB (Port: 1521)
Added: NYM-EXIT tcp port 1521
Added: NYM-EXIT tcp port 1521
Added: NYM-EXIT udp port 1521
Added: NYM-EXIT udp port 1521
Adding rules for NFS (Port: 2049)
Added: NYM-EXIT tcp port 2049
Added: NYM-EXIT tcp port 2049
Added: NYM-EXIT udp port 2049
Added: NYM-EXIT udp port 2049
Adding rules for Kerberos (Port: 88)
Added: NYM-EXIT tcp port 88
Added: NYM-EXIT tcp port 88
Added: NYM-EXIT udp port 88
Added: NYM-EXIT udp port 88
Adding rules for POP3OverTLS (Port: 995)
Added: NYM-EXIT tcp port 995
Added: NYM-EXIT tcp port 995
Added: NYM-EXIT udp port 995
Added: NYM-EXIT udp port 995
Adding rules for MMCC (Port: 5050)
Added: NYM-EXIT tcp port 5050
Added: NYM-EXIT tcp port 5050
Added: NYM-EXIT udp port 5050
Added: NYM-EXIT udp port 5050
Adding rules for WHOIS (Port: 43)
Added: NYM-EXIT tcp port 43
Added: NYM-EXIT tcp port 43
Added: NYM-EXIT udp port 43
Added: NYM-EXIT udp port 43
Adding rules for NetnewsAdmin (Port: 991)
Added: NYM-EXIT tcp port 991
Added: NYM-EXIT tcp port 991
Added: NYM-EXIT udp port 991
Added: NYM-EXIT udp port 991
Adding rules for IMAP (Port: 143)
Added: NYM-EXIT tcp port 143
Added: NYM-EXIT tcp port 143
Added: NYM-EXIT udp port 143
Added: NYM-EXIT udp port 143
Adding rules for AndroidMarket (Port: 5228)
Added: NYM-EXIT tcp port 5228
Added: NYM-EXIT tcp port 5228
Added: NYM-EXIT udp port 5228
Added: NYM-EXIT udp port 5228
Adding rules for SMBWindowsFileShare (Port: 445)
Added: NYM-EXIT tcp port 445
Added: NYM-EXIT tcp port 445
Added: NYM-EXIT udp port 445
Added: NYM-EXIT udp port 445
Adding rules for RTSPAlt (Port: 1755)
Added: NYM-EXIT tcp port 1755
Added: NYM-EXIT tcp port 1755
Added: NYM-EXIT udp port 1755
Added: NYM-EXIT udp port 1755
Adding rules for IMAPOverTLS (Port: 993)
Added: NYM-EXIT tcp port 993
Added: NYM-EXIT tcp port 993
Added: NYM-EXIT udp port 993
Added: NYM-EXIT udp port 993
Adding rules for TorORPort (Port: 9001)
Added: NYM-EXIT tcp port 9001
Added: NYM-EXIT tcp port 9001
Added: NYM-EXIT udp port 9001
Added: NYM-EXIT udp port 9001
Adding rules for XMPP (Port: 5222-5223)
Added: NYM-EXIT tcp port range 5222:5223
Added: NYM-EXIT tcp port range 5222:5223
Added: NYM-EXIT udp port range 5222:5223
Added: NYM-EXIT udp port range 5222:5223
Adding rules for FTP (Port: 20-21)
Added: NYM-EXIT tcp port range 20:21
Added: NYM-EXIT tcp port range 20:21
Added: NYM-EXIT udp port range 20:21
Added: NYM-EXIT udp port range 20:21
Adding rules for MOSH (Port: 60000-61000)
Added: NYM-EXIT tcp port range 60000:61000
Added: NYM-EXIT tcp port range 60000:61000
Added: NYM-EXIT udp port range 60000:61000
Added: NYM-EXIT udp port range 60000:61000
Adding rules for Zephyr (Port: 2102-2104)
Added: NYM-EXIT tcp port range 2102:2104
Added: NYM-EXIT tcp port range 2102:2104
Added: NYM-EXIT udp port range 2102:2104
Added: NYM-EXIT udp port range 2102:2104
Adding rules for Rsync (Port: 873)
Added: NYM-EXIT tcp port 873
Added: NYM-EXIT tcp port 873
Added: NYM-EXIT udp port 873
Added: NYM-EXIT udp port 873
Adding rules for Steam (Port: 27000-27050)
Added: NYM-EXIT tcp port range 27000:27050
Added: NYM-EXIT tcp port range 27000:27050
Added: NYM-EXIT udp port range 27000:27050
Added: NYM-EXIT udp port range 27000:27050
Adding rules for Git (Port: 9418)
Added: NYM-EXIT tcp port 9418
Added: NYM-EXIT tcp port 9418
Added: NYM-EXIT udp port 9418
Added: NYM-EXIT udp port 9418
Adding rules for MSNP (Port: 1863)
Added: NYM-EXIT tcp port 1863
Added: NYM-EXIT tcp port 1863
Added: NYM-EXIT udp port 1863
Added: NYM-EXIT udp port 1863
Adding rules for SimplifyMedia (Port: 8087-8088)
Added: NYM-EXIT tcp port range 8087:8088
Added: NYM-EXIT tcp port range 8087:8088
Added: NYM-EXIT udp port range 8087:8088
Added: NYM-EXIT udp port range 8087:8088
Adding rules for TorDirPort (Port: 9030)
Added: NYM-EXIT tcp port 9030
Added: NYM-EXIT tcp port 9030
Added: NYM-EXIT udp port 9030
Added: NYM-EXIT udp port 9030
Adding rules for Virtuozzo (Port: 4643)
Added: NYM-EXIT tcp port 4643
Added: NYM-EXIT tcp port 4643
Added: NYM-EXIT udp port 4643
Added: NYM-EXIT udp port 4643
Adding rules for Gaming (Port: 9339)
Added: NYM-EXIT tcp port 9339
Added: NYM-EXIT tcp port 9339
Added: NYM-EXIT udp port 9339
Added: NYM-EXIT udp port 9339
Adding rules for VMware (Port: 902-904)
Added: NYM-EXIT tcp port range 902:904
Added: NYM-EXIT tcp port range 902:904
Added: NYM-EXIT udp port range 902:904
Added: NYM-EXIT udp port range 902:904
Adding rules for Sametime (Port: 1533)
Added: NYM-EXIT tcp port 1533
Added: NYM-EXIT tcp port 1533
Added: NYM-EXIT udp port 1533
Added: NYM-EXIT udp port 1533
Adding rules for NBX (Port: 2095-2096)
Added: NYM-EXIT tcp port range 2095:2096
Added: NYM-EXIT tcp port range 2095:2096
Added: NYM-EXIT udp port range 2095:2096
Added: NYM-EXIT udp port range 2095:2096
Adding rules for ICQ (Port: 5190)
Added: NYM-EXIT tcp port 5190
Added: NYM-EXIT tcp port 5190
Added: NYM-EXIT udp port 5190
Added: NYM-EXIT udp port 5190
Adding rules for KerberosAdmin (Port: 749)
Added: NYM-EXIT tcp port 749
Added: NYM-EXIT tcp port 749
Added: NYM-EXIT udp port 749
Added: NYM-EXIT udp port 749
Adding rules for RWHOIS (Port: 4321)
Added: NYM-EXIT tcp port 4321
Added: NYM-EXIT tcp port 4321
Added: NYM-EXIT udp port 4321
Added: NYM-EXIT udp port 4321
Adding rules for NDMP (Port: 10000)
Added: NYM-EXIT tcp port 10000
Added: NYM-EXIT tcp port 10000
Added: NYM-EXIT udp port 10000
Added: NYM-EXIT udp port 10000
Adding rules for DNS (Port: 53)
Added: NYM-EXIT tcp port 53
Added: NYM-EXIT tcp port 53
Added: NYM-EXIT udp port 53
Added: NYM-EXIT udp port 53
Adding rules for GoogleVoice (Port: 19294)
Added: NYM-EXIT tcp port 19294
Added: NYM-EXIT tcp port 19294
Added: NYM-EXIT udp port 19294
Added: NYM-EXIT udp port 19294
Adding rules for IMAP3 (Port: 220)
Added: NYM-EXIT tcp port 220
Added: NYM-EXIT tcp port 220
Added: NYM-EXIT udp port 220
Added: NYM-EXIT udp port 220
Adding rules for Bitcoin (Port: 8332-8333)
Added: NYM-EXIT tcp port range 8332:8333
Added: NYM-EXIT tcp port range 8332:8333
Added: NYM-EXIT udp port range 8332:8333
Added: NYM-EXIT udp port range 8332:8333
Adding rules for Mumble (Port: 64738)
Added: NYM-EXIT tcp port 64738
Added: NYM-EXIT tcp port 64738
Added: NYM-EXIT udp port 64738
Added: NYM-EXIT udp port 64738
Adding rules for PPTP (Port: 1723)
Added: NYM-EXIT tcp port 1723
Added: NYM-EXIT tcp port 1723
Added: NYM-EXIT udp port 1723
Added: NYM-EXIT udp port 1723
Adding rules for HTTPSALT (Port: 8443)
Added: NYM-EXIT tcp port 8443
Added: NYM-EXIT tcp port 8443
Added: NYM-EXIT udp port 8443
Added: NYM-EXIT udp port 8443
Adding rules for HTTPProxy (Port: 8888)
Added: NYM-EXIT tcp port 8888
Added: NYM-EXIT tcp port 8888
Added: NYM-EXIT udp port 8888
Added: NYM-EXIT udp port 8888
Adding rules for GNUnet (Port: 2086-2087)
Added: NYM-EXIT tcp port range 2086:2087
Added: NYM-EXIT tcp port range 2086:2087
Added: NYM-EXIT udp port range 2086:2087
Added: NYM-EXIT udp port range 2086:2087
Adding rules for Lightning (Port: 9735)
Added: NYM-EXIT tcp port 9735
Added: NYM-EXIT tcp port 9735
Added: NYM-EXIT udp port 9735
Added: NYM-EXIT udp port 9735
Adding rules for RTSP (Port: 554)
Added: NYM-EXIT tcp port 554
Added: NYM-EXIT tcp port 554
Added: NYM-EXIT udp port 554
Added: NYM-EXIT udp port 554
Adding rules for DNSOverTLS (Port: 853)
Added: NYM-EXIT tcp port 853
Added: NYM-EXIT tcp port 853
Added: NYM-EXIT udp port 853
Added: NYM-EXIT udp port 853
Adding rules for SSH (Port: 22)
Added: NYM-EXIT tcp port 22
Added: NYM-EXIT tcp port 22
Added: NYM-EXIT udp port 22
Added: NYM-EXIT udp port 22
Adding rules for Electrum (Port: 8082)
Added: NYM-EXIT tcp port 8082
Added: NYM-EXIT tcp port 8082
Added: NYM-EXIT udp port 8082
Added: NYM-EXIT udp port 8082
Adding rules for TelnetOverTLS (Port: 992)
Added: NYM-EXIT tcp port 992
Added: NYM-EXIT tcp port 992
Added: NYM-EXIT udp port 992
Added: NYM-EXIT udp port 992
Adding rules for Minecraft (Port: 25565)
Added: NYM-EXIT tcp port 25565
Added: NYM-EXIT tcp port 25565
Added: NYM-EXIT udp port 25565
Added: NYM-EXIT udp port 25565
Adding rules for SVN (Port: 3690)
Added: NYM-EXIT tcp port 3690
Added: NYM-EXIT tcp port 3690
Added: NYM-EXIT udp port 3690
Added: NYM-EXIT udp port 3690
Adding rules for Kpasswd (Port: 464)
Added: NYM-EXIT tcp port 464
Added: NYM-EXIT tcp port 464
Added: NYM-EXIT udp port 464
Added: NYM-EXIT udp port 464
Adding rules for RemoteHTTPS (Port: 981)
Added: NYM-EXIT tcp port 981
Added: NYM-EXIT tcp port 981
Added: NYM-EXIT udp port 981
Added: NYM-EXIT udp port 981
Adding rules for Tari (Port: 9053)
Added: NYM-EXIT tcp port 9053
Added: NYM-EXIT tcp port 9053
Added: NYM-EXIT udp port 9053
Added: NYM-EXIT udp port 9053
Adding rules for ElectrumSSL (Port: 50002)
Added: NYM-EXIT tcp port 50002
Added: NYM-EXIT tcp port 50002
Added: NYM-EXIT udp port 50002
Added: NYM-EXIT udp port 50002
Adding rules for HTTPSALT2 (Port: 9443)
Added: NYM-EXIT tcp port 9443
Added: NYM-EXIT tcp port 9443
Added: NYM-EXIT udp port 9443
Added: NYM-EXIT udp port 9443
Adding rules for LDAP (Port: 389)
Added: NYM-EXIT tcp port 389
Added: NYM-EXIT tcp port 389
Added: NYM-EXIT udp port 389
Added: NYM-EXIT udp port 389
Adding rules for HTTP (Port: 80-81)
Added: NYM-EXIT tcp port range 80:81
Added: NYM-EXIT tcp port range 80:81
Added: NYM-EXIT udp port range 80:81
Added: NYM-EXIT udp port range 80:81
Adding rules for MongoDBDefault (Port: 27017)
Added: NYM-EXIT tcp port 27017
Added: NYM-EXIT tcp port 27017
Added: NYM-EXIT udp port 27017
Added: NYM-EXIT udp port 27017
Adding rules for RTPVOIP (Port: 5000-5005)
Added: NYM-EXIT tcp port range 5000:5005
Added: NYM-EXIT tcp port range 5000:5005
Added: NYM-EXIT udp port range 5000:5005
Added: NYM-EXIT udp port range 5000:5005
Adding rules for MSSQL (Port: 1433)
Added: NYM-EXIT tcp port 1433
Added: NYM-EXIT tcp port 1433
Added: NYM-EXIT udp port 1433
Added: NYM-EXIT udp port 1433
Adding rules for MQTTS (Port: 8883)
Added: NYM-EXIT tcp port 8883
Added: NYM-EXIT tcp port 8883
Added: NYM-EXIT udp port 8883
Added: NYM-EXIT udp port 8883
Adding rules for MySQL (Port: 3306)
Added: NYM-EXIT tcp port 3306
Added: NYM-EXIT tcp port 3306
Added: NYM-EXIT udp port 3306
Added: NYM-EXIT udp port 3306
Adding rules for TeamSpeak (Port: 8767)
Added: NYM-EXIT tcp port 8767
Added: NYM-EXIT tcp port 8767
Added: NYM-EXIT udp port 8767
Added: NYM-EXIT udp port 8767
Adding rules for GroupWise (Port: 1677)
Added: NYM-EXIT tcp port 1677
Added: NYM-EXIT tcp port 1677
Added: NYM-EXIT udp port 1677
Added: NYM-EXIT udp port 1677
Adding rules for EnsimControlPanel (Port: 19638)
Added: NYM-EXIT tcp port 19638
Added: NYM-EXIT tcp port 19638
Added: NYM-EXIT udp port 19638
Added: NYM-EXIT udp port 19638
Adding rules for QTServerAdmin (Port: 1220)
Added: NYM-EXIT tcp port 1220
Added: NYM-EXIT tcp port 1220
Added: NYM-EXIT udp port 1220
Added: NYM-EXIT udp port 1220
Adding rules for Finger (Port: 79)
Added: NYM-EXIT tcp port 79
Added: NYM-EXIT tcp port 79
Added: NYM-EXIT udp port 79
Added: NYM-EXIT udp port 79
Adding rules for FTPOverTLS (Port: 989-990)
Added: NYM-EXIT tcp port range 989:990
Added: NYM-EXIT tcp port range 989:990
Added: NYM-EXIT udp port range 989:990
Added: NYM-EXIT udp port range 989:990
Adding rules for LDAPS (Port: 636)
Added: NYM-EXIT tcp port 636
Added: NYM-EXIT tcp port 636
Added: NYM-EXIT udp port 636
Added: NYM-EXIT udp port 636
Adding default reject rule...
Default reject rule added successfully.
Port allowlist applied successfully.
Saving iptables rules to make them persistent...
Rules saved to /etc/iptables/rules.v4 and /etc/iptables/rules.v6
Nym exit policy installed successfully.
```
@@ -0,0 +1,807 @@
```console
ESC[0;33mNym Exit Policy Status:ESC[0m
ESC[0;33m----------------------ESC[0m
ESC[0;32mNetwork Device:ESC[0m ens3
ESC[0;32mWireguard Interface:ESC[0m nymwg
ESC[0;33mInterface Details:ESC[0m
12: nymwg: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/none
ESC[0;33mIP Addresses:ESC[0m
12: nymwg: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000
inet 10.1.0.1/32 brd 10.1.0.1 scope global nymwg
valid_lft forever preferred_lft forever
12: nymwg: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000
inet6 fc01::1/112 scope global
valid_lft forever preferred_lft forever
ESC[0;33mIptables Chains:ESC[0m
IPv4 Chain:
Chain NYM-EXIT (1 references)
pkts bytes target prot opt in out source destination
0 0 REJECT 0 -- * * 0.0.0.0/0 5.188.10.0/23 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 5.188.11.0/24 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 31.132.36.0/22 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 31.184.237.0/24 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 37.9.42.0/24 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 43.229.52.0/22 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 45.9.148.0/22 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 45.43.128.0/18 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 45.142.120.0/24 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 46.148.112.0/24 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 46.148.120.0/24 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 46.148.127.0/24 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 46.173.208.0/20 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 79.110.22.0/24 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 85.121.39.0/24 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 91.193.75.0/24 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 91.200.12.0/22 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 91.200.81.0/24 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 91.200.82.0/24 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 91.200.83.0/24 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 91.200.164.0/24 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 91.216.3.0/24 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 91.220.163.0/24 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 91.200.248.0/22 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 91.243.90.0/24 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 91.243.91.0/24 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 91.243.93.0/24 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 91.234.99.0/24 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 103.99.0.0/22 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 103.215.80.0/22 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 103.239.28.0/22 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 104.166.96.0/19 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 104.207.64.0/19 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 104.233.0.0/18 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 104.239.0.0/17 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 104.243.192.0/20 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 104.247.96.0/19 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 104.250.192.0/19 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 104.250.224.0/19 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 107.182.112.0/20 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 107.190.160.0/20 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 141.136.22.0/24 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 150.129.40.0/22 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 159.174.0.0/16 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 162.222.128.0/21 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 162.249.20.0/22 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 163.53.247.0/24 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 166.117.0.0/16 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 167.74.0.0/18 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 167.160.96.0/19 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 168.64.0.0/16 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 168.76.0.0/16 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 168.129.0.0/16 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 169.239.152.0/22 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 170.114.0.0/16 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 172.98.0.0/18 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 174.136.192.0/18 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 176.121.14.0/24 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 178.159.97.0/24 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 178.159.100.0/24 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 178.159.107.0/24 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 185.14.192.0/24 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 185.14.193.0/24 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 185.14.195.0/24 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 185.21.8.0/22 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 185.39.8.0/22 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 185.71.0.0/22 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 185.77.248.0/24 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 185.116.172.0/23 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 185.116.175.0/24 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 185.124.56.0/21 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 185.129.8.0/22 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 185.130.36.0/22 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 185.130.40.0/22 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 185.140.53.0/24 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 185.143.220.0/24 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 185.143.222.0/24 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 185.143.223.0/24 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 185.146.168.0/22 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 185.165.153.0/24 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 185.193.90.0/24 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 185.244.29.0/24 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 185.244.30.0/24 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 185.244.31.0/24 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 188.247.230.0/24 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 192.26.25.0/24 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 192.31.212.0/23 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 192.43.175.0/24 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 192.43.176.0/21 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 192.43.184.0/24 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 192.161.80.0/20 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 192.251.231.0/24 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 193.228.91.0/24 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 194.5.97.0/24 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 194.5.98.0/24 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 194.5.99.0/24 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 195.182.57.0/24 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 196.45.120.0/21 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 196.61.192.0/20 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 196.196.8.0/22 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 196.199.0.0/16 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 197.231.208.0/22 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 198.20.16.0/20 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 198.45.64.0/19 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 198.56.64.0/18 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 198.151.64.0/18 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 198.151.152.0/22 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 198.178.64.0/19 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 198.183.32.0/19 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 198.186.25.0/24 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 198.187.64.0/18 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 198.200.0.0/21 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 198.200.8.0/23 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 198.206.140.0/24 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 199.5.152.0/23 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 199.34.128.0/18 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 199.84.64.0/19 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 199.89.16.0/20 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 199.120.163.0/24 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 199.166.200.0/22 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 199.185.192.0/20 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 199.196.192.0/19 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 199.198.160.0/20 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 199.212.96.0/20 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 199.223.0.0/20 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 199.241.64.0/19 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 199.249.64.0/19 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 199.253.224.0/20 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 199.254.32.0/20 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 204.19.38.0/23 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 204.44.224.0/20 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 204.52.96.0/19 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 204.87.199.0/24 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 204.107.208.0/24 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 204.126.244.0/23 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 204.130.16.0/20 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 204.147.64.0/21 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 204.232.0.0/18 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 205.144.0.0/20 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 205.148.192.0/18 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 205.151.128.0/19 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 205.159.45.0/24 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 205.172.244.0/22 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 205.189.71.0/24 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 205.189.72.0/23 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 205.203.0.0/19 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 205.233.224.0/20 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 205.236.189.0/24 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 206.124.104.0/21 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 206.195.224.0/19 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 206.197.165.0/24 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 206.209.80.0/20 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 206.224.160.0/19 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 206.226.0.0/19 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 206.226.32.0/19 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 206.227.64.0/18 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 207.22.192.0/18 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 207.45.224.0/20 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 207.110.64.0/18 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 207.110.128.0/18 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 209.66.128.0/19 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 216.179.128.0/17 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 217.8.116.0/22 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 217.8.117.0/24 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 223.169.0.0/16 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 223.254.0.0/16 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 42.4.0.0/14 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 68.119.232.0/21 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 68.215.0.0/16 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 69.244.0.0/14 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 70.111.0.0/16 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 70.126.0.0/15 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 112.78.2.0/24 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 195.20.40.0/21 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 14.160.0.0/12 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 27.2.0.0/15 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 27.106.108.128/25 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 37.236.0.0/15 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 38.100.21.0/24 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 39.32.0.0/11 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 41.190.2.0/24 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 41.190.30.0/23 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 45.116.232.0/23 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 46.118.0.0/15 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 46.161.9.0/24 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 60.184.0.0/14 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 62.44.134.0/23 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 78.85.40.0/21 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 79.11.0.0/16 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 79.108.0.0/15 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 81.93.93.0/24 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 83.24.0.0/13 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 83.149.19.0/24 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 84.18.126.0/24 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 85.198.140.0/22 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 87.116.176.0/22 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 87.227.224.0/19 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 87.241.88.0/22 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 89.114.108.0/22 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 91.196.250.0/24 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 93.122.192.0/18 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 95.0.60.160/27 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 95.110.0.0/17 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 89.189.152.0/22 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 103.26.246.0/23 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 106.51.0.0/17 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 109.124.0.0/20 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 109.124.16.0/21 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 109.126.128.0/17 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 109.175.6.0/24 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 111.125.108.0/24 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 112.101.0.0/16 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 113.80.0.0/13 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 113.128.0.0/16 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 114.96.0.0/13 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 114.115.128.0/17 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 115.72.0.0/13 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 118.20.0.0/15 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 123.24.64.0/18 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 125.167.64.0/18 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 139.5.157.0/24 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 146.185.223.0/24 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 154.68.4.0/23 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 177.55.154.0/23 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 177.125.30.0/23 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 177.224.0.0/13 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 178.135.0.0/16 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 179.5.103.0/24 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 181.67.0.0/16 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 181.174.101.0/24 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 182.69.0.0/16 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 182.160.100.0/22 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 182.184.0.0/13 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 182.253.162.0/23 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 183.82.128.0/17 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 183.128.0.0/16 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 185.36.88.0/22 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 185.150.15.0/24 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 185.172.86.0/24 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 186.179.100.0/24 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 189.216.0.0/15 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 190.235.110.0/23 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 190.239.190.0/23 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 192.64.121.0/24 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 193.34.141.0/24 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 193.188.254.0/24 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 197.229.0.0/16 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 201.148.126.0/23 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 202.136.88.0/22 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 200.121.192.0/19 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 220.164.0.0/16 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 221.228.192.0/20 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 24.0.0.0/12 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 27.184.0.0/13 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 46.0.0.0/18 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 58.53.128.0/18 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 59.92.0.0/14 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 60.52.0.0/17 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 60.176.0.0/13 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 60.215.0.0/16 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 61.163.0.0/16 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 62.194.131.0/24 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 64.175.32.0/20 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 67.116.236.0/22 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 67.121.120.0/21 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 67.124.36.0/22 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 68.62.0.0/16 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 69.112.0.0/12 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 71.56.0.0/13 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 76.112.0.0/12 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 78.97.32.0/19 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 80.108.64.0/18 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 81.240.0.0/17 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 82.72.0.0/14 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 82.169.28.0/23 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 84.127.0.0/17 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 84.144.0.0/12 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 84.220.0.0/14 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 85.48.0.0/17 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 85.54.0.0/15 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 85.85.0.0/16 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 85.86.0.0/15 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 87.176.0.0/13 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 89.217.0.0/16 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 91.176.0.0/14 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 91.182.0.0/16 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 92.0.0.0/12 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 92.112.0.0/15 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 92.128.0.0/12 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 109.128.0.0/14 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 110.212.0.0/16 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 111.85.0.0/16 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 112.224.0.0/11 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 113.70.0.0/16 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 113.89.0.0/16 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 113.111.0.0/16 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 113.224.0.0/14 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 113.240.0.0/13 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 114.246.0.0/17 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 114.248.80.0/20 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 115.60.0.0/16 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 115.213.0.0/16 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 116.238.0.0/16 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 117.22.0.0/15 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 117.136.0.0/20 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 118.80.0.0/15 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 118.168.0.0/14 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 120.0.0.0/16 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 120.68.0.0/14 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 121.29.64.0/18 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 122.169.64.0/19 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 122.173.0.0/16 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 123.67.0.0/16 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 123.101.0.0/16 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 123.112.0.0/13 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 123.134.0.0/15 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 123.161.0.0/16 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 123.174.0.0/15 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 123.188.0.0/16 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 123.244.0.0/14 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 124.89.0.0/17 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 124.128.0.0/14 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 124.134.0.0/17 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 124.94.0.0/16 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 125.93.64.0/19 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 125.125.176.0/20 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 125.224.0.0/15 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 150.70.75.0/24 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 166.204.0.0/15 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 178.191.0.0/16 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 178.125.0.0/16 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 183.91.2.0/23 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 183.184.0.0/13 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 188.23.0.0/16 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 188.98.0.0/15 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 189.64.0.0/14 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 201.53.0.0/16 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 201.82.64.0/19 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 212.56.64.0/18 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 218.202.219.0/24 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 220.152.128.0/22 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 220.178.0.0/19 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 221.11.32.0/20 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 222.183.0.0/16 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 222.240.216.0/21 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 82.165.159.132/31 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 91.208.144.164 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 209.182.193.155 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 213.205.38.29 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 5.79.71.205 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 5.79.71.225 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 38.229.129.41 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 38.229.129.213 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 38.229.144.42 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 38.229.147.11 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 38.229.151.95 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 38.229.153.71 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 38.229.153.115 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 38.229.168.194 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 38.229.169.101 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 38.229.170.84 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 38.229.174.35 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 38.229.179.9 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 38.229.182.164 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 38.229.184.75 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 38.229.186.110 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 38.229.186.114 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 38.229.188.186 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 38.229.191.189 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 46.244.21.4 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 50.21.181.152 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 50.63.202.35 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 52.5.245.208 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 64.71.166.50 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 64.71.188.178 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 67.215.255.139 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 74.200.48.169 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 74.208.153.9 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 74.208.164.166 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 74.208.64.191 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 85.17.31.122 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 85.17.31.82 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 87.106.18.146 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 87.106.149.145 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 87.106.149.153 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 87.106.18.112 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 87.106.18.141 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 87.106.190.153 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 87.106.190.154 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 87.106.190.157 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 87.106.20.192 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 87.106.24.200 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 87.106.253.18 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 87.106.26.9 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 95.211.230.75 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 104.42.225.122 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 104.244.14.252 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 109.70.26.37 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 144.217.74.156 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 146.148.124.166 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 148.81.111.111 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 151.80.148.103 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 176.58.104.168 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 178.162.203.202 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 178.162.203.211 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 178.162.203.226 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 178.162.217.107 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 184.105.76.250 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 184.105.192.2 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 192.0.72.20 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 192.0.72.21 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 192.169.69.25 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 192.42.116.41 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 192.42.119.41 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 193.166.255.170 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 193.166.255.171 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 204.11.56.48 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 208.91.197.46 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 212.227.20.93 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 212.227.20.116 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 212.227.20.164 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 213.165.83.176 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 216.218.135.114 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 216.218.185.162 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 216.218.208.114 reject-with icmp-port-unreachable
0 0 REJECT 0 -- * * 0.0.0.0/0 216.66.15.109 reject-with icmp-port-unreachable
0 0 ACCEPT 6 -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:706
0 0 ACCEPT 17 -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:706
0 0 ACCEPT 6 -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:5432
0 0 ACCEPT 17 -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:5432
0 0 ACCEPT 6 -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpts:2082:2083
0 0 ACCEPT 17 -- * * 0.0.0.0/0 0.0.0.0/0 udp dpts:2082:2083
0 0 ACCEPT 6 -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpts:8232:8233
0 0 ACCEPT 17 -- * * 0.0.0.0/0 0.0.0.0/0 udp dpts:8232:8233
0 0 ACCEPT 6 -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:1500
0 0 ACCEPT 17 -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:1500
0 0 ACCEPT 6 -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:123
0 0 ACCEPT 17 -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:123
0 0 ACCEPT 6 -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:1293
0 0 ACCEPT 17 -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:1293
0 0 ACCEPT 6 -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:11371
0 0 ACCEPT 17 -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:11371
0 0 ACCEPT 6 -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:443
0 0 ACCEPT 17 -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:443
0 0 ACCEPT 6 -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:110
0 0 ACCEPT 17 -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:110
0 0 ACCEPT 6 -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:1194
0 0 ACCEPT 17 -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:1194
0 0 ACCEPT 6 -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:3074
0 0 ACCEPT 17 -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:3074
0 0 ACCEPT 6 -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:1521
0 0 ACCEPT 17 -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:1521
0 0 ACCEPT 6 -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:2049
0 0 ACCEPT 17 -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:2049
0 0 ACCEPT 6 -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:88
0 0 ACCEPT 17 -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:88
0 0 ACCEPT 6 -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:995
0 0 ACCEPT 17 -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:995
0 0 ACCEPT 6 -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:5050
0 0 ACCEPT 17 -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:5050
0 0 ACCEPT 6 -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:43
0 0 ACCEPT 17 -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:43
0 0 ACCEPT 6 -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:991
0 0 ACCEPT 17 -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:991
0 0 ACCEPT 6 -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:143
0 0 ACCEPT 17 -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:143
0 0 ACCEPT 6 -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:5228
0 0 ACCEPT 17 -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:5228
0 0 ACCEPT 6 -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:445
0 0 ACCEPT 17 -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:445
0 0 ACCEPT 6 -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:1755
0 0 ACCEPT 17 -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:1755
0 0 ACCEPT 6 -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:993
0 0 ACCEPT 17 -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:993
0 0 ACCEPT 6 -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:9001
0 0 ACCEPT 17 -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:9001
0 0 ACCEPT 6 -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpts:5222:5223
0 0 ACCEPT 17 -- * * 0.0.0.0/0 0.0.0.0/0 udp dpts:5222:5223
0 0 ACCEPT 6 -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpts:20:21
0 0 ACCEPT 17 -- * * 0.0.0.0/0 0.0.0.0/0 udp dpts:20:21
0 0 ACCEPT 6 -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpts:60000:61000
0 0 ACCEPT 17 -- * * 0.0.0.0/0 0.0.0.0/0 udp dpts:60000:61000
0 0 ACCEPT 6 -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpts:2102:2104
0 0 ACCEPT 17 -- * * 0.0.0.0/0 0.0.0.0/0 udp dpts:2102:2104
0 0 ACCEPT 6 -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:873
0 0 ACCEPT 17 -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:873
0 0 ACCEPT 6 -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpts:27000:27050
0 0 ACCEPT 17 -- * * 0.0.0.0/0 0.0.0.0/0 udp dpts:27000:27050
0 0 ACCEPT 6 -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:9418
0 0 ACCEPT 17 -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:9418
0 0 ACCEPT 6 -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:1863
0 0 ACCEPT 17 -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:1863
0 0 ACCEPT 6 -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpts:8087:8088
0 0 ACCEPT 17 -- * * 0.0.0.0/0 0.0.0.0/0 udp dpts:8087:8088
0 0 ACCEPT 6 -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:9030
0 0 ACCEPT 17 -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:9030
0 0 ACCEPT 6 -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:4643
0 0 ACCEPT 17 -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:4643
0 0 ACCEPT 6 -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:9339
0 0 ACCEPT 17 -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:9339
0 0 ACCEPT 6 -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpts:902:904
0 0 ACCEPT 17 -- * * 0.0.0.0/0 0.0.0.0/0 udp dpts:902:904
0 0 ACCEPT 6 -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:1533
0 0 ACCEPT 17 -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:1533
0 0 ACCEPT 6 -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpts:2095:2096
0 0 ACCEPT 17 -- * * 0.0.0.0/0 0.0.0.0/0 udp dpts:2095:2096
0 0 ACCEPT 6 -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:5190
0 0 ACCEPT 17 -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:5190
0 0 ACCEPT 6 -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:749
0 0 ACCEPT 17 -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:749
0 0 ACCEPT 6 -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:4321
0 0 ACCEPT 17 -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:4321
0 0 ACCEPT 6 -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:10000
0 0 ACCEPT 17 -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:10000
0 0 ACCEPT 6 -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:53
0 0 ACCEPT 17 -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:53
0 0 ACCEPT 6 -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:19294
0 0 ACCEPT 17 -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:19294
0 0 ACCEPT 6 -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:220
0 0 ACCEPT 17 -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:220
0 0 ACCEPT 6 -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpts:8332:8333
0 0 ACCEPT 17 -- * * 0.0.0.0/0 0.0.0.0/0 udp dpts:8332:8333
0 0 ACCEPT 6 -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:64738
0 0 ACCEPT 17 -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:64738
0 0 ACCEPT 6 -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:1723
0 0 ACCEPT 17 -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:1723
0 0 ACCEPT 6 -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:8443
0 0 ACCEPT 17 -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:8443
0 0 ACCEPT 6 -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:8888
0 0 ACCEPT 17 -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:8888
0 0 ACCEPT 6 -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpts:2086:2087
0 0 ACCEPT 17 -- * * 0.0.0.0/0 0.0.0.0/0 udp dpts:2086:2087
0 0 ACCEPT 6 -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:9735
0 0 ACCEPT 17 -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:9735
0 0 ACCEPT 6 -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:554
0 0 ACCEPT 17 -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:554
0 0 ACCEPT 6 -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:853
0 0 ACCEPT 17 -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:853
0 0 ACCEPT 6 -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
0 0 ACCEPT 17 -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:22
0 0 ACCEPT 6 -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:8082
0 0 ACCEPT 17 -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:8082
0 0 ACCEPT 6 -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:992
0 0 ACCEPT 17 -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:992
0 0 ACCEPT 6 -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:25565
0 0 ACCEPT 17 -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:25565
0 0 ACCEPT 6 -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:3690
0 0 ACCEPT 17 -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:3690
0 0 ACCEPT 6 -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:464
0 0 ACCEPT 17 -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:464
0 0 ACCEPT 6 -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:981
0 0 ACCEPT 17 -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:981
0 0 ACCEPT 6 -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:9053
0 0 ACCEPT 17 -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:9053
0 0 ACCEPT 6 -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:50002
0 0 ACCEPT 17 -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:50002
0 0 ACCEPT 6 -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:9443
0 0 ACCEPT 17 -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:9443
0 0 ACCEPT 6 -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:389
0 0 ACCEPT 17 -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:389
0 0 ACCEPT 6 -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpts:80:81
0 0 ACCEPT 17 -- * * 0.0.0.0/0 0.0.0.0/0 udp dpts:80:81
0 0 ACCEPT 6 -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:27017
0 0 ACCEPT 17 -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:27017
0 0 ACCEPT 6 -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpts:5000:5005
0 0 ACCEPT 17 -- * * 0.0.0.0/0 0.0.0.0/0 udp dpts:5000:5005
0 0 ACCEPT 6 -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:1433
0 0 ACCEPT 17 -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:1433
0 0 ACCEPT 6 -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:8883
0 0 ACCEPT 17 -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:8883
0 0 ACCEPT 6 -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:3306
0 0 ACCEPT 17 -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:3306
0 0 ACCEPT 6 -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:8767
0 0 ACCEPT 17 -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:8767
0 0 ACCEPT 6 -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:1677
0 0 ACCEPT 17 -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:1677
0 0 ACCEPT 6 -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:19638
0 0 ACCEPT 17 -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:19638
0 0 ACCEPT 6 -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:1220
0 0 ACCEPT 17 -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:1220
0 0 ACCEPT 6 -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:79
0 0 ACCEPT 17 -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:79
0 0 ACCEPT 6 -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpts:989:990
0 0 ACCEPT 17 -- * * 0.0.0.0/0 0.0.0.0/0 udp dpts:989:990
0 0 ACCEPT 6 -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:636
0 0 ACCEPT 17 -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:636
0 0 REJECT 0 -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
IPv6 Chain:
Chain NYM-EXIT (1 references)
pkts bytes target prot opt in out source destination
0 0 ACCEPT 6 -- * * ::/0 ::/0 tcp dpt:706
0 0 ACCEPT 17 -- * * ::/0 ::/0 udp dpt:706
0 0 ACCEPT 6 -- * * ::/0 ::/0 tcp dpt:5432
0 0 ACCEPT 17 -- * * ::/0 ::/0 udp dpt:5432
0 0 ACCEPT 6 -- * * ::/0 ::/0 tcp dpts:2082:2083
0 0 ACCEPT 17 -- * * ::/0 ::/0 udp dpts:2082:2083
0 0 ACCEPT 6 -- * * ::/0 ::/0 tcp dpts:8232:8233
0 0 ACCEPT 17 -- * * ::/0 ::/0 udp dpts:8232:8233
0 0 ACCEPT 6 -- * * ::/0 ::/0 tcp dpt:1500
0 0 ACCEPT 17 -- * * ::/0 ::/0 udp dpt:1500
0 0 ACCEPT 6 -- * * ::/0 ::/0 tcp dpt:123
0 0 ACCEPT 17 -- * * ::/0 ::/0 udp dpt:123
0 0 ACCEPT 6 -- * * ::/0 ::/0 tcp dpt:1293
0 0 ACCEPT 17 -- * * ::/0 ::/0 udp dpt:1293
0 0 ACCEPT 6 -- * * ::/0 ::/0 tcp dpt:11371
0 0 ACCEPT 17 -- * * ::/0 ::/0 udp dpt:11371
0 0 ACCEPT 6 -- * * ::/0 ::/0 tcp dpt:443
0 0 ACCEPT 17 -- * * ::/0 ::/0 udp dpt:443
0 0 ACCEPT 6 -- * * ::/0 ::/0 tcp dpt:110
0 0 ACCEPT 17 -- * * ::/0 ::/0 udp dpt:110
0 0 ACCEPT 6 -- * * ::/0 ::/0 tcp dpt:1194
0 0 ACCEPT 17 -- * * ::/0 ::/0 udp dpt:1194
0 0 ACCEPT 6 -- * * ::/0 ::/0 tcp dpt:3074
0 0 ACCEPT 17 -- * * ::/0 ::/0 udp dpt:3074
0 0 ACCEPT 6 -- * * ::/0 ::/0 tcp dpt:1521
0 0 ACCEPT 17 -- * * ::/0 ::/0 udp dpt:1521
0 0 ACCEPT 6 -- * * ::/0 ::/0 tcp dpt:2049
0 0 ACCEPT 17 -- * * ::/0 ::/0 udp dpt:2049
0 0 ACCEPT 6 -- * * ::/0 ::/0 tcp dpt:88
0 0 ACCEPT 17 -- * * ::/0 ::/0 udp dpt:88
0 0 ACCEPT 6 -- * * ::/0 ::/0 tcp dpt:995
0 0 ACCEPT 17 -- * * ::/0 ::/0 udp dpt:995
0 0 ACCEPT 6 -- * * ::/0 ::/0 tcp dpt:5050
0 0 ACCEPT 17 -- * * ::/0 ::/0 udp dpt:5050
0 0 ACCEPT 6 -- * * ::/0 ::/0 tcp dpt:43
0 0 ACCEPT 17 -- * * ::/0 ::/0 udp dpt:43
0 0 ACCEPT 6 -- * * ::/0 ::/0 tcp dpt:991
0 0 ACCEPT 17 -- * * ::/0 ::/0 udp dpt:991
0 0 ACCEPT 6 -- * * ::/0 ::/0 tcp dpt:143
0 0 ACCEPT 17 -- * * ::/0 ::/0 udp dpt:143
0 0 ACCEPT 6 -- * * ::/0 ::/0 tcp dpt:5228
0 0 ACCEPT 17 -- * * ::/0 ::/0 udp dpt:5228
0 0 ACCEPT 6 -- * * ::/0 ::/0 tcp dpt:445
0 0 ACCEPT 17 -- * * ::/0 ::/0 udp dpt:445
0 0 ACCEPT 6 -- * * ::/0 ::/0 tcp dpt:1755
0 0 ACCEPT 17 -- * * ::/0 ::/0 udp dpt:1755
0 0 ACCEPT 6 -- * * ::/0 ::/0 tcp dpt:993
0 0 ACCEPT 17 -- * * ::/0 ::/0 udp dpt:993
0 0 ACCEPT 6 -- * * ::/0 ::/0 tcp dpt:9001
0 0 ACCEPT 17 -- * * ::/0 ::/0 udp dpt:9001
0 0 ACCEPT 6 -- * * ::/0 ::/0 tcp dpts:5222:5223
0 0 ACCEPT 17 -- * * ::/0 ::/0 udp dpts:5222:5223
0 0 ACCEPT 6 -- * * ::/0 ::/0 tcp dpts:20:21
0 0 ACCEPT 17 -- * * ::/0 ::/0 udp dpts:20:21
0 0 ACCEPT 6 -- * * ::/0 ::/0 tcp dpts:60000:61000
0 0 ACCEPT 17 -- * * ::/0 ::/0 udp dpts:60000:61000
0 0 ACCEPT 6 -- * * ::/0 ::/0 tcp dpts:2102:2104
0 0 ACCEPT 17 -- * * ::/0 ::/0 udp dpts:2102:2104
0 0 ACCEPT 6 -- * * ::/0 ::/0 tcp dpt:873
0 0 ACCEPT 17 -- * * ::/0 ::/0 udp dpt:873
0 0 ACCEPT 6 -- * * ::/0 ::/0 tcp dpts:27000:27050
0 0 ACCEPT 17 -- * * ::/0 ::/0 udp dpts:27000:27050
0 0 ACCEPT 6 -- * * ::/0 ::/0 tcp dpt:9418
0 0 ACCEPT 17 -- * * ::/0 ::/0 udp dpt:9418
0 0 ACCEPT 6 -- * * ::/0 ::/0 tcp dpt:1863
0 0 ACCEPT 17 -- * * ::/0 ::/0 udp dpt:1863
0 0 ACCEPT 6 -- * * ::/0 ::/0 tcp dpts:8087:8088
0 0 ACCEPT 17 -- * * ::/0 ::/0 udp dpts:8087:8088
0 0 ACCEPT 6 -- * * ::/0 ::/0 tcp dpt:9030
0 0 ACCEPT 17 -- * * ::/0 ::/0 udp dpt:9030
0 0 ACCEPT 6 -- * * ::/0 ::/0 tcp dpt:4643
0 0 ACCEPT 17 -- * * ::/0 ::/0 udp dpt:4643
0 0 ACCEPT 6 -- * * ::/0 ::/0 tcp dpt:9339
0 0 ACCEPT 17 -- * * ::/0 ::/0 udp dpt:9339
0 0 ACCEPT 6 -- * * ::/0 ::/0 tcp dpts:902:904
0 0 ACCEPT 17 -- * * ::/0 ::/0 udp dpts:902:904
0 0 ACCEPT 6 -- * * ::/0 ::/0 tcp dpt:1533
0 0 ACCEPT 17 -- * * ::/0 ::/0 udp dpt:1533
0 0 ACCEPT 6 -- * * ::/0 ::/0 tcp dpts:5222:5223
0 0 ACCEPT 17 -- * * ::/0 ::/0 udp dpts:5222:5223
0 0 ACCEPT 6 -- * * ::/0 ::/0 tcp dpts:20:21
0 0 ACCEPT 17 -- * * ::/0 ::/0 udp dpts:20:21
0 0 ACCEPT 6 -- * * ::/0 ::/0 tcp dpts:60000:61000
0 0 ACCEPT 17 -- * * ::/0 ::/0 udp dpts:60000:61000
0 0 ACCEPT 6 -- * * ::/0 ::/0 tcp dpts:2102:2104
0 0 ACCEPT 17 -- * * ::/0 ::/0 udp dpts:2102:2104
0 0 ACCEPT 6 -- * * ::/0 ::/0 tcp dpt:873
0 0 ACCEPT 17 -- * * ::/0 ::/0 udp dpt:873
0 0 ACCEPT 6 -- * * ::/0 ::/0 tcp dpts:27000:27050
0 0 ACCEPT 17 -- * * ::/0 ::/0 udp dpts:27000:27050
0 0 ACCEPT 6 -- * * ::/0 ::/0 tcp dpt:9418
0 0 ACCEPT 17 -- * * ::/0 ::/0 udp dpt:9418
0 0 ACCEPT 6 -- * * ::/0 ::/0 tcp dpt:1863
0 0 ACCEPT 17 -- * * ::/0 ::/0 udp dpt:1863
0 0 ACCEPT 6 -- * * ::/0 ::/0 tcp dpts:8087:8088
0 0 ACCEPT 17 -- * * ::/0 ::/0 udp dpts:8087:8088
0 0 ACCEPT 6 -- * * ::/0 ::/0 tcp dpt:9030
0 0 ACCEPT 17 -- * * ::/0 ::/0 udp dpt:9030
0 0 ACCEPT 6 -- * * ::/0 ::/0 tcp dpt:4643
0 0 ACCEPT 17 -- * * ::/0 ::/0 udp dpt:4643
0 0 ACCEPT 6 -- * * ::/0 ::/0 tcp dpt:9339
0 0 ACCEPT 17 -- * * ::/0 ::/0 udp dpt:9339
0 0 ACCEPT 6 -- * * ::/0 ::/0 tcp dpts:902:904
0 0 ACCEPT 17 -- * * ::/0 ::/0 udp dpts:902:904
0 0 ACCEPT 6 -- * * ::/0 ::/0 tcp dpt:1533
0 0 ACCEPT 17 -- * * ::/0 ::/0 udp dpt:1533
0 0 ACCEPT 6 -- * * ::/0 ::/0 tcp dpts:2095:2096
0 0 ACCEPT 17 -- * * ::/0 ::/0 udp dpts:2095:2096
0 0 ACCEPT 6 -- * * ::/0 ::/0 tcp dpt:5190
0 0 ACCEPT 17 -- * * ::/0 ::/0 udp dpt:5190
0 0 ACCEPT 6 -- * * ::/0 ::/0 tcp dpt:749
0 0 ACCEPT 17 -- * * ::/0 ::/0 udp dpt:749
0 0 ACCEPT 6 -- * * ::/0 ::/0 tcp dpt:4321
0 0 ACCEPT 17 -- * * ::/0 ::/0 udp dpt:4321
0 0 ACCEPT 6 -- * * ::/0 ::/0 tcp dpt:10000
0 0 ACCEPT 17 -- * * ::/0 ::/0 udp dpt:10000
0 0 ACCEPT 6 -- * * ::/0 ::/0 tcp dpt:53
0 0 ACCEPT 17 -- * * ::/0 ::/0 udp dpt:53
0 0 ACCEPT 6 -- * * ::/0 ::/0 tcp dpt:19294
0 0 ACCEPT 17 -- * * ::/0 ::/0 udp dpt:19294
0 0 ACCEPT 6 -- * * ::/0 ::/0 tcp dpt:220
0 0 ACCEPT 17 -- * * ::/0 ::/0 udp dpt:220
0 0 ACCEPT 6 -- * * ::/0 ::/0 tcp dpts:8332:8333
0 0 ACCEPT 17 -- * * ::/0 ::/0 udp dpts:8332:8333
0 0 ACCEPT 6 -- * * ::/0 ::/0 tcp dpt:64738
0 0 ACCEPT 17 -- * * ::/0 ::/0 udp dpt:64738
0 0 ACCEPT 6 -- * * ::/0 ::/0 tcp dpt:1723
0 0 ACCEPT 17 -- * * ::/0 ::/0 udp dpt:1723
0 0 ACCEPT 6 -- * * ::/0 ::/0 tcp dpt:8443
0 0 ACCEPT 17 -- * * ::/0 ::/0 udp dpt:8443
0 0 ACCEPT 6 -- * * ::/0 ::/0 tcp dpt:8888
0 0 ACCEPT 17 -- * * ::/0 ::/0 udp dpt:8888
0 0 ACCEPT 6 -- * * ::/0 ::/0 tcp dpts:2086:2087
0 0 ACCEPT 17 -- * * ::/0 ::/0 udp dpts:2086:2087
0 0 ACCEPT 6 -- * * ::/0 ::/0 tcp dpt:9735
0 0 ACCEPT 17 -- * * ::/0 ::/0 udp dpt:9735
0 0 ACCEPT 6 -- * * ::/0 ::/0 tcp dpt:554
0 0 ACCEPT 17 -- * * ::/0 ::/0 udp dpt:554
0 0 ACCEPT 6 -- * * ::/0 ::/0 tcp dpt:853
0 0 ACCEPT 17 -- * * ::/0 ::/0 udp dpt:853
0 0 ACCEPT 6 -- * * ::/0 ::/0 tcp dpt:22
0 0 ACCEPT 17 -- * * ::/0 ::/0 udp dpt:22
0 0 ACCEPT 6 -- * * ::/0 ::/0 tcp dpt:8082
0 0 ACCEPT 17 -- * * ::/0 ::/0 udp dpt:8082
0 0 ACCEPT 6 -- * * ::/0 ::/0 tcp dpt:992
0 0 ACCEPT 17 -- * * ::/0 ::/0 udp dpt:992
0 0 ACCEPT 6 -- * * ::/0 ::/0 tcp dpt:25565
0 0 ACCEPT 17 -- * * ::/0 ::/0 udp dpt:25565
0 0 ACCEPT 6 -- * * ::/0 ::/0 tcp dpt:3690
0 0 ACCEPT 17 -- * * ::/0 ::/0 udp dpt:3690
0 0 ACCEPT 6 -- * * ::/0 ::/0 tcp dpt:464
0 0 ACCEPT 17 -- * * ::/0 ::/0 udp dpt:464
0 0 ACCEPT 6 -- * * ::/0 ::/0 tcp dpt:981
0 0 ACCEPT 17 -- * * ::/0 ::/0 udp dpt:981
0 0 ACCEPT 6 -- * * ::/0 ::/0 tcp dpt:9053
0 0 ACCEPT 17 -- * * ::/0 ::/0 udp dpt:9053
0 0 ACCEPT 6 -- * * ::/0 ::/0 tcp dpt:50002
0 0 ACCEPT 17 -- * * ::/0 ::/0 udp dpt:50002
0 0 ACCEPT 6 -- * * ::/0 ::/0 tcp dpt:9443
0 0 ACCEPT 17 -- * * ::/0 ::/0 udp dpt:9443
0 0 ACCEPT 6 -- * * ::/0 ::/0 tcp dpt:389
0 0 ACCEPT 17 -- * * ::/0 ::/0 udp dpt:389
0 0 ACCEPT 6 -- * * ::/0 ::/0 tcp dpts:80:81
0 0 ACCEPT 17 -- * * ::/0 ::/0 udp dpts:80:81
0 0 ACCEPT 6 -- * * ::/0 ::/0 tcp dpt:27017
0 0 ACCEPT 17 -- * * ::/0 ::/0 udp dpt:27017
0 0 ACCEPT 6 -- * * ::/0 ::/0 tcp dpts:5000:5005
0 0 ACCEPT 17 -- * * ::/0 ::/0 udp dpts:5000:5005
0 0 ACCEPT 6 -- * * ::/0 ::/0 tcp dpt:1433
0 0 ACCEPT 17 -- * * ::/0 ::/0 udp dpt:1433
0 0 ACCEPT 6 -- * * ::/0 ::/0 tcp dpt:8883
0 0 ACCEPT 17 -- * * ::/0 ::/0 udp dpt:8883
0 0 ACCEPT 6 -- * * ::/0 ::/0 tcp dpt:3306
0 0 ACCEPT 17 -- * * ::/0 ::/0 udp dpt:3306
0 0 ACCEPT 6 -- * * ::/0 ::/0 tcp dpt:8767
0 0 ACCEPT 17 -- * * ::/0 ::/0 udp dpt:8767
0 0 ACCEPT 6 -- * * ::/0 ::/0 tcp dpt:1677
0 0 ACCEPT 17 -- * * ::/0 ::/0 udp dpt:1677
0 0 ACCEPT 6 -- * * ::/0 ::/0 tcp dpt:19638
0 0 ACCEPT 17 -- * * ::/0 ::/0 udp dpt:19638
0 0 ACCEPT 6 -- * * ::/0 ::/0 tcp dpt:1220
0 0 ACCEPT 17 -- * * ::/0 ::/0 udp dpt:1220
0 0 ACCEPT 6 -- * * ::/0 ::/0 tcp dpt:79
0 0 ACCEPT 17 -- * * ::/0 ::/0 udp dpt:79
0 0 ACCEPT 6 -- * * ::/0 ::/0 tcp dpts:989:990
0 0 ACCEPT 17 -- * * ::/0 ::/0 udp dpts:989:990
0 0 ACCEPT 6 -- * * ::/0 ::/0 tcp dpt:636
0 0 ACCEPT 17 -- * * ::/0 ::/0 udp dpt:636
0 0 REJECT 0 -- * * ::/0 ::/0 reject-with icmp6-port-unreachable
ESC[0;33mIP Forwarding:ESC[0m
IPv4: 1
IPv6: 1
```
@@ -0,0 +1,47 @@
```console
Running Nym Exit Policy Verification Tests...
Testing Port Range Rules...
Testing FTP tcp port range 20-21
✓ Rule exists: NYM-EXIT tcp port range 20:21
Testing HTTP tcp port range 80-81
✓ Rule exists: NYM-EXIT tcp port range 80:81
Testing CPanel tcp port range 2082-2083
✓ Rule exists: NYM-EXIT tcp port range 2082:2083
Testing XMPP tcp port range 5222-5223
✓ Rule exists: NYM-EXIT tcp port range 5222:5223
Testing Steam (sampling) tcp port range 27000-27050
✓ Rule exists: NYM-EXIT tcp port range 27000:27050
Testing FTP over TLS tcp port range 989-990
✓ Rule exists: NYM-EXIT tcp port range 989:990
Testing RTP/VoIP tcp port range 5000-5005
✓ Rule exists: NYM-EXIT tcp port range 5000:5005
Testing Simplify Media tcp port range 8087-8088
✓ Rule exists: NYM-EXIT tcp port range 8087:8088
Testing Zcash tcp port range 8232-8233
✓ Rule exists: NYM-EXIT tcp port range 8232:8233
Testing Bitcoin tcp port range 8332-8333
✓ Rule exists: NYM-EXIT tcp port range 8332:8333
Test test_port_range_rules PASSED
Testing Critical Service Rules...
✓ Rule exists: NYM-EXIT tcp port 22
✓ Rule exists: NYM-EXIT tcp port 53
✓ Rule exists: NYM-EXIT tcp port 443
✓ Rule exists: NYM-EXIT tcp port 853
✓ Rule exists: NYM-EXIT tcp port 1194
✓ Rule exists: NYM-EXIT udp port 53
✓ Rule exists: NYM-EXIT udp port 123
✓ Rule exists: NYM-EXIT udp port 1194
Relevant existing rules for HTTP (port 80):
Test test_critical_services PASSED
This test takes some time, do not quit the process
Testing Default Reject Rule...
✓ Default REJECT rule exists
Test test_default_reject_rule PASSED
Test Summary:
Total Tests: 3
Failures: 0
All Tests Passed Successfully!
```
@@ -0,0 +1,9 @@
- Install these dependencies on your local machine:
```shell
sudo apt install tcpdump
sudo tcpdump -i nymwg -n
```
- Connect to [NymVPN](https://nym.com) and select your node as an Exit Gateway (after running the exit policy [manager script](#wireguard-exit-policy-configuration))
- Run the `tcpdump` command before registering
- Have the output of the `echo $BLOCKED_IP` from your node and try to go into your browser or a registered client and try to connect - It will not resolve.
@@ -0,0 +1,11 @@
Run this command to define variable `BLOCKED_IP` and try to `ping` it:
```shell
BLOCKED_IP=$(grep "ExitPolicy reject" /etc/nym/exit-policy.txt | head -1 | sed -E 's/ExitPolicy reject ([^:]+):.*/\1/' | sed 's/\/.*$//')
ping -c 3 $BLOCKED_IP
```
You should see `100% packet loss` as an outcome.
```shell
telnet $BLOCKED_IP 80
```
You should see `telnet: Unable to connect to remote host: Connection timed out`.
@@ -1 +1 @@
Tuesday, March 11th 2025, 11:04:18 UTC
Wednesday, March 19th 2025, 18:56:53 UTC
+1 -1
View File
@@ -45,7 +45,7 @@
"chain-registry": "^1.19.0",
"cosmjs-types": "^0.9.0",
"lucide-react": "^0.438.0",
"next": "^13.4.19",
"next": "^14.2.15",
"nextra": "2",
"nextra-theme-docs": "2",
"react": "^18.2.0",
@@ -1,7 +1,7 @@
# Explorer API
The Explorer API is the backend for the [Mixnet Explorer](https://explorer.nymtech.net/).
The Explorer API is the backend for the [Mixnet Explorer](https://nym.com/explorer).
**This will soon be deprecated in favour of the [Node Status API](ns-api.mdx).**
@@ -9,7 +9,7 @@ The Node Status API is made up of 3 components:
- `nym-node-status-client`
- `nym-node-status-agent`
The API stores its data in a local SQLite database. It periodically gets most of its data from a [NymAPI](./nym-api) instance, and for instances also running with the Gateway Probe, uses the stored topology to conduct performance probe tests.
The API stores its data in a local SQLite database. It periodically gets most of its data from a [NymAPI](../nym-api) instance, and for instances also running with the Gateway Probe, uses the stored topology to conduct performance probe tests.
## Gateway Probe
You can run the `nym-node-status-api` alone, but if you want to run probes for `nym-node`s running as Gateways, you have to also run the `nym-node-status-agent` (which consumes the `nym-node-status-client` lib). The probe will run a set of tests per Gateway node, and return the sort of results seen [here](https://harbourmaster.nymtech.net/gateway/23A7CSaBSA2L67PWuFTPXUnYrCdyVcB7ATYsjUsfdftb).
@@ -30,7 +30,7 @@ The `--id` in the example above is a local identifier so that you can name your
The `--use-reply-surbs` field denotes whether you wish to send [SURBs](../../network/concepts/anonymous-replies) along with your request. It defaults to `false`, we are explicitly setting it as `true`. It defaults to `false` for compatibility with versions of the pre-smoosh `nym-network-requester` binary which will soon be deprecated.
The `--provider` field needs to be filled with the Nym address of an Exit Gateway that can make network requests on your behalf. You can select one from the [mixnet explorer](https://explorer.nymtech.net/network-components/gateways) by copying its `Client ID` and using this as the value of the `--provider` flag. Alternatively, you could use [Harbourmaster](https://harbourmaster.nymtech.net/).
The `--provider` field needs to be filled with the Nym address of an Exit Gateway that can make network requests on your behalf. You can select one from the [mixnet explorer](https://nym.com/explorer) by copying its `Client ID` and using this as the value of the `--provider` flag. Alternatively, you could use [Harbourmaster](https://harbourmaster.nymtech.net/).
## Choosing a Gateway
By default - as in the example above - your client will choose a random gateway to connect to.
@@ -42,6 +42,6 @@ However, there are several options for choosing a gateway, if you do not want on
* send few ping messages to all of them, and measure response times.
* create a weighted distribution to randomly choose one, favouring ones with lower latency.
You can select one from the [mixnet explorer](https://explorer.nymtech.net/network-components/gateways) by copying its `Client ID` and using this as the value of the `--provider` flag. Alternatively, you could use [Harbourmaster](https://harbourmaster.nymtech.net/).
You can select one from the [mixnet explorer](https://nym.com/explorer) by copying its `Client ID` and using this as the value of the `--provider` flag. Alternatively, you could use [Harbourmaster](https://harbourmaster.nymtech.net/).
> Note this doesn't mean that your client will pick the closest gateway to you, but it will be far more likely to connect to gateway with a 20ms ping rather than 200ms
@@ -31,7 +31,7 @@ Initialising a new client instance can be done with the following command:
The `--id` in the example above is a local identifier so that you can name your clients; it is **never** transmitted over the network.
There is an optional `--gateway` flag that you can use if you want to use a specific gateway. The supplied argument is the `Identity Key` of the gateway you wish to use, which can be found on the [mixnet explorer](https://explorer.nymtech.net/network-components/gateways). Alternatively, you could use [Harbourmaster](https://harbourmaster.nymtech.net/)
There is an optional `--gateway` flag that you can use if you want to use a specific gateway. The supplied argument is the `Identity Key` of the gateway you wish to use, which can be found on the [mixnet explorer](https://nym.com/explorer). Alternatively, you could use [Harbourmaster](https://harbourmaster.nymtech.net/)
Not passing this argument will randomly select a gateway for your client.
@@ -19,4 +19,4 @@ To illustrate this: `DpB3cHAchJiNBQi5FrZx2csXb1mrHkpYh9Wzf8Rjsuko.ANNWrvHqMYuert
- `DpB3cHAchJiNBQi5FrZx2csXb1mrHkpYh9Wzf8Rjsuko`: is the client's identity key;
- `ANNWrvHqMYuertHGHUrZdBntQhpzfbWekB39qez9U2Vx`: is the client's Diffie Hellman key;
- `2BuMSfMW3zpeAjKXyKLhmY4QW1DXurrtSPEJ6CjX3SEh`: is the gateway's identity, which is what you'll need to check the state of the gateway in the [Nym Explorer](https://explorer.nymtech.net/network-components/gateways).
- `2BuMSfMW3zpeAjKXyKLhmY4QW1DXurrtSPEJ6CjX3SEh`: is the gateway's identity, which is what you'll need to check the state of the gateway in the [Nym Explorer](https://nym.com/explorer).
@@ -5,7 +5,7 @@
"variables": "Variables & Parameters",
"sandbox": "Sandbox Testnet",
"binaries": "Binaries",
"nodes": "Operator Guides",
"nodes": "Nodes & Validators Guides",
"troubleshooting": "Troubleshooting",
"tokenomics": "Tokenomics",
"faq": "FAQ",
@@ -47,6 +47,186 @@ This page displays a full list of all the changes during our release cycle from
<VarInfo />
## `v2025.5-chokito`
- [Release Binaries](https://github.com/nymtech/nym/releases/tag/nym-binaries-v2025.5-chokito)
- [`nym-node`](nodes/nym-node.mdx) version `1.7.0`
```shell
nym-node
Binary Name: nym-node
Build Timestamp: 2025-03-18T12:17:10.782554174Z
Build Version: 1.7.0
Commit SHA: 82e82943aa14e530ab4eb3aaab28ce86d47e5298
Commit Date: 2025-03-18T10:39:55.000000000+01:00
Commit Branch: HEAD
rustc Version: 1.85.0
rustc Channel: stable
cargo Profile: release
```
### Release Summary
1. WebSocket Connection Counter Fix (this is the fix for which we have a [pre-release branch](https://github.com/nymtech/nym/releases/tag/nym-binaries-v2025.4-dorina-nym-node-patch) out already which will be replaced by this release)
- Prevents incorrect session tracking for WebSockets
2. Security Fixes in Dependencies
- Address known security vulnerabilities, making updating highly recommended
3. Authorisation & Timestamp Changes
- Modifies how timestamps are validated in Auth v2 - this is going to be what the clients use. For example: the clients will start to use v2 variants of everything (prepping the network for the breaking change to come on April 1st which will force clients to only use v2).
4. Wireguard exit policy [scripts](https://github.com/nymtech/nym/tree/develop/scripts/wireguard-exit-policy)
### Operators Updates & Tools
- [**Wireguard exit policy is out!**](nodes/nym-node/configuration#wireguard-exit-policy-configuration) Operators can use a new guide with our scripts to setup wireguard exit policy using IP tables rules.
- [Setup commands for `nym-node` simplified](nodes/nym-node/setup#setup--run): `config.toml` defaults to correct binding addresses and ports, no need to specify unless operators want to change those values.
- [Virtualising dedicated server with KVM now includes IPv6 setup](nodes/preliminary-steps/vps-setup/advanced#installing-kvm-on-a-server-with-ubuntu-2204): Thanks to [LunarDAO](https://lunardao.net) squad we caught a missing IPv6 configuration in KVM installation guide. Operators can now run a bare metal or dedicated server and virtualise it into VMs each with a fully functional node, having all specs fully under control.
- [NTP time synchronization guide](nodes/preliminary-steps/vps-setup#2-synchronize-time-of-your-server): Some servers had an issue with incorrect time. Please use [this guide](nodes/preliminary-steps/vps-setup#2-synchronize-time-of-your-server) to update time on your server to synchronize your node operation with the rest of the network.
- [New community managed token page by SpectreDAO](https://explorer.nym.spectredao.net/token): Based on community request, one of the squad administrating several Nym Nodes created a live token dashboard [explorer.nym.spectredao.net/token](https://explorer.nym.spectredao.net/token).
### Features
- [Display error messages if IPv4 or IPv6 address not found on nymtun0](https://github.com/nymtech/nym/pull/5465): This is with regards to issue [\#5461](https://github.com/nymtech/nym/pull/5461)
- [Connection `fd` callback before actual connection](https://github.com/nymtech/nym/pull/5494)
- [Add extra args for the probe](https://github.com/nymtech/nym/pull/5499)
- [Use ct_eq for checking bearer token](https://github.com/nymtech/nym/pull/5501)
- [Update version in Cargo.toml](https://github.com/nymtech/nym/pull/5503)
- [Treat Gateways as Nym Nodes](https://github.com/nymtech/nym/pull/5504): entry/exit nodes are also scraped for description & packets mixed data. Generate a random moniker for nodes that don't have one set.
- [Bump the patch-updates group with 2 updates](https://github.com/nymtech/nym/pull/5505): [log](https://github.com/rust-lang/log) and [tar](https://github.com/alexcrichton/tar-rs).
- [Bump itertools from `0.13.0` to `0.14.0`](https://github.com/nymtech/nym/pull/5509): Bumps [itertools](https://github.com/rust-itertools/itertools).
- [Bump flate2 from `1.0.35` to `1.1.0`](https://github.com/nymtech/nym/pull/5510): Bumps [flate2](https://github.com/rust-lang/flate2-rs).
- [Make sure any terminated task kills the watcher and write run info to db](https://github.com/nymtech/nym/pull/5517)
- [Make "Memo" visible per default on send NYM](https://github.com/nymtech/nym/pull/5524)
- [Disallow routing mix packets to nodes not present in the topology](https://github.com/nymtech/nym/pull/5526)
- [Set `RUSTUP_PERMIT_COPY_RENAME`](https://github.com/nymtech/nym/pull/5533): Try to fix rustup issues on our self-hosted runners by setting `RUSTUP_PERMIT_COPY_RENAME`
- [v2 authentication request](https://github.com/nymtech/nym/pull/5537): This PR creates new v2 variant of client-gateway authentication message that increases protection against possible connection hijacking.
- [Bump `rs_merkle` from `1.4.2` to `1.5.0`](https://github.com/nymtech/nym/pull/5541): Bumps [rs_merkle](https://github.com/antouhou/rs-merkle)
- [Bump `uuid` from `1.13.2` to `1.15.1`](https://github.com/nymtech/nym/pull/5542): Bumps [`uuid`](https://github.com/uuid-rs/uuid)
- [Bump the `patch-updates` group across 1 directory with 14 updates](https://github.com/nymtech/nym/pull/5549):
| Package | From | To |
| --- | --- | --- |
| [`anyhow`](https://github.com/dtolnay/anyhow) | `1.0.96` | `1.0.97` |
| [`async-trait`](https://github.com/dtolnay/async-trait) | `0.1.86` | `0.1.87` |
| [`blake3`](https://github.com/BLAKE3-team/BLAKE3) | `1.6.0` | `1.6.1` |
| [`chrono`](https://github.com/chronotope/chrono) | `0.4.39` | `0.4.40` |
| [`clap`](https://github.com/clap-rs/clap) | `4.5.30` | `4.5.31` |
| [`clap_complete`](https://github.com/clap-rs/clap) | `4.5.45` | `4.5.46` |
| [`console`](https://github.com/console-rs/console) | `0.15.10` | `0.15.11` |
| [`getset`](https://github.com/jbaublitz/getset) | `0.1.4` | `0.1.5` |
| [`pin-project`](https://github.com/taiki-e/pin-project) | `1.1.9` | `1.1.10` |
| [`quote`](https://github.com/dtolnay/quote) | `1.0.38` | `1.0.39` |
| [`schemars`](https://github.com/GREsau/schemars) | `0.8.21` | `0.8.22` |
| [`serde_bytes`](https://github.com/serde-rs/bytes) | `0.11.15` | `0.11.16` |
| [`serde_json`](https://github.com/serde-rs/json) | `1.0.139` | `1.0.140` |
| [`thiserror`](https://github.com/dtolnay/thiserror) | `2.0.11` | `2.0.12` |
- [Start sending v2 sphinx packets](https://github.com/nymtech/nym/pull/5554)
- [Add /v3/nym-nodes](https://github.com/nymtech/nym/pull/5569): Returns extended node info from local DB
- Endpoint caching
- Add `bond_info` & `self_described` to DB `nym_nodes`
- Update mixnode & gateway bond status on data refresh
- Add `active` column to DB `nym_nodes`
- Use only active & bonded nodes in scraping/testrun tasks
- [Rust SDK SURB example: change hardcoded file to tempdir](https://github.com/nymtech/nym/pull/5576): Change hardcoded filepath for client to tempdir
- [Server Side internal DoT/DoH opt out](https://github.com/nymtech/nym/pull/5577): Allow server side (nodes and nym-api) to use nym-http-api-client without DoH/DoT resolver.
- [Delete double memo field in send modal](https://github.com/nymtech/nym/pull/5578)
- [Bump ring from `0.17.3` to `0.17.13` in /nym-wallet](https://github.com/nymtech/nym/pull/5582): Bumps [ring](https://github.com/briansmith/ring)
- [Bump the patch-updates group with 8 updates](https://github.com/nymtech/nym/pull/5585):
| Package | From | To |
| --- | --- | --- |
| [`bytes`](https://github.com/tokio-rs/bytes) | `1.10.0` | `1.10.1` |
| [`semver`](https://github.com/dtolnay/semver) | `1.0.25` | `1.0.26` |
| [`serde`](https://github.com/serde-rs/serde) | `1.0.218` | `1.0.219` |
| [`serde_bytes`](https://github.com/serde-rs/bytes) | `0.11.16` | `0.11.17` |
| [`serde_derive`](https://github.com/serde-rs/serde) | `1.0.218` | `1.0.219` |
| [`serde_repr`](https://github.com/dtolnay/serde-repr) | `0.1.19` | `0.1.20` |
| [`time`](https://github.com/time-rs/time) | `0.3.37` | `0.3.39` |
| [`ff`](https://github.com/zkcrypto/ff) | `0.13.0` | `0.13.1` |
- [Bump `tokio` from `1.43.0` to `1.44.0`](https://github.com/nymtech/nym/pull/5587): Bumps [tokio](https://github.com/tokio-rs/tokio)
- [Bump `tempfile` from `3.17.1` to `3.18.0`](https://github.com/nymtech/nym/pull/5588): Bumps [tempfile](https://github.com/Stebalien/tempfile)
- [Bump `webpack-dev-middleware` from `5.3.3` to `5.3.4` in `/wasm/zknym-lib/internal-dev]`(https://github.com/nymtech/nym/pull/5589): Bumps [webpack-dev-middleware](https://github.com/webpack/webpack-dev-middleware)
- [Bump `braces` from `3.0.2` to `3.0.3` in /wasm/zknym-lib/internal-dev](https://github.com/nymtech/nym/pull/5590): Bumps [braces](https://github.com/micromatch/braces)
- [Bump `cookie` and `express` in `/wasm/client/internal-dev`](https://github.com/nymtech/nym/pull/5592): Bumps [cookie](https://github.com/jshttp/cookie)
- [Bump `ws` from `8.13.0` to `8.18.1` in `/wasm/mix-fetch/internal-dev`](https://github.com/nymtech/nym/pull/5593): Bumps [ws](https://github.com/websockets/ws)
- [Bump `serve-static` and `express` in `/wasm/mix-fetch/internal-dev`](https://github.com/nymtech/nym/pull/5594): Bumps [serve-static](https://github.com/expressjs/serve-static)
- [Bump `body-parser` and express in `/wasm/mix-fetch/internal-dev`](https://github.com/nymtech/nym/pull/5596): Bumps [body-parser](https://github.com/expressjs/body-parser)
- [Bump `webpack` from `5.77.0` to `5.98.0` in /wasm/mix-fetch/internal-dev`](https://github.com/nymtech/nym/pull/5597): Bumps [webpack](https://github.com/webpack/webpack)
- [Introduce internal tool for checking signer status](https://github.com/nymtech/nym/pull/5598)
- [Allow resetting all `SURB` sender tags](https://github.com/nymtech/nym/pull/5600)
- [Chore/payment watcher debug endpoints](https://github.com/nymtech/nym/pull/5601)
- [Change `auth` v2 timestamp skew and allow values from the future](https://github.com/nymtech/nym/pull/5604)
- [Update bls12 381 fork](https://github.com/nymtech/nym/pull/5605)
- [Bump `@babel/helpers` from `7.24.4` to `7.26.10`](https://github.com/nymtech/nym/pull/5606): Bumps [@babel/helpers](https://github.com/babel/babel/tree/HEAD/packages/babel-helpers)
- [Chore/more payment watcher debug endpoints](https://github.com/nymtech/nym/pull/5608)
- [Export lane queue lengths in sdk](https://github.com/nymtech/nym/pull/5609): Export the lane queue length type to be able to implement backpressure outside of the sdk mixnet client
- [Bump `webpack-dev-middleware` from `5.3.3` to `5.3.4` in `/wasm/client/internal-dev`](https://github.com/nymtech/nym/pull/5610): Bumps [webpack-dev-middleware](https://github.com/webpack/webpack-dev-middleware)
- [Bump `braces` from `3.0.2` to `3.0.3` in `/sdk/typescript/packages/nodejs-client`](https://github.com/nymtech/nym/pull/5611): Bumps [braces](https://github.com/micromatch/braces)
- [Remove explorer-api from ci-build-binaries](https://github.com/nymtech/nym/pull/5616)
### Bugfix
- [`Cargo.lock` for contracts](https://github.com/nymtech/nym/pull/5489)
- [Fix stats bug & remove HM caching](https://github.com/nymtech/nym/pull/5495)
- [Fix `total_stake` on SQL update](https://github.com/nymtech/nym/pull/5514)
- [Another `total_stake` SQL fix](https://github.com/nymtech/nym/pull/5516)
- [Correctly increment `ws` connection counter](https://github.com/nymtech/nym/pull/5620)
## `v2025.4-dorina-patched`
Patched version of `dorina` with a few fixes and tweaks to the release. We would like to ask `nym-node` operators to upgrade to this version as quickly as possible to implement the fixes across the network and improve general quality before NymVPN launch.
@@ -10,7 +10,7 @@ Yes, there are..
**Built by Nym**
* [Nym Explorer](https://explorer.nymtech.net/)
* [Nym Explorer](https://nym.com/explorer)
* [Sandbox testnet](https://sandbox-explorer.nymtech.net/)
* [Nym Harbourmaster](https://harbourmaster.nymtech.net)
@@ -2,7 +2,13 @@ import { Callout } from 'nextra/components';
import { Tabs } from 'nextra/components';
import { VarInfo } from 'components/variable-info.tsx';
import { Steps } from 'nextra/components';
import { AccordionTemplate } from 'components/accordion-template.tsx'
import { AccordionTemplate } from 'components/accordion-template.tsx';
import ExitPolicyInstallOutput from 'components/operators/snippets/wg-exit-policy-install-output.mdx';
import ExitPolicyStatusOutput from 'components/operators/snippets/wg-exit-policy-status-output.mdx';
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';
export const ManagerIPOutput = () => (
<div>
@@ -434,9 +440,101 @@ journalctl -u nym-node.service -f -n 100
```
</Steps>
Make sure that you get the validation of all connectivity. If there are still any problems, please refer to [troubleshooting section](../../troubleshooting/vps-isp.mdx#incorrect-gateway-network-check).
## Wireguard Exit Policy Configuration
Nym Node running as Exit Gateway has contains multiple modules, one of them is Nym Network Requester(NR), routing TCP traffic to the internet. To make sure that the node is not just an open proxy, NR checks agains [Nym exit policy](https://nymtech.net/.wellknown/network-requester/exit-policy.txt) following these conditions (in this exact order):
1. Do we explicitly block those IP addresses regardless of ports?
2. Do we allow those specific ports regardless of IPs?
3. Do block EVERYTHING else!
The exit policy is same for all NRs, the content is shaped by an offchain governance of Nym Node operators on our [forum](https://forum.nym.com/t/poll-a-new-nym-exit-policy-for-exit-gateways-and-the-nym-mixnet-is-inbound/464).
There is a caveat though. NR is only routing TCP streams and therefore any other type of routing is *not* filtered thorugh the exit policy. To ensure that Nym Nodes follow the same exit policy when routing IP packets through wireguard and don't act as open proxies, the operators have to set up these rules via IP tables rules.
**Follow these steps, using a [setup script]i(https://raw.githubusercontent.com/nymtech/nym/refs/heads/develop/scripts/wireguard-exit-policy/wireguard-exit-policy-manager.sh) and [testing scripts](https://raw.githubusercontent.com/nymtech/nym/refs/heads/develop/scripts/wireguard-exit-policy/exit-policy-tests.sh) written by Nym quality assurance team, to setup exit policy for wireguard:**
<Steps>
###### 1. Download the scripts and make executable
- SSH to your node
- Create a folder `~/nym-binaries` and navigate there
```sh
mkdir $HOME/nym-binaries
cd $HOME/nym-binaries
```
- Download the scripts
```sh
wget https://raw.githubusercontent.com/nymtech/nym/refs/heads/develop/scripts/wireguard-exit-policy/wireguard-exit-policy-manager.sh
wget https://raw.githubusercontent.com/nymtech/nym/refs/heads/develop/scripts/wireguard-exit-policy/exit-policy-tests.sh
```
- Make executable
```sh
chmod +x wireguard-exit-policy-manager.sh exit-policy-tests.sh
```
###### 2. Install `wireguard-exit-policy-manager.sh`
```sh
./wireguard-exit-policy-manager.sh install
```
- The output should look like this:
<AccordionTemplate name="Cosole output">
<ExitPolicyInstallOutput />
</ AccordionTemplate>
###### 3. Run `wireguard-exit-policy-manager.sh`
```sh
./wireguard-exit-policy-manager.sh status
```
- The output should look like this:
<AccordionTemplate name="Cosole output">
<ExitPolicyStatusOutput />
</ AccordionTemplate>
###### 4. Test with `exit-policy-tests.sh`
```sh
./exit-policy-tests.sh
```
- The output should look like this:
<AccordionTemplate name="Cosole output">
<ExitPolicyTestOutput />
</ AccordionTemplate>
###### 5. In case of problems, you can clear the exit policy rule
```sh
./wireguard-exit-policy-manager.sh clear
./wireguard-exit-policy-manager.sh status
```
</ Steps>
Now your wireguart routing should have same rotuing permissions like [Nym exit policy](https://nymtech.net/.wellknown/network-requester/exit-policy.txt) used on 5-hop (Mixnet) mode of NymVPN.
### Testing Wireguard Exit Policy
You can validate the application of the IP tables routes on your `nym-node` by checking it from the server side as well as from the outside.
<div>
<Tabs items={[
<strong>From the server</strong>,
<strong>From the outside - using NymVPN</strong>
]} defaultIndex={0}>
<Tabs.Tab><ExitPolicyTestServer /></Tabs.Tab>
<Tabs.Tab><ExitPolicyTestOutside /></Tabs.Tab>
</Tabs>
</div>
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).
## Running `nym-node` as a non-root
Some operators prefer to run `nym-node` without root privileges. It's possible but still `nym-node` binary needs higher privileges for network-level operations demanding these permissions. Below is a guide how to go about such setup:
@@ -259,7 +259,7 @@ That can be done only on an IP+destination port basis, however. Common P2P ports
<p>
You also have the option of blocking this IP address and others on the Nym network if you so desire.
The Nym project provides a <a href="https://explorer.nymtech.net/network-components/gateways">
The Nym project provides a <a href="https://nym.com/explorer">
web service</a> to fetch a list of all IP addresses of Nym Gateway Exit nodes that allow exiting to a
specified IP:port combination. Please be considerate when using these options.</p>
@@ -20,10 +20,10 @@ This documentation page provides a guide on how to set up and run a [NYM NODE](.
```sh
nym-node
Binary Name: nym-node
Build Timestamp: 2025-03-06T20:32:36.922212778Z
Build Version: 1.6.2
Commit SHA: 247ebb7c4339de0a298a7fcb2574122a8306c3b8
Commit Date: 2025-03-06T21:26:16.000000000+01:00
Build Timestamp: 2025-03-18T12:17:10.782554174Z
Build Version: 1.7.0
Commit SHA: 82e82943aa14e530ab4eb3aaab28ce86d47e5298
Commit Date: 2025-03-18T10:39:55.000000000+01:00
Commit Branch: HEAD
rustc Version: 1.85.0
rustc Channel: stable
@@ -44,7 +44,7 @@ From `nym-node v1.3.0` operators can choose multiple functionalities for their `
### Mixnet Routing
***Mixnet mode (5-hop) is the full anonymising option of NymVPN. Read more about the Mixnet architecture [here](http://localhost:3000/docs/network/architecture)***
***Mixnet mode (5-hop) is the full anonymising option of NymVPN. Read more about the Mixnet architecture [here](../../../network/architecture)***
Nym Node has three functionalities in the Mixnet: `entry-gateway`, `mixnode` and `exit-gateway`. These are selected with a flag `--mode <MODE>` alongside `nym-node` command `run` .
@@ -178,7 +178,7 @@ Make sure to use `--deny-init` flag to prevent initialisation of a new node.
## Functionality & Performance Check
We have a chapter called [Performance Monitoring & Testing](../nodes/performance-and-testing) including much more information and tooling. If you want to just quickly check your nodes performance, connectivity and much more, visit [harbourmaster.nymtech.net](https://harbourmaster.nymtech.net/).
We have a chapter called [Performance Monitoring & Testing](../performance-and-testing) including much more information and tooling. If you want to just quickly check your nodes performance, connectivity and much more, visit [harbourmaster.nymtech.net](https://harbourmaster.nymtech.net/).
For more information about available endpoints and their status, you can refer to:
```sh
@@ -3,7 +3,7 @@
Nym Node operators running Gateway functionality are already familiar with the monitoring tool [Harbourmaster.nymtech.net](https://harbourmaster.nymtech.net). Under the hood of Nym Harbourmaster runs iterations of `nym-gateway-probe` doing various checks and displaying the results on the interface. Operators don't have to rely on the probe ran by Nym and wait for the data to refresh. With `nym-gateway-probe` everyone can check any Gateway's networking status from their own computer at any time. In one command the client queries data from:
- [`nym-api`](https://validator.nymtech.net/api/v1/gateways)
- [`explorer-api`](https://explorer.nymtech.net/api/v1/gateways)
- [`explorer-api`](https://mainnet-node-status-api.nymtech.cc/swagger/#/Gateways)
- [`harbour-master`](https://harbourmaster.nymtech.net/)
@@ -88,4 +88,3 @@ For any `nym-node --mode exit-gateway` the aim is to have this outcome:
**If your Gateway is blacklisted, the probe will not work.**
If you don't provide a `--gateway` flag it will pick a random one to test.
@@ -308,17 +308,18 @@ nano /etc/netplan/00-installer-config.yaml
```
- Edit the block below and paste it to the config file, save and exit:
```ini
```yaml
#####################################################
######## CHANGE ALL VARIABLES IN <> BRACKETS ########
#####################################################
# <INTERFACE> is your own one, you can get with command ip link show
# <HOST> is your server main IPv4 address
# <GATEWAY> value can be found by running: ip route | grep default
# <HOSTv4> is your server main IPv4 address
# <HOSTv6> is your server main IPv6 address
# <GATEWAYv4> value can be found by running: ip -4 route | grep default
# <GATEWAYv6> value can be found by running: ip -6 route | grep default
# This is the network config written by 'subiquity'
---
network:
version: 2
ethernets:
@@ -330,19 +331,26 @@ network:
bridges:
br0:
interfaces: [<INTERFACE>]
addresses: [<HOST>/24]
addresses:
- <HOSTv4>/24 # IPv4> Address
- <HOSTv6>/64 # IPv6 Address
routes:
- to: default
via: <GATEWAY>
via: <GATEWAYv4> # IPv4 Gateway
- to: default
via: <GATEWAYv6> # IPv6 Gateway
mtu: 1500
nameservers:
addresses:
- 8.8.8.8
- 1.1.1.1
- 77.88.8.8
- 1.1.1.1 # Cloudflare IPv4 DNS
- 8.8.8.8 # Google IPv4 DNS
- 8.8.4.4 # Secondary Google IPv4 DNS
- 2606:4700:4700::1111 # Cloudflare IPv6 DNS
- 2001:4860:4860::8888 # Google IPv6 DNS
search: []
parameters:
stp: false # Disable STP unless multiple bridges exist
forward-delay: 15 # Can be shortened, 15 sec is a common default
stp: false # Disable STP unless multiple bridges exist
forward-delay: 15 # Can be shortened, 15 sec is a common default
```
<Callout type="warning">
@@ -613,7 +621,17 @@ nano /etc/netplan/01-network-config.yaml
```
- Insert this config, using your correct IP configuration, save and exit:
```ini
```yaml
#####################################################
######## CHANGE ALL VARIABLES IN <> BRACKETS ########
#####################################################
# <INTERFACE> is your own one, you can get with command ip link show
# <VM_IPv4> is your VM IPv4 address
# <VM_IPv6> is your VM Pv6 address
# <GATEWAYv4> value can be found by running: ip -4 route | grep default
# <GATEWAYv6> value can be found by running: ip -6 route | grep default
network:
version: 2
renderer: networkd
@@ -622,17 +640,18 @@ network:
dhcp4: false
dhcp6: false # Set to true if you want automatic IPv6 assignment
addresses:
- <IPv4_VM>/24 # Assign IPv4 address to the VM
- <IPv6_VM>/64 # Assign IPv6 address to the VM
- <VM_IPv4>/24 # Assign IPv4 address to the VM
- <VM_IPv6>/64 # Assign IPv6 address to the VM
routes:
- to: default
via: <IPv4_GATEWAY_HOST_SERVER> # IPv4 gateway (host machine)
via: <GATEWAYv4> # IPv4 gateway
- to: default
via: <IPv6_GATEWAY_HOST_SERVER> # IPv6 gateway (host machine)
via: <GATEWAYv6> # IPv6 gateway
nameservers:
addresses:
- 1.1.1.1 # Cloudflare IPv4 DNS
- 8.8.8.8 # Google IPv4 DNS
- 8.8.4.4 # Secondary Google IPv4 DNS
- 2606:4700:4700::1111 # Cloudflare IPv6 DNS
- 2001:4860:4860::8888 # Google IPv6 DNS
```
@@ -743,4 +762,4 @@ ssh root@<IPv4> -i ~/.ssh/your_ssh_key
```
</Steps>
Now your VM is almost ready for `nym-node` [setup](../../nym-node/setup). Before you proceed, ssh in and [configure all prerequisities](../vps-setup#vps-configuration) needed for `nym-node` installation and operation.
Now your VM is almost ready for `nym-node` [setup](../../nym-node/setup). Before you proceed, ssh in and [configure all prerequisities](../vps-setup#vps-configuration) needed for `nym-node` installation and operation.
@@ -94,7 +94,7 @@ The example value of `100` for `pruning-interval` can be customised as per your
### Credential Generation
Validators that took part in the DKG ceremony became part of the 'quorum' generating and verifying zk-nym credentials. These will initially be used for private proof of payment for NymVPN (moe [here](https://blog.nym.com/nymvpn-an-invitation-for-privacy-experts-and-enthusiasts-63644139d09d) and [here](https://blog.nym.com/zk-nyms-are-here-a-major-milestone-towards-a-market-ready-mixnet-a3470c9ab10a)), and in the future will be expanded into more general use-cases such as [offline ecash](https://arxiv.org/abs/2303.08221).
Validators that took part in the DKG ceremony became part of the 'quorum' generating and verifying zk-nym credentials. These will initially be used for private proof of payment for NymVPN (more [here](https://nym.com/blog/invitation-for-privacy-experts-and-enthusiasts) and [here](https://nym.com/blog/zk-nyms-are-here-a-major-milestone-towards-a-market-ready-mixnet), and in the future will be expanded into more general use-cases such as [offline ecash](https://arxiv.org/abs/2303.08221).
The DKG ceremony was used to create a subset of existing validators who run `nym-api` alongside a Nyx full-node. As outlined above, they are the ones taking part in the generation and verification of zk-nym credentials. The size of the 'minimum viable quorum' is 10 - the intial set taking part in DKG was 17 validators. This is in order to have some redundancy in the case of a validator dropping or going offline.
@@ -21,7 +21,7 @@ import { AccordionTemplate } from 'components/accordion-template.tsx';
Nym Network is composed of two main elements, the Mixnet represented by [Nym Nodes](nodes/nym-node/nym-node.mdx) routing and mixing the data packets, and Nyx blockchain distributted accros [validator set](tokenomics/validator-rewards.mdx), using smart contracts (based on [cosmwasm](https://cosmwasm.com/)) to monitor and reward Nym Nodes by querying API endpoints and distributing NYM token to operators according to work done by their nodes. All Nym nodes and validators are run by decentralised community of operators.
* Nym tokenomics are based on the research paper [*Reward Sharing for Mixnets*](https://nym.com/nym-cryptoecon-paper.pdf)
* For a more comprehensive overview, token live data and supply graphs, visit [*nym.com/about/token*](https://nymtech.net/about/token)
* For a more comprehensive overview, token live data and graphs, visit a community managed dashboard [*explorer.nym.spectredao.net/token*](https://explorer.nym.spectredao.net/dashboard)
* To read about rewards calculation, visit [Nym Node rewards page](tokenomics/mixnet-rewards.mdx)
* To understand the implementation and release plan, see [Nym operators roadmap](tokenomics/mixnet-rewards.mdx#roadmap)
@@ -87,7 +87,7 @@ To get live data, visit [Nym token page](https://nym.com.net/about/token) or see
### Calculation & Explanation
To get a full comprehension of [node operators rewards](tokenomics/mixnet-rewards.mdx) calculation and [delegators APR height](https://nym.com/about/token), we need to understand some basic logic behind the numbers presented. This chapter covers some of the most essential variables in Nym tokenomics flow.
To get a full comprehension of [node operators rewards](tokenomics/mixnet-rewards.mdx) calculation and delegators APR height, we need to understand some basic logic behind the numbers presented. This chapter covers some of the most essential variables in Nym tokenomics flow.
```ascii
@@ -104,7 +104,7 @@ To get a full comprehension of [node operators rewards](tokenomics/mixnet-reward
<br />
<b>Circulating supply is <span style={{display: 'inline-block'}}><CirculatingSupply /></span> NYM.</b>
NYM token is capped at 1b. Visit [Nym token page](https://nym.com/about/token) to see live data and graphs.
NYM token is capped at 1b. Visit [SpectreDAO token dashboard](https://explorer.nym.spectredao.net/token) to see live data, graphs and historical data.
#### Staking target
@@ -360,7 +360,7 @@ $1 \ NYM = 1 \_ 000 \_ 000 \ uNYM$
The Reward Estimation API endpoint allows Mix Node operators to estimate the rewards they could earn for running a Nym Mix Node with a specific `MIX_ID`.
> The `<MIX_ID>` can be found in the "Mix ID" column of the [Network Explorer](https://explorer.nymtech.net/network-components/mixnodes/active).
> The `<MIX_ID>` can be found in the "Mix ID" column of the [Network Explorer](https://nym.com/explorer).
The endpoint is a particularly common for Mix Node operators as it can provide an estimate of potential earnings based on factors such as the amount of traffic routed through the Mix Node, the quality of the Mix Node's performance, and the overall demand for Mix Nodes in the network. This information can be useful for Mix Node operators in deciding whether or not to run a Mix Node and in optimizing its operations for maximum profitability.
@@ -73,7 +73,7 @@ The directory structure for each node will be roughly as follows:
```
<Callout>
If you `cat` the `public_sphinx.pem` key, the output will be different from the public key you will see on Nym [dashboard](https://explorer.nymtech.net/). The reason for this is that `.pem` files are encoded in **base64**, however on the web they are in **base58**. Don't be confused if your keys look different. They are the same keys, just with different encoding.
If you `cat` the `public_sphinx.pem` key, the output will be different from the public key you will see on Nym [dashboard](https://nym.com/explorer). The reason for this is that `.pem` files are encoded in **base64**, however on the web they are in **base58**. Don't be confused if your keys look different. They are the same keys, just with different encoding.
</Callout>
### Accidentally killing your node process on exiting session
@@ -101,7 +101,7 @@ You don't have to do any additional configuration for your node to implement thi
### How can I tell my node is up and running and mixing traffic?
First of all check the 'Mixnodes' section of either of the Nym Network Explorers:
* [Mainnet](https://explorer.nymtech.net/)
* [Mainnet](https://nym.com/explorer)
* [Sandbox testnet](https://sandbox-explorer.nymtech.net/)
You can also check [Nym Harbourmaster](https://harbourmaster.nymtech.net) which now also includes mixnode mode.
+86 -85
View File
@@ -99,14 +99,14 @@ importers:
specifier: ^0.438.0
version: 0.438.0(react@18.3.1)
next:
specifier: ^13.4.19
version: 13.5.7(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
specifier: ^14.2.15
version: 14.2.15(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
nextra:
specifier: '2'
version: 2.13.4(next@13.5.7(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)
version: 2.13.4(next@14.2.15(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)
nextra-theme-docs:
specifier: '2'
version: 2.13.4(next@13.5.7(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(nextra@2.13.4(next@13.5.7(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))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
version: 2.13.4(next@14.2.15(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(nextra@2.13.4(next@14.2.15(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))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
react:
specifier: ^18.2.0
version: 18.3.1
@@ -232,6 +232,7 @@ packages:
'@confio/ics23@0.6.8':
resolution: {integrity: sha512-wB6uo+3A50m0sW/EWcU64xpV/8wShZ6bMTa7pF8eYsTrSkQA7oLUIJcs/wb8g4y2Oyq701BaGiO6n/ak5WXO1w==}
deprecated: Unmaintained. The codebase for this package was moved to https://github.com/cosmos/ics23 but then the JS implementation was removed in https://github.com/cosmos/ics23/pull/353. Please consult the maintainers of https://github.com/cosmos for further assistance.
'@coreui/coreui@5.1.2':
resolution: {integrity: sha512-ub7KfpLo5OomUQ2Ah6rvSgmX+JzJmJ7XfU951BYpcpveCdAy1GWaKhH83JGVqcKQyHVBe+z8Y5Z5s19WmWzilw==}
@@ -874,62 +875,62 @@ packages:
resolution: {integrity: sha512-jMxvwzkKzd3cXo2EB9GM2ic0eYo2rP/BS6gJt6HnWbsDO1O8GSD4k7o2Cpr2YERtMpGF/MGcDfsfj2EbQPtrXw==}
engines: {node: '>= 10'}
'@next/env@13.5.7':
resolution: {integrity: sha512-uVuRqoj28Ys/AI/5gVEgRAISd0KWI0HRjOO1CTpNgmX3ZsHb5mdn14Y59yk0IxizXdo7ZjsI2S7qbWnO+GNBcA==}
'@next/env@14.2.15':
resolution: {integrity: sha512-S1qaj25Wru2dUpcIZMjxeMVSwkt8BK4dmWHHiBuRstcIyOsMapqT4A4jSB6onvqeygkSSmOkyny9VVx8JIGamQ==}
'@next/eslint-plugin-next@13.4.13':
resolution: {integrity: sha512-RpZeXlPxQ9FLeYN84XHDqRN20XxmVNclYCraLYdifRsmibtcWUWdwE/ANp2C8kgesFRsvwfsw6eOkYNl9sLJ3A==}
'@next/swc-darwin-arm64@13.5.7':
resolution: {integrity: sha512-7SxmxMex45FvKtRoP18eftrDCMyL6WQVYJSEE/s7A1AW/fCkznxjEShKet2iVVzf89gWp8HbXGaL4hCaseux6g==}
'@next/swc-darwin-arm64@14.2.15':
resolution: {integrity: sha512-Rvh7KU9hOUBnZ9TJ28n2Oa7dD9cvDBKua9IKx7cfQQ0GoYUwg9ig31O2oMwH3wm+pE3IkAQ67ZobPfEgurPZIA==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [darwin]
'@next/swc-darwin-x64@13.5.7':
resolution: {integrity: sha512-6iENvgyIkGFLFszBL4b1VfEogKC3TDPEB6/P/lgxmgXVXIV09Q4or1MVn+U/tYyYmm7oHMZ3oxGpHAyJ80nA6g==}
'@next/swc-darwin-x64@14.2.15':
resolution: {integrity: sha512-5TGyjFcf8ampZP3e+FyCax5zFVHi+Oe7sZyaKOngsqyaNEpOgkKB3sqmymkZfowy3ufGA/tUgDPPxpQx931lHg==}
engines: {node: '>= 10'}
cpu: [x64]
os: [darwin]
'@next/swc-linux-arm64-gnu@13.5.7':
resolution: {integrity: sha512-P42jDX56wu9zEdVI+Xv4zyTeXB3DpqgE1Gb4bWrc0s2RIiDYr6uKBprnOs1hCGIwfVyByxyTw5Va66QCdFFNUg==}
'@next/swc-linux-arm64-gnu@14.2.15':
resolution: {integrity: sha512-3Bwv4oc08ONiQ3FiOLKT72Q+ndEMyLNsc/D3qnLMbtUYTQAmkx9E/JRu0DBpHxNddBmNT5hxz1mYBphJ3mfrrw==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
'@next/swc-linux-arm64-musl@13.5.7':
resolution: {integrity: sha512-A06vkj+8X+tLRzSja5REm/nqVOCzR+x5Wkw325Q/BQRyRXWGCoNbQ6A+BR5M86TodigrRfI3lUZEKZKe3QJ9Bg==}
'@next/swc-linux-arm64-musl@14.2.15':
resolution: {integrity: sha512-k5xf/tg1FBv/M4CMd8S+JL3uV9BnnRmoe7F+GWC3DxkTCD9aewFRH1s5rJ1zkzDa+Do4zyN8qD0N8c84Hu96FQ==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
'@next/swc-linux-x64-gnu@13.5.7':
resolution: {integrity: sha512-UdHm7AlxIbdRdMsK32cH0EOX4OmzAZ4Xm+UVlS0YdvwLkI3pb7AoBEoVMG5H0Wj6Wpz6GNkrFguHTRLymTy6kw==}
'@next/swc-linux-x64-gnu@14.2.15':
resolution: {integrity: sha512-kE6q38hbrRbKEkkVn62reLXhThLRh6/TvgSP56GkFNhU22TbIrQDEMrO7j0IcQHcew2wfykq8lZyHFabz0oBrA==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
'@next/swc-linux-x64-musl@13.5.7':
resolution: {integrity: sha512-c50Y8xBKU16ZGj038H6C13iedRglxvdQHD/1BOtes56gwUrIRDX2Nkzn3mYtpz3Wzax0gfAF9C0Nqljt93IxvA==}
'@next/swc-linux-x64-musl@14.2.15':
resolution: {integrity: sha512-PZ5YE9ouy/IdO7QVJeIcyLn/Rc4ml9M2G4y3kCM9MNf1YKvFY4heg3pVa/jQbMro+tP6yc4G2o9LjAz1zxD7tQ==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
'@next/swc-win32-arm64-msvc@13.5.7':
resolution: {integrity: sha512-NcUx8cmkA+JEp34WNYcKW6kW2c0JBhzJXIbw+9vKkt9m/zVJ+KfizlqmoKf04uZBtzFN6aqE2Fyv2MOd021WIA==}
'@next/swc-win32-arm64-msvc@14.2.15':
resolution: {integrity: sha512-2raR16703kBvYEQD9HNLyb0/394yfqzmIeyp2nDzcPV4yPjqNUG3ohX6jX00WryXz6s1FXpVhsCo3i+g4RUX+g==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [win32]
'@next/swc-win32-ia32-msvc@13.5.7':
resolution: {integrity: sha512-wXp+/3NVcuyJDED6gJiLXs5dqHaWO7moAB6aBtjlKZvsxBDxpcyjsfRbtHPeYtaT20zCkmPs69H0K25lrVZmlA==}
'@next/swc-win32-ia32-msvc@14.2.15':
resolution: {integrity: sha512-fyTE8cklgkyR1p03kJa5zXEaZ9El+kDNM5A+66+8evQS5e/6v0Gk28LqA0Jet8gKSOyP+OTm/tJHzMlGdQerdQ==}
engines: {node: '>= 10'}
cpu: [ia32]
os: [win32]
'@next/swc-win32-x64-msvc@13.5.7':
resolution: {integrity: sha512-PLyD3Dl6jTTkLG8AoqhPGd5pXtSs8wbqIhWPQt3yEMfnYld/dGYuF2YPs3YHaVFrijCIF9pXY3+QOyvP23Zn7g==}
'@next/swc-win32-x64-msvc@14.2.15':
resolution: {integrity: sha512-SzqGbsLsP9OwKNUG9nekShTwhj6JSB9ZLMWQ8g1gG6hdE5gQLncbnbymrwy2yVmH9nikSLYRYxYMFu78Ggp7/g==}
engines: {node: '>= 10'}
cpu: [x64]
os: [win32]
@@ -2483,11 +2484,14 @@ packages:
'@starknet-io/types-js@0.7.7':
resolution: {integrity: sha512-WLrpK7LIaIb8Ymxu6KF/6JkGW1sso988DweWu7p5QY/3y7waBIiPvzh27D9bX5KIJNRDyOoOVoHVEKYUYWZ/RQ==}
'@swc/counter@0.1.3':
resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==}
'@swc/helpers@0.5.13':
resolution: {integrity: sha512-UoKGxQ3r5kYI9dALKJapMmuK+1zWM/H17Z1+iwnNmzcJRnfFuevZs375TA5rW31pu4BS4NoSy1fRsexDXfWn5w==}
'@swc/helpers@0.5.2':
resolution: {integrity: sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==}
'@swc/helpers@0.5.5':
resolution: {integrity: sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==}
'@tanstack/react-virtual@3.10.8':
resolution: {integrity: sha512-VbzbVGSsZlQktyLrP5nxE+vE1ZR+U0NFAWPbJLoG2+DKPwd2D7dVICTVIIaYlJqX1ZCEnYDbaOpmMwbsyhBoIA==}
@@ -5035,8 +5039,8 @@ packages:
nan@2.22.0:
resolution: {integrity: sha512-nbajikzWTMwsW+eSsNm3QwlOs7het9gGJU5dDZzRTQGk03vyBOauxgI4VakDzE0PtsGTmXPsXTbbjVhRwR5mpw==}
nanoid@3.3.7:
resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==}
nanoid@3.3.8:
resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==}
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
hasBin: true
@@ -5071,18 +5075,21 @@ packages:
react: '*'
react-dom: '*'
next@13.5.7:
resolution: {integrity: sha512-W7KIRTE+hPcgGdq89P3mQLDX3m7pJ6nxSyC+YxYaUExE+cS4UledB+Ntk98tKoyhsv6fjb2TRAnD7VDvoqmeFg==}
engines: {node: '>=16.14.0'}
next@14.2.15:
resolution: {integrity: sha512-h9ctmOokpoDphRvMGnwOJAedT6zKhwqyZML9mDtspgf4Rh3Pn7UTYKqePNoDvhsWBAO5GoPNYshnAUGIazVGmw==}
engines: {node: '>=18.17.0'}
hasBin: true
peerDependencies:
'@opentelemetry/api': ^1.1.0
'@playwright/test': ^1.41.2
react: ^18.2.0
react-dom: ^18.2.0
sass: ^1.3.0
peerDependenciesMeta:
'@opentelemetry/api':
optional: true
'@playwright/test':
optional: true
sass:
optional: true
@@ -6469,10 +6476,6 @@ packages:
vscode-textmate@8.0.0:
resolution: {integrity: sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==}
watchpack@2.4.0:
resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==}
engines: {node: '>=10.13.0'}
watchpack@2.4.2:
resolution: {integrity: sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==}
engines: {node: '>=10.13.0'}
@@ -7898,37 +7901,37 @@ snapshots:
'@napi-rs/simple-git-win32-arm64-msvc': 0.1.19
'@napi-rs/simple-git-win32-x64-msvc': 0.1.19
'@next/env@13.5.7': {}
'@next/env@14.2.15': {}
'@next/eslint-plugin-next@13.4.13':
dependencies:
glob: 7.1.7
'@next/swc-darwin-arm64@13.5.7':
'@next/swc-darwin-arm64@14.2.15':
optional: true
'@next/swc-darwin-x64@13.5.7':
'@next/swc-darwin-x64@14.2.15':
optional: true
'@next/swc-linux-arm64-gnu@13.5.7':
'@next/swc-linux-arm64-gnu@14.2.15':
optional: true
'@next/swc-linux-arm64-musl@13.5.7':
'@next/swc-linux-arm64-musl@14.2.15':
optional: true
'@next/swc-linux-x64-gnu@13.5.7':
'@next/swc-linux-x64-gnu@14.2.15':
optional: true
'@next/swc-linux-x64-musl@13.5.7':
'@next/swc-linux-x64-musl@14.2.15':
optional: true
'@next/swc-win32-arm64-msvc@13.5.7':
'@next/swc-win32-arm64-msvc@14.2.15':
optional: true
'@next/swc-win32-ia32-msvc@13.5.7':
'@next/swc-win32-ia32-msvc@14.2.15':
optional: true
'@next/swc-win32-x64-msvc@13.5.7':
'@next/swc-win32-x64-msvc@14.2.15':
optional: true
'@nextui-org/accordion@2.0.40(@nextui-org/system@2.2.6(@nextui-org/theme@2.2.11(tailwindcss@3.4.14))(framer-motion@11.11.9(@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.2.11(tailwindcss@3.4.14))(framer-motion@11.11.9(@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)':
@@ -10642,12 +10645,15 @@ snapshots:
'@starknet-io/types-js@0.7.7': {}
'@swc/counter@0.1.3': {}
'@swc/helpers@0.5.13':
dependencies:
tslib: 2.8.0
'@swc/helpers@0.5.2':
'@swc/helpers@0.5.5':
dependencies:
'@swc/counter': 0.1.3
tslib: 2.8.0
'@tanstack/react-virtual@3.10.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
@@ -12256,7 +12262,7 @@ snapshots:
eslint: 8.46.0
eslint-import-resolver-node: 0.3.9
eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.46.0)(typescript@4.9.5))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(eslint@8.46.0))(eslint@8.46.0)
eslint-plugin-import: 2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.46.0)(typescript@4.9.5))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.46.0)(typescript@4.9.5))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(eslint@8.46.0))(eslint@8.46.0))(eslint@8.46.0)
eslint-plugin-import: 2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.46.0)(typescript@4.9.5))(eslint-import-resolver-typescript@3.6.3)(eslint@8.46.0)
eslint-plugin-jsx-a11y: 6.10.1(eslint@8.46.0)
eslint-plugin-react: 7.37.2(eslint@8.46.0)
eslint-plugin-react-hooks: 5.0.0-canary-7118f5dd7-20230705(eslint@8.46.0)
@@ -12281,20 +12287,20 @@ snapshots:
debug: 4.3.7
enhanced-resolve: 5.17.1
eslint: 8.46.0
eslint-module-utils: 2.12.0(@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.6.3(@typescript-eslint/parser@6.21.0(eslint@8.46.0)(typescript@4.9.5))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(eslint@8.46.0))(eslint@8.46.0))(eslint@8.46.0)
eslint-module-utils: 2.12.0(@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.6.3)(eslint@8.46.0)
fast-glob: 3.3.2
get-tsconfig: 4.8.1
is-bun-module: 1.2.1
is-glob: 4.0.3
optionalDependencies:
eslint-plugin-import: 2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.46.0)(typescript@4.9.5))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.46.0)(typescript@4.9.5))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(eslint@8.46.0))(eslint@8.46.0))(eslint@8.46.0)
eslint-plugin-import: 2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.46.0)(typescript@4.9.5))(eslint-import-resolver-typescript@3.6.3)(eslint@8.46.0)
transitivePeerDependencies:
- '@typescript-eslint/parser'
- eslint-import-resolver-node
- eslint-import-resolver-webpack
- supports-color
eslint-module-utils@2.12.0(@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.6.3(@typescript-eslint/parser@6.21.0(eslint@8.46.0)(typescript@4.9.5))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(eslint@8.46.0))(eslint@8.46.0))(eslint@8.46.0):
eslint-module-utils@2.12.0(@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.6.3)(eslint@8.46.0):
dependencies:
debug: 3.2.7
optionalDependencies:
@@ -12305,7 +12311,7 @@ snapshots:
transitivePeerDependencies:
- supports-color
eslint-plugin-import@2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.46.0)(typescript@4.9.5))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.46.0)(typescript@4.9.5))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(eslint@8.46.0))(eslint@8.46.0))(eslint@8.46.0):
eslint-plugin-import@2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.46.0)(typescript@4.9.5))(eslint-import-resolver-typescript@3.6.3)(eslint@8.46.0):
dependencies:
'@rtsao/scc': 1.1.0
array-includes: 3.1.8
@@ -12316,7 +12322,7 @@ snapshots:
doctrine: 2.1.0
eslint: 8.46.0
eslint-import-resolver-node: 0.3.9
eslint-module-utils: 2.12.0(@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.6.3(@typescript-eslint/parser@6.21.0(eslint@8.46.0)(typescript@4.9.5))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(eslint@8.46.0))(eslint@8.46.0))(eslint@8.46.0)
eslint-module-utils: 2.12.0(@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.6.3)(eslint@8.46.0)
hasown: 2.0.2
is-core-module: 2.15.1
is-glob: 4.0.3
@@ -14008,7 +14014,7 @@ snapshots:
nan@2.22.0: {}
nanoid@3.3.7: {}
nanoid@3.3.8: {}
natural-compare@1.4.0: {}
@@ -14032,44 +14038,44 @@ snapshots:
transitivePeerDependencies:
- supports-color
next-seo@6.6.0(next@13.5.7(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):
next-seo@6.6.0(next@14.2.15(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):
dependencies:
next: 13.5.7(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
next: 14.2.15(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
react: 18.3.1
react-dom: 18.3.1(react@18.3.1)
next-themes@0.2.1(next@13.5.7(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):
next-themes@0.2.1(next@14.2.15(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):
dependencies:
next: 13.5.7(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
next: 14.2.15(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
react: 18.3.1
react-dom: 18.3.1(react@18.3.1)
next@13.5.7(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
next@14.2.15(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
dependencies:
'@next/env': 13.5.7
'@swc/helpers': 0.5.2
'@next/env': 14.2.15
'@swc/helpers': 0.5.5
busboy: 1.6.0
caniuse-lite: 1.0.30001669
graceful-fs: 4.2.11
postcss: 8.4.31
react: 18.3.1
react-dom: 18.3.1(react@18.3.1)
styled-jsx: 5.1.1(babel-plugin-macros@3.1.0)(react@18.3.1)
watchpack: 2.4.0
optionalDependencies:
'@next/swc-darwin-arm64': 13.5.7
'@next/swc-darwin-x64': 13.5.7
'@next/swc-linux-arm64-gnu': 13.5.7
'@next/swc-linux-arm64-musl': 13.5.7
'@next/swc-linux-x64-gnu': 13.5.7
'@next/swc-linux-x64-musl': 13.5.7
'@next/swc-win32-arm64-msvc': 13.5.7
'@next/swc-win32-ia32-msvc': 13.5.7
'@next/swc-win32-x64-msvc': 13.5.7
'@next/swc-darwin-arm64': 14.2.15
'@next/swc-darwin-x64': 14.2.15
'@next/swc-linux-arm64-gnu': 14.2.15
'@next/swc-linux-arm64-musl': 14.2.15
'@next/swc-linux-x64-gnu': 14.2.15
'@next/swc-linux-x64-musl': 14.2.15
'@next/swc-win32-arm64-msvc': 14.2.15
'@next/swc-win32-ia32-msvc': 14.2.15
'@next/swc-win32-x64-msvc': 14.2.15
transitivePeerDependencies:
- '@babel/core'
- babel-plugin-macros
nextra-theme-docs@2.13.4(next@13.5.7(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(nextra@2.13.4(next@13.5.7(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))(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
nextra-theme-docs@2.13.4(next@14.2.15(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(nextra@2.13.4(next@14.2.15(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))(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
dependencies:
'@headlessui/react': 1.7.19(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
'@popperjs/core': 2.11.8
@@ -14080,16 +14086,16 @@ snapshots:
git-url-parse: 13.1.1
intersection-observer: 0.12.2
match-sorter: 6.3.4
next: 13.5.7(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
next-seo: 6.6.0(next@13.5.7(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)
next-themes: 0.2.1(next@13.5.7(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)
nextra: 2.13.4(next@13.5.7(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)
next: 14.2.15(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
next-seo: 6.6.0(next@14.2.15(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)
next-themes: 0.2.1(next@14.2.15(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)
nextra: 2.13.4(next@14.2.15(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)
react: 18.3.1
react-dom: 18.3.1(react@18.3.1)
scroll-into-view-if-needed: 3.1.0
zod: 3.23.8
nextra@2.13.4(next@13.5.7(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):
nextra@2.13.4(next@14.2.15(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):
dependencies:
'@headlessui/react': 1.7.19(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
'@mdx-js/mdx': 2.3.0
@@ -14103,7 +14109,7 @@ snapshots:
gray-matter: 4.0.3
katex: 0.16.11
lodash.get: 4.4.2
next: 13.5.7(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
next: 14.2.15(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
next-mdx-remote: 4.4.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
p-limit: 3.1.0
react: 18.3.1
@@ -14452,19 +14458,19 @@ snapshots:
postcss@8.4.31:
dependencies:
nanoid: 3.3.7
nanoid: 3.3.8
picocolors: 1.1.1
source-map-js: 1.2.1
postcss@8.4.38:
dependencies:
nanoid: 3.3.7
nanoid: 3.3.8
picocolors: 1.1.1
source-map-js: 1.2.1
postcss@8.4.47:
dependencies:
nanoid: 3.3.7
nanoid: 3.3.8
picocolors: 1.1.1
source-map-js: 1.2.1
@@ -15727,11 +15733,6 @@ snapshots:
vscode-textmate@8.0.0: {}
watchpack@2.4.0:
dependencies:
glob-to-regexp: 0.4.1
graceful-fs: 4.2.11
watchpack@2.4.2:
dependencies:
glob-to-regexp: 0.4.1
Binary file not shown.

After

Width:  |  Height:  |  Size: 136 KiB

+12 -5
View File
@@ -1,7 +1,8 @@
import React from "react";
import { DocsThemeConfig, useConfig } from "nextra-theme-docs";
import { Footer } from "./components/footer";
// import { Footer } from "./components/footer";
import { Matrix } from "./components/matrix-link";
import { Explorer } from "./components/explorer-link";
import { useRouter } from "next/router";
const config: DocsThemeConfig = {
@@ -66,9 +67,9 @@ const config: DocsThemeConfig = {
},
docsRepositoryBase:
"https://github.com/nymtech/nym/tree/develop/documentation/docs/",
footer: {
text: Footer,
},
// footer: {
// text: Footer,
// },
darkMode: true,
nextThemes: {
defaultTheme: "dark",
@@ -77,8 +78,14 @@ const config: DocsThemeConfig = {
defaultMenuCollapseLevel: 1,
autoCollapse: true,
},
navbar: {
extraContent: <Matrix />,
extraContent: (
<>
<Explorer />
<Matrix />
</>
),
},
toc: {
float: false,
+1 -1
View File
@@ -11,7 +11,7 @@
"dependencies": {
"@nymproject/react": "^1.0.0",
"@nymproject/nym-validator-client": "0.18.0",
"next": "14.1.4",
"next": "14.2.21",
"react": "^18",
"react-dom": "^18",
"react-error-boundary": "^4.0.13",
+3
View File
@@ -0,0 +1,3 @@
{
"extends": ["next/core-web-vitals", "next/typescript"]
}
+40
View File
@@ -0,0 +1,40 @@
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
# dependencies
/node_modules
/.pnp
.pnp.*
.yarn/*
!.yarn/patches
!.yarn/plugins
!.yarn/releases
!.yarn/versions
# testing
/coverage
# next.js
/.next/
/out/
# production
/build
# misc
.DS_Store
*.pem
# debug
npm-debug.log*
yarn-debug.log*
yarn-error.log*
# env files (can opt-in for committing if needed)
.env*
# vercel
.vercel
# typescript
*.tsbuildinfo
next-env.d.ts
+36
View File
@@ -0,0 +1,36 @@
This is a [Next.js](https://nextjs.org) project bootstrapped with [`create-next-app`](https://nextjs.org/docs/app/api-reference/cli/create-next-app).
## Getting Started
First, run the development server:
```bash
npm run dev
# or
yarn dev
# or
pnpm dev
# or
bun dev
```
Open [http://localhost:3000](http://localhost:3000) with your browser to see the result.
You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file.
This project uses [`next/font`](https://nextjs.org/docs/app/building-your-application/optimizing/fonts) to automatically optimize and load [Geist](https://vercel.com/font), a new font family for Vercel.
## Learn More
To learn more about Next.js, take a look at the following resources:
- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API.
- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial.
You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js) - your feedback and contributions are welcome!
## Deploy on Vercel
The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js.
Check out our [Next.js deployment documentation](https://nextjs.org/docs/app/building-your-application/deploying) for more details.
+33
View File
@@ -0,0 +1,33 @@
{
"$schema": "https://biomejs.dev/schemas/1.9.4/schema.json",
"vcs": {
"enabled": false,
"clientKind": "git",
"useIgnoreFile": false
},
"files": {
"ignoreUnknown": false,
"ignore": ["node_modules", ".next", "public"]
},
"formatter": {
"enabled": true,
"indentStyle": "space"
},
"organizeImports": {
"enabled": true
},
"linter": {
"enabled": true,
"rules": {
"recommended": true,
"suspicious": {
"noExplicitAny": "warn"
}
}
},
"javascript": {
"formatter": {
"quoteStyle": "double"
}
}
}
+23
View File
@@ -0,0 +1,23 @@
import type { NextConfig } from "next";
const nextConfig: NextConfig = {
reactStrictMode: true,
basePath: "/explorer",
assetPrefix: "/explorer",
trailingSlash: false,
async redirects() {
return [
// Change the basePath to /explorer
{
source: "/",
destination: "/explorer",
basePath: false,
permanent: true,
},
]
}
};
export default nextConfig;
+64
View File
@@ -0,0 +1,64 @@
{
"name": "@nymproject/explorer-v2",
"version": "0.1.0",
"scripts": {
"dev": "next dev",
"build": "next build",
"build:prod": "yarn --cwd .. build && next build",
"start": "next start",
"lint": "biome check --fix"
},
"engines": {
"node": ">=20.0.0"
},
"dependencies": {
"@chain-registry/types": "^0.50.36",
"@cosmos-kit/keplr-extension": "^2.14.0",
"@cosmos-kit/react": "^2.20.1",
"@emotion/cache": "^11.13.5",
"@emotion/react": "^11.13.5",
"@emotion/styled": "^11.13.5",
"@interchain-ui/react": "^1.26.1",
"@mui/icons-material": "^5.16.11",
"@mui/material": "^6.1.10",
"@mui/material-nextjs": "^6.1.9",
"@mui/x-date-pickers": "^7.23.2",
"@nivo/line": "^0.88.0",
"@nymproject/contract-clients": "^1.4.1",
"@nymproject/react": "1.0.0",
"@tanstack/react-query": "^5.64.2",
"@tanstack/react-query-devtools": "^5.64.2",
"@tanstack/react-query-next-experimental": "^5.66.0",
"@tanstack/react-table": "^8.20.6",
"@types/qs": "^6.9.18",
"@uidotdev/usehooks": "^2.4.1",
"chain-registry": "^1.69.64",
"cldr-compact-number": "^0.4.0",
"date-fns": "^4.1.0",
"i18next": "^24.2.2",
"i18next-resources-to-backend": "^1.2.1",
"isomorphic-dompurify": "^2.21.0",
"material-react-table": "^3.0.3",
"next": "^15.2.0",
"openapi-fetch": "^0.13.4",
"qrcode.react": "^4.1.0",
"qs": "^6.14.0",
"react": "^18.0.0",
"react-dom": "^18.0.0",
"react-i18next": "^15.4.0",
"react-markdown": "^9.0.3",
"react-random-avatars": "^1.3.1",
"react-world-flags": "^1.6.0",
"zod": "^3.24.1"
},
"devDependencies": {
"@biomejs/biome": "1.9.4",
"@types/node": "^20",
"@types/react": "^18",
"@types/react-dom": "^18",
"eslint": "^8",
"eslint-config-next": "15.0.3",
"lefthook": "^1.8.5",
"typescript": "^5"
}
}
+1
View File
@@ -0,0 +1 @@
<svg fill="none" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><path d="M14.5 13.5V5.41a1 1 0 0 0-.3-.7L9.8.29A1 1 0 0 0 9.08 0H1.5v13.5A2.5 2.5 0 0 0 4 16h8a2.5 2.5 0 0 0 2.5-2.5m-1.5 0v-7H8v-5H3v12a1 1 0 0 0 1 1h8a1 1 0 0 0 1-1M9.5 5V2.12L12.38 5zM5.13 5h-.62v1.25h2.12V5zm-.62 3h7.12v1.25H4.5zm.62 3h-.62v1.25h7.12V11z" clip-rule="evenodd" fill="#666" fill-rule="evenodd"/></svg>

After

Width:  |  Height:  |  Size: 391 B

+1
View File
@@ -0,0 +1 @@
<svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><g clip-path="url(#a)"><path fill-rule="evenodd" clip-rule="evenodd" d="M10.27 14.1a6.5 6.5 0 0 0 3.67-3.45q-1.24.21-2.7.34-.31 1.83-.97 3.1M8 16A8 8 0 1 0 8 0a8 8 0 0 0 0 16m.48-1.52a7 7 0 0 1-.96 0H7.5a4 4 0 0 1-.84-1.32q-.38-.89-.63-2.08a40 40 0 0 0 3.92 0q-.25 1.2-.63 2.08a4 4 0 0 1-.84 1.31zm2.94-4.76q1.66-.15 2.95-.43a7 7 0 0 0 0-2.58q-1.3-.27-2.95-.43a18 18 0 0 1 0 3.44m-1.27-3.54a17 17 0 0 1 0 3.64 39 39 0 0 1-4.3 0 17 17 0 0 1 0-3.64 39 39 0 0 1 4.3 0m1.1-1.17q1.45.13 2.69.34a6.5 6.5 0 0 0-3.67-3.44q.65 1.26.98 3.1M8.48 1.5l.01.02q.41.37.84 1.31.38.89.63 2.08a40 40 0 0 0-3.92 0q.25-1.2.63-2.08a4 4 0 0 1 .85-1.32 7 7 0 0 1 .96 0m-2.75.4a6.5 6.5 0 0 0-3.67 3.44 29 29 0 0 1 2.7-.34q.31-1.83.97-3.1M4.58 6.28q-1.66.16-2.95.43a7 7 0 0 0 0 2.58q1.3.27 2.95.43a18 18 0 0 1 0-3.44m.17 4.71q-1.45-.12-2.69-.34a6.5 6.5 0 0 0 3.67 3.44q-.65-1.27-.98-3.1" fill="#666"/></g><defs><clipPath id="a"><path fill="#fff" d="M0 0h16v16H0z"/></clipPath></defs></svg>

After

Width:  |  Height:  |  Size: 1.0 KiB

@@ -0,0 +1,61 @@
<svg
width="33"
height="32"
viewBox="0 0 33 32"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<rect
width="6.4"
height="6.38019"
transform="matrix(1 1.74846e-07 1.74846e-07 -1 7.06641 25.5204)"
fill="#242B2D"
style="
fill: #242b2d;
fill: color(display-p3 0.1412 0.1686 0.1765);
fill-opacity: 1;
"
/>
<rect
width="6.4"
height="6.38019"
transform="matrix(1 1.74846e-07 1.74846e-07 -1 0.666504 31.9006)"
fill="#242B2D"
style="
fill: #242b2d;
fill: color(display-p3 0.1412 0.1686 0.1765);
fill-opacity: 1;
"
/>
<rect
width="6.4"
height="6.38019"
transform="matrix(1 1.74846e-07 1.74846e-07 -1 13.4663 19.1406)"
fill="#242B2D"
style="
fill: #242b2d;
fill: color(display-p3 0.1412 0.1686 0.1765);
fill-opacity: 1;
"
/>
<rect
width="6.4"
height="6.38019"
transform="matrix(1 1.74846e-07 1.74846e-07 -1 19.8667 12.761)"
fill="#242B2D"
style="
fill: #242b2d;
fill: color(display-p3 0.1412 0.1686 0.1765);
fill-opacity: 1;
"
/>
<path
d="M32.6663 32L26.2663 32L26.2663 6.38018L0.708989 6.38017L0.70899 -1.52588e-05L24.9863 -1.1014e-05C29.2278 -1.02724e-05 32.6663 3.43845 32.6663 7.68L32.6663 32Z"
fill="#242B2D"
style="
fill: #242b2d;
fill: color(display-p3 0.1412 0.1686 0.1765);
fill-opacity: 1;
"
/>
</svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

+7
View File
@@ -0,0 +1,7 @@
<svg viewBox="0 0 15 15" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect y="15" width="3" height="3" transform="rotate(-90 0 15)" fill="currentColor" />
<rect x="3" y="12" width="3" height="3" transform="rotate(-90 3 12)" fill="currentColor" />
<rect x="6" y="9" width="3" height="3" transform="rotate(-90 6 9)" fill="currentColor" />
<rect x="9" y="6" width="3" height="3" transform="rotate(-90 9 6)" fill="currentColor"/>
<path d="M0 2.19345e-05V3.00002H11.9997V15H14.9997V3.00002C14.9997 1.34317 13.6565 2.19345e-05 11.9997 2.19345e-05H0Z" fill="currentColor" />
</svg>

After

Width:  |  Height:  |  Size: 579 B

+31
View File
@@ -0,0 +1,31 @@
<svg width="361" height="361" viewBox="0 0 361 361" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_236_24563)">
<path d="M180.789 120.41V150.41H210.789V180.41H240.789V180.41C240.789 147.273 213.926 120.41 180.789 120.41V120.41Z" fill="#14E76F" style="fill:#14E76F;fill:color(display-p3 0.0784 0.9059 0.4353);fill-opacity:1;"/>
<path d="M180.789 240.487L180.789 210.487L150.789 210.487L150.789 180.487L120.789 180.487V180.487C120.789 213.624 147.652 240.487 180.789 240.487V240.487Z" fill="#14E76F" style="fill:#14E76F;fill:color(display-p3 0.0784 0.9059 0.4353);fill-opacity:1;"/>
<path d="M120.789 180.41L150.789 180.41L150.789 150.41L180.789 150.41L180.789 120.41V120.41C147.652 120.41 120.789 147.273 120.789 180.41V180.41Z" fill="#14E76F" style="fill:#14E76F;fill:color(display-p3 0.0784 0.9059 0.4353);fill-opacity:1;"/>
<path d="M240.789 180.487L210.789 180.487L210.789 210.487L180.789 210.487L180.789 240.487V240.487C213.926 240.487 240.789 213.624 240.789 180.487V180.487Z" fill="#14E76F" style="fill:#14E76F;fill:color(display-p3 0.0784 0.9059 0.4353);fill-opacity:1;"/>
<path d="M330.773 120.41L330.773 150.41V150.41C347.342 150.41 360.773 136.979 360.773 120.41V120.41L330.773 120.41Z" fill="#14E76F" style="fill:#14E76F;fill:color(display-p3 0.0784 0.9059 0.4353);fill-opacity:1;"/>
<path d="M270.789 60.4102L270.789 90.4102L300.789 90.4102L300.789 60.4102L270.789 60.4102Z" fill="#14E76F" style="fill:#14E76F;fill:color(display-p3 0.0784 0.9059 0.4353);fill-opacity:1;"/>
<path d="M240.789 30.4102L240.789 60.4102L270.789 60.4102L270.789 30.4102L240.789 30.4102Z" fill="#14E76F" style="fill:#14E76F;fill:color(display-p3 0.0784 0.9059 0.4353);fill-opacity:1;"/>
<path d="M60.7891 30.4102L60.7891 60.4102L90.7891 60.4102L90.7891 30.4102L60.7891 30.4102Z" fill="#14E76F" style="fill:#14E76F;fill:color(display-p3 0.0784 0.9059 0.4353);fill-opacity:1;"/>
<path d="M30.7734 60.4102L30.7734 90.4102L60.7734 90.4102L60.7734 60.4102L30.7734 60.4102Z" fill="#14E76F" style="fill:#14E76F;fill:color(display-p3 0.0784 0.9059 0.4353);fill-opacity:1;"/>
<path d="M90.7891 0.410156L90.7891 30.4102L240.789 30.4102L240.789 0.410181L90.7891 0.410156Z" fill="#14E76F" style="fill:#14E76F;fill:color(display-p3 0.0784 0.9059 0.4353);fill-opacity:1;"/>
<rect width="30" height="150.466" transform="matrix(-1.62921e-07 1 1 1.62921e-07 180.789 120.41)" fill="#14E76F" style="fill:#14E76F;fill:color(display-p3 0.0784 0.9059 0.4353);fill-opacity:1;"/>
<rect width="120" height="30" transform="matrix(-1.62921e-07 1 1 1.62921e-07 330.773 0.410156)" fill="#14E76F" style="fill:#14E76F;fill:color(display-p3 0.0784 0.9059 0.4353);fill-opacity:1;"/>
<path d="M301.023 90.4102L301.023 120.41L331.023 120.41L331.023 90.4102L301.023 90.4102Z" fill="#14E76F" style="fill:#14E76F;fill:color(display-p3 0.0784 0.9059 0.4353);fill-opacity:1;"/>
<path d="M30.7734 240.41L30.7734 210.41V210.41C14.2049 210.41 0.77344 223.842 0.773438 240.41V240.41L30.7734 240.41Z" fill="#14E76F" style="fill:#14E76F;fill:color(display-p3 0.0784 0.9059 0.4353);fill-opacity:1;"/>
<path d="M90.7734 300.41L90.7734 270.41L60.7734 270.41L60.7734 300.41L90.7734 300.41Z" fill="#14E76F" style="fill:#14E76F;fill:color(display-p3 0.0784 0.9059 0.4353);fill-opacity:1;"/>
<path d="M120.773 330.41L120.773 300.41L90.7734 300.41L90.7734 330.41L120.773 330.41Z" fill="#14E76F" style="fill:#14E76F;fill:color(display-p3 0.0784 0.9059 0.4353);fill-opacity:1;"/>
<path d="M300.773 330.41L300.773 300.41L270.773 300.41L270.773 330.41L300.773 330.41Z" fill="#14E76F" style="fill:#14E76F;fill:color(display-p3 0.0784 0.9059 0.4353);fill-opacity:1;"/>
<path d="M330.773 300.41L330.773 270.41L300.773 270.41L300.773 300.41L330.773 300.41Z" fill="#14E76F" style="fill:#14E76F;fill:color(display-p3 0.0784 0.9059 0.4353);fill-opacity:1;"/>
<path d="M270.773 360.41L270.773 330.41L120.773 330.41L120.773 360.41L270.773 360.41Z" fill="#14E76F" style="fill:#14E76F;fill:color(display-p3 0.0784 0.9059 0.4353);fill-opacity:1;"/>
<rect width="30" height="150.481" transform="matrix(1.62921e-07 -1 -1 -1.62921e-07 180.789 240.41)" fill="#14E76F" style="fill:#14E76F;fill:color(display-p3 0.0784 0.9059 0.4353);fill-opacity:1;"/>
<rect width="120" height="30" transform="matrix(1.62921e-07 -1 -1 -1.62921e-07 30.7734 360.41)" fill="#14E76F" style="fill:#14E76F;fill:color(display-p3 0.0784 0.9059 0.4353);fill-opacity:1;"/>
<path d="M60.5391 270.41L60.5391 240.41L30.5391 240.41L30.5391 270.41L60.5391 270.41Z" fill="#14E76F" style="fill:#14E76F;fill:color(display-p3 0.0784 0.9059 0.4353);fill-opacity:1;"/>
</g>
<defs>
<clipPath id="clip0_236_24563">
<rect width="360" height="360" fill="white" style="fill:white;fill-opacity:1;" transform="translate(0.773438 0.410156)"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 4.7 KiB

+13
View File
@@ -0,0 +1,13 @@
<svg
width="15"
height="15"
viewBox="0 0 15 15"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<path d="M3 3L-4.47035e-08 3L-8.31509e-07 6L3 6L3 3Z" fill="currentColor" />
<path d="M6 6L3 6L3 9L6 9L6 6Z" fill="currentColor" />
<path d="M9 9L6 9L6 12L9 12L9 9Z" fill="currentColor" />
<path d="M12 6L9 6L9 9L12 9L12 6Z" fill="currentColor" />
<path d="M15 3L12 3L12 6L15 6L15 3Z" fill="currentColor" />
</svg>

After

Width:  |  Height:  |  Size: 431 B

+14
View File
@@ -0,0 +1,14 @@
<svg
width="9"
height="5"
viewBox="0 0 9 5"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M0.828125 0.828125L4.5 4.5L8.17188 0.828125"
stroke="currentColor"
stroke-linecap="round"
stroke-linejoin="round"
/>
</svg>

After

Width:  |  Height:  |  Size: 256 B

+35
View File
@@ -0,0 +1,35 @@
<svg
width="16"
height="16"
viewBox="0 0 16 16"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M10.6668 13.3333V14.6667H10.0002V15.3333H2.00016V14.6667H1.3335V3.99999H2.00016V3.33333H4.00016V13.3333H10.6668Z"
fill="#242B2D"
style="
fill: #242b2d;
fill: color(display-p3 0.1412 0.1686 0.1765);
fill-opacity: 1;
"
/>
<path
d="M10.6665 4.66667V0.666672H5.33317V1.33334H4.6665V12H5.33317V12.6667H13.9998V12H14.6665V4.66667H10.6665ZM13.3332 11.3333H5.99984V2.00001H9.33317V6.00001H13.3332V11.3333Z"
fill="#242B2D"
style="
fill: #242b2d;
fill: color(display-p3 0.1412 0.1686 0.1765);
fill-opacity: 1;
"
/>
<path
d="M14.6668 3.33334V4H11.3335V0.666672H12.0002V1.33334H12.6668V2.00001H13.3335V2.66667H14.0002V3.33334H14.6668Z"
fill="#242B2D"
style="
fill: #242b2d;
fill: color(display-p3 0.1412 0.1686 0.1765);
fill-opacity: 1;
"
/>
</svg>

After

Width:  |  Height:  |  Size: 967 B

+135
View File
@@ -0,0 +1,135 @@
<svg
xmlns="http://www.w3.org/2000/svg"
width="15"
height="15"
viewBox="0 0 15 15"
fill="none"
>
<g clip-path="url(#clip0_8428_65000)">
<rect
y="3"
width="3"
height="3"
transform="rotate(-90 0 3)"
fill="#242B2D"
style="
fill: #242b2d;
fill: color(display-p3 0.1412 0.1686 0.1765);
fill-opacity: 1;
"
/>
<rect
y="15"
width="3"
height="3"
transform="rotate(-90 0 15)"
fill="#242B2D"
style="
fill: #242b2d;
fill: color(display-p3 0.1412 0.1686 0.1765);
fill-opacity: 1;
"
/>
<rect
x="12"
y="3"
width="3"
height="3"
transform="rotate(-90 12 3)"
fill="#242B2D"
style="
fill: #242b2d;
fill: color(display-p3 0.1412 0.1686 0.1765);
fill-opacity: 1;
"
/>
<rect
x="9"
y="12"
width="3"
height="3"
transform="rotate(-90 9 12)"
fill="#242B2D"
style="
fill: #242b2d;
fill: color(display-p3 0.1412 0.1686 0.1765);
fill-opacity: 1;
"
/>
<rect
x="12"
y="15"
width="3"
height="3"
transform="rotate(-90 12 15)"
fill="#242B2D"
style="
fill: #242b2d;
fill: color(display-p3 0.1412 0.1686 0.1765);
fill-opacity: 1;
"
/>
<rect
x="3"
y="6"
width="3"
height="3"
transform="rotate(-90 3 6)"
fill="#242B2D"
style="
fill: #242b2d;
fill: color(display-p3 0.1412 0.1686 0.1765);
fill-opacity: 1;
"
/>
<rect
x="3"
y="12"
width="3"
height="3"
transform="rotate(-90 3 12)"
fill="#242B2D"
style="
fill: #242b2d;
fill: color(display-p3 0.1412 0.1686 0.1765);
fill-opacity: 1;
"
/>
<rect
x="9"
y="6"
width="3"
height="3"
transform="rotate(-90 9 6)"
fill="#242B2D"
style="
fill: #242b2d;
fill: color(display-p3 0.1412 0.1686 0.1765);
fill-opacity: 1;
"
/>
<rect
x="6"
y="9"
width="3"
height="3"
transform="rotate(-90 6 9)"
fill="#242B2D"
style="
fill: #242b2d;
fill: color(display-p3 0.1412 0.1686 0.1765);
fill-opacity: 1;
"
/>
</g>
<defs>
<clipPath id="clip0_8428_65000">
<rect
width="15"
height="15"
fill="white"
style="fill: white; fill-opacity: 1"
/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 2.6 KiB

+3
View File
@@ -0,0 +1,3 @@
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M21.8343 11.2552C23.7199 14.0472 24.6511 17.1964 24.303 20.8219C24.3015 20.8372 24.2936 20.8513 24.2811 20.8606C22.8532 21.9165 21.4697 22.5573 20.1057 22.9823C20.0951 22.9855 20.0837 22.9853 20.0732 22.9817C20.0627 22.9782 20.0535 22.9714 20.047 22.9623C19.7319 22.5207 19.4456 22.0552 19.1947 21.5663C19.1803 21.5375 19.1935 21.5028 19.2231 21.4915C19.6779 21.3189 20.1103 21.1121 20.5262 20.8673C20.559 20.8479 20.5611 20.8007 20.5308 20.778C20.4425 20.712 20.3551 20.6426 20.2714 20.5733C20.2557 20.5604 20.2347 20.5579 20.2169 20.5665C17.5166 21.8223 14.5586 21.8223 11.8263 20.5665C11.8086 20.5585 11.7875 20.5613 11.7723 20.5739C11.6888 20.6432 11.6011 20.712 11.5137 20.778C11.4834 20.8007 11.4859 20.8479 11.5189 20.8673C11.9349 21.1075 12.3673 21.3189 12.8214 21.4923C12.8508 21.5037 12.8648 21.5375 12.8502 21.5663C12.6048 22.0558 12.3184 22.5213 11.9975 22.9629C11.9835 22.9808 11.9605 22.989 11.9388 22.9823C10.5813 22.5573 9.19781 21.9165 7.76992 20.8606C7.75802 20.8513 7.74947 20.8366 7.74822 20.8213C7.45729 17.6853 8.0502 14.51 10.2146 11.2546C10.2198 11.246 10.2277 11.2393 10.2369 11.2353C11.3019 10.743 12.4428 10.3809 13.6353 10.1741C13.657 10.1707 13.6787 10.1808 13.69 10.2002C13.8373 10.4629 14.0057 10.7998 14.1197 11.0751C15.3767 10.8818 16.6532 10.8818 17.9365 11.0751C18.0505 10.8057 18.213 10.4629 18.3597 10.2002C18.365 10.1906 18.3731 10.1829 18.3829 10.1782C18.3927 10.1735 18.4037 10.1721 18.4144 10.1741C19.6075 10.3815 20.7485 10.7437 21.8126 11.2353C21.822 11.2393 21.8297 11.246 21.8343 11.2552V11.2552ZM14.7587 17.2178C14.7719 16.2908 14.1007 15.5236 13.2582 15.5236C12.4226 15.5236 11.7579 16.284 11.7579 17.2178C11.7579 18.1514 12.4357 18.9118 13.2582 18.9118C14.094 18.9118 14.7587 18.1514 14.7587 17.2178V17.2178ZM20.3062 17.2178C20.3194 16.2908 19.6482 15.5236 18.8059 15.5236C17.9701 15.5236 17.3054 16.284 17.3054 17.2178C17.3054 18.1514 17.9833 18.9118 18.8059 18.9118C19.6482 18.9118 20.3062 18.1514 20.3062 17.2178V17.2178Z" fill="currentColor"/>
</svg>

After

Width:  |  Height:  |  Size: 2.1 KiB

+10
View File
@@ -0,0 +1,10 @@
<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12" fill="none">
<g clip-path="url(#clip0_6568_5882)">
<path d="M4 8H8V9H4V8ZM4 6H8V7H4V6ZM7 1H3C2.45 1 2 1.45 2 2V10C2 10.55 2.445 11 2.995 11H9C9.55 11 10 10.55 10 10V4L7 1ZM9 10H3V2H6.5V4.5H9V10Z" fill="#242B2D" style="fill:#242B2D;fill:color(display-p3 0.1412 0.1686 0.1765);fill-opacity:1;"/>
</g>
<defs>
<clipPath id="clip0_6568_5882">
<rect width="12" height="12" fill="white" style="fill:white;fill-opacity:1;"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 526 B

+4
View File
@@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12" fill="none">
<path d="M2.5 5H2V4H3V4.5H3.5V5H4V5.5H4.5V6H5V6.5H5.5V0.5H6.5V6.5H7V6H7.5V5.5H8V5H8.5V4.5H9V4H10V5H9.5V5.5H9V6H8.5V6.5H8V7H7.5V7.5H7V8H6.5V8.5H5.5V8H5V7.5H4.5V7H4V6.5H3.5V6H3V5.5H2.5V5Z" fill="#242B2D" style="fill:#242B2D;fill:color(display-p3 0.1412 0.1686 0.1765);fill-opacity:1;"/>
<path d="M11 10.5H1V11.5H11V10.5Z" fill="#242B2D" style="fill:#242B2D;fill:color(display-p3 0.1412 0.1686 0.1765);fill-opacity:1;"/>
</svg>

After

Width:  |  Height:  |  Size: 520 B

+22
View File
@@ -0,0 +1,22 @@
<svg
xmlns="http://www.w3.org/2000/svg"
width="24"
height="25"
viewBox="0 0 24 25"
fill="none"
>
<circle cx="12" cy="12.5" r="10" fill="url(#paint0_angular_2549_7570)" />
<defs>
<radialGradient
id="paint0_angular_2549_7570"
cx="0"
cy="0"
r="1"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(12 12.5) rotate(90) scale(12)"
>
<stop stopColor="#22D27E" />
<stop offset="1" stopColor="#9002FF" />
</radialGradient>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 515 B

@@ -0,0 +1,3 @@
<svg width="84" height="84" viewBox="0 0 84 84" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M63 0L56 -2.44784e-06L56 7L63 7L70 7H77V14V21L77 28L84 28V21V14C84 6.26801 77.732 0 70 0H63ZM7 14L7 7H14H21L28 7L28 2.14186e-06L21 0H14C6.26801 0 0 6.26801 0 14V21L-3.87835e-06 28L7 28L7 21V14ZM84 70C84 77.732 77.732 84 70 84H63H56L56 77H63H70H77V70L77 63L77 56L84 56V63V70ZM21 77H14L14 70L21 70L21 63H28L28 56H35L35 63H42H49L49 56H56L56 49L63 49L63 42V35L56 35V28L49 28L49 21L42 21H35L35 28L28 28L28 35H21L21 42V49L28 49L28 56H21L21 63L14 63L14 70H7L7 77L7 70L7 63L7 56L0 56L-3.87835e-06 63L0 70C0 77.732 6.26801 84 14 84H21H28L28 77H21ZM28 49L28 42L28 35H35L35 28H42L49 28L49 35L56 35V42L56 49H49V56L42 56H35V49H28Z" fill="#14E76F" style="fill:#14E76F;fill:color(display-p3 0.0784 0.9059 0.4353);fill-opacity:1;"/>
</svg>

After

Width:  |  Height:  |  Size: 869 B

+79
View File
@@ -0,0 +1,79 @@
<svg
width="84"
height="84"
viewBox="0 0 84 84"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<rect
width="7"
height="56"
transform="matrix(-2.36041e-07 1 1 7.28523e-08 28 77)"
fill="#242B2D"
style="
fill: #242b2d;
fill: color(display-p3 0.1412 0.1686 0.1765);
fill-opacity: 1;
"
/>
<rect
width="7"
height="56"
transform="matrix(1 0 -1.63189e-07 -1 0 56)"
fill="#242B2D"
style="
fill: #242b2d;
fill: color(display-p3 0.1412 0.1686 0.1765);
fill-opacity: 1;
"
/>
<path
d="M63 0L63 21L84 21L84 28L63 28C59.134 28 56 24.866 56 21L56 0H63Z"
fill="#242B2D"
style="
fill: #242b2d;
fill: color(display-p3 0.1412 0.1686 0.1765);
fill-opacity: 1;
"
/>
<rect
width="7"
height="42"
transform="matrix(1 0 -1.63189e-07 -1 28 42)"
fill="#242B2D"
style="
fill: #242b2d;
fill: color(display-p3 0.1412 0.1686 0.1765);
fill-opacity: 1;
"
/>
<rect
width="7"
height="35"
transform="matrix(-2.36041e-07 1 1 7.28523e-08 49 49)"
fill="#242B2D"
style="
fill: #242b2d;
fill: color(display-p3 0.1412 0.1686 0.1765);
fill-opacity: 1;
"
/>
<path
d="M28 84L28 77L7 77L7 56L-1.89145e-06 56L-2.80939e-06 77C-2.97838e-06 80.866 3.134 84 7 84L28 84Z"
fill="#242B2D"
style="
fill: #242b2d;
fill: color(display-p3 0.1412 0.1686 0.1765);
fill-opacity: 1;
"
/>
<path
d="M56 56L56 49L35 49L35 28L28 28L28 49C28 52.866 31.134 56 35 56L56 56Z"
fill="#242B2D"
style="
fill: #242b2d;
fill: color(display-p3 0.1412 0.1686 0.1765);
fill-opacity: 1;
"
/>
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

+3
View File
@@ -0,0 +1,3 @@
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M15.9408 7.86426C10.9716 7.86426 6.94678 11.8731 6.94678 16.8225C6.94678 20.7866 9.52132 24.1347 13.0965 25.3217C13.5462 25.4001 13.7148 25.1313 13.7148 24.8962C13.7148 24.6834 13.7035 23.9779 13.7035 23.2277C11.4438 23.642 10.8592 22.679 10.6793 22.1751C10.5781 21.9175 10.1397 21.1225 9.75741 20.9097C9.44262 20.7418 8.99292 20.3274 9.74617 20.3162C10.4545 20.3051 10.9604 20.9657 11.129 21.2345C11.9385 22.5894 13.2314 22.2087 13.7485 21.9735C13.8272 21.3912 14.0633 20.9993 14.3219 20.7754C12.3207 20.5514 10.2296 19.7788 10.2296 16.3522C10.2296 15.378 10.5781 14.5718 11.1515 13.9447C11.0616 13.7207 10.7468 12.8025 11.2414 11.5707C11.2414 11.5707 11.9947 11.3356 13.7148 12.489C14.4343 12.2874 15.1988 12.1866 15.9633 12.1866C16.7278 12.1866 17.4923 12.2874 18.2118 12.489C19.9319 11.3244 20.6852 11.5707 20.6852 11.5707C21.1798 12.8025 20.8651 13.7207 20.7751 13.9447C21.3485 14.5718 21.697 15.3668 21.697 16.3522C21.697 19.79 19.5946 20.5514 17.5935 20.7754C17.9195 21.0553 18.2006 21.5928 18.2006 22.4326C18.2006 23.6308 18.1893 24.5938 18.1893 24.8962C18.1893 25.1313 18.358 25.4113 18.8077 25.3217C22.3603 24.1347 24.9349 20.7754 24.9349 16.8225C24.9349 11.8731 20.91 7.86426 15.9408 7.86426Z" fill="currentColor"/>
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

+14
View File
@@ -0,0 +1,14 @@
<svg viewBox="0 0 89 25" fill="none" xmlns="http://www.w3.org/2000/svg">
<path
d="M0 2.73999C0 1.50288 1.00579 0.5 2.2465 0.5H10.4256C11.8792 0.5 13.1513 1.47412 13.5263 2.87439L18.7506 22.3815C18.8474 22.7432 19.3816 22.6733 19.3816 22.299V0.5H25.8001V22.2599C25.8001 23.497 24.7943 24.4999 23.5536 24.4999H15.314C13.8643 24.4999 12.5946 23.5308 12.216 22.1355L7.04928 3.0892C6.95141 2.72844 6.41855 2.79902 6.41855 3.17275V24.4999H0V2.73999Z"
fill="currentColor"
/>
<path
d="M55.5159 0.500025C54.2752 0.500025 53.2694 1.5029 53.2694 2.74002V24.4999H59.6879V3.18233C59.6879 2.79548 60.2483 2.74066 60.3237 3.12013L64.0601 21.9219C64.3579 23.4203 65.6762 24.4999 67.2082 24.4999L74.6942 24.4999C76.2294 24.4999 77.5496 23.4158 77.8439 21.9135L81.5171 3.16662C81.5916 2.78643 82.153 2.84061 82.153 3.22798V24.4999H88.5714V2.74002C88.5714 1.5029 87.5656 0.500025 86.3249 0.500025L78.3813 0.50002C76.859 0.500019 75.5461 1.56646 75.2383 3.05306L71.2361 22.3844C71.1655 22.7251 70.6773 22.7246 70.6074 22.3838L66.6405 3.05837C66.3349 1.56926 65.0208 0.500019 63.4964 0.50002L55.5159 0.500025Z"
fill="currentColor"
/>
<path
d="M26.5569 0.50009H33.3531L39.2253 13.0169C39.4563 13.5093 40.1589 13.5085 40.3888 13.0155L46.2237 0.50009H53.1458L41.8949 24.5H34.9858L39.4713 14.9H35.3564C34.1107 14.9 32.9775 14.1813 32.4496 13.0563L26.5569 0.50009Z"
fill="currentColor"
/>
</svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

@@ -0,0 +1,3 @@
<svg width="84" height="84" viewBox="0 0 84 84" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M63 0H56V7H63H70H77V14V21V28H84V21V14C84 6.26801 77.732 0 70 0H63ZM7 77H14H21H28V84H21H14C6.26801 84 0 77.732 0 70V63V56H7L7 63L7 70L7 77ZM70 84C77.732 84 84 77.732 84 70V63V56H77V63V70V77H70H63H56V84H63H70ZM7 7L7 14L7 21L7 28H0V21V14C1.93187e-06 6.26801 6.26802 0 14 0H21H28V7L21 7L14 7L7 7ZM63 21L63 28L56 28L56 21L63 21ZM63 21V14L70 14L70 21L63 21ZM49 35V28L56 28V35H49ZM49 49V42L49 35L42 35L35 35L35 28L28 28L28 21L21 21L21 14L14 14L14 21L21 21L21 28L28 28V35L35 35V42V49L28 49L28 56L21 56L21 63H14L14 70H21L21 63L28 63L28 56H35V49H42L49 49ZM56 56H49L49 49L56 49V56ZM63 63L56 63V56L63 56L63 63ZM63 63H70V70H63L63 63Z" fill="#14E76F" style="fill:#14E76F;fill:color(display-p3 0.0784 0.9059 0.4353);fill-opacity:1;"/>
</svg>

After

Width:  |  Height:  |  Size: 872 B

+3
View File
@@ -0,0 +1,3 @@
<svg width="84" height="84" viewBox="0 0 84 84" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M84 14C84 6.26801 77.732 0 70 0H63H56V7H63H70H77V14V21V28H84V21V14ZM28 14C20.268 14 14 20.268 14 28C14 35.732 20.268 42 28 42C20.268 42 14 48.268 14 56C14 63.732 20.268 70 28 70C35.7299 70 41.9966 63.7354 42 56.0062C42.0034 63.7353 48.2701 70 56 70C63.732 70 70 63.732 70 56C70 48.2701 63.7353 42.0034 56.0062 42C63.7353 41.9966 70 35.7299 70 28C70 20.268 63.732 14 56 14C48.268 14 42 20.268 42 28C42 20.268 35.732 14 28 14ZM49 28V35L56 35H63V28V21L56 21H49V28ZM42 28.0062C41.9966 35.7329 35.7339 41.996 28.0074 42C35.736 42.004 42 48.2705 42 56C42 48.268 48.268 42 56 42C48.2701 42 42.0034 35.7353 42 28.0062ZM56 63H63V56V49L56 49H49V56V63L56 63ZM28 35H35V28V21L28 21H21V28L21 35L28 35ZM21 49V56L21 63L28 63H35V56V49L28 49H21ZM7 77H14H21H28V84H21H14C6.26801 84 0 77.732 0 70V63V56H7L7 63L7 70L7 77ZM70 84C77.732 84 84 77.732 84 70V63V56H77V63V70V77H70H63H56V84H63H70ZM7 7L7 14L7 21L7 28H0V21V14C1.93187e-06 6.26801 6.26802 0 14 0H21H28V7L21 7L14 7L7 7Z" fill="#14E76F" style="fill:#14E76F;fill:color(display-p3 0.0784 0.9059 0.4353);fill-opacity:1;"/>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

Some files were not shown because too many files have changed in this diff Show More