diff --git a/Cargo.lock b/Cargo.lock
index 461c255c..46235361 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -335,6 +335,17 @@ version = "0.7.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50"
+[[package]]
+name = "async-channel"
+version = "1.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35"
+dependencies = [
+ "concurrent-queue",
+ "event-listener 2.5.3",
+ "futures-core",
+]
+
[[package]]
name = "async-channel"
version = "2.5.0"
@@ -355,21 +366,53 @@ checksum = "c96bf972d85afc50bf5ab8fe2d54d1586b4e0b46c97c50a0c9e71e2f7bcd812a"
dependencies = [
"async-task",
"concurrent-queue",
- "fastrand",
- "futures-lite",
+ "fastrand 2.3.0",
+ "futures-lite 2.6.1",
"pin-project-lite",
"slab",
]
+[[package]]
+name = "async-fs"
+version = "1.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "279cf904654eeebfa37ac9bb1598880884924aab82e290aa65c9e77a0e142e06"
+dependencies = [
+ "async-lock 2.8.0",
+ "autocfg",
+ "blocking",
+ "futures-lite 1.13.0",
+]
+
[[package]]
name = "async-fs"
version = "2.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8034a681df4aed8b8edbd7fbe472401ecf009251c8b40556b304567052e294c5"
dependencies = [
- "async-lock",
+ "async-lock 3.4.2",
"blocking",
- "futures-lite",
+ "futures-lite 2.6.1",
+]
+
+[[package]]
+name = "async-io"
+version = "1.13.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0fc5b45d93ef0529756f812ca52e44c221b35341892d3dcc34132ac02f3dd2af"
+dependencies = [
+ "async-lock 2.8.0",
+ "autocfg",
+ "cfg-if",
+ "concurrent-queue",
+ "futures-lite 1.13.0",
+ "log",
+ "parking",
+ "polling 2.8.0",
+ "rustix 0.37.28",
+ "slab",
+ "socket2 0.4.10",
+ "waker-fn",
]
[[package]]
@@ -382,14 +425,23 @@ dependencies = [
"cfg-if",
"concurrent-queue",
"futures-io",
- "futures-lite",
+ "futures-lite 2.6.1",
"parking",
- "polling",
+ "polling 3.11.0",
"rustix 1.1.3",
"slab",
"windows-sys 0.61.2",
]
+[[package]]
+name = "async-lock"
+version = "2.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "287272293e9d8c41773cec55e365490fe034813a2f172f502d6ddcf75b2f582b"
+dependencies = [
+ "event-listener 2.5.3",
+]
+
[[package]]
name = "async-lock"
version = "3.4.2"
@@ -401,15 +453,43 @@ dependencies = [
"pin-project-lite",
]
+[[package]]
+name = "async-net"
+version = "1.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0434b1ed18ce1cf5769b8ac540e33f01fa9471058b5e89da9e06f3c882a8c12f"
+dependencies = [
+ "async-io 1.13.0",
+ "blocking",
+ "futures-lite 1.13.0",
+]
+
[[package]]
name = "async-net"
version = "2.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b948000fad4873c1c9339d60f2623323a0cfd3816e5181033c6a5cb68b2accf7"
dependencies = [
- "async-io",
+ "async-io 2.6.0",
+ "blocking",
+ "futures-lite 2.6.1",
+]
+
+[[package]]
+name = "async-process"
+version = "1.8.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ea6438ba0a08d81529c69b36700fa2f95837bfe3e776ab39cde9c14d9149da88"
+dependencies = [
+ "async-io 1.13.0",
+ "async-lock 2.8.0",
+ "async-signal",
"blocking",
- "futures-lite",
+ "cfg-if",
+ "event-listener 3.1.0",
+ "futures-lite 1.13.0",
+ "rustix 0.38.44",
+ "windows-sys 0.48.0",
]
[[package]]
@@ -418,15 +498,15 @@ version = "2.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fc50921ec0055cdd8a16de48773bfeec5c972598674347252c0399676be7da75"
dependencies = [
- "async-channel",
- "async-io",
- "async-lock",
+ "async-channel 2.5.0",
+ "async-io 2.6.0",
+ "async-lock 3.4.2",
"async-signal",
"async-task",
"blocking",
"cfg-if",
"event-listener 5.4.1",
- "futures-lite",
+ "futures-lite 2.6.1",
"rustix 1.1.3",
]
@@ -436,8 +516,8 @@ version = "0.2.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "43c070bbf59cd3570b6b2dd54cd772527c7c3620fce8be898406dd3ed6adc64c"
dependencies = [
- "async-io",
- "async-lock",
+ "async-io 2.6.0",
+ "async-lock 3.4.2",
"atomic-waker",
"cfg-if",
"futures-core",
@@ -465,6 +545,15 @@ dependencies = [
"syn 2.0.116",
]
+[[package]]
+name = "atoi"
+version = "2.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f28d99ec8bfea296261ca1af174f24225171fea9664ba9003cbebee704810528"
+dependencies = [
+ "num-traits",
+]
+
[[package]]
name = "atomic-take"
version = "1.1.0"
@@ -483,6 +572,95 @@ version = "1.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8"
+[[package]]
+name = "axum"
+version = "0.7.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "edca88bc138befd0323b20752846e6587272d3b03b0343c8ea28a6f819e6e71f"
+dependencies = [
+ "async-trait",
+ "axum-core",
+ "axum-macros",
+ "bytes",
+ "futures-util",
+ "http 1.4.0",
+ "http-body 1.0.1",
+ "http-body-util",
+ "hyper 1.8.1",
+ "hyper-util",
+ "itoa",
+ "matchit",
+ "memchr",
+ "mime",
+ "percent-encoding",
+ "pin-project-lite",
+ "rustversion",
+ "serde",
+ "serde_json",
+ "serde_path_to_error",
+ "serde_urlencoded",
+ "sync_wrapper",
+ "tokio",
+ "tower 0.5.3",
+ "tower-layer",
+ "tower-service",
+ "tracing",
+]
+
+[[package]]
+name = "axum-core"
+version = "0.4.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "09f2bd6146b97ae3359fa0cc6d6b376d9539582c7b4220f041a33ec24c226199"
+dependencies = [
+ "async-trait",
+ "bytes",
+ "futures-util",
+ "http 1.4.0",
+ "http-body 1.0.1",
+ "http-body-util",
+ "mime",
+ "pin-project-lite",
+ "rustversion",
+ "sync_wrapper",
+ "tower-layer",
+ "tower-service",
+ "tracing",
+]
+
+[[package]]
+name = "axum-macros"
+version = "0.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "57d123550fa8d071b7255cb0cc04dc302baa6c8c4a79f55701552684d8399bce"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.116",
+]
+
+[[package]]
+name = "axum-prometheus"
+version = "0.6.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b683cbc43010e9a3d72c2f31ca464155ff4f95819e88a32924b0f47a43898978"
+dependencies = [
+ "axum",
+ "bytes",
+ "futures",
+ "futures-core",
+ "http 1.4.0",
+ "http-body 1.0.1",
+ "matchit",
+ "metrics",
+ "metrics-exporter-prometheus",
+ "once_cell",
+ "pin-project",
+ "tokio",
+ "tower 0.4.13",
+ "tower-http",
+]
+
[[package]]
name = "backtrace"
version = "0.3.76"
@@ -590,6 +768,9 @@ name = "bitflags"
version = "2.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af"
+dependencies = [
+ "serde_core",
+]
[[package]]
name = "bitvec"
@@ -669,10 +850,10 @@ version = "1.6.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e83f8d02be6967315521be875afa792a316e28d57b5a2d401897e2a7921b7f21"
dependencies = [
- "async-channel",
+ "async-channel 2.5.0",
"async-task",
"futures-io",
- "futures-lite",
+ "futures-lite 2.6.1",
"piper",
]
@@ -1149,6 +1330,21 @@ dependencies = [
"libc",
]
+[[package]]
+name = "crc"
+version = "3.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5eb8a2a1cd12ab0d987a5d5e825195d372001a4094a0376319d5a0ad71c1ba0d"
+dependencies = [
+ "crc-catalog",
+]
+
+[[package]]
+name = "crc-catalog"
+version = "2.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5"
+
[[package]]
name = "crc32fast"
version = "1.5.0"
@@ -1158,6 +1354,15 @@ dependencies = [
"cfg-if",
]
+[[package]]
+name = "crossbeam-epoch"
+version = "0.9.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e"
+dependencies = [
+ "crossbeam-utils",
+]
+
[[package]]
name = "crossbeam-queue"
version = "0.3.12"
@@ -1416,6 +1621,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb"
dependencies = [
"const-oid",
+ "pem-rfc7468",
"zeroize",
]
@@ -1555,6 +1761,12 @@ dependencies = [
"walkdir",
]
+[[package]]
+name = "dotenvy"
+version = "0.15.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b"
+
[[package]]
name = "downcast-rs"
version = "1.2.1"
@@ -1672,6 +1884,9 @@ name = "either"
version = "1.15.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719"
+dependencies = [
+ "serde",
+]
[[package]]
name = "elliptic-curve"
@@ -1734,6 +1949,34 @@ dependencies = [
"windows-sys 0.61.2",
]
+[[package]]
+name = "etcetera"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "136d1b5283a1ab77bd9257427ffd09d8667ced0570b6f938942bc7568ed5b943"
+dependencies = [
+ "cfg-if",
+ "home",
+ "windows-sys 0.48.0",
+]
+
+[[package]]
+name = "event-listener"
+version = "2.5.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0"
+
+[[package]]
+name = "event-listener"
+version = "3.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d93877bcde0eb80ca09131a08d23f0a5c18a620b01db137dba666d18cd9b30c2"
+dependencies = [
+ "concurrent-queue",
+ "parking",
+ "pin-project-lite",
+]
+
[[package]]
name = "event-listener"
version = "4.0.3"
@@ -1780,6 +2023,15 @@ dependencies = [
"syn 2.0.116",
]
+[[package]]
+name = "fastrand"
+version = "1.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be"
+dependencies = [
+ "instant",
+]
+
[[package]]
name = "fastrand"
version = "2.3.0"
@@ -1830,6 +2082,17 @@ dependencies = [
"static_assertions",
]
+[[package]]
+name = "flume"
+version = "0.11.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "da0e4dd2a88388a1f4ccc7c9ce104604dab68d9f408dc34cd45823d5a9069095"
+dependencies = [
+ "futures-core",
+ "futures-sink",
+ "spin",
+]
+
[[package]]
name = "fnv"
version = "1.0.7"
@@ -2120,19 +2383,45 @@ dependencies = [
"futures-util",
]
+[[package]]
+name = "futures-intrusive"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1d930c203dd0b6ff06e0201a4a2fe9149b43c684fd4420555b26d21b1a02956f"
+dependencies = [
+ "futures-core",
+ "lock_api",
+ "parking_lot",
+]
+
[[package]]
name = "futures-io"
version = "0.3.32"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718"
+[[package]]
+name = "futures-lite"
+version = "1.13.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "49a9d51ce47660b1e808d3c990b4709f2f415d928835a17dfd16991515c46bce"
+dependencies = [
+ "fastrand 1.9.0",
+ "futures-core",
+ "futures-io",
+ "memchr",
+ "parking",
+ "pin-project-lite",
+ "waker-fn",
+]
+
[[package]]
name = "futures-lite"
version = "2.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad"
dependencies = [
- "fastrand",
+ "fastrand 2.3.0",
"futures-core",
"futures-io",
"parking",
@@ -2349,6 +2638,15 @@ version = "0.16.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100"
+[[package]]
+name = "hashlink"
+version = "0.8.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e8094feaf31ff591f651a2664fb9cfd92bba7a60ce3197265e9482ebe753c8f7"
+dependencies = [
+ "hashbrown 0.14.5",
+]
+
[[package]]
name = "heck"
version = "0.3.3"
@@ -2363,6 +2661,9 @@ name = "heck"
version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8"
+dependencies = [
+ "unicode-segmentation",
+]
[[package]]
name = "heck"
@@ -2370,6 +2671,12 @@ version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
+[[package]]
+name = "hermit-abi"
+version = "0.3.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024"
+
[[package]]
name = "hermit-abi"
version = "0.5.2"
@@ -2403,6 +2710,15 @@ version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6fe2267d4ed49bc07b63801559be28c718ea06c4738b7a03c94df7386d2cde46"
+[[package]]
+name = "hkdf"
+version = "0.12.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7"
+dependencies = [
+ "hmac 0.12.1",
+]
+
[[package]]
name = "hmac"
version = "0.8.1"
@@ -2966,7 +3282,7 @@ dependencies = [
"ink_env 5.1.1",
"ink_primitives 5.1.1",
"ink_sandbox",
- "jsonrpsee",
+ "jsonrpsee 0.22.5",
"pallet-contracts",
"pallet-contracts-mock-network",
"parity-scale-codec",
@@ -2977,7 +3293,7 @@ dependencies = [
"sp-keyring",
"sp-runtime",
"sp-weights",
- "subxt",
+ "subxt 0.35.3",
"subxt-signer",
"thiserror 1.0.69",
"tokio",
@@ -3345,6 +3661,17 @@ dependencies = [
"num-traits",
]
+[[package]]
+name = "io-lifetimes"
+version = "1.0.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2"
+dependencies = [
+ "hermit-abi 0.3.9",
+ "libc",
+ "windows-sys 0.48.0",
+]
+
[[package]]
name = "ipfs-metadata"
version = "1.0.0"
@@ -3355,13 +3682,19 @@ dependencies = [
"scale-info",
]
+[[package]]
+name = "ipnet"
+version = "2.12.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d98f6fed1fde3f8c21bc40a1abb88dd75e67924f9cffc3ef95607bad8017f8e2"
+
[[package]]
name = "is-terminal"
version = "0.4.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3640c1c38b8e4e43584d8df18be5fc6b0aa314ce6ebf51b53313d4306cca8e46"
dependencies = [
- "hermit-abi",
+ "hermit-abi 0.5.2",
"libc",
"windows-sys 0.61.2",
]
@@ -3381,6 +3714,15 @@ dependencies = [
"either",
]
+[[package]]
+name = "itertools"
+version = "0.11.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57"
+dependencies = [
+ "either",
+]
+
[[package]]
name = "itertools"
version = "0.12.1"
@@ -3416,42 +3758,96 @@ dependencies = [
"wasm-bindgen",
]
+[[package]]
+name = "jsonrpsee"
+version = "0.20.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "138572befc78a9793240645926f30161f8b4143d2be18d09e44ed9814bd7ee2c"
+dependencies = [
+ "jsonrpsee-client-transport 0.20.4",
+ "jsonrpsee-core 0.20.4",
+ "jsonrpsee-http-client 0.20.4",
+ "jsonrpsee-types 0.20.4",
+]
+
[[package]]
name = "jsonrpsee"
version = "0.22.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cfdb12a2381ea5b2e68c3469ec604a007b367778cdb14d09612c8069ebd616ad"
dependencies = [
- "jsonrpsee-client-transport",
- "jsonrpsee-core",
- "jsonrpsee-http-client",
- "jsonrpsee-types",
+ "jsonrpsee-client-transport 0.22.5",
+ "jsonrpsee-core 0.22.5",
+ "jsonrpsee-http-client 0.22.5",
+ "jsonrpsee-types 0.22.5",
"jsonrpsee-ws-client",
]
[[package]]
name = "jsonrpsee-client-transport"
-version = "0.22.5"
+version = "0.20.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4978087a58c3ab02efc5b07c5e5e2803024536106fd5506f558db172c889b3aa"
+checksum = "5c671353e4adf926799107bd7f5724a06b6bc0a333db442a0843c58640bdd0c1"
dependencies = [
"futures-util",
"http 0.2.12",
- "jsonrpsee-core",
+ "jsonrpsee-core 0.20.4",
"pin-project",
- "rustls-native-certs 0.7.3",
- "rustls-pki-types",
+ "rustls-native-certs 0.6.3",
"soketto",
"thiserror 1.0.69",
"tokio",
- "tokio-rustls 0.25.0",
+ "tokio-rustls 0.24.1",
"tokio-util",
"tracing",
"url",
]
[[package]]
-name = "jsonrpsee-core"
+name = "jsonrpsee-client-transport"
+version = "0.22.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4978087a58c3ab02efc5b07c5e5e2803024536106fd5506f558db172c889b3aa"
+dependencies = [
+ "futures-util",
+ "http 0.2.12",
+ "jsonrpsee-core 0.22.5",
+ "pin-project",
+ "rustls-native-certs 0.7.3",
+ "rustls-pki-types",
+ "soketto",
+ "thiserror 1.0.69",
+ "tokio",
+ "tokio-rustls 0.25.0",
+ "tokio-util",
+ "tracing",
+ "url",
+]
+
+[[package]]
+name = "jsonrpsee-core"
+version = "0.20.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f24ea59b037b6b9b0e2ebe2c30a3e782b56bd7c76dcc5d6d70ba55d442af56e3"
+dependencies = [
+ "anyhow",
+ "async-lock 2.8.0",
+ "async-trait",
+ "beef",
+ "futures-timer",
+ "futures-util",
+ "hyper 0.14.32",
+ "jsonrpsee-types 0.20.4",
+ "rustc-hash",
+ "serde",
+ "serde_json",
+ "thiserror 1.0.69",
+ "tokio",
+ "tracing",
+]
+
+[[package]]
+name = "jsonrpsee-core"
version = "0.22.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b4b257e1ec385e07b0255dde0b933f948b5c8b8c28d42afda9587c3a967b896d"
@@ -3462,7 +3858,7 @@ dependencies = [
"futures-timer",
"futures-util",
"hyper 0.14.32",
- "jsonrpsee-types",
+ "jsonrpsee-types 0.22.5",
"pin-project",
"rustc-hash",
"serde",
@@ -3473,6 +3869,26 @@ dependencies = [
"tracing",
]
+[[package]]
+name = "jsonrpsee-http-client"
+version = "0.20.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "57c7b9f95208927653e7965a98525e7fc641781cab89f0e27c43fa2974405683"
+dependencies = [
+ "async-trait",
+ "hyper 0.14.32",
+ "hyper-rustls",
+ "jsonrpsee-core 0.20.4",
+ "jsonrpsee-types 0.20.4",
+ "serde",
+ "serde_json",
+ "thiserror 1.0.69",
+ "tokio",
+ "tower 0.4.13",
+ "tracing",
+ "url",
+]
+
[[package]]
name = "jsonrpsee-http-client"
version = "0.22.5"
@@ -3482,17 +3898,31 @@ dependencies = [
"async-trait",
"hyper 0.14.32",
"hyper-rustls",
- "jsonrpsee-core",
- "jsonrpsee-types",
+ "jsonrpsee-core 0.22.5",
+ "jsonrpsee-types 0.22.5",
"serde",
"serde_json",
"thiserror 1.0.69",
"tokio",
- "tower",
+ "tower 0.4.13",
"tracing",
"url",
]
+[[package]]
+name = "jsonrpsee-types"
+version = "0.20.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3264e339143fe37ed081953842ee67bfafa99e3b91559bdded6e4abd8fc8535e"
+dependencies = [
+ "anyhow",
+ "beef",
+ "serde",
+ "serde_json",
+ "thiserror 1.0.69",
+ "tracing",
+]
+
[[package]]
name = "jsonrpsee-types"
version = "0.22.5"
@@ -3513,9 +3943,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "58b9db2dfd5bb1194b0ce921504df9ceae210a345bc2f6c5a61432089bbab070"
dependencies = [
"http 0.2.12",
- "jsonrpsee-client-transport",
- "jsonrpsee-core",
- "jsonrpsee-types",
+ "jsonrpsee-client-transport 0.22.5",
+ "jsonrpsee-core 0.22.5",
+ "jsonrpsee-types 0.22.5",
"url",
]
@@ -3547,6 +3977,9 @@ name = "lazy_static"
version = "1.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
+dependencies = [
+ "spin",
+]
[[package]]
name = "leb128"
@@ -3572,6 +4005,18 @@ version = "0.2.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981"
+[[package]]
+name = "libredox"
+version = "0.1.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7ddbf48fd451246b1f8c2610bd3b4ac0cc6e149d89832867093ab69a17194f08"
+dependencies = [
+ "bitflags 2.11.0",
+ "libc",
+ "plain",
+ "redox_syscall 0.7.3",
+]
+
[[package]]
name = "libsecp256k1"
version = "0.7.2"
@@ -3620,6 +4065,17 @@ dependencies = [
"libsecp256k1-core",
]
+[[package]]
+name = "libsqlite3-sys"
+version = "0.27.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cf4e226dcd58b4be396f7bd3c20da8fdee2911400705297ba7d2d7cc2c30f716"
+dependencies = [
+ "cc",
+ "pkg-config",
+ "vcpkg",
+]
+
[[package]]
name = "link-cplusplus"
version = "1.0.12"
@@ -3658,6 +4114,12 @@ dependencies = [
"nalgebra",
]
+[[package]]
+name = "linux-raw-sys"
+version = "0.3.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519"
+
[[package]]
name = "linux-raw-sys"
version = "0.4.15"
@@ -3757,6 +4219,12 @@ dependencies = [
"regex-automata",
]
+[[package]]
+name = "matchit"
+version = "0.7.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94"
+
[[package]]
name = "matrixmultiply"
version = "0.3.10"
@@ -3767,6 +4235,16 @@ dependencies = [
"rawpointer",
]
+[[package]]
+name = "md-5"
+version = "0.10.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf"
+dependencies = [
+ "cfg-if",
+ "digest 0.10.7",
+]
+
[[package]]
name = "memchr"
version = "2.8.0"
@@ -3794,6 +4272,54 @@ dependencies = [
"zeroize",
]
+[[package]]
+name = "metrics"
+version = "0.22.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "56d05972e8cbac2671e85aa9d04d9160d193f8bebd1a5c1a2f4542c62e65d1d0"
+dependencies = [
+ "ahash 0.8.12",
+ "portable-atomic",
+]
+
+[[package]]
+name = "metrics-exporter-prometheus"
+version = "0.13.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9bf4e7146e30ad172c42c39b3246864bd2d3c6396780711a1baf749cfe423e21"
+dependencies = [
+ "base64 0.21.7",
+ "hyper 0.14.32",
+ "indexmap 2.13.0",
+ "ipnet",
+ "metrics",
+ "metrics-util",
+ "quanta",
+ "thiserror 1.0.69",
+ "tokio",
+]
+
+[[package]]
+name = "metrics-util"
+version = "0.16.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8b07a5eb561b8cbc16be2d216faf7757f9baf3bfb94dbb0fae3df8387a5bb47f"
+dependencies = [
+ "crossbeam-epoch",
+ "crossbeam-utils",
+ "hashbrown 0.14.5",
+ "metrics",
+ "num_cpus",
+ "quanta",
+ "sketches-ddsketch",
+]
+
+[[package]]
+name = "mime"
+version = "0.3.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a"
+
[[package]]
name = "minimal-lexical"
version = "0.2.1"
@@ -3883,6 +4409,22 @@ dependencies = [
"num-traits",
]
+[[package]]
+name = "num-bigint-dig"
+version = "0.8.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e661dda6640fad38e827a6d4a310ff4763082116fe217f279885c97f511bb0b7"
+dependencies = [
+ "lazy_static",
+ "libm",
+ "num-integer",
+ "num-iter",
+ "num-traits",
+ "rand",
+ "smallvec",
+ "zeroize",
+]
+
[[package]]
name = "num-complex"
version = "0.4.6"
@@ -3917,6 +4459,17 @@ dependencies = [
"num-traits",
]
+[[package]]
+name = "num-iter"
+version = "0.1.45"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf"
+dependencies = [
+ "autocfg",
+ "num-integer",
+ "num-traits",
+]
+
[[package]]
name = "num-rational"
version = "0.4.2"
@@ -3935,6 +4488,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841"
dependencies = [
"autocfg",
+ "libm",
+]
+
+[[package]]
+name = "num_cpus"
+version = "1.17.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b"
+dependencies = [
+ "hermit-abi 0.5.2",
+ "libc",
]
[[package]]
@@ -4582,7 +5146,7 @@ checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1"
dependencies = [
"cfg-if",
"libc",
- "redox_syscall",
+ "redox_syscall 0.5.18",
"smallvec",
"windows-link",
]
@@ -4614,6 +5178,15 @@ dependencies = [
"password-hash",
]
+[[package]]
+name = "pem-rfc7468"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412"
+dependencies = [
+ "base64ct",
+]
+
[[package]]
name = "percent-encoding"
version = "2.3.2"
@@ -4669,10 +5242,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "96c8c490f422ef9a4efd2cb5b42b76c8613d7e7dfc1caf667b8a3350a5acc066"
dependencies = [
"atomic-waker",
- "fastrand",
+ "fastrand 2.3.0",
"futures-io",
]
+[[package]]
+name = "pkcs1"
+version = "0.7.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f"
+dependencies = [
+ "der",
+ "pkcs8",
+ "spki",
+]
+
[[package]]
name = "pkcs8"
version = "0.10.2"
@@ -4683,6 +5267,18 @@ dependencies = [
"spki",
]
+[[package]]
+name = "pkg-config"
+version = "0.3.32"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c"
+
+[[package]]
+name = "plain"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6"
+
[[package]]
name = "polkadot-core-primitives"
version = "11.0.0"
@@ -4842,6 +5438,22 @@ dependencies = [
"syn 2.0.116",
]
+[[package]]
+name = "polling"
+version = "2.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4b2d323e8ca7996b3e23126511a523f7e62924d93ecd5ae73b333815b0eb3dce"
+dependencies = [
+ "autocfg",
+ "bitflags 1.3.2",
+ "cfg-if",
+ "concurrent-queue",
+ "libc",
+ "log",
+ "pin-project-lite",
+ "windows-sys 0.48.0",
+]
+
[[package]]
name = "polling"
version = "3.11.0"
@@ -4850,7 +5462,7 @@ checksum = "5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218"
dependencies = [
"cfg-if",
"concurrent-queue",
- "hermit-abi",
+ "hermit-abi 0.5.2",
"pin-project-lite",
"rustix 1.1.3",
"windows-sys 0.61.2",
@@ -4867,6 +5479,12 @@ dependencies = [
"universal-hash",
]
+[[package]]
+name = "portable-atomic"
+version = "1.13.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49"
+
[[package]]
name = "potential_utf"
version = "0.1.4"
@@ -5051,6 +5669,32 @@ dependencies = [
"scale-info",
]
+[[package]]
+name = "propchain-indexer"
+version = "0.1.0"
+dependencies = [
+ "anyhow",
+ "axum",
+ "axum-prometheus",
+ "chrono",
+ "clap",
+ "futures",
+ "hex",
+ "once_cell",
+ "serde",
+ "serde_json",
+ "sqlx",
+ "subxt 0.33.0",
+ "thiserror 1.0.69",
+ "tokio",
+ "tower 0.4.13",
+ "tower-http",
+ "tracing",
+ "tracing-subscriber",
+ "url",
+ "uuid",
+]
+
[[package]]
name = "propchain-insurance"
version = "1.0.0"
@@ -5122,6 +5766,21 @@ dependencies = [
"scale-info",
]
+[[package]]
+name = "quanta"
+version = "0.12.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f3ab5a9d756f0d97bdc89019bd2e4ea098cf9cde50ee7564dde6b81ccc8f06c7"
+dependencies = [
+ "crossbeam-utils",
+ "libc",
+ "once_cell",
+ "raw-cpuid",
+ "wasi",
+ "web-sys",
+ "winapi",
+]
+
[[package]]
name = "quote"
version = "1.0.44"
@@ -5179,6 +5838,15 @@ dependencies = [
"getrandom 0.2.17",
]
+[[package]]
+name = "raw-cpuid"
+version = "11.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "498cd0dc59d73224351ee52a95fee0f1a617a2eae0e7d9d720cc622c73a54186"
+dependencies = [
+ "bitflags 2.11.0",
+]
+
[[package]]
name = "rawpointer"
version = "0.2.1"
@@ -5194,6 +5862,15 @@ dependencies = [
"bitflags 2.11.0",
]
+[[package]]
+name = "redox_syscall"
+version = "0.7.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6ce70a74e890531977d37e532c34d45e9055d2409ed08ddba14529471ed0be16"
+dependencies = [
+ "bitflags 2.11.0",
+]
+
[[package]]
name = "ref-cast"
version = "1.0.25"
@@ -5273,6 +5950,26 @@ version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fc874b127765f014d792f16763a81245ab80500e2ad921ed4ee9e82481ee08fe"
+[[package]]
+name = "rsa"
+version = "0.9.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b8573f03f5883dcaebdfcf4725caa1ecb9c15b2ef50c43a07b816e06799bb12d"
+dependencies = [
+ "const-oid",
+ "digest 0.10.7",
+ "num-bigint-dig",
+ "num-integer",
+ "num-traits",
+ "pkcs1",
+ "pkcs8",
+ "rand_core 0.6.4",
+ "signature",
+ "spki",
+ "subtle",
+ "zeroize",
+]
+
[[package]]
name = "rustc-demangle"
version = "0.1.27"
@@ -5311,11 +6008,25 @@ dependencies = [
[[package]]
name = "rustix"
-version = "0.38.44"
+version = "0.37.28"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154"
+checksum = "519165d378b97752ca44bbe15047d5d3409e875f39327546b42ac81d7e18c1b6"
dependencies = [
- "bitflags 2.11.0",
+ "bitflags 1.3.2",
+ "errno",
+ "io-lifetimes",
+ "libc",
+ "linux-raw-sys 0.3.8",
+ "windows-sys 0.48.0",
+]
+
+[[package]]
+name = "rustix"
+version = "0.38.44"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154"
+dependencies = [
+ "bitflags 2.11.0",
"errno",
"libc",
"linux-raw-sys 0.4.15",
@@ -5492,6 +6203,7 @@ checksum = "036575c29af9b6e4866ffb7fa055dbf623fe7a9cc159b33786de6013a6969d89"
dependencies = [
"parity-scale-codec",
"scale-info",
+ "serde",
]
[[package]]
@@ -5520,6 +6232,21 @@ dependencies = [
"smallvec",
]
+[[package]]
+name = "scale-decode"
+version = "0.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7caaf753f8ed1ab4752c6afb20174f03598c664724e0e32628e161c21000ff76"
+dependencies = [
+ "derive_more 0.99.20",
+ "parity-scale-codec",
+ "primitive-types",
+ "scale-bits 0.4.0",
+ "scale-decode-derive 0.10.0",
+ "scale-info",
+ "smallvec",
+]
+
[[package]]
name = "scale-decode"
version = "0.11.1"
@@ -5548,6 +6275,19 @@ dependencies = [
"syn 1.0.109",
]
+[[package]]
+name = "scale-decode-derive"
+version = "0.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d3475108a1b62c7efd1b5c65974f30109a598b2f45f23c9ae030acb9686966db"
+dependencies = [
+ "darling 0.14.4",
+ "proc-macro-crate 1.3.1",
+ "proc-macro2",
+ "quote",
+ "syn 1.0.109",
+]
+
[[package]]
name = "scale-decode-derive"
version = "0.11.1"
@@ -5568,6 +6308,8 @@ checksum = "6d70cb4b29360105483fac1ed567ff95d65224a14dd275b6303ed0a654c78de5"
dependencies = [
"derive_more 0.99.20",
"parity-scale-codec",
+ "primitive-types",
+ "scale-bits 0.4.0",
"scale-encode-derive 0.5.0",
"scale-info",
"smallvec",
@@ -5664,6 +6406,26 @@ dependencies = [
"thiserror 1.0.69",
]
+[[package]]
+name = "scale-value"
+version = "0.13.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "58223c7691bf0bd46b43c9aea6f0472d1067f378d574180232358d7c6e0a8089"
+dependencies = [
+ "base58",
+ "blake2 0.10.6",
+ "derive_more 0.99.20",
+ "either",
+ "frame-metadata 15.1.0",
+ "parity-scale-codec",
+ "scale-bits 0.4.0",
+ "scale-decode 0.10.0",
+ "scale-encode 0.5.0",
+ "scale-info",
+ "serde",
+ "yap",
+]
+
[[package]]
name = "scale-value"
version = "0.14.1"
@@ -5999,6 +6761,17 @@ dependencies = [
"zmij",
]
+[[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_repr"
version = "0.1.20"
@@ -6072,6 +6845,17 @@ dependencies = [
"opaque-debug",
]
+[[package]]
+name = "sha1"
+version = "0.10.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba"
+dependencies = [
+ "cfg-if",
+ "cpufeatures",
+ "digest 0.10.7",
+]
+
[[package]]
name = "sha2"
version = "0.9.9"
@@ -6209,6 +6993,12 @@ version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b2aa850e253778c88a04c3d7323b043aeda9d3e30d5971937c1855769763678e"
+[[package]]
+name = "sketches-ddsketch"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "85636c14b73d81f541e525f585c0a2109e6744e1565b5c1668e31c70c10ed65c"
+
[[package]]
name = "slab"
version = "0.4.12"
@@ -6221,21 +7011,93 @@ version = "1.15.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03"
+[[package]]
+name = "smol"
+version = "1.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "13f2b548cd8447f8de0fdf1c592929f70f4fc7039a05e47404b0d096ec6987a1"
+dependencies = [
+ "async-channel 1.9.0",
+ "async-executor",
+ "async-fs 1.6.0",
+ "async-io 1.13.0",
+ "async-lock 2.8.0",
+ "async-net 1.8.0",
+ "async-process 1.8.1",
+ "blocking",
+ "futures-lite 1.13.0",
+]
+
[[package]]
name = "smol"
version = "2.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a33bd3e260892199c3ccfc487c88b2da2265080acb316cd920da72fdfd7c599f"
dependencies = [
- "async-channel",
+ "async-channel 2.5.0",
"async-executor",
- "async-fs",
- "async-io",
- "async-lock",
- "async-net",
- "async-process",
+ "async-fs 2.2.0",
+ "async-io 2.6.0",
+ "async-lock 3.4.2",
+ "async-net 2.0.0",
+ "async-process 2.5.0",
"blocking",
- "futures-lite",
+ "futures-lite 2.6.1",
+]
+
+[[package]]
+name = "smoldot"
+version = "0.14.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "eca99148e026936bbc444c3708748207033968e4ef1c33bfc885660ae4d44d21"
+dependencies = [
+ "arrayvec 0.7.6",
+ "async-lock 3.4.2",
+ "atomic-take",
+ "base64 0.21.7",
+ "bip39",
+ "blake2-rfc",
+ "bs58",
+ "chacha20",
+ "crossbeam-queue",
+ "derive_more 0.99.20",
+ "ed25519-zebra 4.1.0",
+ "either",
+ "event-listener 3.1.0",
+ "fnv",
+ "futures-lite 2.6.1",
+ "futures-util",
+ "hashbrown 0.14.5",
+ "hex",
+ "hmac 0.12.1",
+ "itertools 0.11.0",
+ "libm",
+ "libsecp256k1",
+ "merlin",
+ "no-std-net",
+ "nom",
+ "num-bigint",
+ "num-rational",
+ "num-traits",
+ "pbkdf2",
+ "pin-project",
+ "poly1305",
+ "rand",
+ "rand_chacha",
+ "ruzstd",
+ "schnorrkel",
+ "serde",
+ "serde_json",
+ "sha2 0.10.9",
+ "sha3",
+ "siphasher",
+ "slab",
+ "smallvec",
+ "soketto",
+ "twox-hash",
+ "wasmi",
+ "x25519-dalek",
+ "zeroize",
]
[[package]]
@@ -6245,7 +7107,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e6d1eaa97d77be4d026a1e7ffad1bb3b78448763b357ea6f8188d3e6f736a9b9"
dependencies = [
"arrayvec 0.7.6",
- "async-lock",
+ "async-lock 3.4.2",
"atomic-take",
"base64 0.21.7",
"bip39",
@@ -6258,7 +7120,7 @@ dependencies = [
"either",
"event-listener 4.0.3",
"fnv",
- "futures-lite",
+ "futures-lite 2.6.1",
"futures-util",
"hashbrown 0.14.5",
"hex",
@@ -6293,14 +7155,50 @@ dependencies = [
"zeroize",
]
+[[package]]
+name = "smoldot-light"
+version = "0.12.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0e6f1898682b618b81570047b9d870b3faaff6ae1891b468eddd94d7f903c2fe"
+dependencies = [
+ "async-channel 2.5.0",
+ "async-lock 3.4.2",
+ "base64 0.21.7",
+ "blake2-rfc",
+ "derive_more 0.99.20",
+ "either",
+ "event-listener 3.1.0",
+ "fnv",
+ "futures-channel",
+ "futures-lite 2.6.1",
+ "futures-util",
+ "hashbrown 0.14.5",
+ "hex",
+ "itertools 0.11.0",
+ "log",
+ "lru",
+ "no-std-net",
+ "parking_lot",
+ "pin-project",
+ "rand",
+ "rand_chacha",
+ "serde",
+ "serde_json",
+ "siphasher",
+ "slab",
+ "smol 1.3.0",
+ "smoldot 0.14.0",
+ "zeroize",
+]
+
[[package]]
name = "smoldot-light"
version = "0.14.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5496f2d116b7019a526b1039ec2247dd172b8670633b1a64a614c9ea12c9d8c7"
dependencies = [
- "async-channel",
- "async-lock",
+ "async-channel 2.5.0",
+ "async-lock 3.4.2",
"base64 0.21.7",
"blake2-rfc",
"derive_more 0.99.20",
@@ -6308,7 +7206,7 @@ dependencies = [
"event-listener 4.0.3",
"fnv",
"futures-channel",
- "futures-lite",
+ "futures-lite 2.6.1",
"futures-util",
"hashbrown 0.14.5",
"hex",
@@ -6324,11 +7222,21 @@ dependencies = [
"serde_json",
"siphasher",
"slab",
- "smol",
- "smoldot",
+ "smol 2.0.2",
+ "smoldot 0.16.0",
"zeroize",
]
+[[package]]
+name = "socket2"
+version = "0.4.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9f7916fc008ca5542385b89a3d3ce689953c143e9304a9bf8beec1de48994c0d"
+dependencies = [
+ "libc",
+ "winapi",
+]
+
[[package]]
name = "socket2"
version = "0.5.10"
@@ -6522,6 +7430,20 @@ dependencies = [
"zeroize",
]
+[[package]]
+name = "sp-core-hashing"
+version = "13.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cb8524f01591ee58b46cd83c9dbc0fcffd2fd730dabec4f59326cd58a00f17e2"
+dependencies = [
+ "blake2b_simd",
+ "byteorder",
+ "digest 0.10.7",
+ "sha2 0.10.9",
+ "sha3",
+ "twox-hash",
+]
+
[[package]]
name = "sp-crypto-hashing"
version = "0.1.0"
@@ -6918,6 +7840,9 @@ name = "spin"
version = "0.9.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67"
+dependencies = [
+ "lock_api",
+]
[[package]]
name = "spki"
@@ -6930,58 +7855,273 @@ dependencies = [
]
[[package]]
-name = "ss58-registry"
-version = "1.51.0"
+name = "sqlformat"
+version = "0.2.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "19409f13998e55816d1c728395af0b52ec066206341d939e22e7766df9b494b8"
+checksum = "7bba3a93db0cc4f7bdece8bb09e77e2e785c20bfebf79eb8340ed80708048790"
dependencies = [
- "Inflector",
- "num-format",
- "proc-macro2",
- "quote",
- "serde",
- "serde_json",
- "unicode-xid",
+ "nom",
+ "unicode_categories",
]
[[package]]
-name = "stable_deref_trait"
-version = "1.2.1"
+name = "sqlx"
+version = "0.7.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596"
+checksum = "c9a2ccff1a000a5a59cd33da541d9f2fdcd9e6e8229cc200565942bff36d0aaa"
+dependencies = [
+ "sqlx-core",
+ "sqlx-macros",
+ "sqlx-mysql",
+ "sqlx-postgres",
+ "sqlx-sqlite",
+]
[[package]]
-name = "staging-xcm"
-version = "11.0.0"
+name = "sqlx-core"
+version = "0.7.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "aded0292274ad473250c22ed3deaf2d9ed47d15786d700e9e83ab7c1cad2ad44"
+checksum = "24ba59a9342a3d9bab6c56c118be528b27c9b60e490080e9711a04dccac83ef6"
dependencies = [
- "array-bytes",
- "bounded-collections",
- "derivative",
- "environmental",
- "impl-trait-for-tuples",
+ "ahash 0.8.12",
+ "atoi",
+ "byteorder",
+ "bytes",
+ "chrono",
+ "crc",
+ "crossbeam-queue",
+ "either",
+ "event-listener 2.5.3",
+ "futures-channel",
+ "futures-core",
+ "futures-intrusive",
+ "futures-io",
+ "futures-util",
+ "hashlink",
+ "hex",
+ "indexmap 2.13.0",
"log",
- "parity-scale-codec",
- "scale-info",
+ "memchr",
+ "once_cell",
+ "paste",
+ "percent-encoding",
+ "rustls 0.21.12",
+ "rustls-pemfile 1.0.4",
"serde",
- "sp-weights",
- "xcm-procedural",
+ "serde_json",
+ "sha2 0.10.9",
+ "smallvec",
+ "sqlformat",
+ "thiserror 1.0.69",
+ "tokio",
+ "tokio-stream",
+ "tracing",
+ "url",
+ "uuid",
+ "webpki-roots",
]
[[package]]
-name = "staging-xcm-builder"
-version = "11.0.0"
+name = "sqlx-macros"
+version = "0.7.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0681b0a478c2f5e1f1ae9b7e8e4970d79ec8ef94f4efebc011ea335822bc264e"
+checksum = "4ea40e2345eb2faa9e1e5e326db8c34711317d2b5e08d0d5741619048a803127"
dependencies = [
- "frame-support",
- "frame-system",
- "impl-trait-for-tuples",
- "log",
- "pallet-transaction-payment",
- "parity-scale-codec",
- "polkadot-parachain-primitives",
+ "proc-macro2",
+ "quote",
+ "sqlx-core",
+ "sqlx-macros-core",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "sqlx-macros-core"
+version = "0.7.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5833ef53aaa16d860e92123292f1f6a3d53c34ba8b1969f152ef1a7bb803f3c8"
+dependencies = [
+ "dotenvy",
+ "either",
+ "heck 0.4.1",
+ "hex",
+ "once_cell",
+ "proc-macro2",
+ "quote",
+ "serde",
+ "serde_json",
+ "sha2 0.10.9",
+ "sqlx-core",
+ "sqlx-mysql",
+ "sqlx-postgres",
+ "sqlx-sqlite",
+ "syn 1.0.109",
+ "tempfile",
+ "tokio",
+ "url",
+]
+
+[[package]]
+name = "sqlx-mysql"
+version = "0.7.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1ed31390216d20e538e447a7a9b959e06ed9fc51c37b514b46eb758016ecd418"
+dependencies = [
+ "atoi",
+ "base64 0.21.7",
+ "bitflags 2.11.0",
+ "byteorder",
+ "bytes",
+ "chrono",
+ "crc",
+ "digest 0.10.7",
+ "dotenvy",
+ "either",
+ "futures-channel",
+ "futures-core",
+ "futures-io",
+ "futures-util",
+ "generic-array",
+ "hex",
+ "hkdf",
+ "hmac 0.12.1",
+ "itoa",
+ "log",
+ "md-5",
+ "memchr",
+ "once_cell",
+ "percent-encoding",
+ "rand",
+ "rsa",
+ "serde",
+ "sha1",
+ "sha2 0.10.9",
+ "smallvec",
+ "sqlx-core",
+ "stringprep",
+ "thiserror 1.0.69",
+ "tracing",
+ "uuid",
+ "whoami",
+]
+
+[[package]]
+name = "sqlx-postgres"
+version = "0.7.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7c824eb80b894f926f89a0b9da0c7f435d27cdd35b8c655b114e58223918577e"
+dependencies = [
+ "atoi",
+ "base64 0.21.7",
+ "bitflags 2.11.0",
+ "byteorder",
+ "chrono",
+ "crc",
+ "dotenvy",
+ "etcetera",
+ "futures-channel",
+ "futures-core",
+ "futures-io",
+ "futures-util",
+ "hex",
+ "hkdf",
+ "hmac 0.12.1",
+ "home",
+ "itoa",
+ "log",
+ "md-5",
+ "memchr",
+ "once_cell",
+ "rand",
+ "serde",
+ "serde_json",
+ "sha2 0.10.9",
+ "smallvec",
+ "sqlx-core",
+ "stringprep",
+ "thiserror 1.0.69",
+ "tracing",
+ "uuid",
+ "whoami",
+]
+
+[[package]]
+name = "sqlx-sqlite"
+version = "0.7.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b244ef0a8414da0bed4bb1910426e890b19e5e9bccc27ada6b797d05c55ae0aa"
+dependencies = [
+ "atoi",
+ "chrono",
+ "flume",
+ "futures-channel",
+ "futures-core",
+ "futures-executor",
+ "futures-intrusive",
+ "futures-util",
+ "libsqlite3-sys",
+ "log",
+ "percent-encoding",
+ "serde",
+ "sqlx-core",
+ "tracing",
+ "url",
+ "urlencoding",
+ "uuid",
+]
+
+[[package]]
+name = "ss58-registry"
+version = "1.51.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "19409f13998e55816d1c728395af0b52ec066206341d939e22e7766df9b494b8"
+dependencies = [
+ "Inflector",
+ "num-format",
+ "proc-macro2",
+ "quote",
+ "serde",
+ "serde_json",
+ "unicode-xid",
+]
+
+[[package]]
+name = "stable_deref_trait"
+version = "1.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596"
+
+[[package]]
+name = "staging-xcm"
+version = "11.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "aded0292274ad473250c22ed3deaf2d9ed47d15786d700e9e83ab7c1cad2ad44"
+dependencies = [
+ "array-bytes",
+ "bounded-collections",
+ "derivative",
+ "environmental",
+ "impl-trait-for-tuples",
+ "log",
+ "parity-scale-codec",
+ "scale-info",
+ "serde",
+ "sp-weights",
+ "xcm-procedural",
+]
+
+[[package]]
+name = "staging-xcm-builder"
+version = "11.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0681b0a478c2f5e1f1ae9b7e8e4970d79ec8ef94f4efebc011ea335822bc264e"
+dependencies = [
+ "frame-support",
+ "frame-system",
+ "impl-trait-for-tuples",
+ "log",
+ "pallet-transaction-payment",
+ "parity-scale-codec",
+ "polkadot-parachain-primitives",
"scale-info",
"sp-arithmetic",
"sp-io",
@@ -7030,6 +8170,17 @@ version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f"
+[[package]]
+name = "stringprep"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7b4df3d392d81bd458a8a621b8bffbd2302a12ffe288a9d931670948749463b1"
+dependencies = [
+ "unicode-bidi",
+ "unicode-normalization",
+ "unicode-properties",
+]
+
[[package]]
name = "strsim"
version = "0.10.0"
@@ -7102,6 +8253,39 @@ version = "2.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292"
+[[package]]
+name = "subxt"
+version = "0.33.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f7cf683962113b84ce5226bdf6f27d7f92a7e5bb408a5231f6c205407fbb20df"
+dependencies = [
+ "async-trait",
+ "base58",
+ "blake2 0.10.6",
+ "derivative",
+ "either",
+ "frame-metadata 16.0.0",
+ "futures",
+ "hex",
+ "impl-serde 0.4.0",
+ "jsonrpsee 0.20.4",
+ "parity-scale-codec",
+ "primitive-types",
+ "scale-bits 0.4.0",
+ "scale-decode 0.10.0",
+ "scale-encode 0.5.0",
+ "scale-info",
+ "scale-value 0.13.0",
+ "serde",
+ "serde_json",
+ "sp-core-hashing",
+ "subxt-lightclient 0.33.0",
+ "subxt-macro 0.33.0",
+ "subxt-metadata 0.33.0",
+ "thiserror 1.0.69",
+ "tracing",
+]
+
[[package]]
name = "subxt"
version = "0.35.3"
@@ -7118,26 +8302,46 @@ dependencies = [
"hex",
"impl-serde 0.4.0",
"instant",
- "jsonrpsee",
+ "jsonrpsee 0.22.5",
"parity-scale-codec",
"primitive-types",
"scale-bits 0.5.0",
"scale-decode 0.11.1",
"scale-encode 0.6.0",
"scale-info",
- "scale-value",
+ "scale-value 0.14.1",
"serde",
"serde_json",
"sp-crypto-hashing",
- "subxt-lightclient",
- "subxt-macro",
- "subxt-metadata",
+ "subxt-lightclient 0.35.3",
+ "subxt-macro 0.35.3",
+ "subxt-metadata 0.35.3",
"thiserror 1.0.69",
"tokio-util",
"tracing",
"url",
]
+[[package]]
+name = "subxt-codegen"
+version = "0.33.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "12800ad6128b4bfc93d2af89b7d368bff7ea2f6604add35f96f6a8c06c7f9abf"
+dependencies = [
+ "frame-metadata 16.0.0",
+ "heck 0.4.1",
+ "hex",
+ "jsonrpsee 0.20.4",
+ "parity-scale-codec",
+ "proc-macro2",
+ "quote",
+ "scale-info",
+ "subxt-metadata 0.33.0",
+ "syn 2.0.116",
+ "thiserror 1.0.69",
+ "tokio",
+]
+
[[package]]
name = "subxt-codegen"
version = "0.35.3"
@@ -7147,18 +8351,35 @@ dependencies = [
"frame-metadata 16.0.0",
"heck 0.4.1",
"hex",
- "jsonrpsee",
+ "jsonrpsee 0.22.5",
"parity-scale-codec",
"proc-macro2",
"quote",
"scale-info",
"scale-typegen",
- "subxt-metadata",
+ "subxt-metadata 0.35.3",
"syn 2.0.116",
"thiserror 1.0.69",
"tokio",
]
+[[package]]
+name = "subxt-lightclient"
+version = "0.33.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "243765099b60d97dc7fc80456ab951758a07ed0decb5c09283783f06ca04fc69"
+dependencies = [
+ "futures",
+ "futures-util",
+ "serde",
+ "serde_json",
+ "smoldot-light 0.12.0",
+ "thiserror 1.0.69",
+ "tokio",
+ "tokio-stream",
+ "tracing",
+]
+
[[package]]
name = "subxt-lightclient"
version = "0.35.3"
@@ -7169,13 +8390,26 @@ dependencies = [
"futures-util",
"serde",
"serde_json",
- "smoldot-light",
+ "smoldot-light 0.14.0",
"thiserror 1.0.69",
"tokio",
"tokio-stream",
"tracing",
]
+[[package]]
+name = "subxt-macro"
+version = "0.33.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d5086ce2a90e723083ff19b77f06805d00e732eac3e19c86f6cd643d4255d334"
+dependencies = [
+ "darling 0.20.11",
+ "parity-scale-codec",
+ "proc-macro-error",
+ "subxt-codegen 0.33.0",
+ "syn 2.0.116",
+]
+
[[package]]
name = "subxt-macro"
version = "0.35.3"
@@ -7187,10 +8421,23 @@ dependencies = [
"proc-macro-error",
"quote",
"scale-typegen",
- "subxt-codegen",
+ "subxt-codegen 0.35.3",
"syn 2.0.116",
]
+[[package]]
+name = "subxt-metadata"
+version = "0.33.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "19dc60f779bcab44084053e12d4ad5ac18ee217dbe8e26c919e7086fc0228d30"
+dependencies = [
+ "frame-metadata 16.0.0",
+ "parity-scale-codec",
+ "scale-info",
+ "sp-core-hashing",
+ "thiserror 1.0.69",
+]
+
[[package]]
name = "subxt-metadata"
version = "0.35.3"
@@ -7224,7 +8471,7 @@ dependencies = [
"secrecy",
"sha2 0.10.9",
"sp-crypto-hashing",
- "subxt",
+ "subxt 0.35.3",
"zeroize",
]
@@ -7250,6 +8497,12 @@ dependencies = [
"unicode-ident",
]
+[[package]]
+name = "sync_wrapper"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263"
+
[[package]]
name = "synstructure"
version = "0.12.6"
@@ -7296,7 +8549,7 @@ version = "3.25.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0136791f7c95b1f6dd99f9cc786b91bb81c3800b639b3478e561ddb7be95e5f1"
dependencies = [
- "fastrand",
+ "fastrand 2.3.0",
"getrandom 0.4.1",
"once_cell",
"rustix 1.1.3",
@@ -7446,6 +8699,7 @@ dependencies = [
"libc",
"mio",
"pin-project-lite",
+ "signal-hook-registry",
"socket2 0.6.2",
"tokio-macros",
"windows-sys 0.61.2",
@@ -7605,6 +8859,39 @@ dependencies = [
"tracing",
]
+[[package]]
+name = "tower"
+version = "0.5.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4"
+dependencies = [
+ "futures-core",
+ "futures-util",
+ "pin-project-lite",
+ "sync_wrapper",
+ "tokio",
+ "tower-layer",
+ "tower-service",
+ "tracing",
+]
+
+[[package]]
+name = "tower-http"
+version = "0.5.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1e9cd434a998747dd2c4276bc96ee2e0c7a2eadf3cae88e52be55a05fa9053f5"
+dependencies = [
+ "bitflags 2.11.0",
+ "bytes",
+ "http 1.4.0",
+ "http-body 1.0.1",
+ "http-body-util",
+ "pin-project-lite",
+ "tower-layer",
+ "tower-service",
+ "tracing",
+]
+
[[package]]
name = "tower-layer"
version = "0.3.3"
@@ -7760,6 +9047,12 @@ dependencies = [
"static_assertions",
]
+[[package]]
+name = "unicode-bidi"
+version = "0.3.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5"
+
[[package]]
name = "unicode-ident"
version = "1.0.24"
@@ -7775,6 +9068,12 @@ dependencies = [
"tinyvec",
]
+[[package]]
+name = "unicode-properties"
+version = "0.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7df058c713841ad818f1dc5d3fd88063241cc61f49f5fbea4b951e8cf5a8d71d"
+
[[package]]
name = "unicode-segmentation"
version = "1.12.0"
@@ -7793,6 +9092,12 @@ version = "0.2.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853"
+[[package]]
+name = "unicode_categories"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "39ec24b3121d976906ece63c9daad25b85969647682eee313cb5779fdd69e14e"
+
[[package]]
name = "universal-hash"
version = "0.5.1"
@@ -7828,6 +9133,12 @@ dependencies = [
"serde_derive",
]
+[[package]]
+name = "urlencoding"
+version = "2.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da"
+
[[package]]
name = "utf8_iter"
version = "1.0.4"
@@ -7840,6 +9151,18 @@ version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821"
+[[package]]
+name = "uuid"
+version = "1.23.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5ac8b6f42ead25368cf5b098aeb3dc8a1a2c05a3eee8a9a1a68c640edbfc79d9"
+dependencies = [
+ "getrandom 0.4.1",
+ "js-sys",
+ "serde_core",
+ "wasm-bindgen",
+]
+
[[package]]
name = "uzers"
version = "0.12.2"
@@ -7856,6 +9179,12 @@ version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65"
+[[package]]
+name = "vcpkg"
+version = "0.2.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426"
+
[[package]]
name = "version_check"
version = "0.9.5"
@@ -7884,6 +9213,12 @@ dependencies = [
"zeroize",
]
+[[package]]
+name = "waker-fn"
+version = "1.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "317211a0dc0ceedd78fb2ca9a44aed3d7b9b26f81870d485c07122b4350673b7"
+
[[package]]
name = "walkdir"
version = "2.5.0"
@@ -7927,6 +9262,12 @@ dependencies = [
"wit-bindgen",
]
+[[package]]
+name = "wasite"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b"
+
[[package]]
name = "wasm-bindgen"
version = "0.2.108"
@@ -8162,6 +9503,22 @@ dependencies = [
"wast",
]
+[[package]]
+name = "web-sys"
+version = "0.3.85"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "312e32e551d92129218ea9a2452120f4aabc03529ef03e4d0d82fb2780608598"
+dependencies = [
+ "js-sys",
+ "wasm-bindgen",
+]
+
+[[package]]
+name = "webpki-roots"
+version = "0.25.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1"
+
[[package]]
name = "which"
version = "6.0.3"
@@ -8186,6 +9543,16 @@ dependencies = [
"winsafe",
]
+[[package]]
+name = "whoami"
+version = "1.6.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5d4a4db5077702ca3015d3d02d74974948aba2ad9e12ab7df718ee64ccd7e97d"
+dependencies = [
+ "libredox",
+ "wasite",
+]
+
[[package]]
name = "wide"
version = "0.7.33"
@@ -8286,6 +9653,15 @@ dependencies = [
"windows-link",
]
+[[package]]
+name = "windows-sys"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9"
+dependencies = [
+ "windows-targets 0.48.5",
+]
+
[[package]]
name = "windows-sys"
version = "0.52.0"
@@ -8322,6 +9698,21 @@ dependencies = [
"windows-link",
]
+[[package]]
+name = "windows-targets"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c"
+dependencies = [
+ "windows_aarch64_gnullvm 0.48.5",
+ "windows_aarch64_msvc 0.48.5",
+ "windows_i686_gnu 0.48.5",
+ "windows_i686_msvc 0.48.5",
+ "windows_x86_64_gnu 0.48.5",
+ "windows_x86_64_gnullvm 0.48.5",
+ "windows_x86_64_msvc 0.48.5",
+]
+
[[package]]
name = "windows-targets"
version = "0.52.6"
@@ -8355,6 +9746,12 @@ dependencies = [
"windows_x86_64_msvc 0.53.1",
]
+[[package]]
+name = "windows_aarch64_gnullvm"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8"
+
[[package]]
name = "windows_aarch64_gnullvm"
version = "0.52.6"
@@ -8367,6 +9764,12 @@ version = "0.53.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53"
+[[package]]
+name = "windows_aarch64_msvc"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc"
+
[[package]]
name = "windows_aarch64_msvc"
version = "0.52.6"
@@ -8379,6 +9782,12 @@ version = "0.53.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006"
+[[package]]
+name = "windows_i686_gnu"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e"
+
[[package]]
name = "windows_i686_gnu"
version = "0.52.6"
@@ -8403,6 +9812,12 @@ version = "0.53.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c"
+[[package]]
+name = "windows_i686_msvc"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406"
+
[[package]]
name = "windows_i686_msvc"
version = "0.52.6"
@@ -8415,6 +9830,12 @@ version = "0.53.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2"
+[[package]]
+name = "windows_x86_64_gnu"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e"
+
[[package]]
name = "windows_x86_64_gnu"
version = "0.52.6"
@@ -8427,6 +9848,12 @@ version = "0.53.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499"
+[[package]]
+name = "windows_x86_64_gnullvm"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc"
+
[[package]]
name = "windows_x86_64_gnullvm"
version = "0.52.6"
@@ -8439,6 +9866,12 @@ version = "0.53.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1"
+[[package]]
+name = "windows_x86_64_msvc"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538"
+
[[package]]
name = "windows_x86_64_msvc"
version = "0.52.6"
diff --git a/Cargo.toml b/Cargo.toml
index 75184a29..604a1a9e 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -24,6 +24,7 @@ members = [
"contracts/third-party",
"contracts/staking",
"contracts/governance",
+ "indexer",
]
resolver = "2"
diff --git a/Dockerfile.indexer b/Dockerfile.indexer
new file mode 100644
index 00000000..a6b9f66a
--- /dev/null
+++ b/Dockerfile.indexer
@@ -0,0 +1,17 @@
+FROM rust:1.76 as builder
+WORKDIR /app
+COPY Cargo.toml ./
+COPY indexer/Cargo.toml indexer/Cargo.toml
+RUN mkdir -p contracts && mkdir -p security-audit && mkdir -p contracts/lib && mkdir -p contracts/traits && mkdir -p contracts/proxy && mkdir -p contracts/escrow && mkdir -p contracts/ipfs-metadata && mkdir -p contracts/oracle && mkdir -p contracts/bridge && mkdir -p contracts/property-token && mkdir -p contracts/insurance && mkdir -p contracts/analytics && mkdir -p contracts/fees && mkdir -p contracts/compliance_registry && mkdir -p contracts/fractional && mkdir -p contracts/prediction-market && mkdir -p contracts/metadata && mkdir -p contracts/database && mkdir -p contracts/third-party && mkdir -p contracts/staking && mkdir -p contracts/governance
+# Create empty Cargo.toml for workspace members to allow cargo to resolve workspace (avoid building them)
+RUN bash -lc 'for d in contracts/* security-audit; do echo -e "[package]\nname=\"dummy-${d//\//-}\"\nversion=\"0.0.0\"\nedition=\"2021\"\n[lib]\npath=\"lib.rs\"\n" > $d/Cargo.toml && echo "" > $d/lib.rs; done'
+COPY indexer /app/indexer
+RUN cargo build -p propchain-indexer --release --features ingest
+
+FROM gcr.io/distroless/cc-debian12
+WORKDIR /app
+COPY --from=builder /app/target/release/propchain-indexer /usr/local/bin/propchain-indexer
+ENV RUST_LOG=info
+EXPOSE 8088
+ENTRYPOINT ["/usr/local/bin/propchain-indexer"]
+
diff --git a/cobertura.xml b/cobertura.xml
new file mode 100644
index 00000000..c3690191
--- /dev/null
+++ b/cobertura.xml
@@ -0,0 +1 @@
+/home/simze/web3-project/PropChain-contract
\ No newline at end of file
diff --git a/contracts/compliance_registry/lib.rs b/contracts/compliance_registry/lib.rs
index 05e04aa4..d936f264 100644
--- a/contracts/compliance_registry/lib.rs
+++ b/contracts/compliance_registry/lib.rs
@@ -536,6 +536,12 @@ mod compliance_registry {
pub lists_checked: Vec,
}
+ impl Default for ComplianceRegistry {
+ fn default() -> Self {
+ Self::new()
+ }
+ }
+
impl ComplianceRegistry {
/// Constructor
#[ink(constructor)]
diff --git a/contracts/database/src/lib.rs b/contracts/database/src/lib.rs
index 549fbf69..f5f6e068 100644
--- a/contracts/database/src/lib.rs
+++ b/contracts/database/src/lib.rs
@@ -275,6 +275,7 @@ mod propchain_database {
/// Records an analytics snapshot on-chain for later verification
#[ink(message)]
+ #[allow(clippy::too_many_arguments)]
pub fn record_analytics_snapshot(
&mut self,
total_properties: u64,
@@ -573,7 +574,6 @@ mod propchain_database {
// UNIT TESTS
// ========================================================================
-
// Unit tests extracted to tests.rs (Issue #101)
include!("tests.rs");
}
diff --git a/contracts/fractional/src/lib.rs b/contracts/fractional/src/lib.rs
index a2165717..7926aed5 100644
--- a/contracts/fractional/src/lib.rs
+++ b/contracts/fractional/src/lib.rs
@@ -64,7 +64,15 @@ mod fractional {
last_prices: Mapping::default(),
}
}
+ }
+ impl Default for Fractional {
+ fn default() -> Self {
+ Self::new()
+ }
+ }
+
+ impl Fractional {
#[ink(message)]
pub fn set_last_price(&mut self, token_id: u64, price_per_share: u128) {
self.last_prices.insert(token_id, &price_per_share);
diff --git a/contracts/property-token/src/lib.rs b/contracts/property-token/src/lib.rs
index 5b242424..9e96eeb0 100644
--- a/contracts/property-token/src/lib.rs
+++ b/contracts/property-token/src/lib.rs
@@ -328,6 +328,12 @@ mod property_token {
pub token_id: TokenId,
}
+ impl Default for PropertyToken {
+ fn default() -> Self {
+ Self::new()
+ }
+ }
+
impl PropertyToken {
/// Creates a new PropertyToken contract
#[ink(constructor)]
diff --git a/contracts/proxy/src/lib.rs b/contracts/proxy/src/lib.rs
index fbe40a61..45abd9b2 100644
--- a/contracts/proxy/src/lib.rs
+++ b/contracts/proxy/src/lib.rs
@@ -784,7 +784,6 @@ mod propchain_proxy {
}
}
-
// Unit tests extracted to tests.rs (Issue #101)
include!("tests.rs");
}
diff --git a/contracts/staking/src/lib.rs b/contracts/staking/src/lib.rs
index e20a7e70..c01a9610 100644
--- a/contracts/staking/src/lib.rs
+++ b/contracts/staking/src/lib.rs
@@ -54,7 +54,9 @@ mod staking {
#[ink(event)]
pub struct StakingConfigUpdated {
+ #[ink(topic)]
pub min_stake: u128,
+ #[ink(topic)]
pub reward_rate_bps: u128,
}
diff --git a/contracts/third-party/src/lib.rs b/contracts/third-party/src/lib.rs
index 066f7f12..34c55bca 100644
--- a/contracts/third-party/src/lib.rs
+++ b/contracts/third-party/src/lib.rs
@@ -527,7 +527,6 @@ mod propchain_third_party {
// UNIT TESTS
// ========================================================================
-
// Unit tests extracted to tests.rs (Issue #101)
include!("tests.rs");
}
diff --git a/contracts/traits/src/constants.rs b/contracts/traits/src/constants.rs
index 9174dbcb..215d90ac 100644
--- a/contracts/traits/src/constants.rs
+++ b/contracts/traits/src/constants.rs
@@ -1,8 +1,8 @@
-// Centralized configuration constants for PropChain contracts.
-//
-// All magic numbers are extracted here with documentation explaining
-// their purpose and valid ranges. Contracts import from this module
-// instead of using inline literals.
+//! Centralized configuration constants for PropChain contracts.
+//!
+//! All magic numbers are extracted here with documentation explaining
+//! their purpose and valid ranges. Contracts import from this module
+//! instead of using inline literals.
// ── Oracle Constants ─────────────────────────────────────────────────────────
diff --git a/docker-compose.yml b/docker-compose.yml
index a4daa803..ef17148a 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -58,6 +58,24 @@ services:
networks:
- propchain-network
+ # Event indexer and API
+ indexer:
+ build:
+ context: .
+ dockerfile: Dockerfile.indexer
+ container_name: propchain-indexer
+ environment:
+ DATABASE_URL: postgres://propchain:propchain123@postgres:5432/propchain
+ SUBSTRATE_WS: ws://substrate-node:9944
+ BIND_ADDR: 0.0.0.0:8088
+ depends_on:
+ - postgres
+ - substrate-node
+ ports:
+ - "8088:8088"
+ networks:
+ - propchain-network
+
volumes:
substrate_data:
ipfs_data:
diff --git a/indexer/Cargo.toml b/indexer/Cargo.toml
new file mode 100644
index 00000000..34838b75
--- /dev/null
+++ b/indexer/Cargo.toml
@@ -0,0 +1,31 @@
+[package]
+name = "propchain-indexer"
+version = "0.1.0"
+edition = "2021"
+
+[features]
+default = []
+ingest = ["subxt"]
+
+[dependencies]
+anyhow = "1.0"
+axum = { version = "0.7", features = ["macros", "json"] }
+axum-prometheus = "0.6"
+chrono = { version = "0.4", features = ["serde"] }
+clap = { version = "4.5", features = ["derive", "env"] }
+futures = "0.3"
+hex = "0.4"
+once_cell = "1.19"
+serde = { version = "1.0", features = ["derive"] }
+serde_json = "1.0"
+sqlx = { version = "0.7", features = ["postgres", "runtime-tokio-rustls", "chrono", "uuid"] }
+thiserror = "1.0"
+tokio = { version = "1.37", features = ["rt-multi-thread", "macros", "signal"] }
+tower = "0.4"
+tower-http = { version = "0.5", features = ["trace", "cors"] }
+tracing = "0.1"
+tracing-subscriber = { version = "0.3", features = ["env-filter"] }
+uuid = { version = "1.8", features = ["v4", "serde"] }
+subxt = { version = "0.33", optional = true }
+url = "2.5"
+
diff --git a/indexer/README.md b/indexer/README.md
new file mode 100644
index 00000000..859155d6
--- /dev/null
+++ b/indexer/README.md
@@ -0,0 +1,45 @@
+### PropChain Indexer and Event API
+
+This service ingests on-chain ink! contract events (via `Contracts::ContractEmitted`) and stores them in PostgreSQL with efficient indexes for querying. It also exposes a REST API for filtering and retrieving events, plus Prometheus metrics for performance monitoring.
+
+Setup
+
+- Environment:
+ - `DATABASE_URL` (e.g., postgres://propchain:propchain123@localhost:5432/propchain)
+ - `SUBSTRATE_WS` (e.g., ws://127.0.0.1:9944)
+ - `BIND_ADDR` (default: 0.0.0.0:8088)
+
+Run
+
+```bash
+cargo run -p propchain-indexer
+```
+
+API
+
+- GET /health
+- GET /events
+ - Query params: `contract`, `event_type`, `topic`, `from_ts`, `to_ts`, `from_block`, `to_block`, `limit`, `offset`
+ - `from_ts`/`to_ts` use RFC3339 timestamps
+- GET /metrics (Prometheus)
+
+Storage layout
+
+- Narrow append-only `contract_events` table:
+ - Core columns: `block_number`, `block_hash`, `block_timestamp`, `contract`, `payload_hex`
+ - Optional columns for decoded data: `event_type`, `topics[]`
+ - Composite/time-based indexes for efficient filtering
+
+Archiving strategy
+
+- Primary table sized for near-term queries (e.g., 90 days).
+- Archive older rows to cold storage (separate `events_archive` table or object store) via `scripts/archive-events.sh`.
+- Suggested enhancements:
+ - Postgres monthly partitioning by `block_timestamp` with retention policy
+ - Parquet export to S3 for long-term analytics
+
+Monitoring
+
+- Request metrics exposed at `/metrics`
+- Recommended Grafana dashboard: track p95/p99 query latency, insert throughput, errors
+
diff --git a/indexer/src/api.rs b/indexer/src/api.rs
new file mode 100644
index 00000000..4adc82c7
--- /dev/null
+++ b/indexer/src/api.rs
@@ -0,0 +1,86 @@
+use crate::db::{Db, EventQuery, IndexedEvent};
+use axum::{extract::Query, http::StatusCode, Json};
+use serde::Deserialize;
+use std::sync::Arc;
+
+#[derive(Clone)]
+pub struct ApiState {
+ pub db: Arc,
+}
+
+#[derive(Deserialize)]
+pub struct EventsParams {
+ pub contract: Option,
+ pub event_type: Option,
+ pub topic: Option,
+ pub from_ts: Option,
+ pub to_ts: Option,
+ pub from_block: Option,
+ pub to_block: Option,
+ pub limit: Option,
+ pub offset: Option,
+}
+
+pub async fn health() -> &'static str {
+ "ok"
+}
+
+pub async fn list_events(
+ state: axum::extract::State,
+ Query(params): Query,
+) -> Result>, (StatusCode, String)> {
+ let parse_ts = |s: Option| -> Result<_, String> {
+ if let Some(v) = s {
+ chrono::DateTime::parse_from_rfc3339(&v)
+ .map_err(|e| format!("invalid timestamp: {}", e))
+ .map(|dt| dt.with_timezone(&chrono::Utc))
+ .map(Some)
+ } else {
+ Ok(None)
+ }
+ };
+
+ let from_ts = parse_ts(params.from_ts).map_err(|e| (StatusCode::BAD_REQUEST, e))?;
+ let to_ts = parse_ts(params.to_ts).map_err(|e| (StatusCode::BAD_REQUEST, e))?;
+
+ let q = EventQuery {
+ contract: params.contract,
+ event_type: params.event_type,
+ topic: params.topic,
+ from_ts,
+ to_ts,
+ from_block: params.from_block,
+ to_block: params.to_block,
+ limit: params.limit,
+ offset: params.offset,
+ };
+
+ let res = state.db.query_events(&q).await.map_err(|e| {
+ (
+ StatusCode::INTERNAL_SERVER_ERROR,
+ format!("query failed: {}", e),
+ )
+ })?;
+ Ok(Json(res))
+}
+
+pub async fn list_contracts(
+ state: axum::extract::State,
+) -> Result>, (StatusCode, String)> {
+ let rows = sqlx::query_scalar::<_, String>(
+ r#"
+ SELECT DISTINCT contract
+ FROM contract_events
+ ORDER BY contract
+ "#,
+ )
+ .fetch_all(&state.db.pool)
+ .await
+ .map_err(|e| {
+ (
+ StatusCode::INTERNAL_SERVER_ERROR,
+ format!("query failed: {}", e),
+ )
+ })?;
+ Ok(Json(rows))
+}
diff --git a/indexer/src/db.rs b/indexer/src/db.rs
new file mode 100644
index 00000000..342b9906
--- /dev/null
+++ b/indexer/src/db.rs
@@ -0,0 +1,246 @@
+use chrono::{DateTime, Utc};
+use serde::{Deserialize, Serialize};
+use sqlx::{postgres::PgPoolOptions, PgPool, Postgres, Transaction};
+use uuid::Uuid;
+
+#[derive(Clone)]
+pub struct Db {
+ pub pool: PgPool,
+}
+
+impl Db {
+ pub async fn connect(database_url: &str, max_conns: u32) -> anyhow::Result {
+ let pool = PgPoolOptions::new()
+ .max_connections(max_conns)
+ .acquire_timeout(std::time::Duration::from_secs(10))
+ .connect(database_url)
+ .await?;
+ Ok(Self { pool })
+ }
+
+ pub async fn migrate(&self) -> anyhow::Result<()> {
+ // Minimal schema optimized for common filters and pagination.
+ // We use a narrow, append-only table with composite indexes.
+ let queries = [
+ r#"
+ CREATE TABLE IF NOT EXISTS contract_events (
+ id UUID PRIMARY KEY,
+ block_number BIGINT NOT NULL,
+ block_hash TEXT NOT NULL,
+ block_timestamp TIMESTAMPTZ NOT NULL,
+ contract TEXT NOT NULL,
+ event_type TEXT, -- optional, filled when decoded
+ topics TEXT[] DEFAULT NULL, -- optional, filled when decoded
+ payload_hex TEXT NOT NULL, -- raw event payload (hex)
+ inserted_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
+ );
+ "#,
+ // Core filtering indexes
+ r#"
+ CREATE INDEX IF NOT EXISTS contract_events_block_idx
+ ON contract_events (block_number DESC);
+ "#,
+ r#"
+ CREATE INDEX IF NOT EXISTS contract_events_time_idx
+ ON contract_events (block_timestamp DESC);
+ "#,
+ r#"
+ CREATE INDEX IF NOT EXISTS contract_events_contract_time_idx
+ ON contract_events (contract, block_timestamp DESC);
+ "#,
+ r#"
+ CREATE INDEX IF NOT EXISTS contract_events_event_type_time_idx
+ ON contract_events (event_type, block_timestamp DESC);
+ "#,
+ r#"
+ CREATE INDEX IF NOT EXISTS contract_events_topics_gin_idx
+ ON contract_events USING GIN (topics);
+ "#,
+ ];
+
+ let mut tx: Transaction<'_, Postgres> = self.pool.begin().await?;
+ for q in queries {
+ sqlx::query(q).execute(&mut *tx).await?;
+ }
+ tx.commit().await?;
+ Ok(())
+ }
+
+ #[cfg_attr(not(feature = "ingest"), allow(dead_code))]
+ #[allow(clippy::too_many_arguments)]
+ pub async fn insert_raw_event(
+ &self,
+ block_number: i64,
+ block_hash: &str,
+ block_timestamp: DateTime,
+ contract: &str,
+ payload_hex: &str,
+ event_type: Option<&str>,
+ topics: Option<&[String]>,
+ ) -> anyhow::Result<()> {
+ let id = Uuid::new_v4();
+ sqlx::query(
+ r#"
+ INSERT INTO contract_events
+ (id, block_number, block_hash, block_timestamp, contract, payload_hex, event_type, topics)
+ VALUES ($1, $2, $3, $4, $5, $6, $7, $8)
+ ON CONFLICT (id) DO NOTHING
+ "#,
+ )
+ .bind(id)
+ .bind(block_number)
+ .bind(block_hash)
+ .bind(block_timestamp)
+ .bind(contract)
+ .bind(payload_hex)
+ .bind(event_type)
+ .bind(topics)
+ .execute(&self.pool)
+ .await?;
+ Ok(())
+ }
+}
+
+#[derive(Debug, Serialize, Deserialize)]
+pub struct EventQuery {
+ pub contract: Option,
+ pub event_type: Option,
+ pub topic: Option,
+ pub from_ts: Option>,
+ pub to_ts: Option>,
+ pub from_block: Option,
+ pub to_block: Option,
+ pub limit: Option,
+ pub offset: Option,
+}
+
+#[derive(Debug, Serialize, Deserialize)]
+pub struct IndexedEvent {
+ pub id: Uuid,
+ pub block_number: i64,
+ pub block_hash: String,
+ pub block_timestamp: DateTime,
+ pub contract: String,
+ pub event_type: Option,
+ pub topics: Option>,
+ pub payload_hex: String,
+}
+
+impl Db {
+ #[allow(unused_assignments)]
+ pub async fn query_events(&self, q: &EventQuery) -> anyhow::Result> {
+ // Build dynamic filters
+ let mut conditions: Vec = Vec::new();
+ let mut args: Vec<(usize, String)> = Vec::new();
+ let mut bind_index = 1usize;
+
+ macro_rules! push_cond {
+ ($sql:expr, $val:expr) => {{
+ conditions.push(format!($sql, bind_index));
+ args.push((bind_index, $val.to_string()));
+ bind_index += 1;
+ }};
+ }
+
+ if let Some(ref c) = q.contract {
+ push_cond!("contract = ${}", c);
+ }
+ if let Some(ref et) = q.event_type {
+ push_cond!("event_type = ${}", et);
+ }
+ if let Some(ref t) = q.topic {
+ // topics are stored as TEXT[]; we use ANY()
+ conditions.push(format!("${} = ANY(topics)", bind_index));
+ args.push((bind_index, t.clone()));
+ bind_index += 1;
+ }
+ if let Some(from) = q.from_ts {
+ conditions.push(format!("block_timestamp >= ${}", bind_index));
+ args.push((bind_index, from.to_rfc3339()));
+ bind_index += 1;
+ }
+ if let Some(to) = q.to_ts {
+ conditions.push(format!("block_timestamp <= ${}", bind_index));
+ args.push((bind_index, to.to_rfc3339()));
+ bind_index += 1;
+ }
+ if let Some(from_b) = q.from_block {
+ conditions.push(format!("block_number >= ${}", bind_index));
+ args.push((bind_index, from_b.to_string()));
+ bind_index += 1;
+ }
+ if let Some(to_b) = q.to_block {
+ conditions.push(format!("block_number <= ${}", bind_index));
+ args.push((bind_index, to_b.to_string()));
+ bind_index += 1;
+ }
+
+ let predicate = if conditions.is_empty() {
+ "".to_string()
+ } else {
+ format!("WHERE {}", conditions.join(" AND "))
+ };
+
+ let limit = q.limit.unwrap_or(100).min(5_000);
+ let offset = q.offset.unwrap_or(0);
+
+ let base_sql = format!(
+ "
+ SELECT id, block_number, block_hash, block_timestamp, contract, event_type, topics, payload_hex
+ FROM contract_events
+ {}
+ ORDER BY block_timestamp DESC, block_number DESC
+ LIMIT {} OFFSET {}
+ ",
+ predicate, limit, offset
+ );
+
+ // Build query with dynamic binds
+ let mut query = sqlx::query_as::<
+ _,
+ (
+ Uuid,
+ i64,
+ String,
+ DateTime,
+ String,
+ Option,
+ Option>,
+ String,
+ ),
+ >(&base_sql);
+ for (_idx, val) in args {
+ // sqlx doesn't support dynamic index binding directly; use push_bind in order
+ // We already baked the positions; but here order matters only.
+ // We'll just push in the order constructed.
+ query = query.bind(val);
+ }
+
+ let rows = query.fetch_all(&self.pool).await?;
+ let events = rows
+ .into_iter()
+ .map(
+ |(
+ id,
+ block_number,
+ block_hash,
+ block_timestamp,
+ contract,
+ event_type,
+ topics,
+ payload_hex,
+ )| IndexedEvent {
+ id,
+ block_number,
+ block_hash,
+ block_timestamp,
+ contract,
+ event_type,
+ topics,
+ payload_hex,
+ },
+ )
+ .collect();
+ Ok(events)
+ }
+}
diff --git a/indexer/src/ingest.rs b/indexer/src/ingest.rs
new file mode 100644
index 00000000..9e3d4b73
--- /dev/null
+++ b/indexer/src/ingest.rs
@@ -0,0 +1,86 @@
+#![cfg(all(feature = "ingest", not(test)))]
+use crate::db::Db;
+use anyhow::Context;
+use chrono::Utc;
+use futures::StreamExt;
+use std::sync::Arc;
+use subxt::{backend::rpc::RpcClient, OnlineClient, PolkadotConfig};
+use tracing::{error, info, warn};
+
+pub async fn run_ingestor(db: Arc, ws_endpoint: String) -> anyhow::Result<()> {
+ let client = OnlineClient::::from_rpc_client(
+ RpcClient::from_url(ws_endpoint.clone())
+ .await
+ .context("connect ws")?,
+ )
+ .await
+ .context("build client")?;
+
+ info!("Indexer connected to node: {}", ws_endpoint);
+
+ let mut sub = client
+ .blocks()
+ .subscribe_finalized()
+ .await
+ .context("subscribe finalized blocks")?;
+
+ while let Some(Ok(block)) = sub.next().await {
+ let num = block.number();
+ let hash = block.hash();
+ // Use wall-clock timestamp for broad compatibility
+ let ts = Utc::now();
+
+ // Fetch events for this block
+ let events = block.events().await;
+ let events = match events {
+ Ok(e) => e,
+ Err(e) => {
+ warn!("failed to fetch events for block {}: {}", num, e);
+ continue;
+ }
+ };
+
+ for ev in events.iter() {
+ let Ok(ev) = ev else { continue };
+ // We only index Contracts::ContractEmitted to capture ink! events.
+ if ev.pallet_name() == "Contracts" && ev.variant_name() == "ContractEmitted" {
+ // dynamic decoding: fields are (contract, data)
+ let Ok(values) = ev.field_values() else {
+ continue;
+ };
+ if values.len() != 2 {
+ continue;
+ }
+ let contract = values[0]
+ .as_value()
+ .and_then(|v| v.as_bytes())
+ .map(|b| format!("0x{}", hex::encode(b)));
+ let data_hex = values[1]
+ .as_value()
+ .and_then(|v| v.as_bytes())
+ .map(|b| format!("0x{}", hex::encode(b)));
+
+ if let (Some(contract), Some(payload_hex)) = (contract, data_hex) {
+ // Minimal enrichment: include contract address in topics for quick filtering
+ let topics = vec![contract.clone()];
+ if let Err(e) = db
+ .insert_raw_event(
+ num as i64,
+ &format!("{hash:?}"),
+ ts,
+ &contract,
+ &payload_hex,
+ None,
+ Some(&topics),
+ )
+ .await
+ {
+ error!("insert event failed: {}", e);
+ }
+ }
+ }
+ }
+ }
+
+ Ok(())
+}
diff --git a/indexer/src/main.rs b/indexer/src/main.rs
new file mode 100644
index 00000000..ba36dc2b
--- /dev/null
+++ b/indexer/src/main.rs
@@ -0,0 +1,111 @@
+mod api;
+mod db;
+mod ingest;
+
+use crate::api::{health, list_events, ApiState};
+use anyhow::Context;
+use axum::{routing::get, Router};
+use axum_prometheus::PrometheusMetricLayer;
+use clap::Parser;
+use std::net::SocketAddr;
+use std::sync::Arc;
+use tokio::net::TcpListener;
+use tower_http::cors::{Any, CorsLayer};
+use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt, EnvFilter};
+
+#[derive(Parser, Debug)]
+#[command(name = "propchain-indexer")]
+#[command(about = "PropChain event indexer and query API", long_about = None)]
+struct Config {
+ #[arg(long, env = "DATABASE_URL")]
+ database_url: String,
+
+ #[arg(long, env = "SUBSTRATE_WS", default_value = "ws://127.0.0.1:9944")]
+ substrate_ws: String,
+
+ #[arg(long, env = "BIND_ADDR", default_value = "0.0.0.0:8088")]
+ bind_addr: String,
+
+ #[arg(long, env = "DB_MAX_CONNS", default_value_t = 10)]
+ db_max_conns: u32,
+}
+
+#[tokio::main]
+async fn main() -> anyhow::Result<()> {
+ tracing_subscriber::registry()
+ .with(EnvFilter::from_default_env().add_directive("info".parse()?))
+ .with(tracing_subscriber::fmt::layer().compact())
+ .init();
+
+ let cfg = Config::parse();
+
+ let db = db::Db::connect(&cfg.database_url, cfg.db_max_conns)
+ .await
+ .context("connect database")?;
+ db.migrate().await.context("run migrations")?;
+
+ let db = Arc::new(db);
+
+ // Start ingestor in background
+ #[cfg(feature = "ingest")]
+ {
+ let db_clone = db.clone();
+ let ws = cfg.substrate_ws.clone();
+ tokio::spawn(async move {
+ if let Err(e) = ingest::run_ingestor(db_clone, ws).await {
+ tracing::error!("ingestor exited: {e}");
+ }
+ });
+ }
+
+ let (prometheus_layer, metric_handle) = PrometheusMetricLayer::pair();
+ let cors = CorsLayer::new()
+ .allow_origin(Any)
+ .allow_methods(Any)
+ .allow_headers(Any);
+
+ let api_state = ApiState { db: db.clone() };
+
+ let app = Router::new()
+ .route("/health", get(health))
+ .route("/events", get(list_events))
+ .route("/contracts", get(crate::api::list_contracts))
+ .route("/metrics", get(|| async move { metric_handle.render() }))
+ .with_state(api_state)
+ .layer(prometheus_layer)
+ .layer(cors);
+
+ let addr: SocketAddr = cfg.bind_addr.parse().context("parse bind addr")?;
+ tracing::info!("Indexer API listening on http://{}", addr);
+ let listener = TcpListener::bind(addr).await?;
+ axum::serve(listener, app)
+ .with_graceful_shutdown(shutdown_signal())
+ .await
+ .context("serve")?;
+
+ Ok(())
+}
+
+async fn shutdown_signal() {
+ let ctrl_c = async {
+ tokio::signal::ctrl_c()
+ .await
+ .expect("failed to install Ctrl+C handler");
+ };
+
+ #[cfg(unix)]
+ let terminate = async {
+ tokio::signal::unix::signal(tokio::signal::unix::SignalKind::terminate())
+ .expect("failed to install signal handler")
+ .recv()
+ .await;
+ };
+
+ #[cfg(not(unix))]
+ let terminate = std::future::pending::<()>();
+
+ tokio::select! {
+ _ = ctrl_c => {},
+ _ = terminate => {},
+ }
+}
diff --git a/scripts/archive-events.sh b/scripts/archive-events.sh
new file mode 100644
index 00000000..45a098fd
--- /dev/null
+++ b/scripts/archive-events.sh
@@ -0,0 +1,32 @@
+#!/usr/bin/env bash
+set -euo pipefail
+
+# Simple archiving script:
+# - Move rows older than N days from contract_events to events_archive
+# - This is a starting point; consider partitioning for large-scale deployments
+#
+# Usage:
+# DATABASE_URL=postgres://user:pass@host:5432/db ./scripts/archive-events.sh 90
+
+RETENTION_DAYS="${1:-90}"
+DATABASE_URL="${DATABASE_URL:-}"
+if [[ -z "${DATABASE_URL}" ]]; then
+ echo "DATABASE_URL is required" >&2
+ exit 1
+fi
+
+psql "${DATABASE_URL}" <