commit d8f3f8cb91965f0942de7e208bcfbadf25347651
parent bcc4b8aa276ecdfa382fb9ce27fad2d9bb9eb9bd
Author: Antoine A <>
Date: Wed, 25 Mar 2026 18:14:47 +0100
common: fix recurrent transfer finalisation
Diffstat:
3 files changed, 48 insertions(+), 4 deletions(-)
diff --git a/database-versioning/libeufin-bank-procedures.sql b/database-versioning/libeufin-bank-procedures.sql
@@ -2357,6 +2357,7 @@ IF in_recurrent THEN
SELECT bank_transaction_id
FROM pending_recurrent_incoming_transactions
JOIN bank_account_transactions USING (bank_transaction_id)
+ WHERE authorization_pub = in_authorization_pub
ORDER BY transaction_date ASC
LIMIT 1
)
diff --git a/database-versioning/libeufin-nexus-procedures.sql b/database-versioning/libeufin-nexus-procedures.sql
@@ -716,6 +716,7 @@ IF in_recurrent THEN
SELECT incoming_transaction_id
FROM pending_recurrent_incoming_transactions
JOIN incoming_transactions USING (incoming_transaction_id)
+ WHERE authorization_pub = in_authorization_pub
ORDER BY execution_time ASC
LIMIT 1
)
diff --git a/libeufin-nexus/src/test/kotlin/DatabaseTest.kt b/libeufin-nexus/src/test/kotlin/DatabaseTest.kt
@@ -1157,14 +1157,53 @@ class TransferTest {
)
// Switching to non recurrent cancel pending
+ val lastAccountPub = EddsaPublicKey.randEdsaKey()
+ val lastAuthPub = EddsaPublicKey.randEdsaKey()
+ val lastReferenceNumber = subjectFmtQrBill(lastAuthPub)
+ assertEquals(
+ RegistrationResult.Success,
+ db.transfer.register(
+ type = TransferType.reserve,
+ accountPub = lastAccountPub,
+ authPub = lastAuthPub,
+ authSig = sig,
+ referenceNumber = lastReferenceNumber,
+ timestamp = now,
+ recurrent = true
+ )
+ )
+ assertEquals(
+ IncomingRegistrationResult.Success(8, true, false, null, false),
+ db.mapTx(lastAuthPub)
+ )
+ assertEquals(
+ IncomingRegistrationResult.Success(9, true, false, null, true),
+ db.mapTx(lastAuthPub)
+ )
+ assertEquals(
+ IncomingRegistrationResult.Success(10, true, false, null, true),
+ db.mapTx(lastAuthPub)
+ )
+ db.checkIn(
+ Status.Reserve(accountPub),
+ Status.Reserve(newKey),
+ Status.Kyc(kycKey),
+ Status.Reserve(kycKey),
+ Status.Pending,
+ Status.Pending,
+ Status.Kyc(kycKey),
+ Status.Reserve(lastAccountPub),
+ Status.Pending,
+ Status.Pending,
+ )
assertEquals(
RegistrationResult.Success,
db.transfer.register(
type = TransferType.kyc,
- accountPub = kycKey,
- authPub = authPub,
+ accountPub = lastAccountPub,
+ authPub = lastAuthPub,
authSig = sig,
- referenceNumber = referenceNumber,
+ referenceNumber = lastReferenceNumber,
timestamp = now,
recurrent = false
)
@@ -1174,9 +1213,12 @@ class TransferTest {
Status.Reserve(newKey),
Status.Kyc(kycKey),
Status.Reserve(kycKey),
+ Status.Pending,
+ Status.Pending,
+ Status.Kyc(kycKey),
+ Status.Reserve(lastAccountPub),
Status.Bounced,
Status.Bounced,
- Status.Kyc(kycKey)
)
}