From 1fd0abccd779a1f92a84c5664c40faa66d208324 Mon Sep 17 00:00:00 2001 From: Facundo Farall <37149322+ffarall@users.noreply.github.com> Date: Mon, 3 Nov 2025 14:49:30 +0100 Subject: [PATCH] =?UTF-8?q?build:=20=E2=AC=86=EF=B8=8F=20Upgrade=20to=20SH?= =?UTF-8?q?=20v0.1.1=20(#273)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Upgrade to SH release [v0.1.1](https://github.com/Moonsong-Labs/storage-hub/releases/tag/v0.1.1) --------- Co-authored-by: Ahmad Kaouk <56095276+ahmadkaouk@users.noreply.github.com> Co-authored-by: Ahmad Kaouk Co-authored-by: Steve Degosserie <723552+stiiifff@users.noreply.github.com> --- operator/Cargo.lock | 72 ++++++++-------- operator/Cargo.toml | 79 +++++++++--------- operator/node/src/cli.rs | 16 ++++ operator/node/src/service.rs | 4 +- operator/runtime/mainnet/Cargo.toml | 27 +++--- .../mainnet/src/configs/storagehub/mod.rs | 23 ++++- operator/runtime/mainnet/src/lib.rs | 3 + operator/runtime/stagenet/Cargo.toml | 25 +++--- .../stagenet/src/configs/storagehub/mod.rs | 23 ++++- operator/runtime/stagenet/src/lib.rs | 3 + operator/runtime/testnet/Cargo.toml | 25 +++--- .../testnet/src/configs/storagehub/mod.rs | 23 ++++- operator/runtime/testnet/src/lib.rs | 3 + test/.papi/descriptors/package.json | 2 +- test/.papi/metadata/datahaven.scale | Bin 621085 -> 622477 bytes 15 files changed, 213 insertions(+), 115 deletions(-) diff --git a/operator/Cargo.lock b/operator/Cargo.lock index 3705be6c..61d45ca2 100644 --- a/operator/Cargo.lock +++ b/operator/Cargo.lock @@ -2922,6 +2922,7 @@ dependencies = [ "frame-try-runtime", "hex", "hex-literal 0.3.4", + "itoa", "log", "num-bigint", "num_enum", @@ -3210,6 +3211,7 @@ dependencies = [ "frame-try-runtime", "hex", "hex-literal 0.3.4", + "itoa", "log", "num-bigint", "num_enum", @@ -3359,6 +3361,7 @@ dependencies = [ "frame-try-runtime", "hex", "hex-literal 0.3.4", + "itoa", "log", "num-bigint", "num_enum", @@ -8985,7 +8988,7 @@ dependencies = [ [[package]] name = "pallet-bucket-nfts" version = "0.1.0" -source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.0.6-alpha#05d269a26d11c1ed8a6d917b3e08ff3b5d3d4b22" +source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.1.1#73241088333295db001818864a518b8c25896b5a" dependencies = [ "frame-benchmarking", "frame-support", @@ -9061,7 +9064,7 @@ dependencies = [ [[package]] name = "pallet-cr-randomness" version = "0.1.0" -source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.0.6-alpha#05d269a26d11c1ed8a6d917b3e08ff3b5d3d4b22" +source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.1.1#73241088333295db001818864a518b8c25896b5a" dependencies = [ "frame-support", "frame-system", @@ -9320,7 +9323,7 @@ dependencies = [ [[package]] name = "pallet-evm-precompile-file-system" version = "0.1.0" -source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.0.6-alpha#05d269a26d11c1ed8a6d917b3e08ff3b5d3d4b22" +source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.1.1#73241088333295db001818864a518b8c25896b5a" dependencies = [ "fp-account", "fp-evm", @@ -9573,7 +9576,7 @@ dependencies = [ [[package]] name = "pallet-file-system" version = "0.1.0" -source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.0.6-alpha#05d269a26d11c1ed8a6d917b3e08ff3b5d3d4b22" +source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.1.1#73241088333295db001818864a518b8c25896b5a" dependencies = [ "frame-benchmarking", "frame-support", @@ -9600,7 +9603,7 @@ dependencies = [ [[package]] name = "pallet-file-system-runtime-api" version = "0.1.0" -source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.0.6-alpha#05d269a26d11c1ed8a6d917b3e08ff3b5d3d4b22" +source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.1.1#73241088333295db001818864a518b8c25896b5a" dependencies = [ "parity-scale-codec", "scale-info", @@ -9796,7 +9799,7 @@ dependencies = [ [[package]] name = "pallet-payment-streams" version = "0.1.0" -source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.0.6-alpha#05d269a26d11c1ed8a6d917b3e08ff3b5d3d4b22" +source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.1.1#73241088333295db001818864a518b8c25896b5a" dependencies = [ "frame-benchmarking", "frame-support", @@ -9816,7 +9819,7 @@ dependencies = [ [[package]] name = "pallet-payment-streams-runtime-api" version = "0.1.0" -source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.0.6-alpha#05d269a26d11c1ed8a6d917b3e08ff3b5d3d4b22" +source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.1.1#73241088333295db001818864a518b8c25896b5a" dependencies = [ "parity-scale-codec", "scale-info", @@ -9844,7 +9847,7 @@ dependencies = [ [[package]] name = "pallet-proofs-dealer" version = "0.1.0" -source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.0.6-alpha#05d269a26d11c1ed8a6d917b3e08ff3b5d3d4b22" +source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.1.1#73241088333295db001818864a518b8c25896b5a" dependencies = [ "frame-benchmarking", "frame-support", @@ -9866,7 +9869,7 @@ dependencies = [ [[package]] name = "pallet-proofs-dealer-runtime-api" version = "0.1.0" -source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.0.6-alpha#05d269a26d11c1ed8a6d917b3e08ff3b5d3d4b22" +source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.1.1#73241088333295db001818864a518b8c25896b5a" dependencies = [ "parity-scale-codec", "scale-info", @@ -9888,7 +9891,7 @@ dependencies = [ [[package]] name = "pallet-randomness" version = "0.1.0" -source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.0.6-alpha#05d269a26d11c1ed8a6d917b3e08ff3b5d3d4b22" +source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.1.1#73241088333295db001818864a518b8c25896b5a" dependencies = [ "frame-benchmarking", "frame-support", @@ -10029,7 +10032,7 @@ dependencies = [ [[package]] name = "pallet-storage-providers" version = "0.1.0" -source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.0.6-alpha#05d269a26d11c1ed8a6d917b3e08ff3b5d3d4b22" +source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.1.1#73241088333295db001818864a518b8c25896b5a" dependencies = [ "frame-benchmarking", "frame-support", @@ -10051,7 +10054,7 @@ dependencies = [ [[package]] name = "pallet-storage-providers-runtime-api" version = "0.1.0" -source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.0.6-alpha#05d269a26d11c1ed8a6d917b3e08ff3b5d3d4b22" +source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.1.1#73241088333295db001818864a518b8c25896b5a" dependencies = [ "parity-scale-codec", "scale-info", @@ -15159,7 +15162,7 @@ dependencies = [ [[package]] name = "shc-actors-derive" version = "0.1.0" -source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.0.6-alpha#05d269a26d11c1ed8a6d917b3e08ff3b5d3d4b22" +source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.1.1#73241088333295db001818864a518b8c25896b5a" dependencies = [ "once_cell", "proc-macro2", @@ -15172,7 +15175,7 @@ dependencies = [ [[package]] name = "shc-actors-framework" version = "0.1.0" -source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.0.6-alpha#05d269a26d11c1ed8a6d917b3e08ff3b5d3d4b22" +source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.1.1#73241088333295db001818864a518b8c25896b5a" dependencies = [ "anyhow", "bincode", @@ -15190,7 +15193,7 @@ dependencies = [ [[package]] name = "shc-blockchain-service" version = "0.1.0" -source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.0.6-alpha#05d269a26d11c1ed8a6d917b3e08ff3b5d3d4b22" +source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.1.1#73241088333295db001818864a518b8c25896b5a" dependencies = [ "anyhow", "array-bytes", @@ -15218,6 +15221,7 @@ dependencies = [ "sc-network-types", "sc-service", "sc-tracing", + "sc-transaction-pool-api", "sc-utils", "serde", "serde_json", @@ -15241,7 +15245,7 @@ dependencies = [ [[package]] name = "shc-client" version = "0.1.0" -source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.0.6-alpha#05d269a26d11c1ed8a6d917b3e08ff3b5d3d4b22" +source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.1.1#73241088333295db001818864a518b8c25896b5a" dependencies = [ "anyhow", "array-bytes", @@ -15307,7 +15311,7 @@ dependencies = [ [[package]] name = "shc-common" version = "0.1.0" -source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.0.6-alpha#05d269a26d11c1ed8a6d917b3e08ff3b5d3d4b22" +source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.1.1#73241088333295db001818864a518b8c25896b5a" dependencies = [ "anyhow", "bigdecimal", @@ -15371,7 +15375,7 @@ dependencies = [ [[package]] name = "shc-file-manager" version = "0.1.0" -source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.0.6-alpha#05d269a26d11c1ed8a6d917b3e08ff3b5d3d4b22" +source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.1.1#73241088333295db001818864a518b8c25896b5a" dependencies = [ "bincode", "hash-db", @@ -15395,7 +15399,7 @@ dependencies = [ [[package]] name = "shc-file-transfer-service" version = "0.1.0" -source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.0.6-alpha#05d269a26d11c1ed8a6d917b3e08ff3b5d3d4b22" +source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.1.1#73241088333295db001818864a518b8c25896b5a" dependencies = [ "anyhow", "array-bytes", @@ -15424,7 +15428,7 @@ dependencies = [ [[package]] name = "shc-fisherman-service" version = "0.1.0" -source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.0.6-alpha#05d269a26d11c1ed8a6d917b3e08ff3b5d3d4b22" +source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.1.1#73241088333295db001818864a518b8c25896b5a" dependencies = [ "async-trait", "diesel", @@ -15454,7 +15458,7 @@ dependencies = [ [[package]] name = "shc-forest-manager" version = "0.1.0" -source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.0.6-alpha#05d269a26d11c1ed8a6d917b3e08ff3b5d3d4b22" +source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.1.1#73241088333295db001818864a518b8c25896b5a" dependencies = [ "async-trait", "bincode", @@ -15479,7 +15483,7 @@ dependencies = [ [[package]] name = "shc-indexer-db" version = "0.1.0" -source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.0.6-alpha#05d269a26d11c1ed8a6d917b3e08ff3b5d3d4b22" +source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.1.1#73241088333295db001818864a518b8c25896b5a" dependencies = [ "bigdecimal", "chrono", @@ -15507,7 +15511,7 @@ dependencies = [ [[package]] name = "shc-indexer-service" version = "0.1.0" -source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.0.6-alpha#05d269a26d11c1ed8a6d917b3e08ff3b5d3d4b22" +source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.1.1#73241088333295db001818864a518b8c25896b5a" dependencies = [ "anyhow", "array-bytes", @@ -15558,7 +15562,7 @@ dependencies = [ [[package]] name = "shc-rpc" version = "0.1.0" -source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.0.6-alpha#05d269a26d11c1ed8a6d917b3e08ff3b5d3d4b22" +source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.1.1#73241088333295db001818864a518b8c25896b5a" dependencies = [ "array-bytes", "async-trait", @@ -15609,7 +15613,7 @@ checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] name = "shp-constants" version = "0.1.0" -source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.0.6-alpha#05d269a26d11c1ed8a6d917b3e08ff3b5d3d4b22" +source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.1.1#73241088333295db001818864a518b8c25896b5a" dependencies = [ "sp-core", "sp-runtime", @@ -15618,7 +15622,7 @@ dependencies = [ [[package]] name = "shp-data-price-updater" version = "0.1.0" -source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.0.6-alpha#05d269a26d11c1ed8a6d917b3e08ff3b5d3d4b22" +source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.1.1#73241088333295db001818864a518b8c25896b5a" dependencies = [ "frame-support", "parity-scale-codec", @@ -15633,7 +15637,7 @@ dependencies = [ [[package]] name = "shp-file-key-verifier" version = "0.1.0" -source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.0.6-alpha#05d269a26d11c1ed8a6d917b3e08ff3b5d3d4b22" +source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.1.1#73241088333295db001818864a518b8c25896b5a" dependencies = [ "frame-support", "parity-scale-codec", @@ -15651,7 +15655,7 @@ dependencies = [ [[package]] name = "shp-file-metadata" version = "0.1.0" -source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.0.6-alpha#05d269a26d11c1ed8a6d917b3e08ff3b5d3d4b22" +source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.1.1#73241088333295db001818864a518b8c25896b5a" dependencies = [ "hex", "num-bigint", @@ -15667,7 +15671,7 @@ dependencies = [ [[package]] name = "shp-forest-verifier" version = "0.1.0" -source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.0.6-alpha#05d269a26d11c1ed8a6d917b3e08ff3b5d3d4b22" +source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.1.1#73241088333295db001818864a518b8c25896b5a" dependencies = [ "frame-support", "parity-scale-codec", @@ -15684,7 +15688,7 @@ dependencies = [ [[package]] name = "shp-opaque" version = "0.1.0" -source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.0.6-alpha#05d269a26d11c1ed8a6d917b3e08ff3b5d3d4b22" +source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.1.1#73241088333295db001818864a518b8c25896b5a" dependencies = [ "parachains-common", "sp-runtime", @@ -15693,7 +15697,7 @@ dependencies = [ [[package]] name = "shp-session-keys" version = "0.1.0" -source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.0.6-alpha#05d269a26d11c1ed8a6d917b3e08ff3b5d3d4b22" +source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.1.1#73241088333295db001818864a518b8c25896b5a" dependencies = [ "async-trait", "parity-scale-codec", @@ -15708,7 +15712,7 @@ dependencies = [ [[package]] name = "shp-traits" version = "0.1.0" -source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.0.6-alpha#05d269a26d11c1ed8a6d917b3e08ff3b5d3d4b22" +source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.1.1#73241088333295db001818864a518b8c25896b5a" dependencies = [ "frame-support", "parity-scale-codec", @@ -15722,7 +15726,7 @@ dependencies = [ [[package]] name = "shp-treasury-funding" version = "0.1.0" -source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.0.6-alpha#05d269a26d11c1ed8a6d917b3e08ff3b5d3d4b22" +source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.1.1#73241088333295db001818864a518b8c25896b5a" dependencies = [ "log", "shp-traits", @@ -15733,7 +15737,7 @@ dependencies = [ [[package]] name = "shp-types" version = "0.1.0" -source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.0.6-alpha#05d269a26d11c1ed8a6d917b3e08ff3b5d3d4b22" +source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.1.1#73241088333295db001818864a518b8c25896b5a" dependencies = [ "sp-core", "sp-runtime", diff --git a/operator/Cargo.toml b/operator/Cargo.toml index 1b5f6551..21c61287 100644 --- a/operator/Cargo.toml +++ b/operator/Cargo.toml @@ -27,11 +27,6 @@ datahaven-runtime-common = { path = "./runtime/common", default-features = false datahaven-stagenet-runtime = { path = "./runtime/stagenet", default-features = false } datahaven-testnet-runtime = { path = "./runtime/testnet", default-features = false } dhp-bridge = { path = "./primitives/bridge", default-features = false } -pallet-external-validators = { path = "./pallets/external-validators", default-features = false } -pallet-external-validators-rewards = { path = "./pallets/external-validators-rewards", default-features = false } -pallet-external-validators-rewards-runtime-api = { path = "./pallets/external-validators-rewards/runtime-api", default-features = false } -pallet-external-validator-slashes = { path = "./pallets/external-validator-slashes", default-features = false } -pallet-outbound-commitment-store = { path = "./pallets/outbound-commitment-store", default-features = false } pallet-datahaven-native-transfer = { path = "./pallets/datahaven-native-transfer", default-features = false } pallet-evm-precompile-balances-erc20 = { path = "./precompiles/erc20-balances", default-features = false } pallet-evm-precompile-batch = { path = "./precompiles/batch", default-features = false } @@ -43,6 +38,11 @@ pallet-evm-precompile-preimage = { path = "./precompiles/preimage", default-feat pallet-evm-precompile-proxy = { path = "./precompiles/proxy", default-features = false } pallet-evm-precompile-referenda = { path = "./precompiles/referenda", default-features = false } pallet-evm-precompile-registry = { path = "./precompiles/precompile-registry", default-features = false } +pallet-external-validator-slashes = { path = "./pallets/external-validator-slashes", default-features = false } +pallet-external-validators = { path = "./pallets/external-validators", default-features = false } +pallet-external-validators-rewards = { path = "./pallets/external-validators-rewards", default-features = false } +pallet-external-validators-rewards-runtime-api = { path = "./pallets/external-validators-rewards/runtime-api", default-features = false } +pallet-outbound-commitment-store = { path = "./pallets/outbound-commitment-store", default-features = false } # Crates.io (wasm) alloy-core = { version = "0.8.15", default-features = false } @@ -64,6 +64,7 @@ hex = { version = "0.4.3", default-features = false } hex-literal = { version = "0.3.4" } impl-serde = { version = "0.5.0", default-features = false } impl-trait-for-tuples = { version = "0.2.2" } +itoa = { version = "1.0" } jsonrpsee = { version = "0.24.3" } libsecp256k1 = { version = "0.7", default-features = false } log = { version = "0.4.25" } @@ -264,43 +265,43 @@ 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.0.6-alpha", default-features = false } -pallet-cr-randomness = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.0.6-alpha", default-features = false } -pallet-file-system = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.0.6-alpha", default-features = false } -pallet-file-system-runtime-api = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.0.6-alpha", default-features = false } -pallet-payment-streams = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.0.6-alpha", default-features = false } -pallet-payment-streams-runtime-api = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.0.6-alpha", default-features = false } -pallet-proofs-dealer = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.0.6-alpha", default-features = false } -pallet-proofs-dealer-runtime-api = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.0.6-alpha", default-features = false } -pallet-randomness = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.0.6-alpha", default-features = false } -pallet-storage-providers = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.0.6-alpha", default-features = false } -pallet-storage-providers-runtime-api = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.0.6-alpha", default-features = false } -shp-constants = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.0.6-alpha", default-features = false } -shp-data-price-updater = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.0.6-alpha", default-features = false } -shp-file-key-verifier = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.0.6-alpha", default-features = false } -shp-file-metadata = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.0.6-alpha", default-features = false } -shp-forest-verifier = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.0.6-alpha", default-features = false } -shp-traits = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.0.6-alpha", default-features = false } -shp-treasury-funding = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.0.6-alpha", default-features = false } -storage-hub-runtime = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.0.6-alpha", default-features = false } +pallet-bucket-nfts = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.1.1", default-features = false } +pallet-cr-randomness = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.1.1", default-features = false } +pallet-file-system = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.1.1", default-features = false } +pallet-file-system-runtime-api = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.1.1", default-features = false } +pallet-payment-streams = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.1.1", default-features = false } +pallet-payment-streams-runtime-api = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.1.1", default-features = false } +pallet-proofs-dealer = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.1.1", default-features = false } +pallet-proofs-dealer-runtime-api = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.1.1", default-features = false } +pallet-randomness = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.1.1", default-features = false } +pallet-storage-providers = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.1.1", default-features = false } +pallet-storage-providers-runtime-api = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.1.1", default-features = false } +shp-constants = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.1.1", default-features = false } +shp-data-price-updater = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.1.1", default-features = false } +shp-file-key-verifier = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.1.1", default-features = false } +shp-file-metadata = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.1.1", default-features = false } +shp-forest-verifier = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.1.1", default-features = false } +shp-traits = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.1.1", default-features = false } +shp-treasury-funding = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.1.1", default-features = false } +storage-hub-runtime = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.1.1", default-features = false } ## Client cumulus-client-service = { git = "https://github.com/paritytech/polkadot-sdk.git", tag = "polkadot-stable2412-6", default-features = false } -shc-actors-derive = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.0.6-alpha", default-features = false } -shc-actors-framework = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.0.6-alpha", default-features = false } -shc-blockchain-service = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.0.6-alpha", default-features = false } -shc-client = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.0.6-alpha", default-features = false } -shc-common = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.0.6-alpha", default-features = false } -shc-file-manager = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.0.6-alpha", default-features = false } -shc-file-transfer-service = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.0.6-alpha", default-features = false } -shc-fisherman-service = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.0.6-alpha", default-features = false } -shc-forest-manager = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.0.6-alpha", default-features = false } -shc-indexer-db = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.0.6-alpha", default-features = false } -shc-indexer-service = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.0.6-alpha", default-features = false } -shc-rpc = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.0.6-alpha", default-features = false } -shp-opaque = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.0.6-alpha", default-features = false } -shp-types = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.0.6-alpha", default-features = false } +shc-actors-derive = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.1.1", default-features = false } +shc-actors-framework = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.1.1", default-features = false } +shc-blockchain-service = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.1.1", default-features = false } +shc-client = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.1.1", default-features = false } +shc-common = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.1.1", default-features = false } +shc-file-manager = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.1.1", default-features = false } +shc-file-transfer-service = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.1.1", default-features = false } +shc-fisherman-service = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.1.1", default-features = false } +shc-forest-manager = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.1.1", default-features = false } +shc-indexer-db = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.1.1", default-features = false } +shc-indexer-service = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.1.1", default-features = false } +shc-rpc = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.1.1", default-features = false } +shp-opaque = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.1.1", default-features = false } +shp-types = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.1.1", default-features = false } ## Precompiles -pallet-evm-precompile-file-system = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.0.6-alpha", default-features = false } +pallet-evm-precompile-file-system = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.1.1", default-features = false } # The list of dependencies below (which can be both direct and indirect dependencies) are crates # that are suspected to be CPU-intensive, and that are unlikely to require debugging (as some of diff --git a/operator/node/src/cli.rs b/operator/node/src/cli.rs index 5cca9cde..cd7bf3fb 100644 --- a/operator/node/src/cli.rs +++ b/operator/node/src/cli.rs @@ -600,6 +600,19 @@ pub struct FishermanConfigurations { required_if_eq("fisherman", "true") )] pub fisherman_database_url: Option, + + /// Maximum number of incomplete storage requests to process after the first block processed coming out of syncing mode. + #[arg(long, value_name = "COUNT", default_value = "10000", value_parser = clap::value_parser!(u32).range(1..))] + pub fisherman_incomplete_sync_max: u32, + + /// Page size for incomplete storage request pagination. + /// Must be at least 1. + #[arg(long, value_name = "SIZE", default_value = "256", value_parser = clap::value_parser!(u32).range(1..))] + pub fisherman_incomplete_sync_page_size: u32, + + /// The minimum number of blocks between the last processed block and the current best block to consider the fisherman out of sync. + #[arg(long, default_value = "5")] + pub fisherman_sync_mode_min_blocks_behind: u32, } impl FishermanConfigurations { @@ -610,6 +623,9 @@ impl FishermanConfigurations { .fisherman_database_url .clone() .expect("Fisherman database URL is required"), + incomplete_sync_max: self.fisherman_incomplete_sync_max, + incomplete_sync_page_size: self.fisherman_incomplete_sync_page_size, + sync_mode_min_blocks_behind: self.fisherman_sync_mode_min_blocks_behind, maintenance_mode: false, // Skipping maintenance mode for now }) } else { diff --git a/operator/node/src/service.rs b/operator/node/src/service.rs index fe191f4f..7f3316a2 100644 --- a/operator/node/src/service.rs +++ b/operator/node/src/service.rs @@ -1246,7 +1246,9 @@ async fn configure_and_spawn_fisherman( fisherman_builder.with_indexer_db_pool(Some(db_pool.clone())); // Spawn the fisherman service - fisherman_builder.with_fisherman(client.clone()).await; + fisherman_builder + .with_fisherman(client.clone(), &fisherman_options) + .await; // All variables below are not needed for the fisherman service to operate but required by the StorageHubHandler // TODO: Refactor this once we have a proper setup to support role based StorageHubHandler builder diff --git a/operator/runtime/mainnet/Cargo.toml b/operator/runtime/mainnet/Cargo.toml index b65b736b..30c2d90a 100644 --- a/operator/runtime/mainnet/Cargo.toml +++ b/operator/runtime/mainnet/Cargo.toml @@ -27,11 +27,11 @@ frame-metadata-hash-extension = { workspace = true } frame-support = { workspace = true, features = ["experimental"] } frame-system = { workspace = true } frame-system-benchmarking = { workspace = true, optional = true } -pallet-session-benchmarking = { workspace = true, optional = true } frame-system-rpc-runtime-api = { workspace = true } frame-try-runtime = { workspace = true, optional = true } hex = { workspace = true } hex-literal = { workspace = true } +itoa = { workspace = true } log = { workspace = true } num-bigint = { workspace = true } num_enum = { workspace = true } @@ -42,6 +42,7 @@ pallet-beefy = { workspace = true } pallet-beefy-mmr = { workspace = true } pallet-collective = { workspace = true } pallet-conviction-voting = { workspace = true } +pallet-datahaven-native-transfer = { workspace = true } pallet-ethereum = { workspace = true, features = ["forbid-evm-reentrancy"] } pallet-evm = { workspace = true, features = ["forbid-evm-reentrancy"] } pallet-evm-chain-id = { workspace = true } @@ -50,10 +51,10 @@ pallet-evm-precompile-bn128 = { workspace = true } pallet-evm-precompile-modexp = { workspace = true } pallet-evm-precompile-sha3fips = { workspace = true } pallet-evm-precompile-simple = { workspace = true } +pallet-external-validator-slashes = { workspace = true } pallet-external-validators = { workspace = true } pallet-external-validators-rewards = { workspace = true } pallet-external-validators-rewards-runtime-api = { workspace = true } -pallet-external-validator-slashes = { workspace = true } pallet-grandpa = { workspace = true } pallet-identity = { workspace = true } pallet-im-online = { workspace = true } @@ -63,20 +64,20 @@ pallet-mmr = { workspace = true } pallet-multisig = { workspace = true } pallet-offences = { workspace = true } pallet-outbound-commitment-store = { workspace = true } -pallet-datahaven-native-transfer = { workspace = true } pallet-parameters = { workspace = true } pallet-preimage = { workspace = true } -pallet-safe-mode = { workspace = true } -pallet-tx-pause = { workspace = true } pallet-proxy = { workspace = true } pallet-referenda = { workspace = true } +pallet-safe-mode = { workspace = true } pallet-scheduler = { workspace = true } pallet-session = { workspace = true } +pallet-session-benchmarking = { workspace = true, optional = true } pallet-sudo = { workspace = true } pallet-timestamp = { workspace = true } pallet-transaction-payment = { workspace = true } pallet-transaction-payment-rpc-runtime-api = { workspace = true } pallet-treasury = { workspace = true } +pallet-tx-pause = { workspace = true } pallet-utility = { workspace = true } pallet-whitelist = { workspace = true } polkadot-primitives = { workspace = true } @@ -118,11 +119,11 @@ sp-std = { workspace = true } sp-storage = { workspace = true } sp-transaction-pool = { workspace = true } sp-version = { workspace = true, features = ["serde"] } +strum = { workspace = true } +strum_macros = { workspace = true } xcm = { workspace = true } xcm-builder = { workspace = true } xcm-executor = { workspace = true } -strum = { workspace = true } -strum_macros = { workspace = true } # DataHaven precompiles pallet-evm-precompile-balances-erc20 = { workspace = true } @@ -138,10 +139,11 @@ pallet-evm-precompile-registry = { workspace = true } # StorageHub pallet-bucket-nfts = { workspace = true } -pallet-nfts = { workspace = true } pallet-cr-randomness = { workspace = true } +pallet-evm-precompile-file-system = { workspace = true } pallet-file-system = { workspace = true } pallet-file-system-runtime-api = { workspace = true } +pallet-nfts = { workspace = true } pallet-payment-streams = { workspace = true } pallet-payment-streams-runtime-api = { workspace = true } pallet-proofs-dealer = { workspace = true } @@ -151,14 +153,13 @@ pallet-storage-providers = { workspace = true } pallet-storage-providers-runtime-api = { workspace = true } shc-common = { workspace = true, optional = true } shp-constants = { workspace = true } +shp-data-price-updater = { workspace = true } +shp-file-key-verifier = { workspace = true } shp-file-metadata = { workspace = true } +shp-forest-verifier = { workspace = true } shp-traits = { workspace = true } shp-treasury-funding = { workspace = true } -shp-forest-verifier = { workspace = true } -shp-file-key-verifier = { workspace = true } -shp-data-price-updater = { workspace = true } sp-trie = { workspace = true } -pallet-evm-precompile-file-system = { workspace = true } [build-dependencies] substrate-wasm-builder = { workspace = true, optional = true, default-features = true } @@ -173,9 +174,9 @@ precompile-utils = { workspace = true, features = ["std", "testing"] } # Snowbridge testing snowbridge-core = { workspace = true } +snowbridge-outbound-queue-primitives = { workspace = true } snowbridge-pallet-system = { workspace = true } snowbridge-pallet-system-v2 = { workspace = true } -snowbridge-outbound-queue-primitives = { workspace = true } [features] default = ["std"] diff --git a/operator/runtime/mainnet/src/configs/storagehub/mod.rs b/operator/runtime/mainnet/src/configs/storagehub/mod.rs index ff265f5d..72d42735 100644 --- a/operator/runtime/mainnet/src/configs/storagehub/mod.rs +++ b/operator/runtime/mainnet/src/configs/storagehub/mod.rs @@ -37,7 +37,7 @@ use sp_runtime::traits::Zero; use sp_runtime::SaturatedConversion; use sp_runtime::{traits::BlakeTwo256, Perbill}; use sp_std::convert::{From, Into}; -use sp_std::vec; +use sp_std::{vec, vec::Vec}; use sp_trie::{LayoutV1, TrieConfiguration, TrieLayout}; #[cfg(feature = "std")] @@ -450,6 +450,25 @@ parameter_types! { pub const FileSystemFileDeletionRequestHoldReason: RuntimeHoldReason = RuntimeHoldReason::FileSystem(pallet_file_system::HoldReason::FileDeletionRequestHold); } +// Converts a given signed message in a EIP-191 compliant message bytes to verify. +/// EIP-191: https://eips.ethereum.org/EIPS/eip-191 +/// "\x19Ethereum Signed Message:\n" + len(message) + message" +pub struct Eip191Adapter; +impl shp_traits::MessageAdapter for Eip191Adapter { + fn bytes_to_verify(message: &[u8]) -> Vec { + const PREFIX: &str = "\x19Ethereum Signed Message:\n"; + let len = message.len(); + let mut len_string_buffer = itoa::Buffer::new(); + let len_string = len_string_buffer.format(len); + + let mut eth_message = Vec::with_capacity(PREFIX.len() + len_string.len() + len); + eth_message.extend_from_slice(PREFIX.as_bytes()); + eth_message.extend_from_slice(len_string.as_bytes()); + eth_message.extend_from_slice(message); + eth_message + } +} + impl pallet_file_system::Config for Runtime { type RuntimeEvent = RuntimeEvent; type WeightInfo = pallet_file_system::weights::SubstrateWeight; @@ -501,6 +520,8 @@ impl pallet_file_system::Config for Runtime { type TickRangeToMaximumThreshold = runtime_config::TickRangeToMaximumThreshold; type OffchainSignature = Signature; type OffchainPublicKey = ::Signer; + type MaxFileDeletionsPerExtrinsic = ConstU32<100>; + type IntentionMsgAdapter = Eip191Adapter; } impl MostlyStablePriceIndexUpdaterConfig for Runtime { diff --git a/operator/runtime/mainnet/src/lib.rs b/operator/runtime/mainnet/src/lib.rs index 5dfb795d..ee307e30 100644 --- a/operator/runtime/mainnet/src/lib.rs +++ b/operator/runtime/mainnet/src/lib.rs @@ -1245,6 +1245,9 @@ impl_runtime_apis! { fn query_incomplete_storage_request_metadata(file_key: H256) -> Result, StorageDataUnit, H256, BackupStorageProviderId>, QueryIncompleteStorageRequestMetadataError> { FileSystem::query_incomplete_storage_request_metadata(file_key) } + fn list_incomplete_storage_request_keys(start_after: Option, limit: u32) -> Vec { + FileSystem::list_incomplete_storage_request_keys(start_after, limit) + } } impl pallet_payment_streams_runtime_api::PaymentStreamsApi, Balance, AccountId> for Runtime { diff --git a/operator/runtime/stagenet/Cargo.toml b/operator/runtime/stagenet/Cargo.toml index 9e31449c..9cee50bc 100644 --- a/operator/runtime/stagenet/Cargo.toml +++ b/operator/runtime/stagenet/Cargo.toml @@ -27,11 +27,11 @@ frame-metadata-hash-extension = { workspace = true } frame-support = { workspace = true, features = ["experimental"] } frame-system = { workspace = true } frame-system-benchmarking = { workspace = true, optional = true } -pallet-session-benchmarking = { workspace = true, optional = true } frame-system-rpc-runtime-api = { workspace = true } frame-try-runtime = { workspace = true, optional = true } hex = { workspace = true } hex-literal = { workspace = true } +itoa = { workspace = true } log = { workspace = true } num-bigint = { workspace = true } num_enum = { workspace = true } @@ -42,6 +42,7 @@ pallet-beefy = { workspace = true } pallet-beefy-mmr = { workspace = true } pallet-collective = { workspace = true } pallet-conviction-voting = { workspace = true } +pallet-datahaven-native-transfer = { workspace = true } pallet-ethereum = { workspace = true, features = ["forbid-evm-reentrancy"] } pallet-evm = { workspace = true, features = ["forbid-evm-reentrancy"] } pallet-evm-chain-id = { workspace = true } @@ -50,10 +51,10 @@ pallet-evm-precompile-bn128 = { workspace = true } pallet-evm-precompile-modexp = { workspace = true } pallet-evm-precompile-sha3fips = { workspace = true } pallet-evm-precompile-simple = { workspace = true } +pallet-external-validator-slashes = { workspace = true } pallet-external-validators = { workspace = true } pallet-external-validators-rewards = { workspace = true } pallet-external-validators-rewards-runtime-api = { workspace = true } -pallet-external-validator-slashes = { workspace = true } pallet-grandpa = { workspace = true } pallet-identity = { workspace = true } pallet-im-online = { workspace = true } @@ -63,20 +64,20 @@ pallet-mmr = { workspace = true } pallet-multisig = { workspace = true } pallet-offences = { workspace = true } pallet-outbound-commitment-store = { workspace = true } -pallet-datahaven-native-transfer = { workspace = true } pallet-parameters = { workspace = true } pallet-preimage = { workspace = true } -pallet-safe-mode = { workspace = true } -pallet-tx-pause = { workspace = true } pallet-proxy = { workspace = true } pallet-referenda = { workspace = true } +pallet-safe-mode = { workspace = true } pallet-scheduler = { workspace = true } pallet-session = { workspace = true } +pallet-session-benchmarking = { workspace = true, optional = true } pallet-sudo = { workspace = true } pallet-timestamp = { workspace = true } pallet-transaction-payment = { workspace = true } pallet-transaction-payment-rpc-runtime-api = { workspace = true } pallet-treasury = { workspace = true } +pallet-tx-pause = { workspace = true } pallet-utility = { workspace = true } pallet-whitelist = { workspace = true } polkadot-primitives = { workspace = true } @@ -128,20 +129,21 @@ xcm-executor = { workspace = true } pallet-evm-precompile-balances-erc20 = { workspace = true } pallet-evm-precompile-batch = { workspace = true } pallet-evm-precompile-call-permit = { workspace = true } -pallet-evm-precompile-preimage = { workspace = true } pallet-evm-precompile-collective = { workspace = true } pallet-evm-precompile-conviction-voting = { workspace = true } pallet-evm-precompile-identity = { workspace = true } +pallet-evm-precompile-preimage = { workspace = true } pallet-evm-precompile-proxy = { workspace = true } pallet-evm-precompile-referenda = { workspace = true } pallet-evm-precompile-registry = { workspace = true } # StorageHub pallet-bucket-nfts = { workspace = true } -pallet-nfts = { workspace = true } pallet-cr-randomness = { workspace = true } +pallet-evm-precompile-file-system = { workspace = true } pallet-file-system = { workspace = true } pallet-file-system-runtime-api = { workspace = true } +pallet-nfts = { workspace = true } pallet-payment-streams = { workspace = true } pallet-payment-streams-runtime-api = { workspace = true } pallet-proofs-dealer = { workspace = true } @@ -151,14 +153,13 @@ pallet-storage-providers = { workspace = true } pallet-storage-providers-runtime-api = { workspace = true } shc-common = { workspace = true, optional = true } shp-constants = { workspace = true } +shp-data-price-updater = { workspace = true } +shp-file-key-verifier = { workspace = true } shp-file-metadata = { workspace = true } +shp-forest-verifier = { workspace = true } shp-traits = { workspace = true } shp-treasury-funding = { workspace = true } -shp-forest-verifier = { workspace = true } -shp-file-key-verifier = { workspace = true } -shp-data-price-updater = { workspace = true } sp-trie = { workspace = true } -pallet-evm-precompile-file-system = { workspace = true } [build-dependencies] substrate-wasm-builder = { workspace = true, optional = true, default-features = true } @@ -173,9 +174,9 @@ precompile-utils = { workspace = true, features = ["std", "testing"] } # Snowbridge testing snowbridge-core = { workspace = true } +snowbridge-outbound-queue-primitives = { workspace = true } snowbridge-pallet-system = { workspace = true } snowbridge-pallet-system-v2 = { workspace = true } -snowbridge-outbound-queue-primitives = { workspace = true } [features] default = ["std"] diff --git a/operator/runtime/stagenet/src/configs/storagehub/mod.rs b/operator/runtime/stagenet/src/configs/storagehub/mod.rs index ff265f5d..72d42735 100644 --- a/operator/runtime/stagenet/src/configs/storagehub/mod.rs +++ b/operator/runtime/stagenet/src/configs/storagehub/mod.rs @@ -37,7 +37,7 @@ use sp_runtime::traits::Zero; use sp_runtime::SaturatedConversion; use sp_runtime::{traits::BlakeTwo256, Perbill}; use sp_std::convert::{From, Into}; -use sp_std::vec; +use sp_std::{vec, vec::Vec}; use sp_trie::{LayoutV1, TrieConfiguration, TrieLayout}; #[cfg(feature = "std")] @@ -450,6 +450,25 @@ parameter_types! { pub const FileSystemFileDeletionRequestHoldReason: RuntimeHoldReason = RuntimeHoldReason::FileSystem(pallet_file_system::HoldReason::FileDeletionRequestHold); } +// Converts a given signed message in a EIP-191 compliant message bytes to verify. +/// EIP-191: https://eips.ethereum.org/EIPS/eip-191 +/// "\x19Ethereum Signed Message:\n" + len(message) + message" +pub struct Eip191Adapter; +impl shp_traits::MessageAdapter for Eip191Adapter { + fn bytes_to_verify(message: &[u8]) -> Vec { + const PREFIX: &str = "\x19Ethereum Signed Message:\n"; + let len = message.len(); + let mut len_string_buffer = itoa::Buffer::new(); + let len_string = len_string_buffer.format(len); + + let mut eth_message = Vec::with_capacity(PREFIX.len() + len_string.len() + len); + eth_message.extend_from_slice(PREFIX.as_bytes()); + eth_message.extend_from_slice(len_string.as_bytes()); + eth_message.extend_from_slice(message); + eth_message + } +} + impl pallet_file_system::Config for Runtime { type RuntimeEvent = RuntimeEvent; type WeightInfo = pallet_file_system::weights::SubstrateWeight; @@ -501,6 +520,8 @@ impl pallet_file_system::Config for Runtime { type TickRangeToMaximumThreshold = runtime_config::TickRangeToMaximumThreshold; type OffchainSignature = Signature; type OffchainPublicKey = ::Signer; + type MaxFileDeletionsPerExtrinsic = ConstU32<100>; + type IntentionMsgAdapter = Eip191Adapter; } impl MostlyStablePriceIndexUpdaterConfig for Runtime { diff --git a/operator/runtime/stagenet/src/lib.rs b/operator/runtime/stagenet/src/lib.rs index 69878dd2..371b9c65 100644 --- a/operator/runtime/stagenet/src/lib.rs +++ b/operator/runtime/stagenet/src/lib.rs @@ -1248,6 +1248,9 @@ impl_runtime_apis! { fn query_incomplete_storage_request_metadata(file_key: H256) -> Result, StorageDataUnit, H256, BackupStorageProviderId>, QueryIncompleteStorageRequestMetadataError> { FileSystem::query_incomplete_storage_request_metadata(file_key) } + fn list_incomplete_storage_request_keys(start_after: Option, limit: u32) -> Vec { + FileSystem::list_incomplete_storage_request_keys(start_after, limit) + } } impl pallet_payment_streams_runtime_api::PaymentStreamsApi, Balance, AccountId> for Runtime { diff --git a/operator/runtime/testnet/Cargo.toml b/operator/runtime/testnet/Cargo.toml index f88dbd1b..9e08f53a 100644 --- a/operator/runtime/testnet/Cargo.toml +++ b/operator/runtime/testnet/Cargo.toml @@ -27,11 +27,11 @@ frame-metadata-hash-extension = { workspace = true } frame-support = { workspace = true, features = ["experimental"] } frame-system = { workspace = true } frame-system-benchmarking = { workspace = true, optional = true } -pallet-session-benchmarking = { workspace = true, optional = true } frame-system-rpc-runtime-api = { workspace = true } frame-try-runtime = { workspace = true, optional = true } hex = { workspace = true } hex-literal = { workspace = true } +itoa = { workspace = true } log = { workspace = true } num-bigint = { workspace = true } num_enum = { workspace = true } @@ -52,10 +52,10 @@ pallet-evm-precompile-conviction-voting = { workspace = true } pallet-evm-precompile-modexp = { workspace = true } pallet-evm-precompile-sha3fips = { workspace = true } pallet-evm-precompile-simple = { workspace = true } +pallet-external-validator-slashes = { workspace = true } pallet-external-validators = { workspace = true } pallet-external-validators-rewards = { workspace = true } pallet-external-validators-rewards-runtime-api = { workspace = true } -pallet-external-validator-slashes = { workspace = true } pallet-grandpa = { workspace = true } pallet-identity = { workspace = true } pallet-im-online = { workspace = true } @@ -67,17 +67,18 @@ pallet-offences = { workspace = true } pallet-outbound-commitment-store = { workspace = true } pallet-parameters = { workspace = true } pallet-preimage = { workspace = true } -pallet-safe-mode = { workspace = true } -pallet-tx-pause = { workspace = true } pallet-proxy = { workspace = true } pallet-referenda = { workspace = true } +pallet-safe-mode = { workspace = true } pallet-scheduler = { workspace = true } pallet-session = { workspace = true } +pallet-session-benchmarking = { workspace = true, optional = true } pallet-sudo = { workspace = true } pallet-timestamp = { workspace = true } pallet-transaction-payment = { workspace = true } pallet-transaction-payment-rpc-runtime-api = { workspace = true } pallet-treasury = { workspace = true } +pallet-tx-pause = { workspace = true } pallet-utility = { workspace = true } pallet-whitelist = { workspace = true } polkadot-primitives = { workspace = true } @@ -119,29 +120,30 @@ sp-std = { workspace = true } sp-storage = { workspace = true } sp-transaction-pool = { workspace = true } sp-version = { workspace = true, features = ["serde"] } +strum = { workspace = true } +strum_macros = { workspace = true } xcm = { workspace = true } xcm-builder = { workspace = true } xcm-executor = { workspace = true } -strum = { workspace = true } -strum_macros = { workspace = true } # DataHaven precompiles pallet-evm-precompile-balances-erc20 = { workspace = true } pallet-evm-precompile-batch = { workspace = true } pallet-evm-precompile-call-permit = { workspace = true } -pallet-evm-precompile-preimage = { workspace = true } pallet-evm-precompile-collective = { workspace = true } pallet-evm-precompile-identity = { workspace = true } +pallet-evm-precompile-preimage = { workspace = true } pallet-evm-precompile-proxy = { workspace = true } pallet-evm-precompile-referenda = { workspace = true } pallet-evm-precompile-registry = { workspace = true } # StorageHub pallet-bucket-nfts = { workspace = true } -pallet-nfts = { workspace = true } pallet-cr-randomness = { workspace = true } +pallet-evm-precompile-file-system = { workspace = true } pallet-file-system = { workspace = true } pallet-file-system-runtime-api = { workspace = true } +pallet-nfts = { workspace = true } pallet-payment-streams = { workspace = true } pallet-payment-streams-runtime-api = { workspace = true } pallet-proofs-dealer = { workspace = true } @@ -151,14 +153,13 @@ pallet-storage-providers = { workspace = true } pallet-storage-providers-runtime-api = { workspace = true } shc-common = { workspace = true, optional = true } shp-constants = { workspace = true } +shp-data-price-updater = { workspace = true } +shp-file-key-verifier = { workspace = true } shp-file-metadata = { workspace = true } +shp-forest-verifier = { workspace = true } shp-traits = { workspace = true } shp-treasury-funding = { workspace = true } -shp-forest-verifier = { workspace = true } -shp-file-key-verifier = { workspace = true } -shp-data-price-updater = { workspace = true } sp-trie = { workspace = true } -pallet-evm-precompile-file-system = { workspace = true } [build-dependencies] substrate-wasm-builder = { workspace = true, optional = true, default-features = true } diff --git a/operator/runtime/testnet/src/configs/storagehub/mod.rs b/operator/runtime/testnet/src/configs/storagehub/mod.rs index ff265f5d..72d42735 100644 --- a/operator/runtime/testnet/src/configs/storagehub/mod.rs +++ b/operator/runtime/testnet/src/configs/storagehub/mod.rs @@ -37,7 +37,7 @@ use sp_runtime::traits::Zero; use sp_runtime::SaturatedConversion; use sp_runtime::{traits::BlakeTwo256, Perbill}; use sp_std::convert::{From, Into}; -use sp_std::vec; +use sp_std::{vec, vec::Vec}; use sp_trie::{LayoutV1, TrieConfiguration, TrieLayout}; #[cfg(feature = "std")] @@ -450,6 +450,25 @@ parameter_types! { pub const FileSystemFileDeletionRequestHoldReason: RuntimeHoldReason = RuntimeHoldReason::FileSystem(pallet_file_system::HoldReason::FileDeletionRequestHold); } +// Converts a given signed message in a EIP-191 compliant message bytes to verify. +/// EIP-191: https://eips.ethereum.org/EIPS/eip-191 +/// "\x19Ethereum Signed Message:\n" + len(message) + message" +pub struct Eip191Adapter; +impl shp_traits::MessageAdapter for Eip191Adapter { + fn bytes_to_verify(message: &[u8]) -> Vec { + const PREFIX: &str = "\x19Ethereum Signed Message:\n"; + let len = message.len(); + let mut len_string_buffer = itoa::Buffer::new(); + let len_string = len_string_buffer.format(len); + + let mut eth_message = Vec::with_capacity(PREFIX.len() + len_string.len() + len); + eth_message.extend_from_slice(PREFIX.as_bytes()); + eth_message.extend_from_slice(len_string.as_bytes()); + eth_message.extend_from_slice(message); + eth_message + } +} + impl pallet_file_system::Config for Runtime { type RuntimeEvent = RuntimeEvent; type WeightInfo = pallet_file_system::weights::SubstrateWeight; @@ -501,6 +520,8 @@ impl pallet_file_system::Config for Runtime { type TickRangeToMaximumThreshold = runtime_config::TickRangeToMaximumThreshold; type OffchainSignature = Signature; type OffchainPublicKey = ::Signer; + type MaxFileDeletionsPerExtrinsic = ConstU32<100>; + type IntentionMsgAdapter = Eip191Adapter; } impl MostlyStablePriceIndexUpdaterConfig for Runtime { diff --git a/operator/runtime/testnet/src/lib.rs b/operator/runtime/testnet/src/lib.rs index c20bea53..6904b82d 100644 --- a/operator/runtime/testnet/src/lib.rs +++ b/operator/runtime/testnet/src/lib.rs @@ -1244,6 +1244,9 @@ impl_runtime_apis! { fn query_incomplete_storage_request_metadata(file_key: H256) -> Result, StorageDataUnit, H256, BackupStorageProviderId>, QueryIncompleteStorageRequestMetadataError> { FileSystem::query_incomplete_storage_request_metadata(file_key) } + fn list_incomplete_storage_request_keys(start_after: Option, limit: u32) -> Vec { + FileSystem::list_incomplete_storage_request_keys(start_after, limit) + } } impl pallet_payment_streams_runtime_api::PaymentStreamsApi, Balance, AccountId> for Runtime { diff --git a/test/.papi/descriptors/package.json b/test/.papi/descriptors/package.json index f91b756b..0e2e9888 100644 --- a/test/.papi/descriptors/package.json +++ b/test/.papi/descriptors/package.json @@ -1,5 +1,5 @@ { - "version": "0.1.0-autogenerated.2256885919410986602", + "version": "0.1.0-autogenerated.40127769317338577", "name": "@polkadot-api/descriptors", "files": [ "dist" diff --git a/test/.papi/metadata/datahaven.scale b/test/.papi/metadata/datahaven.scale index bbf4e26cdc5ebb9184e3728c106237381ba092ac..9668885dd2aace10ccc17306a55632a01840f3cb 100644 GIT binary patch delta 16392 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 aZ@;To3iv(CdL`SEja#To~x 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 JERFM#{vQ#a>T>`9