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}" <