From 0c1d60f3906609956d329a7b70c98994db996be0 Mon Sep 17 00:00:00 2001 From: scx1332 Date: Fri, 21 Jun 2024 13:33:05 +0200 Subject: [PATCH 01/13] Test build nightly --- .github/workflows/build_nigthly.yml | 31 +++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 .github/workflows/build_nigthly.yml diff --git a/.github/workflows/build_nigthly.yml b/.github/workflows/build_nigthly.yml new file mode 100644 index 00000000..ca69a95e --- /dev/null +++ b/.github/workflows/build_nigthly.yml @@ -0,0 +1,31 @@ +name: Build nightly + +on: + workflow_dispatch: + inputs: + build_profile: + description: 'Build profile' + required: true + default: 'release-fast' + +permissions: + contents: write + +jobs: + tag-release: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Get version from Cargo.toml + id: get_version + run: | + VERSION=$(grep '^version =' Cargo.toml | cut -d '"' -f2) + echo "VERSION=$VERSION" >> $GITHUB_OUTPUT + + - name: Create and push tag + run: | + git config user.name github-actions + git config user.email github-actions@github.com + git tag -a v${{ steps.get_version.outputs.VERSION }} -m "Release ${{ steps.get_version.outputs.VERSION }}" + #git push origin v${{ steps.get_version.outputs.VERSION }} From b59aeed5eeb8dd54793c74913d717b2d8bc84d58 Mon Sep 17 00:00:00 2001 From: scx1332 Date: Fri, 21 Jun 2024 13:35:07 +0200 Subject: [PATCH 02/13] Test build nightly --- .github/workflows/build_nigthly.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/build_nigthly.yml b/.github/workflows/build_nigthly.yml index ca69a95e..1fccb358 100644 --- a/.github/workflows/build_nigthly.yml +++ b/.github/workflows/build_nigthly.yml @@ -25,6 +25,7 @@ jobs: - name: Create and push tag run: | + echo "Created tag: v${{ steps.get_version.outputs.VERSION }}" git config user.name github-actions git config user.email github-actions@github.com git tag -a v${{ steps.get_version.outputs.VERSION }} -m "Release ${{ steps.get_version.outputs.VERSION }}" From c3eb4a9a1f91b7f85e821fb3993c53705f958e77 Mon Sep 17 00:00:00 2001 From: scx1332 Date: Fri, 21 Jun 2024 13:37:40 +0200 Subject: [PATCH 03/13] Test build nightly --- .github/workflows/build_nigthly.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build_nigthly.yml b/.github/workflows/build_nigthly.yml index 1fccb358..3137cb71 100644 --- a/.github/workflows/build_nigthly.yml +++ b/.github/workflows/build_nigthly.yml @@ -28,5 +28,5 @@ jobs: echo "Created tag: v${{ steps.get_version.outputs.VERSION }}" git config user.name github-actions git config user.email github-actions@github.com - git tag -a v${{ steps.get_version.outputs.VERSION }} -m "Release ${{ steps.get_version.outputs.VERSION }}" - #git push origin v${{ steps.get_version.outputs.VERSION }} + git tag -a v${{ steps.get_version.outputs.VERSION }}-nightly -m "Nightly release ${{ steps.get_version.outputs.VERSION }}" + git push origin v${{ steps.get_version.outputs.VERSION }}-nightly From 7de35d333e173288c6d188a082b2337482012123 Mon Sep 17 00:00:00 2001 From: scx1332 Date: Fri, 21 Jun 2024 13:47:48 +0200 Subject: [PATCH 04/13] Test build nightly --- .github/workflows/release.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 710de94a..ffcada18 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -3,6 +3,10 @@ on: push: tags: - "v*.*.*" + workflow_run: + workflows: ["Build nightly"] + types: + - completed permissions: packages: write From 42c9dbc7b72767f487e4ae0bf432dd099cef0cad Mon Sep 17 00:00:00 2001 From: scx1332 Date: Fri, 21 Jun 2024 13:52:29 +0200 Subject: [PATCH 05/13] Test build nightly --- .github/workflows/release.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index ffcada18..13381513 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -18,7 +18,11 @@ jobs: runs-on: ubuntu-latest steps: - name: Release - uses: softprops/action-gh-release@v1 + uses: softprops/action-gh-release@v2 + with: + tag_name: v0.4.5-nightly + title: "v0.4.5-nightly" + body: "Nightly release v0.4.5-nightly" frontend: name: Build frontend From c3e1affb3ee17496f30ac186aa6d6f293c9b8572 Mon Sep 17 00:00:00 2001 From: scx1332 Date: Mon, 29 Jul 2024 16:02:26 +0200 Subject: [PATCH 06/13] working on update api --- crates/erc20_payment_lib/src/runtime.rs | 172 +++++++++++++++++- .../20240729000000_add_payment_id_idx.sql | 2 + .../src/db/ops/token_transfer_ops.rs | 17 ++ 3 files changed, 186 insertions(+), 5 deletions(-) create mode 100644 crates/erc20_payment_lib_common/migrations/20240729000000_add_payment_id_idx.sql diff --git a/crates/erc20_payment_lib/src/runtime.rs b/crates/erc20_payment_lib/src/runtime.rs index 948c3552..140655ab 100644 --- a/crates/erc20_payment_lib/src/runtime.rs +++ b/crates/erc20_payment_lib/src/runtime.rs @@ -7,9 +7,9 @@ use crate::{err_custom_create, err_from}; use erc20_payment_lib_common::create_sqlite_connection; use erc20_payment_lib_common::ops::{ cleanup_allowance_tx, cleanup_token_transfer_tx, delete_tx, get_last_unsent_tx, - get_token_transfers_by_deposit_id, get_transaction_chain, get_transactions, - get_unpaid_token_transfers, insert_token_transfer, insert_token_transfer_with_deposit_check, - insert_tx, update_token_transfer, + get_token_transfer_by_payment_id, get_token_transfers_by_deposit_id, get_transaction_chain, + get_transactions, get_unpaid_token_transfers, insert_token_transfer, + insert_token_transfer_with_deposit_check, insert_tx, update_token_transfer, }; use std::collections::BTreeMap; use std::ops::DerefMut; @@ -389,6 +389,13 @@ pub struct TransferArgs { pub deposit_id: Option, } +#[derive(Debug, Clone)] +pub enum UpdateTransferResult { + SuccessTransferUpdated, + FailedTransferProcessed, + FailedTransferNotFound, +} + impl PaymentRuntime { fn start_service_loop( &self, @@ -939,6 +946,119 @@ impl PaymentRuntime { insert_token_transfer_with_deposit_check(&self.conn, &token_transfer).await?; + self.update_deadlines(transfer_args, account); + + Ok(()) + } + + pub async fn update_transfer_guess_account( + &self, + transfer_args: TransferArgs, + ) -> Result { + let account = { + self.shared_state + .lock() + .unwrap() + .accounts + .iter() + .find(|a| a.address == transfer_args.from) + .cloned() + }; + if let Some(account) = account { + self.update_transfer_with_account(&account, transfer_args) + .await + } else { + Err(err_custom_create!( + "Account {:#x} not found in active accounts", + transfer_args.from + )) + } + } + + pub async fn update_transfer_with_account( + &self, + account: &SignerAccount, + transfer_args: TransferArgs, + ) -> Result { + let chain_cfg = self + .config + .chain + .get(&transfer_args.network) + .ok_or(err_custom_create!( + "Chain {} not found in config file", + transfer_args.network + ))?; + + let token_addr = match transfer_args.tx_type { + TransferType::Token => { + let address = chain_cfg.token.address; + Some(address) + } + TransferType::Gas => None, + }; + + let mut db_trans = self + .conn + .begin() + .await + .map_err(|e| err_custom_create!("Error starting transaction: {}", e))?; + + let existing_token_transfer = match get_token_transfer_by_payment_id( + &mut *db_trans, + chain_cfg.chain_id, + &transfer_args.payment_id, + ) + .await + { + Ok(transfers) => transfers.into_iter().next(), + Err(e) => { + return Err(err_custom_create!( + "Error getting token transfers by payment id: {}", + e + )); + } + }; + + let Some(mut existing_token_transfer) = existing_token_transfer else { + return Ok(UpdateTransferResult::FailedTransferNotFound); + }; + + if let Err(err) = + assert_compare_token_transfer(&existing_token_transfer, &transfer_args, &token_addr) + { + log::error!("Requested token transfer does not match existing: {}", err); + return Err(err); + } + + let new_amount = transfer_args.amount; + let old_amount = existing_token_transfer.token_amount.as_str(); + + if new_amount.to_string() == old_amount { + log::info!("Transfer already updated - no change in amount"); + return Ok(UpdateTransferResult::SuccessTransferUpdated); + } + + if existing_token_transfer.paid_date.is_some() { + log::info!("Transfer already paid for - can't update amount"); + return Ok(UpdateTransferResult::FailedTransferProcessed); + } + if existing_token_transfer.tx_id.is_some() { + log::info!("Transfer already processed - can't update amount"); + return Ok(UpdateTransferResult::FailedTransferProcessed); + } + + existing_token_transfer.token_amount = new_amount.to_string(); + + update_token_transfer(&mut *db_trans, &existing_token_transfer) + .await + .map_err(|e| err_custom_create!("Error updating token transfer: {}", e))?; + + self.update_deadlines(transfer_args, account); + + Ok(UpdateTransferResult::SuccessTransferUpdated) + } + + fn update_deadlines(&self, transfer_args: TransferArgs, account: &SignerAccount) { if !self.setup.ignore_deadlines { if let Some(deadline) = transfer_args.deadline { let mut ext_gath_time_guard = account.external_gather_time.lock().unwrap(); @@ -952,8 +1072,6 @@ impl PaymentRuntime { } } } - - Ok(()) } pub async fn distribute_gas( @@ -1741,6 +1859,50 @@ pub async fn remove_last_unsent_transactions( } } } + +fn assert_compare_token_transfer( + existing_token_transfer: &TokenTransferDbObj, + transfer_args: &TransferArgs, + token_addr: &Option
, +) -> Result<(), PaymentError> { + let receiver_str = format!("{:#x}", transfer_args.receiver); + if existing_token_transfer.receiver_addr != receiver_str { + return Err(err_custom_create!( + "Receiver address mismatch: expected {}, got {:#x}", + existing_token_transfer.receiver_addr, + transfer_args.receiver + )); + } + + let sender_str = format!("{:#x}", transfer_args.from); + if existing_token_transfer.from_addr != sender_str { + return Err(err_custom_create!( + "Sender address mismatch: expected {}, got {:#x}", + existing_token_transfer.from_addr, + transfer_args.from + )); + } + + let token_addr = token_addr.map(|addr| format!("{addr:#x}")); + if existing_token_transfer.token_addr != token_addr { + return Err(err_custom_create!( + "Token address mismatch: expected {:?}, got {:?}", + existing_token_transfer.token_addr, + token_addr + )); + } + + if existing_token_transfer.deposit_id != transfer_args.deposit_id.map(|d| d.to_db_string()) { + return Err(err_custom_create!( + "Deposit ID mismatch: expected {:?}, got {:?}", + existing_token_transfer.deposit_id, + transfer_args.deposit_id + )); + } + + Ok(()) +} + pub async fn send_driver_event( event_sender: &Option>, event: DriverEventContent, diff --git a/crates/erc20_payment_lib_common/migrations/20240729000000_add_payment_id_idx.sql b/crates/erc20_payment_lib_common/migrations/20240729000000_add_payment_id_idx.sql new file mode 100644 index 00000000..f58ca766 --- /dev/null +++ b/crates/erc20_payment_lib_common/migrations/20240729000000_add_payment_id_idx.sql @@ -0,0 +1,2 @@ +-- It will be better to use unique index, but it is possible that can break some functionality +CREATE INDEX "idx_payment_id" ON "token_transfer" (payment_id); \ No newline at end of file diff --git a/crates/erc20_payment_lib_common/src/db/ops/token_transfer_ops.rs b/crates/erc20_payment_lib_common/src/db/ops/token_transfer_ops.rs index 4c55f100..0bcea14b 100644 --- a/crates/erc20_payment_lib_common/src/db/ops/token_transfer_ops.rs +++ b/crates/erc20_payment_lib_common/src/db/ops/token_transfer_ops.rs @@ -199,6 +199,23 @@ pub async fn get_all_token_transfers( Ok(rows) } +pub async fn get_token_transfer_by_payment_id<'c, E>( + executor: E, + chain_id: i64, + payment_id: &str, +) -> Result, sqlx::Error> +where + E: Executor<'c, Database = Sqlite>, +{ + sqlx::query_as::<_, TokenTransferDbObj>( + r"SELECT * FROM token_transfer WHERE chain_id = $1 AND payment_id = $2", + ) + .bind(chain_id) + .bind(payment_id) + .fetch_optional(executor) + .await +} + pub async fn get_token_transfers_by_chain_id( conn: &SqlitePool, chain_id: i64, From c363108f69c051781191a7de4867274b05debdb7 Mon Sep 17 00:00:00 2001 From: scx1332 Date: Mon, 29 Jul 2024 16:59:03 +0200 Subject: [PATCH 07/13] fix clippy --- crates/erc20_payment_lib/src/account_balance.rs | 1 + src/options.rs | 3 +++ 2 files changed, 4 insertions(+) diff --git a/crates/erc20_payment_lib/src/account_balance.rs b/crates/erc20_payment_lib/src/account_balance.rs index 5d66d121..d040afba 100644 --- a/crates/erc20_payment_lib/src/account_balance.rs +++ b/crates/erc20_payment_lib/src/account_balance.rs @@ -12,6 +12,7 @@ use web3::types::Address; #[derive(Clone, StructOpt)] #[structopt(about = "Payment statistics options")] +#[allow(unused)] pub struct BalanceOptions2 { #[structopt(short = "c", long = "chain-name", default_value = "mumbai")] pub chain_name: String, diff --git a/src/options.rs b/src/options.rs index 4bf8d52e..68b34992 100644 --- a/src/options.rs +++ b/src/options.rs @@ -101,6 +101,7 @@ pub struct GetDevEthOptions { #[derive(StructOpt)] #[structopt(about = "Mint test token options")] +#[allow(unused)] pub struct MintTestTokensOptions { #[structopt(short = "c", long = "chain-name", default_value = "holesky")] pub chain_name: String, @@ -120,6 +121,7 @@ pub struct MintTestTokensOptions { #[derive(StructOpt)] #[structopt(about = "Deposit token options")] +#[allow(unused)] pub struct DepositTokensOptions { #[structopt(short = "c", long = "chain-name", default_value = "holesky")] pub chain_name: String, @@ -149,6 +151,7 @@ pub struct DepositTokensOptions { #[derive(StructOpt)] #[structopt(about = "Withdraw token options")] +#[allow(unused)] pub struct WithdrawTokensOptions { #[structopt(short = "c", long = "chain-name", default_value = "holesky")] pub chain_name: String, From 0017813794829384638d79de4baa5ecb2ec872d9 Mon Sep 17 00:00:00 2001 From: scx1332 Date: Mon, 29 Jul 2024 17:01:32 +0200 Subject: [PATCH 08/13] fix clippy --- .github/workflows/build_nigthly.yml | 32 ----------------- src/options.rs | 55 ----------------------------- 2 files changed, 87 deletions(-) delete mode 100644 .github/workflows/build_nigthly.yml diff --git a/.github/workflows/build_nigthly.yml b/.github/workflows/build_nigthly.yml deleted file mode 100644 index 3137cb71..00000000 --- a/.github/workflows/build_nigthly.yml +++ /dev/null @@ -1,32 +0,0 @@ -name: Build nightly - -on: - workflow_dispatch: - inputs: - build_profile: - description: 'Build profile' - required: true - default: 'release-fast' - -permissions: - contents: write - -jobs: - tag-release: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - - name: Get version from Cargo.toml - id: get_version - run: | - VERSION=$(grep '^version =' Cargo.toml | cut -d '"' -f2) - echo "VERSION=$VERSION" >> $GITHUB_OUTPUT - - - name: Create and push tag - run: | - echo "Created tag: v${{ steps.get_version.outputs.VERSION }}" - git config user.name github-actions - git config user.email github-actions@github.com - git tag -a v${{ steps.get_version.outputs.VERSION }}-nightly -m "Nightly release ${{ steps.get_version.outputs.VERSION }}" - git push origin v${{ steps.get_version.outputs.VERSION }}-nightly diff --git a/src/options.rs b/src/options.rs index 4bf8d52e..55052eaf 100644 --- a/src/options.rs +++ b/src/options.rs @@ -118,61 +118,6 @@ pub struct MintTestTokensOptions { pub mint_loop_address: Option
, } -#[derive(StructOpt)] -#[structopt(about = "Deposit token options")] -pub struct DepositTokensOptions { - #[structopt(short = "c", long = "chain-name", default_value = "holesky")] - pub chain_name: String, - - #[structopt(long = "address", help = "Address (has to have private key)")] - pub address: Option
, - - #[structopt(long = "account-no", help = "Address by index (for convenience)")] - pub account_no: Option, - - #[structopt( - short = "a", - long = "amount", - help = "Amount (decimal, full precision, i.e. 0.01)" - )] - pub amount: Option, - - #[structopt(long = "all", help = "Deposit all available tokens")] - pub deposit_all: bool, - - #[structopt(long = "skip-allowance", help = "Skip allowance check")] - pub skip_allowance: bool, - - #[structopt(long = "skip-balance", help = "Skip balance check")] - pub skip_balance_check: bool, -} - -#[derive(StructOpt)] -#[structopt(about = "Withdraw token options")] -pub struct WithdrawTokensOptions { - #[structopt(short = "c", long = "chain-name", default_value = "holesky")] - pub chain_name: String, - - #[structopt(long = "address", help = "Address (has to have private key)")] - pub address: Option
, - - #[structopt(long = "account-no", help = "Address by index (for convenience)")] - pub account_no: Option, - - #[structopt( - short = "a", - long = "amount", - help = "Amount (decimal, full precision, i.e. 0.01)" - )] - pub amount: Option, - - #[structopt(long = "all", help = "Withdraw all available tokens")] - pub withdraw_all: bool, - - #[structopt(long = "skip-balance", help = "Skip balance check")] - pub skip_balance_check: bool, -} - #[derive(StructOpt)] #[structopt(about = "Distribute token (gas) options")] pub struct DistributeOptions { From 5b36600ac78ff9adc9beb713934c7fa4ed0e747d Mon Sep 17 00:00:00 2001 From: scx1332 Date: Mon, 29 Jul 2024 17:01:51 +0200 Subject: [PATCH 09/13] fix clippy --- src/options.rs | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/options.rs b/src/options.rs index 55052eaf..3d355664 100644 --- a/src/options.rs +++ b/src/options.rs @@ -110,12 +110,6 @@ pub struct MintTestTokensOptions { #[structopt(long = "account-no", help = "Address by index (for convenience)")] pub account_no: Option, - - #[structopt( - long = "mint-loop", - help = "Address where to sent tokens minted in the loop" - )] - pub mint_loop_address: Option
, } #[derive(StructOpt)] From da2947b6272596ebd348c3f37603f152dd389a05 Mon Sep 17 00:00:00 2001 From: scx1332 Date: Tue, 30 Jul 2024 19:36:46 +0200 Subject: [PATCH 10/13] forget about db commit --- crates/erc20_payment_lib/src/runtime.rs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/crates/erc20_payment_lib/src/runtime.rs b/crates/erc20_payment_lib/src/runtime.rs index 4b4a2946..448c1245 100644 --- a/crates/erc20_payment_lib/src/runtime.rs +++ b/crates/erc20_payment_lib/src/runtime.rs @@ -1046,6 +1046,11 @@ impl PaymentRuntime { .await .map_err(|e| err_custom_create!("Error updating token transfer: {}", e))?; + db_trans + .commit() + .await + .map_err(|e| err_custom_create!("Error committing transaction: {}", e))?; + self.update_deadlines(transfer_args, account); Ok(UpdateTransferResult::SuccessTransferUpdated) From ab2a20b5c8ce5e0c7f1963528f45831c737d5fcd Mon Sep 17 00:00:00 2001 From: scx1332 Date: Wed, 31 Jul 2024 20:06:39 +0200 Subject: [PATCH 11/13] Added trigger payments to API --- crates/erc20_payment_lib/src/runtime.rs | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/crates/erc20_payment_lib/src/runtime.rs b/crates/erc20_payment_lib/src/runtime.rs index 448c1245..b89659bb 100644 --- a/crates/erc20_payment_lib/src/runtime.rs +++ b/crates/erc20_payment_lib/src/runtime.rs @@ -1072,6 +1072,18 @@ impl PaymentRuntime { } } + pub fn trigger_payments(&self, deadline: DateTime, account: &SignerAccount) { + let mut ext_gath_time_guard = account.external_gather_time.lock().unwrap(); + let new_time = ext_gath_time_guard + .map(|t| t.min(deadline)) + .unwrap_or(deadline); + + if Some(new_time) != *ext_gath_time_guard { + *ext_gath_time_guard = Some(new_time); + self.wake.notify_one(); + } + } + pub async fn distribute_gas( &self, chain_name: &str, From bdff68dd64166feb88036dfacc806e7be4ad8b0b Mon Sep 17 00:00:00 2001 From: scx1332 Date: Wed, 31 Jul 2024 20:18:43 +0200 Subject: [PATCH 12/13] Added checks stubs --- crates/erc20_payment_lib/src/runtime.rs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/crates/erc20_payment_lib/src/runtime.rs b/crates/erc20_payment_lib/src/runtime.rs index b89659bb..5042b758 100644 --- a/crates/erc20_payment_lib/src/runtime.rs +++ b/crates/erc20_payment_lib/src/runtime.rs @@ -1084,6 +1084,16 @@ impl PaymentRuntime { } } + pub async fn check_if_pending_transfers(_account: &SignerAccount) -> Result { + panic!("Not implemented"); + //Ok(true) + } + + pub async fn check_if_payments_finished(_account: &SignerAccount) -> Result { + panic!("Not implemented"); + //Ok(true) + } + pub async fn distribute_gas( &self, chain_name: &str, From c96a829e44ad6b01ea80b2aef37adaab052ed8d3 Mon Sep 17 00:00:00 2001 From: scx1332 Date: Wed, 31 Jul 2024 20:54:27 +0200 Subject: [PATCH 13/13] trigger payment --- crates/erc20_payment_lib/src/runtime.rs | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/crates/erc20_payment_lib/src/runtime.rs b/crates/erc20_payment_lib/src/runtime.rs index 5042b758..ef34ee41 100644 --- a/crates/erc20_payment_lib/src/runtime.rs +++ b/crates/erc20_payment_lib/src/runtime.rs @@ -1072,15 +1072,22 @@ impl PaymentRuntime { } } - pub fn trigger_payments(&self, deadline: DateTime, account: &SignerAccount) { - let mut ext_gath_time_guard = account.external_gather_time.lock().unwrap(); - let new_time = ext_gath_time_guard - .map(|t| t.min(deadline)) - .unwrap_or(deadline); - - if Some(new_time) != *ext_gath_time_guard { - *ext_gath_time_guard = Some(new_time); - self.wake.notify_one(); + pub fn trigger_payments(&self, deadline: DateTime, account: Option) { + let accounts = if let Some(account) = account { + vec![account] + } else { + self.shared_state.lock().unwrap().accounts.to_vec() + }; + for account in accounts { + let mut ext_gath_time_guard = account.external_gather_time.lock().unwrap(); + let new_time = ext_gath_time_guard + .map(|t| t.min(deadline)) + .unwrap_or(deadline); + + if Some(new_time) != *ext_gath_time_guard { + *ext_gath_time_guard = Some(new_time); + self.wake.notify_one(); + } } }