Files
cdk/crates/cdk
thesimplekid 3c4fce5c45 feat: add keyset u32 mapping migration (#926)
* feat: add keyset u32 mapping migration and duplicate handling

- Add new database migration (version 3) to include u32 representation for keysets
- Implement migration for both redb and SQL databases
- Add duplicate detection and handling for keyset entries
- Create unique index constraint for keyset_u32 column in SQL
- Update keyset storage to include u32 identifiers
- Handle backwards compatibility for existing databases

* chore: clippy

* refactor(cashu): simplify keyset ID verification logic

- Consolidate match expression into a single expression
- Use direct comparison with ensure_cdk macro
- Improve readability of keyset ID validation

* refactor(cdk): rename `fetch_keyset_keys` to `load_keyset_keys` for clarity

- Renamed `fetch_keyset_keys` to `load_keyset_keys` across multiple modules to better reflect its behavior of loading keys from local storage or fetching from mint when missing.
- Added debug logging to indicate when keys are being fetched from the mint.
- Simplified key loading logic in `update_mint_keysets` by removing redundant existence checks.

* chore: remove unused vec
2025-07-31 10:04:38 -04:00
..
2024-08-29 15:09:59 +01:00
2025-07-13 18:48:35 +01:00

CDK (Cashu Development Kit)

crates.io Documentation MIT licensed

ALPHA This library is in early development, the API will change and should be used with caution.

The core implementation of the Cashu protocol for building wallets and mints. It builds upon the primitives defined in the cashu crate and provides higher-level abstractions for working with the Cashu ecosystem.

Crate Feature Flags

The following crate feature flags are available:

Feature Default Description
wallet Yes Enable cashu wallet features
mint Yes Enable cashu mint wallet features
auth Yes Enable blind and clear auth

Implemented NUTs:

See https://github.com/cashubtc/cdk/blob/main/README.md

Components

The crate includes several key modules:

  • wallet: Implementation of the Cashu wallet
  • mint: Implementation of the Cashu mint
  • database: Database abstractions for persistent storage
  • payment: Payment processing functionality
  • nuts: Implementation of the Cashu NUTs

Usage

Add this to your Cargo.toml:

[dependencies]
cdk = "*"

Example

//! Wallet example with memory store
//! Note: This example requires the "wallet" feature to be enabled (enabled by default)

use std::sync::Arc;
use std::time::Duration;

#[cfg(feature = "wallet")]
use cdk::amount::SplitTarget;
use cdk_sqlite::wallet::memory;
use cdk::nuts::{CurrencyUnit, MintQuoteState};
#[cfg(feature = "wallet")]
use cdk::wallet::Wallet;
#[cfg(feature = "wallet")]
use cdk::wallet::SendOptions;
use cdk::Amount;
use rand::random;
use tokio::time::sleep;

#[tokio::main]
async fn main() {
    #[cfg(feature = "wallet")]
    {
        let seed = random::<[u8; 32]>();

        let mint_url = "https://fake.thesimplekid.dev";
        let unit = CurrencyUnit::Sat;
        let amount = Amount::from(10);

        let localstore = memory::empty().await.unwrap();

        let wallet = Wallet::new(mint_url, unit, Arc::new(localstore), &seed, None).unwrap();

        let quote = wallet.mint_quote(amount, None).await.unwrap();

        println!("Pay request: {}", quote.request);

        loop {
            let status = wallet.mint_quote_state(&quote.id).await.unwrap();

            if status.state == MintQuoteState::Paid {
                break;
            }

            println!("Quote state: {}", status.state);

            sleep(Duration::from_secs(5)).await;
        }

        let receive_amount = wallet
            .mint(&quote.id, SplitTarget::default(), None)
            .await
            .unwrap();

        println!("Minted {:?}", receive_amount);

        // Send the token
        let prepared_send = wallet.prepare_send(Amount::ONE, SendOptions::default()).await.unwrap();
        let token = prepared_send.confirm(None).await.unwrap();

        println!("{}", token);
    }
}

See more examples in the examples folder.

Minimum Supported Rust Version (MSRV)

The cdk library should always compile with any combination of features on Rust 1.75.0.

To build and test with the MSRV you will need to pin the below dependency versions:

    cargo update -p async-compression --precise 0.4.3
    cargo update -p zstd-sys --precise 2.0.8+zstd.1.5.5
    cargo update -p flate2 --precise 1.0.35
    cargo update -p home --precise 0.5.5
    cargo update -p zerofrom --precise 0.1.5
    cargo update -p half --precise 2.4.1
    cargo update -p url --precise 2.5.2
    # For wasm32-unknown-unknown target
    cargo update -p triomphe --precise 0.1.11

License

This project is licensed under the MIT License.