Compare commits
17 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 589ee64516 | |||
| b20ab5dc50 | |||
| 5bdff28a11 | |||
| 4795a643a4 | |||
| f7f6421415 | |||
| 891cfb80ea | |||
| 9344296804 | |||
| 3538b5237e | |||
| 5581f735d2 | |||
| c0ede6a506 | |||
| 5d6b84a94f | |||
| 66fff0edf0 | |||
| 2bdb623101 | |||
| 1f435880d7 | |||
| 34579222c5 | |||
| 2a43134327 | |||
| 844bcba6e8 |
@@ -1,6 +0,0 @@
|
|||||||
.git
|
|
||||||
.github
|
|
||||||
.gitignore
|
|
||||||
**/node_modules
|
|
||||||
**/target
|
|
||||||
dist
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
nym-validator-rewarder/.sqlx/** diff=nodiff
|
|
||||||
@@ -14,22 +14,3 @@ updates:
|
|||||||
prefix: build
|
prefix: build
|
||||||
prefix-development: chore
|
prefix-development: chore
|
||||||
include: scope
|
include: scope
|
||||||
# Update the root workspace (only). For now we don't include
|
|
||||||
# the contracts workspcae.
|
|
||||||
- package-ecosystem: cargo
|
|
||||||
directory: /
|
|
||||||
schedule:
|
|
||||||
interval: weekly
|
|
||||||
time: "09:00"
|
|
||||||
ignore:
|
|
||||||
- dependency-name: "cosmwasm-*"
|
|
||||||
- dependency-name: "cw*"
|
|
||||||
groups:
|
|
||||||
patch-updates:
|
|
||||||
patterns:
|
|
||||||
- "*"
|
|
||||||
update-types:
|
|
||||||
- "patch"
|
|
||||||
open-pull-requests-limit: 10
|
|
||||||
assignees:
|
|
||||||
- "octol"
|
|
||||||
|
|||||||
@@ -1,39 +0,0 @@
|
|||||||
name: build-deb-meta
|
|
||||||
|
|
||||||
on:
|
|
||||||
workflow_dispatch:
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
build:
|
|
||||||
runs-on: arc-ubuntu-22.04
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Checkout Repository
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Set up Build Environment
|
|
||||||
run: sudo apt-get update && sudo apt-get install -y make dpkg-dev
|
|
||||||
|
|
||||||
- name: Build Debian Packages
|
|
||||||
working-directory: ppa/packages
|
|
||||||
run: make
|
|
||||||
|
|
||||||
- name: Find .deb files
|
|
||||||
working-directory: ppa/packages
|
|
||||||
run: |
|
|
||||||
echo "file1=$(ls nym-repo-setup*.deb)" >> $GITHUB_ENV
|
|
||||||
echo "file2=$(ls nym-vpn*.deb)" >> $GITHUB_ENV
|
|
||||||
|
|
||||||
- name: Upload nym-repo-setup
|
|
||||||
uses: actions/upload-artifact@v4
|
|
||||||
with:
|
|
||||||
name: ${{ env.file1 }}
|
|
||||||
path: ppa/packages/nym-repo-setup*.deb
|
|
||||||
retention-days: 10
|
|
||||||
|
|
||||||
- name: Upload nym-vpn
|
|
||||||
uses: actions/upload-artifact@v4
|
|
||||||
with:
|
|
||||||
name: ${{ env.file2 }}
|
|
||||||
path: ppa/packages/nym-vpn*.deb
|
|
||||||
retention-days: 10
|
|
||||||
@@ -5,28 +5,21 @@ on:
|
|||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
runs-on: arc-ubuntu-20.04
|
runs-on: ubuntu-20.04-16-core
|
||||||
defaults:
|
|
||||||
run:
|
|
||||||
working-directory: documentation/docs
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v3
|
||||||
- name: Install Dependencies (Linux)
|
- name: Install Dependencies (Linux)
|
||||||
run: sudo apt-get update && sudo apt-get install -y build-essential curl wget libssl-dev libudev-dev squashfs-tools protobuf-compiler git python3 && sudo apt-get update --fix-missing
|
run: sudo apt-get update && sudo apt-get install -y build-essential curl wget libssl-dev libudev-dev squashfs-tools protobuf-compiler git python3 && sudo apt-get update --fix-missing
|
||||||
- name: Install pip3
|
- name: Install pip3
|
||||||
run: sudo apt install -y python3-pip
|
run: sudo apt install -y python3-pip
|
||||||
- name: Install Python3 modules
|
- name: Install Python3 modules
|
||||||
run: sudo pip3 install pandas tabulate
|
run: sudo pip3 install pandas tabulate
|
||||||
- name: Install rsync
|
- name: Install rsync
|
||||||
run: sudo apt-get install rsync
|
run: sudo apt-get install rsync
|
||||||
- uses: rlespinasse/github-slug-action@v3.x
|
- uses: rlespinasse/github-slug-action@v3.x
|
||||||
- name: Setup pnpm
|
- uses: actions/setup-node@v3
|
||||||
uses: pnpm/action-setup@v4.0.0
|
|
||||||
with:
|
with:
|
||||||
version: 9
|
node-version: 18
|
||||||
- uses: actions/setup-node@v4
|
|
||||||
with:
|
|
||||||
node-version: 20
|
|
||||||
- name: Install Rust stable
|
- name: Install Rust stable
|
||||||
uses: actions-rs/toolchain@v1
|
uses: actions-rs/toolchain@v1
|
||||||
with:
|
with:
|
||||||
@@ -36,13 +29,33 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
command: build
|
command: build
|
||||||
args: --workspace --release
|
args: --workspace --release
|
||||||
|
- name: Install mdbook and plugins
|
||||||
|
run: cd documentation && ./install_mdbook_deps.sh
|
||||||
|
- name: Remove existing Nym config directory (`~/.nym/`)
|
||||||
|
run: cd documentation && ./remove_existing_config.sh
|
||||||
|
continue-on-error: false
|
||||||
|
# This is the original flow
|
||||||
|
# - name: Build all projects in documentation/ & move to ~/dist/docs/
|
||||||
|
# run: cd documentation && ./build_all_to_dist.sh
|
||||||
|
|
||||||
- name: Install project dependencies
|
# This is a workaround replacement which builds on the last working commit b332a6b55668f60988e36961f3f62a794ba82ddb and then on current branch
|
||||||
run: pnpm i
|
- name: Save current branch to ~/current_branch
|
||||||
- name: Build project
|
run: git rev-parse --abbrev-ref HEAD > ~/current_branch
|
||||||
run: pnpm run build
|
- name: Git pull, reset & switch to b332a6b55668f60988e36961f3f62a794ba82ddb
|
||||||
- name: Move files to /dist/
|
run: git pull && git reset --hard && git checkout b332a6b55668f60988e36961f3f62a794ba82ddb
|
||||||
run: ../scripts/move-to-dist.sh
|
- name: Build all projects in documentation/ & move to ~/dist/docs/ from b332a6b55668f60988e36961f3f62a794ba82ddb
|
||||||
|
run: cd documentation && ./build_all_to_dist.sh
|
||||||
|
|
||||||
|
- name: Switch to current branch
|
||||||
|
run: git checkout $echo "$(cat ~/current_branch)"
|
||||||
|
- name: Build all projects in documentation/ & move to ~/dist/docs/ on current branch
|
||||||
|
run: cd documentation && ./build_all_to_dist.sh && rm ~/current_branch
|
||||||
|
|
||||||
|
# End of replacemet
|
||||||
|
|
||||||
|
- name: Post process
|
||||||
|
run: cd documentation && ./post_process.sh
|
||||||
|
continue-on-error: false
|
||||||
|
|
||||||
- name: Create Vercel project file
|
- name: Create Vercel project file
|
||||||
uses: mobiledevops/secret-to-file-action@v1
|
uses: mobiledevops/secret-to-file-action@v1
|
||||||
@@ -86,3 +99,24 @@ jobs:
|
|||||||
run: vercel deploy --prebuilt --prod --token=${{ secrets.VERCEL_TOKEN }}
|
run: vercel deploy --prebuilt --prod --token=${{ secrets.VERCEL_TOKEN }}
|
||||||
working-directory: dist/docs
|
working-directory: dist/docs
|
||||||
continue-on-error: false
|
continue-on-error: false
|
||||||
|
|
||||||
|
- name: Matrix - Node Install
|
||||||
|
run: npm install
|
||||||
|
working-directory: .github/workflows/support-files
|
||||||
|
- name: Matrix - Send Notification
|
||||||
|
env:
|
||||||
|
NYM_NOTIFICATION_KIND: cd-docs
|
||||||
|
NYM_PROJECT_NAME: "Docs CD"
|
||||||
|
NYM_CI_WWW_BASE: "${{ secrets.NYM_CD_WWW_BASE }}"
|
||||||
|
NYM_CI_WWW_LOCATION: "${{ env.GITHUB_REF_SLUG }}"
|
||||||
|
GIT_COMMIT_MESSAGE: "${{ github.event.head_commit.message }}"
|
||||||
|
GIT_BRANCH: "${GITHUB_REF##*/}"
|
||||||
|
MATRIX_SERVER: "${{ secrets.MATRIX_SERVER }}"
|
||||||
|
MATRIX_ROOM: "${{ secrets.MATRIX_ROOM_DOCS }}"
|
||||||
|
MATRIX_USER_ID: "${{ secrets.MATRIX_USER_ID }}"
|
||||||
|
MATRIX_TOKEN: "${{ secrets.MATRIX_TOKEN }}"
|
||||||
|
MATRIX_DEVICE_ID: "${{ secrets.MATRIX_DEVICE_ID }}"
|
||||||
|
IS_SUCCESS: "${{ job.status == 'success' }}"
|
||||||
|
uses: docker://keybaseio/client:stable-node
|
||||||
|
with:
|
||||||
|
args: .github/workflows/support-files/notifications/entry_point.sh
|
||||||
|
|||||||
@@ -13,7 +13,6 @@ on:
|
|||||||
- 'mixnode/**'
|
- 'mixnode/**'
|
||||||
- 'sdk/rust/nym-sdk/**'
|
- 'sdk/rust/nym-sdk/**'
|
||||||
- 'service-providers/**'
|
- 'service-providers/**'
|
||||||
- '.github/workflows/ci-binary-config-checker.yml'
|
|
||||||
pull_request:
|
pull_request:
|
||||||
paths:
|
paths:
|
||||||
- 'clients/**'
|
- 'clients/**'
|
||||||
@@ -23,7 +22,6 @@ on:
|
|||||||
- 'mixnode/**'
|
- 'mixnode/**'
|
||||||
- 'sdk/rust/nym-sdk/**'
|
- 'sdk/rust/nym-sdk/**'
|
||||||
- 'service-providers/**'
|
- 'service-providers/**'
|
||||||
- '.github/workflows/ci-binary-config-checker.yml'
|
|
||||||
|
|
||||||
env:
|
env:
|
||||||
NETWORK: mainnet
|
NETWORK: mainnet
|
||||||
@@ -33,11 +31,11 @@ jobs:
|
|||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
platform: [arc-ubuntu-20.04]
|
platform: [custom-linux]
|
||||||
|
|
||||||
runs-on: ${{ matrix.platform }}
|
runs-on: ${{ matrix.platform }}
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v3
|
||||||
|
|
||||||
- name: Install Dependencies (Linux)
|
- name: Install Dependencies (Linux)
|
||||||
run: sudo apt-get update && sudo apt-get -y install jq vim libwebkit2gtk-4.0-dev build-essential curl wget libssl-dev libgtk-3-dev libudev-dev squashfs-tools
|
run: sudo apt-get update && sudo apt-get -y install jq vim libwebkit2gtk-4.0-dev build-essential curl wget libssl-dev libgtk-3-dev libudev-dev squashfs-tools
|
||||||
|
|||||||
@@ -1,23 +1,21 @@
|
|||||||
name: ci-build-ts
|
name: ci-build-ts
|
||||||
|
|
||||||
on:
|
on:
|
||||||
workflow_dispatch:
|
|
||||||
pull_request:
|
pull_request:
|
||||||
paths:
|
paths:
|
||||||
- "ts-packages/**"
|
- "ts-packages/**"
|
||||||
- "sdk/typescript/**"
|
- "sdk/typescript/**"
|
||||||
- ".github/workflows/ci-build-ts.yml"
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
runs-on: arc-ubuntu-20.04
|
runs-on: ubuntu-20.04-16-core
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v2
|
||||||
- name: Install rsync
|
- name: Install rsync
|
||||||
run: sudo apt-get install rsync
|
run: sudo apt-get install rsync
|
||||||
continue-on-error: true
|
continue-on-error: true
|
||||||
- uses: rlespinasse/github-slug-action@v3.x
|
- uses: rlespinasse/github-slug-action@v3.x
|
||||||
- uses: actions/setup-node@v4
|
- uses: actions/setup-node@v3
|
||||||
with:
|
with:
|
||||||
node-version: 18
|
node-version: 18
|
||||||
- name: Setup yarn
|
- name: Setup yarn
|
||||||
@@ -46,3 +44,23 @@ jobs:
|
|||||||
REMOTE_USER: ${{ secrets.CI_WWW_REMOTE_USER }}
|
REMOTE_USER: ${{ secrets.CI_WWW_REMOTE_USER }}
|
||||||
TARGET: ${{ secrets.CI_WWW_REMOTE_TARGET }}/ts-${{ env.GITHUB_REF_SLUG }}-example
|
TARGET: ${{ secrets.CI_WWW_REMOTE_TARGET }}/ts-${{ env.GITHUB_REF_SLUG }}-example
|
||||||
EXCLUDE: "/dist/, /node_modules/"
|
EXCLUDE: "/dist/, /node_modules/"
|
||||||
|
- name: Matrix - Node Install
|
||||||
|
run: npm install
|
||||||
|
working-directory: .github/workflows/support-files
|
||||||
|
- name: Matrix - Send Notification
|
||||||
|
env:
|
||||||
|
NYM_NOTIFICATION_KIND: ts-packages
|
||||||
|
NYM_PROJECT_NAME: "ts-packages"
|
||||||
|
NYM_CI_WWW_BASE: "${{ secrets.NYM_CI_WWW_BASE }}"
|
||||||
|
NYM_CI_WWW_LOCATION: "ts-${{ env.GITHUB_REF_SLUG }}"
|
||||||
|
GIT_COMMIT_MESSAGE: "${{ github.event.head_commit.message }}"
|
||||||
|
GIT_BRANCH: "${GITHUB_REF##*/}"
|
||||||
|
IS_SUCCESS: "${{ job.status == 'success' }}"
|
||||||
|
MATRIX_SERVER: "${{ secrets.MATRIX_SERVER }}"
|
||||||
|
MATRIX_ROOM: "${{ secrets.MATRIX_ROOM }}"
|
||||||
|
MATRIX_USER_ID: "${{ secrets.MATRIX_USER_ID }}"
|
||||||
|
MATRIX_TOKEN: "${{ secrets.MATRIX_TOKEN }}"
|
||||||
|
MATRIX_DEVICE_ID: "${{ secrets.MATRIX_DEVICE_ID }}"
|
||||||
|
uses: docker://keybaseio/client:stable-node
|
||||||
|
with:
|
||||||
|
args: .github/workflows/support-files/notifications/entry_point.sh
|
||||||
|
|||||||
@@ -15,20 +15,35 @@ on:
|
|||||||
type: boolean
|
type: boolean
|
||||||
schedule:
|
schedule:
|
||||||
- cron: "14 0 * * *"
|
- cron: "14 0 * * *"
|
||||||
|
pull_request:
|
||||||
|
paths:
|
||||||
|
- "clients/**"
|
||||||
|
- "common/**"
|
||||||
|
- "explorer-api/**"
|
||||||
|
- "gateway/**"
|
||||||
|
- "integrations/**"
|
||||||
|
- "mixnode/**"
|
||||||
|
- "nym-api/**"
|
||||||
|
- "nym-node/**"
|
||||||
|
- "nym-outfox/**"
|
||||||
|
- "nym-validator-rewarder/**"
|
||||||
|
- "sdk/rust/nym-sdk/**"
|
||||||
|
- "service-providers/**"
|
||||||
|
- "tools/**"
|
||||||
|
- "nymvisor/**"
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
publish-nym:
|
publish-nym:
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
platform: [ arc-ubuntu-20.04 ]
|
platform: [ ubuntu-20.04 ]
|
||||||
|
|
||||||
runs-on: ${{ matrix.platform }}
|
runs-on: ${{ matrix.platform }}
|
||||||
env:
|
env:
|
||||||
CARGO_TERM_COLOR: always
|
CARGO_TERM_COLOR: always
|
||||||
RUSTUP_PERMIT_COPY_RENAME: 1
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v3
|
||||||
|
|
||||||
- name: Prepare build output directory
|
- name: Prepare build output directory
|
||||||
shell: bash
|
shell: bash
|
||||||
@@ -40,13 +55,17 @@ jobs:
|
|||||||
echo $OUTPUT_DIR
|
echo $OUTPUT_DIR
|
||||||
|
|
||||||
- name: Install Dependencies (Linux)
|
- name: Install Dependencies (Linux)
|
||||||
run: sudo apt-get update && sudo apt-get -y install libudev-dev
|
run: sudo apt update && sudo apt install libudev-dev
|
||||||
|
|
||||||
- name: Sets env vars for tokio if set in manual dispatch inputs
|
- name: Sets env vars for tokio if set in manual dispatch inputs
|
||||||
run: |
|
run: |
|
||||||
echo 'RUSTFLAGS="--cfg tokio_unstable"' >> $GITHUB_ENV
|
echo 'RUSTFLAGS="--cfg tokio_unstable"' >> $GITHUB_ENV
|
||||||
if: github.event_name == 'workflow_dispatch' && inputs.add_tokio_unstable == true
|
if: github.event_name == 'workflow_dispatch' && inputs.add_tokio_unstable == true
|
||||||
|
|
||||||
|
- name: Set CARGO_FEATURES
|
||||||
|
run: |
|
||||||
|
echo 'CARGO_FEATURES=--features wireguard' >> $GITHUB_ENV
|
||||||
|
|
||||||
- name: Install Rust stable
|
- name: Install Rust stable
|
||||||
uses: actions-rs/toolchain@v1
|
uses: actions-rs/toolchain@v1
|
||||||
with:
|
with:
|
||||||
@@ -72,7 +91,7 @@ jobs:
|
|||||||
|
|
||||||
- name: Upload Artifact
|
- name: Upload Artifact
|
||||||
if: github.event_name == 'workflow_dispatch'
|
if: github.event_name == 'workflow_dispatch'
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v3
|
||||||
with:
|
with:
|
||||||
name: nym-binaries-artifacts
|
name: nym-binaries-artifacts
|
||||||
path: |
|
path: |
|
||||||
|
|||||||
@@ -1,42 +0,0 @@
|
|||||||
name: ci-build-vpn-api-wasm
|
|
||||||
|
|
||||||
on:
|
|
||||||
pull_request:
|
|
||||||
paths:
|
|
||||||
- 'common/**'
|
|
||||||
- 'nym-credential-proxy/**'
|
|
||||||
- '.github/workflows/ci-build-vpn-api-wasm.yml'
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
wasm:
|
|
||||||
runs-on: arc-ubuntu-22.04
|
|
||||||
env:
|
|
||||||
CARGO_TERM_COLOR: always
|
|
||||||
RUSTUP_PERMIT_COPY_RENAME: 1
|
|
||||||
steps:
|
|
||||||
- name: Check out repository code
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Install Rust toolchain
|
|
||||||
uses: actions-rs/toolchain@v1
|
|
||||||
with:
|
|
||||||
profile: minimal
|
|
||||||
toolchain: stable
|
|
||||||
target: wasm32-unknown-unknown
|
|
||||||
override: true
|
|
||||||
components: rustfmt, clippy
|
|
||||||
|
|
||||||
- name: Install wasm-pack
|
|
||||||
run: curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | sh
|
|
||||||
|
|
||||||
- name: Install wasm-opt
|
|
||||||
uses: ./.github/actions/install-wasm-opt
|
|
||||||
with:
|
|
||||||
version: '116'
|
|
||||||
|
|
||||||
- name: Install wasm-bindgen-cli
|
|
||||||
run: cargo install wasm-bindgen-cli
|
|
||||||
|
|
||||||
- name: "Build"
|
|
||||||
run: make
|
|
||||||
working-directory: nym-credential-proxy/vpn-api-lib-wasm
|
|
||||||
@@ -1,6 +1,23 @@
|
|||||||
name: ci-build
|
name: ci-build
|
||||||
|
|
||||||
on:
|
on:
|
||||||
|
push:
|
||||||
|
paths:
|
||||||
|
- 'clients/**'
|
||||||
|
- 'common/**'
|
||||||
|
- 'explorer-api/**'
|
||||||
|
- 'gateway/**'
|
||||||
|
- 'integrations/**'
|
||||||
|
- 'mixnode/**'
|
||||||
|
- 'sdk/lib/socks5-listener/**'
|
||||||
|
- 'sdk/rust/nym-sdk/**'
|
||||||
|
- 'service-providers/**'
|
||||||
|
- 'nym-api/**'
|
||||||
|
- 'nym-outfox/**'
|
||||||
|
- 'tools/nym-cli/**'
|
||||||
|
- 'tools/nym-nr-query/**'
|
||||||
|
- 'tools/ts-rs-cli/**'
|
||||||
|
- 'Cargo.toml'
|
||||||
pull_request:
|
pull_request:
|
||||||
paths:
|
paths:
|
||||||
- 'clients/**'
|
- 'clients/**'
|
||||||
@@ -8,23 +25,16 @@ on:
|
|||||||
- 'explorer-api/**'
|
- 'explorer-api/**'
|
||||||
- 'gateway/**'
|
- 'gateway/**'
|
||||||
- 'integrations/**'
|
- 'integrations/**'
|
||||||
- 'nym-api/**'
|
- 'mixnode/**'
|
||||||
- 'nym-credential-proxy/**'
|
- 'sdk/lib/socks5-listener/**'
|
||||||
- 'nym-network-monitor/**'
|
- 'sdk/rust/nym-sdk/**'
|
||||||
- 'nym-node/**'
|
|
||||||
- 'nym-node-status-api/**'
|
|
||||||
- 'nym-outfox/**'
|
|
||||||
- 'nym-validator-rewarder/**'
|
|
||||||
- 'nyx-chain-watcher/**'
|
|
||||||
- 'sdk/ffi/**'
|
|
||||||
- 'sdk/rust/**'
|
|
||||||
- 'service-providers/**'
|
- 'service-providers/**'
|
||||||
- 'nym-browser-extension/storage/**'
|
- 'nym-api/**'
|
||||||
- 'tools/**'
|
- 'nym-outfox/**'
|
||||||
- 'wasm/**'
|
- 'tools/nym-cli/**'
|
||||||
|
- 'tools/nym-nr-query/**'
|
||||||
|
- 'tools/ts-rs-cli/**'
|
||||||
- 'Cargo.toml'
|
- 'Cargo.toml'
|
||||||
- 'Cargo.lock'
|
|
||||||
- '.github/workflows/ci-build.yml'
|
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
@@ -32,20 +42,18 @@ jobs:
|
|||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
os: [ arc-ubuntu-20.04, custom-windows-11, custom-runner-mac-m1 ]
|
os: [custom-linux, custom-runner-mac-m1]
|
||||||
runs-on: ${{ matrix.os }}
|
runs-on: ${{ matrix.os }}
|
||||||
env:
|
env:
|
||||||
CARGO_TERM_COLOR: always
|
CARGO_TERM_COLOR: always
|
||||||
IPINFO_API_TOKEN: ${{ secrets.IPINFO_API_TOKEN }}
|
|
||||||
RUSTUP_PERMIT_COPY_RENAME: 1
|
|
||||||
steps:
|
steps:
|
||||||
- name: Install Dependencies (Linux)
|
- 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 libudev-dev squashfs-tools protobuf-compiler
|
run: sudo apt-get update && sudo apt-get -y install libwebkit2gtk-4.0-dev build-essential curl wget libssl-dev libgtk-3-dev libudev-dev squashfs-tools protobuf-compiler
|
||||||
continue-on-error: true
|
continue-on-error: true
|
||||||
if: contains(matrix.os, 'ubuntu')
|
if: matrix.os == 'custom-linux'
|
||||||
|
|
||||||
- name: Check out repository code
|
- name: Check out repository code
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v2
|
||||||
|
|
||||||
- name: Install rust toolchain
|
- name: Install rust toolchain
|
||||||
uses: actions-rs/toolchain@v1
|
uses: actions-rs/toolchain@v1
|
||||||
@@ -55,54 +63,50 @@ jobs:
|
|||||||
override: true
|
override: true
|
||||||
components: rustfmt, clippy
|
components: rustfmt, clippy
|
||||||
|
|
||||||
# To avoid running out of disk space, skip generating debug symbols
|
|
||||||
- name: Set debug to false (unix)
|
|
||||||
if: contains(matrix.os, 'ubuntu') || contains(matrix.os, 'mac')
|
|
||||||
run: |
|
|
||||||
sed -i.bak 's/\[profile.dev\]/\[profile.dev\]\ndebug = false/' Cargo.toml
|
|
||||||
git diff
|
|
||||||
|
|
||||||
- name: Set debug to false (win)
|
|
||||||
if: contains(matrix.os, 'windows')
|
|
||||||
shell: pwsh
|
|
||||||
run: |
|
|
||||||
(Get-Content Cargo.toml) -replace '\[profile.dev\]', "`$&`ndebug = false" | Set-Content Cargo.toml
|
|
||||||
git diff
|
|
||||||
|
|
||||||
- name: Check formatting
|
- name: Check formatting
|
||||||
uses: actions-rs/cargo@v1
|
uses: actions-rs/cargo@v1
|
||||||
with:
|
with:
|
||||||
command: fmt
|
command: fmt
|
||||||
args: --all -- --check
|
args: --all -- --check
|
||||||
|
|
||||||
- name: Clippy
|
|
||||||
uses: actions-rs/cargo@v1
|
|
||||||
with:
|
|
||||||
command: clippy
|
|
||||||
args: --workspace --all-targets -- -D warnings
|
|
||||||
|
|
||||||
- name: Build all binaries
|
- name: Build all binaries
|
||||||
uses: actions-rs/cargo@v1
|
uses: actions-rs/cargo@v1
|
||||||
with:
|
with:
|
||||||
command: build
|
command: build
|
||||||
|
# Enable wireguard by default on linux only
|
||||||
|
args: --workspace --features wireguard
|
||||||
|
|
||||||
- name: Build all examples
|
- name: Build all examples
|
||||||
if: contains(matrix.os, 'ubuntu')
|
if: matrix.os == 'custom-linux'
|
||||||
uses: actions-rs/cargo@v1
|
uses: actions-rs/cargo@v1
|
||||||
with:
|
with:
|
||||||
command: build
|
command: build
|
||||||
args: --workspace --examples
|
args: --workspace --examples --features wireguard
|
||||||
|
|
||||||
- name: Run all tests
|
- name: Run all tests
|
||||||
if: contains(matrix.os, 'ubuntu')
|
if: matrix.os == 'custom-linux'
|
||||||
uses: actions-rs/cargo@v1
|
uses: actions-rs/cargo@v1
|
||||||
with:
|
with:
|
||||||
command: test
|
command: test
|
||||||
args: --workspace
|
args: --workspace --features wireguard
|
||||||
|
|
||||||
- name: Run expensive tests
|
- name: Run expensive tests
|
||||||
if: (github.ref == 'refs/heads/develop' || github.event.pull_request.base.ref == 'develop' || github.event.pull_request.base.ref == 'master') && contains(matrix.os, 'ubuntu')
|
if: (github.ref == 'refs/heads/develop' || github.event.pull_request.base.ref == 'develop' || github.event.pull_request.base.ref == 'master') && matrix.os == 'custom-linux'
|
||||||
uses: actions-rs/cargo@v1
|
uses: actions-rs/cargo@v1
|
||||||
with:
|
with:
|
||||||
command: test
|
command: test
|
||||||
args: --workspace -- --ignored
|
args: --workspace --features wireguard -- --ignored
|
||||||
|
|
||||||
|
- name: Annotate with clippy checks
|
||||||
|
if: matrix.os == 'custom-linux'
|
||||||
|
uses: actions-rs/clippy-check@v1
|
||||||
|
continue-on-error: true
|
||||||
|
with:
|
||||||
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
args: --workspace --features wireguard
|
||||||
|
|
||||||
|
- name: Clippy
|
||||||
|
uses: actions-rs/cargo@v1
|
||||||
|
with:
|
||||||
|
command: clippy
|
||||||
|
args: --workspace --all-targets --features wireguard -- -D warnings
|
||||||
|
|||||||
@@ -2,14 +2,10 @@ name: ci-cargo-deny
|
|||||||
on:
|
on:
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
pull_request:
|
pull_request:
|
||||||
paths:
|
|
||||||
- 'Cargo.toml'
|
|
||||||
- 'Cargo.lock'
|
|
||||||
- '.github/workflows/ci-cargo-deny.yml'
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
cargo-deny:
|
cargo-deny:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-22.04
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
checks:
|
checks:
|
||||||
@@ -17,9 +13,9 @@ jobs:
|
|||||||
- licenses bans sources
|
- licenses bans sources
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v3
|
||||||
- uses: EmbarkStudios/cargo-deny-action@v2
|
- uses: EmbarkStudios/cargo-deny-action@v1
|
||||||
with:
|
with:
|
||||||
log-level: warn
|
log-level: warn
|
||||||
command: check ${{ matrix.checks }}
|
command: check ${{ matrix.checks }}
|
||||||
arguments: --all-features
|
argument: --all-features
|
||||||
|
|||||||
@@ -2,5 +2,9 @@
|
|||||||
{
|
{
|
||||||
"rust":"stable",
|
"rust":"stable",
|
||||||
"runOnEvent":"always"
|
"runOnEvent":"always"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"rust":"beta",
|
||||||
|
"runOnEvent":"pull_request"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -6,17 +6,16 @@ on:
|
|||||||
paths:
|
paths:
|
||||||
- 'contracts/**'
|
- 'contracts/**'
|
||||||
- 'common/**'
|
- 'common/**'
|
||||||
- '.github/workflows/ci-contracts-schema.yml'
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
check-schema:
|
check-schema:
|
||||||
name: Generate and check schema
|
name: Generate and check schema
|
||||||
runs-on: ubuntu-20.04
|
runs-on: custom-linux
|
||||||
env:
|
env:
|
||||||
CARGO_TERM_COLOR: always
|
CARGO_TERM_COLOR: always
|
||||||
steps:
|
steps:
|
||||||
- name: Check out repository code
|
- name: Check out repository code
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v2
|
||||||
|
|
||||||
- name: Install Rust toolchain
|
- name: Install Rust toolchain
|
||||||
uses: actions-rs/toolchain@v1
|
uses: actions-rs/toolchain@v1
|
||||||
|
|||||||
@@ -2,6 +2,10 @@ name: ci-contracts-upload-binaries
|
|||||||
|
|
||||||
on:
|
on:
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
pull_request:
|
||||||
|
paths:
|
||||||
|
- 'common/**'
|
||||||
|
- 'contracts/**'
|
||||||
|
|
||||||
env:
|
env:
|
||||||
NETWORK: mainnet
|
NETWORK: mainnet
|
||||||
@@ -11,13 +15,13 @@ jobs:
|
|||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
platform: [ arc-ubuntu-20.04 ]
|
platform: [ ubuntu-20.04 ]
|
||||||
|
|
||||||
runs-on: ${{ matrix.platform }}
|
runs-on: ${{ matrix.platform }}
|
||||||
env:
|
env:
|
||||||
CARGO_TERM_COLOR: always
|
CARGO_TERM_COLOR: always
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v3
|
||||||
|
|
||||||
- name: Prepare build output directory
|
- name: Prepare build output directory
|
||||||
shell: bash
|
shell: bash
|
||||||
|
|||||||
@@ -9,9 +9,6 @@ on:
|
|||||||
paths:
|
paths:
|
||||||
- 'contracts/**'
|
- 'contracts/**'
|
||||||
- 'common/**'
|
- 'common/**'
|
||||||
- 'Cargo.lock'
|
|
||||||
- 'Cargo.toml'
|
|
||||||
- '.github/workflows/ci-contracts.yml'
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
matrix_prep:
|
matrix_prep:
|
||||||
@@ -20,7 +17,7 @@ jobs:
|
|||||||
matrix: ${{ steps.set-matrix.outputs.matrix }}
|
matrix: ${{ steps.set-matrix.outputs.matrix }}
|
||||||
steps:
|
steps:
|
||||||
# creates the matrix strategy from ci-contracts-matrix-includes.json
|
# creates the matrix strategy from ci-contracts-matrix-includes.json
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v2
|
||||||
- id: set-matrix
|
- id: set-matrix
|
||||||
uses: JoshuaTheMiller/conditional-build-matrix@main
|
uses: JoshuaTheMiller/conditional-build-matrix@main
|
||||||
with:
|
with:
|
||||||
@@ -37,7 +34,7 @@ jobs:
|
|||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix: ${{fromJson(needs.matrix_prep.outputs.matrix)}}
|
matrix: ${{fromJson(needs.matrix_prep.outputs.matrix)}}
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v2
|
||||||
|
|
||||||
- name: Setup rust
|
- name: Setup rust
|
||||||
uses: actions-rs/toolchain@v1
|
uses: actions-rs/toolchain@v1
|
||||||
|
|||||||
@@ -3,35 +3,27 @@ name: ci-docs
|
|||||||
on:
|
on:
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
push:
|
push:
|
||||||
branches-ignore: [master]
|
branches-ignore: master
|
||||||
paths:
|
paths:
|
||||||
- "documentation/docs/**"
|
- 'documentation/docs/**'
|
||||||
- ".github/workflows/ci-docs.yml"
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
runs-on: arc-ubuntu-20.04
|
runs-on: ubuntu-20.04-16-core
|
||||||
defaults:
|
|
||||||
run:
|
|
||||||
working-directory: documentation/docs
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v3
|
||||||
- name: Install Dependencies (Linux)
|
- name: Install Dependencies (Linux)
|
||||||
run: sudo apt-get update && sudo apt-get install -y build-essential curl wget libssl-dev libudev-dev squashfs-tools protobuf-compiler git python3 && sudo apt-get update --fix-missing
|
run: sudo apt-get update && sudo apt-get install -y build-essential curl wget libssl-dev libudev-dev squashfs-tools protobuf-compiler git python3 && sudo apt-get update --fix-missing
|
||||||
- name: Install pip3
|
- name: Install pip3
|
||||||
run: sudo apt install -y python3-pip
|
run: sudo apt install -y python3-pip
|
||||||
- name: Install Python3 modules
|
- name: Install Python3 modules
|
||||||
run: sudo pip3 install pandas tabulate
|
run: sudo pip3 install pandas tabulate
|
||||||
- name: Install rsync
|
- name: Install rsync
|
||||||
run: sudo apt-get install rsync
|
run: sudo apt-get install rsync
|
||||||
- uses: rlespinasse/github-slug-action@v3.x
|
- uses: rlespinasse/github-slug-action@v3.x
|
||||||
- name: Setup pnpm
|
- uses: actions/setup-node@v3
|
||||||
uses: pnpm/action-setup@v4.0.0
|
|
||||||
with:
|
with:
|
||||||
version: 9
|
node-version: 18
|
||||||
- uses: actions/setup-node@v4
|
|
||||||
with:
|
|
||||||
node-version: 20
|
|
||||||
- name: Install Rust stable
|
- name: Install Rust stable
|
||||||
uses: actions-rs/toolchain@v1
|
uses: actions-rs/toolchain@v1
|
||||||
with:
|
with:
|
||||||
@@ -41,13 +33,30 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
command: build
|
command: build
|
||||||
args: --workspace --release
|
args: --workspace --release
|
||||||
|
- name: Install mdbook and plugins
|
||||||
|
run: cd documentation && ./install_mdbook_deps.sh
|
||||||
|
- name: Remove existing Nym config directory (`~/.nym/`)
|
||||||
|
run: cd documentation && ./remove_existing_config.sh
|
||||||
|
continue-on-error: false
|
||||||
|
|
||||||
- name: Install project dependencies
|
# This is the original flow
|
||||||
run: pnpm i
|
# - name: Build all projects in documentation/ & move to ~/dist/docs/
|
||||||
- name: Build project
|
# run: cd documentation && ./build_all_to_dist.sh
|
||||||
run: pnpm run build
|
|
||||||
- name: Move files to /dist/
|
# This is a workaround replacement which builds on the last working commit b332a6b55668f60988e36961f3f62a794ba82ddb and then on current branch
|
||||||
run: ../scripts/move-to-dist.sh
|
- name: Save current branch to ~/current_branch
|
||||||
|
run: git rev-parse --abbrev-ref HEAD > ~/current_branch
|
||||||
|
- name: Git pull, reset & switch to b332a6b55668f60988e36961f3f62a794ba82ddb
|
||||||
|
run: git pull && git reset --hard && git checkout b332a6b55668f60988e36961f3f62a794ba82ddb
|
||||||
|
- name: Build all projects in documentation/ & move to ~/dist/docs/ from b332a6b55668f60988e36961f3f62a794ba82ddb
|
||||||
|
run: cd documentation && ./build_all_to_dist.sh
|
||||||
|
|
||||||
|
- name: Switch to current branch
|
||||||
|
run: git checkout $echo "$(cat ~/current_branch)"
|
||||||
|
- name: Build all projects in documentation/ & move to ~/dist/docs/ on current branch
|
||||||
|
run: cd documentation && ./build_all_to_dist.sh && rm ~/current_branch
|
||||||
|
|
||||||
|
# End of replacemet
|
||||||
|
|
||||||
- name: Deploy branch to CI www
|
- name: Deploy branch to CI www
|
||||||
continue-on-error: true
|
continue-on-error: true
|
||||||
@@ -58,5 +67,26 @@ jobs:
|
|||||||
SOURCE: "dist/docs/"
|
SOURCE: "dist/docs/"
|
||||||
REMOTE_HOST: ${{ secrets.CI_WWW_REMOTE_HOST }}
|
REMOTE_HOST: ${{ secrets.CI_WWW_REMOTE_HOST }}
|
||||||
REMOTE_USER: ${{ secrets.CI_WWW_REMOTE_USER }}
|
REMOTE_USER: ${{ secrets.CI_WWW_REMOTE_USER }}
|
||||||
TARGET: ${{ secrets.CI_WWW_REMOTE_TARGET }}/docs-nextra-${{ env.GITHUB_REF_SLUG }}
|
TARGET: ${{ secrets.CI_WWW_REMOTE_TARGET }}/docs-${{ env.GITHUB_REF_SLUG }}
|
||||||
EXCLUDE: "/node_modules/"
|
EXCLUDE: "/node_modules/"
|
||||||
|
|
||||||
|
- name: Matrix - Node Install
|
||||||
|
run: npm install
|
||||||
|
working-directory: .github/workflows/support-files
|
||||||
|
- name: Matrix - Send Notification
|
||||||
|
env:
|
||||||
|
NYM_NOTIFICATION_KIND: ci-docs
|
||||||
|
NYM_PROJECT_NAME: "Docs CI"
|
||||||
|
NYM_CI_WWW_BASE: "${{ secrets.NYM_CI_WWW_BASE }}"
|
||||||
|
NYM_CI_WWW_LOCATION: "docs-${{ env.GITHUB_REF_SLUG }}"
|
||||||
|
GIT_COMMIT_MESSAGE: "${{ github.event.head_commit.message }}"
|
||||||
|
GIT_BRANCH: "${GITHUB_REF##*/}"
|
||||||
|
MATRIX_SERVER: "${{ secrets.MATRIX_SERVER }}"
|
||||||
|
MATRIX_ROOM: "${{ secrets.MATRIX_ROOM_DOCS }}"
|
||||||
|
MATRIX_USER_ID: "${{ secrets.MATRIX_USER_ID }}"
|
||||||
|
MATRIX_TOKEN: "${{ secrets.MATRIX_TOKEN }}"
|
||||||
|
MATRIX_DEVICE_ID: "${{ secrets.MATRIX_DEVICE_ID }}"
|
||||||
|
IS_SUCCESS: "${{ job.status == 'success' }}"
|
||||||
|
uses: docker://keybaseio/client:stable-node
|
||||||
|
with:
|
||||||
|
args: .github/workflows/support-files/notifications/entry_point.sh
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
name: ci-lint-typescript
|
name: ci-lint-typescript
|
||||||
|
|
||||||
on:
|
on:
|
||||||
workflow_dispatch:
|
|
||||||
pull_request:
|
pull_request:
|
||||||
paths:
|
paths:
|
||||||
- "ts-packages/**"
|
- "ts-packages/**"
|
||||||
@@ -11,16 +10,15 @@ on:
|
|||||||
- "nym-wallet/src/**"
|
- "nym-wallet/src/**"
|
||||||
- "nym-wallet/package.json"
|
- "nym-wallet/package.json"
|
||||||
- "explorer/**"
|
- "explorer/**"
|
||||||
- ".github/workflows/ci-lint-typescript.yml"
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
runs-on: arc-ubuntu-20.04
|
runs-on: ubuntu-20.04-16-core
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v2
|
||||||
- uses: rlespinasse/github-slug-action@v3.x
|
- uses: rlespinasse/github-slug-action@v3.x
|
||||||
|
|
||||||
- uses: actions/setup-node@v4
|
- uses: actions/setup-node@v3
|
||||||
with:
|
with:
|
||||||
node-version: 18
|
node-version: 18
|
||||||
- name: Setup yarn
|
- name: Setup yarn
|
||||||
@@ -40,7 +38,7 @@ jobs:
|
|||||||
version: '116'
|
version: '116'
|
||||||
|
|
||||||
- name: Set up Go
|
- name: Set up Go
|
||||||
uses: actions/setup-go@v5
|
uses: actions/setup-go@v4
|
||||||
with:
|
with:
|
||||||
go-version: '1.20'
|
go-version: '1.20'
|
||||||
|
|
||||||
@@ -54,3 +52,24 @@ jobs:
|
|||||||
run: yarn lint
|
run: yarn lint
|
||||||
- name: Typecheck with tsc
|
- name: Typecheck with tsc
|
||||||
run: yarn tsc
|
run: yarn tsc
|
||||||
|
|
||||||
|
- name: Matrix - Node Install
|
||||||
|
run: npm install
|
||||||
|
working-directory: .github/workflows/support-files
|
||||||
|
- name: Matrix - Send Notification
|
||||||
|
env:
|
||||||
|
NYM_NOTIFICATION_KIND: ts-packages
|
||||||
|
NYM_PROJECT_NAME: "ts-packages"
|
||||||
|
NYM_CI_WWW_BASE: "${{ secrets.NYM_CI_WWW_BASE }}"
|
||||||
|
NYM_CI_WWW_LOCATION: "ts-${{ env.GITHUB_REF_SLUG }}"
|
||||||
|
GIT_COMMIT_MESSAGE: "${{ github.event.head_commit.message }}"
|
||||||
|
GIT_BRANCH: "${GITHUB_REF##*/}"
|
||||||
|
IS_SUCCESS: "${{ job.status == 'success' }}"
|
||||||
|
MATRIX_SERVER: "${{ secrets.MATRIX_SERVER }}"
|
||||||
|
MATRIX_ROOM: "${{ secrets.MATRIX_ROOM }}"
|
||||||
|
MATRIX_USER_ID: "${{ secrets.MATRIX_USER_ID }}"
|
||||||
|
MATRIX_TOKEN: "${{ secrets.MATRIX_TOKEN }}"
|
||||||
|
MATRIX_DEVICE_ID: "${{ secrets.MATRIX_DEVICE_ID }}"
|
||||||
|
uses: docker://keybaseio/client:stable-node
|
||||||
|
with:
|
||||||
|
args: .github/workflows/support-files/notifications/entry_point.sh
|
||||||
|
|||||||
@@ -0,0 +1,39 @@
|
|||||||
|
name: ci-nym-api-tests
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
push:
|
||||||
|
paths:
|
||||||
|
- "nym-api/**"
|
||||||
|
|
||||||
|
defaults:
|
||||||
|
run:
|
||||||
|
working-directory: nym-api/tests
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
test:
|
||||||
|
name: nym-api tests
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
|
||||||
|
- name: install yarn in root
|
||||||
|
run: cd ../.. && yarn install
|
||||||
|
|
||||||
|
- name: Install npm
|
||||||
|
run: npm install
|
||||||
|
|
||||||
|
- name: Node v18
|
||||||
|
uses: actions/setup-node@v3
|
||||||
|
with:
|
||||||
|
node-version: 18.1.0
|
||||||
|
|
||||||
|
- name: Install yarn
|
||||||
|
run: yarn install
|
||||||
|
|
||||||
|
- name: Run yarn
|
||||||
|
run: yarn
|
||||||
|
|
||||||
|
- name: Run tests
|
||||||
|
run: yarn test:sandbox
|
||||||
|
working-directory: nym-api/tests
|
||||||
@@ -5,7 +5,6 @@ on:
|
|||||||
push:
|
push:
|
||||||
paths:
|
paths:
|
||||||
- 'explorer/**'
|
- 'explorer/**'
|
||||||
- '.github/workflows/ci-nym-network-explorer.yml'
|
|
||||||
|
|
||||||
defaults:
|
defaults:
|
||||||
run:
|
run:
|
||||||
@@ -15,12 +14,12 @@ jobs:
|
|||||||
build:
|
build:
|
||||||
runs-on: custom-linux
|
runs-on: custom-linux
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v2
|
||||||
- name: Install rsync
|
- name: Install rsync
|
||||||
run: sudo apt-get install rsync
|
run: sudo apt-get install rsync
|
||||||
continue-on-error: true
|
continue-on-error: true
|
||||||
- uses: rlespinasse/github-slug-action@v3.x
|
- uses: rlespinasse/github-slug-action@v3.x
|
||||||
- uses: actions/setup-node@v4
|
- uses: actions/setup-node@v3
|
||||||
with:
|
with:
|
||||||
node-version: 18
|
node-version: 18
|
||||||
- name: Setup yarn
|
- name: Setup yarn
|
||||||
|
|||||||
@@ -1,17 +1,22 @@
|
|||||||
name: ci-nym-wallet-rust
|
name: ci-nym-wallet-rust
|
||||||
|
|
||||||
on:
|
on:
|
||||||
|
push:
|
||||||
|
paths:
|
||||||
|
- 'nym-wallet/**'
|
||||||
|
- 'common/**'
|
||||||
|
- 'contracts/vesting/**'
|
||||||
|
- 'nym-api/nym-api-requests/**'
|
||||||
pull_request:
|
pull_request:
|
||||||
paths:
|
paths:
|
||||||
- 'nym-wallet/**'
|
- 'nym-wallet/**'
|
||||||
- 'common/**'
|
- 'common/**'
|
||||||
- 'contracts/vesting/**'
|
- 'contracts/vesting/**'
|
||||||
- 'nym-api/nym-api-requests/**'
|
- 'nym-api/nym-api-requests/**'
|
||||||
- '.github/workflows/ci-nym-wallet-rust.yml'
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
runs-on: arc-ubuntu-20.04
|
runs-on: [ self-hosted, custom-linux ]
|
||||||
env:
|
env:
|
||||||
CARGO_TERM_COLOR: always
|
CARGO_TERM_COLOR: always
|
||||||
steps:
|
steps:
|
||||||
@@ -20,7 +25,7 @@ jobs:
|
|||||||
continue-on-error: true
|
continue-on-error: true
|
||||||
|
|
||||||
- name: Check out repository code
|
- name: Check out repository code
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v2
|
||||||
|
|
||||||
- name: Install rust toolchain
|
- name: Install rust toolchain
|
||||||
uses: actions-rs/toolchain@v1
|
uses: actions-rs/toolchain@v1
|
||||||
@@ -30,12 +35,6 @@ jobs:
|
|||||||
override: true
|
override: true
|
||||||
components: rustfmt, clippy
|
components: rustfmt, clippy
|
||||||
|
|
||||||
- name: Set debug to false
|
|
||||||
working-directory: nym-wallet
|
|
||||||
run: |
|
|
||||||
sed -i.bak '1s/^/\[profile.dev\]\ndebug = false\n\n/' Cargo.toml
|
|
||||||
git diff
|
|
||||||
|
|
||||||
- name: Build all binaries
|
- name: Build all binaries
|
||||||
uses: actions-rs/cargo@v1
|
uses: actions-rs/cargo@v1
|
||||||
with:
|
with:
|
||||||
|
|||||||
@@ -4,13 +4,12 @@ on:
|
|||||||
pull_request:
|
pull_request:
|
||||||
paths:
|
paths:
|
||||||
- 'nym-wallet/**'
|
- 'nym-wallet/**'
|
||||||
- '.github/workflows/ci-nym-wallet-storybook.yml'
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
runs-on: custom-linux
|
runs-on: custom-linux
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v2
|
||||||
|
|
||||||
- name: Install rsync
|
- name: Install rsync
|
||||||
run: sudo apt-get install rsync
|
run: sudo apt-get install rsync
|
||||||
@@ -18,7 +17,7 @@ jobs:
|
|||||||
|
|
||||||
- uses: rlespinasse/github-slug-action@v3.x
|
- uses: rlespinasse/github-slug-action@v3.x
|
||||||
|
|
||||||
- uses: actions/setup-node@v4
|
- uses: actions/setup-node@v3
|
||||||
with:
|
with:
|
||||||
node-version: 18
|
node-version: 18
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,78 @@
|
|||||||
|
name: ci-sdk-docs-typescript
|
||||||
|
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
paths:
|
||||||
|
- "sdk/typescript/**"
|
||||||
|
- "wasm/**"
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
runs-on: custom-linux
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
- name: Install rsync
|
||||||
|
run: sudo apt-get install rsync
|
||||||
|
continue-on-error: true
|
||||||
|
- uses: rlespinasse/github-slug-action@v3.x
|
||||||
|
- uses: actions/setup-node@v3
|
||||||
|
with:
|
||||||
|
node-version: 18.17
|
||||||
|
- name: Install Rust stable
|
||||||
|
uses: actions-rs/toolchain@v1
|
||||||
|
with:
|
||||||
|
toolchain: stable
|
||||||
|
- name: Setup yarn
|
||||||
|
run: npm install -g yarn
|
||||||
|
|
||||||
|
- name: Set up Go
|
||||||
|
uses: actions/setup-go@v4
|
||||||
|
with:
|
||||||
|
go-version: '1.20'
|
||||||
|
|
||||||
|
- name: Install wasm-pack
|
||||||
|
run: curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | sh
|
||||||
|
|
||||||
|
- name: Install wasm-opt
|
||||||
|
uses: ./.github/actions/install-wasm-opt
|
||||||
|
with:
|
||||||
|
version: '116'
|
||||||
|
|
||||||
|
- name: Build branch WASM packages
|
||||||
|
run: make sdk-wasm-build
|
||||||
|
|
||||||
|
- name: Install
|
||||||
|
run: yarn
|
||||||
|
- name: Build
|
||||||
|
run: yarn docs:prod:build
|
||||||
|
- name: Deploy branch to CI www (docs)
|
||||||
|
continue-on-error: true
|
||||||
|
uses: easingthemes/ssh-deploy@main
|
||||||
|
env:
|
||||||
|
SSH_PRIVATE_KEY: ${{ secrets.CI_WWW_SSH_PRIVATE_KEY }}
|
||||||
|
ARGS: "-rltgoDzvO --delete"
|
||||||
|
SOURCE: "dist/ts/"
|
||||||
|
REMOTE_HOST: ${{ secrets.CI_WWW_REMOTE_HOST }}
|
||||||
|
REMOTE_USER: ${{ secrets.CI_WWW_REMOTE_USER }}
|
||||||
|
TARGET: ${{ secrets.CI_WWW_REMOTE_TARGET }}/sdk-ts-docs-${{ env.GITHUB_REF_SLUG }}
|
||||||
|
EXCLUDE: "/dist/, /node_modules/"
|
||||||
|
- name: Matrix - Node Install
|
||||||
|
run: npm install
|
||||||
|
working-directory: .github/workflows/support-files
|
||||||
|
- name: Matrix - Send Notification
|
||||||
|
env:
|
||||||
|
NYM_NOTIFICATION_KIND: ts-packages
|
||||||
|
NYM_PROJECT_NAME: "sdk-ts-docs"
|
||||||
|
NYM_CI_WWW_BASE: "${{ secrets.NYM_CI_WWW_BASE }}/docs/sdk/typescript"
|
||||||
|
NYM_CI_WWW_LOCATION: "sdk-ts-docs-${{ env.GITHUB_REF_SLUG }}"
|
||||||
|
GIT_COMMIT_MESSAGE: "${{ github.event.head_commit.message }}"
|
||||||
|
GIT_BRANCH: "${GITHUB_REF##*/}"
|
||||||
|
IS_SUCCESS: "${{ job.status == 'success' }}"
|
||||||
|
MATRIX_SERVER: "${{ secrets.MATRIX_SERVER }}"
|
||||||
|
MATRIX_ROOM: "${{ secrets.MATRIX_ROOM }}"
|
||||||
|
MATRIX_USER_ID: "${{ secrets.MATRIX_USER_ID }}"
|
||||||
|
MATRIX_TOKEN: "${{ secrets.MATRIX_TOKEN }}"
|
||||||
|
MATRIX_DEVICE_ID: "${{ secrets.MATRIX_DEVICE_ID }}"
|
||||||
|
uses: docker://keybaseio/client:stable-node
|
||||||
|
with:
|
||||||
|
args: .github/workflows/support-files/notifications/entry_point.sh
|
||||||
@@ -1,23 +1,21 @@
|
|||||||
name: ci-sdk-wasm
|
name: ci-sdk-wasm
|
||||||
|
|
||||||
on:
|
on:
|
||||||
workflow_dispatch:
|
|
||||||
pull_request:
|
pull_request:
|
||||||
paths:
|
paths:
|
||||||
- 'wasm/**'
|
- 'wasm/**'
|
||||||
- 'clients/client-core/**'
|
- 'clients/client-core/**'
|
||||||
- 'common/**'
|
- 'common/**'
|
||||||
- '.github/workflows/ci-sdk-wasm.yml'
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
wasm:
|
wasm:
|
||||||
runs-on: arc-ubuntu-20.04
|
runs-on: [custom-linux]
|
||||||
env:
|
env:
|
||||||
CARGO_TERM_COLOR: always
|
CARGO_TERM_COLOR: always
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v2
|
||||||
|
|
||||||
- uses: actions/setup-node@v4
|
- uses: actions/setup-node@v3
|
||||||
with:
|
with:
|
||||||
node-version: 18
|
node-version: 18
|
||||||
|
|
||||||
@@ -30,7 +28,7 @@ jobs:
|
|||||||
components: rustfmt, clippy
|
components: rustfmt, clippy
|
||||||
|
|
||||||
- name: Set up Go
|
- name: Set up Go
|
||||||
uses: actions/setup-go@v5
|
uses: actions/setup-go@v4
|
||||||
with:
|
with:
|
||||||
go-version: '1.20'
|
go-version: '1.20'
|
||||||
|
|
||||||
@@ -45,11 +43,6 @@ jobs:
|
|||||||
- name: Install wasm-bindgen-cli
|
- name: Install wasm-bindgen-cli
|
||||||
run: cargo install wasm-bindgen-cli
|
run: cargo install wasm-bindgen-cli
|
||||||
|
|
||||||
- name: Set debug to false
|
|
||||||
run: |
|
|
||||||
sed -i.bak 's/\[profile.dev\]/\[profile.dev\]\ndebug = false/' Cargo.toml
|
|
||||||
git diff
|
|
||||||
|
|
||||||
- name: "Build"
|
- name: "Build"
|
||||||
run: make sdk-wasm-build
|
run: make sdk-wasm-build
|
||||||
|
|
||||||
|
|||||||
@@ -30,14 +30,14 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v3
|
||||||
- name: Setup Pages
|
- name: Setup Pages
|
||||||
uses: actions/configure-pages@v5
|
uses: actions/configure-pages@v3
|
||||||
- name: Upload artifact
|
- name: Upload artifact
|
||||||
uses: actions/upload-pages-artifact@v3
|
uses: actions/upload-pages-artifact@v2
|
||||||
with:
|
with:
|
||||||
# Upload entire repository
|
# Upload entire repository
|
||||||
path: './ppa'
|
path: './ppa'
|
||||||
- name: Deploy to GitHub Pages
|
- name: Deploy to GitHub Pages
|
||||||
id: deployment
|
id: deployment
|
||||||
uses: actions/deploy-pages@v4
|
uses: actions/deploy-pages@v2
|
||||||
|
|||||||
@@ -1,11 +0,0 @@
|
|||||||
name: Hello world
|
|
||||||
|
|
||||||
on:
|
|
||||||
workflow_dispatch:
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
my-job:
|
|
||||||
runs-on: arc-ubuntu-22.04
|
|
||||||
steps:
|
|
||||||
- name: my-step
|
|
||||||
run: echo "Hello World!"
|
|
||||||
@@ -15,11 +15,10 @@ jobs:
|
|||||||
runs-on: ${{ matrix.os }}
|
runs-on: ${{ matrix.os }}
|
||||||
env:
|
env:
|
||||||
CARGO_TERM_COLOR: always
|
CARGO_TERM_COLOR: always
|
||||||
IPINFO_API_TOKEN: ${{ secrets.IPINFO_API_TOKEN }}
|
|
||||||
continue-on-error: true
|
continue-on-error: true
|
||||||
steps:
|
steps:
|
||||||
- name: Check out repository code
|
- name: Check out repository code
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
- name: Install Dependencies (Linux)
|
- name: Install Dependencies (Linux)
|
||||||
run: sudo apt-get update && sudo apt-get install -y build-essential curl wget libssl-dev libudev-dev squashfs-tools protobuf-compiler
|
run: sudo apt-get update && sudo apt-get install -y build-essential curl wget libssl-dev libudev-dev squashfs-tools protobuf-compiler
|
||||||
@@ -34,7 +33,7 @@ jobs:
|
|||||||
components: rustfmt, clippy
|
components: rustfmt, clippy
|
||||||
|
|
||||||
- name: Install Protoc
|
- name: Install Protoc
|
||||||
uses: arduino/setup-protoc@v3
|
uses: arduino/setup-protoc@v2
|
||||||
if: matrix.os == 'macos-latest' || matrix.os == 'windows-latest'
|
if: matrix.os == 'macos-latest' || matrix.os == 'windows-latest'
|
||||||
with:
|
with:
|
||||||
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
@@ -99,11 +98,11 @@ jobs:
|
|||||||
runs-on: custom-linux
|
runs-on: custom-linux
|
||||||
steps:
|
steps:
|
||||||
- name: Collect jobs status
|
- name: Collect jobs status
|
||||||
uses: technote-space/workflow-conclusion-action@v3
|
uses: technote-space/workflow-conclusion-action@v2
|
||||||
- name: Check out repository code
|
- name: Check out repository code
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v3
|
||||||
- name: install npm
|
- name: install npm
|
||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v3
|
||||||
if: env.WORKFLOW_CONCLUSION == 'failure'
|
if: env.WORKFLOW_CONCLUSION == 'failure'
|
||||||
with:
|
with:
|
||||||
node-version: 18
|
node-version: 18
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ jobs:
|
|||||||
output1: ${{ steps.step2.outputs.latest_release }}
|
output1: ${{ steps.step2.outputs.latest_release }}
|
||||||
steps:
|
steps:
|
||||||
- name: Check out repository code
|
- name: Check out repository code
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v3
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
- name: Set output variable to latest release branch
|
- name: Set output variable to latest release branch
|
||||||
@@ -28,7 +28,7 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout repo
|
- name: Checkout repo
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v3
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
- name: Setup git user
|
- name: Setup git user
|
||||||
@@ -47,7 +47,7 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout repo
|
- name: Checkout repo
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v3
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
- name: Setup git user
|
- name: Setup git user
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ jobs:
|
|||||||
continue-on-error: true
|
continue-on-error: true
|
||||||
steps:
|
steps:
|
||||||
- name: Check out repository code
|
- name: Check out repository code
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
- name: Install Dependencies (Linux)
|
- name: Install Dependencies (Linux)
|
||||||
run: sudo apt-get update && sudo apt-get install -y libwebkit2gtk-4.0-dev build-essential curl wget libssl-dev libgtk-3-dev squashfs-tools
|
run: sudo apt-get update && sudo apt-get install -y libwebkit2gtk-4.0-dev build-essential curl wget libssl-dev libgtk-3-dev squashfs-tools
|
||||||
@@ -61,11 +61,11 @@ jobs:
|
|||||||
runs-on: custom-linux
|
runs-on: custom-linux
|
||||||
steps:
|
steps:
|
||||||
- name: Collect jobs status
|
- name: Collect jobs status
|
||||||
uses: technote-space/workflow-conclusion-action@v3
|
uses: technote-space/workflow-conclusion-action@v2
|
||||||
- name: Check out repository code
|
- name: Check out repository code
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v3
|
||||||
- name: install npm
|
- name: install npm
|
||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v3
|
||||||
if: env.WORKFLOW_CONCLUSION == 'failure'
|
if: env.WORKFLOW_CONCLUSION == 'failure'
|
||||||
with:
|
with:
|
||||||
node-version: 18
|
node-version: 18
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ jobs:
|
|||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-20.04
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout repository code
|
- name: Checkout repository code
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v2
|
||||||
- name: Install rust toolchain
|
- name: Install rust toolchain
|
||||||
uses: actions-rs/toolchain@v1
|
uses: actions-rs/toolchain@v1
|
||||||
with:
|
with:
|
||||||
@@ -20,7 +20,7 @@ jobs:
|
|||||||
find . -name Cargo.toml -exec cargo deny --manifest-path {} check \
|
find . -name Cargo.toml -exec cargo deny --manifest-path {} check \
|
||||||
advisories -A advisory-not-detected --hide-inclusion-graph \; &> \
|
advisories -A advisory-not-detected --hide-inclusion-graph \; &> \
|
||||||
>(uniq &> .github/workflows/support-files/notifications/deny.message )
|
>(uniq &> .github/workflows/support-files/notifications/deny.message )
|
||||||
- uses: actions/upload-artifact@v4
|
- uses: actions/upload-artifact@v3
|
||||||
with:
|
with:
|
||||||
name: report
|
name: report
|
||||||
path: .github/workflows/support-files/notifications/deny.message
|
path: .github/workflows/support-files/notifications/deny.message
|
||||||
@@ -29,14 +29,14 @@ jobs:
|
|||||||
runs-on: custom-linux
|
runs-on: custom-linux
|
||||||
steps:
|
steps:
|
||||||
- name: Check out repository code
|
- name: Check out repository code
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v2
|
||||||
- name: Download report from previous job
|
- name: Download report from previous job
|
||||||
uses: actions/download-artifact@v4
|
uses: actions/download-artifact@v3
|
||||||
with:
|
with:
|
||||||
name: report
|
name: report
|
||||||
path: .github/workflows/support-files/notifications
|
path: .github/workflows/support-files/notifications
|
||||||
- name: install npm
|
- name: install npm
|
||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v3
|
||||||
with:
|
with:
|
||||||
node-version: 18
|
node-version: 18
|
||||||
- name: Matrix - Node Install
|
- name: Matrix - Node Install
|
||||||
|
|||||||
@@ -4,9 +4,7 @@ on:
|
|||||||
pull_request:
|
pull_request:
|
||||||
branches:
|
branches:
|
||||||
- develop
|
- develop
|
||||||
- "release/**"
|
- 'release/**'
|
||||||
paths-ignore:
|
|
||||||
- "documentation/**"
|
|
||||||
types:
|
types:
|
||||||
- labeled
|
- labeled
|
||||||
- unlabeled
|
- unlabeled
|
||||||
|
|||||||
@@ -40,7 +40,7 @@ jobs:
|
|||||||
cli_version: ${{ steps.binary-versions.outputs.cli_version }}
|
cli_version: ${{ steps.binary-versions.outputs.cli_version }}
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v3
|
||||||
|
|
||||||
- name: Install Dependencies (Linux)
|
- name: Install Dependencies (Linux)
|
||||||
run: sudo apt-get update && sudo apt-get -y install ripgrep libwebkit2gtk-4.0-dev build-essential curl wget libssl-dev libgtk-3-dev libudev-dev squashfs-tools
|
run: sudo apt-get update && sudo apt-get -y install ripgrep libwebkit2gtk-4.0-dev build-essential curl wget libssl-dev libgtk-3-dev libudev-dev squashfs-tools
|
||||||
@@ -51,11 +51,14 @@ jobs:
|
|||||||
echo 'RUSTFLAGS="--cfg tokio_unstable"' >> $GITHUB_ENV
|
echo 'RUSTFLAGS="--cfg tokio_unstable"' >> $GITHUB_ENV
|
||||||
if: github.event_name == 'workflow_dispatch' && inputs.add_tokio_unstable == true
|
if: github.event_name == 'workflow_dispatch' && inputs.add_tokio_unstable == true
|
||||||
|
|
||||||
|
- name: Set CARGO_FEATURES
|
||||||
|
run: |
|
||||||
|
echo 'CARGO_FEATURES=--features wireguard' >> $GITHUB_ENV
|
||||||
|
|
||||||
- name: Install Rust stable
|
- name: Install Rust stable
|
||||||
uses: actions-rs/toolchain@v1
|
uses: actions-rs/toolchain@v1
|
||||||
with:
|
with:
|
||||||
toolchain: stable
|
toolchain: stable
|
||||||
override: true
|
|
||||||
|
|
||||||
- name: Build all binaries
|
- name: Build all binaries
|
||||||
uses: actions-rs/cargo@v1
|
uses: actions-rs/cargo@v1
|
||||||
@@ -64,7 +67,7 @@ jobs:
|
|||||||
args: --workspace --release ${{ env.CARGO_FEATURES }}
|
args: --workspace --release ${{ env.CARGO_FEATURES }}
|
||||||
|
|
||||||
- name: Upload Artifact
|
- name: Upload Artifact
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v3
|
||||||
with:
|
with:
|
||||||
name: my-artifact
|
name: my-artifact
|
||||||
path: |
|
path: |
|
||||||
@@ -80,7 +83,7 @@ jobs:
|
|||||||
|
|
||||||
- id: create-release
|
- id: create-release
|
||||||
name: Upload to release based on tag name
|
name: Upload to release based on tag name
|
||||||
uses: softprops/action-gh-release@v2
|
uses: softprops/action-gh-release@v1
|
||||||
if: github.event_name == 'release'
|
if: github.event_name == 'release'
|
||||||
with:
|
with:
|
||||||
files: |
|
files: |
|
||||||
|
|||||||
@@ -9,39 +9,38 @@ jobs:
|
|||||||
if: ${{ (startsWith(github.ref, 'refs/tags/nym-contracts-') && github.event_name == 'release') || github.event_name == 'workflow_dispatch' }}
|
if: ${{ (startsWith(github.ref, 'refs/tags/nym-contracts-') && github.event_name == 'release') || github.event_name == 'workflow_dispatch' }}
|
||||||
runs-on: [self-hosted, custom-ubuntu-20.04]
|
runs-on: [self-hosted, custom-ubuntu-20.04]
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v2
|
||||||
|
|
||||||
- name: Install Rust stable
|
- name: Install Rust stable
|
||||||
uses: actions-rs/toolchain@v1
|
uses: actions-rs/toolchain@v1
|
||||||
with:
|
with:
|
||||||
toolchain: 1.77
|
toolchain: stable
|
||||||
target: wasm32-unknown-unknown
|
target: wasm32-unknown-unknown
|
||||||
override: true
|
override: true
|
||||||
|
components: rustfmt, clippy
|
||||||
|
|
||||||
- name: Install wasm-opt
|
- name: Install wasm-opt
|
||||||
uses: ./.github/actions/install-wasm-opt
|
run: cargo install --version 0.114.0 wasm-opt
|
||||||
with:
|
|
||||||
version: '114'
|
|
||||||
|
|
||||||
- name: Build release contracts
|
- name: Build release contracts
|
||||||
run: make contracts
|
run: make contracts
|
||||||
|
|
||||||
- name: Upload Mixnet Contract Artifact
|
- name: Upload Mixnet Contract Artifact
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v3
|
||||||
with:
|
with:
|
||||||
name: mixnet_contract.wasm
|
name: mixnet_contract.wasm
|
||||||
path: contracts/target/wasm32-unknown-unknown/release/mixnet_contract.wasm
|
path: contracts/target/wasm32-unknown-unknown/release/mixnet_contract.wasm
|
||||||
retention-days: 5
|
retention-days: 5
|
||||||
|
|
||||||
- name: Upload Vesting Contract Artifact
|
- name: Upload Vesting Contract Artifact
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v3
|
||||||
with:
|
with:
|
||||||
name: vesting_contract.wasm
|
name: vesting_contract.wasm
|
||||||
path: contracts/target/wasm32-unknown-unknown/release/vesting_contract.wasm
|
path: contracts/target/wasm32-unknown-unknown/release/vesting_contract.wasm
|
||||||
retention-days: 5
|
retention-days: 5
|
||||||
|
|
||||||
- name: Upload to release based on tag name
|
- name: Upload to release based on tag name
|
||||||
uses: softprops/action-gh-release@v2
|
uses: softprops/action-gh-release@v1
|
||||||
if: github.event_name == 'release'
|
if: github.event_name == 'release'
|
||||||
with:
|
with:
|
||||||
files: |
|
files: |
|
||||||
|
|||||||
@@ -25,10 +25,10 @@ jobs:
|
|||||||
file_hash: ${{ steps.release-info.outputs.file_hash }}
|
file_hash: ${{ steps.release-info.outputs.file_hash }}
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v2
|
||||||
|
|
||||||
- name: Node
|
- name: Node
|
||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v3
|
||||||
with:
|
with:
|
||||||
node-version: 18
|
node-version: 18
|
||||||
- name: Install Rust stable
|
- name: Install Rust stable
|
||||||
@@ -83,7 +83,7 @@ jobs:
|
|||||||
run: yarn && yarn build
|
run: yarn && yarn build
|
||||||
|
|
||||||
- name: Upload Artifact
|
- name: Upload Artifact
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v3
|
||||||
with:
|
with:
|
||||||
name: nym-wallet.app.tar.gz
|
name: nym-wallet.app.tar.gz
|
||||||
path: nym-wallet/target/release/bundle/macos/nym-wallet.app.tar.gz
|
path: nym-wallet/target/release/bundle/macos/nym-wallet.app.tar.gz
|
||||||
@@ -95,7 +95,7 @@ jobs:
|
|||||||
security delete-keychain $RUNNER_TEMP/app-signing.keychain-db
|
security delete-keychain $RUNNER_TEMP/app-signing.keychain-db
|
||||||
- id: create-release
|
- id: create-release
|
||||||
name: Upload to release based on tag name
|
name: Upload to release based on tag name
|
||||||
uses: softprops/action-gh-release@v2
|
uses: softprops/action-gh-release@v1
|
||||||
if: github.event_name == 'release'
|
if: github.event_name == 'release'
|
||||||
with:
|
with:
|
||||||
files: |
|
files: |
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ jobs:
|
|||||||
file_hash: ${{ steps.release-info.outputs.file_hash }}
|
file_hash: ${{ steps.release-info.outputs.file_hash }}
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v2
|
||||||
|
|
||||||
- name: Tauri dependencies
|
- name: Tauri dependencies
|
||||||
run: >
|
run: >
|
||||||
@@ -34,7 +34,7 @@ jobs:
|
|||||||
continue-on-error: true
|
continue-on-error: true
|
||||||
|
|
||||||
- name: Node
|
- name: Node
|
||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v3
|
||||||
with:
|
with:
|
||||||
node-version: 18
|
node-version: 18
|
||||||
|
|
||||||
@@ -62,7 +62,7 @@ jobs:
|
|||||||
TAURI_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }}
|
TAURI_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }}
|
||||||
|
|
||||||
- name: Upload Artifact
|
- name: Upload Artifact
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v3
|
||||||
with:
|
with:
|
||||||
name: nym-wallet_1.0.0_amd64.AppImage.tar.gz
|
name: nym-wallet_1.0.0_amd64.AppImage.tar.gz
|
||||||
path: nym-wallet/target/release/bundle/appimage/nym-wallet*.AppImage.tar.gz
|
path: nym-wallet/target/release/bundle/appimage/nym-wallet*.AppImage.tar.gz
|
||||||
@@ -70,7 +70,7 @@ jobs:
|
|||||||
|
|
||||||
- id: create-release
|
- id: create-release
|
||||||
name: Upload to release based on tag name
|
name: Upload to release based on tag name
|
||||||
uses: softprops/action-gh-release@v2
|
uses: softprops/action-gh-release@v1
|
||||||
if: github.event_name == 'release'
|
if: github.event_name == 'release'
|
||||||
with:
|
with:
|
||||||
files: |
|
files: |
|
||||||
|
|||||||
+6
-9
@@ -1,4 +1,4 @@
|
|||||||
name: publish-nym-wallet-win11
|
name: publish-nym-wallet-win10
|
||||||
on:
|
on:
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
release:
|
release:
|
||||||
@@ -14,7 +14,7 @@ jobs:
|
|||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
platform: [custom-windows-11]
|
platform: [windows10]
|
||||||
runs-on: ${{ matrix.platform }}
|
runs-on: ${{ matrix.platform }}
|
||||||
|
|
||||||
outputs:
|
outputs:
|
||||||
@@ -33,7 +33,7 @@ jobs:
|
|||||||
del /s /q /A:H nym
|
del /s /q /A:H nym
|
||||||
rmdir /s /q nym
|
rmdir /s /q nym
|
||||||
|
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v3
|
||||||
|
|
||||||
- name: Import signing certificate
|
- name: Import signing certificate
|
||||||
env:
|
env:
|
||||||
@@ -47,7 +47,7 @@ jobs:
|
|||||||
Import-PfxCertificate -FilePath certificate/certificate.pfx -CertStoreLocation Cert:\CurrentUser\My -Password (ConvertTo-SecureString -String $env:WINDOWS_CERTIFICATE_PASSWORD -Force -AsPlainText)
|
Import-PfxCertificate -FilePath certificate/certificate.pfx -CertStoreLocation Cert:\CurrentUser\My -Password (ConvertTo-SecureString -String $env:WINDOWS_CERTIFICATE_PASSWORD -Force -AsPlainText)
|
||||||
|
|
||||||
- name: Node
|
- name: Node
|
||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v3
|
||||||
with:
|
with:
|
||||||
node-version: 18
|
node-version: 18
|
||||||
|
|
||||||
@@ -62,9 +62,6 @@ jobs:
|
|||||||
fileName: '.env'
|
fileName: '.env'
|
||||||
encodedString: ${{ secrets.WALLET_ADMIN_ADDRESS }}
|
encodedString: ${{ secrets.WALLET_ADMIN_ADDRESS }}
|
||||||
|
|
||||||
- name: Install Yarn
|
|
||||||
run: npm install -g yarn
|
|
||||||
|
|
||||||
- name: Install project dependencies
|
- name: Install project dependencies
|
||||||
shell: bash
|
shell: bash
|
||||||
run: cd .. && yarn --network-timeout 100000
|
run: cd .. && yarn --network-timeout 100000
|
||||||
@@ -85,7 +82,7 @@ jobs:
|
|||||||
run: yarn build
|
run: yarn build
|
||||||
|
|
||||||
- name: Upload Artifact
|
- name: Upload Artifact
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v3
|
||||||
with:
|
with:
|
||||||
name: nym-wallet_1.0.0_x64_en-US.msi
|
name: nym-wallet_1.0.0_x64_en-US.msi
|
||||||
path: nym-wallet/target/release/bundle/msi/nym-wallet_1.*.msi
|
path: nym-wallet/target/release/bundle/msi/nym-wallet_1.*.msi
|
||||||
@@ -93,7 +90,7 @@ jobs:
|
|||||||
|
|
||||||
- id: create-release
|
- id: create-release
|
||||||
name: Upload to release based on tag name
|
name: Upload to release based on tag name
|
||||||
uses: softprops/action-gh-release@v2
|
uses: softprops/action-gh-release@v1
|
||||||
if: github.event_name == 'release'
|
if: github.event_name == 'release'
|
||||||
with:
|
with:
|
||||||
files: |
|
files: |
|
||||||
@@ -22,10 +22,10 @@ jobs:
|
|||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
- name: Install Java
|
- name: Install Java
|
||||||
uses: actions/setup-java@v4
|
uses: actions/setup-java@v3
|
||||||
with:
|
with:
|
||||||
distribution: "temurin"
|
distribution: "temurin"
|
||||||
java-version: "17"
|
java-version: "17"
|
||||||
@@ -49,13 +49,21 @@ jobs:
|
|||||||
"build-tools;$SDK_BUILDTOOLS_VERSION"
|
"build-tools;$SDK_BUILDTOOLS_VERSION"
|
||||||
|
|
||||||
- name: Install Rust toolchain
|
- name: Install Rust toolchain
|
||||||
uses: dtolnay/rust-toolchain@1.90.0
|
uses: dtolnay/rust-toolchain@1.70.0
|
||||||
|
|
||||||
- name: Install rust android targets
|
- name: Install rust android targets
|
||||||
run: |
|
run: |
|
||||||
rustup target add aarch64-linux-android \
|
rustup target add aarch64-linux-android \
|
||||||
x86_64-linux-android
|
x86_64-linux-android
|
||||||
|
|
||||||
|
- name: Build lib nym-socks5-listener
|
||||||
|
working-directory: sdk/lib/socks5-listener/
|
||||||
|
env:
|
||||||
|
RELEASE: true
|
||||||
|
RUSTFLAGS: "-C link-args=-Wl,--hash-style=gnu"
|
||||||
|
# build for arm64 and x86_64
|
||||||
|
run: ./build-android.sh aarch64 x86_64
|
||||||
|
|
||||||
- name: Build APKs (unsigned)
|
- name: Build APKs (unsigned)
|
||||||
working-directory: nym-connect/native/android
|
working-directory: nym-connect/native/android
|
||||||
env:
|
env:
|
||||||
@@ -76,7 +84,7 @@ jobs:
|
|||||||
apk/nyms5-arch64-release.apk
|
apk/nyms5-arch64-release.apk
|
||||||
|
|
||||||
- name: Upload APKs
|
- name: Upload APKs
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v3
|
||||||
with:
|
with:
|
||||||
name: nyms5-apk-arch64
|
name: nyms5-apk-arch64
|
||||||
path: |
|
path: |
|
||||||
@@ -89,14 +97,14 @@ jobs:
|
|||||||
runs-on: custom-linux
|
runs-on: custom-linux
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v3
|
||||||
- name: Download binary artifact
|
- name: Download binary artifact
|
||||||
uses: actions/download-artifact@v4
|
uses: actions/download-artifact@v3
|
||||||
with:
|
with:
|
||||||
name: nyms5-apk-arch64
|
name: nyms5-apk-arch64
|
||||||
path: apk
|
path: apk
|
||||||
- name: Release
|
- name: Release
|
||||||
uses: softprops/action-gh-release@v2
|
uses: softprops/action-gh-release@v1
|
||||||
with:
|
with:
|
||||||
files: |
|
files: |
|
||||||
apk/nyms5-arch64-debug.apk
|
apk/nyms5-arch64-debug.apk
|
||||||
|
|||||||
@@ -4,12 +4,12 @@ on:
|
|||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
publish:
|
publish:
|
||||||
runs-on: arc-ubuntu-20.04
|
runs-on: ubuntu-20.04-16-core
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v2
|
||||||
|
|
||||||
- name: Install Node
|
- name: Install Node
|
||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v3
|
||||||
with:
|
with:
|
||||||
node-version: 18
|
node-version: 18
|
||||||
registry-url: "https://registry.npmjs.org"
|
registry-url: "https://registry.npmjs.org"
|
||||||
@@ -29,12 +29,12 @@ jobs:
|
|||||||
run: cargo install wasm-opt
|
run: cargo install wasm-opt
|
||||||
|
|
||||||
- name: Set up Go
|
- name: Set up Go
|
||||||
uses: actions/setup-go@v5
|
uses: actions/setup-go@v4
|
||||||
with:
|
with:
|
||||||
go-version: "1.20"
|
go-version: "1.20"
|
||||||
|
|
||||||
- name: Install TinyGo
|
- name: Install TinyGo
|
||||||
uses: acifani/setup-tinygo@v2
|
uses: acifani/setup-tinygo@v1
|
||||||
with:
|
with:
|
||||||
tinygo-version: "0.27.0"
|
tinygo-version: "0.27.0"
|
||||||
|
|
||||||
|
|||||||
@@ -1,55 +0,0 @@
|
|||||||
name: Build and upload Credential Proxy container to harbor.nymte.ch
|
|
||||||
on:
|
|
||||||
workflow_dispatch:
|
|
||||||
|
|
||||||
env:
|
|
||||||
WORKING_DIRECTORY: "nym-credential-proxy"
|
|
||||||
CONTAINER_NAME: "credential-proxy"
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
build-container:
|
|
||||||
runs-on: arc-ubuntu-22.04-dind
|
|
||||||
steps:
|
|
||||||
- name: Login to Harbor
|
|
||||||
uses: docker/login-action@v3
|
|
||||||
with:
|
|
||||||
registry: harbor.nymte.ch
|
|
||||||
username: ${{ secrets.HARBOR_ROBOT_USERNAME }}
|
|
||||||
password: ${{ secrets.HARBOR_ROBOT_SECRET }}
|
|
||||||
|
|
||||||
- name: Checkout repo
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Configure git identity
|
|
||||||
run: |
|
|
||||||
git config --global user.email "lawrence@nymtech.net"
|
|
||||||
git config --global user.name "Lawrence Stalder"
|
|
||||||
|
|
||||||
- name: Get version from cargo.toml
|
|
||||||
uses: mikefarah/yq@v4.45.1
|
|
||||||
id: get_version
|
|
||||||
with:
|
|
||||||
cmd: yq -oy '.package.version' ${{ env.WORKING_DIRECTORY }}/nym-credential-proxy/Cargo.toml
|
|
||||||
|
|
||||||
- name: Check if tag exists
|
|
||||||
run: |
|
|
||||||
if git rev-parse ${{ steps.get_version.outputs.value }} >/dev/null 2>&1; then
|
|
||||||
echo "Tag ${{ steps.get_version.outputs.value }} already exists"
|
|
||||||
fi
|
|
||||||
|
|
||||||
- name: Remove existing tag if exists
|
|
||||||
run: |
|
|
||||||
if git rev-parse ${{ env.WORKING_DIRECTORY }}-${{ steps.get_version.outputs.result }} >/dev/null 2>&1; then
|
|
||||||
git push --delete origin ${{ env.WORKING_DIRECTORY }}-${{ steps.get_version.outputs.result }}
|
|
||||||
git tag -d ${{ env.WORKING_DIRECTORY }}-${{ steps.get_version.outputs.result }}
|
|
||||||
fi
|
|
||||||
|
|
||||||
- name: Create tag
|
|
||||||
run: |
|
|
||||||
git tag -a ${{ env.WORKING_DIRECTORY }}-${{ steps.get_version.outputs.result }} -m "Version ${{ steps.get_version.outputs.result }}"
|
|
||||||
git push origin ${{ env.WORKING_DIRECTORY }}-${{ steps.get_version.outputs.result }}
|
|
||||||
|
|
||||||
- name: BuildAndPushImageOnHarbor
|
|
||||||
run: |
|
|
||||||
docker build -f ${{ env.WORKING_DIRECTORY }}/nym-credential-proxy/Dockerfile . -t harbor.nymte.ch/nym/${{ env.CONTAINER_NAME }}:${{ steps.get_version.outputs.result }} -t harbor.nymte.ch/nym/${{ env.CONTAINER_NAME }}:latest
|
|
||||||
docker push harbor.nymte.ch/nym/${{ env.CONTAINER_NAME }} --all-tags
|
|
||||||
@@ -1,55 +0,0 @@
|
|||||||
name: Build and upload Data observatory container to harbor.nymte.ch
|
|
||||||
on:
|
|
||||||
workflow_dispatch:
|
|
||||||
|
|
||||||
env:
|
|
||||||
WORKING_DIRECTORY: "nym-data-observatory"
|
|
||||||
CONTAINER_NAME: "data-observatory"
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
build-container:
|
|
||||||
runs-on: arc-ubuntu-22.04-dind
|
|
||||||
steps:
|
|
||||||
- name: Login to Harbor
|
|
||||||
uses: docker/login-action@v3
|
|
||||||
with:
|
|
||||||
registry: harbor.nymte.ch
|
|
||||||
username: ${{ secrets.HARBOR_ROBOT_USERNAME }}
|
|
||||||
password: ${{ secrets.HARBOR_ROBOT_SECRET }}
|
|
||||||
|
|
||||||
- name: Checkout repo
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Configure git identity
|
|
||||||
run: |
|
|
||||||
git config --global user.email "lawrence@nymtech.net"
|
|
||||||
git config --global user.name "Lawrence Stalder"
|
|
||||||
|
|
||||||
- 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 tag exists
|
|
||||||
run: |
|
|
||||||
if git rev-parse ${{ steps.get_version.outputs.value }} >/dev/null 2>&1; then
|
|
||||||
echo "Tag ${{ steps.get_version.outputs.value }} already exists"
|
|
||||||
fi
|
|
||||||
|
|
||||||
- name: Remove existing tag if exists
|
|
||||||
run: |
|
|
||||||
if git rev-parse ${{ env.WORKING_DIRECTORY }}-${{ steps.get_version.outputs.result }} >/dev/null 2>&1; then
|
|
||||||
git push --delete origin ${{ env.WORKING_DIRECTORY }}-${{ steps.get_version.outputs.result }}
|
|
||||||
git tag -d ${{ env.WORKING_DIRECTORY }}-${{ steps.get_version.outputs.result }}
|
|
||||||
fi
|
|
||||||
|
|
||||||
- name: Create tag
|
|
||||||
run: |
|
|
||||||
git tag -a ${{ env.WORKING_DIRECTORY }}-${{ steps.get_version.outputs.result }} -m "Version ${{ steps.get_version.outputs.result }}"
|
|
||||||
git push origin ${{ env.WORKING_DIRECTORY }}-${{ steps.get_version.outputs.result }}
|
|
||||||
|
|
||||||
- name: BuildAndPushImageOnHarbor
|
|
||||||
run: |
|
|
||||||
docker build -f ${{ env.WORKING_DIRECTORY }}/Dockerfile . -t harbor.nymte.ch/nym/${{ env.CONTAINER_NAME }}:${{ steps.get_version.outputs.result }} -t harbor.nymte.ch/nym/${{ env.CONTAINER_NAME }}:latest
|
|
||||||
docker push harbor.nymte.ch/nym/${{ env.CONTAINER_NAME }} --all-tags
|
|
||||||
@@ -1,51 +0,0 @@
|
|||||||
name: Build and upload Network monitor container to harbor.nymte.ch
|
|
||||||
on:
|
|
||||||
workflow_dispatch:
|
|
||||||
|
|
||||||
env:
|
|
||||||
WORKING_DIRECTORY: "."
|
|
||||||
CONTAINER_NAME: "network-monitor"
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
build-container:
|
|
||||||
runs-on: arc-ubuntu-22.04-dind
|
|
||||||
steps:
|
|
||||||
- name: Login to Harbor
|
|
||||||
uses: docker/login-action@v3
|
|
||||||
with:
|
|
||||||
registry: harbor.nymte.ch
|
|
||||||
username: ${{ secrets.HARBOR_ROBOT_USERNAME }}
|
|
||||||
password: ${{ secrets.HARBOR_ROBOT_SECRET }}
|
|
||||||
|
|
||||||
- name: Checkout repo
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Configure git identity
|
|
||||||
run: |
|
|
||||||
git config --global user.email "lawrence@nymtech.net"
|
|
||||||
git config --global user.name "Lawrence Stalder"
|
|
||||||
|
|
||||||
- name: Get version from cargo.toml
|
|
||||||
uses: mikefarah/yq@v4.45.1
|
|
||||||
id: get_version
|
|
||||||
with:
|
|
||||||
cmd: yq -oy '.package.version' ${{ env.WORKING_DIRECTORY }}/nym-network-monitor/Cargo.toml
|
|
||||||
|
|
||||||
- name: Remove existing tag if exists
|
|
||||||
run: |
|
|
||||||
echo "Checking if tag ${{ env.CONTAINER_NAME }}-${{ steps.get_version.outputs.result }} exists..."
|
|
||||||
if git rev-parse ${{ env.CONTAINER_NAME }}-${{ steps.get_version.outputs.result }} >/dev/null 2>&1; then
|
|
||||||
echo "Tag ${{ env.CONTAINER_NAME }}-${{ steps.get_version.outputs.result }} already exists"
|
|
||||||
git push --delete origin ${{ env.CONTAINER_NAME }}-${{ steps.get_version.outputs.result }}
|
|
||||||
git tag -d ${{ env.CONTAINER_NAME }}-${{ steps.get_version.outputs.result }}
|
|
||||||
fi
|
|
||||||
|
|
||||||
- name: Create tag
|
|
||||||
run: |
|
|
||||||
git tag -a ${{ env.CONTAINER_NAME }}-${{ steps.get_version.outputs.result }} -m "Version ${{ steps.get_version.outputs.result }}"
|
|
||||||
git push origin ${{ env.CONTAINER_NAME }}-${{ steps.get_version.outputs.result }}
|
|
||||||
|
|
||||||
- name: BuildAndPushImageOnHarbor
|
|
||||||
run: |
|
|
||||||
docker build -f nym-network-monitor.dockerfile ${{ env.WORKING_DIRECTORY }} -t harbor.nymte.ch/nym/${{ env.CONTAINER_NAME }}:${{ steps.get_version.outputs.result }} -t harbor.nymte.ch/nym/${{ env.CONTAINER_NAME }}:latest
|
|
||||||
docker push harbor.nymte.ch/nym/${{ env.CONTAINER_NAME }} --all-tags
|
|
||||||
@@ -1,61 +0,0 @@
|
|||||||
name: Build and upload Node Status agent container to harbor.nymte.ch
|
|
||||||
|
|
||||||
on:
|
|
||||||
workflow_dispatch:
|
|
||||||
inputs:
|
|
||||||
gateway_probe_git_ref:
|
|
||||||
type: string
|
|
||||||
description: Which gateway probe git ref to build the image with
|
|
||||||
|
|
||||||
env:
|
|
||||||
WORKING_DIRECTORY: "nym-node-status-api/nym-node-status-agent"
|
|
||||||
CONTAINER_NAME: "node-status-agent"
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
build-container:
|
|
||||||
runs-on: arc-ubuntu-22.04-dind
|
|
||||||
steps:
|
|
||||||
- name: Login to Harbor
|
|
||||||
uses: docker/login-action@v3
|
|
||||||
with:
|
|
||||||
registry: harbor.nymte.ch
|
|
||||||
username: ${{ secrets.HARBOR_ROBOT_USERNAME }}
|
|
||||||
password: ${{ secrets.HARBOR_ROBOT_SECRET }}
|
|
||||||
|
|
||||||
- name: Checkout repo
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Configure git identity
|
|
||||||
run: |
|
|
||||||
git config --global user.email "lawrence@nymtech.net"
|
|
||||||
git config --global user.name "Lawrence Stalder"
|
|
||||||
|
|
||||||
- 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: cleanup-gateway-probe-ref
|
|
||||||
id: cleanup_gateway_probe_ref
|
|
||||||
run: |
|
|
||||||
GATEWAY_PROBE_GIT_REF=${{ github.event.inputs.gateway_probe_git_ref }}
|
|
||||||
GIT_REF_SLUG="${GATEWAY_PROBE_GIT_REF//\//-}"
|
|
||||||
echo "git_ref=${GIT_REF_SLUG}" >> $GITHUB_OUTPUT
|
|
||||||
|
|
||||||
- name: Remove existing tag if exists
|
|
||||||
run: |
|
|
||||||
if git rev-parse ${{ env.WORKING_DIRECTORY }}-${{ steps.get_version.outputs.result }}-${{ steps.cleanup_gateway_probe_ref.outputs.git_ref }} >/dev/null 2>&1; then
|
|
||||||
git push --delete origin ${{ env.WORKING_DIRECTORY }}-${{ steps.get_version.outputs.result }}-${{ steps.cleanup_gateway_probe_ref.outputs.git_ref }}
|
|
||||||
git tag -d ${{ env.WORKING_DIRECTORY }}-${{ steps.get_version.outputs.result }}-${{ steps.cleanup_gateway_probe_ref.outputs.git_ref }}
|
|
||||||
fi
|
|
||||||
|
|
||||||
- name: Create tag
|
|
||||||
run: |
|
|
||||||
git tag -a ${{ env.WORKING_DIRECTORY }}-${{ steps.get_version.outputs.result }}-${{ steps.cleanup_gateway_probe_ref.outputs.git_ref }} -m "Version ${{ steps.get_version.outputs.result }}-${{ steps.cleanup_gateway_probe_ref.outputs.git_ref }}"
|
|
||||||
git push origin ${{ env.WORKING_DIRECTORY }}-${{ steps.get_version.outputs.result }}-${{ steps.cleanup_gateway_probe_ref.outputs.git_ref }}
|
|
||||||
|
|
||||||
- name: BuildAndPushImageOnHarbor
|
|
||||||
run: |
|
|
||||||
docker build --build-arg GIT_REF=${{ github.event.inputs.gateway_probe_git_ref }} -f ${{ env.WORKING_DIRECTORY }}/Dockerfile . -t harbor.nymte.ch/nym/${{ env.CONTAINER_NAME }}:${{ steps.get_version.outputs.result }}-${{ steps.cleanup_gateway_probe_ref.outputs.git_ref }}
|
|
||||||
docker push harbor.nymte.ch/nym/${{ env.CONTAINER_NAME }} --all-tags
|
|
||||||
@@ -1,55 +0,0 @@
|
|||||||
name: Build and upload Node Status API container to harbor.nymte.ch
|
|
||||||
on:
|
|
||||||
workflow_dispatch:
|
|
||||||
|
|
||||||
env:
|
|
||||||
WORKING_DIRECTORY: "nym-node-status-api/nym-node-status-api"
|
|
||||||
CONTAINER_NAME: "node-status-api"
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
build-container:
|
|
||||||
runs-on: arc-ubuntu-22.04-dind
|
|
||||||
steps:
|
|
||||||
- name: Login to Harbor
|
|
||||||
uses: docker/login-action@v3
|
|
||||||
with:
|
|
||||||
registry: harbor.nymte.ch
|
|
||||||
username: ${{ secrets.HARBOR_ROBOT_USERNAME }}
|
|
||||||
password: ${{ secrets.HARBOR_ROBOT_SECRET }}
|
|
||||||
|
|
||||||
- name: Checkout repo
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Configure git identity
|
|
||||||
run: |
|
|
||||||
git config --global user.email "lawrence@nymtech.net"
|
|
||||||
git config --global user.name "Lawrence Stalder"
|
|
||||||
|
|
||||||
- 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 tag exists
|
|
||||||
run: |
|
|
||||||
if git rev-parse ${{ env.WORKING_DIRECTORY }}-${{ steps.get_version.outputs.result }} >/dev/null 2>&1; then
|
|
||||||
echo "Tag ${{ steps.get_version.outputs.result }} already exists"
|
|
||||||
fi
|
|
||||||
|
|
||||||
- name: Remove existing tag if exists
|
|
||||||
run: |
|
|
||||||
if git rev-parse ${{ env.WORKING_DIRECTORY }}-${{ steps.get_version.outputs.result }} >/dev/null 2>&1; then
|
|
||||||
git push --delete origin ${{ env.WORKING_DIRECTORY }}-${{ steps.get_version.outputs.result }}
|
|
||||||
git tag -d ${{ env.WORKING_DIRECTORY }}-${{ steps.get_version.outputs.result }}
|
|
||||||
fi
|
|
||||||
|
|
||||||
- name: Create tag
|
|
||||||
run: |
|
|
||||||
git tag -a ${{ env.WORKING_DIRECTORY }}-${{ steps.get_version.outputs.result }} -m "Version ${{ steps.get_version.outputs.result }}"
|
|
||||||
git push origin ${{ env.WORKING_DIRECTORY }}-${{ steps.get_version.outputs.result }}
|
|
||||||
|
|
||||||
- name: BuildAndPushImageOnHarbor
|
|
||||||
run: |
|
|
||||||
docker build -f ${{ env.WORKING_DIRECTORY }}/Dockerfile . -t harbor.nymte.ch/nym/${{ env.CONTAINER_NAME }}:${{ steps.get_version.outputs.result }} -t harbor.nymte.ch/nym/${{ env.CONTAINER_NAME }}:latest
|
|
||||||
docker push harbor.nymte.ch/nym/${{ env.CONTAINER_NAME }} --all-tags
|
|
||||||
@@ -1,55 +0,0 @@
|
|||||||
name: Build and upload nym node container to harbor.nymte.ch
|
|
||||||
on:
|
|
||||||
workflow_dispatch:
|
|
||||||
|
|
||||||
env:
|
|
||||||
WORKING_DIRECTORY: "nym-node"
|
|
||||||
CONTAINER_NAME: "nym-node"
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
build-container:
|
|
||||||
runs-on: arc-ubuntu-22.04-dind
|
|
||||||
steps:
|
|
||||||
- name: Login to Harbor
|
|
||||||
uses: docker/login-action@v3
|
|
||||||
with:
|
|
||||||
registry: harbor.nymte.ch
|
|
||||||
username: ${{ secrets.HARBOR_ROBOT_USERNAME }}
|
|
||||||
password: ${{ secrets.HARBOR_ROBOT_SECRET }}
|
|
||||||
|
|
||||||
- name: Checkout repo
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Configure git identity
|
|
||||||
run: |
|
|
||||||
git config --global user.email "lawrence@nymtech.net"
|
|
||||||
git config --global user.name "Lawrence Stalder"
|
|
||||||
|
|
||||||
- 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 tag exists
|
|
||||||
run: |
|
|
||||||
if git rev-parse ${{ steps.get_version.outputs.value }} >/dev/null 2>&1; then
|
|
||||||
echo "Tag ${{ steps.get_version.outputs.value }} already exists"
|
|
||||||
fi
|
|
||||||
|
|
||||||
- name: Remove existing tag if exists
|
|
||||||
run: |
|
|
||||||
if git rev-parse ${{ env.WORKING_DIRECTORY }}-${{ steps.get_version.outputs.result }} >/dev/null 2>&1; then
|
|
||||||
git push --delete origin ${{ env.WORKING_DIRECTORY }}-${{ steps.get_version.outputs.result }}
|
|
||||||
git tag -d ${{ env.WORKING_DIRECTORY }}-${{ steps.get_version.outputs.result }}
|
|
||||||
fi
|
|
||||||
|
|
||||||
- name: Create tag
|
|
||||||
run: |
|
|
||||||
git tag -a ${{ env.WORKING_DIRECTORY }}-${{ steps.get_version.outputs.result }} -m "Version ${{ steps.get_version.outputs.result }}"
|
|
||||||
git push origin ${{ env.WORKING_DIRECTORY }}-${{ steps.get_version.outputs.result }}
|
|
||||||
|
|
||||||
- name: BuildAndPushImageOnHarbor
|
|
||||||
run: |
|
|
||||||
docker build -f ${{ env.WORKING_DIRECTORY }}/Dockerfile . -t harbor.nymte.ch/nym/${{ env.CONTAINER_NAME }}:${{ steps.get_version.outputs.result }} -t harbor.nymte.ch/nym/${{ env.CONTAINER_NAME }}:latest
|
|
||||||
docker push harbor.nymte.ch/nym/${{ env.CONTAINER_NAME }} --all-tags
|
|
||||||
@@ -1,55 +0,0 @@
|
|||||||
name: Build and upload Nyx Chain Watcher container to harbor.nymte.ch
|
|
||||||
on:
|
|
||||||
workflow_dispatch:
|
|
||||||
|
|
||||||
env:
|
|
||||||
WORKING_DIRECTORY: "nyx-chain-watcher"
|
|
||||||
CONTAINER_NAME: "nyx-chain-watcher"
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
build-container:
|
|
||||||
runs-on: arc-ubuntu-22.04-dind
|
|
||||||
steps:
|
|
||||||
- name: Login to Harbor
|
|
||||||
uses: docker/login-action@v3
|
|
||||||
with:
|
|
||||||
registry: harbor.nymte.ch
|
|
||||||
username: ${{ secrets.HARBOR_ROBOT_USERNAME }}
|
|
||||||
password: ${{ secrets.HARBOR_ROBOT_SECRET }}
|
|
||||||
|
|
||||||
- name: Checkout repo
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Configure git identity
|
|
||||||
run: |
|
|
||||||
git config --global user.email "lawrence@nymtech.net"
|
|
||||||
git config --global user.name "Lawrence Stalder"
|
|
||||||
|
|
||||||
- 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 tag exists
|
|
||||||
run: |
|
|
||||||
if git rev-parse ${{ steps.get_version.outputs.value }} >/dev/null 2>&1; then
|
|
||||||
echo "Tag ${{ steps.get_version.outputs.value }} already exists"
|
|
||||||
fi
|
|
||||||
|
|
||||||
- name: Remove existing tag if exists
|
|
||||||
run: |
|
|
||||||
if git rev-parse ${{ env.WORKING_DIRECTORY }}-${{ steps.get_version.outputs.result }} >/dev/null 2>&1; then
|
|
||||||
git push --delete origin ${{ env.WORKING_DIRECTORY }}-${{ steps.get_version.outputs.result }}
|
|
||||||
git tag -d ${{ env.WORKING_DIRECTORY }}-${{ steps.get_version.outputs.result }}
|
|
||||||
fi
|
|
||||||
|
|
||||||
- name: Create tag
|
|
||||||
run: |
|
|
||||||
git tag -a ${{ env.WORKING_DIRECTORY }}-${{ steps.get_version.outputs.result }} -m "Version ${{ steps.get_version.outputs.result }}"
|
|
||||||
git push origin ${{ env.WORKING_DIRECTORY }}-${{ steps.get_version.outputs.result }}
|
|
||||||
|
|
||||||
- name: BuildAndPushImageOnHarbor
|
|
||||||
run: |
|
|
||||||
docker build -f ${{ env.WORKING_DIRECTORY }}/Dockerfile . -t harbor.nymte.ch/nym/${{ env.CONTAINER_NAME }}:${{ steps.get_version.outputs.result }} -t harbor.nymte.ch/nym/${{ env.CONTAINER_NAME }}:latest
|
|
||||||
docker push harbor.nymte.ch/nym/${{ env.CONTAINER_NAME }} --all-tags
|
|
||||||
@@ -1,49 +0,0 @@
|
|||||||
name: Build and upload Validator Rewarder container to harbor.nymte.ch
|
|
||||||
on:
|
|
||||||
workflow_dispatch:
|
|
||||||
|
|
||||||
env:
|
|
||||||
WORKING_DIRECTORY: "nym-validator-rewarder"
|
|
||||||
CONTAINER_NAME: "validator-rewarder"
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
build-container:
|
|
||||||
runs-on: arc-ubuntu-22.04-dind
|
|
||||||
steps:
|
|
||||||
- name: Login to Harbor
|
|
||||||
uses: docker/login-action@v3
|
|
||||||
with:
|
|
||||||
registry: harbor.nymte.ch
|
|
||||||
username: ${{ secrets.HARBOR_ROBOT_USERNAME }}
|
|
||||||
password: ${{ secrets.HARBOR_ROBOT_SECRET }}
|
|
||||||
|
|
||||||
- name: Checkout repo
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Configure git identity
|
|
||||||
run: |
|
|
||||||
git config --global user.email "lawrence@nymtech.net"
|
|
||||||
git config --global user.name "Lawrence Stalder"
|
|
||||||
|
|
||||||
- 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: Remove existing tag if exists
|
|
||||||
run: |
|
|
||||||
if git rev-parse ${{ env.WORKING_DIRECTORY }}-${{ steps.get_version.outputs.result }} >/dev/null 2>&1; then
|
|
||||||
git push --delete origin ${{ env.WORKING_DIRECTORY }}-${{ steps.get_version.outputs.result }}
|
|
||||||
git tag -d ${{ env.WORKING_DIRECTORY }}-${{ steps.get_version.outputs.result }}
|
|
||||||
fi
|
|
||||||
|
|
||||||
- name: Create tag
|
|
||||||
run: |
|
|
||||||
git tag -a ${{ env.WORKING_DIRECTORY }}-${{ steps.get_version.outputs.result }} -m "Version ${{ steps.get_version.outputs.result }}"
|
|
||||||
git push origin ${{ env.WORKING_DIRECTORY }}-${{ steps.get_version.outputs.result }}
|
|
||||||
|
|
||||||
- name: BuildAndPushImageOnHarbor
|
|
||||||
run: |
|
|
||||||
docker build -f ${{ env.WORKING_DIRECTORY }}/Dockerfile . -t harbor.nymte.ch/nym/${{ env.CONTAINER_NAME }}:${{ steps.get_version.outputs.result }} -t harbor.nymte.ch/nym/${{ env.CONTAINER_NAME }}:latest
|
|
||||||
docker push harbor.nymte.ch/nym/${{ env.CONTAINER_NAME }} --all-tags
|
|
||||||
@@ -20,8 +20,8 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Check out repository code
|
- name: Check out repository code
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v3
|
||||||
- uses: actions/setup-node@v4
|
- uses: actions/setup-node@v3
|
||||||
with:
|
with:
|
||||||
node-version: 18
|
node-version: 18
|
||||||
- uses: nymtech/nym/.github/actions/nym-hash-releases@develop
|
- uses: nymtech/nym/.github/actions/nym-hash-releases@develop
|
||||||
@@ -30,7 +30,7 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
release-tag-or-name-or-id: ${{ inputs.release_tag }}
|
release-tag-or-name-or-id: ${{ inputs.release_tag }}
|
||||||
|
|
||||||
- uses: actions/upload-artifact@v4
|
- uses: actions/upload-artifact@v2
|
||||||
with:
|
with:
|
||||||
name: Asset Hashes
|
name: Asset Hashes
|
||||||
path: hashes.json
|
path: hashes.json
|
||||||
|
|||||||
+1
-11
@@ -48,14 +48,4 @@ foxyfox.env
|
|||||||
|
|
||||||
.next
|
.next
|
||||||
ppa-private-key.b64
|
ppa-private-key.b64
|
||||||
ppa-private-key.asc
|
ppa-private-key.asc
|
||||||
nym-network-monitor/topology.json
|
|
||||||
nym-network-monitor/__pycache__
|
|
||||||
nym-network-monitor/*.key
|
|
||||||
nym-network-monitor/.envrc
|
|
||||||
nym-network-monitor/.envrc
|
|
||||||
nym-api/redocly/formatted-openapi.json
|
|
||||||
|
|
||||||
|
|
||||||
*.sqlite
|
|
||||||
.build
|
|
||||||
-839
@@ -4,845 +4,6 @@ Post 1.0.0 release, the changelog format is based on [Keep a Changelog](https://
|
|||||||
|
|
||||||
## [Unreleased]
|
## [Unreleased]
|
||||||
|
|
||||||
## [2025.4-dorina] (2025-03-04)
|
|
||||||
|
|
||||||
- fixed sphinx version metrics registration ([#5546])
|
|
||||||
- Feature/chain status api ([#5539])
|
|
||||||
- Add SURBs soft threshold ([#5535])
|
|
||||||
- Simplify IPR v8 ([#5532])
|
|
||||||
- Shared instance for DNS AsyncResolver ([#5523])
|
|
||||||
- merge #5512 again after reverting due to incorrect rebase ([#5520])
|
|
||||||
- cherry-pick 17d3ff2d775f61aee381d90a304ed416c08f33fc onto dorina ([#5519])
|
|
||||||
- cherry-pick 6e5d0dac1b75413c5f09122b0d953f8ec6ef48df onto dorina ([#5518])
|
|
||||||
- chore: workspace global panic preventing lints ([#5512])
|
|
||||||
- bugfix: dont query for ecash apis unless necessary when spending ticketbooks ([#5508])
|
|
||||||
- bugfix: bound check when recovering a reply SURB ([#5502])
|
|
||||||
- chore: removed all old coconut code ([#5500])
|
|
||||||
- IPR request types v8 ([#5498])
|
|
||||||
- Support static routes for HTTP requests ([#5487])
|
|
||||||
- build(deps): bump the patch-updates group across 1 directory with 3 updates ([#5482])
|
|
||||||
- added missing import to doctest ([#5480])
|
|
||||||
- adjusted TestSetup::new_complex to ensure bonded node's existence ([#5478])
|
|
||||||
- Trigger contracts CI on main workspace Cargo changes ([#5477])
|
|
||||||
- build(deps): bump http from 1.1.0 to 1.2.0 ([#5472])
|
|
||||||
- build(deps): bump utoipa-swagger-ui from 8.0.3 to 8.1.0 ([#5471])
|
|
||||||
- build(deps): bump colored from 2.1.0 to 2.2.0 ([#5470])
|
|
||||||
- build(deps): bump celes from 2.4.0 to 2.5.0 ([#5469])
|
|
||||||
- build(deps): bump the patch-updates group with 2 updates ([#5467])
|
|
||||||
- build(deps): bump elliptic from 6.5.4 to 6.6.1 in /docker/typescript_client/upload_contract ([#5463])
|
|
||||||
- Run cargo autoinherit ([#5460])
|
|
||||||
- Fix clippy::precedence ([#5457])
|
|
||||||
- Provide Interval context with node descriptor endpoints ([#5456])
|
|
||||||
- fix: update fx average rate calcs to ignore 0 values ([#5454])
|
|
||||||
- Feature/add gbp currency ([#5453])
|
|
||||||
- Add helper to extract a list of sqlite files with journal files wal/shm ([#5452])
|
|
||||||
- Add a middleware layer to the nym api allowing for data compression ([#5451])
|
|
||||||
- Condense core API functionalities and enable gzip decompression for reqwest payloads ([#5450])
|
|
||||||
- build(deps): bump uniffi_build from 0.25.3 to 0.29.0 ([#5448])
|
|
||||||
- Upgrade tower to 0.5.2 ([#5446])
|
|
||||||
- build(deps): bump hickory-proto from 0.24.2 to 0.24.3 ([#5444])
|
|
||||||
- Seedable clients ([#5440])
|
|
||||||
- build(deps): bump the patch-updates group across 1 directory with 10 updates ([#5439])
|
|
||||||
- Remove all recv_with_delay and add shutdown condition to loops in client-core ([#5435])
|
|
||||||
- Disable the test for checking the remaining bandwidth in nym-node-status-api ([#5425])
|
|
||||||
- Dz nym node stats ([#5418])
|
|
||||||
- build(deps): bump hyper from 1.4.1 to 1.6.0 ([#5416])
|
|
||||||
- build(deps): bump publicsuffix from 2.2.3 to 2.3.0 ([#5367])
|
|
||||||
- Nymnode entrypoint docker ([#5300])
|
|
||||||
|
|
||||||
[#5546]: https://github.com/nymtech/nym/pull/5546
|
|
||||||
[#5539]: https://github.com/nymtech/nym/pull/5539
|
|
||||||
[#5535]: https://github.com/nymtech/nym/pull/5535
|
|
||||||
[#5532]: https://github.com/nymtech/nym/pull/5532
|
|
||||||
[#5523]: https://github.com/nymtech/nym/pull/5523
|
|
||||||
[#5520]: https://github.com/nymtech/nym/pull/5520
|
|
||||||
[#5519]: https://github.com/nymtech/nym/pull/5519
|
|
||||||
[#5518]: https://github.com/nymtech/nym/pull/5518
|
|
||||||
[#5512]: https://github.com/nymtech/nym/pull/5512
|
|
||||||
[#5508]: https://github.com/nymtech/nym/pull/5508
|
|
||||||
[#5502]: https://github.com/nymtech/nym/pull/5502
|
|
||||||
[#5500]: https://github.com/nymtech/nym/pull/5500
|
|
||||||
[#5498]: https://github.com/nymtech/nym/pull/5498
|
|
||||||
[#5487]: https://github.com/nymtech/nym/pull/5487
|
|
||||||
[#5482]: https://github.com/nymtech/nym/pull/5482
|
|
||||||
[#5480]: https://github.com/nymtech/nym/pull/5480
|
|
||||||
[#5478]: https://github.com/nymtech/nym/pull/5478
|
|
||||||
[#5477]: https://github.com/nymtech/nym/pull/5477
|
|
||||||
[#5472]: https://github.com/nymtech/nym/pull/5472
|
|
||||||
[#5471]: https://github.com/nymtech/nym/pull/5471
|
|
||||||
[#5470]: https://github.com/nymtech/nym/pull/5470
|
|
||||||
[#5469]: https://github.com/nymtech/nym/pull/5469
|
|
||||||
[#5467]: https://github.com/nymtech/nym/pull/5467
|
|
||||||
[#5463]: https://github.com/nymtech/nym/pull/5463
|
|
||||||
[#5460]: https://github.com/nymtech/nym/pull/5460
|
|
||||||
[#5457]: https://github.com/nymtech/nym/pull/5457
|
|
||||||
[#5456]: https://github.com/nymtech/nym/pull/5456
|
|
||||||
[#5454]: https://github.com/nymtech/nym/pull/5454
|
|
||||||
[#5453]: https://github.com/nymtech/nym/pull/5453
|
|
||||||
[#5452]: https://github.com/nymtech/nym/pull/5452
|
|
||||||
[#5451]: https://github.com/nymtech/nym/pull/5451
|
|
||||||
[#5450]: https://github.com/nymtech/nym/pull/5450
|
|
||||||
[#5448]: https://github.com/nymtech/nym/pull/5448
|
|
||||||
[#5446]: https://github.com/nymtech/nym/pull/5446
|
|
||||||
[#5444]: https://github.com/nymtech/nym/pull/5444
|
|
||||||
[#5440]: https://github.com/nymtech/nym/pull/5440
|
|
||||||
[#5439]: https://github.com/nymtech/nym/pull/5439
|
|
||||||
[#5435]: https://github.com/nymtech/nym/pull/5435
|
|
||||||
[#5425]: https://github.com/nymtech/nym/pull/5425
|
|
||||||
[#5418]: https://github.com/nymtech/nym/pull/5418
|
|
||||||
[#5416]: https://github.com/nymtech/nym/pull/5416
|
|
||||||
[#5367]: https://github.com/nymtech/nym/pull/5367
|
|
||||||
[#5300]: https://github.com/nymtech/nym/pull/5300
|
|
||||||
|
|
||||||
## [2025.3-ruta] (2025-02-10)
|
|
||||||
|
|
||||||
- Push down forget me to client configs ([#5431])
|
|
||||||
- Fix statistics shutdown ([#5426])
|
|
||||||
- Make wait_for_graceful_shutdown to be pub ([#5424])
|
|
||||||
- Upgrade to thiserror 2.0 ([#5414])
|
|
||||||
- build(deps): bump the patch-updates group across 1 directory with 9 updates ([#5406])
|
|
||||||
- Relocate a validator api function ([#5401])
|
|
||||||
- Send shutdown instead of panic when reaching max fail ([#5398])
|
|
||||||
- Change Explorer URL to new smooshed nodes ([#5396])
|
|
||||||
- reduce log severity for checking topology validity ([#5395])
|
|
||||||
- MixnetClient can send ClientRequests ([#5381])
|
|
||||||
- Fix missing path triggers for CI ([#5380])
|
|
||||||
- Uncouple storage reference for bandwidth client ([#5372])
|
|
||||||
- build(deps): bump tokio from 1.40.0 to 1.43.0 ([#5370])
|
|
||||||
- DNS resolver configuration for internal HTTP client lookups ([#5355])
|
|
||||||
- Update README.md ([#5328])
|
|
||||||
- Update README.md ([#5327])
|
|
||||||
|
|
||||||
[#5431]: https://github.com/nymtech/nym/pull/5431
|
|
||||||
[#5426]: https://github.com/nymtech/nym/pull/5426
|
|
||||||
[#5424]: https://github.com/nymtech/nym/pull/5424
|
|
||||||
[#5414]: https://github.com/nymtech/nym/pull/5414
|
|
||||||
[#5406]: https://github.com/nymtech/nym/pull/5406
|
|
||||||
[#5401]: https://github.com/nymtech/nym/pull/5401
|
|
||||||
[#5398]: https://github.com/nymtech/nym/pull/5398
|
|
||||||
[#5396]: https://github.com/nymtech/nym/pull/5396
|
|
||||||
[#5395]: https://github.com/nymtech/nym/pull/5395
|
|
||||||
[#5381]: https://github.com/nymtech/nym/pull/5381
|
|
||||||
[#5380]: https://github.com/nymtech/nym/pull/5380
|
|
||||||
[#5372]: https://github.com/nymtech/nym/pull/5372
|
|
||||||
[#5370]: https://github.com/nymtech/nym/pull/5370
|
|
||||||
[#5355]: https://github.com/nymtech/nym/pull/5355
|
|
||||||
[#5328]: https://github.com/nymtech/nym/pull/5328
|
|
||||||
[#5327]: https://github.com/nymtech/nym/pull/5327
|
|
||||||
|
|
||||||
## [2025.2-hu] (2025-02-04)
|
|
||||||
|
|
||||||
- Feature/remove double spending bloomfilter ([#5417])
|
|
||||||
- HU - Downgrade harmless log message from info to debug ([#5405])
|
|
||||||
- lower default ticket verification quorum to 0.7 ([#5404])
|
|
||||||
- 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: terminate mixnet socket listener on shutdown ([#5389])
|
|
||||||
- feat: make client ignore dual mode nodes by default ([#5388])
|
|
||||||
- Handle ecash network errors differently ([#5378])
|
|
||||||
- Remove empty ephemeral keys ([#5376])
|
|
||||||
- fixed sql migration for adding default message timestamp ([#5374])
|
|
||||||
- Bind to [::] on nym-node for both IP versions ([#5361])
|
|
||||||
- exposed NymApiClient method for obtaining node performance history ([#5360])
|
|
||||||
- Client gateway selection ([#5358])
|
|
||||||
- chore: refresh wasm sdk ([#5353])
|
|
||||||
- chore: update indexed_db_futures ([#5347])
|
|
||||||
- build(deps): bump mikefarah/yq from 4.44.6 to 4.45.1 ([#5342])
|
|
||||||
- updated cosmrs and tendermint-rpc to their most recent versions ([#5339])
|
|
||||||
- build(deps): bump ts-rs from 10.0.0 to 10.1.0 ([#5338])
|
|
||||||
- build(deps): bump tempfile from 3.14.0 to 3.15.0 ([#5337])
|
|
||||||
- build(deps): bump the patch-updates group with 8 updates ([#5336])
|
|
||||||
- feature: introduce /load endpoint for self-reported quantised NymNode load ([#5326])
|
|
||||||
- feature: `CancellationToken`-based shutdowns ([#5325])
|
|
||||||
- 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])
|
|
||||||
- Move tun constants to network defaults ([#5286])
|
|
||||||
- Include IPINFO_API_TOKEN in nightly CI ([#5285])
|
|
||||||
- Nyx Chain Watcher ([#5274])
|
|
||||||
- bugfix: remove unnecessary arguments for nym-api swagger endpoints ([#5272])
|
|
||||||
- feature: nym topology revamp ([#5271])
|
|
||||||
- Add windows to CI builds ([#5269])
|
|
||||||
- http-api-client: deduplicate code ([#5267])
|
|
||||||
- build(deps): bump http from 1.1.0 to 1.2.0 ([#5228])
|
|
||||||
- NS API: add mixnet scraper ([#5200])
|
|
||||||
- build(deps): bump criterion from 0.4.0 to 0.5.1 ([#4911])
|
|
||||||
|
|
||||||
[#5417]: https://github.com/nymtech/nym/pull/5417
|
|
||||||
[#5405]: https://github.com/nymtech/nym/pull/5405
|
|
||||||
[#5404]: https://github.com/nymtech/nym/pull/5404
|
|
||||||
[#5403]: https://github.com/nymtech/nym/pull/5403
|
|
||||||
[#5397]: https://github.com/nymtech/nym/pull/5397
|
|
||||||
[#5394]: https://github.com/nymtech/nym/pull/5394
|
|
||||||
[#5390]: https://github.com/nymtech/nym/pull/5390
|
|
||||||
[#5389]: https://github.com/nymtech/nym/pull/5389
|
|
||||||
[#5388]: https://github.com/nymtech/nym/pull/5388
|
|
||||||
[#5378]: https://github.com/nymtech/nym/pull/5378
|
|
||||||
[#5376]: https://github.com/nymtech/nym/pull/5376
|
|
||||||
[#5374]: https://github.com/nymtech/nym/pull/5374
|
|
||||||
[#5361]: https://github.com/nymtech/nym/pull/5361
|
|
||||||
[#5360]: https://github.com/nymtech/nym/pull/5360
|
|
||||||
[#5358]: https://github.com/nymtech/nym/pull/5358
|
|
||||||
[#5353]: https://github.com/nymtech/nym/pull/5353
|
|
||||||
[#5347]: https://github.com/nymtech/nym/pull/5347
|
|
||||||
[#5342]: https://github.com/nymtech/nym/pull/5342
|
|
||||||
[#5339]: https://github.com/nymtech/nym/pull/5339
|
|
||||||
[#5338]: https://github.com/nymtech/nym/pull/5338
|
|
||||||
[#5337]: https://github.com/nymtech/nym/pull/5337
|
|
||||||
[#5336]: https://github.com/nymtech/nym/pull/5336
|
|
||||||
[#5326]: https://github.com/nymtech/nym/pull/5326
|
|
||||||
[#5325]: https://github.com/nymtech/nym/pull/5325
|
|
||||||
[#5314]: https://github.com/nymtech/nym/pull/5314
|
|
||||||
[#5312]: https://github.com/nymtech/nym/pull/5312
|
|
||||||
[#5310]: https://github.com/nymtech/nym/pull/5310
|
|
||||||
[#5297]: https://github.com/nymtech/nym/pull/5297
|
|
||||||
[#5286]: https://github.com/nymtech/nym/pull/5286
|
|
||||||
[#5285]: https://github.com/nymtech/nym/pull/5285
|
|
||||||
[#5274]: https://github.com/nymtech/nym/pull/5274
|
|
||||||
[#5272]: https://github.com/nymtech/nym/pull/5272
|
|
||||||
[#5271]: https://github.com/nymtech/nym/pull/5271
|
|
||||||
[#5269]: https://github.com/nymtech/nym/pull/5269
|
|
||||||
[#5267]: https://github.com/nymtech/nym/pull/5267
|
|
||||||
[#5228]: https://github.com/nymtech/nym/pull/5228
|
|
||||||
[#5200]: https://github.com/nymtech/nym/pull/5200
|
|
||||||
[#4911]: https://github.com/nymtech/nym/pull/4911
|
|
||||||
|
|
||||||
## [2025.1-reeses] (2025-01-15)
|
|
||||||
|
|
||||||
- Feture/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])
|
|
||||||
- reduce log severity for number of packets being delayed ([#5321])
|
|
||||||
- feat: warn users if node is run in exit mode only ([#5320])
|
|
||||||
- Bugfix/contract version assignment ([#5318])
|
|
||||||
- fixed client session histogram buckets ([#5316])
|
|
||||||
- amend 250gb limit ([#5313])
|
|
||||||
- feature: expand nym-node prometheus metrics ([#5298])
|
|
||||||
- Cherry picked #5286 ([#5287])
|
|
||||||
- Add close to credential storage ([#5283])
|
|
||||||
- feature: wireguard metrics ([#5278])
|
|
||||||
- Add PATCH support to nym-http-api-client ([#5260])
|
|
||||||
- chore: removed legacy socks5 listener ([#5259])
|
|
||||||
- bugfix: make sure to apply gateway score filtering when choosing initial node ([#5256])
|
|
||||||
- Update TS bindings ([#5255])
|
|
||||||
- Add conversion unit tests for auth msg ([#5251])
|
|
||||||
- Add control messages to GatewayTransciver ([#5247])
|
|
||||||
- Remove unneeded async function annotation ([#5246])
|
|
||||||
- bugfix: make sure to update timestamp of last batch verification to prevent double redemption ([#5239])
|
|
||||||
- Add FromStr impl for UserAgent ([#5236])
|
|
||||||
- Extend swagger docs ([#5235])
|
|
||||||
- TicketType derive Hash and Eq ([#5233])
|
|
||||||
- Add fd callback to client core ([#5230])
|
|
||||||
- Extend raw ws fd for gateway client ([#5218])
|
|
||||||
- Shipping raw metrics to PG ([#5216])
|
|
||||||
- Change sqlite journal mode to WAL ([#5213])
|
|
||||||
- Derive serialize for UserAgent ([#5210])
|
|
||||||
- Restore Location fields ([#5208])
|
|
||||||
- better date serialization ([#5207])
|
|
||||||
- Fix overflow ([#5204])
|
|
||||||
- feature: hopefully final steps of the smoosh™️ ([#5201])
|
|
||||||
- Fix overflow ([#5184])
|
|
||||||
- NS API - Gateway stats scraping ([#5180])
|
|
||||||
- introduced initial internal commands for nym-cli: ecash key and request generation ([#5174])
|
|
||||||
- Move NS client to separate package under NS API ([#5171])
|
|
||||||
- build(deps): bump micromatch from 4.0.4 to 4.0.8 in /testnet-faucet ([#4813])
|
|
||||||
|
|
||||||
[#5346]: https://github.com/nymtech/nym/pull/5346
|
|
||||||
[#5331]: https://github.com/nymtech/nym/pull/5331
|
|
||||||
[#5330]: https://github.com/nymtech/nym/pull/5330
|
|
||||||
[#5329]: https://github.com/nymtech/nym/pull/5329
|
|
||||||
[#5321]: https://github.com/nymtech/nym/pull/5321
|
|
||||||
[#5320]: https://github.com/nymtech/nym/pull/5320
|
|
||||||
[#5318]: https://github.com/nymtech/nym/pull/5318
|
|
||||||
[#5316]: https://github.com/nymtech/nym/pull/5316
|
|
||||||
[#5313]: https://github.com/nymtech/nym/pull/5313
|
|
||||||
[#5298]: https://github.com/nymtech/nym/pull/5298
|
|
||||||
[#5287]: https://github.com/nymtech/nym/pull/5287
|
|
||||||
[#5283]: https://github.com/nymtech/nym/pull/5283
|
|
||||||
[#5278]: https://github.com/nymtech/nym/pull/5278
|
|
||||||
[#5260]: https://github.com/nymtech/nym/pull/5260
|
|
||||||
[#5259]: https://github.com/nymtech/nym/pull/5259
|
|
||||||
[#5256]: https://github.com/nymtech/nym/pull/5256
|
|
||||||
[#5255]: https://github.com/nymtech/nym/pull/5255
|
|
||||||
[#5251]: https://github.com/nymtech/nym/pull/5251
|
|
||||||
[#5247]: https://github.com/nymtech/nym/pull/5247
|
|
||||||
[#5246]: https://github.com/nymtech/nym/pull/5246
|
|
||||||
[#5239]: https://github.com/nymtech/nym/pull/5239
|
|
||||||
[#5236]: https://github.com/nymtech/nym/pull/5236
|
|
||||||
[#5235]: https://github.com/nymtech/nym/pull/5235
|
|
||||||
[#5233]: https://github.com/nymtech/nym/pull/5233
|
|
||||||
[#5230]: https://github.com/nymtech/nym/pull/5230
|
|
||||||
[#5218]: https://github.com/nymtech/nym/pull/5218
|
|
||||||
[#5216]: https://github.com/nymtech/nym/pull/5216
|
|
||||||
[#5213]: https://github.com/nymtech/nym/pull/5213
|
|
||||||
[#5210]: https://github.com/nymtech/nym/pull/5210
|
|
||||||
[#5208]: https://github.com/nymtech/nym/pull/5208
|
|
||||||
[#5207]: https://github.com/nymtech/nym/pull/5207
|
|
||||||
[#5204]: https://github.com/nymtech/nym/pull/5204
|
|
||||||
[#5201]: https://github.com/nymtech/nym/pull/5201
|
|
||||||
[#5184]: https://github.com/nymtech/nym/pull/5184
|
|
||||||
[#5180]: https://github.com/nymtech/nym/pull/5180
|
|
||||||
[#5174]: https://github.com/nymtech/nym/pull/5174
|
|
||||||
[#5171]: https://github.com/nymtech/nym/pull/5171
|
|
||||||
[#4813]: https://github.com/nymtech/nym/pull/4813
|
|
||||||
|
|
||||||
## [2024.14-crunch-patched] (2024-12-17)
|
|
||||||
|
|
||||||
- Fixes an issue to allow previously registred clients to connect to latest nym-nodes
|
|
||||||
- Fixes compatibility issues between nym-nodes and older clients
|
|
||||||
|
|
||||||
## [2024.14-crunch] (2024-12-11)
|
|
||||||
|
|
||||||
- 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])
|
|
||||||
- Backport #5218 ([#5220])
|
|
||||||
- Derive serialize for UserAgent (#5210) ([#5217])
|
|
||||||
- dont consider legacy nodes for rewarded set selection ([#5215])
|
|
||||||
- introduce UNSTABLE endpoints for returning network monitor run details ([#5214])
|
|
||||||
- Nmv2 add debug config ([#5212])
|
|
||||||
- nym-api NMv1 adjustments ([#5209])
|
|
||||||
- adjusted config score penalty calculation ([#5206])
|
|
||||||
- Fix backwards compat mac generation ([#5202])
|
|
||||||
- merge crunch into develop ([#5199])
|
|
||||||
- Update Security disclosure email, public key and policy ([#5195])
|
|
||||||
- Guard storage access with cache ([#5193])
|
|
||||||
- chore: apply 1.84 linter suggestions ([#5192])
|
|
||||||
- improvement: make internal gateway clients use the same topology cache ([#5191])
|
|
||||||
- Bugfix/credential proxy sequencing ([#5187])
|
|
||||||
- Add monitor_run and testing_route indexes ([#5182])
|
|
||||||
- Add indexes to monitor run and testing route ([#5181])
|
|
||||||
- bugfix: fixed nym-node config migrations (again) ([#5179])
|
|
||||||
- bugfix: use default value for verloc config when deserialising missing values ([#5177])
|
|
||||||
- Remove peers with no allowed ip from storage ([#5175])
|
|
||||||
- Move two minor jobs to free tier github hosted runners ([#5169])
|
|
||||||
- Add support for DELETE to nym-http-api-client ([#5166])
|
|
||||||
- Fix env var name ([#5165])
|
|
||||||
- Add strum::EnumIter for TicketType ([#5164])
|
|
||||||
- Add export_to_env to NymNetworkDetails ([#5162])
|
|
||||||
- bugfix: correctly expose ecash-related data on nym-api ([#5155])
|
|
||||||
- fix: validator-rewarder GH job ([#5151])
|
|
||||||
- build(deps): bump cross-spawn from 7.0.3 to 7.0.6 in /testnet-faucet ([#5150])
|
|
||||||
- build(deps): bump mikefarah/yq from 4.44.3 to 4.44.5 ([#5149])
|
|
||||||
- start session collection for exit gateways ([#5148])
|
|
||||||
- add version to clientStatsReport ([#5147])
|
|
||||||
- update serde_json_path due to compilation issue ([#5144])
|
|
||||||
- chore: remove standalone legacy mixnode/gateway binaries ([#5135])
|
|
||||||
- [Product Data] Set up country reporting from vpn-client ([#5134])
|
|
||||||
- removed ci-nym-api-tests.yml which was running outdated (and broken) tests ([#5133])
|
|
||||||
- CI: reduce jobs running on cluster ([#5132])
|
|
||||||
- [DOCS/operators]: Release changes v2024.13-magura & Tokenomics pages v1.0 ([#5128])
|
|
||||||
- NS Agent auth with NS API ([#5127])
|
|
||||||
- [Product Data] Config deserialization bug fix ([#5126])
|
|
||||||
- bugfix: don't send empty BankMsg in ecash contract ([#5121])
|
|
||||||
- [Product data] Data consumption with ecash ticket ([#5120])
|
|
||||||
- feat: add GH workflow for nym-validator-rewarder ([#5119])
|
|
||||||
- feat: add Dockerfile and add env vars for clap arguments ([#5118])
|
|
||||||
- feature: config score ([#5117])
|
|
||||||
- [Product Data] Add stats reporting configuration in client config ([#5115])
|
|
||||||
- Correct IPv6 address generation ([#5113])
|
|
||||||
- feature: rewarding for ticketbook issuance ([#5112])
|
|
||||||
- Add granular log on nym-node ([#5111])
|
|
||||||
- Send mixnet packet stats using task client ([#5109])
|
|
||||||
- Expose time range ([#5108])
|
|
||||||
- [Product Data] Client-side stats collection ([#5107])
|
|
||||||
- chore: ecash contract migration to remove unused 'redemption_gateway_share' ([#5104])
|
|
||||||
- [Product Data] Better unique user count on gateways ([#5084])
|
|
||||||
- feat: add nym node GH workflow ([#5080])
|
|
||||||
- IPv6 support for wireguard ([#5059])
|
|
||||||
- Node Status API ([#5050])
|
|
||||||
- Authenticator CLI client mode ([#5044])
|
|
||||||
- Integrate nym-credential-proxy into workspace ([#5027])
|
|
||||||
- [Product Data] Introduce data persistence on gateways ([#5022])
|
|
||||||
- Bump the patch-updates group across 1 directory with 10 updates ([#5011])
|
|
||||||
- build(deps): bump once_cell from 1.19.0 to 1.20.2 ([#4952])
|
|
||||||
- Create TaskStatusEvent trait instead of piggybacking on Error ([#4919])
|
|
||||||
- build(deps): bump lazy_static from 1.4.0 to 1.5.0 ([#4913])
|
|
||||||
- Sync code with .env in build.rs ([#4876])
|
|
||||||
- build(deps): bump axios from 1.6.0 to 1.7.5 in /nym-api/tests ([#4790])
|
|
||||||
- Bump elliptic from 6.5.4 to 6.5.7 in /testnet-faucet ([#4768])
|
|
||||||
|
|
||||||
[#5242]: https://github.com/nymtech/nym/pull/5242
|
|
||||||
[#5237]: https://github.com/nymtech/nym/pull/5237
|
|
||||||
[#5225]: https://github.com/nymtech/nym/pull/5225
|
|
||||||
[#5224]: https://github.com/nymtech/nym/pull/5224
|
|
||||||
[#5220]: https://github.com/nymtech/nym/pull/5220
|
|
||||||
[#5217]: https://github.com/nymtech/nym/pull/5217
|
|
||||||
[#5215]: https://github.com/nymtech/nym/pull/5215
|
|
||||||
[#5214]: https://github.com/nymtech/nym/pull/5214
|
|
||||||
[#5212]: https://github.com/nymtech/nym/pull/5212
|
|
||||||
[#5209]: https://github.com/nymtech/nym/pull/5209
|
|
||||||
[#5206]: https://github.com/nymtech/nym/pull/5206
|
|
||||||
[#5202]: https://github.com/nymtech/nym/pull/5202
|
|
||||||
[#5199]: https://github.com/nymtech/nym/pull/5199
|
|
||||||
[#5195]: https://github.com/nymtech/nym/pull/5195
|
|
||||||
[#5193]: https://github.com/nymtech/nym/pull/5193
|
|
||||||
[#5192]: https://github.com/nymtech/nym/pull/5192
|
|
||||||
[#5191]: https://github.com/nymtech/nym/pull/5191
|
|
||||||
[#5187]: https://github.com/nymtech/nym/pull/5187
|
|
||||||
[#5182]: https://github.com/nymtech/nym/pull/5182
|
|
||||||
[#5181]: https://github.com/nymtech/nym/pull/5181
|
|
||||||
[#5179]: https://github.com/nymtech/nym/pull/5179
|
|
||||||
[#5177]: https://github.com/nymtech/nym/pull/5177
|
|
||||||
[#5175]: https://github.com/nymtech/nym/pull/5175
|
|
||||||
[#5169]: https://github.com/nymtech/nym/pull/5169
|
|
||||||
[#5166]: https://github.com/nymtech/nym/pull/5166
|
|
||||||
[#5165]: https://github.com/nymtech/nym/pull/5165
|
|
||||||
[#5164]: https://github.com/nymtech/nym/pull/5164
|
|
||||||
[#5162]: https://github.com/nymtech/nym/pull/5162
|
|
||||||
[#5155]: https://github.com/nymtech/nym/pull/5155
|
|
||||||
[#5151]: https://github.com/nymtech/nym/pull/5151
|
|
||||||
[#5150]: https://github.com/nymtech/nym/pull/5150
|
|
||||||
[#5149]: https://github.com/nymtech/nym/pull/5149
|
|
||||||
[#5148]: https://github.com/nymtech/nym/pull/5148
|
|
||||||
[#5147]: https://github.com/nymtech/nym/pull/5147
|
|
||||||
[#5144]: https://github.com/nymtech/nym/pull/5144
|
|
||||||
[#5135]: https://github.com/nymtech/nym/pull/5135
|
|
||||||
[#5134]: https://github.com/nymtech/nym/pull/5134
|
|
||||||
[#5133]: https://github.com/nymtech/nym/pull/5133
|
|
||||||
[#5132]: https://github.com/nymtech/nym/pull/5132
|
|
||||||
[#5128]: https://github.com/nymtech/nym/pull/5128
|
|
||||||
[#5127]: https://github.com/nymtech/nym/pull/5127
|
|
||||||
[#5126]: https://github.com/nymtech/nym/pull/5126
|
|
||||||
[#5121]: https://github.com/nymtech/nym/pull/5121
|
|
||||||
[#5120]: https://github.com/nymtech/nym/pull/5120
|
|
||||||
[#5119]: https://github.com/nymtech/nym/pull/5119
|
|
||||||
[#5118]: https://github.com/nymtech/nym/pull/5118
|
|
||||||
[#5117]: https://github.com/nymtech/nym/pull/5117
|
|
||||||
[#5115]: https://github.com/nymtech/nym/pull/5115
|
|
||||||
[#5113]: https://github.com/nymtech/nym/pull/5113
|
|
||||||
[#5112]: https://github.com/nymtech/nym/pull/5112
|
|
||||||
[#5111]: https://github.com/nymtech/nym/pull/5111
|
|
||||||
[#5109]: https://github.com/nymtech/nym/pull/5109
|
|
||||||
[#5108]: https://github.com/nymtech/nym/pull/5108
|
|
||||||
[#5107]: https://github.com/nymtech/nym/pull/5107
|
|
||||||
[#5104]: https://github.com/nymtech/nym/pull/5104
|
|
||||||
[#5084]: https://github.com/nymtech/nym/pull/5084
|
|
||||||
[#5080]: https://github.com/nymtech/nym/pull/5080
|
|
||||||
[#5059]: https://github.com/nymtech/nym/pull/5059
|
|
||||||
[#5050]: https://github.com/nymtech/nym/pull/5050
|
|
||||||
[#5044]: https://github.com/nymtech/nym/pull/5044
|
|
||||||
[#5027]: https://github.com/nymtech/nym/pull/5027
|
|
||||||
[#5022]: https://github.com/nymtech/nym/pull/5022
|
|
||||||
[#5011]: https://github.com/nymtech/nym/pull/5011
|
|
||||||
[#4952]: https://github.com/nymtech/nym/pull/4952
|
|
||||||
[#4919]: https://github.com/nymtech/nym/pull/4919
|
|
||||||
[#4913]: https://github.com/nymtech/nym/pull/4913
|
|
||||||
[#4876]: https://github.com/nymtech/nym/pull/4876
|
|
||||||
[#4790]: https://github.com/nymtech/nym/pull/4790
|
|
||||||
[#4768]: https://github.com/nymtech/nym/pull/4768
|
|
||||||
|
|
||||||
## [2024.13-magura-drift] (2024-11-29)
|
|
||||||
|
|
||||||
- Optimised syncing bandwidth information to storage
|
|
||||||
|
|
||||||
## [2024.13-magura-patched] (2024-11-22)
|
|
||||||
|
|
||||||
- [experimental] allow clients to change between deterministic route selection based on packet headers and a pseudorandom distribution
|
|
||||||
- Introduced a configurable limit on retransmission frequency of packets if ACKs are not received
|
|
||||||
- Filtered out invalid IP addresses on nym-api
|
|
||||||
|
|
||||||
## [2024.13-magura] (2024-11-18)
|
|
||||||
|
|
||||||
- Limit race probability ([#5145])
|
|
||||||
- bugifx: assign 'node_id' when converting from 'GatewayDetails' to 'TestNode' ([#5143])
|
|
||||||
- bugfix: make sure to assign correct node_id and identity during 'gateway_details' table migration ([#5142])
|
|
||||||
- Respond to auth messages with same version ([#5140])
|
|
||||||
- Pain/polyfill deprecated endpoints ([#5131])
|
|
||||||
- change: dont select mixnodes bonded with vested tokens into the rewarded set ([#5129])
|
|
||||||
- nym-credential-proxy-requests: reqwest use rustls-tls ([#5116])
|
|
||||||
- bugfix: preserve as much as possible of the rewarded set during migration ([#5103])
|
|
||||||
- Feature/force refresh node ([#5101])
|
|
||||||
- Add NYM_VPN_API to env files ([#5099])
|
|
||||||
- bugfix: fixed historical uptimes for nodes ([#5097])
|
|
||||||
- Remove old use of 1GB constant ([#5096])
|
|
||||||
- Graceful agent 1.1.5 ([#5093])
|
|
||||||
- Add more translations from v2 to v3 authenticator ([#5091])
|
|
||||||
- Nym node - Fix claim delegator rewards ([#5090])
|
|
||||||
- Make 250 GB/30 days for free ride mode ([#5083])
|
|
||||||
- Don't increase bandwidth two times ([#5081])
|
|
||||||
- Fix expiration date as today + 7 days ([#5076])
|
|
||||||
- Fix gateway decreasing bandwidth ([#5075])
|
|
||||||
- Allow custom http port to be reset ([#5073])
|
|
||||||
- bugfix: additional checks inside credential proxy ([#5072])
|
|
||||||
- chore: deprecated old nym-api client methods and replaced them when possible ([#5069])
|
|
||||||
- NS API with directory v2 (#5058) ([#5068])
|
|
||||||
- bugfix: credential-proxy obtain-async ([#5067])
|
|
||||||
- Allow nym node config updates ([#5066])
|
|
||||||
- bugfix: use corrext axum extractors for ecash route arguments ([#5065])
|
|
||||||
- Merge2/release/2024.13 magura ([#5063])
|
|
||||||
- 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: adjust runtime storage migration ([#5047])
|
|
||||||
- bugfix: supersede 'cb13be27f8f61d9ae74d924e85d2e6787895eb14' by using… ([#5046])
|
|
||||||
- bugfix: restore default http port for nym-api ([#5045])
|
|
||||||
- bugfix: fix ecash handlers routes ([#5043])
|
|
||||||
- bugfix: don't assign exit gateways to standby set ([#5041])
|
|
||||||
- bugfix: make sure nym-nodes are also tested by network monitor ([#5040])
|
|
||||||
- bugfix: use bonded nym-nodes for determining initial network monitor … ([#5039])
|
|
||||||
- bugfix: make gateways insert themselves into [local] topology ([#5038])
|
|
||||||
- Pass poisson flag ([#5037])
|
|
||||||
- bugfix: use human readable roles for annotations ([#5036])
|
|
||||||
- bugfix: use old name for 'epoch_role' in SkimmedNode ([#5034])
|
|
||||||
- bugfix: make sure to use correct highest node id when assigning role ([#5032])
|
|
||||||
- feature: use axum_client_ip for attempting to extract source ip ([#5031])
|
|
||||||
- bugfix: fixed backwards incompatibility for /gateways/described endpoint ([#5030])
|
|
||||||
- bugfix: verifying signed information of legacy nodes ([#5029])
|
|
||||||
- bugfix: introduce 'LegacyPendingMixNodeChanges' that does not contain 'cost_params_change' ([#5028])
|
|
||||||
- bugfix: missing #[serde(default)] for announce port ([#5024])
|
|
||||||
- bugfix: directory v2.1 `get_all_avg_gateway_reliability_in_interval` query ([#5023])
|
|
||||||
- added 'get_all_described_nodes' to NymApiClient and adjusted return t… ([#5016])
|
|
||||||
- Reapply fixes to new branch ([#5014])
|
|
||||||
- Consume only positive bandwidth ([#5013])
|
|
||||||
- feature: adjusted ticket sizes to the agreed amounts ([#5009])
|
|
||||||
- Push private ip before inserting ([#5008])
|
|
||||||
- chore: update itertools in compact ecash ([#4994])
|
|
||||||
- feature: make accepting t&c a hard requirement for rewarded set selection ([#4993])
|
|
||||||
- Fix rustfmt in nym-credential-proxy ([#4992])
|
|
||||||
- bugfix: client memory leak ([#4991])
|
|
||||||
- Eliminate 0 bandwidth race check ([#4988])
|
|
||||||
- [DOCs;/operators]: Release notes for v2024.12 aero ([#4984])
|
|
||||||
- Add topup req constructor ([#4983])
|
|
||||||
- Fix critical issues SI86 and SI87 from Cure53 ([#4982])
|
|
||||||
- Rename nym-vpn-api to nym-credential-proxy ([#4981])
|
|
||||||
- enable global ecash routes even if api is not a signer ([#4980])
|
|
||||||
- resolve beta clippy issues in contracts ([#4978])
|
|
||||||
- Re-enable vested delegation migration ([#4977])
|
|
||||||
- feature: require reporting using nym-node binary for rewarded set selection ([#4976])
|
|
||||||
- Top up bandwidth ([#4975])
|
|
||||||
- [Product Data] Add session type based on ecash ticket received ([#4974])
|
|
||||||
- Bugfix/additional directory fixes ([#4973])
|
|
||||||
- feat: add Dockerfile for nym node ([#4972])
|
|
||||||
- chore: remove unused rocket code ([#4968])
|
|
||||||
- Import nym-vpn-api crates ([#4967])
|
|
||||||
- feature: importer-cli to correctly handle mixnet/vesting import ([#4966])
|
|
||||||
- bugfix: fix expected return type on /v1/gateways endpoint ([#4965])
|
|
||||||
- [Product Data] First step in gateway usage data collection ([#4963])
|
|
||||||
- Bump sqlx to 0.7.4 ([#4959])
|
|
||||||
- Add env feature to clap and make clap parameters available as env variables ([#4957])
|
|
||||||
- Feature/contract state tools ([#4954])
|
|
||||||
- expose authenticator address along other address in node-details ([#4953])
|
|
||||||
- Extract packet processing from mixnode-common ([#4949])
|
|
||||||
- nym-api container ([#4948])
|
|
||||||
- Ticket type storage ([#4947])
|
|
||||||
- Add "utoipa" feature to nym-node ([#4945])
|
|
||||||
- build(deps): bump the patch-updates group across 1 directory with 9 updates ([#4944])
|
|
||||||
- V2 performance monitoring feature flag ([#4943])
|
|
||||||
- Bugfix/rewarder post pruning adjustments ([#4942])
|
|
||||||
- Switch over the last set of jobs to arc runners ([#4938])
|
|
||||||
- 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])
|
|
||||||
- Migrate Legacy Node (Frontend) ([#4826])
|
|
||||||
- Fix critical issues SI84 and SI85 from Cure53 ([#4758])
|
|
||||||
|
|
||||||
[#5145]: https://github.com/nymtech/nym/pull/5145
|
|
||||||
[#5143]: https://github.com/nymtech/nym/pull/5143
|
|
||||||
[#5142]: https://github.com/nymtech/nym/pull/5142
|
|
||||||
[#5140]: https://github.com/nymtech/nym/pull/5140
|
|
||||||
[#5131]: https://github.com/nymtech/nym/pull/5131
|
|
||||||
[#5129]: https://github.com/nymtech/nym/pull/5129
|
|
||||||
[#5116]: https://github.com/nymtech/nym/pull/5116
|
|
||||||
[#5103]: https://github.com/nymtech/nym/pull/5103
|
|
||||||
[#5101]: https://github.com/nymtech/nym/pull/5101
|
|
||||||
[#5099]: https://github.com/nymtech/nym/pull/5099
|
|
||||||
[#5097]: https://github.com/nymtech/nym/pull/5097
|
|
||||||
[#5096]: https://github.com/nymtech/nym/pull/5096
|
|
||||||
[#5093]: https://github.com/nymtech/nym/pull/5093
|
|
||||||
[#5091]: https://github.com/nymtech/nym/pull/5091
|
|
||||||
[#5090]: https://github.com/nymtech/nym/pull/5090
|
|
||||||
[#5083]: https://github.com/nymtech/nym/pull/5083
|
|
||||||
[#5081]: https://github.com/nymtech/nym/pull/5081
|
|
||||||
[#5076]: https://github.com/nymtech/nym/pull/5076
|
|
||||||
[#5075]: https://github.com/nymtech/nym/pull/5075
|
|
||||||
[#5073]: https://github.com/nymtech/nym/pull/5073
|
|
||||||
[#5072]: https://github.com/nymtech/nym/pull/5072
|
|
||||||
[#5069]: https://github.com/nymtech/nym/pull/5069
|
|
||||||
[#5068]: https://github.com/nymtech/nym/pull/5068
|
|
||||||
[#5067]: https://github.com/nymtech/nym/pull/5067
|
|
||||||
[#5066]: https://github.com/nymtech/nym/pull/5066
|
|
||||||
[#5065]: https://github.com/nymtech/nym/pull/5065
|
|
||||||
[#5063]: https://github.com/nymtech/nym/pull/5063
|
|
||||||
[#5062]: https://github.com/nymtech/nym/pull/5062
|
|
||||||
[#5061]: https://github.com/nymtech/nym/pull/5061
|
|
||||||
[#5051]: https://github.com/nymtech/nym/pull/5051
|
|
||||||
[#5049]: https://github.com/nymtech/nym/pull/5049
|
|
||||||
[#5047]: https://github.com/nymtech/nym/pull/5047
|
|
||||||
[#5046]: https://github.com/nymtech/nym/pull/5046
|
|
||||||
[#5045]: https://github.com/nymtech/nym/pull/5045
|
|
||||||
[#5043]: https://github.com/nymtech/nym/pull/5043
|
|
||||||
[#5041]: https://github.com/nymtech/nym/pull/5041
|
|
||||||
[#5040]: https://github.com/nymtech/nym/pull/5040
|
|
||||||
[#5039]: https://github.com/nymtech/nym/pull/5039
|
|
||||||
[#5038]: https://github.com/nymtech/nym/pull/5038
|
|
||||||
[#5037]: https://github.com/nymtech/nym/pull/5037
|
|
||||||
[#5036]: https://github.com/nymtech/nym/pull/5036
|
|
||||||
[#5034]: https://github.com/nymtech/nym/pull/5034
|
|
||||||
[#5032]: https://github.com/nymtech/nym/pull/5032
|
|
||||||
[#5031]: https://github.com/nymtech/nym/pull/5031
|
|
||||||
[#5030]: https://github.com/nymtech/nym/pull/5030
|
|
||||||
[#5029]: https://github.com/nymtech/nym/pull/5029
|
|
||||||
[#5028]: https://github.com/nymtech/nym/pull/5028
|
|
||||||
[#5024]: https://github.com/nymtech/nym/pull/5024
|
|
||||||
[#5023]: https://github.com/nymtech/nym/pull/5023
|
|
||||||
[#5016]: https://github.com/nymtech/nym/pull/5016
|
|
||||||
[#5014]: https://github.com/nymtech/nym/pull/5014
|
|
||||||
[#5013]: https://github.com/nymtech/nym/pull/5013
|
|
||||||
[#5009]: https://github.com/nymtech/nym/pull/5009
|
|
||||||
[#5008]: https://github.com/nymtech/nym/pull/5008
|
|
||||||
[#4994]: https://github.com/nymtech/nym/pull/4994
|
|
||||||
[#4993]: https://github.com/nymtech/nym/pull/4993
|
|
||||||
[#4992]: https://github.com/nymtech/nym/pull/4992
|
|
||||||
[#4991]: https://github.com/nymtech/nym/pull/4991
|
|
||||||
[#4988]: https://github.com/nymtech/nym/pull/4988
|
|
||||||
[#4984]: https://github.com/nymtech/nym/pull/4984
|
|
||||||
[#4983]: https://github.com/nymtech/nym/pull/4983
|
|
||||||
[#4982]: https://github.com/nymtech/nym/pull/4982
|
|
||||||
[#4981]: https://github.com/nymtech/nym/pull/4981
|
|
||||||
[#4980]: https://github.com/nymtech/nym/pull/4980
|
|
||||||
[#4978]: https://github.com/nymtech/nym/pull/4978
|
|
||||||
[#4977]: https://github.com/nymtech/nym/pull/4977
|
|
||||||
[#4976]: https://github.com/nymtech/nym/pull/4976
|
|
||||||
[#4975]: https://github.com/nymtech/nym/pull/4975
|
|
||||||
[#4974]: https://github.com/nymtech/nym/pull/4974
|
|
||||||
[#4973]: https://github.com/nymtech/nym/pull/4973
|
|
||||||
[#4972]: https://github.com/nymtech/nym/pull/4972
|
|
||||||
[#4968]: https://github.com/nymtech/nym/pull/4968
|
|
||||||
[#4967]: https://github.com/nymtech/nym/pull/4967
|
|
||||||
[#4966]: https://github.com/nymtech/nym/pull/4966
|
|
||||||
[#4965]: https://github.com/nymtech/nym/pull/4965
|
|
||||||
[#4963]: https://github.com/nymtech/nym/pull/4963
|
|
||||||
[#4959]: https://github.com/nymtech/nym/pull/4959
|
|
||||||
[#4957]: https://github.com/nymtech/nym/pull/4957
|
|
||||||
[#4954]: https://github.com/nymtech/nym/pull/4954
|
|
||||||
[#4953]: https://github.com/nymtech/nym/pull/4953
|
|
||||||
[#4949]: https://github.com/nymtech/nym/pull/4949
|
|
||||||
[#4948]: https://github.com/nymtech/nym/pull/4948
|
|
||||||
[#4947]: https://github.com/nymtech/nym/pull/4947
|
|
||||||
[#4945]: https://github.com/nymtech/nym/pull/4945
|
|
||||||
[#4944]: https://github.com/nymtech/nym/pull/4944
|
|
||||||
[#4943]: https://github.com/nymtech/nym/pull/4943
|
|
||||||
[#4942]: https://github.com/nymtech/nym/pull/4942
|
|
||||||
[#4938]: https://github.com/nymtech/nym/pull/4938
|
|
||||||
[#4937]: https://github.com/nymtech/nym/pull/4937
|
|
||||||
[#4936]: https://github.com/nymtech/nym/pull/4936
|
|
||||||
[#4929]: https://github.com/nymtech/nym/pull/4929
|
|
||||||
[#4903]: https://github.com/nymtech/nym/pull/4903
|
|
||||||
[#4826]: https://github.com/nymtech/nym/pull/4826
|
|
||||||
[#4758]: https://github.com/nymtech/nym/pull/4758
|
|
||||||
|
|
||||||
## [2024.12-aero] (2024-10-17)
|
|
||||||
|
|
||||||
- nym-node: don't use bloomfilters for double spending checks ([#4960])
|
|
||||||
- bugfix: replace unreachable macro with an error return ([#4958])
|
|
||||||
- [DOCs:/operators]: Update FAQ sphinx size ([#4946])
|
|
||||||
- [DOCs/operators]: Release notes v2024.11-wedel ([#4939])
|
|
||||||
- Fix handle drop ([#4934])
|
|
||||||
- Assume offline mode ([#4926])
|
|
||||||
- Make ip-packet-request VERSION pub ([#4925])
|
|
||||||
- Expose error type ([#4924])
|
|
||||||
- Fix argument to cargo-deny action ([#4922])
|
|
||||||
- Fix nymvpn.com url in mainnet defaults ([#4920])
|
|
||||||
- Check both version and type in message header ([#4918])
|
|
||||||
- Bump http-api-client default timeout to 30 sec ([#4917])
|
|
||||||
- Max/proxy ffi ([#4906])
|
|
||||||
- Data Observatory stub ([#4905])
|
|
||||||
- Fix missing duplication of modified tables ([#4904])
|
|
||||||
- Update cargo deny ([#4901])
|
|
||||||
- docs: add hostname instructions for wss ([#4900])
|
|
||||||
- build(deps): bump the patch-updates group across 1 directory with 9 updates ([#4898])
|
|
||||||
- Fix clippy for beta toolchain ([#4897])
|
|
||||||
- Remove clippy github PR annotations ([#4896])
|
|
||||||
- Fix apt install in ci-build-upload-binaries.yml ([#4894])
|
|
||||||
- Update network monitor entrypoint ([#4893])
|
|
||||||
- Update nym-vpn metapackage and replace nymvpn-x with nym-vpn-app ([#4889])
|
|
||||||
- Entry wireguard tickets ([#4888])
|
|
||||||
- Build and Push CI ([#4887])
|
|
||||||
- Feature/updated gateway registration ([#4885])
|
|
||||||
- Few fixes to NNM pre deploy ([#4883])
|
|
||||||
- Fix sql serde with enum ([#4875])
|
|
||||||
- allow clients to send stateless gateway requests without prior registration ([#4873])
|
|
||||||
- chore: remove queued migration for adding explicit admin ([#4871])
|
|
||||||
- Gateway database modifications for different modes ([#4868])
|
|
||||||
- build(deps): bump strum from 0.25.0 to 0.26.3 ([#4848])
|
|
||||||
- Use serde from workspace ([#4833])
|
|
||||||
- build(deps): bump toml from 0.5.11 to 0.8.14 ([#4805])
|
|
||||||
- Max/rust sdk stream abstraction ([#4743])
|
|
||||||
|
|
||||||
[#4960]: https://github.com/nymtech/nym/pull/4960
|
|
||||||
[#4958]: https://github.com/nymtech/nym/pull/4958
|
|
||||||
[#4946]: https://github.com/nymtech/nym/pull/4946
|
|
||||||
[#4939]: https://github.com/nymtech/nym/pull/4939
|
|
||||||
[#4934]: https://github.com/nymtech/nym/pull/4934
|
|
||||||
[#4926]: https://github.com/nymtech/nym/pull/4926
|
|
||||||
[#4925]: https://github.com/nymtech/nym/pull/4925
|
|
||||||
[#4924]: https://github.com/nymtech/nym/pull/4924
|
|
||||||
[#4922]: https://github.com/nymtech/nym/pull/4922
|
|
||||||
[#4920]: https://github.com/nymtech/nym/pull/4920
|
|
||||||
[#4918]: https://github.com/nymtech/nym/pull/4918
|
|
||||||
[#4917]: https://github.com/nymtech/nym/pull/4917
|
|
||||||
[#4906]: https://github.com/nymtech/nym/pull/4906
|
|
||||||
[#4905]: https://github.com/nymtech/nym/pull/4905
|
|
||||||
[#4904]: https://github.com/nymtech/nym/pull/4904
|
|
||||||
[#4901]: https://github.com/nymtech/nym/pull/4901
|
|
||||||
[#4900]: https://github.com/nymtech/nym/pull/4900
|
|
||||||
[#4898]: https://github.com/nymtech/nym/pull/4898
|
|
||||||
[#4897]: https://github.com/nymtech/nym/pull/4897
|
|
||||||
[#4896]: https://github.com/nymtech/nym/pull/4896
|
|
||||||
[#4894]: https://github.com/nymtech/nym/pull/4894
|
|
||||||
[#4893]: https://github.com/nymtech/nym/pull/4893
|
|
||||||
[#4889]: https://github.com/nymtech/nym/pull/4889
|
|
||||||
[#4888]: https://github.com/nymtech/nym/pull/4888
|
|
||||||
[#4887]: https://github.com/nymtech/nym/pull/4887
|
|
||||||
[#4885]: https://github.com/nymtech/nym/pull/4885
|
|
||||||
[#4883]: https://github.com/nymtech/nym/pull/4883
|
|
||||||
[#4875]: https://github.com/nymtech/nym/pull/4875
|
|
||||||
[#4873]: https://github.com/nymtech/nym/pull/4873
|
|
||||||
[#4871]: https://github.com/nymtech/nym/pull/4871
|
|
||||||
[#4868]: https://github.com/nymtech/nym/pull/4868
|
|
||||||
[#4848]: https://github.com/nymtech/nym/pull/4848
|
|
||||||
[#4833]: https://github.com/nymtech/nym/pull/4833
|
|
||||||
[#4805]: https://github.com/nymtech/nym/pull/4805
|
|
||||||
[#4743]: https://github.com/nymtech/nym/pull/4743
|
|
||||||
|
|
||||||
## [2024.11-wedel] (2024-09-23)
|
|
||||||
|
|
||||||
- Backport #4894 to fix ci ([#4899])
|
|
||||||
- Bugfix/ticketbook false double spending ([#4892])
|
|
||||||
- fix: allow updating globally stored signatures ([#4891])
|
|
||||||
- [DOCs/operators]: Document changelog for patch/2024.10-caramello ([#4886])
|
|
||||||
- [DOCs/operators]: Post release docs updates ([#4874])
|
|
||||||
- Bump defguard to github latest version ([#4872])
|
|
||||||
- chore: removed completed queued mixnet migration ([#4865])
|
|
||||||
- Disable push trigger and add missing paths in ci-build ([#4864])
|
|
||||||
- Fix linux conditional in ci-build.yml ([#4863])
|
|
||||||
- Remove golang workaround in ci-sdk-wasm ([#4858])
|
|
||||||
- Revert runner for ci-docs ([#4855])
|
|
||||||
- Move credential verification into common crate ([#4853])
|
|
||||||
- Fix test failure in ipr request size ([#4844])
|
|
||||||
- Start switching over jobs to arc-ubuntu-20.04 ([#4843])
|
|
||||||
- Use ecash credential type for bandwidth value ([#4840])
|
|
||||||
- Create nym-repo-setup debian package and nym-vpn meta package ([#4837])
|
|
||||||
- Remove serde_crate named import ([#4832])
|
|
||||||
- Run cargo autoinherit following last weeks dependabot updates ([#4831])
|
|
||||||
- revamped ticketbook serialisation and exposed additional cli methods ([#4827])
|
|
||||||
- Expose wireguard details on self described endpoint ([#4825])
|
|
||||||
- Remove unused wireguard flag from SDK ([#4823])
|
|
||||||
- Add `axum` server to `nym-api` ([#4803])
|
|
||||||
- Run cargo-autoinherit for a few new crates ([#4801])
|
|
||||||
- Update dependabot ([#4796])
|
|
||||||
- Fix clippy for unwrap_or_default ([#4783])
|
|
||||||
- Enable dependabot version upgrades for root rust workspace ([#4778])
|
|
||||||
- Persist used wireguard private IPs ([#4771])
|
|
||||||
- Avoid race on ip and registration structures ([#4766])
|
|
||||||
- docs/hotfix ([#4765])
|
|
||||||
- chore: remove repetitive words ([#4763])
|
|
||||||
- Make gateway latency check generic ([#4759])
|
|
||||||
- Remove duplicate stat count for retransmissions ([#4756])
|
|
||||||
- Update peer refresh value ([#4754])
|
|
||||||
- Remove deprecated mark_as_success and use new disarm ([#4751])
|
|
||||||
- Add get_mixnodes_described to validator_client ([#4725])
|
|
||||||
- New Network Monitor ([#4610])
|
|
||||||
|
|
||||||
[#4899]: https://github.com/nymtech/nym/pull/4899
|
|
||||||
[#4892]: https://github.com/nymtech/nym/pull/4892
|
|
||||||
[#4891]: https://github.com/nymtech/nym/pull/4891
|
|
||||||
[#4886]: https://github.com/nymtech/nym/pull/4886
|
|
||||||
[#4874]: https://github.com/nymtech/nym/pull/4874
|
|
||||||
[#4872]: https://github.com/nymtech/nym/pull/4872
|
|
||||||
[#4865]: https://github.com/nymtech/nym/pull/4865
|
|
||||||
[#4864]: https://github.com/nymtech/nym/pull/4864
|
|
||||||
[#4863]: https://github.com/nymtech/nym/pull/4863
|
|
||||||
[#4858]: https://github.com/nymtech/nym/pull/4858
|
|
||||||
[#4855]: https://github.com/nymtech/nym/pull/4855
|
|
||||||
[#4853]: https://github.com/nymtech/nym/pull/4853
|
|
||||||
[#4844]: https://github.com/nymtech/nym/pull/4844
|
|
||||||
[#4843]: https://github.com/nymtech/nym/pull/4843
|
|
||||||
[#4840]: https://github.com/nymtech/nym/pull/4840
|
|
||||||
[#4837]: https://github.com/nymtech/nym/pull/4837
|
|
||||||
[#4832]: https://github.com/nymtech/nym/pull/4832
|
|
||||||
[#4831]: https://github.com/nymtech/nym/pull/4831
|
|
||||||
[#4827]: https://github.com/nymtech/nym/pull/4827
|
|
||||||
[#4825]: https://github.com/nymtech/nym/pull/4825
|
|
||||||
[#4823]: https://github.com/nymtech/nym/pull/4823
|
|
||||||
[#4803]: https://github.com/nymtech/nym/pull/4803
|
|
||||||
[#4801]: https://github.com/nymtech/nym/pull/4801
|
|
||||||
[#4796]: https://github.com/nymtech/nym/pull/4796
|
|
||||||
[#4783]: https://github.com/nymtech/nym/pull/4783
|
|
||||||
[#4778]: https://github.com/nymtech/nym/pull/4778
|
|
||||||
[#4771]: https://github.com/nymtech/nym/pull/4771
|
|
||||||
[#4766]: https://github.com/nymtech/nym/pull/4766
|
|
||||||
[#4765]: https://github.com/nymtech/nym/pull/4765
|
|
||||||
[#4763]: https://github.com/nymtech/nym/pull/4763
|
|
||||||
[#4759]: https://github.com/nymtech/nym/pull/4759
|
|
||||||
[#4756]: https://github.com/nymtech/nym/pull/4756
|
|
||||||
[#4754]: https://github.com/nymtech/nym/pull/4754
|
|
||||||
[#4751]: https://github.com/nymtech/nym/pull/4751
|
|
||||||
[#4725]: https://github.com/nymtech/nym/pull/4725
|
|
||||||
[#4610]: https://github.com/nymtech/nym/pull/4610
|
|
||||||
|
|
||||||
## [2024.10-caramello] (2024-09-10)
|
|
||||||
|
|
||||||
- Backport 4844 and 4845 ([#4857])
|
|
||||||
- Bugfix/client registration vol2 ([#4856])
|
|
||||||
- Remove wireguard feature flag and pass runtime enabled flag ([#4839])
|
|
||||||
- Eliminate cancel unsafe sig awaiting ([#4834])
|
|
||||||
- added explicit updateable admin to the mixnet contract ([#4822])
|
|
||||||
- using legacy signing payload in CLI and verifying both variants in contract ([#4821])
|
|
||||||
- adding ecash contract address ([#4819])
|
|
||||||
- Check profit margin of node before defaulting to hardcoded value ([#4802])
|
|
||||||
- Sync last_seen_bandwidth immediately ([#4774])
|
|
||||||
- Feature/additional ecash nym cli utils ([#4773])
|
|
||||||
- Better storage error logging ([#4772])
|
|
||||||
- bugfix: make sure DKG parses data out of events if logs are empty ([#4764])
|
|
||||||
- Fix clippy on rustc beta toolchain ([#4746])
|
|
||||||
- Fix clippy for beta toolchain ([#4742])
|
|
||||||
- Disable testnet-manager on non-unix ([#4741])
|
|
||||||
- Don't set NYM_VPN_API to default ([#4740])
|
|
||||||
- Update publish-nym-binaries.yml ([#4739])
|
|
||||||
- Update ci-build-upload-binaries.yml ([#4738])
|
|
||||||
- Add NYM_VPN_API to network config ([#4736])
|
|
||||||
- Re-export RecipientFormattingError in nym sdk ([#4735])
|
|
||||||
- Persist wireguard peers ([#4732])
|
|
||||||
- Fix tokio error in 1.39 ([#4730])
|
|
||||||
- Feature/vesting purge plus ranged cost params ([#4716])
|
|
||||||
- Fix (some) feature unification build failures ([#4681])
|
|
||||||
- Feature Compact Ecash : The One PR ([#4623])
|
|
||||||
|
|
||||||
[#4857]: https://github.com/nymtech/nym/pull/4857
|
|
||||||
[#4856]: https://github.com/nymtech/nym/pull/4856
|
|
||||||
[#4839]: https://github.com/nymtech/nym/pull/4839
|
|
||||||
[#4834]: https://github.com/nymtech/nym/pull/4834
|
|
||||||
[#4822]: https://github.com/nymtech/nym/pull/4822
|
|
||||||
[#4821]: https://github.com/nymtech/nym/pull/4821
|
|
||||||
[#4819]: https://github.com/nymtech/nym/pull/4819
|
|
||||||
[#4802]: https://github.com/nymtech/nym/pull/4802
|
|
||||||
[#4774]: https://github.com/nymtech/nym/pull/4774
|
|
||||||
[#4773]: https://github.com/nymtech/nym/pull/4773
|
|
||||||
[#4772]: https://github.com/nymtech/nym/pull/4772
|
|
||||||
[#4764]: https://github.com/nymtech/nym/pull/4764
|
|
||||||
[#4746]: https://github.com/nymtech/nym/pull/4746
|
|
||||||
[#4742]: https://github.com/nymtech/nym/pull/4742
|
|
||||||
[#4741]: https://github.com/nymtech/nym/pull/4741
|
|
||||||
[#4740]: https://github.com/nymtech/nym/pull/4740
|
|
||||||
[#4739]: https://github.com/nymtech/nym/pull/4739
|
|
||||||
[#4738]: https://github.com/nymtech/nym/pull/4738
|
|
||||||
[#4736]: https://github.com/nymtech/nym/pull/4736
|
|
||||||
[#4735]: https://github.com/nymtech/nym/pull/4735
|
|
||||||
[#4732]: https://github.com/nymtech/nym/pull/4732
|
|
||||||
[#4730]: https://github.com/nymtech/nym/pull/4730
|
|
||||||
[#4716]: https://github.com/nymtech/nym/pull/4716
|
|
||||||
[#4681]: https://github.com/nymtech/nym/pull/4681
|
|
||||||
[#4623]: https://github.com/nymtech/nym/pull/4623
|
|
||||||
|
|
||||||
## [2024.9-topdeck] (2024-07-26)
|
## [2024.9-topdeck] (2024-07-26)
|
||||||
|
|
||||||
- chore: fix 1.80 lint issues ([#4731])
|
- chore: fix 1.80 lint issues ([#4731])
|
||||||
|
|||||||
Generated
+1956
-3546
File diff suppressed because it is too large
Load Diff
+117
-172
@@ -14,45 +14,45 @@ panic = "abort"
|
|||||||
opt-level = 3
|
opt-level = 3
|
||||||
|
|
||||||
[workspace]
|
[workspace]
|
||||||
|
|
||||||
resolver = "2"
|
resolver = "2"
|
||||||
members = [
|
members = [
|
||||||
"clients/native",
|
"clients/native",
|
||||||
"clients/native/websocket-requests",
|
"clients/native/websocket-requests",
|
||||||
"clients/socks5",
|
"clients/socks5",
|
||||||
"common/async-file-watcher",
|
|
||||||
"common/authenticator-requests",
|
"common/authenticator-requests",
|
||||||
|
"common/async-file-watcher",
|
||||||
"common/bandwidth-controller",
|
"common/bandwidth-controller",
|
||||||
"common/bin-common",
|
"common/bin-common",
|
||||||
"common/client-core",
|
"common/client-core",
|
||||||
"common/client-core/config-types",
|
"common/client-core/config-types",
|
||||||
"common/client-core/gateways-storage",
|
|
||||||
"common/client-core/surb-storage",
|
"common/client-core/surb-storage",
|
||||||
|
"common/client-core/gateways-storage",
|
||||||
"common/client-libs/gateway-client",
|
"common/client-libs/gateway-client",
|
||||||
"common/client-libs/mixnet-client",
|
"common/client-libs/mixnet-client",
|
||||||
"common/client-libs/validator-client",
|
"common/client-libs/validator-client",
|
||||||
"common/commands",
|
"common/commands",
|
||||||
"common/config",
|
"common/config",
|
||||||
"common/cosmwasm-smart-contracts/coconut-bandwidth-contract",
|
"common/cosmwasm-smart-contracts/coconut-bandwidth-contract",
|
||||||
|
"common/cosmwasm-smart-contracts/ecash-contract",
|
||||||
"common/cosmwasm-smart-contracts/coconut-dkg",
|
"common/cosmwasm-smart-contracts/coconut-dkg",
|
||||||
"common/cosmwasm-smart-contracts/contracts-common",
|
"common/cosmwasm-smart-contracts/contracts-common",
|
||||||
"common/cosmwasm-smart-contracts/ecash-contract",
|
|
||||||
"common/cosmwasm-smart-contracts/group-contract",
|
"common/cosmwasm-smart-contracts/group-contract",
|
||||||
"common/cosmwasm-smart-contracts/mixnet-contract",
|
"common/cosmwasm-smart-contracts/mixnet-contract",
|
||||||
"common/cosmwasm-smart-contracts/multisig-contract",
|
"common/cosmwasm-smart-contracts/multisig-contract",
|
||||||
"common/cosmwasm-smart-contracts/vesting-contract",
|
"common/cosmwasm-smart-contracts/vesting-contract",
|
||||||
"common/country-group",
|
"common/country-group",
|
||||||
"common/credential-storage",
|
"common/credential-storage",
|
||||||
"common/credential-utils",
|
|
||||||
"common/credential-verification",
|
|
||||||
"common/credentials",
|
"common/credentials",
|
||||||
|
"common/credential-utils",
|
||||||
"common/credentials-interface",
|
"common/credentials-interface",
|
||||||
"common/crypto",
|
"common/crypto",
|
||||||
"common/dkg",
|
"common/dkg",
|
||||||
|
"common/ecash-double-spending",
|
||||||
"common/ecash-time",
|
"common/ecash-time",
|
||||||
"common/execute",
|
"common/execute",
|
||||||
"common/exit-policy",
|
"common/exit-policy",
|
||||||
"common/gateway-requests",
|
"common/gateway-requests",
|
||||||
"common/gateway-stats-storage",
|
|
||||||
"common/gateway-storage",
|
"common/gateway-storage",
|
||||||
"common/http-api-client",
|
"common/http-api-client",
|
||||||
"common/http-api-common",
|
"common/http-api-common",
|
||||||
@@ -63,9 +63,10 @@ members = [
|
|||||||
"common/network-defaults",
|
"common/network-defaults",
|
||||||
"common/node-tester-utils",
|
"common/node-tester-utils",
|
||||||
"common/nonexhaustive-delayqueue",
|
"common/nonexhaustive-delayqueue",
|
||||||
|
"common/nymcoconut",
|
||||||
|
"common/nym_offline_compact_ecash",
|
||||||
"common/nym-id",
|
"common/nym-id",
|
||||||
"common/nym-metrics",
|
"common/nym-metrics",
|
||||||
"common/nym_offline_compact_ecash",
|
|
||||||
"common/nymsphinx",
|
"common/nymsphinx",
|
||||||
"common/nymsphinx/acknowledgements",
|
"common/nymsphinx/acknowledgements",
|
||||||
"common/nymsphinx/addressing",
|
"common/nymsphinx/addressing",
|
||||||
@@ -80,64 +81,41 @@ members = [
|
|||||||
"common/nyxd-scraper",
|
"common/nyxd-scraper",
|
||||||
"common/pemstore",
|
"common/pemstore",
|
||||||
"common/serde-helpers",
|
"common/serde-helpers",
|
||||||
"common/service-provider-requests-common",
|
|
||||||
"common/socks5-client-core",
|
"common/socks5-client-core",
|
||||||
"common/socks5/proxy-helpers",
|
"common/socks5/proxy-helpers",
|
||||||
"common/socks5/requests",
|
"common/socks5/requests",
|
||||||
"common/statistics",
|
|
||||||
"common/store-cipher",
|
"common/store-cipher",
|
||||||
"common/task",
|
"common/task",
|
||||||
"common/ticketbooks-merkle",
|
|
||||||
"common/topology",
|
"common/topology",
|
||||||
"common/tun",
|
"common/tun",
|
||||||
"common/types",
|
"common/types",
|
||||||
"common/verloc",
|
|
||||||
"common/wasm/client-core",
|
"common/wasm/client-core",
|
||||||
"common/wasm/storage",
|
"common/wasm/storage",
|
||||||
"common/wasm/utils",
|
"common/wasm/utils",
|
||||||
"common/wireguard",
|
"common/wireguard",
|
||||||
"common/wireguard-types",
|
"common/wireguard-types",
|
||||||
"documentation/autodoc",
|
|
||||||
"explorer-api",
|
"explorer-api",
|
||||||
"explorer-api/explorer-api-requests",
|
"explorer-api/explorer-api-requests",
|
||||||
"explorer-api/explorer-client",
|
"explorer-api/explorer-client",
|
||||||
"gateway",
|
"gateway",
|
||||||
"integrations/bity",
|
"integrations/bity",
|
||||||
"nym-api",
|
"mixnode",
|
||||||
"nym-api/nym-api-requests",
|
"sdk/lib/socks5-listener",
|
||||||
"nym-browser-extension/storage",
|
|
||||||
"nym-credential-proxy/nym-credential-proxy",
|
|
||||||
"nym-credential-proxy/nym-credential-proxy-requests",
|
|
||||||
"nym-credential-proxy/vpn-api-lib-wasm",
|
|
||||||
"nym-network-monitor",
|
|
||||||
"nym-node",
|
|
||||||
"nym-node-status-api/nym-node-status-agent",
|
|
||||||
"nym-node-status-api/nym-node-status-api",
|
|
||||||
"nym-node-status-api/nym-node-status-client",
|
|
||||||
"nym-node/nym-node-metrics",
|
|
||||||
"nym-node/nym-node-requests",
|
|
||||||
"nym-outfox",
|
|
||||||
"nym-validator-rewarder",
|
|
||||||
"nyx-chain-watcher",
|
|
||||||
"sdk/ffi/cpp",
|
|
||||||
"sdk/ffi/go",
|
|
||||||
"sdk/ffi/shared",
|
|
||||||
"sdk/rust/nym-sdk",
|
"sdk/rust/nym-sdk",
|
||||||
"service-providers/authenticator",
|
"service-providers/authenticator",
|
||||||
"service-providers/common",
|
"service-providers/common",
|
||||||
"service-providers/ip-packet-router",
|
"service-providers/ip-packet-router",
|
||||||
"service-providers/network-requester",
|
"service-providers/network-requester",
|
||||||
"tools/echo-server",
|
"nym-api",
|
||||||
"tools/echo-server",
|
"nym-browser-extension/storage",
|
||||||
"tools/internal/contract-state-importer/importer-cli",
|
"nym-api/nym-api-requests",
|
||||||
"tools/internal/contract-state-importer/importer-contract",
|
"nym-node",
|
||||||
"tools/internal/mixnet-connectivity-check",
|
"nym-node/nym-node-http-api",
|
||||||
# "tools/internal/sdk-version-bump",
|
"nym-node/nym-node-requests",
|
||||||
|
"nym-outfox",
|
||||||
|
"nym-validator-rewarder",
|
||||||
"tools/internal/ssl-inject",
|
"tools/internal/ssl-inject",
|
||||||
"tools/internal/testnet-manager",
|
# "tools/internal/sdk-version-bump",
|
||||||
"tools/internal/testnet-manager",
|
|
||||||
"tools/internal/testnet-manager/dkg-bypass-contract",
|
|
||||||
"tools/internal/testnet-manager/dkg-bypass-contract",
|
|
||||||
"tools/nym-cli",
|
"tools/nym-cli",
|
||||||
"tools/nym-id-cli",
|
"tools/nym-id-cli",
|
||||||
"tools/nym-nr-query",
|
"tools/nym-nr-query",
|
||||||
@@ -148,30 +126,30 @@ members = [
|
|||||||
"wasm/mix-fetch",
|
"wasm/mix-fetch",
|
||||||
"wasm/node-tester",
|
"wasm/node-tester",
|
||||||
"wasm/zknym-lib",
|
"wasm/zknym-lib",
|
||||||
|
"tools/internal/testnet-manager",
|
||||||
|
"tools/internal/testnet-manager/dkg-bypass-contract",
|
||||||
]
|
]
|
||||||
|
|
||||||
default-members = [
|
default-members = [
|
||||||
"clients/native",
|
"clients/native",
|
||||||
"clients/socks5",
|
"clients/socks5",
|
||||||
"explorer-api",
|
"gateway",
|
||||||
"nym-api",
|
|
||||||
"nym-credential-proxy/nym-credential-proxy",
|
|
||||||
"nym-node",
|
|
||||||
"nym-node-status-api/nym-node-status-agent",
|
|
||||||
"nym-node-status-api/nym-node-status-api",
|
|
||||||
"nym-validator-rewarder",
|
|
||||||
"nyx-chain-watcher",
|
|
||||||
"service-providers/authenticator",
|
|
||||||
"service-providers/ip-packet-router",
|
|
||||||
"service-providers/network-requester",
|
"service-providers/network-requester",
|
||||||
|
"mixnode",
|
||||||
|
"nym-api",
|
||||||
"tools/nymvisor",
|
"tools/nymvisor",
|
||||||
|
"explorer-api",
|
||||||
|
"nym-validator-rewarder",
|
||||||
|
"nym-node",
|
||||||
]
|
]
|
||||||
|
|
||||||
exclude = [
|
exclude = [
|
||||||
"explorer",
|
"explorer",
|
||||||
"contracts",
|
"contracts",
|
||||||
"nym-wallet",
|
"nym-wallet",
|
||||||
|
"nym-vpn/ui/src-tauri",
|
||||||
"cpu-cycles",
|
"cpu-cycles",
|
||||||
|
"sdk/ffi/cpp",
|
||||||
]
|
]
|
||||||
|
|
||||||
[workspace.package]
|
[workspace.package]
|
||||||
@@ -181,185 +159,158 @@ homepage = "https://nymtech.net"
|
|||||||
documentation = "https://nymtech.net"
|
documentation = "https://nymtech.net"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
license = "Apache-2.0"
|
license = "Apache-2.0"
|
||||||
rust-version = "1.80"
|
|
||||||
readme = "README.md"
|
|
||||||
|
|
||||||
[workspace.dependencies]
|
[workspace.dependencies]
|
||||||
addr = "0.15.6"
|
addr = "0.15.6"
|
||||||
aead = "0.5.2"
|
|
||||||
aes = "0.8.1"
|
aes = "0.8.1"
|
||||||
aes-gcm = "0.10.1"
|
aes-gcm = "0.10.1"
|
||||||
aes-gcm-siv = "0.11.1"
|
anyhow = "1.0.71"
|
||||||
ammonia = "4"
|
|
||||||
anyhow = "1.0.97"
|
|
||||||
arc-swap = "1.7.1"
|
|
||||||
argon2 = "0.5.0"
|
argon2 = "0.5.0"
|
||||||
async-trait = "0.1.87"
|
async-trait = "0.1.68"
|
||||||
axum = "0.7.5"
|
axum = "0.7.5"
|
||||||
axum-client-ip = "0.6.1"
|
axum-extra = "0.9.3"
|
||||||
axum-extra = "0.9.4"
|
base64 = "0.21.4"
|
||||||
axum-test = "16.2.0"
|
|
||||||
base64 = "0.22.1"
|
|
||||||
base85rs = "0.1.3"
|
|
||||||
bincode = "1.3.3"
|
bincode = "1.3.3"
|
||||||
bip39 = { version = "2.0.0", features = ["zeroize"] }
|
bip39 = { version = "2.0.0", features = ["zeroize"] }
|
||||||
bit-vec = "0.7.0" # can we unify those?
|
|
||||||
|
# can we unify those?
|
||||||
|
bit-vec = "0.7.0"
|
||||||
bitvec = "1.0.0"
|
bitvec = "1.0.0"
|
||||||
blake3 = "1.6.1"
|
|
||||||
|
blake3 = "1.3.1"
|
||||||
bloomfilter = "1.0.14"
|
bloomfilter = "1.0.14"
|
||||||
bs58 = "0.5.1"
|
bs58 = "0.5.1"
|
||||||
bytecodec = "0.4.15"
|
bytecodec = "0.4.15"
|
||||||
bytes = "1.7.2"
|
bytes = "1.5.0"
|
||||||
cargo_metadata = "0.18.1"
|
cargo_metadata = "0.18.1"
|
||||||
celes = "2.5.0"
|
celes = "2.4.0"
|
||||||
cfg-if = "1.0.0"
|
cfg-if = "1.0.0"
|
||||||
chacha20 = "0.9.0"
|
chacha20 = "0.9.0"
|
||||||
chacha20poly1305 = "0.10.1"
|
chacha20poly1305 = "0.10.1"
|
||||||
chrono = "0.4.40"
|
chrono = "0.4.31"
|
||||||
cipher = "0.4.3"
|
cipher = "0.4.3"
|
||||||
clap = "4.5.31"
|
clap = "4.4.7"
|
||||||
clap_complete = "4.5"
|
clap_complete = "4.0"
|
||||||
clap_complete_fig = "4.5"
|
clap_complete_fig = "4.0"
|
||||||
colored = "2.2"
|
colored = "2.0"
|
||||||
comfy-table = "7.1.4"
|
comfy-table = "6.0.0"
|
||||||
console = "0.15.11"
|
|
||||||
console-subscriber = "0.1.1"
|
console-subscriber = "0.1.1"
|
||||||
console_error_panic_hook = "0.1"
|
console_error_panic_hook = "0.1"
|
||||||
const-str = "0.5.6"
|
const-str = "0.5.6"
|
||||||
const_format = "0.2.34"
|
const_format = "0.2.32"
|
||||||
criterion = "0.5"
|
criterion = "0.4"
|
||||||
csv = "1.3.1"
|
csv = "1.3.0"
|
||||||
ctr = "0.9.1"
|
ctr = "0.9.1"
|
||||||
cupid = "0.6.1"
|
cupid = "0.6.1"
|
||||||
curve25519-dalek = "4.1"
|
curve25519-dalek = "4.1"
|
||||||
dashmap = "5.5.3"
|
dashmap = "5.5.3"
|
||||||
# We want https://github.com/DefGuard/wireguard-rs/pull/64 , but there's no crates.io release being pushed out anymore
|
defguard_wireguard_rs = "0.4.2"
|
||||||
defguard_wireguard_rs = { git = "https://github.com/DefGuard/wireguard-rs.git", rev = "v0.4.7" }
|
|
||||||
digest = "0.10.7"
|
digest = "0.10.7"
|
||||||
dirs = "5.0"
|
dirs = "4.0"
|
||||||
doc-comment = "0.3"
|
doc-comment = "0.3"
|
||||||
dotenvy = "0.15.6"
|
dotenvy = "0.15.6"
|
||||||
ecdsa = "0.16"
|
ecdsa = "0.16"
|
||||||
ed25519-dalek = "2.1"
|
ed25519-dalek = "2.1"
|
||||||
env_logger = "0.11.6"
|
|
||||||
envy = "0.4"
|
|
||||||
etherparse = "0.13.0"
|
etherparse = "0.13.0"
|
||||||
eyre = "0.6.9"
|
eyre = "0.6.9"
|
||||||
fastrand = "2.1.1"
|
fastrand = "2.1.0"
|
||||||
flate2 = "1.1.0"
|
flate2 = "1.0.28"
|
||||||
futures = "0.3.31"
|
futures = "0.3.28"
|
||||||
futures-util = "0.3"
|
|
||||||
generic-array = "0.14.7"
|
generic-array = "0.14.7"
|
||||||
getrandom = "0.2.10"
|
getrandom = "0.2.10"
|
||||||
getset = "0.1.5"
|
getset = "0.1.1"
|
||||||
handlebars = "3.5.5"
|
handlebars = "3.5.5"
|
||||||
headers = "0.4.0"
|
headers = "0.4.0"
|
||||||
hex = "0.4.3"
|
hex = "0.4.3"
|
||||||
hex-literal = "0.3.3"
|
hex-literal = "0.3.3"
|
||||||
hickory-resolver = "0.24.4"
|
|
||||||
hkdf = "0.12.3"
|
hkdf = "0.12.3"
|
||||||
hmac = "0.12.1"
|
hmac = "0.12.1"
|
||||||
http = "1"
|
http = "1"
|
||||||
http-body-util = "0.1"
|
|
||||||
httpcodec = "0.2.3"
|
httpcodec = "0.2.3"
|
||||||
human-repr = "1.1.0"
|
|
||||||
humantime = "2.1.0"
|
humantime = "2.1.0"
|
||||||
humantime-serde = "1.1.1"
|
humantime-serde = "1.1.1"
|
||||||
hyper = "1.6.0"
|
hyper = "1.3.1"
|
||||||
hyper-util = "0.1"
|
|
||||||
indicatif = "0.17.11"
|
|
||||||
inquire = "0.6.2"
|
inquire = "0.6.2"
|
||||||
ip_network = "0.4.1"
|
ip_network = "0.4.1"
|
||||||
ipnetwork = "0.20"
|
ipnetwork = "0.16"
|
||||||
isocountry = "0.3.2"
|
isocountry = "0.3.2"
|
||||||
itertools = "0.14.0"
|
itertools = "0.13.0"
|
||||||
k256 = "0.13"
|
k256 = "0.13"
|
||||||
lazy_static = "1.5.0"
|
lazy_static = "1.4.0"
|
||||||
ledger-transport = "0.10.0"
|
ledger-transport = "0.10.0"
|
||||||
ledger-transport-hid = "0.10.0"
|
ledger-transport-hid = "0.10.0"
|
||||||
log = "0.4"
|
log = "0.4"
|
||||||
maxminddb = "0.23.0"
|
maxminddb = "0.23.0"
|
||||||
mime = "0.3.17"
|
mime = "0.3.17"
|
||||||
moka = { version = "0.12", features = ["future"] }
|
|
||||||
nix = "0.27.1"
|
nix = "0.27.1"
|
||||||
notify = "5.1.0"
|
notify = "5.1.0"
|
||||||
okapi = "0.7.0"
|
okapi = "0.7.0"
|
||||||
once_cell = "1.20.3"
|
once_cell = "1.7.2"
|
||||||
opentelemetry = "0.19.0"
|
opentelemetry = "0.19.0"
|
||||||
opentelemetry-jaeger = "0.18.0"
|
opentelemetry-jaeger = "0.18.0"
|
||||||
parking_lot = "0.12.3"
|
parking_lot = "0.12.1"
|
||||||
pem = "0.8"
|
pem = "0.8"
|
||||||
petgraph = "0.6.5"
|
pin-project = "1.0"
|
||||||
pin-project = "1.1"
|
|
||||||
pin-project-lite = "0.2.16"
|
|
||||||
pretty_env_logger = "0.4.0"
|
pretty_env_logger = "0.4.0"
|
||||||
publicsuffix = "2.3.0"
|
publicsuffix = "2.2.3"
|
||||||
quote = "1"
|
quote = "1"
|
||||||
rand = "0.8.5"
|
rand = "0.8.5"
|
||||||
|
rand-07 = "0.7.3"
|
||||||
rand_chacha = "0.3"
|
rand_chacha = "0.3"
|
||||||
|
rand_chacha_02 = "0.2"
|
||||||
rand_core = "0.6.3"
|
rand_core = "0.6.3"
|
||||||
rand_distr = "0.4"
|
rand_distr = "0.4"
|
||||||
rand_pcg = "0.3.1"
|
rand_pcg = "0.3.1"
|
||||||
rand_seeder = "0.2.3"
|
rand_seeder = "0.2.3"
|
||||||
rayon = "1.5.1"
|
rayon = "1.5.1"
|
||||||
regex = "1.10.6"
|
regex = "1.8.4"
|
||||||
reqwest = { version = "0.12.4", default-features = false }
|
reqwest = { version = "0.12.4", default-features = false }
|
||||||
rocket = "0.5.0"
|
rocket = "0.5.0"
|
||||||
rocket_cors = "0.6.0"
|
rocket_cors = "0.6.0"
|
||||||
rocket_okapi = "0.8.0"
|
rocket_okapi = "0.8.0"
|
||||||
rs_merkle = "1.4.2"
|
safer-ffi = "0.1.4"
|
||||||
safer-ffi = "0.1.13"
|
schemars = "0.8.1"
|
||||||
schemars = "0.8.22"
|
semver = "1.0.23"
|
||||||
semver = "1.0.25"
|
serde = "1.0.152"
|
||||||
serde = "1.0.217"
|
serde_bytes = "0.11.6"
|
||||||
serde_bytes = "0.11.16"
|
|
||||||
serde_derive = "1.0"
|
serde_derive = "1.0"
|
||||||
serde_json = "1.0.140"
|
serde_json = "1.0.91"
|
||||||
serde_json_path = "0.7.2"
|
|
||||||
serde_repr = "0.1"
|
serde_repr = "0.1"
|
||||||
serde_with = "3.9.0"
|
serde_with = "3.4.0"
|
||||||
serde_yaml = "0.9.25"
|
serde_yaml = "0.9.25"
|
||||||
sha2 = "0.10.8"
|
sha2 = "0.10.8"
|
||||||
si-scale = "0.2.3"
|
si-scale = "0.2.2"
|
||||||
sphinx-packet = "=0.4.0" # make sure to use version 0.4.0 (or higher) that has removed backwards compatibility
|
sphinx-packet = "0.1.1"
|
||||||
sqlx = "0.7.4"
|
sqlx = "0.6.3"
|
||||||
strum = "0.26"
|
strum = "0.25"
|
||||||
strum_macros = "0.26"
|
|
||||||
subtle-encoding = "0.5"
|
subtle-encoding = "0.5"
|
||||||
syn = "1"
|
syn = "1"
|
||||||
sysinfo = "0.33.0"
|
sysinfo = "0.30.12"
|
||||||
tap = "1.0.1"
|
tap = "1.0.1"
|
||||||
tar = "0.4.44"
|
tar = "0.4.40"
|
||||||
tempfile = "3.15"
|
tempfile = "3.5.0"
|
||||||
thiserror = "2.0"
|
thiserror = "1.0.48"
|
||||||
time = "0.3.37"
|
time = "0.3.30"
|
||||||
tokio = "1.43"
|
tokio = "1.39"
|
||||||
tokio-postgres = "0.7"
|
tokio-stream = "0.1.15"
|
||||||
tokio-stream = "0.1.17"
|
|
||||||
tokio-test = "0.4.4"
|
tokio-test = "0.4.4"
|
||||||
tokio-tun = "0.11.5"
|
|
||||||
tokio-tungstenite = { version = "0.20.1" }
|
tokio-tungstenite = { version = "0.20.1" }
|
||||||
tokio-util = "0.7.13"
|
tokio-util = "0.7.11"
|
||||||
toml = "0.8.20"
|
toml = "0.8.14"
|
||||||
tower = "0.5.2"
|
tower = "0.4.13"
|
||||||
tower-http = "0.5.2"
|
tower-http = "0.5.2"
|
||||||
tracing = "0.1.41"
|
tracing = "0.1.37"
|
||||||
tracing-log = "0.2"
|
|
||||||
tracing-opentelemetry = "0.19.0"
|
tracing-opentelemetry = "0.19.0"
|
||||||
tracing-subscriber = "0.3.19"
|
tracing-subscriber = "0.3.16"
|
||||||
tracing-tree = "0.2.2"
|
tracing-tree = "0.2.2"
|
||||||
ts-rs = "10.1.0"
|
ts-rs = "7.0.0"
|
||||||
tungstenite = { version = "0.20.1", default-features = false }
|
tungstenite = { version = "0.20.1", default-features = false }
|
||||||
uniffi = "0.29.0"
|
url = "2.4"
|
||||||
uniffi_build = "0.29.0"
|
utoipa = "4.2.0"
|
||||||
url = "2.5"
|
utoipa-swagger-ui = "6.0.0"
|
||||||
utoipa = "5.2"
|
|
||||||
utoipa-swagger-ui = "8.1"
|
|
||||||
utoipauto = "0.2"
|
|
||||||
uuid = "*"
|
|
||||||
vergen = { version = "=8.3.1", default-features = false }
|
vergen = { version = "=8.3.1", default-features = false }
|
||||||
walkdir = "2"
|
walkdir = "2"
|
||||||
wasm-bindgen-test = "0.3.49"
|
wasm-bindgen-test = "0.3.36"
|
||||||
x25519-dalek = "2.0.0"
|
x25519-dalek = "2.0.0"
|
||||||
zeroize = "1.6.0"
|
zeroize = "1.6.0"
|
||||||
|
|
||||||
@@ -372,9 +323,9 @@ prometheus = { version = "0.13.0" }
|
|||||||
bls12_381 = { git = "https://github.com/jstuczyn/bls12_381", default-features = false, branch = "temp/experimental-serdect" }
|
bls12_381 = { git = "https://github.com/jstuczyn/bls12_381", default-features = false, branch = "temp/experimental-serdect" }
|
||||||
group = { version = "0.13.0", default-features = false }
|
group = { version = "0.13.0", default-features = false }
|
||||||
ff = { version = "0.13.0", default-features = false }
|
ff = { version = "0.13.0", default-features = false }
|
||||||
subtle = "2.5.0"
|
|
||||||
|
|
||||||
# cosmwasm-related
|
# cosmwasm-related
|
||||||
|
cosmwasm-derive = "=1.4.3"
|
||||||
cosmwasm-schema = "=1.4.3"
|
cosmwasm-schema = "=1.4.3"
|
||||||
cosmwasm-std = "=1.4.3"
|
cosmwasm-std = "=1.4.3"
|
||||||
# use 0.5.0 as that's the version used by cosmwasm-std 1.4.3
|
# use 0.5.0 as that's the version used by cosmwasm-std 1.4.3
|
||||||
@@ -390,34 +341,38 @@ cw4 = { version = "=1.1.2" }
|
|||||||
cw-controllers = { version = "=1.1.0" }
|
cw-controllers = { version = "=1.1.0" }
|
||||||
|
|
||||||
# cosmrs-related
|
# cosmrs-related
|
||||||
bip32 = { version = "0.5.3", default-features = false }
|
bip32 = { version = "0.5.1", default-features = false }
|
||||||
|
|
||||||
|
# temporarily using a fork again (yay.) because we need staking and slashing support (which are already on main but not released)
|
||||||
cosmrs = { version = "0.21.1" }
|
# plus response message parsing (which is, as of the time of writing this message, waiting to get merged)
|
||||||
tendermint = "0.40.0"
|
#cosmrs = { path = "../cosmos-rust-fork/cosmos-rust/cosmrs" }
|
||||||
tendermint-rpc = "0.40.0"
|
cosmrs = { git = "https://github.com/cosmos/cosmos-rust", rev = "4b1332e6d8258ac845cef71589c8d362a669675a" } # unfortuntely we need a fork by yours truly to get the staking support
|
||||||
prost = { version = "0.13", default-features = false }
|
tendermint = "0.37.0" # same version as used by cosmrs
|
||||||
|
tendermint-rpc = "0.37.0" # same version as used by cosmrs
|
||||||
|
prost = { version = "0.12", default-features = false }
|
||||||
|
|
||||||
# wasm-related dependencies
|
# wasm-related dependencies
|
||||||
gloo-utils = "0.2.0"
|
gloo-utils = "0.2.0"
|
||||||
gloo-net = "0.6.0"
|
gloo-net = "0.5.0"
|
||||||
|
|
||||||
indexed_db_futures = "0.6.0"
|
# use a separate branch due to feature unification failures
|
||||||
js-sys = "0.3.76"
|
# this is blocked until the upstream removes outdates `wasm_bindgen` feature usage
|
||||||
|
# indexed_db_futures = "0.4.1"
|
||||||
|
indexed_db_futures = { git = "https://github.com/TiemenSch/rust-indexed-db", branch = "update-uuid" }
|
||||||
|
js-sys = "0.3.69"
|
||||||
serde-wasm-bindgen = "0.6.5"
|
serde-wasm-bindgen = "0.6.5"
|
||||||
tsify = "0.4.5"
|
tsify = "0.4.5"
|
||||||
wasm-bindgen = "0.2.99"
|
wasm-bindgen = "0.2.92"
|
||||||
wasm-bindgen-futures = "0.4.49"
|
wasm-bindgen-futures = "0.4.39"
|
||||||
wasmtimer = "0.4.1"
|
wasmtimer = "0.2.0"
|
||||||
web-sys = "0.3.76"
|
web-sys = "0.3.69"
|
||||||
|
|
||||||
|
|
||||||
# Profile settings for individual crates
|
# Profile settings for individual crates
|
||||||
|
|
||||||
# Compile-time verified queries do quite a bit of work at compile time. Incremental
|
[profile.release.package.nym-socks5-listener]
|
||||||
# actions like cargo check and cargo build can be significantly faster when
|
strip = true
|
||||||
# using an optimized build
|
codegen-units = 1
|
||||||
[profile.dev.package.sqlx-macros]
|
|
||||||
opt-level = 3
|
|
||||||
|
|
||||||
[profile.release.package.nym-client-wasm]
|
[profile.release.package.nym-client-wasm]
|
||||||
# lto = true
|
# lto = true
|
||||||
@@ -437,13 +392,3 @@ opt-level = 'z'
|
|||||||
[profile.release.package.mix-fetch-wasm]
|
[profile.release.package.mix-fetch-wasm]
|
||||||
# lto = true
|
# lto = true
|
||||||
opt-level = 'z'
|
opt-level = 'z'
|
||||||
|
|
||||||
[workspace.lints.clippy]
|
|
||||||
unwrap_used = "deny"
|
|
||||||
expect_used = "deny"
|
|
||||||
todo = "deny"
|
|
||||||
dbg_macro = "deny"
|
|
||||||
exit = "deny"
|
|
||||||
panic = "deny"
|
|
||||||
unimplemented = "deny"
|
|
||||||
unreachable = "deny"
|
|
||||||
@@ -1,23 +0,0 @@
|
|||||||
Boost Software License - Version 1.0 - August 17th, 2003
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person or organization
|
|
||||||
obtaining a copy of the software and accompanying documentation covered by
|
|
||||||
this license (the "Software") to use, reproduce, display, distribute,
|
|
||||||
execute, and transmit the Software, and to prepare derivative works of the
|
|
||||||
Software, and to permit third-parties to whom the Software is furnished to
|
|
||||||
do so, all subject to the following:
|
|
||||||
|
|
||||||
The copyright notices in the Software and this entire statement, including
|
|
||||||
the above license grant, this restriction and the following disclaimer,
|
|
||||||
must be included in all copies of the Software, in whole or in part, and
|
|
||||||
all derivative works of the Software, unless such copies or derivative
|
|
||||||
works are solely in the form of machine-executable object code generated by
|
|
||||||
a source language processor.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
|
|
||||||
SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
|
|
||||||
FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
|
|
||||||
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
|
||||||
DEALINGS IN THE SOFTWARE.
|
|
||||||
@@ -13,8 +13,7 @@ The platform is composed of multiple Rust crates. Top-level executable binary cr
|
|||||||
* `nym-client` - an executable which you can build into your own applications. Use it for interacting with Nym nodes.
|
* `nym-client` - an executable which you can build into your own applications. Use it for interacting with Nym nodes.
|
||||||
* `nym-socks5-client` - a Socks5 proxy you can run on your machine and use with existing applications.
|
* `nym-socks5-client` - a Socks5 proxy you can run on your machine and use with existing applications.
|
||||||
* `nym-explorer` - a (projected) block explorer and (existing) mixnet viewer.
|
* `nym-explorer` - a (projected) block explorer and (existing) mixnet viewer.
|
||||||
* `nym-wallet` - a desktop wallet implemented using the [Tauri](https://tauri.app)) framework.
|
* `nym-wallet` - a desktop wallet implemented using the [Tauri](https://tauri.studio/en/docs/about/intro) framework.
|
||||||
* `nym-cli` - a tool for interacting with the network from the CLI.
|
|
||||||
<!-- coming soon
|
<!-- coming soon
|
||||||
* `nym-network-monitor` - sends packets through the full system to check that they are working as expected, and stores node uptime histories as the basis of a rewards system ("mixmining" or "proof-of-mixing").
|
* `nym-network-monitor` - sends packets through the full system to check that they are working as expected, and stores node uptime histories as the basis of a rewards system ("mixmining" or "proof-of-mixing").
|
||||||
-->
|
-->
|
||||||
@@ -36,20 +35,24 @@ client ───► Gateway ──┘ mix │ mix ┌─►mix ───►
|
|||||||
### Building
|
### Building
|
||||||
|
|
||||||
* Platform build instructions are available on Nym [Operators Guide documentation](https://nymtech.net/operators/binaries/building-nym.html).
|
* Platform build instructions are available on Nym [Operators Guide documentation](https://nymtech.net/operators/binaries/building-nym.html).
|
||||||
* Wallet build instructions are available [here](https://github.com/nymtech/nym/tree/master/nym-wallet#installation-prerequisites---linux--mac).
|
* Wallet build instructions are available on Nym [Technical docs](https://nymtech.net/docs/wallet/desktop-wallet.html).
|
||||||
|
|
||||||
### Developing
|
### Developing
|
||||||
|
|
||||||
|
There's a [`sandbox.env`](https://github.com/nymtech/nym/envs/sandbox.env) file provided which you can rename to `.env` if you want convenient testing environment. Read more about sandbox environment in our [Operators Guide page](https://nymtech.net/operators/sandbox.html).
|
||||||
|
|
||||||
References for developers:
|
References for developers:
|
||||||
|
|
||||||
* [Dev Docs](https://nym.com/docs/developers)
|
* [Developers Portal](https://nymtech.net/developers)
|
||||||
* [SDKs](https://nym.com/docs/developers/rust)
|
* [Typescript SDKs](https://sdk.nymtech.net/)
|
||||||
* [Network Docs](https://nym.com/docs/network)
|
* [Technical Documentation - Nym network overview](https://nymtech.net/docs/)
|
||||||
* [Release Cycle - git flow](https://nym.com/docs/operators/release-cycle)
|
* [Release Cycle - git flow](https://nymtech.net/operators/release-cycle.html)
|
||||||
|
|
||||||
### Developer chat
|
### Developer chat
|
||||||
|
|
||||||
You can chat to us in the #dev channel on [Matrix](https://matrix.to/#/#dev:nymtech.chat) or on the [Nym Forum](https://forum.nymtech.net).
|
You can chat to us in two places:
|
||||||
|
* The #dev channel on [Matrix](https://matrix.to/#/#dev:nymtech.chat)
|
||||||
|
* The various developer channels on [Discord](https://nymtech.net/go/discord)
|
||||||
|
|
||||||
### Tokenomics & Rewards
|
### Tokenomics & Rewards
|
||||||
|
|
||||||
@@ -66,4 +69,4 @@ As a general approach, licensing is as follows this pattern:
|
|||||||
- libraries and components are Apache 2.0 or MIT
|
- libraries and components are Apache 2.0 or MIT
|
||||||
- documentation is Apache 2.0 or CC0-1.0
|
- 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).
|
Nym Node Operators and Validators Temrs and Conditions can be found [here](https://nymtech.net/terms-and-conditions/operators/v1.0.0).
|
||||||
|
|||||||
+56
-68
@@ -3,23 +3,37 @@ Critical bug or security issue 💥
|
|||||||
If you're here because you're trying to figure out how to notify us of a security issue, send us a PGP encrypted email to:
|
If you're here because you're trying to figure out how to notify us of a security issue, send us a PGP encrypted email to:
|
||||||
|
|
||||||
```
|
```
|
||||||
security@nym.com
|
security@nymte.ch
|
||||||
```
|
```
|
||||||
|
|
||||||
Encrypted with our public key which is available below in plain text and also on keyservers:
|
Encrypted with our public key which is available below in plain text and also on keyservers:
|
||||||
|
|
||||||
```
|
```
|
||||||
sec rsa4096/7C3C727F05090550 2023-10-30 [SC] [expire : 2026-10-29]
|
pub rsa4096 2023-10-30 [SC] [expire : 2026-10-29]
|
||||||
24B2592E801A5AAA8666C8BA7C3C727F05090550
|
24B2592E801A5AAA8666C8BA7C3C727F05090550
|
||||||
uid [ ultime ] Security Nym Technologies <security@nym.com>
|
uid [ ultime ] Security Nym Technologies <security@nymte.ch>
|
||||||
ssb rsa4096/ACD0FBD79DC70ACC 2023-10-30 [E] [expire : 2026-10-29]
|
sub rsa4096 2023-10-30 [E] [expire : 2026-10-29]
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
The fingerprint of the key is on the second line above.
|
The fingerprint of the key is on the second line above.
|
||||||
|
|
||||||
|
If you need to chat __urgently__ to our team for a __critical__ security issue:
|
||||||
|
|
||||||
|
go to Matrix, and alert the core engineers with a private direct message:
|
||||||
|
|
||||||
|
Jedrzej Stuczynski @jstuczyn:nymtech.chat
|
||||||
|
Mark Sinclair @mark:nymtech.chat
|
||||||
|
Raphaël Walther @raphael:nymtech.chat
|
||||||
|
|
||||||
Please avoid opening public issues on GitHub that contain information about a potential security vulnerability as this makes it difficult to reduce the impact and harm of valid security issues.
|
Please avoid opening public issues on GitHub that contain information about a potential security vulnerability as this makes it difficult to reduce the impact and harm of valid security issues.
|
||||||
|
|
||||||
|
If you don't know what Matrix is, you can follow this documentation to create an account on this federation of instant messaging servers:
|
||||||
|
|
||||||
|
[Matrix for Instant Messaging](https://matrix.org/docs/chat_basics/matrix-for-im/)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
```
|
```
|
||||||
-----BEGIN PGP PUBLIC KEY BLOCK-----
|
-----BEGIN PGP PUBLIC KEY BLOCK-----
|
||||||
|
|
||||||
@@ -34,69 +48,43 @@ vMFUIzBMHOPXH16036zGyFMC1esRd2qqil4b9KtLgCOkrD1VgpjcveoA0VyMJCN6
|
|||||||
LmKTrVjwjjDMxby+d49BolRWGnCofXozXwvNQx+CYv8M2WPErTpyYoofYFtpqr7A
|
LmKTrVjwjjDMxby+d49BolRWGnCofXozXwvNQx+CYv8M2WPErTpyYoofYFtpqr7A
|
||||||
fIufc/e0+um3zoGIbHejrhsbuH9Qf+MKsI+Ng93bdDtjeHz6MEgAlsTm0qeizYpj
|
fIufc/e0+um3zoGIbHejrhsbuH9Qf+MKsI+Ng93bdDtjeHz6MEgAlsTm0qeizYpj
|
||||||
IyKZIObPmfvrAm08hFZ8JnGk+XuooF36XWbJYjCCy0bOyMw1r7ZG99TcSwARAQAB
|
IyKZIObPmfvrAm08hFZ8JnGk+XuooF36XWbJYjCCy0bOyMw1r7ZG99TcSwARAQAB
|
||||||
tCxTZWN1cml0eSBOeW0gVGVjaG5vbG9naWVzIDxzZWN1cml0eUBueW0uY29tPokC
|
tC1TZWN1cml0eSBOeW0gVGVjaG5vbG9naWVzIDxzZWN1cml0eUBueW10ZS5jaD6J
|
||||||
VAQTAQoAPhYhBCSyWS6AGlqqhmbIunw8cn8FCQVQBQJnSd5VAhsDBQkFo5qABQsJ
|
AlQEEwEKAD4WIQQkslkugBpaqoZmyLp8PHJ/BQkFUAUCZT9elwIbAwUJBaOagAUL
|
||||||
CAcDBRUKCQgLBRYCAwEAAh4BAheAAAoJEHw8cn8FCQVQPPIP/ipGz2zLAjE2dSE3
|
CQgHAwUVCgkICwUWAgMBAAIeAQIXgAAKCRB8PHJ/BQkFUL7dD/9zO73uI5VR+SWx
|
||||||
VcqOvras0DfqIL9HDm26Dg6QO2D/4YRntw0RqVyuy+zFnRUm+RZCKLPLUzbQ9Wjb
|
PFmJW+9QsPiQbVRvGwNZurctmQ2s2Pe0vHRELFeqD5oYvSx2Lequ3Ir+zn/C3kDM
|
||||||
G/Og5ttQVYQMu5eKu7OMvXkrbRo3teZFU+8IL08zIW6pyf9haxO6YMhLRy6cLYwW
|
kNs40obSL6jCBiLPkxEY0JqzPM9jZr7EjvlibWV3f6DxooRIqEyfN57I3OBGlqZE
|
||||||
0EYC6Qzn5gz3kI7VkI8fWfs2Dk4XEV3D+SVtBoF6KRxMXT6HZvpzoMSEJZBoNj8S
|
0Mx7sQuCcgau8C70DF952QhKUwXC2cmpmDKHVEEoio1xGSD4dQhGapCB32RQGtna
|
||||||
jw0TF8TFUQf49jUQbIHumukMswolrHi8a5ej8DSfNwSgz+Tt8oh5lu01kyUJiHn7
|
OGfAO9celNMvSq0Lp+aJxeACmWFY5T4/y79JPcT5vSs/yEIRmaH/fn2piwaFBsIq
|
||||||
nuHaY4Y9cHUVAOSwq/hovG52+ZE1r3aiswvle/B19o9pKeWWVvacSptGxDQagBtQ
|
gHJJMxO3740P1hF8j7KWUoUofuFaEALHBpEpjWTOj8ej1wmFlu+5F+jSVoc781Wb
|
||||||
igoNLdRvY0XN2TEyX9pOHR0AoVOxtIW11CpkKuDbQG9vPwovqJ2L6+Fh3pzHYzcI
|
ZZXu04cOBXnGTogzSxMpBe9TtLb28zd6WzFotC25KTI3pngMzXsQGLJLOwvoZKiS
|
||||||
2GIShNm/Z2SZBiUqbljJe9H4UAT/aHgMINkEG8qzUKwO42MA5HJT7YbHTR17/QSF
|
LFjPRjg1rwobmB3Q3J2W5GYSveia0CDsZGP+g87GVVf/oD2Djpa68xyVYwIYeA6T
|
||||||
Il5dhneRzmSbNcW2rdRwx/BmzrcsFJfqCt4JG/WDF293xSOjhFqQYvU4gCO+OB7o
|
3DNdS77qHiRuGiS4kWXyVjDqOICboR4uCvt09zlkBuLDdTWqWYARUvZjtjs4w/Ol
|
||||||
KXjX907XXDjS2KEJ71OGqVfk/P7BqEfQNfrLtb02TyXJAPQXHhybv23c4E7zUs9V
|
rdrBI3A88ti8fRldYaNpu17ME1ilpN44yKoJtqiWc3Tisk8eYLfx6c7FQF3PrRva
|
||||||
lMjNizzxYB96uwJb0LAB2ijzEwoP91uGT2tFjk6F08x2QiArmXUdgrv44b39Stia
|
mr7FZvhFsYML5CeNFHTEzN6Y3jjKN/60DvCfodWnWFK47Txkl8UAXGY2W9B0fWqQ
|
||||||
gJS0GYKqSzyr10xHhUuDA+GKYtcitC1TZWN1cml0eSBOeW0gVGVjaG5vbG9naWVz
|
wUVr8uLuMyyMiKbeoufi7rGOj6AMErkCDQRlP16XARAA8FGmD5J3tM1BOM1niJxZ
|
||||||
IDxzZWN1cml0eUBueW10ZS5jaD6JAjYEMAEKACAWIQQkslkugBpaqoZmyLp8PHJ/
|
JTdCauzEtxEoBL0RuqGBkR8U29sRM6DwuzjU7PwscFnBaGyU+eU73GwGkH3ozFfF
|
||||||
BQkFUAUCZ0nftQIdIAAKCRB8PHJ/BQkFUFHDEACtyNuUEjKCLAT5mSfow85PjFgo
|
tllYhQrhP/kkN+0rEO5Xi+nR+4JCFRqrf3nJXAAPfiksURMp8er1dUOY2/e1ZSoL
|
||||||
o8kHjQr/IIQ7ZbBOHeJJcrxDuypssiLh5XUjF3x5BiBfZ6vCxSb81RRwsDMp0mA1
|
tS+nzUivV8CfE+pgj/5YtGwPC+KYHLATkKkMELCrbW4UO06VWOqQsvr6kivXuJQQ
|
||||||
qzv9G8sgW0HTQUnZ9oH6CYut2NgzAnQpmuacrunm9Zy0FJ3ejbmwUY/NqK6gJkle
|
LdEAMpBlADmXFG45DmPKQzsBWUgvTwyGy3LX0nys8cgpex9BH8hhr01QmGyP469s
|
||||||
66duHKhAy7DWjj7amd0C8bPDR+PA44fI3MezDHkQNaauKZTRqd1TqH8Qk5PAl4cB
|
N3cNrtFuu8U6RAsiCD/8mlBuD3EQEU5SF0lc7kCICAZk+wElmXnimEi0TOYsbz6k
|
||||||
o5gVzeZh/U7/usvtGhazAIUF5BqK6bTmDnYopg+2x8jjwrG4+08GrttZkNjBLXeA
|
90lteicX70rA9GNeyI76H+VSOYvWpkRwaJAgUdzrAM1o9SHASq+cZ6nD85OZioQk
|
||||||
Y/2U064yMz12LPv01qqAFdZ+coRy/ps/gOQTz34/VeW0CFy7TMqs4t3vSBWTqU7w
|
DWM6+Q+sf2oen0qJnnGmUr93kJIC0PIdgrXRrtiNfeRa1Z/H0LmREyyEMoFiVivn
|
||||||
hnw/qj6cM33fdxctj6KDgJSCkZdx2fvwXgxiPqUa5+j9FlFBeD5RDAl6g6t8N1/K
|
z1vVk85Oq6Sf3ltUwvmDzuuJOtsp2Qp6+x6Snn/yKauI4uf4Cf/wKUch4r6Bwgg5
|
||||||
Xca+zNYuSZgc297q1D+mtSD1C7uJNPxoAl+Bv5KNKpsjfQ+m04++CIFtGyX22aCA
|
Dw49ky7lwlnALio4GIVoGLpLef93wWoDmp4Klyh3ZPf2nB0U91u3bHRUo7m+D7QJ
|
||||||
h2/tHwQZIXhOiMAKOoupidDVDhgxtCJ3Ps416xL0sTZfsPfg+j1Uv/Em9pzPClEl
|
98cyKtqLLzjg7szGf60pIWNWRsadYQT3bSncynqknAjOV3BCvx6/ivsnpj//QjYR
|
||||||
fX6+1O4DdSyZUQ4VsjMu/H5W/NQdbHgmqFrxQ6WX/0s5GMwO6GMDiPe8sOrwz9wD
|
HtviUAcQ1DBB6UC6q23FIs0AEQEAAYkCPAQYAQoAJhYhBCSyWS6AGlqqhmbIunw8
|
||||||
WYtyjafxXOHEZ1OjYX5gr7bGaG4oKc2btTJN0B3Phg4dStnHCNjEYccxuV3507fj
|
cn8FCQVQBQJlP16XAhsMBQkFo5qAAAoJEHw8cn8FCQVQzukP/iLxjOxT+UpPR//c
|
||||||
HnNotkpXF2nGLxy+PYkCVAQTAQoAPhYhBCSyWS6AGlqqhmbIunw8cn8FCQVQBQJl
|
prDVSLkP4pF5bmw36U07jvqpS+/KTXsxiiQleffRabOpNLcd+K1ueavyt9nnIwHH
|
||||||
P16XAhsDBQkFo5qABQsJCAcDBRUKCQgLBRYCAwEAAh4BAheAAAoJEHw8cn8FCQVQ
|
tHS9kM9A7DBw3LnpEbXki46QDCCI6niGijlLOEeAWqnocwMNTT05wVVgCtO3DQP2
|
||||||
vt0P/3M7ve4jlVH5JbE8WYlb71Cw+JBtVG8bA1m6ty2ZDazY97S8dEQsV6oPmhi9
|
MoSCcqHpXDChvOyr5d5xjYLVJhlctIMSomcVzGryjknPu0Yj/TkC/4c+m86ZWQUD
|
||||||
LHYt6q7civ7Of8LeQMyQ2zjShtIvqMIGIs+TERjQmrM8z2NmvsSO+WJtZXd/oPGi
|
HqMHQIuiEenvb62/F4c5OJIRZPEn70wdddkgJuJU3eHdHrnuhCkjCC93GQGbGj03
|
||||||
hEioTJ83nsjc4EaWpkTQzHuxC4JyBq7wLvQMX3nZCEpTBcLZyamYModUQSiKjXEZ
|
Zqos6699y6hmPeD3U5IUv8ujwZYVCCuDm8gJfrp3R6WLfeZeK9WmTVBpCzsDg3fV
|
||||||
IPh1CEZqkIHfZFAa2do4Z8A71x6U0y9KrQun5onF4AKZYVjlPj/Lv0k9xPm9Kz/I
|
hSwmOk6pp8DAq1/Dev3yRkFggCEyGK6c9b+a0CRBncl8e5Q0QQIzNiS/uExQP3h+
|
||||||
QhGZof9+famLBoUGwiqAckkzE7fvjQ/WEXyPspZShSh+4VoQAscGkSmNZM6Px6PX
|
ELJs3P0MLP+6FWhNUry09n3lnWkr1hY+v1M0GAxbfdv/tsCN1Pq/VQEz+CTqXqya
|
||||||
CYWW77kX6NJWhzvzVZtlle7Thw4FecZOiDNLEykF71O0tvbzN3pbMWi0LbkpMjem
|
ftWldOHWw6Hh+gtwxcHjG4MBOrO5oICQ3lh2hGwQ58cDgZYSK/OGgJ9BggFl1CcM
|
||||||
eAzNexAYsks7C+hkqJIsWM9GODWvChuYHdDcnZbkZhK96JrQIOxkY/6DzsZVV/+g
|
0uGC0/TRCI1zt/4y+7efSZQMZkHo7VC/3MFbp2hcNejpW+BxVuwKTunFvWK3TLhq
|
||||||
PYOOlrrzHJVjAhh4DpPcM11LvuoeJG4aJLiRZfJWMOo4gJuhHi4K+3T3OWQG4sN1
|
sSlQ5yyhqchooepsFHq9bosKFjLJC01uprBv1rinoNduOy43FbyS7JPRRspANN0R
|
||||||
NapZgBFS9mO2OzjD86Wt2sEjcDzy2Lx9GV1ho2m7XswTWKWk3jjIqgm2qJZzdOKy
|
iC2pMbWdE0ZTQaFq6tPIg058pjqi
|
||||||
Tx5gt/HpzsVAXc+tG9qavsVm+EWxgwvkJ40UdMTM3pjeOMo3/rQO8J+h1adYUrjt
|
=nqgX
|
||||||
PGSXxQBcZjZb0HR9apDBRWvy4u4zLIyIpt6i5+LusY6PoAwSuQINBGU/XpcBEADw
|
|
||||||
UaYPkne0zUE4zWeInFklN0Jq7MS3ESgEvRG6oYGRHxTb2xEzoPC7ONTs/CxwWcFo
|
|
||||||
bJT55TvcbAaQfejMV8W2WViFCuE/+SQ37SsQ7leL6dH7gkIVGqt/eclcAA9+KSxR
|
|
||||||
Eynx6vV1Q5jb97VlKgu1L6fNSK9XwJ8T6mCP/li0bA8L4pgcsBOQqQwQsKttbhQ7
|
|
||||||
TpVY6pCy+vqSK9e4lBAt0QAykGUAOZcUbjkOY8pDOwFZSC9PDIbLctfSfKzxyCl7
|
|
||||||
H0EfyGGvTVCYbI/jr2w3dw2u0W67xTpECyIIP/yaUG4PcRARTlIXSVzuQIgIBmT7
|
|
||||||
ASWZeeKYSLRM5ixvPqT3SW16JxfvSsD0Y17Ijvof5VI5i9amRHBokCBR3OsAzWj1
|
|
||||||
IcBKr5xnqcPzk5mKhCQNYzr5D6x/ah6fSomecaZSv3eQkgLQ8h2CtdGu2I195FrV
|
|
||||||
n8fQuZETLIQygWJWK+fPW9WTzk6rpJ/eW1TC+YPO64k62ynZCnr7HpKef/Ipq4ji
|
|
||||||
5/gJ//ApRyHivoHCCDkPDj2TLuXCWcAuKjgYhWgYukt5/3fBagOangqXKHdk9/ac
|
|
||||||
HRT3W7dsdFSjub4PtAn3xzIq2osvOODuzMZ/rSkhY1ZGxp1hBPdtKdzKeqScCM5X
|
|
||||||
cEK/Hr+K+yemP/9CNhEe2+JQBxDUMEHpQLqrbcUizQARAQABiQI8BBgBCgAmFiEE
|
|
||||||
JLJZLoAaWqqGZsi6fDxyfwUJBVAFAmU/XpcCGwwFCQWjmoAACgkQfDxyfwUJBVDO
|
|
||||||
6Q/+IvGM7FP5Sk9H/9ymsNVIuQ/ikXlubDfpTTuO+qlL78pNezGKJCV599Fps6k0
|
|
||||||
tx34rW55q/K32ecjAce0dL2Qz0DsMHDcuekRteSLjpAMIIjqeIaKOUs4R4Baqehz
|
|
||||||
Aw1NPTnBVWAK07cNA/YyhIJyoelcMKG87Kvl3nGNgtUmGVy0gxKiZxXMavKOSc+7
|
|
||||||
RiP9OQL/hz6bzplZBQMeowdAi6IR6e9vrb8Xhzk4khFk8SfvTB112SAm4lTd4d0e
|
|
||||||
ue6EKSMIL3cZAZsaPTdmqizrr33LqGY94PdTkhS/y6PBlhUIK4ObyAl+undHpYt9
|
|
||||||
5l4r1aZNUGkLOwODd9WFLCY6TqmnwMCrX8N6/fJGQWCAITIYrpz1v5rQJEGdyXx7
|
|
||||||
lDRBAjM2JL+4TFA/eH4Qsmzc/Qws/7oVaE1SvLT2feWdaSvWFj6/UzQYDFt92/+2
|
|
||||||
wI3U+r9VATP4JOperJp+1aV04dbDoeH6C3DFweMbgwE6s7mggJDeWHaEbBDnxwOB
|
|
||||||
lhIr84aAn0GCAWXUJwzS4YLT9NEIjXO3/jL7t59JlAxmQejtUL/cwVunaFw16Olb
|
|
||||||
4HFW7ApO6cW9YrdMuGqxKVDnLKGpyGih6mwUer1uiwoWMskLTW6msG/WuKeg1247
|
|
||||||
LjcVvJLsk9FGykA03RGILakxtZ0TRlNBoWrq08iDTnymOqI=
|
|
||||||
=QPTf
|
|
||||||
-----END PGP PUBLIC KEY BLOCK-----
|
-----END PGP PUBLIC KEY BLOCK-----
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "nym-client"
|
name = "nym-client"
|
||||||
version = "1.1.49"
|
version = "1.1.39"
|
||||||
authors = ["Dave Hrycyszyn <futurechimp@users.noreply.github.com>", "Jędrzej Stuczyński <andrew@nymtech.net>"]
|
authors = ["Dave Hrycyszyn <futurechimp@users.noreply.github.com>", "Jędrzej Stuczyński <andrew@nymtech.net>"]
|
||||||
description = "Implementation of the Nym Client"
|
description = "Implementation of the Nym Client"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
|
|||||||
@@ -56,7 +56,7 @@ pub fn default_data_directory<P: AsRef<Path>>(id: P) -> PathBuf {
|
|||||||
.join(DEFAULT_DATA_DIR)
|
.join(DEFAULT_DATA_DIR)
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Deserialize, PartialEq, Serialize, Clone)]
|
#[derive(Debug, Deserialize, PartialEq, Serialize)]
|
||||||
pub struct Config {
|
pub struct Config {
|
||||||
#[serde(flatten)]
|
#[serde(flatten)]
|
||||||
pub base: BaseClientConfig,
|
pub base: BaseClientConfig,
|
||||||
@@ -94,10 +94,6 @@ impl CliClientConfig for Config {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl Config {
|
impl Config {
|
||||||
pub fn base(&self) -> BaseClientConfig {
|
|
||||||
self.base.clone()
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn new<S: AsRef<str>>(id: S) -> Self {
|
pub fn new<S: AsRef<str>>(id: S) -> Self {
|
||||||
Config {
|
Config {
|
||||||
base: BaseClientConfig::new(id.as_ref(), env!("CARGO_PKG_VERSION")),
|
base: BaseClientConfig::new(id.as_ref(), env!("CARGO_PKG_VERSION")),
|
||||||
@@ -213,7 +209,7 @@ impl SocketType {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Deserialize, PartialEq, Eq, Serialize, Clone)]
|
#[derive(Debug, Deserialize, PartialEq, Eq, Serialize)]
|
||||||
#[serde(default, deny_unknown_fields)]
|
#[serde(default, deny_unknown_fields)]
|
||||||
pub struct Socket {
|
pub struct Socket {
|
||||||
pub socket_type: SocketType,
|
pub socket_type: SocketType,
|
||||||
|
|||||||
@@ -102,13 +102,5 @@ average_ack_delay = '{{ debug.acknowledgements.average_ack_delay }}'
|
|||||||
[debug.cover_traffic]
|
[debug.cover_traffic]
|
||||||
loop_cover_traffic_average_delay = '{{ debug.cover_traffic.loop_cover_traffic_average_delay }}'
|
loop_cover_traffic_average_delay = '{{ debug.cover_traffic.loop_cover_traffic_average_delay }}'
|
||||||
|
|
||||||
[debug.stats_reporting]
|
|
||||||
enabled = {{ debug.stats_reporting.enabled }}
|
|
||||||
provider_address = '{{ debug.stats_reporting.provider_address }}'
|
|
||||||
reporting_interval = '{{ debug.stats_reporting.reporting_interval }}'
|
|
||||||
|
|
||||||
[debug.forget_me]
|
|
||||||
client = {{ debug.forget_me.client }}
|
|
||||||
stats = {{ debug.forget_me.stats }}
|
|
||||||
|
|
||||||
"#;
|
"#;
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ pub use nym_sphinx::addressing::clients::Recipient;
|
|||||||
|
|
||||||
pub mod config;
|
pub mod config;
|
||||||
|
|
||||||
type NativeClientBuilder = BaseClientBuilder<QueryHttpRpcNyxdClient, OnDiskPersistent>;
|
type NativeClientBuilder<'a> = BaseClientBuilder<'a, QueryHttpRpcNyxdClient, OnDiskPersistent>;
|
||||||
|
|
||||||
pub struct SocketClient {
|
pub struct SocketClient {
|
||||||
/// Client configuration options, including, among other things, packet sending rates,
|
/// Client configuration options, including, among other things, packet sending rates,
|
||||||
@@ -32,10 +32,6 @@ pub struct SocketClient {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl SocketClient {
|
impl SocketClient {
|
||||||
pub fn config(&self) -> Config {
|
|
||||||
self.config.clone()
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn new(config: Config, custom_mixnet: Option<PathBuf>) -> Self {
|
pub fn new(config: Config, custom_mixnet: Option<PathBuf>) -> Self {
|
||||||
SocketClient {
|
SocketClient {
|
||||||
config,
|
config,
|
||||||
@@ -49,7 +45,7 @@ impl SocketClient {
|
|||||||
client_output: ClientOutput,
|
client_output: ClientOutput,
|
||||||
client_state: ClientState,
|
client_state: ClientState,
|
||||||
self_address: &Recipient,
|
self_address: &Recipient,
|
||||||
task_client: nym_task::TaskClient,
|
shutdown: nym_task::TaskClient,
|
||||||
packet_type: PacketType,
|
packet_type: PacketType,
|
||||||
) {
|
) {
|
||||||
info!("Starting websocket listener...");
|
info!("Starting websocket listener...");
|
||||||
@@ -77,15 +73,10 @@ impl SocketClient {
|
|||||||
shared_lane_queue_lengths,
|
shared_lane_queue_lengths,
|
||||||
reply_controller_sender,
|
reply_controller_sender,
|
||||||
Some(packet_type),
|
Some(packet_type),
|
||||||
task_client.fork("websocket_handler"),
|
|
||||||
);
|
);
|
||||||
|
|
||||||
websocket::Listener::new(
|
websocket::Listener::new(config.socket.host, config.socket.listening_port)
|
||||||
config.socket.host,
|
.start(websocket_handler, shutdown);
|
||||||
config.socket.listening_port,
|
|
||||||
task_client.with_suffix("websocket_listener"),
|
|
||||||
)
|
|
||||||
.start(websocket_handler);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// blocking version of `start_socket` method. Will run forever (or until SIGINT is sent)
|
/// blocking version of `start_socket` method. Will run forever (or until SIGINT is sent)
|
||||||
@@ -117,9 +108,8 @@ impl SocketClient {
|
|||||||
let storage = self.initialise_storage().await?;
|
let storage = self.initialise_storage().await?;
|
||||||
let user_agent = nym_bin_common::bin_info!().into();
|
let user_agent = nym_bin_common::bin_info!().into();
|
||||||
|
|
||||||
let mut base_client =
|
let mut base_client = BaseClientBuilder::new(&self.config.base, storage, dkg_query_client)
|
||||||
BaseClientBuilder::new(self.config().base(), storage, dkg_query_client)
|
.with_user_agent(user_agent);
|
||||||
.with_user_agent(user_agent);
|
|
||||||
|
|
||||||
if let Some(custom_mixnet) = &self.custom_mixnet {
|
if let Some(custom_mixnet) = &self.custom_mixnet {
|
||||||
base_client = base_client.with_stored_topology(custom_mixnet)?;
|
base_client = base_client.with_stored_topology(custom_mixnet)?;
|
||||||
|
|||||||
@@ -1,16 +0,0 @@
|
|||||||
// Copyright 2024 - Nym Technologies SA <contact@nymtech.net>
|
|
||||||
// SPDX-License-Identifier: Apache-2.0
|
|
||||||
|
|
||||||
use crate::commands::CliNativeClient;
|
|
||||||
use crate::error::ClientError;
|
|
||||||
use nym_client_core::cli_helpers::client_import_coin_index_signatures::{
|
|
||||||
import_coin_index_signatures, CommonClientImportCoinIndexSignaturesArgs,
|
|
||||||
};
|
|
||||||
|
|
||||||
pub(crate) async fn execute(
|
|
||||||
args: CommonClientImportCoinIndexSignaturesArgs,
|
|
||||||
) -> Result<(), ClientError> {
|
|
||||||
import_coin_index_signatures::<CliNativeClient, _>(args).await?;
|
|
||||||
println!("successfully imported coin index signatures!");
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
// Copyright 2024 - Nym Technologies SA <contact@nymtech.net>
|
|
||||||
// SPDX-License-Identifier: Apache-2.0
|
|
||||||
|
|
||||||
use crate::commands::CliNativeClient;
|
|
||||||
use crate::error::ClientError;
|
|
||||||
use nym_client_core::cli_helpers::client_import_expiration_date_signatures::{
|
|
||||||
import_expiration_date_signatures, CommonClientImportExpirationDateSignaturesArgs,
|
|
||||||
};
|
|
||||||
|
|
||||||
pub(crate) async fn execute(
|
|
||||||
args: CommonClientImportExpirationDateSignaturesArgs,
|
|
||||||
) -> Result<(), ClientError> {
|
|
||||||
import_expiration_date_signatures::<CliNativeClient, _>(args).await?;
|
|
||||||
println!("successfully imported expiration date signatures!");
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
// Copyright 2024 - Nym Technologies SA <contact@nymtech.net>
|
|
||||||
// SPDX-License-Identifier: Apache-2.0
|
|
||||||
|
|
||||||
use crate::commands::CliNativeClient;
|
|
||||||
use crate::error::ClientError;
|
|
||||||
use nym_client_core::cli_helpers::client_import_master_verification_key::{
|
|
||||||
import_master_verification_key, CommonClientImportMasterVerificationKeyArgs,
|
|
||||||
};
|
|
||||||
|
|
||||||
pub(crate) async fn execute(
|
|
||||||
args: CommonClientImportMasterVerificationKeyArgs,
|
|
||||||
) -> Result<(), ClientError> {
|
|
||||||
import_master_verification_key::<CliNativeClient, _>(args).await?;
|
|
||||||
println!("successfully imported master verification key!");
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
@@ -1,59 +0,0 @@
|
|||||||
// Copyright 2024 - Nym Technologies SA <contact@nymtech.net>
|
|
||||||
// SPDX-License-Identifier: Apache-2.0
|
|
||||||
|
|
||||||
use clap::{Args, Subcommand};
|
|
||||||
use nym_client_core::cli_helpers::client_import_coin_index_signatures::CommonClientImportCoinIndexSignaturesArgs;
|
|
||||||
use nym_client_core::cli_helpers::client_import_credential::CommonClientImportTicketBookArgs;
|
|
||||||
use nym_client_core::cli_helpers::client_import_expiration_date_signatures::CommonClientImportExpirationDateSignaturesArgs;
|
|
||||||
use nym_client_core::cli_helpers::client_import_master_verification_key::CommonClientImportMasterVerificationKeyArgs;
|
|
||||||
use std::error::Error;
|
|
||||||
|
|
||||||
pub(crate) mod import_coin_index_signatures;
|
|
||||||
pub(crate) mod import_credential;
|
|
||||||
pub(crate) mod import_expiration_date_signatures;
|
|
||||||
pub(crate) mod import_master_verification_key;
|
|
||||||
pub(crate) mod show_ticketbooks;
|
|
||||||
|
|
||||||
#[derive(Args)]
|
|
||||||
#[clap(args_conflicts_with_subcommands = true, subcommand_required = true)]
|
|
||||||
pub struct Ecash {
|
|
||||||
#[clap(subcommand)]
|
|
||||||
pub command: EcashCommands,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Ecash {
|
|
||||||
pub async fn execute(self) -> Result<(), Box<dyn Error + Send + Sync>> {
|
|
||||||
match self.command {
|
|
||||||
EcashCommands::ShowTicketBooks(args) => show_ticketbooks::execute(args).await?,
|
|
||||||
EcashCommands::ImportTicketBook(args) => import_credential::execute(args).await?,
|
|
||||||
EcashCommands::ImportCoinIndexSignatures(args) => {
|
|
||||||
import_coin_index_signatures::execute(args).await?
|
|
||||||
}
|
|
||||||
EcashCommands::ImportExpirationDateSignatures(args) => {
|
|
||||||
import_expiration_date_signatures::execute(args).await?
|
|
||||||
}
|
|
||||||
EcashCommands::ImportMasterVerificationKey(args) => {
|
|
||||||
import_master_verification_key::execute(args).await?
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Subcommand)]
|
|
||||||
pub enum EcashCommands {
|
|
||||||
/// Display information associated with the imported ticketbooks,
|
|
||||||
ShowTicketBooks(show_ticketbooks::Args),
|
|
||||||
|
|
||||||
/// Import a pre-generated ticketbook
|
|
||||||
ImportTicketBook(CommonClientImportTicketBookArgs),
|
|
||||||
|
|
||||||
/// Import coin index signatures needed for ticketbooks
|
|
||||||
ImportCoinIndexSignatures(CommonClientImportCoinIndexSignaturesArgs),
|
|
||||||
|
|
||||||
/// Import expiration date signatures needed for ticketbooks
|
|
||||||
ImportExpirationDateSignatures(CommonClientImportExpirationDateSignaturesArgs),
|
|
||||||
|
|
||||||
/// Import master verification key needed for ticketbooks
|
|
||||||
ImportMasterVerificationKey(CommonClientImportMasterVerificationKeyArgs),
|
|
||||||
}
|
|
||||||
+2
-2
@@ -4,10 +4,10 @@
|
|||||||
use crate::commands::CliNativeClient;
|
use crate::commands::CliNativeClient;
|
||||||
use crate::error::ClientError;
|
use crate::error::ClientError;
|
||||||
use nym_client_core::cli_helpers::client_import_credential::{
|
use nym_client_core::cli_helpers::client_import_credential::{
|
||||||
import_credential, CommonClientImportTicketBookArgs,
|
import_credential, CommonClientImportCredentialArgs,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub(crate) async fn execute(args: CommonClientImportTicketBookArgs) -> Result<(), ClientError> {
|
pub(crate) async fn execute(args: CommonClientImportCredentialArgs) -> Result<(), ClientError> {
|
||||||
import_credential::<CliNativeClient, _>(args).await?;
|
import_credential::<CliNativeClient, _>(args).await?;
|
||||||
println!("successfully imported credential!");
|
println!("successfully imported credential!");
|
||||||
Ok(())
|
Ok(())
|
||||||
@@ -81,8 +81,6 @@ impl From<Init> for OverrideConfig {
|
|||||||
|
|
||||||
nyxd_urls: init_config.common_args.nyxd_urls,
|
nyxd_urls: init_config.common_args.nyxd_urls,
|
||||||
enabled_credentials_mode: init_config.common_args.enabled_credentials_mode,
|
enabled_credentials_mode: init_config.common_args.enabled_credentials_mode,
|
||||||
stats_reporting_address: init_config.common_args.stats_reporting_address,
|
|
||||||
forget_me: init_config.common_args.forget_me.into(),
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,17 +6,15 @@ use crate::client::config::old_config_v1_1_20::ConfigV1_1_20;
|
|||||||
use crate::client::config::old_config_v1_1_20_2::ConfigV1_1_20_2;
|
use crate::client::config::old_config_v1_1_20_2::ConfigV1_1_20_2;
|
||||||
use crate::client::config::old_config_v1_1_33::ConfigV1_1_33;
|
use crate::client::config::old_config_v1_1_33::ConfigV1_1_33;
|
||||||
use crate::client::config::{BaseClientConfig, Config};
|
use crate::client::config::{BaseClientConfig, Config};
|
||||||
use crate::commands::ecash::Ecash;
|
|
||||||
use crate::error::ClientError;
|
use crate::error::ClientError;
|
||||||
use clap::CommandFactory;
|
use clap::CommandFactory;
|
||||||
use clap::{Parser, Subcommand};
|
use clap::{Parser, Subcommand};
|
||||||
use log::{error, info};
|
use log::{error, info};
|
||||||
use nym_bin_common::bin_info;
|
use nym_bin_common::bin_info;
|
||||||
use nym_bin_common::completions::{fig_generate, ArgShell};
|
use nym_bin_common::completions::{fig_generate, ArgShell};
|
||||||
use nym_client::client::Recipient;
|
use nym_client_core::cli_helpers::client_import_credential::CommonClientImportCredentialArgs;
|
||||||
use nym_client_core::cli_helpers::CliClient;
|
use nym_client_core::cli_helpers::CliClient;
|
||||||
use nym_client_core::client::base_client::storage::migration_helpers::v1_1_33;
|
use nym_client_core::client::base_client::storage::migration_helpers::v1_1_33;
|
||||||
use nym_client_core::config::ForgetMe;
|
|
||||||
use nym_config::OptionalSet;
|
use nym_config::OptionalSet;
|
||||||
use std::error::Error;
|
use std::error::Error;
|
||||||
use std::net::IpAddr;
|
use std::net::IpAddr;
|
||||||
@@ -24,10 +22,11 @@ use std::sync::OnceLock;
|
|||||||
|
|
||||||
mod add_gateway;
|
mod add_gateway;
|
||||||
pub(crate) mod build_info;
|
pub(crate) mod build_info;
|
||||||
pub(crate) mod ecash;
|
pub(crate) mod import_credential;
|
||||||
pub(crate) mod init;
|
pub(crate) mod init;
|
||||||
mod list_gateways;
|
mod list_gateways;
|
||||||
pub(crate) mod run;
|
pub(crate) mod run;
|
||||||
|
mod show_ticketbooks;
|
||||||
mod switch_gateway;
|
mod switch_gateway;
|
||||||
|
|
||||||
pub(crate) struct CliNativeClient;
|
pub(crate) struct CliNativeClient;
|
||||||
@@ -74,8 +73,8 @@ pub(crate) enum Commands {
|
|||||||
/// Run the Nym client with provided configuration client optionally overriding set parameters
|
/// Run the Nym client with provided configuration client optionally overriding set parameters
|
||||||
Run(run::Run),
|
Run(run::Run),
|
||||||
|
|
||||||
/// Ecash-related functionalities
|
/// Import a pre-generated credential
|
||||||
Ecash(Ecash),
|
ImportCredential(CommonClientImportCredentialArgs),
|
||||||
|
|
||||||
/// List all registered with gateways
|
/// List all registered with gateways
|
||||||
ListGateways(list_gateways::Args),
|
ListGateways(list_gateways::Args),
|
||||||
@@ -86,6 +85,9 @@ pub(crate) enum Commands {
|
|||||||
/// Change the currently active gateway. Note that you must have already registered with the new gateway!
|
/// Change the currently active gateway. Note that you must have already registered with the new gateway!
|
||||||
SwitchGateway(switch_gateway::Args),
|
SwitchGateway(switch_gateway::Args),
|
||||||
|
|
||||||
|
/// Display information associated with the imported ticketbooks,
|
||||||
|
ShowTicketbooks(show_ticketbooks::Args),
|
||||||
|
|
||||||
/// Show build information of this binary
|
/// Show build information of this binary
|
||||||
BuildInfo(build_info::BuildInfo),
|
BuildInfo(build_info::BuildInfo),
|
||||||
|
|
||||||
@@ -106,8 +108,6 @@ pub(crate) struct OverrideConfig {
|
|||||||
no_cover: bool,
|
no_cover: bool,
|
||||||
nyxd_urls: Option<Vec<url::Url>>,
|
nyxd_urls: Option<Vec<url::Url>>,
|
||||||
enabled_credentials_mode: Option<bool>,
|
enabled_credentials_mode: Option<bool>,
|
||||||
stats_reporting_address: Option<Recipient>,
|
|
||||||
forget_me: ForgetMe,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) async fn execute(args: Cli) -> Result<(), Box<dyn Error + Send + Sync>> {
|
pub(crate) async fn execute(args: Cli) -> Result<(), Box<dyn Error + Send + Sync>> {
|
||||||
@@ -116,10 +116,11 @@ pub(crate) async fn execute(args: Cli) -> Result<(), Box<dyn Error + Send + Sync
|
|||||||
match args.command {
|
match args.command {
|
||||||
Commands::Init(m) => init::execute(m).await?,
|
Commands::Init(m) => init::execute(m).await?,
|
||||||
Commands::Run(m) => run::execute(m).await?,
|
Commands::Run(m) => run::execute(m).await?,
|
||||||
Commands::Ecash(ecash) => ecash.execute().await?,
|
Commands::ImportCredential(m) => import_credential::execute(m).await?,
|
||||||
Commands::ListGateways(args) => list_gateways::execute(args).await?,
|
Commands::ListGateways(args) => list_gateways::execute(args).await?,
|
||||||
Commands::AddGateway(args) => add_gateway::execute(args).await?,
|
Commands::AddGateway(args) => add_gateway::execute(args).await?,
|
||||||
Commands::SwitchGateway(args) => switch_gateway::execute(args).await?,
|
Commands::SwitchGateway(args) => switch_gateway::execute(args).await?,
|
||||||
|
Commands::ShowTicketbooks(args) => show_ticketbooks::execute(args).await?,
|
||||||
Commands::BuildInfo(m) => build_info::execute(m),
|
Commands::BuildInfo(m) => build_info::execute(m),
|
||||||
Commands::Completions(s) => s.generate(&mut Cli::command(), bin_name),
|
Commands::Completions(s) => s.generate(&mut Cli::command(), bin_name),
|
||||||
Commands::GenerateFigSpec => fig_generate(&mut Cli::command(), bin_name),
|
Commands::GenerateFigSpec => fig_generate(&mut Cli::command(), bin_name),
|
||||||
@@ -135,7 +136,6 @@ pub(crate) fn override_config(config: Config, args: OverrideConfig) -> Config {
|
|||||||
args.fastmode,
|
args.fastmode,
|
||||||
)
|
)
|
||||||
.with_base(BaseClientConfig::with_disabled_cover_traffic, args.no_cover)
|
.with_base(BaseClientConfig::with_disabled_cover_traffic, args.no_cover)
|
||||||
.with_base(BaseClientConfig::with_forget_me, args.forget_me)
|
|
||||||
.with_optional(Config::with_port, args.port)
|
.with_optional(Config::with_port, args.port)
|
||||||
.with_optional(Config::with_host, args.host)
|
.with_optional(Config::with_host, args.host)
|
||||||
.with_optional_custom_env_ext(
|
.with_optional_custom_env_ext(
|
||||||
@@ -154,11 +154,6 @@ pub(crate) fn override_config(config: Config, args: OverrideConfig) -> Config {
|
|||||||
BaseClientConfig::with_disabled_credentials,
|
BaseClientConfig::with_disabled_credentials,
|
||||||
args.enabled_credentials_mode.map(|b| !b),
|
args.enabled_credentials_mode.map(|b| !b),
|
||||||
)
|
)
|
||||||
.with_optional_env_ext(
|
|
||||||
BaseClientConfig::with_enabled_stats_reporting_address,
|
|
||||||
args.stats_reporting_address,
|
|
||||||
nym_network_defaults::var_names::CLIENT_STATS_COLLECTION_PROVIDER,
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn try_upgrade_v1_1_13_config(id: &str) -> Result<bool, ClientError> {
|
async fn try_upgrade_v1_1_13_config(id: &str) -> Result<bool, ClientError> {
|
||||||
|
|||||||
@@ -3,10 +3,13 @@
|
|||||||
|
|
||||||
use crate::commands::try_load_current_config;
|
use crate::commands::try_load_current_config;
|
||||||
use crate::{
|
use crate::{
|
||||||
client::SocketClient,
|
client::{config::Config, SocketClient},
|
||||||
commands::{override_config, OverrideConfig},
|
commands::{override_config, OverrideConfig},
|
||||||
|
error::ClientError,
|
||||||
};
|
};
|
||||||
use clap::Args;
|
use clap::Args;
|
||||||
|
use log::*;
|
||||||
|
use nym_bin_common::version_checker::is_minor_version_compatible;
|
||||||
use nym_client_core::cli_helpers::client_run::CommonClientRunArgs;
|
use nym_client_core::cli_helpers::client_run::CommonClientRunArgs;
|
||||||
use std::error::Error;
|
use std::error::Error;
|
||||||
use std::net::IpAddr;
|
use std::net::IpAddr;
|
||||||
@@ -40,8 +43,25 @@ impl From<Run> for OverrideConfig {
|
|||||||
no_cover: run_config.common_args.no_cover,
|
no_cover: run_config.common_args.no_cover,
|
||||||
nyxd_urls: run_config.common_args.nyxd_urls,
|
nyxd_urls: run_config.common_args.nyxd_urls,
|
||||||
enabled_credentials_mode: run_config.common_args.enabled_credentials_mode,
|
enabled_credentials_mode: run_config.common_args.enabled_credentials_mode,
|
||||||
stats_reporting_address: run_config.common_args.stats_reporting_address,
|
}
|
||||||
forget_me: run_config.common_args.forget_me.into(),
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// this only checks compatibility between config the binary. It does not take into consideration
|
||||||
|
// network version. It might do so in the future.
|
||||||
|
fn version_check(cfg: &Config) -> bool {
|
||||||
|
let binary_version = env!("CARGO_PKG_VERSION");
|
||||||
|
let config_version = &cfg.base.client.version;
|
||||||
|
if binary_version == config_version {
|
||||||
|
true
|
||||||
|
} else {
|
||||||
|
warn!("The native-client binary has different version than what is specified in config file! {} and {}", binary_version, config_version);
|
||||||
|
if is_minor_version_compatible(binary_version, config_version) {
|
||||||
|
info!("but they are still semver compatible. However, consider running the `upgrade` command");
|
||||||
|
true
|
||||||
|
} else {
|
||||||
|
error!("and they are semver incompatible! - please run the `upgrade` command before attempting `run` again");
|
||||||
|
false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -52,6 +72,11 @@ pub(crate) async fn execute(args: Run) -> Result<(), Box<dyn Error + Send + Sync
|
|||||||
let mut config = try_load_current_config(&args.common_args.id).await?;
|
let mut config = try_load_current_config(&args.common_args.id).await?;
|
||||||
config = override_config(config, OverrideConfig::from(args.clone()));
|
config = override_config(config, OverrideConfig::from(args.clone()));
|
||||||
|
|
||||||
|
if !version_check(&config) {
|
||||||
|
error!("failed the local version check");
|
||||||
|
return Err(Box::new(ClientError::FailedLocalVersionCheck));
|
||||||
|
}
|
||||||
|
|
||||||
SocketClient::new(config, args.common_args.custom_mixnet)
|
SocketClient::new(config, args.common_args.custom_mixnet)
|
||||||
.run_socket_forever()
|
.run_socket_forever()
|
||||||
.await
|
.await
|
||||||
|
|||||||
@@ -17,6 +17,9 @@ pub enum ClientError {
|
|||||||
#[error("Failed to validate the loaded config")]
|
#[error("Failed to validate the loaded config")]
|
||||||
ConfigValidationFailure,
|
ConfigValidationFailure,
|
||||||
|
|
||||||
|
#[error("Failed local version check, client and config mismatch")]
|
||||||
|
FailedLocalVersionCheck,
|
||||||
|
|
||||||
#[error("Attempted to start the client in invalid socket mode")]
|
#[error("Attempted to start the client in invalid socket mode")]
|
||||||
InvalidSocketMode,
|
InvalidSocketMode,
|
||||||
|
|
||||||
|
|||||||
@@ -19,7 +19,6 @@ use nym_sphinx::receiver::ReconstructedMessage;
|
|||||||
use nym_task::connections::{
|
use nym_task::connections::{
|
||||||
ConnectionCommand, ConnectionCommandSender, ConnectionId, LaneQueueLengths, TransmissionLane,
|
ConnectionCommand, ConnectionCommandSender, ConnectionId, LaneQueueLengths, TransmissionLane,
|
||||||
};
|
};
|
||||||
use nym_task::TaskClient;
|
|
||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
use tokio::net::TcpStream;
|
use tokio::net::TcpStream;
|
||||||
use tokio::time::Instant;
|
use tokio::time::Instant;
|
||||||
@@ -44,11 +43,9 @@ pub(crate) struct HandlerBuilder {
|
|||||||
lane_queue_lengths: LaneQueueLengths,
|
lane_queue_lengths: LaneQueueLengths,
|
||||||
reply_controller_sender: ReplyControllerSender,
|
reply_controller_sender: ReplyControllerSender,
|
||||||
packet_type: Option<PacketType>,
|
packet_type: Option<PacketType>,
|
||||||
task_client: TaskClient,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl HandlerBuilder {
|
impl HandlerBuilder {
|
||||||
#[allow(clippy::too_many_arguments)]
|
|
||||||
pub(crate) fn new(
|
pub(crate) fn new(
|
||||||
msg_input: InputMessageSender,
|
msg_input: InputMessageSender,
|
||||||
client_connection_tx: ConnectionCommandSender,
|
client_connection_tx: ConnectionCommandSender,
|
||||||
@@ -57,7 +54,6 @@ impl HandlerBuilder {
|
|||||||
lane_queue_lengths: LaneQueueLengths,
|
lane_queue_lengths: LaneQueueLengths,
|
||||||
reply_controller_sender: ReplyControllerSender,
|
reply_controller_sender: ReplyControllerSender,
|
||||||
packet_type: Option<PacketType>,
|
packet_type: Option<PacketType>,
|
||||||
task_client: TaskClient,
|
|
||||||
) -> Self {
|
) -> Self {
|
||||||
Self {
|
Self {
|
||||||
msg_input,
|
msg_input,
|
||||||
@@ -67,14 +63,11 @@ impl HandlerBuilder {
|
|||||||
lane_queue_lengths,
|
lane_queue_lengths,
|
||||||
reply_controller_sender,
|
reply_controller_sender,
|
||||||
packet_type,
|
packet_type,
|
||||||
task_client,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: make sure we only ever have one active handler
|
// TODO: make sure we only ever have one active handler
|
||||||
pub fn create_active_handler(&self) -> Handler {
|
pub fn create_active_handler(&self) -> Handler {
|
||||||
let mut task_client = self.task_client.fork("active_handler");
|
|
||||||
task_client.disarm();
|
|
||||||
Handler {
|
Handler {
|
||||||
msg_input: self.msg_input.clone(),
|
msg_input: self.msg_input.clone(),
|
||||||
client_connection_tx: self.client_connection_tx.clone(),
|
client_connection_tx: self.client_connection_tx.clone(),
|
||||||
@@ -85,7 +78,6 @@ impl HandlerBuilder {
|
|||||||
lane_queue_lengths: self.lane_queue_lengths.clone(),
|
lane_queue_lengths: self.lane_queue_lengths.clone(),
|
||||||
reply_controller_sender: self.reply_controller_sender.clone(),
|
reply_controller_sender: self.reply_controller_sender.clone(),
|
||||||
packet_type: self.packet_type,
|
packet_type: self.packet_type,
|
||||||
task_client,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -100,18 +92,16 @@ pub(crate) struct Handler {
|
|||||||
lane_queue_lengths: LaneQueueLengths,
|
lane_queue_lengths: LaneQueueLengths,
|
||||||
reply_controller_sender: ReplyControllerSender,
|
reply_controller_sender: ReplyControllerSender,
|
||||||
packet_type: Option<PacketType>,
|
packet_type: Option<PacketType>,
|
||||||
task_client: TaskClient,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Drop for Handler {
|
impl Drop for Handler {
|
||||||
fn drop(&mut self) {
|
fn drop(&mut self) {
|
||||||
if let Err(err) = self
|
if self
|
||||||
.buffer_requester
|
.buffer_requester
|
||||||
.unbounded_send(ReceivedBufferMessage::ReceiverDisconnect)
|
.unbounded_send(ReceivedBufferMessage::ReceiverDisconnect)
|
||||||
|
.is_err()
|
||||||
{
|
{
|
||||||
if !self.task_client.is_shutdown_poll() {
|
error!("we failed to disconnect the receiver from the buffer! presumably the shutdown procedure has been initiated!")
|
||||||
error!("failed to disconnect the receiver from the buffer: {err}");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -135,23 +125,10 @@ impl Handler {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// get the number of pending replies waiting for reply surbs
|
// get the number of pending replies waiting for reply surbs
|
||||||
let reply_queue_length = match self
|
let reply_queue_length = self
|
||||||
.reply_controller_sender
|
.reply_controller_sender
|
||||||
.get_lane_queue_length(connection_id)
|
.get_lane_queue_length(connection_id)
|
||||||
.await
|
.await;
|
||||||
{
|
|
||||||
Ok(length) => length,
|
|
||||||
Err(err) => {
|
|
||||||
if !self.task_client.is_shutdown_poll() {
|
|
||||||
error!(
|
|
||||||
"Failed to get reply queue length for connection {connection_id}: {err}"
|
|
||||||
);
|
|
||||||
}
|
|
||||||
// We're just going to assume that the queue is empty, and I think that's okay
|
|
||||||
// during shutdown.
|
|
||||||
0
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
let queue_length = base_length + reply_queue_length;
|
let queue_length = base_length + reply_queue_length;
|
||||||
|
|
||||||
@@ -191,11 +168,10 @@ impl Handler {
|
|||||||
|
|
||||||
// the ack control is now responsible for chunking, etc.
|
// the ack control is now responsible for chunking, etc.
|
||||||
let input_msg = InputMessage::new_regular(recipient, message, lane, self.packet_type);
|
let input_msg = InputMessage::new_regular(recipient, message, lane, self.packet_type);
|
||||||
if let Err(err) = self.msg_input.send(input_msg).await {
|
self.msg_input
|
||||||
if !self.task_client.is_shutdown_poll() {
|
.send(input_msg)
|
||||||
error!("Failed to send message to the input buffer: {err}");
|
.await
|
||||||
}
|
.expect("InputMessageReceiver has stopped receiving!");
|
||||||
}
|
|
||||||
|
|
||||||
// Only reply back with a `LaneQueueLength` if the sender providided a connection id
|
// Only reply back with a `LaneQueueLength` if the sender providided a connection id
|
||||||
let TransmissionLane::ConnectionId(connection_id) = lane else {
|
let TransmissionLane::ConnectionId(connection_id) = lane else {
|
||||||
@@ -224,11 +200,10 @@ impl Handler {
|
|||||||
|
|
||||||
let input_msg =
|
let input_msg =
|
||||||
InputMessage::new_anonymous(recipient, message, reply_surbs, lane, self.packet_type);
|
InputMessage::new_anonymous(recipient, message, reply_surbs, lane, self.packet_type);
|
||||||
if let Err(err) = self.msg_input.send(input_msg).await {
|
self.msg_input
|
||||||
if !self.task_client.is_shutdown_poll() {
|
.send(input_msg)
|
||||||
error!("Failed to send anonymous message to the input buffer: {err}");
|
.await
|
||||||
}
|
.expect("InputMessageReceiver has stopped receiving!");
|
||||||
}
|
|
||||||
|
|
||||||
// Only reply back with a `LaneQueueLength` if the sender providided a connection id
|
// Only reply back with a `LaneQueueLength` if the sender providided a connection id
|
||||||
let TransmissionLane::ConnectionId(connection_id) = lane else {
|
let TransmissionLane::ConnectionId(connection_id) = lane else {
|
||||||
@@ -252,11 +227,10 @@ impl Handler {
|
|||||||
});
|
});
|
||||||
|
|
||||||
let input_msg = InputMessage::new_reply(recipient_tag, message, lane, self.packet_type);
|
let input_msg = InputMessage::new_reply(recipient_tag, message, lane, self.packet_type);
|
||||||
if let Err(err) = self.msg_input.send(input_msg).await {
|
self.msg_input
|
||||||
if !self.task_client.is_shutdown_poll() {
|
.send(input_msg)
|
||||||
error!("Failed to send reply message to the input buffer: {err}");
|
.await
|
||||||
}
|
.expect("InputMessageReceiver has stopped receiving!");
|
||||||
}
|
|
||||||
|
|
||||||
// Only reply back with a `LaneQueueLength` if the sender providided a connection id
|
// Only reply back with a `LaneQueueLength` if the sender providided a connection id
|
||||||
let TransmissionLane::ConnectionId(connection_id) = lane else {
|
let TransmissionLane::ConnectionId(connection_id) = lane else {
|
||||||
@@ -271,14 +245,9 @@ impl Handler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn handle_closed_connection(&self, connection_id: u64) -> Option<ServerResponse> {
|
fn handle_closed_connection(&self, connection_id: u64) -> Option<ServerResponse> {
|
||||||
if let Err(err) = self
|
self.client_connection_tx
|
||||||
.client_connection_tx
|
|
||||||
.unbounded_send(ConnectionCommand::Close(connection_id))
|
.unbounded_send(ConnectionCommand::Close(connection_id))
|
||||||
{
|
.unwrap();
|
||||||
if !self.task_client.is_shutdown_poll() {
|
|
||||||
error!("Failed to send close connection command: {err}");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -393,10 +362,11 @@ impl Handler {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn listen_for_requests(&mut self, mut msg_receiver: ReconstructedMessagesReceiver) {
|
async fn listen_for_requests(
|
||||||
let mut task_client = self.task_client.fork("select");
|
&mut self,
|
||||||
task_client.disarm();
|
mut msg_receiver: ReconstructedMessagesReceiver,
|
||||||
|
mut task_client: nym_task::TaskClient,
|
||||||
|
) {
|
||||||
while !task_client.is_shutdown() {
|
while !task_client.is_shutdown() {
|
||||||
tokio::select! {
|
tokio::select! {
|
||||||
// we can either get a client request from the websocket
|
// we can either get a client request from the websocket
|
||||||
@@ -445,7 +415,15 @@ impl Handler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// consume self to make sure `drop` is called after this is done
|
// consume self to make sure `drop` is called after this is done
|
||||||
pub(crate) async fn handle_connection(mut self, socket: TcpStream) {
|
pub(crate) async fn handle_connection(
|
||||||
|
mut self,
|
||||||
|
socket: TcpStream,
|
||||||
|
mut task_client: nym_task::TaskClient,
|
||||||
|
) {
|
||||||
|
// We don't want a crash in the connection handler to trigger a shutdown of the whole
|
||||||
|
// process.
|
||||||
|
task_client.disarm();
|
||||||
|
|
||||||
let ws_stream = match accept_async(socket).await {
|
let ws_stream = match accept_async(socket).await {
|
||||||
Ok(ws_stream) => ws_stream,
|
Ok(ws_stream) => ws_stream,
|
||||||
Err(err) => {
|
Err(err) => {
|
||||||
@@ -458,18 +436,14 @@ impl Handler {
|
|||||||
let (reconstructed_sender, reconstructed_receiver) = mpsc::unbounded();
|
let (reconstructed_sender, reconstructed_receiver) = mpsc::unbounded();
|
||||||
|
|
||||||
// tell the buffer to start sending stuff to us
|
// tell the buffer to start sending stuff to us
|
||||||
if let Err(err) =
|
self.buffer_requester
|
||||||
self.buffer_requester
|
.unbounded_send(ReceivedBufferMessage::ReceiverAnnounce(
|
||||||
.unbounded_send(ReceivedBufferMessage::ReceiverAnnounce(
|
reconstructed_sender,
|
||||||
reconstructed_sender,
|
))
|
||||||
))
|
.expect("the buffer request failed!");
|
||||||
{
|
|
||||||
if !self.task_client.is_shutdown_poll() {
|
|
||||||
error!("failed to announce the receiver to the buffer: {err}");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
self.listen_for_requests(reconstructed_receiver).await;
|
self.listen_for_requests(reconstructed_receiver, task_client)
|
||||||
|
.await;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,6 @@
|
|||||||
|
|
||||||
use super::handler::HandlerBuilder;
|
use super::handler::HandlerBuilder;
|
||||||
use log::*;
|
use log::*;
|
||||||
use nym_task::TaskClient;
|
|
||||||
use std::net::IpAddr;
|
use std::net::IpAddr;
|
||||||
use std::{net::SocketAddr, process, sync::Arc};
|
use std::{net::SocketAddr, process, sync::Arc};
|
||||||
use tokio::io::AsyncWriteExt;
|
use tokio::io::AsyncWriteExt;
|
||||||
@@ -23,19 +22,21 @@ impl State {
|
|||||||
pub(crate) struct Listener {
|
pub(crate) struct Listener {
|
||||||
address: SocketAddr,
|
address: SocketAddr,
|
||||||
state: State,
|
state: State,
|
||||||
task_client: TaskClient,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Listener {
|
impl Listener {
|
||||||
pub(crate) fn new(host: IpAddr, port: u16, task_client: TaskClient) -> Self {
|
pub(crate) fn new(host: IpAddr, port: u16) -> Self {
|
||||||
Listener {
|
Listener {
|
||||||
address: SocketAddr::new(host, port),
|
address: SocketAddr::new(host, port),
|
||||||
state: State::AwaitingConnection,
|
state: State::AwaitingConnection,
|
||||||
task_client,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) async fn run(&mut self, handler: HandlerBuilder) {
|
pub(crate) async fn run(
|
||||||
|
&mut self,
|
||||||
|
handler: HandlerBuilder,
|
||||||
|
mut task_client: nym_task::TaskClient,
|
||||||
|
) {
|
||||||
let tcp_listener = match tokio::net::TcpListener::bind(self.address).await {
|
let tcp_listener = match tokio::net::TcpListener::bind(self.address).await {
|
||||||
Ok(listener) => listener,
|
Ok(listener) => listener,
|
||||||
Err(err) => {
|
Err(err) => {
|
||||||
@@ -46,11 +47,11 @@ impl Listener {
|
|||||||
|
|
||||||
let notify = Arc::new(Notify::new());
|
let notify = Arc::new(Notify::new());
|
||||||
|
|
||||||
while !self.task_client.is_shutdown() {
|
loop {
|
||||||
tokio::select! {
|
tokio::select! {
|
||||||
// When the handler finishes we check if shutdown is signalled
|
// When the handler finishes we check if shutdown is signalled
|
||||||
_ = notify.notified() => {
|
_ = notify.notified() => {
|
||||||
if self.task_client.is_shutdown() {
|
if task_client.is_shutdown() {
|
||||||
log::trace!("Websocket listener: detected shutdown after connection closed");
|
log::trace!("Websocket listener: detected shutdown after connection closed");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -59,7 +60,7 @@ impl Listener {
|
|||||||
}
|
}
|
||||||
// ... but when there is no connected client at the time of shutdown being
|
// ... but when there is no connected client at the time of shutdown being
|
||||||
// signalled, we handle it here.
|
// signalled, we handle it here.
|
||||||
_ = self.task_client.recv() => {
|
_ = task_client.recv() => {
|
||||||
if !self.state.is_connected() {
|
if !self.state.is_connected() {
|
||||||
log::trace!("Not connected: shutting down");
|
log::trace!("Not connected: shutting down");
|
||||||
break;
|
break;
|
||||||
@@ -87,8 +88,9 @@ impl Listener {
|
|||||||
// hanging because the executor doesn't come back here
|
// hanging because the executor doesn't come back here
|
||||||
let notify_clone = Arc::clone(¬ify);
|
let notify_clone = Arc::clone(¬ify);
|
||||||
let fresh_handler = handler.create_active_handler();
|
let fresh_handler = handler.create_active_handler();
|
||||||
|
let task_client_handler = task_client.clone();
|
||||||
tokio::spawn(async move {
|
tokio::spawn(async move {
|
||||||
fresh_handler.handle_connection(socket).await;
|
fresh_handler.handle_connection(socket, task_client_handler).await;
|
||||||
notify_clone.notify_one();
|
notify_clone.notify_one();
|
||||||
});
|
});
|
||||||
self.state = State::Connected;
|
self.state = State::Connected;
|
||||||
@@ -102,9 +104,13 @@ impl Listener {
|
|||||||
log::debug!("Websocket listener: Exiting");
|
log::debug!("Websocket listener: Exiting");
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn start(mut self, handler: HandlerBuilder) -> JoinHandle<()> {
|
pub(crate) fn start(
|
||||||
|
mut self,
|
||||||
|
handler: HandlerBuilder,
|
||||||
|
shutdown: nym_task::TaskClient,
|
||||||
|
) -> JoinHandle<()> {
|
||||||
info!("Running websocket on {:?}", self.address.to_string());
|
info!("Running websocket on {:?}", self.address.to_string());
|
||||||
|
|
||||||
tokio::spawn(async move { self.run(handler).await })
|
tokio::spawn(async move { self.run(handler, shutdown).await })
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "nym-socks5-client"
|
name = "nym-socks5-client"
|
||||||
version = "1.1.49"
|
version = "1.1.39"
|
||||||
authors = ["Dave Hrycyszyn <futurechimp@users.noreply.github.com>"]
|
authors = ["Dave Hrycyszyn <futurechimp@users.noreply.github.com>"]
|
||||||
description = "A SOCKS5 localhost proxy that converts incoming messages to Sphinx and sends them to a Nym address"
|
description = "A SOCKS5 localhost proxy that converts incoming messages to Sphinx and sends them to a Nym address"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
|
|||||||
@@ -1,16 +0,0 @@
|
|||||||
// Copyright 2024 - Nym Technologies SA <contact@nymtech.net>
|
|
||||||
// SPDX-License-Identifier: Apache-2.0
|
|
||||||
|
|
||||||
use crate::commands::CliSocks5Client;
|
|
||||||
use crate::error::Socks5ClientError;
|
|
||||||
use nym_client_core::cli_helpers::client_import_coin_index_signatures::{
|
|
||||||
import_coin_index_signatures, CommonClientImportCoinIndexSignaturesArgs,
|
|
||||||
};
|
|
||||||
|
|
||||||
pub(crate) async fn execute(
|
|
||||||
args: CommonClientImportCoinIndexSignaturesArgs,
|
|
||||||
) -> Result<(), Socks5ClientError> {
|
|
||||||
import_coin_index_signatures::<CliSocks5Client, _>(args).await?;
|
|
||||||
println!("successfully imported coin index signatures!");
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
// Copyright 2024 - Nym Technologies SA <contact@nymtech.net>
|
|
||||||
// SPDX-License-Identifier: Apache-2.0
|
|
||||||
|
|
||||||
use crate::commands::CliSocks5Client;
|
|
||||||
use crate::error::Socks5ClientError;
|
|
||||||
use nym_client_core::cli_helpers::client_import_expiration_date_signatures::{
|
|
||||||
import_expiration_date_signatures, CommonClientImportExpirationDateSignaturesArgs,
|
|
||||||
};
|
|
||||||
|
|
||||||
pub(crate) async fn execute(
|
|
||||||
args: CommonClientImportExpirationDateSignaturesArgs,
|
|
||||||
) -> Result<(), Socks5ClientError> {
|
|
||||||
import_expiration_date_signatures::<CliSocks5Client, _>(args).await?;
|
|
||||||
println!("successfully imported expiration date signatures!");
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
// Copyright 2024 - Nym Technologies SA <contact@nymtech.net>
|
|
||||||
// SPDX-License-Identifier: Apache-2.0
|
|
||||||
|
|
||||||
use crate::commands::CliSocks5Client;
|
|
||||||
use crate::error::Socks5ClientError;
|
|
||||||
use nym_client_core::cli_helpers::client_import_master_verification_key::{
|
|
||||||
import_master_verification_key, CommonClientImportMasterVerificationKeyArgs,
|
|
||||||
};
|
|
||||||
|
|
||||||
pub(crate) async fn execute(
|
|
||||||
args: CommonClientImportMasterVerificationKeyArgs,
|
|
||||||
) -> Result<(), Socks5ClientError> {
|
|
||||||
import_master_verification_key::<CliSocks5Client, _>(args).await?;
|
|
||||||
println!("successfully imported master verification key!");
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
@@ -1,59 +0,0 @@
|
|||||||
// Copyright 2024 - Nym Technologies SA <contact@nymtech.net>
|
|
||||||
// SPDX-License-Identifier: Apache-2.0
|
|
||||||
|
|
||||||
use clap::{Args, Subcommand};
|
|
||||||
use nym_client_core::cli_helpers::client_import_coin_index_signatures::CommonClientImportCoinIndexSignaturesArgs;
|
|
||||||
use nym_client_core::cli_helpers::client_import_credential::CommonClientImportTicketBookArgs;
|
|
||||||
use nym_client_core::cli_helpers::client_import_expiration_date_signatures::CommonClientImportExpirationDateSignaturesArgs;
|
|
||||||
use nym_client_core::cli_helpers::client_import_master_verification_key::CommonClientImportMasterVerificationKeyArgs;
|
|
||||||
use std::error::Error;
|
|
||||||
|
|
||||||
pub(crate) mod import_coin_index_signatures;
|
|
||||||
pub(crate) mod import_credential;
|
|
||||||
pub(crate) mod import_expiration_date_signatures;
|
|
||||||
pub(crate) mod import_master_verification_key;
|
|
||||||
pub(crate) mod show_ticketbooks;
|
|
||||||
|
|
||||||
#[derive(Args)]
|
|
||||||
#[clap(args_conflicts_with_subcommands = true, subcommand_required = true)]
|
|
||||||
pub struct Ecash {
|
|
||||||
#[clap(subcommand)]
|
|
||||||
pub command: EcashCommands,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Ecash {
|
|
||||||
pub async fn execute(self) -> Result<(), Box<dyn Error + Send + Sync>> {
|
|
||||||
match self.command {
|
|
||||||
EcashCommands::ShowTicketBooks(args) => show_ticketbooks::execute(args).await?,
|
|
||||||
EcashCommands::ImportTicketBook(args) => import_credential::execute(args).await?,
|
|
||||||
EcashCommands::ImportCoinIndexSignatures(args) => {
|
|
||||||
import_coin_index_signatures::execute(args).await?
|
|
||||||
}
|
|
||||||
EcashCommands::ImportExpirationDateSignatures(args) => {
|
|
||||||
import_expiration_date_signatures::execute(args).await?
|
|
||||||
}
|
|
||||||
EcashCommands::ImportMasterVerificationKey(args) => {
|
|
||||||
import_master_verification_key::execute(args).await?
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Subcommand)]
|
|
||||||
pub enum EcashCommands {
|
|
||||||
/// Display information associated with the imported ticketbooks,
|
|
||||||
ShowTicketBooks(show_ticketbooks::Args),
|
|
||||||
|
|
||||||
/// Import a pre-generated ticketbook
|
|
||||||
ImportTicketBook(CommonClientImportTicketBookArgs),
|
|
||||||
|
|
||||||
/// Import coin index signatures needed for ticketbooks
|
|
||||||
ImportCoinIndexSignatures(CommonClientImportCoinIndexSignaturesArgs),
|
|
||||||
|
|
||||||
/// Import expiration date signatures needed for ticketbooks
|
|
||||||
ImportExpirationDateSignatures(CommonClientImportExpirationDateSignaturesArgs),
|
|
||||||
|
|
||||||
/// Import master verification key needed for ticketbooks
|
|
||||||
ImportMasterVerificationKey(CommonClientImportMasterVerificationKeyArgs),
|
|
||||||
}
|
|
||||||
+4
-2
@@ -4,10 +4,12 @@
|
|||||||
use crate::commands::CliSocks5Client;
|
use crate::commands::CliSocks5Client;
|
||||||
use crate::error::Socks5ClientError;
|
use crate::error::Socks5ClientError;
|
||||||
use nym_client_core::cli_helpers::client_import_credential::{
|
use nym_client_core::cli_helpers::client_import_credential::{
|
||||||
import_credential, CommonClientImportTicketBookArgs,
|
import_credential, CommonClientImportCredentialArgs,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub async fn execute(args: CommonClientImportTicketBookArgs) -> Result<(), Socks5ClientError> {
|
pub(crate) async fn execute(
|
||||||
|
args: CommonClientImportCredentialArgs,
|
||||||
|
) -> Result<(), Socks5ClientError> {
|
||||||
import_credential::<CliSocks5Client, _>(args).await?;
|
import_credential::<CliSocks5Client, _>(args).await?;
|
||||||
println!("successfully imported credential!");
|
println!("successfully imported credential!");
|
||||||
Ok(())
|
Ok(())
|
||||||
@@ -92,8 +92,6 @@ impl From<Init> for OverrideConfig {
|
|||||||
nyxd_urls: init_config.common_args.nyxd_urls,
|
nyxd_urls: init_config.common_args.nyxd_urls,
|
||||||
enabled_credentials_mode: init_config.common_args.enabled_credentials_mode,
|
enabled_credentials_mode: init_config.common_args.enabled_credentials_mode,
|
||||||
outfox: false,
|
outfox: false,
|
||||||
stats_reporting_address: init_config.common_args.stats_reporting_address,
|
|
||||||
forget_me: init_config.common_args.forget_me.into(),
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
// Copyright 2021-2023 - Nym Technologies SA <contact@nymtech.net>
|
// Copyright 2021-2023 - Nym Technologies SA <contact@nymtech.net>
|
||||||
// SPDX-License-Identifier: Apache-2.0
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
use crate::commands::ecash::Ecash;
|
|
||||||
use crate::config::old_config_v1_1_13::OldConfigV1_1_13;
|
use crate::config::old_config_v1_1_13::OldConfigV1_1_13;
|
||||||
use crate::config::old_config_v1_1_20::ConfigV1_1_20;
|
use crate::config::old_config_v1_1_20::ConfigV1_1_20;
|
||||||
use crate::config::old_config_v1_1_20_2::ConfigV1_1_20_2;
|
use crate::config::old_config_v1_1_20_2::ConfigV1_1_20_2;
|
||||||
@@ -14,12 +13,12 @@ use clap::{Parser, Subcommand};
|
|||||||
use log::{error, info};
|
use log::{error, info};
|
||||||
use nym_bin_common::bin_info;
|
use nym_bin_common::bin_info;
|
||||||
use nym_bin_common::completions::{fig_generate, ArgShell};
|
use nym_bin_common::completions::{fig_generate, ArgShell};
|
||||||
|
use nym_client_core::cli_helpers::client_import_credential::CommonClientImportCredentialArgs;
|
||||||
use nym_client_core::cli_helpers::CliClient;
|
use nym_client_core::cli_helpers::CliClient;
|
||||||
use nym_client_core::client::base_client::storage::migration_helpers::v1_1_33;
|
use nym_client_core::client::base_client::storage::migration_helpers::v1_1_33;
|
||||||
use nym_client_core::client::topology_control::geo_aware_provider::CountryGroup;
|
use nym_client_core::client::topology_control::geo_aware_provider::CountryGroup;
|
||||||
use nym_client_core::config::{ForgetMe, GroupBy, TopologyStructure};
|
use nym_client_core::config::{GroupBy, TopologyStructure};
|
||||||
use nym_config::OptionalSet;
|
use nym_config::OptionalSet;
|
||||||
use nym_sphinx::addressing::Recipient;
|
|
||||||
use nym_sphinx::params::{PacketSize, PacketType};
|
use nym_sphinx::params::{PacketSize, PacketType};
|
||||||
use std::error::Error;
|
use std::error::Error;
|
||||||
use std::net::IpAddr;
|
use std::net::IpAddr;
|
||||||
@@ -27,10 +26,11 @@ use std::sync::OnceLock;
|
|||||||
|
|
||||||
mod add_gateway;
|
mod add_gateway;
|
||||||
pub(crate) mod build_info;
|
pub(crate) mod build_info;
|
||||||
pub mod ecash;
|
mod import_credential;
|
||||||
pub mod init;
|
pub mod init;
|
||||||
mod list_gateways;
|
mod list_gateways;
|
||||||
pub(crate) mod run;
|
pub(crate) mod run;
|
||||||
|
mod show_ticketbooks;
|
||||||
mod switch_gateway;
|
mod switch_gateway;
|
||||||
|
|
||||||
pub(crate) struct CliSocks5Client;
|
pub(crate) struct CliSocks5Client;
|
||||||
@@ -77,8 +77,8 @@ pub(crate) enum Commands {
|
|||||||
/// Run the Nym client with provided configuration client optionally overriding set parameters
|
/// Run the Nym client with provided configuration client optionally overriding set parameters
|
||||||
Run(run::Run),
|
Run(run::Run),
|
||||||
|
|
||||||
/// Ecash-related functionalities
|
/// Import a pre-generated credential
|
||||||
Ecash(Ecash),
|
ImportCredential(CommonClientImportCredentialArgs),
|
||||||
|
|
||||||
/// List all registered with gateways
|
/// List all registered with gateways
|
||||||
ListGateways(list_gateways::Args),
|
ListGateways(list_gateways::Args),
|
||||||
@@ -89,6 +89,9 @@ pub(crate) enum Commands {
|
|||||||
/// Change the currently active gateway. Note that you must have already registered with the new gateway!
|
/// Change the currently active gateway. Note that you must have already registered with the new gateway!
|
||||||
SwitchGateway(switch_gateway::Args),
|
SwitchGateway(switch_gateway::Args),
|
||||||
|
|
||||||
|
/// Display information associated with the imported ticketbooks,
|
||||||
|
ShowTicketbooks(show_ticketbooks::Args),
|
||||||
|
|
||||||
/// Show build information of this binary
|
/// Show build information of this binary
|
||||||
BuildInfo(build_info::BuildInfo),
|
BuildInfo(build_info::BuildInfo),
|
||||||
|
|
||||||
@@ -112,8 +115,6 @@ pub(crate) struct OverrideConfig {
|
|||||||
nyxd_urls: Option<Vec<url::Url>>,
|
nyxd_urls: Option<Vec<url::Url>>,
|
||||||
enabled_credentials_mode: Option<bool>,
|
enabled_credentials_mode: Option<bool>,
|
||||||
outfox: bool,
|
outfox: bool,
|
||||||
stats_reporting_address: Option<Recipient>,
|
|
||||||
forget_me: ForgetMe,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) async fn execute(args: Cli) -> Result<(), Box<dyn Error + Send + Sync>> {
|
pub(crate) async fn execute(args: Cli) -> Result<(), Box<dyn Error + Send + Sync>> {
|
||||||
@@ -122,10 +123,11 @@ pub(crate) async fn execute(args: Cli) -> Result<(), Box<dyn Error + Send + Sync
|
|||||||
match args.command {
|
match args.command {
|
||||||
Commands::Init(m) => init::execute(m).await?,
|
Commands::Init(m) => init::execute(m).await?,
|
||||||
Commands::Run(m) => run::execute(m).await?,
|
Commands::Run(m) => run::execute(m).await?,
|
||||||
Commands::Ecash(ecash) => ecash.execute().await?,
|
Commands::ImportCredential(m) => import_credential::execute(m).await?,
|
||||||
Commands::ListGateways(args) => list_gateways::execute(args).await?,
|
Commands::ListGateways(args) => list_gateways::execute(args).await?,
|
||||||
Commands::AddGateway(args) => add_gateway::execute(args).await?,
|
Commands::AddGateway(args) => add_gateway::execute(args).await?,
|
||||||
Commands::SwitchGateway(args) => switch_gateway::execute(args).await?,
|
Commands::SwitchGateway(args) => switch_gateway::execute(args).await?,
|
||||||
|
Commands::ShowTicketbooks(args) => show_ticketbooks::execute(args).await?,
|
||||||
Commands::BuildInfo(m) => build_info::execute(m),
|
Commands::BuildInfo(m) => build_info::execute(m),
|
||||||
Commands::Completions(s) => s.generate(&mut Cli::command(), bin_name),
|
Commands::Completions(s) => s.generate(&mut Cli::command(), bin_name),
|
||||||
Commands::GenerateFigSpec => fig_generate(&mut Cli::command(), bin_name),
|
Commands::GenerateFigSpec => fig_generate(&mut Cli::command(), bin_name),
|
||||||
@@ -180,7 +182,6 @@ pub(crate) fn override_config(config: Config, args: OverrideConfig) -> Config {
|
|||||||
BaseClientConfig::with_topology_structure,
|
BaseClientConfig::with_topology_structure,
|
||||||
topology_structure,
|
topology_structure,
|
||||||
)
|
)
|
||||||
.with_base(BaseClientConfig::with_forget_me, args.forget_me)
|
|
||||||
.with_optional(Config::with_anonymous_replies, args.use_anonymous_replies)
|
.with_optional(Config::with_anonymous_replies, args.use_anonymous_replies)
|
||||||
.with_optional(Config::with_port, args.port)
|
.with_optional(Config::with_port, args.port)
|
||||||
.with_optional(Config::with_ip, args.ip)
|
.with_optional(Config::with_ip, args.ip)
|
||||||
@@ -200,11 +201,6 @@ pub(crate) fn override_config(config: Config, args: OverrideConfig) -> Config {
|
|||||||
BaseClientConfig::with_disabled_credentials,
|
BaseClientConfig::with_disabled_credentials,
|
||||||
args.enabled_credentials_mode.map(|b| !b),
|
args.enabled_credentials_mode.map(|b| !b),
|
||||||
)
|
)
|
||||||
.with_optional_base_env(
|
|
||||||
BaseClientConfig::with_enabled_stats_reporting_address,
|
|
||||||
args.stats_reporting_address,
|
|
||||||
nym_network_defaults::var_names::CLIENT_STATS_COLLECTION_PROVIDER,
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn try_upgrade_v1_1_13_config(id: &str) -> Result<bool, Socks5ClientError> {
|
async fn try_upgrade_v1_1_13_config(id: &str) -> Result<bool, Socks5ClientError> {
|
||||||
|
|||||||
@@ -2,8 +2,14 @@
|
|||||||
// SPDX-License-Identifier: Apache-2.0
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
use crate::commands::try_load_current_config;
|
use crate::commands::try_load_current_config;
|
||||||
use crate::commands::{override_config, OverrideConfig};
|
use crate::config::Config;
|
||||||
|
use crate::{
|
||||||
|
commands::{override_config, OverrideConfig},
|
||||||
|
error::Socks5ClientError,
|
||||||
|
};
|
||||||
use clap::Args;
|
use clap::Args;
|
||||||
|
use log::*;
|
||||||
|
use nym_bin_common::version_checker::is_minor_version_compatible;
|
||||||
use nym_client_core::cli_helpers::client_run::CommonClientRunArgs;
|
use nym_client_core::cli_helpers::client_run::CommonClientRunArgs;
|
||||||
use nym_client_core::client::base_client::storage::OnDiskPersistent;
|
use nym_client_core::client::base_client::storage::OnDiskPersistent;
|
||||||
use nym_client_core::client::topology_control::geo_aware_provider::CountryGroup;
|
use nym_client_core::client::topology_control::geo_aware_provider::CountryGroup;
|
||||||
@@ -64,8 +70,6 @@ impl From<Run> for OverrideConfig {
|
|||||||
nyxd_urls: run_config.common_args.nyxd_urls,
|
nyxd_urls: run_config.common_args.nyxd_urls,
|
||||||
enabled_credentials_mode: run_config.common_args.enabled_credentials_mode,
|
enabled_credentials_mode: run_config.common_args.enabled_credentials_mode,
|
||||||
outfox: run_config.outfox,
|
outfox: run_config.outfox,
|
||||||
stats_reporting_address: run_config.common_args.stats_reporting_address,
|
|
||||||
forget_me: run_config.common_args.forget_me.into(),
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -77,12 +81,38 @@ fn validate_country_group(s: &str) -> Result<CountryGroup, String> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// this only checks compatibility between config the binary. It does not take into consideration
|
||||||
|
// network version. It might do so in the future.
|
||||||
|
fn version_check(cfg: &Config) -> bool {
|
||||||
|
let binary_version = env!("CARGO_PKG_VERSION");
|
||||||
|
let config_version = &cfg.core.base.client.version;
|
||||||
|
if binary_version == config_version {
|
||||||
|
true
|
||||||
|
} else {
|
||||||
|
warn!(
|
||||||
|
"The socks5-client binary has different version than what is specified in config file! {binary_version} and {config_version}",
|
||||||
|
);
|
||||||
|
if is_minor_version_compatible(binary_version, config_version) {
|
||||||
|
info!("but they are still semver compatible. However, consider running the `upgrade` command");
|
||||||
|
true
|
||||||
|
} else {
|
||||||
|
error!("and they are semver incompatible! - please run the `upgrade` command before attempting `run` again");
|
||||||
|
false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub(crate) async fn execute(args: Run) -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
|
pub(crate) async fn execute(args: Run) -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
|
||||||
eprintln!("Starting client {}...", args.common_args.id);
|
eprintln!("Starting client {}...", args.common_args.id);
|
||||||
|
|
||||||
let mut config = try_load_current_config(&args.common_args.id).await?;
|
let mut config = try_load_current_config(&args.common_args.id).await?;
|
||||||
config = override_config(config, OverrideConfig::from(args.clone()));
|
config = override_config(config, OverrideConfig::from(args.clone()));
|
||||||
|
|
||||||
|
if !version_check(&config) {
|
||||||
|
error!("failed the local version check");
|
||||||
|
return Err(Box::new(Socks5ClientError::FailedLocalVersionCheck));
|
||||||
|
}
|
||||||
|
|
||||||
let storage =
|
let storage =
|
||||||
OnDiskPersistent::from_paths(config.storage_paths.common_paths, &config.core.base.debug)
|
OnDiskPersistent::from_paths(config.storage_paths.common_paths, &config.core.base.debug)
|
||||||
.await?;
|
.await?;
|
||||||
|
|||||||
+2
-2
@@ -9,7 +9,7 @@ use nym_client_core::cli_helpers::client_show_ticketbooks::{
|
|||||||
};
|
};
|
||||||
|
|
||||||
#[derive(clap::Args)]
|
#[derive(clap::Args)]
|
||||||
pub struct Args {
|
pub(crate) struct Args {
|
||||||
#[command(flatten)]
|
#[command(flatten)]
|
||||||
common_args: CommonShowTicketbooksArgs,
|
common_args: CommonShowTicketbooksArgs,
|
||||||
|
|
||||||
@@ -23,7 +23,7 @@ impl AsRef<CommonShowTicketbooksArgs> for Args {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn execute(args: Args) -> Result<(), Socks5ClientError> {
|
pub(crate) async fn execute(args: Args) -> Result<(), Socks5ClientError> {
|
||||||
let output = args.output;
|
let output = args.output;
|
||||||
let res = show_ticketbooks::<CliSocks5Client, _>(args).await?;
|
let res = show_ticketbooks::<CliSocks5Client, _>(args).await?;
|
||||||
|
|
||||||
@@ -108,13 +108,4 @@ average_ack_delay = '{{ core.debug.acknowledgements.average_ack_delay }}'
|
|||||||
[core.debug.cover_traffic]
|
[core.debug.cover_traffic]
|
||||||
loop_cover_traffic_average_delay = '{{ core.debug.cover_traffic.loop_cover_traffic_average_delay }}'
|
loop_cover_traffic_average_delay = '{{ core.debug.cover_traffic.loop_cover_traffic_average_delay }}'
|
||||||
|
|
||||||
[core.debug.stats_reporting]
|
|
||||||
enabled = {{ core.debug.stats_reporting.enabled }}
|
|
||||||
provider_address = '{{ core.debug.stats_reporting.provider_address }}'
|
|
||||||
reporting_interval = '{{ core.debug.stats_reporting.reporting_interval }}'
|
|
||||||
|
|
||||||
[core.debug.forget_me]
|
|
||||||
client = {{ core.debug.forget_me.client }}
|
|
||||||
stats = {{ core.debug.forget_me.stats }}
|
|
||||||
|
|
||||||
"#;
|
"#;
|
||||||
|
|||||||
@@ -14,6 +14,9 @@ pub enum Socks5ClientError {
|
|||||||
#[error("Failed to validate the loaded config")]
|
#[error("Failed to validate the loaded config")]
|
||||||
ConfigValidationFailure,
|
ConfigValidationFailure,
|
||||||
|
|
||||||
|
#[error("Failed local version check, client and config mismatch")]
|
||||||
|
FailedLocalVersionCheck,
|
||||||
|
|
||||||
#[error("Fail to bind address")]
|
#[error("Fail to bind address")]
|
||||||
FailToBindAddress,
|
FailToBindAddress,
|
||||||
|
|
||||||
|
|||||||
@@ -1,3 +1,2 @@
|
|||||||
allow-unwrap-in-tests = true
|
allow-unwrap-in-tests = true
|
||||||
allow-expect-in-tests = true
|
allow-expect-in-tests = true
|
||||||
allow-panic-in-tests = true
|
|
||||||
@@ -9,25 +9,9 @@ edition.workspace = true
|
|||||||
license.workspace = true
|
license.workspace = true
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
base64 = { workspace = true }
|
|
||||||
bincode = { workspace = true }
|
bincode = { workspace = true }
|
||||||
rand = { workspace = true }
|
rand = { workspace = true }
|
||||||
serde = { workspace = true, features = ["derive"] }
|
serde = { workspace = true, features = ["derive"] }
|
||||||
thiserror = { workspace = true }
|
|
||||||
|
|
||||||
nym-credentials-interface = { path = "../credentials-interface" }
|
|
||||||
nym-crypto = { path = "../crypto", features = ["asymmetric"] }
|
|
||||||
nym-network-defaults = { path = "../network-defaults" }
|
|
||||||
nym-service-provider-requests-common = { path = "../service-provider-requests-common" }
|
|
||||||
nym-sphinx = { path = "../nymsphinx" }
|
nym-sphinx = { path = "../nymsphinx" }
|
||||||
nym-wireguard-types = { path = "../wireguard-types" }
|
nym-wireguard-types = { path = "../wireguard-types" }
|
||||||
|
|
||||||
## verify:
|
|
||||||
hmac = { workspace = true, optional = true }
|
|
||||||
sha2 = { workspace = true, optional = true }
|
|
||||||
x25519-dalek = { workspace = true, features = ["static_secrets"] }
|
|
||||||
|
|
||||||
[features]
|
|
||||||
default = ["verify"]
|
|
||||||
# this is moved to a separate feature as we really need clients to import it (especially, *cough*, wasm)
|
|
||||||
verify = ["hmac", "sha2"]
|
|
||||||
|
|||||||
@@ -1,28 +0,0 @@
|
|||||||
// Copyright 2024 - Nym Technologies SA <contact@nymtech.net>
|
|
||||||
// SPDX-License-Identifier: Apache-2.0
|
|
||||||
|
|
||||||
use thiserror::Error;
|
|
||||||
|
|
||||||
#[derive(Debug, Error)]
|
|
||||||
pub enum Error {
|
|
||||||
#[error("the provided base64-encoded client MAC ('{mac}') was malformed: {source}")]
|
|
||||||
MalformedClientMac {
|
|
||||||
mac: String,
|
|
||||||
#[source]
|
|
||||||
source: base64::DecodeError,
|
|
||||||
},
|
|
||||||
|
|
||||||
#[cfg(feature = "verify")]
|
|
||||||
#[error("failed to verify mac provided by '{client}': {source}")]
|
|
||||||
FailedClientMacVerification {
|
|
||||||
client: String,
|
|
||||||
#[source]
|
|
||||||
source: hmac::digest::MacError,
|
|
||||||
},
|
|
||||||
|
|
||||||
#[error("conversion: {0}")]
|
|
||||||
Conversion(String),
|
|
||||||
|
|
||||||
#[error("failed to serialize response packet: {source}")]
|
|
||||||
FailedToSerializeResponsePacket { source: Box<bincode::ErrorKind> },
|
|
||||||
}
|
|
||||||
@@ -1,19 +1,9 @@
|
|||||||
// Copyright 2024 - Nym Technologies SA <contact@nymtech.net>
|
// Copyright 2024 - Nym Technologies SA <contact@nymtech.net>
|
||||||
// SPDX-License-Identifier: Apache-2.0
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
pub mod traits;
|
|
||||||
pub mod v1;
|
pub mod v1;
|
||||||
pub mod v2;
|
|
||||||
pub mod v3;
|
|
||||||
pub mod v4;
|
|
||||||
|
|
||||||
mod error;
|
pub const CURRENT_VERSION: u8 = 1;
|
||||||
mod util;
|
|
||||||
|
|
||||||
pub use error::Error;
|
|
||||||
pub use v4 as latest;
|
|
||||||
|
|
||||||
pub const CURRENT_VERSION: u8 = 4;
|
|
||||||
|
|
||||||
fn make_bincode_serializer() -> impl bincode::Options {
|
fn make_bincode_serializer() -> impl bincode::Options {
|
||||||
use bincode::Options;
|
use bincode::Options;
|
||||||
|
|||||||
@@ -1,343 +0,0 @@
|
|||||||
// Copyright 2024 - Nym Technologies SA <contact@nymtech.net>
|
|
||||||
// SPDX-License-Identifier: Apache-2.0
|
|
||||||
|
|
||||||
use nym_credentials_interface::CredentialSpendingData;
|
|
||||||
use nym_crypto::asymmetric::x25519::PrivateKey;
|
|
||||||
use nym_service_provider_requests_common::{Protocol, ServiceProviderType};
|
|
||||||
use nym_sphinx::addressing::clients::Recipient;
|
|
||||||
use nym_wireguard_types::PeerPublicKey;
|
|
||||||
|
|
||||||
use crate::{
|
|
||||||
v1, v2, v3,
|
|
||||||
v4::{self, registration::IpPair},
|
|
||||||
Error,
|
|
||||||
};
|
|
||||||
|
|
||||||
#[derive(Copy, Clone, Debug)]
|
|
||||||
pub enum AuthenticatorVersion {
|
|
||||||
V1,
|
|
||||||
V2,
|
|
||||||
V3,
|
|
||||||
V4,
|
|
||||||
UNKNOWN,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<Protocol> for AuthenticatorVersion {
|
|
||||||
fn from(value: Protocol) -> Self {
|
|
||||||
if value.service_provider_type != ServiceProviderType::Authenticator {
|
|
||||||
AuthenticatorVersion::UNKNOWN
|
|
||||||
} else if value.version == v1::VERSION {
|
|
||||||
AuthenticatorVersion::V1
|
|
||||||
} else if value.version == v2::VERSION {
|
|
||||||
AuthenticatorVersion::V2
|
|
||||||
} else if value.version == v3::VERSION {
|
|
||||||
AuthenticatorVersion::V3
|
|
||||||
} else if value.version == v4::VERSION {
|
|
||||||
AuthenticatorVersion::V4
|
|
||||||
} else {
|
|
||||||
AuthenticatorVersion::UNKNOWN
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub trait InitMessage {
|
|
||||||
fn pub_key(&self) -> PeerPublicKey;
|
|
||||||
}
|
|
||||||
|
|
||||||
impl InitMessage for v1::registration::InitMessage {
|
|
||||||
fn pub_key(&self) -> PeerPublicKey {
|
|
||||||
self.pub_key
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl InitMessage for v2::registration::InitMessage {
|
|
||||||
fn pub_key(&self) -> PeerPublicKey {
|
|
||||||
self.pub_key
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl InitMessage for v3::registration::InitMessage {
|
|
||||||
fn pub_key(&self) -> PeerPublicKey {
|
|
||||||
self.pub_key
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl InitMessage for v4::registration::InitMessage {
|
|
||||||
fn pub_key(&self) -> PeerPublicKey {
|
|
||||||
self.pub_key
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub trait FinalMessage {
|
|
||||||
fn pub_key(&self) -> PeerPublicKey;
|
|
||||||
fn verify(&self, private_key: &PrivateKey, nonce: u64) -> Result<(), Error>;
|
|
||||||
fn private_ips(&self) -> IpPair;
|
|
||||||
fn credential(&self) -> Option<CredentialSpendingData>;
|
|
||||||
}
|
|
||||||
|
|
||||||
impl FinalMessage for v1::GatewayClient {
|
|
||||||
fn pub_key(&self) -> PeerPublicKey {
|
|
||||||
self.pub_key
|
|
||||||
}
|
|
||||||
|
|
||||||
fn verify(&self, private_key: &PrivateKey, nonce: u64) -> Result<(), Error> {
|
|
||||||
self.verify(private_key, nonce)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn private_ips(&self) -> IpPair {
|
|
||||||
self.private_ip.into()
|
|
||||||
}
|
|
||||||
|
|
||||||
fn credential(&self) -> Option<CredentialSpendingData> {
|
|
||||||
None
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl FinalMessage for v2::registration::FinalMessage {
|
|
||||||
fn pub_key(&self) -> PeerPublicKey {
|
|
||||||
self.gateway_client.pub_key
|
|
||||||
}
|
|
||||||
|
|
||||||
fn verify(&self, private_key: &PrivateKey, nonce: u64) -> Result<(), Error> {
|
|
||||||
self.gateway_client.verify(private_key, nonce)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn private_ips(&self) -> IpPair {
|
|
||||||
self.gateway_client.private_ip.into()
|
|
||||||
}
|
|
||||||
|
|
||||||
fn credential(&self) -> Option<CredentialSpendingData> {
|
|
||||||
self.credential.clone()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl FinalMessage for v3::registration::FinalMessage {
|
|
||||||
fn pub_key(&self) -> PeerPublicKey {
|
|
||||||
self.gateway_client.pub_key
|
|
||||||
}
|
|
||||||
|
|
||||||
fn verify(&self, private_key: &PrivateKey, nonce: u64) -> Result<(), Error> {
|
|
||||||
self.gateway_client.verify(private_key, nonce)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn private_ips(&self) -> IpPair {
|
|
||||||
self.gateway_client.private_ip.into()
|
|
||||||
}
|
|
||||||
|
|
||||||
fn credential(&self) -> Option<CredentialSpendingData> {
|
|
||||||
self.credential.clone()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl FinalMessage for v4::registration::FinalMessage {
|
|
||||||
fn pub_key(&self) -> PeerPublicKey {
|
|
||||||
self.gateway_client.pub_key
|
|
||||||
}
|
|
||||||
|
|
||||||
fn verify(&self, private_key: &PrivateKey, nonce: u64) -> Result<(), Error> {
|
|
||||||
self.gateway_client.verify(private_key, nonce)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn private_ips(&self) -> IpPair {
|
|
||||||
self.gateway_client.private_ips
|
|
||||||
}
|
|
||||||
|
|
||||||
fn credential(&self) -> Option<CredentialSpendingData> {
|
|
||||||
self.credential.clone()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub trait QueryBandwidthMessage {
|
|
||||||
fn pub_key(&self) -> PeerPublicKey;
|
|
||||||
}
|
|
||||||
|
|
||||||
impl QueryBandwidthMessage for PeerPublicKey {
|
|
||||||
fn pub_key(&self) -> PeerPublicKey {
|
|
||||||
*self
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub trait TopUpMessage {
|
|
||||||
fn pub_key(&self) -> PeerPublicKey;
|
|
||||||
fn credential(&self) -> CredentialSpendingData;
|
|
||||||
}
|
|
||||||
|
|
||||||
impl TopUpMessage for v3::topup::TopUpMessage {
|
|
||||||
fn pub_key(&self) -> PeerPublicKey {
|
|
||||||
self.pub_key
|
|
||||||
}
|
|
||||||
|
|
||||||
fn credential(&self) -> CredentialSpendingData {
|
|
||||||
self.credential.clone()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl TopUpMessage for v4::topup::TopUpMessage {
|
|
||||||
fn pub_key(&self) -> PeerPublicKey {
|
|
||||||
self.pub_key
|
|
||||||
}
|
|
||||||
|
|
||||||
fn credential(&self) -> CredentialSpendingData {
|
|
||||||
self.credential.clone()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub enum AuthenticatorRequest {
|
|
||||||
Initial {
|
|
||||||
msg: Box<dyn InitMessage + Send + Sync + 'static>,
|
|
||||||
protocol: Protocol,
|
|
||||||
reply_to: Recipient,
|
|
||||||
request_id: u64,
|
|
||||||
},
|
|
||||||
Final {
|
|
||||||
msg: Box<dyn FinalMessage + Send + Sync + 'static>,
|
|
||||||
protocol: Protocol,
|
|
||||||
reply_to: Recipient,
|
|
||||||
request_id: u64,
|
|
||||||
},
|
|
||||||
QueryBandwidth {
|
|
||||||
msg: Box<dyn QueryBandwidthMessage + Send + Sync + 'static>,
|
|
||||||
protocol: Protocol,
|
|
||||||
reply_to: Recipient,
|
|
||||||
request_id: u64,
|
|
||||||
},
|
|
||||||
TopUpBandwidth {
|
|
||||||
msg: Box<dyn TopUpMessage + Send + Sync + 'static>,
|
|
||||||
protocol: Protocol,
|
|
||||||
reply_to: Recipient,
|
|
||||||
request_id: u64,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<v1::request::AuthenticatorRequest> for AuthenticatorRequest {
|
|
||||||
fn from(value: v1::request::AuthenticatorRequest) -> Self {
|
|
||||||
match value.data {
|
|
||||||
v1::request::AuthenticatorRequestData::Initial(init_message) => Self::Initial {
|
|
||||||
msg: Box::new(init_message),
|
|
||||||
protocol: Protocol {
|
|
||||||
version: value.version,
|
|
||||||
service_provider_type: ServiceProviderType::Authenticator,
|
|
||||||
},
|
|
||||||
reply_to: value.reply_to,
|
|
||||||
request_id: value.request_id,
|
|
||||||
},
|
|
||||||
v1::request::AuthenticatorRequestData::Final(gateway_client) => Self::Final {
|
|
||||||
msg: Box::new(gateway_client),
|
|
||||||
protocol: Protocol {
|
|
||||||
version: value.version,
|
|
||||||
service_provider_type: ServiceProviderType::Authenticator,
|
|
||||||
},
|
|
||||||
reply_to: value.reply_to,
|
|
||||||
request_id: value.request_id,
|
|
||||||
},
|
|
||||||
v1::request::AuthenticatorRequestData::QueryBandwidth(peer_public_key) => {
|
|
||||||
Self::QueryBandwidth {
|
|
||||||
msg: Box::new(peer_public_key),
|
|
||||||
protocol: Protocol {
|
|
||||||
version: value.version,
|
|
||||||
service_provider_type: ServiceProviderType::Authenticator,
|
|
||||||
},
|
|
||||||
reply_to: value.reply_to,
|
|
||||||
request_id: value.request_id,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<v2::request::AuthenticatorRequest> for AuthenticatorRequest {
|
|
||||||
fn from(value: v2::request::AuthenticatorRequest) -> Self {
|
|
||||||
match value.data {
|
|
||||||
v2::request::AuthenticatorRequestData::Initial(init_message) => Self::Initial {
|
|
||||||
msg: Box::new(init_message),
|
|
||||||
protocol: value.protocol,
|
|
||||||
reply_to: value.reply_to,
|
|
||||||
request_id: value.request_id,
|
|
||||||
},
|
|
||||||
v2::request::AuthenticatorRequestData::Final(final_message) => Self::Final {
|
|
||||||
msg: final_message,
|
|
||||||
protocol: value.protocol,
|
|
||||||
reply_to: value.reply_to,
|
|
||||||
request_id: value.request_id,
|
|
||||||
},
|
|
||||||
v2::request::AuthenticatorRequestData::QueryBandwidth(peer_public_key) => {
|
|
||||||
Self::QueryBandwidth {
|
|
||||||
msg: Box::new(peer_public_key),
|
|
||||||
protocol: value.protocol,
|
|
||||||
reply_to: value.reply_to,
|
|
||||||
request_id: value.request_id,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<v3::request::AuthenticatorRequest> for AuthenticatorRequest {
|
|
||||||
fn from(value: v3::request::AuthenticatorRequest) -> Self {
|
|
||||||
match value.data {
|
|
||||||
v3::request::AuthenticatorRequestData::Initial(init_message) => Self::Initial {
|
|
||||||
msg: Box::new(init_message),
|
|
||||||
protocol: value.protocol,
|
|
||||||
reply_to: value.reply_to,
|
|
||||||
request_id: value.request_id,
|
|
||||||
},
|
|
||||||
v3::request::AuthenticatorRequestData::Final(final_message) => Self::Final {
|
|
||||||
msg: final_message,
|
|
||||||
protocol: value.protocol,
|
|
||||||
reply_to: value.reply_to,
|
|
||||||
request_id: value.request_id,
|
|
||||||
},
|
|
||||||
v3::request::AuthenticatorRequestData::QueryBandwidth(peer_public_key) => {
|
|
||||||
Self::QueryBandwidth {
|
|
||||||
msg: Box::new(peer_public_key),
|
|
||||||
protocol: value.protocol,
|
|
||||||
reply_to: value.reply_to,
|
|
||||||
request_id: value.request_id,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
v3::request::AuthenticatorRequestData::TopUpBandwidth(top_up_message) => {
|
|
||||||
Self::TopUpBandwidth {
|
|
||||||
msg: top_up_message,
|
|
||||||
protocol: value.protocol,
|
|
||||||
reply_to: value.reply_to,
|
|
||||||
request_id: value.request_id,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<v4::request::AuthenticatorRequest> for AuthenticatorRequest {
|
|
||||||
fn from(value: v4::request::AuthenticatorRequest) -> Self {
|
|
||||||
match value.data {
|
|
||||||
v4::request::AuthenticatorRequestData::Initial(init_message) => Self::Initial {
|
|
||||||
msg: Box::new(init_message),
|
|
||||||
protocol: value.protocol,
|
|
||||||
reply_to: value.reply_to,
|
|
||||||
request_id: value.request_id,
|
|
||||||
},
|
|
||||||
v4::request::AuthenticatorRequestData::Final(final_message) => Self::Final {
|
|
||||||
msg: final_message,
|
|
||||||
protocol: value.protocol,
|
|
||||||
reply_to: value.reply_to,
|
|
||||||
request_id: value.request_id,
|
|
||||||
},
|
|
||||||
v4::request::AuthenticatorRequestData::QueryBandwidth(peer_public_key) => {
|
|
||||||
Self::QueryBandwidth {
|
|
||||||
msg: Box::new(peer_public_key),
|
|
||||||
protocol: value.protocol,
|
|
||||||
reply_to: value.reply_to,
|
|
||||||
request_id: value.request_id,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
v4::request::AuthenticatorRequestData::TopUpBandwidth(top_up_message) => {
|
|
||||||
Self::TopUpBandwidth {
|
|
||||||
msg: top_up_message,
|
|
||||||
protocol: value.protocol,
|
|
||||||
reply_to: value.reply_to,
|
|
||||||
request_id: value.request_id,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,71 +0,0 @@
|
|||||||
// Copyright 2024 - Nym Technologies SA <contact@nymtech.net>
|
|
||||||
// SPDX-License-Identifier: Apache-2.0
|
|
||||||
|
|
||||||
#[cfg(test)]
|
|
||||||
pub(crate) mod tests {
|
|
||||||
pub(crate) const CREDENTIAL_BYTES: [u8; 1245] = [
|
|
||||||
0, 0, 4, 133, 96, 179, 223, 185, 136, 23, 213, 166, 59, 203, 66, 69, 209, 181, 227, 254,
|
|
||||||
16, 102, 98, 237, 59, 119, 170, 111, 31, 194, 51, 59, 120, 17, 115, 229, 79, 91, 11, 139,
|
|
||||||
154, 2, 212, 23, 68, 70, 167, 3, 240, 54, 224, 171, 221, 1, 69, 48, 60, 118, 119, 249, 123,
|
|
||||||
35, 172, 227, 131, 96, 232, 209, 187, 123, 4, 197, 102, 90, 96, 45, 125, 135, 140, 99, 1,
|
|
||||||
151, 17, 131, 143, 157, 97, 107, 139, 232, 212, 87, 14, 115, 253, 255, 166, 167, 186, 43,
|
|
||||||
90, 96, 173, 105, 120, 40, 10, 163, 250, 224, 214, 200, 178, 4, 160, 16, 130, 59, 76, 193,
|
|
||||||
39, 240, 3, 101, 141, 209, 183, 226, 186, 207, 56, 210, 187, 7, 164, 240, 164, 205, 37, 81,
|
|
||||||
184, 214, 193, 195, 90, 205, 238, 225, 195, 104, 12, 123, 203, 57, 233, 243, 215, 145, 195,
|
|
||||||
196, 57, 38, 125, 172, 18, 47, 63, 165, 110, 219, 180, 40, 58, 116, 92, 254, 160, 98, 48,
|
|
||||||
92, 254, 232, 107, 184, 80, 234, 60, 160, 235, 249, 76, 41, 38, 165, 28, 40, 136, 74, 48,
|
|
||||||
166, 50, 245, 23, 201, 140, 101, 79, 93, 235, 128, 186, 146, 126, 180, 134, 43, 13, 186,
|
|
||||||
19, 195, 48, 168, 201, 29, 216, 95, 176, 198, 132, 188, 64, 39, 212, 150, 32, 52, 53, 38,
|
|
||||||
228, 199, 122, 226, 217, 75, 40, 191, 151, 48, 164, 242, 177, 79, 14, 122, 105, 151, 85,
|
|
||||||
88, 199, 162, 17, 96, 103, 83, 178, 128, 9, 24, 30, 74, 108, 241, 85, 240, 166, 97, 241,
|
|
||||||
85, 199, 11, 198, 226, 234, 70, 107, 145, 28, 208, 114, 51, 12, 234, 108, 101, 202, 112,
|
|
||||||
48, 185, 22, 159, 67, 109, 49, 27, 149, 90, 109, 32, 226, 112, 7, 201, 208, 209, 104, 31,
|
|
||||||
97, 134, 204, 145, 27, 181, 206, 181, 106, 32, 110, 136, 115, 249, 201, 111, 5, 245, 203,
|
|
||||||
71, 121, 169, 126, 151, 178, 236, 59, 221, 195, 48, 135, 115, 6, 50, 227, 74, 97, 107, 107,
|
|
||||||
213, 90, 2, 203, 154, 138, 47, 128, 52, 134, 128, 224, 51, 65, 240, 90, 8, 55, 175, 180,
|
|
||||||
178, 204, 206, 168, 110, 51, 57, 189, 169, 48, 169, 136, 121, 99, 51, 170, 178, 214, 74, 1,
|
|
||||||
96, 151, 167, 25, 173, 180, 171, 155, 10, 55, 142, 234, 190, 113, 90, 79, 80, 244, 71, 166,
|
|
||||||
30, 235, 113, 150, 133, 1, 218, 17, 109, 111, 223, 24, 216, 177, 41, 2, 204, 65, 221, 212,
|
|
||||||
207, 236, 144, 6, 65, 224, 55, 42, 1, 1, 161, 134, 118, 127, 111, 220, 110, 127, 240, 71,
|
|
||||||
223, 129, 12, 93, 20, 220, 60, 56, 71, 146, 184, 95, 132, 69, 28, 56, 53, 192, 213, 22,
|
|
||||||
119, 230, 152, 225, 182, 188, 163, 219, 37, 175, 247, 73, 14, 247, 38, 72, 243, 1, 48, 131,
|
|
||||||
59, 8, 13, 96, 143, 185, 127, 241, 161, 217, 24, 149, 193, 40, 16, 30, 202, 151, 28, 119,
|
|
||||||
240, 153, 101, 156, 61, 193, 72, 245, 199, 181, 12, 231, 65, 166, 67, 142, 121, 207, 202,
|
|
||||||
58, 197, 113, 188, 248, 42, 124, 105, 48, 161, 241, 55, 209, 36, 194, 27, 63, 233, 144,
|
|
||||||
189, 85, 117, 234, 9, 139, 46, 31, 206, 114, 95, 131, 29, 240, 13, 81, 142, 140, 133, 33,
|
|
||||||
30, 41, 141, 37, 80, 217, 95, 221, 76, 115, 86, 201, 165, 51, 252, 9, 28, 209, 1, 48, 150,
|
|
||||||
74, 248, 212, 187, 222, 66, 210, 3, 200, 19, 217, 171, 184, 42, 148, 53, 150, 57, 50, 6,
|
|
||||||
227, 227, 62, 49, 42, 148, 148, 157, 82, 191, 58, 24, 34, 56, 98, 120, 89, 105, 176, 85,
|
|
||||||
15, 253, 241, 41, 153, 195, 136, 1, 48, 142, 126, 213, 101, 223, 79, 133, 230, 105, 38,
|
|
||||||
161, 149, 2, 21, 136, 150, 42, 72, 218, 85, 146, 63, 223, 58, 108, 186, 183, 248, 62, 20,
|
|
||||||
47, 34, 113, 160, 177, 204, 181, 16, 24, 212, 224, 35, 84, 51, 168, 56, 136, 11, 1, 48,
|
|
||||||
135, 242, 62, 149, 230, 178, 32, 224, 119, 26, 234, 163, 237, 224, 114, 95, 112, 140, 170,
|
|
||||||
150, 96, 125, 136, 221, 180, 78, 18, 11, 12, 184, 2, 198, 217, 119, 43, 69, 4, 172, 109,
|
|
||||||
55, 183, 40, 131, 172, 161, 88, 183, 101, 1, 48, 173, 216, 22, 73, 42, 255, 211, 93, 249,
|
|
||||||
87, 159, 115, 61, 91, 55, 130, 17, 216, 60, 34, 122, 55, 8, 244, 244, 153, 151, 57, 5, 144,
|
|
||||||
178, 55, 249, 64, 211, 168, 34, 148, 56, 89, 92, 203, 70, 124, 219, 152, 253, 165, 0, 32,
|
|
||||||
203, 116, 63, 7, 240, 222, 82, 86, 11, 149, 167, 72, 224, 55, 190, 66, 201, 65, 168, 184,
|
|
||||||
96, 47, 194, 241, 168, 124, 7, 74, 214, 250, 37, 76, 32, 218, 69, 122, 103, 215, 145, 169,
|
|
||||||
24, 212, 229, 168, 106, 10, 144, 31, 13, 25, 178, 242, 250, 106, 159, 40, 48, 163, 165, 61,
|
|
||||||
130, 57, 146, 4, 73, 32, 254, 233, 125, 135, 212, 29, 111, 4, 177, 114, 15, 210, 170, 82,
|
|
||||||
108, 110, 62, 166, 81, 209, 106, 176, 156, 14, 133, 242, 60, 127, 120, 242, 28, 97, 0, 1,
|
|
||||||
32, 103, 93, 109, 89, 240, 91, 1, 84, 150, 50, 206, 157, 203, 49, 220, 120, 234, 175, 234,
|
|
||||||
150, 126, 225, 94, 163, 164, 199, 138, 114, 62, 99, 106, 112, 1, 32, 171, 40, 220, 82, 241,
|
|
||||||
203, 76, 146, 111, 139, 182, 179, 237, 182, 115, 75, 128, 201, 107, 43, 214, 0, 135, 217,
|
|
||||||
160, 68, 150, 232, 144, 114, 237, 98, 32, 30, 134, 232, 59, 93, 163, 253, 244, 13, 202, 52,
|
|
||||||
147, 168, 83, 121, 123, 95, 21, 210, 209, 225, 223, 143, 49, 10, 205, 238, 1, 22, 83, 81,
|
|
||||||
70, 1, 32, 26, 76, 6, 234, 160, 50, 139, 102, 161, 232, 155, 106, 130, 171, 226, 210, 233,
|
|
||||||
178, 85, 247, 71, 123, 55, 53, 46, 67, 148, 137, 156, 207, 208, 107, 1, 32, 102, 31, 4, 98,
|
|
||||||
110, 156, 144, 61, 229, 140, 198, 84, 196, 238, 128, 35, 131, 182, 137, 125, 241, 95, 69,
|
|
||||||
131, 170, 27, 2, 144, 75, 72, 242, 102, 3, 32, 121, 80, 45, 173, 56, 65, 218, 27, 40, 251,
|
|
||||||
197, 32, 169, 104, 123, 110, 90, 78, 153, 166, 38, 9, 129, 228, 99, 8, 1, 116, 142, 233,
|
|
||||||
162, 69, 32, 216, 169, 159, 116, 95, 12, 63, 176, 195, 6, 183, 123, 135, 75, 61, 112, 106,
|
|
||||||
83, 235, 176, 41, 27, 248, 48, 71, 165, 170, 12, 92, 103, 103, 81, 32, 58, 74, 75, 145,
|
|
||||||
192, 94, 153, 69, 80, 128, 241, 3, 16, 117, 192, 86, 161, 103, 44, 174, 211, 196, 182, 124,
|
|
||||||
55, 11, 107, 142, 49, 88, 6, 41, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
|
|
||||||
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
|
|
||||||
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 0, 37, 139, 240, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 1,
|
|
||||||
];
|
|
||||||
pub(crate) const RECIPIENT: &str = "CytBseW6yFXUMzz4SGAKdNLGR7q3sJLLYxyBGvutNEQV.4QXYyEVc5fUDjmmi8PrHN9tdUFV4PCvSJE1278cHyvoe@4sBbL1ngf1vtNqykydQKTFh26sQCw888GpUqvPvyNB4f";
|
|
||||||
}
|
|
||||||
@@ -1,13 +1,7 @@
|
|||||||
// Copyright 2024 - Nym Technologies SA <contact@nymtech.net>
|
// Copyright 2024 - Nym Technologies SA <contact@nymtech.net>
|
||||||
// SPDX-License-Identifier: Apache-2.0
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
pub mod registration;
|
|
||||||
pub mod request;
|
pub mod request;
|
||||||
pub mod response;
|
pub mod response;
|
||||||
|
|
||||||
pub use registration::{ClientMac, GatewayClient, InitMessage, Nonce};
|
const VERSION: u8 = 1;
|
||||||
|
|
||||||
#[cfg(feature = "verify")]
|
|
||||||
pub use registration::HmacSha256;
|
|
||||||
|
|
||||||
pub const VERSION: u8 = 1;
|
|
||||||
|
|||||||
@@ -1,9 +1,8 @@
|
|||||||
// Copyright 2024 - Nym Technologies SA <contact@nymtech.net>
|
// Copyright 2024 - Nym Technologies SA <contact@nymtech.net>
|
||||||
// SPDX-License-Identifier: Apache-2.0
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
use super::registration::{GatewayClient, InitMessage};
|
|
||||||
use nym_sphinx::addressing::Recipient;
|
use nym_sphinx::addressing::Recipient;
|
||||||
use nym_wireguard_types::PeerPublicKey;
|
use nym_wireguard_types::{GatewayClient, InitMessage, PeerPublicKey};
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
use crate::make_bincode_serializer;
|
use crate::make_bincode_serializer;
|
||||||
@@ -83,24 +82,3 @@ pub enum AuthenticatorRequestData {
|
|||||||
Final(GatewayClient),
|
Final(GatewayClient),
|
||||||
QueryBandwidth(PeerPublicKey),
|
QueryBandwidth(PeerPublicKey),
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
|
||||||
mod tests {
|
|
||||||
use super::*;
|
|
||||||
use std::str::FromStr;
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn check_first_byte_version() {
|
|
||||||
let version = 2;
|
|
||||||
let data = AuthenticatorRequest {
|
|
||||||
version,
|
|
||||||
data: AuthenticatorRequestData::Initial(InitMessage::new(
|
|
||||||
PeerPublicKey::from_str("yvNUDpT5l7W/xDhiu6HkqTHDQwbs/B3J5UrLmORl1EQ=").unwrap(),
|
|
||||||
)),
|
|
||||||
reply_to: Recipient::try_from_base58_string("D1rrpsysCGCYXy9saP8y3kmNpGtJZUXN9SvFoUcqAsM9.9Ssso1ea5NfkbMASdiseDSjTN1fSWda5SgEVjdSN4CvV@GJqd3ZxpXWSNxTfx7B1pPtswpetH4LnJdFeLeuY5KUuN").unwrap(),
|
|
||||||
request_id: 1,
|
|
||||||
};
|
|
||||||
let bytes = data.to_bytes().unwrap();
|
|
||||||
assert_eq!(*bytes.first().unwrap(), version);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
// Copyright 2024 - Nym Technologies SA <contact@nymtech.net>
|
// Copyright 2024 - Nym Technologies SA <contact@nymtech.net>
|
||||||
// SPDX-License-Identifier: Apache-2.0
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
use super::registration::{RegistrationData, RegistredData, RemainingBandwidthData};
|
|
||||||
use nym_sphinx::addressing::Recipient;
|
use nym_sphinx::addressing::Recipient;
|
||||||
|
use nym_wireguard_types::registration::{RegistrationData, RegistredData, RemainingBandwidthData};
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
use crate::make_bincode_serializer;
|
use crate::make_bincode_serializer;
|
||||||
|
|||||||
@@ -1,174 +0,0 @@
|
|||||||
// Copyright 2024 - Nym Technologies SA <contact@nymtech.net>
|
|
||||||
// SPDX-License-Identifier: Apache-2.0
|
|
||||||
|
|
||||||
use nym_service_provider_requests_common::{Protocol, ServiceProviderType};
|
|
||||||
|
|
||||||
use crate::{v1, v2};
|
|
||||||
|
|
||||||
impl From<v1::request::AuthenticatorRequest> for v2::request::AuthenticatorRequest {
|
|
||||||
fn from(authenticator_request: v1::request::AuthenticatorRequest) -> Self {
|
|
||||||
Self {
|
|
||||||
protocol: Protocol {
|
|
||||||
version: 2,
|
|
||||||
service_provider_type: ServiceProviderType::Authenticator,
|
|
||||||
},
|
|
||||||
data: authenticator_request.data.into(),
|
|
||||||
reply_to: authenticator_request.reply_to,
|
|
||||||
request_id: authenticator_request.request_id,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<v1::request::AuthenticatorRequestData> for v2::request::AuthenticatorRequestData {
|
|
||||||
fn from(authenticator_request_data: v1::request::AuthenticatorRequestData) -> Self {
|
|
||||||
match authenticator_request_data {
|
|
||||||
v1::request::AuthenticatorRequestData::Initial(init_msg) => {
|
|
||||||
v2::request::AuthenticatorRequestData::Initial(init_msg.into())
|
|
||||||
}
|
|
||||||
v1::request::AuthenticatorRequestData::Final(gw_client) => {
|
|
||||||
v2::request::AuthenticatorRequestData::Final(gw_client.into())
|
|
||||||
}
|
|
||||||
v1::request::AuthenticatorRequestData::QueryBandwidth(pub_key) => {
|
|
||||||
v2::request::AuthenticatorRequestData::QueryBandwidth(pub_key)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<v1::registration::InitMessage> for v2::registration::InitMessage {
|
|
||||||
fn from(init_msg: v1::registration::InitMessage) -> Self {
|
|
||||||
Self {
|
|
||||||
pub_key: init_msg.pub_key,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<v1::registration::GatewayClient> for Box<v2::registration::FinalMessage> {
|
|
||||||
fn from(gw_client: v1::registration::GatewayClient) -> Self {
|
|
||||||
Box::new(v2::registration::FinalMessage {
|
|
||||||
gateway_client: gw_client.into(),
|
|
||||||
credential: None,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<v1::registration::GatewayClient> for v2::registration::GatewayClient {
|
|
||||||
fn from(gw_client: v1::registration::GatewayClient) -> Self {
|
|
||||||
Self {
|
|
||||||
pub_key: gw_client.pub_key,
|
|
||||||
private_ip: gw_client.private_ip,
|
|
||||||
mac: gw_client.mac.into(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<v2::registration::GatewayClient> for v1::registration::GatewayClient {
|
|
||||||
fn from(gw_client: v2::registration::GatewayClient) -> Self {
|
|
||||||
Self {
|
|
||||||
pub_key: gw_client.pub_key,
|
|
||||||
private_ip: gw_client.private_ip,
|
|
||||||
mac: gw_client.mac.into(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<v1::registration::ClientMac> for v2::registration::ClientMac {
|
|
||||||
fn from(mac: v1::registration::ClientMac) -> Self {
|
|
||||||
Self::new(mac.to_vec())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<v2::registration::ClientMac> for v1::registration::ClientMac {
|
|
||||||
fn from(mac: v2::registration::ClientMac) -> Self {
|
|
||||||
Self::new(mac.to_vec())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<v2::response::AuthenticatorResponse> for v1::response::AuthenticatorResponse {
|
|
||||||
fn from(authenticator_response: v2::response::AuthenticatorResponse) -> Self {
|
|
||||||
Self {
|
|
||||||
version: authenticator_response.protocol.version,
|
|
||||||
data: authenticator_response.data.into(),
|
|
||||||
reply_to: authenticator_response.reply_to,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<v2::response::AuthenticatorResponseData> for v1::response::AuthenticatorResponseData {
|
|
||||||
fn from(authenticator_response_data: v2::response::AuthenticatorResponseData) -> Self {
|
|
||||||
match authenticator_response_data {
|
|
||||||
v2::response::AuthenticatorResponseData::PendingRegistration(
|
|
||||||
pending_registration_response,
|
|
||||||
) => v1::response::AuthenticatorResponseData::PendingRegistration(
|
|
||||||
pending_registration_response.into(),
|
|
||||||
),
|
|
||||||
v2::response::AuthenticatorResponseData::Registered(registered_response) => {
|
|
||||||
v1::response::AuthenticatorResponseData::Registered(registered_response.into())
|
|
||||||
}
|
|
||||||
v2::response::AuthenticatorResponseData::RemainingBandwidth(
|
|
||||||
remaining_bandwidth_response,
|
|
||||||
) => v1::response::AuthenticatorResponseData::RemainingBandwidth(
|
|
||||||
remaining_bandwidth_response.into(),
|
|
||||||
),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<v2::response::PendingRegistrationResponse> for v1::response::PendingRegistrationResponse {
|
|
||||||
fn from(value: v2::response::PendingRegistrationResponse) -> Self {
|
|
||||||
Self {
|
|
||||||
request_id: value.request_id,
|
|
||||||
reply_to: value.reply_to,
|
|
||||||
reply: value.reply.into(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<v2::response::RegisteredResponse> for v1::response::RegisteredResponse {
|
|
||||||
fn from(value: v2::response::RegisteredResponse) -> Self {
|
|
||||||
Self {
|
|
||||||
request_id: value.request_id,
|
|
||||||
reply_to: value.reply_to,
|
|
||||||
reply: value.reply.into(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<v2::response::RemainingBandwidthResponse> for v1::response::RemainingBandwidthResponse {
|
|
||||||
fn from(value: v2::response::RemainingBandwidthResponse) -> Self {
|
|
||||||
Self {
|
|
||||||
request_id: value.request_id,
|
|
||||||
reply_to: value.reply_to,
|
|
||||||
reply: value.reply.map(Into::into),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<v2::registration::RegistrationData> for v1::registration::RegistrationData {
|
|
||||||
fn from(value: v2::registration::RegistrationData) -> Self {
|
|
||||||
Self {
|
|
||||||
nonce: value.nonce,
|
|
||||||
gateway_data: value.gateway_data.into(),
|
|
||||||
wg_port: value.wg_port,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<v2::registration::RegistredData> for v1::registration::RegistredData {
|
|
||||||
fn from(value: v2::registration::RegistredData) -> Self {
|
|
||||||
Self {
|
|
||||||
pub_key: value.pub_key,
|
|
||||||
private_ip: value.private_ip,
|
|
||||||
wg_port: value.wg_port,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<v2::registration::RemainingBandwidthData> for v1::registration::RemainingBandwidthData {
|
|
||||||
fn from(value: v2::registration::RemainingBandwidthData) -> Self {
|
|
||||||
Self {
|
|
||||||
available_bandwidth: value.available_bandwidth as u64,
|
|
||||||
suspended: false,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
// Copyright 2024 - Nym Technologies SA <contact@nymtech.net>
|
|
||||||
// SPDX-License-Identifier: Apache-2.0
|
|
||||||
|
|
||||||
pub mod conversion;
|
|
||||||
pub mod registration;
|
|
||||||
pub mod request;
|
|
||||||
pub mod response;
|
|
||||||
|
|
||||||
pub const VERSION: u8 = 2;
|
|
||||||
@@ -1,227 +0,0 @@
|
|||||||
// Copyright 2023-2024 - Nym Technologies SA <contact@nymtech.net>
|
|
||||||
// SPDX-License-Identifier: Apache-2.0
|
|
||||||
|
|
||||||
use crate::error::Error;
|
|
||||||
use base64::{engine::general_purpose, Engine};
|
|
||||||
use nym_credentials_interface::CredentialSpendingData;
|
|
||||||
use nym_wireguard_types::PeerPublicKey;
|
|
||||||
use serde::{Deserialize, Serialize};
|
|
||||||
use std::collections::HashMap;
|
|
||||||
use std::net::IpAddr;
|
|
||||||
use std::time::SystemTime;
|
|
||||||
use std::{fmt, ops::Deref, str::FromStr};
|
|
||||||
|
|
||||||
#[cfg(feature = "verify")]
|
|
||||||
use hmac::{Hmac, Mac};
|
|
||||||
#[cfg(feature = "verify")]
|
|
||||||
use nym_crypto::asymmetric::encryption::PrivateKey;
|
|
||||||
#[cfg(feature = "verify")]
|
|
||||||
use sha2::Sha256;
|
|
||||||
|
|
||||||
pub type PendingRegistrations = HashMap<PeerPublicKey, RegistrationData>;
|
|
||||||
pub type PrivateIPs = HashMap<IpAddr, Taken>;
|
|
||||||
|
|
||||||
#[cfg(feature = "verify")]
|
|
||||||
pub type HmacSha256 = Hmac<Sha256>;
|
|
||||||
|
|
||||||
pub type Nonce = u64;
|
|
||||||
pub type Taken = Option<SystemTime>;
|
|
||||||
|
|
||||||
pub const BANDWIDTH_CAP_PER_DAY: u64 = 1024 * 1024 * 1024; // 1 GB
|
|
||||||
|
|
||||||
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
|
|
||||||
pub struct InitMessage {
|
|
||||||
/// Base64 encoded x25519 public key
|
|
||||||
pub pub_key: PeerPublicKey,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl InitMessage {
|
|
||||||
pub fn new(pub_key: PeerPublicKey) -> Self {
|
|
||||||
InitMessage { pub_key }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
|
|
||||||
pub struct FinalMessage {
|
|
||||||
/// Gateway client data
|
|
||||||
pub gateway_client: GatewayClient,
|
|
||||||
|
|
||||||
/// Ecash credential
|
|
||||||
pub credential: Option<CredentialSpendingData>,
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
|
|
||||||
pub struct RegistrationData {
|
|
||||||
pub nonce: u64,
|
|
||||||
pub gateway_data: GatewayClient,
|
|
||||||
pub wg_port: u16,
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
|
|
||||||
pub struct RegistredData {
|
|
||||||
pub pub_key: PeerPublicKey,
|
|
||||||
pub private_ip: IpAddr,
|
|
||||||
pub wg_port: u16,
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
|
|
||||||
pub struct RemainingBandwidthData {
|
|
||||||
pub available_bandwidth: i64,
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Client that wants to register sends its PublicKey bytes mac digest encrypted with a DH shared secret.
|
|
||||||
/// Gateway/Nym node can then verify pub_key payload using the same process
|
|
||||||
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
|
|
||||||
pub struct GatewayClient {
|
|
||||||
/// Base64 encoded x25519 public key
|
|
||||||
pub pub_key: PeerPublicKey,
|
|
||||||
|
|
||||||
/// Assigned private IP
|
|
||||||
pub private_ip: IpAddr,
|
|
||||||
|
|
||||||
/// Sha256 hmac on the data (alongside the prior nonce)
|
|
||||||
pub mac: ClientMac,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl GatewayClient {
|
|
||||||
#[cfg(feature = "verify")]
|
|
||||||
pub fn new(
|
|
||||||
local_secret: &PrivateKey,
|
|
||||||
remote_public: x25519_dalek::PublicKey,
|
|
||||||
private_ip: IpAddr,
|
|
||||||
nonce: u64,
|
|
||||||
) -> Self {
|
|
||||||
// convert from 1.0 x25519-dalek private key into 2.0 x25519-dalek
|
|
||||||
#[allow(clippy::expect_used)]
|
|
||||||
let static_secret = x25519_dalek::StaticSecret::from(local_secret.to_bytes());
|
|
||||||
let local_public: x25519_dalek::PublicKey = (&static_secret).into();
|
|
||||||
|
|
||||||
let dh = static_secret.diffie_hellman(&remote_public);
|
|
||||||
|
|
||||||
// TODO: change that to use our nym_crypto::hmac module instead
|
|
||||||
#[allow(clippy::expect_used)]
|
|
||||||
let mut mac = HmacSha256::new_from_slice(dh.as_bytes())
|
|
||||||
.expect("x25519 shared secret is always 32 bytes long");
|
|
||||||
|
|
||||||
mac.update(local_public.as_bytes());
|
|
||||||
mac.update(private_ip.to_string().as_bytes());
|
|
||||||
mac.update(&nonce.to_le_bytes());
|
|
||||||
|
|
||||||
GatewayClient {
|
|
||||||
pub_key: PeerPublicKey::new(local_public),
|
|
||||||
private_ip,
|
|
||||||
mac: ClientMac(mac.finalize().into_bytes().to_vec()),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Reusable secret should be gateways Wireguard PK
|
|
||||||
// Client should perform this step when generating its payload, using its own WG PK
|
|
||||||
#[cfg(feature = "verify")]
|
|
||||||
pub fn verify(&self, gateway_key: &PrivateKey, nonce: u64) -> Result<(), Error> {
|
|
||||||
// convert from 1.0 x25519-dalek private key into 2.0 x25519-dalek
|
|
||||||
#[allow(clippy::expect_used)]
|
|
||||||
let static_secret = x25519_dalek::StaticSecret::from(gateway_key.to_bytes());
|
|
||||||
|
|
||||||
let dh = static_secret.diffie_hellman(&self.pub_key);
|
|
||||||
|
|
||||||
// TODO: change that to use our nym_crypto::hmac module instead
|
|
||||||
#[allow(clippy::expect_used)]
|
|
||||||
let mut mac = HmacSha256::new_from_slice(dh.as_bytes())
|
|
||||||
.expect("x25519 shared secret is always 32 bytes long");
|
|
||||||
|
|
||||||
mac.update(self.pub_key.as_bytes());
|
|
||||||
mac.update(self.private_ip.to_string().as_bytes());
|
|
||||||
mac.update(&nonce.to_le_bytes());
|
|
||||||
|
|
||||||
mac.verify_slice(&self.mac)
|
|
||||||
.map_err(|source| Error::FailedClientMacVerification {
|
|
||||||
client: self.pub_key.to_string(),
|
|
||||||
source,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn pub_key(&self) -> PeerPublicKey {
|
|
||||||
self.pub_key
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: change the inner type into generic array of size HmacSha256::OutputSize
|
|
||||||
// TODO2: rely on our internal crypto/hmac
|
|
||||||
#[derive(Debug, Clone, PartialEq)]
|
|
||||||
pub struct ClientMac(Vec<u8>);
|
|
||||||
|
|
||||||
impl fmt::Display for ClientMac {
|
|
||||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
|
||||||
write!(f, "{}", general_purpose::STANDARD.encode(&self.0))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl ClientMac {
|
|
||||||
#[allow(dead_code)]
|
|
||||||
pub fn new(mac: Vec<u8>) -> Self {
|
|
||||||
ClientMac(mac)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Deref for ClientMac {
|
|
||||||
type Target = Vec<u8>;
|
|
||||||
|
|
||||||
fn deref(&self) -> &Self::Target {
|
|
||||||
&self.0
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl FromStr for ClientMac {
|
|
||||||
type Err = Error;
|
|
||||||
|
|
||||||
fn from_str(s: &str) -> Result<Self, Self::Err> {
|
|
||||||
let mac_bytes: Vec<u8> =
|
|
||||||
general_purpose::STANDARD
|
|
||||||
.decode(s)
|
|
||||||
.map_err(|source| Error::MalformedClientMac {
|
|
||||||
mac: s.to_string(),
|
|
||||||
source,
|
|
||||||
})?;
|
|
||||||
|
|
||||||
Ok(ClientMac(mac_bytes))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Serialize for ClientMac {
|
|
||||||
fn serialize<S: serde::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
|
|
||||||
let encoded_key = general_purpose::STANDARD.encode(self.0.clone());
|
|
||||||
serializer.serialize_str(&encoded_key)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<'de> Deserialize<'de> for ClientMac {
|
|
||||||
fn deserialize<D: serde::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
|
|
||||||
let encoded_key = String::deserialize(deserializer)?;
|
|
||||||
ClientMac::from_str(&encoded_key).map_err(serde::de::Error::custom)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(test)]
|
|
||||||
mod tests {
|
|
||||||
use super::*;
|
|
||||||
use nym_crypto::asymmetric::encryption;
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
#[cfg(feature = "verify")]
|
|
||||||
fn client_request_roundtrip() {
|
|
||||||
let mut rng = rand::thread_rng();
|
|
||||||
|
|
||||||
let gateway_key_pair = encryption::KeyPair::new(&mut rng);
|
|
||||||
let client_key_pair = encryption::KeyPair::new(&mut rng);
|
|
||||||
|
|
||||||
let nonce = 1234567890;
|
|
||||||
|
|
||||||
let client = GatewayClient::new(
|
|
||||||
client_key_pair.private_key(),
|
|
||||||
x25519_dalek::PublicKey::from(gateway_key_pair.public_key().to_bytes()),
|
|
||||||
"10.0.0.42".parse().unwrap(),
|
|
||||||
nonce,
|
|
||||||
);
|
|
||||||
assert!(client.verify(gateway_key_pair.private_key(), nonce).is_ok())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,116 +0,0 @@
|
|||||||
// Copyright 2024 - Nym Technologies SA <contact@nymtech.net>
|
|
||||||
// SPDX-License-Identifier: Apache-2.0
|
|
||||||
|
|
||||||
use super::registration::{FinalMessage, InitMessage};
|
|
||||||
use nym_service_provider_requests_common::{Protocol, ServiceProviderType};
|
|
||||||
use nym_sphinx::addressing::Recipient;
|
|
||||||
use nym_wireguard_types::PeerPublicKey;
|
|
||||||
use serde::{Deserialize, Serialize};
|
|
||||||
|
|
||||||
use crate::make_bincode_serializer;
|
|
||||||
|
|
||||||
use super::VERSION;
|
|
||||||
|
|
||||||
fn generate_random() -> u64 {
|
|
||||||
use rand::RngCore;
|
|
||||||
let mut rng = rand::rngs::OsRng;
|
|
||||||
rng.next_u64()
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Clone, Debug, Serialize, Deserialize)]
|
|
||||||
pub struct AuthenticatorRequest {
|
|
||||||
pub protocol: Protocol,
|
|
||||||
pub data: AuthenticatorRequestData,
|
|
||||||
pub reply_to: Recipient,
|
|
||||||
pub request_id: u64,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl AuthenticatorRequest {
|
|
||||||
pub fn from_reconstructed_message(
|
|
||||||
message: &nym_sphinx::receiver::ReconstructedMessage,
|
|
||||||
) -> Result<Self, bincode::Error> {
|
|
||||||
use bincode::Options;
|
|
||||||
make_bincode_serializer().deserialize(&message.message)
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn new_initial_request(init_message: InitMessage, reply_to: Recipient) -> (Self, u64) {
|
|
||||||
let request_id = generate_random();
|
|
||||||
(
|
|
||||||
Self {
|
|
||||||
protocol: Protocol {
|
|
||||||
service_provider_type: ServiceProviderType::Authenticator,
|
|
||||||
version: VERSION,
|
|
||||||
},
|
|
||||||
data: AuthenticatorRequestData::Initial(init_message),
|
|
||||||
reply_to,
|
|
||||||
request_id,
|
|
||||||
},
|
|
||||||
request_id,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn new_final_request(final_message: FinalMessage, reply_to: Recipient) -> (Self, u64) {
|
|
||||||
let request_id = generate_random();
|
|
||||||
(
|
|
||||||
Self {
|
|
||||||
protocol: Protocol {
|
|
||||||
service_provider_type: ServiceProviderType::Authenticator,
|
|
||||||
version: VERSION,
|
|
||||||
},
|
|
||||||
data: AuthenticatorRequestData::Final(Box::new(final_message)),
|
|
||||||
reply_to,
|
|
||||||
request_id,
|
|
||||||
},
|
|
||||||
request_id,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn new_query_request(peer_public_key: PeerPublicKey, reply_to: Recipient) -> (Self, u64) {
|
|
||||||
let request_id = generate_random();
|
|
||||||
(
|
|
||||||
Self {
|
|
||||||
protocol: Protocol {
|
|
||||||
service_provider_type: ServiceProviderType::Authenticator,
|
|
||||||
version: VERSION,
|
|
||||||
},
|
|
||||||
data: AuthenticatorRequestData::QueryBandwidth(peer_public_key),
|
|
||||||
reply_to,
|
|
||||||
request_id,
|
|
||||||
},
|
|
||||||
request_id,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn to_bytes(&self) -> Result<Vec<u8>, bincode::Error> {
|
|
||||||
use bincode::Options;
|
|
||||||
make_bincode_serializer().serialize(self)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
|
|
||||||
pub enum AuthenticatorRequestData {
|
|
||||||
Initial(InitMessage),
|
|
||||||
Final(Box<FinalMessage>),
|
|
||||||
QueryBandwidth(PeerPublicKey),
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(test)]
|
|
||||||
mod tests {
|
|
||||||
use super::*;
|
|
||||||
use std::str::FromStr;
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn check_first_bytes_protocol() {
|
|
||||||
let version = 2;
|
|
||||||
let data = AuthenticatorRequest {
|
|
||||||
protocol: Protocol { version, service_provider_type: ServiceProviderType::Authenticator },
|
|
||||||
data: AuthenticatorRequestData::Initial(InitMessage::new(
|
|
||||||
PeerPublicKey::from_str("yvNUDpT5l7W/xDhiu6HkqTHDQwbs/B3J5UrLmORl1EQ=").unwrap(),
|
|
||||||
)),
|
|
||||||
reply_to: Recipient::try_from_base58_string("D1rrpsysCGCYXy9saP8y3kmNpGtJZUXN9SvFoUcqAsM9.9Ssso1ea5NfkbMASdiseDSjTN1fSWda5SgEVjdSN4CvV@GJqd3ZxpXWSNxTfx7B1pPtswpetH4LnJdFeLeuY5KUuN").unwrap(),
|
|
||||||
request_id: 1,
|
|
||||||
};
|
|
||||||
let bytes = *data.to_bytes().unwrap().first_chunk::<2>().unwrap();
|
|
||||||
assert_eq!(bytes, [version, ServiceProviderType::Authenticator as u8]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,129 +0,0 @@
|
|||||||
// Copyright 2024 - Nym Technologies SA <contact@nymtech.net>
|
|
||||||
// SPDX-License-Identifier: Apache-2.0
|
|
||||||
|
|
||||||
use super::registration::{RegistrationData, RegistredData, RemainingBandwidthData};
|
|
||||||
use nym_service_provider_requests_common::{Protocol, ServiceProviderType};
|
|
||||||
use nym_sphinx::addressing::Recipient;
|
|
||||||
use serde::{Deserialize, Serialize};
|
|
||||||
|
|
||||||
use crate::make_bincode_serializer;
|
|
||||||
|
|
||||||
use super::VERSION;
|
|
||||||
|
|
||||||
#[derive(Clone, Debug, Serialize, Deserialize)]
|
|
||||||
pub struct AuthenticatorResponse {
|
|
||||||
pub protocol: Protocol,
|
|
||||||
pub data: AuthenticatorResponseData,
|
|
||||||
pub reply_to: Recipient,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl AuthenticatorResponse {
|
|
||||||
pub fn new_pending_registration_success(
|
|
||||||
registration_data: RegistrationData,
|
|
||||||
request_id: u64,
|
|
||||||
reply_to: Recipient,
|
|
||||||
) -> Self {
|
|
||||||
Self {
|
|
||||||
protocol: Protocol {
|
|
||||||
service_provider_type: ServiceProviderType::Authenticator,
|
|
||||||
version: VERSION,
|
|
||||||
},
|
|
||||||
data: AuthenticatorResponseData::PendingRegistration(PendingRegistrationResponse {
|
|
||||||
reply: registration_data,
|
|
||||||
reply_to,
|
|
||||||
request_id,
|
|
||||||
}),
|
|
||||||
reply_to,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn new_registered(
|
|
||||||
registred_data: RegistredData,
|
|
||||||
reply_to: Recipient,
|
|
||||||
request_id: u64,
|
|
||||||
) -> Self {
|
|
||||||
Self {
|
|
||||||
protocol: Protocol {
|
|
||||||
service_provider_type: ServiceProviderType::Authenticator,
|
|
||||||
version: VERSION,
|
|
||||||
},
|
|
||||||
data: AuthenticatorResponseData::Registered(RegisteredResponse {
|
|
||||||
reply: registred_data,
|
|
||||||
reply_to,
|
|
||||||
request_id,
|
|
||||||
}),
|
|
||||||
reply_to,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn new_remaining_bandwidth(
|
|
||||||
remaining_bandwidth_data: Option<RemainingBandwidthData>,
|
|
||||||
reply_to: Recipient,
|
|
||||||
request_id: u64,
|
|
||||||
) -> Self {
|
|
||||||
Self {
|
|
||||||
protocol: Protocol {
|
|
||||||
service_provider_type: ServiceProviderType::Authenticator,
|
|
||||||
version: VERSION,
|
|
||||||
},
|
|
||||||
data: AuthenticatorResponseData::RemainingBandwidth(RemainingBandwidthResponse {
|
|
||||||
reply: remaining_bandwidth_data,
|
|
||||||
reply_to,
|
|
||||||
request_id,
|
|
||||||
}),
|
|
||||||
reply_to,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn recipient(&self) -> Recipient {
|
|
||||||
self.reply_to
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn to_bytes(&self) -> Result<Vec<u8>, bincode::Error> {
|
|
||||||
use bincode::Options;
|
|
||||||
make_bincode_serializer().serialize(self)
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn from_reconstructed_message(
|
|
||||||
message: &nym_sphinx::receiver::ReconstructedMessage,
|
|
||||||
) -> Result<Self, bincode::Error> {
|
|
||||||
use bincode::Options;
|
|
||||||
make_bincode_serializer().deserialize(&message.message)
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn id(&self) -> Option<u64> {
|
|
||||||
match &self.data {
|
|
||||||
AuthenticatorResponseData::PendingRegistration(response) => Some(response.request_id),
|
|
||||||
AuthenticatorResponseData::Registered(response) => Some(response.request_id),
|
|
||||||
AuthenticatorResponseData::RemainingBandwidth(response) => Some(response.request_id),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
|
|
||||||
pub enum AuthenticatorResponseData {
|
|
||||||
PendingRegistration(PendingRegistrationResponse),
|
|
||||||
Registered(RegisteredResponse),
|
|
||||||
RemainingBandwidth(RemainingBandwidthResponse),
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
|
|
||||||
pub struct PendingRegistrationResponse {
|
|
||||||
pub request_id: u64,
|
|
||||||
pub reply_to: Recipient,
|
|
||||||
pub reply: RegistrationData,
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
|
|
||||||
pub struct RegisteredResponse {
|
|
||||||
pub request_id: u64,
|
|
||||||
pub reply_to: Recipient,
|
|
||||||
pub reply: RegistredData,
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
|
|
||||||
pub struct RemainingBandwidthResponse {
|
|
||||||
pub request_id: u64,
|
|
||||||
pub reply_to: Recipient,
|
|
||||||
pub reply: Option<RemainingBandwidthData>,
|
|
||||||
}
|
|
||||||
@@ -1,844 +0,0 @@
|
|||||||
// Copyright 2024 - Nym Technologies SA <contact@nymtech.net>
|
|
||||||
// SPDX-License-Identifier: Apache-2.0
|
|
||||||
|
|
||||||
use nym_service_provider_requests_common::{Protocol, ServiceProviderType};
|
|
||||||
|
|
||||||
use crate::{v2, v3};
|
|
||||||
|
|
||||||
impl From<v2::request::AuthenticatorRequest> for v3::request::AuthenticatorRequest {
|
|
||||||
fn from(authenticator_request: v2::request::AuthenticatorRequest) -> Self {
|
|
||||||
Self {
|
|
||||||
protocol: Protocol {
|
|
||||||
version: 3,
|
|
||||||
service_provider_type: ServiceProviderType::Authenticator,
|
|
||||||
},
|
|
||||||
data: authenticator_request.data.into(),
|
|
||||||
reply_to: authenticator_request.reply_to,
|
|
||||||
request_id: authenticator_request.request_id,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl TryFrom<v3::request::AuthenticatorRequest> for v2::request::AuthenticatorRequest {
|
|
||||||
type Error = crate::Error;
|
|
||||||
|
|
||||||
fn try_from(
|
|
||||||
authenticator_request: v3::request::AuthenticatorRequest,
|
|
||||||
) -> Result<Self, Self::Error> {
|
|
||||||
Ok(Self {
|
|
||||||
protocol: Protocol {
|
|
||||||
version: 2,
|
|
||||||
service_provider_type: ServiceProviderType::Authenticator,
|
|
||||||
},
|
|
||||||
data: authenticator_request.data.try_into()?,
|
|
||||||
reply_to: authenticator_request.reply_to,
|
|
||||||
request_id: authenticator_request.request_id,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<v2::request::AuthenticatorRequestData> for v3::request::AuthenticatorRequestData {
|
|
||||||
fn from(authenticator_request_data: v2::request::AuthenticatorRequestData) -> Self {
|
|
||||||
match authenticator_request_data {
|
|
||||||
v2::request::AuthenticatorRequestData::Initial(init_msg) => {
|
|
||||||
v3::request::AuthenticatorRequestData::Initial(init_msg.into())
|
|
||||||
}
|
|
||||||
v2::request::AuthenticatorRequestData::Final(gw_client) => {
|
|
||||||
v3::request::AuthenticatorRequestData::Final(gw_client.into())
|
|
||||||
}
|
|
||||||
v2::request::AuthenticatorRequestData::QueryBandwidth(pub_key) => {
|
|
||||||
v3::request::AuthenticatorRequestData::QueryBandwidth(pub_key)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl TryFrom<v3::request::AuthenticatorRequestData> for v2::request::AuthenticatorRequestData {
|
|
||||||
type Error = crate::Error;
|
|
||||||
|
|
||||||
fn try_from(
|
|
||||||
authenticator_request_data: v3::request::AuthenticatorRequestData,
|
|
||||||
) -> Result<Self, Self::Error> {
|
|
||||||
match authenticator_request_data {
|
|
||||||
v3::request::AuthenticatorRequestData::Initial(init_msg) => Ok(
|
|
||||||
v2::request::AuthenticatorRequestData::Initial(init_msg.into()),
|
|
||||||
),
|
|
||||||
v3::request::AuthenticatorRequestData::Final(gw_client) => Ok(
|
|
||||||
v2::request::AuthenticatorRequestData::Final(gw_client.into()),
|
|
||||||
),
|
|
||||||
v3::request::AuthenticatorRequestData::QueryBandwidth(pub_key) => Ok(
|
|
||||||
v2::request::AuthenticatorRequestData::QueryBandwidth(pub_key),
|
|
||||||
),
|
|
||||||
v3::request::AuthenticatorRequestData::TopUpBandwidth(_) => Err(
|
|
||||||
Self::Error::Conversion("no top up bandwidth variant in v2".to_string()),
|
|
||||||
),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<v2::registration::InitMessage> for v3::registration::InitMessage {
|
|
||||||
fn from(init_msg: v2::registration::InitMessage) -> Self {
|
|
||||||
Self {
|
|
||||||
pub_key: init_msg.pub_key,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<v3::registration::InitMessage> for v2::registration::InitMessage {
|
|
||||||
fn from(init_msg: v3::registration::InitMessage) -> Self {
|
|
||||||
Self {
|
|
||||||
pub_key: init_msg.pub_key,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<Box<v2::registration::FinalMessage>> for Box<v3::registration::FinalMessage> {
|
|
||||||
fn from(gw_client: Box<v2::registration::FinalMessage>) -> Self {
|
|
||||||
Box::new(v3::registration::FinalMessage {
|
|
||||||
gateway_client: gw_client.gateway_client.into(),
|
|
||||||
credential: gw_client.credential,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<Box<v3::registration::FinalMessage>> for Box<v2::registration::FinalMessage> {
|
|
||||||
fn from(gw_client: Box<v3::registration::FinalMessage>) -> Self {
|
|
||||||
Box::new(v2::registration::FinalMessage {
|
|
||||||
gateway_client: gw_client.gateway_client.into(),
|
|
||||||
credential: gw_client.credential,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<v2::registration::GatewayClient> for v3::registration::GatewayClient {
|
|
||||||
fn from(gw_client: v2::registration::GatewayClient) -> Self {
|
|
||||||
Self {
|
|
||||||
pub_key: gw_client.pub_key,
|
|
||||||
private_ip: gw_client.private_ip,
|
|
||||||
mac: gw_client.mac.into(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<v3::registration::GatewayClient> for v2::registration::GatewayClient {
|
|
||||||
fn from(gw_client: v3::registration::GatewayClient) -> Self {
|
|
||||||
Self {
|
|
||||||
pub_key: gw_client.pub_key,
|
|
||||||
private_ip: gw_client.private_ip,
|
|
||||||
mac: gw_client.mac.into(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<v2::registration::ClientMac> for v3::registration::ClientMac {
|
|
||||||
fn from(mac: v2::registration::ClientMac) -> Self {
|
|
||||||
Self::new(mac.to_vec())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<v3::registration::ClientMac> for v2::registration::ClientMac {
|
|
||||||
fn from(mac: v3::registration::ClientMac) -> Self {
|
|
||||||
Self::new(mac.to_vec())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl TryFrom<v3::response::AuthenticatorResponse> for v2::response::AuthenticatorResponse {
|
|
||||||
type Error = crate::Error;
|
|
||||||
|
|
||||||
fn try_from(
|
|
||||||
authenticator_response: v3::response::AuthenticatorResponse,
|
|
||||||
) -> Result<Self, Self::Error> {
|
|
||||||
Ok(Self {
|
|
||||||
data: authenticator_response.data.try_into()?,
|
|
||||||
reply_to: authenticator_response.reply_to,
|
|
||||||
protocol: Protocol {
|
|
||||||
version: 2,
|
|
||||||
service_provider_type: authenticator_response.protocol.service_provider_type,
|
|
||||||
},
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<v2::response::AuthenticatorResponse> for v3::response::AuthenticatorResponse {
|
|
||||||
fn from(value: v2::response::AuthenticatorResponse) -> Self {
|
|
||||||
Self {
|
|
||||||
protocol: Protocol {
|
|
||||||
version: 3,
|
|
||||||
service_provider_type: value.protocol.service_provider_type,
|
|
||||||
},
|
|
||||||
data: value.data.into(),
|
|
||||||
reply_to: value.reply_to,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl TryFrom<v3::response::AuthenticatorResponseData> for v2::response::AuthenticatorResponseData {
|
|
||||||
type Error = crate::Error;
|
|
||||||
|
|
||||||
fn try_from(
|
|
||||||
authenticator_response_data: v3::response::AuthenticatorResponseData,
|
|
||||||
) -> Result<Self, Self::Error> {
|
|
||||||
match authenticator_response_data {
|
|
||||||
v3::response::AuthenticatorResponseData::PendingRegistration(
|
|
||||||
pending_registration_response,
|
|
||||||
) => Ok(
|
|
||||||
v2::response::AuthenticatorResponseData::PendingRegistration(
|
|
||||||
pending_registration_response.into(),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
v3::response::AuthenticatorResponseData::Registered(registered_response) => Ok(
|
|
||||||
v2::response::AuthenticatorResponseData::Registered(registered_response.into()),
|
|
||||||
),
|
|
||||||
v3::response::AuthenticatorResponseData::RemainingBandwidth(
|
|
||||||
remaining_bandwidth_response,
|
|
||||||
) => Ok(v2::response::AuthenticatorResponseData::RemainingBandwidth(
|
|
||||||
remaining_bandwidth_response.into(),
|
|
||||||
)),
|
|
||||||
v3::response::AuthenticatorResponseData::TopUpBandwidth(_) => {
|
|
||||||
Err(Self::Error::Conversion(
|
|
||||||
"a v2 request couldn't produce a v3 only type of response".to_string(),
|
|
||||||
))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<v2::response::AuthenticatorResponseData> for v3::response::AuthenticatorResponseData {
|
|
||||||
fn from(value: v2::response::AuthenticatorResponseData) -> Self {
|
|
||||||
match value {
|
|
||||||
v2::response::AuthenticatorResponseData::PendingRegistration(
|
|
||||||
pending_registration_response,
|
|
||||||
) => Self::PendingRegistration(pending_registration_response.into()),
|
|
||||||
v2::response::AuthenticatorResponseData::Registered(registered_response) => {
|
|
||||||
Self::Registered(registered_response.into())
|
|
||||||
}
|
|
||||||
v2::response::AuthenticatorResponseData::RemainingBandwidth(
|
|
||||||
remaining_bandwidth_response,
|
|
||||||
) => Self::RemainingBandwidth(remaining_bandwidth_response.into()),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<v3::response::PendingRegistrationResponse> for v2::response::PendingRegistrationResponse {
|
|
||||||
fn from(value: v3::response::PendingRegistrationResponse) -> Self {
|
|
||||||
Self {
|
|
||||||
request_id: value.request_id,
|
|
||||||
reply_to: value.reply_to,
|
|
||||||
reply: value.reply.into(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<v2::response::PendingRegistrationResponse> for v3::response::PendingRegistrationResponse {
|
|
||||||
fn from(value: v2::response::PendingRegistrationResponse) -> Self {
|
|
||||||
Self {
|
|
||||||
request_id: value.request_id,
|
|
||||||
reply_to: value.reply_to,
|
|
||||||
reply: value.reply.into(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<v3::response::RegisteredResponse> for v2::response::RegisteredResponse {
|
|
||||||
fn from(value: v3::response::RegisteredResponse) -> Self {
|
|
||||||
Self {
|
|
||||||
request_id: value.request_id,
|
|
||||||
reply_to: value.reply_to,
|
|
||||||
reply: value.reply.into(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<v2::response::RegisteredResponse> for v3::response::RegisteredResponse {
|
|
||||||
fn from(value: v2::response::RegisteredResponse) -> Self {
|
|
||||||
Self {
|
|
||||||
request_id: value.request_id,
|
|
||||||
reply_to: value.reply_to,
|
|
||||||
reply: value.reply.into(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<v3::response::RemainingBandwidthResponse> for v2::response::RemainingBandwidthResponse {
|
|
||||||
fn from(value: v3::response::RemainingBandwidthResponse) -> Self {
|
|
||||||
Self {
|
|
||||||
request_id: value.request_id,
|
|
||||||
reply_to: value.reply_to,
|
|
||||||
reply: value.reply.map(Into::into),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<v2::response::RemainingBandwidthResponse> for v3::response::RemainingBandwidthResponse {
|
|
||||||
fn from(value: v2::response::RemainingBandwidthResponse) -> Self {
|
|
||||||
Self {
|
|
||||||
request_id: value.request_id,
|
|
||||||
reply_to: value.reply_to,
|
|
||||||
reply: value.reply.map(Into::into),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<v3::registration::RegistrationData> for v2::registration::RegistrationData {
|
|
||||||
fn from(value: v3::registration::RegistrationData) -> Self {
|
|
||||||
Self {
|
|
||||||
nonce: value.nonce,
|
|
||||||
gateway_data: value.gateway_data.into(),
|
|
||||||
wg_port: value.wg_port,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<v2::registration::RegistrationData> for v3::registration::RegistrationData {
|
|
||||||
fn from(value: v2::registration::RegistrationData) -> Self {
|
|
||||||
Self {
|
|
||||||
nonce: value.nonce,
|
|
||||||
gateway_data: value.gateway_data.into(),
|
|
||||||
wg_port: value.wg_port,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<v3::registration::RegistredData> for v2::registration::RegistredData {
|
|
||||||
fn from(value: v3::registration::RegistredData) -> Self {
|
|
||||||
Self {
|
|
||||||
pub_key: value.pub_key,
|
|
||||||
private_ip: value.private_ip,
|
|
||||||
wg_port: value.wg_port,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<v2::registration::RegistredData> for v3::registration::RegistredData {
|
|
||||||
fn from(value: v2::registration::RegistredData) -> Self {
|
|
||||||
Self {
|
|
||||||
pub_key: value.pub_key,
|
|
||||||
private_ip: value.private_ip,
|
|
||||||
wg_port: value.wg_port,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<v3::registration::RemainingBandwidthData> for v2::registration::RemainingBandwidthData {
|
|
||||||
fn from(value: v3::registration::RemainingBandwidthData) -> Self {
|
|
||||||
Self {
|
|
||||||
available_bandwidth: value.available_bandwidth,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<v2::registration::RemainingBandwidthData> for v3::registration::RemainingBandwidthData {
|
|
||||||
fn from(value: v2::registration::RemainingBandwidthData) -> Self {
|
|
||||||
Self {
|
|
||||||
available_bandwidth: value.available_bandwidth,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(test)]
|
|
||||||
mod tests {
|
|
||||||
use std::{net::IpAddr, str::FromStr};
|
|
||||||
|
|
||||||
use nym_credentials_interface::CredentialSpendingData;
|
|
||||||
use nym_crypto::asymmetric::encryption::PrivateKey;
|
|
||||||
use nym_sphinx::addressing::Recipient;
|
|
||||||
use nym_wireguard_types::PeerPublicKey;
|
|
||||||
use x25519_dalek::PublicKey;
|
|
||||||
|
|
||||||
use super::*;
|
|
||||||
use crate::util::tests::{CREDENTIAL_BYTES, RECIPIENT};
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn upgrade_initial_req() {
|
|
||||||
let pub_key = PeerPublicKey::new(PublicKey::from([0; 32]));
|
|
||||||
let reply_to = Recipient::try_from_base58_string(RECIPIENT).unwrap();
|
|
||||||
|
|
||||||
let (msg, _) = v2::request::AuthenticatorRequest::new_initial_request(
|
|
||||||
v2::registration::InitMessage::new(pub_key),
|
|
||||||
reply_to,
|
|
||||||
);
|
|
||||||
let upgraded_msg = v3::request::AuthenticatorRequest::from(msg);
|
|
||||||
|
|
||||||
assert_eq!(
|
|
||||||
upgraded_msg.protocol,
|
|
||||||
Protocol {
|
|
||||||
version: 3,
|
|
||||||
service_provider_type: ServiceProviderType::Authenticator
|
|
||||||
}
|
|
||||||
);
|
|
||||||
assert_eq!(
|
|
||||||
upgraded_msg.data,
|
|
||||||
v3::request::AuthenticatorRequestData::Initial(v3::registration::InitMessage {
|
|
||||||
pub_key
|
|
||||||
})
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn downgrade_initial_req() {
|
|
||||||
let pub_key = PeerPublicKey::new(PublicKey::from([0; 32]));
|
|
||||||
let reply_to = Recipient::try_from_base58_string(RECIPIENT).unwrap();
|
|
||||||
|
|
||||||
let (msg, _) = v3::request::AuthenticatorRequest::new_initial_request(
|
|
||||||
v3::registration::InitMessage::new(pub_key),
|
|
||||||
reply_to,
|
|
||||||
);
|
|
||||||
let downgraded_msg = v2::request::AuthenticatorRequest::try_from(msg).unwrap();
|
|
||||||
|
|
||||||
assert_eq!(
|
|
||||||
downgraded_msg.protocol,
|
|
||||||
Protocol {
|
|
||||||
version: 2,
|
|
||||||
service_provider_type: ServiceProviderType::Authenticator
|
|
||||||
}
|
|
||||||
);
|
|
||||||
assert_eq!(
|
|
||||||
downgraded_msg.data,
|
|
||||||
v2::request::AuthenticatorRequestData::Initial(v2::registration::InitMessage {
|
|
||||||
pub_key
|
|
||||||
})
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn upgrade_final_req() {
|
|
||||||
let mut rng = rand::thread_rng();
|
|
||||||
|
|
||||||
let local_secret = PrivateKey::new(&mut rng);
|
|
||||||
let remote_secret = x25519_dalek::StaticSecret::random_from_rng(&mut rng);
|
|
||||||
let private_ip = IpAddr::from_str("10.10.10.10").unwrap();
|
|
||||||
let nonce = 42;
|
|
||||||
let gateway_client = v2::registration::GatewayClient::new(
|
|
||||||
&local_secret,
|
|
||||||
(&remote_secret).into(),
|
|
||||||
private_ip,
|
|
||||||
nonce,
|
|
||||||
);
|
|
||||||
let credential = Some(CredentialSpendingData::try_from_bytes(&CREDENTIAL_BYTES).unwrap());
|
|
||||||
let final_message = v2::registration::FinalMessage {
|
|
||||||
gateway_client,
|
|
||||||
credential: credential.clone(),
|
|
||||||
};
|
|
||||||
let reply_to = Recipient::try_from_base58_string(RECIPIENT).unwrap();
|
|
||||||
|
|
||||||
let (msg, _) =
|
|
||||||
v2::request::AuthenticatorRequest::new_final_request(final_message, reply_to);
|
|
||||||
let upgraded_msg = v3::request::AuthenticatorRequest::from(msg);
|
|
||||||
|
|
||||||
assert_eq!(
|
|
||||||
upgraded_msg.protocol,
|
|
||||||
Protocol {
|
|
||||||
version: 3,
|
|
||||||
service_provider_type: ServiceProviderType::Authenticator
|
|
||||||
}
|
|
||||||
);
|
|
||||||
assert_eq!(
|
|
||||||
upgraded_msg.data,
|
|
||||||
v3::request::AuthenticatorRequestData::Final(Box::new(
|
|
||||||
v3::registration::FinalMessage {
|
|
||||||
gateway_client: v3::registration::GatewayClient::new(
|
|
||||||
&local_secret,
|
|
||||||
(&remote_secret).into(),
|
|
||||||
private_ip,
|
|
||||||
nonce,
|
|
||||||
),
|
|
||||||
credential
|
|
||||||
}
|
|
||||||
))
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn downgrade_final_req() {
|
|
||||||
let mut rng = rand::thread_rng();
|
|
||||||
|
|
||||||
let local_secret = PrivateKey::new(&mut rng);
|
|
||||||
let remote_secret = x25519_dalek::StaticSecret::random_from_rng(&mut rng);
|
|
||||||
let private_ip = IpAddr::from_str("10.10.10.10").unwrap();
|
|
||||||
let nonce = 42;
|
|
||||||
let gateway_client = v3::registration::GatewayClient::new(
|
|
||||||
&local_secret,
|
|
||||||
(&remote_secret).into(),
|
|
||||||
private_ip,
|
|
||||||
nonce,
|
|
||||||
);
|
|
||||||
let credential = Some(CredentialSpendingData::try_from_bytes(&CREDENTIAL_BYTES).unwrap());
|
|
||||||
let final_message = v3::registration::FinalMessage {
|
|
||||||
gateway_client,
|
|
||||||
credential: credential.clone(),
|
|
||||||
};
|
|
||||||
let reply_to = Recipient::try_from_base58_string(RECIPIENT).unwrap();
|
|
||||||
|
|
||||||
let (msg, _) =
|
|
||||||
v3::request::AuthenticatorRequest::new_final_request(final_message, reply_to);
|
|
||||||
let upgraded_msg = v2::request::AuthenticatorRequest::try_from(msg).unwrap();
|
|
||||||
|
|
||||||
assert_eq!(
|
|
||||||
upgraded_msg.protocol,
|
|
||||||
Protocol {
|
|
||||||
version: 2,
|
|
||||||
service_provider_type: ServiceProviderType::Authenticator
|
|
||||||
}
|
|
||||||
);
|
|
||||||
assert_eq!(
|
|
||||||
upgraded_msg.data,
|
|
||||||
v2::request::AuthenticatorRequestData::Final(Box::new(
|
|
||||||
v2::registration::FinalMessage {
|
|
||||||
gateway_client: v2::registration::GatewayClient::new(
|
|
||||||
&local_secret,
|
|
||||||
(&remote_secret).into(),
|
|
||||||
private_ip,
|
|
||||||
nonce,
|
|
||||||
),
|
|
||||||
credential
|
|
||||||
}
|
|
||||||
))
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn upgrade_query_req() {
|
|
||||||
let pub_key = PeerPublicKey::new(PublicKey::from([0; 32]));
|
|
||||||
let reply_to = Recipient::try_from_base58_string(RECIPIENT).unwrap();
|
|
||||||
|
|
||||||
let (msg, _) = v2::request::AuthenticatorRequest::new_query_request(pub_key, reply_to);
|
|
||||||
let upgraded_msg = v3::request::AuthenticatorRequest::from(msg);
|
|
||||||
|
|
||||||
assert_eq!(
|
|
||||||
upgraded_msg.protocol,
|
|
||||||
Protocol {
|
|
||||||
version: 3,
|
|
||||||
service_provider_type: ServiceProviderType::Authenticator
|
|
||||||
}
|
|
||||||
);
|
|
||||||
assert_eq!(
|
|
||||||
upgraded_msg.data,
|
|
||||||
v3::request::AuthenticatorRequestData::QueryBandwidth(pub_key)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn downgrade_query_req() {
|
|
||||||
let pub_key = PeerPublicKey::new(PublicKey::from([0; 32]));
|
|
||||||
let reply_to = Recipient::try_from_base58_string(RECIPIENT).unwrap();
|
|
||||||
|
|
||||||
let (msg, _) = v3::request::AuthenticatorRequest::new_query_request(pub_key, reply_to);
|
|
||||||
let downgraded_msg = v2::request::AuthenticatorRequest::try_from(msg).unwrap();
|
|
||||||
|
|
||||||
assert_eq!(
|
|
||||||
downgraded_msg.protocol,
|
|
||||||
Protocol {
|
|
||||||
version: 2,
|
|
||||||
service_provider_type: ServiceProviderType::Authenticator
|
|
||||||
}
|
|
||||||
);
|
|
||||||
assert_eq!(
|
|
||||||
downgraded_msg.data,
|
|
||||||
v2::request::AuthenticatorRequestData::QueryBandwidth(pub_key)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn downgrade_topup_req() {
|
|
||||||
let pub_key = PeerPublicKey::new(PublicKey::from([0; 32]));
|
|
||||||
let credential = CredentialSpendingData::try_from_bytes(&CREDENTIAL_BYTES).unwrap();
|
|
||||||
let top_up_message = v3::topup::TopUpMessage {
|
|
||||||
pub_key,
|
|
||||||
credential,
|
|
||||||
};
|
|
||||||
let reply_to = Recipient::try_from_base58_string(RECIPIENT).unwrap();
|
|
||||||
|
|
||||||
let (msg, _) =
|
|
||||||
v3::request::AuthenticatorRequest::new_topup_request(top_up_message, reply_to);
|
|
||||||
assert!(v2::request::AuthenticatorRequest::try_from(msg).is_err());
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn upgrade_pending_reg_resp() {
|
|
||||||
let mut rng = rand::thread_rng();
|
|
||||||
|
|
||||||
let local_secret = PrivateKey::new(&mut rng);
|
|
||||||
let remote_secret = x25519_dalek::StaticSecret::random_from_rng(&mut rng);
|
|
||||||
let private_ip = IpAddr::from_str("10.10.10.10").unwrap();
|
|
||||||
let nonce = 42;
|
|
||||||
let wg_port = 51822;
|
|
||||||
let gateway_data = v2::registration::GatewayClient::new(
|
|
||||||
&local_secret,
|
|
||||||
(&remote_secret).into(),
|
|
||||||
private_ip,
|
|
||||||
nonce,
|
|
||||||
);
|
|
||||||
let registration_data = v2::registration::RegistrationData {
|
|
||||||
nonce,
|
|
||||||
gateway_data,
|
|
||||||
wg_port,
|
|
||||||
};
|
|
||||||
let request_id = 123;
|
|
||||||
let reply_to = Recipient::try_from_base58_string(RECIPIENT).unwrap();
|
|
||||||
|
|
||||||
let msg = v2::response::AuthenticatorResponse::new_pending_registration_success(
|
|
||||||
registration_data,
|
|
||||||
request_id,
|
|
||||||
reply_to,
|
|
||||||
);
|
|
||||||
let upgraded_msg = v3::response::AuthenticatorResponse::from(msg);
|
|
||||||
|
|
||||||
assert_eq!(
|
|
||||||
upgraded_msg.protocol,
|
|
||||||
Protocol {
|
|
||||||
version: 3,
|
|
||||||
service_provider_type: ServiceProviderType::Authenticator
|
|
||||||
}
|
|
||||||
);
|
|
||||||
assert_eq!(
|
|
||||||
upgraded_msg.data,
|
|
||||||
v3::response::AuthenticatorResponseData::PendingRegistration(
|
|
||||||
v3::response::PendingRegistrationResponse {
|
|
||||||
request_id,
|
|
||||||
reply_to,
|
|
||||||
reply: v3::registration::RegistrationData {
|
|
||||||
nonce,
|
|
||||||
gateway_data: v3::registration::GatewayClient::new(
|
|
||||||
&local_secret,
|
|
||||||
(&remote_secret).into(),
|
|
||||||
private_ip,
|
|
||||||
nonce,
|
|
||||||
),
|
|
||||||
wg_port,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn downgrade_pending_reg_resp() {
|
|
||||||
let mut rng = rand::thread_rng();
|
|
||||||
|
|
||||||
let local_secret = PrivateKey::new(&mut rng);
|
|
||||||
let remote_secret = x25519_dalek::StaticSecret::random_from_rng(&mut rng);
|
|
||||||
let private_ip = IpAddr::from_str("10.10.10.10").unwrap();
|
|
||||||
let nonce = 42;
|
|
||||||
let wg_port = 51822;
|
|
||||||
let gateway_data = v3::registration::GatewayClient::new(
|
|
||||||
&local_secret,
|
|
||||||
(&remote_secret).into(),
|
|
||||||
private_ip,
|
|
||||||
nonce,
|
|
||||||
);
|
|
||||||
let registration_data = v3::registration::RegistrationData {
|
|
||||||
nonce,
|
|
||||||
gateway_data,
|
|
||||||
wg_port,
|
|
||||||
};
|
|
||||||
let request_id = 123;
|
|
||||||
let reply_to = Recipient::try_from_base58_string(RECIPIENT).unwrap();
|
|
||||||
|
|
||||||
let msg = v3::response::AuthenticatorResponse::new_pending_registration_success(
|
|
||||||
registration_data,
|
|
||||||
request_id,
|
|
||||||
reply_to,
|
|
||||||
);
|
|
||||||
let downgraded_msg = v2::response::AuthenticatorResponse::try_from(msg).unwrap();
|
|
||||||
|
|
||||||
assert_eq!(
|
|
||||||
downgraded_msg.protocol,
|
|
||||||
Protocol {
|
|
||||||
version: 2,
|
|
||||||
service_provider_type: ServiceProviderType::Authenticator
|
|
||||||
}
|
|
||||||
);
|
|
||||||
assert_eq!(
|
|
||||||
downgraded_msg.data,
|
|
||||||
v2::response::AuthenticatorResponseData::PendingRegistration(
|
|
||||||
v2::response::PendingRegistrationResponse {
|
|
||||||
request_id,
|
|
||||||
reply_to,
|
|
||||||
reply: v2::registration::RegistrationData {
|
|
||||||
nonce,
|
|
||||||
gateway_data: v2::registration::GatewayClient::new(
|
|
||||||
&local_secret,
|
|
||||||
(&remote_secret).into(),
|
|
||||||
private_ip,
|
|
||||||
nonce,
|
|
||||||
),
|
|
||||||
wg_port,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn upgrade_registered_resp() {
|
|
||||||
let pub_key = PeerPublicKey::new(PublicKey::from([0; 32]));
|
|
||||||
let private_ip = IpAddr::from_str("10.10.10.10").unwrap();
|
|
||||||
let wg_port = 51822;
|
|
||||||
let registred_data = v2::registration::RegistredData {
|
|
||||||
pub_key,
|
|
||||||
private_ip,
|
|
||||||
wg_port,
|
|
||||||
};
|
|
||||||
let request_id = 123;
|
|
||||||
let reply_to = Recipient::try_from_base58_string(RECIPIENT).unwrap();
|
|
||||||
|
|
||||||
let msg = v2::response::AuthenticatorResponse::new_registered(
|
|
||||||
registred_data,
|
|
||||||
reply_to,
|
|
||||||
request_id,
|
|
||||||
);
|
|
||||||
let upgraded_msg = v3::response::AuthenticatorResponse::from(msg);
|
|
||||||
|
|
||||||
assert_eq!(
|
|
||||||
upgraded_msg.protocol,
|
|
||||||
Protocol {
|
|
||||||
version: 3,
|
|
||||||
service_provider_type: ServiceProviderType::Authenticator
|
|
||||||
}
|
|
||||||
);
|
|
||||||
assert_eq!(
|
|
||||||
upgraded_msg.data,
|
|
||||||
v3::response::AuthenticatorResponseData::Registered(v3::response::RegisteredResponse {
|
|
||||||
request_id,
|
|
||||||
reply_to,
|
|
||||||
reply: v3::registration::RegistredData {
|
|
||||||
wg_port,
|
|
||||||
pub_key,
|
|
||||||
private_ip
|
|
||||||
}
|
|
||||||
})
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn downgrade_registered_resp() {
|
|
||||||
let pub_key = PeerPublicKey::new(PublicKey::from([0; 32]));
|
|
||||||
let private_ip = IpAddr::from_str("10.10.10.10").unwrap();
|
|
||||||
let wg_port = 51822;
|
|
||||||
let registred_data = v3::registration::RegistredData {
|
|
||||||
pub_key,
|
|
||||||
private_ip,
|
|
||||||
wg_port,
|
|
||||||
};
|
|
||||||
let request_id = 123;
|
|
||||||
let reply_to = Recipient::try_from_base58_string(RECIPIENT).unwrap();
|
|
||||||
|
|
||||||
let msg = v3::response::AuthenticatorResponse::new_registered(
|
|
||||||
registred_data,
|
|
||||||
reply_to,
|
|
||||||
request_id,
|
|
||||||
);
|
|
||||||
let downgraded_msg = v2::response::AuthenticatorResponse::try_from(msg).unwrap();
|
|
||||||
|
|
||||||
assert_eq!(
|
|
||||||
downgraded_msg.protocol,
|
|
||||||
Protocol {
|
|
||||||
version: 2,
|
|
||||||
service_provider_type: ServiceProviderType::Authenticator
|
|
||||||
}
|
|
||||||
);
|
|
||||||
assert_eq!(
|
|
||||||
downgraded_msg.data,
|
|
||||||
v2::response::AuthenticatorResponseData::Registered(v2::response::RegisteredResponse {
|
|
||||||
request_id,
|
|
||||||
reply_to,
|
|
||||||
reply: v2::registration::RegistredData {
|
|
||||||
wg_port,
|
|
||||||
pub_key,
|
|
||||||
private_ip
|
|
||||||
}
|
|
||||||
})
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn upgrade_remaining_bandwidth_resp() {
|
|
||||||
let available_bandwidth = 42;
|
|
||||||
let remaining_bandwidth_data = Some(v2::registration::RemainingBandwidthData {
|
|
||||||
available_bandwidth,
|
|
||||||
});
|
|
||||||
let request_id = 123;
|
|
||||||
let reply_to = Recipient::try_from_base58_string(RECIPIENT).unwrap();
|
|
||||||
|
|
||||||
let msg = v2::response::AuthenticatorResponse::new_remaining_bandwidth(
|
|
||||||
remaining_bandwidth_data,
|
|
||||||
reply_to,
|
|
||||||
request_id,
|
|
||||||
);
|
|
||||||
let upgraded_msg = v3::response::AuthenticatorResponse::from(msg);
|
|
||||||
|
|
||||||
assert_eq!(
|
|
||||||
upgraded_msg.protocol,
|
|
||||||
Protocol {
|
|
||||||
version: 3,
|
|
||||||
service_provider_type: ServiceProviderType::Authenticator
|
|
||||||
}
|
|
||||||
);
|
|
||||||
assert_eq!(
|
|
||||||
upgraded_msg.data,
|
|
||||||
v3::response::AuthenticatorResponseData::RemainingBandwidth(
|
|
||||||
v3::response::RemainingBandwidthResponse {
|
|
||||||
request_id,
|
|
||||||
reply_to,
|
|
||||||
reply: Some(v3::registration::RemainingBandwidthData {
|
|
||||||
available_bandwidth,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn downgrade_remaining_bandwidth_resp() {
|
|
||||||
let available_bandwidth = 42;
|
|
||||||
let remaining_bandwidth_data = Some(v3::registration::RemainingBandwidthData {
|
|
||||||
available_bandwidth,
|
|
||||||
});
|
|
||||||
let request_id = 123;
|
|
||||||
let reply_to = Recipient::try_from_base58_string(RECIPIENT).unwrap();
|
|
||||||
|
|
||||||
let msg = v3::response::AuthenticatorResponse::new_remaining_bandwidth(
|
|
||||||
remaining_bandwidth_data,
|
|
||||||
reply_to,
|
|
||||||
request_id,
|
|
||||||
);
|
|
||||||
let downgraded_msg = v2::response::AuthenticatorResponse::try_from(msg).unwrap();
|
|
||||||
|
|
||||||
assert_eq!(
|
|
||||||
downgraded_msg.protocol,
|
|
||||||
Protocol {
|
|
||||||
version: 2,
|
|
||||||
service_provider_type: ServiceProviderType::Authenticator
|
|
||||||
}
|
|
||||||
);
|
|
||||||
assert_eq!(
|
|
||||||
downgraded_msg.data,
|
|
||||||
v2::response::AuthenticatorResponseData::RemainingBandwidth(
|
|
||||||
v2::response::RemainingBandwidthResponse {
|
|
||||||
request_id,
|
|
||||||
reply_to,
|
|
||||||
reply: Some(v2::registration::RemainingBandwidthData {
|
|
||||||
available_bandwidth,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn downgrade_topup_resp() {
|
|
||||||
let available_bandwidth = 42;
|
|
||||||
let remaining_bandwidth_data = v3::registration::RemainingBandwidthData {
|
|
||||||
available_bandwidth,
|
|
||||||
};
|
|
||||||
let request_id = 123;
|
|
||||||
let reply_to = Recipient::try_from_base58_string(RECIPIENT).unwrap();
|
|
||||||
|
|
||||||
let msg = v3::response::AuthenticatorResponse::new_topup_bandwidth(
|
|
||||||
remaining_bandwidth_data,
|
|
||||||
reply_to,
|
|
||||||
request_id,
|
|
||||||
);
|
|
||||||
assert!(v2::response::AuthenticatorResponse::try_from(msg).is_err());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
// Copyright 2024 - Nym Technologies SA <contact@nymtech.net>
|
|
||||||
// SPDX-License-Identifier: Apache-2.0
|
|
||||||
|
|
||||||
pub mod conversion;
|
|
||||||
pub mod registration;
|
|
||||||
pub mod request;
|
|
||||||
pub mod response;
|
|
||||||
pub mod topup;
|
|
||||||
|
|
||||||
pub const VERSION: u8 = 3;
|
|
||||||
@@ -1,227 +0,0 @@
|
|||||||
// -2024 - Nym Technologies SA <contact@nymtech.net>
|
|
||||||
// SPDX-License-Identifier: Apache-2.0
|
|
||||||
|
|
||||||
use crate::error::Error;
|
|
||||||
use base64::{engine::general_purpose, Engine};
|
|
||||||
use nym_credentials_interface::CredentialSpendingData;
|
|
||||||
use nym_wireguard_types::PeerPublicKey;
|
|
||||||
use serde::{Deserialize, Serialize};
|
|
||||||
use std::collections::HashMap;
|
|
||||||
use std::net::IpAddr;
|
|
||||||
use std::time::SystemTime;
|
|
||||||
use std::{fmt, ops::Deref, str::FromStr};
|
|
||||||
|
|
||||||
#[cfg(feature = "verify")]
|
|
||||||
use hmac::{Hmac, Mac};
|
|
||||||
#[cfg(feature = "verify")]
|
|
||||||
use nym_crypto::asymmetric::encryption::PrivateKey;
|
|
||||||
#[cfg(feature = "verify")]
|
|
||||||
use sha2::Sha256;
|
|
||||||
|
|
||||||
pub type PendingRegistrations = HashMap<PeerPublicKey, RegistrationData>;
|
|
||||||
pub type PrivateIPs = HashMap<IpAddr, Taken>;
|
|
||||||
|
|
||||||
#[cfg(feature = "verify")]
|
|
||||||
pub type HmacSha256 = Hmac<Sha256>;
|
|
||||||
|
|
||||||
pub type Nonce = u64;
|
|
||||||
pub type Taken = Option<SystemTime>;
|
|
||||||
|
|
||||||
pub const BANDWIDTH_CAP_PER_DAY: u64 = 250 * 1024 * 1024 * 1024; // 250 GB
|
|
||||||
|
|
||||||
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
|
|
||||||
pub struct InitMessage {
|
|
||||||
/// Base64 encoded x25519 public key
|
|
||||||
pub pub_key: PeerPublicKey,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl InitMessage {
|
|
||||||
pub fn new(pub_key: PeerPublicKey) -> Self {
|
|
||||||
InitMessage { pub_key }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
|
|
||||||
pub struct FinalMessage {
|
|
||||||
/// Gateway client data
|
|
||||||
pub gateway_client: GatewayClient,
|
|
||||||
|
|
||||||
/// Ecash credential
|
|
||||||
pub credential: Option<CredentialSpendingData>,
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
|
|
||||||
pub struct RegistrationData {
|
|
||||||
pub nonce: u64,
|
|
||||||
pub gateway_data: GatewayClient,
|
|
||||||
pub wg_port: u16,
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
|
|
||||||
pub struct RegistredData {
|
|
||||||
pub pub_key: PeerPublicKey,
|
|
||||||
pub private_ip: IpAddr,
|
|
||||||
pub wg_port: u16,
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
|
|
||||||
pub struct RemainingBandwidthData {
|
|
||||||
pub available_bandwidth: i64,
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Client that wants to register sends its PublicKey bytes mac digest encrypted with a DH shared secret.
|
|
||||||
/// Gateway/Nym node can then verify pub_key payload using the same process
|
|
||||||
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
|
|
||||||
pub struct GatewayClient {
|
|
||||||
/// Base64 encoded x25519 public key
|
|
||||||
pub pub_key: PeerPublicKey,
|
|
||||||
|
|
||||||
/// Assigned private IP
|
|
||||||
pub private_ip: IpAddr,
|
|
||||||
|
|
||||||
/// Sha256 hmac on the data (alongside the prior nonce)
|
|
||||||
pub mac: ClientMac,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl GatewayClient {
|
|
||||||
#[cfg(feature = "verify")]
|
|
||||||
pub fn new(
|
|
||||||
local_secret: &PrivateKey,
|
|
||||||
remote_public: x25519_dalek::PublicKey,
|
|
||||||
private_ip: IpAddr,
|
|
||||||
nonce: u64,
|
|
||||||
) -> Self {
|
|
||||||
// convert from 1.0 x25519-dalek private key into 2.0 x25519-dalek
|
|
||||||
#[allow(clippy::expect_used)]
|
|
||||||
let static_secret = x25519_dalek::StaticSecret::from(local_secret.to_bytes());
|
|
||||||
let local_public: x25519_dalek::PublicKey = (&static_secret).into();
|
|
||||||
|
|
||||||
let dh = static_secret.diffie_hellman(&remote_public);
|
|
||||||
|
|
||||||
// TODO: change that to use our nym_crypto::hmac module instead
|
|
||||||
#[allow(clippy::expect_used)]
|
|
||||||
let mut mac = HmacSha256::new_from_slice(dh.as_bytes())
|
|
||||||
.expect("x25519 shared secret is always 32 bytes long");
|
|
||||||
|
|
||||||
mac.update(local_public.as_bytes());
|
|
||||||
mac.update(private_ip.to_string().as_bytes());
|
|
||||||
mac.update(&nonce.to_le_bytes());
|
|
||||||
|
|
||||||
GatewayClient {
|
|
||||||
pub_key: PeerPublicKey::new(local_public),
|
|
||||||
private_ip,
|
|
||||||
mac: ClientMac(mac.finalize().into_bytes().to_vec()),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Reusable secret should be gateways Wireguard PK
|
|
||||||
// Client should perform this step when generating its payload, using its own WG PK
|
|
||||||
#[cfg(feature = "verify")]
|
|
||||||
pub fn verify(&self, gateway_key: &PrivateKey, nonce: u64) -> Result<(), Error> {
|
|
||||||
// convert from 1.0 x25519-dalek private key into 2.0 x25519-dalek
|
|
||||||
#[allow(clippy::expect_used)]
|
|
||||||
let static_secret = x25519_dalek::StaticSecret::from(gateway_key.to_bytes());
|
|
||||||
|
|
||||||
let dh = static_secret.diffie_hellman(&self.pub_key);
|
|
||||||
|
|
||||||
// TODO: change that to use our nym_crypto::hmac module instead
|
|
||||||
#[allow(clippy::expect_used)]
|
|
||||||
let mut mac = HmacSha256::new_from_slice(dh.as_bytes())
|
|
||||||
.expect("x25519 shared secret is always 32 bytes long");
|
|
||||||
|
|
||||||
mac.update(self.pub_key.as_bytes());
|
|
||||||
mac.update(self.private_ip.to_string().as_bytes());
|
|
||||||
mac.update(&nonce.to_le_bytes());
|
|
||||||
|
|
||||||
mac.verify_slice(&self.mac)
|
|
||||||
.map_err(|source| Error::FailedClientMacVerification {
|
|
||||||
client: self.pub_key.to_string(),
|
|
||||||
source,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn pub_key(&self) -> PeerPublicKey {
|
|
||||||
self.pub_key
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: change the inner type into generic array of size HmacSha256::OutputSize
|
|
||||||
// TODO2: rely on our internal crypto/hmac
|
|
||||||
#[derive(Debug, Clone, PartialEq)]
|
|
||||||
pub struct ClientMac(Vec<u8>);
|
|
||||||
|
|
||||||
impl fmt::Display for ClientMac {
|
|
||||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
|
||||||
write!(f, "{}", general_purpose::STANDARD.encode(&self.0))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl ClientMac {
|
|
||||||
#[allow(dead_code)]
|
|
||||||
pub fn new(mac: Vec<u8>) -> Self {
|
|
||||||
ClientMac(mac)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Deref for ClientMac {
|
|
||||||
type Target = Vec<u8>;
|
|
||||||
|
|
||||||
fn deref(&self) -> &Self::Target {
|
|
||||||
&self.0
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl FromStr for ClientMac {
|
|
||||||
type Err = Error;
|
|
||||||
|
|
||||||
fn from_str(s: &str) -> Result<Self, Self::Err> {
|
|
||||||
let mac_bytes: Vec<u8> =
|
|
||||||
general_purpose::STANDARD
|
|
||||||
.decode(s)
|
|
||||||
.map_err(|source| Error::MalformedClientMac {
|
|
||||||
mac: s.to_string(),
|
|
||||||
source,
|
|
||||||
})?;
|
|
||||||
|
|
||||||
Ok(ClientMac(mac_bytes))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Serialize for ClientMac {
|
|
||||||
fn serialize<S: serde::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
|
|
||||||
let encoded_key = general_purpose::STANDARD.encode(self.0.clone());
|
|
||||||
serializer.serialize_str(&encoded_key)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<'de> Deserialize<'de> for ClientMac {
|
|
||||||
fn deserialize<D: serde::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
|
|
||||||
let encoded_key = String::deserialize(deserializer)?;
|
|
||||||
ClientMac::from_str(&encoded_key).map_err(serde::de::Error::custom)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(test)]
|
|
||||||
mod tests {
|
|
||||||
use super::*;
|
|
||||||
use nym_crypto::asymmetric::encryption;
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
#[cfg(feature = "verify")]
|
|
||||||
fn client_request_roundtrip() {
|
|
||||||
let mut rng = rand::thread_rng();
|
|
||||||
|
|
||||||
let gateway_key_pair = encryption::KeyPair::new(&mut rng);
|
|
||||||
let client_key_pair = encryption::KeyPair::new(&mut rng);
|
|
||||||
|
|
||||||
let nonce = 1234567890;
|
|
||||||
|
|
||||||
let client = GatewayClient::new(
|
|
||||||
client_key_pair.private_key(),
|
|
||||||
x25519_dalek::PublicKey::from(gateway_key_pair.public_key().to_bytes()),
|
|
||||||
"10.0.0.42".parse().unwrap(),
|
|
||||||
nonce,
|
|
||||||
);
|
|
||||||
assert!(client.verify(gateway_key_pair.private_key(), nonce).is_ok())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,136 +0,0 @@
|
|||||||
// Copyright 2024 - Nym Technologies SA <contact@nymtech.net>
|
|
||||||
// SPDX-License-Identifier: Apache-2.0
|
|
||||||
|
|
||||||
use super::{
|
|
||||||
registration::{FinalMessage, InitMessage},
|
|
||||||
topup::TopUpMessage,
|
|
||||||
};
|
|
||||||
use nym_service_provider_requests_common::{Protocol, ServiceProviderType};
|
|
||||||
use nym_sphinx::addressing::Recipient;
|
|
||||||
use nym_wireguard_types::PeerPublicKey;
|
|
||||||
use serde::{Deserialize, Serialize};
|
|
||||||
|
|
||||||
use crate::make_bincode_serializer;
|
|
||||||
|
|
||||||
use super::VERSION;
|
|
||||||
|
|
||||||
fn generate_random() -> u64 {
|
|
||||||
use rand::RngCore;
|
|
||||||
let mut rng = rand::rngs::OsRng;
|
|
||||||
rng.next_u64()
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Clone, Debug, Serialize, Deserialize)]
|
|
||||||
pub struct AuthenticatorRequest {
|
|
||||||
pub protocol: Protocol,
|
|
||||||
pub data: AuthenticatorRequestData,
|
|
||||||
pub reply_to: Recipient,
|
|
||||||
pub request_id: u64,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl AuthenticatorRequest {
|
|
||||||
pub fn from_reconstructed_message(
|
|
||||||
message: &nym_sphinx::receiver::ReconstructedMessage,
|
|
||||||
) -> Result<Self, bincode::Error> {
|
|
||||||
use bincode::Options;
|
|
||||||
make_bincode_serializer().deserialize(&message.message)
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn new_initial_request(init_message: InitMessage, reply_to: Recipient) -> (Self, u64) {
|
|
||||||
let request_id = generate_random();
|
|
||||||
(
|
|
||||||
Self {
|
|
||||||
protocol: Protocol {
|
|
||||||
service_provider_type: ServiceProviderType::Authenticator,
|
|
||||||
version: VERSION,
|
|
||||||
},
|
|
||||||
data: AuthenticatorRequestData::Initial(init_message),
|
|
||||||
reply_to,
|
|
||||||
request_id,
|
|
||||||
},
|
|
||||||
request_id,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn new_final_request(final_message: FinalMessage, reply_to: Recipient) -> (Self, u64) {
|
|
||||||
let request_id = generate_random();
|
|
||||||
(
|
|
||||||
Self {
|
|
||||||
protocol: Protocol {
|
|
||||||
service_provider_type: ServiceProviderType::Authenticator,
|
|
||||||
version: VERSION,
|
|
||||||
},
|
|
||||||
data: AuthenticatorRequestData::Final(Box::new(final_message)),
|
|
||||||
reply_to,
|
|
||||||
request_id,
|
|
||||||
},
|
|
||||||
request_id,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn new_query_request(peer_public_key: PeerPublicKey, reply_to: Recipient) -> (Self, u64) {
|
|
||||||
let request_id = generate_random();
|
|
||||||
(
|
|
||||||
Self {
|
|
||||||
protocol: Protocol {
|
|
||||||
service_provider_type: ServiceProviderType::Authenticator,
|
|
||||||
version: VERSION,
|
|
||||||
},
|
|
||||||
data: AuthenticatorRequestData::QueryBandwidth(peer_public_key),
|
|
||||||
reply_to,
|
|
||||||
request_id,
|
|
||||||
},
|
|
||||||
request_id,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn new_topup_request(top_up_message: TopUpMessage, reply_to: Recipient) -> (Self, u64) {
|
|
||||||
let request_id = generate_random();
|
|
||||||
(
|
|
||||||
Self {
|
|
||||||
protocol: Protocol {
|
|
||||||
service_provider_type: ServiceProviderType::Authenticator,
|
|
||||||
version: VERSION,
|
|
||||||
},
|
|
||||||
data: AuthenticatorRequestData::TopUpBandwidth(Box::new(top_up_message)),
|
|
||||||
reply_to,
|
|
||||||
request_id,
|
|
||||||
},
|
|
||||||
request_id,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn to_bytes(&self) -> Result<Vec<u8>, bincode::Error> {
|
|
||||||
use bincode::Options;
|
|
||||||
make_bincode_serializer().serialize(self)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
|
|
||||||
pub enum AuthenticatorRequestData {
|
|
||||||
Initial(InitMessage),
|
|
||||||
Final(Box<FinalMessage>),
|
|
||||||
QueryBandwidth(PeerPublicKey),
|
|
||||||
TopUpBandwidth(Box<TopUpMessage>),
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(test)]
|
|
||||||
mod tests {
|
|
||||||
use super::*;
|
|
||||||
use std::str::FromStr;
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn check_first_bytes_protocol() {
|
|
||||||
let version = 2;
|
|
||||||
let data = AuthenticatorRequest {
|
|
||||||
protocol: Protocol { version, service_provider_type: ServiceProviderType::Authenticator },
|
|
||||||
data: AuthenticatorRequestData::Initial(InitMessage::new(
|
|
||||||
PeerPublicKey::from_str("yvNUDpT5l7W/xDhiu6HkqTHDQwbs/B3J5UrLmORl1EQ=").unwrap(),
|
|
||||||
)),
|
|
||||||
reply_to: Recipient::try_from_base58_string("D1rrpsysCGCYXy9saP8y3kmNpGtJZUXN9SvFoUcqAsM9.9Ssso1ea5NfkbMASdiseDSjTN1fSWda5SgEVjdSN4CvV@GJqd3ZxpXWSNxTfx7B1pPtswpetH4LnJdFeLeuY5KUuN").unwrap(),
|
|
||||||
request_id: 1,
|
|
||||||
};
|
|
||||||
let bytes = *data.to_bytes().unwrap().first_chunk::<2>().unwrap();
|
|
||||||
assert_eq!(bytes, [version, ServiceProviderType::Authenticator as u8]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,157 +0,0 @@
|
|||||||
// Copyright 2024 - Nym Technologies SA <contact@nymtech.net>
|
|
||||||
// SPDX-License-Identifier: Apache-2.0
|
|
||||||
|
|
||||||
use super::registration::{RegistrationData, RegistredData, RemainingBandwidthData};
|
|
||||||
use nym_service_provider_requests_common::{Protocol, ServiceProviderType};
|
|
||||||
use nym_sphinx::addressing::Recipient;
|
|
||||||
use serde::{Deserialize, Serialize};
|
|
||||||
|
|
||||||
use crate::make_bincode_serializer;
|
|
||||||
|
|
||||||
use super::VERSION;
|
|
||||||
|
|
||||||
#[derive(Clone, Debug, Serialize, Deserialize)]
|
|
||||||
pub struct AuthenticatorResponse {
|
|
||||||
pub protocol: Protocol,
|
|
||||||
pub data: AuthenticatorResponseData,
|
|
||||||
pub reply_to: Recipient,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl AuthenticatorResponse {
|
|
||||||
pub fn new_pending_registration_success(
|
|
||||||
registration_data: RegistrationData,
|
|
||||||
request_id: u64,
|
|
||||||
reply_to: Recipient,
|
|
||||||
) -> Self {
|
|
||||||
Self {
|
|
||||||
protocol: Protocol {
|
|
||||||
service_provider_type: ServiceProviderType::Authenticator,
|
|
||||||
version: VERSION,
|
|
||||||
},
|
|
||||||
data: AuthenticatorResponseData::PendingRegistration(PendingRegistrationResponse {
|
|
||||||
reply: registration_data,
|
|
||||||
reply_to,
|
|
||||||
request_id,
|
|
||||||
}),
|
|
||||||
reply_to,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn new_registered(
|
|
||||||
registred_data: RegistredData,
|
|
||||||
reply_to: Recipient,
|
|
||||||
request_id: u64,
|
|
||||||
) -> Self {
|
|
||||||
Self {
|
|
||||||
protocol: Protocol {
|
|
||||||
service_provider_type: ServiceProviderType::Authenticator,
|
|
||||||
version: VERSION,
|
|
||||||
},
|
|
||||||
data: AuthenticatorResponseData::Registered(RegisteredResponse {
|
|
||||||
reply: registred_data,
|
|
||||||
reply_to,
|
|
||||||
request_id,
|
|
||||||
}),
|
|
||||||
reply_to,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn new_remaining_bandwidth(
|
|
||||||
remaining_bandwidth_data: Option<RemainingBandwidthData>,
|
|
||||||
reply_to: Recipient,
|
|
||||||
request_id: u64,
|
|
||||||
) -> Self {
|
|
||||||
Self {
|
|
||||||
protocol: Protocol {
|
|
||||||
service_provider_type: ServiceProviderType::Authenticator,
|
|
||||||
version: VERSION,
|
|
||||||
},
|
|
||||||
data: AuthenticatorResponseData::RemainingBandwidth(RemainingBandwidthResponse {
|
|
||||||
reply: remaining_bandwidth_data,
|
|
||||||
reply_to,
|
|
||||||
request_id,
|
|
||||||
}),
|
|
||||||
reply_to,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn new_topup_bandwidth(
|
|
||||||
remaining_bandwidth_data: RemainingBandwidthData,
|
|
||||||
reply_to: Recipient,
|
|
||||||
request_id: u64,
|
|
||||||
) -> Self {
|
|
||||||
Self {
|
|
||||||
protocol: Protocol {
|
|
||||||
service_provider_type: ServiceProviderType::Authenticator,
|
|
||||||
version: VERSION,
|
|
||||||
},
|
|
||||||
data: AuthenticatorResponseData::TopUpBandwidth(TopUpBandwidthResponse {
|
|
||||||
reply: remaining_bandwidth_data,
|
|
||||||
reply_to,
|
|
||||||
request_id,
|
|
||||||
}),
|
|
||||||
reply_to,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn recipient(&self) -> Recipient {
|
|
||||||
self.reply_to
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn to_bytes(&self) -> Result<Vec<u8>, bincode::Error> {
|
|
||||||
use bincode::Options;
|
|
||||||
make_bincode_serializer().serialize(self)
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn from_reconstructed_message(
|
|
||||||
message: &nym_sphinx::receiver::ReconstructedMessage,
|
|
||||||
) -> Result<Self, bincode::Error> {
|
|
||||||
use bincode::Options;
|
|
||||||
make_bincode_serializer().deserialize(&message.message)
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn id(&self) -> Option<u64> {
|
|
||||||
match &self.data {
|
|
||||||
AuthenticatorResponseData::PendingRegistration(response) => Some(response.request_id),
|
|
||||||
AuthenticatorResponseData::Registered(response) => Some(response.request_id),
|
|
||||||
AuthenticatorResponseData::RemainingBandwidth(response) => Some(response.request_id),
|
|
||||||
AuthenticatorResponseData::TopUpBandwidth(response) => Some(response.request_id),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
|
|
||||||
pub enum AuthenticatorResponseData {
|
|
||||||
PendingRegistration(PendingRegistrationResponse),
|
|
||||||
Registered(RegisteredResponse),
|
|
||||||
RemainingBandwidth(RemainingBandwidthResponse),
|
|
||||||
TopUpBandwidth(TopUpBandwidthResponse),
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
|
|
||||||
pub struct PendingRegistrationResponse {
|
|
||||||
pub request_id: u64,
|
|
||||||
pub reply_to: Recipient,
|
|
||||||
pub reply: RegistrationData,
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
|
|
||||||
pub struct RegisteredResponse {
|
|
||||||
pub request_id: u64,
|
|
||||||
pub reply_to: Recipient,
|
|
||||||
pub reply: RegistredData,
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
|
|
||||||
pub struct RemainingBandwidthResponse {
|
|
||||||
pub request_id: u64,
|
|
||||||
pub reply_to: Recipient,
|
|
||||||
pub reply: Option<RemainingBandwidthData>,
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
|
|
||||||
pub struct TopUpBandwidthResponse {
|
|
||||||
pub request_id: u64,
|
|
||||||
pub reply_to: Recipient,
|
|
||||||
pub reply: RemainingBandwidthData,
|
|
||||||
}
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user