Compare commits
15 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| b2d77aedd3 | |||
| 58dcf2171c | |||
| a6ad6c7d49 | |||
| cbc977c491 | |||
| f40c05a34c | |||
| 776443131e | |||
| b5eab7f07f | |||
| eeeb4b3246 | |||
| e3e4dc6db9 | |||
| 461b7bcfb7 | |||
| bbf0d06583 | |||
| 6393d6093f | |||
| c0ea599913 | |||
| 16d09a35ba | |||
| e6c5eddbe5 |
@@ -4,6 +4,38 @@ Post 1.0.0 release, the changelog format is based on [Keep a Changelog](https://
|
|||||||
|
|
||||||
## [Unreleased]
|
## [Unreleased]
|
||||||
|
|
||||||
|
## [2024.10-caramello] (2024-08-19)
|
||||||
|
|
||||||
|
- bugfix: make sure DKG parses data out of events if logs are empty ([#4764])
|
||||||
|
- Fix clippy on rustc beta toolchain ([#4746])
|
||||||
|
- Fix clippy for beta toolchain ([#4742])
|
||||||
|
- Disable testnet-manager on non-unix ([#4741])
|
||||||
|
- Don't set NYM_VPN_API to default ([#4740])
|
||||||
|
- Update publish-nym-binaries.yml ([#4739])
|
||||||
|
- Update ci-build-upload-binaries.yml ([#4738])
|
||||||
|
- Add NYM_VPN_API to network config ([#4736])
|
||||||
|
- Re-export RecipientFormattingError in nym sdk ([#4735])
|
||||||
|
- Persist wireguard peers ([#4732])
|
||||||
|
- Fix tokio error in 1.39 ([#4730])
|
||||||
|
- Feature/vesting purge plus ranged cost params ([#4716])
|
||||||
|
- Fix (some) feature unification build failures ([#4681])
|
||||||
|
- Feature Compact Ecash : The One PR ([#4623])
|
||||||
|
|
||||||
|
[#4764]: https://github.com/nymtech/nym/pull/4764
|
||||||
|
[#4746]: https://github.com/nymtech/nym/pull/4746
|
||||||
|
[#4742]: https://github.com/nymtech/nym/pull/4742
|
||||||
|
[#4741]: https://github.com/nymtech/nym/pull/4741
|
||||||
|
[#4740]: https://github.com/nymtech/nym/pull/4740
|
||||||
|
[#4739]: https://github.com/nymtech/nym/pull/4739
|
||||||
|
[#4738]: https://github.com/nymtech/nym/pull/4738
|
||||||
|
[#4736]: https://github.com/nymtech/nym/pull/4736
|
||||||
|
[#4735]: https://github.com/nymtech/nym/pull/4735
|
||||||
|
[#4732]: https://github.com/nymtech/nym/pull/4732
|
||||||
|
[#4730]: https://github.com/nymtech/nym/pull/4730
|
||||||
|
[#4716]: https://github.com/nymtech/nym/pull/4716
|
||||||
|
[#4681]: https://github.com/nymtech/nym/pull/4681
|
||||||
|
[#4623]: https://github.com/nymtech/nym/pull/4623
|
||||||
|
|
||||||
## [2024.9-topdeck] (2024-07-26)
|
## [2024.9-topdeck] (2024-07-26)
|
||||||
|
|
||||||
- chore: fix 1.80 lint issues ([#4731])
|
- chore: fix 1.80 lint issues ([#4731])
|
||||||
|
|||||||
Generated
+82
-220
@@ -332,15 +332,6 @@ dependencies = [
|
|||||||
"winapi",
|
"winapi",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "autocfg"
|
|
||||||
version = "0.1.8"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "0dde43e75fd43e8a1bf86103336bc699aa8d17ad1be60c76c0bdfd4828e19b78"
|
|
||||||
dependencies = [
|
|
||||||
"autocfg 1.3.0",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "autocfg"
|
name = "autocfg"
|
||||||
version = "1.3.0"
|
version = "1.3.0"
|
||||||
@@ -553,7 +544,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||||||
checksum = "93f2635620bf0b9d4576eb7bb9a38a55df78bd1205d26fa994b25911a69f212f"
|
checksum = "93f2635620bf0b9d4576eb7bb9a38a55df78bd1205d26fa994b25911a69f212f"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bitcoin_hashes",
|
"bitcoin_hashes",
|
||||||
"rand 0.8.5",
|
"rand",
|
||||||
"rand_core 0.6.4",
|
"rand_core 0.6.4",
|
||||||
"serde",
|
"serde",
|
||||||
"unicode-normalization",
|
"unicode-normalization",
|
||||||
@@ -994,15 +985,6 @@ version = "0.7.1"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "4b82cf0babdbd58558212896d1a4272303a57bdb245c2bf1147185fb45640e70"
|
checksum = "4b82cf0babdbd58558212896d1a4272303a57bdb245c2bf1147185fb45640e70"
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "cloudabi"
|
|
||||||
version = "0.0.3"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f"
|
|
||||||
dependencies = [
|
|
||||||
"bitflags 1.3.2",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "colorchoice"
|
name = "colorchoice"
|
||||||
version = "1.0.1"
|
version = "1.0.1"
|
||||||
@@ -2240,7 +2222,7 @@ checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "explorer-api"
|
name = "explorer-api"
|
||||||
version = "1.1.38"
|
version = "1.1.39"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"chrono",
|
"chrono",
|
||||||
"clap 4.5.7",
|
"clap 4.5.7",
|
||||||
@@ -2259,8 +2241,8 @@ dependencies = [
|
|||||||
"nym-validator-client",
|
"nym-validator-client",
|
||||||
"okapi",
|
"okapi",
|
||||||
"pretty_env_logger",
|
"pretty_env_logger",
|
||||||
"rand 0.8.5",
|
"rand",
|
||||||
"rand_pcg 0.3.1",
|
"rand_pcg",
|
||||||
"rand_seeder",
|
"rand_seeder",
|
||||||
"reqwest 0.12.4",
|
"reqwest 0.12.4",
|
||||||
"rocket",
|
"rocket",
|
||||||
@@ -2459,12 +2441,6 @@ dependencies = [
|
|||||||
"libc",
|
"libc",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "fuchsia-cprng"
|
|
||||||
version = "0.1.1"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba"
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "funty"
|
name = "funty"
|
||||||
version = "2.0.0"
|
version = "2.0.0"
|
||||||
@@ -3345,7 +3321,7 @@ version = "1.9.3"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99"
|
checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"autocfg 1.3.0",
|
"autocfg",
|
||||||
"hashbrown 0.12.3",
|
"hashbrown 0.12.3",
|
||||||
"serde",
|
"serde",
|
||||||
]
|
]
|
||||||
@@ -3760,7 +3736,7 @@ version = "0.4.12"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17"
|
checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"autocfg 1.3.0",
|
"autocfg",
|
||||||
"scopeguard",
|
"scopeguard",
|
||||||
]
|
]
|
||||||
|
|
||||||
@@ -3887,7 +3863,7 @@ version = "0.9.1"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a"
|
checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"autocfg 1.3.0",
|
"autocfg",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@@ -3957,7 +3933,7 @@ dependencies = [
|
|||||||
"nym-ordered-buffer",
|
"nym-ordered-buffer",
|
||||||
"nym-service-providers-common",
|
"nym-service-providers-common",
|
||||||
"nym-socks5-requests",
|
"nym-socks5-requests",
|
||||||
"rand 0.8.5",
|
"rand",
|
||||||
"serde",
|
"serde",
|
||||||
"serde-wasm-bindgen 0.6.5",
|
"serde-wasm-bindgen 0.6.5",
|
||||||
"thiserror",
|
"thiserror",
|
||||||
@@ -4173,7 +4149,7 @@ version = "0.2.19"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841"
|
checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"autocfg 1.3.0",
|
"autocfg",
|
||||||
"libm",
|
"libm",
|
||||||
]
|
]
|
||||||
|
|
||||||
@@ -4204,7 +4180,7 @@ checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "nym-api"
|
name = "nym-api"
|
||||||
version = "1.1.42"
|
version = "1.1.43"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"async-trait",
|
"async-trait",
|
||||||
@@ -4257,8 +4233,8 @@ dependencies = [
|
|||||||
"nym-vesting-contract-common",
|
"nym-vesting-contract-common",
|
||||||
"okapi",
|
"okapi",
|
||||||
"pin-project",
|
"pin-project",
|
||||||
"rand 0.8.5",
|
"rand",
|
||||||
"rand_chacha 0.3.1",
|
"rand_chacha",
|
||||||
"reqwest 0.12.4",
|
"reqwest 0.12.4",
|
||||||
"rocket",
|
"rocket",
|
||||||
"rocket_cors",
|
"rocket_cors",
|
||||||
@@ -4344,7 +4320,7 @@ dependencies = [
|
|||||||
"nym-types",
|
"nym-types",
|
||||||
"nym-wireguard",
|
"nym-wireguard",
|
||||||
"nym-wireguard-types",
|
"nym-wireguard-types",
|
||||||
"rand 0.8.5",
|
"rand",
|
||||||
"serde",
|
"serde",
|
||||||
"serde_json",
|
"serde_json",
|
||||||
"thiserror",
|
"thiserror",
|
||||||
@@ -4361,7 +4337,7 @@ dependencies = [
|
|||||||
"bincode",
|
"bincode",
|
||||||
"nym-sphinx",
|
"nym-sphinx",
|
||||||
"nym-wireguard-types",
|
"nym-wireguard-types",
|
||||||
"rand 0.8.5",
|
"rand",
|
||||||
"serde",
|
"serde",
|
||||||
]
|
]
|
||||||
|
|
||||||
@@ -4379,7 +4355,7 @@ dependencies = [
|
|||||||
"nym-ecash-time",
|
"nym-ecash-time",
|
||||||
"nym-network-defaults",
|
"nym-network-defaults",
|
||||||
"nym-validator-client",
|
"nym-validator-client",
|
||||||
"rand 0.8.5",
|
"rand",
|
||||||
"thiserror",
|
"thiserror",
|
||||||
"url",
|
"url",
|
||||||
"zeroize",
|
"zeroize",
|
||||||
@@ -4425,7 +4401,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "nym-cli"
|
name = "nym-cli"
|
||||||
version = "1.1.40"
|
version = "1.1.41"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"base64 0.13.1",
|
"base64 0.13.1",
|
||||||
@@ -4453,11 +4429,12 @@ name = "nym-cli-commands"
|
|||||||
version = "1.0.0"
|
version = "1.0.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"base64 0.13.1",
|
"base64 0.21.7",
|
||||||
"bip39",
|
"bip39",
|
||||||
"bs58 0.5.1",
|
"bs58 0.5.1",
|
||||||
"cfg-if",
|
"cfg-if",
|
||||||
"clap 4.5.7",
|
"clap 4.5.7",
|
||||||
|
"colored",
|
||||||
"comfy-table 6.2.0",
|
"comfy-table 6.2.0",
|
||||||
"cosmrs 0.17.0-pre",
|
"cosmrs 0.17.0-pre",
|
||||||
"cosmwasm-std",
|
"cosmwasm-std",
|
||||||
@@ -4490,21 +4467,21 @@ dependencies = [
|
|||||||
"nym-types",
|
"nym-types",
|
||||||
"nym-validator-client",
|
"nym-validator-client",
|
||||||
"nym-vesting-contract-common",
|
"nym-vesting-contract-common",
|
||||||
"rand 0.6.5",
|
"rand",
|
||||||
"serde",
|
"serde",
|
||||||
"serde_json",
|
"serde_json",
|
||||||
"tap",
|
"tap",
|
||||||
"thiserror",
|
"thiserror",
|
||||||
"time",
|
"time",
|
||||||
"tokio",
|
"tokio",
|
||||||
"toml 0.5.11",
|
"toml 0.8.14",
|
||||||
"url",
|
"url",
|
||||||
"zeroize",
|
"zeroize",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "nym-client"
|
name = "nym-client"
|
||||||
version = "1.1.39"
|
version = "1.1.40"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bs58 0.5.1",
|
"bs58 0.5.1",
|
||||||
"clap 4.5.7",
|
"clap 4.5.7",
|
||||||
@@ -4527,7 +4504,7 @@ dependencies = [
|
|||||||
"nym-task",
|
"nym-task",
|
||||||
"nym-topology",
|
"nym-topology",
|
||||||
"nym-validator-client",
|
"nym-validator-client",
|
||||||
"rand 0.8.5",
|
"rand",
|
||||||
"serde",
|
"serde",
|
||||||
"serde_json",
|
"serde_json",
|
||||||
"tap",
|
"tap",
|
||||||
@@ -4578,7 +4555,7 @@ dependencies = [
|
|||||||
"nym-task",
|
"nym-task",
|
||||||
"nym-topology",
|
"nym-topology",
|
||||||
"nym-validator-client",
|
"nym-validator-client",
|
||||||
"rand 0.8.5",
|
"rand",
|
||||||
"serde",
|
"serde",
|
||||||
"serde_json",
|
"serde_json",
|
||||||
"sha2 0.10.8",
|
"sha2 0.10.8",
|
||||||
@@ -4658,7 +4635,7 @@ dependencies = [
|
|||||||
"nym-bin-common",
|
"nym-bin-common",
|
||||||
"nym-node-tester-utils",
|
"nym-node-tester-utils",
|
||||||
"nym-node-tester-wasm",
|
"nym-node-tester-wasm",
|
||||||
"rand 0.8.5",
|
"rand",
|
||||||
"serde",
|
"serde",
|
||||||
"serde-wasm-bindgen 0.6.5",
|
"serde-wasm-bindgen 0.6.5",
|
||||||
"serde_json",
|
"serde_json",
|
||||||
@@ -4695,8 +4672,8 @@ dependencies = [
|
|||||||
"itertools 0.13.0",
|
"itertools 0.13.0",
|
||||||
"nym-dkg",
|
"nym-dkg",
|
||||||
"nym-pemstore",
|
"nym-pemstore",
|
||||||
"rand 0.8.5",
|
"rand",
|
||||||
"rand_chacha 0.3.1",
|
"rand_chacha",
|
||||||
"serde",
|
"serde",
|
||||||
"serde_derive",
|
"serde_derive",
|
||||||
"sha2 0.9.9",
|
"sha2 0.9.9",
|
||||||
@@ -4742,7 +4719,7 @@ dependencies = [
|
|||||||
"itertools 0.12.1",
|
"itertools 0.12.1",
|
||||||
"nym-network-defaults",
|
"nym-network-defaults",
|
||||||
"nym-pemstore",
|
"nym-pemstore",
|
||||||
"rand 0.8.5",
|
"rand",
|
||||||
"rayon",
|
"rayon",
|
||||||
"serde",
|
"serde",
|
||||||
"sha2 0.9.9",
|
"sha2 0.9.9",
|
||||||
@@ -4836,7 +4813,7 @@ dependencies = [
|
|||||||
"nym-ecash-time",
|
"nym-ecash-time",
|
||||||
"nym-network-defaults",
|
"nym-network-defaults",
|
||||||
"nym-validator-client",
|
"nym-validator-client",
|
||||||
"rand 0.8.5",
|
"rand",
|
||||||
"serde",
|
"serde",
|
||||||
"thiserror",
|
"thiserror",
|
||||||
"time",
|
"time",
|
||||||
@@ -4851,7 +4828,7 @@ dependencies = [
|
|||||||
"nym-compact-ecash",
|
"nym-compact-ecash",
|
||||||
"nym-ecash-time",
|
"nym-ecash-time",
|
||||||
"nym-network-defaults",
|
"nym-network-defaults",
|
||||||
"rand 0.8.5",
|
"rand",
|
||||||
"serde",
|
"serde",
|
||||||
"strum 0.25.0",
|
"strum 0.25.0",
|
||||||
"thiserror",
|
"thiserror",
|
||||||
@@ -4874,8 +4851,8 @@ dependencies = [
|
|||||||
"hmac",
|
"hmac",
|
||||||
"nym-pemstore",
|
"nym-pemstore",
|
||||||
"nym-sphinx-types",
|
"nym-sphinx-types",
|
||||||
"rand 0.8.5",
|
"rand",
|
||||||
"rand_chacha 0.3.1",
|
"rand_chacha",
|
||||||
"serde",
|
"serde",
|
||||||
"serde_bytes",
|
"serde_bytes",
|
||||||
"subtle-encoding",
|
"subtle-encoding",
|
||||||
@@ -4897,8 +4874,8 @@ dependencies = [
|
|||||||
"lazy_static",
|
"lazy_static",
|
||||||
"nym-contracts-common",
|
"nym-contracts-common",
|
||||||
"nym-pemstore",
|
"nym-pemstore",
|
||||||
"rand 0.8.5",
|
"rand",
|
||||||
"rand_chacha 0.3.1",
|
"rand_chacha",
|
||||||
"rand_core 0.6.4",
|
"rand_core 0.6.4",
|
||||||
"serde",
|
"serde",
|
||||||
"serde_derive",
|
"serde_derive",
|
||||||
@@ -5028,7 +5005,7 @@ dependencies = [
|
|||||||
"nym-wireguard",
|
"nym-wireguard",
|
||||||
"nym-wireguard-types",
|
"nym-wireguard-types",
|
||||||
"once_cell",
|
"once_cell",
|
||||||
"rand 0.8.5",
|
"rand",
|
||||||
"serde",
|
"serde",
|
||||||
"serde_json",
|
"serde_json",
|
||||||
"si-scale",
|
"si-scale",
|
||||||
@@ -5063,7 +5040,7 @@ dependencies = [
|
|||||||
"nym-sphinx",
|
"nym-sphinx",
|
||||||
"nym-task",
|
"nym-task",
|
||||||
"nym-validator-client",
|
"nym-validator-client",
|
||||||
"rand 0.8.5",
|
"rand",
|
||||||
"serde",
|
"serde",
|
||||||
"si-scale",
|
"si-scale",
|
||||||
"thiserror",
|
"thiserror",
|
||||||
@@ -5092,7 +5069,7 @@ dependencies = [
|
|||||||
"nym-crypto",
|
"nym-crypto",
|
||||||
"nym-pemstore",
|
"nym-pemstore",
|
||||||
"nym-sphinx",
|
"nym-sphinx",
|
||||||
"rand 0.8.5",
|
"rand",
|
||||||
"serde",
|
"serde",
|
||||||
"serde_json",
|
"serde_json",
|
||||||
"thiserror",
|
"thiserror",
|
||||||
@@ -5192,7 +5169,7 @@ name = "nym-inclusion-probability"
|
|||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"log",
|
"log",
|
||||||
"rand 0.8.5",
|
"rand",
|
||||||
"thiserror",
|
"thiserror",
|
||||||
]
|
]
|
||||||
|
|
||||||
@@ -5205,7 +5182,7 @@ dependencies = [
|
|||||||
"nym-bin-common",
|
"nym-bin-common",
|
||||||
"nym-crypto",
|
"nym-crypto",
|
||||||
"nym-sphinx",
|
"nym-sphinx",
|
||||||
"rand 0.8.5",
|
"rand",
|
||||||
"serde",
|
"serde",
|
||||||
"thiserror",
|
"thiserror",
|
||||||
"time",
|
"time",
|
||||||
@@ -5242,7 +5219,7 @@ dependencies = [
|
|||||||
"nym-types",
|
"nym-types",
|
||||||
"nym-wireguard",
|
"nym-wireguard",
|
||||||
"nym-wireguard-types",
|
"nym-wireguard-types",
|
||||||
"rand 0.8.5",
|
"rand",
|
||||||
"reqwest 0.12.4",
|
"reqwest 0.12.4",
|
||||||
"serde",
|
"serde",
|
||||||
"serde_json",
|
"serde_json",
|
||||||
@@ -5299,7 +5276,7 @@ dependencies = [
|
|||||||
"humantime-serde",
|
"humantime-serde",
|
||||||
"log",
|
"log",
|
||||||
"nym-contracts-common",
|
"nym-contracts-common",
|
||||||
"rand_chacha 0.3.1",
|
"rand_chacha",
|
||||||
"schemars",
|
"schemars",
|
||||||
"serde",
|
"serde",
|
||||||
"serde-json-wasm",
|
"serde-json-wasm",
|
||||||
@@ -5342,7 +5319,7 @@ dependencies = [
|
|||||||
"nym-topology",
|
"nym-topology",
|
||||||
"nym-types",
|
"nym-types",
|
||||||
"nym-validator-client",
|
"nym-validator-client",
|
||||||
"rand 0.8.5",
|
"rand",
|
||||||
"serde",
|
"serde",
|
||||||
"serde_json",
|
"serde_json",
|
||||||
"sysinfo 0.27.8",
|
"sysinfo 0.27.8",
|
||||||
@@ -5375,7 +5352,7 @@ dependencies = [
|
|||||||
"nym-sphinx-types",
|
"nym-sphinx-types",
|
||||||
"nym-task",
|
"nym-task",
|
||||||
"nym-validator-client",
|
"nym-validator-client",
|
||||||
"rand 0.8.5",
|
"rand",
|
||||||
"serde",
|
"serde",
|
||||||
"thiserror",
|
"thiserror",
|
||||||
"time",
|
"time",
|
||||||
@@ -5412,7 +5389,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "nym-network-requester"
|
name = "nym-network-requester"
|
||||||
version = "1.1.40"
|
version = "1.1.41"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"addr",
|
"addr",
|
||||||
"anyhow",
|
"anyhow",
|
||||||
@@ -5445,7 +5422,7 @@ dependencies = [
|
|||||||
"nym-types",
|
"nym-types",
|
||||||
"pretty_env_logger",
|
"pretty_env_logger",
|
||||||
"publicsuffix",
|
"publicsuffix",
|
||||||
"rand 0.8.5",
|
"rand",
|
||||||
"regex",
|
"regex",
|
||||||
"reqwest 0.12.4",
|
"reqwest 0.12.4",
|
||||||
"serde",
|
"serde",
|
||||||
@@ -5463,7 +5440,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "nym-node"
|
name = "nym-node"
|
||||||
version = "1.1.6"
|
version = "1.1.7"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"bip39",
|
"bip39",
|
||||||
@@ -5492,7 +5469,7 @@ dependencies = [
|
|||||||
"nym-types",
|
"nym-types",
|
||||||
"nym-wireguard",
|
"nym-wireguard",
|
||||||
"nym-wireguard-types",
|
"nym-wireguard-types",
|
||||||
"rand 0.8.5",
|
"rand",
|
||||||
"semver 1.0.23",
|
"semver 1.0.23",
|
||||||
"serde",
|
"serde",
|
||||||
"serde_json",
|
"serde_json",
|
||||||
@@ -5526,7 +5503,7 @@ dependencies = [
|
|||||||
"nym-task",
|
"nym-task",
|
||||||
"nym-wireguard",
|
"nym-wireguard",
|
||||||
"nym-wireguard-types",
|
"nym-wireguard-types",
|
||||||
"rand 0.8.5",
|
"rand",
|
||||||
"serde_json",
|
"serde_json",
|
||||||
"thiserror",
|
"thiserror",
|
||||||
"time",
|
"time",
|
||||||
@@ -5553,7 +5530,7 @@ dependencies = [
|
|||||||
"nym-exit-policy",
|
"nym-exit-policy",
|
||||||
"nym-http-api-client",
|
"nym-http-api-client",
|
||||||
"nym-wireguard-types",
|
"nym-wireguard-types",
|
||||||
"rand_chacha 0.3.1",
|
"rand_chacha",
|
||||||
"schemars",
|
"schemars",
|
||||||
"serde",
|
"serde",
|
||||||
"serde_json",
|
"serde_json",
|
||||||
@@ -5574,7 +5551,7 @@ dependencies = [
|
|||||||
"nym-sphinx-params",
|
"nym-sphinx-params",
|
||||||
"nym-task",
|
"nym-task",
|
||||||
"nym-topology",
|
"nym-topology",
|
||||||
"rand 0.8.5",
|
"rand",
|
||||||
"serde",
|
"serde",
|
||||||
"serde_json",
|
"serde_json",
|
||||||
"thiserror",
|
"thiserror",
|
||||||
@@ -5589,7 +5566,7 @@ dependencies = [
|
|||||||
"futures",
|
"futures",
|
||||||
"js-sys",
|
"js-sys",
|
||||||
"nym-node-tester-utils",
|
"nym-node-tester-utils",
|
||||||
"rand 0.8.5",
|
"rand",
|
||||||
"serde",
|
"serde",
|
||||||
"serde-wasm-bindgen 0.6.5",
|
"serde-wasm-bindgen 0.6.5",
|
||||||
"thiserror",
|
"thiserror",
|
||||||
@@ -5648,7 +5625,7 @@ dependencies = [
|
|||||||
"fastrand 2.1.0",
|
"fastrand 2.1.0",
|
||||||
"getrandom",
|
"getrandom",
|
||||||
"log",
|
"log",
|
||||||
"rand 0.8.5",
|
"rand",
|
||||||
"rayon",
|
"rayon",
|
||||||
"sphinx-packet",
|
"sphinx-packet",
|
||||||
"thiserror",
|
"thiserror",
|
||||||
@@ -5697,7 +5674,7 @@ dependencies = [
|
|||||||
"nym-validator-client",
|
"nym-validator-client",
|
||||||
"parking_lot 0.12.3",
|
"parking_lot 0.12.3",
|
||||||
"pretty_env_logger",
|
"pretty_env_logger",
|
||||||
"rand 0.8.5",
|
"rand",
|
||||||
"reqwest 0.12.4",
|
"reqwest 0.12.4",
|
||||||
"tap",
|
"tap",
|
||||||
"thiserror",
|
"thiserror",
|
||||||
@@ -5737,7 +5714,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "nym-socks5-client"
|
name = "nym-socks5-client"
|
||||||
version = "1.1.39"
|
version = "1.1.40"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bs58 0.5.1",
|
"bs58 0.5.1",
|
||||||
"clap 4.5.7",
|
"clap 4.5.7",
|
||||||
@@ -5757,7 +5734,7 @@ dependencies = [
|
|||||||
"nym-sphinx",
|
"nym-sphinx",
|
||||||
"nym-topology",
|
"nym-topology",
|
||||||
"nym-validator-client",
|
"nym-validator-client",
|
||||||
"rand 0.8.5",
|
"rand",
|
||||||
"serde",
|
"serde",
|
||||||
"serde_json",
|
"serde_json",
|
||||||
"tap",
|
"tap",
|
||||||
@@ -5790,7 +5767,7 @@ dependencies = [
|
|||||||
"nym-task",
|
"nym-task",
|
||||||
"nym-validator-client",
|
"nym-validator-client",
|
||||||
"pin-project",
|
"pin-project",
|
||||||
"rand 0.8.5",
|
"rand",
|
||||||
"reqwest 0.12.4",
|
"reqwest 0.12.4",
|
||||||
"schemars",
|
"schemars",
|
||||||
"serde",
|
"serde",
|
||||||
@@ -5816,7 +5793,7 @@ dependencies = [
|
|||||||
"nym-credential-storage",
|
"nym-credential-storage",
|
||||||
"nym-crypto",
|
"nym-crypto",
|
||||||
"nym-socks5-client-core",
|
"nym-socks5-client-core",
|
||||||
"rand 0.8.5",
|
"rand",
|
||||||
"safer-ffi",
|
"safer-ffi",
|
||||||
"serde",
|
"serde",
|
||||||
"tokio",
|
"tokio",
|
||||||
@@ -5870,7 +5847,7 @@ dependencies = [
|
|||||||
"nym-sphinx-routing",
|
"nym-sphinx-routing",
|
||||||
"nym-sphinx-types",
|
"nym-sphinx-types",
|
||||||
"nym-topology",
|
"nym-topology",
|
||||||
"rand 0.8.5",
|
"rand",
|
||||||
"rand_distr",
|
"rand_distr",
|
||||||
"thiserror",
|
"thiserror",
|
||||||
"tokio",
|
"tokio",
|
||||||
@@ -5888,7 +5865,7 @@ dependencies = [
|
|||||||
"nym-sphinx-routing",
|
"nym-sphinx-routing",
|
||||||
"nym-sphinx-types",
|
"nym-sphinx-types",
|
||||||
"nym-topology",
|
"nym-topology",
|
||||||
"rand 0.8.5",
|
"rand",
|
||||||
"serde",
|
"serde",
|
||||||
"thiserror",
|
"thiserror",
|
||||||
"zeroize",
|
"zeroize",
|
||||||
@@ -5900,7 +5877,7 @@ version = "0.1.0"
|
|||||||
dependencies = [
|
dependencies = [
|
||||||
"nym-crypto",
|
"nym-crypto",
|
||||||
"nym-sphinx-types",
|
"nym-sphinx-types",
|
||||||
"rand 0.8.5",
|
"rand",
|
||||||
"serde",
|
"serde",
|
||||||
"thiserror",
|
"thiserror",
|
||||||
]
|
]
|
||||||
@@ -5916,8 +5893,8 @@ dependencies = [
|
|||||||
"nym-sphinx-routing",
|
"nym-sphinx-routing",
|
||||||
"nym-sphinx-types",
|
"nym-sphinx-types",
|
||||||
"nym-topology",
|
"nym-topology",
|
||||||
"rand 0.8.5",
|
"rand",
|
||||||
"rand_chacha 0.3.1",
|
"rand_chacha",
|
||||||
"serde",
|
"serde",
|
||||||
"thiserror",
|
"thiserror",
|
||||||
"wasm-bindgen",
|
"wasm-bindgen",
|
||||||
@@ -5931,7 +5908,7 @@ dependencies = [
|
|||||||
"nym-sphinx-addressing",
|
"nym-sphinx-addressing",
|
||||||
"nym-sphinx-params",
|
"nym-sphinx-params",
|
||||||
"nym-sphinx-types",
|
"nym-sphinx-types",
|
||||||
"rand 0.8.5",
|
"rand",
|
||||||
"thiserror",
|
"thiserror",
|
||||||
]
|
]
|
||||||
|
|
||||||
@@ -5948,7 +5925,7 @@ dependencies = [
|
|||||||
"nym-sphinx-routing",
|
"nym-sphinx-routing",
|
||||||
"nym-sphinx-types",
|
"nym-sphinx-types",
|
||||||
"nym-topology",
|
"nym-topology",
|
||||||
"rand 0.8.5",
|
"rand",
|
||||||
"thiserror",
|
"thiserror",
|
||||||
]
|
]
|
||||||
|
|
||||||
@@ -6010,7 +5987,7 @@ dependencies = [
|
|||||||
"argon2",
|
"argon2",
|
||||||
"generic-array 0.14.7",
|
"generic-array 0.14.7",
|
||||||
"getrandom",
|
"getrandom",
|
||||||
"rand 0.8.5",
|
"rand",
|
||||||
"serde",
|
"serde",
|
||||||
"serde_json",
|
"serde_json",
|
||||||
"thiserror",
|
"thiserror",
|
||||||
@@ -6045,7 +6022,7 @@ dependencies = [
|
|||||||
"nym-sphinx-addressing",
|
"nym-sphinx-addressing",
|
||||||
"nym-sphinx-routing",
|
"nym-sphinx-routing",
|
||||||
"nym-sphinx-types",
|
"nym-sphinx-types",
|
||||||
"rand 0.8.5",
|
"rand",
|
||||||
"semver 0.11.0",
|
"semver 0.11.0",
|
||||||
"serde",
|
"serde",
|
||||||
"serde_json",
|
"serde_json",
|
||||||
@@ -6169,7 +6146,7 @@ dependencies = [
|
|||||||
"nym-task",
|
"nym-task",
|
||||||
"nym-validator-client",
|
"nym-validator-client",
|
||||||
"nyxd-scraper",
|
"nyxd-scraper",
|
||||||
"rand_chacha 0.3.1",
|
"rand_chacha",
|
||||||
"serde",
|
"serde",
|
||||||
"serde_with",
|
"serde_with",
|
||||||
"sha2 0.10.8",
|
"sha2 0.10.8",
|
||||||
@@ -6248,7 +6225,7 @@ dependencies = [
|
|||||||
"nym-config",
|
"nym-config",
|
||||||
"nym-crypto",
|
"nym-crypto",
|
||||||
"nym-network-defaults",
|
"nym-network-defaults",
|
||||||
"rand 0.8.5",
|
"rand",
|
||||||
"serde",
|
"serde",
|
||||||
"serde_json",
|
"serde_json",
|
||||||
"sha2 0.10.8",
|
"sha2 0.10.8",
|
||||||
@@ -6259,7 +6236,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "nymvisor"
|
name = "nymvisor"
|
||||||
version = "0.1.5"
|
version = "0.1.6"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"bytes",
|
"bytes",
|
||||||
@@ -6458,7 +6435,7 @@ dependencies = [
|
|||||||
"once_cell",
|
"once_cell",
|
||||||
"opentelemetry_api",
|
"opentelemetry_api",
|
||||||
"percent-encoding",
|
"percent-encoding",
|
||||||
"rand 0.8.5",
|
"rand",
|
||||||
"thiserror",
|
"thiserror",
|
||||||
"tokio",
|
"tokio",
|
||||||
"tokio-stream",
|
"tokio-stream",
|
||||||
@@ -6771,7 +6748,7 @@ version = "2.8.0"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "4b2d323e8ca7996b3e23126511a523f7e62924d93ecd5ae73b333815b0eb3dce"
|
checksum = "4b2d323e8ca7996b3e23126511a523f7e62924d93ecd5ae73b333815b0eb3dce"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"autocfg 1.3.0",
|
"autocfg",
|
||||||
"bitflags 1.3.2",
|
"bitflags 1.3.2",
|
||||||
"cfg-if",
|
"cfg-if",
|
||||||
"concurrent-queue",
|
"concurrent-queue",
|
||||||
@@ -7025,25 +7002,6 @@ version = "0.7.0"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09"
|
checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09"
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "rand"
|
|
||||||
version = "0.6.5"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "6d71dacdc3c88c1fde3885a3be3fbab9f35724e6ce99467f7d9c5026132184ca"
|
|
||||||
dependencies = [
|
|
||||||
"autocfg 0.1.8",
|
|
||||||
"libc",
|
|
||||||
"rand_chacha 0.1.1",
|
|
||||||
"rand_core 0.4.2",
|
|
||||||
"rand_hc",
|
|
||||||
"rand_isaac",
|
|
||||||
"rand_jitter",
|
|
||||||
"rand_os",
|
|
||||||
"rand_pcg 0.1.2",
|
|
||||||
"rand_xorshift",
|
|
||||||
"winapi",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "rand"
|
name = "rand"
|
||||||
version = "0.8.5"
|
version = "0.8.5"
|
||||||
@@ -7051,20 +7009,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||||||
checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
|
checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"libc",
|
"libc",
|
||||||
"rand_chacha 0.3.1",
|
"rand_chacha",
|
||||||
"rand_core 0.6.4",
|
"rand_core 0.6.4",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "rand_chacha"
|
|
||||||
version = "0.1.1"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "556d3a1ca6600bfcbab7c7c91ccb085ac7fbbcd70e008a98742e7847f4f7bcef"
|
|
||||||
dependencies = [
|
|
||||||
"autocfg 0.1.8",
|
|
||||||
"rand_core 0.3.1",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "rand_chacha"
|
name = "rand_chacha"
|
||||||
version = "0.3.1"
|
version = "0.3.1"
|
||||||
@@ -7075,21 +7023,6 @@ dependencies = [
|
|||||||
"rand_core 0.6.4",
|
"rand_core 0.6.4",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "rand_core"
|
|
||||||
version = "0.3.1"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b"
|
|
||||||
dependencies = [
|
|
||||||
"rand_core 0.4.2",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "rand_core"
|
|
||||||
version = "0.4.2"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "9c33a3c44ca05fa6f1807d8e6743f3824e8509beca625669633be0acbdf509dc"
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "rand_core"
|
name = "rand_core"
|
||||||
version = "0.5.1"
|
version = "0.5.1"
|
||||||
@@ -7112,60 +7045,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||||||
checksum = "32cb0b9bc82b0a0876c2dd994a7e7a2683d3e7390ca40e6886785ef0c7e3ee31"
|
checksum = "32cb0b9bc82b0a0876c2dd994a7e7a2683d3e7390ca40e6886785ef0c7e3ee31"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"num-traits",
|
"num-traits",
|
||||||
"rand 0.8.5",
|
"rand",
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "rand_hc"
|
|
||||||
version = "0.1.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "7b40677c7be09ae76218dc623efbf7b18e34bced3f38883af07bb75630a21bc4"
|
|
||||||
dependencies = [
|
|
||||||
"rand_core 0.3.1",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "rand_isaac"
|
|
||||||
version = "0.1.1"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "ded997c9d5f13925be2a6fd7e66bf1872597f759fd9dd93513dd7e92e5a5ee08"
|
|
||||||
dependencies = [
|
|
||||||
"rand_core 0.3.1",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "rand_jitter"
|
|
||||||
version = "0.1.4"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "1166d5c91dc97b88d1decc3285bb0a99ed84b05cfd0bc2341bdf2d43fc41e39b"
|
|
||||||
dependencies = [
|
|
||||||
"libc",
|
|
||||||
"rand_core 0.4.2",
|
|
||||||
"winapi",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "rand_os"
|
|
||||||
version = "0.1.3"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "7b75f676a1e053fc562eafbb47838d67c84801e38fc1ba459e8f180deabd5071"
|
|
||||||
dependencies = [
|
|
||||||
"cloudabi",
|
|
||||||
"fuchsia-cprng",
|
|
||||||
"libc",
|
|
||||||
"rand_core 0.4.2",
|
|
||||||
"rdrand",
|
|
||||||
"winapi",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "rand_pcg"
|
|
||||||
version = "0.1.2"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "abf9b09b01790cfe0364f52bf32995ea3c39f4d2dd011eac241d2914146d0b44"
|
|
||||||
dependencies = [
|
|
||||||
"autocfg 0.1.8",
|
|
||||||
"rand_core 0.4.2",
|
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@@ -7186,15 +7066,6 @@ dependencies = [
|
|||||||
"rand_core 0.6.4",
|
"rand_core 0.6.4",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "rand_xorshift"
|
|
||||||
version = "0.1.1"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "cbf7e9e623549b0e21f6e97cf8ecf247c1a8fd2e8a992ae265314300b2455d5c"
|
|
||||||
dependencies = [
|
|
||||||
"rand_core 0.3.1",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "rayon"
|
name = "rayon"
|
||||||
version = "1.10.0"
|
version = "1.10.0"
|
||||||
@@ -7215,15 +7086,6 @@ dependencies = [
|
|||||||
"crossbeam-utils",
|
"crossbeam-utils",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "rdrand"
|
|
||||||
version = "0.4.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2"
|
|
||||||
dependencies = [
|
|
||||||
"rand_core 0.3.1",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "redox_syscall"
|
name = "redox_syscall"
|
||||||
version = "0.2.16"
|
version = "0.2.16"
|
||||||
@@ -7481,7 +7343,7 @@ dependencies = [
|
|||||||
"num_cpus",
|
"num_cpus",
|
||||||
"parking_lot 0.12.3",
|
"parking_lot 0.12.3",
|
||||||
"pin-project-lite",
|
"pin-project-lite",
|
||||||
"rand 0.8.5",
|
"rand",
|
||||||
"ref-cast",
|
"ref-cast",
|
||||||
"rocket_codegen",
|
"rocket_codegen",
|
||||||
"rocket_http",
|
"rocket_http",
|
||||||
@@ -8254,7 +8116,7 @@ version = "0.4.9"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67"
|
checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"autocfg 1.3.0",
|
"autocfg",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@@ -8325,7 +8187,7 @@ dependencies = [
|
|||||||
"hmac",
|
"hmac",
|
||||||
"lioness",
|
"lioness",
|
||||||
"log",
|
"log",
|
||||||
"rand 0.8.5",
|
"rand",
|
||||||
"rand_distr",
|
"rand_distr",
|
||||||
"sha2 0.10.8",
|
"sha2 0.10.8",
|
||||||
"subtle 2.5.0",
|
"subtle 2.5.0",
|
||||||
@@ -8869,7 +8731,7 @@ dependencies = [
|
|||||||
"getrandom",
|
"getrandom",
|
||||||
"peg",
|
"peg",
|
||||||
"pin-project",
|
"pin-project",
|
||||||
"rand 0.8.5",
|
"rand",
|
||||||
"reqwest 0.11.27",
|
"reqwest 0.11.27",
|
||||||
"semver 1.0.23",
|
"semver 1.0.23",
|
||||||
"serde",
|
"serde",
|
||||||
@@ -8923,7 +8785,7 @@ dependencies = [
|
|||||||
"nym-pemstore",
|
"nym-pemstore",
|
||||||
"nym-validator-client",
|
"nym-validator-client",
|
||||||
"nym-vesting-contract-common",
|
"nym-vesting-contract-common",
|
||||||
"rand 0.8.5",
|
"rand",
|
||||||
"serde",
|
"serde",
|
||||||
"serde_json",
|
"serde_json",
|
||||||
"sqlx",
|
"sqlx",
|
||||||
@@ -9323,7 +9185,7 @@ dependencies = [
|
|||||||
"indexmap 1.9.3",
|
"indexmap 1.9.3",
|
||||||
"pin-project",
|
"pin-project",
|
||||||
"pin-project-lite",
|
"pin-project-lite",
|
||||||
"rand 0.8.5",
|
"rand",
|
||||||
"slab",
|
"slab",
|
||||||
"tokio",
|
"tokio",
|
||||||
"tokio-util",
|
"tokio-util",
|
||||||
@@ -9589,7 +9451,7 @@ dependencies = [
|
|||||||
"http 0.2.12",
|
"http 0.2.12",
|
||||||
"httparse",
|
"httparse",
|
||||||
"log",
|
"log",
|
||||||
"rand 0.8.5",
|
"rand",
|
||||||
"rustls 0.21.12",
|
"rustls 0.21.12",
|
||||||
"sha1",
|
"sha1",
|
||||||
"thiserror",
|
"thiserror",
|
||||||
@@ -9610,7 +9472,7 @@ dependencies = [
|
|||||||
"http 1.1.0",
|
"http 1.1.0",
|
||||||
"httparse",
|
"httparse",
|
||||||
"log",
|
"log",
|
||||||
"rand 0.8.5",
|
"rand",
|
||||||
"rustls 0.22.4",
|
"rustls 0.22.4",
|
||||||
"rustls-pki-types",
|
"rustls-pki-types",
|
||||||
"sha1",
|
"sha1",
|
||||||
@@ -10030,7 +9892,7 @@ dependencies = [
|
|||||||
"nym-task",
|
"nym-task",
|
||||||
"nym-topology",
|
"nym-topology",
|
||||||
"nym-validator-client",
|
"nym-validator-client",
|
||||||
"rand 0.8.5",
|
"rand",
|
||||||
"serde",
|
"serde",
|
||||||
"serde-wasm-bindgen 0.6.5",
|
"serde-wasm-bindgen 0.6.5",
|
||||||
"thiserror",
|
"thiserror",
|
||||||
@@ -10665,7 +10527,7 @@ dependencies = [
|
|||||||
"nym-credentials",
|
"nym-credentials",
|
||||||
"nym-crypto",
|
"nym-crypto",
|
||||||
"nym-http-api-client",
|
"nym-http-api-client",
|
||||||
"rand 0.8.5",
|
"rand",
|
||||||
"reqwest 0.12.4",
|
"reqwest 0.12.4",
|
||||||
"serde",
|
"serde",
|
||||||
"thiserror",
|
"thiserror",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "nym-client"
|
name = "nym-client"
|
||||||
version = "1.1.39"
|
version = "1.1.40"
|
||||||
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"
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "nym-socks5-client"
|
name = "nym-socks5-client"
|
||||||
version = "1.1.39"
|
version = "1.1.40"
|
||||||
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"
|
||||||
|
|||||||
@@ -2,7 +2,9 @@
|
|||||||
// SPDX-License-Identifier: Apache-2.0
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
use crate::error::BandwidthControllerError;
|
use crate::error::BandwidthControllerError;
|
||||||
use crate::utils::{get_coin_index_signatures, get_expiration_date_signatures};
|
use crate::utils::{
|
||||||
|
get_aggregate_verification_key, get_coin_index_signatures, get_expiration_date_signatures,
|
||||||
|
};
|
||||||
use log::info;
|
use log::info;
|
||||||
use nym_credential_storage::storage::Storage;
|
use nym_credential_storage::storage::Storage;
|
||||||
use nym_credentials::ecash::bandwidth::IssuanceTicketBook;
|
use nym_credentials::ecash::bandwidth::IssuanceTicketBook;
|
||||||
@@ -55,7 +57,7 @@ where
|
|||||||
))
|
))
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn query_and_persist_required_global_signatures<S>(
|
pub async fn query_and_persist_required_global_data<S>(
|
||||||
storage: &S,
|
storage: &S,
|
||||||
epoch_id: EpochId,
|
epoch_id: EpochId,
|
||||||
expiration_date: Date,
|
expiration_date: Date,
|
||||||
@@ -65,6 +67,10 @@ where
|
|||||||
S: Storage,
|
S: Storage,
|
||||||
<S as Storage>::StorageError: Send + Sync + 'static,
|
<S as Storage>::StorageError: Send + Sync + 'static,
|
||||||
{
|
{
|
||||||
|
log::info!("Getting master verification key");
|
||||||
|
// this will also persist the key in the storage if was not there already
|
||||||
|
get_aggregate_verification_key(storage, epoch_id, apis.clone()).await?;
|
||||||
|
|
||||||
log::info!("Getting expiration date signatures");
|
log::info!("Getting expiration date signatures");
|
||||||
// this will also persist the signatures in the storage if they were not there already
|
// this will also persist the signatures in the storage if they were not there already
|
||||||
get_expiration_date_signatures(storage, epoch_id, expiration_date, apis.clone()).await?;
|
get_expiration_date_signatures(storage, epoch_id, expiration_date, apis.clone()).await?;
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ use nym_credential_storage::models::RetrievedTicketbook;
|
|||||||
use nym_credential_storage::storage::Storage;
|
use nym_credential_storage::storage::Storage;
|
||||||
use nym_credentials::ecash::bandwidth::CredentialSpendingData;
|
use nym_credentials::ecash::bandwidth::CredentialSpendingData;
|
||||||
use nym_credentials_interface::{
|
use nym_credentials_interface::{
|
||||||
AnnotatedCoinIndexSignature, AnnotatedExpirationDateSignature, NymPayInfo, VerificationKeyAuth,
|
AnnotatedCoinIndexSignature, AnnotatedExpirationDateSignature, VerificationKeyAuth,
|
||||||
};
|
};
|
||||||
use nym_ecash_time::Date;
|
use nym_ecash_time::Date;
|
||||||
use nym_validator_client::nym_api::EpochId;
|
use nym_validator_client::nym_api::EpochId;
|
||||||
@@ -165,7 +165,9 @@ impl<C, St: Storage> BandwidthController<C, St> {
|
|||||||
.get_coin_index_signatures(epoch_id, &mut api_clients)
|
.get_coin_index_signatures(epoch_id, &mut api_clients)
|
||||||
.await?;
|
.await?;
|
||||||
|
|
||||||
let pay_info = NymPayInfo::generate(provider_pk);
|
let pay_info = retrieved_ticketbook
|
||||||
|
.ticketbook
|
||||||
|
.generate_pay_info(provider_pk);
|
||||||
|
|
||||||
let spend_request = retrieved_ticketbook.ticketbook.prepare_for_spending(
|
let spend_request = retrieved_ticketbook.ticketbook.prepare_for_spending(
|
||||||
&verification_key,
|
&verification_key,
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
// 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::nyxd::cosmwasm_client::types::ExecuteResult;
|
||||||
use crate::nyxd::error::NyxdError;
|
use crate::nyxd::error::NyxdError;
|
||||||
use cosmrs::abci::TxMsgData;
|
use cosmrs::abci::TxMsgData;
|
||||||
use cosmrs::cosmwasm::MsgExecuteContractResponse;
|
use cosmrs::cosmwasm::MsgExecuteContractResponse;
|
||||||
@@ -9,7 +10,6 @@ use log::error;
|
|||||||
use prost::bytes::Bytes;
|
use prost::bytes::Bytes;
|
||||||
use tendermint_rpc::endpoint::broadcast;
|
use tendermint_rpc::endpoint::broadcast;
|
||||||
|
|
||||||
use crate::nyxd::cosmwasm_client::types::ExecuteResult;
|
|
||||||
pub use cosmrs::abci::MsgResponse;
|
pub use cosmrs::abci::MsgResponse;
|
||||||
|
|
||||||
pub fn parse_msg_responses(data: Bytes) -> Vec<MsgResponse> {
|
pub fn parse_msg_responses(data: Bytes) -> Vec<MsgResponse> {
|
||||||
|
|||||||
@@ -21,7 +21,8 @@ pub struct Log {
|
|||||||
|
|
||||||
/// Searches in logs for the first event of the given event type and in that event
|
/// Searches in logs for the first event of the given event type and in that event
|
||||||
/// for the first attribute with the given attribute key.
|
/// for the first attribute with the given attribute key.
|
||||||
pub fn find_attribute<'a>(
|
#[deprecated]
|
||||||
|
pub fn find_attribute_in_logs<'a>(
|
||||||
logs: &'a [Log],
|
logs: &'a [Log],
|
||||||
event_type: &str,
|
event_type: &str,
|
||||||
attribute_key: &str,
|
attribute_key: &str,
|
||||||
@@ -35,6 +36,7 @@ pub fn find_attribute<'a>(
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Search for the proposal id in the given log. It'll be in the LAST wasm event, with attribute key "proposal_id"
|
/// Search for the proposal id in the given log. It'll be in the LAST wasm event, with attribute key "proposal_id"
|
||||||
|
#[deprecated]
|
||||||
pub fn find_proposal_id(logs: &[Log]) -> Result<u64, NyxdError> {
|
pub fn find_proposal_id(logs: &[Log]) -> Result<u64, NyxdError> {
|
||||||
let maybe_attributes = logs
|
let maybe_attributes = logs
|
||||||
.iter()
|
.iter()
|
||||||
|
|||||||
@@ -1,12 +1,24 @@
|
|||||||
// 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 crate::nyxd::cosmwasm_client::logs::Log;
|
||||||
use crate::nyxd::TxResponse;
|
use crate::nyxd::TxResponse;
|
||||||
|
use cosmrs::tendermint::abci;
|
||||||
|
|
||||||
|
pub use abci::Event;
|
||||||
|
|
||||||
// Searches in events for an event of the given event type which contains an
|
// Searches in events for an event of the given event type which contains an
|
||||||
// attribute for with the given key.
|
// attribute for with the given key.
|
||||||
pub fn find_tx_attribute(tx: &TxResponse, event_type: &str, attribute_key: &str) -> Option<String> {
|
pub fn find_tx_attribute(tx: &TxResponse, event_type: &str, attribute_key: &str) -> Option<String> {
|
||||||
let event = tx.tx_result.events.iter().find(|e| e.kind == event_type)?;
|
find_event_attribute(&tx.tx_result.events, event_type, attribute_key)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn find_event_attribute(
|
||||||
|
events: &[Event],
|
||||||
|
event_type: &str,
|
||||||
|
attribute_key: &str,
|
||||||
|
) -> Option<String> {
|
||||||
|
let event = events.iter().find(|e| e.kind == event_type)?;
|
||||||
let attribute = event.attributes.iter().find(|&attr| {
|
let attribute = event.attributes.iter().find(|&attr| {
|
||||||
if let Ok(key_str) = attr.key_str() {
|
if let Ok(key_str) = attr.key_str() {
|
||||||
key_str == attribute_key
|
key_str == attribute_key
|
||||||
@@ -16,3 +28,23 @@ pub fn find_tx_attribute(tx: &TxResponse, event_type: &str, attribute_key: &str)
|
|||||||
})?;
|
})?;
|
||||||
Some(attribute.value_str().ok().map(|str| str.to_string())).flatten()
|
Some(attribute.value_str().ok().map(|str| str.to_string())).flatten()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn find_attribute_value_in_logs_or_events(
|
||||||
|
logs: &[Log],
|
||||||
|
events: &[Event],
|
||||||
|
event_type: &str,
|
||||||
|
attribute_key: &str,
|
||||||
|
) -> Option<String> {
|
||||||
|
// if logs are empty, i.e. we're using post 0.50 code, parse the events instead
|
||||||
|
if !logs.is_empty() {
|
||||||
|
#[allow(deprecated)]
|
||||||
|
return crate::nyxd::cosmwasm_client::logs::find_attribute_in_logs(
|
||||||
|
logs,
|
||||||
|
event_type,
|
||||||
|
attribute_key,
|
||||||
|
)
|
||||||
|
.map(|attr| attr.value.clone());
|
||||||
|
}
|
||||||
|
|
||||||
|
find_event_attribute(events, event_type, attribute_key)
|
||||||
|
}
|
||||||
|
|||||||
@@ -7,9 +7,10 @@ license.workspace = true
|
|||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
anyhow = { workspace = true }
|
anyhow = { workspace = true }
|
||||||
base64 = "0.13.0"
|
base64 = { workspace = true }
|
||||||
bip39 = { workspace = true }
|
bip39 = { workspace = true }
|
||||||
bs58 = { workspace = true }
|
bs58 = { workspace = true }
|
||||||
|
colored = { workspace = true }
|
||||||
comfy-table = { workspace = true }
|
comfy-table = { workspace = true }
|
||||||
cfg-if = { workspace = true }
|
cfg-if = { workspace = true }
|
||||||
clap = { workspace = true, features = ["derive"] }
|
clap = { workspace = true, features = ["derive"] }
|
||||||
@@ -21,13 +22,13 @@ humantime-serde = { workspace = true }
|
|||||||
inquire = { workspace = true }
|
inquire = { workspace = true }
|
||||||
k256 = { workspace = true, features = ["ecdsa", "sha256"] }
|
k256 = { workspace = true, features = ["ecdsa", "sha256"] }
|
||||||
log = { workspace = true }
|
log = { workspace = true }
|
||||||
rand = {version = "0.6", features = ["std"] }
|
rand = { workspace = true, features = ["std"] }
|
||||||
serde = { workspace = true, features = ["derive"] }
|
serde = { workspace = true, features = ["derive"] }
|
||||||
serde_json = { workspace = true }
|
serde_json = { workspace = true }
|
||||||
thiserror = { workspace = true }
|
thiserror = { workspace = true }
|
||||||
time = { workspace = true, features = ["parsing", "formatting"] }
|
time = { workspace = true, features = ["parsing", "formatting"] }
|
||||||
tokio = { workspace = true, features = ["sync"]}
|
tokio = { workspace = true, features = ["sync"] }
|
||||||
toml = "0.5.6"
|
toml = { workspace = true }
|
||||||
url = { workspace = true }
|
url = { workspace = true }
|
||||||
tap = { workspace = true }
|
tap = { workspace = true }
|
||||||
zeroize = { workspace = true }
|
zeroize = { workspace = true }
|
||||||
|
|||||||
@@ -0,0 +1,178 @@
|
|||||||
|
// Copyright 2024 - Nym Technologies SA <contact@nymtech.net>
|
||||||
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
|
use crate::utils::CommonConfigsWrapper;
|
||||||
|
use anyhow::{anyhow, bail};
|
||||||
|
use clap::Parser;
|
||||||
|
use colored::Colorize;
|
||||||
|
use comfy_table::Table;
|
||||||
|
use nym_credential_storage::initialise_persistent_storage;
|
||||||
|
use nym_credential_storage::storage::Storage;
|
||||||
|
use nym_credentials::ecash::bandwidth::serialiser::VersionedSerialise;
|
||||||
|
use std::path::PathBuf;
|
||||||
|
|
||||||
|
#[derive(Debug, Parser)]
|
||||||
|
pub struct Args {
|
||||||
|
/// Specify the index of the ticket to retrieve from the ticketbook.
|
||||||
|
/// By default, the current unspent value is used.
|
||||||
|
#[clap(long, group = "output")]
|
||||||
|
pub(crate) ticket_index: Option<u64>,
|
||||||
|
|
||||||
|
/// Specify whether we should display payments for ALL available tickets
|
||||||
|
#[clap(long, group = "output")]
|
||||||
|
pub(crate) full: bool,
|
||||||
|
|
||||||
|
/// Base58-encoded identity of the provider (must be 32 bytes long)
|
||||||
|
#[clap(long)]
|
||||||
|
pub(crate) provider: String,
|
||||||
|
|
||||||
|
/// Config file of the client that is supposed to use the credential.
|
||||||
|
#[clap(long, group = "source")]
|
||||||
|
pub(crate) client_config: Option<PathBuf>,
|
||||||
|
|
||||||
|
/// Path to the dedicated credential storage database
|
||||||
|
#[clap(long, group = "source")]
|
||||||
|
pub(crate) credential_storage: Option<PathBuf>,
|
||||||
|
}
|
||||||
|
|
||||||
|
pub async fn execute(args: Args) -> anyhow::Result<()> {
|
||||||
|
let credentials_store = if let Some(explicit) = args.credential_storage {
|
||||||
|
explicit
|
||||||
|
} else {
|
||||||
|
// SAFETY: at least one of them MUST HAVE been specified
|
||||||
|
let cfg = args.client_config.unwrap();
|
||||||
|
|
||||||
|
let loaded = CommonConfigsWrapper::try_load(cfg)?;
|
||||||
|
|
||||||
|
if let Ok(id) = loaded.try_get_id() {
|
||||||
|
println!("loaded config file for client '{id}'");
|
||||||
|
}
|
||||||
|
|
||||||
|
let Ok(credentials_store) = loaded.try_get_credentials_store() else {
|
||||||
|
bail!("the loaded config does not have a credentials store information")
|
||||||
|
};
|
||||||
|
credentials_store
|
||||||
|
};
|
||||||
|
|
||||||
|
let decoded_provider = bs58::decode(&args.provider).into_vec()?;
|
||||||
|
if decoded_provider.len() != 32 {
|
||||||
|
bail!("the provided provider information is malformed")
|
||||||
|
}
|
||||||
|
let provider_arr: [u8; 32] = decoded_provider.try_into().unwrap();
|
||||||
|
|
||||||
|
let persistent_storage = initialise_persistent_storage(&credentials_store).await;
|
||||||
|
let Some(mut next_ticketbook) = persistent_storage
|
||||||
|
.get_next_unspent_usable_ticketbook(0)
|
||||||
|
.await?
|
||||||
|
else {
|
||||||
|
bail!(
|
||||||
|
"there are no valid ticketbooks in the storage at {}",
|
||||||
|
credentials_store.display()
|
||||||
|
)
|
||||||
|
};
|
||||||
|
|
||||||
|
let epoch_id = next_ticketbook.ticketbook.epoch_id();
|
||||||
|
let expiration_date = next_ticketbook.ticketbook.expiration_date();
|
||||||
|
|
||||||
|
let verification_key = persistent_storage
|
||||||
|
.get_master_verification_key(epoch_id)
|
||||||
|
.await?
|
||||||
|
.ok_or_else(|| {
|
||||||
|
anyhow!("ticketbook got incorrectly imported - the master verification key is missing")
|
||||||
|
})?;
|
||||||
|
let expiration_signatures = persistent_storage
|
||||||
|
.get_expiration_date_signatures(expiration_date)
|
||||||
|
.await?
|
||||||
|
.ok_or_else(|| {
|
||||||
|
anyhow!(
|
||||||
|
"ticketbook got incorrectly imported - the expiration date signatures are missing"
|
||||||
|
)
|
||||||
|
})?;
|
||||||
|
let coin_indices_signatures = persistent_storage
|
||||||
|
.get_coin_index_signatures(epoch_id)
|
||||||
|
.await?
|
||||||
|
.ok_or_else(|| {
|
||||||
|
anyhow!("ticketbook got incorrectly imported - the coin index signatures are missing")
|
||||||
|
})?;
|
||||||
|
|
||||||
|
let ticketbook_data = next_ticketbook.ticketbook.pack();
|
||||||
|
|
||||||
|
let next_ticket = args
|
||||||
|
.ticket_index
|
||||||
|
.unwrap_or(next_ticketbook.ticketbook.spent_tickets());
|
||||||
|
let pay_info = next_ticketbook.ticketbook.generate_pay_info(provider_arr);
|
||||||
|
|
||||||
|
println!("{}", "TICKETBOOK DATA:".bold());
|
||||||
|
println!("{}", bs58::encode(&ticketbook_data.data).into_string());
|
||||||
|
println!();
|
||||||
|
|
||||||
|
// display it only for a single ticket
|
||||||
|
if !args.full {
|
||||||
|
println!("attempting to generate payment for ticket {next_ticket}...");
|
||||||
|
println!();
|
||||||
|
next_ticketbook.ticketbook.update_spent_tickets(next_ticket);
|
||||||
|
|
||||||
|
let req = next_ticketbook.ticketbook.prepare_for_spending(
|
||||||
|
&verification_key,
|
||||||
|
pay_info.into(),
|
||||||
|
&coin_indices_signatures,
|
||||||
|
&expiration_signatures,
|
||||||
|
1,
|
||||||
|
)?;
|
||||||
|
|
||||||
|
let payment = req.payment;
|
||||||
|
|
||||||
|
println!("{}", format!("PAYMENT FOR TICKET {next_ticket}: ").bold());
|
||||||
|
println!("{}", bs58::encode(&payment.to_bytes()).into_string());
|
||||||
|
return Ok(());
|
||||||
|
}
|
||||||
|
|
||||||
|
println!(
|
||||||
|
"generating payment information for {} tickets. this might take a while!...",
|
||||||
|
next_ticketbook.ticketbook.params_total_tickets()
|
||||||
|
);
|
||||||
|
|
||||||
|
// otherwise generate all the payments
|
||||||
|
let last_spent = next_ticketbook.ticketbook.spent_tickets();
|
||||||
|
|
||||||
|
let mut table = Table::new();
|
||||||
|
table.set_header(vec!["index", "binary data", "spend status"]);
|
||||||
|
|
||||||
|
for i in 0..next_ticketbook.ticketbook.params_total_tickets() {
|
||||||
|
let status = if i < last_spent {
|
||||||
|
"SPENT".red()
|
||||||
|
} else {
|
||||||
|
"NOT SPENT".green()
|
||||||
|
};
|
||||||
|
|
||||||
|
next_ticketbook.ticketbook.update_spent_tickets(i);
|
||||||
|
|
||||||
|
let req = next_ticketbook.ticketbook.prepare_for_spending(
|
||||||
|
&verification_key,
|
||||||
|
pay_info.into(),
|
||||||
|
&coin_indices_signatures,
|
||||||
|
&expiration_signatures,
|
||||||
|
1,
|
||||||
|
)?;
|
||||||
|
|
||||||
|
let payment = req.payment;
|
||||||
|
let payment_bytes = payment.to_bytes();
|
||||||
|
let len = payment_bytes.len();
|
||||||
|
let display_size = 100;
|
||||||
|
let remaining = len - display_size;
|
||||||
|
|
||||||
|
table.add_row(vec![
|
||||||
|
i.to_string(),
|
||||||
|
format!(
|
||||||
|
"{}…{remaining}bytes remaining",
|
||||||
|
bs58::encode(&payment_bytes[..display_size]).into_string()
|
||||||
|
),
|
||||||
|
status.to_string(),
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
println!("{}", "AVAILABLE TICKETS".bold());
|
||||||
|
println!("{table}");
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
+13
-5
@@ -9,9 +9,17 @@ use nym_credential_storage::initialise_persistent_storage;
|
|||||||
use nym_id::import_credential;
|
use nym_id::import_credential;
|
||||||
use std::fs;
|
use std::fs;
|
||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
|
use std::str::FromStr;
|
||||||
|
|
||||||
fn parse_encoded_credential_data(raw: &str) -> bs58::decode::Result<Vec<u8>> {
|
#[derive(Debug, Clone)]
|
||||||
bs58::decode(raw).into_vec()
|
pub struct CredentialDataWrapper(Vec<u8>);
|
||||||
|
|
||||||
|
impl FromStr for CredentialDataWrapper {
|
||||||
|
type Err = bs58::decode::Error;
|
||||||
|
|
||||||
|
fn from_str(s: &str) -> Result<Self, Self::Err> {
|
||||||
|
bs58::decode(s).into_vec().map(CredentialDataWrapper)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Parser)]
|
#[derive(Debug, Parser)]
|
||||||
@@ -22,8 +30,8 @@ pub struct Args {
|
|||||||
pub(crate) client_config: PathBuf,
|
pub(crate) client_config: PathBuf,
|
||||||
|
|
||||||
/// Explicitly provide the encoded credential data (as base58)
|
/// Explicitly provide the encoded credential data (as base58)
|
||||||
#[clap(long, group = "cred_data", value_parser = parse_encoded_credential_data)]
|
#[clap(long, group = "cred_data")]
|
||||||
pub(crate) credential_data: Option<Vec<u8>>,
|
pub(crate) credential_data: Option<CredentialDataWrapper>,
|
||||||
|
|
||||||
/// Specifies the path to file containing binary credential data
|
/// Specifies the path to file containing binary credential data
|
||||||
#[clap(long, group = "cred_data")]
|
#[clap(long, group = "cred_data")]
|
||||||
@@ -52,7 +60,7 @@ pub async fn execute(args: Args) -> anyhow::Result<()> {
|
|||||||
let credentials_store = initialise_persistent_storage(credentials_store).await;
|
let credentials_store = initialise_persistent_storage(credentials_store).await;
|
||||||
|
|
||||||
let raw_credential = match args.credential_data {
|
let raw_credential = match args.credential_data {
|
||||||
Some(data) => data,
|
Some(data) => data.0,
|
||||||
None => {
|
None => {
|
||||||
// SAFETY: one of those arguments must have been set
|
// SAFETY: one of those arguments must have been set
|
||||||
fs::read(args.credential_path.unwrap())?
|
fs::read(args.credential_path.unwrap())?
|
||||||
+47
-5
@@ -9,6 +9,9 @@ use nym_credential_storage::initialise_persistent_storage;
|
|||||||
use nym_credential_utils::utils;
|
use nym_credential_utils::utils;
|
||||||
use nym_credentials_interface::TicketType;
|
use nym_credentials_interface::TicketType;
|
||||||
use nym_crypto::asymmetric::identity;
|
use nym_crypto::asymmetric::identity;
|
||||||
|
use rand::rngs::OsRng;
|
||||||
|
use rand::RngCore;
|
||||||
|
use std::fs::create_dir_all;
|
||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
|
|
||||||
#[derive(Debug, Parser)]
|
#[derive(Debug, Parser)]
|
||||||
@@ -18,12 +21,20 @@ pub struct Args {
|
|||||||
pub(crate) ticketbook_type: TicketType,
|
pub(crate) ticketbook_type: TicketType,
|
||||||
|
|
||||||
/// Config file of the client that is supposed to use the credential.
|
/// Config file of the client that is supposed to use the credential.
|
||||||
#[clap(long)]
|
#[clap(long, group = "output")]
|
||||||
pub(crate) client_config: PathBuf,
|
pub(crate) client_config: Option<PathBuf>,
|
||||||
|
|
||||||
|
/// Path to the dedicated credential storage database
|
||||||
|
#[clap(long, group = "output")]
|
||||||
|
pub(crate) credential_storage: Option<PathBuf>,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn execute(args: Args, client: SigningClient) -> anyhow::Result<()> {
|
async fn issue_client_ticketbook(
|
||||||
let loaded = CommonConfigsWrapper::try_load(args.client_config)?;
|
cfg: PathBuf,
|
||||||
|
typ: TicketType,
|
||||||
|
client: SigningClient,
|
||||||
|
) -> anyhow::Result<()> {
|
||||||
|
let loaded = CommonConfigsWrapper::try_load(cfg)?;
|
||||||
|
|
||||||
if let Ok(id) = loaded.try_get_id() {
|
if let Ok(id) = loaded.try_get_id() {
|
||||||
println!("loaded config file for client '{id}'");
|
println!("loaded config file for client '{id}'");
|
||||||
@@ -48,9 +59,40 @@ pub async fn execute(args: Args, client: SigningClient) -> anyhow::Result<()> {
|
|||||||
&client,
|
&client,
|
||||||
&persistent_storage,
|
&persistent_storage,
|
||||||
&private_id_key.to_bytes(),
|
&private_id_key.to_bytes(),
|
||||||
args.ticketbook_type,
|
typ,
|
||||||
)
|
)
|
||||||
.await?;
|
.await?;
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async fn issue_standalone_ticketbook(
|
||||||
|
credentials_store: PathBuf,
|
||||||
|
typ: TicketType,
|
||||||
|
client: SigningClient,
|
||||||
|
) -> anyhow::Result<()> {
|
||||||
|
println!("attempting to issue a standalone ticketbook");
|
||||||
|
|
||||||
|
let mut rng = OsRng;
|
||||||
|
let mut random_seed = [0u8; 32];
|
||||||
|
rng.fill_bytes(&mut random_seed);
|
||||||
|
|
||||||
|
if let Some(parent) = credentials_store.parent() {
|
||||||
|
create_dir_all(parent)?;
|
||||||
|
}
|
||||||
|
|
||||||
|
let persistent_storage = initialise_persistent_storage(credentials_store).await;
|
||||||
|
utils::issue_credential(&client, &persistent_storage, &random_seed, typ).await?;
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
pub async fn execute(args: Args, client: SigningClient) -> anyhow::Result<()> {
|
||||||
|
match (args.client_config, args.credential_storage) {
|
||||||
|
(Some(cfg), None) => issue_client_ticketbook(cfg, args.ticketbook_type, client).await,
|
||||||
|
(None, Some(storage)) => {
|
||||||
|
issue_standalone_ticketbook(storage, args.ticketbook_type, client).await
|
||||||
|
}
|
||||||
|
_ => unreachable!("clap should have made this branch impossible to reach!"),
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -3,6 +3,7 @@
|
|||||||
|
|
||||||
use clap::{Args, Subcommand};
|
use clap::{Args, Subcommand};
|
||||||
|
|
||||||
|
pub mod generate_ticket;
|
||||||
pub mod import_ticket_book;
|
pub mod import_ticket_book;
|
||||||
pub mod issue_ticket_book;
|
pub mod issue_ticket_book;
|
||||||
pub mod recover_ticket_book;
|
pub mod recover_ticket_book;
|
||||||
@@ -19,4 +20,5 @@ pub enum EcashCommands {
|
|||||||
IssueTicketBook(issue_ticket_book::Args),
|
IssueTicketBook(issue_ticket_book::Args),
|
||||||
RecoverTicketBook(recover_ticket_book::Args),
|
RecoverTicketBook(recover_ticket_book::Args),
|
||||||
ImportTicketBook(import_ticket_book::Args),
|
ImportTicketBook(import_ticket_book::Args),
|
||||||
|
GenerateTicket(generate_ticket::Args),
|
||||||
}
|
}
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
// 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
|
||||||
|
|
||||||
pub mod coconut;
|
|
||||||
pub mod context;
|
pub mod context;
|
||||||
|
pub mod ecash;
|
||||||
pub mod utils;
|
pub mod utils;
|
||||||
pub mod validator;
|
pub mod validator;
|
||||||
|
|||||||
@@ -10,7 +10,11 @@ pub struct Args {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn decode_mixnode_key(args: Args) {
|
pub fn decode_mixnode_key(args: Args) {
|
||||||
let b64_decoded = base64::decode(args.key).expect("failed to decode base64 string");
|
use base64::{engine::general_purpose::STANDARD, Engine as _};
|
||||||
|
|
||||||
|
let b64_decoded = STANDARD
|
||||||
|
.decode(args.key)
|
||||||
|
.expect("failed to decode base64 string");
|
||||||
let b58_encoded = bs58::encode(&b64_decoded).into_string();
|
let b58_encoded = bs58::encode(&b64_decoded).into_string();
|
||||||
|
|
||||||
println!("{b58_encoded}")
|
println!("{b58_encoded}")
|
||||||
|
|||||||
@@ -3,9 +3,7 @@
|
|||||||
|
|
||||||
use crate::errors::{Error, Result};
|
use crate::errors::{Error, Result};
|
||||||
use log::*;
|
use log::*;
|
||||||
use nym_bandwidth_controller::acquire::{
|
use nym_bandwidth_controller::acquire::{get_ticket_book, query_and_persist_required_global_data};
|
||||||
get_ticket_book, query_and_persist_required_global_signatures,
|
|
||||||
};
|
|
||||||
use nym_client_core::config::disk_persistence::CommonClientPaths;
|
use nym_client_core::config::disk_persistence::CommonClientPaths;
|
||||||
use nym_config::DEFAULT_DATA_DIR;
|
use nym_config::DEFAULT_DATA_DIR;
|
||||||
use nym_credential_storage::persistent_storage::PersistentStorage;
|
use nym_credential_storage::persistent_storage::PersistentStorage;
|
||||||
@@ -45,14 +43,10 @@ where
|
|||||||
let apis = all_ecash_api_clients(client, epoch_id).await?;
|
let apis = all_ecash_api_clients(client, epoch_id).await?;
|
||||||
let ticketbook_expiration = ecash_default_expiration_date();
|
let ticketbook_expiration = ecash_default_expiration_date();
|
||||||
|
|
||||||
// make sure we have all required coin indices and expiration date signatures before attempting the deposit
|
// make sure we have all required coin indices and expiration date signatures alongside the master verification key
|
||||||
query_and_persist_required_global_signatures(
|
// before attempting the deposit
|
||||||
storage,
|
query_and_persist_required_global_data(storage, epoch_id, ticketbook_expiration, apis.clone())
|
||||||
epoch_id,
|
.await?;
|
||||||
ticketbook_expiration,
|
|
||||||
apis.clone(),
|
|
||||||
)
|
|
||||||
.await?;
|
|
||||||
|
|
||||||
let issuance_data = nym_bandwidth_controller::acquire::make_deposit(
|
let issuance_data = nym_bandwidth_controller::acquire::make_deposit(
|
||||||
client,
|
client,
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ use crate::ecash::bandwidth::CredentialSpendingData;
|
|||||||
use crate::ecash::utils::ecash_today;
|
use crate::ecash::utils::ecash_today;
|
||||||
use crate::error::Error;
|
use crate::error::Error;
|
||||||
use nym_credentials_interface::{
|
use nym_credentials_interface::{
|
||||||
CoinIndexSignature, ExpirationDateSignature, PayInfo, SecretKeyUser, TicketType,
|
CoinIndexSignature, ExpirationDateSignature, NymPayInfo, PayInfo, SecretKeyUser, TicketType,
|
||||||
VerificationKeyAuth, Wallet, WalletSignatures,
|
VerificationKeyAuth, Wallet, WalletSignatures,
|
||||||
};
|
};
|
||||||
use nym_ecash_time::EcashTime;
|
use nym_ecash_time::EcashTime;
|
||||||
@@ -114,6 +114,10 @@ impl IssuedTicketBook {
|
|||||||
&self.signatures_wallet
|
&self.signatures_wallet
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn generate_pay_info(&self, provider_pk: [u8; 32]) -> NymPayInfo {
|
||||||
|
NymPayInfo::generate(provider_pk)
|
||||||
|
}
|
||||||
|
|
||||||
pub fn prepare_for_spending<BI, BE>(
|
pub fn prepare_for_spending<BI, BE>(
|
||||||
&mut self,
|
&mut self,
|
||||||
verification_key: &VerificationKeyAuth,
|
verification_key: &VerificationKeyAuth,
|
||||||
|
|||||||
@@ -37,10 +37,13 @@ impl BandwidthManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Creates a new bandwidth entry for the particular client.
|
/// Creates a new bandwidth entry for the particular client.
|
||||||
pub(crate) async fn insert_new_client(&self, client_id: i64) -> Result<(), sqlx::Error> {
|
pub(crate) async fn insert_new_client_if_doesnt_exist(
|
||||||
|
&self,
|
||||||
|
client_id: i64,
|
||||||
|
) -> Result<(), sqlx::Error> {
|
||||||
// FIXME: hack; we need to change api slightly
|
// FIXME: hack; we need to change api slightly
|
||||||
sqlx::query!(
|
sqlx::query!(
|
||||||
"INSERT INTO available_bandwidth(client_id, available, expiration) VALUES (?, 0, ?)",
|
"INSERT OR IGNORE INTO available_bandwidth(client_id, available, expiration) VALUES (?, 0, ?)",
|
||||||
client_id,
|
client_id,
|
||||||
OffsetDateTime::UNIX_EPOCH,
|
OffsetDateTime::UNIX_EPOCH,
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -35,6 +35,13 @@ pub trait Storage: Send + Sync {
|
|||||||
client_address: DestinationAddressBytes,
|
client_address: DestinationAddressBytes,
|
||||||
) -> Result<i64, StorageError>;
|
) -> Result<i64, StorageError>;
|
||||||
|
|
||||||
|
/// Creates all relevant database entries for the newly registered client
|
||||||
|
async fn insert_new_client(
|
||||||
|
&self,
|
||||||
|
client_address: DestinationAddressBytes,
|
||||||
|
shared_keys: &SharedKeys,
|
||||||
|
) -> Result<i64, StorageError>;
|
||||||
|
|
||||||
/// Inserts provided derived shared keys into the database.
|
/// Inserts provided derived shared keys into the database.
|
||||||
/// If keys previously existed for the provided client, they are overwritten with the new data.
|
/// If keys previously existed for the provided client, they are overwritten with the new data.
|
||||||
///
|
///
|
||||||
@@ -322,6 +329,19 @@ impl Storage for PersistentStorage {
|
|||||||
.await?)
|
.await?)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async fn insert_new_client(
|
||||||
|
&self,
|
||||||
|
client_address: DestinationAddressBytes,
|
||||||
|
shared_keys: &SharedKeys,
|
||||||
|
) -> Result<i64, StorageError> {
|
||||||
|
let id = self.insert_shared_keys(client_address, shared_keys).await?;
|
||||||
|
self.bandwidth_manager
|
||||||
|
.insert_new_client_if_doesnt_exist(id)
|
||||||
|
.await?;
|
||||||
|
|
||||||
|
Ok(id)
|
||||||
|
}
|
||||||
|
|
||||||
async fn insert_shared_keys(
|
async fn insert_shared_keys(
|
||||||
&self,
|
&self,
|
||||||
client_address: DestinationAddressBytes,
|
client_address: DestinationAddressBytes,
|
||||||
@@ -390,7 +410,9 @@ impl Storage for PersistentStorage {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async fn create_bandwidth_entry(&self, client_id: i64) -> Result<(), StorageError> {
|
async fn create_bandwidth_entry(&self, client_id: i64) -> Result<(), StorageError> {
|
||||||
self.bandwidth_manager.insert_new_client(client_id).await?;
|
self.bandwidth_manager
|
||||||
|
.insert_new_client_if_doesnt_exist(client_id)
|
||||||
|
.await?;
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -64,14 +64,19 @@ impl<St: Storage> PeerController<St> {
|
|||||||
let timeout_check_interval = tokio_stream::wrappers::IntervalStream::new(
|
let timeout_check_interval = tokio_stream::wrappers::IntervalStream::new(
|
||||||
tokio::time::interval(DEFAULT_PEER_TIMEOUT_CHECK),
|
tokio::time::interval(DEFAULT_PEER_TIMEOUT_CHECK),
|
||||||
);
|
);
|
||||||
let active_peers = peers
|
let active_peers: HashMap<Key, Peer> = peers
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.map(|peer| (peer.public_key.clone(), peer))
|
.map(|peer| (peer.public_key.clone(), peer))
|
||||||
.collect();
|
.collect();
|
||||||
let suspended_peers = suspended_peers
|
let suspended_peers: HashMap<Key, Peer> = suspended_peers
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.map(|peer| (peer.public_key.clone(), peer))
|
.map(|peer| (peer.public_key.clone(), peer))
|
||||||
.collect();
|
.collect();
|
||||||
|
let last_seen_bandwidth = active_peers
|
||||||
|
.iter()
|
||||||
|
.map(|(k, p)| (k.clone(), p.rx_bytes + p.tx_bytes))
|
||||||
|
.chain(suspended_peers.keys().map(|k| (k.clone(), 0)))
|
||||||
|
.collect();
|
||||||
|
|
||||||
PeerController {
|
PeerController {
|
||||||
storage,
|
storage,
|
||||||
@@ -81,7 +86,7 @@ impl<St: Storage> PeerController<St> {
|
|||||||
timeout_check_interval,
|
timeout_check_interval,
|
||||||
active_peers,
|
active_peers,
|
||||||
suspended_peers,
|
suspended_peers,
|
||||||
last_seen_bandwidth: HashMap::new(),
|
last_seen_bandwidth,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -192,6 +197,7 @@ impl<St: Storage> PeerController<St> {
|
|||||||
log::error!("Could not configure peer: {:?}", e);
|
log::error!("Could not configure peer: {:?}", e);
|
||||||
false
|
false
|
||||||
} else {
|
} else {
|
||||||
|
self.last_seen_bandwidth.insert(peer.public_key.clone(), peer.rx_bytes + peer.tx_bytes);
|
||||||
self.active_peers.insert(peer.public_key.clone(), peer);
|
self.active_peers.insert(peer.public_key.clone(), peer);
|
||||||
true
|
true
|
||||||
};
|
};
|
||||||
|
|||||||
+4
-5
@@ -13,11 +13,10 @@ DENOMS_EXPONENT=6
|
|||||||
REWARDING_VALIDATOR_ADDRESS=n1pefc2utwpy5w78p2kqdsfmpjxfwmn9d39k5mqa
|
REWARDING_VALIDATOR_ADDRESS=n1pefc2utwpy5w78p2kqdsfmpjxfwmn9d39k5mqa
|
||||||
MIXNET_CONTRACT_ADDRESS=n1xr3rq8yvd7qplsw5yx90ftsr2zdhg4e9z60h5duusgxpv72hud3sjkxkav
|
MIXNET_CONTRACT_ADDRESS=n1xr3rq8yvd7qplsw5yx90ftsr2zdhg4e9z60h5duusgxpv72hud3sjkxkav
|
||||||
VESTING_CONTRACT_ADDRESS=n1unyuj8qnmygvzuex3dwmg9yzt9alhvyeat0uu0jedg2wj33efl5qackslz
|
VESTING_CONTRACT_ADDRESS=n1unyuj8qnmygvzuex3dwmg9yzt9alhvyeat0uu0jedg2wj33efl5qackslz
|
||||||
ECASH_CONTRACT_ADDRESS=n1ljlwey4xdj0zs7zueepc48nkr033fca6fjgvurfvttqegm8dvsrswsul70
|
GROUP_CONTRACT_ADDRESS=n1ewmwz97xm0h8rdk8sw7h9mwn866qkx9hl9zlmagqfkhuzvwk5hhq844ue9
|
||||||
GROUP_CONTRACT_ADDRESS=n10v3rjnq4cjyccfykyams68ztce337gksuu6f0lvtl4meuwvkewaqru4uav
|
MULTISIG_CONTRACT_ADDRESS=n1tz0setr8vkh9udp8xyxgpqc89ns27k4d0jx2h942hr0ax63yjhmqz6xct8
|
||||||
MULTISIG_CONTRACT_ADDRESS=n1cemnu8as0ls45v3caunpesl8jlsfw2ff9rlwnltlecp7zrxct4dsqc2y42
|
COCONUT_DKG_CONTRACT_ADDRESS=n1v3n2ly2dp3a9ng3ff6rh26yfkn0pc5hed7w2shc5u9ca5c865utqj5elvh
|
||||||
COCONUT_DKG_CONTRACT_ADDRESS=n1zx96qgd88vqlzcxkpwzks7kqs5ctrx36xtzfc58p7q6c4ng9anlqzc4nh8
|
ECASH_CONTRACT_ADDRESS=n1v3vydvs2ued84yv3khqwtgldmgwn0elljsdh08dr5s2j9x4rc5fs9jlwz9
|
||||||
|
|
||||||
|
|
||||||
STATISTICS_SERVICE_DOMAIN_ADDRESS="http://0.0.0.0"
|
STATISTICS_SERVICE_DOMAIN_ADDRESS="http://0.0.0.0"
|
||||||
EXPLORER_API=https://sandbox-explorer.nymtech.net/api
|
EXPLORER_API=https://sandbox-explorer.nymtech.net/api
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "explorer-api"
|
name = "explorer-api"
|
||||||
version = "1.1.38"
|
version = "1.1.39"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
license.workspace = true
|
license.workspace = true
|
||||||
|
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ use nym_config::{
|
|||||||
must_get_home, read_config_from_toml_file, save_formatted_config_to_file, NymConfigTemplate,
|
must_get_home, read_config_from_toml_file, save_formatted_config_to_file, NymConfigTemplate,
|
||||||
DEFAULT_CONFIG_DIR, DEFAULT_CONFIG_FILENAME, DEFAULT_DATA_DIR, NYM_DIR,
|
DEFAULT_CONFIG_DIR, DEFAULT_CONFIG_FILENAME, DEFAULT_DATA_DIR, NYM_DIR,
|
||||||
};
|
};
|
||||||
use nym_network_defaults::{mainnet, DEFAULT_NYM_NODE_HTTP_PORT};
|
use nym_network_defaults::{mainnet, DEFAULT_NYM_NODE_HTTP_PORT, TICKETBOOK_VALIDITY_DAYS};
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
use std::io;
|
use std::io;
|
||||||
use std::net::{IpAddr, Ipv4Addr, SocketAddr};
|
use std::net::{IpAddr, Ipv4Addr, SocketAddr};
|
||||||
@@ -501,7 +501,7 @@ pub struct ZkNymTicketHandlerDebug {
|
|||||||
pub minimum_redemption_tickets: usize,
|
pub minimum_redemption_tickets: usize,
|
||||||
|
|
||||||
/// Specifies the maximum time between two subsequent tickets redemptions.
|
/// Specifies the maximum time between two subsequent tickets redemptions.
|
||||||
/// That's required as nym-apis will purge all ticket information for tickets older than 30 days.
|
/// That's required as nym-apis will purge all ticket information for tickets older than maximum validity.
|
||||||
#[serde(with = "humantime_serde")]
|
#[serde(with = "humantime_serde")]
|
||||||
pub maximum_time_between_redemption: Duration,
|
pub maximum_time_between_redemption: Duration,
|
||||||
}
|
}
|
||||||
@@ -511,7 +511,28 @@ impl ZkNymTicketHandlerDebug {
|
|||||||
pub const DEFAULT_PENDING_POLLER: Duration = Duration::from_secs(300);
|
pub const DEFAULT_PENDING_POLLER: Duration = Duration::from_secs(300);
|
||||||
pub const DEFAULT_MINIMUM_API_QUORUM: f32 = 0.8;
|
pub const DEFAULT_MINIMUM_API_QUORUM: f32 = 0.8;
|
||||||
pub const DEFAULT_MINIMUM_REDEMPTION_TICKETS: usize = 100;
|
pub const DEFAULT_MINIMUM_REDEMPTION_TICKETS: usize = 100;
|
||||||
pub const DEFAULT_MAXIMUM_TIME_BETWEEN_REDEMPTION: Duration = Duration::from_secs(86400 * 25);
|
|
||||||
|
// use min(4/5 of max validity, validity - 1), but making sure it's no greater than 1 day
|
||||||
|
// ASSUMPTION: our validity period is AT LEAST 2 days
|
||||||
|
//
|
||||||
|
// this could have been a constant, but it's more readable as a function
|
||||||
|
pub const fn default_maximum_time_between_redemption() -> Duration {
|
||||||
|
let desired_secs = TICKETBOOK_VALIDITY_DAYS * (86400 * 4) / 5;
|
||||||
|
let desired_secs_alt = (TICKETBOOK_VALIDITY_DAYS - 1) * 86400;
|
||||||
|
|
||||||
|
// can't use `min` in const context
|
||||||
|
let target_secs = if desired_secs < desired_secs_alt {
|
||||||
|
desired_secs
|
||||||
|
} else {
|
||||||
|
desired_secs_alt
|
||||||
|
};
|
||||||
|
|
||||||
|
assert!(
|
||||||
|
target_secs > 86400,
|
||||||
|
"the maximum time between redemption can't be lower than 1 day!"
|
||||||
|
);
|
||||||
|
Duration::from_secs(target_secs as u64)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Default for ZkNymTicketHandlerDebug {
|
impl Default for ZkNymTicketHandlerDebug {
|
||||||
@@ -521,7 +542,7 @@ impl Default for ZkNymTicketHandlerDebug {
|
|||||||
pending_poller: Self::DEFAULT_PENDING_POLLER,
|
pending_poller: Self::DEFAULT_PENDING_POLLER,
|
||||||
minimum_api_quorum: Self::DEFAULT_MINIMUM_API_QUORUM,
|
minimum_api_quorum: Self::DEFAULT_MINIMUM_API_QUORUM,
|
||||||
minimum_redemption_tickets: Self::DEFAULT_MINIMUM_REDEMPTION_TICKETS,
|
minimum_redemption_tickets: Self::DEFAULT_MINIMUM_REDEMPTION_TICKETS,
|
||||||
maximum_time_between_redemption: Self::DEFAULT_MAXIMUM_TIME_BETWEEN_REDEMPTION,
|
maximum_time_between_redemption: Self::default_maximum_time_between_redemption(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -122,7 +122,7 @@ pub(crate) struct CredentialHandlerConfig {
|
|||||||
pub(crate) minimum_redemption_tickets: usize,
|
pub(crate) minimum_redemption_tickets: usize,
|
||||||
|
|
||||||
/// Specifies the maximum time between two subsequent tickets redemptions.
|
/// Specifies the maximum time between two subsequent tickets redemptions.
|
||||||
/// That's required as nym-apis will purge all ticket information for tickets older than 30 days.
|
/// That's required as nym-apis will purge all ticket information for tickets older than maximum validity.
|
||||||
pub(crate) maximum_time_between_redemption: Duration,
|
pub(crate) maximum_time_between_redemption: Duration,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ use std::time::Duration;
|
|||||||
use thiserror::Error;
|
use thiserror::Error;
|
||||||
use tokio::io::{AsyncRead, AsyncWrite};
|
use tokio::io::{AsyncRead, AsyncWrite};
|
||||||
use tokio_tungstenite::tungstenite::{protocol::Message, Error as WsError};
|
use tokio_tungstenite::tungstenite::{protocol::Message, Error as WsError};
|
||||||
|
use tracing::field::debug;
|
||||||
use tracing::*;
|
use tracing::*;
|
||||||
|
|
||||||
use crate::node::client_handling::websocket::common_state::CommonHandlerState;
|
use crate::node::client_handling::websocket::common_state::CommonHandlerState;
|
||||||
@@ -298,6 +299,7 @@ where
|
|||||||
///
|
///
|
||||||
/// * `client_address`: address of the client that is going to receive the messages.
|
/// * `client_address`: address of the client that is going to receive the messages.
|
||||||
/// * `shared_keys`: shared keys derived between the client and the gateway used to encrypt and tag the messages.
|
/// * `shared_keys`: shared keys derived between the client and the gateway used to encrypt and tag the messages.
|
||||||
|
#[instrument(skip_all)]
|
||||||
async fn push_stored_messages_to_client(
|
async fn push_stored_messages_to_client(
|
||||||
&mut self,
|
&mut self,
|
||||||
client_address: DestinationAddressBytes,
|
client_address: DestinationAddressBytes,
|
||||||
@@ -306,6 +308,7 @@ where
|
|||||||
where
|
where
|
||||||
S: AsyncRead + AsyncWrite + Unpin,
|
S: AsyncRead + AsyncWrite + Unpin,
|
||||||
{
|
{
|
||||||
|
debug!("attempting to push stored messages to client");
|
||||||
let mut start_next_after = None;
|
let mut start_next_after = None;
|
||||||
loop {
|
loop {
|
||||||
// retrieve some messages
|
// retrieve some messages
|
||||||
@@ -521,6 +524,7 @@ where
|
|||||||
/// * `client_address`: address of the client wishing to authenticate.
|
/// * `client_address`: address of the client wishing to authenticate.
|
||||||
/// * `encrypted_address`: ciphertext of the address of the client wishing to authenticate.
|
/// * `encrypted_address`: ciphertext of the address of the client wishing to authenticate.
|
||||||
/// * `iv`: fresh IV received with the request.
|
/// * `iv`: fresh IV received with the request.
|
||||||
|
#[instrument(skip_all)]
|
||||||
async fn handle_authenticate(
|
async fn handle_authenticate(
|
||||||
&mut self,
|
&mut self,
|
||||||
client_protocol_version: Option<u8>,
|
client_protocol_version: Option<u8>,
|
||||||
@@ -531,6 +535,7 @@ where
|
|||||||
where
|
where
|
||||||
S: AsyncRead + AsyncWrite + Unpin,
|
S: AsyncRead + AsyncWrite + Unpin,
|
||||||
{
|
{
|
||||||
|
debug("handling client authentication");
|
||||||
let negotiated_protocol = self.negotiate_client_protocol(client_protocol_version)?;
|
let negotiated_protocol = self.negotiate_client_protocol(client_protocol_version)?;
|
||||||
// populate the negotiated protocol for future uses
|
// populate the negotiated protocol for future uses
|
||||||
self.negotiated_protocol = Some(negotiated_protocol);
|
self.negotiated_protocol = Some(negotiated_protocol);
|
||||||
@@ -610,23 +615,9 @@ where
|
|||||||
let client_id = self
|
let client_id = self
|
||||||
.shared_state
|
.shared_state
|
||||||
.storage
|
.storage
|
||||||
.insert_shared_keys(client_address, client_shared_keys)
|
.insert_new_client(client_address, client_shared_keys)
|
||||||
.await?;
|
.await?;
|
||||||
|
|
||||||
// see if we have bandwidth entry for the client already, if not, create one with zero value
|
|
||||||
if self
|
|
||||||
.shared_state
|
|
||||||
.storage
|
|
||||||
.get_available_bandwidth(client_id)
|
|
||||||
.await?
|
|
||||||
.is_none()
|
|
||||||
{
|
|
||||||
self.shared_state
|
|
||||||
.storage
|
|
||||||
.create_bandwidth_entry(client_id)
|
|
||||||
.await?;
|
|
||||||
}
|
|
||||||
|
|
||||||
self.push_stored_messages_to_client(client_address, client_shared_keys)
|
self.push_stored_messages_to_client(client_address, client_shared_keys)
|
||||||
.await?;
|
.await?;
|
||||||
|
|
||||||
@@ -639,6 +630,7 @@ where
|
|||||||
/// # Arguments
|
/// # Arguments
|
||||||
///
|
///
|
||||||
/// * `init_data`: init payload of the registration handshake.
|
/// * `init_data`: init payload of the registration handshake.
|
||||||
|
#[instrument(skip_all)]
|
||||||
async fn handle_register(
|
async fn handle_register(
|
||||||
&mut self,
|
&mut self,
|
||||||
client_protocol_version: Option<u8>,
|
client_protocol_version: Option<u8>,
|
||||||
@@ -647,6 +639,7 @@ where
|
|||||||
where
|
where
|
||||||
S: AsyncRead + AsyncWrite + Unpin + Send,
|
S: AsyncRead + AsyncWrite + Unpin + Send,
|
||||||
{
|
{
|
||||||
|
debug!("handling client registration");
|
||||||
let negotiated_protocol = self.negotiate_client_protocol(client_protocol_version)?;
|
let negotiated_protocol = self.negotiate_client_protocol(client_protocol_version)?;
|
||||||
// populate the negotiated protocol for future uses
|
// populate the negotiated protocol for future uses
|
||||||
self.negotiated_protocol = Some(negotiated_protocol);
|
self.negotiated_protocol = Some(negotiated_protocol);
|
||||||
@@ -659,7 +652,9 @@ where
|
|||||||
}
|
}
|
||||||
|
|
||||||
let shared_keys = self.perform_registration_handshake(init_data).await?;
|
let shared_keys = self.perform_registration_handshake(init_data).await?;
|
||||||
|
debug!("managed to derived shared keys");
|
||||||
let client_id = self.register_client(remote_address, &shared_keys).await?;
|
let client_id = self.register_client(remote_address, &shared_keys).await?;
|
||||||
|
event!(Level::DEBUG, client_id, protocol = negotiated_protocol);
|
||||||
|
|
||||||
let client_details = ClientDetails::new(client_id, remote_address, shared_keys);
|
let client_details = ClientDetails::new(client_id, remote_address, shared_keys);
|
||||||
|
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
// SPDX-License-Identifier: GPL-3.0-only
|
// SPDX-License-Identifier: GPL-3.0-only
|
||||||
|
|
||||||
use crate::config::Config;
|
use crate::config::Config;
|
||||||
|
use fresh::InitialAuthenticationError;
|
||||||
use nym_credentials_interface::AvailableBandwidth;
|
use nym_credentials_interface::AvailableBandwidth;
|
||||||
use nym_gateway_requests::registration::handshake::SharedKeys;
|
use nym_gateway_requests::registration::handshake::SharedKeys;
|
||||||
use nym_gateway_requests::ServerResponse;
|
use nym_gateway_requests::ServerResponse;
|
||||||
@@ -122,6 +123,12 @@ pub(crate) async fn handle_connection<R, S, St>(
|
|||||||
trace!("received shutdown signal while performing initial authentication");
|
trace!("received shutdown signal while performing initial authentication");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
// For storage error, we want to print the extended storage error, but without
|
||||||
|
// including it in the error that's returned to the clients
|
||||||
|
Some(Err(InitialAuthenticationError::StorageError(err))) => {
|
||||||
|
warn!("authentication has failed: {err}");
|
||||||
|
return;
|
||||||
|
}
|
||||||
Some(Err(err)) => {
|
Some(Err(err)) => {
|
||||||
warn!("authentication has failed: {err}");
|
warn!("authentication has failed: {err}");
|
||||||
return;
|
return;
|
||||||
|
|||||||
+1
-1
@@ -4,7 +4,7 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "nym-api"
|
name = "nym-api"
|
||||||
license = "GPL-3.0"
|
license = "GPL-3.0"
|
||||||
version = "1.1.42"
|
version = "1.1.43"
|
||||||
authors = [
|
authors = [
|
||||||
"Dave Hrycyszyn <futurechimp@users.noreply.github.com>",
|
"Dave Hrycyszyn <futurechimp@users.noreply.github.com>",
|
||||||
"Jędrzej Stuczyński <andrew@nymtech.net>",
|
"Jędrzej Stuczyński <andrew@nymtech.net>",
|
||||||
|
|||||||
@@ -16,8 +16,9 @@ use nym_coconut_dkg_common::types::{
|
|||||||
use nym_coconut_dkg_common::verification_key::{ContractVKShare, VerificationKeyShare};
|
use nym_coconut_dkg_common::verification_key::{ContractVKShare, VerificationKeyShare};
|
||||||
use nym_contracts_common::IdentityKey;
|
use nym_contracts_common::IdentityKey;
|
||||||
use nym_dkg::Threshold;
|
use nym_dkg::Threshold;
|
||||||
use nym_validator_client::nyxd::cosmwasm_client::logs::{find_attribute, NODE_INDEX};
|
use nym_validator_client::nyxd::cosmwasm_client::logs::NODE_INDEX;
|
||||||
use nym_validator_client::nyxd::cosmwasm_client::types::ExecuteResult;
|
use nym_validator_client::nyxd::cosmwasm_client::types::ExecuteResult;
|
||||||
|
use nym_validator_client::nyxd::helpers::find_attribute_value_in_logs_or_events;
|
||||||
use nym_validator_client::nyxd::AccountId;
|
use nym_validator_client::nyxd::AccountId;
|
||||||
|
|
||||||
pub(crate) struct DkgClient {
|
pub(crate) struct DkgClient {
|
||||||
@@ -168,15 +169,15 @@ impl DkgClient {
|
|||||||
.inner
|
.inner
|
||||||
.register_dealer(bte_key, identity_key, announce_address, resharing)
|
.register_dealer(bte_key, identity_key, announce_address, resharing)
|
||||||
.await?;
|
.await?;
|
||||||
let node_index = find_attribute(&res.logs, "wasm", NODE_INDEX)
|
let node_index =
|
||||||
.ok_or(EcashError::NodeIndexRecoveryError {
|
find_attribute_value_in_logs_or_events(&res.logs, &res.events, "wasm", NODE_INDEX)
|
||||||
reason: String::from("node index not found"),
|
.ok_or(EcashError::NodeIndexRecoveryError {
|
||||||
})?
|
reason: String::from("node index not found"),
|
||||||
.value
|
})?
|
||||||
.parse::<NodeIndex>()
|
.parse::<NodeIndex>()
|
||||||
.map_err(|_| EcashError::NodeIndexRecoveryError {
|
.map_err(|_| EcashError::NodeIndexRecoveryError {
|
||||||
reason: String::from("node index could not be parsed"),
|
reason: String::from("node index could not be parsed"),
|
||||||
})?;
|
})?;
|
||||||
|
|
||||||
Ok(node_index)
|
Ok(node_index)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,8 +18,9 @@ use nym_dkg::{
|
|||||||
bte::{self, decrypt_share},
|
bte::{self, decrypt_share},
|
||||||
combine_shares, try_recover_verification_keys, Dealing,
|
combine_shares, try_recover_verification_keys, Dealing,
|
||||||
};
|
};
|
||||||
use nym_validator_client::nyxd::cosmwasm_client::logs::{find_attribute, Log};
|
use nym_validator_client::nyxd::cosmwasm_client::logs::Log;
|
||||||
use nym_validator_client::nyxd::Hash;
|
use nym_validator_client::nyxd::helpers::find_attribute_value_in_logs_or_events;
|
||||||
|
use nym_validator_client::nyxd::{Event, Hash};
|
||||||
use rand::{CryptoRng, RngCore};
|
use rand::{CryptoRng, RngCore};
|
||||||
use std::collections::{BTreeMap, HashMap};
|
use std::collections::{BTreeMap, HashMap};
|
||||||
use std::ops::Deref;
|
use std::ops::Deref;
|
||||||
@@ -453,25 +454,25 @@ impl<R: RngCore + CryptoRng> DkgController<R> {
|
|||||||
key: &VerificationKeyAuth,
|
key: &VerificationKeyAuth,
|
||||||
resharing: bool,
|
resharing: bool,
|
||||||
) -> Result<u64, KeyDerivationError> {
|
) -> Result<u64, KeyDerivationError> {
|
||||||
fn extract_proposal_id_from_logs(
|
fn extract_proposal_id(
|
||||||
logs: &[Log],
|
logs: &[Log],
|
||||||
|
events: &[Event],
|
||||||
tx_hash: Hash,
|
tx_hash: Hash,
|
||||||
) -> Result<u64, KeyDerivationError> {
|
) -> Result<u64, KeyDerivationError> {
|
||||||
let event_type = "wasm";
|
let event_type = "wasm";
|
||||||
let attribute_key = DKG_PROPOSAL_ID;
|
let attribute_key = DKG_PROPOSAL_ID;
|
||||||
let proposal_attribute = find_attribute(logs, event_type, attribute_key).ok_or(
|
let proposal_value =
|
||||||
KeyDerivationError::MissingProposalIdAttribute {
|
find_attribute_value_in_logs_or_events(logs, events, event_type, attribute_key)
|
||||||
tx_hash,
|
.ok_or(KeyDerivationError::MissingProposalIdAttribute {
|
||||||
event_type: event_type.to_string(),
|
tx_hash,
|
||||||
attribute_key: attribute_key.to_string(),
|
event_type: event_type.to_string(),
|
||||||
},
|
attribute_key: attribute_key.to_string(),
|
||||||
)?;
|
})?;
|
||||||
|
|
||||||
proposal_attribute
|
proposal_value
|
||||||
.value
|
|
||||||
.parse()
|
.parse()
|
||||||
.map_err(|_| KeyDerivationError::UnparsableProposalId {
|
.map_err(|_| KeyDerivationError::UnparsableProposalId {
|
||||||
raw: proposal_attribute.value.clone(),
|
raw: proposal_value.clone(),
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -481,7 +482,7 @@ impl<R: RngCore + CryptoRng> DkgController<R> {
|
|||||||
.submit_verification_key_share(key.to_bs58(), resharing)
|
.submit_verification_key_share(key.to_bs58(), resharing)
|
||||||
.await?;
|
.await?;
|
||||||
let hash = res.transaction_hash;
|
let hash = res.transaction_hash;
|
||||||
let proposal_id = extract_proposal_id_from_logs(&res.logs, hash)?;
|
let proposal_id = extract_proposal_id(&res.logs, &res.events, hash)?;
|
||||||
debug!("Submitted own verification key share, proposal id {proposal_id} is attached to it. tx hash: {hash}");
|
debug!("Submitted own verification key share, proposal id {proposal_id} is attached to it. tx hash: {hash}");
|
||||||
|
|
||||||
Ok(proposal_id)
|
Ok(proposal_id)
|
||||||
|
|||||||
@@ -56,7 +56,7 @@ pub(crate) async fn prepare_partial_bloomfilter_builder(
|
|||||||
.try_load_partial_bloomfilter_bitmap(date, params_id)
|
.try_load_partial_bloomfilter_bitmap(date, params_id)
|
||||||
.await?
|
.await?
|
||||||
else {
|
else {
|
||||||
log::warn!("missing double spending bloomfilter bitmap for {date} (if this API hasn't been running for at least 30 days since 'ecash'-based zk-nyms were introduced this is expected)");
|
log::warn!("missing double spending bloomfilter bitmap for {date} (if this API hasn't been running for at least {days} day(s) since 'ecash'-based zk-nyms were introduced this is expected)");
|
||||||
continue;
|
continue;
|
||||||
};
|
};
|
||||||
if !filter_builder.add_bytes(&bitmap) {
|
if !filter_builder.add_bytes(&bitmap) {
|
||||||
|
|||||||
+1
-1
@@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
[package]
|
[package]
|
||||||
name = "nym-node"
|
name = "nym-node"
|
||||||
version = "1.1.6"
|
version = "1.1.7"
|
||||||
authors.workspace = true
|
authors.workspace = true
|
||||||
repository.workspace = true
|
repository.workspace = true
|
||||||
homepage.workspace = true
|
homepage.workspace = true
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ use crate::config::helpers::ephemeral_gateway_config;
|
|||||||
use crate::config::persistence::EntryGatewayPaths;
|
use crate::config::persistence::EntryGatewayPaths;
|
||||||
use crate::config::Config;
|
use crate::config::Config;
|
||||||
use crate::error::EntryGatewayError;
|
use crate::error::EntryGatewayError;
|
||||||
use nym_config::defaults::DEFAULT_CLIENT_LISTENING_PORT;
|
use nym_config::defaults::{DEFAULT_CLIENT_LISTENING_PORT, TICKETBOOK_VALIDITY_DAYS};
|
||||||
use nym_config::helpers::inaddr_any;
|
use nym_config::helpers::inaddr_any;
|
||||||
use nym_config::serde_helpers::de_maybe_port;
|
use nym_config::serde_helpers::de_maybe_port;
|
||||||
use nym_gateway::node::LocalAuthenticatorOpts;
|
use nym_gateway::node::LocalAuthenticatorOpts;
|
||||||
@@ -90,7 +90,7 @@ pub struct ZkNymTicketHandlerDebug {
|
|||||||
pub minimum_redemption_tickets: usize,
|
pub minimum_redemption_tickets: usize,
|
||||||
|
|
||||||
/// Specifies the maximum time between two subsequent tickets redemptions.
|
/// Specifies the maximum time between two subsequent tickets redemptions.
|
||||||
/// That's required as nym-apis will purge all ticket information for tickets older than 30 days.
|
/// That's required as nym-apis will purge all ticket information for tickets older than maximum validity.
|
||||||
#[serde(with = "humantime_serde")]
|
#[serde(with = "humantime_serde")]
|
||||||
pub maximum_time_between_redemption: Duration,
|
pub maximum_time_between_redemption: Duration,
|
||||||
}
|
}
|
||||||
@@ -100,7 +100,28 @@ impl ZkNymTicketHandlerDebug {
|
|||||||
pub const DEFAULT_PENDING_POLLER: Duration = Duration::from_secs(300);
|
pub const DEFAULT_PENDING_POLLER: Duration = Duration::from_secs(300);
|
||||||
pub const DEFAULT_MINIMUM_API_QUORUM: f32 = 0.8;
|
pub const DEFAULT_MINIMUM_API_QUORUM: f32 = 0.8;
|
||||||
pub const DEFAULT_MINIMUM_REDEMPTION_TICKETS: usize = 100;
|
pub const DEFAULT_MINIMUM_REDEMPTION_TICKETS: usize = 100;
|
||||||
pub const DEFAULT_MAXIMUM_TIME_BETWEEN_REDEMPTION: Duration = Duration::from_secs(86400 * 25);
|
|
||||||
|
// use min(4/5 of max validity, validity - 1), but making sure it's no greater than 1 day
|
||||||
|
// ASSUMPTION: our validity period is AT LEAST 2 days
|
||||||
|
//
|
||||||
|
// this could have been a constant, but it's more readable as a function
|
||||||
|
pub const fn default_maximum_time_between_redemption() -> Duration {
|
||||||
|
let desired_secs = TICKETBOOK_VALIDITY_DAYS * (86400 * 4) / 5;
|
||||||
|
let desired_secs_alt = (TICKETBOOK_VALIDITY_DAYS - 1) * 86400;
|
||||||
|
|
||||||
|
// can't use `min` in const context
|
||||||
|
let target_secs = if desired_secs < desired_secs_alt {
|
||||||
|
desired_secs
|
||||||
|
} else {
|
||||||
|
desired_secs_alt
|
||||||
|
};
|
||||||
|
|
||||||
|
assert!(
|
||||||
|
target_secs > 86400,
|
||||||
|
"the maximum time between redemption can't be lower than 1 day!"
|
||||||
|
);
|
||||||
|
Duration::from_secs(target_secs as u64)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Default for ZkNymTicketHandlerDebug {
|
impl Default for ZkNymTicketHandlerDebug {
|
||||||
@@ -110,7 +131,7 @@ impl Default for ZkNymTicketHandlerDebug {
|
|||||||
pending_poller: Self::DEFAULT_PENDING_POLLER,
|
pending_poller: Self::DEFAULT_PENDING_POLLER,
|
||||||
minimum_api_quorum: Self::DEFAULT_MINIMUM_API_QUORUM,
|
minimum_api_quorum: Self::DEFAULT_MINIMUM_API_QUORUM,
|
||||||
minimum_redemption_tickets: Self::DEFAULT_MINIMUM_REDEMPTION_TICKETS,
|
minimum_redemption_tickets: Self::DEFAULT_MINIMUM_REDEMPTION_TICKETS,
|
||||||
maximum_time_between_redemption: Self::DEFAULT_MAXIMUM_TIME_BETWEEN_REDEMPTION,
|
maximum_time_between_redemption: Self::default_maximum_time_between_redemption(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ use nym_credential_utils::utils::issue_credential;
|
|||||||
use nym_credentials_interface::TicketType;
|
use nym_credentials_interface::TicketType;
|
||||||
use nym_network_defaults::NymNetworkDetails;
|
use nym_network_defaults::NymNetworkDetails;
|
||||||
use nym_validator_client::{nyxd, DirectSigningHttpRpcNyxdClient};
|
use nym_validator_client::{nyxd, DirectSigningHttpRpcNyxdClient};
|
||||||
|
use std::ops::Deref;
|
||||||
use zeroize::Zeroizing;
|
use zeroize::Zeroizing;
|
||||||
|
|
||||||
/// Represents a client that can be used to acquire bandwidth. You typically create one when you
|
/// Represents a client that can be used to acquire bandwidth. You typically create one when you
|
||||||
@@ -17,7 +18,7 @@ use zeroize::Zeroizing;
|
|||||||
pub struct BandwidthAcquireClient<'a, St: Storage> {
|
pub struct BandwidthAcquireClient<'a, St: Storage> {
|
||||||
client: DirectSigningHttpRpcNyxdClient,
|
client: DirectSigningHttpRpcNyxdClient,
|
||||||
storage: &'a St,
|
storage: &'a St,
|
||||||
client_id: Zeroizing<String>,
|
client_id: Zeroizing<Vec<u8>>,
|
||||||
ticketbook_type: TicketType,
|
ticketbook_type: TicketType,
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -30,7 +31,7 @@ where
|
|||||||
network_details: NymNetworkDetails,
|
network_details: NymNetworkDetails,
|
||||||
mnemonic: String,
|
mnemonic: String,
|
||||||
storage: &'a St,
|
storage: &'a St,
|
||||||
client_id: String,
|
client_id: Vec<u8>,
|
||||||
ticketbook_type: TicketType,
|
ticketbook_type: TicketType,
|
||||||
) -> Result<Self> {
|
) -> Result<Self> {
|
||||||
let nyxd_url = network_details.endpoints[0].nyxd_url.as_str();
|
let nyxd_url = network_details.endpoints[0].nyxd_url.as_str();
|
||||||
@@ -53,7 +54,7 @@ where
|
|||||||
issue_credential(
|
issue_credential(
|
||||||
&self.client,
|
&self.client,
|
||||||
self.storage,
|
self.storage,
|
||||||
self.client_id.as_bytes(),
|
self.client_id.deref(),
|
||||||
self.ticketbook_type,
|
self.ticketbook_type,
|
||||||
)
|
)
|
||||||
.await?;
|
.await?;
|
||||||
|
|||||||
@@ -40,6 +40,7 @@ use std::net::IpAddr;
|
|||||||
use std::path::Path;
|
use std::path::Path;
|
||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
use url::Url;
|
use url::Url;
|
||||||
|
use zeroize::Zeroizing;
|
||||||
|
|
||||||
// The number of surbs to include in a message by default
|
// The number of surbs to include in a message by default
|
||||||
const DEFAULT_NUMBER_OF_SURBS: u32 = 10;
|
const DEFAULT_NUMBER_OF_SURBS: u32 = 10;
|
||||||
@@ -560,17 +561,20 @@ where
|
|||||||
if !self.config.enabled_credentials_mode {
|
if !self.config.enabled_credentials_mode {
|
||||||
return Err(Error::DisabledCredentialsMode);
|
return Err(Error::DisabledCredentialsMode);
|
||||||
}
|
}
|
||||||
let client_id = self
|
let client_id_array = Zeroizing::new(
|
||||||
.storage
|
self.storage
|
||||||
.key_store()
|
.key_store()
|
||||||
.load_keys()
|
.load_keys()
|
||||||
.await
|
.await
|
||||||
.map_err(|e| Error::KeyStorageError {
|
.map_err(|e| Error::KeyStorageError {
|
||||||
source: Box::new(e),
|
source: Box::new(e),
|
||||||
})?
|
})?
|
||||||
.identity_keypair()
|
.identity_keypair()
|
||||||
.private_key()
|
.private_key()
|
||||||
.to_base58_string();
|
.to_bytes(),
|
||||||
|
);
|
||||||
|
let client_id = client_id_array.to_vec();
|
||||||
|
|
||||||
BandwidthAcquireClient::new(
|
BandwidthAcquireClient::new(
|
||||||
self.config.network_details.clone(),
|
self.config.network_details.clone(),
|
||||||
mnemonic,
|
mnemonic,
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "nym-network-requester"
|
name = "nym-network-requester"
|
||||||
license = "GPL-3.0"
|
license = "GPL-3.0"
|
||||||
version = "1.1.40"
|
version = "1.1.41"
|
||||||
authors.workspace = true
|
authors.workspace = true
|
||||||
edition.workspace = true
|
edition.workspace = true
|
||||||
rust-version = "1.70"
|
rust-version = "1.70"
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "nym-cli"
|
name = "nym-cli"
|
||||||
version = "1.1.40"
|
version = "1.1.41"
|
||||||
authors.workspace = true
|
authors.workspace = true
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
license.workspace = true
|
license.workspace = true
|
||||||
|
|||||||
@@ -1,29 +0,0 @@
|
|||||||
use nym_cli_commands::context::{create_query_client, create_signing_client, ClientArgs};
|
|
||||||
use nym_network_defaults::NymNetworkDetails;
|
|
||||||
|
|
||||||
pub(crate) async fn execute(
|
|
||||||
global_args: ClientArgs,
|
|
||||||
coconut: nym_cli_commands::coconut::Ecash,
|
|
||||||
network_details: &NymNetworkDetails,
|
|
||||||
) -> anyhow::Result<()> {
|
|
||||||
match coconut.command {
|
|
||||||
nym_cli_commands::coconut::EcashCommands::IssueTicketBook(args) => {
|
|
||||||
nym_cli_commands::coconut::issue_ticket_book::execute(
|
|
||||||
args,
|
|
||||||
create_signing_client(global_args, network_details)?,
|
|
||||||
)
|
|
||||||
.await?
|
|
||||||
}
|
|
||||||
nym_cli_commands::coconut::EcashCommands::RecoverTicketBook(args) => {
|
|
||||||
nym_cli_commands::coconut::recover_ticket_book::execute(
|
|
||||||
args,
|
|
||||||
create_query_client(network_details)?,
|
|
||||||
)
|
|
||||||
.await?
|
|
||||||
}
|
|
||||||
nym_cli_commands::coconut::EcashCommands::ImportTicketBook(args) => {
|
|
||||||
nym_cli_commands::coconut::import_ticket_book::execute(args).await?
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
use nym_cli_commands::context::{create_query_client, create_signing_client, ClientArgs};
|
||||||
|
use nym_network_defaults::NymNetworkDetails;
|
||||||
|
|
||||||
|
pub(crate) async fn execute(
|
||||||
|
global_args: ClientArgs,
|
||||||
|
coconut: nym_cli_commands::ecash::Ecash,
|
||||||
|
network_details: &NymNetworkDetails,
|
||||||
|
) -> anyhow::Result<()> {
|
||||||
|
match coconut.command {
|
||||||
|
nym_cli_commands::ecash::EcashCommands::IssueTicketBook(args) => {
|
||||||
|
nym_cli_commands::ecash::issue_ticket_book::execute(
|
||||||
|
args,
|
||||||
|
create_signing_client(global_args, network_details)?,
|
||||||
|
)
|
||||||
|
.await?
|
||||||
|
}
|
||||||
|
nym_cli_commands::ecash::EcashCommands::RecoverTicketBook(args) => {
|
||||||
|
nym_cli_commands::ecash::recover_ticket_book::execute(
|
||||||
|
args,
|
||||||
|
create_query_client(network_details)?,
|
||||||
|
)
|
||||||
|
.await?
|
||||||
|
}
|
||||||
|
nym_cli_commands::ecash::EcashCommands::ImportTicketBook(args) => {
|
||||||
|
nym_cli_commands::ecash::import_ticket_book::execute(args).await?
|
||||||
|
}
|
||||||
|
nym_cli_commands::ecash::EcashCommands::GenerateTicket(args) => {
|
||||||
|
nym_cli_commands::ecash::generate_ticket::execute(args).await?
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
@@ -7,8 +7,8 @@ use nym_bin_common::logging::setup_logging;
|
|||||||
use nym_cli_commands::context::{get_network_details, ClientArgs};
|
use nym_cli_commands::context::{get_network_details, ClientArgs};
|
||||||
use nym_validator_client::nyxd::AccountId;
|
use nym_validator_client::nyxd::AccountId;
|
||||||
|
|
||||||
mod coconut;
|
|
||||||
mod completion;
|
mod completion;
|
||||||
|
mod ecash;
|
||||||
mod validator;
|
mod validator;
|
||||||
|
|
||||||
#[derive(Debug, Parser)]
|
#[derive(Debug, Parser)]
|
||||||
@@ -63,7 +63,7 @@ pub(crate) enum Commands {
|
|||||||
/// Sign and verify messages
|
/// Sign and verify messages
|
||||||
Signature(nym_cli_commands::validator::signature::Signature),
|
Signature(nym_cli_commands::validator::signature::Signature),
|
||||||
/// Ecash related stuff
|
/// Ecash related stuff
|
||||||
Ecash(nym_cli_commands::coconut::Ecash),
|
Ecash(nym_cli_commands::ecash::Ecash),
|
||||||
/// Query chain blocks
|
/// Query chain blocks
|
||||||
Block(nym_cli_commands::validator::block::Block),
|
Block(nym_cli_commands::validator::block::Block),
|
||||||
/// Manage and execute WASM smart contracts
|
/// Manage and execute WASM smart contracts
|
||||||
@@ -104,7 +104,7 @@ async fn execute(cli: Cli) -> anyhow::Result<()> {
|
|||||||
Commands::Signature(signature) => {
|
Commands::Signature(signature) => {
|
||||||
validator::signature::execute(signature, &network_details, mnemonic).await?
|
validator::signature::execute(signature, &network_details, mnemonic).await?
|
||||||
}
|
}
|
||||||
Commands::Ecash(coconut) => coconut::execute(args, coconut, &network_details).await?,
|
Commands::Ecash(coconut) => ecash::execute(args, coconut, &network_details).await?,
|
||||||
Commands::Block(block) => validator::block::execute(block, &network_details).await?,
|
Commands::Block(block) => validator::block::execute(block, &network_details).await?,
|
||||||
Commands::Cosmwasm(cosmwasm) => {
|
Commands::Cosmwasm(cosmwasm) => {
|
||||||
validator::cosmwasm::execute(args, cosmwasm, &network_details).await?
|
validator::cosmwasm::execute(args, cosmwasm, &network_details).await?
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "nymvisor"
|
name = "nymvisor"
|
||||||
version = "0.1.5"
|
version = "0.1.6"
|
||||||
authors.workspace = true
|
authors.workspace = true
|
||||||
repository.workspace = true
|
repository.workspace = true
|
||||||
homepage.workspace = true
|
homepage.workspace = true
|
||||||
|
|||||||
Reference in New Issue
Block a user