libeufin

Integration and sandbox testing for FinTech APIs and data formats
Log | Files | Refs | Submodules | README | LICENSE

commit 057f40d6179c3cfdba1089de77fd6af85f2afdd5
parent f8e02d9730b6fd44e7b2cfb5104b610d921479ef
Author: Antoine A <>
Date:   Fri, 31 Jul 2026 10:43:18 +0200

common: sync with taler-rust

Diffstat:
MCargo.lock | 42+++++++++++++++++++++---------------------
Mlibeufin-bank/src/api/wire.rs | 12++++++------
Mlibeufin-bank/src/db/exchange.rs | 8++++----
Mlibeufin-bank/src/db/tx.rs | 25++++++++++---------------
Mlibeufin-nexus/src/api.rs | 12++++++------
Mlibeufin-nexus/src/db/exchange.rs | 1+
Mlibeufin-nexus/src/db/payment.rs | 8++++----
Mlibeufin-nexus/src/fetch.rs | 4+++-
8 files changed, 55 insertions(+), 57 deletions(-)

diff --git a/Cargo.lock b/Cargo.lock @@ -895,13 +895,13 @@ dependencies = [ [[package]] name = "displaydoc" -version = "0.2.6" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ac70aa55017e108007fbaf5aa0f54b021c98f92ff8af59d42eda9da96e3dd4f" +checksum = "c6232dd377dcc64799954cbd3a9bb882e9cdc1308ccd87b1c098f1fb2eaf82a8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.119", + "syn 3.0.3", ] [[package]] @@ -1322,9 +1322,9 @@ dependencies = [ [[package]] name = "http" -version = "1.4.2" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6970f50e31d6fc17d3fa27329444bfa74e196cf62e95052a3f6fee181dba6425" +checksum = "918d3568bebf352712bc2ef3d46a8bcf1a75b373be6539de198e9105cbbf9ce0" dependencies = [ "bytes", "itoa", @@ -1356,7 +1356,7 @@ dependencies = [ [[package]] name = "http-client" version = "1.5.0" -source = "git+git://git.taler.net/taler-rust.git/#0b262a884fa9afaf4b718cf7b841f0fa0a9dc62f" +source = "git+git://git.taler.net/taler-rust.git/#f8078cd31e1046e7ffd587b8ac6bf27793590f99" dependencies = [ "compact_str", "futures-util", @@ -1398,9 +1398,9 @@ checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "hybrid-array" -version = "0.4.13" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "818356c5132c1fede50f837ca96afbe78ff42413047f4abb886217845e1b6c8c" +checksum = "707114b52a152fa7bdb290cd7cd5912d9467273b6d74e21b8d81aca1f8533f6b" dependencies = [ "typenum", ] @@ -1930,7 +1930,7 @@ dependencies = [ "bitflags 2.13.1", "libc", "plain", - "redox_syscall 0.9.0", + "redox_syscall 0.9.1", ] [[package]] @@ -2571,9 +2571,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.9.0" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5102a6aaa05aa011a238e178e6bca86d2cb56fc9f586d37cb80f5bca6e07759" +checksum = "07507be7b4a5f9f26eeb41eeaebb1f5a7ff29dfb29739facc21d35bf8b11c21e" dependencies = [ "bitflags 2.13.1", ] @@ -2765,9 +2765,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.42" +version = "0.23.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c54fcab019b409d04215d3a17cb438fd7fbf192ee61461f20f4fe18704bc138" +checksum = "0283386ce02abc0151e1761d08802dfe86c173b0b494af5cbc086574e453da06" dependencies = [ "aws-lc-rs", "log", @@ -3467,7 +3467,7 @@ dependencies = [ [[package]] name = "taler-api" version = "1.5.0" -source = "git+git://git.taler.net/taler-rust.git/#0b262a884fa9afaf4b718cf7b841f0fa0a9dc62f" +source = "git+git://git.taler.net/taler-rust.git/#f8078cd31e1046e7ffd587b8ac6bf27793590f99" dependencies = [ "aws-lc-rs", "axum", @@ -3495,12 +3495,12 @@ dependencies = [ [[package]] name = "taler-build" version = "1.5.0" -source = "git+git://git.taler.net/taler-rust.git/#0b262a884fa9afaf4b718cf7b841f0fa0a9dc62f" +source = "git+git://git.taler.net/taler-rust.git/#f8078cd31e1046e7ffd587b8ac6bf27793590f99" [[package]] name = "taler-common" version = "1.5.0" -source = "git+git://git.taler.net/taler-rust.git/#0b262a884fa9afaf4b718cf7b841f0fa0a9dc62f" +source = "git+git://git.taler.net/taler-rust.git/#f8078cd31e1046e7ffd587b8ac6bf27793590f99" dependencies = [ "anyhow", "aws-lc-rs", @@ -3530,7 +3530,7 @@ dependencies = [ [[package]] name = "taler-macros" version = "1.5.0" -source = "git+git://git.taler.net/taler-rust.git/#0b262a884fa9afaf4b718cf7b841f0fa0a9dc62f" +source = "git+git://git.taler.net/taler-rust.git/#f8078cd31e1046e7ffd587b8ac6bf27793590f99" dependencies = [ "proc-macro2", "quote", @@ -3540,7 +3540,7 @@ dependencies = [ [[package]] name = "taler-test-utils" version = "1.5.0" -source = "git+git://git.taler.net/taler-rust.git/#0b262a884fa9afaf4b718cf7b841f0fa0a9dc62f" +source = "git+git://git.taler.net/taler-rust.git/#f8078cd31e1046e7ffd587b8ac6bf27793590f99" dependencies = [ "aws-lc-rs", "axum", @@ -3708,13 +3708,13 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "2.7.1" +version = "2.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6328af13490e73a9b4694030fafd93f8c8c6a9dede33e821c3fc63eddf8042ba" +checksum = "78773a2a397f451582ce068015985c33193cf6dea8b74d2a639fe457b2f07b0e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.119", + "syn 3.0.3", ] [[package]] diff --git a/libeufin-bank/src/api/wire.rs b/libeufin-bank/src/api/wire.rs @@ -33,7 +33,7 @@ use taler_api::{ constants::WIRE_GATEWAY_API_VERSION, error::{ApiResult, failure_code}, extract::{Path, Query, Req}, - subject::{IncomingSubject, fmt_in_subject}, + subject::{IncomingKey, fmt_in_subject}, }; use taler_common::{ api::{ @@ -92,7 +92,7 @@ async fn admin_add_incoming( username: &str, amount: &Amount, debtor: &PaytoURI, - metadata: &IncomingSubject, + metadata: &IncomingKey, ) -> ApiResult<Response> { let payto = BankPayto::try_from(debtor)?; match add_incoming( @@ -101,7 +101,7 @@ async fn admin_add_incoming( &payto, &format!( "Admin incoming {}", - fmt_in_subject(metadata.ty(), metadata.key()) + fmt_in_subject(metadata.ty, &metadata.key) ), username, &Timestamp::now(), @@ -331,7 +331,7 @@ pub fn wire_api() -> Router<Arc<BankState>> { &auth.username, &req.amount, &req.debit_account, - &IncomingSubject::Reserve(req.reserve_pub), + &IncomingKey::reserve(req.reserve_pub), ) .await }, @@ -349,7 +349,7 @@ pub fn wire_api() -> Router<Arc<BankState>> { &auth.username, &req.amount, &req.debit_account, - &IncomingSubject::Kyc(req.account_pub), + &IncomingKey::kyc(req.account_pub), ) .await }, @@ -367,7 +367,7 @@ pub fn wire_api() -> Router<Arc<BankState>> { &auth.username, &req.amount, &req.debit_account, - &IncomingSubject::Map(req.authorization_pub), + &IncomingKey::map(req.authorization_pub), ) .await }, diff --git a/libeufin-bank/src/db/exchange.rs b/libeufin-bank/src/db/exchange.rs @@ -25,7 +25,7 @@ use taler_api::{ db::{BindHelper, TypeHelper, history, page}, notification::NotificationChannel, serialized, - subject::{IncomingSubject, fmt_out_subject}, + subject::{IncomingKey, fmt_out_subject}, }; use taler_common::{ api::{ @@ -231,7 +231,7 @@ pub async fn add_incoming( subject: &str, username: &str, timestamp: &Timestamp, - metadata: &IncomingSubject, + metadata: &IncomingKey, ) -> sqlx::Result<AddIncomingResult> { serialized!( sqlx::query( @@ -250,13 +250,13 @@ pub async fn add_incoming( FROM taler_add_incoming($1,$2,$3,$4,$5,$6,$7::taler_incoming_type) ", ) - .bind(metadata.key()) + .bind(metadata.key) .bind(subject) .bind(amount) .bind(debtor.canonical()) .bind(username) .bind_timestamp(timestamp) - .bind(metadata.ty().as_ref()) + .bind(metadata.ty.as_ref()) .try_map(|r: PgRow| { Ok(if r.try_get_flag("out_creditor_not_found")? { AddIncomingResult::UnknownExchange diff --git a/libeufin-bank/src/db/tx.rs b/libeufin-bank/src/db/tx.rs @@ -25,7 +25,7 @@ use taler_api::{ db::{BindHelper, TypeHelper, history}, notification::NotificationChannel, serialized, - subject::{IncomingSubject, parse_incoming_unstructured}, + subject::{IncomingKey, IncomingSubject, parse_incoming_unstructured}, }; use taler_common::{ api::{ShortHashCode, params::History, revenue::RevenueIncomingBankTransaction}, @@ -64,19 +64,14 @@ pub async fn create( min_amount: Amount, max_amount: Amount, ) -> sqlx::Result<TxResult> { - let res = match parse_incoming_unstructured(subject) { - Ok(subject) => { - if IncomingSubject::AdminBalanceAdjust == subject { - Err("unsupported admin balance adjust".to_string()) - } else { - Ok(subject) - } - } - Err(e) => Err(format!("malformed metadata - {e}")), - }; - let (ty, metadata, cause) = match &res { - Ok(s) => (Some(s.ty()), Some(s.key()), None), - Err(e) => (None, None, Some(e)), + let (ty, metadata, cause) = match parse_incoming_unstructured(subject) { + Ok(IncomingSubject::Key(IncomingKey { ty, key })) => (Some(ty), Some(key), None), + Ok(IncomingSubject::AdminBalanceAdjust) => ( + None, + None, + Some("unsupported admin balance adjust".to_string()), + ), + Err(e) => (None, None, Some(format!("malformed metadata - {e}"))), }; serialized!( sqlx::query( @@ -112,7 +107,7 @@ pub async fn create( .bind(max_amount) .bind(ty.as_ref().map(|it| it.as_ref())) .bind(metadata) - .bind(cause) + .bind(&cause) .try_map(|r: PgRow| { Ok(if r.try_get_flag("out_creditor_not_found")? { TxResult::UnknownCreditor diff --git a/libeufin-nexus/src/api.rs b/libeufin-nexus/src/api.rs @@ -31,7 +31,7 @@ use taler_api::{ wire::WireGateway, }, error::{ApiResult, failure_code}, - subject::{IncomingSubject, fmt_in_subject, subject_fmt_qr_bill}, + subject::{IncomingKey, fmt_in_subject, subject_fmt_qr_bill}, }; use taler_common::{ api::{ @@ -118,7 +118,7 @@ impl TalerApi for NexusApi { async fn add_incoming( db: &PgPool, - subject: &IncomingSubject, + subject: &IncomingKey, amount: Amount, debit_account: PaytoURI, ) -> ApiResult<AddIncomingResponse> { @@ -136,7 +136,7 @@ async fn add_incoming( credit_fee: Amount::zero(&amount.currency), subject: Some(format!( "Manual incoming {}", - fmt_in_subject(subject.ty(), subject.key()) + fmt_in_subject(subject.ty, &subject.key) )), execution_time: now, debtor: Some(debit_account), @@ -218,7 +218,7 @@ impl WireGateway for NexusApi { ) -> ApiResult<AddIncomingResponse> { add_incoming( &self.pool, - &IncomingSubject::Reserve(req.reserve_pub), + &IncomingKey::reserve(req.reserve_pub), req.amount, req.debit_account, ) @@ -228,7 +228,7 @@ impl WireGateway for NexusApi { async fn add_incoming_kyc(&self, req: AddKycauthRequest) -> ApiResult<AddIncomingResponse> { add_incoming( &self.pool, - &IncomingSubject::Kyc(req.account_pub), + &IncomingKey::kyc(req.account_pub), req.amount, req.debit_account, ) @@ -238,7 +238,7 @@ impl WireGateway for NexusApi { async fn add_incoming_mapped(&self, req: AddMappedRequest) -> ApiResult<AddIncomingResponse> { add_incoming( &self.pool, - &IncomingSubject::Map(req.authorization_pub), + &IncomingKey::map(req.authorization_pub), req.amount, req.debit_account, ) diff --git a/libeufin-nexus/src/db/exchange.rs b/libeufin-nexus/src/db/exchange.rs @@ -96,6 +96,7 @@ pub async fn incoming_history( params, listen, || { + // What does the order do when it's finaly complete QueryBuilder::new( " SELECT diff --git a/libeufin-nexus/src/db/payment.rs b/libeufin-nexus/src/db/payment.rs @@ -21,7 +21,7 @@ use sqlx::{PgPool, Row as _, postgres::PgRow}; use taler_api::{ db::{BindHelper as _, TypeHelper as _}, serialized, - subject::{IncomingSubject, OutgoingSubject}, + subject::{IncomingKey, OutgoingSubject}, }; use taler_common::types::amount::Amount; @@ -154,7 +154,7 @@ pub async fn register_in(pool: &PgPool, payment: &InTx) -> sqlx::Result<InResult pub async fn register_in_talerable( pool: &PgPool, payment: &InTx, - subject: &IncomingSubject, + subject: &IncomingKey, ) -> sqlx::Result<IncomingRegistrationResult> { serialized!( sqlx::query( @@ -179,8 +179,8 @@ pub async fn register_in_talerable( .bind(payment.id.uetr) .bind(&payment.id.tx_id) .bind(&payment.id.sref) - .bind(subject.ty().as_ref()) - .bind(subject.key()) + .bind(subject.ty.as_ref()) + .bind(subject.key) .try_map(|r: PgRow| { Ok(if r.try_get_flag("out_reserve_pub_reuse")? { IncomingRegistrationResult::ReservePubReuse diff --git a/libeufin-nexus/src/fetch.rs b/libeufin-nexus/src/fetch.rs @@ -565,7 +565,9 @@ pub async fn register_incoming( let res = register_in(db, payment).await?; log_res(res, "admin balance adjust", ""); } - Ok(subject) => match register_in_talerable(db, payment, &subject).await? { + Ok(IncomingSubject::Key(subject)) => match register_in_talerable(db, payment, &subject) + .await? + { IncomingRegistrationResult::ReservePubReuse => bounce("reverse pub reuse").await?, IncomingRegistrationResult::MappingReuse => bounce("mapping reuse").await?, IncomingRegistrationResult::UnknownMapping => bounce("unknown mapping").await?,