From cb887c9583710e67824e933bf74d925b97e636d7 Mon Sep 17 00:00:00 2001 From: MujkicA <32431923+MujkicA@users.noreply.github.com> Date: Tue, 27 Feb 2024 14:58:38 +0100 Subject: [PATCH 01/11] fix: cmp ordering of dispense tracker entries (#53) Fixes comparison between entries of the dispense tracker --- src/dispense_tracker.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dispense_tracker.rs b/src/dispense_tracker.rs index 1307573..ecd2025 100644 --- a/src/dispense_tracker.rs +++ b/src/dispense_tracker.rs @@ -13,7 +13,7 @@ pub struct Entry { impl Ord for Entry { fn cmp(&self, other: &Self) -> Ordering { - other.timestamp.cmp(&self.timestamp) + self.timestamp.cmp(&other.timestamp) } } From 0d9391a2785158b32533446741bfeee9492415c9 Mon Sep 17 00:00:00 2001 From: Sophie Dankel <47993817+sdankel@users.noreply.github.com> Date: Tue, 5 Mar 2024 14:34:45 -0800 Subject: [PATCH 02/11] Add agreement checkboxes (#58) --- static/index.html | 31 +++++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/static/index.html b/static/index.html index f76ec24..01fe4aa 100644 --- a/static/index.html +++ b/static/index.html @@ -138,6 +138,14 @@ color: #949494; } + .agreements { + text-align: left; + margin-top: 25px; + line-height: 1.4em; + color: #555; + font-size: 14px; + } + .queued { display: flex; flex-direction: column; @@ -220,8 +228,16 @@
Waiting until more tokens are available
+
+ +
+ +
+ +
+
- +

Test Ether sent to the wallet

@@ -243,6 +259,17 @@

Test Ether sent to the wallet

} } + let agreements = document.getElementById('agreements'); + function hasAgreed() { + let inputs = agreements.getElementsByTagName('input'); + let inputsList = Array.prototype.slice.call(inputs); + return inputsList.every(i => i.checked); + } + + agreements.onchange = function() { + form.querySelector("input[type=submit]").disabled = !hasAgreed(); + }; + function hasCaptcha() { return !!document.getElementsByClassName("captcha-container")[0]; } @@ -260,7 +287,7 @@

Test Ether sent to the wallet

document.getElementsByClassName("captcha-container")[0].classList.remove("hidden"); } document.getElementsByClassName("queued")[0].classList.add("hidden"); - form.querySelector("input[type=submit]").disabled = false; + form.querySelector("input[type=submit]").disabled = !hasAgreed(); } function give_me_coins(form) { From ee618bc6c4badffec7e7cb13baf71072925f05ce Mon Sep 17 00:00:00 2001 From: Green Baneling Date: Thu, 7 Mar 2024 11:17:34 +0100 Subject: [PATCH 03/11] Skip arguments in the logs (#59) --- src/routes.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/routes.rs b/src/routes.rs index 5bd91ce..47af2e9 100644 --- a/src/routes.rs +++ b/src/routes.rs @@ -64,7 +64,7 @@ pub async fn main(Extension(config): Extension) -> Html { Html(render_page(public_node_url, captcha_key)) } -#[tracing::instrument(skip(wallet))] +#[tracing::instrument(skip_all)] pub async fn health(Extension(wallet): Extension) -> Response { // ping client for health let client = wallet @@ -202,7 +202,7 @@ async fn submit_tx_with_timeout( Ok(()) } -#[tracing::instrument(skip(wallet, config))] +#[tracing::instrument(skip_all)] pub async fn dispense_tokens( Json(input): Json, Extension(wallet): Extension, @@ -352,7 +352,7 @@ pub async fn dispense_tokens( }) } -#[tracing::instrument(skip(config))] +#[tracing::instrument(skip_all)] pub async fn dispense_info( Extension(config): Extension, ) -> Result { From 7c261fa84d479301402d86ca790232ebd42ef08e Mon Sep 17 00:00:00 2001 From: MujkicA <32431923+MujkicA@users.noreply.github.com> Date: Sat, 16 Mar 2024 08:37:19 +0100 Subject: [PATCH 04/11] Limit retries on dispense (#63) * limit retries and add better logging * make in progress explicit * Minimize chance of miss behaviour --------- Co-authored-by: xgreenx --- src/dispense_tracker.rs | 62 ++++++++++++++---------------- src/lib.rs | 2 +- src/main.rs | 4 +- src/models.rs | 10 +++++ src/routes.rs | 83 +++++++++++++++++++++++++++-------------- 5 files changed, 94 insertions(+), 67 deletions(-) diff --git a/src/dispense_tracker.rs b/src/dispense_tracker.rs index ecd2025..4ec62d2 100644 --- a/src/dispense_tracker.rs +++ b/src/dispense_tracker.rs @@ -1,45 +1,30 @@ -use std::{ - cmp::Ordering, - collections::{BinaryHeap, HashMap, HashSet}, -}; +use std::collections::BTreeMap; +use std::collections::{HashMap, HashSet}; +use std::time::{SystemTime, UNIX_EPOCH}; use fuel_types::Address; -#[derive(Debug, Eq, PartialEq)] -pub struct Entry { - address: Address, - timestamp: u64, -} - -impl Ord for Entry { - fn cmp(&self, other: &Self) -> Ordering { - self.timestamp.cmp(&other.timestamp) - } -} - -impl PartialOrd for Entry { - fn partial_cmp(&self, other: &Self) -> Option { - Some(self.cmp(other)) - } -} - pub trait Clock: std::fmt::Debug + Send + Sync { fn now(&self) -> u64; } #[derive(Debug)] -pub struct TokioTime {} +pub struct StdTime {} -impl Clock for TokioTime { +impl Clock for StdTime { fn now(&self) -> u64 { - tokio::time::Instant::now().elapsed().as_secs() + let start = SystemTime::now(); + let since_the_epoch = start + .duration_since(UNIX_EPOCH) + .expect("Time went backwards"); + since_the_epoch.as_secs() } } #[derive(Debug)] pub struct DispenseTracker { tracked: HashMap, - queue: BinaryHeap, + queue: BTreeMap>, in_progress: HashSet
, clock: Box, } @@ -48,9 +33,9 @@ impl Default for DispenseTracker { fn default() -> Self { Self { tracked: HashMap::default(), - queue: BinaryHeap::default(), + queue: Default::default(), in_progress: HashSet::default(), - clock: Box::new(TokioTime {}), + clock: Box::new(StdTime {}), } } } @@ -59,7 +44,7 @@ impl DispenseTracker { pub fn new(clock: impl Clock + 'static) -> Self { Self { tracked: HashMap::new(), - queue: BinaryHeap::new(), + queue: Default::default(), in_progress: HashSet::new(), clock: Box::new(clock), } @@ -70,7 +55,7 @@ impl DispenseTracker { let timestamp = self.clock.now(); self.tracked.insert(address, timestamp); - self.queue.push(Entry { address, timestamp }); + self.queue.entry(timestamp).or_default().push(address); } pub fn mark_in_progress(&mut self, address: Address) { @@ -84,10 +69,13 @@ impl DispenseTracker { pub fn evict_expired_entries(&mut self, eviction_duration: u64) { let now = self.clock.now(); - while let Some(oldest_entry) = self.queue.peek() { - if now - oldest_entry.timestamp > eviction_duration { - let removed_entry = self.queue.pop().unwrap(); - self.tracked.remove(&removed_entry.address); + while let Some(oldest_entry) = self.queue.first_entry() { + if now - oldest_entry.key() > eviction_duration { + let (_, addresses) = oldest_entry.remove_entry(); + + for address in addresses { + self.tracked.remove(&address); + } } else { break; } @@ -95,6 +83,10 @@ impl DispenseTracker { } pub fn has_tracked(&self, address: &Address) -> bool { - self.tracked.get(address).is_some() || self.in_progress.contains(address) + self.tracked.get(address).is_some() + } + + pub fn is_in_progress(&self, address: &Address) -> bool { + self.in_progress.contains(address) } } diff --git a/src/lib.rs b/src/lib.rs index 019b8bc..3599a1a 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -42,7 +42,7 @@ mod dispense_tracker; mod recaptcha; mod routes; -pub use dispense_tracker::{Clock, TokioTime}; +pub use dispense_tracker::{Clock, StdTime}; pub use routes::THE_BIGGEST_AMOUNT; #[derive(Debug)] diff --git a/src/main.rs b/src/main.rs index f89c5e6..8549ea1 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,11 +1,11 @@ -use fuel_faucet::{config::Config, start_server, TokioTime}; +use fuel_faucet::{config::Config, start_server, StdTime}; use tracing_subscriber::EnvFilter; #[tokio::main] async fn main() { let config = Config::default(); init_logger(&config); - let clock = TokioTime {}; + let clock = StdTime {}; let (_, task) = start_server(config, clock).await; let _ = task.await.unwrap(); } diff --git a/src/models.rs b/src/models.rs index 42b4b33..9255906 100644 --- a/src/models.rs +++ b/src/models.rs @@ -1,3 +1,5 @@ +use std::fmt::{self, Display, Formatter}; + use reqwest::StatusCode; use serde::{Deserialize, Serialize}; @@ -24,3 +26,11 @@ pub struct DispenseError { pub status: StatusCode, pub error: String, } + +impl Display for DispenseError { + fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { + write!(f, "{self:?}") + } +} + +impl std::error::Error for DispenseError {} diff --git a/src/routes.rs b/src/routes.rs index 47af2e9..51aee11 100644 --- a/src/routes.rs +++ b/src/routes.rs @@ -135,6 +135,13 @@ fn check_and_mark_dispense_limit( )); } + if tracker.is_in_progress(&address) { + return Err(error( + "Account is already in the process of receiving assets".to_string(), + StatusCode::TOO_MANY_REQUESTS, + )); + } + tracker.mark_in_progress(address); Ok(()) } @@ -238,27 +245,37 @@ pub async fn dispense_tokens( } check_and_mark_dispense_limit(&dispense_tracker, address, config.dispense_limit_interval)?; - let cleanup = || { + + struct CleanUpper(Fn) + where + Fn: FnMut(); + + impl Drop for CleanUpper + where + Fn: FnMut(), + { + fn drop(&mut self) { + self.0(); + } + } + + // We want to remove the address from `in_progress` regardless of the outcome of the transaction. + let _cleanup = CleanUpper(|| { dispense_tracker .lock() .unwrap() .remove_in_progress(&address); - }; + }); let provider = wallet.provider().expect("client provider"); - let mut tx_id; - loop { + let mut tx_id = None; + for _ in 0..5 { let mut guard = state.lock().await; let coin_output = if let Some(previous_coin_output) = &guard.last_output { *previous_coin_output } else { - get_coin_output(&wallet, config.dispense_amount) - .await - .map_err(|e| { - cleanup(); - e - })? + get_coin_output(&wallet, config.dispense_amount).await? }; let coin_type = CoinType::Coin(Coin { @@ -296,55 +313,63 @@ pub async fn dispense_tokens( .fee_checked_from_tx(&network_config.network_info.consensus_parameters) .expect("Should be able to calculate fee"); - tx_id = script.id(network_config.network_info.consensus_parameters.chain_id); + let id = script.id(network_config.network_info.consensus_parameters.chain_id); let result = tokio::time::timeout( Duration::from_secs(config.timeout), provider.send_transaction(script), ) .await - .map(|r| { + .map_err(|_| { + error( + format!("Timeout while submitting transaction for address: {address:X}"), + StatusCode::INTERNAL_SERVER_ERROR, + ) + }) + .and_then(|r| { r.map_err(|e| { error( - format!("Failed to submit transaction: {e}"), + format!( + "Failed to submit transaction for address: {address:X} with error: {}", + e + ), StatusCode::INTERNAL_SERVER_ERROR, ) }) - }) - .map_err(|e| { - error( - format!("Timeout while submitting transaction: {e}"), - StatusCode::INTERNAL_SERVER_ERROR, - ) }); match result { - Ok(Ok(_)) => { + Ok(_) => { guard.last_output = Some(CoinOutput { - utxo_id: UtxoId::new(tx_id, 1), + utxo_id: UtxoId::new(id, 1), owner: coin_output.owner, amount: coin_output.amount - total_fee.min_fee() - config.dispense_amount, }); + tx_id = Some(id); break; } - _ => { + Err(e) => { + tracing::warn!("{}", e); guard.last_output = None; } }; } - submit_tx_with_timeout(&client, &tx_id, config.timeout) - .await - .map_err(|e| { - cleanup(); - e - })?; + let Some(tx_id) = tx_id else { + return Err(error( + "Failed to submit transaction".to_string(), + StatusCode::INTERNAL_SERVER_ERROR, + )); + }; + + submit_tx_with_timeout(&client, &tx_id, config.timeout).await?; info!( "dispensed {} tokens to {:#x}", config.dispense_amount, &address ); - dispense_tracker.lock().unwrap().track(address); + let mut tracker = dispense_tracker.lock().unwrap(); + tracker.track(address); Ok(DispenseResponse { status: "Success".to_string(), From 1ab2314c19d344b3a8739f1e79661f94f7034295 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luiz=20Est=C3=A1cio=20=7C=20stacio=2Eeth?= Date: Wed, 27 Mar 2024 16:01:35 -0300 Subject: [PATCH 05/11] feat: update tx link (#64) --- src/models.rs | 1 + src/routes.rs | 1 + static/index.html | 7 ++----- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/models.rs b/src/models.rs index 9255906..79c1ffb 100644 --- a/src/models.rs +++ b/src/models.rs @@ -19,6 +19,7 @@ pub struct DispenseInput { pub struct DispenseResponse { pub status: String, pub tokens: u64, + pub tx_id: String, } #[derive(Debug)] diff --git a/src/routes.rs b/src/routes.rs index 51aee11..221f091 100644 --- a/src/routes.rs +++ b/src/routes.rs @@ -374,6 +374,7 @@ pub async fn dispense_tokens( Ok(DispenseResponse { status: "Success".to_string(), tokens: config.dispense_amount, + tx_id: tx_id.to_string(), }) } diff --git a/static/index.html b/static/index.html index 01fe4aa..5e7f087 100644 --- a/static/index.html +++ b/static/index.html @@ -247,8 +247,7 @@

Test Ether sent to the wallet

Node url: {{ public_node_url }}
- - - - -
-
- -
-
- - -
-

- This is a Test Ether faucet running on the - Test Fuel network. This faucet sends fake Ether - assets to the provided wallet address. -

-
- {{#if captcha_key}} -
-
-
- {{/if}} - -
-
- -
- -
- -
-
-
- -
-
-

Test Ether sent to the wallet

- See on Fuel Explorer -
-
-
Node url: {{ public_node_url }}
- - - - \ No newline at end of file + + + + + {{ page_title }} + + + + + + + +
+
+ + + + diff --git a/tests/dispense.rs b/tests/dispense.rs index ba1809d..e967901 100644 --- a/tests/dispense.rs +++ b/tests/dispense.rs @@ -1,11 +1,15 @@ +use axum::async_trait; use fuel_core::chain_config::{ChainConfig, CoinConfig, StateConfig}; use fuel_core::service::config::Trigger; use fuel_core::service::{Config as NodeConfig, FuelService}; use fuel_core_client::client::pagination::{PageDirection, PaginationRequest}; +use fuel_faucet::auth::{AuthError, AuthHandler}; use fuel_faucet::config::Config; + use fuel_faucet::models::DispenseInfoResponse; -use fuel_faucet::{start_server, Clock, THE_BIGGEST_AMOUNT}; +use fuel_faucet::{start_server, Clock}; + use fuel_tx::{ConsensusParameters, FeeParameters}; use fuel_types::{Address, AssetId}; use fuels_accounts::fuel_crypto::SecretKey; @@ -17,11 +21,15 @@ use rand::rngs::StdRng; use rand::{Rng, SeedableRng}; use secrecy::Secret; use serde_json::json; +use std::collections::HashSet; use std::net::SocketAddr; use std::sync::{Arc, Mutex}; use std::time::Duration; use std::usize; +// The amount to fetch the biggest input of the faucet. +const THE_BIGGEST_AMOUNT: u64 = u32::MAX as u64; + #[derive(Debug, Clone)] struct MockClock { timer: Arc>, @@ -45,12 +53,45 @@ impl MockClock { } } +#[derive(Debug, Clone)] +struct MockAuthHandler { + user_ids: Arc>>, +} + +impl MockAuthHandler { + pub fn new() -> Self { + Self { + user_ids: Default::default(), + } + } + + pub fn register_user(&self, user_id: String) { + self.user_ids.lock().as_deref_mut().unwrap().insert(user_id); + } + + pub fn is_registered(&self, user_id: &str) -> bool { + self.user_ids.lock().as_deref().unwrap().contains(user_id) + } +} + +#[async_trait] +impl AuthHandler for MockAuthHandler { + async fn get_user_session(&self, user_id: &str) -> Result { + if self.is_registered(user_id) { + Ok(user_id.to_string()) + } else { + Err(AuthError::new("User needs to be registered")) + } + } +} + struct TestContext { #[allow(dead_code)] fuel_node: FuelService, faucet_config: Config, provider: Provider, addr: SocketAddr, + auth_handler: MockAuthHandler, clock: MockClock, } impl TestContext { @@ -134,18 +175,65 @@ impl TestContext { }; let clock = MockClock::new(); - let (addr, _) = start_server(faucet_config.clone(), clock.clone()).await; + let auth_handler = MockAuthHandler::new(); + let (addr, _) = + start_server(faucet_config.clone(), clock.clone(), auth_handler.clone()).await; Self { fuel_node, faucet_config, provider, addr, + auth_handler, clock, } } } +struct DispenseRequest { + client: reqwest::Client, + recipient_address: String, + addr: SocketAddr, +} +impl DispenseRequest { + fn for_recipient(recipient_address: String, context: &TestContext) -> Self { + context + .auth_handler + .register_user(recipient_address.clone()); + + let client = reqwest::ClientBuilder::new() + .cookie_store(true) + .build() + .unwrap(); + + Self { + client, + recipient_address, + addr: context.addr, + } + } + + async fn send(&self) -> reqwest::Result { + let addr = self.addr; + self.client + .post(format!("http://{addr}/api/session/validate")) + .json(&json!({ + "value": self.recipient_address, + })) + .send() + .await + .unwrap(); + + self.client + .post(format!("http://{addr}/api/dispense")) + .json(&json!({ + "address": self.recipient_address, + })) + .send() + .await + } +} + #[tokio::test] async fn can_start_server() { let context = TestContext::new(StdRng::seed_from_u64(42)).await; @@ -174,7 +262,7 @@ async fn dispense_sends_coins_to_valid_address_hex_address() { let mut rng = StdRng::seed_from_u64(42); let recipient_address: Address = rng.gen(); - _dispense_sends_coins_to_valid_address( + dispense_sends_coins_to_valid_address( rng, recipient_address.into(), format!("{:#x}", &recipient_address), @@ -187,7 +275,7 @@ async fn dispense_sends_coins_to_valid_address_non_hex() { let mut rng = StdRng::seed_from_u64(42); let recipient_address: Address = rng.gen(); - _dispense_sends_coins_to_valid_address( + dispense_sends_coins_to_valid_address( rng, recipient_address.into(), format!("{}", &recipient_address), @@ -195,21 +283,18 @@ async fn dispense_sends_coins_to_valid_address_non_hex() { .await } -async fn _dispense_sends_coins_to_valid_address( +async fn dispense_sends_coins_to_valid_address( rng: StdRng, recipient_address: Bech32Address, recipient_address_str: String, ) { let context = TestContext::new(rng).await; - let addr = context.addr; - let client = reqwest::Client::new(); - client - .post(format!("http://{addr}/dispense")) - .json(&json!({ - "captcha": "", - "address": recipient_address_str, - })) + context + .auth_handler + .register_user(recipient_address_str.clone()); + + DispenseRequest::for_recipient(recipient_address_str, &context) .send() .await .unwrap(); @@ -241,19 +326,12 @@ async fn many_concurrent_requests() { const COUNT: usize = 30; let recipient_addresses_str = generate_recipient_addresses(COUNT, &mut rng); let context = TestContext::new(rng).await; - let addr = context.addr; let mut queries = vec![]; for recipient in recipient_addresses_str { - let recipient = recipient.clone(); - queries.push(async move { - let client = reqwest::Client::new(); - client - .post(format!("http://{addr}/dispense")) - .json(&json!({ - "captcha": "", - "address": recipient, - })) + queries.push(async { + context.auth_handler.register_user(recipient.clone()); + DispenseRequest::for_recipient(recipient, &context) .send() .await }); @@ -286,17 +364,14 @@ async fn dispense_once_per_day() { let recipient_address: Address = rng.gen(); let recipient_address_str = format!("{}", &recipient_address); let context = TestContext::new(rng).await; - let addr = context.addr; let dispense_interval = 24 * 60 * 60; let time_increment = dispense_interval / 6; - let response = reqwest::Client::new() - .post(format!("http://{addr}/dispense")) - .json(&json!({ - "captcha": "", - "address": recipient_address_str.clone(), - })) + context + .auth_handler + .register_user(recipient_address_str.clone()); + let response = DispenseRequest::for_recipient(recipient_address_str.clone(), &context) .send() .await .expect("First dispensing request should be successful"); @@ -306,12 +381,7 @@ async fn dispense_once_per_day() { for _ in 0..5 { context.clock.advance(time_increment); - let response = reqwest::Client::new() - .post(format!("http://{addr}/dispense")) - .json(&json!({ - "captcha": "", - "address": recipient_address_str.clone(), - })) + let response = DispenseRequest::for_recipient(recipient_address_str.clone(), &context) .send() .await .expect("Subsequent dispensing requests should be successfully sent"); @@ -320,12 +390,7 @@ async fn dispense_once_per_day() { } context.clock.advance(time_increment + 1); - let response = reqwest::Client::new() - .post(format!("http://{addr}/dispense")) - .json(&json!({ - "captcha": "", - "address": recipient_address_str.clone(), - })) + let response = DispenseRequest::for_recipient(recipient_address_str.clone(), &context) .send() .await .expect("Dispensing requests after the interval should be successful"); From a1e252998e8d4815b893d4b551715e898e18c15d Mon Sep 17 00:00:00 2001 From: Green Baneling Date: Mon, 22 Apr 2024 11:28:06 +0200 Subject: [PATCH 07/11] Revert "feat: add claim using auth" (#67) Revert "feat: add claim using auth (#61)" This reverts commit 7175ccb6612167caab22f4a07df0a3c6ce4bfa1b. --- .github/workflows/ci.yml | 21 +- .gitignore | 29 +- .prettierrc | 12 - Cargo.lock | 1684 +++-------------- Cargo.toml | 33 +- README.md | 47 +- build.rs | 13 +- deployment/Dockerfile | 21 - .../charts/templates/fuel-faucet-deploy.yaml | 16 +- deployment/charts/values.yaml | 4 +- deployment/scripts/.env | 6 +- frontend/bun.lockb | Bin 43453 -> 0 bytes frontend/package.json | 21 - frontend/src/app.tsx | 21 - frontend/src/components/faucet-form.tsx | 137 -- frontend/src/components/fuel-logo.tsx | 35 - frontend/src/hooks/use-claim.tsx | 151 -- frontend/src/index.tsx | 7 - frontend/src/lib/api.ts | 71 - frontend/src/lib/claim.ts | 51 - frontend/src/types.d.ts | 7 - frontend/tsconfig.json | 29 - src/auth.rs | 31 - src/auth/clerk.rs | 43 - src/config.rs | 10 +- src/constants.rs | 5 +- src/dispense_tracker.rs | 38 +- src/lib.rs | 88 +- src/main.rs | 8 +- src/models.rs | 5 +- src/recaptcha.rs | 39 + src/{routes/dispense.rs => routes.rs} | 193 +- src/routes/favicon.rs | 5 - src/routes/health.rs | 41 - src/routes/main.rs | 56 - src/routes/mod.rs | 7 - src/routes/session_remove.rs | 8 - src/routes/session_validate.rs | 35 - src/routes/static_files.rs | 49 - static/favicon.svg | 3 - static/index.css | 77 - static/index.html | 362 +++- tests/dispense.rs | 149 +- 43 files changed, 911 insertions(+), 2757 deletions(-) delete mode 100644 .prettierrc delete mode 100755 frontend/bun.lockb delete mode 100644 frontend/package.json delete mode 100644 frontend/src/app.tsx delete mode 100644 frontend/src/components/faucet-form.tsx delete mode 100644 frontend/src/components/fuel-logo.tsx delete mode 100644 frontend/src/hooks/use-claim.tsx delete mode 100644 frontend/src/index.tsx delete mode 100644 frontend/src/lib/api.ts delete mode 100644 frontend/src/lib/claim.ts delete mode 100644 frontend/src/types.d.ts delete mode 100644 frontend/tsconfig.json delete mode 100644 src/auth.rs delete mode 100644 src/auth/clerk.rs create mode 100644 src/recaptcha.rs rename src/{routes/dispense.rs => routes.rs} (69%) delete mode 100644 src/routes/favicon.rs delete mode 100644 src/routes/health.rs delete mode 100644 src/routes/main.rs delete mode 100644 src/routes/mod.rs delete mode 100644 src/routes/session_remove.rs delete mode 100644 src/routes/session_validate.rs delete mode 100644 src/routes/static_files.rs delete mode 100644 static/favicon.svg delete mode 100644 static/index.css diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 41643bd..a76fd86 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -27,7 +27,7 @@ jobs: needs: cancel-previous-runs runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 with: profile: minimal @@ -56,7 +56,7 @@ jobs: needs: cancel-previous-runs runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 with: toolchain: ${{ env.RUST_VERSION }} @@ -70,7 +70,7 @@ jobs: needs: cancel-previous-runs runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 with: toolchain: ${{ env.RUST_VERSION }} @@ -85,7 +85,7 @@ jobs: needs: cancel-previous-runs runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 with: profile: minimal @@ -101,7 +101,7 @@ jobs: needs: cancel-previous-runs runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 with: profile: minimal @@ -124,16 +124,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout repository - uses: actions/checkout@v4 - - - name: Installing Bun - uses: oven-sh/setup-bun@v1 - - - name: Building Frontend - run: | - cd frontend - bun install - bun run build + uses: actions/checkout@v2 - name: Docker meta id: meta diff --git a/.gitignore b/.gitignore index 74dee6d..d8f63cd 100644 --- a/.gitignore +++ b/.gitignore @@ -1,29 +1,2 @@ .DS_Store -target -node_modules -# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -pnpm-debug.log* -lerna-debug.log* - -node_modules -dist -dist-ssr -*.local - -# Editor directories and files -.vscode/* -!.vscode/extensions.json -.idea -.DS_Store -*.suo -*.ntvs* -*.njsproj -*.sln -*.sw? - -static/js +/target diff --git a/.prettierrc b/.prettierrc deleted file mode 100644 index 3a789a3..0000000 --- a/.prettierrc +++ /dev/null @@ -1,12 +0,0 @@ -{ - "singleQuote": false, - "printWidth": 80, - "overrides": [ - { - "files": ["**/*.html"], - "options": { - "printWidth": 120 - } - } - ] -} diff --git a/Cargo.lock b/Cargo.lock index 3f14e86..72b0988 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -12,186 +12,6 @@ dependencies = [ "regex", ] -[[package]] -name = "actix-codec" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f7b0a21988c1bf877cf4759ef5ddaac04c1c9fe808c9142ecb78ba97d97a28a" -dependencies = [ - "bitflags 2.4.1", - "bytes", - "futures-core", - "futures-sink", - "memchr", - "pin-project-lite", - "tokio", - "tokio-util", - "tracing", -] - -[[package]] -name = "actix-http" -version = "3.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d223b13fd481fc0d1f83bb12659ae774d9e3601814c68a0bc539731698cca743" -dependencies = [ - "actix-codec", - "actix-rt", - "actix-service", - "actix-utils", - "ahash 0.8.11", - "base64 0.21.5", - "bitflags 2.4.1", - "brotli", - "bytes", - "bytestring", - "derive_more", - "encoding_rs", - "flate2", - "futures-core", - "h2 0.3.24", - "http 0.2.11", - "httparse", - "httpdate", - "itoa", - "language-tags", - "local-channel", - "mime", - "percent-encoding", - "pin-project-lite", - "rand", - "sha1", - "smallvec", - "tokio", - "tokio-util", - "tracing", - "zstd", -] - -[[package]] -name = "actix-macros" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e01ed3140b2f8d422c68afa1ed2e85d996ea619c988ac834d255db32138655cb" -dependencies = [ - "quote", - "syn 2.0.55", -] - -[[package]] -name = "actix-router" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d22475596539443685426b6bdadb926ad0ecaefdfc5fb05e5e3441f15463c511" -dependencies = [ - "bytestring", - "http 0.2.11", - "regex", - "serde", - "tracing", -] - -[[package]] -name = "actix-rt" -version = "2.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28f32d40287d3f402ae0028a9d54bef51af15c8769492826a69d28f81893151d" -dependencies = [ - "actix-macros", - "futures-core", - "tokio", -] - -[[package]] -name = "actix-server" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3eb13e7eef0423ea6eab0e59f6c72e7cb46d33691ad56a726b3cd07ddec2c2d4" -dependencies = [ - "actix-rt", - "actix-service", - "actix-utils", - "futures-core", - "futures-util", - "mio", - "socket2 0.5.5", - "tokio", - "tracing", -] - -[[package]] -name = "actix-service" -version = "2.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b894941f818cfdc7ccc4b9e60fa7e53b5042a2e8567270f9147d5591893373a" -dependencies = [ - "futures-core", - "paste", - "pin-project-lite", -] - -[[package]] -name = "actix-utils" -version = "3.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88a1dcdff1466e3c2488e1cb5c36a71822750ad43839937f85d2f4d9f8b705d8" -dependencies = [ - "local-waker", - "pin-project-lite", -] - -[[package]] -name = "actix-web" -version = "4.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43a6556ddebb638c2358714d853257ed226ece6023ef9364f23f0c70737ea984" -dependencies = [ - "actix-codec", - "actix-http", - "actix-macros", - "actix-router", - "actix-rt", - "actix-server", - "actix-service", - "actix-utils", - "actix-web-codegen", - "ahash 0.8.11", - "bytes", - "bytestring", - "cfg-if", - "cookie 0.16.2", - "derive_more", - "encoding_rs", - "futures-core", - "futures-util", - "itoa", - "language-tags", - "log", - "mime", - "once_cell", - "pin-project-lite", - "regex", - "serde", - "serde_json", - "serde_urlencoded", - "smallvec", - "socket2 0.5.5", - "time", - "url", -] - -[[package]] -name = "actix-web-codegen" -version = "4.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb1f50ebbb30eca122b188319a4398b3f7bb4a8cdf50ecfb73bfc6a3c3ce54f5" -dependencies = [ - "actix-router", - "proc-macro2", - "quote", - "syn 2.0.55", -] - [[package]] name = "addr2line" version = "0.21.0" @@ -220,23 +40,11 @@ dependencies = [ [[package]] name = "ahash" -version = "0.7.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" -dependencies = [ - "getrandom", - "once_cell", - "version_check", -] - -[[package]] -name = "ahash" -version = "0.8.11" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" +checksum = "91429305e9f0a25f6205c5b8e0d2db09e0708a7a6df0f42212bb56c32c8ac97a" dependencies = [ "cfg-if", - "getrandom", "once_cell", "version_check", "zerocopy", @@ -260,21 +68,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "alloc-no-stdlib" -version = "2.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" - -[[package]] -name = "alloc-stdlib" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece" -dependencies = [ - "alloc-no-stdlib", -] - [[package]] name = "allocator-api2" version = "0.2.16" @@ -331,7 +124,7 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5ca11d4be1bab0c8bc8734a9aa7bf4ee8316d462a08c6ac5052f888fef5b494b" dependencies = [ - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -341,7 +134,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0699d10d2f4d628a98ee7b57b289abbc98ff3bad977cb3152709d4bf2330628" dependencies = [ "anstyle", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -371,7 +164,7 @@ dependencies = [ "bytes", "fnv", "futures-util", - "http 0.2.11", + "http", "indexmap 1.9.3", "mime", "multer", @@ -448,18 +241,18 @@ checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" dependencies = [ "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.39", ] [[package]] name = "async-trait" -version = "0.1.79" +version = "0.1.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a507401cad91ec6a857ed5513a2073c82a9b9048762b885bb98655b306964681" +checksum = "a66537f1bb974b254c98ed142ff995236e81b9d0fe4db0575f46612cb15eb0f9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.39", ] [[package]] @@ -484,15 +277,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "acee9fd5073ab6b045a275b3e709c163dd36c90685219cb21804a147b58dba43" dependencies = [ "async-trait", - "axum-core 0.2.9", + "axum-core", "bitflags 1.3.2", "bytes", "futures-util", - "http 0.2.11", - "http-body 0.4.5", - "hyper 0.14.27", + "http", + "http-body", + "hyper", "itoa", - "matchit 0.5.0", + "matchit", "memchr", "mime", "percent-encoding", @@ -508,40 +301,6 @@ dependencies = [ "tower-service", ] -[[package]] -name = "axum" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1236b4b292f6c4d6dc34604bb5120d85c3fe1d1aa596bd5cc52ca054d13e7b9e" -dependencies = [ - "async-trait", - "axum-core 0.4.3", - "bytes", - "futures-util", - "http 1.1.0", - "http-body 1.0.0", - "http-body-util", - "hyper 1.2.0", - "hyper-util", - "itoa", - "matchit 0.7.3", - "memchr", - "mime", - "percent-encoding", - "pin-project-lite", - "rustversion", - "serde", - "serde_json", - "serde_path_to_error", - "serde_urlencoded", - "sync_wrapper", - "tokio", - "tower", - "tower-layer", - "tower-service", - "tracing", -] - [[package]] name = "axum-core" version = "0.2.9" @@ -551,32 +310,11 @@ dependencies = [ "async-trait", "bytes", "futures-util", - "http 0.2.11", - "http-body 0.4.5", - "mime", - "tower-layer", - "tower-service", -] - -[[package]] -name = "axum-core" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a15c63fd72d41492dc4f497196f5da1fb04fb7529e631d73630d1b491e47a2e3" -dependencies = [ - "async-trait", - "bytes", - "futures-util", - "http 1.1.0", - "http-body 1.0.0", - "http-body-util", + "http", + "http-body", "mime", - "pin-project-lite", - "rustversion", - "sync_wrapper", "tower-layer", "tower-service", - "tracing", ] [[package]] @@ -613,21 +351,6 @@ version = "0.21.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "35636a1494ede3b646cc98f74f8e62c773a38a659ebc777a2cf26b9b74171df9" -[[package]] -name = "base64" -version = "0.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9475866fec1451be56a3c2400fd081ff546538961565ccb5b7142cbd22bc7a51" - -[[package]] -name = "base64-simd" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "781dd20c3aff0bd194fe7d2a977dd92f21c173891f3a03b677359e5fa457e5d5" -dependencies = [ - "simd-abstraction", -] - [[package]] name = "base64ct" version = "1.6.0" @@ -676,27 +399,6 @@ dependencies = [ "generic-array", ] -[[package]] -name = "brotli" -version = "3.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "516074a47ef4bce09577a3b379392300159ce5b1ba2e501ff1c819950066100f" -dependencies = [ - "alloc-no-stdlib", - "alloc-stdlib", - "brotli-decompressor", -] - -[[package]] -name = "brotli-decompressor" -version = "2.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e2e4afe60d7dd600fdd3de8d0f08c2b7ec039712e3b6137ff98b7004e82de4f" -dependencies = [ - "alloc-no-stdlib", - "alloc-stdlib", -] - [[package]] name = "bs58" version = "0.5.0" @@ -713,28 +415,6 @@ version = "3.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" -[[package]] -name = "bytecheck" -version = "0.6.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23cdc57ce23ac53c931e88a43d06d070a6fd142f2617be5855eb75efc9beb1c2" -dependencies = [ - "bytecheck_derive", - "ptr_meta", - "simdutf8", -] - -[[package]] -name = "bytecheck_derive" -version = "0.6.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3db406d29fbcd95542e92559bed4d8ad92636d1ca8b3b72ede10b4bcc010e659" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "byteorder" version = "1.5.0" @@ -750,22 +430,12 @@ dependencies = [ "serde", ] -[[package]] -name = "bytestring" -version = "1.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74d80203ea6b29df88012294f62733de21cfeab47f17b41af3a38bc30a03ee72" -dependencies = [ - "bytes", -] - [[package]] name = "cc" version = "1.0.83" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" dependencies = [ - "jobserver", "libc", ] @@ -785,9 +455,8 @@ dependencies = [ "iana-time-zone", "js-sys", "num-traits", - "serde", "wasm-bindgen", - "windows-targets", + "windows-targets 0.48.5", ] [[package]] @@ -831,7 +500,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.39", ] [[package]] @@ -840,25 +509,6 @@ version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "702fc72eb24e5a1e48ce58027a675bc24edd52096d5397d4aea7c6dd9eca0bd1" -[[package]] -name = "clerk-rs" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29fa155891dd4b888fb23359e5c7471af6faf951d035e2fdb8f81eb03eb48cac" -dependencies = [ - "actix-rt", - "actix-web", - "futures-util", - "jsonwebtoken", - "regex", - "reqwest", - "serde", - "serde_derive", - "serde_json", - "serde_with 2.3.3", - "url", -] - [[package]] name = "cobs" version = "0.2.3" @@ -937,30 +587,22 @@ dependencies = [ ] [[package]] -name = "const-oid" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28c122c3980598d243d63d9a704629a2d748d101f278052ff068be5a4423ab6f" - -[[package]] -name = "const-str" -version = "0.3.2" +name = "console" +version = "0.15.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21077772762a1002bb421c3af42ac1725fa56066bfc53d9a55bb79905df2aaf3" +checksum = "c926e00cc70edefdc64d3a5ff31cc65bb97a3460097762bd23afb4d8145fccf8" dependencies = [ - "const-str-proc-macro", + "encode_unicode", + "lazy_static", + "libc", + "windows-sys 0.45.0", ] [[package]] -name = "const-str-proc-macro" -version = "0.3.2" +name = "const-oid" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e1e0fdd2e5d3041e530e1b21158aeeef8b5d0e306bc5c1e3d6cf0930d10e25a" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] +checksum = "28c122c3980598d243d63d9a704629a2d748d101f278052ff068be5a4423ab6f" [[package]] name = "convert_case" @@ -980,35 +622,13 @@ dependencies = [ ] [[package]] -name = "cookie" -version = "0.17.0" +name = "cookie_store" +version = "0.16.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7efb37c3e1ccb1ff97164ad95ac1606e8ccd35b3fa0a7d99a304c7f4a428cc24" +checksum = "d606d0fba62e13cf04db20536c05cb7f13673c161cb47a47a82b9b9e7d3f1daa" dependencies = [ - "percent-encoding", - "time", - "version_check", -] - -[[package]] -name = "cookie" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3cd91cf61412820176e137621345ee43b3f4423e589e7ae4e50d601d93e35ef8" -dependencies = [ - "percent-encoding", - "time", - "version_check", -] - -[[package]] -name = "cookie_store" -version = "0.20.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "387461abbc748185c3a6e1673d826918b450b87ff22639429c694619a83b6cf6" -dependencies = [ - "cookie 0.17.0", - "idna 0.3.0", + "cookie", + "idna 0.2.3", "log", "publicsuffix", "serde", @@ -1052,15 +672,6 @@ dependencies = [ "libc", ] -[[package]] -name = "crc32fast" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3855a8a784b474f333699ef2bbca9db2c4a1f6d9088a90a2d25b1eb53111eaa" -dependencies = [ - "cfg-if", -] - [[package]] name = "critical-section" version = "1.1.2" @@ -1128,38 +739,6 @@ dependencies = [ "typenum", ] -[[package]] -name = "cssparser" -version = "0.33.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9be934d936a0fbed5bcdc01042b770de1398bf79d0e192f49fa7faea0e99281e" -dependencies = [ - "cssparser-macros", - "dtoa-short", - "itoa", - "phf 0.11.2", - "smallvec", -] - -[[package]] -name = "cssparser-color" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "556c099a61d85989d7af52b692e35a8d68a57e7df8c6d07563dc0778b3960c9f" -dependencies = [ - "cssparser", -] - -[[package]] -name = "cssparser-macros" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" -dependencies = [ - "quote", - "syn 2.0.55", -] - [[package]] name = "ct-logs" version = "0.8.0" @@ -1202,7 +781,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.39", ] [[package]] @@ -1265,16 +844,6 @@ dependencies = [ "darling_macro 0.14.4", ] -[[package]] -name = "darling" -version = "0.20.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54e36fcd13ed84ffdfda6f5be89b31287cbb80c439841fe69e04841435464391" -dependencies = [ - "darling_core 0.20.8", - "darling_macro 0.20.8", -] - [[package]] name = "darling_core" version = "0.13.4" @@ -1303,20 +872,6 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "darling_core" -version = "0.20.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c2cf1c23a687a1feeb728783b993c4e1ad83d99f351801977dd809b48d0a70f" -dependencies = [ - "fnv", - "ident_case", - "proc-macro2", - "quote", - "strsim", - "syn 2.0.55", -] - [[package]] name = "darling_macro" version = "0.13.4" @@ -1339,45 +894,6 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "darling_macro" -version = "0.20.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a668eda54683121533a393014d8692171709ff57a7d61f187b6e782719f8933f" -dependencies = [ - "darling_core 0.20.8", - "quote", - "syn 2.0.55", -] - -[[package]] -name = "dashmap" -version = "5.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" -dependencies = [ - "cfg-if", - "hashbrown 0.14.3", - "lock_api", - "once_cell", - "parking_lot_core", -] - -[[package]] -name = "data-encoding" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e962a19be5cfc3f3bf6dd8f61eb50107f356ad6270fbb3ed41476571db78be5" - -[[package]] -name = "data-url" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a30bfce702bcfa94e906ef82421f2c0e61c076ad76030c16ee5d2e9a32fe193" -dependencies = [ - "matches", -] - [[package]] name = "der" version = "0.7.8" @@ -1395,7 +911,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0f32d04922c60427da6f9fef14d042d9edddef64cb9d4ce0d64d0685fbeb1fd3" dependencies = [ "powerfmt", - "serde", ] [[package]] @@ -1440,15 +955,6 @@ version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dcbb2bf8e87535c23f7a8a321e364ce21462d0ff10cb6407820e8e96dfff6653" -[[package]] -name = "dtoa-short" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbaceec3c6e4211c79e7b1800fb9680527106beb2f9c51904a3210c03a448c74" -dependencies = [ - "dtoa", -] - [[package]] name = "ecdsa" version = "0.16.9" @@ -1515,6 +1021,12 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ef1a6892d9eef45c8fa6b9e0086428a2cca8491aca8f787c534a3d6d0bcb3ced" +[[package]] +name = "encode_unicode" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" + [[package]] name = "encoding_rs" version = "0.8.33" @@ -1541,7 +1053,7 @@ checksum = "eecf8589574ce9b895052fa12d69af7a233f99e6107f5cb8dd1044f2a17bfdcb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.39", ] [[package]] @@ -1557,7 +1069,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f258a7194e7f7c2a7837a8913aeab7fd8c383457034fa20ce4dd3dcb813e8eb8" dependencies = [ "libc", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -1595,7 +1107,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9146112ee3ce031aa5aebe3e049e10b1d353b9c7630cc6be488c2c62cc5d9c42" dependencies = [ "futures", - "hyper 0.14.27", + "hyper", "hyper-rustls 0.22.1", "hyper-timeout", "log", @@ -1634,37 +1146,12 @@ dependencies = [ "static_assertions", ] -[[package]] -name = "flate2" -version = "1.0.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46303f565772937ffe1d394a4fac6f411c6013172fadde9dcdb1e147a086940e" -dependencies = [ - "crc32fast", - "miniz_oxide", -] - [[package]] name = "fnv" version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" -[[package]] -name = "foreign-types" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" -dependencies = [ - "foreign-types-shared", -] - -[[package]] -name = "foreign-types-shared" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" - [[package]] name = "form_urlencoded" version = "1.2.1" @@ -1687,7 +1174,7 @@ dependencies = [ "regex", "serde", "serde_json", - "syn 2.0.55", + "syn 2.0.39", "thiserror", ] @@ -1712,7 +1199,7 @@ dependencies = [ "anyhow", "async-graphql", "async-trait", - "axum 0.5.17", + "axum", "clap", "derive_more", "enum-iterator", @@ -1730,7 +1217,7 @@ dependencies = [ "fuel-core-types", "futures", "hex", - "hyper 0.14.27", + "hyper", "itertools 0.10.5", "postcard", "rand", @@ -1761,7 +1248,7 @@ dependencies = [ "postcard", "serde", "serde_json", - "serde_with 1.14.0", + "serde_with", "tracing", ] @@ -1850,7 +1337,7 @@ version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "10d853a839036a1906e8082192268034ace79e5d04dbd935abeaee745c5f5a39" dependencies = [ - "axum 0.5.17", + "axum", "once_cell", "pin-project-lite", "prometheus-client 0.18.1", @@ -1987,7 +1474,7 @@ checksum = "ff58cf4d01a4fb9440c63a8764154dfd3b07c74e4b3639cce8eea77d67e63a7a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.39", "synstructure", ] @@ -1996,29 +1483,29 @@ name = "fuel-faucet" version = "0.0.0" dependencies = [ "anyhow", - "axum 0.7.4", - "clerk-rs", + "axum", "fuel-core", "fuel-core-client", "fuel-core-txpool", + "fuel-crypto", "fuel-tx", "fuel-types", "fuels-accounts", "fuels-core", "futures", "handlebars", + "insta", "lazy_static", + "memoize", "minify-html", "rand", "reqwest", "secrecy", "serde", "serde_json", - "time", "tokio", "tower", - "tower-http 0.5.2", - "tower-sessions", + "tower-http 0.2.5", "tracing", "tracing-subscriber", ] @@ -2147,7 +1634,7 @@ dependencies = [ "quote", "regex", "serde_json", - "syn 2.0.55", + "syn 2.0.39", ] [[package]] @@ -2189,7 +1676,7 @@ dependencies = [ "proc-macro2", "quote", "rand", - "syn 2.0.55", + "syn 2.0.39", ] [[package]] @@ -2254,7 +1741,7 @@ checksum = "53b153fd91e4b0147f4aced87be237c98248656bb01050b96bf3ee89220a8ddb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.39", ] [[package]] @@ -2287,15 +1774,6 @@ dependencies = [ "slab", ] -[[package]] -name = "fxhash" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" -dependencies = [ - "byteorder", -] - [[package]] name = "generic-array" version = "0.14.7" @@ -2347,35 +1825,16 @@ dependencies = [ [[package]] name = "h2" -version = "0.3.24" +version = "0.3.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb2c4422095b67ee78da96fbb51a4cc413b3b25883c7717ff7ca1ab31022c9c9" +checksum = "4d6250322ef6e60f93f9a2162799302cd6f68f79f6e5d85c8c16f14d1d958178" dependencies = [ "bytes", "fnv", "futures-core", "futures-sink", "futures-util", - "http 0.2.11", - "indexmap 2.1.0", - "slab", - "tokio", - "tokio-util", - "tracing", -] - -[[package]] -name = "h2" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31d030e59af851932b72ceebadf4a2b5986dba4c3b99dd2493f8273a0f151943" -dependencies = [ - "bytes", - "fnv", - "futures-core", - "futures-sink", - "futures-util", - "http 1.1.0", + "http", "indexmap 2.1.0", "slab", "tokio", @@ -2411,9 +1870,6 @@ name = "hashbrown" version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" -dependencies = [ - "ahash 0.7.8", -] [[package]] name = "hashbrown" @@ -2421,8 +1877,7 @@ version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" dependencies = [ - "ahash 0.8.11", - "bumpalo", + "ahash", ] [[package]] @@ -2431,7 +1886,7 @@ version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" dependencies = [ - "ahash 0.8.11", + "ahash", "allocator-api2", "serde", ] @@ -2491,17 +1946,6 @@ dependencies = [ "itoa", ] -[[package]] -name = "http" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" -dependencies = [ - "bytes", - "fnv", - "itoa", -] - [[package]] name = "http-body" version = "0.4.5" @@ -2509,30 +1953,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" dependencies = [ "bytes", - "http 0.2.11", - "pin-project-lite", -] - -[[package]] -name = "http-body" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cac85db508abc24a2e48553ba12a996e87244a0395ce011e62b37158745d643" -dependencies = [ - "bytes", - "http 1.1.0", -] - -[[package]] -name = "http-body-util" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41cb79eb393015dadd30fc252023adb0b2400a0caee0fa2a077e6e21a551e840" -dependencies = [ - "bytes", - "futures-util", - "http 1.1.0", - "http-body 1.0.0", + "http", "pin-project-lite", ] @@ -2542,12 +1963,6 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "add0ab9360ddbd88cfeb3bd9574a1d85cfdfa14db10b3e21d3700dbc4328758f" -[[package]] -name = "http-range-header" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ce4ef31cda248bbdb6e6820603b82dfcd9e833db65a43e997a0ccec777d11fe" - [[package]] name = "httparse" version = "1.8.0" @@ -2570,9 +1985,9 @@ dependencies = [ "futures-channel", "futures-core", "futures-util", - "h2 0.3.24", - "http 0.2.11", - "http-body 0.4.5", + "h2", + "http", + "http-body", "httparse", "httpdate", "itoa", @@ -2584,26 +1999,6 @@ dependencies = [ "want", ] -[[package]] -name = "hyper" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "186548d73ac615b32a73aafe38fb4f56c0d340e110e5a200bcadbaf2e199263a" -dependencies = [ - "bytes", - "futures-channel", - "futures-util", - "h2 0.4.2", - "http 1.1.0", - "http-body 1.0.0", - "httparse", - "httpdate", - "itoa", - "pin-project-lite", - "smallvec", - "tokio", -] - [[package]] name = "hyper-rustls" version = "0.22.1" @@ -2612,7 +2007,7 @@ checksum = "5f9f7a97316d44c0af9b0301e65010573a853a9fc97046d7331d7f6bc0fd5a64" dependencies = [ "ct-logs", "futures-util", - "hyper 0.14.27", + "hyper", "log", "rustls 0.19.1", "rustls-native-certs 0.5.0", @@ -2628,8 +2023,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" dependencies = [ "futures-util", - "http 0.2.11", - "hyper 0.14.27", + "http", + "hyper", "log", "rustls 0.21.9", "rustls-native-certs 0.6.3", @@ -2644,41 +2039,12 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbb958482e8c7be4bc3cf272a766a2b0bf1a6755e7a6ae777f017a31d11b13b1" dependencies = [ - "hyper 0.14.27", + "hyper", "pin-project-lite", "tokio", "tokio-io-timeout", ] -[[package]] -name = "hyper-tls" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" -dependencies = [ - "bytes", - "hyper 0.14.27", - "native-tls", - "tokio", - "tokio-native-tls", -] - -[[package]] -name = "hyper-util" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca38ef113da30126bbff9cd1705f9273e15d45498615d138b0c20279ac7a76aa" -dependencies = [ - "bytes", - "futures-util", - "http 1.1.0", - "http-body 1.0.0", - "hyper 1.2.0", - "pin-project-lite", - "socket2 0.5.5", - "tokio", -] - [[package]] name = "iana-time-zone" version = "0.1.58" @@ -2708,6 +2074,17 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" +[[package]] +name = "idna" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8" +dependencies = [ + "matches", + "unicode-bidi", + "unicode-normalization", +] + [[package]] name = "idna" version = "0.3.0" @@ -2758,6 +2135,19 @@ dependencies = [ "generic-array", ] +[[package]] +name = "insta" +version = "1.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d64600be34b2fcfc267740a243fa7744441bb4947a619ac4e5bb6507f35fbfc" +dependencies = [ + "console", + "lazy_static", + "linked-hash-map", + "similar", + "yaml-rust", +] + [[package]] name = "ipnet" version = "2.9.0" @@ -2788,15 +2178,6 @@ version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" -[[package]] -name = "jobserver" -version = "0.1.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab46a6e9526ddef3ae7f787c06f0f2600639ba80ea3eade3d8e670a2230f51d6" -dependencies = [ - "libc", -] - [[package]] name = "js-sys" version = "0.3.65" @@ -2806,20 +2187,6 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "jsonwebtoken" -version = "8.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6971da4d9c3aa03c3d8f3ff0f4155b534aad021292003895a469716b2a230378" -dependencies = [ - "base64 0.21.5", - "pem", - "ring 0.16.20", - "serde", - "serde_json", - "simple_asn1", -] - [[package]] name = "k256" version = "0.13.2" @@ -2843,12 +2210,6 @@ dependencies = [ "cpufeatures", ] -[[package]] -name = "language-tags" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4345964bb142484797b161f473a503a434de77149dd8c7427788c6e13379388" - [[package]] name = "lazy_static" version = "1.4.0" @@ -2868,29 +2229,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" [[package]] -name = "lightningcss" -version = "1.0.0-alpha.54" +name = "linked-hash-map" +version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07d306844e5af1753490c420c0d6ae3d814b00725092d106332762827ca8f0fe" -dependencies = [ - "ahash 0.8.11", - "bitflags 2.4.1", - "const-str", - "cssparser", - "cssparser-color", - "dashmap", - "data-encoding", - "getrandom", - "itertools 0.10.5", - "lazy_static", - "parcel_selectors", - "parcel_sourcemap", - "paste", - "pathdiff", - "rayon", - "serde", - "smallvec", -] +checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" [[package]] name = "linux-raw-sys" @@ -2898,23 +2240,6 @@ version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "969488b55f8ac402214f3f5fd243ebb7206cf82de60d3172994707a4bcc2b829" -[[package]] -name = "local-channel" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6cbc85e69b8df4b8bb8b89ec634e7189099cea8927a276b7384ce5488e53ec8" -dependencies = [ - "futures-core", - "futures-sink", - "local-waker", -] - -[[package]] -name = "local-waker" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d873d7c67ce09b42110d801813efbc9364414e356be9935700d368351657487" - [[package]] name = "lock_api" version = "0.4.11" @@ -2923,7 +2248,6 @@ checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" dependencies = [ "autocfg", "scopeguard", - "serde", ] [[package]] @@ -2953,12 +2277,6 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "73cbba799671b762df5a175adf59ce145165747bb891505c43d09aefbbf38beb" -[[package]] -name = "matchit" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" - [[package]] name = "memchr" version = "2.6.4" @@ -2975,60 +2293,42 @@ dependencies = [ ] [[package]] -name = "mime" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" - -[[package]] -name = "mime_guess" -version = "2.0.4" +name = "memoize" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4192263c238a5f0d0c6bfd21f336a313a4ce1c450542449ca191bb657b4642ef" +checksum = "c25d125e4063f313300d87c8f658e5b3d69257095df9a4221c12ba50b0421bff" dependencies = [ - "mime", - "unicase", + "lazy_static", + "memoize-inner", ] [[package]] -name = "minify-html" -version = "0.15.0" +name = "memoize-inner" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cd4517942a8e7425c990b14977f86a63e4996eed7b15cfcca1540126ac5ff25" +checksum = "b8b7d5160e6ffcc59d4c571c38238ec5b7065bc91a5a24f511988dabcddda723" dependencies = [ - "aho-corasick 0.7.20", "lazy_static", - "lightningcss", - "memchr", - "minify-html-common", - "minify-js", - "once_cell", - "rustc-hash", + "proc-macro2", + "quote", + "syn 1.0.109", ] [[package]] -name = "minify-html-common" -version = "0.0.2" +name = "mime" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "697a6b40dffdc5de10c0cbd709dc2bc2039cea9dab8aaa636eb9a49d6b411780" -dependencies = [ - "aho-corasick 0.7.20", - "itertools 0.12.0", - "lazy_static", - "memchr", - "rustc-hash", - "serde", - "serde_json", -] +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" [[package]] -name = "minify-js" -version = "0.5.6" +name = "minify-html" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22d6c512a82abddbbc13b70609cb2beff01be2c7afff534d6e5e1c85e438fc8b" +checksum = "f617f8bf5ea04b94647e6d1a918807695e970f90fd2e8523fc86785ed52da5e6" dependencies = [ + "aho-corasick 0.7.20", "lazy_static", - "parse-js", + "memchr", ] [[package]] @@ -3047,9 +2347,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3dce281c5e46beae905d4de1870d8b1509a9142b62eedf18b443b011ca8343d0" dependencies = [ "libc", - "log", "wasi", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -3061,7 +2360,7 @@ dependencies = [ "bytes", "encoding_rs", "futures-util", - "http 0.2.11", + "http", "httparse", "log", "memchr", @@ -3070,24 +2369,6 @@ dependencies = [ "version_check", ] -[[package]] -name = "native-tls" -version = "0.2.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e" -dependencies = [ - "lazy_static", - "libc", - "log", - "openssl", - "openssl-probe", - "openssl-sys", - "schannel", - "security-framework", - "security-framework-sys", - "tempfile", -] - [[package]] name = "nu-ansi-term" version = "0.46.0" @@ -3098,32 +2379,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "num-bigint" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-conv" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" - -[[package]] -name = "num-integer" -version = "0.1.46" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" -dependencies = [ - "num-traits", -] - [[package]] name = "num-traits" version = "0.2.17" @@ -3154,35 +2409,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" - -[[package]] -name = "openssl" -version = "0.10.64" +version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95a0481286a310808298130d22dd1fef0fa571e05a8f44ec801801e84b216b1f" -dependencies = [ - "bitflags 2.4.1", - "cfg-if", - "foreign-types", - "libc", - "once_cell", - "openssl-macros", - "openssl-sys", -] - -[[package]] -name = "openssl-macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.55", -] +checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" [[package]] name = "openssl-probe" @@ -3190,24 +2419,6 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" -[[package]] -name = "openssl-sys" -version = "0.9.101" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dda2b0f344e78efc2facf7d195d098df0dd72151b26ab98da807afc26c198dff" -dependencies = [ - "cc", - "libc", - "pkg-config", - "vcpkg", -] - -[[package]] -name = "outref" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f222829ae9293e33a9f5e9f440c6760a3d450a64affe1846486b140db81c1f4" - [[package]] name = "overload" version = "0.1.1" @@ -3226,36 +2437,6 @@ dependencies = [ "sha2", ] -[[package]] -name = "parcel_selectors" -version = "0.26.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05d74befe2d076330d9a58bf9ca2da424568724ab278adf15fb5718253133887" -dependencies = [ - "bitflags 2.4.1", - "cssparser", - "fxhash", - "log", - "phf 0.10.1", - "phf_codegen", - "precomputed-hash", - "smallvec", -] - -[[package]] -name = "parcel_sourcemap" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "485b74d7218068b2b7c0e3ff12fbc61ae11d57cb5d8224f525bd304c6be05bbb" -dependencies = [ - "base64-simd", - "data-url", - "rkyv", - "serde", - "serde_json", - "vlq", -] - [[package]] name = "parking_lot" version = "0.12.1" @@ -3276,20 +2457,7 @@ dependencies = [ "libc", "redox_syscall", "smallvec", - "windows-targets", -] - -[[package]] -name = "parse-js" -version = "0.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ec3b11d443640ec35165ee8f6f0559f1c6f41878d70330fe9187012b5935f02" -dependencies = [ - "aho-corasick 0.7.20", - "bumpalo", - "hashbrown 0.13.2", - "lazy_static", - "memchr", + "windows-targets 0.48.5", ] [[package]] @@ -3298,12 +2466,6 @@ version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" -[[package]] -name = "pathdiff" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8835116a5c179084a830efb3adc117ab007512b535bc1a21c991d3b32a6b44dd" - [[package]] name = "pbkdf2" version = "0.11.0" @@ -3323,15 +2485,6 @@ dependencies = [ "hmac", ] -[[package]] -name = "pem" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8835c273a76a90455d7344889b0964598e3316e2a79ede8e36f16bdcf2228b8" -dependencies = [ - "base64 0.13.1", -] - [[package]] name = "percent-encoding" version = "2.3.1" @@ -3369,7 +2522,7 @@ dependencies = [ "pest_meta", "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.39", ] [[package]] @@ -3383,86 +2536,6 @@ dependencies = [ "sha2", ] -[[package]] -name = "phf" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fabbf1ead8a5bcbc20f5f8b939ee3f5b0f6f281b6ad3468b84656b658b455259" -dependencies = [ - "phf_shared 0.10.0", -] - -[[package]] -name = "phf" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ade2d8b8f33c7333b51bcf0428d37e217e9f32192ae4772156f65063b8ce03dc" -dependencies = [ - "phf_macros", - "phf_shared 0.11.2", -] - -[[package]] -name = "phf_codegen" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fb1c3a8bc4dd4e5cfce29b44ffc14bedd2ee294559a294e2a4d4c9e9a6a13cd" -dependencies = [ - "phf_generator 0.10.0", - "phf_shared 0.10.0", -] - -[[package]] -name = "phf_generator" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d5285893bb5eb82e6aaf5d59ee909a06a16737a8970984dd7746ba9283498d6" -dependencies = [ - "phf_shared 0.10.0", - "rand", -] - -[[package]] -name = "phf_generator" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48e4cc64c2ad9ebe670cb8fd69dd50ae301650392e81c05f9bfcb2d5bdbc24b0" -dependencies = [ - "phf_shared 0.11.2", - "rand", -] - -[[package]] -name = "phf_macros" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3444646e286606587e49f3bcf1679b8cef1dc2c5ecc29ddacaffc305180d464b" -dependencies = [ - "phf_generator 0.11.2", - "phf_shared 0.11.2", - "proc-macro2", - "quote", - "syn 2.0.55", -] - -[[package]] -name = "phf_shared" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096" -dependencies = [ - "siphasher", -] - -[[package]] -name = "phf_shared" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90fcb95eef784c2ac79119d1dd819e162b5da872ce6f3c3abe1e8ca1c082f72b" -dependencies = [ - "siphasher", -] - [[package]] name = "pin-project" version = "1.1.3" @@ -3480,7 +2553,7 @@ checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" dependencies = [ "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.39", ] [[package]] @@ -3505,12 +2578,6 @@ dependencies = [ "spki", ] -[[package]] -name = "pkg-config" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" - [[package]] name = "platforms" version = "3.2.0" @@ -3539,13 +2606,7 @@ checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" name = "ppv-lite86" version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" - -[[package]] -name = "precomputed-hash" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" [[package]] name = "primeorder" @@ -3578,9 +2639,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.79" +version = "1.0.70" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e835ff2298f5721608eb1a980ecaee1aef2c132bf95ecc026a11b7bf3c01c02e" +checksum = "39278fbbf5fb4f646ce651690877f89d1c5811a3d4acb27700c1cb3cdb78fd3b" dependencies = [ "unicode-ident", ] @@ -3617,7 +2678,7 @@ checksum = "440f724eba9f6996b75d63681b0a92b06947f1457076d503a4d2e2c8f56442b8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.39", ] [[package]] @@ -3637,26 +2698,6 @@ version = "2.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33cb294fe86a74cbcf50d4445b37da762029549ebeea341421c7c70370f86cac" -[[package]] -name = "ptr_meta" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0738ccf7ea06b608c10564b31debd4f5bc5e197fc8bfe088f68ae5ce81e7a4f1" -dependencies = [ - "ptr_meta_derive", -] - -[[package]] -name = "ptr_meta_derive" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "publicsuffix" version = "2.2.3" @@ -3669,9 +2710,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.35" +version = "1.0.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" +checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" dependencies = [ "proc-macro2", ] @@ -3785,40 +2826,28 @@ version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" -[[package]] -name = "rend" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71fe3824f5629716b1589be05dacd749f6aa084c87e00e016714a8cdfccc997c" -dependencies = [ - "bytecheck", -] - [[package]] name = "reqwest" -version = "0.11.24" +version = "0.11.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6920094eb85afde5e4a138be3f2de8bbdf28000f0029e72c45025a56b042251" +checksum = "046cd98826c46c2ac8ddecae268eb5c2e58628688a5fc7a2643704a73faba95b" dependencies = [ "base64 0.21.5", "bytes", - "cookie 0.17.0", + "cookie", "cookie_store", "encoding_rs", "futures-core", "futures-util", - "h2 0.3.24", - "http 0.2.11", - "http-body 0.4.5", - "hyper 0.14.27", + "h2", + "http", + "http-body", + "hyper", "hyper-rustls 0.24.2", - "hyper-tls", "ipnet", "js-sys", "log", "mime", - "mime_guess", - "native-tls", "once_cell", "percent-encoding", "pin-project-lite", @@ -3827,10 +2856,8 @@ dependencies = [ "serde", "serde_json", "serde_urlencoded", - "sync_wrapper", "system-configuration", "tokio", - "tokio-native-tls", "tokio-rustls 0.24.1", "tower-service", "url", @@ -3877,7 +2904,7 @@ dependencies = [ "libc", "spin 0.9.8", "untrusted 0.9.0", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -3889,47 +2916,12 @@ dependencies = [ "digest", ] -[[package]] -name = "rkyv" -version = "0.7.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cba464629b3394fc4dbc6f940ff8f5b4ff5c7aef40f29166fd4ad12acbc99c0" -dependencies = [ - "bitvec", - "bytecheck", - "bytes", - "hashbrown 0.12.3", - "ptr_meta", - "rend", - "rkyv_derive", - "seahash", - "tinyvec", - "uuid 1.6.1", -] - -[[package]] -name = "rkyv_derive" -version = "0.7.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7dddfff8de25e6f62b9d64e6e432bf1c6736c57d20323e15ee10435fbda7c65" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "rustc-demangle" version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" -[[package]] -name = "rustc-hash" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" - [[package]] name = "rustc_version" version = "0.4.0" @@ -3949,7 +2941,7 @@ dependencies = [ "errno", "libc", "linux-raw-sys", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -4047,7 +3039,7 @@ version = "0.1.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c3733bf4cf7ea0880754e19cb5a462007c4a8c1914bff372ccc95b464f1df88" dependencies = [ - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -4114,12 +3106,6 @@ dependencies = [ "untrusted 0.9.0", ] -[[package]] -name = "seahash" -version = "4.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" - [[package]] name = "sec1" version = "0.7.3" @@ -4208,7 +3194,7 @@ checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.39", ] [[package]] @@ -4222,16 +3208,6 @@ dependencies = [ "serde", ] -[[package]] -name = "serde_path_to_error" -version = "0.1.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4beec8bce849d58d06238cb50db2e1c417cfeafa4c63f692b15c82b7c80f8335" -dependencies = [ - "itoa", - "serde", -] - [[package]] name = "serde_urlencoded" version = "0.7.1" @@ -4251,23 +3227,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "678b5a069e50bf00ecd22d0cd8ddf7c236f68581b03db652061ed5eb13a312ff" dependencies = [ "serde", - "serde_with_macros 1.5.2", -] - -[[package]] -name = "serde_with" -version = "2.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07ff71d2c147a7b57362cead5e22f772cd52f6ab31cfcd9edcd7f6aeb2a0afbe" -dependencies = [ - "base64 0.13.1", - "chrono", - "hex", - "indexmap 1.9.3", - "serde", - "serde_json", - "serde_with_macros 2.3.3", - "time", + "serde_with_macros", ] [[package]] @@ -4282,29 +3242,6 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "serde_with_macros" -version = "2.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "881b6f881b17d13214e5d494c939ebab463d01264ce1811e9d4ac3a882e7695f" -dependencies = [ - "darling 0.20.8", - "proc-macro2", - "quote", - "syn 2.0.55", -] - -[[package]] -name = "sha1" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest", -] - [[package]] name = "sha2" version = "0.10.8" @@ -4355,37 +3292,10 @@ dependencies = [ ] [[package]] -name = "simd-abstraction" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cadb29c57caadc51ff8346233b5cec1d240b68ce55cf1afc764818791876987" -dependencies = [ - "outref", -] - -[[package]] -name = "simdutf8" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f27f6278552951f1f2b8cf9da965d10969b2efdea95a6ec47987ab46edfe263a" - -[[package]] -name = "simple_asn1" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adc4e5204eb1910f40f9cfa375f6f05b68c3abac4b6fd879c8ff5e7ae8a0a085" -dependencies = [ - "num-bigint", - "num-traits", - "thiserror", - "time", -] - -[[package]] -name = "siphasher" -version = "0.3.11" +name = "similar" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" +checksum = "2aeaf503862c419d66959f5d7ca015337d864e9c49485d771b732e2a20453597" [[package]] name = "slab" @@ -4398,9 +3308,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.13.1" +version = "1.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6ecd384b10a64542d77071bd64bd7b231f4ed5940fba55e98c3de13824cf3d7" +checksum = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970" [[package]] name = "socket2" @@ -4419,7 +3329,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9" dependencies = [ "libc", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -4506,9 +3416,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.55" +version = "2.0.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "002a1b3dbf967edfafc32655d0f377ab0bb7b994aa1d32c8cc7e9b8bf3ebb8f0" +checksum = "23e78b90f2fcf45d3e842032ce32e3f2d1545ba6636271dcbf24fa306d87be7a" dependencies = [ "proc-macro2", "quote", @@ -4529,7 +3439,7 @@ checksum = "285ba80e733fac80aa4270fbcdf83772a79b80aa35c97075320abfee4a915b06" dependencies = [ "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.39", "unicode-xid", ] @@ -4579,7 +3489,7 @@ dependencies = [ "fastrand", "redox_syscall", "rustix", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -4599,14 +3509,14 @@ checksum = "266b2e40bc00e5a6c09c3584011e08b06f123c00362c92b975ba9843aaaa14b8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.39", ] [[package]] name = "thread_local" -version = "1.1.8" +version = "1.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" +checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152" dependencies = [ "cfg-if", "once_cell", @@ -4614,13 +3524,12 @@ dependencies = [ [[package]] name = "time" -version = "0.3.34" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8248b6521bb14bc45b4067159b9b6ad792e2d6d754d6c41fb50e29fefe38749" +checksum = "c4a34ab300f2dee6e562c10a046fc05e358b29f9bf92277f30c3c8d82275f6f5" dependencies = [ "deranged", "itoa", - "num-conv", "powerfmt", "serde", "time-core", @@ -4635,11 +3544,10 @@ checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" [[package]] name = "time-macros" -version = "0.2.17" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ba3a3ef41e6672a2f0f001392bb5dcd3ff0a9992d618ca761a11c3121547774" +checksum = "4ad70d68dba9e1f8aceda7aa6711965dfec1cac869f311a51bd08b3a2ccbce20" dependencies = [ - "num-conv", "time-core", ] @@ -4674,7 +3582,7 @@ dependencies = [ "signal-hook-registry", "socket2 0.5.5", "tokio-macros", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -4695,17 +3603,7 @@ checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.55", -] - -[[package]] -name = "tokio-native-tls" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" -dependencies = [ - "native-tls", - "tokio", + "syn 2.0.39", ] [[package]] @@ -4799,39 +3697,20 @@ dependencies = [ "tracing", ] -[[package]] -name = "tower-cookies" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fd0118512cf0b3768f7fcccf0bef1ae41d68f2b45edc1e77432b36c97c56c6d" -dependencies = [ - "async-trait", - "axum-core 0.4.3", - "cookie 0.18.0", - "futures-util", - "http 1.1.0", - "parking_lot", - "pin-project-lite", - "tower-layer", - "tower-service", -] - [[package]] name = "tower-http" -version = "0.3.5" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f873044bf02dd1e8239e9c1293ea39dad76dc594ec16185d0a1bf31d8dc8d858" +checksum = "aba3f3efabf7fb41fae8534fc20a817013dd1c12cb45441efb6c82e6556b4cd8" dependencies = [ "bitflags 1.3.2", "bytes", "futures-core", "futures-util", - "http 0.2.11", - "http-body 0.4.5", - "http-range-header 0.3.1", + "http", + "http-body", + "http-range-header", "pin-project-lite", - "tokio", - "tower", "tower-layer", "tower-service", "tracing", @@ -4839,24 +3718,20 @@ dependencies = [ [[package]] name = "tower-http" -version = "0.5.2" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e9cd434a998747dd2c4276bc96ee2e0c7a2eadf3cae88e52be55a05fa9053f5" +checksum = "f873044bf02dd1e8239e9c1293ea39dad76dc594ec16185d0a1bf31d8dc8d858" dependencies = [ - "bitflags 2.4.1", + "bitflags 1.3.2", "bytes", + "futures-core", "futures-util", - "http 1.1.0", - "http-body 1.0.0", - "http-body-util", - "http-range-header 0.4.0", - "httpdate", - "mime", - "mime_guess", - "percent-encoding", + "http", + "http-body", + "http-range-header", "pin-project-lite", "tokio", - "tokio-util", + "tower", "tower-layer", "tower-service", "tracing", @@ -4874,57 +3749,6 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" -[[package]] -name = "tower-sessions" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "989b4d77286a7fb96b094b9e62c4524cebe7bb720769b41588ebaac5d9a787ca" -dependencies = [ - "async-trait", - "http 1.1.0", - "time", - "tokio", - "tower-cookies", - "tower-layer", - "tower-service", - "tower-sessions-core", - "tower-sessions-memory-store", - "tracing", -] - -[[package]] -name = "tower-sessions-core" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0a9049748900860b01f92d3decf5fec71b9d75008f07732956288b003a2282f" -dependencies = [ - "async-trait", - "axum-core 0.4.3", - "base64 0.22.0", - "futures", - "http 1.1.0", - "parking_lot", - "rand", - "serde", - "serde_json", - "thiserror", - "time", - "tokio", - "tracing", -] - -[[package]] -name = "tower-sessions-memory-store" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36baf499920bb861ec9fa929a1f879cec0759af987c6360bd65226bc484ab846" -dependencies = [ - "async-trait", - "time", - "tokio", - "tower-sessions-core", -] - [[package]] name = "tracing" version = "0.1.40" @@ -4945,7 +3769,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.39", ] [[package]] @@ -5042,15 +3866,6 @@ dependencies = [ "static_assertions", ] -[[package]] -name = "unicase" -version = "2.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7d2d4dafb69621809a81864c9c1b864479e1235c0dd4e199924b9742439ed89" -dependencies = [ - "version_check", -] - [[package]] name = "unicode-bidi" version = "0.3.13" @@ -5141,24 +3956,12 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" -[[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.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" -[[package]] -name = "vlq" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65dd7eed29412da847b0f78bcec0ac98588165988a8cfe41d4ea1d429f8ccfff" - [[package]] name = "void" version = "1.0.2" @@ -5201,7 +4004,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.39", "wasm-bindgen-shared", ] @@ -5235,7 +4038,7 @@ checksum = "c5353b8dab669f5e10f5bd76df26a9360c748f054f862ff5f3f8aae0c7fb3907" dependencies = [ "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.39", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -5300,7 +4103,16 @@ version = "0.51.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f1f8cf84f35d2db49a46868f947758c7a1138116f7fac3bc844f43ade1292e64" dependencies = [ - "windows-targets", + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets 0.42.2", ] [[package]] @@ -5309,7 +4121,22 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" dependencies = [ - "windows-targets", + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", ] [[package]] @@ -5318,51 +4145,93 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", + "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_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + [[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_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + [[package]] name = "windows_aarch64_msvc" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + [[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_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + [[package]] name = "windows_i686_msvc" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + [[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_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + [[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_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + [[package]] name = "windows_x86_64_msvc" version = "0.48.5" @@ -5385,7 +4254,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" dependencies = [ "cfg-if", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -5397,24 +4266,33 @@ dependencies = [ "tap", ] +[[package]] +name = "yaml-rust" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56c1936c4cc7a1c9ab21a1ebb602eb942ba868cbd44a99cb7cdc5892335e1c85" +dependencies = [ + "linked-hash-map", +] + [[package]] name = "zerocopy" -version = "0.7.32" +version = "0.7.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74d4d3961e53fa4c9a25a8637fc2bfaf2595b3d3ae34875568a5cf64787716be" +checksum = "e97e415490559a91254a2979b4829267a57d2fcd741a98eee8b722fb57289aa0" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.7.32" +version = "0.7.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" +checksum = "dd7e48ccf166952882ca8bd778a43502c64f33bf94c12ebe2a7f08e5a0f6689f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.39", ] [[package]] @@ -5434,33 +4312,5 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.55", -] - -[[package]] -name = "zstd" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bffb3309596d527cfcba7dfc6ed6052f1d39dfbd7c867aa2e865e4a449c10110" -dependencies = [ - "zstd-safe", -] - -[[package]] -name = "zstd-safe" -version = "7.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43747c7422e2924c11144d5229878b98180ef8b06cca4ab5af37afc8a8d8ea3e" -dependencies = [ - "zstd-sys", -] - -[[package]] -name = "zstd-sys" -version = "2.0.9+zstd.1.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e16efa8a874a0481a574084d34cc26fdb3b99627480f785888deb6386506656" -dependencies = [ - "cc", - "pkg-config", + "syn 2.0.39", ] diff --git a/Cargo.toml b/Cargo.toml index 234efc1..6d90457 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,49 +11,34 @@ description = "A token faucet for onboarding fuel users" [dependencies] anyhow = "1.0" -axum = "0.7.4" -clerk-rs = "0.2.3" +axum = "0.5" fuel-core-client = "0.22.0" fuel-tx = "0.43.0" fuel-types = "0.43.0" fuels-accounts = "0.54.0" fuels-core = "0.54.0" -handlebars = "4.5" +handlebars = "4.2" lazy_static = "1.4" +memoize = "0.3.1" +reqwest = { version = "0.11", features = ["json", "rustls-tls-webpki-roots"], default-features = false } secrecy = "0.8" serde = { version = "1.0", features = ["derive"] } serde_json = { version = "1.0" } -time = "0.3.34" tokio = { version = "1.0", features = ["full"] } -tower = { version = "0.4", features = [ - "buffer", - "limit", - "load-shed", - "util", - "timeout", -] } -tower-http = { version = "0.5.2", features = [ - "fs", - "cors", - "trace", - "set-header", -] } -tower-sessions = "0.11.0" +tower = { version = "0.4", features = ["buffer", "limit", "load-shed", "util", "timeout"] } +tower-http = { version = "0.2.5", features = ["cors", "trace", "set-header"] } tracing = "0.1" tracing-subscriber = { version = "0.3", features = ["env-filter", "json"] } [dev-dependencies] fuel-core = { version = "0.22.0", default-features = false } fuel-core-txpool = "0.22.0" +fuel-crypto = "0.43.0" fuel-types = { version = "0.43.0", features = ["random"] } futures = "0.3" +insta = "1.14" rand = "0.8" -reqwest = { version = "0.11.24", features = [ - "json", - "cookies", - "rustls-tls-webpki-roots", -], default-features = false } tokio = { version = "1.0", features = ["test-util"] } [build-dependencies] -minify-html = "0.15" +minify-html = "0.8" diff --git a/README.md b/README.md index bfa2d90..734503e 100644 --- a/README.md +++ b/README.md @@ -1,26 +1,26 @@ -# Faucet App - +Faucet App +=== [![build](https://github.com/FuelLabs/faucet/actions/workflows/ci.yml/badge.svg)](https://github.com/FuelLabs/faucet/actions/workflows/ci.yml) [![discord](https://img.shields.io/badge/chat%20on-discord-orange?&logo=discord&logoColor=ffffff&color=7389D8&labelColor=6A7EC2)](https://discord.gg/xfpK4Pe) -A simple faucet app for dispensing tokens on a fuel network. +A simple faucet app for dispensing tokens on a fuel network. It uses Google captcha for spam resistance +without requiring any social media based identification. ## Configuration - The faucet makes use of environment variables for configuration. -| Environment Variable | Description | -| -------------------- | ----------------------------------------------------------------------------------------------- | -| RUST_LOG | EnvFilter configuration for adjusting logging granularity. | -| HUMAN_LOGGING | If false, logs will be output as machine readable JSON. | -| CLERK_PUB_KEY | The public key used for enabling clerk authentication. | -| CLERK_SECRET_KEY | The secret key used for enabling clerk authentication. | -| WALLET_SECRET_KEY | A hex formatted string of the wallet private key that owns some tokens. | -| FUEL_NODE_URL | The GraphQL endpoint for connecting to fuel-core. | +| Environment Variable | Description | +|----------------------|-------------------------------------------------------------------------| +| RUST_LOG | EnvFilter configuration for adjusting logging granularity. | +| HUMAN_LOGGING | If false, logs will be output as machine readable JSON. | +| CAPTCHA_SECRET | The secret key used for enabling Google captcha authentication. | +| CAPTCHA_KEY | The website key used for enabling Google captcha authentication. | +| WALLET_SECRET_KEY | A hex formatted string of the wallet private key that owns some tokens. | +| FUEL_NODE_URL | The GraphQL endpoint for connecting to fuel-core. | | PUBLIC_FUEL_NODE_URL | The public GraphQL endpoint for connecting to fuel-core. Ex.: https://node.fuel.network/graphql | -| SERVICE_PORT | The port the service will listen for http connections on. | -| DISPENSE_AMOUNT | Dispense amount on each faucet | -| MIN_GAS_PRICE | The minimum gas price to use in each transfer | +| SERVICE_PORT | The port the service will listen for http connections on. | +| DISPENSE_AMOUNT | Dispense amount on each faucet | +| MIN_GAS_PRICE | The minimum gas price to use in each transfer | ## Build and Run @@ -29,20 +29,3 @@ To run locally, assuming environment variables have already been set: ```sh cargo run ``` - -## Building Frontend - -To build the frontend code, you can run the following commands: - -```sh -cd frontend -bun install -bun run build -``` - -If you don't have `bun` installed, here is the command to install it: -```sh -curl -fsSL https://bun.sh/install | bash -``` - -For development you can run `bun run build:watch`. \ No newline at end of file diff --git a/build.rs b/build.rs index b7d4d11..9a6568f 100644 --- a/build.rs +++ b/build.rs @@ -1,15 +1,12 @@ use minify_html::Cfg; use std::{env, fs, path::Path}; -fn build(page: &str, raw: &[u8]) { +fn main() { let out_dir = env::var("OUT_DIR").unwrap(); - let html_dest_path = Path::new(&out_dir).join(page); - let minified = minify_html::minify(raw, &Cfg::spec_compliant()); - fs::write(html_dest_path, minified).expect("failed to save minified index page"); + let dest_path = Path::new(&out_dir).join("index.html"); + let page = include_bytes!("./static/index.html"); + let minified = minify_html::minify(page, &Cfg::spec_compliant()); + fs::write(dest_path, minified).expect("failed to save minified index page"); println!("cargo:rerun-if-changed=static"); } - -fn main() { - build("index.html", include_bytes!("./static/index.html")); -} diff --git a/deployment/Dockerfile b/deployment/Dockerfile index 1244efb..dd1b36a 100644 --- a/deployment/Dockerfile +++ b/deployment/Dockerfile @@ -1,23 +1,3 @@ -# Stage 0: Setup Bun and build frontend -FROM ubuntu:22.04 as frontend -RUN apt-get update && \ - apt-get install -y curl unzip && \ - curl -fsSL https://bun.sh/install | bash && \ - ln -s /root/.bun/bin/bun /usr/local/bin/bun && \ - apt-get remove -y curl unzip && \ - apt-get autoremove -y && \ - apt-get clean && \ - rm -rf /var/lib/apt/lists/* - -WORKDIR /frontend -COPY ./frontend . - -# Install dependencies and run build script -RUN bun install && \ - bun run build - -COPY ./static ./static - # Stage 1: Build FROM lukemathwalker/cargo-chef:latest-rust-1.74 as chef WORKDIR /build/ @@ -59,7 +39,6 @@ WORKDIR /root/ COPY --from=builder /build/target/release/fuel-faucet . COPY --from=builder /build/target/release/fuel-faucet.d . -COPY --from=frontend /frontend/static/js ./static/js EXPOSE 3000 diff --git a/deployment/charts/templates/fuel-faucet-deploy.yaml b/deployment/charts/templates/fuel-faucet-deploy.yaml index 73f639b..fbc41b3 100644 --- a/deployment/charts/templates/fuel-faucet-deploy.yaml +++ b/deployment/charts/templates/fuel-faucet-deploy.yaml @@ -62,18 +62,18 @@ spec: value: "{{ .Values.app.target_port }}" - name: WALLET_SECRET_KEY value: "{{ .Values.app.wallet_secret_key }}" + {{- if .Values.app.captcha_key }} + - name: CAPTCHA_KEY + value: "{{ .Values.app.captcha_key }}" + {{- end }} + {{- if .Values.app.captcha_secret }} + - name: CAPTCHA_SECRET + value: "{{ .Values.app.captcha_secret }}" + {{- end }} - name: FUEL_NODE_URL value: "{{ .Values.app.node_url }}" - name: PUBLIC_FUEL_NODE_URL value: "{{ .Values.app.public_node_url }}" - {{- if .Values.app.clerk_pub_key }} - - name: CLERK_PUB_KEY - value: "{{ .Values.app.clerk_pub_key }}" - {{- end }} - {{- if .Values.app.clerk_secret_key }} - - name: CLERK_SECRET_KEY - value: "{{ .Values.app.clerk_secret_key }}" - {{- end }} {{- if .Values.app.max_dispenses_per_minute }} - name: MAX_DISPENSES_PER_MINUTE value: "{{ .Values.app.max_dispenses_per_minute }}" diff --git a/deployment/charts/values.yaml b/deployment/charts/values.yaml index 2da3af1..77fa8c4 100644 --- a/deployment/charts/values.yaml +++ b/deployment/charts/values.yaml @@ -8,8 +8,8 @@ app: target_port: 3000 human_logging: "${fuel_faucet_human_logging}" wallet_secret_key: "${fuel_faucet_wallet_secret_key}" - clerk_pub_key: "${fuel_faucet_clerk_pub_key}" - clerk_secret_key: "${fuel_faucet_clerk_secret_key}" + captcha_secret: "${fuel_faucet_captcha_secret}" + captcha_key: "${fuel_faucet_captcha_key}" node_url: "${fuel_faucet_node_url}" public_node_url: "${fuel_faucet_public_node_url}" max_dispenses_per_minute: "${fuel_faucet_max_dispenses_per_minute}" diff --git a/deployment/scripts/.env b/deployment/scripts/.env index 97e7c64..e6552ca 100644 --- a/deployment/scripts/.env +++ b/deployment/scripts/.env @@ -7,13 +7,13 @@ fuel_faucet_image_repository="ghcr.io/fuellabs/faucet" fuel_faucet_image_tag="latest" fuel_faucet_human_logging="false" fuel_faucet_wallet_secret_key="random" +fuel_faucet_captcha_key="6Ld3cEwfAAAAAMd4QTs7aO85LyKGdgj0bFsdBfre" +fuel_faucet_captcha_secret="fuelrocks" fuel_faucet_node_url="node.example.com" fuel_faucet_public_node_url="https://node.example.com/graphql" fuel_faucet_max_dispenses_per_minute=20 fuel_faucet_min_gas_price=0 fuel_faucet_dispense_amount=10000 -fuel_faucet_clerk_pub_key="6Ld3cEwfAAAAAMd4QTs7aO85LyKGdgj0bFsdBfre" -fuel_faucet_clerk_secret_key="fuelrocks" # Ingress envs letsencrypt_email="helloworld@gmail.com" @@ -21,5 +21,5 @@ fuel_faucet_ingress_dns="faucet.example.com" fuel_faucet_dns_secret="faucet-example-com" fuel_faucet_ingress_http_port="80" -# EKS +# EKS TF_VAR_eks_cluster_name="test-cluster" diff --git a/frontend/bun.lockb b/frontend/bun.lockb deleted file mode 100755 index 064e8b1d38dbbd487131131be05b15bb2d3701b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43453 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 QZ5M4EgrB7RzxVh50FVCaX#fBK diff --git a/frontend/package.json b/frontend/package.json deleted file mode 100644 index 6402eac..0000000 --- a/frontend/package.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "name": "my-app", - "private": true, - "version": "0.0.0", - "type": "module", - "scripts": { - "build": "bun build ./src/index.tsx --outdir ../static --minify --target browser --entry-naming [dir]/js/[name].[hash].[ext]", - "build:watch": "bun run build --watch" - }, - "dependencies": { - "@clerk/clerk-js": "^4.70.5", - "@preact/signals": "^1.2.2", - "canvas-confetti": "^1.9.2", - "confetti": "^2.0.3", - "mitt": "^3.0.1", - "preact": "^10.19.6" - }, - "devDependencies": { - "typescript": "^5.2.2" - } -} diff --git a/frontend/src/app.tsx b/frontend/src/app.tsx deleted file mode 100644 index ecb5d0e..0000000 --- a/frontend/src/app.tsx +++ /dev/null @@ -1,21 +0,0 @@ -import { Component } from "preact"; - -import { FaucetForm } from "./components/faucet-form"; -import { FuelLogo } from "./components/fuel-logo"; - -export class App extends Component<{ providerUrl: string }> { - render() { - const { providerUrl } = this.props; - return ( -
-
- - -
-
- Node url: {providerUrl} -
-
- ); - } -} diff --git a/frontend/src/components/faucet-form.tsx b/frontend/src/components/faucet-form.tsx deleted file mode 100644 index 3a4646d..0000000 --- a/frontend/src/components/faucet-form.tsx +++ /dev/null @@ -1,137 +0,0 @@ -import { useClaim } from "../hooks/use-claim"; - -function AlertError({ error }: { error: string }) { - if (!error) return null; - return ( - - ); -} - -function AlertSuccess() { - return ( - - ); -} - -function Submit({ - children, - disabled, - onClick, - isHidden, -}: { - children: any; - disabled: boolean; - onClick: any; - isHidden: boolean; -}) { - if (isHidden) return null; - return ( - - ); -} - -export function FaucetForm({ providerUrl }: { providerUrl: string }) { - const { - address, - error, - method, - isSignedIn, - isDisabled, - isLoading, - isDone, - onSubmit, - onInput, - setMethod, - submitAuthText, - } = useClaim(providerUrl); - - const onSubmitAuth = setMethod("auth"); - - function getForm() { - if (isDone) return null; - return ( -
- - -
- ); - } - - return ( -
-
- - {getForm()} -

- This is a Test Ether faucet running on the{" "} - Test Fuel network. This faucet sends fake Ether assets to - the provided wallet address. -

- - {isLoading && ( -
-
-
- )} -
- - {isLoading ? "Loading..." : "Send me test ETH"} - - - {submitAuthText()} - -
- - {isDone && } -
- ); -} - -const styles = { - formWrapper: "border p-4 mb-4 flex flex-col rounded-lg", - label: "mb-2 text-md text-gray-500", - input: - "border border-gray-300 text-gray-900 text-sm rounded focus:ring-blue-500 focus:border-blue-500 block w-full p-2.5", - alertError: - "flex flex-col items-center py-2 px-4 border border-red-300 mt-6 gap-1 text-sm rounded-lg bg-red-50 text-red-800", - alertSuccess: - "flex flex-col items-center p-4 border border-green-300 mt-6 gap-1 text-sm rounded-lg bg-green-50", - submitButton: - "text-black bg-[#02F58C] hover:bg-[#02E281] font-medium rounded-lg text-sm px-5 py-2.5 me-2 mb-2 disabled:bg-gray-300 disabled:text-gray-800 disabled:cursor-not-allowed", -}; diff --git a/frontend/src/components/fuel-logo.tsx b/frontend/src/components/fuel-logo.tsx deleted file mode 100644 index 6bbb5a3..0000000 --- a/frontend/src/components/fuel-logo.tsx +++ /dev/null @@ -1,35 +0,0 @@ -import { Component } from "preact"; - -export class FuelLogo extends Component { - render() { - return ( -
- - - - - - - - - - -
- ); - } -} diff --git a/frontend/src/hooks/use-claim.tsx b/frontend/src/hooks/use-claim.tsx deleted file mode 100644 index c70db28..0000000 --- a/frontend/src/hooks/use-claim.tsx +++ /dev/null @@ -1,151 +0,0 @@ -import Clerk from "@clerk/clerk-js"; -import { useComputed, useSignal } from "@preact/signals"; -import confetti from "canvas-confetti"; -import { useEffect } from "preact/hooks"; - -import * as api from "../lib/api"; -import { Claim } from "../lib/claim"; - -const query = new URLSearchParams(document.location.search); -const queryAddress = query.get("address") ?? ""; -const claim = new Claim(); -const clerk = new Clerk(window.__CLERK_PUB_KEY__, { - domain: "https://quick-crawdad-10.clerk.accounts.dev", -}); - -export function useClaim(providerUrl: string) { - const address = useSignal(queryAddress); - const error = useSignal(null); - const state = useSignal("loading"); - const method = useSignal<"auth" | null>(null); - const isDone = state.value?.includes("done"); - const isSignedIn = useSignal(false); - const isLoading = useComputed(() => state.value === "loading"); - const isDisabled = useComputed( - () => !address.value?.length || state.value === "loading" || isDone, - ); - - async function fetchSession() { - state.value = "loading"; - await clerk.load(); - const { value, sessions } = await api.getClerkSession(clerk); - if (value) { - await api.validateClerkSession({ value }); - isSignedIn.value = true; - method.value = "auth"; - state.value = "idle"; - return; - } - await api.removeSession(); - state.value = "idle"; - return sessions; - } - - async function submitUsingAuth() { - state.value = "loading"; - error.value = null; - - await clerk.load(); - const { value } = await api.getClerkSession(clerk); - if (value) { - await api.validateClerkSession({ value }); - await claim.withAuth(); - return; - } - - const body = document.querySelector("#root"); - const overlay = document.createElement("div"); - overlay.id = "overlay"; - body?.appendChild(overlay); - clerk.mountSignIn(overlay, { - routing: "virtual", - redirectUrl: `/?address=${address.value}`, - }); - } - - async function onSubmit(e: any) { - e.preventDefault(); - - if (method.value === "auth") { - await submitUsingAuth(); - return; - } - } - - function setMethod(value: "auth" | null) { - return () => { - method.value = value; - }; - } - - function onInput(e: any) { - address.value = e.target.value; - } - - function submitAuthText() { - if (isLoading.value) return "Loading"; - return "Login with to request faucet ETH"; - } - - useEffect(() => { - claim.setProviderUrl(providerUrl); - claim.setAddress(address.value); - - const subs = [ - claim.onError((err) => { - error.value = err.message; - state.value = "error"; - }), - claim.onDone(() => { - state.value = "done"; - error.value = null; - confetti({ - particleCount: 100, - spread: 70, - origin: { y: 0.6 }, - }); - }), - ]; - - return () => { - subs.forEach((sub) => sub()); - }; - }, [providerUrl, address.value]); - - useEffect(() => { - fetchSession().then(() => { - if (clerk.user) { - const userBtn = document.querySelector("#clerk-user"); - clerk.mountUserButton(userBtn as any); - return; - } - - clerk.addListener(async (resources) => { - if (!resources.session) { - const res = await fetch("/api/session/remove", { - method: "POST", - headers: { - "Content-Type": "application/json", - }, - }); - await res.json(); - } - }); - }); - }, []); - - return { - address: address.value, - error: error.value, - state: state.value, - method: method.value, - isSignedIn: isSignedIn.value, - isDisabled: isDisabled.value, - isLoading: isLoading.value, - isDone, - onSubmit, - onInput, - setMethod, - submitAuthText, - }; -} diff --git a/frontend/src/index.tsx b/frontend/src/index.tsx deleted file mode 100644 index 20a008f..0000000 --- a/frontend/src/index.tsx +++ /dev/null @@ -1,7 +0,0 @@ -import { render } from "preact"; -import { App } from "./app.tsx"; - -render( - , - document.getElementById("root")!, -); diff --git a/frontend/src/lib/api.ts b/frontend/src/lib/api.ts deleted file mode 100644 index d5458e7..0000000 --- a/frontend/src/lib/api.ts +++ /dev/null @@ -1,71 +0,0 @@ -import Clerk from "@clerk/clerk-js"; - -type DispenseMethod = "auth"; -export type DispenseInput = { - salt?: string; - nonce?: string; - address?: string | null; -}; - -type DispenseResponse = { - status: string; - tokens: number; - error?: string; -}; - -export async function dispense(payload: DispenseInput, method: DispenseMethod) { - const response = await fetch(`/api/dispense?method=${method}`, { - method: "POST", - headers: { - Accept: "application/json", - "Content-Type": "application/json", - }, - body: JSON.stringify(payload), - }); - return response.json() as Promise; -} - -type RemoveSessionResponse = { - status: string; - error?: string; -}; - -export async function removeSession() { - const response = await fetch("/api/session/remove", { - method: "POST", - headers: { - "Content-Type": "application/json", - }, - body: JSON.stringify({}), - }); - return response.json() as Promise; -} - -type ValidateSessionInput = { - value: string; -}; -type ValidateSessionResponse = { - user: any; - session: any; - error?: string; -}; - -export async function validateClerkSession(input: ValidateSessionInput) { - const response = await fetch("/api/session/validate", { - method: "POST", - headers: { - "Content-Type": "application/json", - }, - body: JSON.stringify({ value: input.value }), - }); - return response.json() as Promise; -} - -export async function getClerkSession(clerk: Clerk | null) { - const sessions = await clerk?.user?.getSessions(); - if (sessions?.length) { - const value = sessions?.[0].id; - return { value, sessions }; - } - return { value: null, sessions: [] }; -} diff --git a/frontend/src/lib/claim.ts b/frontend/src/lib/claim.ts deleted file mode 100644 index 6f5e429..0000000 --- a/frontend/src/lib/claim.ts +++ /dev/null @@ -1,51 +0,0 @@ -import mitt from "mitt"; -import * as api from "../lib/api"; - -const emitter = mitt(); - -export class Claim { - address: string | null; - providerUrl: string | null; - - constructor() { - this.address = null; - this.providerUrl = null; - } - - setAddress(address: string | null) { - this.address = address; - } - - setProviderUrl(url: string) { - this.providerUrl = url; - } - - async withAuth() { - const payload = { - address: this.address, - }; - - try { - const data = await api.dispense(payload, "auth"); - if (data.error) { - emitter.emit("error", data.error); - throw new Error(data.error); - } - emitter.emit("done", data); - return data; - } catch (error) { - console.log(error); - emitter.emit("error", error); - } - } - - onDone(cb: () => void) { - emitter.on("done", cb); - return () => emitter.off("done", cb); - } - - onError(cb: (err: any) => void) { - emitter.on("error", cb); - return () => emitter.off("error", cb); - } -} diff --git a/frontend/src/types.d.ts b/frontend/src/types.d.ts deleted file mode 100644 index 98b4e08..0000000 --- a/frontend/src/types.d.ts +++ /dev/null @@ -1,7 +0,0 @@ -/// -declare module "canvas-confetti"; - -interface Window { - __PROVIDER_URL__: string; - __CLERK_PUB_KEY__: string; -} diff --git a/frontend/tsconfig.json b/frontend/tsconfig.json deleted file mode 100644 index 7c5f351..0000000 --- a/frontend/tsconfig.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "compilerOptions": { - "target": "ES2020", - "useDefineForClassFields": true, - "module": "ESNext", - "lib": ["ES2020", "DOM", "DOM.Iterable"], - "skipLibCheck": true, - "paths": { - "react": ["./node_modules/preact/compat"], - "react-dom": ["./node_modules/preact/compat"] - }, - - /* Bundler mode */ - "moduleResolution": "bundler", - "allowImportingTsExtensions": true, - "resolveJsonModule": true, - "isolatedModules": true, - "noEmit": true, - "jsx": "react-jsx", - "jsxImportSource": "preact", - - /* Linting */ - "strict": true, - "noUnusedLocals": true, - "noUnusedParameters": true, - "noFallthroughCasesInSwitch": true - }, - "include": ["./src"] -} diff --git a/src/auth.rs b/src/auth.rs deleted file mode 100644 index c79a402..0000000 --- a/src/auth.rs +++ /dev/null @@ -1,31 +0,0 @@ -use axum::async_trait; - -pub mod clerk; - -#[derive(Debug)] -pub struct AuthError { - pub message: String, -} - -impl AuthError { - pub fn new(message: impl Into) -> Self { - AuthError { - message: message.into(), - } - } -} - -impl std::fmt::Display for AuthError { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(f, "{}", self.message) - } -} - -impl std::error::Error for AuthError {} - -type UserId = String; - -#[async_trait] -pub trait AuthHandler: Send + Sync { - async fn get_user_session(&self, session_id: &str) -> Result; -} diff --git a/src/auth/clerk.rs b/src/auth/clerk.rs deleted file mode 100644 index af496a4..0000000 --- a/src/auth/clerk.rs +++ /dev/null @@ -1,43 +0,0 @@ -use crate::config::Config; -use axum::async_trait; -use clerk_rs::{apis::sessions_api, clerk::Clerk, models, ClerkConfiguration}; -use secrecy::ExposeSecret; - -use super::{AuthError, AuthHandler}; - -pub struct ClerkHandler { - pub client: Clerk, - pub dispense_limit_interval: u64, -} - -impl ClerkHandler { - pub fn new(config: &Config) -> Self { - let clerk_secret_key = config - .clerk_secret_key - .clone() - .expect("Clerk secret key is required"); - let clerk_key = Some(clerk_secret_key.expose_secret().clone()); - let clerk_config = ClerkConfiguration::new(None, None, clerk_key, None); - let client = Clerk::new(clerk_config); - ClerkHandler { - client, - dispense_limit_interval: config.dispense_limit_interval, - } - } - - async fn get_session(&self, session_id: &str) -> Result { - let session = sessions_api::Session::get_session(&self.client, session_id) - .await - .map_err(|_| AuthError::new("Failed to retrieve session".to_string()))?; - - Ok(session) - } -} - -#[async_trait] -impl AuthHandler for ClerkHandler { - async fn get_user_session(&self, session_id: &str) -> Result { - let session = self.get_session(session_id).await?; - Ok(session.user_id) - } -} diff --git a/src/config.rs b/src/config.rs index 142c60b..3051515 100644 --- a/src/config.rs +++ b/src/config.rs @@ -1,5 +1,5 @@ use crate::constants::{ - CLERK_PUB_KEY, CLERK_SECRET_KEY, DEFAULT_DISPENSE_INTERVAL, DEFAULT_FAUCET_DISPENSE_AMOUNT, + CAPTCHA_KEY, CAPTCHA_SECRET, DEFAULT_DISPENSE_INTERVAL, DEFAULT_FAUCET_DISPENSE_AMOUNT, DEFAULT_NODE_URL, DEFAULT_PORT, DISPENSE_AMOUNT, DISPENSE_INTERVAL, FAUCET_ASSET_ID, FUEL_NODE_URL, HUMAN_LOGGING, LOG_FILTER, MIN_GAS_PRICE, PUBLIC_FUEL_NODE_URL, SERVICE_PORT, TIMEOUT_SECONDS, WALLET_SECRET_KEY, @@ -13,8 +13,8 @@ pub struct Config { pub log_filter: String, pub human_logging: bool, pub service_port: u16, - pub clerk_pub_key: Option, - pub clerk_secret_key: Option>, + pub captcha_key: Option, + pub captcha_secret: Option>, pub node_url: String, pub public_node_url: String, pub wallet_secret_key: Option>, @@ -33,9 +33,9 @@ impl Default for Config { service_port: env::var_os(SERVICE_PORT) .map(|s| s.into_string().unwrap().parse().unwrap()) .unwrap_or(DEFAULT_PORT), - clerk_pub_key: env::var_os(CLERK_PUB_KEY).map(|s| s.into_string().unwrap()), - clerk_secret_key: env::var_os(CLERK_SECRET_KEY) + captcha_secret: env::var_os(CAPTCHA_SECRET) .map(|s| Secret::new(s.into_string().unwrap())), + captcha_key: env::var_os(CAPTCHA_KEY).map(|s| s.into_string().unwrap()), node_url: env::var(FUEL_NODE_URL).unwrap_or_else(|_| DEFAULT_NODE_URL.to_string()), public_node_url: env::var(PUBLIC_FUEL_NODE_URL) .unwrap_or_else(|_| DEFAULT_NODE_URL.to_string()), diff --git a/src/constants.rs b/src/constants.rs index f3e6dec..2228508 100644 --- a/src/constants.rs +++ b/src/constants.rs @@ -2,9 +2,9 @@ use fuels_core::types::AssetId; pub const LOG_FILTER: &str = "RUST_LOG"; pub const HUMAN_LOGGING: &str = "HUMAN_LOGGING"; +pub const CAPTCHA_KEY: &str = "CAPTCHA_KEY"; +pub const CAPTCHA_SECRET: &str = "CAPTCHA_SECRET"; pub const WALLET_SECRET_KEY: &str = "WALLET_SECRET_KEY"; -pub const CLERK_PUB_KEY: &str = "CLERK_PUB_KEY"; -pub const CLERK_SECRET_KEY: &str = "CLERK_SECRET_KEY"; pub const PUBLIC_FUEL_NODE_URL: &str = "PUBLIC_FUEL_NODE_URL"; pub const WALLET_SECRET_DEV_KEY: &str = "99ad179d4f892ff3124ccd817408ff8a4452d9c16bb1b4968b8a59797e13cd7a"; @@ -17,6 +17,7 @@ pub const DEFAULT_FAUCET_DISPENSE_AMOUNT: u64 = 10_000_000; pub const FAUCET_ASSET_ID: AssetId = AssetId::new([0; 32]); pub const SERVICE_PORT: &str = "PORT"; pub const DEFAULT_PORT: u16 = 3000; + pub const MIN_GAS_PRICE: &str = "MIN_GAS_PRICE"; pub const TIMEOUT_SECONDS: &str = "TIMEOUT_SECONDS"; diff --git a/src/dispense_tracker.rs b/src/dispense_tracker.rs index e700c78..4ec62d2 100644 --- a/src/dispense_tracker.rs +++ b/src/dispense_tracker.rs @@ -2,7 +2,7 @@ use std::collections::BTreeMap; use std::collections::{HashMap, HashSet}; use std::time::{SystemTime, UNIX_EPOCH}; -type UserId = String; +use fuel_types::Address; pub trait Clock: std::fmt::Debug + Send + Sync { fn now(&self) -> u64; @@ -23,9 +23,9 @@ impl Clock for StdTime { #[derive(Debug)] pub struct DispenseTracker { - tracked: HashMap, - queue: BTreeMap>, - in_progress: HashSet, + tracked: HashMap, + queue: BTreeMap>, + in_progress: HashSet
, clock: Box, } @@ -50,20 +50,20 @@ impl DispenseTracker { } } - pub fn track(&mut self, user_id: UserId) { - self.in_progress.remove(&user_id); + pub fn track(&mut self, address: Address) { + self.in_progress.remove(&address); let timestamp = self.clock.now(); - self.tracked.insert(user_id.clone(), timestamp); - self.queue.entry(timestamp).or_default().push(user_id); + self.tracked.insert(address, timestamp); + self.queue.entry(timestamp).or_default().push(address); } - pub fn mark_in_progress(&mut self, user_id: String) { - self.in_progress.insert(user_id); + pub fn mark_in_progress(&mut self, address: Address) { + self.in_progress.insert(address); } - pub fn remove_in_progress(&mut self, user_id: &String) { - self.in_progress.remove(user_id); + pub fn remove_in_progress(&mut self, address: &Address) { + self.in_progress.remove(address); } pub fn evict_expired_entries(&mut self, eviction_duration: u64) { @@ -71,10 +71,10 @@ impl DispenseTracker { while let Some(oldest_entry) = self.queue.first_entry() { if now - oldest_entry.key() > eviction_duration { - let (_, user_ids) = oldest_entry.remove_entry(); + let (_, addresses) = oldest_entry.remove_entry(); - for user_id in user_ids { - self.tracked.remove(&user_id); + for address in addresses { + self.tracked.remove(&address); } } else { break; @@ -82,11 +82,11 @@ impl DispenseTracker { } } - pub fn has_tracked(&self, user_id: &UserId) -> bool { - self.tracked.get(user_id).is_some() + pub fn has_tracked(&self, address: &Address) -> bool { + self.tracked.get(address).is_some() } - pub fn is_in_progress(&self, user_id: &UserId) -> bool { - self.in_progress.contains(user_id) + pub fn is_in_progress(&self, address: &Address) -> bool { + self.in_progress.contains(address) } } diff --git a/src/lib.rs b/src/lib.rs index 42a60b7..3599a1a 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,18 +1,16 @@ -#![deny(warnings)] - use crate::{ config::Config, constants::{MAX_CONCURRENT_REQUESTS, WALLET_SECRET_DEV_KEY}, dispense_tracker::DispenseTracker, + routes::health, }; -use auth::AuthHandler; +use anyhow::anyhow; use axum::{ error_handling::HandleErrorLayer, - extract::Extension, http::{header::CACHE_CONTROL, HeaderValue, StatusCode}, response::IntoResponse, routing::{get, post}, - BoxError, Json, Router, + BoxError, Extension, Json, Router, }; use fuel_core_client::client::FuelClient; use fuel_tx::UtxoId; @@ -23,10 +21,10 @@ use fuels_core::types::transaction_builders::NetworkInfo; use secrecy::{ExposeSecret, Secret}; use serde_json::json; use std::{ - net::SocketAddr, + net::{SocketAddr, TcpListener}, sync::{Arc, Mutex}, + time::Duration, }; -use time::ext::NumericalDuration; use tokio::task::JoinHandle; use tower::ServiceBuilder; use tower_http::{ @@ -34,18 +32,18 @@ use tower_http::{ set_header::SetResponseHeaderLayer, trace::TraceLayer, }; -use tower_sessions::{Expiry, MemoryStore, SessionManagerLayer}; use tracing::info; -pub mod auth; pub mod config; pub mod models; mod constants; mod dispense_tracker; +mod recaptcha; mod routes; pub use dispense_tracker::{Clock, StdTime}; +pub use routes::THE_BIGGEST_AMOUNT; #[derive(Debug)] pub struct NetworkConfig { @@ -94,12 +92,10 @@ pub type SharedWallet = Arc; pub type SharedConfig = Arc; pub type SharedNetworkConfig = Arc; pub type SharedDispenseTracker = Arc>; -pub type SharedAuthHandler = Arc>; pub async fn start_server( service_config: Config, clock: impl Clock + 'static, - auth_handler: impl AuthHandler + 'static, ) -> (SocketAddr, JoinHandle>) { info!("{:#?}", &service_config); @@ -129,7 +125,6 @@ pub async fn start_server( .wallet_secret_key .clone() .unwrap_or_else(|| Secret::new(WALLET_SECRET_DEV_KEY.to_string())); - let wallet = WalletUnlocked::new_from_private_key( secret .expose_secret() @@ -151,23 +146,20 @@ pub async fn start_server( info!("Faucet Account: {:#x}", Address::from(wallet.address())); info!("Faucet Balance: {}", balance); - let session_store = MemoryStore::default(); - let session_layer = SessionManagerLayer::new(session_store) - .with_secure(false) - .with_expiry(Expiry::OnInactivity(NumericalDuration::days(7))); - - let web_layer = ServiceBuilder::new() - .layer(SetResponseHeaderLayer::<_>::overriding( - CACHE_CONTROL, - HeaderValue::from_static("public, max-age=3600, immutable"), - )) - .layer(session_layer.clone()) - .into_inner(); - - let api_routes = Router::new() + // setup routes + let app = Router::new() + .route( + "/", + get(routes::main).layer(SetResponseHeaderLayer::<_>::overriding( + CACHE_CONTROL, + HeaderValue::from_static("public, max-age=3600, immutable"), + )), + ) + .route("/health", get(health)) + .route("/dispense", get(routes::dispense_info)) .route( "/dispense", - post(routes::dispense::tokens_handler).route_layer( + post(routes::dispense_tokens).route_layer( // Apply rate limiting specifically on the dispense endpoint, and // only allow a single instance at a time to avoid race conditions ServiceBuilder::new() @@ -177,28 +169,13 @@ pub async fn start_server( .into_inner(), ), ) - .route("/session/validate", post(routes::session_validate::handler)) - .route("/session/remove", post(routes::session_remove::handler)); - - // setup routes - let app = Router::new() - .nest("/api", api_routes) - .layer(session_layer) - .nest("/static", routes::static_files::handler("static")) - .route("/favicon.ico", get(routes::favicon::handler)) - .route( - "/", - get(routes::main::handler).route_layer(web_layer.clone()), - ) - .route("/dispense", get(routes::dispense::info_handler)) - .route("/health", get(routes::health::handler)) .layer( ServiceBuilder::new() // Handle errors from middleware .layer(HandleErrorLayer::new(handle_error)) .load_shed() .concurrency_limit(MAX_CONCURRENT_REQUESTS) - .timeout(std::time::Duration::from_secs(60)) + .timeout(Duration::from_secs(60)) .layer(TraceLayer::new_for_http()) .layer(Extension(Arc::new(wallet))) .layer(Extension(Arc::new(client))) @@ -208,9 +185,6 @@ pub async fn start_server( .layer(Extension(Arc::new(service_config.clone()))) .layer(Extension(Arc::new(network_config))) .layer(Extension(Arc::new(Mutex::new(DispenseTracker::new(clock))))) - .layer(Extension(Arc::new( - Box::new(auth_handler) as Box - ))) .layer( CorsLayer::new() .allow_origin(Any) @@ -220,19 +194,21 @@ pub async fn start_server( .into_inner(), ); + // run the server let addr = SocketAddr::from(([0, 0, 0, 0], service_config.service_port)); - let listener = tokio::net::TcpListener::bind(addr).await.unwrap(); + let listener = TcpListener::bind(addr).unwrap(); let bound_addr = listener.local_addr().unwrap(); - let task = tokio::spawn(async move { - axum::serve(listener, app.into_make_service()) - .await - .unwrap(); - Ok(()) - }); - - // run the server info!("listening on {}", bound_addr); - (bound_addr, task) + ( + bound_addr, + tokio::spawn(async move { + axum::Server::from_tcp(listener) + .unwrap() + .serve(app.into_make_service()) + .await + .map_err(|e| anyhow!(e)) + }), + ) } async fn handle_error(error: BoxError) -> impl IntoResponse { diff --git a/src/main.rs b/src/main.rs index c177070..8549ea1 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,6 +1,4 @@ -#![deny(warnings)] - -use fuel_faucet::{auth::clerk::ClerkHandler, config::Config, start_server, StdTime}; +use fuel_faucet::{config::Config, start_server, StdTime}; use tracing_subscriber::EnvFilter; #[tokio::main] @@ -8,9 +6,7 @@ async fn main() { let config = Config::default(); init_logger(&config); let clock = StdTime {}; - let auth_handler = ClerkHandler::new(&config); - - let (_, task) = start_server(config, clock, auth_handler).await; + let (_, task) = start_server(config, clock).await; let _ = task.await.unwrap(); } diff --git a/src/models.rs b/src/models.rs index c04076f..79c1ffb 100644 --- a/src/models.rs +++ b/src/models.rs @@ -1,6 +1,6 @@ use std::fmt::{self, Display, Formatter}; -use axum::http::StatusCode; +use reqwest::StatusCode; use serde::{Deserialize, Serialize}; #[derive(Serialize, Deserialize, Debug)] @@ -11,7 +11,8 @@ pub struct DispenseInfoResponse { #[derive(Deserialize, Debug)] pub struct DispenseInput { - pub address: Option, + pub address: String, + pub captcha: String, } #[derive(Serialize, Debug)] diff --git a/src/recaptcha.rs b/src/recaptcha.rs new file mode 100644 index 0000000..0447c9e --- /dev/null +++ b/src/recaptcha.rs @@ -0,0 +1,39 @@ +use anyhow::anyhow; +use reqwest::Url; +use serde::Deserialize; +use std::collections::HashSet; +use std::net::IpAddr; + +#[derive(Debug, Deserialize)] +pub struct RecaptchaResponse { + pub success: bool, + #[serde(rename = "error-codes")] + pub error_codes: Option>, +} + +pub async fn verify( + key: &str, + response: &str, + user_ip: Option<&IpAddr>, +) -> Result<(), anyhow::Error> { + let user_ip = user_ip.map(ToString::to_string); + + let mut url = Url::parse("https://www.google.com/recaptcha/api/siteverify").unwrap(); + + // TODO: find a more secure means to pass the secret (i.e. headers) + url.query_pairs_mut() + .extend_pairs(&[("secret", key), ("response", response)]); + + if let Some(user_ip) = user_ip { + url.query_pairs_mut().append_pair("remoteip", &user_ip); + } + + let response = reqwest::get(url).await?; + let recaptcha_response = response.json::().await?; + + match (recaptcha_response.success, recaptcha_response.error_codes) { + (true, _) => Ok(()), + (false, Some(errors)) => Err(anyhow!(format!("{errors:?}"))), + (false, _) => Err(anyhow!(format!("unknown error"))), + } +} diff --git a/src/routes/dispense.rs b/src/routes.rs similarity index 69% rename from src/routes/dispense.rs rename to src/routes.rs index 15a3c75..221f091 100644 --- a/src/routes/dispense.rs +++ b/src/routes.rs @@ -1,35 +1,101 @@ use crate::{ - models::*, CoinOutput, SharedConfig, SharedDispenseTracker, SharedFaucetState, + models::*, recaptcha, CoinOutput, SharedConfig, SharedDispenseTracker, SharedFaucetState, SharedNetworkConfig, SharedWallet, }; use axum::{ - extract::Extension, - http::StatusCode, - response::{IntoResponse, Response}, - Json, + response::{Html, IntoResponse, Response}, + Extension, Json, }; + use fuel_core_client::client::FuelClient; use fuel_tx::UtxoId; -use fuel_types::{AssetId, Bytes32}; +use fuel_types::{Address, AssetId, Bytes32}; use fuels_accounts::{wallet::WalletUnlocked, Account, Signer, ViewOnlyAccount}; +use fuels_core::types::transaction::{Transaction, TxPolicies}; +use fuels_core::types::transaction_builders::BuildableTransaction; use fuels_core::types::{ bech32::Bech32Address, - transaction::{Transaction, TxPolicies}, - transaction_builders::BuildableTransaction, - Address, -}; -use fuels_core::types::{ coin::{Coin, CoinStatus}, coin_type::CoinType, }; use fuels_core::types::{input::Input, transaction_builders::ScriptTransactionBuilder}; -use serde::Deserialize; +use handlebars::Handlebars; +use reqwest::StatusCode; +use secrecy::ExposeSecret; use serde_json::json; +use std::sync::Arc; use std::time::Duration; -use std::{str::FromStr, sync::Arc}; -use tower_sessions::Session; +use std::{ + collections::BTreeMap, + str::FromStr, + time::{SystemTime, UNIX_EPOCH}, +}; use tracing::{error, info}; +// The amount to fetch the biggest input of the faucet. +pub const THE_BIGGEST_AMOUNT: u64 = u32::MAX as u64; + +lazy_static::lazy_static! { + static ref START_TIME: u64 = SystemTime::now().duration_since(UNIX_EPOCH).unwrap().as_millis() as u64; +} + +#[memoize::memoize] +pub fn render_page(public_node_url: String, captcha_key: Option) -> String { + let template = include_str!(concat!(env!("OUT_DIR"), "/index.html")); + // sub in values + let mut handlebars = Handlebars::new(); + handlebars + .register_template_string("index", template) + .unwrap(); + let mut data = BTreeMap::new(); + data.insert("page_title", "Fuel Faucet"); + data.insert("public_node_url", public_node_url.as_str()); + // if captcha is enabled, add captcha key + if let Some(captcha_key) = &captcha_key { + data.insert("captcha_key", captcha_key.as_str()); + } + // render page + handlebars.render("index", &data).unwrap() +} + +pub async fn main(Extension(config): Extension) -> Html { + let public_node_url = config.public_node_url.clone(); + let captcha_key = config.captcha_key.clone(); + Html(render_page(public_node_url, captcha_key)) +} + +#[tracing::instrument(skip_all)] +pub async fn health(Extension(wallet): Extension) -> Response { + // ping client for health + let client = wallet + .provider() + .expect("client provider") + .healthy() + .await + .unwrap_or(false); + + let time = SystemTime::now() + .duration_since(UNIX_EPOCH) + .unwrap() + .as_millis() as u64; + + let status = if client { + StatusCode::OK + } else { + StatusCode::INTERNAL_SERVER_ERROR + }; + + ( + status, + Json(json!({ + "up": true, + "uptime": time - *START_TIME, + "fuel-core" : client, + })), + ) + .into_response() +} + impl IntoResponse for DispenseResponse { fn into_response(self) -> Response { (StatusCode::CREATED, Json(self)).into_response() @@ -56,20 +122,27 @@ impl IntoResponse for DispenseInfoResponse { fn check_and_mark_dispense_limit( dispense_tracker: &SharedDispenseTracker, - user_id: String, + address: Address, interval: u64, ) -> Result<(), DispenseError> { let mut tracker = dispense_tracker.lock().unwrap(); tracker.evict_expired_entries(interval); - if tracker.has_tracked(&user_id) { + if tracker.has_tracked(&address) { return Err(error( "Account has already received assets today".to_string(), StatusCode::TOO_MANY_REQUESTS, )); } - tracker.mark_in_progress(user_id); + if tracker.is_in_progress(&address) { + return Err(error( + "Account is already in the process of receiving assets".to_string(), + StatusCode::TOO_MANY_REQUESTS, + )); + } + + tracker.mark_in_progress(address); Ok(()) } @@ -136,60 +209,20 @@ async fn submit_tx_with_timeout( Ok(()) } -#[derive(Deserialize, Debug)] -pub struct Method { - pub method: Option, -} - -#[allow(clippy::too_many_arguments)] #[tracing::instrument(skip_all)] -pub async fn tokens_handler( - Extension(wallet): Extension, - Extension(state): Extension, - Extension(config): Extension, - Extension(client): Extension>, - Extension(network_config): Extension, - Extension(dispense_tracker): Extension, - Extension(session): Extension, +pub async fn dispense_tokens( Json(input): Json, -) -> Result { - dispense_auth( - Extension(wallet), - Extension(state), - Extension(config), - Extension(client), - Extension(network_config), - Extension(dispense_tracker), - Extension(session), - Json(input), - ) - .await -} - -fn get_input(value: Option, prop: &str) -> Result { - let value = - value.ok_or_else(|| error(format!("{} is required", prop), StatusCode::BAD_REQUEST))?; - Ok(value) -} - -#[allow(clippy::too_many_arguments)] -#[tracing::instrument(skip_all)] -async fn dispense_auth( Extension(wallet): Extension, Extension(state): Extension, Extension(config): Extension, Extension(client): Extension>, Extension(network_config): Extension, Extension(dispense_tracker): Extension, - Extension(session): Extension, - Json(input): Json, ) -> Result { - let input_address = get_input(input.address.clone(), "address")?; - // parse deposit address - let address = if let Ok(address) = Address::from_str(input_address.as_str()) { + let address = if let Ok(address) = Address::from_str(input.address.as_str()) { Ok(address) - } else if let Ok(address) = Bech32Address::from_str(input_address.as_str()) { + } else if let Ok(address) = Bech32Address::from_str(input.address.as_str()) { Ok(address.into()) } else { return Err(error( @@ -198,27 +231,20 @@ async fn dispense_auth( )); }?; - let user_id: String = session - .get("user_id") - .await - .map_err(|_| { - error( - "Loading the session failed".to_string(), - StatusCode::INTERNAL_SERVER_ERROR, - ) - })? - .ok_or_else(|| { - error( - "Session is missing user_id".to_string(), - StatusCode::UNAUTHORIZED, - ) - })?; + // verify captcha + if let Some(s) = config.captcha_secret.clone() { + recaptcha::verify(s.expose_secret(), input.captcha.as_str(), None) + .await + .map_err(|e| { + tracing::error!("{}", e); + DispenseError { + error: "captcha failed".to_string(), + status: StatusCode::UNAUTHORIZED, + } + })?; + } - check_and_mark_dispense_limit( - &dispense_tracker, - user_id.clone(), - config.dispense_limit_interval, - )?; + check_and_mark_dispense_limit(&dispense_tracker, address, config.dispense_limit_interval)?; struct CleanUpper(Fn) where @@ -238,7 +264,7 @@ async fn dispense_auth( dispense_tracker .lock() .unwrap() - .remove_in_progress(&user_id); + .remove_in_progress(&address); }); let provider = wallet.provider().expect("client provider"); @@ -342,7 +368,8 @@ async fn dispense_auth( config.dispense_amount, &address ); - dispense_tracker.lock().unwrap().track(user_id.clone()); + let mut tracker = dispense_tracker.lock().unwrap(); + tracker.track(address); Ok(DispenseResponse { status: "Success".to_string(), @@ -352,7 +379,7 @@ async fn dispense_auth( } #[tracing::instrument(skip_all)] -pub async fn info_handler( +pub async fn dispense_info( Extension(config): Extension, ) -> Result { Ok(DispenseInfoResponse { diff --git a/src/routes/favicon.rs b/src/routes/favicon.rs deleted file mode 100644 index 72dc0b9..0000000 --- a/src/routes/favicon.rs +++ /dev/null @@ -1,5 +0,0 @@ -use axum::response::{IntoResponse, Redirect}; - -pub async fn handler() -> impl IntoResponse { - Redirect::permanent("/static/img/favicon.svg").into_response() -} diff --git a/src/routes/health.rs b/src/routes/health.rs deleted file mode 100644 index fc2e93d..0000000 --- a/src/routes/health.rs +++ /dev/null @@ -1,41 +0,0 @@ -use std::time::{SystemTime, UNIX_EPOCH}; - -use axum::{http::StatusCode, response::IntoResponse, Extension, Json}; -use serde_json::json; - -use crate::SharedWallet; - -lazy_static::lazy_static! { - static ref START_TIME: u64 = SystemTime::now().duration_since(UNIX_EPOCH).unwrap().as_millis() as u64; -} - -#[tracing::instrument(skip(wallet))] -pub async fn handler(Extension(wallet): Extension) -> impl IntoResponse { - // ping client for health - let client = wallet - .provider() - .expect("client provider") - .healthy() - .await - .unwrap_or(false); - - let time = SystemTime::now() - .duration_since(UNIX_EPOCH) - .unwrap() - .as_millis() as u64; - - let status = if client { - StatusCode::OK - } else { - StatusCode::INTERNAL_SERVER_ERROR - }; - - ( - status, - Json(json!({ - "up": true, - "uptime": time - *START_TIME, - "fuel-core" : client, - })), - ) -} diff --git a/src/routes/main.rs b/src/routes/main.rs deleted file mode 100644 index 254c520..0000000 --- a/src/routes/main.rs +++ /dev/null @@ -1,56 +0,0 @@ -use crate::SharedConfig; -use axum::{ - extract::Extension, - response::{Html, IntoResponse}, -}; -use handlebars::Handlebars; -use std::{ - collections::BTreeMap, - env, - error::Error, - path::PathBuf, - time::{SystemTime, UNIX_EPOCH}, -}; - -lazy_static::lazy_static! { - static ref START_TIME: u64 = SystemTime::now().duration_since(UNIX_EPOCH).unwrap().as_millis() as u64; -} - -fn get_js_file() -> Result> { - let project_root = env::var("CARGO_MANIFEST_DIR").expect("Failed to get project root"); - let js_dir = PathBuf::from(project_root).join("static/js"); - let entries = std::fs::read_dir(js_dir)? - .map(|res| res.map(|e| e.path())) - .collect::, std::io::Error>>()?; - - let first = entries - .iter() - .find(|entry| entry.to_str().unwrap().contains("index")) - .unwrap(); - - let js_file = first.as_path().file_name().unwrap(); - Ok(js_file.to_str().unwrap().to_string()) -} - -fn render_main(public_node_url: String, clerk_pub_key: String) -> String { - let js_file = get_js_file().unwrap(); - let template = include_str!(concat!(env!("OUT_DIR"), "/index.html")); - // sub in values - let mut handlebars = Handlebars::new(); - handlebars - .register_template_string("index", template) - .unwrap(); - let mut data = BTreeMap::new(); - data.insert("page_title", "Fuel Faucet"); - data.insert("public_node_url", public_node_url.as_str()); - data.insert("clerk_public_key", clerk_pub_key.as_str()); - data.insert("js_file", js_file.as_str()); - // render page - handlebars.render("index", &data).unwrap() -} - -pub async fn handler(Extension(config): Extension) -> impl IntoResponse { - let public_node_url = config.public_node_url.clone(); - let clerk_pub_key = config.clerk_pub_key.clone().unwrap_or("".to_string()); - Html(render_main(public_node_url, clerk_pub_key)).into_response() -} diff --git a/src/routes/mod.rs b/src/routes/mod.rs deleted file mode 100644 index 23f93b2..0000000 --- a/src/routes/mod.rs +++ /dev/null @@ -1,7 +0,0 @@ -pub mod dispense; -pub mod favicon; -pub mod health; -pub mod main; -pub mod session_remove; -pub mod session_validate; -pub mod static_files; diff --git a/src/routes/session_remove.rs b/src/routes/session_remove.rs deleted file mode 100644 index 3e77a96..0000000 --- a/src/routes/session_remove.rs +++ /dev/null @@ -1,8 +0,0 @@ -use axum::{http::StatusCode, response::IntoResponse, Json}; -use serde_json::json; -use tower_sessions::Session; - -pub async fn handler(session_manager: Session) -> impl IntoResponse { - session_manager.remove_value("user_id").await.unwrap(); - (StatusCode::OK, Json(json!({ "status": "OK" }))) -} diff --git a/src/routes/session_validate.rs b/src/routes/session_validate.rs deleted file mode 100644 index 2061d79..0000000 --- a/src/routes/session_validate.rs +++ /dev/null @@ -1,35 +0,0 @@ -use crate::SharedAuthHandler; -use axum::{http::StatusCode, response::IntoResponse, Extension, Json}; -use serde::Deserialize; -use serde_json::json; -use tower_sessions::Session; - -#[derive(Deserialize)] -pub struct SessionData { - value: String, -} - -pub async fn handler( - Extension(auth_handler): Extension, - session: Session, - Json(data): Json, -) -> impl IntoResponse { - let data = auth_handler.get_user_session(data.value.as_str()).await; - let user_id = match data { - Ok(user_id) => user_id, - Err(_) => { - return ( - StatusCode::UNAUTHORIZED, - Json(json!({"error": "Unauthorized"})), - ) - } - }; - - let response = Json(json!({ - "user": user_id, - })); - - session.insert("user_id", user_id).await.unwrap(); - - (StatusCode::OK, response) -} diff --git a/src/routes/static_files.rs b/src/routes/static_files.rs deleted file mode 100644 index 2b1d21d..0000000 --- a/src/routes/static_files.rs +++ /dev/null @@ -1,49 +0,0 @@ -use axum::{ - body::Body, - http::Request, - middleware::{from_fn, Next}, - response::Response, - Router, -}; -use std::path::Path; -use tower_http::services::ServeDir; - -async fn content_type_middleware(req: Request, next: Next) -> Response { - let uri = req.uri().to_owned(); - let path = uri.path(); - let splited = path.split('.').collect::>(); - if let Some(extension) = splited.last() { - let mut response = next.run(req).await; - let extension = extension.to_owned().to_lowercase(); - let content_type = match extension.as_str() { - "html" => "text/html", - "css" => "text/css", - "js" => "text/javascript", - "ps" => "application/postscript", - "svg" => "image/svg+xml", - _ => "application/octet-stream", - }; - - if let Ok(content_type) = content_type.parse() { - response.headers_mut().insert("Content-Type", content_type); - } - - response - } else { - let mut response = next.run(req).await; - - if let Ok(content_type) = "application/octet-stream".parse() { - response.headers_mut().insert("Content-Type", content_type); - } - - response - } -} - -pub fn handler>(path: P) -> Router { - let serve_dir = ServeDir::new(path); - - Router::new() - .fallback_service(serve_dir) - .layer(from_fn(content_type_middleware)) -} diff --git a/static/favicon.svg b/static/favicon.svg deleted file mode 100644 index 3d37edb..0000000 --- a/static/favicon.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/static/index.css b/static/index.css deleted file mode 100644 index 9a729bd..0000000 --- a/static/index.css +++ /dev/null @@ -1,77 +0,0 @@ -body, -#root { - display: flex; - justify-content: center; - align-items: center; - flex-direction: column; -} - -.background { - background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32' width='32' height='32' fill='none' stroke='%230f172a' stroke-opacity='0.04'%3E%3Cpath d='M0 .5H31.5V32' /%3E%3C/svg%3E%0A"); - -webkit-mask-image: linear-gradient( - 180deg, - rgba(255, 255, 255, 1), - rgba(255, 255, 255, 1), - rgba(255, 255, 255, 0.3) - ); - mask-image: linear-gradient( - 180deg, - rgba(255, 255, 255, 1), - rgba(255, 255, 255, 1), - rgba(255, 255, 255, 0.3) - ); -} - -.cl-userButton-root { - position: absolute; - top: 20px; - right: 20px; -} - -.inter-font { - font-family: "Inter", sans-serif; - font-optical-sizing: auto; - font-weight: ; - font-style: normal; - font-variation-settings: "slnt" 0; -} - -.loader { - width: 24px; - height: 24px; - border: 3px solid #eee; - border-bottom-color: #02f58c; - border-radius: 50%; - display: inline-block; - box-sizing: border-box; - animation: rotation 1s linear infinite; -} - -@keyframes rotation { - 0% { - transform: rotate(0deg); - } - 100% { - transform: rotate(360deg); - } -} - -#overlay { - position: fixed; - inset: 0 0 0 0; - width: 100vw; - height: 100vh; - background: rgba(0, 0, 0, 0.2); - z-index: 1000; - display: flex; - justify-content: center; - align-items: center; -} - -.container { - width: 100vw; - height: 100vh; - display: flex; - justify-content: center; - align-items: center; -} diff --git a/static/index.html b/static/index.html index 184270a..5e7f087 100644 --- a/static/index.html +++ b/static/index.html @@ -1,23 +1,341 @@ - + - - - - - {{ page_title }} - - - - - - - -
-
- - - - + + + + {{ page_title }} + + + + + + + +
+
+ +
+
+ + +
+

+ This is a Test Ether faucet running on the + Test Fuel network. This faucet sends fake Ether + assets to the provided wallet address. +

+
+ {{#if captcha_key}} +
+
+
+ {{/if}} + +
+
+ +
+ +
+ +
+
+
+ +
+
+

Test Ether sent to the wallet

+ See on Fuel Explorer +
+
+
Node url: {{ public_node_url }}
+ + + + \ No newline at end of file diff --git a/tests/dispense.rs b/tests/dispense.rs index e967901..ba1809d 100644 --- a/tests/dispense.rs +++ b/tests/dispense.rs @@ -1,15 +1,11 @@ -use axum::async_trait; use fuel_core::chain_config::{ChainConfig, CoinConfig, StateConfig}; use fuel_core::service::config::Trigger; use fuel_core::service::{Config as NodeConfig, FuelService}; use fuel_core_client::client::pagination::{PageDirection, PaginationRequest}; -use fuel_faucet::auth::{AuthError, AuthHandler}; use fuel_faucet::config::Config; - use fuel_faucet::models::DispenseInfoResponse; -use fuel_faucet::{start_server, Clock}; - +use fuel_faucet::{start_server, Clock, THE_BIGGEST_AMOUNT}; use fuel_tx::{ConsensusParameters, FeeParameters}; use fuel_types::{Address, AssetId}; use fuels_accounts::fuel_crypto::SecretKey; @@ -21,15 +17,11 @@ use rand::rngs::StdRng; use rand::{Rng, SeedableRng}; use secrecy::Secret; use serde_json::json; -use std::collections::HashSet; use std::net::SocketAddr; use std::sync::{Arc, Mutex}; use std::time::Duration; use std::usize; -// The amount to fetch the biggest input of the faucet. -const THE_BIGGEST_AMOUNT: u64 = u32::MAX as u64; - #[derive(Debug, Clone)] struct MockClock { timer: Arc>, @@ -53,45 +45,12 @@ impl MockClock { } } -#[derive(Debug, Clone)] -struct MockAuthHandler { - user_ids: Arc>>, -} - -impl MockAuthHandler { - pub fn new() -> Self { - Self { - user_ids: Default::default(), - } - } - - pub fn register_user(&self, user_id: String) { - self.user_ids.lock().as_deref_mut().unwrap().insert(user_id); - } - - pub fn is_registered(&self, user_id: &str) -> bool { - self.user_ids.lock().as_deref().unwrap().contains(user_id) - } -} - -#[async_trait] -impl AuthHandler for MockAuthHandler { - async fn get_user_session(&self, user_id: &str) -> Result { - if self.is_registered(user_id) { - Ok(user_id.to_string()) - } else { - Err(AuthError::new("User needs to be registered")) - } - } -} - struct TestContext { #[allow(dead_code)] fuel_node: FuelService, faucet_config: Config, provider: Provider, addr: SocketAddr, - auth_handler: MockAuthHandler, clock: MockClock, } impl TestContext { @@ -175,65 +134,18 @@ impl TestContext { }; let clock = MockClock::new(); - let auth_handler = MockAuthHandler::new(); - let (addr, _) = - start_server(faucet_config.clone(), clock.clone(), auth_handler.clone()).await; + let (addr, _) = start_server(faucet_config.clone(), clock.clone()).await; Self { fuel_node, faucet_config, provider, addr, - auth_handler, clock, } } } -struct DispenseRequest { - client: reqwest::Client, - recipient_address: String, - addr: SocketAddr, -} -impl DispenseRequest { - fn for_recipient(recipient_address: String, context: &TestContext) -> Self { - context - .auth_handler - .register_user(recipient_address.clone()); - - let client = reqwest::ClientBuilder::new() - .cookie_store(true) - .build() - .unwrap(); - - Self { - client, - recipient_address, - addr: context.addr, - } - } - - async fn send(&self) -> reqwest::Result { - let addr = self.addr; - self.client - .post(format!("http://{addr}/api/session/validate")) - .json(&json!({ - "value": self.recipient_address, - })) - .send() - .await - .unwrap(); - - self.client - .post(format!("http://{addr}/api/dispense")) - .json(&json!({ - "address": self.recipient_address, - })) - .send() - .await - } -} - #[tokio::test] async fn can_start_server() { let context = TestContext::new(StdRng::seed_from_u64(42)).await; @@ -262,7 +174,7 @@ async fn dispense_sends_coins_to_valid_address_hex_address() { let mut rng = StdRng::seed_from_u64(42); let recipient_address: Address = rng.gen(); - dispense_sends_coins_to_valid_address( + _dispense_sends_coins_to_valid_address( rng, recipient_address.into(), format!("{:#x}", &recipient_address), @@ -275,7 +187,7 @@ async fn dispense_sends_coins_to_valid_address_non_hex() { let mut rng = StdRng::seed_from_u64(42); let recipient_address: Address = rng.gen(); - dispense_sends_coins_to_valid_address( + _dispense_sends_coins_to_valid_address( rng, recipient_address.into(), format!("{}", &recipient_address), @@ -283,18 +195,21 @@ async fn dispense_sends_coins_to_valid_address_non_hex() { .await } -async fn dispense_sends_coins_to_valid_address( +async fn _dispense_sends_coins_to_valid_address( rng: StdRng, recipient_address: Bech32Address, recipient_address_str: String, ) { let context = TestContext::new(rng).await; + let addr = context.addr; + let client = reqwest::Client::new(); - context - .auth_handler - .register_user(recipient_address_str.clone()); - - DispenseRequest::for_recipient(recipient_address_str, &context) + client + .post(format!("http://{addr}/dispense")) + .json(&json!({ + "captcha": "", + "address": recipient_address_str, + })) .send() .await .unwrap(); @@ -326,12 +241,19 @@ async fn many_concurrent_requests() { const COUNT: usize = 30; let recipient_addresses_str = generate_recipient_addresses(COUNT, &mut rng); let context = TestContext::new(rng).await; + let addr = context.addr; let mut queries = vec![]; for recipient in recipient_addresses_str { - queries.push(async { - context.auth_handler.register_user(recipient.clone()); - DispenseRequest::for_recipient(recipient, &context) + let recipient = recipient.clone(); + queries.push(async move { + let client = reqwest::Client::new(); + client + .post(format!("http://{addr}/dispense")) + .json(&json!({ + "captcha": "", + "address": recipient, + })) .send() .await }); @@ -364,14 +286,17 @@ async fn dispense_once_per_day() { let recipient_address: Address = rng.gen(); let recipient_address_str = format!("{}", &recipient_address); let context = TestContext::new(rng).await; + let addr = context.addr; let dispense_interval = 24 * 60 * 60; let time_increment = dispense_interval / 6; - context - .auth_handler - .register_user(recipient_address_str.clone()); - let response = DispenseRequest::for_recipient(recipient_address_str.clone(), &context) + let response = reqwest::Client::new() + .post(format!("http://{addr}/dispense")) + .json(&json!({ + "captcha": "", + "address": recipient_address_str.clone(), + })) .send() .await .expect("First dispensing request should be successful"); @@ -381,7 +306,12 @@ async fn dispense_once_per_day() { for _ in 0..5 { context.clock.advance(time_increment); - let response = DispenseRequest::for_recipient(recipient_address_str.clone(), &context) + let response = reqwest::Client::new() + .post(format!("http://{addr}/dispense")) + .json(&json!({ + "captcha": "", + "address": recipient_address_str.clone(), + })) .send() .await .expect("Subsequent dispensing requests should be successfully sent"); @@ -390,7 +320,12 @@ async fn dispense_once_per_day() { } context.clock.advance(time_increment + 1); - let response = DispenseRequest::for_recipient(recipient_address_str.clone(), &context) + let response = reqwest::Client::new() + .post(format!("http://{addr}/dispense")) + .json(&json!({ + "captcha": "", + "address": recipient_address_str.clone(), + })) .send() .await .expect("Dispensing requests after the interval should be successful"); From 8bbd026739b4cce6fa279145cd102940fa2a2317 Mon Sep 17 00:00:00 2001 From: Green Baneling Date: Fri, 26 Apr 2024 17:50:17 +0200 Subject: [PATCH 08/11] Added support for `fuel-core 0.24.3` (#69) * Added support for `fuel-core 0.24.2` * Removed min gas price * Make CI happy * Use `1.76.0` rust to build the image * Bump minor release --- .github/workflows/ci.yml | 4 +- Cargo.lock | 2488 +++++++++++++++-- Cargo.toml | 19 +- README.md | 1 - deployment/Dockerfile | 2 +- .../charts/templates/fuel-faucet-deploy.yaml | 8 +- deployment/charts/values.yaml | 1 - deployment/scripts/.env | 1 - src/config.rs | 9 +- src/constants.rs | 1 - src/lib.rs | 51 +- src/routes.rs | 143 +- tests/dispense.rs | 70 +- 13 files changed, 2398 insertions(+), 400 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a76fd86..ce2459d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -6,13 +6,13 @@ on: - master pull_request: release: - types: [published] + types: [ published ] env: CARGO_TERM_COLOR: always RUSTFLAGS: -D warnings REGISTRY: ghcr.io - RUST_VERSION: 1.74.0 + RUST_VERSION: 1.76.0 jobs: cancel-previous-runs: diff --git a/Cargo.lock b/Cargo.lock index 72b0988..22c8cdc 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -27,6 +27,16 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" +[[package]] +name = "aead" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0" +dependencies = [ + "crypto-common", + "generic-array", +] + [[package]] name = "aes" version = "0.8.3" @@ -38,6 +48,20 @@ dependencies = [ "cpufeatures", ] +[[package]] +name = "aes-gcm" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "831010a0f742e1209b3bcea8fab6a8e149051ba6099432c8cb2cc117dec3ead1" +dependencies = [ + "aead", + "aes", + "cipher", + "ctr", + "ghash", + "subtle", +] + [[package]] name = "ahash" version = "0.8.6" @@ -143,12 +167,69 @@ version = "1.0.75" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4668cab20f66d8d020e1fbc0ebe47217433c1b6c8f2040faf858554e394ace6" +[[package]] +name = "arrayref" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b4930d2cb77ce62f89ee5d5289b4ac049559b1c45539271f5ed4fdc7db34545" + +[[package]] +name = "arrayvec" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" + [[package]] name = "ascii" version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eab1c04a571841102f5345a8fc0f6bb3d31c315dec879b5c6e42e40ce7ffa34e" +[[package]] +name = "asn1-rs" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f6fd5ddaf0351dff5b8da21b2fb4ff8e08ddd02857f0bf69c47639106c0fff0" +dependencies = [ + "asn1-rs-derive", + "asn1-rs-impl", + "displaydoc", + "nom", + "num-traits", + "rusticata-macros", + "thiserror", + "time", +] + +[[package]] +name = "asn1-rs-derive" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "726535892e8eae7e70657b4c8ea93d26b8553afb1ce617caee529ef96d7dee6c" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", + "synstructure 0.12.6", +] + +[[package]] +name = "asn1-rs-impl" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2777730b2039ac0f95f093556e61b6d26cebed5393ca6f152717777cec3a42ed" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "asn1_der" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "155a5a185e42c6b77ac7b88a15143d930a9e9727a5b7b77eed417404ab15c247" + [[package]] name = "async-graphql" version = "4.0.16" @@ -222,6 +303,36 @@ dependencies = [ "serde_json", ] +[[package]] +name = "async-io" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcccb0f599cfa2f8ace422d3555572f47424da5648a4382a9dd0310ff8210884" +dependencies = [ + "async-lock", + "cfg-if", + "concurrent-queue", + "futures-io", + "futures-lite", + "parking", + "polling", + "rustix", + "slab", + "tracing", + "windows-sys 0.52.0", +] + +[[package]] +name = "async-lock" +version = "3.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d034b430882f8381900d3fe6f0aaa3ad94f2cb4ac519b429692a1bc2dda4ae7b" +dependencies = [ + "event-listener", + "event-listener-strategy", + "pin-project-lite", +] + [[package]] name = "async-stream" version = "0.3.5" @@ -255,6 +366,32 @@ dependencies = [ "syn 2.0.39", ] +[[package]] +name = "asynchronous-codec" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4057f2c32adbb2fc158e22fb38433c8e9bbf76b75a4732c7c0cbaf695fb65568" +dependencies = [ + "bytes", + "futures-sink", + "futures-util", + "memchr", + "pin-project-lite", +] + +[[package]] +name = "asynchronous-codec" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a860072022177f903e59730004fb5dc13db9275b79bb2aef7ba8ce831956c233" +dependencies = [ + "bytes", + "futures-sink", + "futures-util", + "memchr", + "pin-project-lite", +] + [[package]] name = "atomic-polyfill" version = "0.1.11" @@ -264,6 +401,17 @@ dependencies = [ "critical-section", ] +[[package]] +name = "attohttpc" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d9a9bf8b79a749ee0b911b91b671cc2b6c670bdbc7e3dfd537576ddc94bb2a2" +dependencies = [ + "http", + "log", + "url", +] + [[package]] name = "autocfg" version = "1.1.0" @@ -333,6 +481,12 @@ dependencies = [ "serde", ] +[[package]] +name = "base-x" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cbbc9d0964165b47557570cce6c952866c2678457aca742aafc9fb771d30270" + [[package]] name = "base16ct" version = "0.2.0" @@ -351,6 +505,12 @@ version = "0.21.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "35636a1494ede3b646cc98f74f8e62c773a38a659ebc777a2cf26b9b74171df9" +[[package]] +name = "base64" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9475866fec1451be56a3c2400fd081ff546538961565ccb5b7142cbd22bc7a51" + [[package]] name = "base64ct" version = "1.6.0" @@ -390,6 +550,24 @@ dependencies = [ "wyz", ] +[[package]] +name = "blake2" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46502ad458c9a52b69d4d4d32775c788b7a1b85e8bc9d482d92250fc0e3f8efe" +dependencies = [ + "digest 0.10.7", +] + +[[package]] +name = "block-buffer" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" +dependencies = [ + "generic-array", +] + [[package]] name = "block-buffer" version = "0.10.4" @@ -405,7 +583,7 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f5353f36341f7451062466f0b755b96ac3a9547e4d7f6b70d603fc721a7d7896" dependencies = [ - "sha2", + "sha2 0.10.8", "tinyvec", ] @@ -445,6 +623,30 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "chacha20" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3613f74bd2eac03dad61bd53dbe620703d4371614fe0bc3b9f04dd36fe4e818" +dependencies = [ + "cfg-if", + "cipher", + "cpufeatures", +] + +[[package]] +name = "chacha20poly1305" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10cd79432192d1c0f4e1a0fef9527696cc039165d729fb41b3f4f4f354c2dc35" +dependencies = [ + "aead", + "chacha20", + "cipher", + "poly1305", + "zeroize", +] + [[package]] name = "chrono" version = "0.4.31" @@ -455,6 +657,7 @@ dependencies = [ "iana-time-zone", "js-sys", "num-traits", + "serde", "wasm-bindgen", "windows-targets 0.48.5", ] @@ -467,6 +670,7 @@ checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" dependencies = [ "crypto-common", "inout", + "zeroize", ] [[package]] @@ -523,11 +727,11 @@ checksum = "3b6be4a5df2098cd811f3194f64ddb96c267606bffd9689ac7b0160097b01ad3" dependencies = [ "bs58", "coins-core", - "digest", - "hmac", + "digest 0.10.7", + "hmac 0.12.1", "k256", "serde", - "sha2", + "sha2 0.10.8", "thiserror", ] @@ -539,11 +743,11 @@ checksum = "3db8fba409ce3dc04f7d804074039eb68b960b0829161f8e06c95fea3f122528" dependencies = [ "bitvec", "coins-bip32", - "hmac", + "hmac 0.12.1", "once_cell", "pbkdf2 0.12.2", "rand", - "sha2", + "sha2 0.10.8", "thiserror", ] @@ -556,13 +760,13 @@ dependencies = [ "base64 0.21.5", "bech32", "bs58", - "digest", + "digest 0.10.7", "generic-array", "hex", "ripemd", "serde", "serde_derive", - "sha2", + "sha2 0.10.8", "sha3", "thiserror", ] @@ -586,6 +790,15 @@ dependencies = [ "unreachable", ] +[[package]] +name = "concurrent-queue" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d16048cd947b08fa32c24458a22f5dc5e835264f689f4f5653210c69fd107363" +dependencies = [ + "crossbeam-utils", +] + [[package]] name = "console" version = "0.15.7" @@ -654,6 +867,15 @@ version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" +[[package]] +name = "core2" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b49ba7ef1ad6107f8824dbe97de947cbaac53c44e7f9756a1fba0d37c1eec505" +dependencies = [ + "memchr", +] + [[package]] name = "counter" version = "0.5.7" @@ -736,9 +958,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" dependencies = [ "generic-array", + "rand_core", "typenum", ] +[[package]] +name = "crypto-mac" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b584a330336237c1eecd3e94266efb216c56ed91225d634cb2991c5f3fd1aeab" +dependencies = [ + "generic-array", + "subtle", +] + [[package]] name = "ct-logs" version = "0.8.0" @@ -766,11 +999,12 @@ dependencies = [ "cfg-if", "cpufeatures", "curve25519-dalek-derive", - "digest", + "digest 0.10.7", "fiat-crypto", "platforms", "rustc_version", "subtle", + "zeroize", ] [[package]] @@ -844,6 +1078,16 @@ dependencies = [ "darling_macro 0.14.4", ] +[[package]] +name = "darling" +version = "0.20.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54e36fcd13ed84ffdfda6f5be89b31287cbb80c439841fe69e04841435464391" +dependencies = [ + "darling_core 0.20.8", + "darling_macro 0.20.8", +] + [[package]] name = "darling_core" version = "0.13.4" @@ -872,6 +1116,20 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "darling_core" +version = "0.20.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c2cf1c23a687a1feeb728783b993c4e1ad83d99f351801977dd809b48d0a70f" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 2.0.39", +] + [[package]] name = "darling_macro" version = "0.13.4" @@ -894,6 +1152,43 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "darling_macro" +version = "0.20.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a668eda54683121533a393014d8692171709ff57a7d61f187b6e782719f8933f" +dependencies = [ + "darling_core 0.20.8", + "quote", + "syn 2.0.39", +] + +[[package]] +name = "data-encoding" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e962a19be5cfc3f3bf6dd8f61eb50107f356ad6270fbb3ed41476571db78be5" + +[[package]] +name = "data-encoding-macro" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20c01c06f5f429efdf2bae21eb67c28b3df3cf85b7dd2d8ef09c0838dac5d33e" +dependencies = [ + "data-encoding", + "data-encoding-macro-internal", +] + +[[package]] +name = "data-encoding-macro-internal" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0047d07f2c89b17dd631c80450d69841a6b5d7fb17278cbc43d7e4cfcf2576f3" +dependencies = [ + "data-encoding", + "syn 1.0.109", +] + [[package]] name = "der" version = "0.7.8" @@ -904,6 +1199,20 @@ dependencies = [ "zeroize", ] +[[package]] +name = "der-parser" +version = "8.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbd676fbbab537128ef0278adb5576cf363cff6aa22a7b24effe97347cfab61e" +dependencies = [ + "asn1-rs", + "displaydoc", + "nom", + "num-bigint", + "num-traits", + "rusticata-macros", +] + [[package]] name = "deranged" version = "0.3.9" @@ -911,6 +1220,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0f32d04922c60427da6f9fef14d042d9edddef64cb9d4ce0d64d0685fbeb1fd3" dependencies = [ "powerfmt", + "serde", ] [[package]] @@ -937,18 +1247,50 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "difflib" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6184e33543162437515c2e2b48714794e37845ec9851711914eec9d308f6ebe8" + +[[package]] +name = "digest" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array", +] + [[package]] name = "digest" version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ - "block-buffer", + "block-buffer 0.10.4", "const-oid", "crypto-common", "subtle", ] +[[package]] +name = "displaydoc" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "487585f4d0c6655fe74905e2504d8ad6908e4db67f744eb140876906c2f3175d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.39", +] + +[[package]] +name = "downcast" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1435fa1053d8b2fbbe9be7e97eca7f33d37b28409959813daefc1446a14247f1" + [[package]] name = "dtoa" version = "1.0.9" @@ -962,7 +1304,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" dependencies = [ "der", - "digest", + "digest 0.10.7", "elliptic-curve", "rfc6979", "signature", @@ -975,6 +1317,7 @@ version = "2.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53" dependencies = [ + "pkcs8", "signature", ] @@ -986,8 +1329,11 @@ checksum = "1f628eaec48bfd21b865dc2950cfa014450c01d2fa2b69a86c2fd5844ec523c0" dependencies = [ "curve25519-dalek", "ed25519", - "sha2", + "rand_core", + "serde", + "sha2 0.10.8", "subtle", + "zeroize", ] [[package]] @@ -1004,7 +1350,7 @@ checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" dependencies = [ "base16ct", "crypto-bigint", - "digest", + "digest 0.10.7", "ff", "generic-array", "group", @@ -1036,6 +1382,18 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "enum-as-inner" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ffccbb6966c05b32ef8fbac435df276c4ae4d3dc55a8cd0eb9745e6c12f546a" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn 2.0.39", +] + [[package]] name = "enum-iterator" version = "1.4.1" @@ -1080,15 +1438,15 @@ checksum = "1fda3bf123be441da5260717e0661c25a2fd9cb2b2c1d20bf2e05580047158ab" dependencies = [ "aes", "ctr", - "digest", + "digest 0.10.7", "hex", - "hmac", + "hmac 0.12.1", "pbkdf2 0.11.0", "rand", "scrypt", "serde", "serde_json", - "sha2", + "sha2 0.10.8", "sha3", "thiserror", "uuid 0.8.2", @@ -1101,13 +1459,34 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b90ca2580b73ab6a1f724b76ca11ab632df820fd6040c336200d2c1df7b3c82c" [[package]] -name = "eventsource-client" -version = "0.10.2" +name = "event-listener" +version = "4.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9146112ee3ce031aa5aebe3e049e10b1d353b9c7630cc6be488c2c62cc5d9c42" +checksum = "67b215c49b2b248c855fb73579eb1f4f26c38ffdc12973e20e07b91d78d5646e" dependencies = [ - "futures", - "hyper", + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "958e4d70b6d5e81971bebec42271ec641e7ff4e170a6fa605f2b8a8b65cb97d3" +dependencies = [ + "event-listener", + "pin-project-lite", +] + +[[package]] +name = "eventsource-client" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9146112ee3ce031aa5aebe3e049e10b1d353b9c7630cc6be488c2c62cc5d9c42" +dependencies = [ + "futures", + "hyper", "hyper-rustls 0.22.1", "hyper-timeout", "log", @@ -1146,6 +1525,15 @@ dependencies = [ "static_assertions", ] +[[package]] +name = "float-cmp" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98de4bbd547a563b716d8dfa9aad1cb19bfab00f4fa09a6a4ed21dbcf44ce9c4" +dependencies = [ + "num-traits", +] + [[package]] name = "fnv" version = "1.0.7" @@ -1161,11 +1549,17 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "fragile" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c2141d6d6c8512188a7891b4b01590a45f6dac67afb4f255c4124dbb86d4eaa" + [[package]] name = "fuel-abi-types" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8118789261e77d67569859a06a886d53dbf7bd00ea23a18a2dfae26a1f5be25" +checksum = "2351bb0b743c23ac13ac2559756b3929502cd6e29091f2e5302fb9a1bdddaf35" dependencies = [ "itertools 0.10.5", "lazy_static", @@ -1180,21 +1574,21 @@ dependencies = [ [[package]] name = "fuel-asm" -version = "0.43.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ea884860261efdc7300b63db7972cb0e08e8f5379495ad7cdd2bdb7c0cc4623" +checksum = "20bc683784e35f3421aab3dc5a31a94c8ad80f1e9ec614ddddac930b4081cd92" dependencies = [ "bitflags 2.4.1", "fuel-types", "serde", - "strum", + "strum 0.24.1", ] [[package]] name = "fuel-core" -version = "0.22.0" +version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b784b66a9dc46393d69967727895db787974a4d6349cc139c940125ede40c681" +checksum = "405711c81cb0b24b1bf1fd1159a1dbee24c61c167ad95d80bf1e83c1053eb44b" dependencies = [ "anyhow", "async-graphql", @@ -1209,25 +1603,28 @@ dependencies = [ "fuel-core-executor", "fuel-core-importer", "fuel-core-metrics", + "fuel-core-p2p", "fuel-core-poa", "fuel-core-producer", "fuel-core-services", "fuel-core-storage", "fuel-core-txpool", "fuel-core-types", + "fuel-core-upgradable-executor", "futures", "hex", "hyper", - "itertools 0.10.5", - "postcard", + "itertools 0.12.0", "rand", "serde", "serde_json", - "strum", - "strum_macros", + "strum 0.25.0", + "strum_macros 0.25.3", "thiserror", "tokio", + "tokio-rayon", "tokio-stream", + "tokio-util", "tower-http 0.3.5", "tracing", "uuid 1.6.1", @@ -1235,17 +1632,17 @@ dependencies = [ [[package]] name = "fuel-core-chain-config" -version = "0.22.0" +version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11f2b1fe72649f4eca267dc49f9ef1edfdc4b8f0d6325a8b1ebeb6641b11e1c3" +checksum = "8654e9c57f2e03d118b5f2b9af986d246d3f2e6c9a631b698112d542c656d38b" dependencies = [ "anyhow", "bech32", "fuel-core-storage", "fuel-core-types", - "hex", - "itertools 0.10.5", + "itertools 0.12.0", "postcard", + "rand", "serde", "serde_json", "serde_with", @@ -1254,9 +1651,9 @@ dependencies = [ [[package]] name = "fuel-core-client" -version = "0.22.0" +version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "609b815dd45f01a012fa237d9ea946dcc67d6858d141bf64cbeb9fb0a80a6474" +checksum = "27f0c9bf68b4a4779a6d1d4230b8bf4be7915ef24ecb7865a56d4f2f4839f076" dependencies = [ "anyhow", "cynic", @@ -1266,7 +1663,7 @@ dependencies = [ "futures", "hex", "hyper-rustls 0.24.2", - "itertools 0.10.5", + "itertools 0.12.0", "reqwest", "schemafy_lib", "serde", @@ -1278,22 +1675,22 @@ dependencies = [ [[package]] name = "fuel-core-consensus-module" -version = "0.22.0" +version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b22705ff15266cd0206aea5e59e881be3606bc221ec29b938a2e630c72420b8" +checksum = "73fee1e84e04419ee5cc0448e8f572a82bf04ccff0873780393703eaa911d6f4" dependencies = [ "anyhow", "fuel-core-chain-config", "fuel-core-poa", + "fuel-core-storage", "fuel-core-types", - "tokio", ] [[package]] name = "fuel-core-database" -version = "0.22.0" +version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11202dd7027502e663178663ab0a995d2ea93a0d543775d63730f8daa2cd490c" +checksum = "78966c55e18447228d5cae5c31c5b35107ccc5ae40ea1fc7a1fb77d2ee624b5d" dependencies = [ "anyhow", "derive_more", @@ -1303,9 +1700,9 @@ dependencies = [ [[package]] name = "fuel-core-executor" -version = "0.22.0" +version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d1cbcc8e330681305d603c22f736df3fe403bfedf5c122066fb853638286a9c" +checksum = "d21f5f796de10364bb7f76ee927759fdf2789b0605e8dd5d702fb471ac00c193" dependencies = [ "anyhow", "fuel-core-chain-config", @@ -1313,44 +1710,78 @@ dependencies = [ "fuel-core-types", "hex", "parking_lot", + "serde", "tracing", ] [[package]] name = "fuel-core-importer" -version = "0.22.0" +version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db12defb4ed0d3aff3d39138925a0d8467f857254cba5d5e9de9bc273ade25d0" +checksum = "0c1c2de6d1f23dcabc6b4e5e66faf331416c5ef5ac04bc056e031c72ed7f5251" dependencies = [ "anyhow", "derive_more", + "fuel-core-chain-config", "fuel-core-metrics", "fuel-core-storage", "fuel-core-types", "tokio", + "tokio-rayon", "tracing", ] [[package]] name = "fuel-core-metrics" -version = "0.22.0" +version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10d853a839036a1906e8082192268034ace79e5d04dbd935abeaee745c5f5a39" +checksum = "e47f356c8facab51b0f438c8bc2ac498d3b6b1338dd7af45b483031c9260f765" dependencies = [ "axum", "once_cell", "pin-project-lite", - "prometheus-client 0.18.1", - "prometheus-client 0.20.0", + "prometheus-client", "regex", "tracing", ] +[[package]] +name = "fuel-core-p2p" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eab7eb7efe0475da7e93c192c17f5d629b35db443eaa8dc69347e5f604cbac6f" +dependencies = [ + "anyhow", + "async-trait", + "fuel-core-chain-config", + "fuel-core-metrics", + "fuel-core-services", + "fuel-core-storage", + "fuel-core-types", + "futures", + "hex", + "ip_network", + "libp2p", + "libp2p-mplex", + "postcard", + "prometheus-client", + "quick-protobuf", + "quick-protobuf-codec", + "rand", + "serde", + "serde_with", + "sha2 0.10.8", + "thiserror", + "tokio", + "tracing", + "void", +] + [[package]] name = "fuel-core-poa" -version = "0.22.0" +version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c94a4807d14918f6f2f30c29fd4cfed0c7b7565c01d51c05cffff2881b468f3" +checksum = "3c95afda02bca15060593c0298e7f8b79b8f6a8e24ae7fdb549a3b8dbc58ce83" dependencies = [ "anyhow", "async-trait", @@ -1365,9 +1796,9 @@ dependencies = [ [[package]] name = "fuel-core-producer" -version = "0.22.0" +version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21bbc29241e839c711ee2fcb9729978c1717f02e02459c00216a63e15384b275" +checksum = "fb0f8627a1ca7408d5d853bcf15e7d2c70000cb599c72c4175450b2519a96158" dependencies = [ "anyhow", "async-trait", @@ -1381,9 +1812,9 @@ dependencies = [ [[package]] name = "fuel-core-services" -version = "0.22.0" +version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0d8ed6f17fc5e42094412ea2af7a9e6a2ec5cd6fe56548ef0e0730938b55c26" +checksum = "95e3a53f24f354ee999885e03ac77c62fb5fff0200f761705a75533a78c854eb" dependencies = [ "anyhow", "async-trait", @@ -1396,22 +1827,33 @@ dependencies = [ [[package]] name = "fuel-core-storage" -version = "0.22.0" +version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8188ae0d5af2925ca05608b60f69cdc89f9e33b6500f776e7e1ecd2c44d32447" +checksum = "3df278c08984f1db0b2a2bf42d45f293b5b7205f701910863567019f0f952fb7" dependencies = [ "anyhow", "derive_more", + "enum-iterator", "fuel-core-types", "fuel-vm", + "impl-tools", + "itertools 0.12.0", + "mockall", + "num_enum", + "paste", + "postcard", "primitive-types", + "rand", + "serde", + "strum 0.25.0", + "strum_macros 0.25.3", ] [[package]] name = "fuel-core-txpool" -version = "0.22.0" +version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef6228d74e0a2efeda97a7f5f3c31052c3b0e961ca92c6754cbb19c864813f3d" +checksum = "28e04b67d9fd915563ea8af4a6642a18218e96d11d244f8b848115c9645dab66" dependencies = [ "anyhow", "async-trait", @@ -1430,14 +1872,16 @@ dependencies = [ [[package]] name = "fuel-core-types" -version = "0.22.0" +version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dd06358708d4c61ef53ad73c26ae55a0ed59ba9096c56b64a1eb56af748e9f0" +checksum = "550733dfe398f281e288afd6400bc4e0e95041950ff334de92c686a9063697af" dependencies = [ "anyhow", "bs58", + "derivative", "derive_more", "fuel-vm", + "rand", "secrecy", "serde", "tai64", @@ -1445,11 +1889,22 @@ dependencies = [ "zeroize", ] +[[package]] +name = "fuel-core-upgradable-executor" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c20ede3c70c4eaa9db25e14604913fdc7f8216f734347caf510b91e4132d7e5" +dependencies = [ + "fuel-core-executor", + "fuel-core-storage", + "fuel-core-types", +] + [[package]] name = "fuel-crypto" -version = "0.43.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e0efe99de550a5b5c12a6a4d2eadd26bc5571cfba82d0133baa2805d485ad8c" +checksum = "f6112c726b5254cad831e61db36dcd0d83b28c50180ea22cb8815343fb162526" dependencies = [ "coins-bip32", "coins-bip39", @@ -1462,20 +1917,20 @@ dependencies = [ "rand", "secp256k1", "serde", - "sha2", + "sha2 0.10.8", "zeroize", ] [[package]] name = "fuel-derive" -version = "0.43.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff58cf4d01a4fb9440c63a8764154dfd3b07c74e4b3639cce8eea77d67e63a7a" +checksum = "5896603b839f04f27e8bddbae2990dc799fb119f5e62973d6666b2ea1a4b036b" dependencies = [ "proc-macro2", "quote", "syn 2.0.39", - "synstructure", + "synstructure 0.13.0", ] [[package]] @@ -1512,30 +1967,30 @@ dependencies = [ [[package]] name = "fuel-merkle" -version = "0.43.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89143dd80b29dda305fbb033bc7f868834445ef6b361bf920f0077938fb6c0bc" +checksum = "c8f75d97f6d43fbd15aa5ca0d594b33cc59ba5fd73ce42f4a10dfa9288a9a4a4" dependencies = [ "derive_more", - "digest", + "digest 0.10.7", "fuel-storage", "hashbrown 0.13.2", "hex", "serde", - "sha2", + "sha2 0.10.8", ] [[package]] name = "fuel-storage" -version = "0.43.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "901aee4b46684e483d2c04d40e5ac1b8ccda737ac5a363507b44b9eb23b0fdaa" +checksum = "6899452bbf8b09d536b0adf98d6a28d1081ce38c3490fa2d8cc1dd47ba153351" [[package]] name = "fuel-tx" -version = "0.43.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb1f65e363e5e9a5412cea204f2d2357043327a0c3da5482c3b38b9da045f20e" +checksum = "305c12d87f47d139505cbbaee1effa7750ce171c9a4362d212f4f7a651902121" dependencies = [ "bitflags 2.4.1", "derivative", @@ -1549,15 +2004,15 @@ dependencies = [ "rand", "serde", "serde_json", - "strum", - "strum_macros", + "strum 0.24.1", + "strum_macros 0.24.3", ] [[package]] name = "fuel-types" -version = "0.43.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "148b59be5c54bafff692310663cbce3f097a2a7ff5533224dcfdf387578a72b0" +checksum = "3d92d34c6625f0c3b88463f01027e836ba561125f6ccfb1402d12743fc7b2c96" dependencies = [ "fuel-derive", "hex", @@ -1567,10 +2022,11 @@ dependencies = [ [[package]] name = "fuel-vm" -version = "0.43.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aed5ba0cde904f16cd748dc9b33e62f4b3dc5fd0a72ec867c973e687cd7347ba" +checksum = "b06f02e86ebf357689e34412af34faf7f0d35a9b8b6ccb2ec42fd369559d6914" dependencies = [ + "anyhow", "async-trait", "backtrace", "bitflags 2.4.1", @@ -1589,29 +2045,31 @@ dependencies = [ "paste", "percent-encoding", "primitive-types", + "rand", "serde", + "serde_with", "sha3", "static_assertions", - "strum", + "strum 0.24.1", "tai64", ] [[package]] name = "fuels-accounts" -version = "0.54.0" +version = "0.57.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf897206616d15e284dba7641f95d2b3a119639705b4909828af5008699f6352" +checksum = "523db6eac7f1e90947e5ddb238bcada48d04ae5f128236d5bf48bb2320edeadc" dependencies = [ "async-trait", "chrono", "elliptic-curve", "eth-keystore", "fuel-core-client", + "fuel-core-types", "fuel-crypto", "fuel-tx", "fuel-types", "fuels-core", - "hex", "rand", "semver", "tai64", @@ -1623,9 +2081,9 @@ dependencies = [ [[package]] name = "fuels-code-gen" -version = "0.54.0" +version = "0.57.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa5acfe0ef24e12137786072a182dc5f0de9d51e79a6023183466f4eaecf7512" +checksum = "22c4630056818ed04adc4f048462bc8fbde8b0332c847461b8ae55e8937e0b5c" dependencies = [ "Inflector", "fuel-abi-types", @@ -1639,9 +2097,9 @@ dependencies = [ [[package]] name = "fuels-core" -version = "0.54.0" +version = "0.57.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c716030842d8c4eef2191a9c93ed0cb3cdae7927a4b2f07d87db0020293db893" +checksum = "41f82f251f4558a3e0032043415118f2842089783e129ea07d0c63933ac9e2da" dependencies = [ "async-trait", "bech32", @@ -1659,17 +2117,16 @@ dependencies = [ "itertools 0.12.0", "serde", "serde_json", - "sha2", + "sha2 0.10.8", "thiserror", "uint", - "zeroize", ] [[package]] name = "fuels-macros" -version = "0.54.0" +version = "0.57.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b0dcdf41ccc7090bec4848d680d16cdc0c6cd37b749e518084caa8e6b730053" +checksum = "41a33c1d1e58fe31593c77a87028cf8fd71e50ca206386c725fe0a0e1b3ff63c" dependencies = [ "fuels-code-gen", "itertools 0.12.0", @@ -1700,6 +2157,16 @@ dependencies = [ "futures-util", ] +[[package]] +name = "futures-bounded" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1e2774cc104e198ef3d3e1ff4ab40f86fa3245d6cb6a3a46174f21463cee173" +dependencies = [ + "futures-timer", + "futures-util", +] + [[package]] name = "futures-channel" version = "0.3.29" @@ -1725,6 +2192,7 @@ dependencies = [ "futures-core", "futures-task", "futures-util", + "num_cpus", ] [[package]] @@ -1733,6 +2201,16 @@ version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8bf34a163b5c4c52d0478a4d757da8fb65cabef42ba90515efee0f6f9fa45aaa" +[[package]] +name = "futures-lite" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52527eb5074e35e9339c6b4e8d12600c7128b68fb25dcb9fa9dec18f7c25f3a5" +dependencies = [ + "futures-core", + "pin-project-lite", +] + [[package]] name = "futures-macro" version = "0.3.29" @@ -1744,6 +2222,16 @@ dependencies = [ "syn 2.0.39", ] +[[package]] +name = "futures-rustls" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35bd3cf68c183738046838e300353e4716c674dc5e56890de4826801a6622a28" +dependencies = [ + "futures-io", + "rustls 0.21.9", +] + [[package]] name = "futures-sink" version = "0.3.29" @@ -1756,6 +2244,23 @@ version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "efd193069b0ddadc69c46389b740bbccdd97203899b48d09c5f7969591d6bae2" +[[package]] +name = "futures-ticker" +version = "0.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9763058047f713632a52e916cc7f6a4b3fc6e9fc1ff8c5b1dc49e5a89041682e" +dependencies = [ + "futures", + "futures-timer", + "instant", +] + +[[package]] +name = "futures-timer" +version = "3.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f288b0a4f20f9a56b5d1da57e2227c661b7b16168e2f72365f57b63326e29b24" + [[package]] name = "futures-util" version = "0.3.29" @@ -1796,6 +2301,16 @@ dependencies = [ "wasi", ] +[[package]] +name = "ghash" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0d8a4362ccb29cb0b265253fb0a2728f592895ee6854fd9bc13f2ffda266ff1" +dependencies = [ + "opaque-debug", + "polyval", +] + [[package]] name = "gimli" version = "0.28.1" @@ -1926,13 +2441,106 @@ dependencies = [ "serde", ] +[[package]] +name = "hex_fmt" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b07f60793ff0a4d9cef0f18e63b5357e06209987153a64648c972c1e5aff336f" + +[[package]] +name = "hickory-proto" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07698b8420e2f0d6447a436ba999ec85d8fbf2a398bbd737b82cac4a2e96e512" +dependencies = [ + "async-trait", + "cfg-if", + "data-encoding", + "enum-as-inner", + "futures-channel", + "futures-io", + "futures-util", + "idna 0.4.0", + "ipnet", + "once_cell", + "rand", + "socket2 0.5.5", + "thiserror", + "tinyvec", + "tokio", + "tracing", + "url", +] + +[[package]] +name = "hickory-resolver" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28757f23aa75c98f254cf0405e6d8c25b831b32921b050a66692427679b1f243" +dependencies = [ + "cfg-if", + "futures-util", + "hickory-proto", + "ipconfig", + "lru-cache", + "once_cell", + "parking_lot", + "rand", + "resolv-conf", + "smallvec", + "thiserror", + "tokio", + "tracing", +] + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "126888268dcc288495a26bf004b38c5fdbb31682f992c84ceb046a1f0fe38840" +dependencies = [ + "crypto-mac", + "digest 0.9.0", +] + [[package]] name = "hmac" version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" dependencies = [ - "digest", + "digest 0.10.7", +] + +[[package]] +name = "hmac-drbg" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17ea0a1394df5b6574da6e0c1ade9e78868c9fb0a4e5ef4428e32da4676b85b1" +dependencies = [ + "digest 0.9.0", + "generic-array", + "hmac 0.8.1", +] + +[[package]] +name = "hostname" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c731c3e10504cc8ed35cfe2f1db4c9274c3d35fa486e3b31df46f068ef3e867" +dependencies = [ + "libc", + "match_cfg", + "winapi", ] [[package]] @@ -2097,37 +2705,120 @@ dependencies = [ [[package]] name = "idna" -version = "0.5.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" +checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c" dependencies = [ "unicode-bidi", "unicode-normalization", ] [[package]] -name = "indexmap" -version = "1.9.3" +name = "idna" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" dependencies = [ - "autocfg", - "hashbrown 0.12.3", - "serde", + "unicode-bidi", + "unicode-normalization", ] [[package]] -name = "indexmap" -version = "2.1.0" +name = "if-addrs" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" +checksum = "cabb0019d51a643781ff15c9c8a3e5dedc365c47211270f4e8f82812fedd8f0a" dependencies = [ - "equivalent", - "hashbrown 0.14.3", + "libc", + "windows-sys 0.48.0", ] [[package]] -name = "inout" +name = "if-watch" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6b0422c86d7ce0e97169cc42e04ae643caf278874a7a3c87b8150a220dc7e1e" +dependencies = [ + "async-io", + "core-foundation", + "fnv", + "futures", + "if-addrs", + "ipnet", + "log", + "rtnetlink", + "system-configuration", + "tokio", + "windows", +] + +[[package]] +name = "igd-next" +version = "0.14.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "064d90fec10d541084e7b39ead8875a5a80d9114a2b18791565253bae25f49e4" +dependencies = [ + "async-trait", + "attohttpc", + "bytes", + "futures", + "http", + "hyper", + "log", + "rand", + "tokio", + "url", + "xmltree", +] + +[[package]] +name = "impl-tools" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d82c305b1081f1a99fda262883c788e50ab57d36c00830bdd7e0a82894ad965c" +dependencies = [ + "autocfg", + "impl-tools-lib", + "proc-macro-error", + "syn 2.0.39", +] + +[[package]] +name = "impl-tools-lib" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85d3946d886eaab0702fa0c6585adcced581513223fa9df7ccfabbd9fa331a88" +dependencies = [ + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.39", +] + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", + "serde", +] + +[[package]] +name = "indexmap" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" +dependencies = [ + "equivalent", + "hashbrown 0.14.3", + "serde", +] + +[[package]] +name = "inout" version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" @@ -2148,6 +2839,33 @@ dependencies = [ "yaml-rust", ] +[[package]] +name = "instant" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "ip_network" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa2f047c0a98b2f299aa5d6d7088443570faae494e9ae1305e48be000c9e0eb1" + +[[package]] +name = "ipconfig" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b58db92f96b720de98181bbbe63c831e87005ab460c1bf306eb2622b4707997f" +dependencies = [ + "socket2 0.5.5", + "widestring", + "windows-sys 0.48.0", + "winreg", +] + [[package]] name = "ipnet" version = "2.9.0" @@ -2197,7 +2915,7 @@ dependencies = [ "ecdsa", "elliptic-curve", "once_cell", - "sha2", + "sha2 0.10.8", "signature", ] @@ -2229,154 +2947,889 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" [[package]] -name = "linked-hash-map" -version = "0.5.6" +name = "libp2p" +version = "0.53.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" +checksum = "681fb3f183edfbedd7a57d32ebe5dcdc0b9f94061185acf3c30249349cc6fc99" +dependencies = [ + "bytes", + "either", + "futures", + "futures-timer", + "getrandom", + "instant", + "libp2p-allow-block-list", + "libp2p-connection-limits", + "libp2p-core", + "libp2p-dns", + "libp2p-gossipsub", + "libp2p-identify", + "libp2p-identity", + "libp2p-kad", + "libp2p-mdns", + "libp2p-metrics", + "libp2p-noise", + "libp2p-quic", + "libp2p-request-response", + "libp2p-swarm", + "libp2p-tcp", + "libp2p-upnp", + "libp2p-websocket", + "libp2p-yamux", + "multiaddr", + "pin-project", + "rw-stream-sink", + "thiserror", +] [[package]] -name = "linux-raw-sys" -version = "0.4.11" +name = "libp2p-allow-block-list" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "969488b55f8ac402214f3f5fd243ebb7206cf82de60d3172994707a4bcc2b829" +checksum = "107b238b794cb83ab53b74ad5dcf7cca3200899b72fe662840cfb52f5b0a32e6" +dependencies = [ + "libp2p-core", + "libp2p-identity", + "libp2p-swarm", + "void", +] [[package]] -name = "lock_api" -version = "0.4.11" +name = "libp2p-connection-limits" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" +checksum = "c7cd50a78ccfada14de94cbacd3ce4b0138157f376870f13d3a8422cd075b4fd" dependencies = [ - "autocfg", - "scopeguard", + "libp2p-core", + "libp2p-identity", + "libp2p-swarm", + "void", ] [[package]] -name = "log" -version = "0.4.20" +name = "libp2p-core" +version = "0.41.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" +checksum = "8130a8269e65a2554d55131c770bdf4bcd94d2b8d4efb24ca23699be65066c05" +dependencies = [ + "either", + "fnv", + "futures", + "futures-timer", + "instant", + "libp2p-identity", + "multiaddr", + "multihash", + "multistream-select", + "once_cell", + "parking_lot", + "pin-project", + "quick-protobuf", + "rand", + "rw-stream-sink", + "smallvec", + "thiserror", + "tracing", + "unsigned-varint 0.8.0", + "void", +] [[package]] -name = "matchers" -version = "0.1.0" +name = "libp2p-dns" +version = "0.41.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" +checksum = "d17cbcf7160ff35c3e8e560de4a068fe9d6cb777ea72840e48eb76ff9576c4b6" dependencies = [ - "regex-automata 0.1.10", + "async-trait", + "futures", + "hickory-resolver", + "libp2p-core", + "libp2p-identity", + "parking_lot", + "smallvec", + "tracing", ] [[package]] -name = "matches" -version = "0.1.10" +name = "libp2p-gossipsub" +version = "0.46.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" +checksum = "d665144a616dadebdc5fff186b1233488cdcd8bfb1223218ff084b6d052c94f7" +dependencies = [ + "asynchronous-codec 0.7.0", + "base64 0.21.5", + "byteorder", + "bytes", + "either", + "fnv", + "futures", + "futures-ticker", + "getrandom", + "hex_fmt", + "instant", + "libp2p-core", + "libp2p-identity", + "libp2p-swarm", + "prometheus-client", + "quick-protobuf", + "quick-protobuf-codec", + "rand", + "regex", + "sha2 0.10.8", + "smallvec", + "tracing", + "void", +] [[package]] -name = "matchit" -version = "0.5.0" +name = "libp2p-identify" +version = "0.44.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73cbba799671b762df5a175adf59ce145165747bb891505c43d09aefbbf38beb" +checksum = "20499a945d2f0221fdc6269b3848892c0f370d2ee3e19c7f65a29d8f860f6126" +dependencies = [ + "asynchronous-codec 0.7.0", + "either", + "futures", + "futures-bounded", + "futures-timer", + "libp2p-core", + "libp2p-identity", + "libp2p-swarm", + "lru", + "quick-protobuf", + "quick-protobuf-codec", + "smallvec", + "thiserror", + "tracing", + "void", +] + +[[package]] +name = "libp2p-identity" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "999ec70441b2fb35355076726a6bc466c932e9bdc66f6a11c6c0aa17c7ab9be0" +dependencies = [ + "asn1_der", + "bs58", + "ed25519-dalek", + "hkdf", + "libsecp256k1", + "multihash", + "quick-protobuf", + "rand", + "sha2 0.10.8", + "thiserror", + "tracing", + "zeroize", +] + +[[package]] +name = "libp2p-kad" +version = "0.45.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cc5767727d062c4eac74dd812c998f0e488008e82cce9c33b463d38423f9ad2" +dependencies = [ + "arrayvec", + "asynchronous-codec 0.7.0", + "bytes", + "either", + "fnv", + "futures", + "futures-bounded", + "futures-timer", + "instant", + "libp2p-core", + "libp2p-identity", + "libp2p-swarm", + "quick-protobuf", + "quick-protobuf-codec", + "rand", + "sha2 0.10.8", + "smallvec", + "thiserror", + "tracing", + "uint", + "void", +] + +[[package]] +name = "libp2p-mdns" +version = "0.45.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49007d9a339b3e1d7eeebc4d67c05dbf23d300b7d091193ec2d3f26802d7faf2" +dependencies = [ + "data-encoding", + "futures", + "hickory-proto", + "if-watch", + "libp2p-core", + "libp2p-identity", + "libp2p-swarm", + "rand", + "smallvec", + "socket2 0.5.5", + "tokio", + "tracing", + "void", +] + +[[package]] +name = "libp2p-metrics" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdac91ae4f291046a3b2660c039a2830c931f84df2ee227989af92f7692d3357" +dependencies = [ + "futures", + "instant", + "libp2p-core", + "libp2p-gossipsub", + "libp2p-identify", + "libp2p-identity", + "libp2p-kad", + "libp2p-swarm", + "pin-project", + "prometheus-client", +] + +[[package]] +name = "libp2p-mplex" +version = "0.41.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e895765e27e30217b25f7cb7ac4686dad1ff80bf2fdeffd1d898566900a924" +dependencies = [ + "asynchronous-codec 0.6.2", + "bytes", + "futures", + "libp2p-core", + "libp2p-identity", + "nohash-hasher", + "parking_lot", + "rand", + "smallvec", + "tracing", + "unsigned-varint 0.7.2", +] + +[[package]] +name = "libp2p-noise" +version = "0.44.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecd0545ce077f6ea5434bcb76e8d0fe942693b4380aaad0d34a358c2bd05793" +dependencies = [ + "asynchronous-codec 0.7.0", + "bytes", + "curve25519-dalek", + "futures", + "libp2p-core", + "libp2p-identity", + "multiaddr", + "multihash", + "once_cell", + "quick-protobuf", + "rand", + "sha2 0.10.8", + "snow", + "static_assertions", + "thiserror", + "tracing", + "x25519-dalek", + "zeroize", +] + +[[package]] +name = "libp2p-quic" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0375cdfee57b47b313ef1f0fdb625b78aed770d33a40cf1c294a371ff5e6666" +dependencies = [ + "bytes", + "futures", + "futures-timer", + "if-watch", + "libp2p-core", + "libp2p-identity", + "libp2p-tls", + "parking_lot", + "quinn", + "rand", + "ring 0.16.20", + "rustls 0.21.9", + "socket2 0.5.5", + "thiserror", + "tokio", + "tracing", +] + +[[package]] +name = "libp2p-request-response" +version = "0.26.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e12823250fe0c45bdddea6eefa2be9a609aff1283ff4e1d8a294fdbb89572f6f" +dependencies = [ + "async-trait", + "futures", + "futures-bounded", + "futures-timer", + "instant", + "libp2p-core", + "libp2p-identity", + "libp2p-swarm", + "rand", + "smallvec", + "tracing", + "void", +] + +[[package]] +name = "libp2p-swarm" +version = "0.44.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e92532fc3c4fb292ae30c371815c9b10103718777726ea5497abc268a4761866" +dependencies = [ + "either", + "fnv", + "futures", + "futures-timer", + "instant", + "libp2p-core", + "libp2p-identity", + "libp2p-swarm-derive", + "multistream-select", + "once_cell", + "rand", + "smallvec", + "tokio", + "tracing", + "void", +] + +[[package]] +name = "libp2p-swarm-derive" +version = "0.34.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b644268b4acfdaa6a6100b31226ee7a36d96ab4c43287d113bfd2308607d8b6f" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn 2.0.39", +] + +[[package]] +name = "libp2p-tcp" +version = "0.41.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b2460fc2748919adff99ecbc1aab296e4579e41f374fb164149bd2c9e529d4c" +dependencies = [ + "futures", + "futures-timer", + "if-watch", + "libc", + "libp2p-core", + "libp2p-identity", + "socket2 0.5.5", + "tokio", + "tracing", +] + +[[package]] +name = "libp2p-tls" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93ce7e3c2e7569d685d08ec795157981722ff96e9e9f9eae75df3c29d02b07a5" +dependencies = [ + "futures", + "futures-rustls", + "libp2p-core", + "libp2p-identity", + "rcgen", + "ring 0.16.20", + "rustls 0.21.9", + "rustls-webpki", + "thiserror", + "x509-parser", + "yasna", +] + +[[package]] +name = "libp2p-upnp" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "963eb8a174f828f6a51927999a9ab5e45dfa9aa2aa5fed99aa65f79de6229464" +dependencies = [ + "futures", + "futures-timer", + "igd-next", + "libp2p-core", + "libp2p-swarm", + "tokio", + "tracing", + "void", +] + +[[package]] +name = "libp2p-websocket" +version = "0.43.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4846d51afd08180e164291c3754ba30dd4fbac6fac65571be56403c16431a5e" +dependencies = [ + "either", + "futures", + "futures-rustls", + "libp2p-core", + "libp2p-identity", + "parking_lot", + "pin-project-lite", + "rw-stream-sink", + "soketto", + "tracing", + "url", + "webpki-roots", +] + +[[package]] +name = "libp2p-yamux" +version = "0.45.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "200cbe50349a44760927d50b431d77bed79b9c0a3959de1af8d24a63434b71e5" +dependencies = [ + "either", + "futures", + "libp2p-core", + "thiserror", + "tracing", + "yamux 0.12.1", + "yamux 0.13.1", +] + +[[package]] +name = "libsecp256k1" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95b09eff1b35ed3b33b877ced3a691fc7a481919c7e29c53c906226fcf55e2a1" +dependencies = [ + "arrayref", + "base64 0.13.1", + "digest 0.9.0", + "hmac-drbg", + "libsecp256k1-core", + "libsecp256k1-gen-ecmult", + "libsecp256k1-gen-genmult", + "rand", + "serde", + "sha2 0.9.9", + "typenum", +] + +[[package]] +name = "libsecp256k1-core" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5be9b9bb642d8522a44d533eab56c16c738301965504753b03ad1de3425d5451" +dependencies = [ + "crunchy", + "digest 0.9.0", + "subtle", +] + +[[package]] +name = "libsecp256k1-gen-ecmult" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3038c808c55c87e8a172643a7d87187fc6c4174468159cb3090659d55bcb4809" +dependencies = [ + "libsecp256k1-core", +] + +[[package]] +name = "libsecp256k1-gen-genmult" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3db8d6ba2cec9eacc40e6e8ccc98931840301f1006e95647ceb2dd5c3aa06f7c" +dependencies = [ + "libsecp256k1-core", +] + +[[package]] +name = "linked-hash-map" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" + +[[package]] +name = "linux-raw-sys" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "969488b55f8ac402214f3f5fd243ebb7206cf82de60d3172994707a4bcc2b829" + +[[package]] +name = "lock_api" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" + +[[package]] +name = "lru" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3262e75e648fce39813cb56ac41f3c3e3f65217ebf3844d818d1f9398cfb0dc" +dependencies = [ + "hashbrown 0.14.3", +] + +[[package]] +name = "lru-cache" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31e24f1ad8321ca0e8a1e0ac13f23cb668e6f5466c2c57319f6a5cf1cc8e3b1c" +dependencies = [ + "linked-hash-map", +] + +[[package]] +name = "match_cfg" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffbee8634e0d45d258acb448e7eaab3fce7a0a467395d4d9f228e3c1f01fb2e4" + +[[package]] +name = "matchers" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" +dependencies = [ + "regex-automata 0.1.10", +] + +[[package]] +name = "matches" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" + +[[package]] +name = "matchit" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73cbba799671b762df5a175adf59ce145165747bb891505c43d09aefbbf38beb" + +[[package]] +name = "memchr" +version = "2.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" + +[[package]] +name = "memoffset" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c" +dependencies = [ + "autocfg", +] + +[[package]] +name = "memoize" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c25d125e4063f313300d87c8f658e5b3d69257095df9a4221c12ba50b0421bff" +dependencies = [ + "lazy_static", + "memoize-inner", +] + +[[package]] +name = "memoize-inner" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8b7d5160e6ffcc59d4c571c38238ec5b7065bc91a5a24f511988dabcddda723" +dependencies = [ + "lazy_static", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "minify-html" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f617f8bf5ea04b94647e6d1a918807695e970f90fd2e8523fc86785ed52da5e6" +dependencies = [ + "aho-corasick 0.7.20", + "lazy_static", + "memchr", +] + +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + +[[package]] +name = "miniz_oxide" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" +dependencies = [ + "adler", +] + +[[package]] +name = "mio" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3dce281c5e46beae905d4de1870d8b1509a9142b62eedf18b443b011ca8343d0" +dependencies = [ + "libc", + "wasi", + "windows-sys 0.48.0", +] + +[[package]] +name = "mockall" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c84490118f2ee2d74570d114f3d0493cbf02790df303d2707606c3e14e07c96" +dependencies = [ + "cfg-if", + "downcast", + "fragile", + "lazy_static", + "mockall_derive", + "predicates", + "predicates-tree", +] + +[[package]] +name = "mockall_derive" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22ce75669015c4f47b289fd4d4f56e894e4c96003ffdf3ac51313126f94c6cbb" +dependencies = [ + "cfg-if", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "multer" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01acbdc23469fd8fe07ab135923371d5f5a422fbf9c522158677c8eb15bc51c2" +dependencies = [ + "bytes", + "encoding_rs", + "futures-util", + "http", + "httparse", + "log", + "memchr", + "mime", + "spin 0.9.8", + "version_check", +] + +[[package]] +name = "multiaddr" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b852bc02a2da5feed68cd14fa50d0774b92790a5bdbfa932a813926c8472070" +dependencies = [ + "arrayref", + "byteorder", + "data-encoding", + "libp2p-identity", + "multibase", + "multihash", + "percent-encoding", + "serde", + "static_assertions", + "unsigned-varint 0.7.2", + "url", +] + +[[package]] +name = "multibase" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b3539ec3c1f04ac9748a260728e855f261b4977f5c3406612c884564f329404" +dependencies = [ + "base-x", + "data-encoding", + "data-encoding-macro", +] + +[[package]] +name = "multihash" +version = "0.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "076d548d76a0e2a0d4ab471d0b1c36c577786dfc4471242035d97a12a735c492" +dependencies = [ + "core2", + "unsigned-varint 0.7.2", +] + +[[package]] +name = "multistream-select" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea0df8e5eec2298a62b326ee4f0d7fe1a6b90a09dfcf9df37b38f947a8c42f19" +dependencies = [ + "bytes", + "futures", + "log", + "pin-project", + "smallvec", + "unsigned-varint 0.7.2", +] + +[[package]] +name = "netlink-packet-core" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "345b8ab5bd4e71a2986663e88c56856699d060e78e152e6e9d7966fcd5491297" +dependencies = [ + "anyhow", + "byteorder", + "libc", + "netlink-packet-utils", +] + +[[package]] +name = "netlink-packet-route" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9ea4302b9759a7a88242299225ea3688e63c85ea136371bb6cf94fd674efaab" +dependencies = [ + "anyhow", + "bitflags 1.3.2", + "byteorder", + "libc", + "netlink-packet-core", + "netlink-packet-utils", +] [[package]] -name = "memchr" -version = "2.6.4" +name = "netlink-packet-utils" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" +checksum = "0ede8a08c71ad5a95cdd0e4e52facd37190977039a4704eb82a283f713747d34" +dependencies = [ + "anyhow", + "byteorder", + "paste", + "thiserror", +] [[package]] -name = "memoffset" -version = "0.9.0" +name = "netlink-proto" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c" +checksum = "65b4b14489ab424703c092062176d52ba55485a89c076b4f9db05092b7223aa6" dependencies = [ - "autocfg", + "bytes", + "futures", + "log", + "netlink-packet-core", + "netlink-sys", + "thiserror", + "tokio", ] [[package]] -name = "memoize" -version = "0.3.3" +name = "netlink-sys" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c25d125e4063f313300d87c8f658e5b3d69257095df9a4221c12ba50b0421bff" +checksum = "416060d346fbaf1f23f9512963e3e878f1a78e707cb699ba9215761754244307" dependencies = [ - "lazy_static", - "memoize-inner", + "bytes", + "futures", + "libc", + "log", + "tokio", ] [[package]] -name = "memoize-inner" -version = "0.3.2" +name = "nix" +version = "0.24.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8b7d5160e6ffcc59d4c571c38238ec5b7065bc91a5a24f511988dabcddda723" +checksum = "fa52e972a9a719cecb6864fb88568781eb706bac2cd1d4f04a648542dbf78069" dependencies = [ - "lazy_static", - "proc-macro2", - "quote", - "syn 1.0.109", + "bitflags 1.3.2", + "cfg-if", + "libc", ] [[package]] -name = "mime" -version = "0.3.17" +name = "nohash-hasher" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" +checksum = "2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451" [[package]] -name = "minify-html" -version = "0.8.1" +name = "nom" +version = "7.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f617f8bf5ea04b94647e6d1a918807695e970f90fd2e8523fc86785ed52da5e6" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" dependencies = [ - "aho-corasick 0.7.20", - "lazy_static", "memchr", + "minimal-lexical", ] [[package]] -name = "miniz_oxide" -version = "0.7.1" +name = "normalize-line-endings" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" -dependencies = [ - "adler", -] +checksum = "61807f77802ff30975e01f4f071c8ba10c022052f98b3294119f3e615d13e5be" [[package]] -name = "mio" -version = "0.8.9" +name = "nu-ansi-term" +version = "0.46.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3dce281c5e46beae905d4de1870d8b1509a9142b62eedf18b443b011ca8343d0" +checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" dependencies = [ - "libc", - "wasi", - "windows-sys 0.48.0", + "overload", + "winapi", ] [[package]] -name = "multer" -version = "2.1.0" +name = "num-bigint" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01acbdc23469fd8fe07ab135923371d5f5a422fbf9c522158677c8eb15bc51c2" +checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0" dependencies = [ - "bytes", - "encoding_rs", - "futures-util", - "http", - "httparse", - "log", - "memchr", - "mime", - "spin 0.9.8", - "version_check", + "autocfg", + "num-integer", + "num-traits", ] [[package]] -name = "nu-ansi-term" -version = "0.46.0" +name = "num-integer" +version = "0.1.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" dependencies = [ - "overload", - "winapi", + "num-traits", ] [[package]] @@ -2398,6 +3851,27 @@ dependencies = [ "libc", ] +[[package]] +name = "num_enum" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02339744ee7253741199f897151b38e72257d13802d4ee837285cc2990a90845" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "681030a937600a36906c185595136d26abfebb4aa9c65701cefcaf8578bb982b" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.39", +] + [[package]] name = "object" version = "0.32.1" @@ -2407,12 +3881,27 @@ dependencies = [ "memchr", ] +[[package]] +name = "oid-registry" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9bedf36ffb6ba96c2eb7144ef6270557b52e54b20c0a8e1eb2ff99a6c6959bff" +dependencies = [ + "asn1-rs", +] + [[package]] name = "once_cell" version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" +[[package]] +name = "opaque-debug" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" + [[package]] name = "openssl-probe" version = "0.1.5" @@ -2434,9 +3923,15 @@ dependencies = [ "ecdsa", "elliptic-curve", "primeorder", - "sha2", + "sha2 0.10.8", ] +[[package]] +name = "parking" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb813b8af86854136c6922af0598d719255ecb2179515e6e7730d468f05c9cae" + [[package]] name = "parking_lot" version = "0.12.1" @@ -2472,7 +3967,7 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" dependencies = [ - "digest", + "digest 0.10.7", ] [[package]] @@ -2481,8 +3976,18 @@ version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2" dependencies = [ - "digest", - "hmac", + "digest 0.10.7", + "hmac 0.12.1", +] + +[[package]] +name = "pem" +version = "3.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e459365e590736a54c3fa561947c84837534b8e9af6fc5bf781307e82658fae" +dependencies = [ + "base64 0.22.0", + "serde", ] [[package]] @@ -2533,7 +4038,7 @@ checksum = "7c747191d4ad9e4a4ab9c8798f1e82a39affe7ef9648390b7e5548d18e099de6" dependencies = [ "once_cell", "pest", - "sha2", + "sha2 0.10.8", ] [[package]] @@ -2584,6 +4089,43 @@ version = "3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "14e6ab3f592e6fb464fc9712d8d6e6912de6473954635fd76a589d832cffcbb0" +[[package]] +name = "polling" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30054e72317ab98eddd8561db0f6524df3367636884b7b21b703e4b280a84a14" +dependencies = [ + "cfg-if", + "concurrent-queue", + "pin-project-lite", + "rustix", + "tracing", + "windows-sys 0.52.0", +] + +[[package]] +name = "poly1305" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8159bd90725d2df49889a078b54f4f79e87f1f8a8444194cdca81d38f5393abf" +dependencies = [ + "cpufeatures", + "opaque-debug", + "universal-hash", +] + +[[package]] +name = "polyval" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d1fe60d06143b2430aa532c94cfe9e29783047f06c0d7fd359a9a51b729fa25" +dependencies = [ + "cfg-if", + "cpufeatures", + "opaque-debug", + "universal-hash", +] + [[package]] name = "postcard" version = "1.0.8" @@ -2608,6 +4150,36 @@ version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" +[[package]] +name = "predicates" +version = "2.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59230a63c37f3e18569bdb90e4a89cbf5bf8b06fea0b84e65ea10cc4df47addd" +dependencies = [ + "difflib", + "float-cmp", + "itertools 0.10.5", + "normalize-line-endings", + "predicates-core", + "regex", +] + +[[package]] +name = "predicates-core" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b794032607612e7abeb4db69adb4e33590fa6cf1149e95fd7cb00e634b92f174" + +[[package]] +name = "predicates-tree" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "368ba315fb8c5052ab692e68a0eefec6ec57b23a36959c14496f0b0df2c0cecf" +dependencies = [ + "predicates-core", + "termtree", +] + [[package]] name = "primeorder" version = "0.13.6" @@ -2638,31 +4210,42 @@ dependencies = [ ] [[package]] -name = "proc-macro2" -version = "1.0.70" +name = "proc-macro-error" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39278fbbf5fb4f646ce651690877f89d1c5811a3d4acb27700c1cb3cdb78fd3b" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" dependencies = [ - "unicode-ident", + "proc-macro-error-attr", + "proc-macro2", + "quote", + "version_check", ] [[package]] -name = "prometheus-client" -version = "0.18.1" +name = "proc-macro-error-attr" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83cd1b99916654a69008fd66b4f9397fbe08e6e51dfe23d4417acf5d3b8cb87c" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" dependencies = [ - "dtoa", - "itoa", - "parking_lot", - "prometheus-client-derive-text-encode", + "proc-macro2", + "quote", + "version_check", +] + +[[package]] +name = "proc-macro2" +version = "1.0.70" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39278fbbf5fb4f646ce651690877f89d1c5811a3d4acb27700c1cb3cdb78fd3b" +dependencies = [ + "unicode-ident", ] [[package]] name = "prometheus-client" -version = "0.20.0" +version = "0.22.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e227aeb6c2cfec819e999c4773b35f8c7fa37298a203ff46420095458eee567e" +checksum = "c1ca959da22a332509f2a73ae9e5f23f9dcfc31fd3a54d71f159495bd5909baa" dependencies = [ "dtoa", "itoa", @@ -2681,17 +4264,6 @@ dependencies = [ "syn 2.0.39", ] -[[package]] -name = "prometheus-client-derive-text-encode" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66a455fbcb954c1a7decf3c586e860fd7889cddf4b8e164be736dbac95a953cd" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "psl-types" version = "2.0.11" @@ -2708,6 +4280,82 @@ dependencies = [ "psl-types", ] +[[package]] +name = "quick-error" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" + +[[package]] +name = "quick-protobuf" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d6da84cc204722a989e01ba2f6e1e276e190f22263d0cb6ce8526fcdb0d2e1f" +dependencies = [ + "byteorder", +] + +[[package]] +name = "quick-protobuf-codec" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15a0580ab32b169745d7a39db2ba969226ca16738931be152a3209b409de2474" +dependencies = [ + "asynchronous-codec 0.7.0", + "bytes", + "quick-protobuf", + "thiserror", + "unsigned-varint 0.8.0", +] + +[[package]] +name = "quinn" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8cc2c5017e4b43d5995dcea317bc46c1e09404c0a9664d2908f7f02dfe943d75" +dependencies = [ + "bytes", + "futures-io", + "pin-project-lite", + "quinn-proto", + "quinn-udp", + "rustc-hash", + "rustls 0.21.9", + "thiserror", + "tokio", + "tracing", +] + +[[package]] +name = "quinn-proto" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "141bf7dfde2fbc246bfd3fe12f2455aa24b0fbd9af535d8c86c7bd1381ff2b1a" +dependencies = [ + "bytes", + "rand", + "ring 0.16.20", + "rustc-hash", + "rustls 0.21.9", + "slab", + "thiserror", + "tinyvec", + "tracing", +] + +[[package]] +name = "quinn-udp" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "055b4e778e8feb9f93c4e439f71dc2156ef13360b432b799e179a8c4cdf0b1d7" +dependencies = [ + "bytes", + "libc", + "socket2 0.5.5", + "tracing", + "windows-sys 0.48.0", +] + [[package]] name = "quote" version = "1.0.33" @@ -2773,6 +4421,18 @@ dependencies = [ "crossbeam-utils", ] +[[package]] +name = "rcgen" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52c4f3084aa3bc7dfbba4eff4fab2a54db4324965d8872ab933565e6fbd83bc6" +dependencies = [ + "pem", + "ring 0.16.20", + "time", + "yasna", +] + [[package]] name = "redox_syscall" version = "0.4.1" @@ -2868,13 +4528,23 @@ dependencies = [ "winreg", ] +[[package]] +name = "resolv-conf" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52e44394d2086d010551b14b53b1f24e31647570cd1deb0379e2c21b329aba00" +dependencies = [ + "hostname", + "quick-error", +] + [[package]] name = "rfc6979" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" dependencies = [ - "hmac", + "hmac 0.12.1", "subtle", ] @@ -2913,7 +4583,22 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bd124222d17ad93a644ed9d011a40f4fb64aa54275c08cc216524a9ea82fb09f" dependencies = [ - "digest", + "digest 0.10.7", +] + +[[package]] +name = "rtnetlink" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "322c53fd76a18698f1c27381d58091de3a043d356aa5bd0d510608b565f469a0" +dependencies = [ + "futures", + "log", + "netlink-packet-route", + "netlink-proto", + "nix", + "thiserror", + "tokio", ] [[package]] @@ -2922,6 +4607,12 @@ version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + [[package]] name = "rustc_version" version = "0.4.0" @@ -2931,6 +4622,15 @@ dependencies = [ "semver", ] +[[package]] +name = "rusticata-macros" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "faf0c4a6ece9950b9abdb62b1cfcf2a68b3b67a10ba445b3bb85be2a293d0632" +dependencies = [ + "nom", +] + [[package]] name = "rustix" version = "0.38.25" @@ -3018,6 +4718,17 @@ version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" +[[package]] +name = "rw-stream-sink" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8c9026ff5d2f23da5e45bbc283f156383001bfb09c4e44256d02c1a685fe9a1" +dependencies = [ + "futures", + "pin-project", + "static_assertions", +] + [[package]] name = "ryu" version = "1.0.15" @@ -3080,10 +4791,10 @@ version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9f9e24d2b632954ded8ab2ef9fea0a0c769ea56ea98bddbafbad22caeeadf45d" dependencies = [ - "hmac", + "hmac 0.12.1", "pbkdf2 0.11.0", "salsa20", - "sha2", + "sha2 0.10.8", ] [[package]] @@ -3222,24 +4933,58 @@ dependencies = [ [[package]] name = "serde_with" -version = "1.14.0" +version = "3.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "678b5a069e50bf00ecd22d0cd8ddf7c236f68581b03db652061ed5eb13a312ff" +checksum = "ee80b0e361bbf88fd2f6e242ccd19cfda072cb0faa6ae694ecee08199938569a" dependencies = [ + "base64 0.21.5", + "chrono", + "hex", + "indexmap 1.9.3", + "indexmap 2.1.0", "serde", + "serde_derive", + "serde_json", "serde_with_macros", + "time", ] [[package]] name = "serde_with_macros" -version = "1.5.2" +version = "3.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e182d6ec6f05393cc0e5ed1bf81ad6db3a8feedf8ee515ecdd369809bcce8082" +checksum = "6561dc161a9224638a31d876ccdfefbc1df91d3f3a8342eddb35f055d48c7655" dependencies = [ - "darling 0.13.4", + "darling 0.20.8", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.39", +] + +[[package]] +name = "sha-1" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99cd6713db3cf16b6c84e06321e049a9b9f699826e16096d23bbcc44d15d51a6" +dependencies = [ + "block-buffer 0.9.0", + "cfg-if", + "cpufeatures", + "digest 0.9.0", + "opaque-debug", +] + +[[package]] +name = "sha2" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" +dependencies = [ + "block-buffer 0.9.0", + "cfg-if", + "cpufeatures", + "digest 0.9.0", + "opaque-debug", ] [[package]] @@ -3250,7 +4995,7 @@ checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" dependencies = [ "cfg-if", "cpufeatures", - "digest", + "digest 0.10.7", ] [[package]] @@ -3259,7 +5004,7 @@ version = "0.10.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" dependencies = [ - "digest", + "digest 0.10.7", "keccak", ] @@ -3287,7 +5032,7 @@ version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" dependencies = [ - "digest", + "digest 0.10.7", "rand_core", ] @@ -3312,6 +5057,23 @@ version = "1.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970" +[[package]] +name = "snow" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "850948bee068e713b8ab860fe1adc4d109676ab4c3b621fd8147f06b261f2f85" +dependencies = [ + "aes-gcm", + "blake2", + "chacha20poly1305", + "curve25519-dalek", + "rand_core", + "ring 0.17.5", + "rustc_version", + "sha2 0.10.8", + "subtle", +] + [[package]] name = "socket2" version = "0.4.10" @@ -3332,6 +5094,21 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "soketto" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d1c5305e39e09653383c2c7244f2f78b3bcae37cf50c64cb4789c9f5096ec2" +dependencies = [ + "base64 0.13.1", + "bytes", + "futures", + "httparse", + "log", + "rand", + "sha-1", +] + [[package]] name = "spin" version = "0.5.2" @@ -3381,7 +5158,16 @@ version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "063e6045c0e62079840579a7e47a355ae92f60eb74daaf156fb1e84ba164e63f" dependencies = [ - "strum_macros", + "strum_macros 0.24.3", +] + +[[package]] +name = "strum" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290d54ea6f91c969195bdbcd7442c8c2a2ba87da8bf60a7ee86a235d4bc1e125" +dependencies = [ + "strum_macros 0.25.3", ] [[package]] @@ -3397,6 +5183,19 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "strum_macros" +version = "0.25.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23dc1fa9ac9c169a78ba62f0b841814b7abae11bdd047b9c58f893439e309ea0" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "rustversion", + "syn 2.0.39", +] + [[package]] name = "subtle" version = "2.5.0" @@ -3431,6 +5230,18 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" +[[package]] +name = "synstructure" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", + "unicode-xid", +] + [[package]] name = "synstructure" version = "0.13.0" @@ -3492,6 +5303,12 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "termtree" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3369f5ac52d5eb6ab48c6b4ffdc8efbcad6b89c765749064ba298f2c68a16a76" + [[package]] name = "thiserror" version = "1.0.50" @@ -3893,6 +5710,16 @@ version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" +[[package]] +name = "universal-hash" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea" +dependencies = [ + "crypto-common", + "subtle", +] + [[package]] name = "unreachable" version = "1.0.0" @@ -3902,6 +5729,22 @@ dependencies = [ "void", ] +[[package]] +name = "unsigned-varint" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6889a77d49f1f013504cec6bf97a2c730394adedaeb1deb5ea08949a50541105" +dependencies = [ + "asynchronous-codec 0.6.2", + "bytes", +] + +[[package]] +name = "unsigned-varint" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb066959b24b5196ae73cb057f45598450d2c5f71460e98c49b738086eff9c06" + [[package]] name = "untrusted" version = "0.7.1" @@ -4075,6 +5918,12 @@ version = "0.25.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1778a42e8b3b90bff8d0f5032bf22250792889a5cdc752aa0020c84abe3aaf10" +[[package]] +name = "widestring" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7219d36b6eac893fa81e84ebe06485e7dcbb616177469b142df14f1f4deb1311" + [[package]] name = "winapi" version = "0.3.9" @@ -4097,6 +5946,16 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "windows" +version = "0.51.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca229916c5ee38c2f2bc1e9d8f04df975b4bd93f9955dc69fabb5d91270045c9" +dependencies = [ + "windows-core", + "windows-targets 0.48.5", +] + [[package]] name = "windows-core" version = "0.51.1" @@ -4124,6 +5983,15 @@ dependencies = [ "windows-targets 0.48.5", ] +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.5", +] + [[package]] name = "windows-targets" version = "0.42.2" @@ -4154,6 +6022,22 @@ dependencies = [ "windows_x86_64_msvc 0.48.5", ] +[[package]] +name = "windows-targets" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb" +dependencies = [ + "windows_aarch64_gnullvm 0.52.5", + "windows_aarch64_msvc 0.52.5", + "windows_i686_gnu 0.52.5", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.5", + "windows_x86_64_gnu 0.52.5", + "windows_x86_64_gnullvm 0.52.5", + "windows_x86_64_msvc 0.52.5", +] + [[package]] name = "windows_aarch64_gnullvm" version = "0.42.2" @@ -4166,6 +6050,12 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263" + [[package]] name = "windows_aarch64_msvc" version = "0.42.2" @@ -4178,6 +6068,12 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6" + [[package]] name = "windows_i686_gnu" version = "0.42.2" @@ -4190,6 +6086,18 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" +[[package]] +name = "windows_i686_gnu" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9" + [[package]] name = "windows_i686_msvc" version = "0.42.2" @@ -4202,6 +6110,12 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" +[[package]] +name = "windows_i686_msvc" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf" + [[package]] name = "windows_x86_64_gnu" version = "0.42.2" @@ -4214,6 +6128,12 @@ 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.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9" + [[package]] name = "windows_x86_64_gnullvm" version = "0.42.2" @@ -4226,6 +6146,12 @@ 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.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596" + [[package]] name = "windows_x86_64_msvc" version = "0.42.2" @@ -4238,6 +6164,12 @@ 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.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" + [[package]] name = "winnow" version = "0.5.19" @@ -4266,6 +6198,50 @@ dependencies = [ "tap", ] +[[package]] +name = "x25519-dalek" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7e468321c81fb07fa7f4c636c3972b9100f0346e5b6a9f2bd0603a52f7ed277" +dependencies = [ + "curve25519-dalek", + "rand_core", + "serde", + "zeroize", +] + +[[package]] +name = "x509-parser" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7069fba5b66b9193bd2c5d3d4ff12b839118f6bcbef5328efafafb5395cf63da" +dependencies = [ + "asn1-rs", + "data-encoding", + "der-parser", + "lazy_static", + "nom", + "oid-registry", + "rusticata-macros", + "thiserror", + "time", +] + +[[package]] +name = "xml-rs" +version = "0.8.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "791978798f0597cfc70478424c2b4fdc2b7a8024aaff78497ef00f24ef674193" + +[[package]] +name = "xmltree" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7d8a75eaf6557bb84a65ace8609883db44a29951042ada9b393151532e41fcb" +dependencies = [ + "xml-rs", +] + [[package]] name = "yaml-rust" version = "0.4.5" @@ -4275,6 +6251,46 @@ dependencies = [ "linked-hash-map", ] +[[package]] +name = "yamux" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed0164ae619f2dc144909a9f082187ebb5893693d8c0196e8085283ccd4b776" +dependencies = [ + "futures", + "log", + "nohash-hasher", + "parking_lot", + "pin-project", + "rand", + "static_assertions", +] + +[[package]] +name = "yamux" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad1d0148b89300047e72994bee99ecdabd15a9166a7b70c8b8c37c314dcc9002" +dependencies = [ + "futures", + "instant", + "log", + "nohash-hasher", + "parking_lot", + "pin-project", + "rand", + "static_assertions", +] + +[[package]] +name = "yasna" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e17bb3549cc1321ae1296b9cdc2698e2b6cb1992adfa19a8c72e5b7a738f44cd" +dependencies = [ + "time", +] + [[package]] name = "zerocopy" version = "0.7.26" diff --git a/Cargo.toml b/Cargo.toml index 6d90457..515963d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,11 +12,11 @@ description = "A token faucet for onboarding fuel users" [dependencies] anyhow = "1.0" axum = "0.5" -fuel-core-client = "0.22.0" -fuel-tx = "0.43.0" -fuel-types = "0.43.0" -fuels-accounts = "0.54.0" -fuels-core = "0.54.0" +fuel-core-client = "0.24.3" +fuel-tx = "0.48.0" +fuel-types = "0.48.0" +fuels-accounts = { version = "0.58.0", features = ["coin-cache"] } +fuels-core = { version = "0.58.0" } handlebars = "4.2" lazy_static = "1.4" memoize = "0.3.1" @@ -31,10 +31,11 @@ tracing = "0.1" tracing-subscriber = { version = "0.3", features = ["env-filter", "json"] } [dev-dependencies] -fuel-core = { version = "0.22.0", default-features = false } -fuel-core-txpool = "0.22.0" -fuel-crypto = "0.43.0" -fuel-types = { version = "0.43.0", features = ["random"] } +fuel-core = { version = "0.24.3", default-features = false, features = ["test-helpers"] } +fuel-core-txpool = "0.24.3" +fuel-crypto = "0.48.0" +fuel-tx = { version = "0.48.0", features = ["test-helpers"] } +fuel-types = { version = "0.48.0", features = ["random"] } futures = "0.3" insta = "1.14" rand = "0.8" diff --git a/README.md b/README.md index 734503e..6c9f724 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,6 @@ The faucet makes use of environment variables for configuration. | PUBLIC_FUEL_NODE_URL | The public GraphQL endpoint for connecting to fuel-core. Ex.: https://node.fuel.network/graphql | | SERVICE_PORT | The port the service will listen for http connections on. | | DISPENSE_AMOUNT | Dispense amount on each faucet | -| MIN_GAS_PRICE | The minimum gas price to use in each transfer | ## Build and Run diff --git a/deployment/Dockerfile b/deployment/Dockerfile index dd1b36a..cf379b5 100644 --- a/deployment/Dockerfile +++ b/deployment/Dockerfile @@ -1,5 +1,5 @@ # Stage 1: Build -FROM lukemathwalker/cargo-chef:latest-rust-1.74 as chef +FROM lukemathwalker/cargo-chef:latest-rust-1.76 as chef WORKDIR /build/ # hadolint ignore=DL3008 RUN apt-get update && \ diff --git a/deployment/charts/templates/fuel-faucet-deploy.yaml b/deployment/charts/templates/fuel-faucet-deploy.yaml index fbc41b3..5ed5f5e 100644 --- a/deployment/charts/templates/fuel-faucet-deploy.yaml +++ b/deployment/charts/templates/fuel-faucet-deploy.yaml @@ -41,8 +41,8 @@ spec: containers: - name: {{ .Values.app.name }} image: "{{ .Values.app.image.repository }}:{{ .Values.app.image.tag }}" - command: ["./fuel-faucet"] - resources: {} + command: [ "./fuel-faucet" ] + resources: { } imagePullPolicy: {{ .Values.app.image.pullPolicy }} ports: - name: http @@ -82,7 +82,3 @@ spec: - name: DISPENSE_AMOUNT value: "{{ .Values.app.dispense_amount }}" {{- end }} - {{- if .Values.app.min_gas_price }} - - name: MIN_GAS_PRICE - value: "{{ .Values.app.min_gas_price }}" - {{- end }} diff --git a/deployment/charts/values.yaml b/deployment/charts/values.yaml index 77fa8c4..f9f42cb 100644 --- a/deployment/charts/values.yaml +++ b/deployment/charts/values.yaml @@ -14,7 +14,6 @@ app: public_node_url: "${fuel_faucet_public_node_url}" max_dispenses_per_minute: "${fuel_faucet_max_dispenses_per_minute}" dispense_amount: "${fuel_faucet_dispense_amount}" - min_gas_price: "${fuel_faucet_min_gas_price}" image: repository: "${fuel_faucet_image_repository}" tag: "${fuel_faucet_image_tag}" diff --git a/deployment/scripts/.env b/deployment/scripts/.env index e6552ca..e8f40d1 100644 --- a/deployment/scripts/.env +++ b/deployment/scripts/.env @@ -12,7 +12,6 @@ fuel_faucet_captcha_secret="fuelrocks" fuel_faucet_node_url="node.example.com" fuel_faucet_public_node_url="https://node.example.com/graphql" fuel_faucet_max_dispenses_per_minute=20 -fuel_faucet_min_gas_price=0 fuel_faucet_dispense_amount=10000 # Ingress envs diff --git a/src/config.rs b/src/config.rs index 3051515..a41c47c 100644 --- a/src/config.rs +++ b/src/config.rs @@ -1,8 +1,8 @@ use crate::constants::{ CAPTCHA_KEY, CAPTCHA_SECRET, DEFAULT_DISPENSE_INTERVAL, DEFAULT_FAUCET_DISPENSE_AMOUNT, DEFAULT_NODE_URL, DEFAULT_PORT, DISPENSE_AMOUNT, DISPENSE_INTERVAL, FAUCET_ASSET_ID, - FUEL_NODE_URL, HUMAN_LOGGING, LOG_FILTER, MIN_GAS_PRICE, PUBLIC_FUEL_NODE_URL, SERVICE_PORT, - TIMEOUT_SECONDS, WALLET_SECRET_KEY, + FUEL_NODE_URL, HUMAN_LOGGING, LOG_FILTER, PUBLIC_FUEL_NODE_URL, SERVICE_PORT, TIMEOUT_SECONDS, + WALLET_SECRET_KEY, }; use fuels_core::types::AssetId; use secrecy::Secret; @@ -21,7 +21,6 @@ pub struct Config { pub dispense_amount: u64, pub dispense_asset_id: AssetId, pub dispense_limit_interval: u64, - pub min_gas_price: u64, pub timeout: u64, } @@ -50,10 +49,6 @@ impl Default for Config { .unwrap_or_else(|_| DEFAULT_DISPENSE_INTERVAL.to_string()) .parse::() .expect("expected a valid integer for DISPENSE_LIMIT_INTERVAL"), - min_gas_price: env::var(MIN_GAS_PRICE) - .unwrap_or_else(|_| "0".to_string()) - .parse::() - .expect("expected a valid integer for MIN_GAS_PRICE"), timeout: env::var(TIMEOUT_SECONDS) .unwrap_or_else(|_| "30".to_string()) .parse::() diff --git a/src/constants.rs b/src/constants.rs index 2228508..bde4d08 100644 --- a/src/constants.rs +++ b/src/constants.rs @@ -18,7 +18,6 @@ pub const FAUCET_ASSET_ID: AssetId = AssetId::new([0; 32]); pub const SERVICE_PORT: &str = "PORT"; pub const DEFAULT_PORT: u16 = 3000; -pub const MIN_GAS_PRICE: &str = "MIN_GAS_PRICE"; pub const TIMEOUT_SECONDS: &str = "TIMEOUT_SECONDS"; // HTTP config diff --git a/src/lib.rs b/src/lib.rs index 3599a1a..7b952fc 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -17,7 +17,6 @@ use fuel_tx::UtxoId; use fuel_types::Address; use fuels_accounts::{provider::Provider, wallet::WalletUnlocked, ViewOnlyAccount}; use fuels_core::types::node_info::NodeInfo; -use fuels_core::types::transaction_builders::NetworkInfo; use secrecy::{ExposeSecret, Secret}; use serde_json::json; use std::{ @@ -45,12 +44,6 @@ mod routes; pub use dispense_tracker::{Clock, StdTime}; pub use routes::THE_BIGGEST_AMOUNT; -#[derive(Debug)] -pub struct NetworkConfig { - pub network_info: NetworkInfo, - pub node_info: NodeInfo, -} - #[derive(Debug, Copy, Clone)] pub struct CoinOutput { utxo_id: UtxoId, @@ -60,37 +53,34 @@ pub struct CoinOutput { #[derive(Debug)] pub struct FaucetState { - min_gas_price: u64, max_depth: u64, // Gas prices create the ordering for transactions. - next_gas_price: u64, + next_tip: u64, pub last_output: Option, } impl FaucetState { - pub fn new(min_gas_price: u64, node_info: &NodeInfo) -> Self { + pub fn new(node_info: &NodeInfo) -> Self { Self { - min_gas_price, max_depth: node_info.max_depth, - next_gas_price: 0, + next_tip: 0, last_output: None, } } - pub fn next_gas_price(&mut self) -> u64 { - if self.next_gas_price <= self.min_gas_price { - self.next_gas_price = self.max_depth * 100 + self.min_gas_price; + pub fn next_tip(&mut self) -> u64 { + if self.next_tip == 0 { + self.next_tip = self.max_depth * 10_000; } - let next_gas_price = self.next_gas_price; - self.next_gas_price -= 1; - next_gas_price + let next_tip = self.next_tip; + self.next_tip -= 1; + next_tip } } pub type SharedFaucetState = Arc>; pub type SharedWallet = Arc; pub type SharedConfig = Arc; -pub type SharedNetworkConfig = Arc; pub type SharedDispenseTracker = Arc>; pub async fn start_server( @@ -103,22 +93,10 @@ pub async fn start_server( let client = FuelClient::new(service_config.node_url.clone()) .expect("unable to connect to the fuel node api"); - let chain_info = client.chain_info().await.expect("Can't get `chain_info`"); - let provider = Provider::new( - service_config.node_url.clone(), - chain_info.consensus_parameters.clone(), - ) - .expect("Should create a provider"); - - let node_info = provider - .node_info() + let node_info = client.node_info().await.expect("Unable to fetch node info"); + let provider = Provider::connect(service_config.node_url.clone()) .await - .expect("unable to get `node_info`"); - - let network_config = NetworkConfig { - network_info: NetworkInfo::new(node_info.clone(), chain_info.into()), - node_info, - }; + .expect("Should create a provider"); // setup wallet let secret = service_config @@ -165,7 +143,7 @@ pub async fn start_server( ServiceBuilder::new() .layer(HandleErrorLayer::new(handle_error)) .buffer(MAX_CONCURRENT_REQUESTS) - .concurrency_limit(network_config.node_info.max_depth as usize) + .concurrency_limit(node_info.max_depth as usize) .into_inner(), ), ) @@ -180,10 +158,9 @@ pub async fn start_server( .layer(Extension(Arc::new(wallet))) .layer(Extension(Arc::new(client))) .layer(Extension(Arc::new(tokio::sync::Mutex::new( - FaucetState::new(service_config.min_gas_price, &network_config.node_info), + FaucetState::new(&node_info.into()), )))) .layer(Extension(Arc::new(service_config.clone()))) - .layer(Extension(Arc::new(network_config))) .layer(Extension(Arc::new(Mutex::new(DispenseTracker::new(clock))))) .layer( CorsLayer::new() diff --git a/src/routes.rs b/src/routes.rs index 221f091..670dc4a 100644 --- a/src/routes.rs +++ b/src/routes.rs @@ -1,6 +1,6 @@ use crate::{ models::*, recaptcha, CoinOutput, SharedConfig, SharedDispenseTracker, SharedFaucetState, - SharedNetworkConfig, SharedWallet, + SharedWallet, }; use axum::{ response::{Html, IntoResponse, Response}, @@ -8,11 +8,11 @@ use axum::{ }; use fuel_core_client::client::FuelClient; -use fuel_tx::UtxoId; +use fuel_tx::{Output, UtxoId}; use fuel_types::{Address, AssetId, Bytes32}; -use fuels_accounts::{wallet::WalletUnlocked, Account, Signer, ViewOnlyAccount}; +use fuels_accounts::{wallet::WalletUnlocked, Account, ViewOnlyAccount}; use fuels_core::types::transaction::{Transaction, TxPolicies}; -use fuels_core::types::transaction_builders::BuildableTransaction; +use fuels_core::types::transaction_builders::{BuildableTransaction, TransactionBuilder}; use fuels_core::types::{ bech32::Bech32Address, coin::{Coin, CoinStatus}, @@ -146,11 +146,8 @@ fn check_and_mark_dispense_limit( Ok(()) } -async fn get_coin_output( - wallet: &WalletUnlocked, - amount: u64, -) -> Result { - let resources = wallet +async fn get_coins(wallet: &WalletUnlocked, amount: u64) -> Result, DispenseError> { + wallet .get_spendable_resources(AssetId::BASE, amount) .await .map_err(|e| { @@ -158,27 +155,8 @@ async fn get_coin_output( format!("Failed to get resources: {e}"), StatusCode::INTERNAL_SERVER_ERROR, ) - })?; - - let coin_output = resources - .into_iter() - .filter_map(|coin| match coin { - CoinType::Coin(coin) => Some(CoinOutput { - utxo_id: coin.utxo_id, - owner: coin.owner.into(), - amount: coin.amount, - }), - _ => None, }) - .last() - .ok_or_else(|| { - error( - "The wallet is empty".to_string(), - StatusCode::INTERNAL_SERVER_ERROR, - ) - })?; - - Ok(coin_output) + .map(|resources| resources.into_iter().map(Input::resource_signed).collect()) } async fn submit_tx_with_timeout( @@ -216,7 +194,6 @@ pub async fn dispense_tokens( Extension(state): Extension, Extension(config): Extension, Extension(client): Extension>, - Extension(network_config): Extension, Extension(dispense_tracker): Extension, ) -> Result { // parse deposit address @@ -272,48 +249,78 @@ pub async fn dispense_tokens( let mut tx_id = None; for _ in 0..5 { let mut guard = state.lock().await; - let coin_output = if let Some(previous_coin_output) = &guard.last_output { - *previous_coin_output + let inputs = if let Some(previous_coin_output) = &guard.last_output { + let coin_type = CoinType::Coin(Coin { + amount: previous_coin_output.amount, + block_created: 0u32, + asset_id: config.dispense_asset_id, + utxo_id: previous_coin_output.utxo_id, + owner: previous_coin_output.owner.into(), + status: CoinStatus::Unspent, + }); + + vec![Input::resource_signed(coin_type)] } else { - get_coin_output(&wallet, config.dispense_amount).await? + get_coins(&wallet, config.dispense_amount).await? }; - let coin_type = CoinType::Coin(Coin { - amount: coin_output.amount, - block_created: 0u32, - asset_id: config.dispense_asset_id, - utxo_id: coin_output.utxo_id, - maturity: 0u32, - owner: coin_output.owner.into(), - status: CoinStatus::Unspent, - }); - - let inputs = vec![Input::resource_signed(coin_type)]; - - let outputs = wallet.get_asset_outputs_for_amount( + let mut outputs = wallet.get_asset_outputs_for_amount( &address.into(), config.dispense_asset_id, config.dispense_amount, ); + let faucet_address: Address = wallet.address().into(); + // Add an additional output to store the stable part of the fee change. + outputs.push(Output::coin(faucet_address, 0, config.dispense_asset_id)); - let gas_price = guard.next_gas_price(); + let tip = guard.next_tip(); - let mut script = ScriptTransactionBuilder::prepare_transfer( + let mut tx_builder = ScriptTransactionBuilder::prepare_transfer( inputs, outputs, - TxPolicies::default().with_gas_price(gas_price), - network_config.network_info.clone(), + TxPolicies::default().with_tip(tip), ); - wallet.sign_transaction(&mut script); + wallet + .add_witnesses(&mut tx_builder) + .expect("Valid witness"); + wallet + .adjust_for_fee(&mut tx_builder, config.dispense_amount) + .await + .map_err(|e| { + error( + format!("Failed to adjust for fee: {e}"), + StatusCode::INTERNAL_SERVER_ERROR, + ) + })?; + + let fee = tx_builder + .fee_checked_from_tx(provider) + .await + .map_err(|e| { + error( + format!("Error calculating `TransactionFee`: {e}"), + StatusCode::INTERNAL_SERVER_ERROR, + ) + })? + .ok_or(error( + "Overflow during calculating `TransactionFee`".to_string(), + StatusCode::INTERNAL_SERVER_ERROR, + ))?; + let available_balance = available_balance(&tx_builder.inputs, &config.dispense_asset_id); + let stable_fee_change = available_balance + .checked_sub(fee.max_fee().saturating_add(config.dispense_amount)) + .ok_or(error( + "Not enough asset to cover a max fee".to_string(), + StatusCode::INTERNAL_SERVER_ERROR, + ))?; - let script = script.build(provider).await.expect("valid script"); + *tx_builder.outputs.last_mut().unwrap() = + Output::coin(faucet_address, stable_fee_change, config.dispense_asset_id); - let total_fee = script - .fee_checked_from_tx(&network_config.network_info.consensus_parameters) - .expect("Should be able to calculate fee"); + let script = tx_builder.build(provider).await.expect("Valid script"); - let id = script.id(network_config.network_info.consensus_parameters.chain_id); + let id = script.id(provider.chain_id()); let result = tokio::time::timeout( Duration::from_secs(config.timeout), provider.send_transaction(script), @@ -340,9 +347,9 @@ pub async fn dispense_tokens( match result { Ok(_) => { guard.last_output = Some(CoinOutput { - utxo_id: UtxoId::new(id, 1), - owner: coin_output.owner, - amount: coin_output.amount - total_fee.min_fee() - config.dispense_amount, + utxo_id: UtxoId::new(id, 2), + owner: faucet_address, + amount: stable_fee_change, }); tx_id = Some(id); break; @@ -392,3 +399,21 @@ fn error(error: String, status: StatusCode) -> DispenseError { error!("{}", error); DispenseError { error, status } } + +fn available_balance(inputs: &[Input], base_asset_id: &AssetId) -> u64 { + inputs + .iter() + .filter_map(|input| match input { + Input::ResourceSigned { resource, .. } | Input::ResourcePredicate { resource, .. } => { + match resource { + CoinType::Coin(Coin { + amount, asset_id, .. + }) if asset_id == base_asset_id => Some(*amount), + CoinType::Message(message) => Some(message.amount), + _ => None, + } + } + _ => None, + }) + .sum() +} diff --git a/tests/dispense.rs b/tests/dispense.rs index ba1809d..d0ad50f 100644 --- a/tests/dispense.rs +++ b/tests/dispense.rs @@ -1,14 +1,16 @@ -use fuel_core::chain_config::{ChainConfig, CoinConfig, StateConfig}; +use fuel_core::chain_config::{ + ChainConfig, CoinConfig, CoinConfigGenerator, SnapshotReader, StateConfig, +}; use fuel_core::service::config::Trigger; use fuel_core::service::{Config as NodeConfig, FuelService}; use fuel_core_client::client::pagination::{PageDirection, PaginationRequest}; +use fuel_crypto::SecretKey; use fuel_faucet::config::Config; use fuel_faucet::models::DispenseInfoResponse; use fuel_faucet::{start_server, Clock, THE_BIGGEST_AMOUNT}; -use fuel_tx::{ConsensusParameters, FeeParameters}; +use fuel_tx::ConsensusParameters; use fuel_types::{Address, AssetId}; -use fuels_accounts::fuel_crypto::SecretKey; use fuels_accounts::provider::Provider; use fuels_accounts::wallet::WalletUnlocked; use fuels_core::types::bech32::Bech32Address; @@ -59,63 +61,54 @@ impl TestContext { let secret_key: SecretKey = SecretKey::random(&mut rng); let wallet = WalletUnlocked::new_from_private_key(secret_key, None); + let mut generator = CoinConfigGenerator::new(); let mut coins: Vec<_> = (0..10000) .map(|_| { // dust CoinConfig { - tx_id: None, - output_index: None, - maturity: None, - tx_pointer_block_height: None, - tx_pointer_tx_idx: None, owner: wallet.address().into(), amount: THE_BIGGEST_AMOUNT - 1, asset_id: rng.gen(), + ..generator.generate() } }) .collect(); // main coin coins.push(CoinConfig { - tx_id: None, - output_index: None, - maturity: None, - tx_pointer_block_height: None, - tx_pointer_tx_idx: None, owner: wallet.address().into(), amount: 1 << 50, asset_id: Default::default(), + ..generator.generate() }); - // start node - let fuel_node = FuelService::new_node(NodeConfig { - chain_conf: ChainConfig { - initial_state: Some(StateConfig { - coins: Some(coins), - contracts: None, - height: None, - messages: None, - }), - consensus_parameters: ConsensusParameters { - fee_params: FeeParameters { - gas_price_factor: 1, - ..Default::default() - }, - ..ConsensusParameters::default() - }, - ..ChainConfig::local_testnet() - }, + let state_config = StateConfig { + coins, + ..Default::default() + }; + + let mut consensus_parameters = ConsensusParameters::default(); + consensus_parameters + .set_fee_params(fuel_tx::FeeParameters::default().with_gas_price_factor(1)); + + let chain_config = ChainConfig { + consensus_parameters, + ..ChainConfig::local_testnet() + }; + + let snapshot_reader = SnapshotReader::new_in_memory(chain_config, state_config); + + let config = NodeConfig { block_production: Trigger::Interval { block_time: Duration::from_secs(3), }, - txpool: fuel_core_txpool::Config { - min_gas_price: 1, - ..Default::default() - }, utxo_validation: true, + static_gas_price: 1, + snapshot_reader, ..NodeConfig::local_node() - }) - .await - .unwrap(); + }; + + // start node + let fuel_node = FuelService::new_node(config).await.unwrap(); // setup provider let provider = Provider::connect(&fuel_node.bound_address.to_string()) @@ -129,7 +122,6 @@ impl TestContext { wallet_secret_key: Some(Secret::new(format!("{secret_key:x}"))), dispense_amount, dispense_asset_id: AssetId::default(), - min_gas_price: 1, ..Default::default() }; From 01232ce8fa981e569d690ca206ff439829a2bb18 Mon Sep 17 00:00:00 2001 From: Green Baneling Date: Tue, 30 Apr 2024 23:02:13 +0200 Subject: [PATCH 09/11] Use `fuels-rs 0.59.0` (#70) --- Cargo.lock | 81 +++++++++++++++++++++++++++--------------------------- Cargo.toml | 4 +-- 2 files changed, 42 insertions(+), 43 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 22c8cdc..dfc117e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1586,9 +1586,9 @@ dependencies = [ [[package]] name = "fuel-core" -version = "0.24.2" +version = "0.24.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "405711c81cb0b24b1bf1fd1159a1dbee24c61c167ad95d80bf1e83c1053eb44b" +checksum = "16acbaac42aceb26c704ed078314e7e7f9d1e20d6eaf147cada559e7e9f967ae" dependencies = [ "anyhow", "async-graphql", @@ -1632,9 +1632,9 @@ dependencies = [ [[package]] name = "fuel-core-chain-config" -version = "0.24.2" +version = "0.24.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8654e9c57f2e03d118b5f2b9af986d246d3f2e6c9a631b698112d542c656d38b" +checksum = "23929afd8e279a463941ed18c8a23d9e29df4c3587ba19ad56c68f24c14484f5" dependencies = [ "anyhow", "bech32", @@ -1651,9 +1651,9 @@ dependencies = [ [[package]] name = "fuel-core-client" -version = "0.24.2" +version = "0.24.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27f0c9bf68b4a4779a6d1d4230b8bf4be7915ef24ecb7865a56d4f2f4839f076" +checksum = "67d4a6c96cd1827d04361f8b76416273168efc9eb0951293b03bc18e52d409b6" dependencies = [ "anyhow", "cynic", @@ -1675,9 +1675,9 @@ dependencies = [ [[package]] name = "fuel-core-consensus-module" -version = "0.24.2" +version = "0.24.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73fee1e84e04419ee5cc0448e8f572a82bf04ccff0873780393703eaa911d6f4" +checksum = "3b1d8ec2205453a563f9ac620867febb711c4ec7a930f063899f8c8673921417" dependencies = [ "anyhow", "fuel-core-chain-config", @@ -1688,9 +1688,9 @@ dependencies = [ [[package]] name = "fuel-core-database" -version = "0.24.2" +version = "0.24.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78966c55e18447228d5cae5c31c5b35107ccc5ae40ea1fc7a1fb77d2ee624b5d" +checksum = "3a87cc2351d5a3205d4a6673904bb3b876203540595e1746a1f466d5900b3c3e" dependencies = [ "anyhow", "derive_more", @@ -1700,9 +1700,9 @@ dependencies = [ [[package]] name = "fuel-core-executor" -version = "0.24.2" +version = "0.24.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d21f5f796de10364bb7f76ee927759fdf2789b0605e8dd5d702fb471ac00c193" +checksum = "6e159969d168d4b7cbaa9a55efb842604f0abe116d1baa0b0486c73f2261f63a" dependencies = [ "anyhow", "fuel-core-chain-config", @@ -1716,9 +1716,9 @@ dependencies = [ [[package]] name = "fuel-core-importer" -version = "0.24.2" +version = "0.24.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c1c2de6d1f23dcabc6b4e5e66faf331416c5ef5ac04bc056e031c72ed7f5251" +checksum = "5b858caa4d262891964f55c09f86d6f93d368f7d9a073e5828e02616db88e014" dependencies = [ "anyhow", "derive_more", @@ -1733,9 +1733,9 @@ dependencies = [ [[package]] name = "fuel-core-metrics" -version = "0.24.2" +version = "0.24.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e47f356c8facab51b0f438c8bc2ac498d3b6b1338dd7af45b483031c9260f765" +checksum = "003381d1f9f5def3685171b340c4bb56d3681897f3baa616aaf6cf7085013462" dependencies = [ "axum", "once_cell", @@ -1747,9 +1747,9 @@ dependencies = [ [[package]] name = "fuel-core-p2p" -version = "0.24.2" +version = "0.24.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eab7eb7efe0475da7e93c192c17f5d629b35db443eaa8dc69347e5f604cbac6f" +checksum = "c513afe591125230e3fd9f6cdf1add00a2aba3f11a19e9e77e020ec14b863b6e" dependencies = [ "anyhow", "async-trait", @@ -1779,9 +1779,9 @@ dependencies = [ [[package]] name = "fuel-core-poa" -version = "0.24.2" +version = "0.24.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c95afda02bca15060593c0298e7f8b79b8f6a8e24ae7fdb549a3b8dbc58ce83" +checksum = "8608758b49855f33c3e6a78917dada96265233096aae04628d6c1ff9fe6d3dca" dependencies = [ "anyhow", "async-trait", @@ -1796,9 +1796,9 @@ dependencies = [ [[package]] name = "fuel-core-producer" -version = "0.24.2" +version = "0.24.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb0f8627a1ca7408d5d853bcf15e7d2c70000cb599c72c4175450b2519a96158" +checksum = "c662d29fafeeb686057f3ba1f2cd349e3c437c32d59ae4f6c61400cee26f27e7" dependencies = [ "anyhow", "async-trait", @@ -1812,9 +1812,9 @@ dependencies = [ [[package]] name = "fuel-core-services" -version = "0.24.2" +version = "0.24.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95e3a53f24f354ee999885e03ac77c62fb5fff0200f761705a75533a78c854eb" +checksum = "ca69ccc3a055e0a645c7e76e0623feec6945d4cf95b4131a3a1bf1ffc076d1bb" dependencies = [ "anyhow", "async-trait", @@ -1827,9 +1827,9 @@ dependencies = [ [[package]] name = "fuel-core-storage" -version = "0.24.2" +version = "0.24.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3df278c08984f1db0b2a2bf42d45f293b5b7205f701910863567019f0f952fb7" +checksum = "1fb47f4fabcec096b78137c782895a52aeed134f931256656511b10083cbd967" dependencies = [ "anyhow", "derive_more", @@ -1851,9 +1851,9 @@ dependencies = [ [[package]] name = "fuel-core-txpool" -version = "0.24.2" +version = "0.24.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28e04b67d9fd915563ea8af4a6642a18218e96d11d244f8b848115c9645dab66" +checksum = "8e62e3bf2e4ee38e248131293ad908d8ba82b7d02dff432f68bc49b252eda509" dependencies = [ "anyhow", "async-trait", @@ -1872,9 +1872,9 @@ dependencies = [ [[package]] name = "fuel-core-types" -version = "0.24.2" +version = "0.24.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "550733dfe398f281e288afd6400bc4e0e95041950ff334de92c686a9063697af" +checksum = "385b3c9e9d51ca11e129ec1c713ffd2f4f2f2ad89c16b1808a4c661887a88bfb" dependencies = [ "anyhow", "bs58", @@ -1891,9 +1891,9 @@ dependencies = [ [[package]] name = "fuel-core-upgradable-executor" -version = "0.24.2" +version = "0.24.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c20ede3c70c4eaa9db25e14604913fdc7f8216f734347caf510b91e4132d7e5" +checksum = "123e31a87f925f6403cf960e04db1403c4093d0fbacb1a5a8333c2756b980a42" dependencies = [ "fuel-core-executor", "fuel-core-storage", @@ -2056,9 +2056,9 @@ dependencies = [ [[package]] name = "fuels-accounts" -version = "0.57.0" +version = "0.59.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "523db6eac7f1e90947e5ddb238bcada48d04ae5f128236d5bf48bb2320edeadc" +checksum = "a4b6dc7ec73fcbc104c87a3da8b4980626259ad3f2e42f7bc6fe41ec5d26b3c0" dependencies = [ "async-trait", "chrono", @@ -2075,15 +2075,14 @@ dependencies = [ "tai64", "thiserror", "tokio", - "tracing", "zeroize", ] [[package]] name = "fuels-code-gen" -version = "0.57.0" +version = "0.59.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22c4630056818ed04adc4f048462bc8fbde8b0332c847461b8ae55e8937e0b5c" +checksum = "1bceeab1b698cc0cb6ef84e37f7df6981180bf4f2ef808c1b0304e3b92d509c5" dependencies = [ "Inflector", "fuel-abi-types", @@ -2097,9 +2096,9 @@ dependencies = [ [[package]] name = "fuels-core" -version = "0.57.0" +version = "0.59.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41f82f251f4558a3e0032043415118f2842089783e129ea07d0c63933ac9e2da" +checksum = "294e432031c758701ba54bca0c3ed11c19718d4918e800e1c928c0a536194760" dependencies = [ "async-trait", "bech32", @@ -2124,9 +2123,9 @@ dependencies = [ [[package]] name = "fuels-macros" -version = "0.57.0" +version = "0.59.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41a33c1d1e58fe31593c77a87028cf8fd71e50ca206386c725fe0a0e1b3ff63c" +checksum = "223ab0dff7a6b0710eede62d381c61acce15d464e9cf5bd6848d5a9803b6671c" dependencies = [ "fuels-code-gen", "itertools 0.12.0", diff --git a/Cargo.toml b/Cargo.toml index 515963d..0057f8b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -15,8 +15,8 @@ axum = "0.5" fuel-core-client = "0.24.3" fuel-tx = "0.48.0" fuel-types = "0.48.0" -fuels-accounts = { version = "0.58.0", features = ["coin-cache"] } -fuels-core = { version = "0.58.0" } +fuels-accounts = { version = "0.59.0", features = ["coin-cache"] } +fuels-core = { version = "0.59.0" } handlebars = "4.2" lazy_static = "1.4" memoize = "0.3.1" From c6abfd8f970228ad35bf66997ca7dd955030a9e7 Mon Sep 17 00:00:00 2001 From: Green Baneling Date: Sat, 4 May 2024 00:00:29 +0200 Subject: [PATCH 10/11] Support non-zero base `AssetId` (#71) --- src/config.rs | 7 ++----- src/constants.rs | 3 --- src/lib.rs | 3 ++- src/routes.rs | 27 ++++++++++++++++++--------- tests/dispense.rs | 18 +++++++++++++----- 5 files changed, 35 insertions(+), 23 deletions(-) diff --git a/src/config.rs b/src/config.rs index a41c47c..697f08d 100644 --- a/src/config.rs +++ b/src/config.rs @@ -1,10 +1,9 @@ use crate::constants::{ CAPTCHA_KEY, CAPTCHA_SECRET, DEFAULT_DISPENSE_INTERVAL, DEFAULT_FAUCET_DISPENSE_AMOUNT, - DEFAULT_NODE_URL, DEFAULT_PORT, DISPENSE_AMOUNT, DISPENSE_INTERVAL, FAUCET_ASSET_ID, - FUEL_NODE_URL, HUMAN_LOGGING, LOG_FILTER, PUBLIC_FUEL_NODE_URL, SERVICE_PORT, TIMEOUT_SECONDS, + DEFAULT_NODE_URL, DEFAULT_PORT, DISPENSE_AMOUNT, DISPENSE_INTERVAL, FUEL_NODE_URL, + HUMAN_LOGGING, LOG_FILTER, PUBLIC_FUEL_NODE_URL, SERVICE_PORT, TIMEOUT_SECONDS, WALLET_SECRET_KEY, }; -use fuels_core::types::AssetId; use secrecy::Secret; use std::env; @@ -19,7 +18,6 @@ pub struct Config { pub public_node_url: String, pub wallet_secret_key: Option>, pub dispense_amount: u64, - pub dispense_asset_id: AssetId, pub dispense_limit_interval: u64, pub timeout: u64, } @@ -44,7 +42,6 @@ impl Default for Config { .unwrap_or_else(|_| DEFAULT_FAUCET_DISPENSE_AMOUNT.to_string()) .parse::() .expect("expected a valid integer for DISPENSE_AMOUNT"), - dispense_asset_id: FAUCET_ASSET_ID, dispense_limit_interval: env::var(DISPENSE_INTERVAL) .unwrap_or_else(|_| DEFAULT_DISPENSE_INTERVAL.to_string()) .parse::() diff --git a/src/constants.rs b/src/constants.rs index bde4d08..db8870e 100644 --- a/src/constants.rs +++ b/src/constants.rs @@ -1,5 +1,3 @@ -use fuels_core::types::AssetId; - pub const LOG_FILTER: &str = "RUST_LOG"; pub const HUMAN_LOGGING: &str = "HUMAN_LOGGING"; pub const CAPTCHA_KEY: &str = "CAPTCHA_KEY"; @@ -14,7 +12,6 @@ pub const DISPENSE_AMOUNT: &str = "DISPENSE_AMOUNT"; pub const DISPENSE_INTERVAL: &str = "DISPENSE_LIMIT_INTERVAL"; pub const DEFAULT_DISPENSE_INTERVAL: u64 = 24 * 60 * 60; pub const DEFAULT_FAUCET_DISPENSE_AMOUNT: u64 = 10_000_000; -pub const FAUCET_ASSET_ID: AssetId = AssetId::new([0; 32]); pub const SERVICE_PORT: &str = "PORT"; pub const DEFAULT_PORT: u16 = 3000; diff --git a/src/lib.rs b/src/lib.rs index 7b952fc..5e65fe8 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -97,6 +97,7 @@ pub async fn start_server( let provider = Provider::connect(service_config.node_url.clone()) .await .expect("Should create a provider"); + let base_asset_id = *provider.consensus_parameters().base_asset_id(); // setup wallet let secret = service_config @@ -112,7 +113,7 @@ pub async fn start_server( ); let balance = wallet - .get_coins(service_config.dispense_asset_id) + .get_coins(base_asset_id) .await .expect("Failed to fetch initial balance from fuel core") .into_iter() diff --git a/src/routes.rs b/src/routes.rs index 670dc4a..58b9b2a 100644 --- a/src/routes.rs +++ b/src/routes.rs @@ -146,9 +146,13 @@ fn check_and_mark_dispense_limit( Ok(()) } -async fn get_coins(wallet: &WalletUnlocked, amount: u64) -> Result, DispenseError> { +async fn get_coins( + wallet: &WalletUnlocked, + base_asset_id: &AssetId, + amount: u64, +) -> Result, DispenseError> { wallet - .get_spendable_resources(AssetId::BASE, amount) + .get_spendable_resources(*base_asset_id, amount) .await .map_err(|e| { error( @@ -245,6 +249,7 @@ pub async fn dispense_tokens( }); let provider = wallet.provider().expect("client provider"); + let base_asset_id = *provider.consensus_parameters().base_asset_id(); let mut tx_id = None; for _ in 0..5 { @@ -253,7 +258,7 @@ pub async fn dispense_tokens( let coin_type = CoinType::Coin(Coin { amount: previous_coin_output.amount, block_created: 0u32, - asset_id: config.dispense_asset_id, + asset_id: base_asset_id, utxo_id: previous_coin_output.utxo_id, owner: previous_coin_output.owner.into(), status: CoinStatus::Unspent, @@ -261,17 +266,17 @@ pub async fn dispense_tokens( vec![Input::resource_signed(coin_type)] } else { - get_coins(&wallet, config.dispense_amount).await? + get_coins(&wallet, &base_asset_id, config.dispense_amount).await? }; let mut outputs = wallet.get_asset_outputs_for_amount( &address.into(), - config.dispense_asset_id, + base_asset_id, config.dispense_amount, ); let faucet_address: Address = wallet.address().into(); // Add an additional output to store the stable part of the fee change. - outputs.push(Output::coin(faucet_address, 0, config.dispense_asset_id)); + outputs.push(Output::coin(faucet_address, 0, base_asset_id)); let tip = guard.next_tip(); @@ -307,7 +312,7 @@ pub async fn dispense_tokens( "Overflow during calculating `TransactionFee`".to_string(), StatusCode::INTERNAL_SERVER_ERROR, ))?; - let available_balance = available_balance(&tx_builder.inputs, &config.dispense_asset_id); + let available_balance = available_balance(&tx_builder.inputs, &base_asset_id); let stable_fee_change = available_balance .checked_sub(fee.max_fee().saturating_add(config.dispense_amount)) .ok_or(error( @@ -316,7 +321,7 @@ pub async fn dispense_tokens( ))?; *tx_builder.outputs.last_mut().unwrap() = - Output::coin(faucet_address, stable_fee_change, config.dispense_asset_id); + Output::coin(faucet_address, stable_fee_change, base_asset_id); let script = tx_builder.build(provider).await.expect("Valid script"); @@ -388,10 +393,14 @@ pub async fn dispense_tokens( #[tracing::instrument(skip_all)] pub async fn dispense_info( Extension(config): Extension, + Extension(wallet): Extension, ) -> Result { + let provider = wallet.provider().expect("client provider"); + let base_asset_id = *provider.consensus_parameters().base_asset_id(); + Ok(DispenseInfoResponse { amount: config.dispense_amount, - asset_id: config.dispense_asset_id.to_string(), + asset_id: base_asset_id.to_string(), }) } diff --git a/tests/dispense.rs b/tests/dispense.rs index d0ad50f..9b56bd4 100644 --- a/tests/dispense.rs +++ b/tests/dispense.rs @@ -10,7 +10,7 @@ use fuel_faucet::config::Config; use fuel_faucet::models::DispenseInfoResponse; use fuel_faucet::{start_server, Clock, THE_BIGGEST_AMOUNT}; use fuel_tx::ConsensusParameters; -use fuel_types::{Address, AssetId}; +use fuel_types::Address; use fuels_accounts::provider::Provider; use fuels_accounts::wallet::WalletUnlocked; use fuels_core::types::bech32::Bech32Address; @@ -60,6 +60,7 @@ impl TestContext { let dispense_amount = rng.gen_range(1..10000u64); let secret_key: SecretKey = SecretKey::random(&mut rng); let wallet = WalletUnlocked::new_from_private_key(secret_key, None); + let base_asset_id = [1; 32].into(); let mut generator = CoinConfigGenerator::new(); let mut coins: Vec<_> = (0..10000) @@ -77,7 +78,7 @@ impl TestContext { coins.push(CoinConfig { owner: wallet.address().into(), amount: 1 << 50, - asset_id: Default::default(), + asset_id: base_asset_id, ..generator.generate() }); @@ -89,6 +90,7 @@ impl TestContext { let mut consensus_parameters = ConsensusParameters::default(); consensus_parameters .set_fee_params(fuel_tx::FeeParameters::default().with_gas_price_factor(1)); + consensus_parameters.set_base_asset_id(base_asset_id); let chain_config = ChainConfig { consensus_parameters, @@ -121,7 +123,6 @@ impl TestContext { node_url: format!("http://{}", fuel_node.bound_address), wallet_secret_key: Some(Secret::new(format!("{secret_key:x}"))), dispense_amount, - dispense_asset_id: AssetId::default(), ..Default::default() }; @@ -157,7 +158,11 @@ async fn can_start_server() { assert_eq!(response.amount, context.faucet_config.dispense_amount); assert_eq!( response.asset_id, - context.faucet_config.dispense_asset_id.to_string() + context + .provider + .consensus_parameters() + .base_asset_id() + .to_string() ); } @@ -208,7 +213,10 @@ async fn _dispense_sends_coins_to_valid_address( let test_balance: u64 = context .provider - .get_coins(&recipient_address, context.faucet_config.dispense_asset_id) + .get_coins( + &recipient_address, + *context.provider.consensus_parameters().base_asset_id(), + ) .await .unwrap() .iter() From 298d9aca7b3e7d02d0bbb17d81f92a57de200b43 Mon Sep 17 00:00:00 2001 From: Green Baneling Date: Fri, 31 May 2024 21:26:54 +0200 Subject: [PATCH 11/11] Fixes for the testnet faucet (#72) * - Use latest `fuel-core 0.27.0` and Rust SDK 0.63.0 - Removed caching of the coins from Rust SDK because it breaks the faucet if transaction is lost in the network. - Send dust coins to the user who claimed coins. * Make clippy happy --- Cargo.lock | 160 ++++++++++++++++++++++++---------------- Cargo.toml | 20 ++--- src/config.rs | 13 +++- src/constants.rs | 2 + src/dispense_tracker.rs | 2 +- src/lib.rs | 2 +- src/routes.rs | 54 ++++++++------ tests/dispense.rs | 77 ++++++++++--------- 8 files changed, 194 insertions(+), 136 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index dfc117e..9971fa8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -808,6 +808,7 @@ dependencies = [ "encode_unicode", "lazy_static", "libc", + "unicode-width", "windows-sys 0.45.0", ] @@ -1557,9 +1558,9 @@ checksum = "6c2141d6d6c8512188a7891b4b01590a45f6dac67afb4f255c4124dbb86d4eaa" [[package]] name = "fuel-abi-types" -version = "0.4.0" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2351bb0b743c23ac13ac2559756b3929502cd6e29091f2e5302fb9a1bdddaf35" +checksum = "e0e7e87f94417ff1a5d60e496906033c58bfe5367546621f131fe8cdabaa2671" dependencies = [ "itertools 0.10.5", "lazy_static", @@ -1574,9 +1575,9 @@ dependencies = [ [[package]] name = "fuel-asm" -version = "0.48.0" +version = "0.50.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20bc683784e35f3421aab3dc5a31a94c8ad80f1e9ec614ddddac930b4081cd92" +checksum = "db81c0bdf07b052d1c595b5ee71e20f0286ca3dc88c7ab3f775e08c8e055c34f" dependencies = [ "bitflags 2.4.1", "fuel-types", @@ -1586,9 +1587,9 @@ dependencies = [ [[package]] name = "fuel-core" -version = "0.24.3" +version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16acbaac42aceb26c704ed078314e7e7f9d1e20d6eaf147cada559e7e9f967ae" +checksum = "5ecef9aa6c04239c408e37613eb542f81cabb3a10a619b9c793312d38eed9e34" dependencies = [ "anyhow", "async-graphql", @@ -1614,6 +1615,7 @@ dependencies = [ "futures", "hex", "hyper", + "indicatif", "itertools 0.12.0", "rand", "serde", @@ -1622,7 +1624,6 @@ dependencies = [ "strum_macros 0.25.3", "thiserror", "tokio", - "tokio-rayon", "tokio-stream", "tokio-util", "tower-http 0.3.5", @@ -1632,12 +1633,13 @@ dependencies = [ [[package]] name = "fuel-core-chain-config" -version = "0.24.3" +version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23929afd8e279a463941ed18c8a23d9e29df4c3587ba19ad56c68f24c14484f5" +checksum = "16323762c4a5d58b11121580bee9f3a76ac7f655f95d727f957b05a9e35f477f" dependencies = [ "anyhow", "bech32", + "derivative", "fuel-core-storage", "fuel-core-types", "itertools 0.12.0", @@ -1651,9 +1653,9 @@ dependencies = [ [[package]] name = "fuel-core-client" -version = "0.24.3" +version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67d4a6c96cd1827d04361f8b76416273168efc9eb0951293b03bc18e52d409b6" +checksum = "f33af785942254f23e30a03a08a08ffb8eea645a87f06895e5d84f4205fc191a" dependencies = [ "anyhow", "cynic", @@ -1675,9 +1677,9 @@ dependencies = [ [[package]] name = "fuel-core-consensus-module" -version = "0.24.3" +version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b1d8ec2205453a563f9ac620867febb711c4ec7a930f063899f8c8673921417" +checksum = "85320bb1990ea54ad9fcda4c527c2e42651103c2332cb7ff0b51ecaa23b4c07a" dependencies = [ "anyhow", "fuel-core-chain-config", @@ -1688,9 +1690,9 @@ dependencies = [ [[package]] name = "fuel-core-database" -version = "0.24.3" +version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a87cc2351d5a3205d4a6673904bb3b876203540595e1746a1f466d5900b3c3e" +checksum = "d540b36b409d36ace39902509d55d0c758f9cfebc1bcbea07d7115b9923196c9" dependencies = [ "anyhow", "derive_more", @@ -1700,12 +1702,11 @@ dependencies = [ [[package]] name = "fuel-core-executor" -version = "0.24.3" +version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e159969d168d4b7cbaa9a55efb842604f0abe116d1baa0b0486c73f2261f63a" +checksum = "367ef0966c99cf1104035257023596256d61a3a5b58b8bac4dcb0bdc8e9b2459" dependencies = [ "anyhow", - "fuel-core-chain-config", "fuel-core-storage", "fuel-core-types", "hex", @@ -1716,13 +1717,12 @@ dependencies = [ [[package]] name = "fuel-core-importer" -version = "0.24.3" +version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b858caa4d262891964f55c09f86d6f93d368f7d9a073e5828e02616db88e014" +checksum = "4c7c89083930099a8dad11f5602d4bd935ff5db546ba600cbb9325f6b3bd78ac" dependencies = [ "anyhow", "derive_more", - "fuel-core-chain-config", "fuel-core-metrics", "fuel-core-storage", "fuel-core-types", @@ -1733,9 +1733,9 @@ dependencies = [ [[package]] name = "fuel-core-metrics" -version = "0.24.3" +version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "003381d1f9f5def3685171b340c4bb56d3681897f3baa616aaf6cf7085013462" +checksum = "2a47f442a32f2e5917066bbf9be3d6fd5d85252a131f1b5fc2f2f0ee75008066" dependencies = [ "axum", "once_cell", @@ -1747,9 +1747,9 @@ dependencies = [ [[package]] name = "fuel-core-p2p" -version = "0.24.3" +version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c513afe591125230e3fd9f6cdf1add00a2aba3f11a19e9e77e020ec14b863b6e" +checksum = "5cc6a321f2b1df5be84444ee8b12b647313a5b92a2589d06489bb2b00dbdb2e1" dependencies = [ "anyhow", "async-trait", @@ -1779,9 +1779,9 @@ dependencies = [ [[package]] name = "fuel-core-poa" -version = "0.24.3" +version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8608758b49855f33c3e6a78917dada96265233096aae04628d6c1ff9fe6d3dca" +checksum = "1f6185f492f9ddb65228db0f250b3f6384637ebf76b72fc81b2efb629d887912" dependencies = [ "anyhow", "async-trait", @@ -1796,9 +1796,9 @@ dependencies = [ [[package]] name = "fuel-core-producer" -version = "0.24.3" +version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c662d29fafeeb686057f3ba1f2cd349e3c437c32d59ae4f6c61400cee26f27e7" +checksum = "efad4ce5bc2f4542e3838a4256158fdd7c537d73e359ba589a4ea86e5c8a2ee0" dependencies = [ "anyhow", "async-trait", @@ -1812,9 +1812,9 @@ dependencies = [ [[package]] name = "fuel-core-services" -version = "0.24.3" +version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca69ccc3a055e0a645c7e76e0623feec6945d4cf95b4131a3a1bf1ffc076d1bb" +checksum = "d35200489fdcdafbe5a6a3a39baad4da523e5c004db9a885056be0137ee35098" dependencies = [ "anyhow", "async-trait", @@ -1827,9 +1827,9 @@ dependencies = [ [[package]] name = "fuel-core-storage" -version = "0.24.3" +version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fb47f4fabcec096b78137c782895a52aeed134f931256656511b10083cbd967" +checksum = "87f4e85b634f42fb53193da517b4a2efa8ac73031cdab653029a5b1d3725572d" dependencies = [ "anyhow", "derive_more", @@ -1851,18 +1851,18 @@ dependencies = [ [[package]] name = "fuel-core-txpool" -version = "0.24.3" +version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e62e3bf2e4ee38e248131293ad908d8ba82b7d02dff432f68bc49b252eda509" +checksum = "800ab382b81de3fa62858862acb25410fdba514fae9b3862065524ac25244678" dependencies = [ "anyhow", "async-trait", - "fuel-core-chain-config", "fuel-core-metrics", "fuel-core-services", "fuel-core-storage", "fuel-core-types", "futures", + "mockall", "parking_lot", "tokio", "tokio-rayon", @@ -1872,9 +1872,9 @@ dependencies = [ [[package]] name = "fuel-core-types" -version = "0.24.3" +version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "385b3c9e9d51ca11e129ec1c713ffd2f4f2f2ad89c16b1808a4c661887a88bfb" +checksum = "ffe21004dd036f4c454666e339bd0fc3b037535bbc5510321db2565087edd4fc" dependencies = [ "anyhow", "bs58", @@ -1891,9 +1891,9 @@ dependencies = [ [[package]] name = "fuel-core-upgradable-executor" -version = "0.24.3" +version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "123e31a87f925f6403cf960e04db1403c4093d0fbacb1a5a8333c2756b980a42" +checksum = "e7136365b6d48f78ea5ce6bbd3c3c79dece5777ec13a9b63ef4f56abeab6017e" dependencies = [ "fuel-core-executor", "fuel-core-storage", @@ -1902,9 +1902,9 @@ dependencies = [ [[package]] name = "fuel-crypto" -version = "0.48.0" +version = "0.50.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6112c726b5254cad831e61db36dcd0d83b28c50180ea22cb8815343fb162526" +checksum = "4ca73b3409086e772315625304cabd2eeec10e4bd1f8b8a99cc72e0aed755e5c" dependencies = [ "coins-bip32", "coins-bip39", @@ -1923,9 +1923,9 @@ dependencies = [ [[package]] name = "fuel-derive" -version = "0.48.0" +version = "0.50.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5896603b839f04f27e8bddbae2990dc799fb119f5e62973d6666b2ea1a4b036b" +checksum = "d8d6e66d1b68eb916640c12a1c6c40880e11fcf569359b04483d5e18237c5229" dependencies = [ "proc-macro2", "quote", @@ -1967,9 +1967,9 @@ dependencies = [ [[package]] name = "fuel-merkle" -version = "0.48.0" +version = "0.50.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8f75d97f6d43fbd15aa5ca0d594b33cc59ba5fd73ce42f4a10dfa9288a9a4a4" +checksum = "faa4b60ddfa51b64d02a1d71b0cf51488171d313b32ae3fb9f39f64ddd21791b" dependencies = [ "derive_more", "digest 0.10.7", @@ -1982,15 +1982,15 @@ dependencies = [ [[package]] name = "fuel-storage" -version = "0.48.0" +version = "0.50.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6899452bbf8b09d536b0adf98d6a28d1081ce38c3490fa2d8cc1dd47ba153351" +checksum = "beef5f12c40118e87ef6abf611c6bba5c88754e727fb825120ae7d0872123055" [[package]] name = "fuel-tx" -version = "0.48.0" +version = "0.50.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "305c12d87f47d139505cbbaee1effa7750ce171c9a4362d212f4f7a651902121" +checksum = "fc95857e761db34a50967f53af7a74be08130d210bd985c5585f36bd753d346c" dependencies = [ "bitflags 2.4.1", "derivative", @@ -2001,6 +2001,7 @@ dependencies = [ "fuel-types", "hashbrown 0.14.3", "itertools 0.10.5", + "postcard", "rand", "serde", "serde_json", @@ -2010,9 +2011,9 @@ dependencies = [ [[package]] name = "fuel-types" -version = "0.48.0" +version = "0.50.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d92d34c6625f0c3b88463f01027e836ba561125f6ccfb1402d12743fc7b2c96" +checksum = "0af9f9d8c9eb3f4e644731c829ee7da5c3cae0886864731089627af25e336cea" dependencies = [ "fuel-derive", "hex", @@ -2022,9 +2023,9 @@ dependencies = [ [[package]] name = "fuel-vm" -version = "0.48.0" +version = "0.50.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b06f02e86ebf357689e34412af34faf7f0d35a9b8b6ccb2ec42fd369559d6914" +checksum = "71df1a9ede5237febbc7864888f26365814327732ccd11002e9bddac1ce9a4e6" dependencies = [ "anyhow", "async-trait", @@ -2056,9 +2057,9 @@ dependencies = [ [[package]] name = "fuels-accounts" -version = "0.59.0" +version = "0.63.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4b6dc7ec73fcbc104c87a3da8b4980626259ad3f2e42f7bc6fe41ec5d26b3c0" +checksum = "0e17d23b925d3d5e21dc5428330695c596db356d4adfc90eadecc2a490d7d5ce" dependencies = [ "async-trait", "chrono", @@ -2080,9 +2081,9 @@ dependencies = [ [[package]] name = "fuels-code-gen" -version = "0.59.0" +version = "0.63.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bceeab1b698cc0cb6ef84e37f7df6981180bf4f2ef808c1b0304e3b92d509c5" +checksum = "86a7a5b4811f5563bb5c2485efc7653ed6ce465c452a1182ae9062aa13dd19af" dependencies = [ "Inflector", "fuel-abi-types", @@ -2096,9 +2097,9 @@ dependencies = [ [[package]] name = "fuels-core" -version = "0.59.0" +version = "0.63.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "294e432031c758701ba54bca0c3ed11c19718d4918e800e1c928c0a536194760" +checksum = "9774ae9b35f808fa18b92d0478a3b0acbea41011409efa3117f972dfe528ae09" dependencies = [ "async-trait", "bech32", @@ -2107,6 +2108,7 @@ dependencies = [ "fuel-asm", "fuel-core-chain-config", "fuel-core-client", + "fuel-core-types", "fuel-crypto", "fuel-tx", "fuel-types", @@ -2114,24 +2116,23 @@ dependencies = [ "fuels-macros", "hex", "itertools 0.12.0", + "postcard", "serde", "serde_json", - "sha2 0.10.8", "thiserror", "uint", ] [[package]] name = "fuels-macros" -version = "0.59.0" +version = "0.63.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "223ab0dff7a6b0710eede62d381c61acce15d464e9cf5bd6848d5a9803b6671c" +checksum = "ba92a701fa86eed843db68d991807207b8b3d47099d49fb82467e8900f680e01" dependencies = [ "fuels-code-gen", "itertools 0.12.0", "proc-macro2", "quote", - "rand", "syn 2.0.39", ] @@ -2816,6 +2817,19 @@ dependencies = [ "serde", ] +[[package]] +name = "indicatif" +version = "0.17.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "763a5a8f45087d6bcea4222e7b72c291a054edf80e4ef6efd2a4979878c7bea3" +dependencies = [ + "console", + "instant", + "number_prefix", + "portable-atomic", + "unicode-width", +] + [[package]] name = "inout" version = "0.1.3" @@ -3871,6 +3885,12 @@ dependencies = [ "syn 2.0.39", ] +[[package]] +name = "number_prefix" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3" + [[package]] name = "object" version = "0.32.1" @@ -4125,6 +4145,12 @@ dependencies = [ "universal-hash", ] +[[package]] +name = "portable-atomic" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7170ef9988bc169ba16dd36a7fa041e5c4cbeb6a35b76d4c03daded371eae7c0" + [[package]] name = "postcard" version = "1.0.8" @@ -5703,6 +5729,12 @@ dependencies = [ "tinyvec", ] +[[package]] +name = "unicode-width" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68f5e5f3158ecfd4b8ff6fe086db7c8467a2dfdac97fe420f2b7c4aa97af66d6" + [[package]] name = "unicode-xid" version = "0.2.4" diff --git a/Cargo.toml b/Cargo.toml index 0057f8b..ae249cc 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,11 +12,11 @@ description = "A token faucet for onboarding fuel users" [dependencies] anyhow = "1.0" axum = "0.5" -fuel-core-client = "0.24.3" -fuel-tx = "0.48.0" -fuel-types = "0.48.0" -fuels-accounts = { version = "0.59.0", features = ["coin-cache"] } -fuels-core = { version = "0.59.0" } +fuel-core-client = "0.27.0" +fuel-tx = "0.50.0" +fuel-types = "0.50.0" +fuels-accounts = { version = "0.63.0" } +fuels-core = { version = "0.63.0" } handlebars = "4.2" lazy_static = "1.4" memoize = "0.3.1" @@ -31,11 +31,11 @@ tracing = "0.1" tracing-subscriber = { version = "0.3", features = ["env-filter", "json"] } [dev-dependencies] -fuel-core = { version = "0.24.3", default-features = false, features = ["test-helpers"] } -fuel-core-txpool = "0.24.3" -fuel-crypto = "0.48.0" -fuel-tx = { version = "0.48.0", features = ["test-helpers"] } -fuel-types = { version = "0.48.0", features = ["random"] } +fuel-core = { version = "0.27.0", default-features = false, features = ["test-helpers"] } +fuel-core-txpool = "0.27.0" +fuel-crypto = "0.50.0" +fuel-tx = { version = "0.50.0", features = ["test-helpers"] } +fuel-types = { version = "0.50.0", features = ["random"] } futures = "0.3" insta = "1.14" rand = "0.8" diff --git a/src/config.rs b/src/config.rs index 697f08d..972dd57 100644 --- a/src/config.rs +++ b/src/config.rs @@ -1,8 +1,8 @@ use crate::constants::{ CAPTCHA_KEY, CAPTCHA_SECRET, DEFAULT_DISPENSE_INTERVAL, DEFAULT_FAUCET_DISPENSE_AMOUNT, - DEFAULT_NODE_URL, DEFAULT_PORT, DISPENSE_AMOUNT, DISPENSE_INTERVAL, FUEL_NODE_URL, - HUMAN_LOGGING, LOG_FILTER, PUBLIC_FUEL_NODE_URL, SERVICE_PORT, TIMEOUT_SECONDS, - WALLET_SECRET_KEY, + DEFAULT_NODE_URL, DEFAULT_NUMBER_OF_RETRIES, DEFAULT_PORT, DISPENSE_AMOUNT, DISPENSE_INTERVAL, + FUEL_NODE_URL, HUMAN_LOGGING, LOG_FILTER, NUMBER_OF_RETRIES, PUBLIC_FUEL_NODE_URL, + SERVICE_PORT, TIMEOUT_SECONDS, WALLET_SECRET_KEY, }; use secrecy::Secret; use std::env; @@ -18,6 +18,7 @@ pub struct Config { pub public_node_url: String, pub wallet_secret_key: Option>, pub dispense_amount: u64, + pub number_of_retries: u64, pub dispense_limit_interval: u64, pub timeout: u64, } @@ -42,12 +43,16 @@ impl Default for Config { .unwrap_or_else(|_| DEFAULT_FAUCET_DISPENSE_AMOUNT.to_string()) .parse::() .expect("expected a valid integer for DISPENSE_AMOUNT"), + number_of_retries: env::var(NUMBER_OF_RETRIES) + .unwrap_or_else(|_| DEFAULT_NUMBER_OF_RETRIES.to_string()) + .parse::() + .expect("expected a valid integer for NUMBER_OF_RETRIES"), dispense_limit_interval: env::var(DISPENSE_INTERVAL) .unwrap_or_else(|_| DEFAULT_DISPENSE_INTERVAL.to_string()) .parse::() .expect("expected a valid integer for DISPENSE_LIMIT_INTERVAL"), timeout: env::var(TIMEOUT_SECONDS) - .unwrap_or_else(|_| "30".to_string()) + .unwrap_or_else(|_| "10".to_string()) .parse::() .expect("expected a valid integer for TIMEOUT_SECONDS"), } diff --git a/src/constants.rs b/src/constants.rs index db8870e..8a53d93 100644 --- a/src/constants.rs +++ b/src/constants.rs @@ -9,9 +9,11 @@ pub const WALLET_SECRET_DEV_KEY: &str = pub const FUEL_NODE_URL: &str = "FUEL_NODE_URL"; pub const DEFAULT_NODE_URL: &str = "http://127.0.0.1:4000"; pub const DISPENSE_AMOUNT: &str = "DISPENSE_AMOUNT"; +pub const NUMBER_OF_RETRIES: &str = "NUMBER_OF_RETRIES"; pub const DISPENSE_INTERVAL: &str = "DISPENSE_LIMIT_INTERVAL"; pub const DEFAULT_DISPENSE_INTERVAL: u64 = 24 * 60 * 60; pub const DEFAULT_FAUCET_DISPENSE_AMOUNT: u64 = 10_000_000; +pub const DEFAULT_NUMBER_OF_RETRIES: u64 = 5; pub const SERVICE_PORT: &str = "PORT"; pub const DEFAULT_PORT: u16 = 3000; diff --git a/src/dispense_tracker.rs b/src/dispense_tracker.rs index 4ec62d2..70680f2 100644 --- a/src/dispense_tracker.rs +++ b/src/dispense_tracker.rs @@ -83,7 +83,7 @@ impl DispenseTracker { } pub fn has_tracked(&self, address: &Address) -> bool { - self.tracked.get(address).is_some() + self.tracked.contains_key(address) } pub fn is_in_progress(&self, address: &Address) -> bool { diff --git a/src/lib.rs b/src/lib.rs index 5e65fe8..1394df0 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -42,7 +42,6 @@ mod recaptcha; mod routes; pub use dispense_tracker::{Clock, StdTime}; -pub use routes::THE_BIGGEST_AMOUNT; #[derive(Debug, Copy, Clone)] pub struct CoinOutput { @@ -158,6 +157,7 @@ pub async fn start_server( .layer(TraceLayer::new_for_http()) .layer(Extension(Arc::new(wallet))) .layer(Extension(Arc::new(client))) + .layer(Extension(Arc::new(node_info.clone()))) .layer(Extension(Arc::new(tokio::sync::Mutex::new( FaucetState::new(&node_info.into()), )))) diff --git a/src/routes.rs b/src/routes.rs index 58b9b2a..202101a 100644 --- a/src/routes.rs +++ b/src/routes.rs @@ -7,6 +7,7 @@ use axum::{ Extension, Json, }; +use fuel_core_client::client::types::NodeInfo; use fuel_core_client::client::FuelClient; use fuel_tx::{Output, UtxoId}; use fuel_types::{Address, AssetId, Bytes32}; @@ -32,9 +33,6 @@ use std::{ }; use tracing::{error, info}; -// The amount to fetch the biggest input of the faucet. -pub const THE_BIGGEST_AMOUNT: u64 = u32::MAX as u64; - lazy_static::lazy_static! { static ref START_TIME: u64 = SystemTime::now().duration_since(UNIX_EPOCH).unwrap().as_millis() as u64; } @@ -197,6 +195,7 @@ pub async fn dispense_tokens( Extension(wallet): Extension, Extension(state): Extension, Extension(config): Extension, + Extension(info_node): Extension>, Extension(client): Extension>, Extension(dispense_tracker): Extension, ) -> Result { @@ -252,9 +251,11 @@ pub async fn dispense_tokens( let base_asset_id = *provider.consensus_parameters().base_asset_id(); let mut tx_id = None; - for _ in 0..5 { + for _ in 0..config.number_of_retries { let mut guard = state.lock().await; - let inputs = if let Some(previous_coin_output) = &guard.last_output { + let amount = guard.last_output.as_ref().map_or(0, |o| o.amount); + let inputs = if amount > config.dispense_amount { + let previous_coin_output = guard.last_output.expect("Checked above"); let coin_type = CoinType::Coin(Coin { amount: previous_coin_output.amount, block_created: 0u32, @@ -266,17 +267,24 @@ pub async fn dispense_tokens( vec![Input::resource_signed(coin_type)] } else { - get_coins(&wallet, &base_asset_id, config.dispense_amount).await? + get_coins( + &wallet, + &base_asset_id, + // Double the target amount to cover also the fee + config.dispense_amount * info_node.max_depth * 2, + ) + .await? }; - let mut outputs = wallet.get_asset_outputs_for_amount( - &address.into(), - base_asset_id, - config.dispense_amount, - ); + let recipient_address = address; let faucet_address: Address = wallet.address().into(); - // Add an additional output to store the stable part of the fee change. - outputs.push(Output::coin(faucet_address, 0, base_asset_id)); + let outputs = vec![ + Output::coin(recipient_address, config.dispense_amount, base_asset_id), + // Sends the dust change to the user + Output::change(recipient_address, 0, base_asset_id), + // Add an additional output to store the stable part of the fee change. + Output::coin(faucet_address, 0, base_asset_id), + ]; let tip = guard.next_tip(); @@ -308,17 +316,21 @@ pub async fn dispense_tokens( StatusCode::INTERNAL_SERVER_ERROR, ) })? - .ok_or(error( - "Overflow during calculating `TransactionFee`".to_string(), - StatusCode::INTERNAL_SERVER_ERROR, - ))?; + .ok_or_else(|| { + error( + "Overflow during calculating `TransactionFee`".to_string(), + StatusCode::INTERNAL_SERVER_ERROR, + ) + })?; let available_balance = available_balance(&tx_builder.inputs, &base_asset_id); let stable_fee_change = available_balance .checked_sub(fee.max_fee().saturating_add(config.dispense_amount)) - .ok_or(error( - "Not enough asset to cover a max fee".to_string(), - StatusCode::INTERNAL_SERVER_ERROR, - ))?; + .ok_or_else(|| { + error( + "Not enough asset to cover a max fee".to_string(), + StatusCode::INTERNAL_SERVER_ERROR, + ) + })?; *tx_builder.outputs.last_mut().unwrap() = Output::coin(faucet_address, stable_fee_change, base_asset_id); diff --git a/tests/dispense.rs b/tests/dispense.rs index 9b56bd4..03ddb0e 100644 --- a/tests/dispense.rs +++ b/tests/dispense.rs @@ -8,13 +8,15 @@ use fuel_core_client::client::pagination::{PageDirection, PaginationRequest}; use fuel_crypto::SecretKey; use fuel_faucet::config::Config; use fuel_faucet::models::DispenseInfoResponse; -use fuel_faucet::{start_server, Clock, THE_BIGGEST_AMOUNT}; +use fuel_faucet::{start_server, Clock}; use fuel_tx::ConsensusParameters; use fuel_types::Address; use fuels_accounts::provider::Provider; use fuels_accounts::wallet::WalletUnlocked; use fuels_core::types::bech32::Bech32Address; use fuels_core::types::transaction::TransactionType; +use futures::stream::FuturesUnordered; +use futures::StreamExt; use rand::rngs::StdRng; use rand::{Rng, SeedableRng}; use secrecy::Secret; @@ -56,31 +58,21 @@ struct TestContext { clock: MockClock, } impl TestContext { - async fn new(mut rng: StdRng) -> Self { - let dispense_amount = rng.gen_range(1..10000u64); - let secret_key: SecretKey = SecretKey::random(&mut rng); + async fn new(rng: &mut StdRng) -> Self { + let dispense_amount = 2000000; + let secret_key: SecretKey = SecretKey::random(rng); let wallet = WalletUnlocked::new_from_private_key(secret_key, None); let base_asset_id = [1; 32].into(); let mut generator = CoinConfigGenerator::new(); - let mut coins: Vec<_> = (0..10000) - .map(|_| { - // dust - CoinConfig { - owner: wallet.address().into(), - amount: THE_BIGGEST_AMOUNT - 1, - asset_id: rng.gen(), - ..generator.generate() - } + let coins: Vec<_> = (0..10000) + .map(|_| CoinConfig { + owner: wallet.address().into(), + amount: dispense_amount - 1, + asset_id: base_asset_id, + ..generator.generate() }) .collect(); - // main coin - coins.push(CoinConfig { - owner: wallet.address().into(), - amount: 1 << 50, - asset_id: base_asset_id, - ..generator.generate() - }); let state_config = StateConfig { coins, @@ -88,8 +80,12 @@ impl TestContext { }; let mut consensus_parameters = ConsensusParameters::default(); - consensus_parameters - .set_fee_params(fuel_tx::FeeParameters::default().with_gas_price_factor(1)); + consensus_parameters.set_fee_params( + // Values from the testnet + fuel_tx::FeeParameters::default() + .with_gas_price_factor(92) + .with_gas_per_byte(63), + ); consensus_parameters.set_base_asset_id(base_asset_id); let chain_config = ChainConfig { @@ -99,15 +95,16 @@ impl TestContext { let snapshot_reader = SnapshotReader::new_in_memory(chain_config, state_config); - let config = NodeConfig { + let mut config = NodeConfig { block_production: Trigger::Interval { block_time: Duration::from_secs(3), }, utxo_validation: true, - static_gas_price: 1, + static_gas_price: 20, snapshot_reader, ..NodeConfig::local_node() }; + config.txpool.max_depth = 32; // start node let fuel_node = FuelService::new_node(config).await.unwrap(); @@ -123,6 +120,7 @@ impl TestContext { node_url: format!("http://{}", fuel_node.bound_address), wallet_secret_key: Some(Secret::new(format!("{secret_key:x}"))), dispense_amount, + number_of_retries: 1, ..Default::default() }; @@ -141,7 +139,7 @@ impl TestContext { #[tokio::test] async fn can_start_server() { - let context = TestContext::new(StdRng::seed_from_u64(42)).await; + let context = TestContext::new(&mut StdRng::seed_from_u64(42)).await; let addr = context.addr; let client = reqwest::Client::new(); @@ -193,11 +191,11 @@ async fn dispense_sends_coins_to_valid_address_non_hex() { } async fn _dispense_sends_coins_to_valid_address( - rng: StdRng, + mut rng: StdRng, recipient_address: Bech32Address, recipient_address_str: String, ) { - let context = TestContext::new(rng).await; + let context = TestContext::new(&mut rng).await; let addr = context.addr; let client = reqwest::Client::new(); @@ -223,7 +221,7 @@ async fn _dispense_sends_coins_to_valid_address( .map(|coin| coin.amount) .sum(); - assert_eq!(test_balance, context.faucet_config.dispense_amount); + assert!(test_balance >= context.faucet_config.dispense_amount); } fn generate_recipient_addresses(count: usize, rng: &mut StdRng) -> Vec { @@ -238,9 +236,10 @@ fn generate_recipient_addresses(count: usize, rng: &mut StdRng) -> Vec { #[tokio::test] async fn many_concurrent_requests() { let mut rng = StdRng::seed_from_u64(42); - const COUNT: usize = 30; + + const COUNT: usize = 128; let recipient_addresses_str = generate_recipient_addresses(COUNT, &mut rng); - let context = TestContext::new(rng).await; + let context = TestContext::new(&mut rng).await; let addr = context.addr; let mut queries = vec![]; @@ -258,16 +257,24 @@ async fn many_concurrent_requests() { .await }); } - let queries = futures::future::join_all(queries).await; - for query in queries { - query.expect("Query should be successful"); + let mut queries = FuturesUnordered::from_iter(queries); + let mut success = 0; + while let Some(query) = queries.next().await { + let response = query.expect("Query should be successful"); + assert_eq!( + response.status(), + reqwest::StatusCode::CREATED, + "{success}/{COUNT}: {:?}", + response.bytes().await + ); + success += 1; } let txs = context .provider .get_transactions(PaginationRequest { cursor: None, - results: 1000, + results: 500, direction: PageDirection::Forward, }) .await @@ -285,7 +292,7 @@ async fn dispense_once_per_day() { let mut rng = StdRng::seed_from_u64(42); let recipient_address: Address = rng.gen(); let recipient_address_str = format!("{}", &recipient_address); - let context = TestContext::new(rng).await; + let context = TestContext::new(&mut rng).await; let addr = context.addr; let dispense_interval = 24 * 60 * 60;