From 214593e0a9c9422ed666a7daf8bfef573191dd97 Mon Sep 17 00:00:00 2001 From: 0xevolve Date: Tue, 18 Jun 2024 14:49:19 +0200 Subject: [PATCH] feat: starknet-rs migration (#28) * feat: starknet-rs migration * fix: removed unused code --- Cargo.lock | 277 ++++++++-------------------- Cargo.toml | 2 +- src/config.rs | 41 ++-- src/lib.rs | 1 + src/main.rs | 2 + src/monitoring/on_off_deviation.rs | 21 +-- src/monitoring/publisher_balance.rs | 11 +- src/monitoring/source_deviation.rs | 18 +- src/processing/api.rs | 6 +- src/processing/common.rs | 5 +- src/tests/common/fixtures.rs | 7 +- src/tests/common/utils.rs | 25 ++- src/utils.rs | 20 ++ 13 files changed, 164 insertions(+), 272 deletions(-) create mode 100644 src/utils.rs diff --git a/Cargo.lock b/Cargo.lock index fa4cca2..1927cca 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -58,70 +58,6 @@ version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bddcadddf5e9015d310179a59bb28c4d4b9920ad0f11e8e14dbadf654890c9a6" -[[package]] -name = "ark-ff" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec847af850f44ad29048935519032c33da8aa03340876d351dfab5660d2966ba" -dependencies = [ - "ark-ff-asm", - "ark-ff-macros", - "ark-serialize", - "ark-std", - "derivative", - "digest", - "itertools", - "num-bigint", - "num-traits", - "paste", - "rustc_version", - "zeroize", -] - -[[package]] -name = "ark-ff-asm" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ed4aa4fe255d0bc6d79373f7e31d2ea147bcf486cba1be5ba7ea85abdb92348" -dependencies = [ - "quote", - "syn 1.0.109", -] - -[[package]] -name = "ark-ff-macros" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" -dependencies = [ - "num-bigint", - "num-traits", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "ark-serialize" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" -dependencies = [ - "ark-std", - "digest", - "num-bigint", -] - -[[package]] -name = "ark-std" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" -dependencies = [ - "num-traits", - "rand", -] - [[package]] name = "arrayvec" version = "0.7.4" @@ -136,7 +72,7 @@ checksum = "a66537f1bb974b254c98ed142ff995236e81b9d0fe4db0575f46612cb15eb0f9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.66", ] [[package]] @@ -217,7 +153,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.66", ] [[package]] @@ -247,18 +183,6 @@ version = "0.21.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "35636a1494ede3b646cc98f74f8e62c773a38a659ebc777a2cf26b9b74171df9" -[[package]] -name = "bigdecimal" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6773ddc0eafc0e509fb60e48dff7f450f8e674a0686ae8605e8d9901bd5eefa" -dependencies = [ - "num-bigint", - "num-integer", - "num-traits", - "serde", -] - [[package]] name = "bigdecimal" version = "0.4.2" @@ -460,7 +384,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.41", + "syn 2.0.66", ] [[package]] @@ -471,7 +395,7 @@ checksum = "836a9bbc7ad63342d6d6e7b815ccab164bc77a2d95d84bc3117a8c0d5c98e2d5" dependencies = [ "darling_core", "quote", - "syn 2.0.41", + "syn 2.0.66", ] [[package]] @@ -503,24 +427,13 @@ dependencies = [ "serde", ] -[[package]] -name = "derivative" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "diesel" version = "2.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "62c6fcf842f17f8c78ecf7c81d75c5ce84436b41ee07e03f490fbb5f5a8731d8" dependencies = [ - "bigdecimal 0.4.2", + "bigdecimal", "bitflags 2.4.1", "byteorder", "chrono", @@ -569,7 +482,7 @@ dependencies = [ "diesel_table_macro_syntax", "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.66", ] [[package]] @@ -589,7 +502,7 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc5557efc453706fed5e4fa85006fe9817c224c3f480a34c7e5959fd700921c5" dependencies = [ - "syn 2.0.41", + "syn 2.0.66", ] [[package]] @@ -609,12 +522,6 @@ version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77c90badedccf4105eca100756a0b1289e191f6fcbdadd3cee1d2f614f97da8f" -[[package]] -name = "either" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" - [[package]] name = "encoding_rs" version = "0.8.33" @@ -834,7 +741,7 @@ checksum = "53b153fd91e4b0147f4aced87be237c98248656bb01050b96bf3ee89220a8ddb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.66", ] [[package]] @@ -1181,15 +1088,6 @@ dependencies = [ "windows-sys 0.48.0", ] -[[package]] -name = "itertools" -version = "0.10.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" -dependencies = [ - "either", -] - [[package]] name = "itoa" version = "1.0.10" @@ -1214,6 +1112,12 @@ dependencies = [ "cpufeatures", ] +[[package]] +name = "lambdaworks-math" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "358e172628e713b80a530a59654154bfc45783a6ed70ea284839800cebdf8f97" + [[package]] name = "lazy_static" version = "1.4.0" @@ -1382,9 +1286,9 @@ dependencies = [ [[package]] name = "num-traits" -version = "0.2.17" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ "autocfg", ] @@ -1437,7 +1341,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.66", ] [[package]] @@ -1507,12 +1411,6 @@ dependencies = [ "windows-targets 0.48.5", ] -[[package]] -name = "paste" -version = "1.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" - [[package]] name = "pbkdf2" version = "0.11.0" @@ -1558,7 +1456,7 @@ dependencies = [ "phf_shared", "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.66", ] [[package]] @@ -1587,7 +1485,7 @@ checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" dependencies = [ "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.66", ] [[package]] @@ -1665,7 +1563,7 @@ dependencies = [ "arc-swap", "axum", "axum-macros", - "bigdecimal 0.4.2", + "bigdecimal", "chrono", "deadpool", "diesel", @@ -1739,9 +1637,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.70" +version = "1.0.85" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39278fbbf5fb4f646ce651690877f89d1c5811a3d4acb27700c1cb3cdb78fd3b" +checksum = "22244ce15aa966053a896d1accb3a6e68469b97c7f33f284b99f0d576879fc23" dependencies = [ "unicode-ident", ] @@ -1769,9 +1667,9 @@ checksum = "106dd99e98437432fed6519dedecfade6a06a73bb7b2a1e019fdd2bee5778d94" [[package]] name = "quote" -version = "1.0.33" +version = "1.0.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" +checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" dependencies = [ "proc-macro2", ] @@ -1964,7 +1862,7 @@ dependencies = [ "regex", "relative-path", "rustc_version", - "syn 2.0.41", + "syn 2.0.66", "unicode-ident", ] @@ -2132,22 +2030,22 @@ checksum = "836fa6a3e1e547f9a2c4040802ec865b5d85f4014efe00555d7090a3dcaa1090" [[package]] name = "serde" -version = "1.0.193" +version = "1.0.203" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25dd9975e68d0cb5aa1120c288333fc98731bd1dd12f561e468ea4728c042b89" +checksum = "7253ab4de971e72fb7be983802300c30b5a7f0c2e56fab8abfc6a214307c0094" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.193" +version = "1.0.203" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3" +checksum = "500cbc0ebeb6f46627f50f3f5811ccf6bf00643be300b4c3eabc0ef55dc5b5ba" dependencies = [ "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.66", ] [[package]] @@ -2228,7 +2126,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.66", ] [[package]] @@ -2310,15 +2208,14 @@ checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" [[package]] name = "starknet" -version = "0.9.0" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36f8002bf3d750dd2c0434aca8b5e88e2438cd6c452f4c18f34d0a8a9f42cb1a" +checksum = "1e633a772f59214c296d5037c95c36b72792c9360323818da2b625c7b4ec4b49" dependencies = [ "starknet-accounts", "starknet-contract", "starknet-core", "starknet-crypto", - "starknet-ff", "starknet-macros", "starknet-providers", "starknet-signers", @@ -2326,13 +2223,14 @@ dependencies = [ [[package]] name = "starknet-accounts" -version = "0.8.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8e39a5807a735343493781dd5e640c4af838de470b0a73f420bed642fdc2ff1" +checksum = "eee8a6b588a22c7e79f5d8d4e33413387db63a8beb98be8610138541794cc0a5" dependencies = [ "async-trait", "auto_impl", "starknet-core", + "starknet-crypto", "starknet-providers", "starknet-signers", "thiserror", @@ -2340,9 +2238,9 @@ dependencies = [ [[package]] name = "starknet-contract" -version = "0.8.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4996991356cd0e9499c663680eba7e77de4109e4995f652c1608899a65c09ee" +checksum = "a5f91344f1e0b81873b6dc235c50ae4d084c6ea4dd4a1e3e27ad895803adb610" dependencies = [ "serde", "serde_json", @@ -2355,11 +2253,12 @@ dependencies = [ [[package]] name = "starknet-core" -version = "0.9.0" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b15034c07557615f6bea248cb2ac91a103f56792c515319025a5edc4de2a60e" +checksum = "415c55b2384be74b4d9d92346bf4eccc570618dd97d9596ebcdd41776cb6e482" dependencies = [ "base64 0.21.5", + "crypto-bigint", "flate2", "hex", "serde", @@ -2368,14 +2267,14 @@ dependencies = [ "serde_with", "sha3", "starknet-crypto", - "starknet-ff", + "starknet-types-core", ] [[package]] name = "starknet-crypto" -version = "0.6.1" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33c03f5ac70f9b067f48db7d2d70bdf18ee0f731e8192b6cfa679136becfcdb0" +checksum = "7cc4ac48f3df819dbd02bbc912f8005edc6aebe03df3158370e486bc94c1caae" dependencies = [ "crypto-bigint", "hex", @@ -2387,65 +2286,51 @@ dependencies = [ "sha2", "starknet-crypto-codegen", "starknet-curve", - "starknet-ff", + "starknet-types-core", "zeroize", ] [[package]] name = "starknet-crypto-codegen" -version = "0.3.2" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af6527b845423542c8a16e060ea1bc43f67229848e7cd4c4d80be994a84220ce" +checksum = "2e179dedc3fa6da064e56811d3e05d446aa2f7459e4eb0e3e49378a337235437" dependencies = [ "starknet-curve", - "starknet-ff", - "syn 2.0.41", + "starknet-types-core", + "syn 2.0.66", ] [[package]] name = "starknet-curve" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a68a0d87ae56572abf83ddbfd44259a7c90dbeeee1629a1ffe223e7f9a8f3052" -dependencies = [ - "starknet-ff", -] - -[[package]] -name = "starknet-ff" -version = "0.3.6" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "067419451efdea1ee968df8438369960c167e0e905c05b84afd074f50e1d6f3d" +checksum = "56935b306dcf0b8f14bb2a1257164b8478bb8be4801dfae0923f5b266d1b457c" dependencies = [ - "ark-ff", - "bigdecimal 0.3.1", - "crypto-bigint", - "getrandom", - "hex", - "num-bigint", - "serde", + "starknet-types-core", ] [[package]] name = "starknet-macros" -version = "0.1.6" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c5d2964612f0ccd0a700279e33cfc98d6db04f64645ff834f3b7ec422142d7a" +checksum = "f4fe4f8d615329410578cbedcdbaa4a36c7f28f68c3f3ac56006cfbdaeaa2b41" dependencies = [ "starknet-core", - "syn 2.0.41", + "syn 2.0.66", ] [[package]] name = "starknet-providers" -version = "0.9.0" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a4bd1c262936543d6d14d299f476585e8c9625a4e284d9255b54f1c2e68e64a" +checksum = "59c85e0a0f4563ae95dfeae14ea0f0c70610efc0ec2462505c64eff5765e7b97" dependencies = [ "async-trait", "auto_impl", "ethereum-types", "flate2", + "getrandom", "log", "reqwest", "serde", @@ -2458,20 +2343,34 @@ dependencies = [ [[package]] name = "starknet-signers" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c5eb659e66b56ceafb9025cd601226d8f34d273f1b826cd4053ab6333ff0898" +checksum = "c17da2139119dbe3aacf1d5d4338798a5c489d17f424916ceb9d2efd83554f87" dependencies = [ "async-trait", "auto_impl", "crypto-bigint", "eth-keystore", + "getrandom", "rand", "starknet-core", "starknet-crypto", "thiserror", ] +[[package]] +name = "starknet-types-core" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe29a53d28ff630e4c7827788f14b28f9386d27cb9d05186a5f2e73218c34677" +dependencies = [ + "lambdaworks-math", + "num-bigint", + "num-integer", + "num-traits", + "serde", +] + [[package]] name = "static_assertions" version = "1.1.0" @@ -2514,7 +2413,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.41", + "syn 2.0.66", ] [[package]] @@ -2536,9 +2435,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.41" +version = "2.0.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44c8b28c477cc3bf0e7966561e3460130e1255f7a1cf71931075f1c5e7a7e269" +checksum = "c42f3f41a2de00b01c0aaad383c5a45241efc8b2d1eda5661812fda5f3cdcff5" dependencies = [ "proc-macro2", "quote", @@ -2617,7 +2516,7 @@ checksum = "266b2e40bc00e5a6c09c3584011e08b06f123c00362c92b975ba9843aaaa14b8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.66", ] [[package]] @@ -2700,7 +2599,7 @@ checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.66", ] [[package]] @@ -2987,7 +2886,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.66", "wasm-bindgen-shared", ] @@ -3021,7 +2920,7 @@ checksum = "f0eb82fcb7930ae6219a7ecfd55b217f5f0893484b7a13022ebb2b2bf20b5283" dependencies = [ "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.66", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -3263,17 +3162,3 @@ name = "zeroize" version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" -dependencies = [ - "zeroize_derive", -] - -[[package]] -name = "zeroize_derive" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.41", -] diff --git a/Cargo.toml b/Cargo.toml index a1f5c62..aaf553a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -38,7 +38,7 @@ phf = { version = "0.11", features = ["macros"] } prometheus = "0.13.3" reqwest = { version = "0.11.22", features = ["json"] } serde = { version = "1.0.130", features = ["derive"] } -starknet = "0.9.0" +starknet = "0.11.0" strum = { version = "0.25.0", features = ["derive"] } tokio = { version = "1", features = ["full"] } url = "2.5.0" diff --git a/src/config.rs b/src/config.rs index 9e95185..36777b1 100644 --- a/src/config.rs +++ b/src/config.rs @@ -8,7 +8,7 @@ use std::{ use arc_swap::{ArcSwap, Guard}; use starknet::{ core::{ - types::{BlockId, BlockTag, FieldElement, FunctionCall}, + types::{BlockId, BlockTag, Felt, FunctionCall}, utils::{cairo_short_string_to_felt, parse_cairo_short_string}, }, macros::selector, @@ -18,7 +18,7 @@ use strum::{Display, EnumString, IntoStaticStr}; use tokio::sync::OnceCell; use url::Url; -use crate::constants::CONFIG_UPDATE_INTERVAL; +use crate::{constants::CONFIG_UPDATE_INTERVAL, utils::try_felt_to_u32}; #[derive(Debug, Clone, EnumString, IntoStaticStr)] pub enum NetworkName { @@ -37,14 +37,16 @@ pub enum DataType { } #[derive(Debug, Clone)] +#[allow(dead_code)] pub struct Network { pub name: NetworkName, pub provider: Arc>, - pub oracle_address: FieldElement, - pub publisher_registry_address: FieldElement, + pub oracle_address: Felt, + pub publisher_registry_address: Felt, } #[derive(Debug, Clone)] +#[allow(dead_code)] pub struct DataInfo { pub pairs: Vec, pub sources: HashMap>, @@ -56,7 +58,7 @@ pub struct DataInfo { #[allow(unused)] pub struct Config { data_info: HashMap, - publishers: HashMap, + publishers: HashMap, network: Network, indexer_url: String, } @@ -119,8 +121,7 @@ impl Config { Config::new(ConfigInput { network: NetworkName::from_str(&network).expect("Invalid network name"), - oracle_address: FieldElement::from_hex_be(&oracle_address) - .expect("Invalid oracle address"), + oracle_address: Felt::from_hex_unchecked(&oracle_address), spot_pairs: parse_pairs(&spot_pairs), future_pairs: parse_pairs(&future_pairs), }) @@ -155,7 +156,7 @@ impl Config { } } - pub fn all_publishers(&self) -> &HashMap { + pub fn all_publishers(&self) -> &HashMap { &self.publishers } } @@ -163,7 +164,7 @@ impl Config { #[derive(Debug, Clone)] pub struct ConfigInput { pub network: NetworkName, - pub oracle_address: FieldElement, + pub oracle_address: Felt, pub spot_pairs: Vec, pub future_pairs: Vec, } @@ -222,8 +223,8 @@ pub async fn config_force_init(config_input: ConfigInput) { async fn init_publishers( rpc_client: &JsonRpcClient, - oracle_address: FieldElement, -) -> (HashMap, FieldElement) { + oracle_address: Felt, +) -> (HashMap, Felt) { // Fetch publisher registry address let publisher_registry_address = *rpc_client .call( @@ -269,7 +270,7 @@ async fn init_publishers( .filter(|publisher| !excluded_publishers.contains(publisher)) .collect::>(); - let mut publishers_map: HashMap = HashMap::new(); + let mut publishers_map: HashMap = HashMap::new(); for publisher in publishers { let field_publisher = cairo_short_string_to_felt(&publisher).expect("Failed to parse publisher"); @@ -294,7 +295,7 @@ async fn init_publishers( async fn init_spot_config( rpc_client: &JsonRpcClient, - oracle_address: FieldElement, + oracle_address: Felt, pairs: Vec, ) -> DataInfo { let mut sources: HashMap> = HashMap::new(); @@ -315,7 +316,7 @@ async fn init_spot_config( FunctionCall { contract_address: oracle_address, entry_point_selector: selector!("get_decimals"), - calldata: vec![FieldElement::ZERO, field_pair], + calldata: vec![Felt::ZERO, field_pair], }, BlockId::Tag(BlockTag::Latest), ) @@ -324,7 +325,7 @@ async fn init_spot_config( .first() .unwrap(); - decimals.insert(pair.to_string(), spot_decimals.try_into().unwrap()); + decimals.insert(pair.to_string(), try_felt_to_u32(&spot_decimals).unwrap()); // Fetch sources let spot_pair_sources = rpc_client @@ -332,7 +333,7 @@ async fn init_spot_config( FunctionCall { contract_address: oracle_address, entry_point_selector: selector!("get_all_sources"), - calldata: vec![FieldElement::ZERO, field_pair], + calldata: vec![Felt::ZERO, field_pair], }, BlockId::Tag(BlockTag::Latest), ) @@ -366,7 +367,7 @@ async fn init_spot_config( async fn init_future_config( rpc_client: &JsonRpcClient, - oracle_address: FieldElement, + oracle_address: Felt, pairs: Vec, ) -> DataInfo { let mut sources: HashMap> = HashMap::new(); @@ -387,7 +388,7 @@ async fn init_future_config( FunctionCall { contract_address: oracle_address, entry_point_selector: selector!("get_decimals"), - calldata: vec![FieldElement::ONE, field_pair, FieldElement::ZERO], + calldata: vec![Felt::ONE, field_pair, Felt::ZERO], }, BlockId::Tag(BlockTag::Latest), ) @@ -396,7 +397,7 @@ async fn init_future_config( .first() .unwrap(); - decimals.insert(pair.to_string(), future_decimals.try_into().unwrap()); + decimals.insert(pair.to_string(), try_felt_to_u32(&future_decimals).unwrap()); // Fetch sources let future_pair_sources = rpc_client @@ -404,7 +405,7 @@ async fn init_future_config( FunctionCall { contract_address: oracle_address, entry_point_selector: selector!("get_all_sources"), - calldata: vec![FieldElement::ONE, field_pair, FieldElement::ZERO], + calldata: vec![Felt::ONE, field_pair, Felt::ZERO], }, BlockId::Tag(BlockTag::Latest), ) diff --git a/src/lib.rs b/src/lib.rs index c3310c3..6a36dce 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -3,3 +3,4 @@ pub(crate) mod constants; pub mod models; pub mod schema; pub mod types; +pub(crate) mod utils; diff --git a/src/main.rs b/src/main.rs index a355cd8..ca651cd 100644 --- a/src/main.rs +++ b/src/main.rs @@ -32,6 +32,8 @@ mod schema; mod constants; // Types mod types; +// Utils +mod utils; #[cfg(test)] mod tests; diff --git a/src/monitoring/on_off_deviation.rs b/src/monitoring/on_off_deviation.rs index ed0d0ea..2158a4f 100644 --- a/src/monitoring/on_off_deviation.rs +++ b/src/monitoring/on_off_deviation.rs @@ -1,7 +1,7 @@ use bigdecimal::ToPrimitive; use starknet::{ core::{ - types::{BlockId, BlockTag, FieldElement, FunctionCall}, + types::{BlockId, BlockTag, Felt, FunctionCall}, utils::cairo_short_string_to_felt, }, macros::selector, @@ -13,6 +13,7 @@ use crate::{ config::{get_config, DataType}, constants::COINGECKO_IDS, error::MonitoringError, + utils::try_felt_to_u32, }; /// On-chain price deviation from the reference price. @@ -39,8 +40,8 @@ pub async fn on_off_price_deviation( let field_pair = cairo_short_string_to_felt(&pair_id).expect("failed to convert pair id"); let calldata = match data_type { - DataType::Spot => vec![FieldElement::ZERO, field_pair], - DataType::Future => vec![FieldElement::ONE, field_pair, FieldElement::ZERO], + DataType::Spot => vec![Felt::ZERO, field_pair], + DataType::Future => vec![Felt::ONE, field_pair, Felt::ZERO], }; let data = client @@ -55,19 +56,10 @@ pub async fn on_off_price_deviation( .await .map_err(|e| MonitoringError::OnChain(e.to_string()))?; - let decimals = - config - .decimals(data_type.clone()) - .get(&pair_id) - .ok_or(MonitoringError::OnChain(format!( - "Failed to get decimals for pair {:?}", - pair_id - )))?; - let on_chain_price = data .first() .ok_or(MonitoringError::OnChain("No data".to_string()))? - .to_big_decimal(*decimals) + .to_bigint() .to_f64() .ok_or(MonitoringError::Conversion( "Failed to convert to f64".to_string(), @@ -117,7 +109,8 @@ pub async fn on_off_price_deviation( .get_price(); let deviation = (reference_price - on_chain_price) / on_chain_price; - let num_sources_aggregated = (*data.get(3).unwrap()).try_into().map_err(|e| { + let num_sources = data.get(3).unwrap(); + let num_sources_aggregated = try_felt_to_u32(num_sources).map_err(|e| { MonitoringError::Conversion(format!("Failed to convert num sources {:?}", e)) })?; (deviation, num_sources_aggregated) diff --git a/src/monitoring/publisher_balance.rs b/src/monitoring/publisher_balance.rs index 0b4c9d9..2e75afe 100644 --- a/src/monitoring/publisher_balance.rs +++ b/src/monitoring/publisher_balance.rs @@ -1,24 +1,23 @@ use bigdecimal::ToPrimitive; use starknet::{ - core::types::{BlockId, BlockTag, FieldElement, FunctionCall}, + core::types::{BlockId, BlockTag, Felt, FunctionCall}, macros::selector, providers::Provider, }; -use crate::constants::{FEE_TOKEN_ADDRESS, FEE_TOKEN_DECIMALS}; +use crate::constants::FEE_TOKEN_ADDRESS; use crate::{config::get_config, error::MonitoringError}; /// Returns the balance of a given publisher address /// Note: Currently only reads ETH balance -pub async fn publisher_balance(publisher_address: FieldElement) -> Result { +pub async fn publisher_balance(publisher_address: Felt) -> Result { let config = get_config(None).await; let client = &config.network().provider; let token_balance = client .call( FunctionCall { - contract_address: FieldElement::from_hex_be(FEE_TOKEN_ADDRESS) - .expect("failed to convert token address"), + contract_address: Felt::from_hex_unchecked(FEE_TOKEN_ADDRESS), entry_point_selector: selector!("balanceOf"), calldata: vec![publisher_address], }, @@ -30,7 +29,7 @@ pub async fn publisher_balance(publisher_address: FieldElement) -> Result( FunctionCall { contract_address: config.network().oracle_address, entry_point_selector: selector!("get_data_median"), - calldata: vec![FieldElement::ZERO, field_pair], + calldata: vec![Felt::ZERO, field_pair], }, BlockId::Tag(BlockTag::Latest), ) .await .map_err(|e| MonitoringError::OnChain(e.to_string()))?; - let decimals = config - .decimals(query.data_type()) - .get(query.pair_id()) - .ok_or(MonitoringError::OnChain(format!( - "Failed to get decimals for pair {:?}", - query.pair_id() - )))?; - let on_chain_price = data .first() .ok_or(MonitoringError::OnChain("No data".to_string()))? - .to_big_decimal(*decimals) + .to_bigint() .to_f64() .ok_or(MonitoringError::Conversion( "Failed to convert to f64".to_string(), ))?; let deviation = (normalized_price - on_chain_price) / on_chain_price; - let num_sources_aggregated = (*data.get(3).unwrap()).try_into().map_err(|e| { + let num_sources_aggregated = try_felt_to_u32(data.get(3).unwrap()).map_err(|e| { MonitoringError::Conversion(format!("Failed to convert num sources {:?}", e)) })?; diff --git a/src/processing/api.rs b/src/processing/api.rs index e8c2346..a489264 100644 --- a/src/processing/api.rs +++ b/src/processing/api.rs @@ -68,7 +68,7 @@ pub async fn process_sequencer_data() -> Result<(), MonitoringError> { parsed_price.to_string().parse::().unwrap() / 10_f64.powi(result.decimals as i32); let provider = match network_env { - "Testnet" => SequencerGatewayProvider::starknet_alpha_goerli(), + "Testnet" => SequencerGatewayProvider::starknet_alpha_sepolia(), "Mainnet" => SequencerGatewayProvider::starknet_alpha_mainnet(), _ => panic!("Invalid network env"), }; @@ -79,8 +79,8 @@ pub async fn process_sequencer_data() -> Result<(), MonitoringError> { .await .map_err(MonitoringError::Provider)?; - let eth = block.eth_l1_gas_price.to_big_decimal(18); - let strk = block.strk_l1_gas_price.to_big_decimal(18); + let eth = block.l1_gas_price.price_in_wei.to_bigint(); + let strk = block.l1_gas_price.price_in_fri.to_bigint(); let expected_price = (strk / eth).to_f64().ok_or(MonitoringError::Conversion( "Failed to convert expected price to f64".to_string(), diff --git a/src/processing/common.rs b/src/processing/common.rs index f4cd134..8cf8286 100644 --- a/src/processing/common.rs +++ b/src/processing/common.rs @@ -6,7 +6,7 @@ use crate::{ }; use reqwest::header::{HeaderMap, HeaderName, HeaderValue}; use serde::{Deserialize, Serialize}; -use starknet::core::types::FieldElement; +use starknet::core::types::Felt; use starknet::providers::{jsonrpc::HttpTransport, JsonRpcClient, Provider}; #[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] pub struct IndexerServerStatus { @@ -106,6 +106,7 @@ async fn blocks_left( // "decimals": 18 // } #[derive(serde::Deserialize, Debug)] +#[allow(dead_code)] pub struct PragmaDataDTO { pub num_sources_aggregated: u32, pub pair_id: String, @@ -169,7 +170,7 @@ pub async fn query_pragma_api( pub async fn check_publisher_balance( publisher: String, - publisher_address: FieldElement, + publisher_address: Felt, ) -> Result<(), MonitoringError> { let config = get_config(None).await; let balance = publisher_balance(publisher_address).await?; diff --git a/src/tests/common/fixtures.rs b/src/tests/common/fixtures.rs index c156f63..b807834 100644 --- a/src/tests/common/fixtures.rs +++ b/src/tests/common/fixtures.rs @@ -4,7 +4,7 @@ use arc_swap::Guard; use deadpool::managed::Pool; use diesel_async::pooled_connection::AsyncDieselConnectionManager; use rstest::fixture; -use starknet::core::types::FieldElement; +use starknet::core::types::Felt; use crate::config::{config_force_init, get_config, Config, ConfigInput, NetworkName}; @@ -23,10 +23,9 @@ pub fn database() -> Pool Guard> { config_force_init(ConfigInput { network: NetworkName::Testnet, - oracle_address: FieldElement::from_hex_be( + oracle_address: Felt::from_hex_unchecked( "0x06df335982dddce41008e4c03f2546fa27276567b5274c7d0c1262f3c2b5d167", - ) - .unwrap(), + ), spot_pairs: vec!["ETH/USD".to_string(), "BTC/USD".to_string()], future_pairs: vec!["ETH/USD".to_string(), "BTC/USD".to_string()], }) diff --git a/src/tests/common/utils.rs b/src/tests/common/utils.rs index 908707b..97af2eb 100644 --- a/src/tests/common/utils.rs +++ b/src/tests/common/utils.rs @@ -4,7 +4,7 @@ use starknet::{ accounts::{single_owner::SignError, Account, AccountError, Call, SingleOwnerAccount}, core::{ chain_id, - types::{FieldElement, InvokeTransactionResult}, + types::{Felt, InvokeTransactionResult}, utils::{cairo_short_string_to_felt, get_selector_from_name}, }, providers::{jsonrpc::HttpTransport, JsonRpcClient}, @@ -41,11 +41,10 @@ pub fn build_single_owner_account<'a>( account_address: &str, is_legacy: bool, ) -> RpcAccount<'a> { - let signer = LocalWallet::from(SigningKey::from_secret_scalar( - FieldElement::from_hex_be(private_key).unwrap(), - )); - let account_address = - FieldElement::from_hex_be(account_address).expect("Invalid Contract Address"); + let signer = LocalWallet::from(SigningKey::from_secret_scalar(Felt::from_hex_unchecked( + private_key, + ))); + let account_address = Felt::from_hex_unchecked(account_address); let execution_encoding = if is_legacy { starknet::accounts::ExecutionEncoding::Legacy } else { @@ -55,14 +54,14 @@ pub fn build_single_owner_account<'a>( rpc, signer, account_address, - chain_id::TESTNET, + chain_id::SEPOLIA, execution_encoding, ) } pub async fn publish_data( provider: &JsonRpcClient, - oracle_address: FieldElement, + oracle_address: Felt, pair_id: &str, timestamp: &str, price: &str, @@ -77,8 +76,8 @@ pub async fn publish_data( ); let pair_id = cairo_short_string_to_felt(pair_id).expect("Invalid pair id"); - let timestamp = FieldElement::from_dec_str(timestamp).expect("Invalid timestamp"); - let price = FieldElement::from_dec_str(price).expect("Invalid price"); + let timestamp = Felt::from_dec_str(timestamp).expect("Invalid timestamp"); + let price = Felt::from_dec_str(price).expect("Invalid price"); let source = cairo_short_string_to_felt(source).expect("Invalid source"); let publisher = cairo_short_string_to_felt(publisher).expect("Invalid publisher"); @@ -86,15 +85,15 @@ pub async fn publish_data( to: oracle_address, selector: get_selector_from_name("publish_data").unwrap(), calldata: vec![ - FieldElement::ZERO, + Felt::ZERO, timestamp, source, publisher, price, pair_id, - FieldElement::ZERO, + Felt::ZERO, ], }]; - let tx = publisher_account.execute(calls); + let tx = publisher_account.execute_v1(calls); tx.send().await } diff --git a/src/utils.rs b/src/utils.rs new file mode 100644 index 0000000..a77354f --- /dev/null +++ b/src/utils.rs @@ -0,0 +1,20 @@ +use num_bigint::BigUint; +use starknet::core::types::Felt; + +#[derive(Debug)] +pub enum FeltConversionError { + Overflow, +} + +pub(crate) fn try_felt_to_u32(felt: &Felt) -> Result { + let biguint = felt.to_biguint(); + let u32_max = BigUint::from(u32::MAX); + + // assert!(biguint <= u32_max, "Felt value doesn't fit in u32"); + if biguint > u32_max { + return Err(FeltConversionError::Overflow); + } + + // Convert to u32, safe due to previous check + Ok(biguint.to_u32_digits()[0]) +}