From 21fa0af8df56bfda0f64e5bf58ea2211e5596ac9 Mon Sep 17 00:00:00 2001 From: Facundo Farall <37149322+ffarall@users.noreply.github.com> Date: Wed, 7 Jan 2026 16:34:03 -0300 Subject: [PATCH] =?UTF-8?q?feat:=20=E2=AC=86=EF=B8=8F=20Upgrade=20to=20Sto?= =?UTF-8?q?rageHub=20version=200.3.0=20(#381)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Upgrade to StorageHub version 0.3.0. This is a minor release, including breaking changes. ## ⚠️ Breaking Changes ⚠️ The changes applied in this PR are according to the suggested changes in StorageHub's [v0.3.0 release](https://github.com/Moonsong-Labs/storage-hub/releases/tag/v0.3.0) --------- Co-authored-by: Steve Degosserie <723552+stiiifff@users.noreply.github.com> --- operator/Cargo.lock | 297 +++++++++++++----- operator/Cargo.toml | 68 ++-- operator/node/src/cli.rs | 57 ++-- operator/node/src/command.rs | 9 + operator/node/src/service.rs | 16 + .../mainnet/src/configs/storagehub/client.rs | 20 +- operator/runtime/mainnet/src/lib.rs | 8 +- .../stagenet/src/configs/storagehub/client.rs | 20 +- operator/runtime/stagenet/src/lib.rs | 8 +- .../testnet/src/configs/storagehub/client.rs | 20 +- operator/runtime/testnet/src/lib.rs | 8 +- operator/scripts/verify-licenses.sh | 2 + test/.papi/descriptors/package.json | 2 +- test/.papi/metadata/datahaven.scale | Bin 629395 -> 627266 bytes 14 files changed, 395 insertions(+), 140 deletions(-) diff --git a/operator/Cargo.lock b/operator/Cargo.lock index 24fb0f36..9af03d3c 100644 --- a/operator/Cargo.lock +++ b/operator/Cargo.lock @@ -946,6 +946,85 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" +[[package]] +name = "axum" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b52af3cb4058c895d37317bb27508dccc8e5f2d39454016b297bf4a400597b8" +dependencies = [ + "axum-core", + "bytes", + "form_urlencoded", + "futures-util", + "http 1.3.1", + "http-body 1.0.1", + "http-body-util", + "hyper 1.7.0", + "hyper-util", + "itoa", + "matchit", + "memchr", + "mime", + "percent-encoding", + "pin-project-lite", + "serde_core", + "serde_json", + "serde_path_to_error", + "serde_urlencoded", + "sync_wrapper", + "tokio", + "tower 0.5.2", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "axum-core" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08c78f31d7b1291f7ee735c1c6780ccde7785daae9a9206026862dab7d8792d1" +dependencies = [ + "bytes", + "futures-core", + "http 1.3.1", + "http-body 1.0.1", + "http-body-util", + "mime", + "pin-project-lite", + "sync_wrapper", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "axum-extra" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9963ff19f40c6102c76756ef0a46004c0d58957d87259fc9208ff8441c12ab96" +dependencies = [ + "axum", + "axum-core", + "bytes", + "fastrand", + "futures-util", + "headers", + "http 1.3.1", + "http-body 1.0.1", + "http-body-util", + "mime", + "multer", + "pin-project-lite", + "rustversion", + "serde_core", + "tokio", + "tokio-util", + "tower-layer", + "tower-service", + "tracing", +] + [[package]] name = "backtrace" version = "0.3.76" @@ -3658,6 +3737,15 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" +[[package]] +name = "encoding_rs" +version = "0.8.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" +dependencies = [ + "cfg-if", +] + [[package]] name = "enum-as-inner" version = "0.5.1" @@ -5310,6 +5398,30 @@ dependencies = [ "hashbrown 0.14.5", ] +[[package]] +name = "headers" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3314d5adb5d94bcdf56771f2e50dbbc80bb4bdf88967526706205ac9eff24eb" +dependencies = [ + "base64 0.22.1", + "bytes", + "headers-core", + "http 1.3.1", + "httpdate", + "mime", + "sha1", +] + +[[package]] +name = "headers-core" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54b4a22553d4242c49fddb9ba998a99962b5cc6f22cb5a3482bec22522403ce4" +dependencies = [ + "http 1.3.1", +] + [[package]] name = "heck" version = "0.4.1" @@ -7394,6 +7506,12 @@ version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" +[[package]] +name = "matchit" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3" + [[package]] name = "matrixmultiply" version = "0.3.10" @@ -7665,6 +7783,23 @@ dependencies = [ "uuid", ] +[[package]] +name = "multer" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83e87776546dc87511aa5ee218730c92b666d7264ab6ed41f9d215af9cd5224b" +dependencies = [ + "bytes", + "encoding_rs", + "futures-util", + "http 1.3.1", + "httparse", + "memchr", + "mime", + "spin 0.9.8", + "version_check", +] + [[package]] name = "multiaddr" version = "0.17.1" @@ -8436,8 +8571,8 @@ dependencies = [ [[package]] name = "pallet-bucket-nfts" -version = "0.1.0" -source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.2.9#a2c15c6a25071d2060403a469b663eec51974010" +version = "0.3.0" +source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.3.0#a41f0bef38c164585e84d7951e8db14e236de37a" dependencies = [ "frame-benchmarking", "frame-support", @@ -8493,8 +8628,8 @@ dependencies = [ [[package]] name = "pallet-cr-randomness" -version = "0.1.0" -source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.2.9#a2c15c6a25071d2060403a469b663eec51974010" +version = "0.3.0" +source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.3.0#a41f0bef38c164585e84d7951e8db14e236de37a" dependencies = [ "frame-support", "frame-system", @@ -8777,8 +8912,8 @@ dependencies = [ [[package]] name = "pallet-evm-precompile-file-system" -version = "0.1.0" -source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.2.9#a2c15c6a25071d2060403a469b663eec51974010" +version = "0.3.0" +source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.3.0#a41f0bef38c164585e84d7951e8db14e236de37a" dependencies = [ "fp-account", "fp-evm", @@ -9028,8 +9163,8 @@ dependencies = [ [[package]] name = "pallet-file-system" -version = "0.1.0" -source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.2.9#a2c15c6a25071d2060403a469b663eec51974010" +version = "0.3.0" +source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.3.0#a41f0bef38c164585e84d7951e8db14e236de37a" dependencies = [ "frame-benchmarking", "frame-support", @@ -9055,8 +9190,8 @@ dependencies = [ [[package]] name = "pallet-file-system-runtime-api" -version = "0.1.0" -source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.2.9#a2c15c6a25071d2060403a469b663eec51974010" +version = "0.3.0" +source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.3.0#a41f0bef38c164585e84d7951e8db14e236de37a" dependencies = [ "parity-scale-codec", "scale-info", @@ -9251,8 +9386,8 @@ dependencies = [ [[package]] name = "pallet-payment-streams" -version = "0.1.0" -source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.2.9#a2c15c6a25071d2060403a469b663eec51974010" +version = "0.3.0" +source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.3.0#a41f0bef38c164585e84d7951e8db14e236de37a" dependencies = [ "frame-benchmarking", "frame-support", @@ -9271,8 +9406,8 @@ dependencies = [ [[package]] name = "pallet-payment-streams-runtime-api" -version = "0.1.0" -source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.2.9#a2c15c6a25071d2060403a469b663eec51974010" +version = "0.3.0" +source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.3.0#a41f0bef38c164585e84d7951e8db14e236de37a" dependencies = [ "parity-scale-codec", "scale-info", @@ -9299,8 +9434,8 @@ dependencies = [ [[package]] name = "pallet-proofs-dealer" -version = "0.1.0" -source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.2.9#a2c15c6a25071d2060403a469b663eec51974010" +version = "0.3.0" +source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.3.0#a41f0bef38c164585e84d7951e8db14e236de37a" dependencies = [ "frame-benchmarking", "frame-support", @@ -9321,8 +9456,8 @@ dependencies = [ [[package]] name = "pallet-proofs-dealer-runtime-api" -version = "0.1.0" -source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.2.9#a2c15c6a25071d2060403a469b663eec51974010" +version = "0.3.0" +source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.3.0#a41f0bef38c164585e84d7951e8db14e236de37a" dependencies = [ "parity-scale-codec", "scale-info", @@ -9343,8 +9478,8 @@ dependencies = [ [[package]] name = "pallet-randomness" -version = "0.1.0" -source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.2.9#a2c15c6a25071d2060403a469b663eec51974010" +version = "0.3.0" +source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.3.0#a41f0bef38c164585e84d7951e8db14e236de37a" dependencies = [ "frame-benchmarking", "frame-support", @@ -9484,8 +9619,8 @@ dependencies = [ [[package]] name = "pallet-storage-providers" -version = "0.1.0" -source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.2.9#a2c15c6a25071d2060403a469b663eec51974010" +version = "0.3.0" +source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.3.0#a41f0bef38c164585e84d7951e8db14e236de37a" dependencies = [ "frame-benchmarking", "frame-support", @@ -9506,8 +9641,8 @@ dependencies = [ [[package]] name = "pallet-storage-providers-runtime-api" -version = "0.1.0" -source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.2.9#a2c15c6a25071d2060403a469b663eec51974010" +version = "0.3.0" +source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.3.0#a41f0bef38c164585e84d7951e8db14e236de37a" dependencies = [ "parity-scale-codec", "scale-info", @@ -13539,6 +13674,17 @@ dependencies = [ "serde_core", ] +[[package]] +name = "serde_path_to_error" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10a9ff822e371bb5403e391ecd83e182e0e77ba7f6fe0160b795797109d1b457" +dependencies = [ + "itoa", + "serde", + "serde_core", +] + [[package]] name = "serde_spanned" version = "0.6.9" @@ -13658,8 +13804,8 @@ dependencies = [ [[package]] name = "shc-actors-derive" -version = "0.1.0" -source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.2.9#a2c15c6a25071d2060403a469b663eec51974010" +version = "0.3.0" +source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.3.0#a41f0bef38c164585e84d7951e8db14e236de37a" dependencies = [ "once_cell", "proc-macro2", @@ -13671,8 +13817,8 @@ dependencies = [ [[package]] name = "shc-actors-framework" -version = "0.1.0" -source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.2.9#a2c15c6a25071d2060403a469b663eec51974010" +version = "0.3.0" +source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.3.0#a41f0bef38c164585e84d7951e8db14e236de37a" dependencies = [ "anyhow", "bincode", @@ -13689,8 +13835,8 @@ dependencies = [ [[package]] name = "shc-blockchain-service" -version = "0.1.0" -source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.2.9#a2c15c6a25071d2060403a469b663eec51974010" +version = "0.3.0" +source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.3.0#a41f0bef38c164585e84d7951e8db14e236de37a" dependencies = [ "anyhow", "array-bytes", @@ -13733,6 +13879,7 @@ dependencies = [ "shp-tx-implicits-runtime-api", "sp-api", "sp-blockchain", + "sp-consensus", "sp-core", "sp-keystore", "sp-runtime", @@ -13743,8 +13890,8 @@ dependencies = [ [[package]] name = "shc-blockchain-service-db" -version = "0.1.0" -source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.2.9#a2c15c6a25071d2060403a469b663eec51974010" +version = "0.3.0" +source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.3.0#a41f0bef38c164585e84d7951e8db14e236de37a" dependencies = [ "chrono", "diesel", @@ -13767,13 +13914,15 @@ dependencies = [ [[package]] name = "shc-client" -version = "0.1.0" -source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.2.9#a2c15c6a25071d2060403a469b663eec51974010" +version = "0.3.0" +source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.3.0#a41f0bef38c164585e84d7951e8db14e236de37a" dependencies = [ "anyhow", "array-bytes", "async-channel 1.9.0", "async-trait", + "axum", + "axum-extra", "chrono", "frame-benchmarking", "frame-benchmarking-cli", @@ -13829,12 +13978,14 @@ dependencies = [ "substrate-build-script-utils", "thiserror 1.0.69", "tokio", + "tokio-stream", + "tower-http 0.5.2", ] [[package]] name = "shc-common" -version = "0.1.0" -source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.2.9#a2c15c6a25071d2060403a469b663eec51974010" +version = "0.3.0" +source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.3.0#a41f0bef38c164585e84d7951e8db14e236de37a" dependencies = [ "anyhow", "bigdecimal", @@ -13897,8 +14048,8 @@ dependencies = [ [[package]] name = "shc-file-manager" -version = "0.1.0" -source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.2.9#a2c15c6a25071d2060403a469b663eec51974010" +version = "0.3.0" +source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.3.0#a41f0bef38c164585e84d7951e8db14e236de37a" dependencies = [ "bincode", "hash-db", @@ -13921,8 +14072,8 @@ dependencies = [ [[package]] name = "shc-file-transfer-service" -version = "0.1.0" -source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.2.9#a2c15c6a25071d2060403a469b663eec51974010" +version = "0.3.0" +source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.3.0#a41f0bef38c164585e84d7951e8db14e236de37a" dependencies = [ "anyhow", "array-bytes", @@ -13950,8 +14101,8 @@ dependencies = [ [[package]] name = "shc-fisherman-service" -version = "0.1.0" -source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.2.9#a2c15c6a25071d2060403a469b663eec51974010" +version = "0.3.0" +source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.3.0#a41f0bef38c164585e84d7951e8db14e236de37a" dependencies = [ "async-trait", "diesel", @@ -13980,8 +14131,8 @@ dependencies = [ [[package]] name = "shc-forest-manager" -version = "0.1.0" -source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.2.9#a2c15c6a25071d2060403a469b663eec51974010" +version = "0.3.0" +source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.3.0#a41f0bef38c164585e84d7951e8db14e236de37a" dependencies = [ "async-trait", "bincode", @@ -14005,8 +14156,8 @@ dependencies = [ [[package]] name = "shc-indexer-db" -version = "0.1.0" -source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.2.9#a2c15c6a25071d2060403a469b663eec51974010" +version = "0.3.0" +source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.3.0#a41f0bef38c164585e84d7951e8db14e236de37a" dependencies = [ "bigdecimal", "chrono", @@ -14033,8 +14184,8 @@ dependencies = [ [[package]] name = "shc-indexer-service" -version = "0.1.0" -source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.2.9#a2c15c6a25071d2060403a469b663eec51974010" +version = "0.3.0" +source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.3.0#a41f0bef38c164585e84d7951e8db14e236de37a" dependencies = [ "anyhow", "array-bytes", @@ -14084,8 +14235,8 @@ dependencies = [ [[package]] name = "shc-rpc" -version = "0.1.0" -source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.2.9#a2c15c6a25071d2060403a469b663eec51974010" +version = "0.3.0" +source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.3.0#a41f0bef38c164585e84d7951e8db14e236de37a" dependencies = [ "array-bytes", "async-trait", @@ -14136,8 +14287,8 @@ checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] name = "shp-constants" -version = "0.1.0" -source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.2.9#a2c15c6a25071d2060403a469b663eec51974010" +version = "0.3.0" +source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.3.0#a41f0bef38c164585e84d7951e8db14e236de37a" dependencies = [ "sp-core", "sp-runtime", @@ -14145,8 +14296,8 @@ dependencies = [ [[package]] name = "shp-data-price-updater" -version = "0.1.0" -source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.2.9#a2c15c6a25071d2060403a469b663eec51974010" +version = "0.3.0" +source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.3.0#a41f0bef38c164585e84d7951e8db14e236de37a" dependencies = [ "frame-support", "parity-scale-codec", @@ -14160,8 +14311,8 @@ dependencies = [ [[package]] name = "shp-file-key-verifier" -version = "0.1.0" -source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.2.9#a2c15c6a25071d2060403a469b663eec51974010" +version = "0.3.0" +source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.3.0#a41f0bef38c164585e84d7951e8db14e236de37a" dependencies = [ "frame-support", "parity-scale-codec", @@ -14178,8 +14329,8 @@ dependencies = [ [[package]] name = "shp-file-metadata" -version = "0.1.0" -source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.2.9#a2c15c6a25071d2060403a469b663eec51974010" +version = "0.3.0" +source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.3.0#a41f0bef38c164585e84d7951e8db14e236de37a" dependencies = [ "hex", "num-bigint", @@ -14194,8 +14345,8 @@ dependencies = [ [[package]] name = "shp-forest-verifier" -version = "0.1.0" -source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.2.9#a2c15c6a25071d2060403a469b663eec51974010" +version = "0.3.0" +source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.3.0#a41f0bef38c164585e84d7951e8db14e236de37a" dependencies = [ "frame-support", "parity-scale-codec", @@ -14211,16 +14362,16 @@ dependencies = [ [[package]] name = "shp-opaque" -version = "0.1.0" -source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.2.9#a2c15c6a25071d2060403a469b663eec51974010" +version = "0.3.0" +source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.3.0#a41f0bef38c164585e84d7951e8db14e236de37a" dependencies = [ "sp-runtime", ] [[package]] name = "shp-session-keys" -version = "0.1.0" -source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.2.9#a2c15c6a25071d2060403a469b663eec51974010" +version = "0.3.0" +source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.3.0#a41f0bef38c164585e84d7951e8db14e236de37a" dependencies = [ "async-trait", "parity-scale-codec", @@ -14234,8 +14385,8 @@ dependencies = [ [[package]] name = "shp-traits" -version = "0.1.0" -source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.2.9#a2c15c6a25071d2060403a469b663eec51974010" +version = "0.3.0" +source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.3.0#a41f0bef38c164585e84d7951e8db14e236de37a" dependencies = [ "frame-support", "parity-scale-codec", @@ -14248,8 +14399,8 @@ dependencies = [ [[package]] name = "shp-treasury-funding" -version = "0.1.0" -source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.2.9#a2c15c6a25071d2060403a469b663eec51974010" +version = "0.3.0" +source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.3.0#a41f0bef38c164585e84d7951e8db14e236de37a" dependencies = [ "log", "shp-traits", @@ -14259,8 +14410,8 @@ dependencies = [ [[package]] name = "shp-tx-implicits-runtime-api" -version = "0.1.0" -source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.2.9#a2c15c6a25071d2060403a469b663eec51974010" +version = "0.3.0" +source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.3.0#a41f0bef38c164585e84d7951e8db14e236de37a" dependencies = [ "parity-scale-codec", "scale-info", @@ -14272,8 +14423,8 @@ dependencies = [ [[package]] name = "shp-types" -version = "0.1.0" -source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.2.9#a2c15c6a25071d2060403a469b663eec51974010" +version = "0.3.0" +source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.3.0#a41f0bef38c164585e84d7951e8db14e236de37a" dependencies = [ "sp-core", "sp-runtime", @@ -17040,6 +17191,7 @@ dependencies = [ "tokio", "tower-layer", "tower-service", + "tracing", ] [[package]] @@ -17056,6 +17208,7 @@ dependencies = [ "pin-project-lite", "tower-layer", "tower-service", + "tracing", ] [[package]] diff --git a/operator/Cargo.toml b/operator/Cargo.toml index fcce0eef..b4976e81 100644 --- a/operator/Cargo.toml +++ b/operator/Cargo.toml @@ -265,42 +265,42 @@ fc-storage = { git = "https://github.com/polkadot-evm/frontier", branch = "stabl # StorageHub ## Runtime -pallet-bucket-nfts = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.2.9", default-features = false } -pallet-cr-randomness = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.2.9", default-features = false } -pallet-file-system = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.2.9", default-features = false } -pallet-file-system-runtime-api = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.2.9", default-features = false } -pallet-payment-streams = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.2.9", default-features = false } -pallet-payment-streams-runtime-api = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.2.9", default-features = false } -pallet-proofs-dealer = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.2.9", default-features = false } -pallet-proofs-dealer-runtime-api = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.2.9", default-features = false } -pallet-randomness = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.2.9", default-features = false } -pallet-storage-providers = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.2.9", default-features = false } -pallet-storage-providers-runtime-api = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.2.9", default-features = false } -shp-constants = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.2.9", default-features = false } -shp-data-price-updater = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.2.9", default-features = false } -shp-file-key-verifier = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.2.9", default-features = false } -shp-file-metadata = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.2.9", default-features = false } -shp-forest-verifier = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.2.9", default-features = false } -shp-traits = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.2.9", default-features = false } -shp-treasury-funding = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.2.9", default-features = false } +pallet-bucket-nfts = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.3.0", default-features = false } +pallet-cr-randomness = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.3.0", default-features = false } +pallet-file-system = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.3.0", default-features = false } +pallet-file-system-runtime-api = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.3.0", default-features = false } +pallet-payment-streams = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.3.0", default-features = false } +pallet-payment-streams-runtime-api = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.3.0", default-features = false } +pallet-proofs-dealer = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.3.0", default-features = false } +pallet-proofs-dealer-runtime-api = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.3.0", default-features = false } +pallet-randomness = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.3.0", default-features = false } +pallet-storage-providers = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.3.0", default-features = false } +pallet-storage-providers-runtime-api = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.3.0", default-features = false } +shp-constants = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.3.0", default-features = false } +shp-data-price-updater = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.3.0", default-features = false } +shp-file-key-verifier = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.3.0", default-features = false } +shp-file-metadata = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.3.0", default-features = false } +shp-forest-verifier = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.3.0", default-features = false } +shp-traits = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.3.0", default-features = false } +shp-treasury-funding = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.3.0", default-features = false } ## Client -shc-actors-derive = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.2.9", default-features = false } -shc-actors-framework = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.2.9", default-features = false } -shc-blockchain-service = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.2.9", default-features = false } -shc-client = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.2.9", default-features = false } -shc-common = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.2.9", default-features = false } -shc-file-manager = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.2.9", default-features = false } -shc-file-transfer-service = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.2.9", default-features = false } -shc-fisherman-service = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.2.9", default-features = false } -shc-forest-manager = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.2.9", default-features = false } -shc-indexer-db = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.2.9", default-features = false } -shc-indexer-service = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.2.9", default-features = false } -shc-rpc = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.2.9", default-features = false } -shp-opaque = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.2.9", default-features = false } -shp-tx-implicits-runtime-api = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.2.9", default-features = false } -shp-types = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.2.9", default-features = false } +shc-actors-derive = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.3.0", default-features = false } +shc-actors-framework = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.3.0", default-features = false } +shc-blockchain-service = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.3.0", default-features = false } +shc-client = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.3.0", default-features = false } +shc-common = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.3.0", default-features = false } +shc-file-manager = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.3.0", default-features = false } +shc-file-transfer-service = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.3.0", default-features = false } +shc-fisherman-service = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.3.0", default-features = false } +shc-forest-manager = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.3.0", default-features = false } +shc-indexer-db = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.3.0", default-features = false } +shc-indexer-service = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.3.0", default-features = false } +shc-rpc = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.3.0", default-features = false } +shp-opaque = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.3.0", default-features = false } +shp-tx-implicits-runtime-api = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.3.0", default-features = false } +shp-types = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.3.0", default-features = false } ## Precompiles -pallet-evm-precompile-file-system = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.2.9", default-features = false } +pallet-evm-precompile-file-system = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.3.0", default-features = false } # Static linking diff --git a/operator/node/src/cli.rs b/operator/node/src/cli.rs index dc491ab5..c8f432a3 100644 --- a/operator/node/src/cli.rs +++ b/operator/node/src/cli.rs @@ -61,8 +61,8 @@ pub struct Cli { /// Provider configurations file path (allow to specify the provider configuration in a file instead of the cli) #[arg(long, conflicts_with_all = [ "provider", "provider_type", "max_storage_capacity", "jump_capacity", - "storage_layer", "storage_path", "extrinsic_retry_timeout", "sync_mode_min_blocks_behind", - "check_for_pending_proofs_period", "max_blocks_behind_to_catch_up_root_changes", + "storage_layer", "storage_path", "extrinsic_retry_timeout", + "check_for_pending_proofs_period", "msp_charging_period", "msp_charge_fees_task", "msp_charge_fees_min_debt", "msp_move_bucket_task", "msp_move_bucket_max_try_count", "msp_move_bucket_max_tip", "bsp_upload_file_task", "bsp_upload_file_max_try_count", "bsp_upload_file_max_tip", @@ -70,7 +70,8 @@ pub struct Cli { "bsp_charge_fees_task", "bsp_charge_fees_min_debt", "bsp_submit_proof_task", "bsp_submit_proof_max_attempts", "pending_db_url", - "fisherman", "fisherman_database_url", + "fisherman", "fisherman_database_url", + "trusted_file_transfer_server", "trusted_file_transfer_server_host", "trusted_file_transfer_server_port", ])] pub provider_config_file: Option, @@ -232,18 +233,10 @@ pub struct ProviderConfigurations { #[arg(long, default_value = "60")] pub extrinsic_retry_timeout: Option, - /// The minimum number of blocks behind the current best block to consider the node out of sync. - #[arg(long, default_value = "5")] - pub sync_mode_min_blocks_behind: Option, - /// On blocks that are multiples of this number, the blockchain service will trigger the catch of proofs. #[arg(long, default_value = "4")] pub check_for_pending_proofs_period: Option, - /// The maximum number of blocks from the past that will be processed for catching up the root changes. - #[arg(long, default_value = "10")] - pub max_blocks_behind_to_catch_up_root_changes: Option, - /// Enable MSP file distribution to BSPs (disabled by default unless set via config/CLI). /// Only applicable when running as an MSP provider. #[arg(long, value_name = "BOOLEAN")] @@ -441,6 +434,32 @@ pub struct ProviderConfigurations { help_heading = "MSP Database Options" )] pub msp_database_url: Option, + + /// Enable the trusted file transfer HTTP server + #[arg( + long, + value_name = "BOOLEAN", + help_heading = "Trusted File Transfer Server Options" + )] + pub trusted_file_transfer_server: bool, + + /// Host address for trusted file transfer HTTP server (default: 127.0.0.1). + #[arg( + long, + value_name = "HOST", + help_heading = "Trusted File Transfer Server Options", + default_value = "127.0.0.1" + )] + pub trusted_file_transfer_server_host: Option, + + /// Port for trusted file transfer HTTP server (default: 7070). + #[arg( + long, + value_name = "PORT", + help_heading = "Trusted File Transfer Server Options", + default_value = "7070" + )] + pub trusted_file_transfer_server_port: Option, } impl ProviderConfigurations { @@ -561,24 +580,11 @@ impl ProviderConfigurations { bs_changed = true; } - if let Some(sync_mode_min_blocks_behind) = self.sync_mode_min_blocks_behind { - bs_options.sync_mode_min_blocks_behind = Some(sync_mode_min_blocks_behind); - bs_changed = true; - } - if let Some(check_for_pending_proofs_period) = self.check_for_pending_proofs_period { bs_options.check_for_pending_proofs_period = Some(check_for_pending_proofs_period); bs_changed = true; } - if let Some(max_blocks_behind_to_catch_up_root_changes) = - self.max_blocks_behind_to_catch_up_root_changes - { - bs_options.max_blocks_behind_to_catch_up_root_changes = - Some(max_blocks_behind_to_catch_up_root_changes); - bs_changed = true; - } - // Set MSP distribution flag if provided on CLI and role is MSP if self.msp_distribute_files && provider_type == ProviderType::Msp { bs_options.enable_msp_distribute_files = Some(true); @@ -608,6 +614,9 @@ impl ProviderConfigurations { bsp_submit_proof, blockchain_service, msp_database_url: self.msp_database_url.clone(), + trusted_file_transfer_server: self.trusted_file_transfer_server, + trusted_file_transfer_server_host: self.trusted_file_transfer_server_host.clone(), + trusted_file_transfer_server_port: self.trusted_file_transfer_server_port, // We don't support maintenance mode for now. // maintenance_mode: self.maintenance_mode, } diff --git a/operator/node/src/command.rs b/operator/node/src/command.rs index 0dd08e35..69a9bcd0 100644 --- a/operator/node/src/command.rs +++ b/operator/node/src/command.rs @@ -80,6 +80,15 @@ pub struct ProviderOptions { pub blockchain_service: Option, /// MSP database URL. pub msp_database_url: Option, + /// Enable the trusted file transfer HTTP server. + #[serde(default)] + pub trusted_file_transfer_server: bool, + /// Host address for trusted file transfer HTTP server. + #[serde(default, skip_serializing_if = "Option::is_none")] + pub trusted_file_transfer_server_host: Option, + /// Port for trusted file transfer HTTP server. + #[serde(default, skip_serializing_if = "Option::is_none")] + pub trusted_file_transfer_server_port: Option, // Whether the node is running in maintenance mode. We are not supporting maintenance mode. // pub maintenance_mode: bool, } diff --git a/operator/node/src/service.rs b/operator/node/src/service.rs index 7ce84b11..9fe4f1dd 100644 --- a/operator/node/src/service.rs +++ b/operator/node/src/service.rs @@ -1182,6 +1182,9 @@ where bsp_submit_proof, blockchain_service, msp_database_url, + trusted_file_transfer_server, + trusted_file_transfer_server_host, + trusted_file_transfer_server_port, .. }) => { info!( @@ -1217,6 +1220,16 @@ where } } + if *trusted_file_transfer_server { + let file_transfer_config = shc_client::trusted_file_transfer::server::Config { + host: trusted_file_transfer_server_host + .clone() + .unwrap_or_else(|| "127.0.0.1".to_string()), + port: trusted_file_transfer_server_port.unwrap_or(7070), + }; + builder.with_trusted_file_transfer_server(file_transfer_config); + } + if let Some(c) = blockchain_service { let peer_id = network.local_peer_id().to_bytes(); let mut c = c.clone(); @@ -1295,6 +1308,9 @@ where ) .await; + // Spawn the trusted file transfer server if configured + sh_builder.spawn_trusted_file_transfer_server().await; + // Initialize the BSP peer manager sh_builder.with_peer_manager(rocks_db_path.clone()); diff --git a/operator/runtime/mainnet/src/configs/storagehub/client.rs b/operator/runtime/mainnet/src/configs/storagehub/client.rs index 970e75ab..110bec9d 100644 --- a/operator/runtime/mainnet/src/configs/storagehub/client.rs +++ b/operator/runtime/mainnet/src/configs/storagehub/client.rs @@ -19,7 +19,7 @@ // no_std Wasm runtime. use shc_common::{ traits::{ExtensionOperations, StorageEnableRuntime, TransactionHashProvider}, - types::{MinimalExtension, StorageEnableEvents, StorageHubEventsVec}, + types::{MinimalExtension, StorageEnableErrors, StorageEnableEvents, StorageHubEventsVec}, }; use sp_core::H256; @@ -30,6 +30,7 @@ impl StorageEnableRuntime for crate::Runtime { type Signature = crate::Signature; type Extension = crate::SignedExtra; type RuntimeApi = crate::RuntimeApi; + type RuntimeError = crate::RuntimeError; } // Implement the transaction extension helpers for the concrete runtime's SignedExtra. @@ -103,3 +104,20 @@ impl TransactionHashProvider for crate::Runtime { tx_map } } + +impl Into> for crate::RuntimeError { + fn into(self) -> StorageEnableErrors { + match self { + crate::RuntimeError::System(error) => StorageEnableErrors::System(error), + crate::RuntimeError::Providers(error) => StorageEnableErrors::StorageProviders(error), + crate::RuntimeError::ProofsDealer(error) => StorageEnableErrors::ProofsDealer(error), + crate::RuntimeError::PaymentStreams(error) => { + StorageEnableErrors::PaymentStreams(error) + } + crate::RuntimeError::FileSystem(error) => StorageEnableErrors::FileSystem(error), + crate::RuntimeError::Balances(error) => StorageEnableErrors::Balances(error), + crate::RuntimeError::BucketNfts(error) => StorageEnableErrors::BucketNfts(error), + other => StorageEnableErrors::Other(format!("{:?}", other)), + } + } +} diff --git a/operator/runtime/mainnet/src/lib.rs b/operator/runtime/mainnet/src/lib.rs index bdef45e0..926a36f9 100644 --- a/operator/runtime/mainnet/src/lib.rs +++ b/operator/runtime/mainnet/src/lib.rs @@ -245,7 +245,7 @@ pub type SignedPayload = generic::SignedPayload; /// /// This can be a tuple of types, each implementing `OnRuntimeUpgrade`. #[allow(unused_parens)] -type Migrations = (); +type Migrations = (pallet_file_system::migrations::v1::MigrateV0ToV1,); /// Executive: handles dispatch to the various modules. pub type Executive = frame_executive::Executive< @@ -1335,7 +1335,7 @@ impl_runtime_apis! { } - impl pallet_storage_providers_runtime_api::StorageProvidersApi, BackupStorageProvider, MainStorageProviderId, AccountId, ProviderIdFor, StorageProviderId, StorageDataUnit, Balance, BucketId, Multiaddresses, ValuePropositionWithId> for Runtime { + impl pallet_storage_providers_runtime_api::StorageProvidersApi, BackupStorageProvider, MainStorageProviderId, AccountId, ProviderIdFor, StorageProviderId, StorageDataUnit, Balance, BucketId, Multiaddresses, ValuePropositionWithId, H256> for Runtime { fn get_bsp_info(bsp_id: &BackupStorageProviderId) -> Result, GetBspInfoError> { Providers::get_bsp_info(bsp_id) } @@ -1391,6 +1391,10 @@ impl_runtime_apis! { fn query_buckets_of_user_stored_by_msp(msp_id: &ProviderIdFor, user: &AccountId) -> Result>, QueryBucketsOfUserStoredByMspError> { Ok(sp_runtime::Vec::from_iter(Providers::query_buckets_of_user_stored_by_msp(msp_id, user)?)) } + + fn query_bucket_root(bucket_id: &BucketId) -> Result { + Providers::query_bucket_root(bucket_id) + } } impl shp_tx_implicits_runtime_api::TxImplicitsApi for Runtime { diff --git a/operator/runtime/stagenet/src/configs/storagehub/client.rs b/operator/runtime/stagenet/src/configs/storagehub/client.rs index 970e75ab..110bec9d 100644 --- a/operator/runtime/stagenet/src/configs/storagehub/client.rs +++ b/operator/runtime/stagenet/src/configs/storagehub/client.rs @@ -19,7 +19,7 @@ // no_std Wasm runtime. use shc_common::{ traits::{ExtensionOperations, StorageEnableRuntime, TransactionHashProvider}, - types::{MinimalExtension, StorageEnableEvents, StorageHubEventsVec}, + types::{MinimalExtension, StorageEnableErrors, StorageEnableEvents, StorageHubEventsVec}, }; use sp_core::H256; @@ -30,6 +30,7 @@ impl StorageEnableRuntime for crate::Runtime { type Signature = crate::Signature; type Extension = crate::SignedExtra; type RuntimeApi = crate::RuntimeApi; + type RuntimeError = crate::RuntimeError; } // Implement the transaction extension helpers for the concrete runtime's SignedExtra. @@ -103,3 +104,20 @@ impl TransactionHashProvider for crate::Runtime { tx_map } } + +impl Into> for crate::RuntimeError { + fn into(self) -> StorageEnableErrors { + match self { + crate::RuntimeError::System(error) => StorageEnableErrors::System(error), + crate::RuntimeError::Providers(error) => StorageEnableErrors::StorageProviders(error), + crate::RuntimeError::ProofsDealer(error) => StorageEnableErrors::ProofsDealer(error), + crate::RuntimeError::PaymentStreams(error) => { + StorageEnableErrors::PaymentStreams(error) + } + crate::RuntimeError::FileSystem(error) => StorageEnableErrors::FileSystem(error), + crate::RuntimeError::Balances(error) => StorageEnableErrors::Balances(error), + crate::RuntimeError::BucketNfts(error) => StorageEnableErrors::BucketNfts(error), + other => StorageEnableErrors::Other(format!("{:?}", other)), + } + } +} diff --git a/operator/runtime/stagenet/src/lib.rs b/operator/runtime/stagenet/src/lib.rs index a8ed4111..8f48c58a 100644 --- a/operator/runtime/stagenet/src/lib.rs +++ b/operator/runtime/stagenet/src/lib.rs @@ -247,7 +247,7 @@ pub type SignedPayload = generic::SignedPayload; /// /// This can be a tuple of types, each implementing `OnRuntimeUpgrade`. #[allow(unused_parens)] -type Migrations = (); +type Migrations = (pallet_file_system::migrations::v1::MigrateV0ToV1,); /// Executive: handles dispatch to the various modules. pub type Executive = frame_executive::Executive< @@ -1338,7 +1338,7 @@ impl_runtime_apis! { } - impl pallet_storage_providers_runtime_api::StorageProvidersApi, BackupStorageProvider, MainStorageProviderId, AccountId, ProviderIdFor, StorageProviderId, StorageDataUnit, Balance, BucketId, Multiaddresses, ValuePropositionWithId> for Runtime { + impl pallet_storage_providers_runtime_api::StorageProvidersApi, BackupStorageProvider, MainStorageProviderId, AccountId, ProviderIdFor, StorageProviderId, StorageDataUnit, Balance, BucketId, Multiaddresses, ValuePropositionWithId, H256> for Runtime { fn get_bsp_info(bsp_id: &BackupStorageProviderId) -> Result, GetBspInfoError> { Providers::get_bsp_info(bsp_id) } @@ -1394,6 +1394,10 @@ impl_runtime_apis! { fn query_buckets_of_user_stored_by_msp(msp_id: &ProviderIdFor, user: &AccountId) -> Result>, QueryBucketsOfUserStoredByMspError> { Ok(sp_runtime::Vec::from_iter(Providers::query_buckets_of_user_stored_by_msp(msp_id, user)?)) } + + fn query_bucket_root(bucket_id: &BucketId) -> Result { + Providers::query_bucket_root(bucket_id) + } } impl shp_tx_implicits_runtime_api::TxImplicitsApi for Runtime { diff --git a/operator/runtime/testnet/src/configs/storagehub/client.rs b/operator/runtime/testnet/src/configs/storagehub/client.rs index 970e75ab..110bec9d 100644 --- a/operator/runtime/testnet/src/configs/storagehub/client.rs +++ b/operator/runtime/testnet/src/configs/storagehub/client.rs @@ -19,7 +19,7 @@ // no_std Wasm runtime. use shc_common::{ traits::{ExtensionOperations, StorageEnableRuntime, TransactionHashProvider}, - types::{MinimalExtension, StorageEnableEvents, StorageHubEventsVec}, + types::{MinimalExtension, StorageEnableErrors, StorageEnableEvents, StorageHubEventsVec}, }; use sp_core::H256; @@ -30,6 +30,7 @@ impl StorageEnableRuntime for crate::Runtime { type Signature = crate::Signature; type Extension = crate::SignedExtra; type RuntimeApi = crate::RuntimeApi; + type RuntimeError = crate::RuntimeError; } // Implement the transaction extension helpers for the concrete runtime's SignedExtra. @@ -103,3 +104,20 @@ impl TransactionHashProvider for crate::Runtime { tx_map } } + +impl Into> for crate::RuntimeError { + fn into(self) -> StorageEnableErrors { + match self { + crate::RuntimeError::System(error) => StorageEnableErrors::System(error), + crate::RuntimeError::Providers(error) => StorageEnableErrors::StorageProviders(error), + crate::RuntimeError::ProofsDealer(error) => StorageEnableErrors::ProofsDealer(error), + crate::RuntimeError::PaymentStreams(error) => { + StorageEnableErrors::PaymentStreams(error) + } + crate::RuntimeError::FileSystem(error) => StorageEnableErrors::FileSystem(error), + crate::RuntimeError::Balances(error) => StorageEnableErrors::Balances(error), + crate::RuntimeError::BucketNfts(error) => StorageEnableErrors::BucketNfts(error), + other => StorageEnableErrors::Other(format!("{:?}", other)), + } + } +} diff --git a/operator/runtime/testnet/src/lib.rs b/operator/runtime/testnet/src/lib.rs index 02207488..108636c8 100644 --- a/operator/runtime/testnet/src/lib.rs +++ b/operator/runtime/testnet/src/lib.rs @@ -245,7 +245,7 @@ pub type SignedPayload = generic::SignedPayload; /// /// This can be a tuple of types, each implementing `OnRuntimeUpgrade`. #[allow(unused_parens)] -type Migrations = (); +type Migrations = (pallet_file_system::migrations::v1::MigrateV0ToV1,); /// Executive: handles dispatch to the various modules. pub type Executive = frame_executive::Executive< @@ -1335,7 +1335,7 @@ impl_runtime_apis! { } - impl pallet_storage_providers_runtime_api::StorageProvidersApi, BackupStorageProvider, MainStorageProviderId, AccountId, ProviderIdFor, StorageProviderId, StorageDataUnit, Balance, BucketId, Multiaddresses, ValuePropositionWithId> for Runtime { + impl pallet_storage_providers_runtime_api::StorageProvidersApi, BackupStorageProvider, MainStorageProviderId, AccountId, ProviderIdFor, StorageProviderId, StorageDataUnit, Balance, BucketId, Multiaddresses, ValuePropositionWithId, H256> for Runtime { fn get_bsp_info(bsp_id: &BackupStorageProviderId) -> Result, GetBspInfoError> { Providers::get_bsp_info(bsp_id) } @@ -1391,6 +1391,10 @@ impl_runtime_apis! { fn query_buckets_of_user_stored_by_msp(msp_id: &ProviderIdFor, user: &AccountId) -> Result>, QueryBucketsOfUserStoredByMspError> { Ok(sp_runtime::Vec::from_iter(Providers::query_buckets_of_user_stored_by_msp(msp_id, user)?)) } + + fn query_bucket_root(bucket_id: &BucketId) -> Result { + Providers::query_bucket_root(bucket_id) + } } impl shp_tx_implicits_runtime_api::TxImplicitsApi for Runtime { diff --git a/operator/scripts/verify-licenses.sh b/operator/scripts/verify-licenses.sh index 5cff33e2..29e26615 100755 --- a/operator/scripts/verify-licenses.sh +++ b/operator/scripts/verify-licenses.sh @@ -40,6 +40,8 @@ LICENSES=( "Zlib" "Unicode-3.0" "(Apache-2.0 OR MIT) AND Unicode-3.0" + "(Apache-2.0 OR MIT) AND BSD-3-Clause" + "BSD-3-Clause AND MIT" ) AUTHORS=( "PureStake" diff --git a/test/.papi/descriptors/package.json b/test/.papi/descriptors/package.json index 6a13c7de..3a1814dc 100644 --- a/test/.papi/descriptors/package.json +++ b/test/.papi/descriptors/package.json @@ -1,5 +1,5 @@ { - "version": "0.1.0-autogenerated.13813679320506320915", + "version": "0.1.0-autogenerated.3899565146829206681", "name": "@polkadot-api/descriptors", "files": [ "dist" diff --git a/test/.papi/metadata/datahaven.scale b/test/.papi/metadata/datahaven.scale index 8237ae86aafc38cf0c8a0681754a67c0a843f1ba..e39e92a1d70c872e34a5de05c61d516b6ff66213 100644 GIT binary patch delta 11499 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 delta 12640 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 O1>o