Compare commits
450 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 7e7200a7c8 | |||
| 3f0d4846df | |||
| 9bfcdbe8e2 | |||
| 8c4885ce2c | |||
| 926389df89 | |||
| b55db00408 | |||
| cfcb64f7e5 | |||
| 9c6c5f5170 | |||
| f28888e3e7 | |||
| 9549bed8bb | |||
| 7c65d61d91 | |||
| ad2efb7e62 | |||
| a50c9bfa1a | |||
| 30cdbf535a | |||
| f5365cbca9 | |||
| 22e7cb887b | |||
| b571f1a881 | |||
| b1c4e3ded7 | |||
| 4694ded8bd | |||
| 7971573026 | |||
| c4780c8af2 | |||
| 246f0b3f52 | |||
| 7879d76592 | |||
| 0f62ea25d8 | |||
| 6dbe8205d6 | |||
| 1b94ad5c4c | |||
| 37be99ab8f | |||
| 6f5cee8c36 | |||
| 58d805ab72 | |||
| 68ad75f737 | |||
| 73ea2b5fec | |||
| a0b37daeb0 | |||
| c9972047f6 | |||
| ccdf698380 | |||
| c10ed5a2f3 | |||
| 600b6d2b03 | |||
| b1391bbb17 | |||
| a171103a80 | |||
| 3e2009aa9d | |||
| 4b6e942667 | |||
| a6723044b9 | |||
| f60a25ee2d | |||
| 770baefe35 | |||
| 1c3403d7e6 | |||
| 342fd869a2 | |||
| 6f7db4172f | |||
| 55fd7b8890 | |||
| a14b4dc80c | |||
| c81f6962d7 | |||
| 9f4ef6842b | |||
| 7ca0c06c87 | |||
| 57aa763a84 | |||
| ba5fecf6b3 | |||
| 35343509f9 | |||
| 42d8b06346 | |||
| f30f0e8316 | |||
| e1aaf509d1 | |||
| 8db5eadea6 | |||
| 4dda824d37 | |||
| 0579b3afb0 | |||
| d328c458e6 | |||
| c8651cddbb | |||
| cde2a1ab26 | |||
| 8d78c92c03 | |||
| af311c3d33 | |||
| 906bcf1634 | |||
| 843bd4f4fa | |||
| 9bbe4a96d0 | |||
| 974ac0691c | |||
| 1188e48313 | |||
| e7ed5f3de3 | |||
| d45b2de241 | |||
| 3d9cbf351f | |||
| 844e22d94d | |||
| 09c905910e | |||
| 8fd8bf8792 | |||
| 243658637c | |||
| 5603a79d49 | |||
| 0007a4cc74 | |||
| 3dafe02f0e | |||
| e62e9cde02 | |||
| cde53c02e7 | |||
| de64da8e20 | |||
| 683790b068 | |||
| f9c24c8a23 | |||
| 886bb95e18 | |||
| 214fd0caf5 | |||
| 4aeac1acd2 | |||
| 679be24074 | |||
| 36e07f546d | |||
| d264feaf22 | |||
| 32b7b7afdc | |||
| 7a50f0c3b2 | |||
| 091382ef30 | |||
| 2da6a2fbfa | |||
| d910a4e0ee | |||
| 672ab79421 | |||
| 1ad97adc7c | |||
| 2bd585a0ff | |||
| df0b0367a4 | |||
| bb9e26d745 | |||
| dc5c765ecb | |||
| 95e2e3d0d2 | |||
| 690c4164a7 | |||
| ee656aa3ef | |||
| 3d4123aca5 | |||
| 29a8e23f72 | |||
| a4c5407b04 | |||
| 75bc36a9e6 | |||
| b8e2fb46fb | |||
| eff931f9ca | |||
| e4d8d721c0 | |||
| 21335b5ff1 | |||
| dadfdacf14 | |||
| e3eeef4301 | |||
| 6a519f4a1a | |||
| fde8bd89b6 | |||
| 099013bc6d | |||
| 11eef024ea | |||
| cc6017db3b | |||
| 84c1679973 | |||
| b1d18a5974 | |||
| 5019b4b266 | |||
| 790e7a0e1e | |||
| 0b1b6947e8 | |||
| c79b2cfb78 | |||
| dd699bce9a | |||
| 5ce017ef3d | |||
| 59c1ce2639 | |||
| 4fb63d8892 | |||
| a3b4d04d02 | |||
| aa3af8faea | |||
| 20c7f0e96f | |||
| e21142f1bd | |||
| ba3a6eaeb5 | |||
| 9d0bc8ab9e | |||
| 0d65ca78c4 | |||
| 0505a4807d | |||
| 01aa06e488 | |||
| 3b8dd1f4a5 | |||
| 4a837ce28c | |||
| 696f6c399c | |||
| ac9290de27 | |||
| b026e9107f | |||
| 1347535e8f | |||
| 479327849a | |||
| 21611a9434 | |||
| 78d9030567 | |||
| 4feb168cf7 | |||
| f3c16476f9 | |||
| 4678059eaf | |||
| a69d4bb457 | |||
| 50e3f2be38 | |||
| 276edfd562 | |||
| 605f8fcde3 | |||
| 645c9b5e67 | |||
| f0e4d1a7cf | |||
| 055ec4bdd5 | |||
| 5761f9ac7f | |||
| 32620fd55f | |||
| abb5cdbe06 | |||
| 8cad2b0076 | |||
| bcd6c19a97 | |||
| 764a3a6228 | |||
| d17aa72829 | |||
| d62658f515 | |||
| e6d4095bf9 | |||
| 9ace9d6960 | |||
| 6c32ff9708 | |||
| 5eae62ae33 | |||
| 331483f86a | |||
| 4ee0aeb2b1 | |||
| 08354f7651 | |||
| f1f599dd09 | |||
| 51251668e3 | |||
| 6e72433f99 | |||
| e6957e7a99 | |||
| de2406a2c7 | |||
| 956a264106 | |||
| 9b62d18101 | |||
| 390730f304 | |||
| e134ef8e15 | |||
| 7bd1550195 | |||
| 134ab2f0d6 | |||
| 1a4e7433b2 | |||
| f211b1e366 | |||
| b2db208e6e | |||
| c9c0de1fba | |||
| 9d91a018b2 | |||
| 0f7e3fe53e | |||
| ae9c1b4070 | |||
| e0d98af04f | |||
| 81e31c0550 | |||
| 1c771df941 | |||
| adcd8703d3 | |||
| aee4c2d80d | |||
| 5e04f48500 | |||
| a7610a7a88 | |||
| 28e6e9140c | |||
| 17c2aecd99 | |||
| 85074f3ac8 | |||
| c7020da81c | |||
| 271a126556 | |||
| 7da444c7a4 | |||
| 2a7fd71416 | |||
| 6ffd211e51 | |||
| f61ed48240 | |||
| 8d3dc405a5 | |||
| 21bf0fb27b | |||
| 7313f56c01 | |||
| cfef9e96e6 | |||
| 8b9a5cf500 | |||
| ce94ce058f | |||
| 018e4d6079 | |||
| ebadd9799f | |||
| 268fa02b83 | |||
| cb525477e5 | |||
| 4d6d2f0d33 | |||
| c7f8b05604 | |||
| 2878e9be9d | |||
| 7b419c2b12 | |||
| 0049126a91 | |||
| 80c5194d8b | |||
| 27a6b99453 | |||
| 61982de511 | |||
| efd9883197 | |||
| ce4ae8d90c | |||
| 1d2722f994 | |||
| 7e109e7f2d | |||
| f7a0b305df | |||
| 746ec71a0d | |||
| 41a63a0985 | |||
| 5a149c5492 | |||
| 7ff0becf72 | |||
| 4c2967a733 | |||
| 2b80e5d1c9 | |||
| 4e7ff53214 | |||
| 9ec36e49b7 | |||
| cdfa5ee540 | |||
| 71853f69f3 | |||
| dd13073037 | |||
| 1010df1077 | |||
| 9eaf9cf491 | |||
| 8e96318478 | |||
| bedff1f258 | |||
| 71a10a9a8b | |||
| 54287666e8 | |||
| 6de829163d | |||
| 605aed6f20 | |||
| adb5ed7c30 | |||
| 2b019e57df | |||
| 30c07712e3 | |||
| 82c92501d9 | |||
| c2a871a1a7 | |||
| dfd7bd5889 | |||
| 5aee4b1660 | |||
| 68a7bb67de | |||
| 7ff043d8df | |||
| 31e93428cf | |||
| 5f56b3eeea | |||
| e69b05693a | |||
| 8ae2451340 | |||
| b3b3279345 | |||
| 94a451c79b | |||
| ec7b959028 | |||
| 7061beea6e | |||
| e408162e26 | |||
| 25ae3895cb | |||
| 60296f2a41 | |||
| 3b97844310 | |||
| c904d245d2 | |||
| d315a2a91b | |||
| 0741d05ab3 | |||
| 61aa920362 | |||
| 24b9b17e64 | |||
| 5e3e633c4b | |||
| 8e6d3c34e2 | |||
| f3cff902ba | |||
| 4fe1b4c26f | |||
| cb24a08b06 | |||
| 597a53d11a | |||
| 639deeb502 | |||
| 03e082725e | |||
| 3e3307887e | |||
| d85683aaa8 | |||
| e89ed985fc | |||
| b1fb8bb18c | |||
| 45ebd7c37a | |||
| 3506020e55 | |||
| eca77d684b | |||
| e263a4a21f | |||
| dc4353c682 | |||
| e1d8069967 | |||
| 060726b7a3 | |||
| f72ccb0f0d | |||
| 2ff6bfbdd8 | |||
| d4f0b4772b | |||
| 17d258d094 | |||
| 8288d38257 | |||
| 1cd560c85e | |||
| 9018642992 | |||
| 04e652441e | |||
| ccf5990bc7 | |||
| 3d7c9ee2b8 | |||
| ad35c4006e | |||
| 2ec790e851 | |||
| 8f8cec0785 | |||
| 4a80cd301b | |||
| 63524eceff | |||
| a477b007e1 | |||
| 5b81510325 | |||
| 3bef973326 | |||
| bc5bb271d8 | |||
| 158e3cb073 | |||
| 36fb0eba29 | |||
| 1b37e85418 | |||
| 6a93497c8f | |||
| b8ee3465f8 | |||
| a7dfb36a84 | |||
| 14a7b5bdc8 | |||
| ffbd76539a | |||
| bdcc19e86a | |||
| 7929bac685 | |||
| f590aad42c | |||
| ec23f3dcb7 | |||
| 9644eb4329 | |||
| 7a4c6e4ed4 | |||
| d5ad504104 | |||
| d684f6d7ae | |||
| 1ba6444e72 | |||
| dc08b1170a | |||
| f0d9703587 | |||
| aa78bf702c | |||
| cd9cdfa5bb | |||
| 7e1e86bc77 | |||
| 2178f2b509 | |||
| c08efef8ed | |||
| 6d29774744 | |||
| af6bab7703 | |||
| 7033f92d82 | |||
| 128dfa6d81 | |||
| 8ed808124e | |||
| 0deef37778 | |||
| d759462e4e | |||
| f36cb3a00b | |||
| 6428f90b5a | |||
| e2d00fb002 | |||
| 0b0ec075bb | |||
| dc556706c1 | |||
| cca4d21e7c | |||
| 01f4773a5d | |||
| 6d15b444a0 | |||
| 18a3366cf3 | |||
| ea161329dc | |||
| 02a621ed8b | |||
| 5784e7519f | |||
| 323d5fbb3c | |||
| 2d89ec51c5 | |||
| 8927824d59 | |||
| 665f093bcf | |||
| 4b77312bee | |||
| f4bee0eed0 | |||
| 905ffc257a | |||
| 2419beccaf | |||
| 2ad5893a78 | |||
| c8e2d25e7a | |||
| cfea2c3aa3 | |||
| f59dc2a361 | |||
| 72f9f58fce | |||
| 2f2dfff53d | |||
| c8f8c9cb07 | |||
| 9afc21170a | |||
| 97d06d3859 | |||
| b02ee65870 | |||
| d9cec11f63 | |||
| 81028c554f | |||
| ffc6f5e963 | |||
| 6fdf70c609 | |||
| ab2a9f24c3 | |||
| 73f3f8cfab | |||
| 20c77e6987 | |||
| 630b1259d1 | |||
| 8c50492d43 | |||
| ae56d3685c | |||
| 6295d28972 | |||
| 8a8faf03d1 | |||
| e09b2ab7d6 | |||
| 2553d633ae | |||
| 24823356fc | |||
| cfa8854ada | |||
| fceef1afa6 | |||
| 6c62332409 | |||
| 7c86ef4cbc | |||
| 2dc3999c77 | |||
| 7b7cac5054 | |||
| 5f7270acc8 | |||
| 4e829ef540 | |||
| ba64c4f8b3 | |||
| 2b5c426d67 | |||
| ceec4da27d | |||
| af9df88a48 | |||
| 71b5477334 | |||
| b3b4b5ff36 | |||
| cc1c9a75b4 | |||
| 5813e9212b | |||
| 6ce743fbd5 | |||
| b62e221aad | |||
| c2326f35a6 | |||
| 92a755dc6c | |||
| 4587d5da26 | |||
| 586d5f658b | |||
| 964955f740 | |||
| b1121dabb9 | |||
| caff2077ae | |||
| b980bfcab8 | |||
| 57822e3c0d | |||
| b98bf46675 | |||
| 1417eeeddb | |||
| 31389dd886 | |||
| 36cf36aaae | |||
| dd08621329 | |||
| ca7ee04e47 | |||
| 0130881616 | |||
| cde247df46 | |||
| 448b2353ab | |||
| 46e2c74a98 | |||
| ce79d5a3bc | |||
| fede9cc194 | |||
| c75c5e0903 | |||
| ec00918524 | |||
| 9a43595e04 | |||
| 49334c0540 | |||
| 4a2f30a581 | |||
| 6a82285342 | |||
| 22ee87d87e | |||
| a8e62bde26 | |||
| 22df65aad7 | |||
| c4e86337e5 | |||
| 2d3bb78819 | |||
| 1ec11dda24 | |||
| 4e239ac9b7 | |||
| 4c919f520a | |||
| bc75dd7e15 | |||
| b5adf2bb42 | |||
| 254ea6af42 | |||
| a971694ff7 | |||
| a5056007d4 | |||
| 9c77e15a2c | |||
| 4f59678ded | |||
| 8a1d2af3cf |
@@ -0,0 +1,16 @@
|
|||||||
|
# To get started with Dependabot version updates, you'll need to specify which
|
||||||
|
# package ecosystems to update and where the package manifests are located.
|
||||||
|
# Please see the documentation for all configuration options:
|
||||||
|
# https://help.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
|
||||||
|
|
||||||
|
version: 2
|
||||||
|
updates:
|
||||||
|
# Maintain dependencies for GitHub Actions
|
||||||
|
- package-ecosystem: "github-actions"
|
||||||
|
directory: "/"
|
||||||
|
schedule:
|
||||||
|
interval: "daily"
|
||||||
|
commit-message:
|
||||||
|
prefix: build
|
||||||
|
prefix-development: chore
|
||||||
|
include: scope
|
||||||
@@ -48,7 +48,7 @@ jobs:
|
|||||||
NYM_PROJECT_NAME: "Daily security report"
|
NYM_PROJECT_NAME: "Daily security report"
|
||||||
GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}"
|
GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}"
|
||||||
MATRIX_SERVER: "${{ secrets.MATRIX_SERVER }}"
|
MATRIX_SERVER: "${{ secrets.MATRIX_SERVER }}"
|
||||||
MATRIX_ROOM: "${{ secrets.MATRIX_ROOM }}"
|
MATRIX_ROOM: "${{ secrets.MATRIX_ROOM_AUDIT }}"
|
||||||
MATRIX_USER_ID: "${{ secrets.MATRIX_USER_ID }}"
|
MATRIX_USER_ID: "${{ secrets.MATRIX_USER_ID }}"
|
||||||
MATRIX_TOKEN: "${{ secrets.MATRIX_TOKEN }}"
|
MATRIX_TOKEN: "${{ secrets.MATRIX_TOKEN }}"
|
||||||
MATRIX_DEVICE_ID: "${{ secrets.MATRIX_DEVICE_ID }}"
|
MATRIX_DEVICE_ID: "${{ secrets.MATRIX_DEVICE_ID }}"
|
||||||
|
|||||||
@@ -69,7 +69,7 @@ jobs:
|
|||||||
uses: actions-rs/cargo@v1
|
uses: actions-rs/cargo@v1
|
||||||
with:
|
with:
|
||||||
command: build
|
command: build
|
||||||
args: --workspace --release
|
args: --workspace --release --all
|
||||||
|
|
||||||
- name: Install Rust stable
|
- name: Install Rust stable
|
||||||
uses: actions-rs/toolchain@v1
|
uses: actions-rs/toolchain@v1
|
||||||
@@ -79,6 +79,9 @@ jobs:
|
|||||||
override: true
|
override: true
|
||||||
components: rustfmt, clippy
|
components: rustfmt, clippy
|
||||||
|
|
||||||
|
- name: Install wasm-opt
|
||||||
|
run: cargo install --version 0.112.0 wasm-opt
|
||||||
|
|
||||||
- name: Build release contracts
|
- name: Build release contracts
|
||||||
run: make wasm
|
run: make wasm
|
||||||
|
|
||||||
@@ -95,9 +98,15 @@ jobs:
|
|||||||
cp target/release/nym-network-requester $OUTPUT_DIR
|
cp target/release/nym-network-requester $OUTPUT_DIR
|
||||||
cp target/release/nym-network-statistics $OUTPUT_DIR
|
cp target/release/nym-network-statistics $OUTPUT_DIR
|
||||||
cp target/release/nym-cli $OUTPUT_DIR
|
cp target/release/nym-cli $OUTPUT_DIR
|
||||||
|
cp target/release/nym-credential-client $OUTPUT_DIR
|
||||||
|
cp target/release/explorer-api $OUTPUT_DIR
|
||||||
|
|
||||||
cp contracts/target/wasm32-unknown-unknown/release/mixnet_contract.wasm $OUTPUT_DIR
|
cp contracts/target/wasm32-unknown-unknown/release/mixnet_contract.wasm $OUTPUT_DIR
|
||||||
cp contracts/target/wasm32-unknown-unknown/release/vesting_contract.wasm $OUTPUT_DIR
|
cp contracts/target/wasm32-unknown-unknown/release/vesting_contract.wasm $OUTPUT_DIR
|
||||||
|
cp contracts/target/wasm32-unknown-unknown/release/nym_coconut_bandwidth.wasm $OUTPUT_DIR
|
||||||
|
cp contracts/target/wasm32-unknown-unknown/release/nym_coconut_dkg.wasm $OUTPUT_DIR
|
||||||
|
cp contracts/target/wasm32-unknown-unknown/release/cw3_flex_multisig.wasm $OUTPUT_DIR
|
||||||
|
cp contracts/target/wasm32-unknown-unknown/release/cw4_group.wasm $OUTPUT_DIR
|
||||||
|
|
||||||
- name: Deploy branch to CI www
|
- name: Deploy branch to CI www
|
||||||
continue-on-error: true
|
continue-on-error: true
|
||||||
|
|||||||
@@ -0,0 +1,76 @@
|
|||||||
|
name: CD dev-portal
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: master
|
||||||
|
paths:
|
||||||
|
- 'documentation/dev-portal/**'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
runs-on: custom-runner-linux
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
- name: Install rsync
|
||||||
|
run: sudo apt-get install rsync
|
||||||
|
- uses: rlespinasse/github-slug-action@v3.x
|
||||||
|
- uses: actions/setup-node@v3
|
||||||
|
with:
|
||||||
|
node-version: "16"
|
||||||
|
- name: Install Rust stable
|
||||||
|
uses: actions-rs/toolchain@v1
|
||||||
|
with:
|
||||||
|
toolchain: stable
|
||||||
|
- name: Install mdbook
|
||||||
|
run: (test -x $HOME/.cargo/bin/mdbook || cargo install --vers "^0.4" mdbook)
|
||||||
|
- name: Install mdbook plugins
|
||||||
|
run: |
|
||||||
|
cargo install --vers "^0.2.0" mdbook-variables && cargo install \
|
||||||
|
--vers "^1.8.0" mdbook-admonish && cargo install --vers \
|
||||||
|
"^0.1.2" mdbook-last-changed && cargo install --vers "^0.1.2" \
|
||||||
|
mdbook-theme && cargo install --vers "^0.7.7" mdbook-linkcheck
|
||||||
|
- name: Clean website
|
||||||
|
run: cd documentation/dev-portal && mdbook clean
|
||||||
|
- name: Build website
|
||||||
|
run: cd documentation/dev-portal && mdbook build
|
||||||
|
- name: Deploy branch master to dev
|
||||||
|
continue-on-error: true
|
||||||
|
uses: easingthemes/ssh-deploy@main
|
||||||
|
env:
|
||||||
|
SSH_PRIVATE_KEY: ${{ secrets.CD_WWW_SSH_PRIVATE_KEY }}
|
||||||
|
ARGS: "-rltgoDzvO --delete"
|
||||||
|
SOURCE: "documentation/dev-portal/book/html/"
|
||||||
|
REMOTE_HOST: ${{ secrets.CD_WWW_REMOTE_HOST_DEV }}
|
||||||
|
REMOTE_USER: ${{ secrets.CD_WWW_REMOTE_USER }}
|
||||||
|
TARGET: ${{ secrets.CD_WWW_REMOTE_TARGET_DEVP }}/
|
||||||
|
EXCLUDE: "/dist/, /node_modules/"
|
||||||
|
- name: Deploy branch master to prod
|
||||||
|
uses: easingthemes/ssh-deploy@main
|
||||||
|
env:
|
||||||
|
SSH_PRIVATE_KEY: ${{ secrets.CD_WWW_SSH_PRIVATE_KEY }}
|
||||||
|
ARGS: "-rltgoDzvO --delete"
|
||||||
|
SOURCE: "documentation/dev-portal/book/html/"
|
||||||
|
REMOTE_HOST: ${{ secrets.CD_WWW_REMOTE_HOST_PROD }}
|
||||||
|
REMOTE_USER: ${{ secrets.CD_WWW_REMOTE_USER }}
|
||||||
|
TARGET: ${{ secrets.CD_WWW_REMOTE_TARGET_DEVP }}/
|
||||||
|
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: cd-dev
|
||||||
|
NYM_PROJECT_NAME: "Dev portal 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_DEVP }}"
|
||||||
|
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
|
||||||
@@ -0,0 +1,82 @@
|
|||||||
|
name: CD docs
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: master
|
||||||
|
paths:
|
||||||
|
- 'documentation/docs/**'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
runs-on: custom-runner-linux
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
- name: Install rsync
|
||||||
|
run: sudo apt-get install rsync
|
||||||
|
- uses: rlespinasse/github-slug-action@v3.x
|
||||||
|
- uses: actions/setup-node@v3
|
||||||
|
with:
|
||||||
|
node-version: "16"
|
||||||
|
- name: Install Rust stable
|
||||||
|
uses: actions-rs/toolchain@v1
|
||||||
|
with:
|
||||||
|
toolchain: stable
|
||||||
|
- name: Build all binaries
|
||||||
|
uses: actions-rs/cargo@v1
|
||||||
|
with:
|
||||||
|
command: build
|
||||||
|
args: --workspace --release --all
|
||||||
|
- name: Install mdbook
|
||||||
|
run: (test -x $HOME/.cargo/bin/mdbook || cargo install --vers "^0.4" mdbook)
|
||||||
|
- name: Install mdbook plugins
|
||||||
|
run: |
|
||||||
|
cargo install --vers "^0.2.0" mdbook-variables && cargo install \
|
||||||
|
--vers "^1.8.0" mdbook-admonish && cargo install --vers \
|
||||||
|
"^0.1.2" mdbook-last-changed && cargo install --vers "^0.1.2" \
|
||||||
|
mdbook-theme && cargo install --vers "^0.7.7" mdbook-linkcheck && \
|
||||||
|
cargo install --vers "^0.5.0" mdbook-cmdrun
|
||||||
|
- name: Clean website
|
||||||
|
run: cd documentation/docs && mdbook clean
|
||||||
|
- name: Build website
|
||||||
|
run: cd documentation/docs && mdbook build
|
||||||
|
- name: Deploy branch master to dev
|
||||||
|
continue-on-error: true
|
||||||
|
uses: easingthemes/ssh-deploy@main
|
||||||
|
env:
|
||||||
|
SSH_PRIVATE_KEY: ${{ secrets.CD_WWW_SSH_PRIVATE_KEY }}
|
||||||
|
ARGS: "-rltgoDzvO --delete"
|
||||||
|
SOURCE: "documentation/docs/book/"
|
||||||
|
REMOTE_HOST: ${{ secrets.CD_WWW_REMOTE_HOST_DEV }}
|
||||||
|
REMOTE_USER: ${{ secrets.CD_WWW_REMOTE_USER }}
|
||||||
|
TARGET: ${{ secrets.CD_WWW_REMOTE_TARGET }}/
|
||||||
|
EXCLUDE: "/dist/, /node_modules/"
|
||||||
|
- name: Deploy branch master to prod
|
||||||
|
uses: easingthemes/ssh-deploy@main
|
||||||
|
env:
|
||||||
|
SSH_PRIVATE_KEY: ${{ secrets.CD_WWW_SSH_PRIVATE_KEY }}
|
||||||
|
ARGS: "-rltgoDzvO --delete"
|
||||||
|
SOURCE: "documentation/docs/book/"
|
||||||
|
REMOTE_HOST: ${{ secrets.CD_WWW_REMOTE_HOST_PROD }}
|
||||||
|
REMOTE_USER: ${{ secrets.CD_WWW_REMOTE_USER }}
|
||||||
|
TARGET: ${{ secrets.CD_WWW_REMOTE_TARGET }}/
|
||||||
|
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: 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
|
||||||
@@ -0,0 +1,56 @@
|
|||||||
|
name: Run config checks on all binaries
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
release:
|
||||||
|
types: [created]
|
||||||
|
push:
|
||||||
|
paths:
|
||||||
|
- 'clients/**'
|
||||||
|
- 'common/**'
|
||||||
|
- 'contracts/**'
|
||||||
|
- 'integrations/**'
|
||||||
|
- 'mixnode/**'
|
||||||
|
- 'sdk/rust/nym-sdk/**'
|
||||||
|
- 'service-providers/**'
|
||||||
|
pull_request:
|
||||||
|
paths:
|
||||||
|
- 'clients/**'
|
||||||
|
- 'common/**'
|
||||||
|
- 'gateway/**'
|
||||||
|
- 'integrations/**'
|
||||||
|
- 'mixnode/**'
|
||||||
|
- 'sdk/rust/nym-sdk/**'
|
||||||
|
- 'service-providers/**'
|
||||||
|
|
||||||
|
env:
|
||||||
|
NETWORK: mainnet
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
publish-nym:
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
platform: [custom-runner-linux]
|
||||||
|
|
||||||
|
runs-on: ${{ matrix.platform }}
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- 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
|
||||||
|
continue-on-error: true
|
||||||
|
|
||||||
|
- name: Install Rust stable
|
||||||
|
uses: actions-rs/toolchain@v1
|
||||||
|
with:
|
||||||
|
toolchain: stable
|
||||||
|
|
||||||
|
- name: Branch name
|
||||||
|
run: echo running on branch ${GITHUB_REF##*/}
|
||||||
|
|
||||||
|
- name: Run tests against binaries
|
||||||
|
run: ./build_and_run.sh ${{ github.head_ref || github.ref_name }}
|
||||||
|
working-directory: tests/
|
||||||
|
|
||||||
|
|
||||||
@@ -0,0 +1,66 @@
|
|||||||
|
name: CI dev-portal
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches-ignore: master
|
||||||
|
paths:
|
||||||
|
- 'documentation/dev-portal/**'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
runs-on: custom-runner-linux
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
- name: Install rsync
|
||||||
|
run: sudo apt-get install rsync
|
||||||
|
- uses: rlespinasse/github-slug-action@v3.x
|
||||||
|
- uses: actions/setup-node@v3
|
||||||
|
with:
|
||||||
|
node-version: "16"
|
||||||
|
- name: Install Rust stable
|
||||||
|
uses: actions-rs/toolchain@v1
|
||||||
|
with:
|
||||||
|
toolchain: stable
|
||||||
|
- name: Install mdbook
|
||||||
|
run: (test -x $HOME/.cargo/bin/mdbook || cargo install --vers "^0.4" mdbook)
|
||||||
|
- name: Install mdbook plugins
|
||||||
|
run: |
|
||||||
|
cargo install --vers "^0.2.0" mdbook-variables && cargo install \
|
||||||
|
--vers "^1.8.0" mdbook-admonish && cargo install --vers \
|
||||||
|
"^0.1.2" mdbook-last-changed && cargo install --vers "^0.1.2" mdbook-theme \
|
||||||
|
&& cargo install --vers "^0.7.7" mdbook-linkcheck
|
||||||
|
- name: Clean website
|
||||||
|
run: cd documentation/dev-portal && mdbook clean
|
||||||
|
- name: Build website
|
||||||
|
run: cd documentation/dev-portal && mdbook build
|
||||||
|
- name: Deploy branch to CI www
|
||||||
|
continue-on-error: true
|
||||||
|
uses: easingthemes/ssh-deploy@main
|
||||||
|
env:
|
||||||
|
SSH_PRIVATE_KEY: ${{ secrets.CI_WWW_SSH_PRIVATE_KEY }}
|
||||||
|
ARGS: "-rltgoDzvO --delete"
|
||||||
|
SOURCE: "documentation/dev-portal/book/html/"
|
||||||
|
REMOTE_HOST: ${{ secrets.CI_WWW_REMOTE_HOST }}
|
||||||
|
REMOTE_USER: ${{ secrets.CI_WWW_REMOTE_USER }}
|
||||||
|
TARGET: ${{ secrets.CI_WWW_REMOTE_TARGET }}/dev-portal-${{ 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: ci-dev
|
||||||
|
NYM_PROJECT_NAME: "Dev portal CI"
|
||||||
|
NYM_CI_WWW_BASE: "${{ secrets.NYM_CI_WWW_BASE }}"
|
||||||
|
NYM_CI_WWW_LOCATION: "dev-portal-${{ 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_DEVP }}"
|
||||||
|
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
|
||||||
@@ -0,0 +1,72 @@
|
|||||||
|
name: CI docs
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches-ignore: master
|
||||||
|
paths:
|
||||||
|
- 'documentation/docs/**'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
runs-on: custom-runner-linux
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
- name: Install rsync
|
||||||
|
run: sudo apt-get install rsync
|
||||||
|
- uses: rlespinasse/github-slug-action@v3.x
|
||||||
|
- uses: actions/setup-node@v3
|
||||||
|
with:
|
||||||
|
node-version: "16"
|
||||||
|
- name: Install Rust stable
|
||||||
|
uses: actions-rs/toolchain@v1
|
||||||
|
with:
|
||||||
|
toolchain: stable
|
||||||
|
- name: Build all binaries
|
||||||
|
uses: actions-rs/cargo@v1
|
||||||
|
with:
|
||||||
|
command: build
|
||||||
|
args: --workspace --release --all
|
||||||
|
- name: Install mdbook
|
||||||
|
run: (test -x $HOME/.cargo/bin/mdbook || cargo install --vers "^0.4" mdbook)
|
||||||
|
- name: Install mdbook plugins
|
||||||
|
run: |
|
||||||
|
cargo install --vers "^0.2.0" mdbook-variables && cargo install \
|
||||||
|
--vers "^1.8.0" mdbook-admonish && cargo install --vers \
|
||||||
|
"^0.1.2" mdbook-last-changed && cargo install --vers "^0.1.2" \
|
||||||
|
mdbook-theme && cargo install --vers "^0.7.7" mdbook-linkcheck && \
|
||||||
|
cargo install --vers "^0.5.0" mdbook-cmdrun
|
||||||
|
- name: Clean website
|
||||||
|
run: cd documentation/docs && mdbook clean
|
||||||
|
- name: Build website
|
||||||
|
run: cd documentation/docs && mdbook build
|
||||||
|
- name: Deploy branch to CI www
|
||||||
|
continue-on-error: true
|
||||||
|
uses: easingthemes/ssh-deploy@main
|
||||||
|
env:
|
||||||
|
SSH_PRIVATE_KEY: ${{ secrets.CI_WWW_SSH_PRIVATE_KEY }}
|
||||||
|
ARGS: "-rltgoDzvO --delete"
|
||||||
|
SOURCE: "documentation/docs/book/"
|
||||||
|
REMOTE_HOST: ${{ secrets.CI_WWW_REMOTE_HOST }}
|
||||||
|
REMOTE_USER: ${{ secrets.CI_WWW_REMOTE_USER }}
|
||||||
|
TARGET: ${{ secrets.CI_WWW_REMOTE_TARGET }}/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: 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
|
||||||
+14
-10
@@ -1,4 +1,4 @@
|
|||||||
name: NC Android APK Release
|
name: Nym Connect - Android APK Build
|
||||||
|
|
||||||
on:
|
on:
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
@@ -23,15 +23,12 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
sudo apt-get update
|
sudo apt-get update
|
||||||
sudo apt-get -y install \
|
sudo apt-get -y install \
|
||||||
libwebkit2gtk-4.0-dev \
|
|
||||||
build-essential \
|
build-essential \
|
||||||
unzip \
|
unzip \
|
||||||
curl \
|
curl \
|
||||||
wget \
|
wget \
|
||||||
libssl-dev \
|
libssl-dev \
|
||||||
libgtk-3-dev \
|
|
||||||
squashfs-tools \
|
squashfs-tools \
|
||||||
libayatana-appindicator3-dev \
|
|
||||||
librsvg2-dev
|
librsvg2-dev
|
||||||
|
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
@@ -64,6 +61,11 @@ jobs:
|
|||||||
- name: Install Rust toolchain
|
- name: Install Rust toolchain
|
||||||
uses: dtolnay/rust-toolchain@stable
|
uses: dtolnay/rust-toolchain@stable
|
||||||
|
|
||||||
|
# TODO this step takes a considerable amount of time
|
||||||
|
# We could avoid to compile from source tauri-cli and use instead
|
||||||
|
# pre-compiled binary provided by the node package `@tauri-apps/cli`
|
||||||
|
# But when using the later the build fails for some reason
|
||||||
|
# so keep installing and using tauri-cli
|
||||||
- name: Install tauri cli
|
- name: Install tauri cli
|
||||||
run: cargo install tauri-cli --version "^2.0.0-alpha.2"
|
run: cargo install tauri-cli --version "^2.0.0-alpha.2"
|
||||||
|
|
||||||
@@ -88,25 +90,27 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
yarn install --frozen-lockfile
|
yarn install --frozen-lockfile
|
||||||
yarn build
|
yarn build
|
||||||
yarn workspace @nym/nym-connect-android webpack:prod
|
yarn workspace @nym/nym-connect-mobile webpack:prod
|
||||||
|
|
||||||
- name: Build APK
|
- name: Build APK
|
||||||
working-directory: nym-connect-android
|
working-directory: nym-connect/mobile
|
||||||
env:
|
env:
|
||||||
|
# NODE_TAURI_CLI=${{ github.workspace }}/nym-connect/mobile/node_modules/.bin/tauri
|
||||||
ANDROID_SDK_ROOT: ${{ env.ANDROID_HOME }}
|
ANDROID_SDK_ROOT: ${{ env.ANDROID_HOME }}
|
||||||
WRY_ANDROID_PACKAGE: net.nymtech.nym_connect_android
|
WRY_ANDROID_PACKAGE: net.nymtech.nym_connect
|
||||||
WRY_ANDROID_LIBRARY: nym_connect_android
|
WRY_ANDROID_LIBRARY: nym_connect
|
||||||
# TODO build with release profile (--release), it will requires
|
# TODO build with release profile (--release), it will requires
|
||||||
# to sign the APK. For now build with debug profile to avoid that
|
# to sign the APK. For now build with debug profile to avoid that
|
||||||
|
# TODO build using `yarn tauri`, provide NODE_TAURI_CLI, see TODO notes above
|
||||||
run: cargo tauri android build --debug --apk --split-per-abi -t aarch64
|
run: cargo tauri android build --debug --apk --split-per-abi -t aarch64
|
||||||
|
|
||||||
# TODO add the version number to APK name
|
# TODO add the version number to APK name
|
||||||
- name: Rename APK artifact
|
- name: Rename APK artifact
|
||||||
run: |
|
run: |
|
||||||
mkdir apk/
|
mkdir apk/
|
||||||
mv nym-connect-android/src-tauri/gen/android/nym_connect_android/app/build/outputs/apk/arm64/debug/app-arm64-debug.apk \
|
mv nym-connect/mobile/src-tauri/gen/android/nym_connect/app/build/outputs/apk/arm64/debug/app-arm64-debug.apk \
|
||||||
apk/nym-connect-arm64-debug.apk
|
apk/nym-connect-arm64-debug.apk
|
||||||
mv nym-connect-android/src-tauri/gen/android/nym_connect_android/app/build/outputs/apk/x86_64/debug/app-x86_64-debug.apk \
|
mv nym-connect/mobile/src-tauri/gen/android/nym_connect/app/build/outputs/apk/x86_64/debug/app-x86_64-debug.apk \
|
||||||
apk/nym-connect-x86_64-debug.apk
|
apk/nym-connect-x86_64-debug.apk
|
||||||
|
|
||||||
- name: Upload APK artifact
|
- name: Upload APK artifact
|
||||||
@@ -1,13 +1,13 @@
|
|||||||
name: CI for nym-connect
|
name: CI for nym-connect - Desktop
|
||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
paths:
|
paths:
|
||||||
- 'nym-connect/**'
|
- 'nym-connect/desktop/**'
|
||||||
|
|
||||||
defaults:
|
defaults:
|
||||||
run:
|
run:
|
||||||
working-directory: nym-connect
|
working-directory: nym-connect/desktop
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
@@ -34,7 +34,7 @@ jobs:
|
|||||||
env:
|
env:
|
||||||
SSH_PRIVATE_KEY: ${{ secrets.CI_WWW_SSH_PRIVATE_KEY }}
|
SSH_PRIVATE_KEY: ${{ secrets.CI_WWW_SSH_PRIVATE_KEY }}
|
||||||
ARGS: "-rltgoDzvO --delete"
|
ARGS: "-rltgoDzvO --delete"
|
||||||
SOURCE: "nym-connect/storybook-static/"
|
SOURCE: "nym-connect/desktop/storybook-static/"
|
||||||
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 }}/nym-connect-${{ env.GITHUB_REF_SLUG }}
|
TARGET: ${{ secrets.CI_WWW_REMOTE_TARGET }}/nym-connect-${{ env.GITHUB_REF_SLUG }}
|
||||||
@@ -1,28 +1,30 @@
|
|||||||
name: Nym Connect (rust)
|
name: Nym Connect - desktop (Rust)
|
||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
paths:
|
paths:
|
||||||
- 'nym-connect/**'
|
- "nym-connect/desktop/src-tauri/**"
|
||||||
- 'clients/client-core/**'
|
- "nym-connect/desktop/src-tauri/Cargo.toml"
|
||||||
- 'clients/socks5/**'
|
- "clients/client-core/**"
|
||||||
- 'common/**'
|
- "clients/socks5/**"
|
||||||
- 'gateway/gateway-requests/**'
|
- "common/**"
|
||||||
- 'contracts/vesting/**'
|
- "gateway/gateway-requests/**"
|
||||||
- 'nym-api/nym-api-requests/**'
|
- "contracts/vesting/**"
|
||||||
|
- "nym-api/nym-api-requests/**"
|
||||||
pull_request:
|
pull_request:
|
||||||
paths:
|
paths:
|
||||||
- 'nym-connect/**'
|
- "nym-connect/desktop/src-tauri/**"
|
||||||
- 'clients/client-core/**'
|
- "nym-connect/desktop/src-tauri/Cargo.toml"
|
||||||
- 'clients/socks5/**'
|
- "clients/client-core/**"
|
||||||
- 'common/**'
|
- "clients/socks5/**"
|
||||||
- 'gateway/gateway-requests/**'
|
- "common/**"
|
||||||
- 'contracts/vesting/**'
|
- "gateway/gateway-requests/**"
|
||||||
- 'nym-api/nym-api-requests/**'
|
- "contracts/vesting/**"
|
||||||
|
- "nym-api/nym-api-requests/**"
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
runs-on: [ self-hosted, custom-linux ]
|
runs-on: [self-hosted, custom-linux]
|
||||||
env:
|
env:
|
||||||
RUSTC_WRAPPER: /home/ubuntu/.cargo/bin/sccache
|
RUSTC_WRAPPER: /home/ubuntu/.cargo/bin/sccache
|
||||||
steps:
|
steps:
|
||||||
@@ -45,29 +47,29 @@ jobs:
|
|||||||
uses: actions-rs/cargo@v1
|
uses: actions-rs/cargo@v1
|
||||||
with:
|
with:
|
||||||
command: build
|
command: build
|
||||||
args: --manifest-path nym-connect/Cargo.toml --workspace
|
args: --manifest-path nym-connect/desktop/Cargo.toml --workspace
|
||||||
|
|
||||||
- name: Run all tests
|
- name: Run all tests
|
||||||
uses: actions-rs/cargo@v1
|
uses: actions-rs/cargo@v1
|
||||||
with:
|
with:
|
||||||
command: test
|
command: test
|
||||||
args: --manifest-path nym-connect/Cargo.toml --workspace
|
args: --manifest-path nym-connect/desktop/Cargo.toml --workspace
|
||||||
|
|
||||||
- name: Check formatting
|
- name: Check formatting
|
||||||
uses: actions-rs/cargo@v1
|
uses: actions-rs/cargo@v1
|
||||||
with:
|
with:
|
||||||
command: fmt
|
command: fmt
|
||||||
args: --manifest-path nym-connect/Cargo.toml --all -- --check
|
args: --manifest-path nym-connect/desktop/Cargo.toml --all -- --check
|
||||||
|
|
||||||
- uses: actions-rs/clippy-check@v1
|
- uses: actions-rs/clippy-check@v1
|
||||||
name: Clippy checks
|
name: Clippy checks
|
||||||
continue-on-error: true
|
continue-on-error: true
|
||||||
with:
|
with:
|
||||||
token: ${{ secrets.GITHUB_TOKEN }}
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
args: --manifest-path nym-connect/Cargo.toml --workspace --all-features
|
args: --manifest-path nym-connect/desktop/Cargo.toml --workspace --all-features
|
||||||
|
|
||||||
- name: Run clippy
|
- name: Run clippy
|
||||||
uses: actions-rs/cargo@v1
|
uses: actions-rs/cargo@v1
|
||||||
with:
|
with:
|
||||||
command: clippy
|
command: clippy
|
||||||
args: --manifest-path nym-connect/Cargo.toml --workspace --all-features -- -D warnings
|
args: --manifest-path nym-connect/desktop/Cargo.toml --workspace --all-features -- -D warnings
|
||||||
@@ -1,9 +1,11 @@
|
|||||||
name: Nym Connect for Android (rust)
|
name: Nym Connect - mobile (Rust)
|
||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
paths:
|
paths:
|
||||||
- "nym-connect-android/src-tauri/**"
|
- "nym-connect/mobile/src-tauri/**"
|
||||||
|
- "nym-connect/mobile/src-tauri/Cargo.toml"
|
||||||
|
- "!nym-connect/mobile/src-tauri/gen/**"
|
||||||
- "clients/client-core/**"
|
- "clients/client-core/**"
|
||||||
- "clients/socks5/**"
|
- "clients/socks5/**"
|
||||||
- "common/**"
|
- "common/**"
|
||||||
@@ -12,7 +14,9 @@ on:
|
|||||||
- "nym-api/nym-api-requests/**"
|
- "nym-api/nym-api-requests/**"
|
||||||
pull_request:
|
pull_request:
|
||||||
paths:
|
paths:
|
||||||
- "nym-connect-android/src-tauri/**"
|
- "nym-connect/mobile/src-tauri/**"
|
||||||
|
- "nym-connect/mobile/src-tauri/Cargo.toml"
|
||||||
|
- "!nym-connect/mobile/src-tauri/gen/**"
|
||||||
- "clients/client-core/**"
|
- "clients/client-core/**"
|
||||||
- "clients/socks5/**"
|
- "clients/socks5/**"
|
||||||
- "common/**"
|
- "common/**"
|
||||||
@@ -28,10 +32,9 @@ jobs:
|
|||||||
#RUSTC_WRAPPER: /home/ubuntu/.cargo/bin/sccache
|
#RUSTC_WRAPPER: /home/ubuntu/.cargo/bin/sccache
|
||||||
#defaults:
|
#defaults:
|
||||||
#run:
|
#run:
|
||||||
#working-directory: nym-connect-android/src-tauri/
|
#working-directory: nym-connect/mobile/src-tauri/
|
||||||
steps:
|
steps:
|
||||||
- name: Install Dependencies (Linux)
|
- name: Install Dependencies (Linux)
|
||||||
if: ${{ !env.ACT }}
|
|
||||||
run: |
|
run: |
|
||||||
sudo apt-get update
|
sudo apt-get update
|
||||||
sudo apt-get -y install \
|
sudo apt-get -y install \
|
||||||
@@ -46,7 +49,6 @@ jobs:
|
|||||||
librsvg2-dev \
|
librsvg2-dev \
|
||||||
libsoup-3.0-dev \
|
libsoup-3.0-dev \
|
||||||
libjavascriptcoregtk-4.1-dev
|
libjavascriptcoregtk-4.1-dev
|
||||||
#continue-on-error: true
|
|
||||||
|
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v3
|
||||||
@@ -58,13 +60,13 @@ jobs:
|
|||||||
components: clippy, rustfmt
|
components: clippy, rustfmt
|
||||||
|
|
||||||
- name: Check formatting
|
- name: Check formatting
|
||||||
run: cargo fmt --manifest-path nym-connect-android/src-tauri/Cargo.toml -- --check
|
run: cargo fmt --manifest-path nym-connect/mobile/src-tauri/Cargo.toml -- --check
|
||||||
|
|
||||||
- name: Build all binaries
|
- name: Build all binaries
|
||||||
run: cargo build --manifest-path nym-connect-android/src-tauri/Cargo.toml
|
run: cargo build --manifest-path nym-connect/mobile/src-tauri/Cargo.toml
|
||||||
|
|
||||||
- name: Run all tests
|
- name: Run all tests
|
||||||
run: cargo test --manifest-path nym-connect-android/src-tauri/Cargo.toml
|
run: cargo test --manifest-path nym-connect/mobile/src-tauri/Cargo.toml
|
||||||
|
|
||||||
- name: Clippy
|
- name: Clippy
|
||||||
run: cargo clippy --manifest-path nym-connect-android/src-tauri/Cargo.toml --all-targets -- -D warnings
|
run: cargo clippy --manifest-path nym-connect/mobile/src-tauri/Cargo.toml --all-targets -- -D warnings
|
||||||
@@ -6,7 +6,7 @@ on:
|
|||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
if: ${{ startsWith(github.ref, 'refs/tags/nym-contracts-') && github.event_name == 'release' }}
|
if: ${{ (startsWith(github.ref, 'refs/tags/nym-contracts-') && github.event_name == 'release') || github.event_name == 'workflow_dispatch' }}
|
||||||
runs-on: [self-hosted, custom-runner-linux]
|
runs-on: [self-hosted, custom-runner-linux]
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v2
|
||||||
@@ -19,6 +19,9 @@ jobs:
|
|||||||
override: true
|
override: true
|
||||||
components: rustfmt, clippy
|
components: rustfmt, clippy
|
||||||
|
|
||||||
|
- name: Install wasm-opt
|
||||||
|
run: cargo install --version 0.112.0 wasm-opt
|
||||||
|
|
||||||
- name: Build release contracts
|
- name: Build release contracts
|
||||||
run: make wasm
|
run: make wasm
|
||||||
|
|
||||||
|
|||||||
@@ -30,6 +30,7 @@ jobs:
|
|||||||
continue-on-error: ${{ matrix.rust == 'nightly' }}
|
continue-on-error: ${{ matrix.rust == 'nightly' }}
|
||||||
needs: matrix_prep
|
needs: matrix_prep
|
||||||
strategy:
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
matrix: ${{fromJson(needs.matrix_prep.outputs.matrix)}}
|
matrix: ${{fromJson(needs.matrix_prep.outputs.matrix)}}
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v2
|
||||||
@@ -63,4 +64,4 @@ jobs:
|
|||||||
if: ${{ matrix.rust != 'nightly' }}
|
if: ${{ matrix.rust != 'nightly' }}
|
||||||
with:
|
with:
|
||||||
command: clippy
|
command: clippy
|
||||||
args: --manifest-path contracts/Cargo.toml --workspace -- -D warnings
|
args: --manifest-path contracts/Cargo.toml --workspace --all-targets -- -D warnings
|
||||||
|
|||||||
@@ -0,0 +1,13 @@
|
|||||||
|
name: Greetings
|
||||||
|
|
||||||
|
on: [pull_request_target, issues]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
greeting:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/first-interaction@v1
|
||||||
|
with:
|
||||||
|
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
issue-message: 'Thank you for raising this issue'
|
||||||
|
pr-message: 'Thank you for making this first PR'
|
||||||
@@ -1,57 +0,0 @@
|
|||||||
name: CI for Network Explorer API
|
|
||||||
|
|
||||||
on:
|
|
||||||
workflow_dispatch:
|
|
||||||
release:
|
|
||||||
types: [created]
|
|
||||||
|
|
||||||
env:
|
|
||||||
NETWORK: mainnet
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
publish-nym:
|
|
||||||
if: ${{ startsWith(github.ref, 'refs/tags/nym-explorer-api-') && (github.event_name == 'release' || github.event_name == 'workflow_dispatch') }}
|
|
||||||
strategy:
|
|
||||||
fail-fast: false
|
|
||||||
matrix:
|
|
||||||
platform: [ubuntu-20.04]
|
|
||||||
|
|
||||||
runs-on: ${{ matrix.platform }}
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
|
|
||||||
- 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
|
|
||||||
continue-on-error: true
|
|
||||||
|
|
||||||
- name: Check the release tag starts with `nym-explorer-api-`
|
|
||||||
uses: actions/github-script@v3
|
|
||||||
with:
|
|
||||||
script: |
|
|
||||||
core.setFailed('Release tag did not start with nym-explorer-api-...')
|
|
||||||
|
|
||||||
- name: Install Rust stable
|
|
||||||
uses: actions-rs/toolchain@v1
|
|
||||||
with:
|
|
||||||
toolchain: stable
|
|
||||||
|
|
||||||
- name: Build all explorer-api
|
|
||||||
uses: actions-rs/cargo@v1
|
|
||||||
with:
|
|
||||||
command: build
|
|
||||||
args: --manifest-path explorer-api/Cargo.toml --workspace --release
|
|
||||||
|
|
||||||
- name: Upload Artifact
|
|
||||||
uses: actions/upload-artifact@v3
|
|
||||||
with:
|
|
||||||
name: my-artifact
|
|
||||||
path: |
|
|
||||||
target/release/explorer-api
|
|
||||||
retention-days: 30
|
|
||||||
|
|
||||||
- name: Upload to release based on tag name
|
|
||||||
uses: softprops/action-gh-release@v1
|
|
||||||
if: github.event_name == 'release'
|
|
||||||
with:
|
|
||||||
files: |
|
|
||||||
target/release/explorer-api
|
|
||||||
@@ -51,9 +51,9 @@ jobs:
|
|||||||
command: build
|
command: build
|
||||||
args: --workspace
|
args: --workspace
|
||||||
|
|
||||||
- name: Reclaim some disk space (because Windows is being annoying)
|
- name: Reclaim some disk space
|
||||||
uses: actions-rs/cargo@v1
|
uses: actions-rs/cargo@v1
|
||||||
if: ${{ matrix.os == 'windows-latest' }}
|
if: ${{ matrix.os == 'windows-latest' || matrix.os == 'ubuntu-20.04' }}
|
||||||
with:
|
with:
|
||||||
command: clean
|
command: clean
|
||||||
|
|
||||||
@@ -63,9 +63,9 @@ jobs:
|
|||||||
command: build
|
command: build
|
||||||
args: --workspace --examples
|
args: --workspace --examples
|
||||||
|
|
||||||
- name: Reclaim some disk space (because Windows is being annoying)
|
- name: Reclaim some disk space
|
||||||
uses: actions-rs/cargo@v1
|
uses: actions-rs/cargo@v1
|
||||||
if: ${{ matrix.os == 'windows-latest' }}
|
if: ${{ matrix.os == 'windows-latest' || matrix.os == 'ubuntu-20.04' }}
|
||||||
with:
|
with:
|
||||||
command: clean
|
command: clean
|
||||||
|
|
||||||
@@ -75,7 +75,7 @@ jobs:
|
|||||||
command: test
|
command: test
|
||||||
args: --workspace
|
args: --workspace
|
||||||
|
|
||||||
- name: Reclaim some disk space (because Windows is being annoying)
|
- name: Reclaim some disk space
|
||||||
uses: actions-rs/cargo@v1
|
uses: actions-rs/cargo@v1
|
||||||
if: ${{ matrix.os == 'windows-latest' || matrix.os == 'ubuntu-20.04' }}
|
if: ${{ matrix.os == 'windows-latest' || matrix.os == 'ubuntu-20.04' }}
|
||||||
with:
|
with:
|
||||||
@@ -88,9 +88,9 @@ jobs:
|
|||||||
command: test
|
command: test
|
||||||
args: --workspace -- --ignored
|
args: --workspace -- --ignored
|
||||||
|
|
||||||
- name: Reclaim some disk space (because Windows is being annoying)
|
- name: Reclaim some disk space
|
||||||
uses: actions-rs/cargo@v1
|
uses: actions-rs/cargo@v1
|
||||||
if: ${{ matrix.os == 'windows-latest' }}
|
if: ${{ matrix.os == 'windows-latest' || matrix.os == 'ubuntu-20.04' }}
|
||||||
with:
|
with:
|
||||||
command: clean
|
command: clean
|
||||||
|
|
||||||
@@ -167,7 +167,7 @@ jobs:
|
|||||||
GIT_BRANCH: "${GITHUB_REF##*/}"
|
GIT_BRANCH: "${GITHUB_REF##*/}"
|
||||||
IS_SUCCESS: "${{ env.WORKFLOW_CONCLUSION == 'success' }}"
|
IS_SUCCESS: "${{ env.WORKFLOW_CONCLUSION == 'success' }}"
|
||||||
MATRIX_SERVER: "${{ secrets.MATRIX_SERVER }}"
|
MATRIX_SERVER: "${{ secrets.MATRIX_SERVER }}"
|
||||||
MATRIX_ROOM: "${{ secrets.MATRIX_ROOM }}"
|
MATRIX_ROOM: "${{ secrets.MATRIX_ROOM_NIGHTLY }}"
|
||||||
MATRIX_USER_ID: "${{ secrets.MATRIX_USER_ID }}"
|
MATRIX_USER_ID: "${{ secrets.MATRIX_USER_ID }}"
|
||||||
MATRIX_TOKEN: "${{ secrets.MATRIX_TOKEN }}"
|
MATRIX_TOKEN: "${{ secrets.MATRIX_TOKEN }}"
|
||||||
MATRIX_DEVICE_ID: "${{ secrets.MATRIX_DEVICE_ID }}"
|
MATRIX_DEVICE_ID: "${{ secrets.MATRIX_DEVICE_ID }}"
|
||||||
|
|||||||
@@ -66,9 +66,9 @@ jobs:
|
|||||||
command: build
|
command: build
|
||||||
args: --workspace
|
args: --workspace
|
||||||
|
|
||||||
- name: Reclaim some disk space (because Windows is being annoying)
|
- name: Reclaim some disk space
|
||||||
uses: actions-rs/cargo@v1
|
uses: actions-rs/cargo@v1
|
||||||
if: ${{ matrix.os == 'windows-latest' }}
|
if: ${{ matrix.os == 'windows-latest' || matrix.os == 'ubuntu-20.04' }}
|
||||||
with:
|
with:
|
||||||
command: clean
|
command: clean
|
||||||
|
|
||||||
@@ -78,9 +78,9 @@ jobs:
|
|||||||
command: build
|
command: build
|
||||||
args: --workspace --examples
|
args: --workspace --examples
|
||||||
|
|
||||||
- name: Reclaim some disk space (because Windows is being annoying)
|
- name: Reclaim some disk space
|
||||||
uses: actions-rs/cargo@v1
|
uses: actions-rs/cargo@v1
|
||||||
if: ${{ matrix.os == 'windows-latest' }}
|
if: ${{ matrix.os == 'windows-latest' || matrix.os == 'ubuntu-20.04' }}
|
||||||
with:
|
with:
|
||||||
command: clean
|
command: clean
|
||||||
|
|
||||||
@@ -90,7 +90,7 @@ jobs:
|
|||||||
command: test
|
command: test
|
||||||
args: --workspace
|
args: --workspace
|
||||||
|
|
||||||
- name: Reclaim some disk space (because Windows is being annoying)
|
- name: Reclaim some disk space
|
||||||
uses: actions-rs/cargo@v1
|
uses: actions-rs/cargo@v1
|
||||||
if: ${{ matrix.os == 'windows-latest' || matrix.os == 'ubuntu-20.04' }}
|
if: ${{ matrix.os == 'windows-latest' || matrix.os == 'ubuntu-20.04' }}
|
||||||
with:
|
with:
|
||||||
@@ -103,9 +103,9 @@ jobs:
|
|||||||
command: test
|
command: test
|
||||||
args: --workspace -- --ignored
|
args: --workspace -- --ignored
|
||||||
|
|
||||||
- name: Reclaim some disk space (because Windows is being annoying)
|
- name: Reclaim some disk space
|
||||||
uses: actions-rs/cargo@v1
|
uses: actions-rs/cargo@v1
|
||||||
if: ${{ matrix.os == 'windows-latest' }}
|
if: ${{ matrix.os == 'windows-latest' || matrix.os == 'ubuntu-20.04' }}
|
||||||
with:
|
with:
|
||||||
command: clean
|
command: clean
|
||||||
|
|
||||||
@@ -182,7 +182,7 @@ jobs:
|
|||||||
GIT_BRANCH_NAME: "${{needs.get_release.outputs.output1}}"
|
GIT_BRANCH_NAME: "${{needs.get_release.outputs.output1}}"
|
||||||
IS_SUCCESS: "${{ env.WORKFLOW_CONCLUSION == 'success' }}"
|
IS_SUCCESS: "${{ env.WORKFLOW_CONCLUSION == 'success' }}"
|
||||||
MATRIX_SERVER: "${{ secrets.MATRIX_SERVER }}"
|
MATRIX_SERVER: "${{ secrets.MATRIX_SERVER }}"
|
||||||
MATRIX_ROOM: "${{ secrets.MATRIX_ROOM }}"
|
MATRIX_ROOM: "${{ secrets.MATRIX_ROOM_NIGHTLY }}"
|
||||||
MATRIX_USER_ID: "${{ secrets.MATRIX_USER_ID }}"
|
MATRIX_USER_ID: "${{ secrets.MATRIX_USER_ID }}"
|
||||||
MATRIX_TOKEN: "${{ secrets.MATRIX_TOKEN }}"
|
MATRIX_TOKEN: "${{ secrets.MATRIX_TOKEN }}"
|
||||||
MATRIX_DEVICE_ID: "${{ secrets.MATRIX_DEVICE_ID }}"
|
MATRIX_DEVICE_ID: "${{ secrets.MATRIX_DEVICE_ID }}"
|
||||||
|
|||||||
@@ -182,7 +182,7 @@ jobs:
|
|||||||
GIT_BRANCH_NAME: "${{needs.get_release.outputs.output1}}"
|
GIT_BRANCH_NAME: "${{needs.get_release.outputs.output1}}"
|
||||||
IS_SUCCESS: "${{ env.WORKFLOW_CONCLUSION == 'success' }}"
|
IS_SUCCESS: "${{ env.WORKFLOW_CONCLUSION == 'success' }}"
|
||||||
MATRIX_SERVER: "${{ secrets.MATRIX_SERVER }}"
|
MATRIX_SERVER: "${{ secrets.MATRIX_SERVER }}"
|
||||||
MATRIX_ROOM: "${{ secrets.MATRIX_ROOM }}"
|
MATRIX_ROOM: "${{ secrets.MATRIX_ROOM_NIGHTLY }}"
|
||||||
MATRIX_USER_ID: "${{ secrets.MATRIX_USER_ID }}"
|
MATRIX_USER_ID: "${{ secrets.MATRIX_USER_ID }}"
|
||||||
MATRIX_TOKEN: "${{ secrets.MATRIX_TOKEN }}"
|
MATRIX_TOKEN: "${{ secrets.MATRIX_TOKEN }}"
|
||||||
MATRIX_DEVICE_ID: "${{ secrets.MATRIX_DEVICE_ID }}"
|
MATRIX_DEVICE_ID: "${{ secrets.MATRIX_DEVICE_ID }}"
|
||||||
|
|||||||
@@ -1,50 +0,0 @@
|
|||||||
name: Publish Nym CLI binaries
|
|
||||||
|
|
||||||
on:
|
|
||||||
workflow_dispatch:
|
|
||||||
release:
|
|
||||||
types: [created]
|
|
||||||
|
|
||||||
env:
|
|
||||||
NETWORK: mainnet
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
publish-nym-cli:
|
|
||||||
if: ${{ startsWith(github.ref, 'refs/tags/nym-cli-') && (github.event_name == 'release' || github.event_name == 'workflow_dispatch') }}
|
|
||||||
strategy:
|
|
||||||
fail-fast: false
|
|
||||||
matrix:
|
|
||||||
platform: [ubuntu-20.04, windows-latest, macos-latest]
|
|
||||||
|
|
||||||
runs-on: ${{ matrix.platform }}
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
|
|
||||||
- name: Check the release tag starts with `nym-cli-`
|
|
||||||
uses: actions/github-script@v3
|
|
||||||
with:
|
|
||||||
script: |
|
|
||||||
core.setFailed('Release tag did not start with nym-cli-...')
|
|
||||||
|
|
||||||
- name: Install Rust stable
|
|
||||||
uses: actions-rs/toolchain@v1
|
|
||||||
with:
|
|
||||||
toolchain: stable
|
|
||||||
|
|
||||||
- name: Build binary
|
|
||||||
run: make build-nym-cli
|
|
||||||
|
|
||||||
- name: Upload Artifact
|
|
||||||
uses: actions/upload-artifact@v3
|
|
||||||
with:
|
|
||||||
name: nym-cli-${{ matrix.platform }}
|
|
||||||
path: |
|
|
||||||
target/release/nym-cli*
|
|
||||||
retention-days: 30
|
|
||||||
|
|
||||||
- name: Upload to release based on tag name
|
|
||||||
uses: softprops/action-gh-release@v1
|
|
||||||
if: github.event_name == 'release'
|
|
||||||
with:
|
|
||||||
files: |
|
|
||||||
target/release/nym-cli
|
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
name: Publish Nym Connect (MacOS)
|
name: Publish Nym Connect - desktop (MacOS)
|
||||||
on:
|
on:
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
release:
|
release:
|
||||||
@@ -6,11 +6,11 @@ on:
|
|||||||
|
|
||||||
defaults:
|
defaults:
|
||||||
run:
|
run:
|
||||||
working-directory: nym-connect
|
working-directory: nym-connect/desktop
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
publish-tauri:
|
publish-tauri:
|
||||||
if: ${{ startsWith(github.ref, 'refs/tags/nym-connect-') && github.event_name == 'release' }}
|
if: ${{ (startsWith(github.ref, 'refs/tags/nym-connect-') && github.event_name == 'release') || github.event_name == 'workflow_dispatch' }}
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
@@ -73,7 +73,7 @@ jobs:
|
|||||||
uses: actions/upload-artifact@v3
|
uses: actions/upload-artifact@v3
|
||||||
with:
|
with:
|
||||||
name: nym-connect_1.0.0_x64.dmg
|
name: nym-connect_1.0.0_x64.dmg
|
||||||
path: nym-connect/target/release/bundle/dmg/nym-connect_1.0.0_x64.dmg
|
path: nym-connect/desktop/target/release/bundle/dmg/nym-connect_1.0.0_x64.dmg
|
||||||
retention-days: 30
|
retention-days: 30
|
||||||
|
|
||||||
- name: Clean up keychain
|
- name: Clean up keychain
|
||||||
@@ -86,5 +86,5 @@ jobs:
|
|||||||
if: github.event_name == 'release'
|
if: github.event_name == 'release'
|
||||||
with:
|
with:
|
||||||
files: |
|
files: |
|
||||||
nym-connect/target/release/bundle/dmg/*.dmg
|
nym-connect/desktop/target/release/bundle/dmg/*.dmg
|
||||||
nym-connect/target/release/bundle/macos/*.app.tar.gz*
|
nym-connect/desktop/target/release/bundle/macos/*.app.tar.gz*
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
name: Publish Nym Connect (Ubuntu)
|
name: Publish Nym Connect - desktop (Ubuntu)
|
||||||
on:
|
on:
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
release:
|
release:
|
||||||
@@ -6,11 +6,11 @@ on:
|
|||||||
|
|
||||||
defaults:
|
defaults:
|
||||||
run:
|
run:
|
||||||
working-directory: nym-connect
|
working-directory: nym-connect/desktop
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
publish-tauri:
|
publish-tauri:
|
||||||
if: ${{ startsWith(github.ref, 'refs/tags/nym-connect-') && github.event_name == 'release' }}
|
if: ${{ (startsWith(github.ref, 'refs/tags/nym-connect-') && github.event_name == 'release') || github.event_name == 'workflow_dispatch' }}
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
@@ -53,7 +53,7 @@ jobs:
|
|||||||
uses: actions/upload-artifact@v3
|
uses: actions/upload-artifact@v3
|
||||||
with:
|
with:
|
||||||
name: nym-connect.AppImage.tar.gz
|
name: nym-connect.AppImage.tar.gz
|
||||||
path: nym-connect/target/release/bundle/appimage/nym-connect_1.0.0_amd64.AppImage
|
path: nym-connect/desktop/target/release/bundle/appimage/nym-connect_1.0.0_amd64.AppImage
|
||||||
retention-days: 30
|
retention-days: 30
|
||||||
|
|
||||||
- name: Upload to release based on tag name
|
- name: Upload to release based on tag name
|
||||||
@@ -61,5 +61,5 @@ jobs:
|
|||||||
if: github.event_name == 'release'
|
if: github.event_name == 'release'
|
||||||
with:
|
with:
|
||||||
files: |
|
files: |
|
||||||
nym-connect/target/release/bundle/appimage/*.AppImage
|
nym-connect/desktop/target/release/bundle/appimage/*.AppImage
|
||||||
nym-connect/target/release/bundle/appimage/*.AppImage.tar.gz*
|
nym-connect/desktop/target/release/bundle/appimage/*.AppImage.tar.gz*
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
name: Publish Nym Connect (Windows 10)
|
name: Publish Nym Connect - desktop (Windows 10)
|
||||||
on:
|
on:
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
release:
|
release:
|
||||||
@@ -6,7 +6,7 @@ on:
|
|||||||
|
|
||||||
defaults:
|
defaults:
|
||||||
run:
|
run:
|
||||||
working-directory: nym-connect
|
working-directory: nym-connect/desktop
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
publish-tauri:
|
publish-tauri:
|
||||||
@@ -72,7 +72,7 @@ jobs:
|
|||||||
uses: actions/upload-artifact@v3
|
uses: actions/upload-artifact@v3
|
||||||
with:
|
with:
|
||||||
name: nym-connect_1.0.0_x64_en-US.msi
|
name: nym-connect_1.0.0_x64_en-US.msi
|
||||||
path: nym-connect/target/release/bundle/msi/nym-connect_1.*.msi
|
path: nym-connect/desktop/target/release/bundle/msi/nym-connect_1.0.0_x64_en-US.msi
|
||||||
retention-days: 30
|
retention-days: 30
|
||||||
|
|
||||||
- name: Upload to release based on tag name
|
- name: Upload to release based on tag name
|
||||||
@@ -80,5 +80,5 @@ jobs:
|
|||||||
if: github.event_name == 'release'
|
if: github.event_name == 'release'
|
||||||
with:
|
with:
|
||||||
files: |
|
files: |
|
||||||
nym-connect/target/release/bundle/msi/*.msi
|
nym-connect/desktop/target/release/bundle/msi/*.msi
|
||||||
nym-connect/target/release/bundle/msi/*.msi.zip*
|
nym-connect/desktop/target/release/bundle/msi/*.msi.zip*
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ env:
|
|||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
publish-nym:
|
publish-nym:
|
||||||
if: ${{ startsWith(github.ref, 'refs/tags/nym-binaries-') && github.event_name == 'release' }}
|
if: ${{ (startsWith(github.ref, 'refs/tags/nym-binaries-') && github.event_name == 'release') || github.event_name == 'workflow_dispatch' }}
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ defaults:
|
|||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
publish-tauri:
|
publish-tauri:
|
||||||
if: ${{ startsWith(github.ref, 'refs/tags/nym-wallet-') && github.event_name == 'release' }}
|
if: ${{ (startsWith(github.ref, 'refs/tags/nym-wallet-') && github.event_name == 'release') || github.event_name == 'workflow_dispatch' }}
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ defaults:
|
|||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
publish-tauri:
|
publish-tauri:
|
||||||
if: ${{ startsWith(github.ref, 'refs/tags/nym-wallet-') && github.event_name == 'release' }}
|
if: ${{ (startsWith(github.ref, 'refs/tags/nym-wallet-') && github.event_name == 'release') || github.event_name == 'workflow_dispatch' }}
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
|
|||||||
@@ -0,0 +1,36 @@
|
|||||||
|
name: CI for 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 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:qa
|
||||||
|
working-directory: nym-api/tests
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
const Handlebars = require('handlebars');
|
||||||
|
const fs = require('fs');
|
||||||
|
const path = require('path');
|
||||||
|
|
||||||
|
async function addToContextAndValidate(context) {
|
||||||
|
if (!context.env.NYM_CI_WWW_LOCATION) {
|
||||||
|
throw new Error('Please ensure the env var NYM_CI_WWW_LOCATION is set');
|
||||||
|
}
|
||||||
|
if (!context.env.NYM_CI_WWW_BASE) {
|
||||||
|
throw new Error('Please ensure the env var NYM_CI_WWW_BASE is set');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async function getMessageBody(context) {
|
||||||
|
const source = fs
|
||||||
|
.readFileSync(
|
||||||
|
context.env.IS_SUCCESS === 'true'
|
||||||
|
? path.resolve(__dirname, 'templates', 'success')
|
||||||
|
: path.resolve(__dirname, 'templates', 'failure'),
|
||||||
|
)
|
||||||
|
.toString();
|
||||||
|
const template = Handlebars.compile(source);
|
||||||
|
return template(context);
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
addToContextAndValidate,
|
||||||
|
getMessageBody,
|
||||||
|
};
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥
|
||||||
|
> :rocket: {{ env.NYM_PROJECT_NAME }}
|
||||||
|
>
|
||||||
|
> 🔴 **FAILURE** :cry:
|
||||||
|
>
|
||||||
|
> `branch` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/tree/{{ env.GIT_BRANCH_NAME }}
|
||||||
|
>
|
||||||
|
> `commit` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/commit/{{ env.GITHUB_SHA }}
|
||||||
|
>
|
||||||
|
> `build ` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/actions/runs/{{ env.GITHUB_RUN_ID }}
|
||||||
|
>
|
||||||
|
|
||||||
|
Commit message:
|
||||||
|
|
||||||
|
```
|
||||||
|
{{ env.GIT_COMMIT_MESSAGE }}
|
||||||
|
```
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩
|
||||||
|
> :rocket: {{ env.NYM_PROJECT_NAME }} ➡️➡️➡️➡️➡️ **View output:** https://{{ env.NYM_CI_WWW_BASE }}/developers/
|
||||||
|
>
|
||||||
|
> ✅ **SUCCESS**
|
||||||
|
>
|
||||||
|
> `branch` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/tree/{{ env.GIT_BRANCH_NAME }}
|
||||||
|
>
|
||||||
|
> `commit` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/commit/{{ env.GITHUB_SHA }}
|
||||||
|
>
|
||||||
|
> `build ` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/actions/runs/{{ env.GITHUB_RUN_ID }}
|
||||||
|
>
|
||||||
|
|
||||||
|
Commit message by `{{ env.GITHUB_ACTOR }}` at {{ timestamp }}:
|
||||||
|
|
||||||
|
```
|
||||||
|
{{ env.GIT_COMMIT_MESSAGE }}
|
||||||
|
```
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
const Handlebars = require('handlebars');
|
||||||
|
const fs = require('fs');
|
||||||
|
const path = require('path');
|
||||||
|
|
||||||
|
async function addToContextAndValidate(context) {
|
||||||
|
if (!context.env.NYM_CI_WWW_LOCATION) {
|
||||||
|
throw new Error('Please ensure the env var NYM_CI_WWW_LOCATION is set');
|
||||||
|
}
|
||||||
|
if (!context.env.NYM_CI_WWW_BASE) {
|
||||||
|
throw new Error('Please ensure the env var NYM_CI_WWW_BASE is set');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async function getMessageBody(context) {
|
||||||
|
const source = fs
|
||||||
|
.readFileSync(
|
||||||
|
context.env.IS_SUCCESS === 'true'
|
||||||
|
? path.resolve(__dirname, 'templates', 'success')
|
||||||
|
: path.resolve(__dirname, 'templates', 'failure'),
|
||||||
|
)
|
||||||
|
.toString();
|
||||||
|
const template = Handlebars.compile(source);
|
||||||
|
return template(context);
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
addToContextAndValidate,
|
||||||
|
getMessageBody,
|
||||||
|
};
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥
|
||||||
|
> :rocket: {{ env.NYM_PROJECT_NAME }}
|
||||||
|
> 🔴 **FAILURE** :cry:
|
||||||
|
> `branch` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/tree/{{ env.GIT_BRANCH_NAME }}
|
||||||
|
> `commit` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/commit/{{ env.GITHUB_SHA }}
|
||||||
|
> `build ` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/actions/runs/{{ env.GITHUB_RUN_ID }}
|
||||||
|
|
||||||
|
Commit message:
|
||||||
|
```
|
||||||
|
{{ env.GIT_COMMIT_MESSAGE }}
|
||||||
|
```
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩
|
||||||
|
> :rocket: {{ env.NYM_PROJECT_NAME }} ➡️➡️➡️➡️➡️ **View output:** https://{{ env.NYM_CI_WWW_BASE }}/docs/
|
||||||
|
>
|
||||||
|
> ✅ **SUCCESS**
|
||||||
|
>
|
||||||
|
> `branch` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/tree/{{ env.GIT_BRANCH_NAME }}
|
||||||
|
>
|
||||||
|
> `commit` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/commit/{{ env.GITHUB_SHA }}
|
||||||
|
>
|
||||||
|
> `build ` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/actions/runs/{{ env.GITHUB_RUN_ID }}
|
||||||
|
>
|
||||||
|
|
||||||
|
Commit message by `{{ env.GITHUB_ACTOR }}` at {{ timestamp }}:
|
||||||
|
|
||||||
|
```
|
||||||
|
{{ env.GIT_COMMIT_MESSAGE }}
|
||||||
|
```
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
const Handlebars = require('handlebars');
|
||||||
|
const fs = require('fs');
|
||||||
|
const path = require('path');
|
||||||
|
|
||||||
|
async function addToContextAndValidate(context) {
|
||||||
|
if (!context.env.NYM_CI_WWW_LOCATION) {
|
||||||
|
throw new Error('Please ensure the env var NYM_CI_WWW_LOCATION is set');
|
||||||
|
}
|
||||||
|
if (!context.env.NYM_CI_WWW_BASE) {
|
||||||
|
throw new Error('Please ensure the env var NYM_CI_WWW_BASE is set');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async function getMessageBody(context) {
|
||||||
|
const source = fs
|
||||||
|
.readFileSync(
|
||||||
|
context.env.IS_SUCCESS === 'true'
|
||||||
|
? path.resolve(__dirname, 'templates', 'success')
|
||||||
|
: path.resolve(__dirname, 'templates', 'failure'),
|
||||||
|
)
|
||||||
|
.toString();
|
||||||
|
const template = Handlebars.compile(source);
|
||||||
|
return template(context);
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
addToContextAndValidate,
|
||||||
|
getMessageBody,
|
||||||
|
};
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥
|
||||||
|
> :rocket: {{ env.NYM_PROJECT_NAME }}
|
||||||
|
>
|
||||||
|
> 🔴 **FAILURE** :cry:
|
||||||
|
>
|
||||||
|
> `branch` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/tree/{{ env.GIT_BRANCH_NAME }}
|
||||||
|
>
|
||||||
|
> `commit` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/commit/{{ env.GITHUB_SHA }}
|
||||||
|
>
|
||||||
|
> `build ` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/actions/runs/{{ env.GITHUB_RUN_ID }}
|
||||||
|
>
|
||||||
|
|
||||||
|
Commit message:
|
||||||
|
|
||||||
|
```
|
||||||
|
{{ env.GIT_COMMIT_MESSAGE }}
|
||||||
|
```
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩
|
||||||
|
> :rocket: {{ env.NYM_PROJECT_NAME }} ➡️➡️➡️➡️➡️ **View output:** https://{{ env.NYM_CI_WWW_LOCATION }}.{{ env.NYM_CI_WWW_BASE }}/
|
||||||
|
>
|
||||||
|
> ✅ **SUCCESS**
|
||||||
|
>
|
||||||
|
> `branch` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/tree/{{ env.GIT_BRANCH_NAME }}
|
||||||
|
>
|
||||||
|
> `commit` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/commit/{{ env.GITHUB_SHA }}
|
||||||
|
>
|
||||||
|
> `build ` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/actions/runs/{{ env.GITHUB_RUN_ID }}
|
||||||
|
>
|
||||||
|
|
||||||
|
Commit message by `{{ env.GITHUB_ACTOR }}` at {{ timestamp }}:
|
||||||
|
|
||||||
|
```
|
||||||
|
{{ env.GIT_COMMIT_MESSAGE }}
|
||||||
|
```
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
const Handlebars = require('handlebars');
|
||||||
|
const fs = require('fs');
|
||||||
|
const path = require('path');
|
||||||
|
|
||||||
|
async function addToContextAndValidate(context) {
|
||||||
|
if (!context.env.NYM_CI_WWW_LOCATION) {
|
||||||
|
throw new Error('Please ensure the env var NYM_CI_WWW_LOCATION is set');
|
||||||
|
}
|
||||||
|
if (!context.env.NYM_CI_WWW_BASE) {
|
||||||
|
throw new Error('Please ensure the env var NYM_CI_WWW_BASE is set');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async function getMessageBody(context) {
|
||||||
|
const source = fs
|
||||||
|
.readFileSync(
|
||||||
|
context.env.IS_SUCCESS === 'true'
|
||||||
|
? path.resolve(__dirname, 'templates', 'success')
|
||||||
|
: path.resolve(__dirname, 'templates', 'failure'),
|
||||||
|
)
|
||||||
|
.toString();
|
||||||
|
const template = Handlebars.compile(source);
|
||||||
|
return template(context);
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
addToContextAndValidate,
|
||||||
|
getMessageBody,
|
||||||
|
};
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥
|
||||||
|
> :rocket: {{ env.NYM_PROJECT_NAME }}
|
||||||
|
>
|
||||||
|
> 🔴 **FAILURE** :cry:
|
||||||
|
>
|
||||||
|
> `branch` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/tree/{{ env.GIT_BRANCH_NAME }}
|
||||||
|
>
|
||||||
|
> `commit` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/commit/{{ env.GITHUB_SHA }}
|
||||||
|
>
|
||||||
|
> `build ` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/actions/runs/{{ env.GITHUB_RUN_ID }}
|
||||||
|
>
|
||||||
|
|
||||||
|
Commit message:
|
||||||
|
|
||||||
|
```
|
||||||
|
{{ env.GIT_COMMIT_MESSAGE }}
|
||||||
|
```
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩
|
||||||
|
> :rocket: {{ env.NYM_PROJECT_NAME }} ➡️➡️➡️➡️➡️ **View output:** https://{{ env.NYM_CI_WWW_LOCATION }}.{{ env.NYM_CI_WWW_BASE }}/
|
||||||
|
>
|
||||||
|
> ✅ **SUCCESS**
|
||||||
|
>
|
||||||
|
> `branch` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/tree/{{ env.GIT_BRANCH_NAME }}
|
||||||
|
>
|
||||||
|
> `commit` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/commit/{{ env.GITHUB_SHA }}
|
||||||
|
>
|
||||||
|
> `build ` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/actions/runs/{{ env.GITHUB_RUN_ID }}
|
||||||
|
>
|
||||||
|
|
||||||
|
Commit message by `{{ env.GITHUB_ACTOR }}` at {{ timestamp }}:
|
||||||
|
|
||||||
|
```
|
||||||
|
{{ env.GIT_COMMIT_MESSAGE }}
|
||||||
|
```
|
||||||
@@ -1,9 +1,14 @@
|
|||||||
🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥
|
🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥
|
||||||
> :rocket: {{ env.NYM_PROJECT_NAME }}
|
> :rocket: {{ env.NYM_PROJECT_NAME }}
|
||||||
|
>
|
||||||
> 🔴 **FAILURE** :cry:
|
> 🔴 **FAILURE** :cry:
|
||||||
|
>
|
||||||
> `branch` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/tree/{{ env.GIT_BRANCH_NAME }}
|
> `branch` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/tree/{{ env.GIT_BRANCH_NAME }}
|
||||||
|
>
|
||||||
> `commit` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/commit/{{ env.GITHUB_SHA }}
|
> `commit` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/commit/{{ env.GITHUB_SHA }}
|
||||||
|
>
|
||||||
> `build ` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/actions/runs/{{ env.GITHUB_RUN_ID }}
|
> `build ` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/actions/runs/{{ env.GITHUB_RUN_ID }}
|
||||||
|
>
|
||||||
|
|
||||||
Commit message:
|
Commit message:
|
||||||
```
|
```
|
||||||
|
|||||||
@@ -1,10 +1,16 @@
|
|||||||
🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩
|
🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩
|
||||||
> :rocket: {{ env.NYM_PROJECT_NAME }} ➡️➡️➡️➡️➡️ **View output:** https://{{ env.NYM_CI_WWW_LOCATION }}.{{ env.NYM_CI_WWW_BASE }}/
|
> :rocket: {{ env.NYM_PROJECT_NAME }} ➡️➡️➡️➡️➡️ **View output:** https://{{ env.NYM_CI_WWW_LOCATION }}.{{ env.NYM_CI_WWW_BASE }}/
|
||||||
|
>
|
||||||
> `storybook`: https://{{ env.NYM_CI_WWW_LOCATION_STORYBOOK }}.{{ env.NYM_CI_WWW_BASE }}
|
> `storybook`: https://{{ env.NYM_CI_WWW_LOCATION_STORYBOOK }}.{{ env.NYM_CI_WWW_BASE }}
|
||||||
|
>
|
||||||
> ✅ **SUCCESS**
|
> ✅ **SUCCESS**
|
||||||
|
>
|
||||||
> `branch` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/tree/{{ env.GIT_BRANCH_NAME }}
|
> `branch` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/tree/{{ env.GIT_BRANCH_NAME }}
|
||||||
|
>
|
||||||
> `commit` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/commit/{{ env.GITHUB_SHA }}
|
> `commit` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/commit/{{ env.GITHUB_SHA }}
|
||||||
|
>
|
||||||
> `build ` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/actions/runs/{{ env.GITHUB_RUN_ID }}
|
> `build ` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/actions/runs/{{ env.GITHUB_RUN_ID }}
|
||||||
|
>
|
||||||
|
|
||||||
Commit message by `{{ env.GITHUB_ACTOR }}` at {{ timestamp }}:
|
Commit message by `{{ env.GITHUB_ACTOR }}` at {{ timestamp }}:
|
||||||
```
|
```
|
||||||
|
|||||||
@@ -151,7 +151,7 @@ async function getMessageBody(context) {
|
|||||||
return `${icon} ${job.conclusion}: ${job.name} - ${job.html_url}`;
|
return `${icon} ${job.conclusion}: ${job.name} - ${job.html_url}`;
|
||||||
})
|
})
|
||||||
// and join with newlines for display in the template
|
// and join with newlines for display in the template
|
||||||
.join('\n');
|
.join('\n\n');
|
||||||
|
|
||||||
return template({ ...context, jobResults });
|
return template({ ...context, jobResults });
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,9 +1,15 @@
|
|||||||
🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥
|
🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥
|
||||||
> :rocket: {{ env.NYM_PROJECT_NAME }}
|
> :rocket: {{ env.NYM_PROJECT_NAME }}
|
||||||
|
>
|
||||||
> 🔴 **FAILURE** :cry:
|
> 🔴 **FAILURE** :cry:
|
||||||
|
>
|
||||||
> `when` {{ timestamp }}
|
> `when` {{ timestamp }}
|
||||||
|
>
|
||||||
> `branch` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/tree/{{ env.GIT_BRANCH_NAME }}
|
> `branch` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/tree/{{ env.GIT_BRANCH_NAME }}
|
||||||
|
>
|
||||||
> `commit` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/commit/{{ env.GITHUB_SHA }}
|
> `commit` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/commit/{{ env.GITHUB_SHA }}
|
||||||
|
>
|
||||||
> `build ` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/actions/runs/{{ env.GITHUB_RUN_ID }}
|
> `build ` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/actions/runs/{{ env.GITHUB_RUN_ID }}
|
||||||
|
>
|
||||||
|
|
||||||
{{ jobResults }}
|
{{ jobResults }}
|
||||||
|
|||||||
@@ -1,9 +1,15 @@
|
|||||||
🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩
|
🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩
|
||||||
> :rocket: {{ env.NYM_PROJECT_NAME }}
|
> :rocket: {{ env.NYM_PROJECT_NAME }}
|
||||||
|
>
|
||||||
> ✅ **SUCCESS**
|
> ✅ **SUCCESS**
|
||||||
|
>
|
||||||
> `when` {{ timestamp }}
|
> `when` {{ timestamp }}
|
||||||
|
>
|
||||||
> `branch` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/tree/{{ env.GIT_BRANCH_NAME }}
|
> `branch` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/tree/{{ env.GIT_BRANCH_NAME }}
|
||||||
|
>
|
||||||
> `commit` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/commit/{{ env.GITHUB_SHA }}
|
> `commit` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/commit/{{ env.GITHUB_SHA }}
|
||||||
|
>
|
||||||
> `build ` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/actions/runs/{{ env.GITHUB_RUN_ID }}
|
> `build ` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/actions/runs/{{ env.GITHUB_RUN_ID }}
|
||||||
|
>
|
||||||
|
|
||||||
{{ jobResults }}
|
{{ jobResults }}
|
||||||
@@ -3,7 +3,7 @@ require('dotenv').config();
|
|||||||
const { sendMatrixMessage } = require('./send_message_to_matrix');
|
const { sendMatrixMessage } = require('./send_message_to_matrix');
|
||||||
|
|
||||||
let context = {
|
let context = {
|
||||||
kinds: ['nym-wallet', 'ts-packages', 'network-explorer', 'nightly', 'nym-connect','security'],
|
kinds: ['nym-wallet', 'ts-packages', 'network-explorer', 'nightly', 'nym-connect','security','ci-docs','cd-docs','ci-dev','cd-dev'],
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -5,12 +5,7 @@ const localStorage = new LocalStorage('./scratch');
|
|||||||
const {
|
const {
|
||||||
LocalStorageCryptoStore,
|
LocalStorageCryptoStore,
|
||||||
} = require('matrix-js-sdk/lib/crypto/store/localStorage-crypto-store');
|
} = require('matrix-js-sdk/lib/crypto/store/localStorage-crypto-store');
|
||||||
|
var showdown = require('showdown');
|
||||||
const vfile = require('to-vfile');
|
|
||||||
const unified = require('unified');
|
|
||||||
const remarkParse = require('remark-parse');
|
|
||||||
const remarkHtml = require('remark-html');
|
|
||||||
const emoji = require('remark-emoji');
|
|
||||||
|
|
||||||
// hide all matrix client output
|
// hide all matrix client output
|
||||||
console.error = (error) => console.log('❌ error: ', error);
|
console.error = (error) => console.log('❌ error: ', error);
|
||||||
@@ -59,17 +54,9 @@ function createClient(context, room, message) {
|
|||||||
return client;
|
return client;
|
||||||
}
|
}
|
||||||
|
|
||||||
async function markdownToHtml(messageAsMarkdown) {
|
|
||||||
const file = await unified()
|
|
||||||
.use(emoji)
|
|
||||||
.use(remarkParse)
|
|
||||||
.use(remarkHtml)
|
|
||||||
.process(await vfile({ path: 'test.md', contents: messageAsMarkdown}));
|
|
||||||
return String(file);
|
|
||||||
}
|
|
||||||
|
|
||||||
async function sendMatrixMessage(contextArg, messageAsMarkdown, roomId) {
|
async function sendMatrixMessage(contextArg, messageAsMarkdown, roomId) {
|
||||||
const messageAsHtml = await markdownToHtml(messageAsMarkdown);
|
const converter = new showdown.Converter();
|
||||||
|
const messageAsHtml = converter.makeHtml(messageAsMarkdown);
|
||||||
const client = createClient(contextArg, roomId, messageAsHtml);
|
const client = createClient(contextArg, roomId, messageAsHtml);
|
||||||
await client.initCrypto();
|
await client.initCrypto();
|
||||||
await client.startClient({ initialSyncLimit: 1 });
|
await client.startClient({ initialSyncLimit: 1 });
|
||||||
|
|||||||
@@ -1,9 +1,14 @@
|
|||||||
🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥
|
🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥
|
||||||
> :rocket: {{ env.NYM_PROJECT_NAME }}
|
> :rocket: {{ env.NYM_PROJECT_NAME }}
|
||||||
|
>
|
||||||
> 🔴 **FAILURE** :cry:
|
> 🔴 **FAILURE** :cry:
|
||||||
|
>
|
||||||
> `branch` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/tree/{{ env.GIT_BRANCH_NAME }}
|
> `branch` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/tree/{{ env.GIT_BRANCH_NAME }}
|
||||||
|
>
|
||||||
> `commit` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/commit/{{ env.GITHUB_SHA }}
|
> `commit` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/commit/{{ env.GITHUB_SHA }}
|
||||||
|
>
|
||||||
> `build ` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/actions/runs/{{ env.GITHUB_RUN_ID }}
|
> `build ` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/actions/runs/{{ env.GITHUB_RUN_ID }}
|
||||||
|
>
|
||||||
|
|
||||||
Commit message:
|
Commit message:
|
||||||
```
|
```
|
||||||
|
|||||||
@@ -1,9 +1,14 @@
|
|||||||
🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩
|
🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩
|
||||||
> :rocket: {{ env.NYM_PROJECT_NAME }} ➡️➡️➡️➡️➡️ **View storybook:** https://{{ env.NYM_CI_WWW_LOCATION }}.{{ env.NYM_CI_WWW_BASE }}/
|
> :rocket: {{ env.NYM_PROJECT_NAME }} ➡️➡️➡️➡️➡️ **View storybook:** https://{{ env.NYM_CI_WWW_LOCATION }}.{{ env.NYM_CI_WWW_BASE }}/
|
||||||
|
>
|
||||||
> ✅ **SUCCESS**
|
> ✅ **SUCCESS**
|
||||||
|
>
|
||||||
> `branch` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/tree/{{ env.GIT_BRANCH_NAME }}
|
> `branch` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/tree/{{ env.GIT_BRANCH_NAME }}
|
||||||
|
>
|
||||||
> `commit` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/commit/{{ env.GITHUB_SHA }}
|
> `commit` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/commit/{{ env.GITHUB_SHA }}
|
||||||
|
>
|
||||||
> `build ` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/actions/runs/{{ env.GITHUB_RUN_ID }}
|
> `build ` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/actions/runs/{{ env.GITHUB_RUN_ID }}
|
||||||
|
>
|
||||||
|
|
||||||
Commit message by `{{ env.GITHUB_ACTOR }}` at {{ timestamp }}:
|
Commit message by `{{ env.GITHUB_ACTOR }}` at {{ timestamp }}:
|
||||||
```
|
```
|
||||||
|
|||||||
@@ -1,9 +1,14 @@
|
|||||||
🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥
|
🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥
|
||||||
> :rocket: {{ env.NYM_PROJECT_NAME }}
|
> :rocket: {{ env.NYM_PROJECT_NAME }}
|
||||||
|
>
|
||||||
> 🔴 **FAILURE** :cry:
|
> 🔴 **FAILURE** :cry:
|
||||||
|
>
|
||||||
> `branch` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/tree/{{ env.GIT_BRANCH_NAME }}
|
> `branch` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/tree/{{ env.GIT_BRANCH_NAME }}
|
||||||
|
>
|
||||||
> `commit` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/commit/{{ env.GITHUB_SHA }}
|
> `commit` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/commit/{{ env.GITHUB_SHA }}
|
||||||
|
>
|
||||||
> `build ` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/actions/runs/{{ env.GITHUB_RUN_ID }}
|
> `build ` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/actions/runs/{{ env.GITHUB_RUN_ID }}
|
||||||
|
>
|
||||||
|
|
||||||
Commit message:
|
Commit message:
|
||||||
```
|
```
|
||||||
|
|||||||
@@ -1,13 +1,18 @@
|
|||||||
🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩
|
🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩
|
||||||
> :rocket: {{ env.NYM_PROJECT_NAME }}
|
> :rocket: {{ env.NYM_PROJECT_NAME }}
|
||||||
|
>
|
||||||
> ✅ **SUCCESS**
|
> ✅ **SUCCESS**
|
||||||
|
>
|
||||||
> ➡️➡️➡️➡️➡️ **View output:**
|
> ➡️➡️➡️➡️➡️ **View output:**
|
||||||
|
>
|
||||||
> `storybook`: https://{{ env.NYM_CI_WWW_LOCATION }}.{{ env.NYM_CI_WWW_BASE }}
|
> `storybook`: https://{{ env.NYM_CI_WWW_LOCATION }}.{{ env.NYM_CI_WWW_BASE }}
|
||||||
|
>
|
||||||
> `branch` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/tree/{{ env.GIT_BRANCH_NAME }}
|
> `branch` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/tree/{{ env.GIT_BRANCH_NAME }}
|
||||||
|
>
|
||||||
> `commit` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/commit/{{ env.GITHUB_SHA }}
|
> `commit` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/commit/{{ env.GITHUB_SHA }}
|
||||||
|
>
|
||||||
> `build ` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/actions/runs/{{ env.GITHUB_RUN_ID }}
|
> `build ` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/actions/runs/{{ env.GITHUB_RUN_ID }}
|
||||||
|
>
|
||||||
|
|
||||||
Commit message by `{{ env.GITHUB_ACTOR }}` at {{ timestamp }}:
|
Commit message by `{{ env.GITHUB_ACTOR }}` at {{ timestamp }}:
|
||||||
```
|
```
|
||||||
|
|||||||
@@ -17,10 +17,11 @@
|
|||||||
"remark-emoji": "^2.2.0",
|
"remark-emoji": "^2.2.0",
|
||||||
"remark-html": "^13.0.2",
|
"remark-html": "^13.0.2",
|
||||||
"remark-parse": "^9.0.0",
|
"remark-parse": "^9.0.0",
|
||||||
|
"showdown": "^2.1.0",
|
||||||
"to-vfile": "^6.1.0",
|
"to-vfile": "^6.1.0",
|
||||||
"unified": "^9.2.2"
|
"unified": "^9.2.2"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"prettier": "2.3.2"
|
"prettier": "^2.8.7"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,9 +1,14 @@
|
|||||||
🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥
|
🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥
|
||||||
> :rocket: {{ env.NYM_PROJECT_NAME }}
|
> :rocket: {{ env.NYM_PROJECT_NAME }}
|
||||||
|
>
|
||||||
> 🔴 **FAILURE** :cry:
|
> 🔴 **FAILURE** :cry:
|
||||||
|
>
|
||||||
> `branch` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/tree/{{ env.GIT_BRANCH_NAME }}
|
> `branch` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/tree/{{ env.GIT_BRANCH_NAME }}
|
||||||
|
>
|
||||||
> `commit` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/commit/{{ env.GITHUB_SHA }}
|
> `commit` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/commit/{{ env.GITHUB_SHA }}
|
||||||
|
>
|
||||||
> `build ` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/actions/runs/{{ env.GITHUB_RUN_ID }}
|
> `build ` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/actions/runs/{{ env.GITHUB_RUN_ID }}
|
||||||
|
>
|
||||||
|
|
||||||
Commit message:
|
Commit message:
|
||||||
```
|
```
|
||||||
|
|||||||
@@ -1,14 +1,20 @@
|
|||||||
🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩
|
🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩
|
||||||
> :rocket: {{ env.NYM_PROJECT_NAME }}
|
> :rocket: {{ env.NYM_PROJECT_NAME }}
|
||||||
|
>
|
||||||
> ✅ **SUCCESS**
|
> ✅ **SUCCESS**
|
||||||
|
>
|
||||||
> ➡️➡️➡️➡️➡️ **View output:**
|
> ➡️➡️➡️➡️➡️ **View output:**
|
||||||
|
>
|
||||||
> `storybook`: https://{{ env.NYM_CI_WWW_LOCATION }}.{{ env.NYM_CI_WWW_BASE }}
|
> `storybook`: https://{{ env.NYM_CI_WWW_LOCATION }}.{{ env.NYM_CI_WWW_BASE }}
|
||||||
|
>
|
||||||
> `example`: https://{{ env.NYM_CI_WWW_LOCATION }}-example.{{ env.NYM_CI_WWW_BASE }}
|
> `example`: https://{{ env.NYM_CI_WWW_LOCATION }}-example.{{ env.NYM_CI_WWW_BASE }}
|
||||||
|
>
|
||||||
> `branch` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/tree/{{ env.GIT_BRANCH_NAME }}
|
> `branch` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/tree/{{ env.GIT_BRANCH_NAME }}
|
||||||
|
>
|
||||||
> `commit` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/commit/{{ env.GITHUB_SHA }}
|
> `commit` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/commit/{{ env.GITHUB_SHA }}
|
||||||
|
>
|
||||||
> `build ` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/actions/runs/{{ env.GITHUB_RUN_ID }}
|
> `build ` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/actions/runs/{{ env.GITHUB_RUN_ID }}
|
||||||
|
>
|
||||||
|
|
||||||
Commit message by `{{ env.GITHUB_ACTOR }}` at {{ timestamp }}:
|
Commit message by `{{ env.GITHUB_ACTOR }}` at {{ timestamp }}:
|
||||||
```
|
```
|
||||||
|
|||||||
@@ -0,0 +1,46 @@
|
|||||||
|
name: tag-and-release
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
inputs:
|
||||||
|
nym_binaries_version:
|
||||||
|
description: 'Version of the nym-binaries tag'
|
||||||
|
required: false
|
||||||
|
type: string
|
||||||
|
nym_wallet_version:
|
||||||
|
description: 'Version of the nym-wallet tag'
|
||||||
|
required: false
|
||||||
|
type: string
|
||||||
|
nym_connect_version:
|
||||||
|
description: 'Version of the nym-connect tag'
|
||||||
|
required: false
|
||||||
|
type: string
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
tag-components:
|
||||||
|
uses: nymtech/reusable-workflows/.github/workflows/tag-components.yml@master
|
||||||
|
with:
|
||||||
|
nym_binaries_version: ${{ input.nym_binaries_version }}
|
||||||
|
nym_wallet_version: ${{ input.nym_wallet_version }}
|
||||||
|
nym_connect_version: ${{ input.nym_connect_version }}
|
||||||
|
|
||||||
|
create-nym-binaries-release:
|
||||||
|
if: ${{ input.nym_binaries_version }}
|
||||||
|
uses: nymtech/reusable-workflows/.github/workflows/create-binaries-release.yml@master
|
||||||
|
with:
|
||||||
|
version: ${{ input.nym_binaries_version }}
|
||||||
|
needs: ["tag-components"]
|
||||||
|
|
||||||
|
create-nym-wallet-release:
|
||||||
|
if: ${{ input.nym_wallet_version }}
|
||||||
|
uses: nymtech/reusable-workflows/.github/workflows/create-wallet-release.yml@master
|
||||||
|
with:
|
||||||
|
version: ${{ input.nym_wallet_version }}
|
||||||
|
needs: ["tag-components"]
|
||||||
|
|
||||||
|
create-nym-connect-release:
|
||||||
|
if: ${{ input.nym_connect_version }}
|
||||||
|
uses: nymtech/reusable-workflows/.github/workflows/create-connect-release.yml@master
|
||||||
|
with:
|
||||||
|
version: ${{ input.nym_connect_version }}
|
||||||
|
needs: ["tag-components"]
|
||||||
@@ -5,9 +5,22 @@ on:
|
|||||||
paths:
|
paths:
|
||||||
- 'ts-packages/**'
|
- 'ts-packages/**'
|
||||||
- 'sdk/typescript/**'
|
- 'sdk/typescript/**'
|
||||||
- nym-connect
|
- 'nym-connect/desktop/src/**'
|
||||||
- nym-connect-android
|
- 'nym-connect/desktop/package.json'
|
||||||
- nym-wallet
|
- 'nym-connect/mobile/src/**'
|
||||||
|
- 'nym-connect/mobile/package.json'
|
||||||
|
- 'nym-wallet/src/**'
|
||||||
|
- 'nym-wallet/package.json'
|
||||||
|
pull_request:
|
||||||
|
paths:
|
||||||
|
- 'ts-packages/**'
|
||||||
|
- 'sdk/typescript/**'
|
||||||
|
- 'nym-connect/desktop/src/**'
|
||||||
|
- 'nym-connect/desktop/package.json'
|
||||||
|
- 'nym-connect/mobile/src/**'
|
||||||
|
- 'nym-connect/mobile/package.json'
|
||||||
|
- 'nym-wallet/src/**'
|
||||||
|
- 'nym-wallet/package.json'
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
@@ -23,8 +36,12 @@ jobs:
|
|||||||
node-version: 16
|
node-version: 16
|
||||||
- name: Setup yarn
|
- name: Setup yarn
|
||||||
run: npm install -g yarn
|
run: npm install -g yarn
|
||||||
|
- name: Install
|
||||||
|
run: yarn
|
||||||
|
- name: Build packages
|
||||||
|
run: yarn build
|
||||||
- name: Lint
|
- name: Lint
|
||||||
run: yarn && yarn build && yarn lint && yarn tsc
|
run: yarn lint && yarn tsc
|
||||||
- name: Matrix - Node Install
|
- name: Matrix - Node Install
|
||||||
run: npm install
|
run: npm install
|
||||||
working-directory: .github/workflows/support-files
|
working-directory: .github/workflows/support-files
|
||||||
|
|||||||
@@ -0,0 +1,95 @@
|
|||||||
|
name: update-versions-and-changelog
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
inputs:
|
||||||
|
release_version:
|
||||||
|
description: "Release version, usually the milestone title"
|
||||||
|
required: true
|
||||||
|
type: string
|
||||||
|
milestone_id:
|
||||||
|
description: "Milestone ID, check the URL when you're on the specific milestone page"
|
||||||
|
required: true
|
||||||
|
type: string
|
||||||
|
|
||||||
|
env:
|
||||||
|
CI_BOT_AUTHOR: "Nym bot"
|
||||||
|
CI_BOT_EMAIL: "nym-bot@users.noreply.github.com"
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
update-versions:
|
||||||
|
runs-on: ubuntu-22.04
|
||||||
|
steps:
|
||||||
|
- name: checkout-source
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
with:
|
||||||
|
ref: "release/${{ inputs.release_version }}"
|
||||||
|
path: "nym"
|
||||||
|
|
||||||
|
- name: checkout-ci-tools-repo
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
with:
|
||||||
|
repository: "nymtech/ci-tools"
|
||||||
|
ref: "master"
|
||||||
|
path: "ci-tools"
|
||||||
|
token: "${{ secrets.ACCESS_TOKEN_PRIVATE_REPOS }}"
|
||||||
|
|
||||||
|
- name: Install Rust stable
|
||||||
|
uses: actions-rs/toolchain@v1
|
||||||
|
with:
|
||||||
|
toolchain: stable
|
||||||
|
|
||||||
|
- name: install-version-bumper
|
||||||
|
run: "cargo install --path ."
|
||||||
|
working-directory: "ci-tools/version-bumper"
|
||||||
|
|
||||||
|
- name: run-version-bumper
|
||||||
|
run: "version-bumper bump binaries --nym-repo-directory nym"
|
||||||
|
|
||||||
|
- name: push-changes-to-branch
|
||||||
|
run: |
|
||||||
|
git config --global user.name "${{ env.CI_BOT_AUTHOR }}"
|
||||||
|
git config --global user.email "${{ env.CI_BOT_EMAIL }}"
|
||||||
|
git checkout -b release/${{ inputs.release_version }}-preparation
|
||||||
|
git commit -am "chore: version bump in preparation for release"
|
||||||
|
git push -u origin release/${{ inputs.release_version }}-preparation
|
||||||
|
working-directory: "nym"
|
||||||
|
|
||||||
|
update-changelog:
|
||||||
|
runs-on: ubuntu-22.04
|
||||||
|
needs: [update-versions]
|
||||||
|
steps:
|
||||||
|
- name: checkout-source
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
with:
|
||||||
|
ref: "release/${{ inputs.release_version }}"
|
||||||
|
path: "nym"
|
||||||
|
|
||||||
|
- name: checkout-ci-tools-repo
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
with:
|
||||||
|
repository: "nymtech/ci-tools"
|
||||||
|
ref: "master"
|
||||||
|
path: "ci-tools"
|
||||||
|
token: "${{ secrets.ACCESS_TOKEN_PRIVATE_REPOS }}"
|
||||||
|
|
||||||
|
- name: Install Rust stable
|
||||||
|
uses: actions-rs/toolchain@v1
|
||||||
|
with:
|
||||||
|
toolchain: stable
|
||||||
|
|
||||||
|
- name: install-changelog-updater
|
||||||
|
run: "cargo install --path ."
|
||||||
|
working-directory: "ci-tools/changelog-updater"
|
||||||
|
|
||||||
|
- name: run-changelog-updater
|
||||||
|
run: "changelog-updater mix ${{ inputs.milestone_id }} release/${{ inputs.release_version }}"
|
||||||
|
|
||||||
|
- name: push-changes-to-branch
|
||||||
|
run: |
|
||||||
|
git config --global user.name "${{ env.CI_BOT_AUTHOR }}"
|
||||||
|
git config --global user.email "${{ env.CI_BOT_EMAIL }}"
|
||||||
|
git checkout release/${{ inputs.release_version }}-preparation
|
||||||
|
git commit -am "chore: update changelog preparation for release"
|
||||||
|
git push
|
||||||
|
working-directory: "nym"
|
||||||
@@ -64,4 +64,4 @@ jobs:
|
|||||||
uses: actions-rs/cargo@v1
|
uses: actions-rs/cargo@v1
|
||||||
with:
|
with:
|
||||||
command: clippy
|
command: clippy
|
||||||
args: --manifest-path nym-wallet/Cargo.toml --workspace --all-features -- -D warnings
|
args: --manifest-path nym-wallet/Cargo.toml --workspace --all-features --all-targets -- -D warnings
|
||||||
|
|||||||
+1
-2
@@ -39,7 +39,6 @@ validator-api-config.toml
|
|||||||
dist
|
dist
|
||||||
storybook-static
|
storybook-static
|
||||||
envs/qwerty.env
|
envs/qwerty.env
|
||||||
Cargo.lock
|
|
||||||
nym-connect/Cargo.lock
|
|
||||||
.parcel-cache
|
.parcel-cache
|
||||||
**/.DS_Store
|
**/.DS_Store
|
||||||
|
cpu-cycles/libcpucycles/build
|
||||||
+100
@@ -4,6 +4,106 @@ Post 1.0.0 release, the changelog format is based on [Keep a Changelog](https://
|
|||||||
|
|
||||||
## [Unreleased]
|
## [Unreleased]
|
||||||
|
|
||||||
|
- nym-network-statistics properly handles signals ([#3209])
|
||||||
|
- add socks5 support for Rust SDK ([#3226], [#3255])
|
||||||
|
- add coconut bandwidth credential support for Rust SDK ([#3273])
|
||||||
|
|
||||||
|
[#3209]: https://github.com/nymtech/nym/issues/3209
|
||||||
|
[#3226]: https://github.com/nymtech/nym/pull/3226
|
||||||
|
[#3255]: https://github.com/nymtech/nym/pull/3255
|
||||||
|
[#3273]: https://github.com/nymtech/nym/pull/3273
|
||||||
|
|
||||||
|
## [v1.1.15] (2023-04-18)
|
||||||
|
|
||||||
|
- Fix verloc being stuck waiting for shutdown signal ([#3250])
|
||||||
|
- Introduce `--output json` flag to `sign` command to allow to more easily capture the output ([#3249])
|
||||||
|
- Explorer - Dont fetch Service Provider list on Testnet ([#3245])
|
||||||
|
- When determining active set, rather than weighting the nodes by just the `stake`, use `stake * performance` ([#3234])
|
||||||
|
- Introduce dual packet sizes to our clients (as in use two packet sizes at the same time depending on message size) ([#3189])
|
||||||
|
- Experiment with offline signing in our validator client ([#3174])
|
||||||
|
- Modify network requester binary to reload `allowed.list` periodically to pull in any changes made upstream without having to restart the service ([#3149])
|
||||||
|
- Standardise all `--output json` on binary inits, we pass the output json at different points for different binaries. ([#3080])
|
||||||
|
- Service provider directory contract: initial version ([#2759])
|
||||||
|
- Fix issue where network-requester run failed on fresh init due to missing allow file ([#3316])
|
||||||
|
|
||||||
|
[#3250]: https://github.com/nymtech/nym/issues/3250
|
||||||
|
[#3249]: https://github.com/nymtech/nym/issues/3249
|
||||||
|
[#3245]: https://github.com/nymtech/nym/issues/3245
|
||||||
|
[#3234]: https://github.com/nymtech/nym/issues/3234
|
||||||
|
[#3189]: https://github.com/nymtech/nym/issues/3189
|
||||||
|
[#3174]: https://github.com/nymtech/nym/issues/3174
|
||||||
|
[#3149]: https://github.com/nymtech/nym/issues/3149
|
||||||
|
[#3080]: https://github.com/nymtech/nym/issues/3080
|
||||||
|
[#2759]: https://github.com/nymtech/nym/issues/2759
|
||||||
|
[#3316]: https://github.com/nymtech/nym/pull/3316
|
||||||
|
|
||||||
|
## [v1.1.14] (2023-04-04)
|
||||||
|
|
||||||
|
- Investigate cause of qwerty validator being in invalid rewarding state ([#3224])
|
||||||
|
- Fix NR config due to changes in #3199 ([#3223])
|
||||||
|
- [Issue] Mixnodes and gateway do not close connections properly ([#3187])
|
||||||
|
- disable sign-ext when using wasm-opt + update wasm-opt ([#3203])
|
||||||
|
- chore: tidy up client `Debug` config section ([#3199])
|
||||||
|
|
||||||
|
[#3224]: https://github.com/nymtech/nym/issues/3224
|
||||||
|
[#3223]: https://github.com/nymtech/nym/issues/3223
|
||||||
|
[#3187]: https://github.com/nymtech/nym/issues/3187
|
||||||
|
[#3203]: https://github.com/nymtech/nym/pull/3203
|
||||||
|
[#3199]: https://github.com/nymtech/nym/pull/3199
|
||||||
|
>>>>>>> master
|
||||||
|
|
||||||
|
## [v1.1.13] (2023-03-15)
|
||||||
|
|
||||||
|
- NE - instead of throwing a "Mixnode/Gateway not found" error for blacklisted nodes due to bad performance, show their history but tag them as "Having poor performance" ([#2979])
|
||||||
|
- NE - Upgrade Sandbox and make below changes: ([#2332])
|
||||||
|
- Explorer - Updates ([#3168])
|
||||||
|
- Website v2 - deploy infrastructure for strapi and CI ([#2213])
|
||||||
|
- add blockstream green to sp list ([#3180])
|
||||||
|
- mock-nym-api: fix .storybook lint error ([#3178])
|
||||||
|
- Validating new interval config parameters to prevent division by zero ([#3153])
|
||||||
|
|
||||||
|
[#2979]: https://github.com/nymtech/nym/issues/2979
|
||||||
|
[#2332]: https://github.com/nymtech/nym/issues/2332
|
||||||
|
[#3168]: https://github.com/nymtech/nym/issues/3168
|
||||||
|
[#2213]: https://github.com/nymtech/nym/issues/2213
|
||||||
|
[#3180]: https://github.com/nymtech/nym/pull/3180
|
||||||
|
[#3178]: https://github.com/nymtech/nym/pull/3178
|
||||||
|
[#3153]: https://github.com/nymtech/nym/pull/3153
|
||||||
|
|
||||||
|
## [v1.1.12] (2023-03-07)
|
||||||
|
|
||||||
|
- Fix generated docs for mixnet and vesting contract on docs.rs ([#3093])
|
||||||
|
- Introduce a way of injecting topology into the client ([#3044])
|
||||||
|
- Update mixnet TypeScript client methods #1 ([#2783])
|
||||||
|
- Update tooltips for routing and average score ([#3133])
|
||||||
|
- update selected service provider description style ([#3128])
|
||||||
|
|
||||||
|
[#3093]: https://github.com/nymtech/nym/issues/3093
|
||||||
|
[#3044]: https://github.com/nymtech/nym/issues/3044
|
||||||
|
[#2783]: https://github.com/nymtech/nym/issues/2783
|
||||||
|
[#3133]: https://github.com/nymtech/nym/pull/3133
|
||||||
|
[#3128]: https://github.com/nymtech/nym/pull/3128
|
||||||
|
|
||||||
|
## [v1.1.11] (2023-02-28)
|
||||||
|
|
||||||
|
- Fix empty dealer set loop ([#3105])
|
||||||
|
- The nym-api db.sqlite is broken when trying to run against it it in `enabled-credentials-mode true` there is an ordering issue with migrations when using the credential binary to purchase bandwidth ([#3100])
|
||||||
|
- Feature/latency based gateway selection ([#3081])
|
||||||
|
- Fix the credential binary to handle transactions to sleep when in non-inProgress epochs ([#3057])
|
||||||
|
- Publish mixnet contract to crates.io ([#1919])
|
||||||
|
- Publish vesting contract to crates.io ([#1920])
|
||||||
|
- Feature/update checker to use master ([#3097])
|
||||||
|
- Feature/improve binary checks ([#3094])
|
||||||
|
|
||||||
|
[#3105]: https://github.com/nymtech/nym/issues/3105
|
||||||
|
[#3100]: https://github.com/nymtech/nym/issues/3100
|
||||||
|
[#3081]: https://github.com/nymtech/nym/pull/3081
|
||||||
|
[#3057]: https://github.com/nymtech/nym/issues/3057
|
||||||
|
[#1919]: https://github.com/nymtech/nym/issues/1919
|
||||||
|
[#1920]: https://github.com/nymtech/nym/issues/1920
|
||||||
|
[#3097]: https://github.com/nymtech/nym/pull/3097
|
||||||
|
[#3094]: https://github.com/nymtech/nym/pull/3094
|
||||||
|
|
||||||
## [v1.1.10] (2023-02-21)
|
## [v1.1.10] (2023-02-21)
|
||||||
|
|
||||||
- Verloc listener causing mixnode unexpected shutdown ([#3038])
|
- Verloc listener causing mixnode unexpected shutdown ([#3038])
|
||||||
|
|||||||
Generated
+1500
-1432
File diff suppressed because it is too large
Load Diff
+26
-10
@@ -17,36 +17,35 @@ opt-level = 3
|
|||||||
|
|
||||||
resolver = "2"
|
resolver = "2"
|
||||||
members = [
|
members = [
|
||||||
"clients/client-core",
|
|
||||||
"clients/credential",
|
"clients/credential",
|
||||||
"clients/native",
|
"clients/native",
|
||||||
"clients/native/websocket-requests",
|
"clients/native/websocket-requests",
|
||||||
"clients/socks5",
|
"clients/socks5",
|
||||||
"common/bandwidth-claim-contract",
|
"common/async-file-watcher",
|
||||||
|
"common/bandwidth-controller",
|
||||||
|
"common/bin-common",
|
||||||
|
"common/client-core",
|
||||||
"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/client-connections",
|
|
||||||
"common/coconut-interface",
|
"common/coconut-interface",
|
||||||
"common/commands",
|
"common/commands",
|
||||||
"common/config",
|
"common/config",
|
||||||
"common/build-information",
|
|
||||||
"common/cosmwasm-smart-contracts/coconut-bandwidth-contract",
|
"common/cosmwasm-smart-contracts/coconut-bandwidth-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/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/service-provider-directory",
|
||||||
"common/cosmwasm-smart-contracts/vesting-contract",
|
"common/cosmwasm-smart-contracts/vesting-contract",
|
||||||
"common/mobile-storage",
|
|
||||||
"common/credential-storage",
|
"common/credential-storage",
|
||||||
"common/credentials",
|
"common/credentials",
|
||||||
"common/crypto",
|
"common/crypto",
|
||||||
"common/crypto/dkg",
|
"common/dkg",
|
||||||
"common/execute",
|
"common/execute",
|
||||||
"common/inclusion-probability",
|
"common/inclusion-probability",
|
||||||
"common/ledger",
|
"common/ledger",
|
||||||
"common/logging",
|
|
||||||
"common/mixnode-common",
|
"common/mixnode-common",
|
||||||
"common/network-defaults",
|
"common/network-defaults",
|
||||||
"common/nonexhaustive-delayqueue",
|
"common/nonexhaustive-delayqueue",
|
||||||
@@ -62,6 +61,7 @@ members = [
|
|||||||
"common/nymsphinx/params",
|
"common/nymsphinx/params",
|
||||||
"common/nymsphinx/types",
|
"common/nymsphinx/types",
|
||||||
"common/pemstore",
|
"common/pemstore",
|
||||||
|
"common/socks5-client-core",
|
||||||
"common/socks5/proxy-helpers",
|
"common/socks5/proxy-helpers",
|
||||||
"common/socks5/requests",
|
"common/socks5/requests",
|
||||||
"common/statistics",
|
"common/statistics",
|
||||||
@@ -69,7 +69,6 @@ members = [
|
|||||||
"common/topology",
|
"common/topology",
|
||||||
"common/types",
|
"common/types",
|
||||||
"common/wasm-utils",
|
"common/wasm-utils",
|
||||||
"common/completions",
|
|
||||||
"explorer-api",
|
"explorer-api",
|
||||||
"gateway",
|
"gateway",
|
||||||
"gateway/gateway-requests",
|
"gateway/gateway-requests",
|
||||||
@@ -97,18 +96,35 @@ default-members = [
|
|||||||
"explorer-api",
|
"explorer-api",
|
||||||
]
|
]
|
||||||
|
|
||||||
exclude = ["explorer", "contracts", "clients/webassembly", "nym-wallet", "nym-connect", "nym-connect-android"]
|
exclude = ["explorer", "contracts", "clients/webassembly", "nym-wallet", "nym-connect/mobile/src-tauri", "nym-connect/desktop", "cpu-cycles"]
|
||||||
|
|
||||||
[workspace.package]
|
[workspace.package]
|
||||||
authors = ["Nym Technologies SA"]
|
authors = ["Nym Technologies SA"]
|
||||||
repository = "https://github.com/nymtech/nym"
|
repository = "https://github.com/nymtech/nym"
|
||||||
homepage = "https://nymtech.net"
|
homepage = "https://nymtech.net"
|
||||||
|
documentation = "https://nymtech.net"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
|
license = "Apache-2.0"
|
||||||
|
|
||||||
[workspace.dependencies]
|
[workspace.dependencies]
|
||||||
async-trait = "0.1.63"
|
async-trait = "0.1.64"
|
||||||
|
bip39 = { version = "2.0.0", features = ["zeroize"] }
|
||||||
|
cfg-if = "1.0.0"
|
||||||
|
cosmwasm-derive = "=1.0.0"
|
||||||
|
cosmwasm-schema = "=1.0.0"
|
||||||
|
cosmwasm-std = "=1.0.0"
|
||||||
|
cosmwasm-storage = "=1.0.0"
|
||||||
|
cw-utils = "=0.13.4"
|
||||||
|
cw-storage-plus = "=0.13.4"
|
||||||
|
cw2 = { version = "=0.13.4" }
|
||||||
|
cw3 = { version = "=0.13.4" }
|
||||||
|
cw3-fixed-multisig = { version = "=0.13.4" }
|
||||||
|
cw4 = { version = "=0.13.4" }
|
||||||
|
dotenvy = "0.15.6"
|
||||||
lazy_static = "1.4.0"
|
lazy_static = "1.4.0"
|
||||||
log = "0.4"
|
log = "0.4"
|
||||||
|
once_cell = "1.7.2"
|
||||||
|
rand = "0.8.5"
|
||||||
serde = "1.0.152"
|
serde = "1.0.152"
|
||||||
serde_json = "1.0.91"
|
serde_json = "1.0.91"
|
||||||
tap = "1.0.1"
|
tap = "1.0.1"
|
||||||
|
|||||||
@@ -1,108 +1,116 @@
|
|||||||
|
# Default target
|
||||||
|
all: test
|
||||||
|
|
||||||
test: clippy-all cargo-test wasm fmt
|
test: clippy-all cargo-test wasm fmt
|
||||||
|
|
||||||
test-all: test cargo-test-expensive
|
test-all: test cargo-test-expensive
|
||||||
|
|
||||||
no-clippy: build cargo-test wasm fmt
|
no-clippy: build cargo-test wasm fmt
|
||||||
|
|
||||||
happy: fmt clippy-happy test
|
happy: fmt clippy-happy test
|
||||||
clippy-all: clippy-main clippy-all-contracts clippy-all-wallet clippy-all-connect clippy-all-wasm-client
|
|
||||||
clippy-happy: clippy-happy-main clippy-happy-contracts clippy-happy-wallet clippy-happy-connect
|
|
||||||
cargo-test: test-main test-contracts test-wallet test-connect
|
|
||||||
cargo-test-expensive: test-main-expensive test-contracts-expensive test-wallet-expensive test-connect-expensive
|
|
||||||
build: build-contracts build-wallet build-main build-connect build-wasm-client
|
|
||||||
fmt: fmt-main fmt-contracts fmt-wallet fmt-connect fmt-wasm-client
|
|
||||||
|
|
||||||
clippy-happy-main:
|
# Building release binaries is a little manual as we can't just build --release
|
||||||
cargo clippy
|
# on all workspaces.
|
||||||
|
build-release: build-release-main wasm
|
||||||
|
|
||||||
clippy-happy-contracts:
|
# -----------------------------------------------------------------------------
|
||||||
cargo clippy --manifest-path contracts/Cargo.toml --target wasm32-unknown-unknown
|
# Define targets for a given workspace
|
||||||
|
# $(1): name
|
||||||
|
# $(2): path to workspace
|
||||||
|
# $(3): extra arguments to cargo
|
||||||
|
# -----------------------------------------------------------------------------
|
||||||
|
define add_cargo_workspace
|
||||||
|
|
||||||
clippy-happy-wallet:
|
clippy-happy-$(1):
|
||||||
cargo clippy --manifest-path nym-wallet/Cargo.toml
|
cargo clippy --manifest-path $(2)/Cargo.toml $(3)
|
||||||
|
|
||||||
clippy-happy-connect:
|
clippy-$(1):
|
||||||
cargo clippy --manifest-path nym-connect/Cargo.toml
|
cargo clippy --manifest-path $(2)/Cargo.toml --workspace $(3) -- -D warnings
|
||||||
|
|
||||||
clippy-main:
|
clippy-examples-$(1):
|
||||||
cargo clippy --workspace -- -D warnings
|
cargo clippy --manifest-path $(2)/Cargo.toml --workspace --examples -- -D warnings
|
||||||
|
|
||||||
clippy-wasm:
|
check-$(1):
|
||||||
cargo clippy --manifest-path clients/webassembly/Cargo.toml --target wasm32-unknown-unknown --workspace -- -D warnings
|
cargo check --manifest-path $(2)/Cargo.toml --workspace $(3)
|
||||||
|
|
||||||
|
test-$(1):
|
||||||
|
cargo test --manifest-path $(2)/Cargo.toml --workspace
|
||||||
|
|
||||||
clippy-all-contracts:
|
test-expensive-$(1):
|
||||||
cargo clippy --workspace --manifest-path contracts/Cargo.toml --all-features --target wasm32-unknown-unknown -- -D warnings
|
cargo test --manifest-path $(2)/Cargo.toml --workspace -- --ignored
|
||||||
|
|
||||||
clippy-all-wallet:
|
build-$(1):
|
||||||
cargo clippy --workspace --manifest-path nym-wallet/Cargo.toml --all-features -- -D warnings
|
cargo build --manifest-path $(2)/Cargo.toml --workspace $(3)
|
||||||
|
|
||||||
clippy-all-connect:
|
build-examples-$(1):
|
||||||
cargo clippy --workspace --manifest-path nym-connect/Cargo.toml --all-features -- -D warnings
|
cargo build --manifest-path $(2)/Cargo.toml --workspace --examples
|
||||||
|
|
||||||
clippy-all-wasm-client:
|
build-release-$(1):
|
||||||
cargo clippy --workspace --manifest-path clients/webassembly/Cargo.toml --all-features --target wasm32-unknown-unknown -- -D warnings
|
cargo build --manifest-path $(2)/Cargo.toml --workspace --release $(3)
|
||||||
|
|
||||||
test-main:
|
fmt-$(1):
|
||||||
cargo test --workspace
|
cargo fmt --manifest-path $(2)/Cargo.toml --all
|
||||||
|
|
||||||
test-main-expensive:
|
clippy-happy: clippy-happy-$(1)
|
||||||
cargo test --workspace -- --ignored
|
clippy-all: clippy-$(1) clippy-examples-$(1)
|
||||||
|
check: check-$(1)
|
||||||
|
cargo-test: test-$(1)
|
||||||
|
cargo-test-expensive: test-expensive-$(1)
|
||||||
|
build: build-$(1) build-$(1)-examples
|
||||||
|
build-release-all: build-release-$(1)
|
||||||
|
fmt: fmt-$(1)
|
||||||
|
|
||||||
test-contracts:
|
endef
|
||||||
cargo test --manifest-path contracts/Cargo.toml --all-features
|
|
||||||
|
|
||||||
test-contracts-expensive:
|
# -----------------------------------------------------------------------------
|
||||||
cargo test --manifest-path contracts/Cargo.toml --all-features -- --ignored
|
# Rust workspaces
|
||||||
|
# -----------------------------------------------------------------------------
|
||||||
|
|
||||||
test-wallet:
|
# Generate targets for the various cargo workspaces
|
||||||
cargo test --manifest-path nym-wallet/Cargo.toml --all-features
|
|
||||||
|
|
||||||
test-wallet-expensive:
|
$(eval $(call add_cargo_workspace,main,.))
|
||||||
cargo test --manifest-path nym-wallet/Cargo.toml --all-features -- --ignored
|
$(eval $(call add_cargo_workspace,contracts,contracts,--target wasm32-unknown-unknown))
|
||||||
|
$(eval $(call add_cargo_workspace,wasm-client,clients/webassembly,--target wasm32-unknown-unknown))
|
||||||
|
$(eval $(call add_cargo_workspace,wallet,nym-wallet,))
|
||||||
|
$(eval $(call add_cargo_workspace,connect,nym-connect/desktop))
|
||||||
|
ifdef NYM_MOBILE
|
||||||
|
$(eval $(call add_cargo_workspace,connect-mobile,nym-connect/mobile/src-tauri))
|
||||||
|
endif
|
||||||
|
|
||||||
test-connect:
|
# -----------------------------------------------------------------------------
|
||||||
cargo test --manifest-path nym-connect/Cargo.toml --all-features
|
# Convenience targets for crates that are already part of the main workspace
|
||||||
|
# -----------------------------------------------------------------------------
|
||||||
test-connect-expensive:
|
|
||||||
cargo test --manifest-path nym-connect/Cargo.toml --all-features -- --ignored
|
|
||||||
|
|
||||||
build-main:
|
|
||||||
cargo build --workspace
|
|
||||||
|
|
||||||
build-contracts:
|
|
||||||
cargo build --manifest-path contracts/Cargo.toml --workspace
|
|
||||||
|
|
||||||
build-wallet:
|
|
||||||
cargo build --manifest-path nym-wallet/Cargo.toml --workspace
|
|
||||||
|
|
||||||
build-connect:
|
|
||||||
cargo build --manifest-path nym-connect/Cargo.toml --workspace
|
|
||||||
|
|
||||||
build-explorer-api:
|
build-explorer-api:
|
||||||
cargo build --manifest-path explorer-api/Cargo.toml --workspace
|
cargo build -p explorer-api
|
||||||
|
|
||||||
build-wasm-client:
|
|
||||||
cargo build --manifest-path clients/webassembly/Cargo.toml --workspace --target wasm32-unknown-unknown
|
|
||||||
|
|
||||||
build-nym-cli:
|
build-nym-cli:
|
||||||
cargo build --release --manifest-path tools/nym-cli/Cargo.toml
|
cargo build -p nym-cli --release
|
||||||
|
|
||||||
fmt-main:
|
# -----------------------------------------------------------------------------
|
||||||
cargo fmt --all
|
# Build contracts ready for deploy
|
||||||
|
# -----------------------------------------------------------------------------
|
||||||
|
|
||||||
fmt-contracts:
|
CONTRACTS_OUT_DIR=contracts/target/wasm32-unknown-unknown/release
|
||||||
cargo fmt --manifest-path contracts/Cargo.toml --all
|
VESTING_CONTRACT=$(CONTRACTS_OUT_DIR)/vesting_contract.wasm
|
||||||
|
MIXNET_CONTRACT=$(CONTRACTS_OUT_DIR)/mixnet_contract.wasm
|
||||||
|
SERVICE_PROVIDER_DIRECTORY_CONTRACT=$(CONTRACTS_OUT_DIR)/nym_service_provider_directory.wasm
|
||||||
|
|
||||||
fmt-wallet:
|
wasm: wasm-build wasm-opt
|
||||||
cargo fmt --manifest-path nym-wallet/Cargo.toml --all
|
|
||||||
|
|
||||||
fmt-connect:
|
wasm-build:
|
||||||
cargo fmt --manifest-path nym-connect/Cargo.toml --all
|
|
||||||
|
|
||||||
fmt-wasm-client:
|
|
||||||
cargo fmt --manifest-path clients/webassembly/Cargo.toml --all
|
|
||||||
|
|
||||||
wasm:
|
|
||||||
RUSTFLAGS='-C link-arg=-s' cargo build --manifest-path contracts/Cargo.toml --release --target wasm32-unknown-unknown
|
RUSTFLAGS='-C link-arg=-s' cargo build --manifest-path contracts/Cargo.toml --release --target wasm32-unknown-unknown
|
||||||
|
|
||||||
|
wasm-opt:
|
||||||
|
wasm-opt --disable-sign-ext -Os $(VESTING_CONTRACT) -o $(VESTING_CONTRACT)
|
||||||
|
wasm-opt --disable-sign-ext -Os $(MIXNET_CONTRACT) -o $(MIXNET_CONTRACT)
|
||||||
|
wasm-opt --disable-sign-ext -Os $(SERVICE_PROVIDER_DIRECTORY_CONTRACT) -o $(SERVICE_PROVIDER_DIRECTORY_CONTRACT)
|
||||||
|
|
||||||
|
# -----------------------------------------------------------------------------
|
||||||
|
# Misc
|
||||||
|
# -----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
# NOTE: this seems deprecated an not needed anymore?
|
||||||
mixnet-opt: wasm
|
mixnet-opt: wasm
|
||||||
cd contracts/mixnet && make opt
|
cd contracts/mixnet && make opt
|
||||||
|
|
||||||
@@ -110,5 +118,5 @@ generate-typescript:
|
|||||||
cd tools/ts-rs-cli && cargo run && cd ../..
|
cd tools/ts-rs-cli && cargo run && cd ../..
|
||||||
yarn types:lint:fix
|
yarn types:lint:fix
|
||||||
|
|
||||||
run-validator-tests:
|
run-api-tests:
|
||||||
cd nym-api/tests/functional_test && yarn test:qa
|
cd nym-api/tests/functional_test && yarn test:qa
|
||||||
@@ -16,12 +16,12 @@ The platform is composed of multiple Rust crates. Top-level executable binary cr
|
|||||||
* nym-wallet - a desktop wallet implemented using the [Tauri](https://tauri.studio/en/docs/about/intro) framework.
|
* nym-wallet - a desktop wallet implemented using the [Tauri](https://tauri.studio/en/docs/about/intro) framework.
|
||||||
|
|
||||||
[](https://opensource.org/licenses/Apache-2.0)
|
[](https://opensource.org/licenses/Apache-2.0)
|
||||||
[](https://github.com/nymtech/nym/actions?query=branch%3Adevelop)
|
[](https://github.com/nymtech/nym/actions?query=branch%3Adevelop)
|
||||||
|
|
||||||
|
|
||||||
### Building
|
### Building
|
||||||
|
|
||||||
Platform build instructions are available on [our docs site](https://nymtech.net/docs/stable/run-nym-nodes/build-nym).
|
Platform build instructions are available on [our docs site](https://nymtech.net/docs/binaries/building-nym.html).
|
||||||
Wallet build instructions are also available on [our docs site](https://nymtech.net/docs/stable/nym-apps/wallet#for-developers).
|
Wallet build instructions are also available on [our docs site](https://nymtech.net/docs/stable/nym-apps/wallet#for-developers).
|
||||||
|
|
||||||
### Developing
|
### Developing
|
||||||
|
|||||||
+2
-2
@@ -3,8 +3,8 @@ Critical bug or security issue 💥
|
|||||||
If you're here because you're trying to figure out how to notify us of a security issue, go to Discord, and alert the core engineers:
|
If you're here because you're trying to figure out how to notify us of a security issue, go to Discord, and alert the core engineers:
|
||||||
|
|
||||||
Dave Hrycyszyn futurechimp#5430
|
Dave Hrycyszyn futurechimp#5430
|
||||||
Drazen Urch drazen#4873
|
|
||||||
Jedrzej Stuczynski "Jedrzej | Nym#5666"
|
Jedrzej Stuczynski "Jedrzej | Nym#5666"
|
||||||
|
Fran Arbanas | franarbanas#0995
|
||||||
|
Mark Sinclair | marknym#8088
|
||||||
|
|
||||||
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.
|
||||||
@@ -1,336 +0,0 @@
|
|||||||
// Copyright 2021-2022 - Nym Technologies SA <contact@nymtech.net>
|
|
||||||
// SPDX-License-Identifier: Apache-2.0
|
|
||||||
|
|
||||||
use crate::spawn_future;
|
|
||||||
use futures::StreamExt;
|
|
||||||
use log::*;
|
|
||||||
use nymsphinx::addressing::clients::Recipient;
|
|
||||||
use nymsphinx::params::DEFAULT_NUM_MIX_HOPS;
|
|
||||||
use rand::seq::SliceRandom;
|
|
||||||
use rand::thread_rng;
|
|
||||||
use std::ops::Deref;
|
|
||||||
use std::sync::Arc;
|
|
||||||
use std::time::Duration;
|
|
||||||
use tokio::sync::{RwLock, RwLockReadGuard};
|
|
||||||
use topology::{nym_topology_from_detailed, NymTopology, NymTopologyError};
|
|
||||||
use url::Url;
|
|
||||||
|
|
||||||
// I'm extremely curious why compiler NEVER complained about lack of Debug here before
|
|
||||||
#[derive(Debug)]
|
|
||||||
pub struct TopologyAccessorInner(Option<NymTopology>);
|
|
||||||
|
|
||||||
impl AsRef<Option<NymTopology>> for TopologyAccessorInner {
|
|
||||||
fn as_ref(&self) -> &Option<NymTopology> {
|
|
||||||
&self.0
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl TopologyAccessorInner {
|
|
||||||
fn new() -> Self {
|
|
||||||
TopologyAccessorInner(None)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn update(&mut self, new: Option<NymTopology>) {
|
|
||||||
self.0 = new;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub struct TopologyReadPermit<'a> {
|
|
||||||
permit: RwLockReadGuard<'a, TopologyAccessorInner>,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<'a> Deref for TopologyReadPermit<'a> {
|
|
||||||
type Target = TopologyAccessorInner;
|
|
||||||
|
|
||||||
fn deref(&self) -> &Self::Target {
|
|
||||||
&self.permit
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<'a> TopologyReadPermit<'a> {
|
|
||||||
/// Using provided topology read permit, tries to get an immutable reference to the underlying
|
|
||||||
/// topology. For obvious reasons the lifetime of the topology reference is bound to the permit.
|
|
||||||
pub(super) fn try_get_valid_topology_ref(
|
|
||||||
&'a self,
|
|
||||||
ack_recipient: &Recipient,
|
|
||||||
packet_recipient: Option<&Recipient>,
|
|
||||||
) -> Result<&'a NymTopology, NymTopologyError> {
|
|
||||||
// 1. Have we managed to get anything from the refresher, i.e. have the nym-api queries gone through?
|
|
||||||
let topology = self
|
|
||||||
.permit
|
|
||||||
.as_ref()
|
|
||||||
.as_ref()
|
|
||||||
.ok_or(NymTopologyError::EmptyNetworkTopology)?;
|
|
||||||
|
|
||||||
// 2. does it have any mixnode at all?
|
|
||||||
// 3. does it have any gateways at all?
|
|
||||||
// 4. does it have a mixnode on each layer?
|
|
||||||
topology.ensure_can_construct_path_through(DEFAULT_NUM_MIX_HOPS)?;
|
|
||||||
|
|
||||||
// 5. does it contain OUR gateway (so that we could create an ack packet)?
|
|
||||||
if !topology.gateway_exists(ack_recipient.gateway()) {
|
|
||||||
return Err(NymTopologyError::NonExistentGatewayError {
|
|
||||||
identity_key: ack_recipient.gateway().to_base58_string(),
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
// 6. for our target recipient, does it contain THEIR gateway (so that we could create
|
|
||||||
if let Some(recipient) = packet_recipient {
|
|
||||||
if !topology.gateway_exists(recipient.gateway()) {
|
|
||||||
return Err(NymTopologyError::NonExistentGatewayError {
|
|
||||||
identity_key: recipient.gateway().to_base58_string(),
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Ok(topology)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<'a> From<RwLockReadGuard<'a, TopologyAccessorInner>> for TopologyReadPermit<'a> {
|
|
||||||
fn from(read_permit: RwLockReadGuard<'a, TopologyAccessorInner>) -> Self {
|
|
||||||
TopologyReadPermit {
|
|
||||||
permit: read_permit,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Clone, Debug)]
|
|
||||||
pub struct TopologyAccessor {
|
|
||||||
// `RwLock` *seems to* be the better approach for this as write access is only requested every
|
|
||||||
// few seconds, while reads are needed every single packet generated.
|
|
||||||
// However, proper benchmarks will be needed to determine if `RwLock` is indeed a better
|
|
||||||
// approach than a `Mutex`
|
|
||||||
inner: Arc<RwLock<TopologyAccessorInner>>,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl TopologyAccessor {
|
|
||||||
pub fn new() -> Self {
|
|
||||||
TopologyAccessor {
|
|
||||||
inner: Arc::new(RwLock::new(TopologyAccessorInner::new())),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub async fn get_read_permit(&self) -> TopologyReadPermit<'_> {
|
|
||||||
self.inner.read().await.into()
|
|
||||||
}
|
|
||||||
|
|
||||||
async fn update_global_topology(&self, new_topology: Option<NymTopology>) {
|
|
||||||
self.inner.write().await.update(new_topology);
|
|
||||||
}
|
|
||||||
|
|
||||||
// only used by the client at startup to get a slightly more reasonable error message
|
|
||||||
// (currently displays as unused because health checker is disabled due to required changes)
|
|
||||||
pub async fn ensure_is_routable(&self) -> Result<(), NymTopologyError> {
|
|
||||||
match &self.inner.read().await.0 {
|
|
||||||
None => Err(NymTopologyError::EmptyNetworkTopology),
|
|
||||||
Some(ref topology) => topology.ensure_can_construct_path_through(DEFAULT_NUM_MIX_HOPS),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Default for TopologyAccessor {
|
|
||||||
fn default() -> Self {
|
|
||||||
TopologyAccessor::new()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub struct TopologyRefresherConfig {
|
|
||||||
nym_api_urls: Vec<Url>,
|
|
||||||
refresh_rate: Duration,
|
|
||||||
client_version: String,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl TopologyRefresherConfig {
|
|
||||||
pub fn new(nym_api_urls: Vec<Url>, refresh_rate: Duration, client_version: String) -> Self {
|
|
||||||
TopologyRefresherConfig {
|
|
||||||
nym_api_urls,
|
|
||||||
refresh_rate,
|
|
||||||
client_version,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub struct TopologyRefresher {
|
|
||||||
validator_client: validator_client::client::NymApiClient,
|
|
||||||
client_version: String,
|
|
||||||
|
|
||||||
nym_api_urls: Vec<Url>,
|
|
||||||
topology_accessor: TopologyAccessor,
|
|
||||||
refresh_rate: Duration,
|
|
||||||
|
|
||||||
currently_used_api: usize,
|
|
||||||
was_latest_valid: bool,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl TopologyRefresher {
|
|
||||||
pub fn new(mut cfg: TopologyRefresherConfig, topology_accessor: TopologyAccessor) -> Self {
|
|
||||||
cfg.nym_api_urls.shuffle(&mut thread_rng());
|
|
||||||
|
|
||||||
TopologyRefresher {
|
|
||||||
validator_client: validator_client::client::NymApiClient::new(
|
|
||||||
cfg.nym_api_urls[0].clone(),
|
|
||||||
),
|
|
||||||
client_version: cfg.client_version,
|
|
||||||
nym_api_urls: cfg.nym_api_urls,
|
|
||||||
topology_accessor,
|
|
||||||
refresh_rate: cfg.refresh_rate,
|
|
||||||
currently_used_api: 0,
|
|
||||||
was_latest_valid: true,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn use_next_nym_api(&mut self) {
|
|
||||||
if self.nym_api_urls.len() == 1 {
|
|
||||||
warn!("There's only a single nym API available - it won't be possible to use a different one");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
self.currently_used_api = (self.currently_used_api + 1) % self.nym_api_urls.len();
|
|
||||||
self.validator_client
|
|
||||||
.change_nym_api(self.nym_api_urls[self.currently_used_api].clone())
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Verifies whether nodes a reasonably distributed among all mix layers.
|
|
||||||
///
|
|
||||||
/// In ideal world we would have 33% nodes on layer 1, 33% on layer 2 and 33% on layer 3.
|
|
||||||
/// However, this is a rather unrealistic expectation, instead we check whether there exists
|
|
||||||
/// a layer with more than 66% of nodes or with fewer than 15% and if so, we trigger a failure.
|
|
||||||
///
|
|
||||||
/// # Arguments
|
|
||||||
///
|
|
||||||
/// * `topology`: active topology constructed from validator api data
|
|
||||||
fn check_layer_distribution(&self, active_topology: &NymTopology) -> bool {
|
|
||||||
let mixes = active_topology.mixes();
|
|
||||||
let mixnodes_count = active_topology.num_mixnodes();
|
|
||||||
|
|
||||||
if active_topology.gateways().is_empty() {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// trivial check to see if have at least a single node on each layer (regardless of active set size)
|
|
||||||
if mixes.get(&1).is_none() || mixes.get(&2).is_none() || mixes.get(&3).is_none() {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
let upper_bound = (mixnodes_count as f32 * 0.66) as usize;
|
|
||||||
let lower_bound = (mixnodes_count as f32 * 0.15) as usize;
|
|
||||||
|
|
||||||
let layer1 = mixes.get(&1).unwrap().len();
|
|
||||||
let layer2 = mixes.get(&2).unwrap().len();
|
|
||||||
let layer3 = mixes.get(&3).unwrap().len();
|
|
||||||
|
|
||||||
if layer1 < lower_bound || layer1 > upper_bound {
|
|
||||||
warn!(
|
|
||||||
"nodes: {}, layer1: {}, layer2: {}, layer3: {}",
|
|
||||||
mixnodes_count, layer1, layer2, layer3
|
|
||||||
);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if layer2 < lower_bound || layer2 > upper_bound {
|
|
||||||
warn!(
|
|
||||||
"nodes: {}, layer1: {}, layer2: {}, layer3: {}",
|
|
||||||
mixnodes_count, layer1, layer2, layer3
|
|
||||||
);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if layer3 < lower_bound || layer3 > upper_bound {
|
|
||||||
warn!(
|
|
||||||
"nodes: {}, layer1: {}, layer2: {}, layer3: {}",
|
|
||||||
mixnodes_count, layer1, layer2, layer3
|
|
||||||
);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
true
|
|
||||||
}
|
|
||||||
|
|
||||||
async fn get_current_compatible_topology(&self) -> Option<NymTopology> {
|
|
||||||
// TODO: optimization for the future:
|
|
||||||
// only refresh mixnodes on timer and refresh gateways only when
|
|
||||||
// we have to send to a new, unknown, gateway
|
|
||||||
|
|
||||||
let mixnodes = match self.validator_client.get_cached_active_mixnodes().await {
|
|
||||||
Err(err) => {
|
|
||||||
error!("failed to get network mixnodes - {err}");
|
|
||||||
return None;
|
|
||||||
}
|
|
||||||
Ok(mixes) => mixes,
|
|
||||||
};
|
|
||||||
|
|
||||||
let gateways = match self.validator_client.get_cached_gateways().await {
|
|
||||||
Err(err) => {
|
|
||||||
error!("failed to get network gateways - {err}");
|
|
||||||
return None;
|
|
||||||
}
|
|
||||||
Ok(gateways) => gateways,
|
|
||||||
};
|
|
||||||
|
|
||||||
let topology = nym_topology_from_detailed(mixnodes, gateways)
|
|
||||||
.filter_system_version(&self.client_version);
|
|
||||||
|
|
||||||
if !self.check_layer_distribution(&topology) {
|
|
||||||
warn!("The current filtered active topology has extremely skewed layer distribution. It cannot be used.");
|
|
||||||
None
|
|
||||||
} else {
|
|
||||||
Some(topology)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub async fn refresh(&mut self) {
|
|
||||||
trace!("Refreshing the topology");
|
|
||||||
let new_topology = self.get_current_compatible_topology().await;
|
|
||||||
|
|
||||||
if new_topology.is_none() {
|
|
||||||
self.use_next_nym_api();
|
|
||||||
}
|
|
||||||
|
|
||||||
if new_topology.is_none() && self.was_latest_valid {
|
|
||||||
// if we failed to grab this topology, but the one before it was alright, let's assume
|
|
||||||
// validator had a tiny hiccup and use the old data
|
|
||||||
warn!("we're going to keep on using the old topology for this iteration");
|
|
||||||
self.was_latest_valid = false;
|
|
||||||
return;
|
|
||||||
} else if new_topology.is_some() {
|
|
||||||
self.was_latest_valid = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
self.topology_accessor
|
|
||||||
.update_global_topology(new_topology)
|
|
||||||
.await;
|
|
||||||
}
|
|
||||||
|
|
||||||
pub async fn ensure_topology_is_routable(&self) -> Result<(), NymTopologyError> {
|
|
||||||
self.topology_accessor.ensure_is_routable().await
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn start_with_shutdown(mut self, mut shutdown: task::TaskClient) {
|
|
||||||
spawn_future(async move {
|
|
||||||
debug!("Started TopologyRefresher with graceful shutdown support");
|
|
||||||
|
|
||||||
#[cfg(not(target_arch = "wasm32"))]
|
|
||||||
let mut interval = tokio_stream::wrappers::IntervalStream::new(tokio::time::interval(
|
|
||||||
self.refresh_rate,
|
|
||||||
));
|
|
||||||
|
|
||||||
#[cfg(target_arch = "wasm32")]
|
|
||||||
let mut interval =
|
|
||||||
gloo_timers::future::IntervalStream::new(self.refresh_rate.as_millis() as u32);
|
|
||||||
|
|
||||||
while !shutdown.is_shutdown() {
|
|
||||||
tokio::select! {
|
|
||||||
_ = interval.next() => {
|
|
||||||
self.refresh().await;
|
|
||||||
},
|
|
||||||
_ = shutdown.recv() => {
|
|
||||||
log::trace!("TopologyRefresher: Received shutdown");
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
shutdown.recv_timeout().await;
|
|
||||||
log::debug!("TopologyRefresher: Exiting");
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,91 +0,0 @@
|
|||||||
// Copyright 2022 - Nym Technologies SA <contact@nymtech.net>
|
|
||||||
// SPDX-License-Identifier: Apache-2.0
|
|
||||||
|
|
||||||
use crate::{
|
|
||||||
client::key_manager::KeyManager,
|
|
||||||
config::{persistence::key_pathfinder::ClientKeyPathfinder, Config},
|
|
||||||
error::ClientCoreError,
|
|
||||||
};
|
|
||||||
use config::NymConfig;
|
|
||||||
#[cfg(target_arch = "wasm32")]
|
|
||||||
use gateway_client::wasm_mockups::SigningNyxdClient;
|
|
||||||
use gateway_client::GatewayClient;
|
|
||||||
use gateway_requests::registration::handshake::SharedKeys;
|
|
||||||
use nym_crypto::asymmetric::identity;
|
|
||||||
use rand::{seq::SliceRandom, thread_rng};
|
|
||||||
use std::{sync::Arc, time::Duration};
|
|
||||||
use tap::TapFallible;
|
|
||||||
use topology::{filter::VersionFilterable, gateway};
|
|
||||||
use url::Url;
|
|
||||||
#[cfg(not(target_arch = "wasm32"))]
|
|
||||||
use validator_client::nyxd::SigningNyxdClient;
|
|
||||||
|
|
||||||
pub(super) async fn query_gateway_details(
|
|
||||||
validator_servers: Vec<Url>,
|
|
||||||
chosen_gateway_id: Option<identity::PublicKey>,
|
|
||||||
) -> Result<gateway::Node, ClientCoreError> {
|
|
||||||
let nym_api = validator_servers
|
|
||||||
.choose(&mut thread_rng())
|
|
||||||
.ok_or(ClientCoreError::ListOfNymApisIsEmpty)?;
|
|
||||||
let validator_client = validator_client::client::NymApiClient::new(nym_api.clone());
|
|
||||||
|
|
||||||
log::trace!("Fetching list of gateways from: {}", nym_api);
|
|
||||||
let gateways = validator_client.get_cached_gateways().await?;
|
|
||||||
let valid_gateways = gateways
|
|
||||||
.into_iter()
|
|
||||||
.filter_map(|gateway| gateway.try_into().ok())
|
|
||||||
.collect::<Vec<gateway::Node>>();
|
|
||||||
|
|
||||||
let filtered_gateways = valid_gateways.filter_by_version(env!("CARGO_PKG_VERSION"));
|
|
||||||
|
|
||||||
// if we have chosen particular gateway - use it, otherwise choose a random one.
|
|
||||||
// (remember that in active topology all gateways have at least 100 reputation so should
|
|
||||||
// be working correctly)
|
|
||||||
if let Some(gateway_id) = chosen_gateway_id {
|
|
||||||
filtered_gateways
|
|
||||||
.iter()
|
|
||||||
.find(|gateway| gateway.identity_key == gateway_id)
|
|
||||||
.ok_or_else(|| ClientCoreError::NoGatewayWithId(gateway_id.to_string()))
|
|
||||||
.cloned()
|
|
||||||
} else {
|
|
||||||
filtered_gateways
|
|
||||||
.choose(&mut rand::thread_rng())
|
|
||||||
.ok_or(ClientCoreError::NoGatewaysOnNetwork)
|
|
||||||
.cloned()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub(super) async fn register_with_gateway(
|
|
||||||
gateway: &gateway::Node,
|
|
||||||
our_identity: Arc<identity::KeyPair>,
|
|
||||||
) -> Result<Arc<SharedKeys>, ClientCoreError> {
|
|
||||||
let timeout = Duration::from_millis(1500);
|
|
||||||
let mut gateway_client: GatewayClient<SigningNyxdClient> = GatewayClient::new_init(
|
|
||||||
gateway.clients_address(),
|
|
||||||
gateway.identity_key,
|
|
||||||
our_identity.clone(),
|
|
||||||
timeout,
|
|
||||||
);
|
|
||||||
gateway_client
|
|
||||||
.establish_connection()
|
|
||||||
.await
|
|
||||||
.tap_err(|_| log::warn!("Failed to establish connection with gateway!"))?;
|
|
||||||
let shared_keys = gateway_client
|
|
||||||
.perform_initial_authentication()
|
|
||||||
.await
|
|
||||||
.tap_err(|_| log::warn!("Failed to register with the gateway!"))?;
|
|
||||||
Ok(shared_keys)
|
|
||||||
}
|
|
||||||
|
|
||||||
pub(super) fn store_keys<T>(
|
|
||||||
key_manager: &KeyManager,
|
|
||||||
config: &Config<T>,
|
|
||||||
) -> Result<(), ClientCoreError>
|
|
||||||
where
|
|
||||||
T: NymConfig,
|
|
||||||
{
|
|
||||||
let pathfinder = ClientKeyPathfinder::new_from_config(config);
|
|
||||||
Ok(key_manager
|
|
||||||
.store_keys(&pathfinder)
|
|
||||||
.tap_err(|err| log::error!("Failed to generate keys: {err}"))?)
|
|
||||||
}
|
|
||||||
@@ -1,28 +1,23 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "credential"
|
name = "nym-credential-client"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
|
|
||||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
bip39 = "1.0.1"
|
|
||||||
clap = { version = "4.0", features = ["cargo", "derive"] }
|
clap = { version = "4.0", features = ["cargo", "derive"] }
|
||||||
log = "0.4"
|
log = "0.4"
|
||||||
rand = "0.7.3"
|
serde = { workspace = true, features = ["derive"] }
|
||||||
serde = { version = "1.0", features = ["derive"] }
|
|
||||||
thiserror = "1.0"
|
thiserror = "1.0"
|
||||||
url = "2.2"
|
|
||||||
tokio = { version = "1.24.1", features = ["rt-multi-thread", "net", "signal", "macros"] } # async runtime
|
tokio = { version = "1.24.1", features = ["rt-multi-thread", "net", "signal", "macros"] } # async runtime
|
||||||
|
|
||||||
coconut-interface = { path = "../../common/coconut-interface" }
|
nym-bandwidth-controller = { path = "../../common/bandwidth-controller" }
|
||||||
config = { path = "../../common/config" }
|
nym-config = { path = "../../common/config" }
|
||||||
completions = { path = "../../common/completions" }
|
nym-credentials = { path = "../../common/credentials" }
|
||||||
credentials = { path = "../../common/credentials" }
|
nym-credential-storage = { path = "../../common/credential-storage" }
|
||||||
credential-storage = { path = "../../common/credential-storage" }
|
nym-bin-common = { path = "../../common/bin-common"}
|
||||||
nym-crypto = { path = "../../common/crypto", features = ["rand", "asymmetric", "symmetric", "aes", "hashing"] }
|
nym-network-defaults = { path = "../../common/network-defaults" }
|
||||||
logging = { path = "../../common/logging"}
|
|
||||||
network-defaults = { path = "../../common/network-defaults" }
|
|
||||||
nym-pemstore = { path = "../../common/pemstore" }
|
nym-pemstore = { path = "../../common/pemstore" }
|
||||||
validator-client = { path = "../../common/client-libs/validator-client", features = ["nyxd-client"] }
|
nym-validator-client = { path = "../../common/client-libs/validator-client", features = ["nyxd-client"] }
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,32 @@
|
|||||||
|
<!--
|
||||||
|
Copyright 2023 - Nym Technologies SA <contact@nymtech.net>
|
||||||
|
SPDX-License-Identifier: Apache-2.0
|
||||||
|
-->
|
||||||
|
|
||||||
|
## Credential binary
|
||||||
|
|
||||||
|
The credential binary is used to acquire coconut bandwidth credentials in exchange for nym tokens. Those credentials are stored in the client's `data` directory, so that they can be used as the client sees fit.
|
||||||
|
|
||||||
|
### Warning
|
||||||
|
|
||||||
|
The credential binary is still experimental software. The infrastructure for using it is not yet deployed to mainnet and it's still in the process of being deployed to sandbox.
|
||||||
|
|
||||||
|
### Building
|
||||||
|
|
||||||
|
From the project's root directory, run:
|
||||||
|
```
|
||||||
|
cargo build -p credential
|
||||||
|
```
|
||||||
|
which generates the `credential` binary in `target/debug/credential`.
|
||||||
|
|
||||||
|
|
||||||
|
### Running
|
||||||
|
|
||||||
|
For example, you can get a credential worth 3 nym (3000000 unym) in a socks5 client that was already initialized like so:
|
||||||
|
|
||||||
|
```
|
||||||
|
./target/debug/credential --config-env-file envs/sandbox.env --client-home-directory ~/.nym/socks5-clients/cred_client --nyxd-url https://sandbox-validator1.nymtech.net --mnemonic $MNEMONIC --recovery-dir /tmp/recovery --amount 3000000
|
||||||
|
```
|
||||||
|
|
||||||
|
More information regarding how to run the binary can be found by running it with the `--help` argument.
|
||||||
|
|
||||||
@@ -3,15 +3,15 @@
|
|||||||
|
|
||||||
use crate::error::Result;
|
use crate::error::Result;
|
||||||
use bip39::Mnemonic;
|
use bip39::Mnemonic;
|
||||||
use network_defaults::{NymNetworkDetails, VOUCHER_INFO};
|
use nym_network_defaults::{NymNetworkDetails, VOUCHER_INFO};
|
||||||
|
use nym_validator_client::nyxd;
|
||||||
|
use nym_validator_client::nyxd::traits::CoconutBandwidthSigningClient;
|
||||||
|
use nym_validator_client::nyxd::{Coin, DirectSigningNyxdClient, Fee, NyxdClient};
|
||||||
use std::str::FromStr;
|
use std::str::FromStr;
|
||||||
use url::Url;
|
use url::Url;
|
||||||
use validator_client::nyxd;
|
|
||||||
use validator_client::nyxd::traits::CoconutBandwidthSigningClient;
|
|
||||||
use validator_client::nyxd::{Coin, Fee, NyxdClient, SigningNyxdClient};
|
|
||||||
|
|
||||||
pub(crate) struct Client {
|
pub(crate) struct Client {
|
||||||
nyxd_client: NyxdClient<SigningNyxdClient>,
|
nyxd_client: NyxdClient<DirectSigningNyxdClient>,
|
||||||
mix_denom_base: String,
|
mix_denom_base: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -2,27 +2,14 @@
|
|||||||
// SPDX-License-Identifier: Apache-2.0
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
use clap::{ArgGroup, Args, Subcommand};
|
use clap::{ArgGroup, Args, Subcommand};
|
||||||
use completions::ArgShell;
|
|
||||||
use log::*;
|
use log::*;
|
||||||
use rand::rngs::OsRng;
|
use nym_bandwidth_controller::acquire::state::State;
|
||||||
use std::str::FromStr;
|
use nym_bin_common::completions::ArgShell;
|
||||||
|
use nym_credential_storage::persistent_storage::PersistentStorage;
|
||||||
|
use nym_validator_client::nyxd::traits::DkgQueryClient;
|
||||||
|
|
||||||
use coconut_interface::{Base58, Parameters};
|
use crate::error::Result;
|
||||||
use credential_storage::storage::Storage;
|
|
||||||
use credential_storage::PersistentStorage;
|
|
||||||
use credentials::coconut::bandwidth::{BandwidthVoucher, TOTAL_ATTRIBUTES};
|
|
||||||
use credentials::coconut::utils::obtain_aggregate_signature;
|
|
||||||
use network_defaults::VOUCHER_INFO;
|
|
||||||
use nym_crypto::asymmetric::{encryption, identity};
|
|
||||||
use validator_client::nyxd::traits::DkgQueryClient;
|
|
||||||
use validator_client::nyxd::tx::Hash;
|
|
||||||
use validator_client::nyxd::CosmWasmClient;
|
|
||||||
use validator_client::CoconutApiClient;
|
|
||||||
|
|
||||||
use crate::client::Client;
|
|
||||||
use crate::error::{CredentialClientError, Result};
|
|
||||||
use crate::recovery_storage::RecoveryStorage;
|
use crate::recovery_storage::RecoveryStorage;
|
||||||
use crate::state::{KeyPair, State};
|
|
||||||
|
|
||||||
#[derive(Subcommand)]
|
#[derive(Subcommand)]
|
||||||
pub(crate) enum Command {
|
pub(crate) enum Command {
|
||||||
@@ -47,10 +34,6 @@ pub(crate) struct Run {
|
|||||||
#[clap(long)]
|
#[clap(long)]
|
||||||
pub(crate) client_home_directory: std::path::PathBuf,
|
pub(crate) client_home_directory: std::path::PathBuf,
|
||||||
|
|
||||||
/// The nyxd URL that should be used
|
|
||||||
#[clap(long)]
|
|
||||||
pub(crate) nyxd_url: String,
|
|
||||||
|
|
||||||
/// A mnemonic for the account that buys the credential
|
/// A mnemonic for the account that buys the credential
|
||||||
#[clap(long)]
|
#[clap(long)]
|
||||||
pub(crate) mnemonic: String,
|
pub(crate) mnemonic: String,
|
||||||
@@ -69,82 +52,16 @@ pub(crate) struct Run {
|
|||||||
pub(crate) recovery_mode: bool,
|
pub(crate) recovery_mode: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) async fn deposit(nyxd_url: &str, mnemonic: &str, amount: u64) -> Result<State> {
|
pub(crate) async fn recover_credentials<C: DkgQueryClient + Send + Sync>(
|
||||||
let mut rng = OsRng;
|
client: &C,
|
||||||
let signing_keypair = KeyPair::from(identity::KeyPair::new(&mut rng));
|
|
||||||
let encryption_keypair = KeyPair::from(encryption::KeyPair::new(&mut rng));
|
|
||||||
let params = Parameters::new(TOTAL_ATTRIBUTES).unwrap();
|
|
||||||
|
|
||||||
let client = Client::new(nyxd_url, mnemonic);
|
|
||||||
let tx_hash = client
|
|
||||||
.deposit(
|
|
||||||
amount,
|
|
||||||
signing_keypair.public_key.clone(),
|
|
||||||
encryption_keypair.public_key.clone(),
|
|
||||||
None,
|
|
||||||
)
|
|
||||||
.await?;
|
|
||||||
|
|
||||||
let voucher = BandwidthVoucher::new(
|
|
||||||
¶ms,
|
|
||||||
amount.to_string(),
|
|
||||||
VOUCHER_INFO.to_string(),
|
|
||||||
Hash::from_str(&tx_hash).map_err(|_| CredentialClientError::InvalidTxHash)?,
|
|
||||||
identity::PrivateKey::from_base58_string(&signing_keypair.private_key)?,
|
|
||||||
encryption::PrivateKey::from_base58_string(&encryption_keypair.private_key)?,
|
|
||||||
);
|
|
||||||
|
|
||||||
let state = State { voucher, params };
|
|
||||||
|
|
||||||
Ok(state)
|
|
||||||
}
|
|
||||||
|
|
||||||
pub(crate) async fn get_credential<C: Clone + CosmWasmClient + Send + Sync>(
|
|
||||||
state: &State,
|
|
||||||
client: validator_client::Client<C>,
|
|
||||||
shared_storage: PersistentStorage,
|
|
||||||
) -> Result<()> {
|
|
||||||
let epoch_id = client.nyxd.get_current_epoch().await?.epoch_id;
|
|
||||||
let threshold = client
|
|
||||||
.nyxd
|
|
||||||
.get_current_epoch_threshold()
|
|
||||||
.await?
|
|
||||||
.ok_or(CredentialClientError::NoThreshold)?;
|
|
||||||
let coconut_api_clients = CoconutApiClient::all_coconut_api_clients(&client, epoch_id).await?;
|
|
||||||
|
|
||||||
let signature = obtain_aggregate_signature(
|
|
||||||
&state.params,
|
|
||||||
&state.voucher,
|
|
||||||
&coconut_api_clients,
|
|
||||||
threshold,
|
|
||||||
)
|
|
||||||
.await?;
|
|
||||||
info!("Signature: {:?}", signature.to_bs58());
|
|
||||||
shared_storage
|
|
||||||
.insert_coconut_credential(
|
|
||||||
state.voucher.get_voucher_value(),
|
|
||||||
VOUCHER_INFO.to_string(),
|
|
||||||
state.voucher.get_private_attributes()[0].to_bs58(),
|
|
||||||
state.voucher.get_private_attributes()[1].to_bs58(),
|
|
||||||
signature.to_bs58(),
|
|
||||||
epoch_id.to_string(),
|
|
||||||
)
|
|
||||||
.await?;
|
|
||||||
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
|
|
||||||
pub(crate) async fn recover_credentials<C: Clone + CosmWasmClient + Send + Sync>(
|
|
||||||
client: validator_client::Client<C>,
|
|
||||||
recovery_storage: &RecoveryStorage,
|
recovery_storage: &RecoveryStorage,
|
||||||
shared_storage: PersistentStorage,
|
shared_storage: &PersistentStorage,
|
||||||
) -> Result<()> {
|
) -> Result<()> {
|
||||||
for voucher in recovery_storage.unconsumed_vouchers()? {
|
for voucher in recovery_storage.unconsumed_vouchers()? {
|
||||||
let state = State {
|
let state = State::new(voucher);
|
||||||
voucher,
|
if let Err(e) =
|
||||||
params: Parameters::new(TOTAL_ATTRIBUTES).unwrap(),
|
nym_bandwidth_controller::acquire::get_credential(&state, client, shared_storage).await
|
||||||
};
|
{
|
||||||
if let Err(e) = get_credential(&state, client.clone(), shared_storage.clone()).await {
|
|
||||||
error!(
|
error!(
|
||||||
"Could not recover deposit {} due to {:?}, try again later",
|
"Could not recover deposit {} due to {:?}, try again later",
|
||||||
state.voucher.tx_hash(),
|
state.voucher.tx_hash(),
|
||||||
|
|||||||
@@ -4,12 +4,10 @@
|
|||||||
use std::time::SystemTimeError;
|
use std::time::SystemTimeError;
|
||||||
use thiserror::Error;
|
use thiserror::Error;
|
||||||
|
|
||||||
use credential_storage::error::StorageError;
|
use nym_credential_storage::error::StorageError;
|
||||||
use credentials::error::Error as CredentialError;
|
use nym_credentials::error::Error as CredentialError;
|
||||||
use nym_crypto::asymmetric::encryption::KeyRecoveryError;
|
use nym_validator_client::nyxd::error::NyxdError;
|
||||||
use nym_crypto::asymmetric::identity::Ed25519RecoveryError;
|
use nym_validator_client::ValidatorClientError;
|
||||||
use validator_client::nyxd::error::NyxdError;
|
|
||||||
use validator_client::ValidatorClientError;
|
|
||||||
|
|
||||||
pub type Result<T> = std::result::Result<T, CredentialClientError>;
|
pub type Result<T> = std::result::Result<T, CredentialClientError>;
|
||||||
|
|
||||||
@@ -18,6 +16,9 @@ pub enum CredentialClientError {
|
|||||||
#[error("IO error: {0}")]
|
#[error("IO error: {0}")]
|
||||||
IOError(#[from] std::io::Error),
|
IOError(#[from] std::io::Error),
|
||||||
|
|
||||||
|
#[error("Bandwidth controller error: {0}")]
|
||||||
|
BandwidthControllerError(#[from] nym_bandwidth_controller::error::BandwidthControllerError),
|
||||||
|
|
||||||
#[error("Nyxd error: {0}")]
|
#[error("Nyxd error: {0}")]
|
||||||
Nyxd(#[from] NyxdError),
|
Nyxd(#[from] NyxdError),
|
||||||
|
|
||||||
@@ -27,21 +28,9 @@ pub enum CredentialClientError {
|
|||||||
#[error("Credential error: {0}")]
|
#[error("Credential error: {0}")]
|
||||||
Credential(#[from] CredentialError),
|
Credential(#[from] CredentialError),
|
||||||
|
|
||||||
#[error("The tx hash provided is not valid")]
|
|
||||||
InvalidTxHash,
|
|
||||||
|
|
||||||
#[error("Could not parse Ed25519 data")]
|
|
||||||
Ed25519ParseError(#[from] Ed25519RecoveryError),
|
|
||||||
|
|
||||||
#[error("Could not parse X25519 data")]
|
|
||||||
X25519ParseError(#[from] KeyRecoveryError),
|
|
||||||
|
|
||||||
#[error("Could not use shared storage")]
|
#[error("Could not use shared storage")]
|
||||||
SharedStorageError(#[from] StorageError),
|
SharedStorageError(#[from] StorageError),
|
||||||
|
|
||||||
#[error("Could not get system time")]
|
#[error("Could not get system time")]
|
||||||
SysTimeError(#[from] SystemTimeError),
|
SysTimeError(#[from] SystemTimeError),
|
||||||
|
|
||||||
#[error("Threshold not set yet")]
|
|
||||||
NoThreshold,
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,26 +1,24 @@
|
|||||||
// Copyright 2022 - Nym Technologies SA <contact@nymtech.net>
|
// Copyright 2022 - Nym Technologies SA <contact@nymtech.net>
|
||||||
// SPDX-License-Identifier: Apache-2.0
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
mod client;
|
|
||||||
mod commands;
|
mod commands;
|
||||||
mod error;
|
mod error;
|
||||||
mod recovery_storage;
|
mod recovery_storage;
|
||||||
mod state;
|
|
||||||
|
|
||||||
use commands::*;
|
use commands::*;
|
||||||
use completions::fig_generate;
|
|
||||||
use config::{DATA_DIR, DB_FILE_NAME};
|
|
||||||
use error::Result;
|
use error::Result;
|
||||||
use log::*;
|
use log::*;
|
||||||
use network_defaults::{setup_env, NymNetworkDetails};
|
use nym_bin_common::completions::fig_generate;
|
||||||
|
use nym_config::{CRED_DB_FILE_NAME, DATA_DIR};
|
||||||
|
use nym_network_defaults::{setup_env, NymNetworkDetails};
|
||||||
use std::process::exit;
|
use std::process::exit;
|
||||||
use std::time::{Duration, SystemTime};
|
use std::time::{Duration, SystemTime};
|
||||||
|
|
||||||
use clap::{CommandFactory, Parser};
|
use clap::{CommandFactory, Parser};
|
||||||
use logging::setup_logging;
|
use nym_bin_common::logging::setup_logging;
|
||||||
use validator_client::nyxd::traits::DkgQueryClient;
|
use nym_validator_client::nyxd::traits::DkgQueryClient;
|
||||||
use validator_client::nyxd::CosmWasmClient;
|
use nym_validator_client::nyxd::{Coin, CosmWasmClient};
|
||||||
use validator_client::Config;
|
use nym_validator_client::Config;
|
||||||
|
|
||||||
const SAFETY_BUFFER_SECS: u64 = 60; // 1 minute
|
const SAFETY_BUFFER_SECS: u64 = 60; // 1 minute
|
||||||
|
|
||||||
@@ -35,8 +33,8 @@ struct Cli {
|
|||||||
pub(crate) command: Command,
|
pub(crate) command: Command,
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn block_until_coconut_is_available<C: Clone + CosmWasmClient + Send + Sync>(
|
async fn block_until_coconut_is_available<C: CosmWasmClient + Send + Sync>(
|
||||||
client: &validator_client::Client<C>,
|
client: &nym_validator_client::Client<C>,
|
||||||
) -> Result<()> {
|
) -> Result<()> {
|
||||||
loop {
|
loop {
|
||||||
let epoch = client.nyxd.get_current_epoch().await?;
|
let epoch = client.nyxd.get_current_epoch().await?;
|
||||||
@@ -51,8 +49,11 @@ async fn block_until_coconut_is_available<C: Clone + CosmWasmClient + Send + Syn
|
|||||||
|
|
||||||
break;
|
break;
|
||||||
} else {
|
} else {
|
||||||
// Use 20 additional seconds to avoid the exact moment of going into the final epoch state
|
// Use 1 additional second to not start the next iteration immediately and spam get_current_epoch queries
|
||||||
let secs_until_final = epoch.final_timestamp_secs() + 20 - current_timestamp_secs;
|
let secs_until_final = epoch
|
||||||
|
.final_timestamp_secs()
|
||||||
|
.saturating_sub(current_timestamp_secs)
|
||||||
|
+ 1;
|
||||||
info!("Approximately {} seconds until coconut is available. Sleeping until then. You can safely kill the process at any moment.", secs_until_final);
|
info!("Approximately {} seconds until coconut is available. Sleeping until then. You can safely kill the process at any moment.", secs_until_final);
|
||||||
std::thread::sleep(Duration::from_secs(secs_until_final));
|
std::thread::sleep(Duration::from_secs(secs_until_final));
|
||||||
}
|
}
|
||||||
@@ -70,22 +71,38 @@ async fn main() -> Result<()> {
|
|||||||
|
|
||||||
match args.command {
|
match args.command {
|
||||||
Command::Run(r) => {
|
Command::Run(r) => {
|
||||||
let db_path = r.client_home_directory.join(DATA_DIR).join(DB_FILE_NAME);
|
let db_path = r
|
||||||
let shared_storage = credential_storage::initialise_storage(db_path).await;
|
.client_home_directory
|
||||||
|
.join(DATA_DIR)
|
||||||
|
.join(CRED_DB_FILE_NAME);
|
||||||
|
let shared_storage =
|
||||||
|
nym_credential_storage::initialise_persistent_storage(db_path).await;
|
||||||
let recovery_storage = recovery_storage::RecoveryStorage::new(r.recovery_dir)?;
|
let recovery_storage = recovery_storage::RecoveryStorage::new(r.recovery_dir)?;
|
||||||
|
|
||||||
let network_details = NymNetworkDetails::new_from_env();
|
let network_details = NymNetworkDetails::new_from_env();
|
||||||
let config = Config::try_from_nym_network_details(&network_details)?;
|
let config = Config::try_from_nym_network_details(&network_details).expect(
|
||||||
let client = validator_client::Client::new_query(config)?;
|
"failed to construct valid validator client config with the provided network",
|
||||||
|
);
|
||||||
|
let amount = Coin::new(
|
||||||
|
r.amount as u128,
|
||||||
|
network_details.chain_details.mix_denom.base,
|
||||||
|
);
|
||||||
|
let client =
|
||||||
|
nym_validator_client::Client::new_signing(config, r.mnemonic.parse().unwrap())?;
|
||||||
|
|
||||||
block_until_coconut_is_available(&client).await?;
|
block_until_coconut_is_available(&client).await?;
|
||||||
info!("Starting depositing funds, don't kill the process");
|
info!("Starting depositing funds, don't kill the process");
|
||||||
|
|
||||||
if !r.recovery_mode {
|
if !r.recovery_mode {
|
||||||
let state = deposit(&r.nyxd_url, &r.mnemonic, r.amount).await?;
|
let state =
|
||||||
if get_credential(&state, client, shared_storage)
|
nym_bandwidth_controller::acquire::deposit(&client.nyxd, amount).await?;
|
||||||
.await
|
if nym_bandwidth_controller::acquire::get_credential(
|
||||||
.is_err()
|
&state,
|
||||||
|
&client,
|
||||||
|
&shared_storage,
|
||||||
|
)
|
||||||
|
.await
|
||||||
|
.is_err()
|
||||||
{
|
{
|
||||||
warn!("Failed to obtain credential. Dumping recovery data.",);
|
warn!("Failed to obtain credential. Dumping recovery data.",);
|
||||||
match recovery_storage.insert_voucher(&state.voucher) {
|
match recovery_storage.insert_voucher(&state.voucher) {
|
||||||
@@ -98,11 +115,11 @@ async fn main() -> Result<()> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
recover_credentials(client, &recovery_storage, shared_storage).await?;
|
recover_credentials(&client.nyxd, &recovery_storage, &shared_storage).await?;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Command::Completions(c) => c.generate(&mut crate::Cli::command(), bin_name),
|
Command::Completions(c) => c.generate(&mut Cli::command(), bin_name),
|
||||||
Command::GenerateFigSpec => fig_generate(&mut crate::Cli::command(), bin_name),
|
Command::GenerateFigSpec => fig_generate(&mut Cli::command(), bin_name),
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
// Copyright 2023 - Nym Technologies SA <contact@nymtech.net>
|
// Copyright 2023 - Nym Technologies SA <contact@nymtech.net>
|
||||||
// SPDX-License-Identifier: Apache-2.0
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
use credentials::coconut::bandwidth::BandwidthVoucher;
|
use nym_credentials::coconut::bandwidth::BandwidthVoucher;
|
||||||
use std::fs::{create_dir_all, read_dir, File};
|
use std::fs::{create_dir_all, read_dir, File};
|
||||||
use std::io::{Read, Write};
|
use std::io::{Read, Write};
|
||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
|
|||||||
+17
-22
@@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "nym-client"
|
name = "nym-client"
|
||||||
version = "1.1.10"
|
version = "1.1.15"
|
||||||
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"
|
||||||
@@ -26,34 +26,29 @@ lazy_static = "1.4.0"
|
|||||||
log = { workspace = true } # self explanatory
|
log = { workspace = true } # self explanatory
|
||||||
pretty_env_logger = "0.4" # for formatting log messages
|
pretty_env_logger = "0.4" # for formatting log messages
|
||||||
rand = { version = "0.7.3", features = ["wasm-bindgen"] } # rng-related traits + some rng implementation to use
|
rand = { version = "0.7.3", features = ["wasm-bindgen"] } # rng-related traits + some rng implementation to use
|
||||||
serde = { version = "1.0.104", features = ["derive"] } # for config serialization/deserialization
|
serde = { workspace = true, features = ["derive"] } # for config serialization/deserialization
|
||||||
serde_json = "1.0"
|
serde_json = { workspace = true }
|
||||||
thiserror = "1.0.34"
|
thiserror = "1.0.34"
|
||||||
tap = "1.0.1"
|
tap = "1.0.1"
|
||||||
tokio = { version = "1.24.1", features = ["rt-multi-thread", "net", "signal"] } # async runtime
|
tokio = { version = "1.24.1", features = ["rt-multi-thread", "net", "signal"] } # async runtime
|
||||||
tokio-tungstenite = "0.14" # websocket
|
tokio-tungstenite = "0.14" # websocket
|
||||||
|
|
||||||
## internal
|
## internal
|
||||||
build-information = { path = "../../common/build-information" }
|
nym-bandwidth-controller = { path = "../../common/bandwidth-controller" }
|
||||||
client-core = { path = "../client-core", features = ["fs-surb-storage"] }
|
nym-bin-common = { path = "../../common/bin-common", features = ["output_format"] }
|
||||||
client-connections = { path = "../../common/client-connections" }
|
nym-client-core = { path = "../../common/client-core", features = ["fs-surb-storage"] }
|
||||||
coconut-interface = { path = "../../common/coconut-interface" }
|
nym-coconut-interface = { path = "../../common/coconut-interface" }
|
||||||
config = { path = "../../common/config" }
|
nym-config = { path = "../../common/config" }
|
||||||
completions = { path = "../../common/completions" }
|
nym-credential-storage = { path = "../../common/credential-storage" }
|
||||||
credential-storage = { path = "../../common/credential-storage" }
|
nym-credentials = { path = "../../common/credentials" }
|
||||||
credentials = { path = "../../common/credentials" }
|
|
||||||
nym-crypto = { path = "../../common/crypto" }
|
nym-crypto = { path = "../../common/crypto" }
|
||||||
logging = { path = "../../common/logging"}
|
nym-gateway-requests = { path = "../../gateway/gateway-requests" }
|
||||||
gateway-client = { path = "../../common/client-libs/gateway-client" }
|
nym-network-defaults = { path = "../../common/network-defaults" }
|
||||||
gateway-requests = { path = "../../gateway/gateway-requests" }
|
nym-sphinx = { path = "../../common/nymsphinx" }
|
||||||
network-defaults = { path = "../../common/network-defaults" }
|
|
||||||
nymsphinx = { path = "../../common/nymsphinx" }
|
|
||||||
nym-pemstore = { path = "../../common/pemstore" }
|
nym-pemstore = { path = "../../common/pemstore" }
|
||||||
task = { path = "../../common/task" }
|
nym-task = { path = "../../common/task" }
|
||||||
topology = { path = "../../common/topology" }
|
nym-topology = { path = "../../common/topology" }
|
||||||
validator-client = { path = "../../common/client-libs/validator-client", features = ["nyxd-client"] }
|
nym-validator-client = { path = "../../common/client-libs/validator-client", features = ["nyxd-client"] }
|
||||||
version-checker = { path = "../../common/version-checker" }
|
nym-client-websocket-requests = { path = "websocket-requests" }
|
||||||
websocket-requests = { path = "websocket-requests" }
|
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
serde_json = "1.0" # for the "textsend" example
|
|
||||||
|
|||||||
+41
-41
@@ -13,7 +13,7 @@
|
|||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"clean-webpack-plugin": "^4.0.0",
|
"clean-webpack-plugin": "^4.0.0",
|
||||||
"webpack": "^5.70.0",
|
"webpack": "^5.76.0",
|
||||||
"webpack-cli": "^4.9.2",
|
"webpack-cli": "^4.9.2",
|
||||||
"webpack-dev-server": "^4.7.4"
|
"webpack-dev-server": "^4.7.4"
|
||||||
}
|
}
|
||||||
@@ -490,9 +490,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/acorn": {
|
"node_modules/acorn": {
|
||||||
"version": "8.7.0",
|
"version": "8.8.2",
|
||||||
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz",
|
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz",
|
||||||
"integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==",
|
"integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==",
|
||||||
"bin": {
|
"bin": {
|
||||||
"acorn": "bin/acorn"
|
"acorn": "bin/acorn"
|
||||||
},
|
},
|
||||||
@@ -1327,9 +1327,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/enhanced-resolve": {
|
"node_modules/enhanced-resolve": {
|
||||||
"version": "5.9.2",
|
"version": "5.12.0",
|
||||||
"resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.9.2.tgz",
|
"resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz",
|
||||||
"integrity": "sha512-GIm3fQfwLJ8YZx2smuHpBKkXC1yOk+OBEmKckVyL0i/ea8mqDEykK3ld5dgH1QYPNyT/lIllxV2LULnxCHaHkA==",
|
"integrity": "sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"graceful-fs": "^4.2.4",
|
"graceful-fs": "^4.2.4",
|
||||||
"tapable": "^2.2.0"
|
"tapable": "^2.2.0"
|
||||||
@@ -2380,10 +2380,10 @@
|
|||||||
"node": ">= 10.13.0"
|
"node": ">= 10.13.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/json-parse-better-errors": {
|
"node_modules/json-parse-even-better-errors": {
|
||||||
"version": "1.0.2",
|
"version": "2.3.1",
|
||||||
"resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
|
||||||
"integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw=="
|
"integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="
|
||||||
},
|
},
|
||||||
"node_modules/json-schema-traverse": {
|
"node_modules/json-schema-traverse": {
|
||||||
"version": "0.4.1",
|
"version": "0.4.1",
|
||||||
@@ -3824,9 +3824,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/watchpack": {
|
"node_modules/watchpack": {
|
||||||
"version": "2.3.1",
|
"version": "2.4.0",
|
||||||
"resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.3.1.tgz",
|
"resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz",
|
||||||
"integrity": "sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA==",
|
"integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"glob-to-regexp": "^0.4.1",
|
"glob-to-regexp": "^0.4.1",
|
||||||
"graceful-fs": "^4.1.2"
|
"graceful-fs": "^4.1.2"
|
||||||
@@ -3845,33 +3845,33 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/webpack": {
|
"node_modules/webpack": {
|
||||||
"version": "5.70.0",
|
"version": "5.76.0",
|
||||||
"resolved": "https://registry.npmjs.org/webpack/-/webpack-5.70.0.tgz",
|
"resolved": "https://registry.npmjs.org/webpack/-/webpack-5.76.0.tgz",
|
||||||
"integrity": "sha512-ZMWWy8CeuTTjCxbeaQI21xSswseF2oNOwc70QSKNePvmxE7XW36i7vpBMYZFAUHPwQiEbNGCEYIOOlyRbdGmxw==",
|
"integrity": "sha512-l5sOdYBDunyf72HW8dF23rFtWq/7Zgvt/9ftMof71E/yUb1YLOBmTgA2K4vQthB3kotMrSj609txVE0dnr2fjA==",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@types/eslint-scope": "^3.7.3",
|
"@types/eslint-scope": "^3.7.3",
|
||||||
"@types/estree": "^0.0.51",
|
"@types/estree": "^0.0.51",
|
||||||
"@webassemblyjs/ast": "1.11.1",
|
"@webassemblyjs/ast": "1.11.1",
|
||||||
"@webassemblyjs/wasm-edit": "1.11.1",
|
"@webassemblyjs/wasm-edit": "1.11.1",
|
||||||
"@webassemblyjs/wasm-parser": "1.11.1",
|
"@webassemblyjs/wasm-parser": "1.11.1",
|
||||||
"acorn": "^8.4.1",
|
"acorn": "^8.7.1",
|
||||||
"acorn-import-assertions": "^1.7.6",
|
"acorn-import-assertions": "^1.7.6",
|
||||||
"browserslist": "^4.14.5",
|
"browserslist": "^4.14.5",
|
||||||
"chrome-trace-event": "^1.0.2",
|
"chrome-trace-event": "^1.0.2",
|
||||||
"enhanced-resolve": "^5.9.2",
|
"enhanced-resolve": "^5.10.0",
|
||||||
"es-module-lexer": "^0.9.0",
|
"es-module-lexer": "^0.9.0",
|
||||||
"eslint-scope": "5.1.1",
|
"eslint-scope": "5.1.1",
|
||||||
"events": "^3.2.0",
|
"events": "^3.2.0",
|
||||||
"glob-to-regexp": "^0.4.1",
|
"glob-to-regexp": "^0.4.1",
|
||||||
"graceful-fs": "^4.2.9",
|
"graceful-fs": "^4.2.9",
|
||||||
"json-parse-better-errors": "^1.0.2",
|
"json-parse-even-better-errors": "^2.3.1",
|
||||||
"loader-runner": "^4.2.0",
|
"loader-runner": "^4.2.0",
|
||||||
"mime-types": "^2.1.27",
|
"mime-types": "^2.1.27",
|
||||||
"neo-async": "^2.6.2",
|
"neo-async": "^2.6.2",
|
||||||
"schema-utils": "^3.1.0",
|
"schema-utils": "^3.1.0",
|
||||||
"tapable": "^2.1.1",
|
"tapable": "^2.1.1",
|
||||||
"terser-webpack-plugin": "^5.1.3",
|
"terser-webpack-plugin": "^5.1.3",
|
||||||
"watchpack": "^2.3.1",
|
"watchpack": "^2.4.0",
|
||||||
"webpack-sources": "^3.2.3"
|
"webpack-sources": "^3.2.3"
|
||||||
},
|
},
|
||||||
"bin": {
|
"bin": {
|
||||||
@@ -4894,9 +4894,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"acorn": {
|
"acorn": {
|
||||||
"version": "8.7.0",
|
"version": "8.8.2",
|
||||||
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz",
|
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz",
|
||||||
"integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ=="
|
"integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw=="
|
||||||
},
|
},
|
||||||
"acorn-import-assertions": {
|
"acorn-import-assertions": {
|
||||||
"version": "1.8.0",
|
"version": "1.8.0",
|
||||||
@@ -5527,9 +5527,9 @@
|
|||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"enhanced-resolve": {
|
"enhanced-resolve": {
|
||||||
"version": "5.9.2",
|
"version": "5.12.0",
|
||||||
"resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.9.2.tgz",
|
"resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz",
|
||||||
"integrity": "sha512-GIm3fQfwLJ8YZx2smuHpBKkXC1yOk+OBEmKckVyL0i/ea8mqDEykK3ld5dgH1QYPNyT/lIllxV2LULnxCHaHkA==",
|
"integrity": "sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==",
|
||||||
"requires": {
|
"requires": {
|
||||||
"graceful-fs": "^4.2.4",
|
"graceful-fs": "^4.2.4",
|
||||||
"tapable": "^2.2.0"
|
"tapable": "^2.2.0"
|
||||||
@@ -6305,10 +6305,10 @@
|
|||||||
"supports-color": "^8.0.0"
|
"supports-color": "^8.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"json-parse-better-errors": {
|
"json-parse-even-better-errors": {
|
||||||
"version": "1.0.2",
|
"version": "2.3.1",
|
||||||
"resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
|
||||||
"integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw=="
|
"integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="
|
||||||
},
|
},
|
||||||
"json-schema-traverse": {
|
"json-schema-traverse": {
|
||||||
"version": "0.4.1",
|
"version": "0.4.1",
|
||||||
@@ -7396,9 +7396,9 @@
|
|||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"watchpack": {
|
"watchpack": {
|
||||||
"version": "2.3.1",
|
"version": "2.4.0",
|
||||||
"resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.3.1.tgz",
|
"resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz",
|
||||||
"integrity": "sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA==",
|
"integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==",
|
||||||
"requires": {
|
"requires": {
|
||||||
"glob-to-regexp": "^0.4.1",
|
"glob-to-regexp": "^0.4.1",
|
||||||
"graceful-fs": "^4.1.2"
|
"graceful-fs": "^4.1.2"
|
||||||
@@ -7414,33 +7414,33 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"webpack": {
|
"webpack": {
|
||||||
"version": "5.70.0",
|
"version": "5.76.0",
|
||||||
"resolved": "https://registry.npmjs.org/webpack/-/webpack-5.70.0.tgz",
|
"resolved": "https://registry.npmjs.org/webpack/-/webpack-5.76.0.tgz",
|
||||||
"integrity": "sha512-ZMWWy8CeuTTjCxbeaQI21xSswseF2oNOwc70QSKNePvmxE7XW36i7vpBMYZFAUHPwQiEbNGCEYIOOlyRbdGmxw==",
|
"integrity": "sha512-l5sOdYBDunyf72HW8dF23rFtWq/7Zgvt/9ftMof71E/yUb1YLOBmTgA2K4vQthB3kotMrSj609txVE0dnr2fjA==",
|
||||||
"requires": {
|
"requires": {
|
||||||
"@types/eslint-scope": "^3.7.3",
|
"@types/eslint-scope": "^3.7.3",
|
||||||
"@types/estree": "^0.0.51",
|
"@types/estree": "^0.0.51",
|
||||||
"@webassemblyjs/ast": "1.11.1",
|
"@webassemblyjs/ast": "1.11.1",
|
||||||
"@webassemblyjs/wasm-edit": "1.11.1",
|
"@webassemblyjs/wasm-edit": "1.11.1",
|
||||||
"@webassemblyjs/wasm-parser": "1.11.1",
|
"@webassemblyjs/wasm-parser": "1.11.1",
|
||||||
"acorn": "^8.4.1",
|
"acorn": "^8.7.1",
|
||||||
"acorn-import-assertions": "^1.7.6",
|
"acorn-import-assertions": "^1.7.6",
|
||||||
"browserslist": "^4.14.5",
|
"browserslist": "^4.14.5",
|
||||||
"chrome-trace-event": "^1.0.2",
|
"chrome-trace-event": "^1.0.2",
|
||||||
"enhanced-resolve": "^5.9.2",
|
"enhanced-resolve": "^5.10.0",
|
||||||
"es-module-lexer": "^0.9.0",
|
"es-module-lexer": "^0.9.0",
|
||||||
"eslint-scope": "5.1.1",
|
"eslint-scope": "5.1.1",
|
||||||
"events": "^3.2.0",
|
"events": "^3.2.0",
|
||||||
"glob-to-regexp": "^0.4.1",
|
"glob-to-regexp": "^0.4.1",
|
||||||
"graceful-fs": "^4.2.9",
|
"graceful-fs": "^4.2.9",
|
||||||
"json-parse-better-errors": "^1.0.2",
|
"json-parse-even-better-errors": "^2.3.1",
|
||||||
"loader-runner": "^4.2.0",
|
"loader-runner": "^4.2.0",
|
||||||
"mime-types": "^2.1.27",
|
"mime-types": "^2.1.27",
|
||||||
"neo-async": "^2.6.2",
|
"neo-async": "^2.6.2",
|
||||||
"schema-utils": "^3.1.0",
|
"schema-utils": "^3.1.0",
|
||||||
"tapable": "^2.1.1",
|
"tapable": "^2.1.1",
|
||||||
"terser-webpack-plugin": "^5.1.3",
|
"terser-webpack-plugin": "^5.1.3",
|
||||||
"watchpack": "^2.3.1",
|
"watchpack": "^2.4.0",
|
||||||
"webpack-sources": "^3.2.3"
|
"webpack-sources": "^3.2.3"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -19,7 +19,7 @@
|
|||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"clean-webpack-plugin": "^4.0.0",
|
"clean-webpack-plugin": "^4.0.0",
|
||||||
"webpack": "^5.70.0",
|
"webpack": "^5.76.0",
|
||||||
"webpack-cli": "^4.9.2",
|
"webpack-cli": "^4.9.2",
|
||||||
"webpack-dev-server": "^4.7.4"
|
"webpack-dev-server": "^4.7.4"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
use futures::{SinkExt, StreamExt};
|
use futures::{SinkExt, StreamExt};
|
||||||
use nymsphinx::addressing::clients::Recipient;
|
use nym_client_websocket_requests::{requests::ClientRequest, responses::ServerResponse};
|
||||||
|
use nym_sphinx::addressing::clients::Recipient;
|
||||||
use tokio::net::TcpStream;
|
use tokio::net::TcpStream;
|
||||||
use tokio_tungstenite::{
|
use tokio_tungstenite::{
|
||||||
connect_async, tungstenite::protocol::Message, MaybeTlsStream, WebSocketStream,
|
connect_async, tungstenite::protocol::Message, MaybeTlsStream, WebSocketStream,
|
||||||
};
|
};
|
||||||
use websocket_requests::{requests::ClientRequest, responses::ServerResponse};
|
|
||||||
|
|
||||||
// just helpers functions that work in this very particular context because we are sending to ourselves
|
// just helpers functions that work in this very particular context because we are sending to ourselves
|
||||||
// and hence will always get a response back (i.e. the message we sent)
|
// and hence will always get a response back (i.e. the message we sent)
|
||||||
|
|||||||
@@ -2,19 +2,20 @@
|
|||||||
// SPDX-License-Identifier: Apache-2.0
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
use crate::client::config::template::config_template;
|
use crate::client::config::template::config_template;
|
||||||
use client_core::config::ClientCoreConfigTrait;
|
use nym_client_core::config::ClientCoreConfigTrait;
|
||||||
use config::defaults::DEFAULT_WEBSOCKET_LISTENING_PORT;
|
use nym_config::defaults::DEFAULT_WEBSOCKET_LISTENING_PORT;
|
||||||
use config::{NymConfig, OptionalSet};
|
use nym_config::{NymConfig, OptionalSet};
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
use std::fmt::Debug;
|
use std::fmt::Debug;
|
||||||
use std::net::{IpAddr, Ipv4Addr};
|
use std::net::{IpAddr, Ipv4Addr};
|
||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
use std::str::FromStr;
|
use std::str::FromStr;
|
||||||
|
|
||||||
pub use client_core::config::Config as BaseConfig;
|
pub use nym_client_core::config::Config as BaseConfig;
|
||||||
pub use client_core::config::MISSING_VALUE;
|
pub use nym_client_core::config::MISSING_VALUE;
|
||||||
pub use client_core::config::{DebugConfig, GatewayEndpointConfig};
|
pub use nym_client_core::config::{DebugConfig, GatewayEndpointConfig};
|
||||||
|
|
||||||
|
pub mod old_config_v1_1_13;
|
||||||
mod template;
|
mod template;
|
||||||
|
|
||||||
#[derive(Debug, Deserialize, PartialEq, Eq, Serialize, Clone, Copy)]
|
#[derive(Debug, Deserialize, PartialEq, Eq, Serialize, Clone, Copy)]
|
||||||
@@ -80,7 +81,7 @@ impl NymConfig for Config {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl ClientCoreConfigTrait for Config {
|
impl ClientCoreConfigTrait for Config {
|
||||||
fn get_gateway_endpoint(&self) -> &client_core::config::GatewayEndpointConfig {
|
fn get_gateway_endpoint(&self) -> &nym_client_core::config::GatewayEndpointConfig {
|
||||||
self.base.get_gateway_endpoint()
|
self.base.get_gateway_endpoint()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -93,6 +94,11 @@ impl Config {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn validate(&self) -> bool {
|
||||||
|
// no other sections have explicit requirements (yet)
|
||||||
|
self.base.validate()
|
||||||
|
}
|
||||||
|
|
||||||
pub fn with_socket(mut self, socket_type: SocketType) -> Self {
|
pub fn with_socket(mut self, socket_type: SocketType) -> Self {
|
||||||
self.socket.socket_type = socket_type;
|
self.socket.socket_type = socket_type;
|
||||||
self
|
self
|
||||||
|
|||||||
@@ -0,0 +1,60 @@
|
|||||||
|
// Copyright 2023 - Nym Technologies SA <contact@nymtech.net>
|
||||||
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
|
use crate::client::config::{Config, Socket};
|
||||||
|
use nym_client_core::config::old_config_v1_1_13::OldConfigV1_1_13 as OldBaseConfigV1_1_13;
|
||||||
|
use nym_config::NymConfig;
|
||||||
|
use serde::{Deserialize, Serialize};
|
||||||
|
use std::path::PathBuf;
|
||||||
|
|
||||||
|
#[derive(Debug, Default, Deserialize, PartialEq, Serialize)]
|
||||||
|
#[serde(deny_unknown_fields)]
|
||||||
|
pub struct OldConfigV1_1_13 {
|
||||||
|
#[serde(flatten)]
|
||||||
|
base: OldBaseConfigV1_1_13<OldConfigV1_1_13>,
|
||||||
|
|
||||||
|
socket: Socket,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl NymConfig for OldConfigV1_1_13 {
|
||||||
|
fn template() -> &'static str {
|
||||||
|
// not intended to be used
|
||||||
|
unimplemented!()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn default_root_directory() -> PathBuf {
|
||||||
|
dirs::home_dir()
|
||||||
|
.expect("Failed to evaluate $HOME value")
|
||||||
|
.join(".nym")
|
||||||
|
.join("clients")
|
||||||
|
}
|
||||||
|
|
||||||
|
fn try_default_root_directory() -> Option<PathBuf> {
|
||||||
|
dirs::home_dir().map(|path| path.join(".nym").join("clients"))
|
||||||
|
}
|
||||||
|
|
||||||
|
fn root_directory(&self) -> PathBuf {
|
||||||
|
self.base.client.nym_root_directory.clone()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn config_directory(&self) -> PathBuf {
|
||||||
|
self.root_directory()
|
||||||
|
.join(&self.base.client.id)
|
||||||
|
.join("config")
|
||||||
|
}
|
||||||
|
|
||||||
|
fn data_directory(&self) -> PathBuf {
|
||||||
|
self.root_directory()
|
||||||
|
.join(&self.base.client.id)
|
||||||
|
.join("data")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<OldConfigV1_1_13> for Config {
|
||||||
|
fn from(value: OldConfigV1_1_13) -> Self {
|
||||||
|
Config {
|
||||||
|
base: value.base.into(),
|
||||||
|
socket: value.socket,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -110,10 +110,15 @@ host = '{{ socket.host }}'
|
|||||||
|
|
||||||
[debug]
|
[debug]
|
||||||
|
|
||||||
average_packet_delay = '{{ debug.average_packet_delay }}'
|
[debug.traffic]
|
||||||
average_ack_delay = '{{ debug.average_ack_delay }}'
|
average_packet_delay = '{{ debug.traffic.average_packet_delay }}'
|
||||||
loop_cover_traffic_average_delay = '{{ debug.loop_cover_traffic_average_delay }}'
|
message_sending_average_delay = '{{ debug.traffic.message_sending_average_delay }}'
|
||||||
message_sending_average_delay = '{{ debug.message_sending_average_delay }}'
|
|
||||||
|
[debug.acknowledgements]
|
||||||
|
average_ack_delay = '{{ debug.acknowledgements.average_ack_delay }}'
|
||||||
|
|
||||||
|
[debug.cover_traffic]
|
||||||
|
loop_cover_traffic_average_delay = '{{ debug.cover_traffic.loop_cover_traffic_average_delay }}'
|
||||||
|
|
||||||
"#
|
"#
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,31 +1,33 @@
|
|||||||
// Copyright 2021-2022 - Nym Technologies SA <contact@nymtech.net>
|
// Copyright 2021-2022 - Nym Technologies SA <contact@nymtech.net>
|
||||||
// SPDX-License-Identifier: Apache-2.0
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
use std::error::Error;
|
|
||||||
|
|
||||||
use crate::client::config::Config;
|
use crate::client::config::Config;
|
||||||
use crate::error::ClientError;
|
use crate::error::ClientError;
|
||||||
use crate::websocket;
|
use crate::websocket;
|
||||||
use client_connections::TransmissionLane;
|
use futures::channel::mpsc;
|
||||||
use client_core::client::base_client::{
|
use log::*;
|
||||||
|
use nym_bandwidth_controller::BandwidthController;
|
||||||
|
use nym_client_core::client::base_client::{
|
||||||
non_wasm_helpers, BaseClientBuilder, ClientInput, ClientOutput, ClientState,
|
non_wasm_helpers, BaseClientBuilder, ClientInput, ClientOutput, ClientState,
|
||||||
};
|
};
|
||||||
use client_core::client::inbound_messages::InputMessage;
|
use nym_client_core::client::inbound_messages::InputMessage;
|
||||||
use client_core::client::received_buffer::{
|
use nym_client_core::client::received_buffer::{
|
||||||
ReceivedBufferMessage, ReceivedBufferRequestSender, ReconstructedMessagesReceiver,
|
ReceivedBufferMessage, ReceivedBufferRequestSender, ReconstructedMessagesReceiver,
|
||||||
};
|
};
|
||||||
use client_core::config::persistence::key_pathfinder::ClientKeyPathfinder;
|
use nym_client_core::config::persistence::key_pathfinder::ClientKeyPathfinder;
|
||||||
use futures::channel::mpsc;
|
use nym_sphinx::anonymous_replies::requests::AnonymousSenderTag;
|
||||||
use gateway_client::bandwidth::BandwidthController;
|
use nym_task::connections::TransmissionLane;
|
||||||
use log::*;
|
use nym_task::TaskManager;
|
||||||
use nymsphinx::anonymous_replies::requests::AnonymousSenderTag;
|
use nym_validator_client::nyxd::QueryNyxdClient;
|
||||||
use task::TaskManager;
|
use std::error::Error;
|
||||||
use tokio::sync::watch::error::SendError;
|
use tokio::sync::watch::error::SendError;
|
||||||
use validator_client::nyxd::QueryNyxdClient;
|
|
||||||
|
|
||||||
pub use client_core::client::key_manager::KeyManager;
|
pub use nym_client_core::client::key_manager::KeyManager;
|
||||||
pub use nymsphinx::addressing::clients::Recipient;
|
use nym_credential_storage::persistent_storage::PersistentStorage;
|
||||||
pub use nymsphinx::receiver::ReconstructedMessage;
|
pub use nym_sphinx::addressing::clients::Recipient;
|
||||||
|
pub use nym_sphinx::receiver::ReconstructedMessage;
|
||||||
|
use nym_validator_client::Client;
|
||||||
|
|
||||||
pub mod config;
|
pub mod config;
|
||||||
|
|
||||||
pub struct SocketClient {
|
pub struct SocketClient {
|
||||||
@@ -55,10 +57,13 @@ impl SocketClient {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn create_bandwidth_controller(config: &Config) -> BandwidthController<QueryNyxdClient> {
|
async fn create_bandwidth_controller(
|
||||||
let details = network_defaults::NymNetworkDetails::new_from_env();
|
config: &Config,
|
||||||
let mut client_config = validator_client::Config::try_from_nym_network_details(&details)
|
) -> BandwidthController<Client<QueryNyxdClient>, PersistentStorage> {
|
||||||
.expect("failed to construct validator client config");
|
let details = nym_network_defaults::NymNetworkDetails::new_from_env();
|
||||||
|
let mut client_config =
|
||||||
|
nym_validator_client::Config::try_from_nym_network_details(&details)
|
||||||
|
.expect("failed to construct validator client config");
|
||||||
let nyxd_url = config
|
let nyxd_url = config
|
||||||
.get_base()
|
.get_base()
|
||||||
.get_validator_endpoints()
|
.get_validator_endpoints()
|
||||||
@@ -71,10 +76,13 @@ impl SocketClient {
|
|||||||
.expect("No validator api endpoint provided");
|
.expect("No validator api endpoint provided");
|
||||||
// overwrite env configuration with config URLs
|
// overwrite env configuration with config URLs
|
||||||
client_config = client_config.with_urls(nyxd_url, api_url);
|
client_config = client_config.with_urls(nyxd_url, api_url);
|
||||||
let client = validator_client::Client::new_query(client_config)
|
let client = nym_validator_client::Client::new_query(client_config)
|
||||||
.expect("Could not construct query client");
|
.expect("Could not construct query client");
|
||||||
BandwidthController::new(
|
BandwidthController::new(
|
||||||
credential_storage::initialise_storage(config.get_base().get_database_path()).await,
|
nym_credential_storage::initialise_persistent_storage(
|
||||||
|
config.get_base().get_database_path(),
|
||||||
|
)
|
||||||
|
.await,
|
||||||
client,
|
client,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@@ -85,7 +93,7 @@ impl SocketClient {
|
|||||||
client_output: ClientOutput,
|
client_output: ClientOutput,
|
||||||
client_state: ClientState,
|
client_state: ClientState,
|
||||||
self_address: &Recipient,
|
self_address: &Recipient,
|
||||||
shutdown: task::TaskClient,
|
shutdown: nym_task::TaskClient,
|
||||||
) {
|
) {
|
||||||
info!("Starting websocket listener...");
|
info!("Starting websocket listener...");
|
||||||
|
|
||||||
@@ -101,6 +109,7 @@ impl SocketClient {
|
|||||||
let ClientState {
|
let ClientState {
|
||||||
shared_lane_queue_lengths,
|
shared_lane_queue_lengths,
|
||||||
reply_controller_sender,
|
reply_controller_sender,
|
||||||
|
..
|
||||||
} = client_state;
|
} = client_state;
|
||||||
|
|
||||||
let websocket_handler = websocket::HandlerBuilder::new(
|
let websocket_handler = websocket::HandlerBuilder::new(
|
||||||
|
|||||||
@@ -1,15 +1,18 @@
|
|||||||
// Copyright 2021 - Nym Technologies SA <contact@nymtech.net>
|
// Copyright 2021 - Nym Technologies SA <contact@nymtech.net>
|
||||||
// SPDX-License-Identifier: Apache-2.0
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
|
use crate::commands::try_upgrade_v1_1_13_config;
|
||||||
use crate::{
|
use crate::{
|
||||||
client::config::Config,
|
client::config::Config,
|
||||||
commands::{override_config, OverrideConfig},
|
commands::{override_config, OverrideConfig},
|
||||||
error::ClientError,
|
error::ClientError,
|
||||||
};
|
};
|
||||||
use clap::Args;
|
use clap::Args;
|
||||||
use config::NymConfig;
|
use nym_bin_common::output_format::OutputFormat;
|
||||||
|
use nym_config::NymConfig;
|
||||||
|
use nym_credential_storage::persistent_storage::PersistentStorage;
|
||||||
use nym_crypto::asymmetric::identity;
|
use nym_crypto::asymmetric::identity;
|
||||||
use nymsphinx::addressing::clients::Recipient;
|
use nym_sphinx::addressing::clients::Recipient;
|
||||||
use serde::Serialize;
|
use serde::Serialize;
|
||||||
use std::fmt::Display;
|
use std::fmt::Display;
|
||||||
use std::net::IpAddr;
|
use std::net::IpAddr;
|
||||||
@@ -25,6 +28,11 @@ pub(crate) struct Init {
|
|||||||
#[clap(long)]
|
#[clap(long)]
|
||||||
gateway: Option<identity::PublicKey>,
|
gateway: Option<identity::PublicKey>,
|
||||||
|
|
||||||
|
/// Specifies whether the new gateway should be determined based by latency as opposed to being chosen
|
||||||
|
/// uniformly.
|
||||||
|
#[clap(long, conflicts_with = "gateway")]
|
||||||
|
latency_based_selection: bool,
|
||||||
|
|
||||||
/// Force register gateway. WARNING: this will overwrite any existing keys for the given id,
|
/// Force register gateway. WARNING: this will overwrite any existing keys for the given id,
|
||||||
/// potentially causing loss of access.
|
/// potentially causing loss of access.
|
||||||
#[clap(long)]
|
#[clap(long)]
|
||||||
@@ -65,9 +73,8 @@ pub(crate) struct Init {
|
|||||||
#[clap(long, hide = true)]
|
#[clap(long, hide = true)]
|
||||||
enabled_credentials_mode: Option<bool>,
|
enabled_credentials_mode: Option<bool>,
|
||||||
|
|
||||||
/// Save a summary of the initialization to a json file
|
#[clap(short, long, default_value_t = OutputFormat::default())]
|
||||||
#[clap(long)]
|
output: OutputFormat,
|
||||||
output_json: bool,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<Init> for OverrideConfig {
|
impl From<Init> for OverrideConfig {
|
||||||
@@ -89,15 +96,17 @@ impl From<Init> for OverrideConfig {
|
|||||||
#[derive(Debug, Serialize)]
|
#[derive(Debug, Serialize)]
|
||||||
pub struct InitResults {
|
pub struct InitResults {
|
||||||
#[serde(flatten)]
|
#[serde(flatten)]
|
||||||
client_core: client_core::init::InitResults,
|
client_core: nym_client_core::init::InitResults,
|
||||||
client_listening_port: String,
|
client_listening_port: String,
|
||||||
|
client_address: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl InitResults {
|
impl InitResults {
|
||||||
fn new(config: &Config, address: &Recipient) -> Self {
|
fn new(config: &Config, address: &Recipient) -> Self {
|
||||||
Self {
|
Self {
|
||||||
client_core: client_core::init::InitResults::new(config.get_base(), address),
|
client_core: nym_client_core::init::InitResults::new(config.get_base(), address),
|
||||||
client_listening_port: config.get_listening_port().to_string(),
|
client_listening_port: config.get_listening_port().to_string(),
|
||||||
|
client_address: address.to_string(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -105,25 +114,29 @@ impl InitResults {
|
|||||||
impl Display for InitResults {
|
impl Display for InitResults {
|
||||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||||
writeln!(f, "{}", self.client_core)?;
|
writeln!(f, "{}", self.client_core)?;
|
||||||
write!(f, "Client listening port: {}", self.client_listening_port)
|
writeln!(f, "Client listening port: {}", self.client_listening_port)?;
|
||||||
|
write!(f, "Address of this client: {}", self.client_address)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) async fn execute(args: &Init) -> Result<(), ClientError> {
|
pub(crate) async fn execute(args: &Init) -> Result<(), ClientError> {
|
||||||
println!("Initialising client...");
|
eprintln!("Initialising client...");
|
||||||
|
|
||||||
let id = &args.id;
|
let id = &args.id;
|
||||||
|
|
||||||
let already_init = Config::default_config_file_path(id).exists();
|
let already_init = Config::default_config_file_path(id).exists();
|
||||||
if already_init {
|
if already_init {
|
||||||
println!("Client \"{id}\" was already initialised before");
|
// in case we're using old config, try to upgrade it
|
||||||
|
// (if we're using the current version, it's a no-op)
|
||||||
|
try_upgrade_v1_1_13_config(id)?;
|
||||||
|
eprintln!("Client \"{id}\" was already initialised before");
|
||||||
}
|
}
|
||||||
|
|
||||||
// Usually you only register with the gateway on the first init, however you can force
|
// Usually you only register with the gateway on the first init, however you can force
|
||||||
// re-registering if wanted.
|
// re-registering if wanted.
|
||||||
let user_wants_force_register = args.force_register_gateway;
|
let user_wants_force_register = args.force_register_gateway;
|
||||||
if user_wants_force_register {
|
if user_wants_force_register {
|
||||||
println!("Instructed to force registering gateway. This might overwrite keys!");
|
eprintln!("Instructed to force registering gateway. This might overwrite keys!");
|
||||||
}
|
}
|
||||||
|
|
||||||
// If the client was already initialized, don't generate new keys and don't re-register with
|
// If the client was already initialized, don't generate new keys and don't re-register with
|
||||||
@@ -139,10 +152,11 @@ pub(crate) async fn execute(args: &Init) -> Result<(), ClientError> {
|
|||||||
|
|
||||||
// Setup gateway by either registering a new one, or creating a new config from the selected
|
// Setup gateway by either registering a new one, or creating a new config from the selected
|
||||||
// one but with keys kept, or reusing the gateway configuration.
|
// one but with keys kept, or reusing the gateway configuration.
|
||||||
let gateway = client_core::init::setup_gateway_from_config::<Config, _>(
|
let gateway = nym_client_core::init::setup_gateway_from_config::<Config, _, PersistentStorage>(
|
||||||
register_gateway,
|
register_gateway,
|
||||||
user_chosen_gateway_id,
|
user_chosen_gateway_id,
|
||||||
config.get_base(),
|
config.get_base(),
|
||||||
|
args.latency_based_selection,
|
||||||
)
|
)
|
||||||
.await
|
.await
|
||||||
.tap_err(|err| eprintln!("Failed to setup gateway\nError: {err}"))?;
|
.tap_err(|err| eprintln!("Failed to setup gateway\nError: {err}"))?;
|
||||||
@@ -155,28 +169,22 @@ pub(crate) async fn execute(args: &Init) -> Result<(), ClientError> {
|
|||||||
|
|
||||||
print_saved_config(&config);
|
print_saved_config(&config);
|
||||||
|
|
||||||
let address = client_core::init::get_client_address_from_stored_keys(config.get_base())?;
|
let address = nym_client_core::init::get_client_address_from_stored_keys(config.get_base())?;
|
||||||
let init_results = InitResults::new(&config, &address);
|
let init_results = InitResults::new(&config, &address);
|
||||||
println!("{init_results}");
|
println!("{}", args.output.format(&init_results));
|
||||||
|
|
||||||
// Output summary to a json file, if specified
|
|
||||||
if args.output_json {
|
|
||||||
client_core::init::output_to_json(&init_results, "client_init_results.json");
|
|
||||||
}
|
|
||||||
|
|
||||||
println!("\nThe address of this client is: {address}\n");
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn print_saved_config(config: &Config) {
|
fn print_saved_config(config: &Config) {
|
||||||
let config_save_location = config.get_config_file_save_location();
|
let config_save_location = config.get_config_file_save_location();
|
||||||
println!("Saved configuration file to {config_save_location:?}");
|
eprintln!("Saved configuration file to {config_save_location:?}");
|
||||||
println!("Using gateway: {}", config.get_base().get_gateway_id());
|
eprintln!("Using gateway: {}", config.get_base().get_gateway_id());
|
||||||
log::debug!("Gateway id: {}", config.get_base().get_gateway_id());
|
log::debug!("Gateway id: {}", config.get_base().get_gateway_id());
|
||||||
log::debug!("Gateway owner: {}", config.get_base().get_gateway_owner());
|
log::debug!("Gateway owner: {}", config.get_base().get_gateway_owner());
|
||||||
log::debug!(
|
log::debug!(
|
||||||
"Gateway listener: {}",
|
"Gateway listener: {}",
|
||||||
config.get_base().get_gateway_listener()
|
config.get_base().get_gateway_listener()
|
||||||
);
|
);
|
||||||
println!("Client configuration completed.\n");
|
eprintln!("Client configuration completed.\n");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,13 +1,15 @@
|
|||||||
// 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::client::config::old_config_v1_1_13::OldConfigV1_1_13;
|
||||||
use crate::client::config::{BaseConfig, Config};
|
use crate::client::config::{BaseConfig, Config};
|
||||||
use build_information::BinaryBuildInformation;
|
|
||||||
use clap::CommandFactory;
|
use clap::CommandFactory;
|
||||||
use clap::{Parser, Subcommand};
|
use clap::{Parser, Subcommand};
|
||||||
use completions::{fig_generate, ArgShell};
|
|
||||||
use config::OptionalSet;
|
|
||||||
use lazy_static::lazy_static;
|
use lazy_static::lazy_static;
|
||||||
|
use log::info;
|
||||||
|
use nym_bin_common::build_information::BinaryBuildInformation;
|
||||||
|
use nym_bin_common::completions::{fig_generate, ArgShell};
|
||||||
|
use nym_config::{NymConfig, OptionalSet};
|
||||||
use std::error::Error;
|
use std::error::Error;
|
||||||
use std::net::IpAddr;
|
use std::net::IpAddr;
|
||||||
|
|
||||||
@@ -87,14 +89,14 @@ pub(crate) fn override_config(config: Config, args: OverrideConfig) -> Config {
|
|||||||
.with_optional_custom_env_ext(
|
.with_optional_custom_env_ext(
|
||||||
BaseConfig::with_custom_nym_apis,
|
BaseConfig::with_custom_nym_apis,
|
||||||
args.nym_apis,
|
args.nym_apis,
|
||||||
network_defaults::var_names::NYM_API,
|
nym_network_defaults::var_names::NYM_API,
|
||||||
config::parse_urls,
|
nym_config::parse_urls,
|
||||||
)
|
)
|
||||||
.with_optional_custom_env_ext(
|
.with_optional_custom_env_ext(
|
||||||
BaseConfig::with_custom_nyxd,
|
BaseConfig::with_custom_nyxd,
|
||||||
args.nyxd_urls,
|
args.nyxd_urls,
|
||||||
network_defaults::var_names::NYXD,
|
nym_network_defaults::var_names::NYXD,
|
||||||
config::parse_urls,
|
nym_config::parse_urls,
|
||||||
)
|
)
|
||||||
.with_optional_ext(
|
.with_optional_ext(
|
||||||
BaseConfig::with_disabled_credentials,
|
BaseConfig::with_disabled_credentials,
|
||||||
@@ -102,6 +104,20 @@ pub(crate) fn override_config(config: Config, args: OverrideConfig) -> Config {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn try_upgrade_v1_1_13_config(id: &str) -> std::io::Result<()> {
|
||||||
|
// explicitly load it as v1.1.13 (which is incompatible with the current, i.e. 1.1.14+)
|
||||||
|
let Ok(old_config) = OldConfigV1_1_13::load_from_file(id) else {
|
||||||
|
// if we failed to load it, there might have been nothing to upgrade
|
||||||
|
// or maybe it was an even older file. in either way. just ignore it and carry on with our day
|
||||||
|
return Ok(());
|
||||||
|
};
|
||||||
|
info!("It seems the client is using <= v1.1.13 config template.");
|
||||||
|
info!("It is going to get updated to the current specification.");
|
||||||
|
|
||||||
|
let updated: Config = old_config.into();
|
||||||
|
updated.save_to_file(None)
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
|
|||||||
@@ -4,17 +4,17 @@
|
|||||||
use std::error::Error;
|
use std::error::Error;
|
||||||
use std::net::IpAddr;
|
use std::net::IpAddr;
|
||||||
|
|
||||||
|
use crate::commands::try_upgrade_v1_1_13_config;
|
||||||
use crate::{
|
use crate::{
|
||||||
client::{config::Config, SocketClient},
|
client::{config::Config, SocketClient},
|
||||||
commands::{override_config, OverrideConfig},
|
commands::{override_config, OverrideConfig},
|
||||||
error::ClientError,
|
error::ClientError,
|
||||||
};
|
};
|
||||||
|
|
||||||
use clap::Args;
|
use clap::Args;
|
||||||
use config::NymConfig;
|
|
||||||
use log::*;
|
use log::*;
|
||||||
|
use nym_bin_common::version_checker::is_minor_version_compatible;
|
||||||
|
use nym_config::NymConfig;
|
||||||
use nym_crypto::asymmetric::identity;
|
use nym_crypto::asymmetric::identity;
|
||||||
use version_checker::is_minor_version_compatible;
|
|
||||||
|
|
||||||
#[derive(Args, Clone)]
|
#[derive(Args, Clone)]
|
||||||
pub(crate) struct Run {
|
pub(crate) struct Run {
|
||||||
@@ -100,6 +100,10 @@ fn version_check(cfg: &Config) -> bool {
|
|||||||
pub(crate) async fn execute(args: &Run) -> Result<(), Box<dyn Error + Send + Sync>> {
|
pub(crate) async fn execute(args: &Run) -> Result<(), Box<dyn Error + Send + Sync>> {
|
||||||
let id = &args.id;
|
let id = &args.id;
|
||||||
|
|
||||||
|
// in case we're using old config, try to upgrade it
|
||||||
|
// (if we're using the current version, it's a no-op)
|
||||||
|
try_upgrade_v1_1_13_config(id)?;
|
||||||
|
|
||||||
let mut config = match Config::load_from_file(id) {
|
let mut config = match Config::load_from_file(id) {
|
||||||
Ok(cfg) => cfg,
|
Ok(cfg) => cfg,
|
||||||
Err(err) => {
|
Err(err) => {
|
||||||
@@ -108,6 +112,10 @@ pub(crate) async fn execute(args: &Run) -> Result<(), Box<dyn Error + Send + Syn
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
if !config.validate() {
|
||||||
|
return Err(Box::new(ClientError::ConfigValidationFailure));
|
||||||
|
}
|
||||||
|
|
||||||
let override_config_fields = OverrideConfig::from(args.clone());
|
let override_config_fields = OverrideConfig::from(args.clone());
|
||||||
config = override_config(config, override_config_fields);
|
config = override_config(config, override_config_fields);
|
||||||
|
|
||||||
|
|||||||
@@ -3,8 +3,8 @@
|
|||||||
|
|
||||||
use crate::client::config::{Config, MISSING_VALUE};
|
use crate::client::config::{Config, MISSING_VALUE};
|
||||||
|
|
||||||
use config::NymConfig;
|
use nym_bin_common::version_checker::Version;
|
||||||
use version_checker::Version;
|
use nym_config::NymConfig;
|
||||||
|
|
||||||
use clap::Args;
|
use clap::Args;
|
||||||
use std::fmt::Display;
|
use std::fmt::Display;
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
use client_core::error::ClientCoreError;
|
use nym_client_core::error::ClientCoreError;
|
||||||
|
|
||||||
#[derive(thiserror::Error, Debug)]
|
#[derive(thiserror::Error, Debug)]
|
||||||
pub enum ClientError {
|
pub enum ClientError {
|
||||||
@@ -11,6 +11,10 @@ pub enum ClientError {
|
|||||||
#[error("Failed to load config for: {0}")]
|
#[error("Failed to load config for: {0}")]
|
||||||
FailedToLoadConfig(String),
|
FailedToLoadConfig(String),
|
||||||
|
|
||||||
|
// TODO: add more details here
|
||||||
|
#[error("Failed to validate the loaded config")]
|
||||||
|
ConfigValidationFailure,
|
||||||
|
|
||||||
#[error("Failed local version check, client and config mismatch")]
|
#[error("Failed local version check, client and config mismatch")]
|
||||||
FailedLocalVersionCheck,
|
FailedLocalVersionCheck,
|
||||||
|
|
||||||
|
|||||||
@@ -4,8 +4,8 @@
|
|||||||
use std::error::Error;
|
use std::error::Error;
|
||||||
|
|
||||||
use clap::{crate_name, crate_version, Parser};
|
use clap::{crate_name, crate_version, Parser};
|
||||||
use logging::setup_logging;
|
use nym_bin_common::logging::{maybe_print_banner, setup_logging};
|
||||||
use network_defaults::setup_env;
|
use nym_network_defaults::setup_env;
|
||||||
|
|
||||||
pub mod client;
|
pub mod client;
|
||||||
pub mod commands;
|
pub mod commands;
|
||||||
@@ -15,7 +15,7 @@ pub mod websocket;
|
|||||||
#[tokio::main]
|
#[tokio::main]
|
||||||
async fn main() -> Result<(), Box<dyn Error + Send + Sync>> {
|
async fn main() -> Result<(), Box<dyn Error + Send + Sync>> {
|
||||||
setup_logging();
|
setup_logging();
|
||||||
println!("{}", logging::banner(crate_name!(), crate_version!()));
|
maybe_print_banner(crate_name!(), crate_version!());
|
||||||
|
|
||||||
let args = commands::Cli::parse();
|
let args = commands::Cli::parse();
|
||||||
setup_env(args.config_env_file.as_ref());
|
setup_env(args.config_env_file.as_ref());
|
||||||
|
|||||||
@@ -1,22 +1,23 @@
|
|||||||
// Copyright 2021 - Nym Technologies SA <contact@nymtech.net>
|
// Copyright 2021 - Nym Technologies SA <contact@nymtech.net>
|
||||||
// SPDX-License-Identifier: Apache-2.0
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
use client_connections::{
|
use futures::channel::mpsc;
|
||||||
ConnectionCommand, ConnectionCommandSender, ConnectionId, LaneQueueLengths, TransmissionLane,
|
use futures::{SinkExt, StreamExt};
|
||||||
};
|
use log::*;
|
||||||
use client_core::client::replies::reply_controller::requests::ReplyControllerSender;
|
use nym_client_core::client::replies::reply_controller::requests::ReplyControllerSender;
|
||||||
use client_core::client::{
|
use nym_client_core::client::{
|
||||||
inbound_messages::{InputMessage, InputMessageSender},
|
inbound_messages::{InputMessage, InputMessageSender},
|
||||||
received_buffer::{
|
received_buffer::{
|
||||||
ReceivedBufferMessage, ReceivedBufferRequestSender, ReconstructedMessagesReceiver,
|
ReceivedBufferMessage, ReceivedBufferRequestSender, ReconstructedMessagesReceiver,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
use futures::channel::mpsc;
|
use nym_client_websocket_requests::{requests::ClientRequest, responses::ServerResponse};
|
||||||
use futures::{SinkExt, StreamExt};
|
use nym_sphinx::addressing::clients::Recipient;
|
||||||
use log::*;
|
use nym_sphinx::anonymous_replies::requests::AnonymousSenderTag;
|
||||||
use nymsphinx::addressing::clients::Recipient;
|
use nym_sphinx::receiver::ReconstructedMessage;
|
||||||
use nymsphinx::anonymous_replies::requests::AnonymousSenderTag;
|
use nym_task::connections::{
|
||||||
use nymsphinx::receiver::ReconstructedMessage;
|
ConnectionCommand, ConnectionCommandSender, ConnectionId, LaneQueueLengths, TransmissionLane,
|
||||||
|
};
|
||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
use tokio::net::TcpStream;
|
use tokio::net::TcpStream;
|
||||||
use tokio::time::Instant;
|
use tokio::time::Instant;
|
||||||
@@ -25,7 +26,6 @@ use tokio_tungstenite::{
|
|||||||
tungstenite::{protocol::Message as WsMessage, Error as WsError},
|
tungstenite::{protocol::Message as WsMessage, Error as WsError},
|
||||||
WebSocketStream,
|
WebSocketStream,
|
||||||
};
|
};
|
||||||
use websocket_requests::{requests::ClientRequest, responses::ServerResponse};
|
|
||||||
|
|
||||||
#[derive(Default)]
|
#[derive(Default)]
|
||||||
enum ReceivedResponseType {
|
enum ReceivedResponseType {
|
||||||
@@ -357,7 +357,7 @@ impl Handler {
|
|||||||
async fn listen_for_requests(
|
async fn listen_for_requests(
|
||||||
&mut self,
|
&mut self,
|
||||||
mut msg_receiver: ReconstructedMessagesReceiver,
|
mut msg_receiver: ReconstructedMessagesReceiver,
|
||||||
mut task_client: task::TaskClient,
|
mut task_client: nym_task::TaskClient,
|
||||||
) {
|
) {
|
||||||
while !task_client.is_shutdown() {
|
while !task_client.is_shutdown() {
|
||||||
tokio::select! {
|
tokio::select! {
|
||||||
@@ -410,7 +410,7 @@ impl Handler {
|
|||||||
pub(crate) async fn handle_connection(
|
pub(crate) async fn handle_connection(
|
||||||
mut self,
|
mut self,
|
||||||
socket: TcpStream,
|
socket: TcpStream,
|
||||||
mut task_client: task::TaskClient,
|
mut task_client: nym_task::TaskClient,
|
||||||
) {
|
) {
|
||||||
// We don't want a crash in the connection handler to trigger a shutdown of the whole
|
// We don't want a crash in the connection handler to trigger a shutdown of the whole
|
||||||
// process.
|
// process.
|
||||||
|
|||||||
@@ -32,7 +32,11 @@ impl Listener {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) async fn run(&mut self, handler: HandlerBuilder, mut task_client: task::TaskClient) {
|
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) => {
|
||||||
@@ -103,7 +107,7 @@ impl Listener {
|
|||||||
pub(crate) fn start(
|
pub(crate) fn start(
|
||||||
mut self,
|
mut self,
|
||||||
handler: HandlerBuilder,
|
handler: HandlerBuilder,
|
||||||
shutdown: task::TaskClient,
|
shutdown: nym_task::TaskClient,
|
||||||
) -> JoinHandle<()> {
|
) -> JoinHandle<()> {
|
||||||
info!("Running websocket on {:?}", self.address.to_string());
|
info!("Running websocket on {:?}", self.address.to_string());
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "websocket-requests"
|
name = "nym-client-websocket-requests"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
authors = ["Jędrzej Stuczyński <andrew@nymtech.net>"]
|
authors = ["Jędrzej Stuczyński <andrew@nymtech.net>"]
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
@@ -7,7 +7,7 @@ edition = "2021"
|
|||||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
serde = { version = "1.0", features = ["derive"] }
|
serde = { workspace = true, features = ["derive"] }
|
||||||
serde_json = "1.0"
|
serde_json = { workspace = true }
|
||||||
|
|
||||||
nymsphinx = { path = "../../../common/nymsphinx" }
|
nym-sphinx = { path = "../../../common/nymsphinx" }
|
||||||
|
|||||||
@@ -6,8 +6,8 @@
|
|||||||
|
|
||||||
use crate::error::{self, ErrorKind};
|
use crate::error::{self, ErrorKind};
|
||||||
use crate::text::ClientRequestText;
|
use crate::text::ClientRequestText;
|
||||||
use nymsphinx::addressing::clients::Recipient;
|
use nym_sphinx::addressing::clients::Recipient;
|
||||||
use nymsphinx::anonymous_replies::requests::{AnonymousSenderTag, SENDER_TAG_SIZE};
|
use nym_sphinx::anonymous_replies::requests::{AnonymousSenderTag, SENDER_TAG_SIZE};
|
||||||
use std::convert::{TryFrom, TryInto};
|
use std::convert::{TryFrom, TryInto};
|
||||||
use std::mem::size_of;
|
use std::mem::size_of;
|
||||||
|
|
||||||
|
|||||||
@@ -6,9 +6,9 @@
|
|||||||
|
|
||||||
use crate::error::{self, ErrorKind};
|
use crate::error::{self, ErrorKind};
|
||||||
use crate::text::ServerResponseText;
|
use crate::text::ServerResponseText;
|
||||||
use nymsphinx::addressing::clients::Recipient;
|
use nym_sphinx::addressing::clients::Recipient;
|
||||||
use nymsphinx::anonymous_replies::requests::{AnonymousSenderTag, SENDER_TAG_SIZE};
|
use nym_sphinx::anonymous_replies::requests::{AnonymousSenderTag, SENDER_TAG_SIZE};
|
||||||
use nymsphinx::receiver::ReconstructedMessage;
|
use nym_sphinx::receiver::ReconstructedMessage;
|
||||||
use std::convert::TryInto;
|
use std::convert::TryInto;
|
||||||
use std::mem::size_of;
|
use std::mem::size_of;
|
||||||
|
|
||||||
|
|||||||
@@ -4,8 +4,8 @@
|
|||||||
use crate::error::ErrorKind;
|
use crate::error::ErrorKind;
|
||||||
use crate::requests::ClientRequest;
|
use crate::requests::ClientRequest;
|
||||||
use crate::responses::ServerResponse;
|
use crate::responses::ServerResponse;
|
||||||
use nymsphinx::addressing::clients::Recipient;
|
use nym_sphinx::addressing::clients::Recipient;
|
||||||
use nymsphinx::anonymous_replies::requests::AnonymousSenderTag;
|
use nym_sphinx::anonymous_replies::requests::AnonymousSenderTag;
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
use std::convert::{TryFrom, TryInto};
|
use std::convert::{TryFrom, TryInto};
|
||||||
|
|
||||||
|
|||||||
+14
-33
@@ -1,24 +1,16 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "nym-socks5-client"
|
name = "nym-socks5-client"
|
||||||
version = "1.1.10"
|
version = "1.1.15"
|
||||||
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"
|
||||||
rust-version = "1.56"
|
rust-version = "1.56"
|
||||||
|
|
||||||
[lib]
|
|
||||||
name = "nym_socks5"
|
|
||||||
path = "src/lib.rs"
|
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
clap = { version = "4.0", features = ["cargo", "derive"] }
|
clap = { version = "4.0", features = ["cargo", "derive"] }
|
||||||
dirs = "4.0"
|
|
||||||
futures = "0.3"
|
|
||||||
lazy_static = "1.4.0"
|
lazy_static = "1.4.0"
|
||||||
log = { workspace = true }
|
log = { workspace = true }
|
||||||
pin-project = "1.0"
|
|
||||||
pretty_env_logger = "0.4"
|
pretty_env_logger = "0.4"
|
||||||
rand = { version = "0.7.3", features = ["wasm-bindgen"] }
|
|
||||||
serde = { workspace = true, features = ["derive"] } # for config serialization/deserialization
|
serde = { workspace = true, features = ["derive"] } # for config serialization/deserialization
|
||||||
serde_json = { workspace = true }
|
serde_json = { workspace = true }
|
||||||
tap = "1.0.1"
|
tap = "1.0.1"
|
||||||
@@ -27,32 +19,21 @@ tokio = { version = "1.24.1", features = ["rt-multi-thread", "net", "signal"] }
|
|||||||
url = "2.2"
|
url = "2.2"
|
||||||
|
|
||||||
# internal
|
# internal
|
||||||
build-information = { path = "../../common/build-information" }
|
nym-bin-common = { path = "../../common/bin-common", features = ["output_format"] }
|
||||||
client-core = { path = "../client-core", features = ["fs-surb-storage"] }
|
nym-client-core = { path = "../../common/client-core", features = ["fs-surb-storage"] }
|
||||||
client-connections = { path = "../../common/client-connections" }
|
nym-coconut-interface = { path = "../../common/coconut-interface" }
|
||||||
coconut-interface = { path = "../../common/coconut-interface" }
|
nym-config = { path = "../../common/config" }
|
||||||
config = { path = "../../common/config" }
|
nym-credentials = { path = "../../common/credentials" }
|
||||||
completions = { path = "../../common/completions" }
|
|
||||||
credential-storage = { path = "../../common/credential-storage", optional = true }
|
|
||||||
mobile-storage = { path = "../../common/mobile-storage", optional = true }
|
|
||||||
credentials = { path = "../../common/credentials" }
|
|
||||||
nym-crypto = { path = "../../common/crypto" }
|
nym-crypto = { path = "../../common/crypto" }
|
||||||
logging = { path = "../../common/logging"}
|
nym-gateway-requests = { path = "../../gateway/gateway-requests" }
|
||||||
gateway-client = { path = "../../common/client-libs/gateway-client" }
|
nym-credential-storage = { path = "../../common/credential-storage" }
|
||||||
gateway-requests = { path = "../../gateway/gateway-requests" }
|
nym-network-defaults = { path = "../../common/network-defaults" }
|
||||||
network-defaults = { path = "../../common/network-defaults" }
|
nym-sphinx = { path = "../../common/nymsphinx" }
|
||||||
nymsphinx = { path = "../../common/nymsphinx" }
|
nym-ordered-buffer = { path = "../../common/socks5/ordered-buffer" }
|
||||||
ordered-buffer = { path = "../../common/socks5/ordered-buffer" }
|
|
||||||
nym-pemstore = { path = "../../common/pemstore" }
|
nym-pemstore = { path = "../../common/pemstore" }
|
||||||
proxy-helpers = { path = "../../common/socks5/proxy-helpers" }
|
nym-topology = { path = "../../common/topology" }
|
||||||
service-providers-common = { path = "../../service-providers/common" }
|
nym-socks5-client-core = { path = "../../common/socks5-client-core" }
|
||||||
socks5-requests = { path = "../../common/socks5/requests" }
|
|
||||||
task = { path = "../../common/task" }
|
|
||||||
topology = { path = "../../common/topology" }
|
|
||||||
validator-client = { path = "../../common/client-libs/validator-client", features = ["nyxd-client"] }
|
|
||||||
version-checker = { path = "../../common/version-checker" }
|
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
default = ["credential-storage"]
|
default = []
|
||||||
eth = []
|
eth = []
|
||||||
mobile = ["mobile-storage", "gateway-client/mobile"]
|
|
||||||
|
|||||||
@@ -1,15 +1,18 @@
|
|||||||
// Copyright 2021 - 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::try_upgrade_v1_1_13_config;
|
||||||
use crate::{
|
use crate::{
|
||||||
client::config::Config,
|
|
||||||
commands::{override_config, OverrideConfig},
|
commands::{override_config, OverrideConfig},
|
||||||
error::Socks5ClientError,
|
error::Socks5ClientError,
|
||||||
};
|
};
|
||||||
use clap::Args;
|
use clap::Args;
|
||||||
use config::NymConfig;
|
use nym_bin_common::output_format::OutputFormat;
|
||||||
|
use nym_config::NymConfig;
|
||||||
|
use nym_credential_storage::persistent_storage::PersistentStorage;
|
||||||
use nym_crypto::asymmetric::identity;
|
use nym_crypto::asymmetric::identity;
|
||||||
use nymsphinx::addressing::clients::Recipient;
|
use nym_socks5_client_core::config::Config;
|
||||||
|
use nym_sphinx::addressing::clients::Recipient;
|
||||||
use serde::Serialize;
|
use serde::Serialize;
|
||||||
use std::fmt::Display;
|
use std::fmt::Display;
|
||||||
use tap::TapFallible;
|
use tap::TapFallible;
|
||||||
@@ -37,6 +40,11 @@ pub(crate) struct Init {
|
|||||||
#[clap(long)]
|
#[clap(long)]
|
||||||
gateway: Option<identity::PublicKey>,
|
gateway: Option<identity::PublicKey>,
|
||||||
|
|
||||||
|
/// Specifies whether the new gateway should be determined based by latency as opposed to being chosen
|
||||||
|
/// uniformly.
|
||||||
|
#[clap(long, conflicts_with = "gateway")]
|
||||||
|
latency_based_selection: bool,
|
||||||
|
|
||||||
/// Force register gateway. WARNING: this will overwrite any existing keys for the given id,
|
/// Force register gateway. WARNING: this will overwrite any existing keys for the given id,
|
||||||
/// potentially causing loss of access.
|
/// potentially causing loss of access.
|
||||||
#[clap(long)]
|
#[clap(long)]
|
||||||
@@ -69,9 +77,8 @@ pub(crate) struct Init {
|
|||||||
#[clap(long, hide = true)]
|
#[clap(long, hide = true)]
|
||||||
enabled_credentials_mode: Option<bool>,
|
enabled_credentials_mode: Option<bool>,
|
||||||
|
|
||||||
/// Save a summary of the initialization to a json file
|
#[clap(short, long, default_value_t = OutputFormat::default())]
|
||||||
#[clap(long)]
|
output: OutputFormat,
|
||||||
output_json: bool,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<Init> for OverrideConfig {
|
impl From<Init> for OverrideConfig {
|
||||||
@@ -91,15 +98,17 @@ impl From<Init> for OverrideConfig {
|
|||||||
#[derive(Debug, Serialize)]
|
#[derive(Debug, Serialize)]
|
||||||
pub struct InitResults {
|
pub struct InitResults {
|
||||||
#[serde(flatten)]
|
#[serde(flatten)]
|
||||||
client_core: client_core::init::InitResults,
|
client_core: nym_client_core::init::InitResults,
|
||||||
socks5_listening_port: String,
|
socks5_listening_port: String,
|
||||||
|
client_address: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl InitResults {
|
impl InitResults {
|
||||||
fn new(config: &Config, address: &Recipient) -> Self {
|
fn new(config: &Config, address: &Recipient) -> Self {
|
||||||
Self {
|
Self {
|
||||||
client_core: client_core::init::InitResults::new(config.get_base(), address),
|
client_core: nym_client_core::init::InitResults::new(config.get_base(), address),
|
||||||
socks5_listening_port: config.get_listening_port().to_string(),
|
socks5_listening_port: config.get_socks5().get_listening_port().to_string(),
|
||||||
|
client_address: address.to_string(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -107,26 +116,30 @@ impl InitResults {
|
|||||||
impl Display for InitResults {
|
impl Display for InitResults {
|
||||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||||
writeln!(f, "{}", self.client_core)?;
|
writeln!(f, "{}", self.client_core)?;
|
||||||
write!(f, "SOCKS5 listening port: {}", self.socks5_listening_port)
|
writeln!(f, "SOCKS5 listening port: {}", self.socks5_listening_port)?;
|
||||||
|
write!(f, "Address of this client: {}", self.client_address)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) async fn execute(args: &Init) -> Result<(), Socks5ClientError> {
|
pub(crate) async fn execute(args: &Init) -> Result<(), Socks5ClientError> {
|
||||||
println!("Initialising client...");
|
eprintln!("Initialising client...");
|
||||||
|
|
||||||
let id = &args.id;
|
let id = &args.id;
|
||||||
let provider_address = &args.provider;
|
let provider_address = &args.provider;
|
||||||
|
|
||||||
let already_init = Config::default_config_file_path(id).exists();
|
let already_init = Config::default_config_file_path(id).exists();
|
||||||
if already_init {
|
if already_init {
|
||||||
println!("SOCKS5 client \"{id}\" was already initialised before");
|
// in case we're using old config, try to upgrade it
|
||||||
|
// (if we're using the current version, it's a no-op)
|
||||||
|
try_upgrade_v1_1_13_config(id)?;
|
||||||
|
eprintln!("SOCKS5 client \"{id}\" was already initialised before");
|
||||||
}
|
}
|
||||||
|
|
||||||
// Usually you only register with the gateway on the first init, however you can force
|
// Usually you only register with the gateway on the first init, however you can force
|
||||||
// re-registering if wanted.
|
// re-registering if wanted.
|
||||||
let user_wants_force_register = args.force_register_gateway;
|
let user_wants_force_register = args.force_register_gateway;
|
||||||
if user_wants_force_register {
|
if user_wants_force_register {
|
||||||
println!("Instructed to force registering gateway. This might overwrite keys!");
|
eprintln!("Instructed to force registering gateway. This might overwrite keys!");
|
||||||
}
|
}
|
||||||
|
|
||||||
// If the client was already initialized, don't generate new keys and don't re-register with
|
// If the client was already initialized, don't generate new keys and don't re-register with
|
||||||
@@ -145,10 +158,11 @@ pub(crate) async fn execute(args: &Init) -> Result<(), Socks5ClientError> {
|
|||||||
|
|
||||||
// Setup gateway by either registering a new one, or creating a new config from the selected
|
// Setup gateway by either registering a new one, or creating a new config from the selected
|
||||||
// one but with keys kept, or reusing the gateway configuration.
|
// one but with keys kept, or reusing the gateway configuration.
|
||||||
let gateway = client_core::init::setup_gateway_from_config::<Config, _>(
|
let gateway = nym_client_core::init::setup_gateway_from_config::<Config, _, PersistentStorage>(
|
||||||
register_gateway,
|
register_gateway,
|
||||||
user_chosen_gateway_id,
|
user_chosen_gateway_id,
|
||||||
config.get_base(),
|
config.get_base(),
|
||||||
|
args.latency_based_selection,
|
||||||
)
|
)
|
||||||
.await
|
.await
|
||||||
.tap_err(|err| eprintln!("Failed to setup gateway\nError: {err}"))?;
|
.tap_err(|err| eprintln!("Failed to setup gateway\nError: {err}"))?;
|
||||||
@@ -163,28 +177,22 @@ pub(crate) async fn execute(args: &Init) -> Result<(), Socks5ClientError> {
|
|||||||
|
|
||||||
print_saved_config(&config);
|
print_saved_config(&config);
|
||||||
|
|
||||||
let address = client_core::init::get_client_address_from_stored_keys(config.get_base())?;
|
let address = nym_client_core::init::get_client_address_from_stored_keys(config.get_base())?;
|
||||||
let init_results = InitResults::new(&config, &address);
|
let init_results = InitResults::new(&config, &address);
|
||||||
println!("{}", init_results);
|
println!("{}", args.output.format(&init_results));
|
||||||
|
|
||||||
// Output summary to a json file, if specified
|
|
||||||
if args.output_json {
|
|
||||||
client_core::init::output_to_json(&init_results, "socks5_client_init_results.json");
|
|
||||||
}
|
|
||||||
|
|
||||||
println!("\nThe address of this client is: {}\n", address);
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn print_saved_config(config: &Config) {
|
fn print_saved_config(config: &Config) {
|
||||||
let config_save_location = config.get_config_file_save_location();
|
let config_save_location = config.get_config_file_save_location();
|
||||||
println!("Saved configuration file to {:?}", config_save_location);
|
eprintln!("Saved configuration file to {:?}", config_save_location);
|
||||||
println!("Using gateway: {}", config.get_base().get_gateway_id());
|
eprintln!("Using gateway: {}", config.get_base().get_gateway_id());
|
||||||
log::debug!("Gateway id: {}", config.get_base().get_gateway_id());
|
log::debug!("Gateway id: {}", config.get_base().get_gateway_id());
|
||||||
log::debug!("Gateway owner: {}", config.get_base().get_gateway_owner());
|
log::debug!("Gateway owner: {}", config.get_base().get_gateway_owner());
|
||||||
log::debug!(
|
log::debug!(
|
||||||
"Gateway listener: {}",
|
"Gateway listener: {}",
|
||||||
config.get_base().get_gateway_listener()
|
config.get_base().get_gateway_listener()
|
||||||
);
|
);
|
||||||
println!("Client configuration completed.\n");
|
eprintln!("Client configuration completed.\n");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,13 +1,15 @@
|
|||||||
// 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::client::config::{BaseConfig, Config};
|
|
||||||
use build_information::BinaryBuildInformation;
|
|
||||||
use clap::CommandFactory;
|
use clap::CommandFactory;
|
||||||
use clap::{Parser, Subcommand};
|
use clap::{Parser, Subcommand};
|
||||||
use completions::{fig_generate, ArgShell};
|
|
||||||
use config::OptionalSet;
|
|
||||||
use lazy_static::lazy_static;
|
use lazy_static::lazy_static;
|
||||||
|
use log::info;
|
||||||
|
use nym_bin_common::build_information::BinaryBuildInformation;
|
||||||
|
use nym_bin_common::completions::{fig_generate, ArgShell};
|
||||||
|
use nym_config::{NymConfig, OptionalSet};
|
||||||
|
use nym_socks5_client_core::config::old_config_v1_1_13::OldConfigV1_1_13;
|
||||||
|
use nym_socks5_client_core::config::{BaseConfig, Config};
|
||||||
use std::error::Error;
|
use std::error::Error;
|
||||||
|
|
||||||
pub mod init;
|
pub mod init;
|
||||||
@@ -86,14 +88,14 @@ pub(crate) fn override_config(config: Config, args: OverrideConfig) -> Config {
|
|||||||
.with_optional_custom_env_ext(
|
.with_optional_custom_env_ext(
|
||||||
BaseConfig::with_custom_nym_apis,
|
BaseConfig::with_custom_nym_apis,
|
||||||
args.nym_apis,
|
args.nym_apis,
|
||||||
network_defaults::var_names::NYM_API,
|
nym_network_defaults::var_names::NYM_API,
|
||||||
config::parse_urls,
|
nym_config::parse_urls,
|
||||||
)
|
)
|
||||||
.with_optional_custom_env_ext(
|
.with_optional_custom_env_ext(
|
||||||
BaseConfig::with_custom_nyxd,
|
BaseConfig::with_custom_nyxd,
|
||||||
args.nyxd_urls,
|
args.nyxd_urls,
|
||||||
network_defaults::var_names::NYXD,
|
nym_network_defaults::var_names::NYXD,
|
||||||
config::parse_urls,
|
nym_config::parse_urls,
|
||||||
)
|
)
|
||||||
.with_optional_ext(
|
.with_optional_ext(
|
||||||
BaseConfig::with_disabled_credentials,
|
BaseConfig::with_disabled_credentials,
|
||||||
@@ -101,6 +103,20 @@ pub(crate) fn override_config(config: Config, args: OverrideConfig) -> Config {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn try_upgrade_v1_1_13_config(id: &str) -> std::io::Result<()> {
|
||||||
|
// explicitly load it as v1.1.13 (which is incompatible with the current, i.e. 1.1.14+)
|
||||||
|
let Ok(old_config) = OldConfigV1_1_13::load_from_file(id) else {
|
||||||
|
// if we failed to load it, there might have been nothing to upgrade
|
||||||
|
// or maybe it was an even older file. in either way. just ignore it and carry on with our day
|
||||||
|
return Ok(());
|
||||||
|
};
|
||||||
|
info!("It seems the client is using <= v1.1.13 config template.");
|
||||||
|
info!("It is going to get updated to the current specification.");
|
||||||
|
|
||||||
|
let updated: Config = old_config.into();
|
||||||
|
updated.save_to_file(None)
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
|
|||||||
@@ -1,18 +1,18 @@
|
|||||||
// Copyright 2021 - Nym Technologies SA <contact@nymtech.net>
|
// Copyright 2021 - Nym Technologies SA <contact@nymtech.net>
|
||||||
// SPDX-License-Identifier: Apache-2.0
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
|
use crate::commands::try_upgrade_v1_1_13_config;
|
||||||
use crate::{
|
use crate::{
|
||||||
client::{config::Config, NymClient},
|
|
||||||
commands::{override_config, OverrideConfig},
|
commands::{override_config, OverrideConfig},
|
||||||
error::Socks5ClientError,
|
error::Socks5ClientError,
|
||||||
};
|
};
|
||||||
|
|
||||||
use clap::Args;
|
use clap::Args;
|
||||||
use config::NymConfig;
|
|
||||||
use log::*;
|
use log::*;
|
||||||
|
use nym_bin_common::version_checker::is_minor_version_compatible;
|
||||||
|
use nym_config::NymConfig;
|
||||||
use nym_crypto::asymmetric::identity;
|
use nym_crypto::asymmetric::identity;
|
||||||
use nymsphinx::addressing::clients::Recipient;
|
use nym_socks5_client_core::{config::Config, NymClient};
|
||||||
use version_checker::is_minor_version_compatible;
|
use nym_sphinx::addressing::clients::Recipient;
|
||||||
|
|
||||||
#[derive(Args, Clone)]
|
#[derive(Args, Clone)]
|
||||||
pub(crate) struct Run {
|
pub(crate) struct Run {
|
||||||
@@ -108,6 +108,10 @@ fn version_check(cfg: &Config) -> bool {
|
|||||||
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>> {
|
||||||
let id = &args.id;
|
let id = &args.id;
|
||||||
|
|
||||||
|
// in case we're using old config, try to upgrade it
|
||||||
|
// (if we're using the current version, it's a no-op)
|
||||||
|
try_upgrade_v1_1_13_config(id)?;
|
||||||
|
|
||||||
let mut config = match Config::load_from_file(id) {
|
let mut config = match Config::load_from_file(id) {
|
||||||
Ok(cfg) => cfg,
|
Ok(cfg) => cfg,
|
||||||
Err(err) => {
|
Err(err) => {
|
||||||
@@ -118,6 +122,10 @@ pub(crate) async fn execute(args: &Run) -> Result<(), Box<dyn std::error::Error
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
if !config.validate() {
|
||||||
|
return Err(Box::new(Socks5ClientError::ConfigValidationFailure));
|
||||||
|
}
|
||||||
|
|
||||||
let override_config_fields = OverrideConfig::from(args.clone());
|
let override_config_fields = OverrideConfig::from(args.clone());
|
||||||
config = override_config(config, override_config_fields);
|
config = override_config(config, override_config_fields);
|
||||||
|
|
||||||
|
|||||||
@@ -1,10 +1,9 @@
|
|||||||
// Copyright 2021 - Nym Technologies SA <contact@nymtech.net>
|
// Copyright 2021 - Nym Technologies SA <contact@nymtech.net>
|
||||||
// SPDX-License-Identifier: Apache-2.0
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
use crate::client::config::{Config, MISSING_VALUE};
|
use nym_bin_common::version_checker::Version;
|
||||||
|
use nym_config::NymConfig;
|
||||||
use config::NymConfig;
|
use nym_socks5_client_core::config::{Config, MISSING_VALUE};
|
||||||
use version_checker::Version;
|
|
||||||
|
|
||||||
use clap::Args;
|
use clap::Args;
|
||||||
use std::{fmt::Display, process};
|
use std::{fmt::Display, process};
|
||||||
|
|||||||
@@ -1,39 +1,23 @@
|
|||||||
use crate::socks::types::SocksProxyError;
|
use nym_client_core::error::ClientCoreError;
|
||||||
use client_core::error::ClientCoreError;
|
|
||||||
use socks5_requests::{ConnectionError, ConnectionId};
|
|
||||||
|
|
||||||
#[derive(thiserror::Error, Debug)]
|
#[derive(thiserror::Error, Debug)]
|
||||||
pub enum Socks5ClientError {
|
pub enum Socks5ClientError {
|
||||||
#[error("I/O error: {0}")]
|
#[error("I/O error: {0}")]
|
||||||
IoError(#[from] std::io::Error),
|
IoError(#[from] std::io::Error),
|
||||||
|
|
||||||
#[error("client-core error: {0}")]
|
|
||||||
ClientCoreError(#[from] ClientCoreError),
|
|
||||||
|
|
||||||
#[error("SOCKS proxy error")]
|
|
||||||
SocksProxyError(SocksProxyError),
|
|
||||||
|
|
||||||
#[error("Failed to load config for: {0}")]
|
#[error("Failed to load config for: {0}")]
|
||||||
FailedToLoadConfig(String),
|
FailedToLoadConfig(String),
|
||||||
|
|
||||||
|
// TODO: add more details here
|
||||||
|
#[error("Failed to validate the loaded config")]
|
||||||
|
ConfigValidationFailure,
|
||||||
|
|
||||||
#[error("Failed local version check, client and config mismatch")]
|
#[error("Failed local version check, client and config mismatch")]
|
||||||
FailedLocalVersionCheck,
|
FailedLocalVersionCheck,
|
||||||
|
|
||||||
#[error("Fail to bind address")]
|
#[error("Fail to bind address")]
|
||||||
FailToBindAddress,
|
FailToBindAddress,
|
||||||
|
|
||||||
#[error("Network requester: connection id {connection_id}: {error}")]
|
#[error("client-core error: {0}")]
|
||||||
NetworkRequesterError {
|
ClientCoreError(#[from] ClientCoreError),
|
||||||
connection_id: ConnectionId,
|
|
||||||
error: String,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<ConnectionError> for Socks5ClientError {
|
|
||||||
fn from(value: ConnectionError) -> Self {
|
|
||||||
Socks5ClientError::NetworkRequesterError {
|
|
||||||
connection_id: value.connection_id,
|
|
||||||
error: value.network_requester_error,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +0,0 @@
|
|||||||
// Copyright 2021 - Nym Technologies SA <contact@nymtech.net>
|
|
||||||
// SPDX-License-Identifier: Apache-2.0
|
|
||||||
|
|
||||||
pub mod client;
|
|
||||||
pub mod error;
|
|
||||||
pub mod socks;
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user