diff --git a/.github/workflows/audit.yml b/.github/workflows/audit.yml index 4faea52c..93806d53 100644 --- a/.github/workflows/audit.yml +++ b/.github/workflows/audit.yml @@ -13,7 +13,8 @@ jobs: security_audit: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 - uses: actions-rust-lang/audit@v1 with: token: ${{ secrets.GITHUB_TOKEN }} + tool-version: 0.22.1 diff --git a/.github/workflows/cont_integration.yml b/.github/workflows/cont_integration.yml index 91496638..727f042b 100644 --- a/.github/workflows/cont_integration.yml +++ b/.github/workflows/cont_integration.yml @@ -2,6 +2,10 @@ on: [push, pull_request] name: CI +permissions: + contents: read +env: + CARGO_TERM_COLOR: always jobs: build-test: @@ -17,30 +21,41 @@ jobs: - --all-features steps: - name: Checkout - uses: actions/checkout@v4 - - name: Generate cache key - run: echo "${{ matrix.rust }} ${{ matrix.features }}" | tee .cache_key - - name: Cache - uses: actions/cache@v4 - with: - path: | - ~/.cargo/registry - ~/.cargo/git - target - key: ${{ runner.os }}-cargo-${{ hashFiles('.cache_key') }}-${{ hashFiles('**/Cargo.toml','**/Cargo.lock') }} + uses: actions/checkout@v6 - name: Setup Rust Toolchain - uses: actions-rs/toolchain@v1 + uses: actions-rust-lang/setup-rust-toolchain@v1 with: toolchain: ${{ matrix.rust }} profile: minimal override: true components: rustfmt, clippy + cache: true - name: Build run: cargo build ${{ matrix.features }} - - name: Clippy - run: cargo clippy -- -D warnings - name: Test run: cargo test ${{ matrix.features }} + clippy: + name: Clippy (${{ matrix.features }}) + runs-on: ubuntu-latest + strategy: + matrix: + features: + - --no-default-features + - --all-features + steps: + - name: Checkout + uses: actions/checkout@v6 + + - name: Install Rust toolchain + uses: actions-rust-lang/setup-rust-toolchain@v1 + with: + toolchain: stable + profile: minimal + override: true + components: clippy + cache: true + - name: Run Clippy + run: cargo clippy ${{ matrix.features }} --all-targets -- -D warnings # TODO: fix or remove this # wasm-build: @@ -82,13 +97,14 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Setup Rust Toolchain - uses: actions-rs/toolchain@v1 + uses: actions-rust-lang/setup-rust-toolchain@v1 with: toolchain: stable profile: minimal override: true components: rustfmt, clippy + cache: true - name: Check fmt run: cargo fmt --all -- --check diff --git a/Cargo.lock b/Cargo.lock index 98036e68..562d7683 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -569,9 +569,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.11.0" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b35204fbdc0b3f4446b89fc1ac2cf84a8a68971995d0bf2e925ec7cd960f9cb3" +checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" [[package]] name = "cc" diff --git a/Justfile b/Justfile index 48425958..d8ccf52d 100644 --- a/Justfile +++ b/Justfile @@ -25,6 +25,15 @@ build: fmt test: cargo test --all-features --tests +# checks before pushing +pre-push: + cargo test --features default + cargo test --no-default-features + cargo test --all-features + cargo clippy --no-default-features --all-targets -- -D warnings + cargo clippy --all-features --all-targets -- -D warnings + cargo fmt --all -- --check + # clean the project target directory clean: cargo clean diff --git a/src/error.rs b/src/error.rs index ee353ea4..3690d4f0 100644 --- a/src/error.rs +++ b/src/error.rs @@ -59,15 +59,15 @@ pub enum BDKCliError { #[cfg(feature = "sqlite")] #[error("Rusqlite error: {0}")] - RusqliteError(#[from] bdk_wallet::rusqlite::Error), + RusqliteError(Box), #[cfg(feature = "redb")] #[error("Redb StoreError: {0}")] - RedbStoreError(#[from] bdk_redb::error::StoreError), + RedbStoreError(Box), #[cfg(feature = "redb")] #[error("Redb dabtabase error: {0}")] - RedbDatabaseError(#[from] bdk_redb::redb::DatabaseError), + RedbDatabaseError(Box), #[error("Serde json error: {0}")] SerdeJson(#[from] serde_json::Error), @@ -147,3 +147,24 @@ impl From for BDKCliError { BDKCliError::PsbtExtractTxError(Box::new(value)) } } + +#[cfg(feature = "redb")] +impl From for BDKCliError { + fn from(err: bdk_redb::error::StoreError) -> Self { + BDKCliError::RedbStoreError(Box::new(err)) + } +} + +#[cfg(feature = "redb")] +impl From for BDKCliError { + fn from(err: bdk_redb::redb::DatabaseError) -> Self { + BDKCliError::RedbDatabaseError(Box::new(err)) + } +} + +#[cfg(feature = "sqlite")] +impl From for BDKCliError { + fn from(err: bdk_wallet::rusqlite::Error) -> Self { + BDKCliError::RusqliteError(Box::new(err)) + } +} diff --git a/src/handlers.rs b/src/handlers.rs index 47402456..2138e4c0 100644 --- a/src/handlers.rs +++ b/src/handlers.rs @@ -1156,6 +1156,7 @@ pub fn handle_wallets_subcommand(datadir: &Path, pretty: bool) -> Result PayjoinManager<'a> { let persister = payjoin::persist::NoopSessionPersister::::default(); let checked_max_fee_rate = max_fee_rate - .map(|rate| FeeRate::from_sat_per_kwu(rate)) + .map(FeeRate::from_sat_per_kwu) .unwrap_or(FeeRate::BROADCAST_MIN); let receiver = payjoin::receive::v2::ReceiverBuilder::new( @@ -275,7 +275,7 @@ impl<'a> PayjoinManager<'a> { .await } ReceiveSession::HasReplyableError(error) => self.handle_error(error, persister).await, - ReceiveSession::Closed(_) => return Err(Error::Generic("Session closed".to_string())), + ReceiveSession::Closed(_) => Err(Error::Generic("Session closed".to_string())), } } @@ -305,8 +305,7 @@ impl<'a> PayjoinManager<'a> { } Err(e) => { return Err(Error::Generic(format!( - "Error occurred when polling for Payjoin proposal from the directory: {}", - e.to_string() + "Error occurred when polling for Payjoin proposal from the directory: {e}" ))); } } @@ -609,16 +608,12 @@ impl<'a> PayjoinManager<'a> { return Err(ImplementationError::from("Cannot find the transaction in the mempool or the blockchain")); }; - let is_seen = match tx_details.chain_position { - bdk_wallet::chain::ChainPosition::Confirmed { .. } => true, - bdk_wallet::chain::ChainPosition::Unconfirmed { first_seen: Some(_), .. } => true, - _ => false - }; + let is_seen = matches!(tx_details.chain_position, bdk_wallet::chain::ChainPosition::Confirmed { .. } | bdk_wallet::chain::ChainPosition::Unconfirmed { first_seen: Some(_), .. }); if is_seen { return Ok(Some(tx_details.tx.as_ref().clone())); } - return Err(ImplementationError::from("Cannot find the transaction in the mempool or the blockchain")); + Err(ImplementationError::from("Cannot find the transaction in the mempool or the blockchain")) }, |outpoint| { let utxo = self.wallet.get_utxo(outpoint); diff --git a/src/utils.rs b/src/utils.rs index 448675a2..76e56a0f 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -158,7 +158,7 @@ pub(crate) enum BlockchainClient { }, #[cfg(feature = "cbf")] - KyotoClient { client: KyotoClientHandle }, + KyotoClient { client: Box }, } /// Handle for the Kyoto client after the node has been started. @@ -195,7 +195,7 @@ pub(crate) fn new_blockchain_client( } #[cfg(feature = "esplora")] ClientType::Esplora => { - let client = bdk_esplora::esplora_client::Builder::new(&url).build_async()?; + let client = bdk_esplora::esplora_client::Builder::new(url).build_async()?; BlockchainClient::Esplora { client: Box::new(client), parallel_requests: wallet_opts.parallel_requests, @@ -245,10 +245,10 @@ pub(crate) fn new_blockchain_client( ); BlockchainClient::KyotoClient { - client: KyotoClientHandle { + client: Box::new(KyotoClientHandle { requester, update_subscriber: tokio::sync::Mutex::new(update_subscriber), - }, + }), } } };