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;
recoupGroup.scheduleRefreshCoins.push({
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(oldCoin);

View File

@ -426,6 +426,16 @@ async function refreshMelt(
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(
resp,
codecForExchangeMeltResponse(),

View File

@ -51,6 +51,7 @@ import {
WalletContractData,
} from "../db.js";
import { InternalWalletState } from "../internal-wallet-state.js";
import { assertUnreachable } from "../util/assertUnreachable.js";
import { checkDbInvariant } from "../util/invariants.js";
import { RetryTags } from "../util/retries.js";
import {
@ -803,33 +804,36 @@ export async function getTransactions(
const opId = RetryTags.forWithdrawal(wsr);
const ort = await tx.operationRetries.get(opId);
if (wsr.wgInfo.withdrawalType === WithdrawalRecordType.PeerPullCredit) {
transactions.push(buildTransactionForPullPaymentCredit(wsr, ort));
return;
} else if (
wsr.wgInfo.withdrawalType === WithdrawalRecordType.PeerPushCredit
) {
transactions.push(buildTransactionForPushPaymentCredit(wsr, ort));
return;
} else if (
wsr.wgInfo.withdrawalType === WithdrawalRecordType.BankIntegrated
) {
transactions.push(
buildTransactionForBankIntegratedWithdraw(wsr, ort),
);
} else {
const exchangeDetails = await getExchangeDetails(
tx,
wsr.exchangeBaseUrl,
);
if (!exchangeDetails) {
// FIXME: report somehow
switch (wsr.wgInfo.withdrawalType) {
case WithdrawalRecordType.PeerPullCredit:
transactions.push(buildTransactionForPullPaymentCredit(wsr, ort));
return;
case WithdrawalRecordType.PeerPushCredit:
transactions.push(buildTransactionForPushPaymentCredit(wsr, ort));
return;
case WithdrawalRecordType.BankIntegrated:
transactions.push(
buildTransactionForBankIntegratedWithdraw(wsr, ort),
);
return;
case WithdrawalRecordType.BankManual: {
const exchangeDetails = await getExchangeDetails(
tx,
wsr.exchangeBaseUrl,
);
if (!exchangeDetails) {
// FIXME: report somehow
return;
}
transactions.push(
buildTransactionForManualWithdraw(wsr, exchangeDetails, ort),
);
return;
}
transactions.push(
buildTransactionForManualWithdraw(wsr, exchangeDetails, ort),
);
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}`;
}
export function forRefresh(refreshGroupRecord: RefreshGroupRecord): string {
return `${PendingTaskType.TipPickup}:${refreshGroupRecord.refreshGroupId}`;
return `${PendingTaskType.Refresh}:${refreshGroupRecord.refreshGroupId}`;
}
export function forPay(purchaseRecord: PurchaseRecord): string {
return `${PendingTaskType.Purchase}:${purchaseRecord.proposalId}`;