wallet-core: fix recoup issue

This commit is contained in:
Florian Dold 2022-11-02 12:50:34 +01:00
parent aab3f917c4
commit 87bc4a6fcd
No known key found for this signature in database
GPG Key ID: D2E4F00F29D02A4B
4 changed files with 42 additions and 27 deletions

View File

@ -281,7 +281,8 @@ async function recoupRefreshCoin(
revokedCoin.status = CoinStatus.Dormant; revokedCoin.status = CoinStatus.Dormant;
recoupGroup.scheduleRefreshCoins.push({ recoupGroup.scheduleRefreshCoins.push({
coinPub: oldCoin.coinPub, coinPub: oldCoin.coinPub,
amount: Amounts.sub(oldCoinDenom.value, revokedCoinDenom.value).amount, //amount: Amounts.sub(oldCoinDenom.value, revokedCoinDenom.value).amount,
amount: revokedCoinDenom.value,
}); });
await tx.coins.put(revokedCoin); await tx.coins.put(revokedCoin);
await tx.coins.put(oldCoin); await tx.coins.put(oldCoin);

View File

@ -426,6 +426,16 @@ async function refreshMelt(
return; return;
} }
if (resp.status === HttpStatusCode.Conflict) {
// Just log for better diagnostics here, error status
// will be handled later.
logger.error(
`melt request for ${Amounts.stringify(
derived.meltValueWithFee,
)} failed in refresh group ${refreshGroupId} due to conflict`,
);
}
const meltResponse = await readSuccessResponseJsonOrThrow( const meltResponse = await readSuccessResponseJsonOrThrow(
resp, resp,
codecForExchangeMeltResponse(), codecForExchangeMeltResponse(),

View File

@ -51,6 +51,7 @@ import {
WalletContractData, WalletContractData,
} from "../db.js"; } from "../db.js";
import { InternalWalletState } from "../internal-wallet-state.js"; import { InternalWalletState } from "../internal-wallet-state.js";
import { assertUnreachable } from "../util/assertUnreachable.js";
import { checkDbInvariant } from "../util/invariants.js"; import { checkDbInvariant } from "../util/invariants.js";
import { RetryTags } from "../util/retries.js"; import { RetryTags } from "../util/retries.js";
import { import {
@ -803,21 +804,19 @@ export async function getTransactions(
const opId = RetryTags.forWithdrawal(wsr); const opId = RetryTags.forWithdrawal(wsr);
const ort = await tx.operationRetries.get(opId); const ort = await tx.operationRetries.get(opId);
if (wsr.wgInfo.withdrawalType === WithdrawalRecordType.PeerPullCredit) { switch (wsr.wgInfo.withdrawalType) {
case WithdrawalRecordType.PeerPullCredit:
transactions.push(buildTransactionForPullPaymentCredit(wsr, ort)); transactions.push(buildTransactionForPullPaymentCredit(wsr, ort));
return; return;
} else if ( case WithdrawalRecordType.PeerPushCredit:
wsr.wgInfo.withdrawalType === WithdrawalRecordType.PeerPushCredit
) {
transactions.push(buildTransactionForPushPaymentCredit(wsr, ort)); transactions.push(buildTransactionForPushPaymentCredit(wsr, ort));
return; return;
} else if ( case WithdrawalRecordType.BankIntegrated:
wsr.wgInfo.withdrawalType === WithdrawalRecordType.BankIntegrated
) {
transactions.push( transactions.push(
buildTransactionForBankIntegratedWithdraw(wsr, ort), buildTransactionForBankIntegratedWithdraw(wsr, ort),
); );
} else { return;
case WithdrawalRecordType.BankManual: {
const exchangeDetails = await getExchangeDetails( const exchangeDetails = await getExchangeDetails(
tx, tx,
wsr.exchangeBaseUrl, wsr.exchangeBaseUrl,
@ -830,6 +829,11 @@ export async function getTransactions(
transactions.push( transactions.push(
buildTransactionForManualWithdraw(wsr, exchangeDetails, ort), buildTransactionForManualWithdraw(wsr, exchangeDetails, ort),
); );
return;
}
case WithdrawalRecordType.Recoup:
// FIXME: Do we also report a transaction here?
return;
} }
}); });

View File

@ -183,7 +183,7 @@ export namespace RetryTags {
return `${PendingTaskType.TipPickup}:${tipRecord.walletTipId}`; return `${PendingTaskType.TipPickup}:${tipRecord.walletTipId}`;
} }
export function forRefresh(refreshGroupRecord: RefreshGroupRecord): string { export function forRefresh(refreshGroupRecord: RefreshGroupRecord): string {
return `${PendingTaskType.TipPickup}:${refreshGroupRecord.refreshGroupId}`; return `${PendingTaskType.Refresh}:${refreshGroupRecord.refreshGroupId}`;
} }
export function forPay(purchaseRecord: PurchaseRecord): string { export function forPay(purchaseRecord: PurchaseRecord): string {
return `${PendingTaskType.Purchase}:${purchaseRecord.proposalId}`; return `${PendingTaskType.Purchase}:${purchaseRecord.proposalId}`;