libeufin

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

commit 1fb1010919fed0f0adb9927650b598e8a4476cb7
parent 8985f9026c19c1a92a4678ce934eee8d0041cf5e
Author: Antoine A <>
Date:   Tue, 30 Jun 2026 17:29:08 +0200

prepared-transfer-api: new signatures

Diffstat:
MCargo.lock | 81++++++++++++++++++++++++++++++++++++++++---------------------------------------
Mlibeufin-bank/src/api/prepared.rs | 50+++++++++++++++++++++++++++++++++++---------------
Mlibeufin-bank/src/api/wire.rs | 2+-
Mlibeufin-bank/src/bench.rs | 46+++++++++++++++++++++++++++-------------------
Mlibeufin-bank/src/db/exchange.rs | 4++--
Mlibeufin-ebics/src/xml_sign.rs | 6+++---
Mlibeufin-nexus/src/bench.rs | 56+++++++++++++++++++++++++++++++++-----------------------
Mlibeufin-nexus/src/db/exchange.rs | 4++--
Mlibeufin-nexus/src/db/payment.rs | 78+++++++++++++++++++++++++++++++++---------------------------------------------
9 files changed, 177 insertions(+), 150 deletions(-)

diff --git a/Cargo.lock b/Cargo.lock @@ -84,9 +84,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.102" +version = "1.0.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c" +checksum = "2a4385e2e34eb35d6b3efe798b9eb88096925d87726c0798709bf56d9ed84af3" [[package]] name = "asn1-rs" @@ -175,9 +175,9 @@ checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" [[package]] name = "aws-lc-rs" -version = "1.17.0" +version = "1.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ec2f1fc3ec205783a5da9a7e6c1509cc69dedf09a1949e412c1e18469326d00" +checksum = "4342d8937fc7e5dd9b1c60292261c0670c882a2cd1719cfc11b1af41731e32ad" dependencies = [ "aws-lc-sys", "untrusted 0.7.1", @@ -186,14 +186,15 @@ dependencies = [ [[package]] name = "aws-lc-sys" -version = "0.41.0" +version = "0.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a2f9779ce85b93ab6170dd940ad0169b5766ff848247aff13bb788b832fe3f4" +checksum = "6d9ceb1da931507a12f4fccea479dccd00da1943e1b4ae72d8e502d707361444" dependencies = [ "cc", "cmake", "dunce", "fs_extra", + "pkg-config", ] [[package]] @@ -402,9 +403,9 @@ checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" [[package]] name = "chacha20" -version = "0.10.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f8d983286843e49675a4b7a2d174efe136dc93a18d69130dd18198a6c167601" +checksum = "d524456ba66e72eb8b115ff89e01e497f8e6d11d78b70b1aa13c0fbd97540a81" dependencies = [ "cfg-if", "cpufeatures 0.3.0", @@ -1336,7 +1337,7 @@ dependencies = [ [[package]] name = "http-client" version = "1.5.0" -source = "git+git://git.taler.net/taler-rust.git/#e8a8977ada44fe6015d5a50eb8db63e3dfe693f2" +source = "git+git://git.taler.net/taler-rust.git/#2a7d903ae13ef097b4503df7394d936d3ee8265f" dependencies = [ "compact_str", "futures-util", @@ -1378,9 +1379,9 @@ checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "hybrid-array" -version = "0.4.12" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9155a582abd142abc056962c29e3ce5ff2ad5469f4246b537ed42c5deba857da" +checksum = "818356c5132c1fede50f837ca96afbe78ff42413047f4abb886217845e1b6c8c" dependencies = [ "typenum", ] @@ -1629,9 +1630,9 @@ checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" [[package]] name = "jiff" -version = "0.2.29" +version = "0.2.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34f877a98676d2fb664698d74cc6a51ce6c484ce8c770f05d0108ec9090aeb46" +checksum = "ccfe6121cbe750cf81efa362d85c0bde7ea298ec43092d3a193baca59cdbd634" dependencies = [ "defmt", "jiff-static", @@ -1643,9 +1644,9 @@ dependencies = [ [[package]] name = "jiff-static" -version = "0.2.29" +version = "0.2.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0666b5ab5ecaca213fc2a85b8c0083d9004e84ee2d5f9a7e0017aaf50986f25f" +checksum = "e165e897f662d428f3cd3828a919dbe067c2d42bb1031eede74ef9d27ecdedd2" dependencies = [ "proc-macro2", "quote", @@ -1713,9 +1714,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.102" +version = "0.3.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03d04c30968dffe80775bd4d7fb676131cd04a1fb46d2686dbffbaec2d9dfd31" +checksum = "53b44bfcdb3f8d5837a46dae1ca9660a837176eee74a28b229bc626816589102" dependencies = [ "cfg-if", "futures-util", @@ -3440,7 +3441,7 @@ dependencies = [ [[package]] name = "taler-api" version = "1.5.0" -source = "git+git://git.taler.net/taler-rust.git/#e8a8977ada44fe6015d5a50eb8db63e3dfe693f2" +source = "git+git://git.taler.net/taler-rust.git/#2a7d903ae13ef097b4503df7394d936d3ee8265f" dependencies = [ "aws-lc-rs", "axum", @@ -3467,12 +3468,12 @@ dependencies = [ [[package]] name = "taler-build" version = "1.5.0" -source = "git+git://git.taler.net/taler-rust.git/#e8a8977ada44fe6015d5a50eb8db63e3dfe693f2" +source = "git+git://git.taler.net/taler-rust.git/#2a7d903ae13ef097b4503df7394d936d3ee8265f" [[package]] name = "taler-common" version = "1.5.0" -source = "git+git://git.taler.net/taler-rust.git/#e8a8977ada44fe6015d5a50eb8db63e3dfe693f2" +source = "git+git://git.taler.net/taler-rust.git/#2a7d903ae13ef097b4503df7394d936d3ee8265f" dependencies = [ "anyhow", "aws-lc-rs", @@ -3501,7 +3502,7 @@ dependencies = [ [[package]] name = "taler-macros" version = "1.5.0" -source = "git+git://git.taler.net/taler-rust.git/#e8a8977ada44fe6015d5a50eb8db63e3dfe693f2" +source = "git+git://git.taler.net/taler-rust.git/#2a7d903ae13ef097b4503df7394d936d3ee8265f" dependencies = [ "proc-macro2", "quote", @@ -3511,7 +3512,7 @@ dependencies = [ [[package]] name = "taler-test-utils" version = "1.5.0" -source = "git+git://git.taler.net/taler-rust.git/#e8a8977ada44fe6015d5a50eb8db63e3dfe693f2" +source = "git+git://git.taler.net/taler-rust.git/#2a7d903ae13ef097b4503df7394d936d3ee8265f" dependencies = [ "aws-lc-rs", "axum", @@ -3604,9 +3605,9 @@ dependencies = [ [[package]] name = "time" -version = "0.3.51" +version = "0.3.52" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85c17d80feb7334b40c484e45ed1a5273dfd8bfda537c3be2e74a06a6686f327" +checksum = "0e48db7b415311b615f910b3dcaa4557bcd4bf1982379c95c223fd8c2a20e210" dependencies = [ "deranged", "num-conv", @@ -3624,9 +3625,9 @@ checksum = "9e1c906769ad99c88eaa54e728060edef082f8e358ff32030cb7c7d315e81109" [[package]] name = "time-macros" -version = "0.2.30" +version = "0.2.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcef1a61bdb119096e153208ec5cbec23944ce8bca13be5c7f60c634f7403935" +checksum = "c431b87111666e491a90baa837f914fb45cd5dc3c268591b0220ff5057f2085f" dependencies = [ "num-conv", "time-core", @@ -4007,9 +4008,9 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.23.3" +version = "1.23.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "144d6b123cef80b301b8f72a9e2ca4370ddec21950d0a103dd22c437006d2db7" +checksum = "bf80a72845275afea99e7f2b434723d3bc7e38470fcd1c7ed39a599c73319a53" dependencies = [ "getrandom 0.4.3", "js-sys", @@ -4087,9 +4088,9 @@ checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" [[package]] name = "wasm-bindgen" -version = "0.2.125" +version = "0.2.126" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ddb3f79143bced6de84270411622a2699cee572fc0875aeaf1e7867cf9fca1a" +checksum = "4b067c0c11094aef6b7a801c1e34a26affafdf3d051dba08456b868789aaf9a4" dependencies = [ "cfg-if", "once_cell", @@ -4100,9 +4101,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.75" +version = "0.4.76" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "503b14d284f2c8dac03b819967e155ea753f573586193b2b2c95990cb5d69280" +checksum = "c62df1340f32221cb9c54d6a27b030e3dba64361d4a95bed55f9aacb44da291d" dependencies = [ "js-sys", "wasm-bindgen", @@ -4110,9 +4111,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.125" +version = "0.2.126" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e21a184b13fb19e157296e2c46056aec9092264fab83e4ba59e68c61b323c3d" +checksum = "167ce5e579f6bcf889c4f7175a8a5a585de84e8ff93976ce393efa5f2837aab1" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -4120,9 +4121,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.125" +version = "0.2.126" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fecefd9c35bd935a20fc3fc344b5f29138961e4f47fb03297d88f2587afb5ebd" +checksum = "f3997c7839262f4ef12cf90b818d6340c18e80f263f1a94bf157d0ec4420380e" dependencies = [ "bumpalo", "proc-macro2", @@ -4133,18 +4134,18 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.125" +version = "0.2.126" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23939e44bb9a5d7576fa2b563dc2e136628f1224e88a8deed09e04858b77871f" +checksum = "dc1b4cb0cc549fcf58d7dfc081778139b3d283a081644e833e84682ad71cea24" dependencies = [ "unicode-ident", ] [[package]] name = "web-sys" -version = "0.3.102" +version = "0.3.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6430a72df5eb332242960fe84b3002a241163998241eb596d4f739b9757061d" +checksum = "8622dcb61c0bcc9fffa6938bed81210af2da9a7e4a1a834b2e37a59b6dfb6141" dependencies = [ "js-sys", "wasm-bindgen", diff --git a/libeufin-bank/src/api/prepared.rs b/libeufin-bank/src/api/prepared.rs @@ -126,10 +126,17 @@ pub fn prepared_api() -> Router<Arc<BankState>> { mod test { use aws_lc_rs::signature::{Ed25519KeyPair, KeyPair as _}; use sqlx::{Row as _, postgres::PgRow}; - use taler_api::{crypto::eddsa_sign, db::TypeHelper as _}; - use taler_common::{api::EddsaPublicKey, db::IncomingType, error_code::ErrorCode}; + use taler_api::db::TypeHelper as _; + use taler_common::{ + api::{ + EddsaPublicKey, EddsaSignature, + prepared::{PublicKeyAlg, RegistrationRequest, TransferType}, + }, + db::IncomingType, + error_code::ErrorCode, + types::amount::{Amount, Currency}, + }; use taler_test_utils::{ - json, routine::{Status, registration_routine}, server::TestServer as _, }; @@ -142,22 +149,35 @@ mod test { let key_pair1 = Ed25519KeyPair::generate().unwrap(); let auth_pub1 = EddsaPublicKey::try_from(key_pair1.public_key().as_ref()).unwrap(); - let req = json!({ - "credit_account": ctx.exchange_payto, - "credit_amount": "KUDOS:120", - "type": "reserve", - "alg": "EdDSA", - "account_pub": auth_pub1, - "authorization_pub": auth_pub1, - "authorization_sig": eddsa_sign(&key_pair1, auth_pub1.as_ref()), - "recurrent": false - }); + let req = RegistrationRequest { + credit_account: ctx.exchange_payto.as_uri(), + r#type: TransferType::reserve, + recurrent: false, + credit_amount: Amount::new(&Currency::KUDOS, 120, 0), + alg: PublicKeyAlg::EdDSA, + account_pub: auth_pub1, + authorization_pub: auth_pub1, + authorization_sig: EddsaSignature::ZEROED, + } + .signed(&key_pair1); ctx.post("/taler-prepared-transfer/registration") - .json(json!(req + { "credit_account": ctx.customer_payto })) + .json( + RegistrationRequest { + credit_account: ctx.customer_payto.as_uri(), + ..req.clone() + } + .signed(&key_pair1), + ) .await .assert_error(ErrorCode::BANK_ACCOUNT_IS_NOT_EXCHANGE); ctx.post("/taler-prepared-transfer/registration") - .json(json!(req + { "credit_account": ctx.unknown_payto })) + .json( + RegistrationRequest { + credit_account: ctx.unknown_payto.as_uri(), + ..req.clone() + } + .signed(&key_pair1), + ) .await .assert_error(ErrorCode::BANK_UNKNOWN_CREDITOR); diff --git a/libeufin-bank/src/api/wire.rs b/libeufin-bank/src/api/wire.rs @@ -520,7 +520,7 @@ pub mod test { amount: amount("KUDOS:55"), origin_exchange_url: s.origin_exchange_url.clone(), metadata: None, - wtid: s.wtid.clone(), + wtid: s.wtid, credit_account: s.credit_account.clone(), timestamp: s.timestamp, }, diff --git a/libeufin-bank/src/bench.rs b/libeufin-bank/src/bench.rs @@ -23,12 +23,19 @@ use aws_lc_rs::signature::{Ed25519KeyPair, KeyPair as _}; use axum::http::header::AUTHORIZATION; use compact_str::{CompactString, format_compact}; use jiff::{Timestamp, Zoned, tz::TimeZone}; -use taler_api::crypto::eddsa_sign; use taler_common::{ - api::{EddsaPublicKey, HashCode, ShortHashCode, wire::TransferResponse}, + api::{ + EddsaPublicKey, EddsaSignature, HashCode, ShortHashCode, + prepared::{PublicKeyAlg, RegistrationRequest, TransferType, Unregistration}, + wire::TransferResponse, + }, bench::{Bench, h16, h32, h64}, encoding::hex, error_code::ErrorCode, + types::{ + amount::{Amount, Currency}, + timestamp::TalerTimestamp, + }, }; use taler_test_utils::{json, server::TestServer}; use uuid::Uuid; @@ -566,19 +573,20 @@ pub async fn bench_db() { // Wire transfer b.measure("wt_register", async |i| { let (pair, key) = &accounts_pubs[i]; - let body = json!({ - "credit_account": &ctx.exchange_payto, - "credit_amount": "KUDOS:55", - "type": "reserve", - "alg": "EdDSA", - "account_pub": key, - "authorization_pub": key, - "authorization_sig": eddsa_sign(pair, key.as_ref()), - "recurrent":false - }); + let req = RegistrationRequest { + credit_account: ctx.exchange_payto.as_uri(), + r#type: TransferType::reserve, + recurrent: false, + credit_amount: Amount::new(&Currency::KUDOS, 55, 0), + alg: PublicKeyAlg::EdDSA, + account_pub: *key, + authorization_pub: *key, + authorization_sig: EddsaSignature::ZEROED, + } + .signed(pair); for _ in 0..2 { ctx.post("/taler-prepared-transfer/registration") - .json(&body) + .json(&req) .await .assert_ok() } @@ -586,12 +594,12 @@ pub async fn bench_db() { .await; b.measure("wt_unregister", async |i| { let (pair, key) = &accounts_pubs[i]; - let now = Timestamp::now().to_string(); - let req = json!({ - "timestamp": &now, - "authorization_pub": key, - "authorization_sig": eddsa_sign(pair, now.as_ref()), - }); + let req = Unregistration { + timestamp: TalerTimestamp::Timestamp(Timestamp::now()), + authorization_pub: *key, + authorization_sig: EddsaSignature::ZEROED, + } + .signed(pair); ctx.post("/taler-prepared-transfer/unregistration") .json(&req) .await diff --git a/libeufin-bank/src/db/exchange.rs b/libeufin-bank/src/db/exchange.rs @@ -83,8 +83,8 @@ pub async fn transfer( FROM taler_transfer($1,$2,$3,$4,$5,$6,$7,$8,$9,$10) ", ) - .bind(&req.request_uid) - .bind(&req.wtid) + .bind(req.request_uid) + .bind(req.wtid) .bind(&subject) .bind(req.amount) .bind(req.exchange_base_url.as_str()) diff --git a/libeufin-ebics/src/xml_sign.rs b/libeufin-ebics/src/xml_sign.rs @@ -32,8 +32,8 @@ use thiserror::Error; use crate::xml::{self, Xml, XmlAccess as _}; -fn escape<'a>( - mut text: &'a str, +fn escape( + mut text: &str, replacements: &[(char, &str)], out: &mut impl Write, ) -> std::io::Result<()> { @@ -41,7 +41,7 @@ fn escape<'a>( while let Some(pos) = text.find(|c| replacements.iter().any(|&(r, _)| r == c)) { // Write the safe chunk of text before the escaped character if pos > 0 { - out.write_all(text[..pos].as_bytes())?; + out.write_all(&text.as_bytes()[..pos])?; } // Get the character that triggered the match diff --git a/libeufin-nexus/src/bench.rs b/libeufin-nexus/src/bench.rs @@ -23,12 +23,19 @@ use aws_lc_rs::signature::{Ed25519KeyPair, KeyPair as _}; use compact_str::{CompactString, format_compact}; use jiff::Timestamp; use serde_json::json; -use taler_api::{crypto::eddsa_sign, subject::subject_fmt_qr_bill}; +use taler_api::subject::subject_fmt_qr_bill; use taler_common::{ - api::{EddsaPublicKey, HashCode, ShortHashCode}, + api::{ + EddsaPublicKey, EddsaSignature, HashCode, ShortHashCode, + prepared::{PublicKeyAlg, RegistrationRequest, TransferType, Unregistration}, + }, bench::{Bench, h32, h64}, encoding::hex, error_code::ErrorCode, + types::{ + amount::{Amount, Currency}, + timestamp::TalerTimestamp, + }, }; use taler_test_utils::server::TestServer as _; @@ -245,31 +252,34 @@ pub async fn bench_db() { // Wire transfer b.measure("wt_register", async |i| { let (pair, key) = &accounts_pubs[i]; - - server - .post("/taler-prepared-transfer/registration") - .json(json!({ - "credit_account": *EXCHANGE, - "credit_amount": "KUDOS:55", - "type": "reserve", - "alg": "EdDSA", - "account_pub": key, - "authorization_pub": key, - "authorization_sig": eddsa_sign(pair, key.as_ref()), - "recurrent":false - })) - .await - .assert_ok() + let req = RegistrationRequest { + credit_account: EXCHANGE.as_uri(), + r#type: TransferType::reserve, + recurrent: false, + credit_amount: Amount::new(&Currency::KUDOS, 55, 0), + alg: PublicKeyAlg::EdDSA, + account_pub: *key, + authorization_pub: *key, + authorization_sig: EddsaSignature::ZEROED, + } + .signed(pair); + for _ in 0..2 { + server + .post("/taler-prepared-transfer/registration") + .json(&req) + .await + .assert_ok() + } }) .await; b.measure("wt_unregister", async |i| { let (pair, key) = &accounts_pubs[i]; - let now = Timestamp::now().to_string(); - let req = json!({ - "timestamp": &now, - "authorization_pub": key, - "authorization_sig": eddsa_sign(pair, now.as_ref()), - }); + let req = Unregistration { + timestamp: TalerTimestamp::Timestamp(Timestamp::now()), + authorization_pub: *key, + authorization_sig: EddsaSignature::ZEROED, + } + .signed(pair); server .post("/taler-prepared-transfer/unregistration") .json(&req) diff --git a/libeufin-nexus/src/db/exchange.rs b/libeufin-nexus/src/db/exchange.rs @@ -212,8 +212,8 @@ pub async fn transfer( FROM taler_transfer($1,$2,$3,$4,$5,$6,$7,$8,$9) ", ) - .bind(&req.request_uid) - .bind(&req.wtid) + .bind(req.request_uid) + .bind(req.wtid) .bind(&subject) .bind(req.amount) .bind(req.exchange_base_url.as_str()) diff --git a/libeufin-nexus/src/db/payment.rs b/libeufin-nexus/src/db/payment.rs @@ -662,11 +662,11 @@ mod test { // Register let incoming = gen_in_pay(&subject); register_incoming(&db, &cfg, &incoming).await.unwrap(); - check_in_state(&db, &[Reserve(key.clone())]).await; + check_in_state(&db, &[Reserve(key)]).await; // Idempotent register_incoming(&db, &cfg, &incoming).await.unwrap(); - check_in_state(&db, &[Reserve(key.clone())]).await; + check_in_state(&db, &[Reserve(key)]).await; // Key reuse is bounced register_incoming(&db, &cfg, &gen_in_pay(&subject)) @@ -675,13 +675,13 @@ mod test { register_incoming(&db, &cfg, &gen_in_pay(format_args!("another {subject}"))) .await .unwrap(); - check_in_state(&db, &[Reserve(key.clone()), Bounced, Bounced]).await; + check_in_state(&db, &[Reserve(key), Bounced, Bounced]).await; // Admin balance adjust is ignored register_incoming(&db, &cfg, &gen_in_pay("ADMIN BALANCE ADJUST")) .await .unwrap(); - check_in_state(&db, &[Reserve(key.clone()), Bounced, Bounced, Simple]).await; + check_in_state(&db, &[Reserve(key), Bounced, Bounced, Simple]).await; let new = EddsaPublicKey::rand(); let original = gen_in_pay(format_args!("test 2 with {new} reserve pub")); @@ -693,25 +693,13 @@ mod test { // Register incomplete transaction register_incoming(&db, &cfg, &incomplete).await.unwrap(); - check_in_state( - &db, - &[Reserve(key.clone()), Bounced, Bounced, Simple, Incomplete], - ) - .await; + check_in_state(&db, &[Reserve(key), Bounced, Bounced, Simple, Incomplete]).await; // Idempotent register_incoming(&db, &cfg, &incomplete).await.unwrap(); - check_in_state( - &db, - &[Reserve(key.clone()), Bounced, Bounced, Simple, Incomplete], - ) - .await; + check_in_state(&db, &[Reserve(key), Bounced, Bounced, Simple, Incomplete]).await; // Recover info when completed register_incoming(&db, &cfg, &original).await.unwrap(); - check_in_state( - &db, - &[Reserve(key.clone()), Bounced, Bounced, Simple, Reserve(new)], - ) - .await; + check_in_state(&db, &[Reserve(key), Bounced, Bounced, Simple, Reserve(new)]).await; } #[tokio::test] @@ -743,17 +731,17 @@ mod test { // Register let incoming = gen_in_pay(&subject); register_incoming(&db, &cfg, &incoming).await.unwrap(); - check_in_state(&db, &[Reserve(first.clone())]).await; + check_in_state(&db, &[Reserve(first)]).await; // Idempotent register_incoming(&db, &cfg, &incoming).await.unwrap(); - check_in_state(&db, &[Reserve(first.clone())]).await; + check_in_state(&db, &[Reserve(first)]).await; // Admin balance adjust is ignored register_incoming(&db, &cfg, &gen_in_pay("ADMIN BALANCE ADJUST")) .await .unwrap(); - check_in_state(&db, &[Reserve(first.clone()), Simple]).await; + check_in_state(&db, &[Reserve(first), Simple]).await; let original = gen_in_pay(format_args!("test 2 for {subject}")); let incomplete = InTx { @@ -763,13 +751,13 @@ mod test { }; // Register incomplete transaction register_incoming(&db, &cfg, &incomplete).await.unwrap(); - check_in_state(&db, &[Reserve(first.clone()), Simple, Incomplete]).await; + check_in_state(&db, &[Reserve(first), Simple, Incomplete]).await; // Idempotent register_incoming(&db, &cfg, &incomplete).await.unwrap(); - check_in_state(&db, &[Reserve(first.clone()), Simple, Incomplete]).await; + check_in_state(&db, &[Reserve(first), Simple, Incomplete]).await; // Recover info when completed register_incoming(&db, &cfg, &original).await.unwrap(); - check_in_state(&db, &[Reserve(first.clone()), Simple, Bounced]).await; + check_in_state(&db, &[Reserve(first), Simple, Bounced]).await; let second = EddsaPublicKey::rand(); assert_eq!( @@ -787,7 +775,7 @@ mod test { .unwrap(), RegistrationResult::Success ); - check_in_state(&db, &[Reserve(first.clone()), Simple, Bounced]).await; + check_in_state(&db, &[Reserve(first), Simple, Bounced]).await; // Key reuse is pending for _ in 0..3 { @@ -798,10 +786,10 @@ mod test { check_in_state( &db, &[ - Reserve(first.clone()), + Reserve(first), Simple, Bounced, - Reserve(second.clone()), + Reserve(second), Pending, Pending, ], @@ -828,11 +816,11 @@ mod test { check_in_state( &db, &[ - Reserve(first.clone()), + Reserve(first), Simple, Bounced, - Reserve(second.clone()), - Reserve(third.clone()), + Reserve(second), + Reserve(third), Pending, ], ) @@ -867,17 +855,17 @@ mod test { // Register let incoming = gen_in_pay(reference_number.clone()); register_incoming(&db, &cfg, &incoming).await.unwrap(); - check_in_state(&db, &[Reserve(first.clone())]).await; + check_in_state(&db, &[Reserve(first)]).await; // Idempotent register_incoming(&db, &cfg, &incoming).await.unwrap(); - check_in_state(&db, &[Reserve(first.clone())]).await; + check_in_state(&db, &[Reserve(first)]).await; // Admin balance adjust is ignored register_incoming(&db, &cfg, &gen_in_pay("ADMIN BALANCE ADJUST")) .await .unwrap(); - check_in_state(&db, &[Reserve(first.clone()), Simple]).await; + check_in_state(&db, &[Reserve(first), Simple]).await; let original = gen_in_pay(reference_number.clone()); let incomplete = InTx { @@ -887,13 +875,13 @@ mod test { }; // Register incomplete transaction register_incoming(&db, &cfg, &incomplete).await.unwrap(); - check_in_state(&db, &[Reserve(first.clone()), Simple, Incomplete]).await; + check_in_state(&db, &[Reserve(first), Simple, Incomplete]).await; // Idempotent register_incoming(&db, &cfg, &incomplete).await.unwrap(); - check_in_state(&db, &[Reserve(first.clone()), Simple, Incomplete]).await; + check_in_state(&db, &[Reserve(first), Simple, Incomplete]).await; // Recover info when completed register_incoming(&db, &cfg, &original).await.unwrap(); - check_in_state(&db, &[Reserve(first.clone()), Simple, Bounced]).await; + check_in_state(&db, &[Reserve(first), Simple, Bounced]).await; let second = EddsaPublicKey::rand(); assert_eq!( @@ -911,7 +899,7 @@ mod test { .unwrap(), RegistrationResult::Success ); - check_in_state(&db, &[Reserve(first.clone()), Simple, Bounced]).await; + check_in_state(&db, &[Reserve(first), Simple, Bounced]).await; // Key reuse is pending for _ in 0..3 { @@ -922,10 +910,10 @@ mod test { check_in_state( &db, &[ - Reserve(first.clone()), + Reserve(first), Simple, Bounced, - Reserve(second.clone()), + Reserve(second), Pending, Pending, ], @@ -952,11 +940,11 @@ mod test { check_in_state( &db, &[ - Reserve(first.clone()), + Reserve(first), Simple, Bounced, - Reserve(second.clone()), - Reserve(third.clone()), + Reserve(second), + Reserve(third), Pending, ], ) @@ -1117,7 +1105,7 @@ mod test { register_incoming(&db, &cfg, &incomplete).await.unwrap(); register_incoming(&db, &cfg, &payment).await.unwrap(); register_incoming(&db, &cfg, &incomplete).await.unwrap(); - check_in_state(&db, &[Reserve(key.clone())]).await; + check_in_state(&db, &[Reserve(key)]).await; // Check we do not register as talerable bounced transaction let new_key = EddsaPublicKey::rand(); @@ -1130,6 +1118,6 @@ mod test { register_incoming(&db, &cfg, &payment).await.unwrap(); register_incoming(&db, &cfg, &incomplete).await.unwrap(); register_incoming(&db, &cfg, &payment).await.unwrap(); - check_in_state(&db, &[Reserve(key.clone()), Bounced]).await; + check_in_state(&db, &[Reserve(key), Bounced]).await; } }