diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml
index 43e21e237..693266885 100644
--- a/.github/workflows/ci.yaml
+++ b/.github/workflows/ci.yaml
@@ -211,7 +211,7 @@ jobs:
check-wasm32:
- name: Check Wasm32
+ name: Check WASM32
runs-on: ubuntu-latest
steps:
- name: Checkout sources
@@ -274,12 +274,16 @@ jobs:
run: cargo clippy -p kaspa-wasm --target wasm32-unknown-unknown
build-wasm32:
- name: Build Wasm32
+ name: Build WASM32 SDK
runs-on: ubuntu-latest
steps:
- name: Checkout sources
uses: actions/checkout@v4
+ - name: Setup Environment
+ shell: bash
+ run: echo "SHORT_SHA=`git rev-parse --short HEAD`" >> $GITHUB_ENV
+
- name: Install Protoc
uses: arduino/setup-protoc@v3
with:
@@ -337,10 +341,20 @@ jobs:
key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
- name: Build wasm release
- run: cd wasm && bash build-release
-
+ run: |
+ pushd .
+ cd wasm
+ bash build-release
+ popd
+ mv wasm/release/kaspa-wasm32-sdk.zip wasm/release/kaspa-wasm32-sdk-${{ env.SHORT_SHA }}.zip
+
+ - name: Upload WASM build to GitHub
+ uses: actions/upload-artifact@v4
+ with:
+ name: kaspa-wasm32-sdk-${{ env.SHORT_SHA }}.zip
+ path: wasm/release/kaspa-wasm32-sdk-${{ env.SHORT_SHA }}.zip
build-release:
- name: Build Ubuntu Release
+ name: Build Linux Release
runs-on: ubuntu-latest
steps:
- name: Checkout sources
@@ -354,7 +368,7 @@ jobs:
- name: Install stable toolchain
uses: dtolnay/rust-toolchain@stable
- - name: Cache
+ - name: Cache Cargo Build Outputs
uses: actions/cache@v4
with:
path: |
@@ -364,14 +378,23 @@ jobs:
~/.cargo/git/db/
target/
key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
+ restore-keys: |
+ ${{ runner.os }}-cargo-
+
+ - name: Cache Toolchain
+ uses: actions/cache@v4
+ with:
+ path: |
+ ~/x-tools
+ key: ${{ runner.os }}-musl-${{ hashFiles('**/musl-toolchain/preset.sh') }}
+ restore-keys: |
+ ${{ runner.os }}-musl-
- - name: Install zig
- if: runner.os == 'Linux'
- uses: goto-bus-stop/setup-zig@v2 # needed for cargo-zigbuild
-
- - name: Build on Linux
+
+ - name: Build RK with musl toolchain
if: runner.os == 'Linux'
- # We're using musl to make the binaries statically linked and portable
run: |
- cargo install cargo-zigbuild
- cargo --verbose zigbuild --bin kaspad --bin simpa --bin rothschild --release --target x86_64-unknown-linux-gnu.2.27 # Use an older glibc version
+ # Run build script for musl toolchain
+ source musl-toolchain/build.sh
+ # Build for musl
+ cargo --verbose build --bin kaspad --bin rothschild --bin kaspa-wallet --release --target x86_64-unknown-linux-musl
diff --git a/.github/workflows/deploy.yaml b/.github/workflows/deploy.yaml
index 567adb557..8f46cb1fe 100644
--- a/.github/workflows/deploy.yaml
+++ b/.github/workflows/deploy.yaml
@@ -29,7 +29,7 @@ jobs:
- name: Install stable toolchain
uses: dtolnay/rust-toolchain@stable
- - name: Cache
+ - name: Cache Cargo Build Outputs
uses: actions/cache@v3
with:
path: |
@@ -40,23 +40,33 @@ jobs:
target/
key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
- - name: Install zig on linux
- if: runner.os == 'Linux'
- uses: goto-bus-stop/setup-zig@v2 # needed for cargo-zigbuild
+ - name: Cache Toolchain
+ uses: actions/cache@v4
+ with:
+ path: |
+ ~/x-tools
+ key: ${{ runner.os }}-musl-${{ hashFiles('**/musl-toolchain/preset.sh') }}
+ restore-keys: |
+ ${{ runner.os }}-musl-
- name: Build on Linux
if: runner.os == 'Linux'
# We're using musl to make the binaries statically linked and portable
run: |
- cargo install cargo-zigbuild
- cargo --verbose zigbuild --bin kaspad --bin simpa --bin rothschild --bin kaspa-wallet --release --target x86_64-unknown-linux-gnu.2.27 # Use an older glibc version
+ # Run build script for musl toolchain
+ source musl-toolchain/build.sh
+
+ # Go back to the workspace
+ cd $GITHUB_WORKSPACE
+
+ # Build for musl
+ cargo --verbose build --bin kaspad --bin rothschild --bin kaspa-wallet --release --target x86_64-unknown-linux-musl
mkdir bin || true
- cp target/x86_64-unknown-linux-gnu/release/kaspad bin/
- cp target/x86_64-unknown-linux-gnu/release/simpa bin/
- cp target/x86_64-unknown-linux-gnu/release/rothschild bin/
- cp target/x86_64-unknown-linux-gnu/release/kaspa-wallet bin/
- archive="bin/rusty-kaspa-${{ github.event.release.tag_name }}-linux-gnu-amd64.zip"
- asset_name="rusty-kaspa-${{ github.event.release.tag_name }}-linux-gnu-amd64.zip"
+ cp target/x86_64-unknown-linux-musl/release/kaspad bin/
+ cp target/x86_64-unknown-linux-musl/release/rothschild bin/
+ cp target/x86_64-unknown-linux-musl/release/kaspa-wallet bin/
+ archive="bin/rusty-kaspa-${{ github.event.release.tag_name }}-linux-musl-amd64.zip"
+ asset_name="rusty-kaspa-${{ github.event.release.tag_name }}-linux-musl-amd64.zip"
zip -r "${archive}" ./bin/*
echo "archive=${archive}" >> $GITHUB_ENV
echo "asset_name=${asset_name}" >> $GITHUB_ENV
diff --git a/Cargo.lock b/Cargo.lock
index 0d4703b8a..3223139b5 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -4,21 +4,21 @@ version = 3
[[package]]
name = "accessory"
-version = "1.3.0"
+version = "1.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "850bb534b9dc04744fbbb71d30ad6d25a7e4cf6dc33e223c81ef3a92ebab4e0b"
+checksum = "87537f9ae7cfa78d5b8ebd1a1db25959f5e737126be4d8eb44a5452fc4b63cde"
dependencies = [
"macroific",
"proc-macro2",
"quote",
- "syn 2.0.60",
+ "syn 2.0.75",
]
[[package]]
name = "addr2line"
-version = "0.21.0"
+version = "0.22.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb"
+checksum = "6e4503c46a5c0c7844e948c9a4d6acd9f50cccb4de1c48eb9e291ea17470c678"
dependencies = [
"gimli",
]
@@ -29,6 +29,12 @@ version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"
+[[package]]
+name = "adler2"
+version = "2.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627"
+
[[package]]
name = "aead"
version = "0.5.2"
@@ -50,17 +56,6 @@ dependencies = [
"cpufeatures",
]
-[[package]]
-name = "ahash"
-version = "0.7.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9"
-dependencies = [
- "getrandom 0.2.14",
- "once_cell",
- "version_check",
-]
-
[[package]]
name = "ahash"
version = "0.8.11"
@@ -68,7 +63,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011"
dependencies = [
"cfg-if 1.0.0",
- "getrandom 0.2.14",
+ "getrandom 0.2.15",
"once_cell",
"version_check",
"zerocopy",
@@ -126,9 +121,9 @@ dependencies = [
[[package]]
name = "anstream"
-version = "0.6.14"
+version = "0.6.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "418c75fa768af9c03be99d17643f93f79bbba589895012a80e3452a19ddda15b"
+checksum = "64e15c1ab1f89faffbf04a634d5e1962e9074f2741eef6d97f3c4e322426d526"
dependencies = [
"anstyle",
"anstyle-parse",
@@ -141,33 +136,33 @@ dependencies = [
[[package]]
name = "anstyle"
-version = "1.0.7"
+version = "1.0.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "038dfcf04a5feb68e9c60b21c9625a54c2c0616e79b72b0fd87075a056ae1d1b"
+checksum = "1bec1de6f59aedf83baf9ff929c98f2ad654b97c9510f4e70cf6f661d49fd5b1"
[[package]]
name = "anstyle-parse"
-version = "0.2.4"
+version = "0.2.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c03a11a9034d92058ceb6ee011ce58af4a9bf61491aa7e1e59ecd24bd40d22d4"
+checksum = "eb47de1e80c2b463c735db5b217a0ddc39d612e7ac9e2e96a5aed1f57616c1cb"
dependencies = [
"utf8parse",
]
[[package]]
name = "anstyle-query"
-version = "1.0.3"
+version = "1.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a64c907d4e79225ac72e2a354c9ce84d50ebb4586dee56c82b3ee73004f537f5"
+checksum = "6d36fc52c7f6c869915e99412912f22093507da8d9e942ceaf66fe4b7c14422a"
dependencies = [
"windows-sys 0.52.0",
]
[[package]]
name = "anstyle-wincon"
-version = "3.0.3"
+version = "3.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "61a38449feb7068f52bb06c12759005cf459ee52bb4adc1d5a7c4322d716fb19"
+checksum = "5bf74e1b6e971609db8ca7a9ce79fd5768ab6ae46441c572e46cf596f59e57f8"
dependencies = [
"anstyle",
"windows-sys 0.52.0",
@@ -175,9 +170,9 @@ dependencies = [
[[package]]
name = "anyhow"
-version = "1.0.82"
+version = "1.0.86"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f538837af36e6f6a9be0faa67f9a314f8119e4e4b5867c6ab40ed60360142519"
+checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da"
[[package]]
name = "approx"
@@ -208,15 +203,15 @@ dependencies = [
[[package]]
name = "arrayref"
-version = "0.3.7"
+version = "0.3.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6b4930d2cb77ce62f89ee5d5289b4ac049559b1c45539271f5ed4fdc7db34545"
+checksum = "9d151e35f61089500b617991b791fc8bfd237ae50cd5950803758a179b41e67a"
[[package]]
name = "arrayvec"
-version = "0.7.4"
+version = "0.7.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711"
+checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50"
[[package]]
name = "async-attributes"
@@ -241,22 +236,21 @@ dependencies = [
[[package]]
name = "async-channel"
-version = "2.2.1"
+version = "2.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "136d4d23bcc79e27423727b36823d86233aad06dfea531837b038394d11e9928"
+checksum = "89b47800b0be77592da0afd425cc03468052844aff33b84e33cc696f64e77b6a"
dependencies = [
"concurrent-queue",
- "event-listener 5.3.0",
- "event-listener-strategy 0.5.2",
+ "event-listener-strategy",
"futures-core",
"pin-project-lite",
]
[[package]]
name = "async-executor"
-version = "1.11.0"
+version = "1.13.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b10202063978b3351199d68f8b22c4e47e4b1b822f8d43fd862d5ea8c006b29a"
+checksum = "d7ebdfa2ebdab6b1760375fa7d6f382b9f486eac35fc994625a00e89280bdbb7"
dependencies = [
"async-task",
"concurrent-queue",
@@ -271,10 +265,10 @@ version = "2.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "05b1b633a2115cd122d73b955eadd9916c18c8f510ec9cd1686404c60ad1c29c"
dependencies = [
- "async-channel 2.2.1",
+ "async-channel 2.3.1",
"async-executor",
- "async-io 2.3.2",
- "async-lock 3.3.0",
+ "async-io 2.3.4",
+ "async-lock 3.4.0",
"blocking",
"futures-lite 2.3.0",
"once_cell",
@@ -302,21 +296,21 @@ dependencies = [
[[package]]
name = "async-io"
-version = "2.3.2"
+version = "2.3.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dcccb0f599cfa2f8ace422d3555572f47424da5648a4382a9dd0310ff8210884"
+checksum = "444b0228950ee6501b3568d3c93bf1176a1fdbc3b758dcd9475046d30f4dc7e8"
dependencies = [
- "async-lock 3.3.0",
+ "async-lock 3.4.0",
"cfg-if 1.0.0",
"concurrent-queue",
"futures-io",
"futures-lite 2.3.0",
"parking",
- "polling 3.7.0",
+ "polling 3.7.3",
"rustix 0.38.34",
"slab",
"tracing",
- "windows-sys 0.52.0",
+ "windows-sys 0.59.0",
]
[[package]]
@@ -330,12 +324,12 @@ dependencies = [
[[package]]
name = "async-lock"
-version = "3.3.0"
+version = "3.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d034b430882f8381900d3fe6f0aaa3ad94f2cb4ac519b429692a1bc2dda4ae7b"
+checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18"
dependencies = [
- "event-listener 4.0.3",
- "event-listener-strategy 0.4.0",
+ "event-listener 5.3.1",
+ "event-listener-strategy",
"pin-project-lite",
]
@@ -385,7 +379,7 @@ checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.60",
+ "syn 2.0.75",
]
[[package]]
@@ -396,22 +390,13 @@ checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de"
[[package]]
name = "async-trait"
-version = "0.1.80"
+version = "0.1.81"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c6fa2087f2753a7da8cc1c0dbfcf89579dd57458e36769de5ac750b4671737ca"
+checksum = "6e0c28dcc82d7c8ead5cb13beb15405b57b8546e93215673ff8ca0349a028107"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.60",
-]
-
-[[package]]
-name = "atomic-polyfill"
-version = "1.0.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8cf2bce30dfe09ef0bfaef228b9d414faaf7e563035494d7fe092dba54b300f4"
-dependencies = [
- "critical-section",
+ "syn 2.0.75",
]
[[package]]
@@ -455,13 +440,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3b829e4e32b91e643de6eafe82b1d90675f5874230191a4ffbc1b336dec4d6bf"
dependencies = [
"async-trait",
- "axum-core 0.3.4",
+ "axum-core",
"bitflags 1.3.2",
"bytes",
"futures-util",
"http 0.2.12",
"http-body 0.4.6",
- "hyper 0.14.28",
+ "hyper 0.14.30",
"itoa",
"matchit",
"memchr",
@@ -476,40 +461,6 @@ dependencies = [
"tower-service",
]
-[[package]]
-name = "axum"
-version = "0.7.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3a6c9af12842a67734c9a2e355436e5d03b22383ed60cf13cd0c18fbfe3dcbcf"
-dependencies = [
- "async-trait",
- "axum-core 0.4.3",
- "bytes",
- "futures-util",
- "http 1.1.0",
- "http-body 1.0.0",
- "http-body-util",
- "hyper 1.3.1",
- "hyper-util",
- "itoa",
- "matchit",
- "memchr",
- "mime",
- "percent-encoding",
- "pin-project-lite",
- "rustversion",
- "serde",
- "serde_json",
- "serde_path_to_error",
- "serde_urlencoded",
- "sync_wrapper 1.0.1",
- "tokio",
- "tower",
- "tower-layer",
- "tower-service",
- "tracing",
-]
-
[[package]]
name = "axum-core"
version = "0.3.4"
@@ -527,38 +478,17 @@ dependencies = [
"tower-service",
]
-[[package]]
-name = "axum-core"
-version = "0.4.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a15c63fd72d41492dc4f497196f5da1fb04fb7529e631d73630d1b491e47a2e3"
-dependencies = [
- "async-trait",
- "bytes",
- "futures-util",
- "http 1.1.0",
- "http-body 1.0.0",
- "http-body-util",
- "mime",
- "pin-project-lite",
- "rustversion",
- "sync_wrapper 0.1.2",
- "tower-layer",
- "tower-service",
- "tracing",
-]
-
[[package]]
name = "backtrace"
-version = "0.3.71"
+version = "0.3.73"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "26b05800d2e817c8b3b4b54abd461726265fa9789ae34330622f2db9ee696f9d"
+checksum = "5cc23269a4f8976d0a4d2e7109211a419fe30e8d88d677cd60b6bc79c5732e0a"
dependencies = [
"addr2line",
"cc",
"cfg-if 1.0.0",
"libc",
- "miniz_oxide",
+ "miniz_oxide 0.7.4",
"object",
"rustc-demangle",
]
@@ -608,30 +538,29 @@ dependencies = [
"proc-macro2",
"quote",
"regex",
- "rustc-hash",
+ "rustc-hash 1.1.0",
"shlex",
"which",
]
[[package]]
name = "bindgen"
-version = "0.65.1"
+version = "0.69.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cfdf7b466f9a4903edc73f95d6d2bcd5baf8ae620638762244d3f60143643cc5"
+checksum = "a00dc851838a2120612785d195287475a3ac45514741da670b735818822129a0"
dependencies = [
- "bitflags 1.3.2",
+ "bitflags 2.6.0",
"cexpr",
"clang-sys",
+ "itertools 0.12.1",
"lazy_static",
"lazycell",
- "peeking_take_while",
- "prettyplease",
"proc-macro2",
"quote",
"regex",
- "rustc-hash",
+ "rustc-hash 1.1.0",
"shlex",
- "syn 2.0.60",
+ "syn 2.0.75",
]
[[package]]
@@ -642,9 +571,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
[[package]]
name = "bitflags"
-version = "2.5.0"
+version = "2.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1"
+checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de"
[[package]]
name = "blake2"
@@ -677,12 +606,11 @@ dependencies = [
[[package]]
name = "blocking"
-version = "1.6.0"
+version = "1.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "495f7104e962b7356f0aeb34247aca1fe7d2e783b346582db7f2904cb5717e88"
+checksum = "703f41c54fc768e63e091340b424302bb1c29ef4aa0c7f10fe849dfb114d29ea"
dependencies = [
- "async-channel 2.2.1",
- "async-lock 3.3.0",
+ "async-channel 2.3.1",
"async-task",
"futures-io",
"futures-lite 2.3.0",
@@ -691,47 +619,26 @@ dependencies = [
[[package]]
name = "borsh"
-version = "0.9.3"
+version = "1.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "15bf3650200d8bffa99015595e10f1fbd17de07abbc25bb067da79e769939bfa"
+checksum = "a6362ed55def622cddc70a4746a68554d7b687713770de539e59a739b249f8ed"
dependencies = [
"borsh-derive",
- "hashbrown 0.11.2",
+ "cfg_aliases 0.2.1",
]
[[package]]
name = "borsh-derive"
-version = "0.9.3"
+version = "1.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6441c552f230375d18e3cc377677914d2ca2b0d36e52129fe15450a2dce46775"
+checksum = "c3ef8005764f53cd4dca619f5bf64cafd4664dada50ece25e4d81de54c80cc0b"
dependencies = [
- "borsh-derive-internal",
- "borsh-schema-derive-internal",
+ "once_cell",
"proc-macro-crate",
- "proc-macro2",
- "syn 1.0.109",
-]
-
-[[package]]
-name = "borsh-derive-internal"
-version = "0.9.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5449c28a7b352f2d1e592a8a28bf139bc71afb0764a14f3c02500935d8c44065"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn 1.0.109",
-]
-
-[[package]]
-name = "borsh-schema-derive-internal"
-version = "0.9.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cdbd5696d8bfa21d53d9fe39a714a18538bad11492a42d066dbbc395fb1951c0"
-dependencies = [
"proc-macro2",
"quote",
- "syn 1.0.109",
+ "syn 2.0.75",
+ "syn_derive",
]
[[package]]
@@ -758,9 +665,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b"
[[package]]
name = "bytes"
-version = "1.6.0"
+version = "1.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9"
+checksum = "8318a53db07bb3f8dca91a600466bdb3f2eaadeedfdbcf02e1accbad9271ba50"
[[package]]
name = "bzip2-sys"
@@ -775,9 +682,9 @@ dependencies = [
[[package]]
name = "camino"
-version = "1.1.6"
+version = "1.1.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c59e92b5a388f549b863a7bea62612c09f24c8393560709a54558a9abdfb3b9c"
+checksum = "8b96ec4966b5813e2c0507c1f86115c8c5abaadc3980879c3424042a02fd1ad3"
dependencies = [
"serde",
]
@@ -813,13 +720,13 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5"
[[package]]
name = "cc"
-version = "1.0.96"
+version = "1.1.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "065a29261d53ba54260972629f9ca6bffa69bac13cd1fed61420f7fa68b9f8bd"
+checksum = "72db2f7947ecee9b03b510377e8bb9077afa27176fdbff55c51027e976fdcc48"
dependencies = [
"jobserver",
"libc",
- "once_cell",
+ "shlex",
]
[[package]]
@@ -858,6 +765,12 @@ version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e"
+[[package]]
+name = "cfg_aliases"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724"
+
[[package]]
name = "chacha20"
version = "0.9.1"
@@ -906,7 +819,7 @@ dependencies = [
"num-traits",
"serde",
"wasm-bindgen",
- "windows-targets 0.52.5",
+ "windows-targets 0.52.6",
]
[[package]]
@@ -949,9 +862,9 @@ dependencies = [
[[package]]
name = "clang-sys"
-version = "1.7.0"
+version = "1.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "67523a3b4be3ce1989d607a828d036249522dd9c1c8de7f4dd2dae43a37369d1"
+checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4"
dependencies = [
"glob",
"libc",
@@ -975,9 +888,9 @@ dependencies = [
[[package]]
name = "clap"
-version = "4.5.4"
+version = "4.5.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "90bc066a67923782aa8515dbaea16946c5bcc5addbd668bb80af688e53e548a0"
+checksum = "ed6719fffa43d0d87e5fd8caeab59be1554fb028cd30edc88fc4369b17971019"
dependencies = [
"clap_builder",
"clap_derive",
@@ -985,9 +898,9 @@ dependencies = [
[[package]]
name = "clap_builder"
-version = "4.5.2"
+version = "4.5.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ae129e2e766ae0ec03484e609954119f123cc1fe650337e155d03b022f24f7b4"
+checksum = "216aec2b177652e3846684cbfe25c9964d18ec45234f0f5da5157b207ed1aab6"
dependencies = [
"anstream",
"anstyle",
@@ -997,27 +910,27 @@ dependencies = [
[[package]]
name = "clap_derive"
-version = "4.5.4"
+version = "4.5.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "528131438037fd55894f62d6e9f068b8f45ac57ffa77517819645d10aed04f64"
+checksum = "501d359d5f3dcaf6ecdeee48833ae73ec6e42723a1e52419c79abf9507eec0a0"
dependencies = [
- "heck",
+ "heck 0.5.0",
"proc-macro2",
"quote",
- "syn 2.0.60",
+ "syn 2.0.75",
]
[[package]]
name = "clap_lex"
-version = "0.7.0"
+version = "0.7.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "98cc8fbded0c607b7ba9dd60cd98df59af97e84d24e49c8557331cfc26d301ce"
+checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97"
[[package]]
name = "colorchoice"
-version = "1.0.1"
+version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0b6a852b24ab71dffc585bcb46eaf7959d175cb865a7152e35b348d1b2960422"
+checksum = "d3fd119d74b830634cea2a0f58bbd0d54540518a14397557951e79340abc28c0"
[[package]]
name = "concurrent-queue"
@@ -1090,24 +1003,24 @@ dependencies = [
[[package]]
name = "core-foundation-sys"
-version = "0.8.6"
+version = "0.8.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f"
+checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b"
[[package]]
name = "cpufeatures"
-version = "0.2.12"
+version = "0.2.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504"
+checksum = "51e852e6dc9a5bed1fae92dd2375037bf2b768725bf3be87811edee3249d09ad"
dependencies = [
"libc",
]
[[package]]
name = "crc32fast"
-version = "1.4.0"
+version = "1.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b3855a8a784b474f333699ef2bbca9db2c4a1f6d9088a90a2d25b1eb53111eaa"
+checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3"
dependencies = [
"cfg-if 1.0.0",
]
@@ -1121,7 +1034,7 @@ dependencies = [
"anes",
"cast",
"ciborium",
- "clap 4.5.4",
+ "clap 4.5.16",
"criterion-plot",
"is-terminal",
"itertools 0.10.5",
@@ -1146,17 +1059,11 @@ dependencies = [
"itertools 0.10.5",
]
-[[package]]
-name = "critical-section"
-version = "1.1.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7059fff8937831a9ae6f0fe4d658ffabf58f2ca96aa9dec1c889f936f705f216"
-
[[package]]
name = "crossbeam-channel"
-version = "0.5.12"
+version = "0.5.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ab3db02a9c5b5121e1e42fbdb1aeb65f5e02624cc58c43f2884c6ccac0b82f95"
+checksum = "33480d6946193aa8033910124896ca395333cae7e2d1113d1fef6c3272217df2"
dependencies = [
"crossbeam-utils",
]
@@ -1182,9 +1089,9 @@ dependencies = [
[[package]]
name = "crossbeam-utils"
-version = "0.8.19"
+version = "0.8.20"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345"
+checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80"
[[package]]
name = "crossterm"
@@ -1192,10 +1099,10 @@ version = "0.27.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f476fe445d41c9e991fd07515a6f463074b782242ccf4a5b7b1d1012e70824df"
dependencies = [
- "bitflags 2.5.0",
+ "bitflags 2.6.0",
"crossterm_winapi",
"libc",
- "mio",
+ "mio 0.8.11",
"parking_lot",
"signal-hook",
"signal-hook-mio",
@@ -1261,25 +1168,24 @@ dependencies = [
[[package]]
name = "ctrlc"
-version = "3.4.4"
+version = "3.4.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "672465ae37dc1bc6380a6547a8883d5dd397b0f1faaad4f265726cc7042a5345"
+checksum = "90eeab0aa92f3f9b4e87f258c72b139c207d251f9cbc1080a0086b86a8870dd3"
dependencies = [
- "nix",
- "windows-sys 0.52.0",
+ "nix 0.29.0",
+ "windows-sys 0.59.0",
]
[[package]]
name = "curve25519-dalek"
-version = "4.1.2"
+version = "4.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0a677b8922c94e01bdbb12126b0bc852f00447528dee1782229af9c720c3f348"
+checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be"
dependencies = [
"cfg-if 1.0.0",
"cpufeatures",
"curve25519-dalek-derive",
"fiat-crypto",
- "platforms",
"rustc_version",
"subtle",
"zeroize",
@@ -1293,14 +1199,14 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.60",
+ "syn 2.0.75",
]
[[package]]
name = "darling"
-version = "0.20.8"
+version = "0.20.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "54e36fcd13ed84ffdfda6f5be89b31287cbb80c439841fe69e04841435464391"
+checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989"
dependencies = [
"darling_core",
"darling_macro",
@@ -1308,36 +1214,37 @@ dependencies = [
[[package]]
name = "darling_core"
-version = "0.20.8"
+version = "0.20.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9c2cf1c23a687a1feeb728783b993c4e1ad83d99f351801977dd809b48d0a70f"
+checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5"
dependencies = [
"fnv",
"ident_case",
"proc-macro2",
"quote",
- "strsim 0.10.0",
- "syn 2.0.60",
+ "strsim 0.11.1",
+ "syn 2.0.75",
]
[[package]]
name = "darling_macro"
-version = "0.20.8"
+version = "0.20.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a668eda54683121533a393014d8692171709ff57a7d61f187b6e782719f8933f"
+checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806"
dependencies = [
"darling_core",
"quote",
- "syn 2.0.60",
+ "syn 2.0.75",
]
[[package]]
name = "dashmap"
-version = "5.5.3"
+version = "6.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856"
+checksum = "804c8821570c3f8b70230c2ba75ffa5c0f9a4189b9a432b6656c536712acae28"
dependencies = [
"cfg-if 1.0.0",
+ "crossbeam-utils",
"hashbrown 0.14.5",
"lock_api",
"once_cell",
@@ -1359,7 +1266,7 @@ dependencies = [
"macroific",
"proc-macro2",
"quote",
- "syn 2.0.60",
+ "syn 2.0.75",
]
[[package]]
@@ -1401,7 +1308,7 @@ dependencies = [
"darling",
"proc-macro2",
"quote",
- "syn 2.0.60",
+ "syn 2.0.75",
]
[[package]]
@@ -1411,20 +1318,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "206868b8242f27cecce124c19fd88157fbd0dd334df2587f36417bafbc85097b"
dependencies = [
"derive_builder_core",
- "syn 2.0.60",
+ "syn 2.0.75",
]
[[package]]
name = "derive_more"
-version = "0.99.17"
+version = "0.99.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321"
+checksum = "5f33878137e4dafd7fa914ad4e259e18a4e8e532b9617a2d0150262bf53abfce"
dependencies = [
"convert_case 0.4.0",
"proc-macro2",
"quote",
"rustc_version",
- "syn 1.0.109",
+ "syn 2.0.75",
]
[[package]]
@@ -1435,9 +1342,9 @@ checksum = "3c877555693c14d2f84191cfd3ad8582790fc52b5e2274b40b59cf5f5cea25c7"
[[package]]
name = "deunicode"
-version = "1.4.4"
+version = "1.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "322ef0094744e63628e6f0eb2295517f79276a5b342a4c2ff3042566ca181d4e"
+checksum = "339544cc9e2c4dc3fc7149fd630c5f22263a4fdf18a98afd0075784968b5cf00"
[[package]]
name = "dhat"
@@ -1449,7 +1356,7 @@ dependencies = [
"lazy_static",
"mintex",
"parking_lot",
- "rustc-hash",
+ "rustc-hash 1.1.0",
"serde",
"serde_json",
"thousands",
@@ -1499,17 +1406,29 @@ version = "1.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2"
+[[package]]
+name = "duct"
+version = "0.13.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e4ab5718d1224b63252cd0c6f74f6480f9ffeb117438a2e0f5cf6d9a4798929c"
+dependencies = [
+ "libc",
+ "once_cell",
+ "os_pipe",
+ "shared_child",
+]
+
[[package]]
name = "duration-string"
-version = "0.3.0"
+version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6fcc1d9ae294a15ed05aeae8e11ee5f2b3fe971c077d45a42fb20825fba6ee13"
+checksum = "2334658684d7c213e18602aa72ce37e94d1c9b535882ef6e30bc444b7514a1ee"
[[package]]
name = "either"
-version = "1.11.0"
+version = "1.13.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a47c1c47d2f5964e29c61246e81db715514cd532db6b5116a25ea3c03d6780a2"
+checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0"
[[package]]
name = "encode_unicode"
@@ -1528,13 +1447,13 @@ dependencies = [
[[package]]
name = "enum-primitive-derive"
-version = "0.2.2"
+version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c375b9c5eadb68d0a6efee2999fef292f45854c3444c86f09d8ab086ba942b0e"
+checksum = "ba7795da175654fe16979af73f81f26a8ea27638d8d9823d317016888a63dc4c"
dependencies = [
"num-traits",
"quote",
- "syn 1.0.109",
+ "syn 2.0.75",
]
[[package]]
@@ -1558,9 +1477,9 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5"
[[package]]
name = "errno"
-version = "0.3.8"
+version = "0.3.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245"
+checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba"
dependencies = [
"libc",
"windows-sys 0.52.0",
@@ -1574,43 +1493,22 @@ checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0"
[[package]]
name = "event-listener"
-version = "4.0.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "67b215c49b2b248c855fb73579eb1f4f26c38ffdc12973e20e07b91d78d5646e"
-dependencies = [
- "concurrent-queue",
- "parking",
- "pin-project-lite",
-]
-
-[[package]]
-name = "event-listener"
-version = "5.3.0"
+version = "5.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6d9944b8ca13534cdfb2800775f8dd4902ff3fc75a50101466decadfdf322a24"
+checksum = "6032be9bd27023a771701cc49f9f053c751055f71efb2e0ae5c15809093675ba"
dependencies = [
"concurrent-queue",
"parking",
"pin-project-lite",
]
-[[package]]
-name = "event-listener-strategy"
-version = "0.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "958e4d70b6d5e81971bebec42271ec641e7ff4e170a6fa605f2b8a8b65cb97d3"
-dependencies = [
- "event-listener 4.0.3",
- "pin-project-lite",
-]
-
[[package]]
name = "event-listener-strategy"
version = "0.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0f214dc438f977e6d4e3500aaa277f5ad94ca83fbbd9b1a15713ce2344ccc5a1"
dependencies = [
- "event-listener 5.3.0",
+ "event-listener 5.3.1",
"pin-project-lite",
]
@@ -1625,22 +1523,16 @@ dependencies = [
[[package]]
name = "fancy_constructor"
-version = "1.2.2"
+version = "1.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f71f317e4af73b2f8f608fac190c52eac4b1879d2145df1db2fe48881ca69435"
+checksum = "07b19d0e43eae2bfbafe4931b5e79c73fb1a849ca15cd41a761a7b8587f9a1a2"
dependencies = [
"macroific",
"proc-macro2",
"quote",
- "syn 2.0.60",
+ "syn 2.0.75",
]
-[[package]]
-name = "faster-hex"
-version = "0.6.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "51e2ce894d53b295cf97b05685aa077950ff3e8541af83217fc720a6437169f8"
-
[[package]]
name = "faster-hex"
version = "0.9.0"
@@ -1667,20 +1559,20 @@ checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a"
[[package]]
name = "fiat-crypto"
-version = "0.2.8"
+version = "0.2.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "38793c55593b33412e3ae40c2c9781ffaa6f438f6f8c10f24e71846fbd7ae01e"
+checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d"
[[package]]
name = "filetime"
-version = "0.2.23"
+version = "0.2.24"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1ee447700ac8aa0b2f2bd7bc4462ad686ba06baa6727ac149a2d6277f0d240fd"
+checksum = "bf401df4a4e3872c4fe8151134cf483738e74b67fc934d6532c882b3d24a4550"
dependencies = [
"cfg-if 1.0.0",
"libc",
- "redox_syscall 0.4.1",
- "windows-sys 0.52.0",
+ "libredox",
+ "windows-sys 0.59.0",
]
[[package]]
@@ -1691,21 +1583,21 @@ checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80"
[[package]]
name = "fixedstr"
-version = "0.5.5"
+version = "0.5.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5f4e4dfef7b590ab7d11e531d602fdfb6a3413b09924db1428902bbc4410a9a8"
+checksum = "54e049f021908beff8f8c430a99f5c136d3be69f1667346e581f446b173bc012"
dependencies = [
"serde",
]
[[package]]
name = "flate2"
-version = "1.0.30"
+version = "1.0.32"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5f54427cfd1c7829e2a139fcefea601bf088ebca651d2bf53ebc600eac295dae"
+checksum = "9c0596c1eac1f9e04ed902702e9878208b336edc9d6fddc8a48387349bab3666"
dependencies = [
"crc32fast",
- "miniz_oxide",
+ "miniz_oxide 0.8.0",
]
[[package]]
@@ -1714,21 +1606,6 @@ version = "1.0.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
-[[package]]
-name = "foreign-types"
-version = "0.3.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1"
-dependencies = [
- "foreign-types-shared",
-]
-
-[[package]]
-name = "foreign-types-shared"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b"
-
[[package]]
name = "form_urlencoded"
version = "1.2.1"
@@ -1822,7 +1699,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.60",
+ "syn 2.0.75",
]
[[package]]
@@ -1888,9 +1765,9 @@ dependencies = [
[[package]]
name = "getrandom"
-version = "0.2.14"
+version = "0.2.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "94b22e06ecb0110981051723910cbf0b5f5e09a2062dd7663334ee79a9d1286c"
+checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7"
dependencies = [
"cfg-if 1.0.0",
"js-sys",
@@ -1901,9 +1778,9 @@ dependencies = [
[[package]]
name = "gimli"
-version = "0.28.1"
+version = "0.29.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253"
+checksum = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd"
[[package]]
name = "glob"
@@ -1935,7 +1812,26 @@ dependencies = [
"futures-sink",
"futures-util",
"http 0.2.12",
- "indexmap 2.2.6",
+ "indexmap 2.4.0",
+ "slab",
+ "tokio",
+ "tokio-util",
+ "tracing",
+]
+
+[[package]]
+name = "h2"
+version = "0.4.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "524e8ac6999421f49a846c2d4411f337e53497d8ec55d67753beffa43c5d9205"
+dependencies = [
+ "atomic-waker",
+ "bytes",
+ "fnv",
+ "futures-core",
+ "futures-sink",
+ "http 1.1.0",
+ "indexmap 2.4.0",
"slab",
"tokio",
"tokio-util",
@@ -1954,22 +1850,13 @@ dependencies = [
[[package]]
name = "hash32"
-version = "0.2.1"
+version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b0c35f58762feb77d74ebe43bdbc3210f09be9fe6742234d573bacc26ed92b67"
+checksum = "47d60b12902ba28e2730cd37e95b8c9223af2808df9e902d4df49588d1470606"
dependencies = [
"byteorder",
]
-[[package]]
-name = "hashbrown"
-version = "0.11.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e"
-dependencies = [
- "ahash 0.7.8",
-]
-
[[package]]
name = "hashbrown"
version = "0.12.3"
@@ -1982,22 +1869,25 @@ version = "0.14.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1"
dependencies = [
- "ahash 0.8.11",
+ "ahash",
]
[[package]]
name = "heapless"
-version = "0.7.17"
+version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cdc6457c0eb62c71aac4bc17216026d8410337c4126773b9c5daba343f17964f"
+checksum = "0bfb9eb618601c89945a70e254898da93b13be0388091d42117462b265bb3fad"
dependencies = [
- "atomic-polyfill",
"hash32",
- "rustc_version",
- "spin",
"stable_deref_trait",
]
+[[package]]
+name = "heck"
+version = "0.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8"
+
[[package]]
name = "heck"
version = "0.5.0"
@@ -2019,6 +1909,12 @@ version = "0.3.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024"
+[[package]]
+name = "hermit-abi"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc"
+
[[package]]
name = "hex"
version = "0.4.3"
@@ -2097,9 +1993,9 @@ dependencies = [
[[package]]
name = "http-body"
-version = "1.0.0"
+version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1cac85db508abc24a2e48553ba12a996e87244a0395ce011e62b37158745d643"
+checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184"
dependencies = [
"bytes",
"http 1.1.0",
@@ -2107,14 +2003,14 @@ dependencies = [
[[package]]
name = "http-body-util"
-version = "0.1.1"
+version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0475f8b2ac86659c21b64320d5d653f9efe42acd2a4e560073ec61a155a34f1d"
+checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f"
dependencies = [
"bytes",
- "futures-core",
+ "futures-util",
"http 1.1.0",
- "http-body 1.0.0",
+ "http-body 1.0.1",
"pin-project-lite",
]
@@ -2126,9 +2022,9 @@ checksum = "add0ab9360ddbd88cfeb3bd9574a1d85cfdfa14db10b3e21d3700dbc4328758f"
[[package]]
name = "httparse"
-version = "1.8.0"
+version = "1.9.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904"
+checksum = "0fcc0b4a115bf80b728eb8ea024ad5bd707b615bfed49e0665b6e0f86fd082d9"
[[package]]
name = "httpdate"
@@ -2144,15 +2040,15 @@ checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4"
[[package]]
name = "hyper"
-version = "0.14.28"
+version = "0.14.30"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bf96e135eb83a2a8ddf766e426a841d8ddd7449d5f00d34ea02b41d2f19eef80"
+checksum = "a152ddd61dfaec7273fe8419ab357f33aee0d914c5f4efbf0d96fa749eea5ec9"
dependencies = [
"bytes",
"futures-channel",
"futures-core",
"futures-util",
- "h2",
+ "h2 0.3.26",
"http 0.2.12",
"http-body 0.4.6",
"httparse",
@@ -2168,62 +2064,72 @@ dependencies = [
[[package]]
name = "hyper"
-version = "1.3.1"
+version = "1.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fe575dd17d0862a9a33781c8c4696a55c320909004a67a00fb286ba8b1bc496d"
+checksum = "50dfd22e0e76d0f662d429a5f80fcaf3855009297eab6a0a9f8543834744ba05"
dependencies = [
"bytes",
"futures-channel",
"futures-util",
+ "h2 0.4.6",
"http 1.1.0",
- "http-body 1.0.0",
+ "http-body 1.0.1",
"httparse",
- "httpdate",
"itoa",
"pin-project-lite",
"smallvec",
"tokio",
+ "want",
]
[[package]]
-name = "hyper-timeout"
-version = "0.4.1"
+name = "hyper-rustls"
+version = "0.27.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bbb958482e8c7be4bc3cf272a766a2b0bf1a6755e7a6ae777f017a31d11b13b1"
+checksum = "5ee4be2c948921a1a5320b629c4193916ed787a7f7f293fd3f7f5a6c9de74155"
dependencies = [
- "hyper 0.14.28",
- "pin-project-lite",
+ "futures-util",
+ "http 1.1.0",
+ "hyper 1.4.1",
+ "hyper-util",
+ "rustls 0.23.12",
+ "rustls-pki-types",
"tokio",
- "tokio-io-timeout",
+ "tokio-rustls 0.26.0",
+ "tower-service",
+ "webpki-roots 0.26.5",
]
[[package]]
-name = "hyper-tls"
-version = "0.5.0"
+name = "hyper-timeout"
+version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905"
+checksum = "bbb958482e8c7be4bc3cf272a766a2b0bf1a6755e7a6ae777f017a31d11b13b1"
dependencies = [
- "bytes",
- "hyper 0.14.28",
- "native-tls",
+ "hyper 0.14.30",
+ "pin-project-lite",
"tokio",
- "tokio-native-tls",
+ "tokio-io-timeout",
]
[[package]]
name = "hyper-util"
-version = "0.1.3"
+version = "0.1.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ca38ef113da30126bbff9cd1705f9273e15d45498615d138b0c20279ac7a76aa"
+checksum = "cde7055719c54e36e95e8719f95883f22072a48ede39db7fc17a4e1d5281e9b9"
dependencies = [
"bytes",
+ "futures-channel",
"futures-util",
"http 1.1.0",
- "http-body 1.0.0",
- "hyper 1.3.1",
+ "http-body 1.0.1",
+ "hyper 1.4.1",
"pin-project-lite",
"socket2 0.5.7",
"tokio",
+ "tower",
+ "tower-service",
+ "tracing",
]
[[package]]
@@ -2237,7 +2143,7 @@ dependencies = [
"iana-time-zone-haiku",
"js-sys",
"wasm-bindgen",
- "windows-core",
+ "windows-core 0.52.0",
]
[[package]]
@@ -2276,7 +2182,7 @@ dependencies = [
"bytes",
"futures",
"http 0.2.12",
- "hyper 0.14.28",
+ "hyper 0.14.30",
"log",
"rand 0.8.5",
"tokio",
@@ -2286,16 +2192,16 @@ dependencies = [
[[package]]
name = "indexed_db_futures"
-version = "0.4.1"
+version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6cc2083760572ee02385ab8b7c02c20925d2dd1f97a1a25a8737a238608f1152"
+checksum = "43315957678a70eb21fb0d2384fe86dde0d6c859a01e24ce127eb65a0143d28c"
dependencies = [
"accessory",
"cfg-if 1.0.0",
"delegate-display",
"fancy_constructor",
"js-sys",
- "uuid 1.6.1",
+ "uuid 1.10.0",
"wasm-bindgen",
"wasm-bindgen-futures",
"web-sys",
@@ -2314,15 +2220,21 @@ dependencies = [
[[package]]
name = "indexmap"
-version = "2.2.6"
+version = "2.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26"
+checksum = "93ead53efc7ea8ed3cfb0c79fc8023fbb782a5432b52830b6518941cebe6505c"
dependencies = [
"equivalent",
"hashbrown 0.14.5",
"serde",
]
+[[package]]
+name = "indoc"
+version = "2.0.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b248f5224d1d606005e02c97f5aa4e88eeb230488bcc03bc9ca4d7991399f2b5"
+
[[package]]
name = "inout"
version = "0.1.3"
@@ -2334,9 +2246,9 @@ dependencies = [
[[package]]
name = "instant"
-version = "0.1.12"
+version = "0.1.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c"
+checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222"
dependencies = [
"cfg-if 1.0.0",
"js-sys",
@@ -2367,6 +2279,12 @@ dependencies = [
"uuid 0.8.2",
]
+[[package]]
+name = "inventory"
+version = "0.3.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f958d3d68f4167080a18141e10381e7634563984a537f2a49a30fd8e53ac5767"
+
[[package]]
name = "io-lifetimes"
version = "1.0.11"
@@ -2386,20 +2304,20 @@ checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3"
[[package]]
name = "is-terminal"
-version = "0.4.12"
+version = "0.4.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f23ff5ef2b80d608d61efee834934d862cd92461afc0560dedf493e4c033738b"
+checksum = "261f68e344040fbd0edea105bef17c66edf46f984ddb1115b775ce31be948f4b"
dependencies = [
- "hermit-abi 0.3.9",
+ "hermit-abi 0.4.0",
"libc",
"windows-sys 0.52.0",
]
[[package]]
name = "is_terminal_polyfill"
-version = "1.70.0"
+version = "1.70.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f8478577c03552c21db0e2724ffb8986a5ce7af88107e6be5d2ee6e158c12800"
+checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf"
[[package]]
name = "itertools"
@@ -2428,6 +2346,15 @@ dependencies = [
"either",
]
+[[package]]
+name = "itertools"
+version = "0.13.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186"
+dependencies = [
+ "either",
+]
+
[[package]]
name = "itoa"
version = "1.0.11"
@@ -2436,29 +2363,30 @@ checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b"
[[package]]
name = "jobserver"
-version = "0.1.31"
+version = "0.1.32"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d2b099aaa34a9751c5bf0878add70444e1ed2dd73f347be99003d4577277de6e"
+checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0"
dependencies = [
"libc",
]
[[package]]
name = "js-sys"
-version = "0.3.69"
+version = "0.3.70"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d"
+checksum = "1868808506b929d7b0cfa8f75951347aa71bb21144b7791bae35d9bccfcfe37a"
dependencies = [
"wasm-bindgen",
]
[[package]]
name = "kaspa-addresses"
-version = "0.14.1"
+version = "0.15.1"
dependencies = [
"borsh",
"criterion",
"js-sys",
+ "pyo3",
"serde",
"smallvec",
"thiserror",
@@ -2471,11 +2399,11 @@ dependencies = [
[[package]]
name = "kaspa-addressmanager"
-version = "0.14.1"
+version = "0.15.1"
dependencies = [
"borsh",
"igd-next",
- "itertools 0.11.0",
+ "itertools 0.13.0",
"kaspa-consensus-core",
"kaspa-core",
"kaspa-database",
@@ -2494,24 +2422,26 @@ dependencies = [
[[package]]
name = "kaspa-alloc"
-version = "0.14.1"
+version = "0.15.1"
dependencies = [
"mimalloc",
]
[[package]]
name = "kaspa-bip32"
-version = "0.14.1"
+version = "0.15.1"
dependencies = [
"borsh",
"bs58",
- "faster-hex 0.6.1",
- "getrandom 0.2.14",
+ "faster-hex",
+ "getrandom 0.2.15",
"hmac",
"js-sys",
+ "kaspa-consensus-core",
"kaspa-utils",
"once_cell",
"pbkdf2",
+ "pyo3",
"rand 0.8.5",
"rand_core 0.6.4",
"ripemd",
@@ -2527,7 +2457,7 @@ dependencies = [
[[package]]
name = "kaspa-cli"
-version = "0.14.1"
+version = "0.15.1"
dependencies = [
"async-trait",
"borsh",
@@ -2535,8 +2465,9 @@ dependencies = [
"convert_case 0.6.0",
"dashmap",
"downcast",
- "faster-hex 0.6.1",
+ "faster-hex",
"futures",
+ "hex",
"js-sys",
"kaspa-addresses",
"kaspa-bip32",
@@ -2548,6 +2479,7 @@ dependencies = [
"kaspa-utils",
"kaspa-wallet-core",
"kaspa-wallet-keys",
+ "kaspa-wallet-pskt",
"kaspa-wrpc-client",
"nw-sys",
"pad",
@@ -2572,11 +2504,11 @@ dependencies = [
[[package]]
name = "kaspa-connectionmanager"
-version = "0.14.1"
+version = "0.15.1"
dependencies = [
"duration-string",
"futures-util",
- "itertools 0.11.0",
+ "itertools 0.13.0",
"kaspa-addressmanager",
"kaspa-core",
"kaspa-p2p-lib",
@@ -2589,18 +2521,18 @@ dependencies = [
[[package]]
name = "kaspa-consensus"
-version = "0.14.1"
+version = "0.15.1"
dependencies = [
"arc-swap",
- "async-channel 2.2.1",
+ "async-channel 2.3.1",
"bincode",
"criterion",
"crossbeam-channel",
- "faster-hex 0.6.1",
+ "faster-hex",
"flate2",
"futures-util",
- "indexmap 2.2.6",
- "itertools 0.11.0",
+ "indexmap 2.4.0",
+ "itertools 0.13.0",
"kaspa-consensus-core",
"kaspa-consensus-notify",
"kaspa-consensusmanager",
@@ -2632,13 +2564,13 @@ dependencies = [
[[package]]
name = "kaspa-consensus-client"
-version = "0.14.1"
+version = "0.15.1"
dependencies = [
- "ahash 0.8.11",
+ "ahash",
"cfg-if 1.0.0",
- "faster-hex 0.6.1",
+ "faster-hex",
"hex",
- "itertools 0.11.0",
+ "itertools 0.13.0",
"js-sys",
"kaspa-addresses",
"kaspa-consensus-core",
@@ -2660,17 +2592,17 @@ dependencies = [
[[package]]
name = "kaspa-consensus-core"
-version = "0.14.1"
+version = "0.15.1"
dependencies = [
"async-trait",
"bincode",
"borsh",
"cfg-if 1.0.0",
"criterion",
- "faster-hex 0.6.1",
+ "faster-hex",
"futures-util",
- "getrandom 0.2.14",
- "itertools 0.11.0",
+ "getrandom 0.2.15",
+ "itertools 0.13.0",
"js-sys",
"kaspa-addresses",
"kaspa-core",
@@ -2680,6 +2612,7 @@ dependencies = [
"kaspa-muhash",
"kaspa-txscript-errors",
"kaspa-utils",
+ "pyo3",
"rand 0.8.5",
"secp256k1",
"serde",
@@ -2692,14 +2625,15 @@ dependencies = [
"web-sys",
"workflow-core",
"workflow-log",
+ "workflow-serializer",
"workflow-wasm",
]
[[package]]
name = "kaspa-consensus-notify"
-version = "0.14.1"
+version = "0.15.1"
dependencies = [
- "async-channel 2.2.1",
+ "async-channel 2.3.1",
"cfg-if 1.0.0",
"derive_more",
"futures",
@@ -2716,10 +2650,10 @@ dependencies = [
[[package]]
name = "kaspa-consensus-wasm"
-version = "0.14.1"
+version = "0.15.1"
dependencies = [
"cfg-if 1.0.0",
- "faster-hex 0.6.1",
+ "faster-hex",
"js-sys",
"kaspa-addresses",
"kaspa-consensus-client",
@@ -2740,12 +2674,12 @@ dependencies = [
[[package]]
name = "kaspa-consensusmanager"
-version = "0.14.1"
+version = "0.15.1"
dependencies = [
"duration-string",
"futures",
"futures-util",
- "itertools 0.11.0",
+ "itertools 0.13.0",
"kaspa-consensus-core",
"kaspa-consensus-notify",
"kaspa-core",
@@ -2758,7 +2692,7 @@ dependencies = [
[[package]]
name = "kaspa-core"
-version = "0.14.1"
+version = "0.15.1"
dependencies = [
"cfg-if 1.0.0",
"ctrlc",
@@ -2776,7 +2710,7 @@ dependencies = [
[[package]]
name = "kaspa-daemon"
-version = "0.14.1"
+version = "0.15.1"
dependencies = [
"async-trait",
"borsh",
@@ -2798,13 +2732,13 @@ dependencies = [
[[package]]
name = "kaspa-database"
-version = "0.14.1"
+version = "0.15.1"
dependencies = [
"bincode",
"enum-primitive-derive",
- "faster-hex 0.6.1",
- "indexmap 2.2.6",
- "itertools 0.11.0",
+ "faster-hex",
+ "indexmap 2.4.0",
+ "itertools 0.13.0",
"kaspa-hashes",
"kaspa-utils",
"num-traits",
@@ -2820,16 +2754,16 @@ dependencies = [
[[package]]
name = "kaspa-grpc-client"
-version = "0.14.1"
+version = "0.15.1"
dependencies = [
- "async-channel 2.2.1",
+ "async-channel 2.3.1",
"async-stream",
"async-trait",
- "faster-hex 0.6.1",
+ "faster-hex",
"futures",
"futures-util",
- "h2",
- "itertools 0.11.0",
+ "h2 0.4.6",
+ "itertools 0.13.0",
"kaspa-core",
"kaspa-grpc-core",
"kaspa-notify",
@@ -2842,6 +2776,7 @@ dependencies = [
"prost",
"rand 0.8.5",
"regex",
+ "rustls 0.23.12",
"thiserror",
"tokio",
"tokio-stream",
@@ -2851,14 +2786,14 @@ dependencies = [
[[package]]
name = "kaspa-grpc-core"
-version = "0.14.1"
+version = "0.15.1"
dependencies = [
- "async-channel 2.2.1",
+ "async-channel 2.3.1",
"async-stream",
"async-trait",
- "faster-hex 0.6.1",
+ "faster-hex",
"futures",
- "h2",
+ "h2 0.4.6",
"kaspa-consensus-core",
"kaspa-core",
"kaspa-notify",
@@ -2880,15 +2815,15 @@ dependencies = [
[[package]]
name = "kaspa-grpc-server"
-version = "0.14.1"
+version = "0.15.1"
dependencies = [
- "async-channel 2.2.1",
+ "async-channel 2.3.1",
"async-stream",
"async-trait",
- "faster-hex 0.6.1",
+ "faster-hex",
"futures",
- "h2",
- "itertools 0.11.0",
+ "h2 0.4.6",
+ "itertools 0.13.0",
"kaspa-consensus-core",
"kaspa-core",
"kaspa-grpc-client",
@@ -2905,23 +2840,24 @@ dependencies = [
"paste",
"prost",
"rand 0.8.5",
+ "rustls 0.23.12",
"thiserror",
"tokio",
"tokio-stream",
"tonic",
"triggered",
- "uuid 1.6.1",
+ "uuid 1.10.0",
]
[[package]]
name = "kaspa-hashes"
-version = "0.14.1"
+version = "0.15.1"
dependencies = [
"blake2b_simd",
"borsh",
"cc",
"criterion",
- "faster-hex 0.6.1",
+ "faster-hex",
"js-sys",
"kaspa-utils",
"keccak",
@@ -2936,9 +2872,9 @@ dependencies = [
[[package]]
name = "kaspa-index-core"
-version = "0.14.1"
+version = "0.15.1"
dependencies = [
- "async-channel 2.2.1",
+ "async-channel 2.3.1",
"async-trait",
"derive_more",
"futures",
@@ -2955,9 +2891,9 @@ dependencies = [
[[package]]
name = "kaspa-index-processor"
-version = "0.14.1"
+version = "0.15.1"
dependencies = [
- "async-channel 2.2.1",
+ "async-channel 2.3.1",
"async-trait",
"derive_more",
"futures",
@@ -2983,11 +2919,11 @@ dependencies = [
[[package]]
name = "kaspa-math"
-version = "0.14.1"
+version = "0.15.1"
dependencies = [
"borsh",
"criterion",
- "faster-hex 0.6.1",
+ "faster-hex",
"js-sys",
"kaspa-utils",
"malachite-base",
@@ -3004,14 +2940,14 @@ dependencies = [
[[package]]
name = "kaspa-merkle"
-version = "0.14.1"
+version = "0.15.1"
dependencies = [
"kaspa-hashes",
]
[[package]]
name = "kaspa-metrics-core"
-version = "0.14.1"
+version = "0.15.1"
dependencies = [
"async-trait",
"borsh",
@@ -3027,11 +2963,11 @@ dependencies = [
[[package]]
name = "kaspa-mining"
-version = "0.14.1"
+version = "0.15.1"
dependencies = [
"criterion",
"futures-util",
- "itertools 0.11.0",
+ "itertools 0.13.0",
"kaspa-addresses",
"kaspa-consensus-core",
"kaspa-consensusmanager",
@@ -3047,13 +2983,14 @@ dependencies = [
"secp256k1",
"serde",
"smallvec",
+ "sweep-bptree",
"thiserror",
"tokio",
]
[[package]]
name = "kaspa-mining-errors"
-version = "0.14.1"
+version = "0.15.1"
dependencies = [
"kaspa-consensus-core",
"thiserror",
@@ -3061,7 +2998,7 @@ dependencies = [
[[package]]
name = "kaspa-muhash"
-version = "0.14.1"
+version = "0.15.1"
dependencies = [
"criterion",
"kaspa-hashes",
@@ -3074,17 +3011,17 @@ dependencies = [
[[package]]
name = "kaspa-notify"
-version = "0.14.1"
+version = "0.15.1"
dependencies = [
- "async-channel 2.2.1",
+ "async-channel 2.3.1",
"async-trait",
"borsh",
"criterion",
"derive_more",
"futures",
"futures-util",
- "indexmap 2.2.6",
- "itertools 0.11.0",
+ "indexmap 2.4.0",
+ "itertools 0.13.0",
"kaspa-addresses",
"kaspa-alloc",
"kaspa-consensus-core",
@@ -3105,17 +3042,18 @@ dependencies = [
"workflow-core",
"workflow-log",
"workflow-perf-monitor",
+ "workflow-serializer",
]
[[package]]
name = "kaspa-p2p-flows"
-version = "0.14.1"
+version = "0.15.1"
dependencies = [
"async-trait",
"chrono",
"futures",
- "indexmap 2.2.6",
- "itertools 0.11.0",
+ "indexmap 2.4.0",
+ "itertools 0.13.0",
"kaspa-addressmanager",
"kaspa-connectionmanager",
"kaspa-consensus-core",
@@ -3135,19 +3073,19 @@ dependencies = [
"thiserror",
"tokio",
"tokio-stream",
- "uuid 1.6.1",
+ "uuid 1.10.0",
]
[[package]]
name = "kaspa-p2p-lib"
-version = "0.14.1"
+version = "0.15.1"
dependencies = [
"borsh",
"ctrlc",
"futures",
- "h2",
+ "h2 0.4.6",
"hex",
- "itertools 0.11.0",
+ "itertools 0.13.0",
"kaspa-consensus-core",
"kaspa-core",
"kaspa-hashes",
@@ -3166,12 +3104,12 @@ dependencies = [
"tokio-stream",
"tonic",
"tonic-build",
- "uuid 1.6.1",
+ "uuid 1.10.0",
]
[[package]]
name = "kaspa-perf-monitor"
-version = "0.14.1"
+version = "0.15.1"
dependencies = [
"kaspa-core",
"log",
@@ -3183,7 +3121,7 @@ dependencies = [
[[package]]
name = "kaspa-pow"
-version = "0.14.1"
+version = "0.15.1"
dependencies = [
"criterion",
"js-sys",
@@ -3198,46 +3136,28 @@ dependencies = [
]
[[package]]
-name = "kaspa-resolver"
+name = "kaspa-python-macros"
version = "0.14.1"
dependencies = [
- "ahash 0.8.11",
- "axum 0.7.5",
- "cfg-if 1.0.0",
- "clap 4.5.4",
- "console",
"convert_case 0.6.0",
- "futures",
- "kaspa-consensus-core",
- "kaspa-rpc-core",
- "kaspa-utils",
- "kaspa-wrpc-client",
- "mime",
- "serde",
- "serde_json",
- "thiserror",
- "tokio",
- "toml 0.8.12",
- "tower",
- "tower-http 0.5.2",
- "tracing-subscriber",
- "workflow-core",
- "workflow-http",
- "workflow-log",
- "xxhash-rust",
+ "proc-macro-error",
+ "proc-macro2",
+ "quote",
+ "regex",
+ "syn 1.0.109",
]
[[package]]
name = "kaspa-rpc-core"
-version = "0.14.1"
+version = "0.15.1"
dependencies = [
- "async-channel 2.2.1",
+ "async-channel 2.3.1",
"async-trait",
"borsh",
"cfg-if 1.0.0",
"derive_more",
"downcast",
- "faster-hex 0.6.1",
+ "faster-hex",
"hex",
"js-sys",
"kaspa-addresses",
@@ -3256,20 +3176,24 @@ dependencies = [
"kaspa-utils",
"log",
"paste",
+ "pyo3",
+ "rand 0.8.5",
"serde",
+ "serde-pyobject",
"serde-wasm-bindgen",
"serde_json",
"smallvec",
"thiserror",
- "uuid 1.6.1",
+ "uuid 1.10.0",
"wasm-bindgen",
"workflow-core",
+ "workflow-serializer",
"workflow-wasm",
]
[[package]]
name = "kaspa-rpc-macros"
-version = "0.14.1"
+version = "0.15.1"
dependencies = [
"convert_case 0.6.0",
"proc-macro-error",
@@ -3281,7 +3205,7 @@ dependencies = [
[[package]]
name = "kaspa-rpc-service"
-version = "0.14.1"
+version = "0.15.1"
dependencies = [
"async-trait",
"kaspa-addresses",
@@ -3310,21 +3234,21 @@ dependencies = [
[[package]]
name = "kaspa-testing-integration"
-version = "0.14.1"
+version = "0.15.1"
dependencies = [
- "async-channel 2.2.1",
+ "async-channel 2.3.1",
"async-trait",
"bincode",
"chrono",
- "clap 4.5.4",
+ "clap 4.5.16",
"criterion",
"crossbeam-channel",
"dhat",
- "faster-hex 0.6.1",
+ "faster-hex",
"flate2",
"futures-util",
- "indexmap 2.2.6",
- "itertools 0.11.0",
+ "indexmap 2.4.0",
+ "itertools 0.13.0",
"kaspa-addresses",
"kaspa-alloc",
"kaspa-bip32",
@@ -3370,33 +3294,39 @@ dependencies = [
[[package]]
name = "kaspa-txscript"
-version = "0.14.1"
+version = "0.15.1"
dependencies = [
"blake2b_simd",
"borsh",
+ "cfg-if 1.0.0",
"criterion",
"hex",
- "indexmap 2.2.6",
- "itertools 0.11.0",
+ "hexplay",
+ "indexmap 2.4.0",
+ "itertools 0.13.0",
"kaspa-addresses",
"kaspa-consensus-core",
"kaspa-hashes",
"kaspa-txscript-errors",
+ "kaspa-utils",
+ "kaspa-wasm-core",
"log",
"parking_lot",
"rand 0.8.5",
"secp256k1",
"serde",
+ "serde-wasm-bindgen",
"serde_json",
"sha2",
"smallvec",
"thiserror",
"wasm-bindgen",
+ "workflow-wasm",
]
[[package]]
name = "kaspa-txscript-errors"
-version = "0.14.1"
+version = "0.15.1"
dependencies = [
"secp256k1",
"thiserror",
@@ -3404,50 +3334,57 @@ dependencies = [
[[package]]
name = "kaspa-utils"
-version = "0.14.1"
+version = "0.15.1"
dependencies = [
- "async-channel 2.2.1",
+ "arc-swap",
+ "async-channel 2.3.1",
"async-trait",
"bincode",
"borsh",
"cfg-if 1.0.0",
"criterion",
+ "duct",
"event-listener 2.5.3",
- "faster-hex 0.6.1",
+ "faster-hex",
"futures-util",
"ipnet",
- "itertools 0.11.0",
+ "itertools 0.13.0",
"log",
+ "mac_address",
+ "num_cpus",
+ "once_cell",
"parking_lot",
"rand 0.8.5",
"rlimit",
"serde",
"serde_json",
+ "sha2",
"smallvec",
+ "sysinfo",
"thiserror",
"tokio",
"triggered",
- "uuid 1.6.1",
+ "uuid 1.10.0",
"wasm-bindgen",
]
[[package]]
name = "kaspa-utils-tower"
-version = "0.14.1"
+version = "0.15.1"
dependencies = [
"cfg-if 1.0.0",
"futures",
- "hyper 0.14.28",
+ "hyper 0.14.30",
"log",
"pin-project-lite",
"tokio",
"tower",
- "tower-http 0.4.4",
+ "tower-http",
]
[[package]]
name = "kaspa-utxoindex"
-version = "0.14.1"
+version = "0.15.1"
dependencies = [
"futures",
"kaspa-consensus",
@@ -3468,7 +3405,7 @@ dependencies = [
[[package]]
name = "kaspa-wallet"
-version = "0.14.1"
+version = "0.15.1"
dependencies = [
"async-std",
"async-trait",
@@ -3480,7 +3417,7 @@ dependencies = [
[[package]]
name = "kaspa-wallet-cli-wasm"
-version = "0.14.1"
+version = "0.15.1"
dependencies = [
"async-trait",
"js-sys",
@@ -3494,15 +3431,15 @@ dependencies = [
[[package]]
name = "kaspa-wallet-core"
-version = "0.14.1"
+version = "0.15.1"
dependencies = [
"aes",
- "ahash 0.8.11",
+ "ahash",
"argon2",
- "async-channel 2.2.1",
+ "async-channel 2.3.1",
"async-std",
"async-trait",
- "base64 0.21.7",
+ "base64 0.22.1",
"borsh",
"cfb-mode",
"cfg-if 1.0.0",
@@ -3513,7 +3450,7 @@ dependencies = [
"derivative",
"downcast",
"evpkdf",
- "faster-hex 0.6.1",
+ "faster-hex",
"fixedstr",
"futures",
"heapless",
@@ -3521,7 +3458,7 @@ dependencies = [
"hmac",
"home",
"indexed_db_futures",
- "itertools 0.11.0",
+ "itertools 0.13.0",
"js-sys",
"kaspa-addresses",
"kaspa-bip32",
@@ -3538,6 +3475,7 @@ dependencies = [
"kaspa-utils",
"kaspa-wallet-keys",
"kaspa-wallet-macros",
+ "kaspa-wallet-pskt",
"kaspa-wasm-core",
"kaspa-wrpc-client",
"kaspa-wrpc-wasm",
@@ -3574,12 +3512,13 @@ dependencies = [
[[package]]
name = "kaspa-wallet-keys"
-version = "0.14.1"
+version = "0.15.1"
dependencies = [
"async-trait",
"borsh",
+ "cfg-if 1.0.0",
"downcast",
- "faster-hex 0.6.1",
+ "faster-hex",
"hmac",
"js-sys",
"kaspa-addresses",
@@ -3589,6 +3528,7 @@ dependencies = [
"kaspa-txscript-errors",
"kaspa-utils",
"kaspa-wasm-core",
+ "pyo3",
"rand 0.8.5",
"ripemd",
"secp256k1",
@@ -3607,7 +3547,7 @@ dependencies = [
[[package]]
name = "kaspa-wallet-macros"
-version = "0.14.1"
+version = "0.15.1"
dependencies = [
"convert_case 0.5.0",
"proc-macro-error",
@@ -3620,9 +3560,14 @@ dependencies = [
[[package]]
name = "kaspa-wallet-pskt"
-version = "0.14.1"
+version = "0.15.1"
dependencies = [
+ "bincode",
"derive_builder",
+ "futures",
+ "hex",
+ "js-sys",
+ "kaspa-addresses",
"kaspa-bip32",
"kaspa-consensus-client",
"kaspa-consensus-core",
@@ -3632,24 +3577,29 @@ dependencies = [
"secp256k1",
"serde",
"serde-value",
+ "serde-wasm-bindgen",
"serde_json",
"serde_repr",
"thiserror",
+ "wasm-bindgen",
+ "workflow-wasm",
]
[[package]]
name = "kaspa-wasm"
-version = "0.14.1"
+version = "0.15.1"
dependencies = [
"cfg-if 1.0.0",
"js-sys",
"kaspa-addresses",
+ "kaspa-bip32",
"kaspa-consensus-core",
"kaspa-consensus-wasm",
"kaspa-core",
"kaspa-math",
"kaspa-pow",
"kaspa-rpc-core",
+ "kaspa-txscript",
"kaspa-utils",
"kaspa-wallet-core",
"kaspa-wallet-keys",
@@ -3665,16 +3615,18 @@ dependencies = [
[[package]]
name = "kaspa-wasm-core"
-version = "0.14.1"
+version = "0.15.1"
dependencies = [
- "faster-hex 0.6.1",
+ "faster-hex",
+ "hexplay",
"js-sys",
"wasm-bindgen",
+ "workflow-wasm",
]
[[package]]
name = "kaspa-wrpc-client"
-version = "0.14.1"
+version = "0.15.1"
dependencies = [
"async-std",
"async-trait",
@@ -3689,13 +3641,15 @@ dependencies = [
"kaspa-rpc-core",
"kaspa-rpc-macros",
"paste",
+ "pyo3",
"rand 0.8.5",
"regex",
+ "rustls 0.23.12",
"serde",
"serde-wasm-bindgen",
"serde_json",
"thiserror",
- "toml 0.8.12",
+ "toml",
"wasm-bindgen",
"wasm-bindgen-futures",
"workflow-core",
@@ -3703,12 +3657,13 @@ dependencies = [
"workflow-http",
"workflow-log",
"workflow-rpc",
+ "workflow-serializer",
"workflow-wasm",
]
[[package]]
name = "kaspa-wrpc-example-subscriber"
-version = "0.14.1"
+version = "0.15.1"
dependencies = [
"ctrlc",
"futures",
@@ -3723,10 +3678,10 @@ dependencies = [
[[package]]
name = "kaspa-wrpc-proxy"
-version = "0.14.1"
+version = "0.15.1"
dependencies = [
"async-trait",
- "clap 4.5.4",
+ "clap 4.5.16",
"kaspa-consensus-core",
"kaspa-grpc-client",
"kaspa-rpc-core",
@@ -3741,8 +3696,48 @@ dependencies = [
]
[[package]]
-name = "kaspa-wrpc-server"
+name = "kaspa-wrpc-python"
+version = "0.15.1"
+dependencies = [
+ "cfg-if 1.0.0",
+ "kaspa-consensus-core",
+ "kaspa-rpc-core",
+ "kaspa-wrpc-client",
+ "pyo3",
+ "pyo3-asyncio-0-21",
+ "serde_json",
+ "thiserror",
+ "workflow-core",
+ "workflow-rpc",
+]
+
+[[package]]
+name = "kaspa-wrpc-python"
version = "0.14.1"
+dependencies = [
+ "ahash 0.8.11",
+ "cfg-if 1.0.0",
+ "futures",
+ "kaspa-addresses",
+ "kaspa-consensus-core",
+ "kaspa-notify",
+ "kaspa-python-macros",
+ "kaspa-rpc-core",
+ "kaspa-rpc-macros",
+ "kaspa-wrpc-client",
+ "pyo3",
+ "pyo3-asyncio-0-21",
+ "serde-pyobject",
+ "serde_json",
+ "thiserror",
+ "workflow-core",
+ "workflow-log",
+ "workflow-rpc",
+]
+
+[[package]]
+name = "kaspa-wrpc-server"
+version = "0.15.1"
dependencies = [
"async-trait",
"borsh",
@@ -3757,21 +3752,32 @@ dependencies = [
"kaspa-utils",
"log",
"num_cpus",
- "openssl",
"paste",
+ "rustls 0.23.12",
"serde",
"thiserror",
"tokio",
"workflow-core",
"workflow-log",
"workflow-rpc",
+ "workflow-serializer",
+]
+
+[[package]]
+name = "kaspa-wrpc-simple-client-example"
+version = "0.15.1"
+dependencies = [
+ "futures",
+ "kaspa-rpc-core",
+ "kaspa-wrpc-client",
+ "tokio",
]
[[package]]
name = "kaspa-wrpc-wasm"
-version = "0.14.1"
+version = "0.15.1"
dependencies = [
- "ahash 0.8.11",
+ "ahash",
"async-std",
"cfg-if 1.0.0",
"futures",
@@ -3785,6 +3791,7 @@ dependencies = [
"kaspa-rpc-macros",
"kaspa-wasm-core",
"kaspa-wrpc-client",
+ "ring",
"serde",
"serde-wasm-bindgen",
"serde_json",
@@ -3798,10 +3805,11 @@ dependencies = [
[[package]]
name = "kaspad"
-version = "0.14.1"
+version = "0.15.1"
dependencies = [
- "async-channel 2.2.1",
- "clap 4.5.4",
+ "async-channel 2.3.1",
+ "cfg-if 1.0.0",
+ "clap 4.5.16",
"dhat",
"dirs",
"futures-util",
@@ -3837,7 +3845,7 @@ dependencies = [
"tempfile",
"thiserror",
"tokio",
- "toml 0.8.12",
+ "toml",
"workflow-log",
]
@@ -3861,9 +3869,9 @@ dependencies = [
[[package]]
name = "lazy_static"
-version = "1.4.0"
+version = "1.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
+checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
[[package]]
name = "lazycell"
@@ -3873,18 +3881,18 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55"
[[package]]
name = "libc"
-version = "0.2.154"
+version = "0.2.158"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ae743338b92ff9146ce83992f766a31066a91a8c84a45e0e9f21e7cf6de6d346"
+checksum = "d8adc4bb1803a324070e64a98ae98f38934d91957a99cfb3a43dcbc01bc56439"
[[package]]
name = "libloading"
-version = "0.8.3"
+version = "0.8.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0c2a198fb6b0eada2a8df47933734e6d35d350665a33a3593d7164fa52c75c19"
+checksum = "4979f22fdb869068da03c9f7528f8297c6fd2606bc3a4affe42e6a823fdb8da4"
dependencies = [
"cfg-if 1.0.0",
- "windows-targets 0.52.5",
+ "windows-targets 0.52.6",
]
[[package]]
@@ -3895,9 +3903,9 @@ checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058"
[[package]]
name = "libmimalloc-sys"
-version = "0.1.37"
+version = "0.1.39"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "81eb4061c0582dedea1cbc7aff2240300dd6982e0239d1c99e65c1dbf4a30ba7"
+checksum = "23aa6811d3bd4deb8a84dde645f943476d13b248d818edcf8ce0b2f37f036b44"
dependencies = [
"cc",
"libc",
@@ -3909,17 +3917,18 @@ version = "0.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d"
dependencies = [
- "bitflags 2.5.0",
+ "bitflags 2.6.0",
"libc",
+ "redox_syscall",
]
[[package]]
name = "librocksdb-sys"
-version = "0.11.0+8.1.1"
+version = "0.16.0+8.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d3386f101bcb4bd252d8e9d2fb41ec3b0862a15a62b478c355b2982efa469e3e"
+checksum = "ce3d60bc059831dc1c83903fb45c103f75db65c5a7bf22272764d9cc683e348c"
dependencies = [
- "bindgen 0.65.1",
+ "bindgen 0.69.4",
"bzip2-sys",
"cc",
"glob",
@@ -3931,9 +3940,9 @@ dependencies = [
[[package]]
name = "libz-sys"
-version = "1.1.16"
+version = "1.1.19"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5e143b5e666b2695d28f6bca6497720813f699c9602dd7f5cac91008b8ada7f9"
+checksum = "fdc53a7799a7496ebc9fd29f31f7df80e83c9bda5299768af5f9e59eeea74647"
dependencies = [
"cc",
"pkg-config",
@@ -3968,15 +3977,15 @@ checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519"
[[package]]
name = "linux-raw-sys"
-version = "0.4.13"
+version = "0.4.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c"
+checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89"
[[package]]
name = "local-ip-address"
-version = "0.5.7"
+version = "0.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "612ed4ea9ce5acfb5d26339302528a5e1e59dfed95e9e11af3c083236ff1d15d"
+checksum = "136ef34e18462b17bf39a7826f8f3bbc223341f8e83822beb8b77db9a3d49696"
dependencies = [
"libc",
"neli",
@@ -3996,9 +4005,9 @@ dependencies = [
[[package]]
name = "log"
-version = "0.4.21"
+version = "0.4.22"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c"
+checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24"
dependencies = [
"serde",
"value-bag",
@@ -4041,14 +4050,24 @@ dependencies = [
[[package]]
name = "lz4-sys"
-version = "1.9.4"
+version = "1.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "57d27b317e207b10f69f5e75494119e391a96f48861ae870d1da6edac98ca900"
+checksum = "109de74d5d2353660401699a4174a4ff23fcc649caf553df71933c7fb45ad868"
dependencies = [
"cc",
"libc",
]
+[[package]]
+name = "mac_address"
+version = "1.1.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8836fae9d0d4be2c8b4efcdd79e828a2faa058a90d005abf42f91cac5493a08e"
+dependencies = [
+ "nix 0.28.0",
+ "winapi",
+]
+
[[package]]
name = "mach"
version = "0.3.2"
@@ -4078,7 +4097,7 @@ dependencies = [
"cfg-if 1.0.0",
"proc-macro2",
"quote",
- "syn 2.0.60",
+ "syn 2.0.75",
]
[[package]]
@@ -4089,7 +4108,7 @@ checksum = "13198c120864097a565ccb3ff947672d969932b7975ebd4085732c9f09435e55"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.60",
+ "syn 2.0.75",
]
[[package]]
@@ -4102,14 +4121,14 @@ dependencies = [
"macroific_core",
"proc-macro2",
"quote",
- "syn 2.0.60",
+ "syn 2.0.75",
]
[[package]]
name = "malachite-base"
-version = "0.4.7"
+version = "0.4.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d073a3d1e4e037975af5ef176a2632672e25e8ddbe8e1811745c2e0726b6ad94"
+checksum = "e5f8d7930df6fcb9c86761ca0999ba484d7b6469c81cee4a7d38da5386440f96"
dependencies = [
"hashbrown 0.14.5",
"itertools 0.11.0",
@@ -4119,9 +4138,9 @@ dependencies = [
[[package]]
name = "malachite-nz"
-version = "0.4.7"
+version = "0.4.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2546fc6ae29728079e87a2a0f011509e6060713b65e62ee46ba5d413b495ebc7"
+checksum = "fa263ca62420c1f65cf6758f55c979a49ad83169f332e602b1890f1e1277a429"
dependencies = [
"itertools 0.11.0",
"libm",
@@ -4164,15 +4183,33 @@ dependencies = [
[[package]]
name = "memchr"
-version = "2.7.2"
+version = "2.7.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3"
+
+[[package]]
+name = "memoffset"
+version = "0.9.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d"
+checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a"
+dependencies = [
+ "autocfg",
+]
+
+[[package]]
+name = "memoffset"
+version = "0.9.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a"
+dependencies = [
+ "autocfg",
+]
[[package]]
name = "mimalloc"
-version = "0.1.41"
+version = "0.1.43"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9f41a2280ded0da56c8cf898babb86e8f10651a34adcfff190ae9a1159c6908d"
+checksum = "68914350ae34959d83f732418d51e2427a794055d0b9529f48259ac07af65633"
dependencies = [
"libmimalloc-sys",
]
@@ -4183,6 +4220,16 @@ version = "0.3.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a"
+[[package]]
+name = "minicov"
+version = "0.3.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5c71e683cd655513b99affab7d317deb690528255a0d5f717f1024093c12b169"
+dependencies = [
+ "cc",
+ "walkdir",
+]
+
[[package]]
name = "minimal-lexical"
version = "0.2.1"
@@ -4191,16 +4238,25 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a"
[[package]]
name = "miniz_oxide"
-version = "0.7.2"
+version = "0.7.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7"
+checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08"
dependencies = [
"adler",
]
[[package]]
-name = "mintex"
-version = "0.1.3"
+name = "miniz_oxide"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1"
+dependencies = [
+ "adler2",
+]
+
+[[package]]
+name = "mintex"
+version = "0.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9bec4598fddb13cc7b528819e697852653252b760f1228b7642679bf2ff2cd07"
@@ -4216,6 +4272,18 @@ dependencies = [
"windows-sys 0.48.0",
]
+[[package]]
+name = "mio"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec"
+dependencies = [
+ "hermit-abi 0.3.9",
+ "libc",
+ "wasi 0.11.0+wasi-snapshot-preview1",
+ "windows-sys 0.52.0",
+]
+
[[package]]
name = "multimap"
version = "0.10.0"
@@ -4249,24 +4317,6 @@ dependencies = [
"rand 0.8.5",
]
-[[package]]
-name = "native-tls"
-version = "0.2.11"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e"
-dependencies = [
- "lazy_static",
- "libc",
- "log",
- "openssl",
- "openssl-probe",
- "openssl-sys",
- "schannel",
- "security-framework",
- "security-framework-sys",
- "tempfile",
-]
-
[[package]]
name = "ndarray"
version = "0.13.1"
@@ -4311,9 +4361,22 @@ version = "0.28.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ab2156c4fce2f8df6c499cc1c763e4394b7482525bf2a9701c9d79d215f519e4"
dependencies = [
- "bitflags 2.5.0",
+ "bitflags 2.6.0",
+ "cfg-if 1.0.0",
+ "cfg_aliases 0.1.1",
+ "libc",
+ "memoffset",
+]
+
+[[package]]
+name = "nix"
+version = "0.29.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46"
+dependencies = [
+ "bitflags 2.6.0",
"cfg-if 1.0.0",
- "cfg_aliases",
+ "cfg_aliases 0.2.1",
"libc",
]
@@ -4341,36 +4404,34 @@ dependencies = [
]
[[package]]
-name = "nu-ansi-term"
-version = "0.46.0"
+name = "ntapi"
+version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84"
+checksum = "e8a3895c6391c39d7fe7ebc444a87eb2991b2a0bc718fdabd071eec617fc68e4"
dependencies = [
- "overload",
"winapi",
]
[[package]]
name = "num"
-version = "0.4.2"
+version = "0.4.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3135b08af27d103b0a51f2ae0f8632117b7b185ccf931445affa8df530576a41"
+checksum = "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23"
dependencies = [
"num-bigint",
- "num-complex 0.4.5",
+ "num-complex 0.4.6",
"num-integer",
"num-iter",
- "num-rational 0.4.1",
+ "num-rational 0.4.2",
"num-traits",
]
[[package]]
name = "num-bigint"
-version = "0.4.4"
+version = "0.4.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0"
+checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9"
dependencies = [
- "autocfg",
"num-integer",
"num-traits",
]
@@ -4387,9 +4448,9 @@ dependencies = [
[[package]]
name = "num-complex"
-version = "0.4.5"
+version = "0.4.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "23c6602fda94a57c990fe0df199a035d83576b496aa29f4e634a8ac6004e68a6"
+checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495"
dependencies = [
"num-traits",
]
@@ -4433,11 +4494,10 @@ dependencies = [
[[package]]
name = "num-rational"
-version = "0.4.1"
+version = "0.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0"
+checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824"
dependencies = [
- "autocfg",
"num-bigint",
"num-integer",
"num-traits",
@@ -4493,9 +4553,9 @@ dependencies = [
[[package]]
name = "object"
-version = "0.32.2"
+version = "0.36.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441"
+checksum = "27b64972346851a39438c60b341ebc01bba47464ae329e55cf343eb93964efd9"
dependencies = [
"memchr",
]
@@ -4508,9 +4568,9 @@ checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92"
[[package]]
name = "oorandom"
-version = "11.1.3"
+version = "11.1.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0ab1bc2a289d34bd04a330323ac98a1b4bc82c9d9fcb1e66b63caa84da26b575"
+checksum = "b410bbe7e14ab526a0e86877eb47c6996a2bd7746f027ba551028c925390e4e9"
[[package]]
name = "opaque-debug"
@@ -4518,60 +4578,6 @@ version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381"
-[[package]]
-name = "openssl"
-version = "0.10.64"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "95a0481286a310808298130d22dd1fef0fa571e05a8f44ec801801e84b216b1f"
-dependencies = [
- "bitflags 2.5.0",
- "cfg-if 1.0.0",
- "foreign-types",
- "libc",
- "once_cell",
- "openssl-macros",
- "openssl-sys",
-]
-
-[[package]]
-name = "openssl-macros"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn 2.0.60",
-]
-
-[[package]]
-name = "openssl-probe"
-version = "0.1.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf"
-
-[[package]]
-name = "openssl-src"
-version = "300.2.3+3.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5cff92b6f71555b61bb9315f7c64da3ca43d87531622120fea0195fc761b4843"
-dependencies = [
- "cc",
-]
-
-[[package]]
-name = "openssl-sys"
-version = "0.9.102"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c597637d56fbc83893a35eb0dd04b2b8e7a50c91e64e9493e398b5df4fb45fa2"
-dependencies = [
- "cc",
- "libc",
- "openssl-src",
- "pkg-config",
- "vcpkg",
-]
-
[[package]]
name = "option-ext"
version = "0.2.0"
@@ -4588,10 +4594,14 @@ dependencies = [
]
[[package]]
-name = "overload"
-version = "0.1.1"
+name = "os_pipe"
+version = "1.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39"
+checksum = "5ffd2b0a5634335b135d5728d84c5e0fd726954b87111f7506a61c502280d982"
+dependencies = [
+ "libc",
+ "windows-sys 0.59.0",
+]
[[package]]
name = "pad"
@@ -4610,9 +4620,9 @@ checksum = "bb813b8af86854136c6922af0598d719255ecb2179515e6e7730d468f05c9cae"
[[package]]
name = "parking_lot"
-version = "0.12.2"
+version = "0.12.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7e4af0ca4f6caed20e900d564c242b8e5d4903fdacf31d3daf527b66fe6f42fb"
+checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27"
dependencies = [
"lock_api",
"parking_lot_core",
@@ -4626,16 +4636,16 @@ checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8"
dependencies = [
"cfg-if 1.0.0",
"libc",
- "redox_syscall 0.5.1",
+ "redox_syscall",
"smallvec",
- "windows-targets 0.52.5",
+ "windows-targets 0.52.6",
]
[[package]]
name = "parse-variants"
-version = "1.0.1"
+version = "1.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "80f048110646aae15ec0e4299c37a012739d28d92c82b7ad945c0578c188cbe3"
+checksum = "99088a2b0695df5940d7b5a3b4c4460b765053cf5ecd6d46da43812d3fad7f13"
dependencies = [
"parse-variants-derive",
]
@@ -4648,7 +4658,7 @@ checksum = "70df726c43c645ef1dde24c7ae14692036ebe5457c92c5f0ec4cfceb99634ff6"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.60",
+ "syn 2.0.75",
]
[[package]]
@@ -4664,9 +4674,9 @@ dependencies = [
[[package]]
name = "paste"
-version = "1.0.14"
+version = "1.0.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c"
+checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a"
[[package]]
name = "pbkdf2"
@@ -4692,12 +4702,12 @@ checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e"
[[package]]
name = "petgraph"
-version = "0.6.4"
+version = "0.6.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e1d3afd2628e69da2be385eb6f2fd57c8ac7977ceeff6dc166ff1657b0e386a9"
+checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db"
dependencies = [
"fixedbitset",
- "indexmap 2.2.6",
+ "indexmap 2.4.0",
]
[[package]]
@@ -4717,7 +4727,7 @@ checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.60",
+ "syn 2.0.75",
]
[[package]]
@@ -4734,9 +4744,9 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
[[package]]
name = "piper"
-version = "0.2.1"
+version = "0.2.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "668d31b1c4eba19242f2088b2bf3316b82ca31082a8335764db4e083db7485d4"
+checksum = "96c8c490f422ef9a4efd2cb5b42b76c8613d7e7dfc1caf667b8a3350a5acc066"
dependencies = [
"atomic-waker",
"fastrand 2.1.0",
@@ -4749,12 +4759,6 @@ version = "0.3.30"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec"
-[[package]]
-name = "platforms"
-version = "3.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "db23d408679286588f4d4644f965003d056e3dd5abcaaa938116871d7ce2fee7"
-
[[package]]
name = "polling"
version = "2.8.0"
@@ -4773,17 +4777,17 @@ dependencies = [
[[package]]
name = "polling"
-version = "3.7.0"
+version = "3.7.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "645493cf344456ef24219d02a768cf1fb92ddf8c92161679ae3d91b91a637be3"
+checksum = "cc2790cd301dec6cd3b7a025e4815cf825724a51c98dccfe6a3e55f05ffb6511"
dependencies = [
"cfg-if 1.0.0",
"concurrent-queue",
- "hermit-abi 0.3.9",
+ "hermit-abi 0.4.0",
"pin-project-lite",
"rustix 0.38.34",
"tracing",
- "windows-sys 0.52.0",
+ "windows-sys 0.59.0",
]
[[package]]
@@ -4799,9 +4803,9 @@ dependencies = [
[[package]]
name = "portable-atomic"
-version = "1.6.0"
+version = "1.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7170ef9988bc169ba16dd36a7fa041e5c4cbeb6a35b76d4c03daded371eae7c0"
+checksum = "da544ee218f0d287a911e9c99a39a8c9bc8fcad3cb8db5959940044ecfc67265"
[[package]]
name = "powerfmt"
@@ -4811,27 +4815,30 @@ checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391"
[[package]]
name = "ppv-lite86"
-version = "0.2.17"
+version = "0.2.20"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de"
+checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04"
+dependencies = [
+ "zerocopy",
+]
[[package]]
name = "prettyplease"
-version = "0.2.19"
+version = "0.2.20"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5ac2cf0f2e4f42b49f5ffd07dae8d746508ef7526c13940e5f524012ae6c6550"
+checksum = "5f12335488a2f3b0a83b14edad48dca9879ce89b2edd10e80237e4e852dd645e"
dependencies = [
"proc-macro2",
- "syn 2.0.60",
+ "syn 2.0.75",
]
[[package]]
name = "proc-macro-crate"
-version = "0.1.5"
+version = "3.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1d6ea3c4595b96363c13943497db34af4460fb474a95c43f4446ad341b8c9785"
+checksum = "6d37c51ca738a55da99dc0c4a34860fd675453b8b36209178c2249bb13651284"
dependencies = [
- "toml 0.5.11",
+ "toml_edit 0.21.1",
]
[[package]]
@@ -4859,18 +4866,18 @@ dependencies = [
[[package]]
name = "proc-macro2"
-version = "1.0.81"
+version = "1.0.86"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3d1597b0c024618f09a9c3b8655b7e430397a36d23fdafec26d6965e9eec3eba"
+checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77"
dependencies = [
"unicode-ident",
]
[[package]]
name = "prost"
-version = "0.12.4"
+version = "0.12.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d0f5d036824e4761737860779c906171497f6d55681139d8312388f8fe398922"
+checksum = "deb1435c188b76130da55f17a466d252ff7b1418b2ad3e037d127b94e3411f29"
dependencies = [
"bytes",
"prost-derive",
@@ -4878,12 +4885,12 @@ dependencies = [
[[package]]
name = "prost-build"
-version = "0.12.4"
+version = "0.12.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "80b776a1b2dc779f5ee0641f8ade0125bc1298dd41a9a0c16d8bd57b42d222b1"
+checksum = "22505a5c94da8e3b7c2996394d1c933236c4d743e81a410bcca4e6989fc066a4"
dependencies = [
"bytes",
- "heck",
+ "heck 0.5.0",
"itertools 0.12.1",
"log",
"multimap",
@@ -4893,32 +4900,180 @@ dependencies = [
"prost",
"prost-types",
"regex",
- "syn 2.0.60",
+ "syn 2.0.75",
"tempfile",
]
[[package]]
name = "prost-derive"
-version = "0.12.4"
+version = "0.12.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "19de2de2a00075bf566bee3bd4db014b11587e84184d3f7a791bc17f1a8e9e48"
+checksum = "81bddcdb20abf9501610992b6759a4c888aef7d1a7247ef75e2404275ac24af1"
dependencies = [
"anyhow",
"itertools 0.12.1",
"proc-macro2",
"quote",
- "syn 2.0.60",
+ "syn 2.0.75",
]
[[package]]
name = "prost-types"
-version = "0.12.4"
+version = "0.12.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3235c33eb02c1f1e212abdbe34c78b264b038fb58ca612664343271e36e55ffe"
+checksum = "9091c90b0a32608e984ff2fa4091273cbdd755d54935c51d520887f4a1dbd5b0"
dependencies = [
"prost",
]
+[[package]]
+name = "pyo3"
+version = "0.21.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a5e00b96a521718e08e03b1a622f01c8a8deb50719335de3f60b3b3950f069d8"
+dependencies = [
+ "cfg-if 1.0.0",
+ "indoc",
+ "inventory",
+ "libc",
+ "memoffset",
+ "parking_lot",
+ "portable-atomic",
+ "pyo3-build-config",
+ "pyo3-ffi",
+ "pyo3-macros",
+ "unindent",
+]
+
+[[package]]
+name = "pyo3-asyncio-0-21"
+version = "0.21.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8fde289486f7d5cee0ac7c20b2637a0657654681079cc5eedc90d9a2a79af1e5"
+dependencies = [
+ "futures",
+ "once_cell",
+ "pin-project-lite",
+ "pyo3",
+ "pyo3-asyncio-macros-0-21",
+ "tokio",
+]
+
+[[package]]
+name = "pyo3-asyncio-macros-0-21"
+version = "0.21.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2e5ffc4e987e866bf54b781235a6c3b91e7e67df14f73ce716625ee78728554a"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "pyo3-build-config"
+version = "0.21.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7883df5835fafdad87c0d888b266c8ec0f4c9ca48a5bed6bbb592e8dedee1b50"
+dependencies = [
+ "once_cell",
+ "target-lexicon",
+]
+
+[[package]]
+name = "pyo3-ffi"
+version = "0.21.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "01be5843dc60b916ab4dad1dca6d20b9b4e6ddc8e15f50c47fe6d85f1fb97403"
+dependencies = [
+ "libc",
+ "pyo3-build-config",
+]
+
+[[package]]
+name = "pyo3-macros"
+version = "0.21.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "77b34069fc0682e11b31dbd10321cbf94808394c56fd996796ce45217dfac53c"
+dependencies = [
+ "proc-macro2",
+ "pyo3-macros-backend",
+ "quote",
+ "syn 2.0.60",
+]
+
+[[package]]
+name = "pyo3-macros-backend"
+version = "0.21.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "08260721f32db5e1a5beae69a55553f56b99bd0e1c3e6e0a5e8851a9d0f5a85c"
+dependencies = [
+ "heck 0.4.1",
+ "proc-macro2",
+ "pyo3-build-config",
+ "quote",
+ "syn 2.0.60",
+]
+
+[[package]]
+name = "python"
+version = "0.14.1"
+dependencies = [
+ "cfg-if 1.0.0",
+ "kaspa-addresses",
+ "kaspa-wallet-keys",
+ "kaspa-wrpc-python",
+ "pyo3",
+]
+
+[[package]]
+name = "quinn"
+version = "0.11.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8c7c5fdde3cdae7203427dc4f0a68fe0ed09833edc525a03456b153b79828684"
+dependencies = [
+ "bytes",
+ "pin-project-lite",
+ "quinn-proto",
+ "quinn-udp",
+ "rustc-hash 2.0.0",
+ "rustls 0.23.12",
+ "socket2 0.5.7",
+ "thiserror",
+ "tokio",
+ "tracing",
+]
+
+[[package]]
+name = "quinn-proto"
+version = "0.11.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fadfaed2cd7f389d0161bb73eeb07b7b78f8691047a6f3e73caaeae55310a4a6"
+dependencies = [
+ "bytes",
+ "rand 0.8.5",
+ "ring",
+ "rustc-hash 2.0.0",
+ "rustls 0.23.12",
+ "slab",
+ "thiserror",
+ "tinyvec",
+ "tracing",
+]
+
+[[package]]
+name = "quinn-udp"
+version = "0.5.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4fe68c2e9e1a1234e218683dbdf9f9dfcb094113c5ac2b938dfcb9bab4c4140b"
+dependencies = [
+ "libc",
+ "once_cell",
+ "socket2 0.5.7",
+ "tracing",
+ "windows-sys 0.59.0",
+]
+
[[package]]
name = "quote"
version = "1.0.36"
@@ -4987,7 +5142,7 @@ version = "0.6.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
dependencies = [
- "getrandom 0.2.14",
+ "getrandom 0.2.15",
]
[[package]]
@@ -5046,38 +5201,29 @@ dependencies = [
[[package]]
name = "redox_syscall"
-version = "0.4.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa"
-dependencies = [
- "bitflags 1.3.2",
-]
-
-[[package]]
-name = "redox_syscall"
-version = "0.5.1"
+version = "0.5.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "469052894dcb553421e483e4209ee581a45100d31b4018de03e5a7ad86374a7e"
+checksum = "2a908a6e00f1fdd0dfd9c0eb08ce85126f6d8bbda50017e74bc4a4b7d4a926a4"
dependencies = [
- "bitflags 2.5.0",
+ "bitflags 2.6.0",
]
[[package]]
name = "redox_users"
-version = "0.4.5"
+version = "0.4.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bd283d9651eeda4b2a83a43c1c91b266c40fd76ecd39a50a8c630ae69dc72891"
+checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43"
dependencies = [
- "getrandom 0.2.14",
+ "getrandom 0.2.15",
"libredox",
"thiserror",
]
[[package]]
name = "regex"
-version = "1.10.4"
+version = "1.10.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c117dbdfde9c8308975b6a18d71f3f385c89461f7b3fb054288ecf2a2058ba4c"
+checksum = "4219d74c6b67a3654a9fbebc4b419e22126d13d2f3c4a07ee0cb61ff79a79619"
dependencies = [
"aho-corasick",
"memchr",
@@ -5087,9 +5233,9 @@ dependencies = [
[[package]]
name = "regex-automata"
-version = "0.4.6"
+version = "0.4.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea"
+checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df"
dependencies = [
"aho-corasick",
"memchr",
@@ -5098,48 +5244,53 @@ dependencies = [
[[package]]
name = "regex-syntax"
-version = "0.8.3"
+version = "0.8.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56"
+checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b"
[[package]]
name = "reqwest"
-version = "0.11.27"
+version = "0.12.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62"
+checksum = "f8f4955649ef5c38cc7f9e8aa41761d48fb9677197daea9984dc54f56aad5e63"
dependencies = [
- "base64 0.21.7",
+ "base64 0.22.1",
"bytes",
"encoding_rs",
"futures-core",
"futures-util",
- "h2",
- "http 0.2.12",
- "http-body 0.4.6",
- "hyper 0.14.28",
- "hyper-tls",
+ "h2 0.4.6",
+ "http 1.1.0",
+ "http-body 1.0.1",
+ "http-body-util",
+ "hyper 1.4.1",
+ "hyper-rustls",
+ "hyper-util",
"ipnet",
"js-sys",
"log",
"mime",
- "native-tls",
"once_cell",
"percent-encoding",
"pin-project-lite",
- "rustls-pemfile",
+ "quinn",
+ "rustls 0.23.12",
+ "rustls-pemfile 2.1.3",
+ "rustls-pki-types",
"serde",
"serde_json",
"serde_urlencoded",
- "sync_wrapper 0.1.2",
+ "sync_wrapper 1.0.1",
"system-configuration",
"tokio",
- "tokio-native-tls",
+ "tokio-rustls 0.26.0",
"tower-service",
"url",
"wasm-bindgen",
"wasm-bindgen-futures",
"web-sys",
- "winreg",
+ "webpki-roots 0.26.5",
+ "windows-registry",
]
[[package]]
@@ -5150,7 +5301,7 @@ checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d"
dependencies = [
"cc",
"cfg-if 1.0.0",
- "getrandom 0.2.14",
+ "getrandom 0.2.15",
"libc",
"spin",
"untrusted",
@@ -5177,9 +5328,9 @@ dependencies = [
[[package]]
name = "rocksdb"
-version = "0.21.0"
+version = "0.22.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bb6f170a4041d50a0ce04b0d2e14916d6ca863ea2e422689a5b694395d299ffe"
+checksum = "6bd13e55d6d7b8cd0ea569161127567cd587676c99f4472f779a0279aa60a7a7"
dependencies = [
"libc",
"librocksdb-sys",
@@ -5187,13 +5338,13 @@ dependencies = [
[[package]]
name = "rothschild"
-version = "0.14.1"
+version = "0.15.1"
dependencies = [
- "async-channel 2.2.1",
- "clap 4.5.4",
+ "async-channel 2.3.1",
+ "clap 4.5.16",
"criterion",
- "faster-hex 0.6.1",
- "itertools 0.11.0",
+ "faster-hex",
+ "itertools 0.13.0",
"kaspa-addresses",
"kaspa-consensus-core",
"kaspa-core",
@@ -5211,9 +5362,9 @@ dependencies = [
[[package]]
name = "rustc-demangle"
-version = "0.1.23"
+version = "0.1.24"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76"
+checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f"
[[package]]
name = "rustc-hash"
@@ -5221,6 +5372,12 @@ version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2"
+[[package]]
+name = "rustc-hash"
+version = "2.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "583034fd73374156e66797ed8e5b0d5690409c9226b22d87cb7f19821c05d152"
+
[[package]]
name = "rustc_version"
version = "0.4.0"
@@ -5250,10 +5407,10 @@ version = "0.38.34"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f"
dependencies = [
- "bitflags 2.5.0",
+ "bitflags 2.6.0",
"errno",
"libc",
- "linux-raw-sys 0.4.13",
+ "linux-raw-sys 0.4.14",
"windows-sys 0.52.0",
]
@@ -5265,10 +5422,24 @@ checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e"
dependencies = [
"log",
"ring",
- "rustls-webpki",
+ "rustls-webpki 0.101.7",
"sct",
]
+[[package]]
+name = "rustls"
+version = "0.23.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c58f8c84392efc0a126acce10fa59ff7b3d2ac06ab451a33f2741989b806b044"
+dependencies = [
+ "once_cell",
+ "ring",
+ "rustls-pki-types",
+ "rustls-webpki 0.102.6",
+ "subtle",
+ "zeroize",
+]
+
[[package]]
name = "rustls-pemfile"
version = "1.0.4"
@@ -5278,6 +5449,22 @@ dependencies = [
"base64 0.21.7",
]
+[[package]]
+name = "rustls-pemfile"
+version = "2.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "196fe16b00e106300d3e45ecfcb764fa292a535d7326a29a5875c579c7417425"
+dependencies = [
+ "base64 0.22.1",
+ "rustls-pki-types",
+]
+
+[[package]]
+name = "rustls-pki-types"
+version = "1.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fc0a2ce646f8655401bb81e7927b812614bd5d91dbc968696be50603510fcaf0"
+
[[package]]
name = "rustls-webpki"
version = "0.101.7"
@@ -5288,17 +5475,28 @@ dependencies = [
"untrusted",
]
+[[package]]
+name = "rustls-webpki"
+version = "0.102.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8e6b52d4fda176fd835fdc55a835d4a89b8499cad995885a21149d5ad62f852e"
+dependencies = [
+ "ring",
+ "rustls-pki-types",
+ "untrusted",
+]
+
[[package]]
name = "rustversion"
-version = "1.0.15"
+version = "1.0.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "80af6f9131f277a45a3fba6ce8e2258037bb0477a67e610d3c1fe046ab31de47"
+checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6"
[[package]]
name = "ryu"
-version = "1.0.17"
+version = "1.0.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1"
+checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f"
[[package]]
name = "salsa20"
@@ -5318,15 +5516,6 @@ dependencies = [
"winapi-util",
]
-[[package]]
-name = "schannel"
-version = "0.1.23"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534"
-dependencies = [
- "windows-sys 0.52.0",
-]
-
[[package]]
name = "scoped-tls"
version = "1.0.1"
@@ -5351,9 +5540,9 @@ dependencies = [
[[package]]
name = "secp256k1"
-version = "0.28.2"
+version = "0.29.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d24b59d129cdadea20aea4fb2352fa053712e5d713eee47d700cd4b2bc002f10"
+checksum = "0e0cc0f1cf93f4969faf3ea1c7d8a9faed25918d96affa959720823dfe86d4f3"
dependencies = [
"rand 0.8.5",
"secp256k1-sys",
@@ -5362,41 +5551,18 @@ dependencies = [
[[package]]
name = "secp256k1-sys"
-version = "0.9.2"
+version = "0.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e5d1746aae42c19d583c3c1a8c646bfad910498e2051c551a7f2e3c0c9fbb7eb"
+checksum = "1433bd67156263443f14d603720b082dd3121779323fce20cba2aa07b874bc1b"
dependencies = [
"cc",
]
-[[package]]
-name = "security-framework"
-version = "2.11.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c627723fd09706bacdb5cf41499e95098555af3c3c29d014dc3c458ef6be11c0"
-dependencies = [
- "bitflags 2.5.0",
- "core-foundation",
- "core-foundation-sys",
- "libc",
- "security-framework-sys",
-]
-
-[[package]]
-name = "security-framework-sys"
-version = "2.11.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "317936bbbd05227752583946b9e66d7ce3b489f84e11a94a510b4437fef407d7"
-dependencies = [
- "core-foundation-sys",
- "libc",
-]
-
[[package]]
name = "semver"
-version = "1.0.22"
+version = "1.0.23"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "92d43fe69e652f3df9bdc2b85b2854a0825b86e4fb76bc44d945137d053639ca"
+checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b"
dependencies = [
"serde",
]
@@ -5418,13 +5584,23 @@ dependencies = [
[[package]]
name = "serde"
-version = "1.0.200"
+version = "1.0.208"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ddc6f9cc94d67c0e21aaf7eda3a010fd3af78ebf6e096aa6e2e13c79749cce4f"
+checksum = "cff085d2cb684faa248efb494c39b68e522822ac0de72ccf08109abde717cfb2"
dependencies = [
"serde_derive",
]
+[[package]]
+name = "serde-pyobject"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "70ffe7ea77d8eba5774068d55b00a4a3a7c6f9fa9b97dd8e3bc8750cc8503fee"
+dependencies = [
+ "pyo3",
+ "serde",
+]
+
[[package]]
name = "serde-value"
version = "0.7.0"
@@ -5448,36 +5624,27 @@ dependencies = [
[[package]]
name = "serde_derive"
-version = "1.0.200"
+version = "1.0.208"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "856f046b9400cee3c8c94ed572ecdb752444c24528c035cd35882aad6f492bcb"
+checksum = "24008e81ff7613ed8e5ba0cfaf24e2c2f1e5b8a0495711e44fcd4882fca62bcf"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.60",
+ "syn 2.0.75",
]
[[package]]
name = "serde_json"
-version = "1.0.116"
+version = "1.0.125"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3e17db7126d17feb94eb3fad46bf1a96b034e8aacbc2e775fe81505f8b0b2813"
+checksum = "83c8e735a073ccf5be70aa8066aa984eaf2fa000db6c8d0100ae605b366d31ed"
dependencies = [
"itoa",
+ "memchr",
"ryu",
"serde",
]
-[[package]]
-name = "serde_path_to_error"
-version = "0.1.16"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "af99884400da37c88f5e9146b7f1fd0fbcae8f6eec4e9da38b67d05486f814a6"
-dependencies = [
- "itoa",
- "serde",
-]
-
[[package]]
name = "serde_repr"
version = "0.1.19"
@@ -5486,14 +5653,14 @@ checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.60",
+ "syn 2.0.75",
]
[[package]]
name = "serde_spanned"
-version = "0.6.5"
+version = "0.6.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "eb3622f419d1296904700073ea6cc23ad690adbd66f13ea683df73298736f0c1"
+checksum = "eb5b1b31579f3811bf615c144393417496f152e12ac8b7663bf664f4a815306d"
dependencies = [
"serde",
]
@@ -5512,15 +5679,15 @@ dependencies = [
[[package]]
name = "serde_with"
-version = "3.8.1"
+version = "3.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0ad483d2ab0149d5a5ebcd9972a3852711e0153d863bf5a5d0391d28883c4a20"
+checksum = "69cecfa94848272156ea67b2b1a53f20fc7bc638c4a46d2f8abde08f05f4b857"
dependencies = [
"base64 0.22.1",
"chrono",
"hex",
"indexmap 1.9.3",
- "indexmap 2.2.6",
+ "indexmap 2.4.0",
"serde",
"serde_derive",
"serde_json",
@@ -5530,14 +5697,14 @@ dependencies = [
[[package]]
name = "serde_with_macros"
-version = "3.8.1"
+version = "3.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "65569b702f41443e8bc8bbb1c5779bd0450bbe723b56198980e80ec45780bce2"
+checksum = "a8fee4991ef4f274617a51ad4af30519438dacb2f56ac773b08a1922ff743350"
dependencies = [
"darling",
"proc-macro2",
"quote",
- "syn 2.0.60",
+ "syn 2.0.75",
]
[[package]]
@@ -5546,7 +5713,7 @@ version = "0.9.34+deprecated"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47"
dependencies = [
- "indexmap 2.2.6",
+ "indexmap 2.4.0",
"itoa",
"ryu",
"serde",
@@ -5586,12 +5753,13 @@ dependencies = [
]
[[package]]
-name = "sharded-slab"
-version = "0.1.7"
+name = "shared_child"
+version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6"
+checksum = "09fa9338aed9a1df411814a5b2252f7cd206c55ae9bf2fa763f8de84603aa60c"
dependencies = [
- "lazy_static",
+ "libc",
+ "windows-sys 0.59.0",
]
[[package]]
@@ -5612,12 +5780,12 @@ dependencies = [
[[package]]
name = "signal-hook-mio"
-version = "0.2.3"
+version = "0.2.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "29ad2e15f37ec9a6cc544097b78a1ec90001e9f71b81338ca39f430adaca99af"
+checksum = "34db1a06d485c9142248b7a054f034b349b212551f3dfd19c94d45a754a217cd"
dependencies = [
"libc",
- "mio",
+ "mio 0.8.11",
"signal-hook",
]
@@ -5632,15 +5800,16 @@ dependencies = [
[[package]]
name = "simpa"
-version = "0.14.1"
+version = "0.15.1"
dependencies = [
- "async-channel 2.2.1",
- "clap 4.5.4",
+ "async-channel 2.3.1",
+ "cfg-if 1.0.0",
+ "clap 4.5.16",
"dhat",
"futures",
"futures-util",
- "indexmap 2.2.6",
- "itertools 0.11.0",
+ "indexmap 2.4.0",
+ "itertools 0.13.0",
"kaspa-alloc",
"kaspa-consensus",
"kaspa-consensus-core",
@@ -5724,9 +5893,6 @@ name = "spin"
version = "0.9.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67"
-dependencies = [
- "lock_api",
-]
[[package]]
name = "stable_deref_trait"
@@ -5761,12 +5927,6 @@ version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a"
-[[package]]
-name = "strsim"
-version = "0.10.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623"
-
[[package]]
name = "strsim"
version = "0.11.1"
@@ -5775,9 +5935,15 @@ checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f"
[[package]]
name = "subtle"
-version = "2.5.0"
+version = "2.6.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292"
+
+[[package]]
+name = "sweep-bptree"
+version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc"
+checksum = "bea7b1b7c5eaabc40bab84ec98b2f12523d97e91c9bfc430fe5d2a1ea15c9960"
[[package]]
name = "syn"
@@ -5792,15 +5958,27 @@ dependencies = [
[[package]]
name = "syn"
-version = "2.0.60"
+version = "2.0.75"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "909518bc7b1c9b779f1bbf07f2929d35af9f0f37e47c6e9ef7f9dddc1e1821f3"
+checksum = "f6af063034fc1935ede7be0122941bafa9bacb949334d090b77ca98b5817c7d9"
dependencies = [
"proc-macro2",
"quote",
"unicode-ident",
]
+[[package]]
+name = "syn_derive"
+version = "0.1.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1329189c02ff984e9736652b1631330da25eaa6bc639089ed4915d25446cbe7b"
+dependencies = [
+ "proc-macro-error",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.75",
+]
+
[[package]]
name = "sync_wrapper"
version = "0.1.2"
@@ -5812,38 +5990,62 @@ name = "sync_wrapper"
version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394"
+dependencies = [
+ "futures-core",
+]
+
+[[package]]
+name = "sysinfo"
+version = "0.31.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d4115055da5f572fff541dd0c4e61b0262977f453cc9fe04be83aba25a89bdab"
+dependencies = [
+ "core-foundation-sys",
+ "libc",
+ "memchr",
+ "ntapi",
+ "rayon",
+ "windows",
+]
[[package]]
name = "system-configuration"
-version = "0.5.1"
+version = "0.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7"
+checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b"
dependencies = [
- "bitflags 1.3.2",
+ "bitflags 2.6.0",
"core-foundation",
"system-configuration-sys",
]
[[package]]
name = "system-configuration-sys"
-version = "0.5.0"
+version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9"
+checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4"
dependencies = [
"core-foundation-sys",
"libc",
]
+[[package]]
+name = "target-lexicon"
+version = "0.12.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e1fc403891a21bcfb7c37834ba66a547a8f402146eba7265b5a6d88059c9ff2f"
+
[[package]]
name = "tempfile"
-version = "3.10.1"
+version = "3.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1"
+checksum = "04cbcdd0c794ebb0d4cf35e88edd2f7d2c4c3e9a5a6dab322839b321c6a87a64"
dependencies = [
"cfg-if 1.0.0",
"fastrand 2.1.0",
+ "once_cell",
"rustix 0.38.34",
- "windows-sys 0.52.0",
+ "windows-sys 0.59.0",
]
[[package]]
@@ -5877,22 +6079,22 @@ dependencies = [
[[package]]
name = "thiserror"
-version = "1.0.59"
+version = "1.0.63"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f0126ad08bff79f29fc3ae6a55cc72352056dfff61e3ff8bb7129476d44b23aa"
+checksum = "c0342370b38b6a11b6cc11d6a805569958d54cfa061a29969c3b5ce2ea405724"
dependencies = [
"thiserror-impl",
]
[[package]]
name = "thiserror-impl"
-version = "1.0.59"
+version = "1.0.63"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d1cd413b5d558b4c5bf3680e324a6fa5014e7b7c067a51e69dbdf47eb7148b66"
+checksum = "a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.60",
+ "syn 2.0.75",
]
[[package]]
@@ -5903,24 +6105,14 @@ checksum = "3bf63baf9f5039dadc247375c29eb13706706cfde997d0330d05aa63a77d8820"
[[package]]
name = "thread-id"
-version = "4.2.1"
+version = "4.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f0ec81c46e9eb50deaa257be2f148adf052d1fb7701cfd55ccfab2525280b70b"
+checksum = "cfe8f25bbdd100db7e1d34acf7fd2dc59c4bf8f7483f505eaa7d4f12f76cc0ea"
dependencies = [
"libc",
"winapi",
]
-[[package]]
-name = "thread_local"
-version = "1.1.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c"
-dependencies = [
- "cfg-if 1.0.0",
- "once_cell",
-]
-
[[package]]
name = "time"
version = "0.3.36"
@@ -5966,9 +6158,9 @@ dependencies = [
[[package]]
name = "tinyvec"
-version = "1.6.0"
+version = "1.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50"
+checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938"
dependencies = [
"tinyvec_macros",
]
@@ -5981,20 +6173,19 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
[[package]]
name = "tokio"
-version = "1.37.0"
+version = "1.39.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1adbebffeca75fcfd058afa480fb6c0b81e165a0323f9c9d39c9697e37c46787"
+checksum = "9babc99b9923bfa4804bd74722ff02c0381021eafa4db9949217e3be8e84fff5"
dependencies = [
"backtrace",
"bytes",
"libc",
- "mio",
- "num_cpus",
+ "mio 1.0.2",
"pin-project-lite",
"signal-hook-registry",
"socket2 0.5.7",
"tokio-macros",
- "windows-sys 0.48.0",
+ "windows-sys 0.52.0",
]
[[package]]
@@ -6009,32 +6200,33 @@ dependencies = [
[[package]]
name = "tokio-macros"
-version = "2.2.0"
+version = "2.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b"
+checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.60",
+ "syn 2.0.75",
]
[[package]]
-name = "tokio-native-tls"
-version = "0.3.1"
+name = "tokio-rustls"
+version = "0.24.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2"
+checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081"
dependencies = [
- "native-tls",
+ "rustls 0.21.12",
"tokio",
]
[[package]]
name = "tokio-rustls"
-version = "0.24.1"
+version = "0.26.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081"
+checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4"
dependencies = [
- "rustls",
+ "rustls 0.23.12",
+ "rustls-pki-types",
"tokio",
]
@@ -6051,16 +6243,18 @@ dependencies = [
[[package]]
name = "tokio-tungstenite"
-version = "0.21.0"
+version = "0.23.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c83b561d025642014097b66e6c1bb422783339e0909e4429cde4749d1990bc38"
+checksum = "c6989540ced10490aaf14e6bad2e3d33728a2813310a0c71d1574304c49631cd"
dependencies = [
"futures-util",
"log",
- "native-tls",
+ "rustls 0.23.12",
+ "rustls-pki-types",
"tokio",
- "tokio-native-tls",
+ "tokio-rustls 0.26.0",
"tungstenite",
+ "webpki-roots 0.26.5",
]
[[package]]
@@ -6078,45 +6272,47 @@ dependencies = [
[[package]]
name = "toml"
-version = "0.5.11"
+version = "0.8.19"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234"
+checksum = "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e"
dependencies = [
"serde",
+ "serde_spanned",
+ "toml_datetime",
+ "toml_edit 0.22.20",
]
[[package]]
-name = "toml"
-version = "0.8.12"
+name = "toml_datetime"
+version = "0.6.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e9dd1545e8208b4a5af1aa9bbd0b4cf7e9ea08fabc5d0a5c67fcaafa17433aa3"
+checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41"
dependencies = [
"serde",
- "serde_spanned",
- "toml_datetime",
- "toml_edit",
]
[[package]]
-name = "toml_datetime"
-version = "0.6.5"
+name = "toml_edit"
+version = "0.21.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1"
+checksum = "6a8534fd7f78b5405e860340ad6575217ce99f38d4d5c8f2442cb5ecb50090e1"
dependencies = [
- "serde",
+ "indexmap 2.4.0",
+ "toml_datetime",
+ "winnow 0.5.40",
]
[[package]]
name = "toml_edit"
-version = "0.22.12"
+version = "0.22.20"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d3328d4f68a705b2a4498da1d580585d39a6510f98318a2cec3018a7ec61ddef"
+checksum = "583c44c02ad26b0c3f3066fe629275e50627026c51ac2e595cca4c230ce1ce1d"
dependencies = [
- "indexmap 2.2.6",
+ "indexmap 2.4.0",
"serde",
"serde_spanned",
"toml_datetime",
- "winnow",
+ "winnow 0.6.18",
]
[[package]]
@@ -6127,27 +6323,28 @@ checksum = "d560933a0de61cf715926b9cac824d4c883c2c43142f787595e48280c40a1d0e"
dependencies = [
"async-stream",
"async-trait",
- "axum 0.6.20",
+ "axum",
"base64 0.21.7",
"bytes",
"flate2",
- "h2",
+ "h2 0.3.26",
"http 0.2.12",
"http-body 0.4.6",
- "hyper 0.14.28",
+ "hyper 0.14.30",
"hyper-timeout",
"percent-encoding",
"pin-project",
"prost",
- "rustls",
- "rustls-pemfile",
+ "rustls 0.21.12",
+ "rustls-pemfile 1.0.4",
"tokio",
- "tokio-rustls",
+ "tokio-rustls 0.24.1",
"tokio-stream",
"tower",
"tower-layer",
"tower-service",
"tracing",
+ "webpki-roots 0.25.4",
]
[[package]]
@@ -6160,7 +6357,7 @@ dependencies = [
"proc-macro2",
"prost-build",
"quote",
- "syn 2.0.60",
+ "syn 2.0.75",
]
[[package]]
@@ -6189,7 +6386,7 @@ version = "0.4.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "61c5bb1d698276a2443e5ecfabc1008bf15a36c12e6a7176e7bf089ea9131140"
dependencies = [
- "bitflags 2.5.0",
+ "bitflags 2.6.0",
"bytes",
"futures-core",
"futures-util",
@@ -6201,33 +6398,17 @@ dependencies = [
"tower-service",
]
-[[package]]
-name = "tower-http"
-version = "0.5.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1e9cd434a998747dd2c4276bc96ee2e0c7a2eadf3cae88e52be55a05fa9053f5"
-dependencies = [
- "bitflags 2.5.0",
- "bytes",
- "http 1.1.0",
- "http-body 1.0.0",
- "http-body-util",
- "pin-project-lite",
- "tower-layer",
- "tower-service",
-]
-
[[package]]
name = "tower-layer"
-version = "0.3.2"
+version = "0.3.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0"
+checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e"
[[package]]
name = "tower-service"
-version = "0.3.2"
+version = "0.3.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52"
+checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3"
[[package]]
name = "tracing"
@@ -6249,7 +6430,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.60",
+ "syn 2.0.75",
]
[[package]]
@@ -6259,32 +6440,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54"
dependencies = [
"once_cell",
- "valuable",
-]
-
-[[package]]
-name = "tracing-log"
-version = "0.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3"
-dependencies = [
- "log",
- "once_cell",
- "tracing-core",
-]
-
-[[package]]
-name = "tracing-subscriber"
-version = "0.3.18"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b"
-dependencies = [
- "nu-ansi-term",
- "sharded-slab",
- "smallvec",
- "thread_local",
- "tracing-core",
- "tracing-log",
]
[[package]]
@@ -6301,9 +6456,9 @@ checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b"
[[package]]
name = "tungstenite"
-version = "0.21.0"
+version = "0.23.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9ef1a641ea34f399a848dea702823bbecfb4c486f911735368f1f137cb8257e1"
+checksum = "6e2e2ce1e47ed2994fd43b04c8f618008d4cabdd5ee34027cf14f9d918edd9c8"
dependencies = [
"byteorder",
"bytes",
@@ -6311,11 +6466,11 @@ dependencies = [
"http 1.1.0",
"httparse",
"log",
- "native-tls",
"rand 0.8.5",
+ "rustls 0.23.12",
+ "rustls-pki-types",
"sha1",
"thiserror",
- "url",
"utf-8",
]
@@ -6369,9 +6524,15 @@ checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202"
[[package]]
name = "unicode-width"
-version = "0.1.12"
+version = "0.1.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0336d538f7abc86d282a4189614dfaa90810dfc2c6f6427eaf88e16311dd225d"
+
+[[package]]
+name = "unindent"
+version = "0.2.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "68f5e5f3158ecfd4b8ff6fe086db7c8467a2dfdac97fe420f2b7c4aa97af66d6"
+checksum = "c7de7d73e1754487cb58364ee906a499937a0dfabd86bcb980fa99ec8c8fa2ce"
[[package]]
name = "universal-hash"
@@ -6406,9 +6567,9 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1"
[[package]]
name = "url"
-version = "2.5.0"
+version = "2.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633"
+checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c"
dependencies = [
"form_urlencoded",
"idna",
@@ -6423,9 +6584,9 @@ checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9"
[[package]]
name = "utf8parse"
-version = "0.2.1"
+version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a"
+checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821"
[[package]]
name = "uuid"
@@ -6433,27 +6594,21 @@ version = "0.8.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7"
dependencies = [
- "getrandom 0.2.14",
+ "getrandom 0.2.15",
]
[[package]]
name = "uuid"
-version = "1.6.1"
+version = "1.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5e395fcf16a7a3d8127ec99782007af141946b4795001f876d54fb0d55978560"
+checksum = "81dfa00651efa65069b0b6b651f4aaa31ba9e3c3ce0137aaad053604ee7e0314"
dependencies = [
- "getrandom 0.2.14",
+ "getrandom 0.2.15",
"rand 0.8.5",
"serde",
"wasm-bindgen",
]
-[[package]]
-name = "valuable"
-version = "0.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d"
-
[[package]]
name = "value-bag"
version = "1.9.0"
@@ -6474,9 +6629,9 @@ checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191"
[[package]]
name = "vergen"
-version = "8.3.1"
+version = "8.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e27d6bdd219887a9eadd19e1c34f32e47fa332301184935c6d9bca26f3cca525"
+checksum = "2990d9ea5967266ea0ccf413a4aa5c42a93dbcfda9cb49a97de6931726b12566"
dependencies = [
"anyhow",
"cargo_metadata",
@@ -6489,15 +6644,15 @@ dependencies = [
[[package]]
name = "version_check"
-version = "0.9.4"
+version = "0.9.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f"
+checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a"
[[package]]
name = "waker-fn"
-version = "1.1.1"
+version = "1.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f3c4517f54858c779bbcbf228f4fca63d121bf85fbecb2dc578cdf4a39395690"
+checksum = "317211a0dc0ceedd78fb2ca9a44aed3d7b9b26f81870d485c07122b4350673b7"
[[package]]
name = "walkdir"
@@ -6532,11 +6687,12 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
[[package]]
name = "wasm-bindgen"
-version = "0.2.92"
+version = "0.2.93"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8"
+checksum = "a82edfc16a6c469f5f44dc7b571814045d60404b55a0ee849f9bcfa2e63dd9b5"
dependencies = [
"cfg-if 1.0.0",
+ "once_cell",
"serde",
"serde_json",
"wasm-bindgen-macro",
@@ -6544,24 +6700,24 @@ dependencies = [
[[package]]
name = "wasm-bindgen-backend"
-version = "0.2.92"
+version = "0.2.93"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da"
+checksum = "9de396da306523044d3302746f1208fa71d7532227f15e347e2d93e4145dd77b"
dependencies = [
"bumpalo",
"log",
"once_cell",
"proc-macro2",
"quote",
- "syn 2.0.60",
+ "syn 2.0.75",
"wasm-bindgen-shared",
]
[[package]]
name = "wasm-bindgen-futures"
-version = "0.4.42"
+version = "0.4.43"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0"
+checksum = "61e9300f63a621e96ed275155c108eb6f843b6a26d053f122ab69724559dc8ed"
dependencies = [
"cfg-if 1.0.0",
"js-sys",
@@ -6571,9 +6727,9 @@ dependencies = [
[[package]]
name = "wasm-bindgen-macro"
-version = "0.2.92"
+version = "0.2.93"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726"
+checksum = "585c4c91a46b072c92e908d99cb1dcdf95c5218eeb6f3bf1efa991ee7a68cccf"
dependencies = [
"quote",
"wasm-bindgen-macro-support",
@@ -6581,31 +6737,32 @@ dependencies = [
[[package]]
name = "wasm-bindgen-macro-support"
-version = "0.2.92"
+version = "0.2.93"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7"
+checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.60",
+ "syn 2.0.75",
"wasm-bindgen-backend",
"wasm-bindgen-shared",
]
[[package]]
name = "wasm-bindgen-shared"
-version = "0.2.92"
+version = "0.2.93"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96"
+checksum = "c62a0a307cb4a311d3a07867860911ca130c3494e8c2719593806c08bc5d0484"
[[package]]
name = "wasm-bindgen-test"
-version = "0.3.42"
+version = "0.3.43"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d9bf62a58e0780af3e852044583deee40983e5886da43a271dd772379987667b"
+checksum = "68497a05fb21143a08a7d24fc81763384a3072ee43c44e86aad1744d6adef9d9"
dependencies = [
"console_error_panic_hook",
"js-sys",
+ "minicov",
"scoped-tls",
"wasm-bindgen",
"wasm-bindgen-futures",
@@ -6614,25 +6771,40 @@ dependencies = [
[[package]]
name = "wasm-bindgen-test-macro"
-version = "0.3.42"
+version = "0.3.43"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b7f89739351a2e03cb94beb799d47fb2cac01759b40ec441f7de39b00cbf7ef0"
+checksum = "4b8220be1fa9e4c889b30fd207d4906657e7e90b12e0e6b0c8b8d8709f5de021"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.60",
+ "syn 2.0.75",
]
[[package]]
name = "web-sys"
-version = "0.3.69"
+version = "0.3.70"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef"
+checksum = "26fdeaafd9bd129f65e7c031593c24d62186301e0c72c8978fa1678be7d532c0"
dependencies = [
"js-sys",
"wasm-bindgen",
]
+[[package]]
+name = "webpki-roots"
+version = "0.25.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1"
+
+[[package]]
+name = "webpki-roots"
+version = "0.26.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0bd24728e5af82c6c4ec1b66ac4844bdf8156257fccda846ec58b42cd0cdbe6a"
+dependencies = [
+ "rustls-pki-types",
+]
+
[[package]]
name = "which"
version = "4.4.2"
@@ -6663,11 +6835,11 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
[[package]]
name = "winapi-util"
-version = "0.1.8"
+version = "0.1.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4d4cc384e1e73b93bafa6fb4f1df8c41695c8a91cf9c4c64358067d15a7b6c6b"
+checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb"
dependencies = [
- "windows-sys 0.52.0",
+ "windows-sys 0.59.0",
]
[[package]]
@@ -6676,13 +6848,96 @@ version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
+[[package]]
+name = "windows"
+version = "0.57.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "12342cb4d8e3b046f3d80effd474a7a02447231330ef77d71daa6fbc40681143"
+dependencies = [
+ "windows-core 0.57.0",
+ "windows-targets 0.52.6",
+]
+
[[package]]
name = "windows-core"
version = "0.52.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9"
dependencies = [
- "windows-targets 0.52.5",
+ "windows-targets 0.52.6",
+]
+
+[[package]]
+name = "windows-core"
+version = "0.57.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d2ed2439a290666cd67ecce2b0ffaad89c2a56b976b736e6ece670297897832d"
+dependencies = [
+ "windows-implement",
+ "windows-interface",
+ "windows-result 0.1.2",
+ "windows-targets 0.52.6",
+]
+
+[[package]]
+name = "windows-implement"
+version = "0.57.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9107ddc059d5b6fbfbffdfa7a7fe3e22a226def0b2608f72e9d552763d3e1ad7"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.75",
+]
+
+[[package]]
+name = "windows-interface"
+version = "0.57.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "29bee4b38ea3cde66011baa44dba677c432a78593e202392d1e9070cf2a7fca7"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.75",
+]
+
+[[package]]
+name = "windows-registry"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e400001bb720a623c1c69032f8e3e4cf09984deec740f007dd2b03ec864804b0"
+dependencies = [
+ "windows-result 0.2.0",
+ "windows-strings",
+ "windows-targets 0.52.6",
+]
+
+[[package]]
+name = "windows-result"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5e383302e8ec8515204254685643de10811af0ed97ea37210dc26fb0032647f8"
+dependencies = [
+ "windows-targets 0.52.6",
+]
+
+[[package]]
+name = "windows-result"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e"
+dependencies = [
+ "windows-targets 0.52.6",
+]
+
+[[package]]
+name = "windows-strings"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10"
+dependencies = [
+ "windows-result 0.2.0",
+ "windows-targets 0.52.6",
]
[[package]]
@@ -6700,7 +6955,16 @@ version = "0.52.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d"
dependencies = [
- "windows-targets 0.52.5",
+ "windows-targets 0.52.6",
+]
+
+[[package]]
+name = "windows-sys"
+version = "0.59.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b"
+dependencies = [
+ "windows-targets 0.52.6",
]
[[package]]
@@ -6720,18 +6984,18 @@ dependencies = [
[[package]]
name = "windows-targets"
-version = "0.52.5"
+version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb"
+checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973"
dependencies = [
- "windows_aarch64_gnullvm 0.52.5",
- "windows_aarch64_msvc 0.52.5",
- "windows_i686_gnu 0.52.5",
+ "windows_aarch64_gnullvm 0.52.6",
+ "windows_aarch64_msvc 0.52.6",
+ "windows_i686_gnu 0.52.6",
"windows_i686_gnullvm",
- "windows_i686_msvc 0.52.5",
- "windows_x86_64_gnu 0.52.5",
- "windows_x86_64_gnullvm 0.52.5",
- "windows_x86_64_msvc 0.52.5",
+ "windows_i686_msvc 0.52.6",
+ "windows_x86_64_gnu 0.52.6",
+ "windows_x86_64_gnullvm 0.52.6",
+ "windows_x86_64_msvc 0.52.6",
]
[[package]]
@@ -6742,9 +7006,9 @@ checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8"
[[package]]
name = "windows_aarch64_gnullvm"
-version = "0.52.5"
+version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263"
+checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
[[package]]
name = "windows_aarch64_msvc"
@@ -6754,9 +7018,9 @@ checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc"
[[package]]
name = "windows_aarch64_msvc"
-version = "0.52.5"
+version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6"
+checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
[[package]]
name = "windows_i686_gnu"
@@ -6766,15 +7030,15 @@ checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e"
[[package]]
name = "windows_i686_gnu"
-version = "0.52.5"
+version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670"
+checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b"
[[package]]
name = "windows_i686_gnullvm"
-version = "0.52.5"
+version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9"
+checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"
[[package]]
name = "windows_i686_msvc"
@@ -6784,9 +7048,9 @@ checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406"
[[package]]
name = "windows_i686_msvc"
-version = "0.52.5"
+version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf"
+checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
[[package]]
name = "windows_x86_64_gnu"
@@ -6796,9 +7060,9 @@ checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e"
[[package]]
name = "windows_x86_64_gnu"
-version = "0.52.5"
+version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9"
+checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
[[package]]
name = "windows_x86_64_gnullvm"
@@ -6808,9 +7072,9 @@ checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc"
[[package]]
name = "windows_x86_64_gnullvm"
-version = "0.52.5"
+version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596"
+checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
[[package]]
name = "windows_x86_64_msvc"
@@ -6820,34 +7084,33 @@ checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538"
[[package]]
name = "windows_x86_64_msvc"
-version = "0.52.5"
+version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0"
+checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
[[package]]
name = "winnow"
-version = "0.6.7"
+version = "0.5.40"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "14b9415ee827af173ebb3f15f9083df5a122eb93572ec28741fb153356ea2578"
+checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876"
dependencies = [
"memchr",
]
[[package]]
-name = "winreg"
-version = "0.50.0"
+name = "winnow"
+version = "0.6.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1"
+checksum = "68a9bda4691f099d435ad181000724da8e5899daa10713c2d432552b9ccd3a6f"
dependencies = [
- "cfg-if 1.0.0",
- "windows-sys 0.48.0",
+ "memchr",
]
[[package]]
name = "workflow-chrome"
-version = "0.12.1"
+version = "0.18.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "109b6289f65b3e1cdfa6f2d9e8eb454453d5763c5061350e2300473c48d91b99"
+checksum = "1e0c0dfbc178cb7c3a47bd2aabf6902364d2db7e4c4f5b0dad57b75d78c6fe1f"
dependencies = [
"cfg-if 1.0.0",
"chrome-sys",
@@ -6860,23 +7123,24 @@ dependencies = [
[[package]]
name = "workflow-core"
-version = "0.12.1"
+version = "0.18.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bcea01cb6122ac3f20dc14f8e4104e2c0cd9c718c17ddb3fc115f9b2ed99f9ae"
+checksum = "a1d67bbe225ea90aa6979167f28935275506696ac867661e218893d3a42e1666"
dependencies = [
- "async-channel 2.2.1",
+ "async-channel 2.3.1",
"async-std",
"borsh",
"bs58",
"cfg-if 1.0.0",
"chrono",
"dirs",
- "faster-hex 0.9.0",
+ "faster-hex",
"futures",
- "getrandom 0.2.14",
+ "getrandom 0.2.15",
"instant",
"js-sys",
"rand 0.8.5",
+ "rlimit",
"serde",
"serde-wasm-bindgen",
"thiserror",
@@ -6887,13 +7151,14 @@ dependencies = [
"wasm-bindgen-futures",
"web-sys",
"workflow-core-macros",
+ "workflow-log",
]
[[package]]
name = "workflow-core-macros"
-version = "0.12.1"
+version = "0.18.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fe24820a62e2b544c75c000cff72781383495a0e05157ec3e29b2abafe1ca2cb"
+checksum = "65659ed208b0066a9344142218abda353eb6c6cc1fc3ae4808b750c560de004b"
dependencies = [
"convert_case 0.6.0",
"parse-variants",
@@ -6908,9 +7173,9 @@ dependencies = [
[[package]]
name = "workflow-dom"
-version = "0.12.1"
+version = "0.18.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "91264d4e789f23c6730c2f3adede04a24b6a9eb9797f9d4ab23de370ba04c27f"
+checksum = "503bba85907753c960ddfd73b4e79bffadf521cc3c992ef2b2a29fd3af09a957"
dependencies = [
"futures",
"js-sys",
@@ -6926,9 +7191,9 @@ dependencies = [
[[package]]
name = "workflow-http"
-version = "0.12.1"
+version = "0.18.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b5b191def1625c3aa5e7d62d1ebbbb3e639113a4a2f122418e4cf8d3379374f8"
+checksum = "a3c654c7395e448001c658309377a44a8c3d7c28c7acb30e9babbaeacb575bb0"
dependencies = [
"cfg-if 1.0.0",
"reqwest",
@@ -6942,9 +7207,9 @@ dependencies = [
[[package]]
name = "workflow-log"
-version = "0.12.1"
+version = "0.18.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "077a8f720aa45c8cd867de1ccc73e068c4084d9fea46d11be7697a108e6a00ba"
+checksum = "64bf52c539193f219b7a79eb0c7c5f6c222ccf9b95c5e0bd59e924feb762256f"
dependencies = [
"cfg-if 1.0.0",
"console",
@@ -6958,9 +7223,9 @@ dependencies = [
[[package]]
name = "workflow-macro-tools"
-version = "0.12.1"
+version = "0.18.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f5a8af8b8951fa0cf94df4057b8cf583e067a525d3d997370db7797f33ba201f"
+checksum = "085d3045d5ca780fb589d230030e34fec962b3638d6c69806a72a7d7d1affea4"
dependencies = [
"convert_case 0.6.0",
"parse-variants",
@@ -6971,9 +7236,9 @@ dependencies = [
[[package]]
name = "workflow-node"
-version = "0.12.1"
+version = "0.18.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7748eb6c76779993ed7f4457356d6b57f48f97f9e264c64c3405098330bcb8c7"
+checksum = "9b85c9add43b5da3bed3d0d6d92eb3a2c5986c0ae65c7c3f5189876c19648154"
dependencies = [
"borsh",
"futures",
@@ -6992,11 +7257,11 @@ dependencies = [
[[package]]
name = "workflow-nw"
-version = "0.12.1"
+version = "0.18.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "010fff3468303b39fb0d5d267847a3d293ed083afbf83f4184fb1a749be56010"
+checksum = "a2dd8c77686e6456be8e92237daaa88ad31546974e04514a09b1a38f812530ef"
dependencies = [
- "ahash 0.8.11",
+ "ahash",
"async-trait",
"borsh",
"futures",
@@ -7016,9 +7281,9 @@ dependencies = [
[[package]]
name = "workflow-panic-hook"
-version = "0.12.1"
+version = "0.18.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "71c1ed51290daf255e5fd83dfe6bd754b108e371b971afbb5c5fd1ea8fe148af"
+checksum = "74c76ca8b459e4f0c949f06ce2d45565a6769748e83ca7064d36671bbd67b4da"
dependencies = [
"cfg-if 1.0.0",
"wasm-bindgen",
@@ -7041,18 +7306,18 @@ dependencies = [
[[package]]
name = "workflow-rpc"
-version = "0.12.1"
+version = "0.18.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "14784fbad27d0403fc752d835c4c4683cfc6af970a484ea83f40ce7ad6dc7745"
+checksum = "ec4235eb167f0bef3bcbdf0c578823a0105ab5303115e3b2afb4d526e2498b08"
dependencies = [
- "ahash 0.8.11",
+ "ahash",
"async-std",
"async-trait",
"borsh",
"downcast-rs",
"futures",
"futures-util",
- "getrandom 0.2.14",
+ "getrandom 0.2.15",
"manual_future",
"rand 0.8.5",
"serde",
@@ -7071,9 +7336,9 @@ dependencies = [
[[package]]
name = "workflow-rpc-macros"
-version = "0.12.1"
+version = "0.18.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c372e99d1336a137b907274a3c50fc195e30141c87fc6da4dba54e7d4b09b8ec"
+checksum = "f048ca6b1c551f468c3c0c829f958e83dd15b20138b5466bb617ffde500e8cf4"
dependencies = [
"parse-variants",
"proc-macro-error",
@@ -7082,17 +7347,28 @@ dependencies = [
"syn 1.0.109",
]
+[[package]]
+name = "workflow-serializer"
+version = "0.18.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "64679db6856852a472caff4ce869e3ecebe291fbccc9406e9643eb5951a0904a"
+dependencies = [
+ "ahash",
+ "borsh",
+ "serde",
+]
+
[[package]]
name = "workflow-store"
-version = "0.12.1"
+version = "0.18.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "762861614298160b9205302bec4f2b7eb45853413d10a90ad8edca44bafc324b"
+checksum = "d161c4b844eee479f81306f2526266f9608a663e0a679d9fc0572ee15c144e06"
dependencies = [
"async-std",
- "base64 0.21.7",
+ "base64 0.22.1",
"cfg-if 1.0.0",
"chrome-sys",
- "faster-hex 0.9.0",
+ "faster-hex",
"filetime",
"home",
"js-sys",
@@ -7112,9 +7388,9 @@ dependencies = [
[[package]]
name = "workflow-task"
-version = "0.12.1"
+version = "0.18.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a4023e2598734e04aa4e968a4dd1cd2b5d0c344edc38b40970926d5742f5afa0"
+checksum = "3d1a90743bb4d3f68606cb4e9a78551a53399ebc35ddba981cbb56bf2b31940a"
dependencies = [
"futures",
"thiserror",
@@ -7124,9 +7400,9 @@ dependencies = [
[[package]]
name = "workflow-task-macros"
-version = "0.12.1"
+version = "0.18.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "057801365ce04c520a2a694bc5bfdf1784f1a33fff97af4cd735f94eb12947b1"
+checksum = "7ecf6be36b52dc1e16d11b55f717d9ec2fec5804aff7f392af591933ba4af45e"
dependencies = [
"convert_case 0.6.0",
"parse-variants",
@@ -7140,9 +7416,9 @@ dependencies = [
[[package]]
name = "workflow-terminal"
-version = "0.12.1"
+version = "0.18.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "895c236dd5cf493e01fc31733c4687b3e67032f610d594ce3b8e5cafd14eaf33"
+checksum = "75b64a2ecf68442edf844c3138f0b78e1398cfe4279540f94cc51b4afb885e5b"
dependencies = [
"async-std",
"async-trait",
@@ -7169,9 +7445,9 @@ dependencies = [
[[package]]
name = "workflow-terminal-macros"
-version = "0.12.1"
+version = "0.18.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "eb1fe67beb12d31f2e69715898aa32abd2349ffc8fe0555617f0d77500cebc56"
+checksum = "7bf96dca7d1847a74d7566c5620610d1accc854032308489105b80c08ebf525f"
dependencies = [
"convert_case 0.6.0",
"parse-variants",
@@ -7185,12 +7461,12 @@ dependencies = [
[[package]]
name = "workflow-wasm"
-version = "0.12.1"
+version = "0.18.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "93ffbd1de665304ba6040a1ab4e0867fd9174446491d257bc6a1474ae25d4a6c"
+checksum = "799e5fbf266e0fffb5c24d6103735eb2b94bb31f93b664b91eaaf63b4f959804"
dependencies = [
"cfg-if 1.0.0",
- "faster-hex 0.9.0",
+ "faster-hex",
"futures",
"js-sys",
"serde",
@@ -7206,9 +7482,9 @@ dependencies = [
[[package]]
name = "workflow-wasm-macros"
-version = "0.12.1"
+version = "0.18.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "082644f52215ecc86b4b8a20a763e482adee52c338208ade268f47fe25eb07ca"
+checksum = "40237c65ecff78dbfedb13985e33f802a31f6f7de72dff12a6674fcdcf601822"
dependencies = [
"js-sys",
"proc-macro-error",
@@ -7220,12 +7496,12 @@ dependencies = [
[[package]]
name = "workflow-websocket"
-version = "0.12.1"
+version = "0.18.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6967baf2bd85deb2a014a32d34c1664ded9333e10d11d43ffc179fa09cc55db8"
+checksum = "515483a047477c91b5142e1090cce0afc21a0139d9c0c06ea42f0d3dbf3a6fcd"
dependencies = [
- "ahash 0.8.11",
- "async-channel 2.2.1",
+ "ahash",
+ "async-channel 2.3.1",
"async-std",
"async-trait",
"cfg-if 1.0.0",
@@ -7249,9 +7525,9 @@ dependencies = [
[[package]]
name = "xml-rs"
-version = "0.8.20"
+version = "0.8.21"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "791978798f0597cfc70478424c2b4fdc2b7a8024aaff78497ef00f24ef674193"
+checksum = "539a77ee7c0de333dcc6da69b177380a0b81e0dacfa4f7344c465a36871ee601"
[[package]]
name = "xmltree"
@@ -7264,41 +7540,42 @@ dependencies = [
[[package]]
name = "xxhash-rust"
-version = "0.8.10"
+version = "0.8.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "927da81e25be1e1a2901d59b81b37dd2efd1fc9c9345a55007f09bf5a2d3ee03"
+checksum = "6a5cbf750400958819fb6178eaa83bee5cd9c29a26a40cc241df8c70fdd46984"
[[package]]
name = "zerocopy"
-version = "0.7.33"
+version = "0.7.35"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "087eca3c1eaf8c47b94d02790dd086cd594b912d2043d4de4bfdd466b3befb7c"
+checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0"
dependencies = [
+ "byteorder",
"zerocopy-derive",
]
[[package]]
name = "zerocopy-derive"
-version = "0.7.33"
+version = "0.7.35"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6f4b6c273f496d8fd4eaf18853e6b448760225dc030ff2c485a786859aea6393"
+checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.60",
+ "syn 2.0.75",
]
[[package]]
name = "zeroize"
-version = "1.7.0"
+version = "1.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d"
+checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde"
[[package]]
name = "zstd-sys"
-version = "2.0.10+zstd.1.5.6"
+version = "2.0.13+zstd.1.5.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c253a4914af5bafc8fa8c86ee400827e83cf6ec01195ec1f1ed8441bf00d65aa"
+checksum = "38ff0f21cfee8f97d94cef41359e0c89aa6113028ab0291aa8ca0038995a95aa"
dependencies = [
"cc",
"pkg-config",
diff --git a/Cargo.toml b/Cargo.toml
index 2789c15c1..9dcfd8d38 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -36,12 +36,13 @@ members = [
"rpc/grpc/core",
"rpc/grpc/client",
"rpc/grpc/server",
- "rpc/wrpc/resolver",
"rpc/wrpc/server",
"rpc/wrpc/client",
"rpc/wrpc/proxy",
+ "rpc/wrpc/python",
"rpc/wrpc/wasm",
"rpc/wrpc/examples/subscriber",
+ "rpc/wrpc/examples/simple_client",
"mining",
"mining/errors",
"protocol/p2p",
@@ -59,11 +60,13 @@ members = [
"metrics/core",
"metrics/perf_monitor",
"utils/alloc",
+ "python",
+ "python/macros",
]
[workspace.package]
-rust-version = "1.78.0"
-version = "0.14.1"
+rust-version = "1.81.0"
+version = "0.15.1"
authors = ["Kaspa developers"]
license = "ISC"
repository = "https://github.com/kaspanet/rusty-kaspa"
@@ -113,6 +116,8 @@ kaspa-p2p-flows = { version = "0.14.1", path = "protocol/flows" }
kaspa-p2p-lib = { version = "0.14.1", path = "protocol/p2p" }
kaspa-perf-monitor = { version = "0.14.1", path = "metrics/perf_monitor" }
kaspa-pow = { version = "0.14.1", path = "consensus/pow" }
+kaspa-python = { version = "0.14.1", path = "python" }
+kaspa-python-macros = { version = "0.15.1", path = "python/macros" }
kaspa-rpc-core = { version = "0.14.1", path = "rpc/core" }
kaspa-rpc-macros = { version = "0.14.1", path = "rpc/macros" }
kaspa-rpc-service = { version = "0.14.1", path = "rpc/service" }
@@ -132,6 +137,7 @@ kaspa-wasm-core = { version = "0.14.1", path = "wasm/core" }
kaspa-wrpc-client = { version = "0.14.1", path = "rpc/wrpc/client" }
kaspa-wrpc-core = { version = "0.14.1", path = "rpc/wrpc/core" }
kaspa-wrpc-proxy = { version = "0.14.1", path = "rpc/wrpc/proxy" }
+kaspa-wrpc-python = { version = "0.14.1", path = "rpc/wrpc/python" }
kaspa-wrpc-server = { version = "0.14.1", path = "rpc/wrpc/server" }
kaspa-wrpc-wasm = { version = "0.14.1", path = "rpc/wrpc/wasm" }
kaspa-wrpc-example-subscriber = { version = "0.14.1", path = "rpc/wrpc/examples/subscriber" }
@@ -147,10 +153,10 @@ async-channel = "2.0.0"
async-std = { version = "1.12.0", features = ['attributes'] }
async-stream = "0.3.5"
async-trait = "0.1.74"
-base64 = "0.21.5"
+base64 = "0.22.1"
bincode = { version = "1.3.3", default-features = false }
blake2b_simd = "1.0.2"
-borsh = { version = "0.9.1", features = ["rc"] } # please keep this fixed
+borsh = { version = "1.5.1", features = ["derive", "rc"] }
bs58 = { version = "0.5.0", features = ["check"], default-features = false }
cc = "1.0.83"
cfb-mode = "0.8.2"
@@ -162,42 +168,45 @@ criterion = { version = "0.5.1", default-features = false }
crossbeam-channel = "0.5.8"
ctrlc = "3.4.1"
crypto_box = { version = "0.9.1", features = ["chacha20"] }
-dashmap = "5.5.3"
+dashmap = "6.0.1"
derivative = "2.2.0"
derive_builder = "0.20.0"
derive_more = "0.99.17"
+# derive_more = { version = "1.0.0", features = ["full"] }
dhat = "0.3.2"
dirs = "5.0.1"
downcast = "0.11.0"
downcast-rs = "1.2.0"
-duration-string = "0.3.0"
-enum-primitive-derive = "0.2.2"
+duration-string = "0.4.0"
+enum-primitive-derive = "0.3.0"
event-listener = "2.5.3" # TODO "3.0.1"
evpkdf = "0.2.0"
-faster-hex = "0.6.1" # TODO "0.8.1" - fails unit tests
+faster-hex = "0.9.0"
fixedstr = { version = "0.5.4", features = ["serde"] }
flate2 = "1.0.28"
futures = { version = "0.3.29" }
-futures-util = { version = "0.3.29", default-features = false, features = [
- "alloc",
-] }
+futures-util = { version = "0.3.29", default-features = false, features = ["alloc"] }
getrandom = { version = "0.2.10", features = ["js"] }
-h2 = "0.3.21"
-heapless = "0.7.16"
+h2 = "0.4.6"
+# h2 = "0.3.21"
+heapless = "0.8.0"
+# heapless = "0.7.16"
hex = { version = "0.4.3", features = ["serde"] }
hex-literal = "0.4.1"
+hexplay = "0.3.0"
hmac = { version = "0.12.1", default-features = false }
home = "0.5.5"
igd-next = { version = "0.14.2", features = ["aio_tokio"] }
indexmap = "2.1.0"
intertrait = "0.2.2"
ipnet = "2.9.0"
-itertools = "0.11.0"
-js-sys = "0.3.67"
+itertools = "0.13.0"
+js-sys = "0.3.70"
keccak = "0.1.4"
-local-ip-address = "0.5.6"
+local-ip-address = "0.6.1"
log = "0.4.20"
log4rs = "1.2.0"
+mac_address = "1.1.7"
malachite-base = "0.4.4"
malachite-nz = "0.4.4"
md-5 = "0.10.6"
@@ -210,7 +219,9 @@ parking_lot = "0.12.1"
paste = "1.0.14"
pbkdf2 = "0.12.2"
portable-atomic = { version = "1.5.1", features = ["float"] }
-prost = "0.12.1"
+prost = "0.13.1"
+pyo3 = { version = "0.21.0", features = ["extension-module", "multiple-pymethods"] }
+pyo3-asyncio-0-21 = { version = "0.21", features = ["attributes", "tokio-runtime"] }
rand = "0.8.5"
rand_chacha = "0.3.1"
rand_core = { version = "0.6.4", features = ["std"] }
@@ -219,8 +230,8 @@ rayon = "1.8.0"
regex = "1.10.2"
ripemd = { version = "0.1.3", default-features = false }
rlimit = "0.10.1"
-rocksdb = "0.21.0"
-secp256k1 = { version = "0.28.2", features = [
+rocksdb = "0.22.0"
+secp256k1 = { version = "0.29.0", features = [
"global-context",
"rand-std",
"serde",
@@ -230,6 +241,7 @@ seqlock = "0.2.0"
serde = { version = "1.0.190", features = ["derive", "rc"] }
serde_bytes = "0.11.12"
serde_json = "1.0.107"
+serde-pyobject = "0.3.0"
serde_repr = "0.1.18"
serde-value = "0.7.0"
serde-wasm-bindgen = "0.6.1"
@@ -242,20 +254,21 @@ sorted-insert = "0.2.3"
statest = "0.2.2"
statrs = "0.13.0" # TODO "0.16.0"
subtle = { version = "2.5.0", default-features = false }
+sysinfo = "0.31.2"
tempfile = "3.8.1"
textwrap = "0.16.0"
thiserror = "1.0.50"
tokio = { version = "1.33.0", features = ["sync", "rt-multi-thread"] }
tokio-stream = "0.1.14"
toml = "0.8.8"
-tonic = { version = "0.10.2", features = ["tls", "gzip", "transport"] }
+tonic = { version = "0.10.2", features = ["tls-webpki-roots", "gzip", "transport"] }
tonic-build = { version = "0.10.2", features = ["prost"] }
triggered = "0.1.2"
uuid = { version = "1.5.0", features = ["v4", "fast-rng", "serde"] }
-wasm-bindgen = { version = "0.2.92", features = ["serde-serialize"] }
-wasm-bindgen-futures = "0.4.40"
-wasm-bindgen-test = "0.3.37"
-web-sys = "0.3.67"
+wasm-bindgen = { version = "0.2.93", features = ["serde-serialize"] }
+wasm-bindgen-futures = "0.4.43"
+wasm-bindgen-test = "0.3.43"
+web-sys = "0.3.70"
xxhash-rust = { version = "0.8.7", features = ["xxh3"] }
zeroize = { version = "1.6.0", default-features = false, features = ["alloc"] }
pin-project-lite = "0.2.13"
@@ -266,25 +279,27 @@ tower-http = { version = "0.4.4", features = [
tower = "0.4.7"
hyper = "0.14.27"
chrono = "0.4.31"
-indexed_db_futures = "0.4.1"
+indexed_db_futures = "0.5.0"
# workflow dependencies that are not a part of core libraries
# workflow-perf-monitor = { path = "../../../workflow-perf-monitor-rs" }
workflow-perf-monitor = "0.0.2"
nw-sys = "0.1.6"
+rustls = { version = "0.23", default-features = false, features = ["ring"] }
# workflow dependencies
-workflow-core = { version = "0.12.1" }
-workflow-d3 = { version = "0.12.1" }
-workflow-dom = { version = "0.12.1" }
-workflow-http = { version = "0.12.1" }
-workflow-log = { version = "0.12.1" }
-workflow-node = { version = "0.12.1" }
-workflow-nw = { version = "0.12.1" }
-workflow-rpc = { version = "0.12.1" }
-workflow-store = { version = "0.12.1" }
-workflow-terminal = { version = "0.12.1" }
-workflow-wasm = { version = "0.12.1" }
+workflow-core = { version = "0.18.0" }
+workflow-d3 = { version = "0.18.0" }
+workflow-dom = { version = "0.18.0" }
+workflow-http = { version = "0.18.0", default-features = false, features = ["rustls-tls-webpki-roots", "http2", "charset", "macos-system-configuration"] }
+workflow-log = { version = "0.18.0" }
+workflow-node = { version = "0.18.0" }
+workflow-nw = { version = "0.18.0" }
+workflow-rpc = { version = "0.18.0", default-features = false, features = ["rustls-tls-webpki-roots"] }
+workflow-serializer = { version = "0.18.0" }
+workflow-store = { version = "0.18.0" }
+workflow-terminal = { version = "0.18.0" }
+workflow-wasm = { version = "0.18.0" }
# if below is enabled, this means that there is an ongoing work
# on the workflow-rs crate. This requires that you clone workflow-rs
@@ -292,24 +307,28 @@ workflow-wasm = { version = "0.12.1" }
# workflow-core = { path = "../workflow-rs/core" }
# workflow-d3 = { path = "../workflow-rs/d3" }
# workflow-dom = { path = "../workflow-rs/dom" }
-# workflow-http = { path = "../workflow-rs/http" }
+# # Same features as default but with rustls-tls-webpki-roots instead of native-tls
+# workflow-http = { path = "../workflow-rs/http", default-features = false, features = ["rustls-tls-webpki-roots", "http2", "charset", "macos-system-configuration"] }
# workflow-log = { path = "../workflow-rs/log" }
# workflow-node = { path = "../workflow-rs/node" }
# workflow-nw = { path = "../workflow-rs/nw" }
-# workflow-rpc = { path = "../workflow-rs/rpc" }
+# workflow-rpc = { path = "../workflow-rs/rpc", default-features = false, features = ["rustls-tls-webpki-roots"] }
+# workflow-serializer = { path = "../workflow-rs/serializer" }
# workflow-store = { path = "../workflow-rs/store" }
# workflow-terminal = { path = "../workflow-rs/terminal" }
# workflow-wasm = { path = "../workflow-rs/wasm" }
+
# ---
# workflow-core = { git = "https://github.com/workflow-rs/workflow-rs.git", branch = "master" }
# workflow-d3 = { git = "https://github.com/workflow-rs/workflow-rs.git", branch = "master" }
# workflow-dom = { git = "https://github.com/workflow-rs/workflow-rs.git", branch = "master" }
-# workflow-http = { git = "https://github.com/workflow-rs/workflow-rs.git", branch = "master" }
+# workflow-http = { git = "https://github.com/workflow-rs/workflow-rs.git", branch = "master", default-features = false, features = ["rustls-tls-webpki-roots", "http2", "charset", "macos-system-configuration"] }
# workflow-log = { git = "https://github.com/workflow-rs/workflow-rs.git", branch = "master" }
# workflow-node = { git = "https://github.com/workflow-rs/workflow-rs.git", branch = "master" }
# workflow-nw = { git = "https://github.com/workflow-rs/workflow-rs.git", branch = "master" }
-# workflow-rpc = { git = "https://github.com/workflow-rs/workflow-rs.git", branch = "master" }
+# workflow-rpc = { git = "https://github.com/workflow-rs/workflow-rs.git", branch = "master", default-features = false, features = ["rustls-tls-webpki-roots"] }
+# workflow-serializer = { git = "https://github.com/workflow-rs/workflow-rs.git", branch = "master" }
# workflow-store = { git = "https://github.com/workflow-rs/workflow-rs.git", branch = "master" }
# workflow-terminal = { git = "https://github.com/workflow-rs/workflow-rs.git", branch = "master" }
# workflow-wasm = { git = "https://github.com/workflow-rs/workflow-rs.git", branch = "master" }
@@ -326,3 +345,5 @@ inherits = "release"
debug = true
strip = false
+[workspace.lints.clippy]
+empty_docs = "allow"
diff --git a/README.md b/README.md
index 5644e06de..ada38c55d 100644
--- a/README.md
+++ b/README.md
@@ -3,10 +3,12 @@
Welcome to the Rust-based implementation of the Kaspa full-node and its ancillary libraries. The contained node release serves as a drop-in replacement to the established Golang node and to date is the recommended node software for the Kaspa network, introducing developers to the possibilities of Rust in the Kaspa network's context.
-We invite developers and blockchain enthusiasts to collaborate, test, and optimize our Rust implementation. Each line of code here is an opportunity to contribute to the open-source blockchain movement, shaping a platform designed for scalability and speed without compromising on decentralization.
+We invite developers and blockchain enthusiasts to collaborate, test, and optimize our Rust implementation. Each line of code here is an opportunity to contribute to the open-source blockchain movement, shaping a platform designed for scalability and speed without compromising on security and decentralization.
Your feedback, contributions, and issue reports will be integral to evolving this codebase and continuing its maturity as a reliable node in the Kaspa network.
+The default branch of this repository is `master` and new contributions are constantly merged into it. For a stable branch corresponding to the latest stable release please pull and compile the `stable` branch.
+
## Installation
Building on Linux
@@ -414,5 +416,3 @@ Logging in `kaspad` and `simpa` can be [filtered](https://docs.rs/env_logger/0.1
-
-
diff --git a/cli/Cargo.toml b/cli/Cargo.toml
index f2c80a5fa..60a43002a 100644
--- a/cli/Cargo.toml
+++ b/cli/Cargo.toml
@@ -33,6 +33,7 @@ downcast.workspace = true
faster-hex.workspace = true
futures.workspace = true
js-sys.workspace = true
+hex.workspace = true
kaspa-addresses.workspace = true
kaspa-bip32.workspace = true
kaspa-consensus-core.workspace = true
@@ -43,6 +44,7 @@ kaspa-rpc-core.workspace = true
kaspa-utils.workspace = true
kaspa-wallet-core.workspace = true
kaspa-wallet-keys.workspace = true
+kaspa-wallet-pskt.workspace = true
kaspa-wrpc-client.workspace = true
nw-sys.workspace = true
pad.workspace = true
@@ -80,5 +82,5 @@ features = [
[target.'cfg(not(target_arch = "wasm32"))'.dependencies]
tokio.workspace = true
-[lints.clippy]
-empty_docs = "allow"
+[lints]
+workspace = true
diff --git a/cli/src/cli.rs b/cli/src/cli.rs
index 4f562e749..5ca1997ea 100644
--- a/cli/src/cli.rs
+++ b/cli/src/cli.rs
@@ -6,9 +6,10 @@ use crate::modules::node::Node;
use crate::notifier::{Notification, Notifier};
use crate::result::Result;
use kaspa_daemon::{DaemonEvent, DaemonKind, Daemons};
+use kaspa_wallet_core::account::Account;
use kaspa_wallet_core::rpc::DynRpcApi;
use kaspa_wallet_core::storage::{IdT, PrvKeyDataInfo};
-use kaspa_wrpc_client::KaspaRpcClient;
+use kaspa_wrpc_client::{KaspaRpcClient, Resolver};
use workflow_core::channel::*;
use workflow_core::time::Instant;
use workflow_log::*;
@@ -102,7 +103,7 @@ impl KaspaCli {
}
pub async fn try_new_arc(options: Options) -> Result> {
- let wallet = Arc::new(Wallet::try_new(Wallet::local_store()?, None, None)?);
+ let wallet = Arc::new(Wallet::try_new(Wallet::local_store()?, Some(Resolver::default()), None)?);
let kaspa_cli = Arc::new(KaspaCli {
term: Arc::new(Mutex::new(None)),
@@ -311,7 +312,9 @@ impl KaspaCli {
Events::SyncState { sync_state } => {
if sync_state.is_synced() && this.wallet().is_open() {
- if let Err(error) = this.wallet().reload(false).await {
+ let guard = this.wallet().guard();
+ let guard = guard.lock().await;
+ if let Err(error) = this.wallet().reload(false, &guard).await {
terrorln!(this, "Unable to reload wallet: {error}");
}
}
@@ -383,8 +386,11 @@ impl KaspaCli {
record
} => {
if !this.is_mutted() || (this.is_mutted() && this.flags.get(Track::Pending)) {
+ let guard = this.wallet.guard();
+ let guard = guard.lock().await;
+
let include_utxos = this.flags.get(Track::Utxo);
- let tx = record.format_transaction_with_state(&this.wallet,Some("reorg"),include_utxos).await;
+ let tx = record.format_transaction_with_state(&this.wallet,Some("reorg"),include_utxos, &guard).await;
tx.iter().for_each(|line|tprintln!(this,"{NOTIFY} {line}"));
}
},
@@ -393,8 +399,11 @@ impl KaspaCli {
} => {
// Pending and coinbase stasis fall under the same `Track` category
if !this.is_mutted() || (this.is_mutted() && this.flags.get(Track::Pending)) {
+ let guard = this.wallet.guard();
+ let guard = guard.lock().await;
+
let include_utxos = this.flags.get(Track::Utxo);
- let tx = record.format_transaction_with_state(&this.wallet,Some("stasis"),include_utxos).await;
+ let tx = record.format_transaction_with_state(&this.wallet,Some("stasis"),include_utxos, &guard).await;
tx.iter().for_each(|line|tprintln!(this,"{NOTIFY} {line}"));
}
},
@@ -411,8 +420,11 @@ impl KaspaCli {
record
} => {
if !this.is_mutted() || (this.is_mutted() && this.flags.get(Track::Pending)) {
+ let guard = this.wallet.guard();
+ let guard = guard.lock().await;
+
let include_utxos = this.flags.get(Track::Utxo);
- let tx = record.format_transaction_with_state(&this.wallet,Some("pending"),include_utxos).await;
+ let tx = record.format_transaction_with_state(&this.wallet,Some("pending"),include_utxos, &guard).await;
tx.iter().for_each(|line|tprintln!(this,"{NOTIFY} {line}"));
}
},
@@ -420,8 +432,11 @@ impl KaspaCli {
record
} => {
if !this.is_mutted() || (this.is_mutted() && this.flags.get(Track::Tx)) {
+ let guard = this.wallet.guard();
+ let guard = guard.lock().await;
+
let include_utxos = this.flags.get(Track::Utxo);
- let tx = record.format_transaction_with_state(&this.wallet,Some("confirmed"),include_utxos).await;
+ let tx = record.format_transaction_with_state(&this.wallet,Some("confirmed"),include_utxos, &guard).await;
tx.iter().for_each(|line|tprintln!(this,"{NOTIFY} {line}"));
}
},
@@ -532,6 +547,9 @@ impl KaspaCli {
}
async fn select_account_with_args(&self, autoselect: bool) -> Result> {
+ let guard = self.wallet.guard();
+ let guard = guard.lock().await;
+
let mut selection = None;
let mut list_by_key = Vec::<(Arc, Vec<(usize, Arc)>)>::new();
@@ -540,7 +558,7 @@ impl KaspaCli {
let mut keys = self.wallet.keys().await?;
while let Some(key) = keys.try_next().await? {
let mut prv_key_accounts = Vec::new();
- let mut accounts = self.wallet.accounts(Some(key.id)).await?;
+ let mut accounts = self.wallet.accounts(Some(key.id), &guard).await?;
while let Some(account) = accounts.next().await {
let account = account?;
prv_key_accounts.push((flat_list.len(), account.clone()));
@@ -550,6 +568,16 @@ impl KaspaCli {
list_by_key.push((key.clone(), prv_key_accounts));
}
+ let mut watch_accounts = Vec::<(usize, Arc)>::new();
+ let mut unfiltered_accounts = self.wallet.accounts(None, &guard).await?;
+
+ while let Some(account) = unfiltered_accounts.try_next().await? {
+ if account.feature().is_some() {
+ watch_accounts.push((flat_list.len(), account.clone()));
+ flat_list.push(account.clone());
+ }
+ }
+
if flat_list.is_empty() {
return Err(Error::NoAccounts);
} else if autoselect && flat_list.len() == 1 {
@@ -569,6 +597,16 @@ impl KaspaCli {
})
});
+ if !watch_accounts.is_empty() {
+ tprintln!(self, "• watch-only");
+ }
+
+ watch_accounts.iter().for_each(|(seq, account)| {
+ let seq = style(seq.to_string()).cyan();
+ let ls_string = account.get_list_string().unwrap_or_else(|err| panic!("{err}"));
+ tprintln!(self, " {seq}: {ls_string}");
+ });
+
tprintln!(self);
let range = if flat_list.len() > 1 { format!("[{}..{}] ", 0, flat_list.len() - 1) } else { "".to_string() };
@@ -643,18 +681,35 @@ impl KaspaCli {
}
pub async fn list(&self) -> Result<()> {
+ let guard = self.wallet.guard();
+ let guard = guard.lock().await;
+
let mut keys = self.wallet.keys().await?;
tprintln!(self);
while let Some(key) = keys.try_next().await? {
tprintln!(self, "• {}", style(&key).dim());
- let mut accounts = self.wallet.accounts(Some(key.id)).await?;
+
+ let mut accounts = self.wallet.accounts(Some(key.id), &guard).await?;
while let Some(account) = accounts.try_next().await? {
let receive_address = account.receive_address()?;
tprintln!(self, " • {}", account.get_list_string()?);
tprintln!(self, " {}", style(receive_address.to_string()).blue());
}
}
+
+ let mut unfiltered_accounts = self.wallet.accounts(None, &guard).await?;
+ let mut feature_header_printed = false;
+ while let Some(account) = unfiltered_accounts.try_next().await? {
+ if let Some(feature) = account.feature() {
+ if !feature_header_printed {
+ tprintln!(self, "{}", style("• watch-only").dim());
+ feature_header_printed = true;
+ }
+ tprintln!(self, " • {}", account.get_list_string().unwrap());
+ tprintln!(self, " • {}", style(feature).cyan());
+ }
+ }
tprintln!(self);
Ok(())
diff --git a/cli/src/error.rs b/cli/src/error.rs
index a1701be35..23bb26124 100644
--- a/cli/src/error.rs
+++ b/cli/src/error.rs
@@ -72,6 +72,9 @@ pub enum Error {
#[error("wallet secret is required")]
WalletSecretRequired,
+ #[error("watch-only wallet kpub is required")]
+ WalletBip32WatchXpubRequired,
+
#[error("wallet secrets do not match")]
WalletSecretMatch,
@@ -84,6 +87,9 @@ pub enum Error {
#[error("key data not found")]
KeyDataNotFound,
+ #[error("no key data to export for watch-only account")]
+ WatchOnlyAccountNoKeyData,
+
#[error("no accounts found, please create an account to continue")]
NoAccounts,
@@ -122,6 +128,12 @@ pub enum Error {
#[error(transparent)]
KaspaWalletKeys(#[from] kaspa_wallet_keys::error::Error),
+
+ #[error(transparent)]
+ PskbLockScriptSigError(#[from] kaspa_wallet_pskt::error::Error),
+
+ #[error("To hex serialization error")]
+ PskbSerializeToHexError,
}
impl Error {
diff --git a/cli/src/extensions/transaction.rs b/cli/src/extensions/transaction.rs
index 70d73615a..415aa7a34 100644
--- a/cli/src/extensions/transaction.rs
+++ b/cli/src/extensions/transaction.rs
@@ -2,6 +2,7 @@ use crate::imports::*;
use kaspa_consensus_core::tx::{TransactionInput, TransactionOutpoint};
use kaspa_wallet_core::storage::Binding;
use kaspa_wallet_core::storage::{TransactionData, TransactionKind, TransactionRecord};
+use kaspa_wallet_core::wallet::WalletGuard;
use workflow_log::style;
pub trait TransactionTypeExtension {
@@ -48,8 +49,14 @@ impl TransactionTypeExtension for TransactionKind {
#[async_trait]
pub trait TransactionExtension {
- async fn format_transaction(&self, wallet: &Arc, include_utxos: bool) -> Vec;
- async fn format_transaction_with_state(&self, wallet: &Arc, state: Option<&str>, include_utxos: bool) -> Vec;
+ async fn format_transaction(&self, wallet: &Arc, include_utxos: bool, guard: &WalletGuard) -> Vec;
+ async fn format_transaction_with_state(
+ &self,
+ wallet: &Arc,
+ state: Option<&str>,
+ include_utxos: bool,
+ guard: &WalletGuard,
+ ) -> Vec;
async fn format_transaction_with_args(
&self,
wallet: &Arc,
@@ -58,17 +65,24 @@ pub trait TransactionExtension {
include_utxos: bool,
history: bool,
account: Option>,
+ guard: &WalletGuard,
) -> Vec;
}
#[async_trait]
impl TransactionExtension for TransactionRecord {
- async fn format_transaction(&self, wallet: &Arc, include_utxos: bool) -> Vec {
- self.format_transaction_with_args(wallet, None, None, include_utxos, false, None).await
+ async fn format_transaction(&self, wallet: &Arc, include_utxos: bool, guard: &WalletGuard) -> Vec {
+ self.format_transaction_with_args(wallet, None, None, include_utxos, false, None, guard).await
}
- async fn format_transaction_with_state(&self, wallet: &Arc, state: Option<&str>, include_utxos: bool) -> Vec {
- self.format_transaction_with_args(wallet, state, None, include_utxos, false, None).await
+ async fn format_transaction_with_state(
+ &self,
+ wallet: &Arc,
+ state: Option<&str>,
+ include_utxos: bool,
+ guard: &WalletGuard,
+ ) -> Vec {
+ self.format_transaction_with_args(wallet, state, None, include_utxos, false, None, guard).await
}
async fn format_transaction_with_args(
@@ -79,6 +93,7 @@ impl TransactionExtension for TransactionRecord {
include_utxos: bool,
history: bool,
account: Option>,
+ guard: &WalletGuard,
) -> Vec {
let TransactionRecord { id, binding, block_daa_score, transaction_data, .. } = self;
@@ -88,7 +103,7 @@ impl TransactionExtension for TransactionRecord {
let account = if let Some(account) = account {
Some(account)
} else {
- wallet.get_account_by_id(account_id).await.ok().flatten()
+ wallet.get_account_by_id(account_id, guard).await.ok().flatten()
};
if let Some(account) = account {
diff --git a/cli/src/imports.rs b/cli/src/imports.rs
index a15812804..24de4b0dd 100644
--- a/cli/src/imports.rs
+++ b/cli/src/imports.rs
@@ -14,7 +14,7 @@ pub use kaspa_utils::hex::*;
pub use kaspa_wallet_core::compat::*;
pub use kaspa_wallet_core::prelude::*;
pub use kaspa_wallet_core::settings::{DefaultSettings, SettingsStore, WalletSettings};
-pub use kaspa_wallet_core::utils::*;
+pub use kaspa_wrpc_client::prelude::*;
pub use pad::PadStr;
pub use regex::Regex;
pub use separator::Separatable;
diff --git a/cli/src/modules/account.rs b/cli/src/modules/account.rs
index be627047e..5848d43fb 100644
--- a/cli/src/modules/account.rs
+++ b/cli/src/modules/account.rs
@@ -177,7 +177,44 @@ impl Account {
}
_ => {
tprintln!(ctx, "unknown account import type: '{import_kind}'");
- tprintln!(ctx, "supported import types are: 'mnemonic' or 'legacy-data'\r\n");
+ tprintln!(ctx, "supported import types are: 'mnemonic', 'legacy-data' or 'multisig-watch'\r\n");
+ return Ok(());
+ }
+ }
+ }
+ "watch" => {
+ if argv.is_empty() {
+ tprintln!(ctx, "usage: 'account watch [account name]'");
+ tprintln!(ctx, "");
+ tprintln!(ctx, "examples:");
+ tprintln!(ctx, "");
+ ctx.term().help(
+ &[
+ ("account watch bip32", "Import a extended public key for a watch-only bip32 account"),
+ ("account watch multisig", "Import extended public keys for a watch-only multisig account"),
+ ],
+ None,
+ )?;
+
+ return Ok(());
+ }
+
+ let watch_kind = argv.remove(0);
+
+ let account_name = argv.first().map(|name| name.trim()).filter(|name| !name.is_empty()).map(|name| name.to_string());
+
+ let account_name = account_name.as_deref();
+
+ match watch_kind.as_ref() {
+ "bip32" => {
+ wizards::account::bip32_watch(&ctx, account_name).await?;
+ }
+ "multisig" => {
+ wizards::account::multisig_watch(&ctx, account_name).await?;
+ }
+ _ => {
+ tprintln!(ctx, "unknown account watch type: '{watch_kind}'");
+ tprintln!(ctx, "supported watch types are: 'bip32' or 'multisig'\r\n");
return Ok(());
}
}
diff --git a/cli/src/modules/connect.rs b/cli/src/modules/connect.rs
index 26173256b..024f7e693 100644
--- a/cli/src/modules/connect.rs
+++ b/cli/src/modules/connect.rs
@@ -1,5 +1,4 @@
use crate::imports::*;
-use kaspa_wrpc_client::Resolver;
#[derive(Default, Handler)]
#[help("Connect to a Kaspa network")]
@@ -27,13 +26,23 @@ impl Connect {
};
if is_public {
- tpara!(
- ctx,
- "Please note that default public nodes are community-operated and \
- accessing them may expose your IP address to different node providers. \
- Consider running your own node for better privacy. \
- ",
- );
+ static WARNING: AtomicBool = AtomicBool::new(false);
+ if !WARNING.load(Ordering::Relaxed) {
+ WARNING.store(true, Ordering::Relaxed);
+
+ tprintln!(ctx);
+
+ tpara!(
+ ctx,
+ "Please note that public node infrastructure is operated by contributors and \
+ accessing it may expose your IP address to different node providers. \
+ Consider running your own node for better privacy. \
+ ",
+ );
+ tprintln!(ctx);
+ tpara!(ctx, "Please do not connect to public nodes directly as they are load-balanced.");
+ tprintln!(ctx);
+ }
}
let options = ConnectOptions {
diff --git a/cli/src/modules/details.rs b/cli/src/modules/details.rs
index ed44a9c82..896ecd3e8 100644
--- a/cli/src/modules/details.rs
+++ b/cli/src/modules/details.rs
@@ -27,6 +27,18 @@ impl Details {
tprintln!(ctx.term(), "{:>4}{}", "", style(address.to_string()).blue());
});
+ if let Some(xpub_keys) = account.xpub_keys() {
+ if account.feature().is_some() {
+ if let Some(feature) = account.feature() {
+ tprintln!(ctx.term(), "Feature: {}", style(feature).cyan());
+ }
+ tprintln!(ctx.term(), "Extended public keys:");
+ xpub_keys.iter().for_each(|xpub| {
+ tprintln!(ctx.term(), "{:>4}{}", "", style(ctx.wallet().network_format_xpub(xpub)).dim());
+ });
+ }
+ }
+
Ok(())
}
}
diff --git a/cli/src/modules/export.rs b/cli/src/modules/export.rs
index 8a6b26e57..006cd7d36 100644
--- a/cli/src/modules/export.rs
+++ b/cli/src/modules/export.rs
@@ -1,5 +1,5 @@
use crate::imports::*;
-use kaspa_wallet_core::account::{multisig::MultiSig, Account, MULTISIG_ACCOUNT_KIND};
+use kaspa_wallet_core::account::{multisig::MultiSig, Account, BIP32_ACCOUNT_KIND, MULTISIG_ACCOUNT_KIND};
#[derive(Default, Handler)]
#[help("Export transactions, a wallet or a private key")]
@@ -32,8 +32,8 @@ impl Export {
async fn export_multisig_account(ctx: Arc, account: Arc) -> Result<()> {
match &account.prv_key_data_ids() {
- None => Err(Error::KeyDataNotFound),
- Some(v) if v.is_empty() => Err(Error::KeyDataNotFound),
+ None => Err(Error::WatchOnlyAccountNoKeyData),
+ Some(v) if v.is_empty() => Err(Error::WatchOnlyAccountNoKeyData),
Some(prv_key_data_ids) => {
let wallet_secret = Secret::new(ctx.term().ask(true, "Enter wallet password: ").await?.trim().as_bytes().to_vec());
if wallet_secret.as_ref().is_empty() {
@@ -45,26 +45,38 @@ async fn export_multisig_account(ctx: Arc, account: Arc) ->
let prv_key_data_store = ctx.store().as_prv_key_data_store()?;
let mut generated_xpub_keys = Vec::with_capacity(prv_key_data_ids.len());
+
for (id, prv_key_data_id) in prv_key_data_ids.iter().enumerate() {
let prv_key_data = prv_key_data_store.load_key_data(&wallet_secret, prv_key_data_id).await?.unwrap();
let mnemonic = prv_key_data.as_mnemonic(None).unwrap().unwrap();
+ let xpub_key: kaspa_bip32::ExtendedPublicKey =
+ prv_key_data.create_xpub(None, MULTISIG_ACCOUNT_KIND.into(), 0).await?; // todo it can be done concurrently
+
+ tprintln!(ctx, "");
+ tprintln!(ctx, "extended public key {}:", id + 1);
+ tprintln!(ctx, "");
+ tprintln!(ctx, "{}", ctx.wallet().network_format_xpub(&xpub_key));
+ tprintln!(ctx, "");
+
tprintln!(ctx, "mnemonic {}:", id + 1);
tprintln!(ctx, "");
tprintln!(ctx, "{}", mnemonic.phrase());
tprintln!(ctx, "");
- let xpub_key = prv_key_data.create_xpub(None, MULTISIG_ACCOUNT_KIND.into(), 0).await?; // todo it can be done concurrently
generated_xpub_keys.push(xpub_key);
}
-
- let additional = account.xpub_keys().iter().filter(|xpub| !generated_xpub_keys.contains(xpub));
- additional.enumerate().for_each(|(idx, xpub)| {
- if idx == 0 {
- tprintln!(ctx, "additional xpubs: ");
- }
- tprintln!(ctx, "{xpub}");
- });
+ let test = account.xpub_keys();
+
+ if let Some(keys) = test {
+ let additional = keys.iter().filter(|item| !generated_xpub_keys.contains(item));
+ additional.enumerate().for_each(|(idx, xpub)| {
+ if idx == 0 {
+ tprintln!(ctx, "additional xpubs: ");
+ }
+ tprintln!(ctx, "{}", ctx.wallet().network_format_xpub(xpub));
+ });
+ }
Ok(())
}
}
@@ -94,6 +106,13 @@ async fn export_single_key_account(ctx: Arc, account: Arc
let prv_key_data = keydata.payload.decrypt(payment_secret.as_ref())?;
let mnemonic = prv_key_data.as_ref().as_mnemonic()?;
+ let xpub_key = keydata.create_xpub(None, BIP32_ACCOUNT_KIND.into(), 0).await?; // todo it can be done concurrently
+
+ tprintln!(ctx, "extended public key:");
+ tprintln!(ctx, "");
+ tprintln!(ctx, "{}", ctx.wallet().network_format_xpub(&xpub_key));
+ tprintln!(ctx, "");
+
match mnemonic {
None => {
tprintln!(ctx, "mnemonic is not available for this private key");
diff --git a/cli/src/modules/guide.txt b/cli/src/modules/guide.txt
index ecc0f8d96..b993622ba 100644
--- a/cli/src/modules/guide.txt
+++ b/cli/src/modules/guide.txt
@@ -1,49 +1,23 @@
-Please note - this is an alpha version of the softeware, not all features are currently functional.
-
-If using a dekstop or a web version of this software, you can use Ctrl+'+' or Ctrl+'-' (Command on MacOS) to
-change the terminal font size.
-
-If using a desktop version, you can use Ctrl+M (Command on MacOS) to bring up metrics.
-
-Type `help` to see the complete list of commands. `exit` to exit this application.
-On Windows you can use `Alt+F4` and on MacOS `Command+Q` to exit.
-
----
-
Before you start, you must configure the default network setting. There are currently
-3 networks available. `mainnet`, `testnet-10` and `testnet-11`. While this software
-is in alpha stage, you should not use it on the mainnet. If you wish to experiment,
-you should select `testnet-10` by entering `network testnet-10`
+3 networks available. `mainnet`, `testnet-10` and `testnet-11`. If you wish to experiment,
+you should select `testnet-11` by entering `network testnet-11`
The `server` command configures the target server. You can connect to any Rusty Kaspa
-node that has User RPC enabled with `--rpclisten-borsh=public`. If you are running the node
-from within KOS, it is locked to listen to a local IP address.
+node that has wRPC enabled with `--rpclisten-borsh=0.0.0.0`. If the server setting
+is set to 'public' the node will connect to the public node infrastructure.
Both network and server values are stored in the application settings and are
used when running a local node or connecting to a remote node.
---
-You can use `node start` to start the node. Type `node` to see an overview of commands.
-`node mute` toggles node log output (you can also use `node logs`). `node select` allows
-you to choose between locally installed flavors (if running in the development environment).
-You can also specify an absolute path by typing `node select `.
-
-For developers: `node select` scans 'target' folder for the debug and release builds
-so you can switch between builds at runtime using the `node select` command.
-
-Once you node is running, you can connect to it using the `connect` command.
-
-When starting the node and the `server` setting is configured to your local host,
-the `connect` action will occure automatically.
-
-`wallet create []` Use theis command to create a local wallet. The argument
+`wallet create []` Use this command to create a local wallet. The argument
is optional (the default wallet name is "kaspa") and allows you to create multiple
named wallets. Only one wallet can be opened at a time. Keep in mind that a wallet can have multiple
accounts, as such you only need one wallet, unless, for example, you want to separate wallets for
personal and business needs (but you can also create isolated accounts within a wallet).
-Make sure to record your mnemonic, even if working with a testnet, not to loose your
+Make sure to record your mnemonic, even if working with a testnet, not to lose your
testnet KAS.
`open ` - opens the wallet (the wallet is open automatically after creation).
@@ -56,9 +30,6 @@ testnet KAS.
`address` - shows your selected account address
-Note - you can click on the address to copy it to the clipboard. (When on mainnet, Ctrl+Click on addresses, transactions and
-block hashes will open a new browser window with an explorer.)
-
Before you transact: `mute` option (enabled by default) toggles mute on/off. Mute enables terminal
output of internal framework events. Rust and JavaScript/TypeScript applications integrating with this platform
are meant to update their state by monitoring event notifications. Mute allows you to see these events in
@@ -78,11 +49,6 @@ the selected account to an account named 'pete' (starts with a 'p' letter)
`history details` - Show previous account transactions with extended information.
-Once your node is synced, you can start the CPU miner.
-
-`miner start` - Starts the miner. The miner will mine to your currently selected account. (So you need to have a wallet open and an
-account selected to start the miner)
-
`monitor` - A test screen environment that periodically updates account balances.
`rpc` - Allows you to execute RPC methods against the node (not all methods are currently available)
diff --git a/cli/src/modules/history.rs b/cli/src/modules/history.rs
index 299701c51..8fdf31f4d 100644
--- a/cli/src/modules/history.rs
+++ b/cli/src/modules/history.rs
@@ -10,6 +10,9 @@ impl History {
async fn main(self: Arc, ctx: &Arc, mut argv: Vec, _cmd: &str) -> Result<()> {
let ctx = ctx.clone().downcast_arc::()?;
+ let guard = ctx.wallet().guard();
+ let guard = guard.lock().await;
+
if argv.is_empty() {
self.display_help(ctx, argv).await?;
return Ok(());
@@ -34,7 +37,15 @@ impl History {
match store.load_single(&binding, &network_id, &txid).await {
Ok(tx) => {
let lines = tx
- .format_transaction_with_args(&ctx.wallet(), None, current_daa_score, true, true, Some(account.clone()))
+ .format_transaction_with_args(
+ &ctx.wallet(),
+ None,
+ current_daa_score,
+ true,
+ true,
+ Some(account.clone()),
+ &guard,
+ )
.await;
lines.iter().for_each(|line| tprintln!(ctx, "{line}"));
}
@@ -116,6 +127,7 @@ impl History {
include_utxo,
true,
Some(account.clone()),
+ &guard,
)
.await;
lines.iter().for_each(|line| tprintln!(ctx, "{line}"));
diff --git a/cli/src/modules/mod.rs b/cli/src/modules/mod.rs
index a6371814f..7990a9d6e 100644
--- a/cli/src/modules/mod.rs
+++ b/cli/src/modules/mod.rs
@@ -26,6 +26,7 @@ pub mod network;
pub mod node;
pub mod open;
pub mod ping;
+pub mod pskb;
pub mod reload;
pub mod rpc;
pub mod select;
@@ -57,7 +58,7 @@ pub fn register_handlers(cli: &Arc) -> Result<()> {
cli.handlers(),
[
account, address, close, connect, details, disconnect, estimate, exit, export, guide, help, history, rpc, list, miner,
- message, monitor, mute, network, node, open, ping, reload, select, send, server, settings, sweep, track, transfer,
+ message, monitor, mute, network, node, open, ping, pskb, reload, select, send, server, settings, sweep, track, transfer,
wallet,
// halt,
// theme, start, stop
diff --git a/cli/src/modules/pskb.rs b/cli/src/modules/pskb.rs
new file mode 100644
index 000000000..fd33087c2
--- /dev/null
+++ b/cli/src/modules/pskb.rs
@@ -0,0 +1,266 @@
+#![allow(unused_imports)]
+
+use crate::imports::*;
+use kaspa_addresses::Prefix;
+use kaspa_consensus_core::tx::{TransactionOutpoint, UtxoEntry};
+use kaspa_wallet_core::account::pskb::finalize_pskt_one_or_more_sig_and_redeem_script;
+use kaspa_wallet_pskt::{
+ prelude::{lock_script_sig_templating, script_sig_to_address, unlock_utxos_as_pskb, Bundle, Signer, PSKT},
+ pskt::Inner,
+};
+
+#[derive(Default, Handler)]
+#[help("Send a Kaspa transaction to a public address")]
+pub struct Pskb;
+
+impl Pskb {
+ async fn main(self: Arc, ctx: &Arc, mut argv: Vec, _cmd: &str) -> Result<()> {
+ let ctx = ctx.clone().downcast_arc::()?;
+
+ if !ctx.wallet().is_open() {
+ return Err(Error::WalletIsNotOpen);
+ }
+
+ if argv.is_empty() {
+ return self.display_help(ctx, argv).await;
+ }
+
+ let action = argv.remove(0);
+
+ match action.as_str() {
+ "create" => {
+ if argv.len() < 2 || argv.len() > 3 {
+ return self.display_help(ctx, argv).await;
+ }
+ let (wallet_secret, payment_secret) = ctx.ask_wallet_secret(None).await?;
+ let _ = ctx.notifier().show(Notification::Processing).await;
+
+ let address = Address::try_from(argv.first().unwrap().as_str())?;
+ let amount_sompi = try_parse_required_nonzero_kaspa_as_sompi_u64(argv.get(1))?;
+ let outputs = PaymentOutputs::from((address, amount_sompi));
+ let priority_fee_sompi = try_parse_optional_kaspa_as_sompi_i64(argv.get(2))?.unwrap_or(0);
+ let abortable = Abortable::default();
+
+ let account: Arc = ctx.wallet().account()?;
+ let signer = account
+ .pskb_from_send_generator(
+ outputs.into(),
+ priority_fee_sompi.into(),
+ None,
+ wallet_secret.clone(),
+ payment_secret.clone(),
+ &abortable,
+ )
+ .await?;
+
+ match signer.serialize() {
+ Ok(encoded) => tprintln!(ctx, "{encoded}"),
+ Err(e) => return Err(e.into()),
+ }
+ }
+ "script" => {
+ if argv.len() < 2 || argv.len() > 4 {
+ return self.display_help(ctx, argv).await;
+ }
+ let subcommand = argv.remove(0);
+ let payload = argv.remove(0);
+ let account = ctx.wallet().account()?;
+ let receive_address = account.receive_address()?;
+ let (wallet_secret, payment_secret) = ctx.ask_wallet_secret(None).await?;
+ let _ = ctx.notifier().show(Notification::Processing).await;
+
+ let script_sig = match lock_script_sig_templating(payload.clone(), Some(&receive_address.payload)) {
+ Ok(value) => value,
+ Err(e) => {
+ terrorln!(ctx, "{}", e.to_string());
+ return Err(e.into());
+ }
+ };
+
+ let script_p2sh = match script_sig_to_address(&script_sig, ctx.wallet().address_prefix()?) {
+ Ok(p2sh) => p2sh,
+ Err(e) => {
+ terrorln!(ctx, "Error generating script address: {}", e.to_string());
+ return Err(e.into());
+ }
+ };
+
+ match subcommand.as_str() {
+ "lock" => {
+ let amount_sompi = try_parse_required_nonzero_kaspa_as_sompi_u64(argv.first())?;
+ let outputs = PaymentOutputs::from((script_p2sh, amount_sompi));
+ let priority_fee_sompi = try_parse_optional_kaspa_as_sompi_i64(argv.get(1))?.unwrap_or(0);
+ let abortable = Abortable::default();
+
+ let signer = account
+ .pskb_from_send_generator(
+ outputs.into(),
+ priority_fee_sompi.into(),
+ None,
+ wallet_secret.clone(),
+ payment_secret.clone(),
+ &abortable,
+ )
+ .await?;
+
+ match signer.serialize() {
+ Ok(encoded) => tprintln!(ctx, "{encoded}"),
+ Err(e) => return Err(e.into()),
+ }
+ }
+ "unlock" => {
+ if argv.len() != 1 {
+ return self.display_help(ctx, argv).await;
+ }
+
+ // Get locked UTXO set.
+ let spend_utxos: Vec =
+ ctx.wallet().rpc_api().get_utxos_by_addresses(vec![script_p2sh.clone()]).await?;
+ let priority_fee_sompi = try_parse_optional_kaspa_as_sompi_i64(argv.first())?.unwrap_or(0) as u64;
+
+ if spend_utxos.is_empty() {
+ twarnln!(ctx, "No locked UTXO set found.");
+ return Ok(());
+ }
+
+ let references: Vec<(UtxoEntry, TransactionOutpoint)> =
+ spend_utxos.iter().map(|entry| (entry.utxo_entry.clone().into(), entry.outpoint.into())).collect();
+
+ let total_locked_sompi: u64 = spend_utxos.iter().map(|entry| entry.utxo_entry.amount).sum();
+
+ tprintln!(
+ ctx,
+ "{} locked UTXO{} found with total amount of {} KAS",
+ spend_utxos.len(),
+ if spend_utxos.len() == 1 { "" } else { "s" },
+ sompi_to_kaspa(total_locked_sompi)
+ );
+
+ // Sweep UTXO set.
+ match unlock_utxos_as_pskb(references, &receive_address, script_sig, priority_fee_sompi as u64) {
+ Ok(pskb) => {
+ let pskb_hex = pskb.serialize()?;
+ tprintln!(ctx, "{pskb_hex}");
+ }
+ Err(e) => tprintln!(ctx, "Error generating unlock PSKB: {}", e.to_string()),
+ }
+ }
+ "sign" => {
+ let pskb = Self::parse_input_pskb(argv.first().unwrap().as_str())?;
+
+ // Sign PSKB using the account's receiver address.
+ match account.pskb_sign(&pskb, wallet_secret.clone(), payment_secret.clone(), Some(&receive_address)).await {
+ Ok(signed_pskb) => {
+ let pskb_pack = String::try_from(signed_pskb)?;
+ tprintln!(ctx, "{pskb_pack}");
+ }
+ Err(e) => terrorln!(ctx, "{}", e.to_string()),
+ }
+ }
+ "address" => {
+ tprintln!(ctx, "\r\nP2SH address: {}", script_p2sh);
+ }
+ v => {
+ terrorln!(ctx, "unknown command: '{v}'\r\n");
+ return self.display_help(ctx, argv).await;
+ }
+ }
+ }
+ "sign" => {
+ if argv.len() != 1 {
+ return self.display_help(ctx, argv).await;
+ }
+ let (wallet_secret, payment_secret) = ctx.ask_wallet_secret(None).await?;
+ let pskb = Self::parse_input_pskb(argv.first().unwrap().as_str())?;
+ let account = ctx.wallet().account()?;
+ match account.pskb_sign(&pskb, wallet_secret.clone(), payment_secret.clone(), None).await {
+ Ok(signed_pskb) => {
+ let pskb_pack = String::try_from(signed_pskb)?;
+ tprintln!(ctx, "{pskb_pack}");
+ }
+ Err(e) => terrorln!(ctx, "{}", e.to_string()),
+ }
+ }
+ "send" => {
+ if argv.len() != 1 {
+ return self.display_help(ctx, argv).await;
+ }
+ let pskb = Self::parse_input_pskb(argv.first().unwrap().as_str())?;
+ let account = ctx.wallet().account()?;
+ match account.pskb_broadcast(&pskb).await {
+ Ok(sent) => tprintln!(ctx, "Sent transactions {:?}", sent),
+ Err(e) => terrorln!(ctx, "Send error {:?}", e),
+ }
+ }
+ "debug" => {
+ if argv.len() != 1 {
+ return self.display_help(ctx, argv).await;
+ }
+ let pskb = Self::parse_input_pskb(argv.first().unwrap().as_str())?;
+ tprintln!(ctx, "{:?}", pskb);
+ }
+ "parse" => {
+ if argv.len() != 1 {
+ return self.display_help(ctx, argv).await;
+ }
+ let pskb = Self::parse_input_pskb(argv.first().unwrap().as_str())?;
+ tprintln!(ctx, "{}", pskb.display_format(ctx.wallet().network_id()?, sompi_to_kaspa_string_with_suffix));
+
+ for (pskt_index, bundle_inner) in pskb.0.iter().enumerate() {
+ tprintln!(ctx, "PSKT #{:03} finalized check:", pskt_index + 1);
+ let pskt: PSKT = PSKT::::from(bundle_inner.to_owned());
+
+ let finalizer = pskt.finalizer();
+
+ if let Ok(pskt_finalizer) = finalize_pskt_one_or_more_sig_and_redeem_script(finalizer) {
+ // Verify if extraction is possible.
+ match pskt_finalizer.extractor() {
+ Ok(ex) => match ex.extract_tx() {
+ Ok(_) => tprintln!(
+ ctx,
+ " Transaction extracted successfully: PSKT is finalized with a valid script signature."
+ ),
+ Err(e) => terrorln!(ctx, " PSKT transaction extraction error: {}", e.to_string()),
+ },
+ Err(_) => twarnln!(ctx, " PSKT not finalized"),
+ }
+ } else {
+ twarnln!(ctx, " PSKT not signed");
+ }
+ }
+ }
+ v => {
+ tprintln!(ctx, "unknown command: '{v}'\r\n");
+ return self.display_help(ctx, argv).await;
+ }
+ }
+ Ok(())
+ }
+
+ fn parse_input_pskb(input: &str) -> Result {
+ match Bundle::try_from(input) {
+ Ok(bundle) => Ok(bundle),
+ Err(e) => Err(Error::custom(format!("Error while parsing input PSKB {}", e))),
+ }
+ }
+
+ async fn display_help(self: Arc, ctx: Arc, _argv: Vec) -> Result<()> {
+ ctx.term().help(
+ &[
+ ("pskb create ", "Create a PSKB from single send transaction"),
+ ("pskb sign ", "Sign given PSKB"),
+ ("pskb send ", "Broadcast bundled transactions"),
+ ("pskb debug ", "Print PSKB debug view"),
+ ("pskb parse ", "Print PSKB formatted view"),
+ ("pskb script lock [priority fee]", "Generate a PSKB with one send transaction to given P2SH payload. Optional public key placeholder in payload: {{pubkey}}"),
+ ("pskb script unlock ", "Generate a PSKB to unlock UTXOS one by one from given P2SH payload. Fee amount will be applied to every spent UTXO, meaning every transaction. Optional public key placeholder in payload: {{pubkey}}"),
+ ("pskb script sign ", "Sign all PSKB's P2SH locked inputs"),
+ ("pskb script sign ", "Sign all PSKB's P2SH locked inputs"),
+ ("pskb script address ", "Prints P2SH address"),
+ ],
+ None,
+ )?;
+
+ Ok(())
+ }
+}
diff --git a/cli/src/modules/reload.rs b/cli/src/modules/reload.rs
index bc1eb717e..b4c1ed7a5 100644
--- a/cli/src/modules/reload.rs
+++ b/cli/src/modules/reload.rs
@@ -10,8 +10,12 @@ impl Reload {
// workflow_dom::utils::window().location().reload().ok();
let ctx = ctx.clone().downcast_arc::()?;
+
+ let guard = ctx.wallet().guard();
+ let guard = guard.lock().await;
+
tprintln!(ctx, "{}", style("reloading wallet ...").magenta());
- ctx.wallet().reload(true).await?;
+ ctx.wallet().reload(true, &guard).await?;
Ok(())
}
diff --git a/cli/src/modules/rpc.rs b/cli/src/modules/rpc.rs
index c84915480..f32523c4a 100644
--- a/cli/src/modules/rpc.rs
+++ b/cli/src/modules/rpc.rs
@@ -1,6 +1,6 @@
use crate::imports::*;
use convert_case::{Case, Casing};
-use kaspa_rpc_core::{api::ops::RpcApiOps, *};
+use kaspa_rpc_core::api::ops::RpcApiOps;
#[derive(Default, Handler)]
#[help("Execute RPC commands against the connected Kaspa node")]
@@ -38,19 +38,27 @@ impl Rpc {
tprintln!(ctx, "ok");
}
RpcApiOps::GetMetrics => {
- let result = rpc.get_metrics(true, true, true, true).await?;
+ let result = rpc.get_metrics(true, true, true, true, true, true).await?;
+ self.println(&ctx, result);
+ }
+ RpcApiOps::GetSystemInfo => {
+ let result = rpc.get_system_info().await?;
+ self.println(&ctx, result);
+ }
+ RpcApiOps::GetConnections => {
+ let result = rpc.get_connections(true).await?;
self.println(&ctx, result);
}
RpcApiOps::GetServerInfo => {
- let result = rpc.get_server_info_call(GetServerInfoRequest {}).await?;
+ let result = rpc.get_server_info_call(None, GetServerInfoRequest {}).await?;
self.println(&ctx, result);
}
RpcApiOps::GetSyncStatus => {
- let result = rpc.get_sync_status_call(GetSyncStatusRequest {}).await?;
+ let result = rpc.get_sync_status_call(None, GetSyncStatusRequest {}).await?;
self.println(&ctx, result);
}
RpcApiOps::GetCurrentNetwork => {
- let result = rpc.get_current_network_call(GetCurrentNetworkRequest {}).await?;
+ let result = rpc.get_current_network_call(None, GetCurrentNetworkRequest {}).await?;
self.println(&ctx, result);
}
// RpcApiOps::SubmitBlock => {
@@ -62,11 +70,11 @@ impl Rpc {
// self.println(&ctx, result);
// }
RpcApiOps::GetPeerAddresses => {
- let result = rpc.get_peer_addresses_call(GetPeerAddressesRequest {}).await?;
+ let result = rpc.get_peer_addresses_call(None, GetPeerAddressesRequest {}).await?;
self.println(&ctx, result);
}
RpcApiOps::GetSink => {
- let result = rpc.get_sink_call(GetSinkRequest {}).await?;
+ let result = rpc.get_sink_call(None, GetSinkRequest {}).await?;
self.println(&ctx, result);
}
// RpcApiOps::GetMempoolEntry => {
@@ -76,12 +84,15 @@ impl Rpc {
RpcApiOps::GetMempoolEntries => {
// TODO
let result = rpc
- .get_mempool_entries_call(GetMempoolEntriesRequest { include_orphan_pool: true, filter_transaction_pool: true })
+ .get_mempool_entries_call(
+ None,
+ GetMempoolEntriesRequest { include_orphan_pool: true, filter_transaction_pool: true },
+ )
.await?;
self.println(&ctx, result);
}
RpcApiOps::GetConnectedPeerInfo => {
- let result = rpc.get_connected_peer_info_call(GetConnectedPeerInfoRequest {}).await?;
+ let result = rpc.get_connected_peer_info_call(None, GetConnectedPeerInfoRequest {}).await?;
self.println(&ctx, result);
}
RpcApiOps::AddPeer => {
@@ -90,7 +101,7 @@ impl Rpc {
}
let peer_address = argv.remove(0).parse::()?;
let is_permanent = argv.remove(0).parse::().unwrap_or(false);
- let result = rpc.add_peer_call(AddPeerRequest { peer_address, is_permanent }).await?;
+ let result = rpc.add_peer_call(None, AddPeerRequest { peer_address, is_permanent }).await?;
self.println(&ctx, result);
}
// RpcApiOps::SubmitTransaction => {
@@ -103,7 +114,7 @@ impl Rpc {
}
let hash = argv.remove(0);
let hash = RpcHash::from_hex(hash.as_str())?;
- let result = rpc.get_block_call(GetBlockRequest { hash, include_transactions: true }).await?;
+ let result = rpc.get_block_call(None, GetBlockRequest { hash, include_transactions: true }).await?;
self.println(&ctx, result);
}
// RpcApiOps::GetSubnetwork => {
@@ -119,11 +130,11 @@ impl Rpc {
// self.println(&ctx, result);
// }
RpcApiOps::GetBlockCount => {
- let result = rpc.get_block_count_call(GetBlockCountRequest {}).await?;
+ let result = rpc.get_block_count_call(None, GetBlockCountRequest {}).await?;
self.println(&ctx, result);
}
RpcApiOps::GetBlockDagInfo => {
- let result = rpc.get_block_dag_info_call(GetBlockDagInfoRequest {}).await?;
+ let result = rpc.get_block_dag_info_call(None, GetBlockDagInfoRequest {}).await?;
self.println(&ctx, result);
}
// RpcApiOps::ResolveFinalityConflict => {
@@ -131,7 +142,7 @@ impl Rpc {
// self.println(&ctx, result);
// }
RpcApiOps::Shutdown => {
- let result = rpc.shutdown_call(ShutdownRequest {}).await?;
+ let result = rpc.shutdown_call(None, ShutdownRequest {}).await?;
self.println(&ctx, result);
}
// RpcApiOps::GetHeaders => {
@@ -143,7 +154,7 @@ impl Rpc {
return Err(Error::custom("Please specify at least one address"));
}
let addresses = argv.iter().map(|s| Address::try_from(s.as_str())).collect::, _>>()?;
- let result = rpc.get_utxos_by_addresses_call(GetUtxosByAddressesRequest { addresses }).await?;
+ let result = rpc.get_utxos_by_addresses_call(None, GetUtxosByAddressesRequest { addresses }).await?;
self.println(&ctx, result);
}
RpcApiOps::GetBalanceByAddress => {
@@ -152,7 +163,7 @@ impl Rpc {
}
let addresses = argv.iter().map(|s| Address::try_from(s.as_str())).collect::, _>>()?;
for address in addresses {
- let result = rpc.get_balance_by_address_call(GetBalanceByAddressRequest { address }).await?;
+ let result = rpc.get_balance_by_address_call(None, GetBalanceByAddressRequest { address }).await?;
self.println(&ctx, sompi_to_kaspa(result.balance));
}
}
@@ -161,11 +172,11 @@ impl Rpc {
return Err(Error::custom("Please specify at least one address"));
}
let addresses = argv.iter().map(|s| Address::try_from(s.as_str())).collect::, _>>()?;
- let result = rpc.get_balances_by_addresses_call(GetBalancesByAddressesRequest { addresses }).await?;
+ let result = rpc.get_balances_by_addresses_call(None, GetBalancesByAddressesRequest { addresses }).await?;
self.println(&ctx, result);
}
RpcApiOps::GetSinkBlueScore => {
- let result = rpc.get_sink_blue_score_call(GetSinkBlueScoreRequest {}).await?;
+ let result = rpc.get_sink_blue_score_call(None, GetSinkBlueScoreRequest {}).await?;
self.println(&ctx, result);
}
RpcApiOps::Ban => {
@@ -173,7 +184,7 @@ impl Rpc {
return Err(Error::custom("Please specify peer IP address"));
}
let ip: RpcIpAddress = argv.remove(0).parse()?;
- let result = rpc.ban_call(BanRequest { ip }).await?;
+ let result = rpc.ban_call(None, BanRequest { ip }).await?;
self.println(&ctx, result);
}
RpcApiOps::Unban => {
@@ -181,11 +192,11 @@ impl Rpc {
return Err(Error::custom("Please specify peer IP address"));
}
let ip: RpcIpAddress = argv.remove(0).parse()?;
- let result = rpc.unban_call(UnbanRequest { ip }).await?;
+ let result = rpc.unban_call(None, UnbanRequest { ip }).await?;
self.println(&ctx, result);
}
RpcApiOps::GetInfo => {
- let result = rpc.get_info_call(GetInfoRequest {}).await?;
+ let result = rpc.get_info_call(None, GetInfoRequest {}).await?;
self.println(&ctx, result);
}
// RpcApiOps::EstimateNetworkHashesPerSecond => {
@@ -200,16 +211,15 @@ impl Rpc {
let include_orphan_pool = true;
let filter_transaction_pool = true;
let result = rpc
- .get_mempool_entries_by_addresses_call(GetMempoolEntriesByAddressesRequest {
- addresses,
- include_orphan_pool,
- filter_transaction_pool,
- })
+ .get_mempool_entries_by_addresses_call(
+ None,
+ GetMempoolEntriesByAddressesRequest { addresses, include_orphan_pool, filter_transaction_pool },
+ )
.await?;
self.println(&ctx, result);
}
RpcApiOps::GetCoinSupply => {
- let result = rpc.get_coin_supply_call(GetCoinSupplyRequest {}).await?;
+ let result = rpc.get_coin_supply_call(None, GetCoinSupplyRequest {}).await?;
self.println(&ctx, result);
}
RpcApiOps::GetDaaScoreTimestampEstimate => {
@@ -220,8 +230,9 @@ impl Rpc {
match daa_score_result {
Ok(daa_scores) => {
- let result =
- rpc.get_daa_score_timestamp_estimate_call(GetDaaScoreTimestampEstimateRequest { daa_scores }).await?;
+ let result = rpc
+ .get_daa_score_timestamp_estimate_call(None, GetDaaScoreTimestampEstimateRequest { daa_scores })
+ .await?;
self.println(&ctx, result);
}
Err(_err) => {
@@ -229,6 +240,24 @@ impl Rpc {
}
}
}
+ RpcApiOps::GetFeeEstimate => {
+ let result = rpc.get_fee_estimate_call(None, GetFeeEstimateRequest {}).await?;
+ self.println(&ctx, result);
+ }
+ RpcApiOps::GetFeeEstimateExperimental => {
+ let verbose = if argv.is_empty() { false } else { argv.remove(0).parse().unwrap_or(false) };
+ let result = rpc.get_fee_estimate_experimental_call(None, GetFeeEstimateExperimentalRequest { verbose }).await?;
+ self.println(&ctx, result);
+ }
+ RpcApiOps::GetCurrentBlockColor => {
+ if argv.is_empty() {
+ return Err(Error::custom("Missing block hash argument"));
+ }
+ let hash = argv.remove(0);
+ let hash = RpcHash::from_hex(hash.as_str())?;
+ let result = rpc.get_current_block_color_call(None, GetCurrentBlockColorRequest { hash }).await?;
+ self.println(&ctx, result);
+ }
_ => {
tprintln!(ctx, "rpc method exists but is not supported by the cli: '{op_str}'\r\n");
return Ok(());
@@ -243,9 +272,8 @@ impl Rpc {
async fn display_help(self: Arc, ctx: Arc, _argv: Vec) -> Result<()> {
// RpcApiOps that do not contain docs are not displayed
- let help = RpcApiOps::list()
- .iter()
- .filter_map(|op| op.doc().is_not_empty().then_some((op.as_str().to_case(Case::Kebab).to_string(), op.doc())))
+ let help = RpcApiOps::into_iter()
+ .filter_map(|op| op.rustdoc().is_not_empty().then_some((op.as_str().to_case(Case::Kebab).to_string(), op.rustdoc())))
.collect::>();
ctx.term().help(&help, None)?;
diff --git a/cli/src/modules/send.rs b/cli/src/modules/send.rs
index d9f35d994..773861dd4 100644
--- a/cli/src/modules/send.rs
+++ b/cli/src/modules/send.rs
@@ -39,7 +39,7 @@ impl Send {
.await?;
tprintln!(ctx, "Send - {summary}");
- // tprintln!(ctx, "\nSending {} KAS to {address}, tx ids:", sompi_to_kaspa_string(amount_sompi));
+ tprintln!(ctx, "\nSending {} KAS to {address}, tx ids:", sompi_to_kaspa_string(amount_sompi));
// tprintln!(ctx, "{}\n", ids.into_iter().map(|a| a.to_string()).collect::>().join("\n"));
Ok(())
diff --git a/cli/src/modules/settings.rs b/cli/src/modules/settings.rs
index e7214418a..b144c4cc3 100644
--- a/cli/src/modules/settings.rs
+++ b/cli/src/modules/settings.rs
@@ -9,12 +9,11 @@ impl Settings {
let ctx = ctx.clone().downcast_arc::()?;
tprintln!(ctx, "\nSettings:\n");
- let list = WalletSettings::list();
- let list = list
- .iter()
+ // let list = WalletSettings::list();
+ let list = WalletSettings::into_iter()
.map(|setting| {
let value: String = ctx.wallet().settings().get(setting.clone()).unwrap_or_else(|| "-".to_string());
- let descr = setting.descr();
+ let descr = setting.describe();
(setting.as_str().to_lowercase(), value, descr)
})
.collect::>();
diff --git a/cli/src/modules/wallet.rs b/cli/src/modules/wallet.rs
index 6019b1908..70180e78d 100644
--- a/cli/src/modules/wallet.rs
+++ b/cli/src/modules/wallet.rs
@@ -9,6 +9,9 @@ impl Wallet {
async fn main(self: Arc, ctx: &Arc, mut argv: Vec, cmd: &str) -> Result<()> {
let ctx = ctx.clone().downcast_arc::()?;
+ let guard = ctx.wallet().guard();
+ let guard = guard.lock().await;
+
if argv.is_empty() {
return self.display_help(ctx, argv).await;
}
@@ -48,7 +51,7 @@ impl Wallet {
let wallet_name = wallet_name.as_deref();
let import_with_mnemonic = op.as_str() == "import";
- wizards::wallet::create(&ctx, wallet_name, import_with_mnemonic).await?;
+ wizards::wallet::create(&ctx, guard.into(), wallet_name, import_with_mnemonic).await?;
}
"open" => {
let name = if let Some(name) = argv.first().cloned() {
@@ -67,8 +70,8 @@ impl Wallet {
let (wallet_secret, _) = ctx.ask_wallet_secret(None).await?;
let _ = ctx.notifier().show(Notification::Processing).await;
let args = WalletOpenArgs::default_with_legacy_accounts();
- ctx.wallet().open(&wallet_secret, name, args).await?;
- ctx.wallet().activate_accounts(None).await?;
+ ctx.wallet().open(&wallet_secret, name, args, &guard).await?;
+ ctx.wallet().activate_accounts(None, &guard).await?;
}
"close" => {
ctx.wallet().close().await?;
diff --git a/cli/src/wizards/account.rs b/cli/src/wizards/account.rs
index 7a3afb73b..9d3d4d591 100644
--- a/cli/src/wizards/account.rs
+++ b/cli/src/wizards/account.rs
@@ -85,3 +85,62 @@ async fn create_multisig(ctx: &Arc, account_name: Option, mnem
wallet.select(Some(&account)).await?;
Ok(())
}
+
+pub(crate) async fn bip32_watch(ctx: &Arc, name: Option<&str>) -> Result<()> {
+ let term = ctx.term();
+ let wallet = ctx.wallet();
+
+ let name = if let Some(name) = name {
+ Some(name.to_string())
+ } else {
+ Some(term.ask(false, "Please enter account name (optional, press to skip): ").await?.trim().to_string())
+ };
+
+ let mut xpub_keys = Vec::with_capacity(1);
+ let xpub_key = term.ask(false, "Enter extended public key: ").await?;
+ xpub_keys.push(xpub_key.trim().to_owned());
+
+ let wallet_secret = Secret::new(term.ask(true, "Enter wallet password: ").await?.trim().as_bytes().to_vec());
+ if wallet_secret.as_ref().is_empty() {
+ return Err(Error::WalletSecretRequired);
+ }
+
+ let account_create_args_bip32_watch = AccountCreateArgsBip32Watch::new(name, xpub_keys);
+ let account = wallet.create_account_bip32_watch(&wallet_secret, account_create_args_bip32_watch).await?;
+
+ tprintln!(ctx, "\naccount created: {}\n", account.get_list_string()?);
+ wallet.select(Some(&account)).await?;
+ Ok(())
+}
+
+pub(crate) async fn multisig_watch(ctx: &Arc, name: Option<&str>) -> Result<()> {
+ let term = ctx.term();
+
+ let account_name = if let Some(name) = name {
+ Some(name.to_string())
+ } else {
+ Some(term.ask(false, "Please enter account name (optional, press to skip): ").await?.trim().to_string())
+ };
+
+ let term = ctx.term();
+ let wallet = ctx.wallet();
+ let (wallet_secret, _) = ctx.ask_wallet_secret(None).await?;
+ let minimum_signatures: u16 = term.ask(false, "Enter the minimum number of signatures required: ").await?.parse()?;
+
+ let prv_key_data_args = Vec::with_capacity(0);
+
+ let answer = term.ask(false, "Enter the number of extended public keys: ").await?.trim().to_string(); //.parse()?;
+ let xpub_keys_len: usize = if answer.is_empty() { 0 } else { answer.parse()? };
+
+ let mut xpub_keys = Vec::with_capacity(xpub_keys_len);
+ for i in 1..=xpub_keys_len {
+ let xpub_key = term.ask(false, &format!("Enter extended public {i} key: ")).await?;
+ xpub_keys.push(xpub_key.trim().to_owned());
+ }
+ let account =
+ wallet.create_account_multisig(&wallet_secret, prv_key_data_args, xpub_keys, account_name, minimum_signatures).await?;
+
+ tprintln!(ctx, "\naccount created: {}\n", account.get_list_string()?);
+ wallet.select(Some(&account)).await?;
+ Ok(())
+}
diff --git a/cli/src/wizards/wallet.rs b/cli/src/wizards/wallet.rs
index 8563a8619..0fae267a3 100644
--- a/cli/src/wizards/wallet.rs
+++ b/cli/src/wizards/wallet.rs
@@ -2,12 +2,25 @@ use crate::cli::KaspaCli;
use crate::imports::*;
use crate::result::Result;
use kaspa_bip32::{Language, Mnemonic, WordCount};
-use kaspa_wallet_core::storage::{make_filename, Hint};
-
-pub(crate) async fn create(ctx: &Arc, name: Option<&str>, import_with_mnemonic: bool) -> Result<()> {
+use kaspa_wallet_core::{
+ storage::{make_filename, Hint},
+ wallet::WalletGuard,
+};
+
+pub(crate) async fn create(
+ ctx: &Arc,
+ wallet_guard: Option>,
+ name: Option<&str>,
+ import_with_mnemonic: bool,
+) -> Result<()> {
let term = ctx.term();
let wallet = ctx.wallet();
+ let local_guard = ctx.wallet().guard();
+ let guard = match wallet_guard {
+ Some(locked_guard) => locked_guard,
+ None => local_guard.lock().await,
+ };
// TODO @aspect
let word_count = WordCount::Words12;
@@ -86,7 +99,7 @@ pub(crate) async fn create(ctx: &Arc, name: Option<&str>, import_with_
"\
PLEASE NOTE: The optional bip39 mnemonic passphrase, if provided, will be required to \
issue transactions. This passphrase will also be required when recovering your wallet \
- in addition to your private key or mnemonic. If you loose this passphrase, you will not \
+ in addition to your private key or mnemonic. If you lose this passphrase, you will not \
be able to use or recover your wallet! \
\
If you do not want to use bip39 recovery passphrase, press ENTER.\
@@ -173,8 +186,8 @@ pub(crate) async fn create(ctx: &Arc, name: Option<&str>, import_with_
term.writeln(style(receive_address).blue().to_string());
term.writeln("");
- wallet.open(&wallet_secret, name.map(String::from), WalletOpenArgs::default_with_legacy_accounts()).await?;
- wallet.activate_accounts(None).await?;
+ wallet.open(&wallet_secret, name.map(String::from), WalletOpenArgs::default_with_legacy_accounts(), &guard).await?;
+ wallet.activate_accounts(None, &guard).await?;
Ok(())
}
diff --git a/components/addressmanager/src/stores/address_store.rs b/components/addressmanager/src/stores/address_store.rs
index accfcfda4..fe4ddb244 100644
--- a/components/addressmanager/src/stores/address_store.rs
+++ b/components/addressmanager/src/stores/address_store.rs
@@ -21,6 +21,7 @@ pub struct Entry {
impl MemSizeEstimator for Entry {}
pub trait AddressesStoreReader {
+ #[allow(dead_code)]
fn get(&self, key: AddressKey) -> Result;
}
diff --git a/components/connectionmanager/src/lib.rs b/components/connectionmanager/src/lib.rs
index 1509df6bf..2146ec62d 100644
--- a/components/connectionmanager/src/lib.rs
+++ b/components/connectionmanager/src/lib.rs
@@ -7,7 +7,7 @@ use std::{
};
use duration_string::DurationString;
-use futures_util::future::join_all;
+use futures_util::future::{join_all, try_join_all};
use itertools::Itertools;
use kaspa_addressmanager::{AddressManager, NetAddress};
use kaspa_core::{debug, info, warn};
@@ -227,12 +227,14 @@ impl ConnectionManager {
}
if missing_connections > 0 && !self.dns_seeders.is_empty() {
- let cmgr = self.clone();
- // DNS lookup is a blocking i/o operation, so we spawn it as a blocking task
- let _ = tokio::task::spawn_blocking(move || {
- cmgr.dns_seed(missing_connections); //TODO: Consider putting a number higher than `missing_connections`.
- })
- .await;
+ if missing_connections > self.outbound_target / 2 {
+ // If we are missing more than half of our target, query all in parallel.
+ // This will always be the case on new node start-up and is the most resilient strategy in such a case.
+ self.dns_seed_many(self.dns_seeders.len()).await;
+ } else {
+ // Try to obtain at least twice the number of missing connections
+ self.dns_seed_with_address_target(2 * missing_connections).await;
+ }
}
}
@@ -251,26 +253,17 @@ impl ConnectionManager {
join_all(futures).await;
}
- fn dns_seed(self: &Arc, mut min_addresses_to_fetch: usize) {
+ /// Queries DNS seeders in random order, one after the other, until obtaining `min_addresses_to_fetch` addresses
+ async fn dns_seed_with_address_target(self: &Arc, min_addresses_to_fetch: usize) {
+ let cmgr = self.clone();
+ tokio::task::spawn_blocking(move || cmgr.dns_seed_with_address_target_blocking(min_addresses_to_fetch)).await.unwrap();
+ }
+
+ fn dns_seed_with_address_target_blocking(self: &Arc, mut min_addresses_to_fetch: usize) {
let shuffled_dns_seeders = self.dns_seeders.choose_multiple(&mut thread_rng(), self.dns_seeders.len());
for &seeder in shuffled_dns_seeders {
- info!("Querying DNS seeder {}", seeder);
- // Since the DNS lookup protocol doesn't come with a port, we must assume that the default port is used.
- let addrs = match (seeder, self.default_port).to_socket_addrs() {
- Ok(addrs) => addrs,
- Err(e) => {
- warn!("Error connecting to DNS seeder {}: {}", seeder, e);
- continue;
- }
- };
-
- let addrs_len = addrs.len();
- info!("Retrieved {} addresses from DNS seeder {}", addrs_len, seeder);
- let mut amgr_lock = self.address_manager.lock();
- for addr in addrs {
- amgr_lock.add_address(NetAddress::new(addr.ip().into(), addr.port()));
- }
-
+ // Query seeders sequentially until reaching the desired number of addresses
+ let addrs_len = self.dns_seed_single(seeder);
if addrs_len >= min_addresses_to_fetch {
break;
} else {
@@ -279,6 +272,42 @@ impl ConnectionManager {
}
}
+ /// Queries `num_seeders_to_query` random DNS seeders in parallel
+ async fn dns_seed_many(self: &Arc, num_seeders_to_query: usize) -> usize {
+ info!("Querying {} DNS seeders", num_seeders_to_query);
+ let shuffled_dns_seeders = self.dns_seeders.choose_multiple(&mut thread_rng(), num_seeders_to_query);
+ let jobs = shuffled_dns_seeders.map(|seeder| {
+ let cmgr = self.clone();
+ tokio::task::spawn_blocking(move || cmgr.dns_seed_single(seeder))
+ });
+ try_join_all(jobs).await.unwrap().into_iter().sum()
+ }
+
+ /// Query a single DNS seeder and add the obtained addresses to the address manager.
+ ///
+ /// DNS lookup is a blocking i/o operation so this function is assumed to be called
+ /// from a blocking execution context.
+ fn dns_seed_single(self: &Arc, seeder: &str) -> usize {
+ info!("Querying DNS seeder {}", seeder);
+ // Since the DNS lookup protocol doesn't come with a port, we must assume that the default port is used.
+ let addrs = match (seeder, self.default_port).to_socket_addrs() {
+ Ok(addrs) => addrs,
+ Err(e) => {
+ warn!("Error connecting to DNS seeder {}: {}", seeder, e);
+ return 0;
+ }
+ };
+
+ let addrs_len = addrs.len();
+ info!("Retrieved {} addresses from DNS seeder {}", addrs_len, seeder);
+ let mut amgr_lock = self.address_manager.lock();
+ for addr in addrs {
+ amgr_lock.add_address(NetAddress::new(addr.ip().into(), addr.port()));
+ }
+
+ addrs_len
+ }
+
/// Bans the given IP and disconnects from all the peers with that IP.
///
/// _GO-KASPAD: BanByIP_
diff --git a/components/consensusmanager/src/session.rs b/components/consensusmanager/src/session.rs
index 3e30783e6..81d589148 100644
--- a/components/consensusmanager/src/session.rs
+++ b/components/consensusmanager/src/session.rs
@@ -247,6 +247,10 @@ impl ConsensusSessionOwned {
self.clone().spawn_blocking(|c| c.get_sink_timestamp()).await
}
+ pub async fn async_get_current_block_color(&self, hash: Hash) -> Option {
+ self.clone().spawn_blocking(move |c| c.get_current_block_color(hash)).await
+ }
+
/// source refers to the earliest block from which the current node has full header & block data
pub async fn async_get_source(&self) -> Hash {
self.clone().spawn_blocking(|c| c.get_source()).await
diff --git a/consensus/Cargo.toml b/consensus/Cargo.toml
index f151e404b..3f4a1b456 100644
--- a/consensus/Cargo.toml
+++ b/consensus/Cargo.toml
@@ -30,6 +30,7 @@ kaspa-muhash.workspace = true
kaspa-notify.workspace = true
kaspa-pow.workspace = true
kaspa-txscript.workspace = true
+kaspa-txscript-errors.workspace = true
kaspa-utils.workspace = true
log.workspace = true
once_cell.workspace = true
diff --git a/consensus/client/Cargo.toml b/consensus/client/Cargo.toml
index 38cbed9a3..698348508 100644
--- a/consensus/client/Cargo.toml
+++ b/consensus/client/Cargo.toml
@@ -38,5 +38,5 @@ itertools.workspace = true
workflow-wasm.workspace = true
workflow-log.workspace = true
-[lints.clippy]
-empty_docs = "allow"
+[lints]
+workspace = true
diff --git a/consensus/client/src/header.rs b/consensus/client/src/header.rs
index 6294d2132..56fd92845 100644
--- a/consensus/client/src/header.rs
+++ b/consensus/client/src/header.rs
@@ -32,12 +32,35 @@ export interface IHeader {
blueScore: bigint;
pruningPoint: HexString;
}
+
+/**
+ * Interface defining the structure of a raw block header.
+ *
+ * This interface is explicitly used by GetBlockTemplate and SubmitBlock RPCs
+ * and unlike `IHeader`, does not include a hash.
+ *
+ * @category Consensus
+ */
+export interface IRawHeader {
+ version: number;
+ parentsByLevel: Array>;
+ hashMerkleRoot: HexString;
+ acceptedIdMerkleRoot: HexString;
+ utxoCommitment: HexString;
+ timestamp: bigint;
+ bits: number;
+ nonce: bigint;
+ daaScore: bigint;
+ blueWork: bigint | HexString;
+ blueScore: bigint;
+ pruningPoint: HexString;
+}
"#;
#[wasm_bindgen]
extern "C" {
- #[wasm_bindgen(typescript_type = "IHeader | Header")]
- pub type IHeader;
+ #[wasm_bindgen(typescript_type = "Header | IHeader | IRawHeader")]
+ pub type HeaderT;
}
/// @category Consensus
@@ -64,7 +87,7 @@ impl Header {
#[wasm_bindgen]
impl Header {
#[wasm_bindgen(constructor)]
- pub fn constructor(js_value: IHeader) -> std::result::Result {
+ pub fn constructor(js_value: HeaderT) -> std::result::Result {
Ok(js_value.try_into_owned()?)
}
@@ -232,8 +255,11 @@ impl Header {
impl TryCastFromJs for Header {
type Error = Error;
- fn try_cast_from(value: impl AsRef) -> Result, Self::Error> {
- Self::resolve(&value, || {
+ fn try_cast_from<'a, R>(value: &'a R) -> Result, Self::Error>
+ where
+ R: AsRef + 'a,
+ {
+ Self::resolve(value, || {
if let Some(object) = Object::try_from(value.as_ref()) {
let parents_by_level = object
.get_vec("parentsByLevel")?
diff --git a/consensus/client/src/input.rs b/consensus/client/src/input.rs
index 8b48c2d94..736696bfa 100644
--- a/consensus/client/src/input.rs
+++ b/consensus/client/src/input.rs
@@ -13,7 +13,7 @@ const TS_TRANSACTION: &'static str = r#"
*/
export interface ITransactionInput {
previousOutpoint: ITransactionOutpoint;
- signatureScript: HexString;
+ signatureScript?: HexString;
sequence: bigint;
sigOpCount: number;
utxo?: UtxoEntryReference;
@@ -33,15 +33,19 @@ export interface ITransactionInputVerboseData { }
#[wasm_bindgen]
extern "C" {
- #[wasm_bindgen(typescript_type = "ITransactionInput")]
- pub type ITransactionInput;
+ #[wasm_bindgen(typescript_type = "ITransactionInput | TransactionInput")]
+ pub type TransactionInputT;
+ #[wasm_bindgen(typescript_type = "(ITransactionInput | TransactionInput)[]")]
+ pub type TransactionInputArrayAsArgT;
+ #[wasm_bindgen(typescript_type = "TransactionInput[]")]
+ pub type TransactionInputArrayAsResultT;
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct TransactionInputInner {
pub previous_outpoint: TransactionOutpoint,
- pub signature_script: Vec,
+ pub signature_script: Option>,
pub sequence: u64,
pub sig_op_count: u8,
pub utxo: Option,
@@ -50,7 +54,7 @@ pub struct TransactionInputInner {
impl TransactionInputInner {
pub fn new(
previous_outpoint: TransactionOutpoint,
- signature_script: Vec,
+ signature_script: Option>,
sequence: u64,
sig_op_count: u8,
utxo: Option,
@@ -70,7 +74,7 @@ pub struct TransactionInput {
impl TransactionInput {
pub fn new(
previous_outpoint: TransactionOutpoint,
- signature_script: Vec,
+ signature_script: Option>,
sequence: u64,
sig_op_count: u8,
utxo: Option,
@@ -91,6 +95,10 @@ impl TransactionInput {
self.inner().sig_op_count
}
+ pub fn signature_script_length(&self) -> usize {
+ self.inner().signature_script.as_ref().map(|signature_script| signature_script.len()).unwrap_or_default()
+ }
+
pub fn utxo(&self) -> Option {
self.inner().utxo.clone()
}
@@ -99,7 +107,7 @@ impl TransactionInput {
#[wasm_bindgen]
impl TransactionInput {
#[wasm_bindgen(constructor)]
- pub fn constructor(value: &ITransactionInput) -> Result {
+ pub fn constructor(value: &TransactionInputT) -> Result {
Self::try_owned_from(value)
}
@@ -120,8 +128,8 @@ impl TransactionInput {
}
#[wasm_bindgen(getter = signatureScript)]
- pub fn get_signature_script_as_hex(&self) -> String {
- self.inner().signature_script.to_hex()
+ pub fn get_signature_script_as_hex(&self) -> Option {
+ self.inner().signature_script.as_ref().map(|script| script.to_hex())
}
#[wasm_bindgen(setter = signatureScript)]
@@ -163,7 +171,7 @@ impl TransactionInput {
impl TransactionInput {
pub fn set_signature_script(&self, signature_script: Vec) {
- self.inner().signature_script = signature_script;
+ self.inner().signature_script.replace(signature_script);
}
pub fn script_public_key(&self) -> Option {
@@ -179,14 +187,17 @@ impl AsRef for TransactionInput {
impl TryCastFromJs for TransactionInput {
type Error = Error;
- fn try_cast_from(value: impl AsRef) -> std::result::Result, Self::Error> {
- Self::resolve_cast(&value, || {
+ fn try_cast_from<'a, R>(value: &'a R) -> std::result::Result, Self::Error>
+ where
+ R: AsRef + 'a,
+ {
+ Self::resolve_cast(value, || {
if let Some(object) = Object::try_from(value.as_ref()) {
let previous_outpoint: TransactionOutpoint = object.get_value("previousOutpoint")?.as_ref().try_into()?;
- let signature_script = object.get_vec_u8("signatureScript")?;
+ let signature_script = object.get_vec_u8("signatureScript").ok();
let sequence = object.get_u64("sequence")?;
let sig_op_count = object.get_u8("sigOpCount")?;
- let utxo = object.try_get_cast::("utxo")?.map(Cast::into_owned);
+ let utxo = object.try_cast_into::("utxo")?;
Ok(TransactionInput::new(previous_outpoint, signature_script, sequence, sig_op_count, utxo).into())
} else {
Err("TransactionInput must be an object".into())
@@ -199,7 +210,7 @@ impl From for TransactionInput {
fn from(tx_input: cctx::TransactionInput) -> Self {
TransactionInput::new(
tx_input.previous_outpoint.into(),
- tx_input.signature_script,
+ Some(tx_input.signature_script),
tx_input.sequence,
tx_input.sig_op_count,
None,
@@ -212,7 +223,8 @@ impl From<&TransactionInput> for cctx::TransactionInput {
let inner = tx_input.inner();
cctx::TransactionInput::new(
inner.previous_outpoint.clone().into(),
- inner.signature_script.clone(),
+ // TODO - discuss: should this unwrap_or_default or return an error?
+ inner.signature_script.clone().unwrap_or_default(),
inner.sequence,
inner.sig_op_count,
)
diff --git a/consensus/client/src/lib.rs b/consensus/client/src/lib.rs
index 4935b16f7..eb482eab1 100644
--- a/consensus/client/src/lib.rs
+++ b/consensus/client/src/lib.rs
@@ -1,33 +1,29 @@
pub mod error;
mod imports;
+mod input;
mod outpoint;
mod output;
pub mod result;
+mod serializable;
+mod transaction;
mod utxo;
+pub use input::*;
pub use outpoint::*;
pub use output::*;
+pub use serializable::*;
+pub use transaction::*;
pub use utxo::*;
cfg_if::cfg_if! {
if #[cfg(feature = "wasm32-sdk")] {
mod header;
- mod input;
- mod transaction;
- mod vtx;
+ mod utils;
mod hash;
mod sign;
- mod script;
- mod serializable;
-
pub use header::*;
- pub use input::*;
- pub use transaction::*;
- pub use serializable::*;
- pub use vtx::*;
+ pub use utils::*;
pub use hash::*;
- // pub use signing::*;
- pub use script::*;
pub use sign::sign_with_multiple_v3;
}
}
diff --git a/consensus/client/src/outpoint.rs b/consensus/client/src/outpoint.rs
index 77e17d542..06be53f6a 100644
--- a/consensus/client/src/outpoint.rs
+++ b/consensus/client/src/outpoint.rs
@@ -165,6 +165,15 @@ impl From for cctx::TransactionOutpoint {
}
}
+impl From<&TransactionOutpoint> for cctx::TransactionOutpoint {
+ fn from(outpoint: &TransactionOutpoint) -> Self {
+ let inner = outpoint.inner();
+ let transaction_id = inner.transaction_id;
+ let index = inner.index;
+ cctx::TransactionOutpoint::new(transaction_id, index)
+ }
+}
+
impl TransactionOutpoint {
pub fn simulated() -> Self {
Self::new(TransactionId::from_slice(&rand::random::<[u8; kaspa_hashes::HASH_SIZE]>()), 0)
diff --git a/consensus/client/src/output.rs b/consensus/client/src/output.rs
index 99fe38ec3..8f335c47d 100644
--- a/consensus/client/src/output.rs
+++ b/consensus/client/src/output.rs
@@ -9,7 +9,7 @@ const TS_TRANSACTION_OUTPUT: &'static str = r#"
*/
export interface ITransactionOutput {
value: bigint;
- scriptPublicKey: IScriptPublicKey;
+ scriptPublicKey: IScriptPublicKey | HexString;
/** Optional verbose data provided by RPC */
verboseData?: ITransactionOutputVerboseData;
@@ -26,6 +26,16 @@ export interface ITransactionOutputVerboseData {
}
"#;
+#[wasm_bindgen]
+extern "C" {
+ #[wasm_bindgen(typescript_type = "ITransactionOutput | TransactionOutput")]
+ pub type TransactionOutputT;
+ #[wasm_bindgen(typescript_type = "(ITransactionOutput | TransactionOutput)[]")]
+ pub type TransactionOutputArrayAsArgT;
+ #[wasm_bindgen(typescript_type = "TransactionOutput[]")]
+ pub type TransactionOutputArrayAsResultT;
+}
+
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct TransactionOutputInner {
@@ -55,7 +65,7 @@ impl TransactionOutput {
self.inner.lock().unwrap()
}
- pub fn script_length(&self) -> usize {
+ pub fn script_public_key_length(&self) -> usize {
self.inner().script_public_key.script().len()
}
}
@@ -69,7 +79,7 @@ impl TransactionOutput {
}
#[wasm_bindgen(getter, js_name = value)]
- pub fn get_value(&self) -> u64 {
+ pub fn value(&self) -> u64 {
self.inner().value
}
@@ -114,25 +124,20 @@ impl From<&TransactionOutput> for cctx::TransactionOutput {
}
}
-impl TryFrom<&JsValue> for TransactionOutput {
- type Error = Error;
- fn try_from(js_value: &JsValue) -> Result {
- // workflow_log::log_trace!("js_value->TransactionOutput: {js_value:?}");
- if let Some(object) = Object::try_from(js_value) {
- let has_address = Object::has_own(object, &JsValue::from("address"));
- workflow_log::log_trace!("js_value->TransactionOutput: has_address:{has_address:?}");
- let value = object.get_u64("value")?;
- let script_public_key = ScriptPublicKey::try_cast_from(object.get_value("scriptPublicKey")?)?;
- Ok(TransactionOutput::new(value, script_public_key.into_owned()))
- } else {
- Err("TransactionInput must be an object".into())
- }
- }
-}
-
-impl TryFrom for TransactionOutput {
+impl TryCastFromJs for TransactionOutput {
type Error = Error;
- fn try_from(js_value: JsValue) -> Result {
- Self::try_from(&js_value)
+ fn try_cast_from<'a, R>(value: &'a R) -> std::result::Result, Self::Error>
+ where
+ R: AsRef + 'a,
+ {
+ Self::resolve_cast(value, || {
+ if let Some(object) = Object::try_from(value.as_ref()) {
+ let value = object.get_u64("value")?;
+ let script_public_key = ScriptPublicKey::try_owned_from(object.get_value("scriptPublicKey")?)?;
+ Ok(TransactionOutput::new(value, script_public_key).into())
+ } else {
+ Err("TransactionInput must be an object".into())
+ }
+ })
}
}
diff --git a/consensus/client/src/serializable/mod.rs b/consensus/client/src/serializable/mod.rs
index 5855e26df..a590ab286 100644
--- a/consensus/client/src/serializable/mod.rs
+++ b/consensus/client/src/serializable/mod.rs
@@ -30,7 +30,7 @@ export interface ISerializableTransactionInput {
index: number;
sequence: bigint;
sigOpCount: number;
- signatureScript: HexString;
+ signatureScript?: HexString;
utxo: ISerializableUtxoEntry;
}
@@ -77,3 +77,9 @@ export interface ISerializableTransaction {
}
"#;
+
+#[wasm_bindgen]
+extern "C" {
+ #[wasm_bindgen(extends = js_sys::Array, typescript_type = "ISerializableTransaction")]
+ pub type SerializableTransactionT;
+}
diff --git a/consensus/client/src/serializable/numeric.rs b/consensus/client/src/serializable/numeric.rs
index 0c413fdcf..733afd54e 100644
--- a/consensus/client/src/serializable/numeric.rs
+++ b/consensus/client/src/serializable/numeric.rs
@@ -80,6 +80,7 @@ pub struct SerializableTransactionInput {
pub sequence: u64,
pub sig_op_count: u8,
#[serde(with = "hex::serde")]
+ // TODO - convert to Option> and use hex serialization over Option
pub signature_script: Vec,
pub utxo: SerializableUtxoEntry,
}
@@ -91,6 +92,8 @@ impl SerializableTransactionInput {
Self {
transaction_id: input.previous_outpoint.transaction_id,
index: input.previous_outpoint.index,
+ // TODO - convert signature_script to Option>
+ // signature_script: (!input.signature_script.is_empty()).then_some(input.signature_script.clone()),
signature_script: input.signature_script.clone(),
sequence: input.sequence,
sig_op_count: input.sig_op_count,
@@ -134,15 +137,16 @@ impl TryFrom for cctx::TransactionInput {
impl TryFrom<&SerializableTransactionInput> for TransactionInput {
type Error = Error;
- fn try_from(signable_input: &SerializableTransactionInput) -> Result {
- let utxo = UtxoEntryReference::try_from(signable_input)?;
+ fn try_from(serializable_input: &SerializableTransactionInput) -> Result {
+ let utxo = UtxoEntryReference::try_from(serializable_input)?;
- let previous_outpoint = TransactionOutpoint::new(signable_input.transaction_id, signable_input.index);
+ let previous_outpoint = TransactionOutpoint::new(serializable_input.transaction_id, serializable_input.index);
let inner = TransactionInputInner {
previous_outpoint,
- signature_script: signable_input.signature_script.clone(),
- sequence: signable_input.sequence,
- sig_op_count: signable_input.sig_op_count,
+ // TODO - convert to Option> and use hex serialization over Option
+ signature_script: (!serializable_input.signature_script.is_empty()).then_some(serializable_input.signature_script.clone()),
+ sequence: serializable_input.sequence,
+ sig_op_count: serializable_input.sig_op_count,
utxo: Some(utxo),
};
@@ -159,7 +163,8 @@ impl TryFrom<&TransactionInput> for SerializableTransactionInput {
Ok(Self {
transaction_id: inner.previous_outpoint.transaction_id(),
index: inner.previous_outpoint.index(),
- signature_script: inner.signature_script.clone(),
+ // TODO - convert to Option> and use hex serialization over Option
+ signature_script: inner.signature_script.clone().unwrap_or_default(),
sequence: inner.sequence,
sig_op_count: inner.sig_op_count,
utxo,
@@ -218,6 +223,8 @@ pub struct SerializableTransaction {
pub outputs: Vec,
pub lock_time: u64,
pub gas: u64,
+ #[serde(default)]
+ pub mass: u64,
pub subnetwork_id: SubnetworkId,
#[serde(with = "hex::serde")]
pub payload: Vec,
@@ -260,6 +267,7 @@ impl SerializableTransaction {
lock_time: transaction.lock_time,
subnetwork_id: transaction.subnetwork_id.clone(),
gas: transaction.gas,
+ mass: transaction.mass(),
payload: transaction.payload.clone(),
id: transaction.id(),
})
@@ -279,6 +287,7 @@ impl SerializableTransaction {
subnetwork_id: inner.subnetwork_id.clone(),
gas: inner.gas,
payload: inner.payload.clone(),
+ mass: inner.mass,
id: inner.id,
})
}
@@ -306,6 +315,7 @@ impl SerializableTransaction {
lock_time: transaction.lock_time,
subnetwork_id: transaction.subnetwork_id.clone(),
gas: transaction.gas,
+ mass: transaction.mass(),
payload: transaction.payload.clone(),
})
}
@@ -331,7 +341,8 @@ impl TryFrom for cctx::SignableTransaction {
serializable.subnetwork_id,
serializable.gas,
serializable.payload,
- );
+ )
+ .with_mass(serializable.mass);
Ok(Self::with_entries(tx, entries))
}
@@ -344,6 +355,6 @@ impl TryFrom for Transaction {
let inputs: Vec = tx.inputs.iter().map(TryInto::try_into).collect::>>()?;
let outputs: Vec = tx.outputs.iter().map(TryInto::try_into).collect::>>()?;
- Transaction::new(Some(id), tx.version, inputs, outputs, tx.lock_time, tx.subnetwork_id, tx.gas, tx.payload)
+ Transaction::new(Some(id), tx.version, inputs, outputs, tx.lock_time, tx.subnetwork_id, tx.gas, tx.payload, tx.mass)
}
}
diff --git a/consensus/client/src/serializable/string.rs b/consensus/client/src/serializable/string.rs
index be3981b0e..e35cdb028 100644
--- a/consensus/client/src/serializable/string.rs
+++ b/consensus/client/src/serializable/string.rs
@@ -139,7 +139,8 @@ impl TryFrom<&SerializableTransactionInput> for TransactionInput {
let previous_outpoint = TransactionOutpoint::new(serializable_input.transaction_id, serializable_input.index);
let inner = TransactionInputInner {
previous_outpoint,
- signature_script: serializable_input.signature_script.clone(),
+ // TODO - convert to Option> and use hex serialization over Option
+ signature_script: (!serializable_input.signature_script.is_empty()).then_some(serializable_input.signature_script.clone()),
sequence: serializable_input.sequence.parse()?,
sig_op_count: serializable_input.sig_op_count,
utxo: Some(utxo),
@@ -158,7 +159,8 @@ impl TryFrom<&TransactionInput> for SerializableTransactionInput {
Ok(Self {
transaction_id: inner.previous_outpoint.transaction_id(),
index: inner.previous_outpoint.index(),
- signature_script: inner.signature_script.clone(),
+ // TODO - convert to Option> and use hex serialization over Option
+ signature_script: inner.signature_script.clone().unwrap_or_default(),
sequence: inner.sequence.to_string(),
sig_op_count: inner.sig_op_count,
utxo,
@@ -217,6 +219,8 @@ pub struct SerializableTransaction {
pub subnetwork_id: SubnetworkId,
pub lock_time: String,
pub gas: String,
+ #[serde(default)]
+ pub mass: String,
#[serde(with = "hex::serde")]
pub payload: Vec,
}
@@ -258,6 +262,7 @@ impl SerializableTransaction {
lock_time: transaction.lock_time.to_string(),
subnetwork_id: transaction.subnetwork_id.clone(),
gas: transaction.gas.to_string(),
+ mass: transaction.mass().to_string(),
payload: transaction.payload.clone(),
})
}
@@ -275,6 +280,7 @@ impl SerializableTransaction {
lock_time: inner.lock_time.to_string(),
subnetwork_id: inner.subnetwork_id.clone(),
gas: inner.gas.to_string(),
+ mass: inner.mass.to_string(),
payload: inner.payload.clone(),
id: inner.id,
})
@@ -303,6 +309,7 @@ impl SerializableTransaction {
lock_time: transaction.lock_time.to_string(),
subnetwork_id: transaction.subnetwork_id.clone(),
gas: transaction.gas.to_string(),
+ mass: transaction.mass().to_string(),
payload: transaction.payload.clone(),
})
}
@@ -328,7 +335,8 @@ impl TryFrom for cctx::SignableTransaction {
signable.subnetwork_id,
signable.gas.parse()?,
signable.payload,
- );
+ )
+ .with_mass(signable.mass.parse().unwrap_or_default());
Ok(Self::with_entries(tx, entries))
}
@@ -341,6 +349,16 @@ impl TryFrom for crate::Transaction {
let inputs: Vec = tx.inputs.iter().map(TryInto::try_into).collect::>>()?;
let outputs: Vec = tx.outputs.iter().map(TryInto::try_into).collect::>>()?;
- Transaction::new(Some(id), tx.version, inputs, outputs, tx.lock_time.parse()?, tx.subnetwork_id, tx.gas.parse()?, tx.payload)
+ Transaction::new(
+ Some(id),
+ tx.version,
+ inputs,
+ outputs,
+ tx.lock_time.parse()?,
+ tx.subnetwork_id,
+ tx.gas.parse()?,
+ tx.payload,
+ tx.mass.parse().unwrap_or_default(),
+ )
}
}
diff --git a/consensus/client/src/sign.rs b/consensus/client/src/sign.rs
index fdab66a60..c254aee07 100644
--- a/consensus/client/src/sign.rs
+++ b/consensus/client/src/sign.rs
@@ -13,14 +13,14 @@ use std::collections::BTreeMap;
/// A wrapper enum that represents the transaction signed state. A transaction
/// contained by this enum can be either fully signed or partially signed.
-pub enum Signed {
- Fully(Transaction),
- Partially(Transaction),
+pub enum Signed<'a> {
+ Fully(&'a Transaction),
+ Partially(&'a Transaction),
}
-impl Signed {
+impl<'a> Signed<'a> {
/// Returns the transaction regardless of whether it is fully or partially signed
- pub fn unwrap(self) -> Transaction {
+ pub fn unwrap(self) -> &'a Transaction {
match self {
Signed::Fully(tx) => tx,
Signed::Partially(tx) => tx,
@@ -31,7 +31,7 @@ impl Signed {
/// TODO (aspect) - merge this with `v1` fn above or refactor wallet core to use the script engine.
/// Sign a transaction using schnorr
#[allow(clippy::result_large_err)]
-pub fn sign_with_multiple_v3(tx: Transaction, privkeys: &[[u8; 32]]) -> crate::result::Result {
+pub fn sign_with_multiple_v3<'a>(tx: &'a Transaction, privkeys: &[[u8; 32]]) -> crate::result::Result> {
let mut map = BTreeMap::new();
for privkey in privkeys {
let schnorr_key = secp256k1::Keypair::from_seckey_slice(secp256k1::SECP256K1, privkey).unwrap();
@@ -44,7 +44,7 @@ pub fn sign_with_multiple_v3(tx: Transaction, privkeys: &[[u8; 32]]) -> crate::r
let mut additional_signatures_required = false;
{
let input_len = tx.inner().inputs.len();
- let (cctx, utxos) = tx.tx_and_utxos();
+ let (cctx, utxos) = tx.tx_and_utxos()?;
let populated_transaction = PopulatedTransaction::new(&cctx, utxos);
for i in 0..input_len {
let script_pub_key = match tx.inner().inputs[i].script_public_key() {
diff --git a/consensus/client/src/transaction.rs b/consensus/client/src/transaction.rs
index 329349714..fb6d185f0 100644
--- a/consensus/client/src/transaction.rs
+++ b/consensus/client/src/transaction.rs
@@ -1,11 +1,11 @@
#![allow(non_snake_case)]
use crate::imports::*;
-use crate::input::TransactionInput;
+use crate::input::{TransactionInput, TransactionInputArrayAsArgT, TransactionInputArrayAsResultT};
use crate::outpoint::TransactionOutpoint;
-use crate::output::TransactionOutput;
+use crate::output::{TransactionOutput, TransactionOutputArrayAsArgT, TransactionOutputArrayAsResultT};
use crate::result::Result;
-use crate::serializable::{numeric, string};
+use crate::serializable::{numeric, string, SerializableTransactionT};
use crate::utxo::{UtxoEntryId, UtxoEntryReference};
use ahash::AHashMap;
use kaspa_consensus_core::network::NetworkType;
@@ -30,6 +30,8 @@ export interface ITransaction {
subnetworkId: HexString;
gas: bigint;
payload: HexString;
+ /** The mass of the transaction (the mass is undefined or zero unless explicitly set or obtained from the node) */
+ mass?: bigint;
/** Optional verbose data provided by RPC */
verboseData?: ITransactionVerboseData;
@@ -43,7 +45,7 @@ export interface ITransaction {
export interface ITransactionVerboseData {
transactionId : HexString;
hash : HexString;
- mass : bigint;
+ computeMass : bigint;
blockHash : HexString;
blockTime : bigint;
}
@@ -51,8 +53,8 @@ export interface ITransactionVerboseData {
#[wasm_bindgen]
extern "C" {
- #[wasm_bindgen(typescript_type = "ITransaction")]
- pub type ITransaction;
+ #[wasm_bindgen(typescript_type = "ITransaction | Transaction")]
+ pub type TransactionT;
}
#[derive(Debug, Clone, Serialize, Deserialize)]
@@ -65,6 +67,7 @@ pub struct TransactionInner {
pub subnetwork_id: SubnetworkId,
pub gas: u64,
pub payload: Vec,
+ pub mass: u64,
// A field that is used to cache the transaction ID.
// Always use the corresponding self.id() instead of accessing this field directly
@@ -92,6 +95,7 @@ impl Transaction {
subnetwork_id: SubnetworkId,
gas: u64,
payload: Vec,
+ mass: u64,
) -> Result {
let finalize = id.is_none();
let tx = Self {
@@ -104,6 +108,7 @@ impl Transaction {
subnetwork_id,
gas,
payload,
+ mass,
})),
};
if finalize {
@@ -149,14 +154,14 @@ impl Transaction {
}
#[wasm_bindgen(constructor)]
- pub fn constructor(js_value: &ITransaction) -> std::result::Result {
+ pub fn constructor(js_value: &TransactionT) -> std::result::Result {
Ok(js_value.try_into_owned()?)
}
#[wasm_bindgen(getter = inputs)]
- pub fn get_inputs_as_js_array(&self) -> Array {
+ pub fn get_inputs_as_js_array(&self) -> TransactionInputArrayAsResultT {
let inputs = self.inner.lock().unwrap().inputs.clone().into_iter().map(JsValue::from);
- Array::from_iter(inputs)
+ Array::from_iter(inputs).unchecked_into()
}
/// Returns a list of unique addresses used by transaction inputs.
@@ -179,7 +184,7 @@ impl Transaction {
}
#[wasm_bindgen(setter = inputs)]
- pub fn set_inputs_from_js_array(&mut self, js_value: &JsValue) {
+ pub fn set_inputs_from_js_array(&mut self, js_value: &TransactionInputArrayAsArgT) {
let inputs = Array::from(js_value)
.iter()
.map(|js_value| {
@@ -190,16 +195,16 @@ impl Transaction {
}
#[wasm_bindgen(getter = outputs)]
- pub fn get_outputs_as_js_array(&self) -> Array {
+ pub fn get_outputs_as_js_array(&self) -> TransactionOutputArrayAsResultT {
let outputs = self.inner.lock().unwrap().outputs.clone().into_iter().map(JsValue::from);
- Array::from_iter(outputs)
+ Array::from_iter(outputs).unchecked_into()
}
#[wasm_bindgen(setter = outputs)]
- pub fn set_outputs_from_js_array(&mut self, js_value: &JsValue) {
+ pub fn set_outputs_from_js_array(&mut self, js_value: &TransactionOutputArrayAsArgT) {
let outputs = Array::from(js_value)
.iter()
- .map(|js_value| TransactionOutput::try_from(&js_value).unwrap_or_else(|err| panic!("invalid transaction output: {err}")))
+ .map(|js_value| TryCastFromJs::try_owned_from(&js_value).unwrap_or_else(|err| panic!("invalid transaction output: {err}")))
.collect::>();
self.inner().outputs = outputs;
}
@@ -214,12 +219,12 @@ impl Transaction {
self.inner().version = v;
}
- #[wasm_bindgen(getter, js_name = lock_time)]
+ #[wasm_bindgen(getter, js_name = lockTime)]
pub fn get_lock_time(&self) -> u64 {
self.inner().lock_time
}
- #[wasm_bindgen(setter, js_name = lock_time)]
+ #[wasm_bindgen(setter, js_name = lockTime)]
pub fn set_lock_time(&self, v: u64) {
self.inner().lock_time = v;
}
@@ -254,21 +259,36 @@ impl Transaction {
pub fn set_payload_from_js_value(&mut self, js_value: JsValue) {
self.inner.lock().unwrap().payload = js_value.try_as_vec_u8().unwrap_or_else(|err| panic!("payload value error: {err}"));
}
+
+ #[wasm_bindgen(getter = mass)]
+ pub fn get_mass(&self) -> u64 {
+ self.inner().mass
+ }
+
+ #[wasm_bindgen(setter = mass)]
+ pub fn set_mass(&self, v: u64) {
+ self.inner().mass = v;
+ }
}
impl TryCastFromJs for Transaction {
type Error = Error;
- fn try_cast_from(value: impl AsRef) -> std::result::Result, Self::Error> {
- Self::resolve_cast(&value, || {
+ fn try_cast_from<'a, R>(value: &'a R) -> std::result::Result, Self::Error>
+ where
+ R: AsRef + 'a,
+ {
+ Self::resolve_cast(value, || {
if let Some(object) = Object::try_from(value.as_ref()) {
if let Some(tx) = object.try_get_value("tx")? {
- Transaction::try_cast_from(&tx)
+ Transaction::try_captured_cast_from(tx)
} else {
- let id = object.try_get_cast::("id")?.map(|id| id.into_owned());
+ let id = object.try_cast_into::("id")?;
let version = object.get_u16("version")?;
let lock_time = object.get_u64("lockTime")?;
let gas = object.get_u64("gas")?;
let payload = object.get_vec_u8("payload")?;
+ // mass field is optional
+ let mass = object.get_u64("mass").unwrap_or_default();
let subnetwork_id = object.get_vec_u8("subnetworkId")?;
if subnetwork_id.len() != subnets::SUBNETWORK_ID_SIZE {
return Err(Error::Custom("subnetworkId must be 20 bytes long".into()));
@@ -285,9 +305,9 @@ impl TryCastFromJs for Transaction {
let outputs: Vec = object
.get_vec("outputs")?
.iter()
- .map(|jsv| jsv.try_into())
+ .map(TryCastFromJs::try_owned_from)
.collect::, Error>>()?;
- Transaction::new(id, version, inputs, outputs, lock_time, subnetwork_id, gas, payload).map(Into::into)
+ Transaction::new(id, version, inputs, outputs, lock_time, subnetwork_id, gas, payload, mass).map(Into::into)
}
} else {
Err("Transaction must be an object".into())
@@ -300,6 +320,7 @@ impl TryCastFromJs for Transaction {
impl From for Transaction {
fn from(tx: cctx::Transaction) -> Self {
let id = tx.id();
+ let mass = tx.mass();
let inputs: Vec = tx.inputs.into_iter().map(|input| input.into()).collect::>();
let outputs: Vec = tx.outputs.into_iter().map(|output| output.into()).collect::>();
Self::new_with_inner(TransactionInner {
@@ -309,6 +330,7 @@ impl From for Transaction {
lock_time: tx.lock_time,
gas: tx.gas,
payload: tx.payload,
+ mass,
subnetwork_id: tx.subnetwork_id,
id,
})
@@ -331,6 +353,7 @@ impl From<&Transaction> for cctx::Transaction {
inner.gas,
inner.payload.clone(),
)
+ .with_mass(inner.mass)
}
}
@@ -342,7 +365,13 @@ impl Transaction {
.map(|input| {
let previous_outpoint: TransactionOutpoint = input.previous_outpoint.into();
let utxo = utxos.get(previous_outpoint.id()).cloned();
- TransactionInput::new(previous_outpoint, input.signature_script.clone(), input.sequence, input.sig_op_count, utxo)
+ TransactionInput::new(
+ previous_outpoint,
+ Some(input.signature_script.clone()),
+ input.sequence,
+ input.sig_op_count,
+ utxo,
+ )
})
.collect::>();
let outputs: Vec = tx.outputs.iter().map(|output| output.into()).collect::>();
@@ -355,22 +384,23 @@ impl Transaction {
lock_time: tx.lock_time,
gas: tx.gas,
payload: tx.payload.clone(),
+ mass: tx.mass(),
subnetwork_id: tx.subnetwork_id.clone(),
})
}
- pub fn tx_and_utxos(&self) -> (cctx::Transaction, Vec) {
- let mut utxos = vec![];
+ pub fn tx_and_utxos(&self) -> Result<(cctx::Transaction, Vec)> {
+ let mut inputs = vec![];
let inner = self.inner();
- let inputs: Vec = inner
+ let utxos: Vec = inner
.inputs
.clone()
.into_iter()
.map(|input| {
- utxos.push((&input.get_utxo().unwrap().entry()).into());
- input.as_ref().into()
+ inputs.push(input.as_ref().into());
+ Ok(input.get_utxo().ok_or(Error::MissingUtxoEntry)?.entry().as_ref().into())
})
- .collect::>();
+ .collect::>>()?;
let outputs: Vec =
inner.outputs.clone().into_iter().map(|output| output.as_ref().into()).collect::>();
let tx = cctx::Transaction::new(
@@ -381,9 +411,40 @@ impl Transaction {
inner.subnetwork_id.clone(),
inner.gas,
inner.payload.clone(),
- );
+ )
+ .with_mass(inner.mass);
- (tx, utxos)
+ Ok((tx, utxos))
+ }
+
+ pub fn utxo_entry_references(&self) -> Result> {
+ let inner = self.inner();
+ let utxo_entry_references = inner
+ .inputs
+ .clone()
+ .into_iter()
+ .map(|input| input.get_utxo().ok_or(Error::MissingUtxoEntry))
+ .collect::>>()?;
+ Ok(utxo_entry_references)
+ }
+
+ pub fn outputs(&self) -> Vec {
+ let inner = self.inner();
+ let outputs = inner.outputs.iter().map(|output| output.into()).collect::>();
+ outputs
+ }
+
+ pub fn inputs(&self) -> Vec {
+ let inner = self.inner();
+ let inputs = inner.inputs.iter().map(Into::into).collect::>();
+ inputs
+ }
+
+ pub fn inputs_outputs(&self) -> (Vec, Vec) {
+ let inner = self.inner();
+ let inputs = inner.inputs.iter().map(Into::into).collect::>();
+ let outputs = inner.outputs.iter().map(Into::into).collect::>();
+ (inputs, outputs)
}
pub fn set_signature_script(&self, input_index: usize, signature_script: Vec) -> Result<()> {
@@ -393,6 +454,14 @@ impl Transaction {
self.inner().inputs[input_index].set_signature_script(signature_script);
Ok(())
}
+
+ pub fn payload(&self) -> Vec {
+ self.inner().payload.clone()
+ }
+
+ pub fn payload_len(&self) -> usize {
+ self.inner().payload.len()
+ }
}
#[wasm_bindgen]
@@ -401,7 +470,7 @@ impl Transaction {
/// The schema of the JavaScript object is defined by {@link ISerializableTransaction}.
/// @see {@link ISerializableTransaction}
#[wasm_bindgen(js_name = "serializeToObject")]
- pub fn serialize_to_object(&self) -> Result {
+ pub fn serialize_to_object(&self) -> Result {
Ok(numeric::SerializableTransaction::from_client_transaction(self)?.serialize_to_object()?.into())
}
diff --git a/consensus/client/src/utils.rs b/consensus/client/src/utils.rs
new file mode 100644
index 000000000..4f543d45b
--- /dev/null
+++ b/consensus/client/src/utils.rs
@@ -0,0 +1,81 @@
+use crate::imports::*;
+use crate::result::Result;
+use kaspa_addresses::*;
+use kaspa_consensus_core::{
+ network::{NetworkType, NetworkTypeT},
+ tx::ScriptPublicKeyT,
+};
+use kaspa_txscript::{script_class::ScriptClass, standard};
+use kaspa_utils::hex::ToHex;
+use kaspa_wasm_core::types::{BinaryT, HexString};
+
+/// Creates a new script to pay a transaction output to the specified address.
+/// @category Wallet SDK
+#[wasm_bindgen(js_name = payToAddressScript)]
+pub fn pay_to_address_script(address: &AddressT) -> Result {
+ let address = Address::try_cast_from(address)?;
+ Ok(standard::pay_to_address_script(address.as_ref()))
+}
+
+/// Takes a script and returns an equivalent pay-to-script-hash script.
+/// @param redeem_script - The redeem script ({@link HexString} or Uint8Array).
+/// @category Wallet SDK
+#[wasm_bindgen(js_name = payToScriptHashScript)]
+pub fn pay_to_script_hash_script(redeem_script: BinaryT) -> Result {
+ let redeem_script = redeem_script.try_as_vec_u8()?;
+ Ok(standard::pay_to_script_hash_script(redeem_script.as_slice()))
+}
+
+/// Generates a signature script that fits a pay-to-script-hash script.
+/// @param redeem_script - The redeem script ({@link HexString} or Uint8Array).
+/// @param signature - The signature ({@link HexString} or Uint8Array).
+/// @category Wallet SDK
+#[wasm_bindgen(js_name = payToScriptHashSignatureScript)]
+pub fn pay_to_script_hash_signature_script(redeem_script: BinaryT, signature: BinaryT) -> Result {
+ let redeem_script = redeem_script.try_as_vec_u8()?;
+ let signature = signature.try_as_vec_u8()?;
+ let script = standard::pay_to_script_hash_signature_script(redeem_script, signature)?;
+ Ok(script.to_hex().into())
+}
+
+/// Returns the address encoded in a script public key.
+/// @param script_public_key - The script public key ({@link ScriptPublicKey}).
+/// @param network - The network type.
+/// @category Wallet SDK
+#[wasm_bindgen(js_name = addressFromScriptPublicKey)]
+pub fn address_from_script_public_key(script_public_key: &ScriptPublicKeyT, network: &NetworkTypeT) -> Result {
+ let script_public_key = ScriptPublicKey::try_cast_from(script_public_key)?;
+ let network_type = NetworkType::try_from(network)?;
+
+ match standard::extract_script_pub_key_address(script_public_key.as_ref(), network_type.into()) {
+ Ok(address) => Ok(AddressOrUndefinedT::from(JsValue::from(address))),
+ Err(_) => Ok(AddressOrUndefinedT::from(JsValue::UNDEFINED)),
+ }
+}
+
+/// Returns true if the script passed is a pay-to-pubkey.
+/// @param script - The script ({@link HexString} or Uint8Array).
+/// @category Wallet SDK
+#[wasm_bindgen(js_name = isScriptPayToPubkey)]
+pub fn is_script_pay_to_pubkey(script: BinaryT) -> Result {
+ let script = script.try_as_vec_u8()?;
+ Ok(ScriptClass::is_pay_to_pubkey(script.as_slice()))
+}
+
+/// Returns returns true if the script passed is an ECDSA pay-to-pubkey.
+/// @param script - The script ({@link HexString} or Uint8Array).
+/// @category Wallet SDK
+#[wasm_bindgen(js_name = isScriptPayToPubkeyECDSA)]
+pub fn is_script_pay_to_pubkey_ecdsa(script: BinaryT) -> Result {
+ let script = script.try_as_vec_u8()?;
+ Ok(ScriptClass::is_pay_to_pubkey_ecdsa(script.as_slice()))
+}
+
+/// Returns true if the script passed is a pay-to-script-hash (P2SH) format, false otherwise.
+/// @param script - The script ({@link HexString} or Uint8Array).
+/// @category Wallet SDK
+#[wasm_bindgen(js_name = isScriptPayToScriptHash)]
+pub fn is_script_pay_to_script_hash(script: BinaryT) -> Result {
+ let script = script.try_as_vec_u8()?;
+ Ok(ScriptClass::is_pay_to_script_hash(script.as_slice()))
+}
diff --git a/consensus/client/src/utxo.rs b/consensus/client/src/utxo.rs
index ffa7f7a49..0a8b3fdb9 100644
--- a/consensus/client/src/utxo.rs
+++ b/consensus/client/src/utxo.rs
@@ -101,6 +101,12 @@ impl UtxoEntry {
}
}
+impl AsRef for UtxoEntry {
+ fn as_ref(&self) -> &UtxoEntry {
+ self
+ }
+}
+
impl From<&UtxoEntry> for cctx::UtxoEntry {
fn from(utxo: &UtxoEntry) -> Self {
cctx::UtxoEntry {
@@ -136,14 +142,14 @@ impl UtxoEntryReference {
self.as_ref().clone()
}
- #[wasm_bindgen(js_name = "getTransactionId")]
- pub fn transaction_id_as_string(&self) -> String {
- self.utxo.outpoint.get_transaction_id_as_string()
+ #[wasm_bindgen(getter)]
+ pub fn outpoint(&self) -> TransactionOutpoint {
+ self.utxo.outpoint.clone()
}
- #[wasm_bindgen(js_name = "getId")]
- pub fn id_string(&self) -> String {
- self.utxo.outpoint.id_string()
+ #[wasm_bindgen(getter)]
+ pub fn address(&self) -> Option {
+ self.utxo.address.clone()
}
#[wasm_bindgen(getter)]
@@ -160,6 +166,11 @@ impl UtxoEntryReference {
pub fn block_daa_score(&self) -> u64 {
self.utxo.block_daa_score
}
+
+ #[wasm_bindgen(getter, js_name = "scriptPublicKey")]
+ pub fn script_public_key(&self) -> ScriptPublicKey {
+ self.utxo.script_public_key.clone()
+ }
}
impl UtxoEntryReference {
@@ -252,7 +263,10 @@ impl TryIntoUtxoEntryReferences for JsValue {
impl TryCastFromJs for UtxoEntry {
type Error = Error;
- fn try_cast_from(value: impl AsRef) -> Result, Self::Error> {
+ fn try_cast_from<'a, R>(value: &'a R) -> Result, Self::Error>
+ where
+ R: AsRef + 'a,
+ {
Ok(Self::try_ref_from_js_value_as_cast(value)?)
}
}
@@ -372,21 +386,45 @@ impl TryFrom for UtxoEntries {
impl TryCastFromJs for UtxoEntryReference {
type Error = Error;
- fn try_cast_from(value: impl AsRef) -> Result, Self::Error> {
- Self::resolve(&value, || {
+ fn try_cast_from<'a, R>(value: &'a R) -> Result, Self::Error>
+ where
+ R: AsRef + 'a,
+ {
+ Self::resolve(value, || {
if let Ok(utxo_entry) = UtxoEntry::try_ref_from_js_value(&value) {
Ok(Self::from(utxo_entry.clone()))
} else if let Some(object) = Object::try_from(value.as_ref()) {
- let address = object.get_cast::("address")?.into_owned();
+ let address = object.try_cast_into::("address")?;
let outpoint = TransactionOutpoint::try_from(object.get_value("outpoint")?.as_ref())?;
let utxo_entry = Object::from(object.get_value("utxoEntry")?);
- let amount = utxo_entry.get_u64("amount")?;
- let script_public_key = ScriptPublicKey::try_owned_from(utxo_entry.get_value("scriptPublicKey")?)?;
- let block_daa_score = utxo_entry.get_u64("blockDaaScore")?;
- let is_coinbase = utxo_entry.get_bool("isCoinbase")?;
- let utxo_entry =
- UtxoEntry { address: Some(address), outpoint, amount, script_public_key, block_daa_score, is_coinbase };
+ let utxo_entry = if !utxo_entry.is_undefined() {
+ let amount = utxo_entry.get_u64("amount").map_err(|_| {
+ Error::custom("Supplied object does not contain `utxoEntry.amount` property (or it is not a numerical value)")
+ })?;
+ let script_public_key = ScriptPublicKey::try_owned_from(utxo_entry.get_value("scriptPublicKey")?)
+ .map_err(|_|Error::custom("Supplied object does not contain `utxoEntry.scriptPublicKey` property (or it is not a hex string or a ScriptPublicKey class)"))?;
+ let block_daa_score = utxo_entry.get_u64("blockDaaScore").map_err(|_| {
+ Error::custom(
+ "Supplied object does not contain `utxoEntry.blockDaaScore` property (or it is not a numerical value)",
+ )
+ })?;
+ let is_coinbase = utxo_entry.get_bool("isCoinbase")?;
+
+ UtxoEntry { address, outpoint, amount, script_public_key, block_daa_score, is_coinbase }
+ } else {
+ let amount = object.get_u64("amount").map_err(|_| {
+ Error::custom("Supplied object does not contain `amount` property (or it is not a numerical value)")
+ })?;
+ let script_public_key = ScriptPublicKey::try_owned_from(object.get_value("scriptPublicKey")?)
+ .map_err(|_|Error::custom("Supplied object does not contain `scriptPublicKey` property (or it is not a hex string or a ScriptPublicKey class)"))?;
+ let block_daa_score = object.get_u64("blockDaaScore").map_err(|_| {
+ Error::custom("Supplied object does not contain `blockDaaScore` property (or it is not a numerical value)")
+ })?;
+ let is_coinbase = object.try_get_bool("isCoinbase")?.unwrap_or(false);
+
+ UtxoEntry { address, outpoint, amount, script_public_key, block_daa_score, is_coinbase }
+ };
Ok(UtxoEntryReference::from(utxo_entry))
} else {
@@ -407,7 +445,7 @@ impl UtxoEntryReference {
let outpoint = TransactionOutpoint::simulated();
let script_public_key = kaspa_txscript::pay_to_address_script(address);
let block_daa_score = 0;
- let is_coinbase = true;
+ let is_coinbase = false;
let utxo_entry =
UtxoEntry { address: Some(address.clone()), outpoint, amount, script_public_key, block_daa_score, is_coinbase };
diff --git a/consensus/client/src/vtx.rs b/consensus/client/src/vtx.rs
deleted file mode 100644
index e5fdd9236..000000000
--- a/consensus/client/src/vtx.rs
+++ /dev/null
@@ -1,35 +0,0 @@
-use crate::imports::*;
-// use crate::serializable::{numeric,string};
-use crate::result::Result;
-use kaspa_addresses::Address;
-use serde::de::DeserializeOwned;
-// use serde::de::DeserializeOwned;
-
-#[derive(Debug, Serialize, Deserialize, Clone)]
-#[serde(rename_all = "camelCase")]
-pub struct VirtualTransactionT
-where
- T: Clone + serde::Serialize,
-{
- //} + Deserialize {
- pub version: u32,
- pub generator: Option,
- pub transactions: Vec,
- pub addresses: Option>,
-}
-
-impl VirtualTransactionT
-where
- T: Clone + Serialize,
-{
- pub fn deserialize(json: &str) -> Result
- where
- T: DeserializeOwned,
- {
- Ok(serde_json::from_str(json)?)
- }
-
- pub fn serialize(&self) -> String {
- serde_json::to_string(self).unwrap()
- }
-}
diff --git a/consensus/core/Cargo.toml b/consensus/core/Cargo.toml
index 4e4bd9ea0..fc43a459a 100644
--- a/consensus/core/Cargo.toml
+++ b/consensus/core/Cargo.toml
@@ -13,6 +13,7 @@ repository.workspace = true
devnet-prealloc = []
wasm32-sdk = []
default = []
+py-sdk = ["pyo3"]
[dependencies]
async-trait.workspace = true
@@ -31,6 +32,7 @@ kaspa-merkle.workspace = true
kaspa-muhash.workspace = true
kaspa-txscript-errors.workspace = true
kaspa-utils.workspace = true
+pyo3 = { workspace = true, optional = true }
rand.workspace = true
secp256k1.workspace = true
serde_json.workspace = true
@@ -41,6 +43,7 @@ thiserror.workspace = true
wasm-bindgen.workspace = true
workflow-core.workspace = true
workflow-log.workspace = true
+workflow-serializer.workspace = true
workflow-wasm.workspace = true
[dev-dependencies]
@@ -53,5 +56,5 @@ web-sys.workspace = true
name = "serde_benchmark"
harness = false
-[lints.clippy]
-empty_docs = "allow"
+[lints]
+workspace = true
diff --git a/consensus/core/src/api/args.rs b/consensus/core/src/api/args.rs
new file mode 100644
index 000000000..ebc76d97d
--- /dev/null
+++ b/consensus/core/src/api/args.rs
@@ -0,0 +1,47 @@
+use std::collections::HashMap;
+
+use crate::tx::TransactionId;
+
+/// A struct provided to consensus for transaction validation processing calls
+#[derive(Clone, Debug, Default)]
+pub struct TransactionValidationArgs {
+ /// Optional fee/mass threshold above which a bound transaction in not rejected
+ pub feerate_threshold: Option,
+}
+
+impl TransactionValidationArgs {
+ pub fn new(feerate_threshold: Option) -> Self {
+ Self { feerate_threshold }
+ }
+}
+
+/// A struct provided to consensus for transactions validation batch processing calls
+pub struct TransactionValidationBatchArgs {
+ tx_args: HashMap,
+}
+
+impl TransactionValidationBatchArgs {
+ const DEFAULT_ARGS: TransactionValidationArgs = TransactionValidationArgs { feerate_threshold: None };
+
+ pub fn new() -> Self {
+ Self { tx_args: HashMap::new() }
+ }
+
+ /// Set some fee/mass threshold for transaction `transaction_id`.
+ pub fn set_feerate_threshold(&mut self, transaction_id: TransactionId, feerate_threshold: f64) {
+ self.tx_args
+ .entry(transaction_id)
+ .and_modify(|x| x.feerate_threshold = Some(feerate_threshold))
+ .or_insert(TransactionValidationArgs::new(Some(feerate_threshold)));
+ }
+
+ pub fn get(&self, transaction_id: &TransactionId) -> &TransactionValidationArgs {
+ self.tx_args.get(transaction_id).unwrap_or(&Self::DEFAULT_ARGS)
+ }
+}
+
+impl Default for TransactionValidationBatchArgs {
+ fn default() -> Self {
+ Self::new()
+ }
+}
diff --git a/consensus/core/src/api/counters.rs b/consensus/core/src/api/counters.rs
index 5faee5bc3..0297dab26 100644
--- a/consensus/core/src/api/counters.rs
+++ b/consensus/core/src/api/counters.rs
@@ -9,6 +9,7 @@ pub struct ProcessingCounters {
pub body_counts: AtomicU64,
pub txs_counts: AtomicU64,
pub chain_block_counts: AtomicU64,
+ pub chain_disqualified_counts: AtomicU64,
pub mass_counts: AtomicU64,
}
@@ -22,6 +23,7 @@ impl ProcessingCounters {
body_counts: self.body_counts.load(Ordering::Relaxed),
txs_counts: self.txs_counts.load(Ordering::Relaxed),
chain_block_counts: self.chain_block_counts.load(Ordering::Relaxed),
+ chain_disqualified_counts: self.chain_disqualified_counts.load(Ordering::Relaxed),
mass_counts: self.mass_counts.load(Ordering::Relaxed),
}
}
@@ -36,6 +38,7 @@ pub struct ProcessingCountersSnapshot {
pub body_counts: u64,
pub txs_counts: u64,
pub chain_block_counts: u64,
+ pub chain_disqualified_counts: u64,
pub mass_counts: u64,
}
@@ -51,6 +54,7 @@ impl core::ops::Sub for &ProcessingCountersSnapshot {
body_counts: self.body_counts.saturating_sub(rhs.body_counts),
txs_counts: self.txs_counts.saturating_sub(rhs.txs_counts),
chain_block_counts: self.chain_block_counts.saturating_sub(rhs.chain_block_counts),
+ chain_disqualified_counts: self.chain_disqualified_counts.saturating_sub(rhs.chain_disqualified_counts),
mass_counts: self.mass_counts.saturating_sub(rhs.mass_counts),
}
}
diff --git a/consensus/core/src/api/mod.rs b/consensus/core/src/api/mod.rs
index 23e7abb53..4833c7659 100644
--- a/consensus/core/src/api/mod.rs
+++ b/consensus/core/src/api/mod.rs
@@ -4,6 +4,7 @@ use std::sync::Arc;
use crate::{
acceptance_data::AcceptanceData,
+ api::args::{TransactionValidationArgs, TransactionValidationBatchArgs},
block::{Block, BlockTemplate, TemplateBuildMode, TemplateTransactionSelector, VirtualStateApproxId},
blockstatus::BlockStatus,
coinbase::MinerData,
@@ -25,6 +26,7 @@ use kaspa_hashes::Hash;
pub use self::stats::{BlockCount, ConsensusStats};
+pub mod args;
pub mod counters;
pub mod stats;
@@ -62,14 +64,18 @@ pub trait ConsensusApi: Send + Sync {
}
/// Populates the mempool transaction with maximally found UTXO entry data and proceeds to full transaction
- /// validation if all are found. If validation is successful, also [`transaction.calculated_fee`] is expected to be populated.
- fn validate_mempool_transaction(&self, transaction: &mut MutableTransaction) -> TxResult<()> {
+ /// validation if all are found. If validation is successful, also `transaction.calculated_fee` is expected to be populated.
+ fn validate_mempool_transaction(&self, transaction: &mut MutableTransaction, args: &TransactionValidationArgs) -> TxResult<()> {
unimplemented!()
}
/// Populates the mempool transactions with maximally found UTXO entry data and proceeds to full transactions
- /// validation if all are found. If validation is successful, also [`transaction.calculated_fee`] is expected to be populated.
- fn validate_mempool_transactions_in_parallel(&self, transactions: &mut [MutableTransaction]) -> Vec> {
+ /// validation if all are found. If validation is successful, also `transaction.calculated_fee` is expected to be populated.
+ fn validate_mempool_transactions_in_parallel(
+ &self,
+ transactions: &mut [MutableTransaction],
+ args: &TransactionValidationBatchArgs,
+ ) -> Vec> {
unimplemented!()
}
@@ -127,6 +133,10 @@ pub trait ConsensusApi: Send + Sync {
unimplemented!()
}
+ fn get_current_block_color(&self, hash: Hash) -> Option {
+ unimplemented!()
+ }
+
fn get_virtual_state_approx_id(&self) -> VirtualStateApproxId {
unimplemented!()
}
@@ -184,6 +194,10 @@ pub trait ConsensusApi: Send + Sync {
unimplemented!()
}
+ fn calc_transaction_hash_merkle_root(&self, txs: &[Transaction], pov_daa_score: u64) -> Hash {
+ unimplemented!()
+ }
+
fn validate_pruning_proof(&self, proof: &PruningPointProof) -> PruningImportResult<()> {
unimplemented!()
}
diff --git a/consensus/core/src/api/stats.rs b/consensus/core/src/api/stats.rs
index fd59f09ae..c2fea489c 100644
--- a/consensus/core/src/api/stats.rs
+++ b/consensus/core/src/api/stats.rs
@@ -1,7 +1,7 @@
-use borsh::{BorshDeserialize, BorshSerialize};
use serde::{Deserialize, Serialize};
+use workflow_serializer::prelude::*;
-#[derive(Clone, Debug, Serialize, Deserialize, BorshSerialize, BorshDeserialize, Default)]
+#[derive(Clone, Debug, Serialize, Deserialize, Default)]
#[serde(rename_all = "camelCase")]
pub struct BlockCount {
pub header_count: u64,
@@ -14,6 +14,26 @@ impl BlockCount {
}
}
+impl Serializer for BlockCount {
+ fn serialize(&self, writer: &mut W) -> std::io::Result<()> {
+ store!(u16, &1, writer)?;
+ store!(u64, &self.header_count, writer)?;
+ store!(u64, &self.block_count, writer)?;
+
+ Ok(())
+ }
+}
+
+impl Deserializer for BlockCount {
+ fn deserialize(reader: &mut R) -> std::io::Result {
+ let _version = load!(u16, reader)?;
+ let header_count = load!(u64, reader)?;
+ let block_count = load!(u64, reader)?;
+
+ Ok(Self { header_count, block_count })
+ }
+}
+
#[derive(Clone, Default)]
pub struct VirtualStateStats {
/// Number of direct parents of virtual
diff --git a/consensus/core/src/block.rs b/consensus/core/src/block.rs
index dde6fd5e7..cbd76b42d 100644
--- a/consensus/core/src/block.rs
+++ b/consensus/core/src/block.rs
@@ -5,6 +5,7 @@ use crate::{
BlueWorkType,
};
use kaspa_hashes::Hash;
+use kaspa_utils::mem_size::MemSizeEstimator;
use std::sync::Arc;
/// A mutable block structure where header and transactions within can still be mutated.
@@ -66,6 +67,20 @@ impl Block {
pub fn from_precomputed_hash(hash: Hash, parents: Vec) -> Block {
Block::from_header(Header::from_precomputed_hash(hash, parents))
}
+
+ pub fn asses_for_cache(&self) -> Option<()> {
+ (self.estimate_mem_bytes() < 1_000_000).then_some(())
+ }
+}
+
+impl MemSizeEstimator for Block {
+ fn estimate_mem_bytes(&self) -> usize {
+ // Calculates mem bytes of the block (for cache tracking purposes)
+ size_of::()
+ + self.header.estimate_mem_bytes()
+ + size_of::>()
+ + self.transactions.iter().map(Transaction::estimate_mem_bytes).sum::()
+ }
}
/// An abstraction for a recallable transaction selector with persistent state
@@ -105,6 +120,8 @@ pub struct BlockTemplate {
pub selected_parent_timestamp: u64,
pub selected_parent_daa_score: u64,
pub selected_parent_hash: Hash,
+ /// Expected length is one less than txs length due to lack of coinbase transaction
+ pub calculated_fees: Vec