wallet-core: address DB FIXMEs, systematic state numbering

This commit is contained in:
Florian Dold 2023-09-07 20:35:46 +02:00
parent 33f2798004
commit c660db82c1
No known key found for this signature in database
GPG Key ID: D2E4F00F29D02A4B
24 changed files with 995 additions and 1126 deletions

View File

@ -130,7 +130,7 @@ export async function runPeerRepairTest(t: GlobalTestState) {
);
await wallet2.client.call(WalletApiOperation.ConfirmPeerPushCredit, {
peerPushPaymentIncomingId: resp2.peerPushPaymentIncomingId,
peerPushCreditId: resp2.peerPushCreditId,
});
await peerPushCreditDone1Cond;

View File

@ -123,7 +123,7 @@ export async function runPeerToPeerPullTest(t: GlobalTestState) {
);
await wallet2.client.call(WalletApiOperation.ConfirmPeerPullDebit, {
peerPullPaymentIncomingId: checkResp.peerPullPaymentIncomingId,
peerPullDebitId: checkResp.peerPullDebitId,
});
await peerPullCreditDoneCond;

View File

@ -126,7 +126,7 @@ export async function runPeerToPeerPushTest(t: GlobalTestState) {
const acceptResp = await w2.walletClient.call(
WalletApiOperation.ConfirmPeerPushCredit,
{
peerPushPaymentIncomingId: checkResp.peerPushPaymentIncomingId,
peerPushCreditId: checkResp.peerPushCreditId,
},
);

View File

@ -2438,7 +2438,7 @@ export interface PreparePeerPushCreditResponse {
amount: AmountString;
amountRaw: AmountString;
amountEffective: AmountString;
peerPushPaymentIncomingId: string;
peerPushCreditId: string;
transactionId: string;
}
@ -2453,7 +2453,7 @@ export interface PreparePeerPullDebitResponse {
amountRaw: AmountString;
amountEffective: AmountString;
peerPullPaymentIncomingId: string;
peerPullDebitId: string;
transactionId: string;
}
@ -2476,7 +2476,7 @@ export interface ConfirmPeerPushCreditRequest {
*
* @deprecated specify transactionId instead!
*/
peerPushPaymentIncomingId?: string;
peerPushCreditId?: string;
transactionId?: string;
}
@ -2491,7 +2491,7 @@ export interface AcceptPeerPullPaymentResponse {
export const codecForConfirmPeerPushPaymentRequest =
(): Codec<ConfirmPeerPushCreditRequest> =>
buildCodecForObject<ConfirmPeerPushCreditRequest>()
.property("peerPushPaymentIncomingId", codecOptional(codecForString()))
.property("peerPushCreditId", codecOptional(codecForString()))
.property("transactionId", codecOptional(codecForString()))
.build("ConfirmPeerPushCreditRequest");
@ -2501,7 +2501,7 @@ export interface ConfirmPeerPullDebitRequest {
*
* @deprecated use transactionId instead
*/
peerPullPaymentIncomingId?: string;
peerPullDebitId?: string;
transactionId?: string;
}
@ -2519,7 +2519,7 @@ export const codecForApplyDevExperiment =
export const codecForAcceptPeerPullPaymentRequest =
(): Codec<ConfirmPeerPullDebitRequest> =>
buildCodecForObject<ConfirmPeerPullDebitRequest>()
.property("peerPullPaymentIncomingId", codecOptional(codecForString()))
.property("peerPullDebitId", codecOptional(codecForString()))
.property("transactionId", codecOptional(codecForString()))
.build("ConfirmPeerPullDebitRequest");

View File

@ -1024,14 +1024,14 @@ peerCli
peerCli
.subcommand("confirmIncomingPayPull", "confirm-pull-debit")
.requiredArgument("peerPullPaymentIncomingId", clk.STRING)
.requiredArgument("peerPullDebitId", clk.STRING)
.action(async (args) => {
await withWallet(args, async (wallet) => {
const resp = await wallet.client.call(
WalletApiOperation.ConfirmPeerPullDebit,
{
peerPullPaymentIncomingId:
args.confirmIncomingPayPull.peerPullPaymentIncomingId,
peerPullDebitId:
args.confirmIncomingPayPull.peerPullDebitId,
},
);
console.log(JSON.stringify(resp, undefined, 2));
@ -1040,14 +1040,14 @@ peerCli
peerCli
.subcommand("confirmIncomingPayPush", "confirm-push-credit")
.requiredArgument("peerPushPaymentIncomingId", clk.STRING)
.requiredArgument("peerPushCreditId", clk.STRING)
.action(async (args) => {
await withWallet(args, async (wallet) => {
const resp = await wallet.client.call(
WalletApiOperation.ConfirmPeerPushCredit,
{
peerPushPaymentIncomingId:
args.confirmIncomingPayPush.peerPushPaymentIncomingId,
peerPushCreditId:
args.confirmIncomingPayPush.peerPushCreditId,
},
);
console.log(JSON.stringify(resp, undefined, 2));

View File

@ -60,7 +60,8 @@ import {
Logger,
CoinPublicKeyString,
TalerPreciseTimestamp,
j2s,
codecForAny,
Codec,
} from "@gnu-taler/taler-util";
import {
DbAccess,
@ -106,7 +107,7 @@ import { RetryInfo, TaskIdentifiers } from "./operations/common.js";
* for all previous versions must be written, which should be
* avoided.
*/
export const TALER_WALLET_MAIN_DB_NAME = "taler-wallet-main-v9";
export const TALER_WALLET_MAIN_DB_NAME = "taler-wallet-main-v10";
/**
* Name of the metadata database. This database is used
@ -137,50 +138,26 @@ export const CURRENT_DB_CONFIG_KEY = "currentMainDbName";
* backwards-compatible way or object stores and indices
* are added.
*/
export const WALLET_DB_MINOR_VERSION = 10;
export const WALLET_DB_MINOR_VERSION = 1;
/**
* Format of the operation status code: xyznnn
*
* x=1: active
* yz=00: pending
* yz=02: dialog
* yz=03: aborting
* yz=10: suspended
* yz=13: suspended-aborting
* x=2: final
* yz=00: done
* yz=01: failed
* yz=02: expired
* yz=03: aborted
*/
// export const OperationStatusRange = {
// ActiveStart: 10000,
// ActiveEnd: 10999,
// SuspendedStart: 10999,
// SuspendedEnd: 10999,
// FinalStart: 20000,
// FinalEnd: 29999,
//} as const;
* Format of the operation status code: 0x0abc_nnnn
/**
* Ranges for operation status fields.
*
* All individual enums should make sure that the values they
* defined are in the right range.
* a=1: active
* 0x0100_nnnn: pending
* 0x0101_nnnn: dialog
* 0x0102_nnnn: (reserved)
* 0x0103_nnnn: aborting
* 0x0110_nnnn: suspended
* 0x0113_nnnn: suspended-aborting
* a=5: final
* 0x0500_nnnn: done
* 0x0501_nnnn: failed
* 0x0502_nnnn: expired
* 0x0503_nnnn: aborted
*
* nnnn=0000 should always be the most generic minor state for the major state
*/
export enum OperationStatusRange {
// Operations that need to be actively processed.
ACTIVE_START = 10,
ACTIVE_END = 29,
// Operations that are suspended and might
// expire, but nothing else can be done.
SUSPENDED_START = 30,
SUSPENDED_END = 49,
// Operations that don't need any attention or processing.
DORMANT_START = 50,
DORMANT_END = 69,
}
/**
* Status of a withdrawal.
@ -189,71 +166,70 @@ export enum WithdrawalGroupStatus {
/**
* Reserve must be registered with the bank.
*/
PendingRegisteringBank = 10,
PendingRegisteringBank = 0x0100_0000,
SuspendedRegisteringBank = 0x0110_0000,
/**
* We've registered reserve's information with the bank
* and are now waiting for the user to confirm the withdraw
* with the bank (typically 2nd factor auth).
*/
PendingWaitConfirmBank = 11,
PendingWaitConfirmBank = 0x0100_0001,
SuspendedWaitConfirmBank = 0x0110_0001,
/**
* Querying reserve status with the exchange.
*/
PendingQueryingStatus = 12,
PendingQueryingStatus = 0x0100_0002,
SuspendedQueryingStatus = 0x0110_0002,
/**
* Ready for withdrawal.
*/
PendingReady = 13,
PendingReady = 0x0100_0003,
SuspendedReady = 0x0110_0003,
/**
* We are telling the bank that we don't want to complete
* the withdrawal!
*/
AbortingBank = 14,
AbortingBank = 0x0103_0000,
SuspendedAbortingBank = 0x0113_0000,
/**
* Exchange wants KYC info from the user.
*/
PendingKyc = 16,
PendingKyc = 0x0100_0004,
SuspendedKyc = 0x0110_004,
/**
* Exchange is doing AML checks.
*/
PendingAml = 17,
SuspendedRegisteringBank = 30,
SuspendedWaitConfirmBank = 31,
SuspendedQueryingStatus = 32,
SuspendedReady = 33,
SuspendedAbortingBank = 34,
SuspendedKyc = 35,
SuspendedAml = 36,
PendingAml = 0x0100_0005,
SuspendedAml = 0x0100_0005,
/**
* The corresponding withdraw record has been created.
* No further processing is done, unless explicitly requested
* by the user.
*/
Finished = 50,
Done = 0x0500_0000,
/**
* The bank aborted the withdrawal.
*/
FailedBankAborted = 51,
FailedBankAborted = 0x0501_0000,
FailedAbortingBank = 59,
FailedAbortingBank = 0x0501_0001,
/**
* Aborted in a state where we were supposed to
* talk to the exchange. Money might have been
* wired or not.
*/
AbortedExchange = 60,
AbortedExchange = 0x0503_0001,
AbortedBank = 61,
AbortedBank = 0x0503_0002,
}
/**
@ -298,17 +274,17 @@ export enum DenominationVerificationStatus {
/**
* Verification was delayed.
*/
Unverified = OperationStatusRange.ACTIVE_START,
Unverified = 0x0500_0000,
/**
* Verified as valid.
*/
VerifiedGood = OperationStatusRange.DORMANT_START,
VerifiedGood = 0x0500_0000,
/**
* Verified as invalid.
*/
VerifiedBad = OperationStatusRange.DORMANT_START + 1,
VerifiedBad = 0x0501_0000,
}
export interface DenomFees {
@ -904,50 +880,42 @@ export interface RewardRecord {
}
export enum RewardRecordStatus {
PendingPickup = 10,
SuspendidPickup = 20,
DialogAccept = 30,
Done = 50,
Aborted = 51,
PendingPickup = 0x0100_0000,
SuspendedPickup = 0x0110_0000,
DialogAccept = 0x0101_0000,
Done = 0x0500_0000,
Aborted = 0x0500_0000,
}
export enum RefreshCoinStatus {
Pending = OperationStatusRange.ACTIVE_START,
Finished = OperationStatusRange.DORMANT_START,
Pending = 0x0100_0000,
Finished = 0x0500_0000,
/**
* The refresh for this coin has been frozen, because of a permanent error.
* More info in lastErrorPerCoin.
*/
Failed = OperationStatusRange.DORMANT_START + 1,
}
export enum OperationStatus {
Finished = OperationStatusRange.DORMANT_START,
Pending = OperationStatusRange.ACTIVE_START,
Failed = 0x0501_000,
}
export enum RefreshOperationStatus {
Pending = 10 /* ACTIVE_START */,
Suspended = 20 /* DORMANT_START + 2 */,
Pending = 0x0100_0000,
Suspended = 0x0110_0000,
Finished = 50 /* DORMANT_START */,
Failed = 51 /* DORMANT_START + 1 */,
Finished = 0x0500_000,
Failed = 0x0501_000,
}
/**
* Status of a single element of a deposit group.
*/
export enum DepositElementStatus {
Unknown = 10,
Accepted = 20,
KycRequired = 30,
Wired = 40,
RefundSuccess = 50,
RefundFailed = 51,
Unknown = 0x0100_0000,
Accepted = 0x0100_0001,
KycRequired = 0x0100_0002,
Wired = 0x0500_0000,
RefundSuccess = 0x0503_0000,
RefundFailed = 0x0501_0000,
}
/**
@ -962,9 +930,6 @@ export interface RefreshReasonDetails {
* Group of refresh operations. The refreshed coins do not
* have to belong to the same exchange, but must have the same
* currency.
*
* FIXME: Should include the currency as a top-level field,
* but we need to write a migration for that.
*/
export interface RefreshGroupRecord {
operationStatus: RefreshOperationStatus;
@ -980,8 +945,6 @@ export interface RefreshGroupRecord {
/**
* Currency of this refresh group.
*
* FIXME: Write a migration to add this to earlier DB versions.
*/
currency: string;
@ -1116,81 +1079,84 @@ export enum PurchaseStatus {
/**
* Not downloaded yet.
*/
PendingDownloadingProposal = 10,
PendingDownloadingProposal = 0x0100_0000,
SuspendedDownloadingProposal = 0x0110_0000,
/**
* The user has accepted the proposal.
*/
PendingPaying = 11,
PendingPaying = 0x0100_0001,
SuspendedPaying = 0x0110_0001,
/**
* Currently in the process of aborting with a refund.
*/
AbortingWithRefund = 12,
AbortingWithRefund = 0x0103_0000,
SuspendedAbortingWithRefund = 0x0113_0000,
/**
* Paying a second time, likely with different session ID
*/
PendingPayingReplay = 13,
PendingPayingReplay = 0x0100_0002,
SuspendedPayingReplay = 0x0110_0002,
/**
* Query for refunds (until query succeeds).
*/
PendingQueryingRefund = 14,
PendingQueryingRefund = 0x0100_0003,
SuspendedQueryingRefund = 0x0110_0003,
/**
* Query for refund (until auto-refund deadline is reached).
*/
PendingQueryingAutoRefund = 15,
PendingQueryingAutoRefund = 0x0100_0004,
SuspendedQueryingAutoRefund = 0x0110_0004,
PendingAcceptRefund = 16,
SuspendedDownloadingProposal = 20,
SuspendedPaying = 21,
SuspendedAbortingWithRefund = 22,
SuspendedPayingReplay = 23,
SuspendedQueryingRefund = 24,
SuspendedQueryingAutoRefund = 25,
SuspendedPendingAcceptRefund = 26,
PendingAcceptRefund = 0x0100_0005,
SuspendedPendingAcceptRefund = 0x0100_0005,
/**
* Proposal downloaded, but the user needs to accept/reject it.
*/
DialogProposed = 30,
DialogProposed = 0x0101_0000,
/**
* Proposal shared to other wallet or read from other wallet
* the user needs to accept/reject it.
*/
DialogShared = 31,
DialogShared = 0x0101_0001,
/**
* The user has rejected the proposal.
*/
AbortedProposalRefused = 50,
AbortedProposalRefused = 0x0503_0000,
/**
* Downloading or processing the proposal has failed permanently.
*/
FailedClaim = 51,
/**
* Downloaded proposal was detected as a re-purchase.
*/
RepurchaseDetected = 52,
/**
* The payment has been aborted.
*/
AbortedIncompletePayment = 53,
FailedClaim = 0x0501_0000,
/**
* Payment was successful.
*/
Done = 54,
Done = 0x0500_0000,
FailedAbort = 55,
/**
* Downloaded proposal was detected as a re-purchase.
*/
DoneRepurchaseDetected = 0x0500_0001,
AbortedRefunded = 56,
/**
* The payment has been aborted.
*/
AbortedIncompletePayment = 0x0503_0000,
/**
* Tried to abort, but aborting failed or was cancelled.
*/
FailedAbort = 0x0501_0001,
AbortedRefunded = 0x0503_0000,
}
/**
@ -1304,14 +1270,6 @@ export interface PurchaseRecord {
*/
timestampAccept: TalerPreciseTimestamp | undefined;
/**
* Pending refunds for the purchase. A refund is pending
* when the merchant reports a transient error from the exchange.
*
* FIXME: Put this into a separate object store?
*/
// refunds: { [refundKey: string]: WalletRefundItem };
/**
* When was the last refund made?
* Set to 0 if no refund was made on the purchase.
@ -1375,6 +1333,7 @@ export interface WalletBackupConfState {
lastBackupNonce?: string;
}
// FIXME: Should these be numeric codes?
export const enum WithdrawalRecordType {
BankManual = "bank-manual",
BankIntegrated = "bank-integrated",
@ -1684,19 +1643,21 @@ export interface BackupProviderRecord {
}
export enum DepositOperationStatus {
PendingDeposit = 10,
Aborting = 11,
PendingTrack = 12,
PendingKyc = 13,
PendingDeposit = 0x0100_0000,
PendingTrack = 0x0100_0001,
PendingKyc = 0x0100_0002,
SuspendedDeposit = 20,
SuspendedAborting = 21,
SuspendedTrack = 22,
SuspendedKyc = 23,
Aborting = 0x0103_0000,
Finished = 50,
Failed = 51,
Aborted = 52,
SuspendedDeposit = 0x0110_0000,
SuspendedTrack = 0x0110_0001,
SuspendedKyc = 0x0110_0002,
SuspendedAborting = 0x0113_0000,
Finished = 0x0500_0000,
Failed = 0x0501_0000,
Aborted = 0x0503_0000,
}
export interface DepositTrackingInfo {
@ -1787,31 +1748,6 @@ export interface DepositKycInfo {
exchangeBaseUrl: string;
}
/**
* Record for a deposits that the wallet observed
* as a result of double spending, but which is not
* present in the wallet's own database otherwise.
*/
export interface GhostDepositGroupRecord {
/**
* When multiple deposits for the same contract terms hash
* have a different timestamp, we choose the earliest one.
*/
timestamp: TalerPreciseTimestamp;
contractTermsHash: string;
deposits: {
coinPub: string;
amount: AmountString;
timestamp: TalerProtocolTimestamp;
depositFee: AmountString;
merchantPub: string;
coinSig: string;
wireHash: string;
}[];
}
export interface TombstoneRecord {
/**
* Tombstone ID, with the syntax "tmb:<type>:<key>".
@ -1819,24 +1755,24 @@ export interface TombstoneRecord {
id: string;
}
export enum PeerPushPaymentInitiationStatus {
export enum PeerPushDebitStatus {
/**
* Initiated, but no purse created yet.
*/
PendingCreatePurse = 10 /* ACTIVE_START */,
PendingReady = 11,
AbortingDeletePurse = 12,
AbortingRefresh = 13,
PendingCreatePurse = 0x0100_0000 /* ACTIVE_START */,
PendingReady = 0x0100_0001,
AbortingDeletePurse = 0x0103_0000,
AbortingRefresh = 0x0103_0001,
SuspendedCreatePurse = 30,
SuspendedReady = 31,
SuspendedAbortingDeletePurse = 32,
SuspendedAbortingRefresh = 33,
SuspendedCreatePurse = 0x0110_0000,
SuspendedReady = 0x0110_0001,
SuspendedAbortingDeletePurse = 0x0113_0000,
SuspendedAbortingRefresh = 0x0113_0001,
Done = 50 /* DORMANT_START */,
Aborted = 51,
Failed = 52,
Expired = 53,
Done = 0x0500_0000,
Aborted = 0x0503_0000,
Failed = 0x0501_0000,
Expired = 0x0502_0000,
}
export interface PeerPushPaymentCoinSelection {
@ -1847,7 +1783,7 @@ export interface PeerPushPaymentCoinSelection {
/**
* Record for a push P2P payment that this wallet initiated.
*/
export interface PeerPushPaymentInitiationRecord {
export interface PeerPushDebitRecord {
/**
* What exchange are funds coming from?
*/
@ -1907,32 +1843,34 @@ export interface PeerPushPaymentInitiationRecord {
/**
* Status of the peer push payment initiation.
*/
status: PeerPushPaymentInitiationStatus;
status: PeerPushDebitStatus;
}
export enum PeerPullPaymentInitiationStatus {
PendingCreatePurse = 10 /* ACTIVE_START */,
export enum PeerPullPaymentCreditStatus {
PendingCreatePurse = 0x0100_0000,
/**
* Purse created, waiting for the other party to accept the
* invoice and deposit money into it.
*/
PendingReady = 11 /* ACTIVE_START + 1 */,
PendingMergeKycRequired = 12 /* ACTIVE_START + 2 */,
PendingWithdrawing = 13,
AbortingDeletePurse = 14,
PendingReady = 0x0100_0001,
PendingMergeKycRequired = 0x0100_0002,
PendingWithdrawing = 0x0100_0003,
SuspendedCreatePurse = 30,
SuspendedReady = 31,
SuspendedMergeKycRequired = 32,
SuspendedWithdrawing = 33,
SuspendedAbortingDeletePurse = 34,
AbortingDeletePurse = 0x0103_0000,
Done = 50 /* DORMANT_START */,
Failed = 51,
Aborted = 52,
SuspendedCreatePurse = 0x0110_0000,
SuspendedReady = 0x0110_0001,
SuspendedMergeKycRequired = 0x0110_0002,
SuspendedWithdrawing = 0x0113_0000,
SuspendedAbortingDeletePurse = 0x0113_0000,
Done = 0x0500_0000,
Failed = 0x0501_0000,
Aborted = 0x0503_0000,
}
export interface PeerPullPaymentInitiationRecord {
export interface PeerPullCreditRecord {
/**
* What exchange are we using for the payment request?
*/
@ -1982,7 +1920,7 @@ export interface PeerPullPaymentInitiationRecord {
/**
* Status of the peer pull payment initiation.
*/
status: PeerPullPaymentInitiationStatus;
status: PeerPullPaymentCreditStatus;
kycInfo?: KycPendingInfo;
@ -1991,24 +1929,24 @@ export interface PeerPullPaymentInitiationRecord {
withdrawalGroupId: string | undefined;
}
export enum PeerPushPaymentIncomingStatus {
PendingMerge = 10 /* ACTIVE_START */,
PendingMergeKycRequired = 11 /* ACTIVE_START + 1 */,
export enum PeerPushCreditStatus {
PendingMerge = 0x0100_0000,
PendingMergeKycRequired = 0x0100_0001,
/**
* Merge was successful and withdrawal group has been created, now
* everything is in the hand of the withdrawal group.
*/
PendingWithdrawing = 12,
PendingWithdrawing = 0x0100_0002,
SuspendedMerge = 20,
SuspendedMergeKycRequired = 21,
SuspendedWithdrawing = 22,
SuspendedMerge = 0x0110_0000,
SuspendedMergeKycRequired = 0x0110_0001,
SuspendedWithdrawing = 0x0110_0002,
DialogProposed = 30 /* USER_ATTENTION_START */,
DialogProposed = 0x0101_0000,
Done = 50 /* DORMANT_START */,
Aborted = 51,
Failed = 52,
Done = 0x0500_0000,
Aborted = 0x0503_0000,
Failed = 0x0501_0000,
}
/**
@ -2017,7 +1955,7 @@ export enum PeerPushPaymentIncomingStatus {
* Unique: (exchangeBaseUrl, pursePub)
*/
export interface PeerPushPaymentIncomingRecord {
peerPushPaymentIncomingId: string;
peerPushCreditId: string;
exchangeBaseUrl: string;
@ -2040,7 +1978,7 @@ export interface PeerPushPaymentIncomingRecord {
/**
* Status of the peer push payment incoming initiation.
*/
status: PeerPushPaymentIncomingStatus;
status: PeerPushCreditStatus;
/**
* Associated withdrawal group.
@ -2061,17 +1999,17 @@ export interface PeerPushPaymentIncomingRecord {
}
export enum PeerPullDebitRecordStatus {
PendingDeposit = 10 /* ACTIVE_START */,
AbortingRefresh = 11,
PendingDeposit = 0x0100_0001,
AbortingRefresh = 0x0103_0001,
SuspendedDeposit = 20,
SuspendedAbortingRefresh = 21,
SuspendedDeposit = 0x0110_0001,
SuspendedAbortingRefresh = 0x0113_0001,
DialogProposed = 30 /* USER_ATTENTION_START */,
DialogProposed = 0x0101_0001,
DonePaid = 50 /* DORMANT_START */,
Aborted = 51,
Failed = 52,
Done = 0x0500_0000,
Aborted = 0x0503_0000,
Failed = 0x0501_0000,
}
export interface PeerPullPaymentCoinSelection {
@ -2089,7 +2027,7 @@ export interface PeerPullPaymentCoinSelection {
* AKA PeerPullDebit.
*/
export interface PeerPullPaymentIncomingRecord {
peerPullPaymentIncomingId: string;
peerPullDebitId: string;
pursePub: string;
@ -2234,10 +2172,10 @@ export interface CurrencySettingsRecord {
}
export enum RefundGroupStatus {
Pending = 10,
Done = 50,
Failed = 51,
Aborted = 52,
Pending = 0x0100_0000,
Done = 0x0500_0000,
Failed = 0x0501_0000,
Aborted = 0x0503_0000,
}
/**
@ -2273,16 +2211,16 @@ export enum RefundItemStatus {
*
* We'll try again!
*/
Pending = 10,
Pending = 0x0100_0000,
/**
* Refund was obtained successfully.
*/
Done = 50,
Done = 0x0500_0000,
/**
* Permanent error reported by the exchange
* for the refund.
*/
Failed = 51,
Failed = 0x0501_0000,
}
/**
@ -2298,7 +2236,9 @@ export interface RefundItemRecord {
refundGroupId: string;
// Execution time as claimed by the merchant
/**
* Execution time as claimed by the merchant
*/
executionTime: TalerProtocolTimestamp;
/**
@ -2308,22 +2248,15 @@ export interface RefundItemRecord {
refundAmount: AmountString;
//refundFee: AmountString;
/**
* Upper bound on the refresh cost incurred by
* applying this refund.
*
* Might be lower in practice when two refunds on the same
* coin are refreshed in the same refresh operation.
*/
//totalRefreshCostBound: AmountString;
coinPub: string;
rtxid: number;
}
export function passthroughCodec<T>(): Codec<T> {
return codecForAny();
}
/**
* Schema definition for the IndexedDB
* wallet database.
@ -2333,7 +2266,6 @@ export const WalletStoresV1 = {
"currencySettings",
describeContents<CurrencySettingsRecord>({
keyPath: ["currency"],
versionAdded: 3,
}),
{},
),
@ -2542,17 +2474,10 @@ export const WalletStoresV1 = {
}),
{},
),
ghostDepositGroups: describeStore(
"ghostDepositGroups",
describeContents<GhostDepositGroupRecord>({
keyPath: "contractTermsHash",
}),
{},
),
peerPushPaymentIncoming: describeStore(
"peerPushPaymentIncoming",
peerPushCredit: describeStore(
"peerPushCredit",
describeContents<PeerPushPaymentIncomingRecord>({
keyPath: "peerPushPaymentIncomingId",
keyPath: "peerPushCreditId",
}),
{
byExchangeAndPurse: describeIndex("byExchangeAndPurse", [
@ -2563,24 +2488,21 @@ export const WalletStoresV1 = {
"byExchangeAndContractPriv",
["exchangeBaseUrl", "contractPriv"],
{
versionAdded: 5,
unique: true,
},
),
byWithdrawalGroupId: describeIndex(
"byWithdrawalGroupId",
"withdrawalGroupId",
{
versionAdded: 5,
},
{},
),
byStatus: describeIndex("byStatus", "status"),
},
),
peerPullPaymentIncoming: describeStore(
"peerPullPaymentIncoming",
peerPullDebit: describeStore(
"peerPullDebit",
describeContents<PeerPullPaymentIncomingRecord>({
keyPath: "peerPullPaymentIncomingId",
keyPath: "peerPullDebitId",
}),
{
byExchangeAndPurse: describeIndex("byExchangeAndPurse", [
@ -2591,16 +2513,15 @@ export const WalletStoresV1 = {
"byExchangeAndContractPriv",
["exchangeBaseUrl", "contractPriv"],
{
versionAdded: 5,
unique: true,
},
),
byStatus: describeIndex("byStatus", "status"),
},
),
peerPullPaymentInitiations: describeStore(
"peerPullPaymentInitiations",
describeContents<PeerPullPaymentInitiationRecord>({
peerPullCredit: describeStore(
"peerPullCredit",
describeContents<PeerPullCreditRecord>({
keyPath: "pursePub",
}),
{
@ -2609,14 +2530,13 @@ export const WalletStoresV1 = {
"byWithdrawalGroupId",
"withdrawalGroupId",
{
versionAdded: 5,
},
),
},
),
peerPushPaymentInitiations: describeStore(
"peerPushPaymentInitiations",
describeContents<PeerPushPaymentInitiationRecord>({
peerPushDebit: describeStore(
"peerPushDebit",
describeContents<PeerPushDebitRecord>({
keyPath: "pursePub",
}),
{
@ -2641,7 +2561,6 @@ export const WalletStoresV1 = {
"userAttention",
describeContents<UserAttentionRecord>({
keyPath: ["entityId", "info.type"],
versionAdded: 2,
}),
{},
),
@ -2649,12 +2568,10 @@ export const WalletStoresV1 = {
"refundGroups",
describeContents<RefundGroupRecord>({
keyPath: "refundGroupId",
versionAdded: 7,
}),
{
byProposalId: describeIndex("byProposalId", "proposalId"),
byStatus: describeIndex("byStatus", "status", {
versionAdded: 10,
}),
},
),
@ -2662,7 +2579,6 @@ export const WalletStoresV1 = {
"refundItems",
describeContents<RefundItemRecord>({
keyPath: "id",
versionAdded: 7,
autoIncrement: true,
}),
{
@ -2677,7 +2593,6 @@ export const WalletStoresV1 = {
"fixups",
describeContents<FixupRecord>({
keyPath: "fixupName",
versionAdded: 2,
}),
{},
),
@ -2905,106 +2820,7 @@ export interface FixupDescription {
/**
* Manual migrations between minor versions of the DB schema.
*/
export const walletDbFixups: FixupDescription[] = [
{
name: "RefreshGroupRecord_currency",
async fn(tx): Promise<void> {
await tx.refreshGroups.iter().forEachAsync(async (rg) => {
if (rg.currency) {
return;
}
// Empty refresh group without input coin, delete it!
if (rg.inputPerCoin.length === 0) {
await tx.refreshGroups.delete(rg.refreshGroupId);
return;
}
rg.currency = Amounts.parseOrThrow(rg.inputPerCoin[0]).currency;
await tx.refreshGroups.put(rg);
});
},
},
{
name: "DepositGroupRecord_transactionPerCoin",
async fn(tx): Promise<void> {
await tx.depositGroups.iter().forEachAsync(async (dg) => {
if (dg.transactionPerCoin) {
return;
}
dg.transactionPerCoin = dg.depositedPerCoin.map(
(c) => DepositElementStatus.Unknown,
);
await tx.depositGroups.put(dg);
});
},
},
{
name: "PeerPullPaymentIncomingRecord_totalCostEstimated_add",
async fn(tx): Promise<void> {
await tx.peerPullPaymentIncoming.iter().forEachAsync(async (pi) => {
if (pi.totalCostEstimated) {
return;
}
// Not really the cost, but a good substitute for older transactions
// that don't sture the effective cost of the transaction.
pi.totalCostEstimated = pi.contractTerms.amount;
await tx.peerPullPaymentIncoming.put(pi);
});
},
},
{
name: "PeerPushPaymentIncomingRecord_totalCostEstimated_add",
async fn(tx): Promise<void> {
await tx.peerPushPaymentIncoming.iter().forEachAsync(async (pi) => {
if (pi.estimatedAmountEffective) {
return;
}
const contractTerms = await tx.contractTerms.get(pi.contractTermsHash);
if (!contractTerms) {
// Not sure what we can do here!
} else {
// Not really the cost, but a good substitute for older transactions
// that don't sture the effective cost of the transaction.
pi.estimatedAmountEffective = contractTerms.contractTermsRaw.amount;
await tx.peerPushPaymentIncoming.put(pi);
}
});
},
},
{
name: "PeerPullPaymentInitiationRecord_estimatedAmountEffective_add",
async fn(tx): Promise<void> {
await tx.peerPullPaymentInitiations.iter().forEachAsync(async (pi) => {
if (pi.estimatedAmountEffective) {
return;
}
pi.estimatedAmountEffective = pi.amount;
await tx.peerPullPaymentInitiations.put(pi);
});
},
},
{
name: "PeerPushPaymentInitiationRecord_ALL_removeLegacyTx",
async fn(tx): Promise<void> {
await tx.peerPushPaymentInitiations.iter().forEachAsync(async (pi) => {
// Remove legacy transactions that don't have the totalCost field yet.
if (!pi.totalCost) {
await tx.peerPushPaymentInitiations.delete(pi.pursePub);
}
});
},
},
{
name: "CoinAvailabilityRecord_visibleCoinCount_add",
async fn(tx): Promise<void> {
await tx.coinAvailability.iter().forEachAsync(async (r) => {
if (r.visibleCoinCount == null) {
r.visibleCoinCount = r.freshCoinCount;
await tx.coinAvailability.put(r);
}
});
},
},
];
export const walletDbFixups: FixupDescription[] = [];
const logger = new Logger("db.ts");

View File

@ -163,7 +163,7 @@ export async function getBalancesInsideTransaction(
case WithdrawalGroupStatus.AbortedExchange:
case WithdrawalGroupStatus.FailedAbortingBank:
case WithdrawalGroupStatus.FailedBankAborted:
case WithdrawalGroupStatus.Finished:
case WithdrawalGroupStatus.Done:
// Does not count as pendingIncoming
return;
case WithdrawalGroupStatus.PendingReady:

View File

@ -52,9 +52,9 @@ import {
BackupProviderRecord,
DepositGroupRecord,
PeerPullPaymentIncomingRecord,
PeerPullPaymentInitiationRecord,
PeerPullCreditRecord,
PeerPushPaymentIncomingRecord,
PeerPushPaymentInitiationRecord,
PeerPushDebitRecord,
PurchaseRecord,
RecoupGroupRecord,
RefreshGroupRecord,
@ -271,7 +271,7 @@ function convertTaskToTransactionId(
case PendingTaskType.PeerPullDebit:
return constructTransactionIdentifier({
tag: TransactionType.PeerPullDebit,
peerPullPaymentIncomingId: parsedTaskId.peerPullPaymentIncomingId,
peerPullDebitId: parsedTaskId.peerPullDebitId,
});
// FIXME: This doesn't distinguish internal-withdrawal.
// Maybe we should have a different task type for that as well?
@ -284,7 +284,7 @@ function convertTaskToTransactionId(
case PendingTaskType.PeerPushCredit:
return constructTransactionIdentifier({
tag: TransactionType.PeerPushCredit,
peerPushPaymentIncomingId: parsedTaskId.peerPushPaymentIncomingId,
peerPushCreditId: parsedTaskId.peerPushCreditId,
});
case PendingTaskType.Deposit:
return constructTransactionIdentifier({
@ -836,9 +836,9 @@ export type ParsedTaskIdentifier =
| { tag: PendingTaskType.Deposit; depositGroupId: string }
| { tag: PendingTaskType.ExchangeCheckRefresh; exchangeBaseUrl: string }
| { tag: PendingTaskType.ExchangeUpdate; exchangeBaseUrl: string }
| { tag: PendingTaskType.PeerPullDebit; peerPullPaymentIncomingId: string }
| { tag: PendingTaskType.PeerPullDebit; peerPullDebitId: string }
| { tag: PendingTaskType.PeerPullCredit; pursePub: string }
| { tag: PendingTaskType.PeerPushCredit; peerPushPaymentIncomingId: string }
| { tag: PendingTaskType.PeerPushCredit; peerPushCreditId: string }
| { tag: PendingTaskType.PeerPushDebit; pursePub: string }
| { tag: PendingTaskType.Purchase; proposalId: string }
| { tag: PendingTaskType.Recoup; recoupGroupId: string }
@ -865,9 +865,9 @@ export function parseTaskIdentifier(x: string): ParsedTaskIdentifier {
case PendingTaskType.PeerPullCredit:
return { tag: type, pursePub: rest[0] };
case PendingTaskType.PeerPullDebit:
return { tag: type, peerPullPaymentIncomingId: rest[0] };
return { tag: type, peerPullDebitId: rest[0] };
case PendingTaskType.PeerPushCredit:
return { tag: type, peerPushPaymentIncomingId: rest[0] };
return { tag: type, peerPushCreditId: rest[0] };
case PendingTaskType.PeerPushDebit:
return { tag: type, pursePub: rest[0] };
case PendingTaskType.Purchase:
@ -896,9 +896,9 @@ export function constructTaskIdentifier(p: ParsedTaskIdentifier): TaskId {
case PendingTaskType.ExchangeUpdate:
return `${p.tag}:${p.exchangeBaseUrl}` as TaskId;
case PendingTaskType.PeerPullDebit:
return `${p.tag}:${p.peerPullPaymentIncomingId}` as TaskId;
return `${p.tag}:${p.peerPullDebitId}` as TaskId;
case PendingTaskType.PeerPushCredit:
return `${p.tag}:${p.peerPushPaymentIncomingId}` as TaskId;
return `${p.tag}:${p.peerPushCreditId}` as TaskId;
case PendingTaskType.PeerPullCredit:
return `${p.tag}:${p.pursePub}` as TaskId;
case PendingTaskType.PeerPushDebit:
@ -950,23 +950,23 @@ export namespace TaskIdentifiers {
return `${PendingTaskType.Backup}:${backupRecord.baseUrl}` as TaskId;
}
export function forPeerPushPaymentInitiation(
ppi: PeerPushPaymentInitiationRecord,
ppi: PeerPushDebitRecord,
): TaskId {
return `${PendingTaskType.PeerPushDebit}:${ppi.pursePub}` as TaskId;
}
export function forPeerPullPaymentInitiation(
ppi: PeerPullPaymentInitiationRecord,
ppi: PeerPullCreditRecord,
): TaskId {
return `${PendingTaskType.PeerPullCredit}:${ppi.pursePub}` as TaskId;
}
export function forPeerPullPaymentDebit(
ppi: PeerPullPaymentIncomingRecord,
): TaskId {
return `${PendingTaskType.PeerPullDebit}:${ppi.peerPullPaymentIncomingId}` as TaskId;
return `${PendingTaskType.PeerPullDebit}:${ppi.peerPullDebitId}` as TaskId;
}
export function forPeerPushCredit(
ppi: PeerPushPaymentIncomingRecord,
): TaskId {
return `${PendingTaskType.PeerPushCredit}:${ppi.peerPushPaymentIncomingId}` as TaskId;
return `${PendingTaskType.PeerPushCredit}:${ppi.peerPushCreditId}` as TaskId;
}
}

View File

@ -541,7 +541,7 @@ async function processDownloadProposal(
// if original order is refunded.
if (otherPurchase && otherPurchase.refundAmountAwaiting === undefined) {
logger.warn("repurchase detected");
p.purchaseStatus = PurchaseStatus.RepurchaseDetected;
p.purchaseStatus = PurchaseStatus.DoneRepurchaseDetected;
p.repurchaseProposalId = otherPurchase.proposalId;
await tx.purchases.put(p);
} else {
@ -974,7 +974,7 @@ export async function checkPaymentByProposalId(
if (!proposal) {
throw Error(`could not get proposal ${proposalId}`);
}
if (proposal.purchaseStatus === PurchaseStatus.RepurchaseDetected) {
if (proposal.purchaseStatus === PurchaseStatus.DoneRepurchaseDetected) {
const existingProposalId = proposal.repurchaseProposalId;
if (existingProposalId) {
logger.trace("using existing purchase for same product");
@ -1527,7 +1527,7 @@ export async function processPurchase(
return processPurchaseDialogShared(ws, purchase);
case PurchaseStatus.FailedClaim:
case PurchaseStatus.Done:
case PurchaseStatus.RepurchaseDetected:
case PurchaseStatus.DoneRepurchaseDetected:
case PurchaseStatus.DialogProposed:
case PurchaseStatus.AbortedProposalRefused:
case PurchaseStatus.AbortedIncompletePayment:
@ -2099,7 +2099,7 @@ export function computePayMerchantTransactionState(
return {
major: TransactionMajorState.Done,
};
case PurchaseStatus.RepurchaseDetected:
case PurchaseStatus.DoneRepurchaseDetected:
return {
major: TransactionMajorState.Failed,
minor: TransactionMinorState.Repurchase,
@ -2176,7 +2176,7 @@ export function computePayMerchantTransactionActions(
return [TransactionAction.Delete];
case PurchaseStatus.Done:
return [TransactionAction.Delete];
case PurchaseStatus.RepurchaseDetected:
case PurchaseStatus.DoneRepurchaseDetected:
return [TransactionAction.Delete];
case PurchaseStatus.AbortedIncompletePayment:
return [TransactionAction.Delete];

View File

@ -55,8 +55,8 @@ import {
import {
KycPendingInfo,
KycUserType,
PeerPullPaymentInitiationRecord,
PeerPullPaymentInitiationStatus,
PeerPullCreditRecord,
PeerPullPaymentCreditStatus,
WithdrawalGroupStatus,
WithdrawalRecordType,
updateExchangeFromUrl,
@ -90,7 +90,7 @@ const logger = new Logger("pay-peer-pull-credit.ts");
async function queryPurseForPeerPullCredit(
ws: InternalWalletState,
pullIni: PeerPullPaymentInitiationRecord,
pullIni: PeerPullCreditRecord,
cancellationToken: CancellationToken,
): Promise<LongpollResult> {
const purseDepositUrl = new URL(
@ -159,18 +159,18 @@ async function queryPurseForPeerPullCredit(
pursePub: pullIni.pursePub,
});
const transitionInfo = await ws.db
.mktx((x) => [x.peerPullPaymentInitiations])
.mktx((x) => [x.peerPullCredit])
.runReadWrite(async (tx) => {
const finPi = await tx.peerPullPaymentInitiations.get(pullIni.pursePub);
const finPi = await tx.peerPullCredit.get(pullIni.pursePub);
if (!finPi) {
logger.warn("peerPullPaymentInitiation not found anymore");
logger.warn("peerPullCredit not found anymore");
return;
}
const oldTxState = computePeerPullCreditTransactionState(finPi);
if (finPi.status === PeerPullPaymentInitiationStatus.PendingReady) {
finPi.status = PeerPullPaymentInitiationStatus.PendingWithdrawing;
if (finPi.status === PeerPullPaymentCreditStatus.PendingReady) {
finPi.status = PeerPullPaymentCreditStatus.PendingWithdrawing;
}
await tx.peerPullPaymentInitiations.put(finPi);
await tx.peerPullCredit.put(finPi);
const newTxState = computePeerPullCreditTransactionState(finPi);
return { oldTxState, newTxState };
});
@ -214,22 +214,22 @@ async function longpollKycStatus(
kycStatusRes.status === HttpStatusCode.NoContent
) {
const transitionInfo = await ws.db
.mktx((x) => [x.peerPullPaymentInitiations])
.mktx((x) => [x.peerPullCredit])
.runReadWrite(async (tx) => {
const peerIni = await tx.peerPullPaymentInitiations.get(pursePub);
const peerIni = await tx.peerPullCredit.get(pursePub);
if (!peerIni) {
return;
}
if (
peerIni.status !==
PeerPullPaymentInitiationStatus.PendingMergeKycRequired
PeerPullPaymentCreditStatus.PendingMergeKycRequired
) {
return;
}
const oldTxState = computePeerPullCreditTransactionState(peerIni);
peerIni.status = PeerPullPaymentInitiationStatus.PendingCreatePurse;
peerIni.status = PeerPullPaymentCreditStatus.PendingCreatePurse;
const newTxState = computePeerPullCreditTransactionState(peerIni);
await tx.peerPullPaymentInitiations.put(peerIni);
await tx.peerPullCredit.put(peerIni);
return { oldTxState, newTxState };
});
notifyTransition(ws, transactionId, transitionInfo);
@ -250,7 +250,7 @@ async function longpollKycStatus(
async function processPeerPullCreditAbortingDeletePurse(
ws: InternalWalletState,
peerPullIni: PeerPullPaymentInitiationRecord,
peerPullIni: PeerPullCreditRecord,
): Promise<TaskRunResult> {
const { pursePub, pursePriv } = peerPullIni;
const transactionId = constructTransactionIdentifier({
@ -272,24 +272,24 @@ async function processPeerPullCreditAbortingDeletePurse(
const transitionInfo = await ws.db
.mktx((x) => [
x.peerPullPaymentInitiations,
x.peerPullCredit,
x.refreshGroups,
x.denominations,
x.coinAvailability,
x.coins,
])
.runReadWrite(async (tx) => {
const ppiRec = await tx.peerPullPaymentInitiations.get(pursePub);
const ppiRec = await tx.peerPullCredit.get(pursePub);
if (!ppiRec) {
return undefined;
}
if (
ppiRec.status !== PeerPullPaymentInitiationStatus.AbortingDeletePurse
ppiRec.status !== PeerPullPaymentCreditStatus.AbortingDeletePurse
) {
return undefined;
}
const oldTxState = computePeerPullCreditTransactionState(ppiRec);
ppiRec.status = PeerPullPaymentInitiationStatus.Aborted;
ppiRec.status = PeerPullPaymentCreditStatus.Aborted;
const newTxState = computePeerPullCreditTransactionState(ppiRec);
return {
oldTxState,
@ -303,7 +303,7 @@ async function processPeerPullCreditAbortingDeletePurse(
async function handlePeerPullCreditWithdrawing(
ws: InternalWalletState,
pullIni: PeerPullPaymentInitiationRecord,
pullIni: PeerPullCreditRecord,
): Promise<TaskRunResult> {
if (!pullIni.withdrawalGroupId) {
throw Error("invalid db state (withdrawing, but no withdrawal group ID");
@ -315,14 +315,14 @@ async function handlePeerPullCreditWithdrawing(
const wgId = pullIni.withdrawalGroupId;
let finished: boolean = false;
const transitionInfo = await ws.db
.mktx((x) => [x.peerPullPaymentInitiations, x.withdrawalGroups])
.mktx((x) => [x.peerPullCredit, x.withdrawalGroups])
.runReadWrite(async (tx) => {
const ppi = await tx.peerPullPaymentInitiations.get(pullIni.pursePub);
const ppi = await tx.peerPullCredit.get(pullIni.pursePub);
if (!ppi) {
finished = true;
return;
}
if (ppi.status !== PeerPullPaymentInitiationStatus.PendingWithdrawing) {
if (ppi.status !== PeerPullPaymentCreditStatus.PendingWithdrawing) {
finished = true;
return;
}
@ -333,13 +333,13 @@ async function handlePeerPullCreditWithdrawing(
return undefined;
}
switch (wg.status) {
case WithdrawalGroupStatus.Finished:
case WithdrawalGroupStatus.Done:
finished = true;
ppi.status = PeerPullPaymentInitiationStatus.Done;
ppi.status = PeerPullPaymentCreditStatus.Done;
break;
// FIXME: Also handle other final states!
}
await tx.peerPullPaymentInitiations.put(ppi);
await tx.peerPullCredit.put(ppi);
const newTxState = computePeerPullCreditTransactionState(ppi);
return {
oldTxState,
@ -357,7 +357,7 @@ async function handlePeerPullCreditWithdrawing(
async function handlePeerPullCreditCreatePurse(
ws: InternalWalletState,
pullIni: PeerPullPaymentInitiationRecord,
pullIni: PeerPullCreditRecord,
): Promise<TaskRunResult> {
const purseFee = Amounts.stringify(Amounts.zeroOfAmount(pullIni.amount));
const pursePub = pullIni.pursePub;
@ -444,15 +444,15 @@ async function handlePeerPullCreditCreatePurse(
});
const transitionInfo = await ws.db
.mktx((x) => [x.peerPullPaymentInitiations])
.mktx((x) => [x.peerPullCredit])
.runReadWrite(async (tx) => {
const pi2 = await tx.peerPullPaymentInitiations.get(pursePub);
const pi2 = await tx.peerPullCredit.get(pursePub);
if (!pi2) {
return;
}
const oldTxState = computePeerPullCreditTransactionState(pi2);
pi2.status = PeerPullPaymentInitiationStatus.PendingReady;
await tx.peerPullPaymentInitiations.put(pi2);
pi2.status = PeerPullPaymentCreditStatus.PendingReady;
await tx.peerPullCredit.put(pi2);
const newTxState = computePeerPullCreditTransactionState(pi2);
return { oldTxState, newTxState };
});
@ -466,9 +466,9 @@ export async function processPeerPullCredit(
pursePub: string,
): Promise<TaskRunResult> {
const pullIni = await ws.db
.mktx((x) => [x.peerPullPaymentInitiations])
.mktx((x) => [x.peerPullCredit])
.runReadOnly(async (tx) => {
return tx.peerPullPaymentInitiations.get(pursePub);
return tx.peerPullCredit.get(pursePub);
});
if (!pullIni) {
throw Error("peer pull payment initiation not found in database");
@ -490,10 +490,10 @@ export async function processPeerPullCredit(
logger.trace(`processing ${retryTag}, status=${pullIni.status}`);
switch (pullIni.status) {
case PeerPullPaymentInitiationStatus.Done: {
case PeerPullPaymentCreditStatus.Done: {
return TaskRunResult.finished();
}
case PeerPullPaymentInitiationStatus.PendingReady:
case PeerPullPaymentCreditStatus.PendingReady:
runLongpollAsync(ws, retryTag, async (cancellationToken) =>
queryPurseForPeerPullCredit(ws, pullIni, cancellationToken),
);
@ -503,7 +503,7 @@ export async function processPeerPullCredit(
return {
type: TaskRunResultType.Longpoll,
};
case PeerPullPaymentInitiationStatus.PendingMergeKycRequired: {
case PeerPullPaymentCreditStatus.PendingMergeKycRequired: {
if (!pullIni.kycInfo) {
throw Error("invalid state, kycInfo required");
}
@ -515,19 +515,19 @@ export async function processPeerPullCredit(
"individual",
);
}
case PeerPullPaymentInitiationStatus.PendingCreatePurse:
case PeerPullPaymentCreditStatus.PendingCreatePurse:
return handlePeerPullCreditCreatePurse(ws, pullIni);
case PeerPullPaymentInitiationStatus.AbortingDeletePurse:
case PeerPullPaymentCreditStatus.AbortingDeletePurse:
return await processPeerPullCreditAbortingDeletePurse(ws, pullIni);
case PeerPullPaymentInitiationStatus.PendingWithdrawing:
case PeerPullPaymentCreditStatus.PendingWithdrawing:
return handlePeerPullCreditWithdrawing(ws, pullIni);
case PeerPullPaymentInitiationStatus.Aborted:
case PeerPullPaymentInitiationStatus.Failed:
case PeerPullPaymentInitiationStatus.SuspendedAbortingDeletePurse:
case PeerPullPaymentInitiationStatus.SuspendedCreatePurse:
case PeerPullPaymentInitiationStatus.SuspendedMergeKycRequired:
case PeerPullPaymentInitiationStatus.SuspendedReady:
case PeerPullPaymentInitiationStatus.SuspendedWithdrawing:
case PeerPullPaymentCreditStatus.Aborted:
case PeerPullPaymentCreditStatus.Failed:
case PeerPullPaymentCreditStatus.SuspendedAbortingDeletePurse:
case PeerPullPaymentCreditStatus.SuspendedCreatePurse:
case PeerPullPaymentCreditStatus.SuspendedMergeKycRequired:
case PeerPullPaymentCreditStatus.SuspendedReady:
case PeerPullPaymentCreditStatus.SuspendedWithdrawing:
break;
default:
assertUnreachable(pullIni.status);
@ -538,7 +538,7 @@ export async function processPeerPullCredit(
async function processPeerPullCreditKycRequired(
ws: InternalWalletState,
peerIni: PeerPullPaymentInitiationRecord,
peerIni: PeerPullCreditRecord,
kycPending: WalletKycUuid,
): Promise<TaskRunResult> {
const transactionId = constructTransactionIdentifier({
@ -570,9 +570,9 @@ async function processPeerPullCreditKycRequired(
const kycStatus = await kycStatusRes.json();
logger.info(`kyc status: ${j2s(kycStatus)}`);
const { transitionInfo, result } = await ws.db
.mktx((x) => [x.peerPullPaymentInitiations])
.mktx((x) => [x.peerPullCredit])
.runReadWrite(async (tx) => {
const peerInc = await tx.peerPullPaymentInitiations.get(pursePub);
const peerInc = await tx.peerPullCredit.get(pursePub);
if (!peerInc) {
return {
transitionInfo: undefined,
@ -586,9 +586,9 @@ async function processPeerPullCreditKycRequired(
};
peerInc.kycUrl = kycStatus.kyc_url;
peerInc.status =
PeerPullPaymentInitiationStatus.PendingMergeKycRequired;
PeerPullPaymentCreditStatus.PendingMergeKycRequired;
const newTxState = computePeerPullCreditTransactionState(peerInc);
await tx.peerPullPaymentInitiations.put(peerInc);
await tx.peerPullCredit.put(peerInc);
// We'll remove this eventually! New clients should rely on the
// kycUrl field of the transaction, not the error code.
const res: TaskRunResult = {
@ -758,9 +758,9 @@ export async function initiatePeerPullPayment(
);
const transitionInfo = await ws.db
.mktx((x) => [x.peerPullPaymentInitiations, x.contractTerms])
.mktx((x) => [x.peerPullCredit, x.contractTerms])
.runReadWrite(async (tx) => {
const ppi: PeerPullPaymentInitiationRecord = {
const ppi: PeerPullCreditRecord = {
amount: req.partialContractTerms.amount,
contractTermsHash: hContractTerms,
exchangeBaseUrl: exchangeBaseUrl,
@ -768,7 +768,7 @@ export async function initiatePeerPullPayment(
pursePub: pursePair.pub,
mergePriv: mergePair.priv,
mergePub: mergePair.pub,
status: PeerPullPaymentInitiationStatus.PendingCreatePurse,
status: PeerPullPaymentCreditStatus.PendingCreatePurse,
contractTerms: contractTerms,
mergeTimestamp,
contractEncNonce,
@ -778,7 +778,7 @@ export async function initiatePeerPullPayment(
withdrawalGroupId,
estimatedAmountEffective: wi.withdrawalAmountEffective,
};
await tx.peerPullPaymentInitiations.put(ppi);
await tx.peerPullCredit.put(ppi);
const oldTxState: TransactionState = {
major: TransactionMajorState.None,
};
@ -826,39 +826,39 @@ export async function suspendPeerPullCreditTransaction(
});
stopLongpolling(ws, taskId);
const transitionInfo = await ws.db
.mktx((x) => [x.peerPullPaymentInitiations])
.mktx((x) => [x.peerPullCredit])
.runReadWrite(async (tx) => {
const pullCreditRec = await tx.peerPullPaymentInitiations.get(pursePub);
const pullCreditRec = await tx.peerPullCredit.get(pursePub);
if (!pullCreditRec) {
logger.warn(`peer pull credit ${pursePub} not found`);
return;
}
let newStatus: PeerPullPaymentInitiationStatus | undefined = undefined;
let newStatus: PeerPullPaymentCreditStatus | undefined = undefined;
switch (pullCreditRec.status) {
case PeerPullPaymentInitiationStatus.PendingCreatePurse:
newStatus = PeerPullPaymentInitiationStatus.SuspendedCreatePurse;
case PeerPullPaymentCreditStatus.PendingCreatePurse:
newStatus = PeerPullPaymentCreditStatus.SuspendedCreatePurse;
break;
case PeerPullPaymentInitiationStatus.PendingMergeKycRequired:
newStatus = PeerPullPaymentInitiationStatus.SuspendedMergeKycRequired;
case PeerPullPaymentCreditStatus.PendingMergeKycRequired:
newStatus = PeerPullPaymentCreditStatus.SuspendedMergeKycRequired;
break;
case PeerPullPaymentInitiationStatus.PendingWithdrawing:
newStatus = PeerPullPaymentInitiationStatus.SuspendedWithdrawing;
case PeerPullPaymentCreditStatus.PendingWithdrawing:
newStatus = PeerPullPaymentCreditStatus.SuspendedWithdrawing;
break;
case PeerPullPaymentInitiationStatus.PendingReady:
newStatus = PeerPullPaymentInitiationStatus.SuspendedReady;
case PeerPullPaymentCreditStatus.PendingReady:
newStatus = PeerPullPaymentCreditStatus.SuspendedReady;
break;
case PeerPullPaymentInitiationStatus.AbortingDeletePurse:
case PeerPullPaymentCreditStatus.AbortingDeletePurse:
newStatus =
PeerPullPaymentInitiationStatus.SuspendedAbortingDeletePurse;
PeerPullPaymentCreditStatus.SuspendedAbortingDeletePurse;
break;
case PeerPullPaymentInitiationStatus.Done:
case PeerPullPaymentInitiationStatus.SuspendedCreatePurse:
case PeerPullPaymentInitiationStatus.SuspendedMergeKycRequired:
case PeerPullPaymentInitiationStatus.SuspendedReady:
case PeerPullPaymentInitiationStatus.SuspendedWithdrawing:
case PeerPullPaymentInitiationStatus.Aborted:
case PeerPullPaymentInitiationStatus.Failed:
case PeerPullPaymentInitiationStatus.SuspendedAbortingDeletePurse:
case PeerPullPaymentCreditStatus.Done:
case PeerPullPaymentCreditStatus.SuspendedCreatePurse:
case PeerPullPaymentCreditStatus.SuspendedMergeKycRequired:
case PeerPullPaymentCreditStatus.SuspendedReady:
case PeerPullPaymentCreditStatus.SuspendedWithdrawing:
case PeerPullPaymentCreditStatus.Aborted:
case PeerPullPaymentCreditStatus.Failed:
case PeerPullPaymentCreditStatus.SuspendedAbortingDeletePurse:
break;
default:
assertUnreachable(pullCreditRec.status);
@ -867,7 +867,7 @@ export async function suspendPeerPullCreditTransaction(
const oldTxState = computePeerPullCreditTransactionState(pullCreditRec);
pullCreditRec.status = newStatus;
const newTxState = computePeerPullCreditTransactionState(pullCreditRec);
await tx.peerPullPaymentInitiations.put(pullCreditRec);
await tx.peerPullCredit.put(pullCreditRec);
return {
oldTxState,
newTxState,
@ -892,33 +892,33 @@ export async function abortPeerPullCreditTransaction(
});
stopLongpolling(ws, taskId);
const transitionInfo = await ws.db
.mktx((x) => [x.peerPullPaymentInitiations])
.mktx((x) => [x.peerPullCredit])
.runReadWrite(async (tx) => {
const pullCreditRec = await tx.peerPullPaymentInitiations.get(pursePub);
const pullCreditRec = await tx.peerPullCredit.get(pursePub);
if (!pullCreditRec) {
logger.warn(`peer pull credit ${pursePub} not found`);
return;
}
let newStatus: PeerPullPaymentInitiationStatus | undefined = undefined;
let newStatus: PeerPullPaymentCreditStatus | undefined = undefined;
switch (pullCreditRec.status) {
case PeerPullPaymentInitiationStatus.PendingCreatePurse:
case PeerPullPaymentInitiationStatus.PendingMergeKycRequired:
newStatus = PeerPullPaymentInitiationStatus.AbortingDeletePurse;
case PeerPullPaymentCreditStatus.PendingCreatePurse:
case PeerPullPaymentCreditStatus.PendingMergeKycRequired:
newStatus = PeerPullPaymentCreditStatus.AbortingDeletePurse;
break;
case PeerPullPaymentInitiationStatus.PendingWithdrawing:
case PeerPullPaymentCreditStatus.PendingWithdrawing:
throw Error("can't abort anymore");
case PeerPullPaymentInitiationStatus.PendingReady:
newStatus = PeerPullPaymentInitiationStatus.AbortingDeletePurse;
case PeerPullPaymentCreditStatus.PendingReady:
newStatus = PeerPullPaymentCreditStatus.AbortingDeletePurse;
break;
case PeerPullPaymentInitiationStatus.Done:
case PeerPullPaymentInitiationStatus.SuspendedCreatePurse:
case PeerPullPaymentInitiationStatus.SuspendedMergeKycRequired:
case PeerPullPaymentInitiationStatus.SuspendedReady:
case PeerPullPaymentInitiationStatus.SuspendedWithdrawing:
case PeerPullPaymentInitiationStatus.Aborted:
case PeerPullPaymentInitiationStatus.AbortingDeletePurse:
case PeerPullPaymentInitiationStatus.Failed:
case PeerPullPaymentInitiationStatus.SuspendedAbortingDeletePurse:
case PeerPullPaymentCreditStatus.Done:
case PeerPullPaymentCreditStatus.SuspendedCreatePurse:
case PeerPullPaymentCreditStatus.SuspendedMergeKycRequired:
case PeerPullPaymentCreditStatus.SuspendedReady:
case PeerPullPaymentCreditStatus.SuspendedWithdrawing:
case PeerPullPaymentCreditStatus.Aborted:
case PeerPullPaymentCreditStatus.AbortingDeletePurse:
case PeerPullPaymentCreditStatus.Failed:
case PeerPullPaymentCreditStatus.SuspendedAbortingDeletePurse:
break;
default:
assertUnreachable(pullCreditRec.status);
@ -927,7 +927,7 @@ export async function abortPeerPullCreditTransaction(
const oldTxState = computePeerPullCreditTransactionState(pullCreditRec);
pullCreditRec.status = newStatus;
const newTxState = computePeerPullCreditTransactionState(pullCreditRec);
await tx.peerPullPaymentInitiations.put(pullCreditRec);
await tx.peerPullCredit.put(pullCreditRec);
return {
oldTxState,
newTxState,
@ -952,30 +952,30 @@ export async function failPeerPullCreditTransaction(
});
stopLongpolling(ws, taskId);
const transitionInfo = await ws.db
.mktx((x) => [x.peerPullPaymentInitiations])
.mktx((x) => [x.peerPullCredit])
.runReadWrite(async (tx) => {
const pullCreditRec = await tx.peerPullPaymentInitiations.get(pursePub);
const pullCreditRec = await tx.peerPullCredit.get(pursePub);
if (!pullCreditRec) {
logger.warn(`peer pull credit ${pursePub} not found`);
return;
}
let newStatus: PeerPullPaymentInitiationStatus | undefined = undefined;
let newStatus: PeerPullPaymentCreditStatus | undefined = undefined;
switch (pullCreditRec.status) {
case PeerPullPaymentInitiationStatus.PendingCreatePurse:
case PeerPullPaymentInitiationStatus.PendingMergeKycRequired:
case PeerPullPaymentInitiationStatus.PendingWithdrawing:
case PeerPullPaymentInitiationStatus.PendingReady:
case PeerPullPaymentInitiationStatus.Done:
case PeerPullPaymentInitiationStatus.SuspendedCreatePurse:
case PeerPullPaymentInitiationStatus.SuspendedMergeKycRequired:
case PeerPullPaymentInitiationStatus.SuspendedReady:
case PeerPullPaymentInitiationStatus.SuspendedWithdrawing:
case PeerPullPaymentInitiationStatus.Aborted:
case PeerPullPaymentInitiationStatus.Failed:
case PeerPullPaymentCreditStatus.PendingCreatePurse:
case PeerPullPaymentCreditStatus.PendingMergeKycRequired:
case PeerPullPaymentCreditStatus.PendingWithdrawing:
case PeerPullPaymentCreditStatus.PendingReady:
case PeerPullPaymentCreditStatus.Done:
case PeerPullPaymentCreditStatus.SuspendedCreatePurse:
case PeerPullPaymentCreditStatus.SuspendedMergeKycRequired:
case PeerPullPaymentCreditStatus.SuspendedReady:
case PeerPullPaymentCreditStatus.SuspendedWithdrawing:
case PeerPullPaymentCreditStatus.Aborted:
case PeerPullPaymentCreditStatus.Failed:
break;
case PeerPullPaymentInitiationStatus.AbortingDeletePurse:
case PeerPullPaymentInitiationStatus.SuspendedAbortingDeletePurse:
newStatus = PeerPullPaymentInitiationStatus.Failed;
case PeerPullPaymentCreditStatus.AbortingDeletePurse:
case PeerPullPaymentCreditStatus.SuspendedAbortingDeletePurse:
newStatus = PeerPullPaymentCreditStatus.Failed;
break;
default:
assertUnreachable(pullCreditRec.status);
@ -984,7 +984,7 @@ export async function failPeerPullCreditTransaction(
const oldTxState = computePeerPullCreditTransactionState(pullCreditRec);
pullCreditRec.status = newStatus;
const newTxState = computePeerPullCreditTransactionState(pullCreditRec);
await tx.peerPullPaymentInitiations.put(pullCreditRec);
await tx.peerPullCredit.put(pullCreditRec);
return {
oldTxState,
newTxState,
@ -1009,38 +1009,38 @@ export async function resumePeerPullCreditTransaction(
});
stopLongpolling(ws, taskId);
const transitionInfo = await ws.db
.mktx((x) => [x.peerPullPaymentInitiations])
.mktx((x) => [x.peerPullCredit])
.runReadWrite(async (tx) => {
const pullCreditRec = await tx.peerPullPaymentInitiations.get(pursePub);
const pullCreditRec = await tx.peerPullCredit.get(pursePub);
if (!pullCreditRec) {
logger.warn(`peer pull credit ${pursePub} not found`);
return;
}
let newStatus: PeerPullPaymentInitiationStatus | undefined = undefined;
let newStatus: PeerPullPaymentCreditStatus | undefined = undefined;
switch (pullCreditRec.status) {
case PeerPullPaymentInitiationStatus.PendingCreatePurse:
case PeerPullPaymentInitiationStatus.PendingMergeKycRequired:
case PeerPullPaymentInitiationStatus.PendingWithdrawing:
case PeerPullPaymentInitiationStatus.PendingReady:
case PeerPullPaymentInitiationStatus.AbortingDeletePurse:
case PeerPullPaymentInitiationStatus.Done:
case PeerPullPaymentInitiationStatus.Failed:
case PeerPullPaymentInitiationStatus.Aborted:
case PeerPullPaymentCreditStatus.PendingCreatePurse:
case PeerPullPaymentCreditStatus.PendingMergeKycRequired:
case PeerPullPaymentCreditStatus.PendingWithdrawing:
case PeerPullPaymentCreditStatus.PendingReady:
case PeerPullPaymentCreditStatus.AbortingDeletePurse:
case PeerPullPaymentCreditStatus.Done:
case PeerPullPaymentCreditStatus.Failed:
case PeerPullPaymentCreditStatus.Aborted:
break;
case PeerPullPaymentInitiationStatus.SuspendedCreatePurse:
newStatus = PeerPullPaymentInitiationStatus.PendingCreatePurse;
case PeerPullPaymentCreditStatus.SuspendedCreatePurse:
newStatus = PeerPullPaymentCreditStatus.PendingCreatePurse;
break;
case PeerPullPaymentInitiationStatus.SuspendedMergeKycRequired:
newStatus = PeerPullPaymentInitiationStatus.PendingMergeKycRequired;
case PeerPullPaymentCreditStatus.SuspendedMergeKycRequired:
newStatus = PeerPullPaymentCreditStatus.PendingMergeKycRequired;
break;
case PeerPullPaymentInitiationStatus.SuspendedReady:
newStatus = PeerPullPaymentInitiationStatus.PendingReady;
case PeerPullPaymentCreditStatus.SuspendedReady:
newStatus = PeerPullPaymentCreditStatus.PendingReady;
break;
case PeerPullPaymentInitiationStatus.SuspendedWithdrawing:
newStatus = PeerPullPaymentInitiationStatus.PendingWithdrawing;
case PeerPullPaymentCreditStatus.SuspendedWithdrawing:
newStatus = PeerPullPaymentCreditStatus.PendingWithdrawing;
break;
case PeerPullPaymentInitiationStatus.SuspendedAbortingDeletePurse:
newStatus = PeerPullPaymentInitiationStatus.AbortingDeletePurse;
case PeerPullPaymentCreditStatus.SuspendedAbortingDeletePurse:
newStatus = PeerPullPaymentCreditStatus.AbortingDeletePurse;
break;
default:
assertUnreachable(pullCreditRec.status);
@ -1049,7 +1049,7 @@ export async function resumePeerPullCreditTransaction(
const oldTxState = computePeerPullCreditTransactionState(pullCreditRec);
pullCreditRec.status = newStatus;
const newTxState = computePeerPullCreditTransactionState(pullCreditRec);
await tx.peerPullPaymentInitiations.put(pullCreditRec);
await tx.peerPullCredit.put(pullCreditRec);
return {
oldTxState,
newTxState,
@ -1062,67 +1062,67 @@ export async function resumePeerPullCreditTransaction(
}
export function computePeerPullCreditTransactionState(
pullCreditRecord: PeerPullPaymentInitiationRecord,
pullCreditRecord: PeerPullCreditRecord,
): TransactionState {
switch (pullCreditRecord.status) {
case PeerPullPaymentInitiationStatus.PendingCreatePurse:
case PeerPullPaymentCreditStatus.PendingCreatePurse:
return {
major: TransactionMajorState.Pending,
minor: TransactionMinorState.CreatePurse,
};
case PeerPullPaymentInitiationStatus.PendingMergeKycRequired:
case PeerPullPaymentCreditStatus.PendingMergeKycRequired:
return {
major: TransactionMajorState.Pending,
minor: TransactionMinorState.MergeKycRequired,
};
case PeerPullPaymentInitiationStatus.PendingReady:
case PeerPullPaymentCreditStatus.PendingReady:
return {
major: TransactionMajorState.Pending,
minor: TransactionMinorState.Ready,
};
case PeerPullPaymentInitiationStatus.Done:
case PeerPullPaymentCreditStatus.Done:
return {
major: TransactionMajorState.Done,
};
case PeerPullPaymentInitiationStatus.PendingWithdrawing:
case PeerPullPaymentCreditStatus.PendingWithdrawing:
return {
major: TransactionMajorState.Pending,
minor: TransactionMinorState.Withdraw,
};
case PeerPullPaymentInitiationStatus.SuspendedCreatePurse:
case PeerPullPaymentCreditStatus.SuspendedCreatePurse:
return {
major: TransactionMajorState.Suspended,
minor: TransactionMinorState.CreatePurse,
};
case PeerPullPaymentInitiationStatus.SuspendedReady:
case PeerPullPaymentCreditStatus.SuspendedReady:
return {
major: TransactionMajorState.Suspended,
minor: TransactionMinorState.Ready,
};
case PeerPullPaymentInitiationStatus.SuspendedWithdrawing:
case PeerPullPaymentCreditStatus.SuspendedWithdrawing:
return {
major: TransactionMajorState.Pending,
minor: TransactionMinorState.Withdraw,
};
case PeerPullPaymentInitiationStatus.SuspendedMergeKycRequired:
case PeerPullPaymentCreditStatus.SuspendedMergeKycRequired:
return {
major: TransactionMajorState.Suspended,
minor: TransactionMinorState.MergeKycRequired,
};
case PeerPullPaymentInitiationStatus.Aborted:
case PeerPullPaymentCreditStatus.Aborted:
return {
major: TransactionMajorState.Aborted,
};
case PeerPullPaymentInitiationStatus.AbortingDeletePurse:
case PeerPullPaymentCreditStatus.AbortingDeletePurse:
return {
major: TransactionMajorState.Aborting,
minor: TransactionMinorState.DeletePurse,
};
case PeerPullPaymentInitiationStatus.Failed:
case PeerPullPaymentCreditStatus.Failed:
return {
major: TransactionMajorState.Failed,
};
case PeerPullPaymentInitiationStatus.SuspendedAbortingDeletePurse:
case PeerPullPaymentCreditStatus.SuspendedAbortingDeletePurse:
return {
major: TransactionMajorState.Aborting,
minor: TransactionMinorState.DeletePurse,
@ -1131,34 +1131,34 @@ export function computePeerPullCreditTransactionState(
}
export function computePeerPullCreditTransactionActions(
pullCreditRecord: PeerPullPaymentInitiationRecord,
pullCreditRecord: PeerPullCreditRecord,
): TransactionAction[] {
switch (pullCreditRecord.status) {
case PeerPullPaymentInitiationStatus.PendingCreatePurse:
case PeerPullPaymentCreditStatus.PendingCreatePurse:
return [TransactionAction.Abort, TransactionAction.Suspend];
case PeerPullPaymentInitiationStatus.PendingMergeKycRequired:
case PeerPullPaymentCreditStatus.PendingMergeKycRequired:
return [TransactionAction.Abort, TransactionAction.Suspend];
case PeerPullPaymentInitiationStatus.PendingReady:
case PeerPullPaymentCreditStatus.PendingReady:
return [TransactionAction.Abort, TransactionAction.Suspend];
case PeerPullPaymentInitiationStatus.Done:
case PeerPullPaymentCreditStatus.Done:
return [TransactionAction.Delete];
case PeerPullPaymentInitiationStatus.PendingWithdrawing:
case PeerPullPaymentCreditStatus.PendingWithdrawing:
return [TransactionAction.Abort, TransactionAction.Suspend];
case PeerPullPaymentInitiationStatus.SuspendedCreatePurse:
case PeerPullPaymentCreditStatus.SuspendedCreatePurse:
return [TransactionAction.Resume, TransactionAction.Abort];
case PeerPullPaymentInitiationStatus.SuspendedReady:
case PeerPullPaymentCreditStatus.SuspendedReady:
return [TransactionAction.Abort, TransactionAction.Resume];
case PeerPullPaymentInitiationStatus.SuspendedWithdrawing:
case PeerPullPaymentCreditStatus.SuspendedWithdrawing:
return [TransactionAction.Resume, TransactionAction.Fail];
case PeerPullPaymentInitiationStatus.SuspendedMergeKycRequired:
case PeerPullPaymentCreditStatus.SuspendedMergeKycRequired:
return [TransactionAction.Resume, TransactionAction.Fail];
case PeerPullPaymentInitiationStatus.Aborted:
case PeerPullPaymentCreditStatus.Aborted:
return [TransactionAction.Delete];
case PeerPullPaymentInitiationStatus.AbortingDeletePurse:
case PeerPullPaymentCreditStatus.AbortingDeletePurse:
return [TransactionAction.Suspend, TransactionAction.Fail];
case PeerPullPaymentInitiationStatus.Failed:
case PeerPullPaymentCreditStatus.Failed:
return [TransactionAction.Delete];
case PeerPullPaymentInitiationStatus.SuspendedAbortingDeletePurse:
case PeerPullPaymentCreditStatus.SuspendedAbortingDeletePurse:
return [TransactionAction.Resume, TransactionAction.Fail];
}
}

View File

@ -140,10 +140,10 @@ async function handlePurseCreationConflict(
);
await ws.db
.mktx((x) => [x.peerPullPaymentIncoming])
.mktx((x) => [x.peerPullDebit])
.runReadWrite(async (tx) => {
const myPpi = await tx.peerPullPaymentIncoming.get(
peerPullInc.peerPullPaymentIncomingId,
const myPpi = await tx.peerPullDebit.get(
peerPullInc.peerPullDebitId,
);
if (!myPpi) {
return;
@ -162,7 +162,7 @@ async function handlePurseCreationConflict(
default:
return;
}
await tx.peerPullPaymentIncoming.put(myPpi);
await tx.peerPullDebit.put(myPpi);
});
return TaskRunResult.finished();
}
@ -171,7 +171,7 @@ async function processPeerPullDebitPendingDeposit(
ws: InternalWalletState,
peerPullInc: PeerPullPaymentIncomingRecord,
): Promise<TaskRunResult> {
const peerPullPaymentIncomingId = peerPullInc.peerPullPaymentIncomingId;
const peerPullDebitId = peerPullInc.peerPullDebitId;
const pursePub = peerPullInc.pursePub;
const coinSel = peerPullInc.coinSel;
@ -202,7 +202,7 @@ async function processPeerPullDebitPendingDeposit(
const transactionId = constructTransactionIdentifier({
tag: TransactionType.PeerPullDebit,
peerPullPaymentIncomingId,
peerPullDebitId,
});
const httpResp = await ws.http.fetch(purseDepositUrl.href, {
@ -218,10 +218,10 @@ async function processPeerPullDebitPendingDeposit(
logger.trace(`purse deposit response: ${j2s(resp)}`);
const transitionInfo = await ws.db
.mktx((x) => [x.peerPullPaymentIncoming])
.mktx((x) => [x.peerPullDebit])
.runReadWrite(async (tx) => {
const pi = await tx.peerPullPaymentIncoming.get(
peerPullPaymentIncomingId,
const pi = await tx.peerPullDebit.get(
peerPullDebitId,
);
if (!pi) {
throw Error("peer pull payment not found anymore");
@ -230,9 +230,9 @@ async function processPeerPullDebitPendingDeposit(
return;
}
const oldTxState = computePeerPullDebitTransactionState(pi);
pi.status = PeerPullDebitRecordStatus.DonePaid;
pi.status = PeerPullDebitRecordStatus.Done;
const newTxState = computePeerPullDebitTransactionState(pi);
await tx.peerPullPaymentIncoming.put(pi);
await tx.peerPullDebit.put(pi);
return { oldTxState, newTxState };
});
notifyTransition(ws, transactionId, transitionInfo);
@ -241,15 +241,15 @@ async function processPeerPullDebitPendingDeposit(
case HttpStatusCode.Gone: {
const transitionInfo = await ws.db
.mktx((x) => [
x.peerPullPaymentIncoming,
x.peerPullDebit,
x.refreshGroups,
x.denominations,
x.coinAvailability,
x.coins,
])
.runReadWrite(async (tx) => {
const pi = await tx.peerPullPaymentIncoming.get(
peerPullPaymentIncomingId,
const pi = await tx.peerPullDebit.get(
peerPullDebitId,
);
if (!pi) {
throw Error("peer pull payment not found anymore");
@ -284,7 +284,7 @@ async function processPeerPullDebitPendingDeposit(
pi.status = PeerPullDebitRecordStatus.AbortingRefresh;
pi.abortRefreshGroupId = refresh.refreshGroupId;
const newTxState = computePeerPullDebitTransactionState(pi);
await tx.peerPullPaymentIncoming.put(pi);
await tx.peerPullDebit.put(pi);
return { oldTxState, newTxState };
});
notifyTransition(ws, transactionId, transitionInfo);
@ -308,15 +308,15 @@ async function processPeerPullDebitAbortingRefresh(
ws: InternalWalletState,
peerPullInc: PeerPullPaymentIncomingRecord,
): Promise<TaskRunResult> {
const peerPullPaymentIncomingId = peerPullInc.peerPullPaymentIncomingId;
const peerPullDebitId = peerPullInc.peerPullDebitId;
const abortRefreshGroupId = peerPullInc.abortRefreshGroupId;
checkLogicInvariant(!!abortRefreshGroupId);
const transactionId = constructTransactionIdentifier({
tag: TransactionType.PeerPullDebit,
peerPullPaymentIncomingId,
peerPullDebitId,
});
const transitionInfo = await ws.db
.mktx((x) => [x.refreshGroups, x.peerPullPaymentIncoming])
.mktx((x) => [x.refreshGroups, x.peerPullDebit])
.runReadWrite(async (tx) => {
const refreshGroup = await tx.refreshGroups.get(abortRefreshGroupId);
let newOpState: PeerPullDebitRecordStatus | undefined;
@ -335,8 +335,8 @@ async function processPeerPullDebitAbortingRefresh(
}
}
if (newOpState) {
const newDg = await tx.peerPullPaymentIncoming.get(
peerPullPaymentIncomingId,
const newDg = await tx.peerPullDebit.get(
peerPullDebitId,
);
if (!newDg) {
return;
@ -344,7 +344,7 @@ async function processPeerPullDebitAbortingRefresh(
const oldTxState = computePeerPullDebitTransactionState(newDg);
newDg.status = newOpState;
const newTxState = computePeerPullDebitTransactionState(newDg);
await tx.peerPullPaymentIncoming.put(newDg);
await tx.peerPullDebit.put(newDg);
return { oldTxState, newTxState };
}
return undefined;
@ -356,12 +356,12 @@ async function processPeerPullDebitAbortingRefresh(
export async function processPeerPullDebit(
ws: InternalWalletState,
peerPullPaymentIncomingId: string,
peerPullDebitId: string,
): Promise<TaskRunResult> {
const peerPullInc = await ws.db
.mktx((x) => [x.peerPullPaymentIncoming])
.mktx((x) => [x.peerPullDebit])
.runReadOnly(async (tx) => {
return tx.peerPullPaymentIncoming.get(peerPullPaymentIncomingId);
return tx.peerPullDebit.get(peerPullDebitId);
});
if (!peerPullInc) {
throw Error("peer pull debit not found");
@ -380,31 +380,31 @@ export async function confirmPeerPullDebit(
ws: InternalWalletState,
req: ConfirmPeerPullDebitRequest,
): Promise<AcceptPeerPullPaymentResponse> {
let peerPullPaymentIncomingId: string;
let peerPullDebitId: string;
if (req.transactionId) {
const parsedTx = parseTransactionIdentifier(req.transactionId);
if (!parsedTx || parsedTx.tag !== TransactionType.PeerPullDebit) {
throw Error("invalid peer-pull-debit transaction identifier");
}
peerPullPaymentIncomingId = parsedTx.peerPullPaymentIncomingId;
} else if (req.peerPullPaymentIncomingId) {
peerPullPaymentIncomingId = req.peerPullPaymentIncomingId;
peerPullDebitId = parsedTx.peerPullDebitId;
} else if (req.peerPullDebitId) {
peerPullDebitId = req.peerPullDebitId;
} else {
throw Error(
"invalid request, transactionId or peerPullPaymentIncomingId required",
"invalid request, transactionId or peerPullDebitId required",
);
}
const peerPullInc = await ws.db
.mktx((x) => [x.peerPullPaymentIncoming])
.mktx((x) => [x.peerPullDebit])
.runReadOnly(async (tx) => {
return tx.peerPullPaymentIncoming.get(peerPullPaymentIncomingId);
return tx.peerPullDebit.get(peerPullDebitId);
});
if (!peerPullInc) {
throw Error(
`can't accept unknown incoming p2p pull payment (${req.peerPullPaymentIncomingId})`,
`can't accept unknown incoming p2p pull payment (${req.peerPullDebitId})`,
);
}
@ -437,15 +437,15 @@ export async function confirmPeerPullDebit(
x.coins,
x.denominations,
x.refreshGroups,
x.peerPullPaymentIncoming,
x.peerPullDebit,
x.coinAvailability,
])
.runReadWrite(async (tx) => {
await spendCoins(ws, tx, {
// allocationId: `txn:peer-pull-debit:${req.peerPullPaymentIncomingId}`,
// allocationId: `txn:peer-pull-debit:${req.peerPullDebitId}`,
allocationId: constructTransactionIdentifier({
tag: TransactionType.PeerPullDebit,
peerPullPaymentIncomingId,
peerPullDebitId,
}),
coinPubs: sel.coins.map((x) => x.coinPub),
contributions: sel.coins.map((x) =>
@ -454,8 +454,8 @@ export async function confirmPeerPullDebit(
refreshReason: RefreshReason.PayPeerPull,
});
const pi = await tx.peerPullPaymentIncoming.get(
peerPullPaymentIncomingId,
const pi = await tx.peerPullDebit.get(
peerPullDebitId,
);
if (!pi) {
throw Error();
@ -468,7 +468,7 @@ export async function confirmPeerPullDebit(
totalCost: Amounts.stringify(totalAmount),
};
}
await tx.peerPullPaymentIncoming.put(pi);
await tx.peerPullDebit.put(pi);
return pi;
});
@ -476,7 +476,7 @@ export async function confirmPeerPullDebit(
const transactionId = constructTransactionIdentifier({
tag: TransactionType.PeerPullDebit,
peerPullPaymentIncomingId,
peerPullDebitId,
});
return {
@ -499,9 +499,9 @@ export async function preparePeerPullDebit(
}
const existingPullIncomingRecord = await ws.db
.mktx((x) => [x.peerPullPaymentIncoming])
.mktx((x) => [x.peerPullDebit])
.runReadOnly(async (tx) => {
return tx.peerPullPaymentIncoming.indexes.byExchangeAndContractPriv.get([
return tx.peerPullDebit.indexes.byExchangeAndContractPriv.get([
uri.exchangeBaseUrl,
uri.contractPriv,
]);
@ -513,12 +513,12 @@ export async function preparePeerPullDebit(
amountRaw: existingPullIncomingRecord.contractTerms.amount,
amountEffective: existingPullIncomingRecord.totalCostEstimated,
contractTerms: existingPullIncomingRecord.contractTerms,
peerPullPaymentIncomingId:
existingPullIncomingRecord.peerPullPaymentIncomingId,
peerPullDebitId:
existingPullIncomingRecord.peerPullDebitId,
transactionId: constructTransactionIdentifier({
tag: TransactionType.PeerPullDebit,
peerPullPaymentIncomingId:
existingPullIncomingRecord.peerPullPaymentIncomingId,
peerPullDebitId:
existingPullIncomingRecord.peerPullDebitId,
}),
};
}
@ -553,7 +553,7 @@ export async function preparePeerPullDebit(
codecForExchangePurseStatus(),
);
const peerPullPaymentIncomingId = encodeCrock(getRandomBytes(32));
const peerPullDebitId = encodeCrock(getRandomBytes(32));
let contractTerms: PeerContractTerms;
@ -588,10 +588,10 @@ export async function preparePeerPullDebit(
);
await ws.db
.mktx((x) => [x.peerPullPaymentIncoming])
.mktx((x) => [x.peerPullDebit])
.runReadWrite(async (tx) => {
await tx.peerPullPaymentIncoming.add({
peerPullPaymentIncomingId,
await tx.peerPullDebit.add({
peerPullDebitId,
contractPriv: contractPriv,
exchangeBaseUrl: exchangeBaseUrl,
pursePub: pursePub,
@ -607,42 +607,42 @@ export async function preparePeerPullDebit(
amountEffective: Amounts.stringify(totalAmount),
amountRaw: contractTerms.amount,
contractTerms: contractTerms,
peerPullPaymentIncomingId,
peerPullDebitId,
transactionId: constructTransactionIdentifier({
tag: TransactionType.PeerPullDebit,
peerPullPaymentIncomingId: peerPullPaymentIncomingId,
peerPullDebitId: peerPullDebitId,
}),
};
}
export async function suspendPeerPullDebitTransaction(
ws: InternalWalletState,
peerPullPaymentIncomingId: string,
peerPullDebitId: string,
) {
const taskId = constructTaskIdentifier({
tag: PendingTaskType.PeerPullDebit,
peerPullPaymentIncomingId,
peerPullDebitId,
});
const transactionId = constructTransactionIdentifier({
tag: TransactionType.PeerPullDebit,
peerPullPaymentIncomingId,
peerPullDebitId,
});
stopLongpolling(ws, taskId);
const transitionInfo = await ws.db
.mktx((x) => [x.peerPullPaymentIncoming])
.mktx((x) => [x.peerPullDebit])
.runReadWrite(async (tx) => {
const pullDebitRec = await tx.peerPullPaymentIncoming.get(
peerPullPaymentIncomingId,
const pullDebitRec = await tx.peerPullDebit.get(
peerPullDebitId,
);
if (!pullDebitRec) {
logger.warn(`peer pull debit ${peerPullPaymentIncomingId} not found`);
logger.warn(`peer pull debit ${peerPullDebitId} not found`);
return;
}
let newStatus: PeerPullDebitRecordStatus | undefined = undefined;
switch (pullDebitRec.status) {
case PeerPullDebitRecordStatus.DialogProposed:
break;
case PeerPullDebitRecordStatus.DonePaid:
case PeerPullDebitRecordStatus.Done:
break;
case PeerPullDebitRecordStatus.PendingDeposit:
newStatus = PeerPullDebitRecordStatus.SuspendedDeposit;
@ -665,7 +665,7 @@ export async function suspendPeerPullDebitTransaction(
const oldTxState = computePeerPullDebitTransactionState(pullDebitRec);
pullDebitRec.status = newStatus;
const newTxState = computePeerPullDebitTransactionState(pullDebitRec);
await tx.peerPullPaymentIncoming.put(pullDebitRec);
await tx.peerPullDebit.put(pullDebitRec);
return {
oldTxState,
newTxState,
@ -678,25 +678,25 @@ export async function suspendPeerPullDebitTransaction(
export async function abortPeerPullDebitTransaction(
ws: InternalWalletState,
peerPullPaymentIncomingId: string,
peerPullDebitId: string,
) {
const taskId = constructTaskIdentifier({
tag: PendingTaskType.PeerPullDebit,
peerPullPaymentIncomingId,
peerPullDebitId,
});
const transactionId = constructTransactionIdentifier({
tag: TransactionType.PeerPullDebit,
peerPullPaymentIncomingId,
peerPullDebitId,
});
stopLongpolling(ws, taskId);
const transitionInfo = await ws.db
.mktx((x) => [x.peerPullPaymentIncoming])
.mktx((x) => [x.peerPullDebit])
.runReadWrite(async (tx) => {
const pullDebitRec = await tx.peerPullPaymentIncoming.get(
peerPullPaymentIncomingId,
const pullDebitRec = await tx.peerPullDebit.get(
peerPullDebitId,
);
if (!pullDebitRec) {
logger.warn(`peer pull debit ${peerPullPaymentIncomingId} not found`);
logger.warn(`peer pull debit ${peerPullDebitId} not found`);
return;
}
let newStatus: PeerPullDebitRecordStatus | undefined = undefined;
@ -704,7 +704,7 @@ export async function abortPeerPullDebitTransaction(
case PeerPullDebitRecordStatus.DialogProposed:
newStatus = PeerPullDebitRecordStatus.Aborted;
break;
case PeerPullDebitRecordStatus.DonePaid:
case PeerPullDebitRecordStatus.Done:
break;
case PeerPullDebitRecordStatus.PendingDeposit:
newStatus = PeerPullDebitRecordStatus.AbortingRefresh;
@ -726,7 +726,7 @@ export async function abortPeerPullDebitTransaction(
const oldTxState = computePeerPullDebitTransactionState(pullDebitRec);
pullDebitRec.status = newStatus;
const newTxState = computePeerPullDebitTransactionState(pullDebitRec);
await tx.peerPullPaymentIncoming.put(pullDebitRec);
await tx.peerPullDebit.put(pullDebitRec);
return {
oldTxState,
newTxState,
@ -739,25 +739,25 @@ export async function abortPeerPullDebitTransaction(
export async function failPeerPullDebitTransaction(
ws: InternalWalletState,
peerPullPaymentIncomingId: string,
peerPullDebitId: string,
) {
const taskId = constructTaskIdentifier({
tag: PendingTaskType.PeerPullDebit,
peerPullPaymentIncomingId,
peerPullDebitId,
});
const transactionId = constructTransactionIdentifier({
tag: TransactionType.PeerPullDebit,
peerPullPaymentIncomingId,
peerPullDebitId,
});
stopLongpolling(ws, taskId);
const transitionInfo = await ws.db
.mktx((x) => [x.peerPullPaymentIncoming])
.mktx((x) => [x.peerPullDebit])
.runReadWrite(async (tx) => {
const pullDebitRec = await tx.peerPullPaymentIncoming.get(
peerPullPaymentIncomingId,
const pullDebitRec = await tx.peerPullDebit.get(
peerPullDebitId,
);
if (!pullDebitRec) {
logger.warn(`peer pull debit ${peerPullPaymentIncomingId} not found`);
logger.warn(`peer pull debit ${peerPullDebitId} not found`);
return;
}
let newStatus: PeerPullDebitRecordStatus | undefined = undefined;
@ -765,7 +765,7 @@ export async function failPeerPullDebitTransaction(
case PeerPullDebitRecordStatus.DialogProposed:
newStatus = PeerPullDebitRecordStatus.Aborted;
break;
case PeerPullDebitRecordStatus.DonePaid:
case PeerPullDebitRecordStatus.Done:
break;
case PeerPullDebitRecordStatus.PendingDeposit:
break;
@ -787,7 +787,7 @@ export async function failPeerPullDebitTransaction(
const oldTxState = computePeerPullDebitTransactionState(pullDebitRec);
pullDebitRec.status = newStatus;
const newTxState = computePeerPullDebitTransactionState(pullDebitRec);
await tx.peerPullPaymentIncoming.put(pullDebitRec);
await tx.peerPullDebit.put(pullDebitRec);
return {
oldTxState,
newTxState,
@ -800,31 +800,31 @@ export async function failPeerPullDebitTransaction(
export async function resumePeerPullDebitTransaction(
ws: InternalWalletState,
peerPullPaymentIncomingId: string,
peerPullDebitId: string,
) {
const taskId = constructTaskIdentifier({
tag: PendingTaskType.PeerPullDebit,
peerPullPaymentIncomingId,
peerPullDebitId,
});
const transactionId = constructTransactionIdentifier({
tag: TransactionType.PeerPullDebit,
peerPullPaymentIncomingId,
peerPullDebitId,
});
stopLongpolling(ws, taskId);
const transitionInfo = await ws.db
.mktx((x) => [x.peerPullPaymentIncoming])
.mktx((x) => [x.peerPullDebit])
.runReadWrite(async (tx) => {
const pullDebitRec = await tx.peerPullPaymentIncoming.get(
peerPullPaymentIncomingId,
const pullDebitRec = await tx.peerPullDebit.get(
peerPullDebitId,
);
if (!pullDebitRec) {
logger.warn(`peer pull debit ${peerPullPaymentIncomingId} not found`);
logger.warn(`peer pull debit ${peerPullDebitId} not found`);
return;
}
let newStatus: PeerPullDebitRecordStatus | undefined = undefined;
switch (pullDebitRec.status) {
case PeerPullDebitRecordStatus.DialogProposed:
case PeerPullDebitRecordStatus.DonePaid:
case PeerPullDebitRecordStatus.Done:
case PeerPullDebitRecordStatus.PendingDeposit:
break;
case PeerPullDebitRecordStatus.SuspendedDeposit:
@ -846,7 +846,7 @@ export async function resumePeerPullDebitTransaction(
const oldTxState = computePeerPullDebitTransactionState(pullDebitRec);
pullDebitRec.status = newStatus;
const newTxState = computePeerPullDebitTransactionState(pullDebitRec);
await tx.peerPullPaymentIncoming.put(pullDebitRec);
await tx.peerPullDebit.put(pullDebitRec);
return {
oldTxState,
newTxState,
@ -872,7 +872,7 @@ export function computePeerPullDebitTransactionState(
major: TransactionMajorState.Pending,
minor: TransactionMinorState.Deposit,
};
case PeerPullDebitRecordStatus.DonePaid:
case PeerPullDebitRecordStatus.Done:
return {
major: TransactionMajorState.Done,
};
@ -910,7 +910,7 @@ export function computePeerPullDebitTransactionActions(
return [];
case PeerPullDebitRecordStatus.PendingDeposit:
return [TransactionAction.Abort, TransactionAction.Suspend];
case PeerPullDebitRecordStatus.DonePaid:
case PeerPullDebitRecordStatus.Done:
return [TransactionAction.Delete];
case PeerPullDebitRecordStatus.SuspendedDeposit:
return [TransactionAction.Resume, TransactionAction.Abort];

View File

@ -55,7 +55,7 @@ import {
KycPendingInfo,
KycUserType,
PeerPushPaymentIncomingRecord,
PeerPushPaymentIncomingStatus,
PeerPushCreditStatus,
PendingTaskType,
WithdrawalGroupStatus,
WithdrawalRecordType,
@ -99,10 +99,10 @@ export async function preparePeerPushCredit(
}
const existing = await ws.db
.mktx((x) => [x.contractTerms, x.peerPushPaymentIncoming])
.mktx((x) => [x.contractTerms, x.peerPushCredit])
.runReadOnly(async (tx) => {
const existingPushInc =
await tx.peerPushPaymentIncoming.indexes.byExchangeAndContractPriv.get([
await tx.peerPushCredit.indexes.byExchangeAndContractPriv.get([
uri.exchangeBaseUrl,
uri.contractPriv,
]);
@ -129,12 +129,12 @@ export async function preparePeerPushCredit(
amountEffective: existing.existingPushInc.estimatedAmountEffective,
amountRaw: existing.existingContractTerms.amount,
contractTerms: existing.existingContractTerms,
peerPushPaymentIncomingId:
existing.existingPushInc.peerPushPaymentIncomingId,
peerPushCreditId:
existing.existingPushInc.peerPushCreditId,
transactionId: constructTransactionIdentifier({
tag: TransactionType.PeerPushCredit,
peerPushPaymentIncomingId:
existing.existingPushInc.peerPushPaymentIncomingId,
peerPushCreditId:
existing.existingPushInc.peerPushCreditId,
}),
};
}
@ -172,7 +172,7 @@ export async function preparePeerPushCredit(
codecForExchangePurseStatus(),
);
const peerPushPaymentIncomingId = encodeCrock(getRandomBytes(32));
const peerPushCreditId = encodeCrock(getRandomBytes(32));
const contractTermsHash = ContractTermsUtil.hashContractTerms(
dec.contractTerms,
@ -188,17 +188,17 @@ export async function preparePeerPushCredit(
);
await ws.db
.mktx((x) => [x.contractTerms, x.peerPushPaymentIncoming])
.mktx((x) => [x.contractTerms, x.peerPushCredit])
.runReadWrite(async (tx) => {
await tx.peerPushPaymentIncoming.add({
peerPushPaymentIncomingId,
await tx.peerPushCredit.add({
peerPushCreditId,
contractPriv: contractPriv,
exchangeBaseUrl: exchangeBaseUrl,
mergePriv: dec.mergePriv,
pursePub: pursePub,
timestamp: TalerPreciseTimestamp.now(),
contractTermsHash,
status: PeerPushPaymentIncomingStatus.DialogProposed,
status: PeerPushCreditStatus.DialogProposed,
withdrawalGroupId,
currency: Amounts.currencyOf(purseStatus.balance),
estimatedAmountEffective: Amounts.stringify(
@ -219,28 +219,28 @@ export async function preparePeerPushCredit(
amountEffective: wi.withdrawalAmountEffective,
amountRaw: purseStatus.balance,
contractTerms: dec.contractTerms,
peerPushPaymentIncomingId,
peerPushCreditId,
transactionId: constructTransactionIdentifier({
tag: TransactionType.PeerPushCredit,
peerPushPaymentIncomingId,
peerPushCreditId,
}),
};
}
async function longpollKycStatus(
ws: InternalWalletState,
peerPushPaymentIncomingId: string,
peerPushCreditId: string,
exchangeUrl: string,
kycInfo: KycPendingInfo,
userType: KycUserType,
): Promise<TaskRunResult> {
const transactionId = constructTransactionIdentifier({
tag: TransactionType.PeerPushCredit,
peerPushPaymentIncomingId,
peerPushCreditId,
});
const retryTag = constructTaskIdentifier({
tag: PendingTaskType.PeerPushCredit,
peerPushPaymentIncomingId,
peerPushCreditId,
});
runLongpollAsync(ws, retryTag, async (ct) => {
@ -261,24 +261,24 @@ async function longpollKycStatus(
kycStatusRes.status === HttpStatusCode.NoContent
) {
const transitionInfo = await ws.db
.mktx((x) => [x.peerPushPaymentIncoming])
.mktx((x) => [x.peerPushCredit])
.runReadWrite(async (tx) => {
const peerInc = await tx.peerPushPaymentIncoming.get(
peerPushPaymentIncomingId,
const peerInc = await tx.peerPushCredit.get(
peerPushCreditId,
);
if (!peerInc) {
return;
}
if (
peerInc.status !==
PeerPushPaymentIncomingStatus.PendingMergeKycRequired
PeerPushCreditStatus.PendingMergeKycRequired
) {
return;
}
const oldTxState = computePeerPushCreditTransactionState(peerInc);
peerInc.status = PeerPushPaymentIncomingStatus.PendingMerge;
peerInc.status = PeerPushCreditStatus.PendingMerge;
const newTxState = computePeerPushCreditTransactionState(peerInc);
await tx.peerPushPaymentIncoming.put(peerInc);
await tx.peerPushCredit.put(peerInc);
return { oldTxState, newTxState };
});
notifyTransition(ws, transactionId, transitionInfo);
@ -304,9 +304,9 @@ async function processPeerPushCreditKycRequired(
): Promise<TaskRunResult> {
const transactionId = constructTransactionIdentifier({
tag: TransactionType.PeerPushCredit,
peerPushPaymentIncomingId: peerInc.peerPushPaymentIncomingId,
peerPushCreditId: peerInc.peerPushCreditId,
});
const { peerPushPaymentIncomingId } = peerInc;
const { peerPushCreditId } = peerInc;
const userType = "individual";
const url = new URL(
@ -331,10 +331,10 @@ async function processPeerPushCreditKycRequired(
const kycStatus = await kycStatusRes.json();
logger.info(`kyc status: ${j2s(kycStatus)}`);
const { transitionInfo, result } = await ws.db
.mktx((x) => [x.peerPushPaymentIncoming])
.mktx((x) => [x.peerPushCredit])
.runReadWrite(async (tx) => {
const peerInc = await tx.peerPushPaymentIncoming.get(
peerPushPaymentIncomingId,
const peerInc = await tx.peerPushCredit.get(
peerPushCreditId,
);
if (!peerInc) {
return {
@ -348,9 +348,9 @@ async function processPeerPushCreditKycRequired(
requirementRow: kycPending.requirement_row,
};
peerInc.kycUrl = kycStatus.kyc_url;
peerInc.status = PeerPushPaymentIncomingStatus.PendingMergeKycRequired;
peerInc.status = PeerPushCreditStatus.PendingMergeKycRequired;
const newTxState = computePeerPushCreditTransactionState(peerInc);
await tx.peerPushPaymentIncoming.put(peerInc);
await tx.peerPushCredit.put(peerInc);
// We'll remove this eventually! New clients should rely on the
// kycUrl field of the transaction, not the error code.
const res: TaskRunResult = {
@ -379,10 +379,10 @@ async function handlePendingMerge(
peerInc: PeerPushPaymentIncomingRecord,
contractTerms: PeerContractTerms,
): Promise<TaskRunResult> {
const { peerPushPaymentIncomingId } = peerInc;
const { peerPushCreditId } = peerInc;
const transactionId = constructTransactionIdentifier({
tag: TransactionType.PeerPushCredit,
peerPushPaymentIncomingId,
peerPushCreditId,
});
const amount = Amounts.parseOrThrow(contractTerms.amount);
@ -460,15 +460,15 @@ async function handlePendingMerge(
const txRes = await ws.db
.mktx((x) => [
x.contractTerms,
x.peerPushPaymentIncoming,
x.peerPushCredit,
x.withdrawalGroups,
x.reserves,
x.exchanges,
x.exchangeDetails,
])
.runReadWrite(async (tx) => {
const peerInc = await tx.peerPushPaymentIncoming.get(
peerPushPaymentIncomingId,
const peerInc = await tx.peerPushCredit.get(
peerPushCreditId,
);
if (!peerInc) {
return undefined;
@ -476,9 +476,9 @@ async function handlePendingMerge(
let withdrawalTransition: TransitionInfo | undefined;
const oldTxState = computePeerPushCreditTransactionState(peerInc);
switch (peerInc.status) {
case PeerPushPaymentIncomingStatus.PendingMerge:
case PeerPushPaymentIncomingStatus.PendingMergeKycRequired: {
peerInc.status = PeerPushPaymentIncomingStatus.PendingWithdrawing;
case PeerPushCreditStatus.PendingMerge:
case PeerPushCreditStatus.PendingMergeKycRequired: {
peerInc.status = PeerPushCreditStatus.PendingWithdrawing;
const wgRes = await internalPerformCreateWithdrawalGroup(
ws,
tx,
@ -488,7 +488,7 @@ async function handlePendingMerge(
break;
}
}
await tx.peerPushPaymentIncoming.put(peerInc);
await tx.peerPushCredit.put(peerInc);
const newTxState = computePeerPushCreditTransactionState(peerInc);
return {
peerPushCreditTransition: { oldTxState, newTxState },
@ -514,21 +514,21 @@ async function handlePendingWithdrawing(
}
const transactionId = constructTransactionIdentifier({
tag: TransactionType.PeerPushCredit,
peerPushPaymentIncomingId: peerInc.peerPushPaymentIncomingId,
peerPushCreditId: peerInc.peerPushCreditId,
});
const wgId = peerInc.withdrawalGroupId;
let finished: boolean = false;
const transitionInfo = await ws.db
.mktx((x) => [x.peerPushPaymentIncoming, x.withdrawalGroups])
.mktx((x) => [x.peerPushCredit, x.withdrawalGroups])
.runReadWrite(async (tx) => {
const ppi = await tx.peerPushPaymentIncoming.get(
peerInc.peerPushPaymentIncomingId,
const ppi = await tx.peerPushCredit.get(
peerInc.peerPushCreditId,
);
if (!ppi) {
finished = true;
return;
}
if (ppi.status !== PeerPushPaymentIncomingStatus.PendingWithdrawing) {
if (ppi.status !== PeerPushCreditStatus.PendingWithdrawing) {
finished = true;
return;
}
@ -539,13 +539,13 @@ async function handlePendingWithdrawing(
return undefined;
}
switch (wg.status) {
case WithdrawalGroupStatus.Finished:
case WithdrawalGroupStatus.Done:
finished = true;
ppi.status = PeerPushPaymentIncomingStatus.Done;
ppi.status = PeerPushCreditStatus.Done;
break;
// FIXME: Also handle other final states!
}
await tx.peerPushPaymentIncoming.put(ppi);
await tx.peerPushCredit.put(ppi);
const newTxState = computePeerPushCreditTransactionState(ppi);
return {
oldTxState,
@ -563,14 +563,14 @@ async function handlePendingWithdrawing(
export async function processPeerPushCredit(
ws: InternalWalletState,
peerPushPaymentIncomingId: string,
peerPushCreditId: string,
): Promise<TaskRunResult> {
let peerInc: PeerPushPaymentIncomingRecord | undefined;
let contractTerms: PeerContractTerms | undefined;
await ws.db
.mktx((x) => [x.contractTerms, x.peerPushPaymentIncoming])
.mktx((x) => [x.contractTerms, x.peerPushCredit])
.runReadWrite(async (tx) => {
peerInc = await tx.peerPushPaymentIncoming.get(peerPushPaymentIncomingId);
peerInc = await tx.peerPushCredit.get(peerPushCreditId);
if (!peerInc) {
return;
}
@ -578,35 +578,35 @@ export async function processPeerPushCredit(
if (ctRec) {
contractTerms = ctRec.contractTermsRaw;
}
await tx.peerPushPaymentIncoming.put(peerInc);
await tx.peerPushCredit.put(peerInc);
});
checkDbInvariant(!!contractTerms);
if (!peerInc) {
throw Error(
`can't accept unknown incoming p2p push payment (${peerPushPaymentIncomingId})`,
`can't accept unknown incoming p2p push payment (${peerPushCreditId})`,
);
}
switch (peerInc.status) {
case PeerPushPaymentIncomingStatus.PendingMergeKycRequired: {
case PeerPushCreditStatus.PendingMergeKycRequired: {
if (!peerInc.kycInfo) {
throw Error("invalid state, kycInfo required");
}
return await longpollKycStatus(
ws,
peerPushPaymentIncomingId,
peerPushCreditId,
peerInc.exchangeBaseUrl,
peerInc.kycInfo,
"individual",
);
}
case PeerPushPaymentIncomingStatus.PendingMerge:
case PeerPushCreditStatus.PendingMerge:
return handlePendingMerge(ws, peerInc, contractTerms);
case PeerPushPaymentIncomingStatus.PendingWithdrawing:
case PeerPushCreditStatus.PendingWithdrawing:
return handlePendingWithdrawing(ws, peerInc);
default:
@ -619,9 +619,9 @@ export async function confirmPeerPushCredit(
req: ConfirmPeerPushCreditRequest,
): Promise<AcceptPeerPushPaymentResponse> {
let peerInc: PeerPushPaymentIncomingRecord | undefined;
let peerPushPaymentIncomingId: string;
if (req.peerPushPaymentIncomingId) {
peerPushPaymentIncomingId = req.peerPushPaymentIncomingId;
let peerPushCreditId: string;
if (req.peerPushCreditId) {
peerPushCreditId = req.peerPushCreditId;
} else if (req.transactionId) {
const parsedTx = parseTransactionIdentifier(req.transactionId);
if (!parsedTx) {
@ -630,29 +630,29 @@ export async function confirmPeerPushCredit(
if (parsedTx.tag !== TransactionType.PeerPushCredit) {
throw Error("invalid transaction ID type");
}
peerPushPaymentIncomingId = parsedTx.peerPushPaymentIncomingId;
peerPushCreditId = parsedTx.peerPushCreditId;
} else {
throw Error(
"no transaction ID (or deprecated peerPushPaymentIncomingId) provided",
"no transaction ID (or deprecated peerPushCreditId) provided",
);
}
await ws.db
.mktx((x) => [x.contractTerms, x.peerPushPaymentIncoming])
.mktx((x) => [x.contractTerms, x.peerPushCredit])
.runReadWrite(async (tx) => {
peerInc = await tx.peerPushPaymentIncoming.get(peerPushPaymentIncomingId);
peerInc = await tx.peerPushCredit.get(peerPushCreditId);
if (!peerInc) {
return;
}
if (peerInc.status === PeerPushPaymentIncomingStatus.DialogProposed) {
peerInc.status = PeerPushPaymentIncomingStatus.PendingMerge;
if (peerInc.status === PeerPushCreditStatus.DialogProposed) {
peerInc.status = PeerPushCreditStatus.PendingMerge;
}
await tx.peerPushPaymentIncoming.put(peerInc);
await tx.peerPushCredit.put(peerInc);
});
if (!peerInc) {
throw Error(
`can't accept unknown incoming p2p push payment (${req.peerPushPaymentIncomingId})`,
`can't accept unknown incoming p2p push payment (${req.peerPushCreditId})`,
);
}
@ -660,7 +660,7 @@ export async function confirmPeerPushCredit(
const transactionId = constructTransactionIdentifier({
tag: TransactionType.PeerPushCredit,
peerPushPaymentIncomingId,
peerPushCreditId,
});
return {
@ -670,48 +670,48 @@ export async function confirmPeerPushCredit(
export async function suspendPeerPushCreditTransaction(
ws: InternalWalletState,
peerPushPaymentIncomingId: string,
peerPushCreditId: string,
) {
const taskId = constructTaskIdentifier({
tag: PendingTaskType.PeerPushCredit,
peerPushPaymentIncomingId,
peerPushCreditId,
});
const transactionId = constructTransactionIdentifier({
tag: TransactionType.PeerPushCredit,
peerPushPaymentIncomingId,
peerPushCreditId,
});
stopLongpolling(ws, taskId);
const transitionInfo = await ws.db
.mktx((x) => [x.peerPushPaymentIncoming])
.mktx((x) => [x.peerPushCredit])
.runReadWrite(async (tx) => {
const pushCreditRec = await tx.peerPushPaymentIncoming.get(
peerPushPaymentIncomingId,
const pushCreditRec = await tx.peerPushCredit.get(
peerPushCreditId,
);
if (!pushCreditRec) {
logger.warn(`peer push credit ${peerPushPaymentIncomingId} not found`);
logger.warn(`peer push credit ${peerPushCreditId} not found`);
return;
}
let newStatus: PeerPushPaymentIncomingStatus | undefined = undefined;
let newStatus: PeerPushCreditStatus | undefined = undefined;
switch (pushCreditRec.status) {
case PeerPushPaymentIncomingStatus.DialogProposed:
case PeerPushPaymentIncomingStatus.Done:
case PeerPushPaymentIncomingStatus.SuspendedMerge:
case PeerPushPaymentIncomingStatus.SuspendedMergeKycRequired:
case PeerPushPaymentIncomingStatus.SuspendedWithdrawing:
case PeerPushCreditStatus.DialogProposed:
case PeerPushCreditStatus.Done:
case PeerPushCreditStatus.SuspendedMerge:
case PeerPushCreditStatus.SuspendedMergeKycRequired:
case PeerPushCreditStatus.SuspendedWithdrawing:
break;
case PeerPushPaymentIncomingStatus.PendingMergeKycRequired:
newStatus = PeerPushPaymentIncomingStatus.SuspendedMergeKycRequired;
case PeerPushCreditStatus.PendingMergeKycRequired:
newStatus = PeerPushCreditStatus.SuspendedMergeKycRequired;
break;
case PeerPushPaymentIncomingStatus.PendingMerge:
newStatus = PeerPushPaymentIncomingStatus.SuspendedMerge;
case PeerPushCreditStatus.PendingMerge:
newStatus = PeerPushCreditStatus.SuspendedMerge;
break;
case PeerPushPaymentIncomingStatus.PendingWithdrawing:
case PeerPushCreditStatus.PendingWithdrawing:
// FIXME: Suspend internal withdrawal transaction!
newStatus = PeerPushPaymentIncomingStatus.SuspendedWithdrawing;
newStatus = PeerPushCreditStatus.SuspendedWithdrawing;
break;
case PeerPushPaymentIncomingStatus.Aborted:
case PeerPushCreditStatus.Aborted:
break;
case PeerPushPaymentIncomingStatus.Failed:
case PeerPushCreditStatus.Failed:
break;
default:
assertUnreachable(pushCreditRec.status);
@ -720,7 +720,7 @@ export async function suspendPeerPushCreditTransaction(
const oldTxState = computePeerPushCreditTransactionState(pushCreditRec);
pushCreditRec.status = newStatus;
const newTxState = computePeerPushCreditTransactionState(pushCreditRec);
await tx.peerPushPaymentIncoming.put(pushCreditRec);
await tx.peerPushCredit.put(pushCreditRec);
return {
oldTxState,
newTxState,
@ -733,51 +733,51 @@ export async function suspendPeerPushCreditTransaction(
export async function abortPeerPushCreditTransaction(
ws: InternalWalletState,
peerPushPaymentIncomingId: string,
peerPushCreditId: string,
) {
const taskId = constructTaskIdentifier({
tag: PendingTaskType.PeerPushCredit,
peerPushPaymentIncomingId,
peerPushCreditId,
});
const transactionId = constructTransactionIdentifier({
tag: TransactionType.PeerPushCredit,
peerPushPaymentIncomingId,
peerPushCreditId,
});
stopLongpolling(ws, taskId);
const transitionInfo = await ws.db
.mktx((x) => [x.peerPushPaymentIncoming])
.mktx((x) => [x.peerPushCredit])
.runReadWrite(async (tx) => {
const pushCreditRec = await tx.peerPushPaymentIncoming.get(
peerPushPaymentIncomingId,
const pushCreditRec = await tx.peerPushCredit.get(
peerPushCreditId,
);
if (!pushCreditRec) {
logger.warn(`peer push credit ${peerPushPaymentIncomingId} not found`);
logger.warn(`peer push credit ${peerPushCreditId} not found`);
return;
}
let newStatus: PeerPushPaymentIncomingStatus | undefined = undefined;
let newStatus: PeerPushCreditStatus | undefined = undefined;
switch (pushCreditRec.status) {
case PeerPushPaymentIncomingStatus.DialogProposed:
newStatus = PeerPushPaymentIncomingStatus.Aborted;
case PeerPushCreditStatus.DialogProposed:
newStatus = PeerPushCreditStatus.Aborted;
break;
case PeerPushPaymentIncomingStatus.Done:
case PeerPushCreditStatus.Done:
break;
case PeerPushPaymentIncomingStatus.SuspendedMerge:
case PeerPushPaymentIncomingStatus.SuspendedMergeKycRequired:
case PeerPushPaymentIncomingStatus.SuspendedWithdrawing:
newStatus = PeerPushPaymentIncomingStatus.Aborted;
case PeerPushCreditStatus.SuspendedMerge:
case PeerPushCreditStatus.SuspendedMergeKycRequired:
case PeerPushCreditStatus.SuspendedWithdrawing:
newStatus = PeerPushCreditStatus.Aborted;
break;
case PeerPushPaymentIncomingStatus.PendingMergeKycRequired:
newStatus = PeerPushPaymentIncomingStatus.Aborted;
case PeerPushCreditStatus.PendingMergeKycRequired:
newStatus = PeerPushCreditStatus.Aborted;
break;
case PeerPushPaymentIncomingStatus.PendingMerge:
newStatus = PeerPushPaymentIncomingStatus.Aborted;
case PeerPushCreditStatus.PendingMerge:
newStatus = PeerPushCreditStatus.Aborted;
break;
case PeerPushPaymentIncomingStatus.PendingWithdrawing:
newStatus = PeerPushPaymentIncomingStatus.Aborted;
case PeerPushCreditStatus.PendingWithdrawing:
newStatus = PeerPushCreditStatus.Aborted;
break;
case PeerPushPaymentIncomingStatus.Aborted:
case PeerPushCreditStatus.Aborted:
break;
case PeerPushPaymentIncomingStatus.Failed:
case PeerPushCreditStatus.Failed:
break;
default:
assertUnreachable(pushCreditRec.status);
@ -786,7 +786,7 @@ export async function abortPeerPushCreditTransaction(
const oldTxState = computePeerPushCreditTransactionState(pushCreditRec);
pushCreditRec.status = newStatus;
const newTxState = computePeerPushCreditTransactionState(pushCreditRec);
await tx.peerPushPaymentIncoming.put(pushCreditRec);
await tx.peerPushCredit.put(pushCreditRec);
return {
oldTxState,
newTxState,
@ -799,7 +799,7 @@ export async function abortPeerPushCreditTransaction(
export async function failPeerPushCreditTransaction(
ws: InternalWalletState,
peerPushPaymentIncomingId: string,
peerPushCreditId: string,
) {
// We don't have any "aborting" states!
throw Error("can't run cancel-aborting on peer-push-credit transaction");
@ -807,47 +807,47 @@ export async function failPeerPushCreditTransaction(
export async function resumePeerPushCreditTransaction(
ws: InternalWalletState,
peerPushPaymentIncomingId: string,
peerPushCreditId: string,
) {
const taskId = constructTaskIdentifier({
tag: PendingTaskType.PeerPushCredit,
peerPushPaymentIncomingId,
peerPushCreditId,
});
const transactionId = constructTransactionIdentifier({
tag: TransactionType.PeerPushCredit,
peerPushPaymentIncomingId,
peerPushCreditId,
});
stopLongpolling(ws, taskId);
const transitionInfo = await ws.db
.mktx((x) => [x.peerPushPaymentIncoming])
.mktx((x) => [x.peerPushCredit])
.runReadWrite(async (tx) => {
const pushCreditRec = await tx.peerPushPaymentIncoming.get(
peerPushPaymentIncomingId,
const pushCreditRec = await tx.peerPushCredit.get(
peerPushCreditId,
);
if (!pushCreditRec) {
logger.warn(`peer push credit ${peerPushPaymentIncomingId} not found`);
logger.warn(`peer push credit ${peerPushCreditId} not found`);
return;
}
let newStatus: PeerPushPaymentIncomingStatus | undefined = undefined;
let newStatus: PeerPushCreditStatus | undefined = undefined;
switch (pushCreditRec.status) {
case PeerPushPaymentIncomingStatus.DialogProposed:
case PeerPushPaymentIncomingStatus.Done:
case PeerPushPaymentIncomingStatus.PendingMergeKycRequired:
case PeerPushPaymentIncomingStatus.PendingMerge:
case PeerPushPaymentIncomingStatus.PendingWithdrawing:
case PeerPushPaymentIncomingStatus.SuspendedMerge:
newStatus = PeerPushPaymentIncomingStatus.PendingMerge;
case PeerPushCreditStatus.DialogProposed:
case PeerPushCreditStatus.Done:
case PeerPushCreditStatus.PendingMergeKycRequired:
case PeerPushCreditStatus.PendingMerge:
case PeerPushCreditStatus.PendingWithdrawing:
case PeerPushCreditStatus.SuspendedMerge:
newStatus = PeerPushCreditStatus.PendingMerge;
break;
case PeerPushPaymentIncomingStatus.SuspendedMergeKycRequired:
newStatus = PeerPushPaymentIncomingStatus.PendingMergeKycRequired;
case PeerPushCreditStatus.SuspendedMergeKycRequired:
newStatus = PeerPushCreditStatus.PendingMergeKycRequired;
break;
case PeerPushPaymentIncomingStatus.SuspendedWithdrawing:
case PeerPushCreditStatus.SuspendedWithdrawing:
// FIXME: resume underlying "internal-withdrawal" transaction.
newStatus = PeerPushPaymentIncomingStatus.PendingWithdrawing;
newStatus = PeerPushCreditStatus.PendingWithdrawing;
break;
case PeerPushPaymentIncomingStatus.Aborted:
case PeerPushCreditStatus.Aborted:
break;
case PeerPushPaymentIncomingStatus.Failed:
case PeerPushCreditStatus.Failed:
break;
default:
assertUnreachable(pushCreditRec.status);
@ -856,7 +856,7 @@ export async function resumePeerPushCreditTransaction(
const oldTxState = computePeerPushCreditTransactionState(pushCreditRec);
pushCreditRec.status = newStatus;
const newTxState = computePeerPushCreditTransactionState(pushCreditRec);
await tx.peerPushPaymentIncoming.put(pushCreditRec);
await tx.peerPushCredit.put(pushCreditRec);
return {
oldTxState,
newTxState,
@ -872,50 +872,50 @@ export function computePeerPushCreditTransactionState(
pushCreditRecord: PeerPushPaymentIncomingRecord,
): TransactionState {
switch (pushCreditRecord.status) {
case PeerPushPaymentIncomingStatus.DialogProposed:
case PeerPushCreditStatus.DialogProposed:
return {
major: TransactionMajorState.Dialog,
minor: TransactionMinorState.Proposed,
};
case PeerPushPaymentIncomingStatus.PendingMerge:
case PeerPushCreditStatus.PendingMerge:
return {
major: TransactionMajorState.Pending,
minor: TransactionMinorState.Merge,
};
case PeerPushPaymentIncomingStatus.Done:
case PeerPushCreditStatus.Done:
return {
major: TransactionMajorState.Done,
};
case PeerPushPaymentIncomingStatus.PendingMergeKycRequired:
case PeerPushCreditStatus.PendingMergeKycRequired:
return {
major: TransactionMajorState.Pending,
minor: TransactionMinorState.KycRequired,
};
case PeerPushPaymentIncomingStatus.PendingWithdrawing:
case PeerPushCreditStatus.PendingWithdrawing:
return {
major: TransactionMajorState.Pending,
minor: TransactionMinorState.Withdraw,
};
case PeerPushPaymentIncomingStatus.SuspendedMerge:
case PeerPushCreditStatus.SuspendedMerge:
return {
major: TransactionMajorState.Suspended,
minor: TransactionMinorState.Merge,
};
case PeerPushPaymentIncomingStatus.SuspendedMergeKycRequired:
case PeerPushCreditStatus.SuspendedMergeKycRequired:
return {
major: TransactionMajorState.Suspended,
minor: TransactionMinorState.MergeKycRequired,
};
case PeerPushPaymentIncomingStatus.SuspendedWithdrawing:
case PeerPushCreditStatus.SuspendedWithdrawing:
return {
major: TransactionMajorState.Suspended,
minor: TransactionMinorState.Withdraw,
};
case PeerPushPaymentIncomingStatus.Aborted:
case PeerPushCreditStatus.Aborted:
return {
major: TransactionMajorState.Aborted,
};
case PeerPushPaymentIncomingStatus.Failed:
case PeerPushCreditStatus.Failed:
return {
major: TransactionMajorState.Failed,
};
@ -928,25 +928,25 @@ export function computePeerPushCreditTransactionActions(
pushCreditRecord: PeerPushPaymentIncomingRecord,
): TransactionAction[] {
switch (pushCreditRecord.status) {
case PeerPushPaymentIncomingStatus.DialogProposed:
case PeerPushCreditStatus.DialogProposed:
return [TransactionAction.Delete];
case PeerPushPaymentIncomingStatus.PendingMerge:
case PeerPushCreditStatus.PendingMerge:
return [TransactionAction.Abort, TransactionAction.Suspend];
case PeerPushPaymentIncomingStatus.Done:
case PeerPushCreditStatus.Done:
return [TransactionAction.Delete];
case PeerPushPaymentIncomingStatus.PendingMergeKycRequired:
case PeerPushCreditStatus.PendingMergeKycRequired:
return [TransactionAction.Abort, TransactionAction.Suspend];
case PeerPushPaymentIncomingStatus.PendingWithdrawing:
case PeerPushCreditStatus.PendingWithdrawing:
return [TransactionAction.Suspend, TransactionAction.Fail];
case PeerPushPaymentIncomingStatus.SuspendedMerge:
case PeerPushCreditStatus.SuspendedMerge:
return [TransactionAction.Resume, TransactionAction.Abort];
case PeerPushPaymentIncomingStatus.SuspendedMergeKycRequired:
case PeerPushCreditStatus.SuspendedMergeKycRequired:
return [TransactionAction.Resume, TransactionAction.Abort];
case PeerPushPaymentIncomingStatus.SuspendedWithdrawing:
case PeerPushCreditStatus.SuspendedWithdrawing:
return [TransactionAction.Resume, TransactionAction.Fail];
case PeerPushPaymentIncomingStatus.Aborted:
case PeerPushCreditStatus.Aborted:
return [TransactionAction.Delete];
case PeerPushPaymentIncomingStatus.Failed:
case PeerPushCreditStatus.Failed:
return [TransactionAction.Delete];
default:
assertUnreachable(pushCreditRecord.status);

View File

@ -51,8 +51,8 @@ import {
} from "@gnu-taler/taler-util/http";
import { EncryptContractRequest } from "../crypto/cryptoTypes.js";
import {
PeerPushPaymentInitiationRecord,
PeerPushPaymentInitiationStatus,
PeerPushDebitRecord,
PeerPushDebitStatus,
RefreshOperationStatus,
createRefreshGroup,
} from "../index.js";
@ -107,7 +107,7 @@ export async function checkPeerPushDebit(
async function handlePurseCreationConflict(
ws: InternalWalletState,
peerPushInitiation: PeerPushPaymentInitiationRecord,
peerPushInitiation: PeerPushDebitRecord,
resp: HttpResponse,
): Promise<TaskRunResult> {
const pursePub = peerPushInitiation.pursePub;
@ -152,17 +152,17 @@ async function handlePurseCreationConflict(
}
await ws.db
.mktx((x) => [x.peerPushPaymentInitiations])
.mktx((x) => [x.peerPushDebit])
.runReadWrite(async (tx) => {
const myPpi = await tx.peerPushPaymentInitiations.get(
const myPpi = await tx.peerPushDebit.get(
peerPushInitiation.pursePub,
);
if (!myPpi) {
return;
}
switch (myPpi.status) {
case PeerPushPaymentInitiationStatus.PendingCreatePurse:
case PeerPushPaymentInitiationStatus.SuspendedCreatePurse: {
case PeerPushDebitStatus.PendingCreatePurse:
case PeerPushDebitStatus.SuspendedCreatePurse: {
const sel = coinSelRes.result;
myPpi.coinSel = {
coinPubs: sel.coins.map((x) => x.coinPub),
@ -173,14 +173,14 @@ async function handlePurseCreationConflict(
default:
return;
}
await tx.peerPushPaymentInitiations.put(myPpi);
await tx.peerPushDebit.put(myPpi);
});
return TaskRunResult.finished();
}
async function processPeerPushDebitCreateReserve(
ws: InternalWalletState,
peerPushInitiation: PeerPushPaymentInitiationRecord,
peerPushInitiation: PeerPushDebitRecord,
): Promise<TaskRunResult> {
logger.info("processing peer-push-debit pending(create-reserve)");
const pursePub = peerPushInitiation.pursePub;
@ -284,8 +284,8 @@ async function processPeerPushDebitCreateReserve(
}
await transitionPeerPushDebitTransaction(ws, pursePub, {
stFrom: PeerPushPaymentInitiationStatus.PendingCreatePurse,
stTo: PeerPushPaymentInitiationStatus.PendingReady,
stFrom: PeerPushDebitStatus.PendingCreatePurse,
stTo: PeerPushDebitStatus.PendingReady,
});
return TaskRunResult.finished();
@ -293,7 +293,7 @@ async function processPeerPushDebitCreateReserve(
async function processPeerPushDebitAbortingDeletePurse(
ws: InternalWalletState,
peerPushInitiation: PeerPushPaymentInitiationRecord,
peerPushInitiation: PeerPushDebitRecord,
): Promise<TaskRunResult> {
const { pursePub, pursePriv } = peerPushInitiation;
const transactionId = constructTransactionIdentifier({
@ -318,19 +318,19 @@ async function processPeerPushDebitAbortingDeletePurse(
const transitionInfo = await ws.db
.mktx((x) => [
x.peerPushPaymentInitiations,
x.peerPushDebit,
x.refreshGroups,
x.denominations,
x.coinAvailability,
x.coins,
])
.runReadWrite(async (tx) => {
const ppiRec = await tx.peerPushPaymentInitiations.get(pursePub);
const ppiRec = await tx.peerPushDebit.get(pursePub);
if (!ppiRec) {
return undefined;
}
if (
ppiRec.status !== PeerPushPaymentInitiationStatus.AbortingDeletePurse
ppiRec.status !== PeerPushDebitStatus.AbortingDeletePurse
) {
return undefined;
}
@ -352,9 +352,9 @@ async function processPeerPushDebitAbortingDeletePurse(
coinPubs,
RefreshReason.AbortPeerPushDebit,
);
ppiRec.status = PeerPushPaymentInitiationStatus.AbortingRefresh;
ppiRec.status = PeerPushDebitStatus.AbortingRefresh;
ppiRec.abortRefreshGroupId = refresh.refreshGroupId;
await tx.peerPushPaymentInitiations.put(ppiRec);
await tx.peerPushDebit.put(ppiRec);
const newTxState = computePeerPushDebitTransactionState(ppiRec);
return {
oldTxState,
@ -367,8 +367,8 @@ async function processPeerPushDebitAbortingDeletePurse(
}
interface SimpleTransition {
stFrom: PeerPushPaymentInitiationStatus;
stTo: PeerPushPaymentInitiationStatus;
stFrom: PeerPushDebitStatus;
stTo: PeerPushDebitStatus;
}
async function transitionPeerPushDebitTransaction(
@ -381,9 +381,9 @@ async function transitionPeerPushDebitTransaction(
pursePub,
});
const transitionInfo = await ws.db
.mktx((x) => [x.peerPushPaymentInitiations])
.mktx((x) => [x.peerPushDebit])
.runReadWrite(async (tx) => {
const ppiRec = await tx.peerPushPaymentInitiations.get(pursePub);
const ppiRec = await tx.peerPushDebit.get(pursePub);
if (!ppiRec) {
return undefined;
}
@ -392,7 +392,7 @@ async function transitionPeerPushDebitTransaction(
}
const oldTxState = computePeerPushDebitTransactionState(ppiRec);
ppiRec.status = transitionSpec.stTo;
await tx.peerPushPaymentInitiations.put(ppiRec);
await tx.peerPushDebit.put(ppiRec);
const newTxState = computePeerPushDebitTransactionState(ppiRec);
return {
oldTxState,
@ -404,7 +404,7 @@ async function transitionPeerPushDebitTransaction(
async function processPeerPushDebitAbortingRefresh(
ws: InternalWalletState,
peerPushInitiation: PeerPushPaymentInitiationRecord,
peerPushInitiation: PeerPushDebitRecord,
): Promise<TaskRunResult> {
const pursePub = peerPushInitiation.pursePub;
const abortRefreshGroupId = peerPushInitiation.abortRefreshGroupId;
@ -414,33 +414,33 @@ async function processPeerPushDebitAbortingRefresh(
pursePub: peerPushInitiation.pursePub,
});
const transitionInfo = await ws.db
.mktx((x) => [x.refreshGroups, x.peerPushPaymentInitiations])
.mktx((x) => [x.refreshGroups, x.peerPushDebit])
.runReadWrite(async (tx) => {
const refreshGroup = await tx.refreshGroups.get(abortRefreshGroupId);
let newOpState: PeerPushPaymentInitiationStatus | undefined;
let newOpState: PeerPushDebitStatus | undefined;
if (!refreshGroup) {
// Maybe it got manually deleted? Means that we should
// just go into failed.
logger.warn("no aborting refresh group found for deposit group");
newOpState = PeerPushPaymentInitiationStatus.Failed;
newOpState = PeerPushDebitStatus.Failed;
} else {
if (refreshGroup.operationStatus === RefreshOperationStatus.Finished) {
newOpState = PeerPushPaymentInitiationStatus.Aborted;
newOpState = PeerPushDebitStatus.Aborted;
} else if (
refreshGroup.operationStatus === RefreshOperationStatus.Failed
) {
newOpState = PeerPushPaymentInitiationStatus.Failed;
newOpState = PeerPushDebitStatus.Failed;
}
}
if (newOpState) {
const newDg = await tx.peerPushPaymentInitiations.get(pursePub);
const newDg = await tx.peerPushDebit.get(pursePub);
if (!newDg) {
return;
}
const oldTxState = computePeerPushDebitTransactionState(newDg);
newDg.status = newOpState;
const newTxState = computePeerPushDebitTransactionState(newDg);
await tx.peerPushPaymentInitiations.put(newDg);
await tx.peerPushDebit.put(newDg);
return { oldTxState, newTxState };
}
return undefined;
@ -455,7 +455,7 @@ async function processPeerPushDebitAbortingRefresh(
*/
async function processPeerPushDebitReady(
ws: InternalWalletState,
peerPushInitiation: PeerPushPaymentInitiationRecord,
peerPushInitiation: PeerPushDebitRecord,
): Promise<TaskRunResult> {
logger.info("processing peer-push-debit pending(ready)");
const pursePub = peerPushInitiation.pursePub;
@ -488,8 +488,8 @@ async function processPeerPushDebitReady(
ws,
peerPushInitiation.pursePub,
{
stFrom: PeerPushPaymentInitiationStatus.PendingReady,
stTo: PeerPushPaymentInitiationStatus.Done,
stFrom: PeerPushDebitStatus.PendingReady,
stTo: PeerPushDebitStatus.Done,
},
);
return {
@ -501,8 +501,8 @@ async function processPeerPushDebitReady(
ws,
peerPushInitiation.pursePub,
{
stFrom: PeerPushPaymentInitiationStatus.PendingReady,
stTo: PeerPushPaymentInitiationStatus.Expired,
stFrom: PeerPushDebitStatus.PendingReady,
stTo: PeerPushDebitStatus.Expired,
},
);
return {
@ -528,9 +528,9 @@ export async function processPeerPushDebit(
pursePub: string,
): Promise<TaskRunResult> {
const peerPushInitiation = await ws.db
.mktx((x) => [x.peerPushPaymentInitiations])
.mktx((x) => [x.peerPushDebit])
.runReadOnly(async (tx) => {
return tx.peerPushPaymentInitiations.get(pursePub);
return tx.peerPushDebit.get(pursePub);
});
if (!peerPushInitiation) {
throw Error("peer push payment not found");
@ -550,13 +550,13 @@ export async function processPeerPushDebit(
}
switch (peerPushInitiation.status) {
case PeerPushPaymentInitiationStatus.PendingCreatePurse:
case PeerPushDebitStatus.PendingCreatePurse:
return processPeerPushDebitCreateReserve(ws, peerPushInitiation);
case PeerPushPaymentInitiationStatus.PendingReady:
case PeerPushDebitStatus.PendingReady:
return processPeerPushDebitReady(ws, peerPushInitiation);
case PeerPushPaymentInitiationStatus.AbortingDeletePurse:
case PeerPushDebitStatus.AbortingDeletePurse:
return processPeerPushDebitAbortingDeletePurse(ws, peerPushInitiation);
case PeerPushPaymentInitiationStatus.AbortingRefresh:
case PeerPushDebitStatus.AbortingRefresh:
return processPeerPushDebitAbortingRefresh(ws, peerPushInitiation);
default: {
const txState = computePeerPushDebitTransactionState(peerPushInitiation);
@ -626,7 +626,7 @@ export async function initiatePeerPushDebit(
x.coinAvailability,
x.denominations,
x.refreshGroups,
x.peerPushPaymentInitiations,
x.peerPushDebit,
])
.runReadWrite(async (tx) => {
// FIXME: Instead of directly doing a spendCoin here,
@ -645,7 +645,7 @@ export async function initiatePeerPushDebit(
refreshReason: RefreshReason.PayPeerPush,
});
const ppi: PeerPushPaymentInitiationRecord = {
const ppi: PeerPushDebitRecord = {
amount: Amounts.stringify(instructedAmount),
contractPriv: contractKeyPair.priv,
contractPub: contractKeyPair.pub,
@ -657,7 +657,7 @@ export async function initiatePeerPushDebit(
pursePriv: pursePair.priv,
pursePub: pursePair.pub,
timestampCreated: TalerPreciseTimestamp.now(),
status: PeerPushPaymentInitiationStatus.PendingCreatePurse,
status: PeerPushDebitStatus.PendingCreatePurse,
contractTerms: contractTerms,
contractEncNonce,
coinSel: {
@ -667,7 +667,7 @@ export async function initiatePeerPushDebit(
totalCost: Amounts.stringify(totalAmount),
};
await tx.peerPushPaymentInitiations.add(ppi);
await tx.peerPushDebit.add(ppi);
await tx.contractTerms.put({
h: hContractTerms,
@ -701,32 +701,32 @@ export async function initiatePeerPushDebit(
}
export function computePeerPushDebitTransactionActions(
ppiRecord: PeerPushPaymentInitiationRecord,
ppiRecord: PeerPushDebitRecord,
): TransactionAction[] {
switch (ppiRecord.status) {
case PeerPushPaymentInitiationStatus.PendingCreatePurse:
case PeerPushDebitStatus.PendingCreatePurse:
return [TransactionAction.Abort, TransactionAction.Suspend];
case PeerPushPaymentInitiationStatus.PendingReady:
case PeerPushDebitStatus.PendingReady:
return [TransactionAction.Abort, TransactionAction.Suspend];
case PeerPushPaymentInitiationStatus.Aborted:
case PeerPushDebitStatus.Aborted:
return [TransactionAction.Delete];
case PeerPushPaymentInitiationStatus.AbortingDeletePurse:
case PeerPushDebitStatus.AbortingDeletePurse:
return [TransactionAction.Suspend, TransactionAction.Fail];
case PeerPushPaymentInitiationStatus.AbortingRefresh:
case PeerPushDebitStatus.AbortingRefresh:
return [TransactionAction.Suspend, TransactionAction.Fail];
case PeerPushPaymentInitiationStatus.SuspendedAbortingDeletePurse:
case PeerPushDebitStatus.SuspendedAbortingDeletePurse:
return [TransactionAction.Resume, TransactionAction.Fail];
case PeerPushPaymentInitiationStatus.SuspendedAbortingRefresh:
case PeerPushDebitStatus.SuspendedAbortingRefresh:
return [TransactionAction.Resume, TransactionAction.Fail];
case PeerPushPaymentInitiationStatus.SuspendedCreatePurse:
case PeerPushDebitStatus.SuspendedCreatePurse:
return [TransactionAction.Resume, TransactionAction.Abort];
case PeerPushPaymentInitiationStatus.SuspendedReady:
case PeerPushDebitStatus.SuspendedReady:
return [TransactionAction.Suspend, TransactionAction.Abort];
case PeerPushPaymentInitiationStatus.Done:
case PeerPushDebitStatus.Done:
return [TransactionAction.Delete];
case PeerPushPaymentInitiationStatus.Expired:
case PeerPushDebitStatus.Expired:
return [TransactionAction.Delete];
case PeerPushPaymentInitiationStatus.Failed:
case PeerPushDebitStatus.Failed:
return [TransactionAction.Delete];
}
}
@ -745,32 +745,32 @@ export async function abortPeerPushDebitTransaction(
});
stopLongpolling(ws, taskId);
const transitionInfo = await ws.db
.mktx((x) => [x.peerPushPaymentInitiations])
.mktx((x) => [x.peerPushDebit])
.runReadWrite(async (tx) => {
const pushDebitRec = await tx.peerPushPaymentInitiations.get(pursePub);
const pushDebitRec = await tx.peerPushDebit.get(pursePub);
if (!pushDebitRec) {
logger.warn(`peer push debit ${pursePub} not found`);
return;
}
let newStatus: PeerPushPaymentInitiationStatus | undefined = undefined;
let newStatus: PeerPushDebitStatus | undefined = undefined;
switch (pushDebitRec.status) {
case PeerPushPaymentInitiationStatus.PendingReady:
case PeerPushPaymentInitiationStatus.SuspendedReady:
newStatus = PeerPushPaymentInitiationStatus.AbortingDeletePurse;
case PeerPushDebitStatus.PendingReady:
case PeerPushDebitStatus.SuspendedReady:
newStatus = PeerPushDebitStatus.AbortingDeletePurse;
break;
case PeerPushPaymentInitiationStatus.SuspendedCreatePurse:
case PeerPushPaymentInitiationStatus.PendingCreatePurse:
case PeerPushDebitStatus.SuspendedCreatePurse:
case PeerPushDebitStatus.PendingCreatePurse:
// Network request might already be in-flight!
newStatus = PeerPushPaymentInitiationStatus.AbortingDeletePurse;
newStatus = PeerPushDebitStatus.AbortingDeletePurse;
break;
case PeerPushPaymentInitiationStatus.SuspendedAbortingRefresh:
case PeerPushPaymentInitiationStatus.SuspendedAbortingDeletePurse:
case PeerPushPaymentInitiationStatus.AbortingRefresh:
case PeerPushPaymentInitiationStatus.Done:
case PeerPushPaymentInitiationStatus.AbortingDeletePurse:
case PeerPushPaymentInitiationStatus.Aborted:
case PeerPushPaymentInitiationStatus.Expired:
case PeerPushPaymentInitiationStatus.Failed:
case PeerPushDebitStatus.SuspendedAbortingRefresh:
case PeerPushDebitStatus.SuspendedAbortingDeletePurse:
case PeerPushDebitStatus.AbortingRefresh:
case PeerPushDebitStatus.Done:
case PeerPushDebitStatus.AbortingDeletePurse:
case PeerPushDebitStatus.Aborted:
case PeerPushDebitStatus.Expired:
case PeerPushDebitStatus.Failed:
// Do nothing
break;
default:
@ -780,7 +780,7 @@ export async function abortPeerPushDebitTransaction(
const oldTxState = computePeerPushDebitTransactionState(pushDebitRec);
pushDebitRec.status = newStatus;
const newTxState = computePeerPushDebitTransactionState(pushDebitRec);
await tx.peerPushPaymentInitiations.put(pushDebitRec);
await tx.peerPushDebit.put(pushDebitRec);
return {
oldTxState,
newTxState,
@ -805,32 +805,32 @@ export async function failPeerPushDebitTransaction(
});
stopLongpolling(ws, taskId);
const transitionInfo = await ws.db
.mktx((x) => [x.peerPushPaymentInitiations])
.mktx((x) => [x.peerPushDebit])
.runReadWrite(async (tx) => {
const pushDebitRec = await tx.peerPushPaymentInitiations.get(pursePub);
const pushDebitRec = await tx.peerPushDebit.get(pursePub);
if (!pushDebitRec) {
logger.warn(`peer push debit ${pursePub} not found`);
return;
}
let newStatus: PeerPushPaymentInitiationStatus | undefined = undefined;
let newStatus: PeerPushDebitStatus | undefined = undefined;
switch (pushDebitRec.status) {
case PeerPushPaymentInitiationStatus.AbortingRefresh:
case PeerPushPaymentInitiationStatus.SuspendedAbortingRefresh:
case PeerPushDebitStatus.AbortingRefresh:
case PeerPushDebitStatus.SuspendedAbortingRefresh:
// FIXME: What to do about the refresh group?
newStatus = PeerPushPaymentInitiationStatus.Failed;
newStatus = PeerPushDebitStatus.Failed;
break;
case PeerPushPaymentInitiationStatus.AbortingDeletePurse:
case PeerPushPaymentInitiationStatus.SuspendedAbortingDeletePurse:
case PeerPushPaymentInitiationStatus.PendingReady:
case PeerPushPaymentInitiationStatus.SuspendedReady:
case PeerPushPaymentInitiationStatus.SuspendedCreatePurse:
case PeerPushPaymentInitiationStatus.PendingCreatePurse:
newStatus = PeerPushPaymentInitiationStatus.Failed;
case PeerPushDebitStatus.AbortingDeletePurse:
case PeerPushDebitStatus.SuspendedAbortingDeletePurse:
case PeerPushDebitStatus.PendingReady:
case PeerPushDebitStatus.SuspendedReady:
case PeerPushDebitStatus.SuspendedCreatePurse:
case PeerPushDebitStatus.PendingCreatePurse:
newStatus = PeerPushDebitStatus.Failed;
break;
case PeerPushPaymentInitiationStatus.Done:
case PeerPushPaymentInitiationStatus.Aborted:
case PeerPushPaymentInitiationStatus.Failed:
case PeerPushPaymentInitiationStatus.Expired:
case PeerPushDebitStatus.Done:
case PeerPushDebitStatus.Aborted:
case PeerPushDebitStatus.Failed:
case PeerPushDebitStatus.Expired:
// Do nothing
break;
default:
@ -840,7 +840,7 @@ export async function failPeerPushDebitTransaction(
const oldTxState = computePeerPushDebitTransactionState(pushDebitRec);
pushDebitRec.status = newStatus;
const newTxState = computePeerPushDebitTransactionState(pushDebitRec);
await tx.peerPushPaymentInitiations.put(pushDebitRec);
await tx.peerPushDebit.put(pushDebitRec);
return {
oldTxState,
newTxState,
@ -865,36 +865,36 @@ export async function suspendPeerPushDebitTransaction(
});
stopLongpolling(ws, taskId);
const transitionInfo = await ws.db
.mktx((x) => [x.peerPushPaymentInitiations])
.mktx((x) => [x.peerPushDebit])
.runReadWrite(async (tx) => {
const pushDebitRec = await tx.peerPushPaymentInitiations.get(pursePub);
const pushDebitRec = await tx.peerPushDebit.get(pursePub);
if (!pushDebitRec) {
logger.warn(`peer push debit ${pursePub} not found`);
return;
}
let newStatus: PeerPushPaymentInitiationStatus | undefined = undefined;
let newStatus: PeerPushDebitStatus | undefined = undefined;
switch (pushDebitRec.status) {
case PeerPushPaymentInitiationStatus.PendingCreatePurse:
newStatus = PeerPushPaymentInitiationStatus.SuspendedCreatePurse;
case PeerPushDebitStatus.PendingCreatePurse:
newStatus = PeerPushDebitStatus.SuspendedCreatePurse;
break;
case PeerPushPaymentInitiationStatus.AbortingRefresh:
newStatus = PeerPushPaymentInitiationStatus.SuspendedAbortingRefresh;
case PeerPushDebitStatus.AbortingRefresh:
newStatus = PeerPushDebitStatus.SuspendedAbortingRefresh;
break;
case PeerPushPaymentInitiationStatus.AbortingDeletePurse:
case PeerPushDebitStatus.AbortingDeletePurse:
newStatus =
PeerPushPaymentInitiationStatus.SuspendedAbortingDeletePurse;
PeerPushDebitStatus.SuspendedAbortingDeletePurse;
break;
case PeerPushPaymentInitiationStatus.PendingReady:
newStatus = PeerPushPaymentInitiationStatus.SuspendedReady;
case PeerPushDebitStatus.PendingReady:
newStatus = PeerPushDebitStatus.SuspendedReady;
break;
case PeerPushPaymentInitiationStatus.SuspendedAbortingDeletePurse:
case PeerPushPaymentInitiationStatus.SuspendedAbortingRefresh:
case PeerPushPaymentInitiationStatus.SuspendedReady:
case PeerPushPaymentInitiationStatus.SuspendedCreatePurse:
case PeerPushPaymentInitiationStatus.Done:
case PeerPushPaymentInitiationStatus.Aborted:
case PeerPushPaymentInitiationStatus.Failed:
case PeerPushPaymentInitiationStatus.Expired:
case PeerPushDebitStatus.SuspendedAbortingDeletePurse:
case PeerPushDebitStatus.SuspendedAbortingRefresh:
case PeerPushDebitStatus.SuspendedReady:
case PeerPushDebitStatus.SuspendedCreatePurse:
case PeerPushDebitStatus.Done:
case PeerPushDebitStatus.Aborted:
case PeerPushDebitStatus.Failed:
case PeerPushDebitStatus.Expired:
// Do nothing
break;
default:
@ -904,7 +904,7 @@ export async function suspendPeerPushDebitTransaction(
const oldTxState = computePeerPushDebitTransactionState(pushDebitRec);
pushDebitRec.status = newStatus;
const newTxState = computePeerPushDebitTransactionState(pushDebitRec);
await tx.peerPushPaymentInitiations.put(pushDebitRec);
await tx.peerPushDebit.put(pushDebitRec);
return {
oldTxState,
newTxState,
@ -929,35 +929,35 @@ export async function resumePeerPushDebitTransaction(
});
stopLongpolling(ws, taskId);
const transitionInfo = await ws.db
.mktx((x) => [x.peerPushPaymentInitiations])
.mktx((x) => [x.peerPushDebit])
.runReadWrite(async (tx) => {
const pushDebitRec = await tx.peerPushPaymentInitiations.get(pursePub);
const pushDebitRec = await tx.peerPushDebit.get(pursePub);
if (!pushDebitRec) {
logger.warn(`peer push debit ${pursePub} not found`);
return;
}
let newStatus: PeerPushPaymentInitiationStatus | undefined = undefined;
let newStatus: PeerPushDebitStatus | undefined = undefined;
switch (pushDebitRec.status) {
case PeerPushPaymentInitiationStatus.SuspendedAbortingDeletePurse:
newStatus = PeerPushPaymentInitiationStatus.AbortingDeletePurse;
case PeerPushDebitStatus.SuspendedAbortingDeletePurse:
newStatus = PeerPushDebitStatus.AbortingDeletePurse;
break;
case PeerPushPaymentInitiationStatus.SuspendedAbortingRefresh:
newStatus = PeerPushPaymentInitiationStatus.AbortingRefresh;
case PeerPushDebitStatus.SuspendedAbortingRefresh:
newStatus = PeerPushDebitStatus.AbortingRefresh;
break;
case PeerPushPaymentInitiationStatus.SuspendedReady:
newStatus = PeerPushPaymentInitiationStatus.PendingReady;
case PeerPushDebitStatus.SuspendedReady:
newStatus = PeerPushDebitStatus.PendingReady;
break;
case PeerPushPaymentInitiationStatus.SuspendedCreatePurse:
newStatus = PeerPushPaymentInitiationStatus.PendingCreatePurse;
case PeerPushDebitStatus.SuspendedCreatePurse:
newStatus = PeerPushDebitStatus.PendingCreatePurse;
break;
case PeerPushPaymentInitiationStatus.PendingCreatePurse:
case PeerPushPaymentInitiationStatus.AbortingRefresh:
case PeerPushPaymentInitiationStatus.AbortingDeletePurse:
case PeerPushPaymentInitiationStatus.PendingReady:
case PeerPushPaymentInitiationStatus.Done:
case PeerPushPaymentInitiationStatus.Aborted:
case PeerPushPaymentInitiationStatus.Failed:
case PeerPushPaymentInitiationStatus.Expired:
case PeerPushDebitStatus.PendingCreatePurse:
case PeerPushDebitStatus.AbortingRefresh:
case PeerPushDebitStatus.AbortingDeletePurse:
case PeerPushDebitStatus.PendingReady:
case PeerPushDebitStatus.Done:
case PeerPushDebitStatus.Aborted:
case PeerPushDebitStatus.Failed:
case PeerPushDebitStatus.Expired:
// Do nothing
break;
default:
@ -967,7 +967,7 @@ export async function resumePeerPushDebitTransaction(
const oldTxState = computePeerPushDebitTransactionState(pushDebitRec);
pushDebitRec.status = newStatus;
const newTxState = computePeerPushDebitTransactionState(pushDebitRec);
await tx.peerPushPaymentInitiations.put(pushDebitRec);
await tx.peerPushDebit.put(pushDebitRec);
return {
oldTxState,
newTxState,
@ -980,62 +980,62 @@ export async function resumePeerPushDebitTransaction(
}
export function computePeerPushDebitTransactionState(
ppiRecord: PeerPushPaymentInitiationRecord,
ppiRecord: PeerPushDebitRecord,
): TransactionState {
switch (ppiRecord.status) {
case PeerPushPaymentInitiationStatus.PendingCreatePurse:
case PeerPushDebitStatus.PendingCreatePurse:
return {
major: TransactionMajorState.Pending,
minor: TransactionMinorState.CreatePurse,
};
case PeerPushPaymentInitiationStatus.PendingReady:
case PeerPushDebitStatus.PendingReady:
return {
major: TransactionMajorState.Pending,
minor: TransactionMinorState.Ready,
};
case PeerPushPaymentInitiationStatus.Aborted:
case PeerPushDebitStatus.Aborted:
return {
major: TransactionMajorState.Aborted,
};
case PeerPushPaymentInitiationStatus.AbortingDeletePurse:
case PeerPushDebitStatus.AbortingDeletePurse:
return {
major: TransactionMajorState.Aborting,
minor: TransactionMinorState.DeletePurse,
};
case PeerPushPaymentInitiationStatus.AbortingRefresh:
case PeerPushDebitStatus.AbortingRefresh:
return {
major: TransactionMajorState.Aborting,
minor: TransactionMinorState.Refresh,
};
case PeerPushPaymentInitiationStatus.SuspendedAbortingDeletePurse:
case PeerPushDebitStatus.SuspendedAbortingDeletePurse:
return {
major: TransactionMajorState.SuspendedAborting,
minor: TransactionMinorState.DeletePurse,
};
case PeerPushPaymentInitiationStatus.SuspendedAbortingRefresh:
case PeerPushDebitStatus.SuspendedAbortingRefresh:
return {
major: TransactionMajorState.SuspendedAborting,
minor: TransactionMinorState.Refresh,
};
case PeerPushPaymentInitiationStatus.SuspendedCreatePurse:
case PeerPushDebitStatus.SuspendedCreatePurse:
return {
major: TransactionMajorState.Suspended,
minor: TransactionMinorState.CreatePurse,
};
case PeerPushPaymentInitiationStatus.SuspendedReady:
case PeerPushDebitStatus.SuspendedReady:
return {
major: TransactionMajorState.Suspended,
minor: TransactionMinorState.Ready,
};
case PeerPushPaymentInitiationStatus.Done:
case PeerPushDebitStatus.Done:
return {
major: TransactionMajorState.Done,
};
case PeerPushPaymentInitiationStatus.Failed:
case PeerPushDebitStatus.Failed:
return {
major: TransactionMajorState.Failed,
};
case PeerPushPaymentInitiationStatus.Expired:
case PeerPushDebitStatus.Expired:
return {
major: TransactionMajorState.Expired,
};

View File

@ -26,11 +26,10 @@ import {
WalletStoresV1,
BackupProviderStateTag,
RefreshCoinStatus,
OperationStatusRange,
PeerPushPaymentInitiationStatus,
PeerPushDebitStatus,
PeerPullDebitRecordStatus,
PeerPushPaymentIncomingStatus,
PeerPullPaymentInitiationStatus,
PeerPushCreditStatus,
PeerPullPaymentCreditStatus,
WithdrawalGroupStatus,
RewardRecordStatus,
DepositOperationStatus,
@ -39,13 +38,14 @@ import {
DepositGroupRecord,
RewardRecord,
PurchaseRecord,
PeerPullPaymentInitiationRecord,
PeerPullCreditRecord,
PeerPullPaymentIncomingRecord,
PeerPushPaymentInitiationRecord,
PeerPushDebitRecord,
PeerPushPaymentIncomingRecord,
RefundGroupRecord,
RefundGroupStatus,
ExchangeEntryDbUpdateStatus,
RefreshOperationStatus,
} from "../db.js";
import {
PendingOperationsResponse,
@ -136,8 +136,8 @@ export async function iterRecordsForRefresh(
let refreshGroups: RefreshGroupRecord[];
if (filter.onlyState === "nonfinal") {
const keyRange = GlobalIDB.KeyRange.bound(
OperationStatusRange.ACTIVE_START,
OperationStatusRange.ACTIVE_END,
RefreshOperationStatus.Pending,
RefreshOperationStatus.Suspended,
);
refreshGroups = await tx.refreshGroups.indexes.byStatus.getAll(keyRange);
} else {
@ -470,28 +470,28 @@ async function gatherBackupPending(
export async function iterRecordsForPeerPullInitiation(
tx: GetReadOnlyAccess<{
peerPullPaymentInitiations: typeof WalletStoresV1.peerPullPaymentInitiations;
peerPullCredit: typeof WalletStoresV1.peerPullCredit;
}>,
filter: TransactionRecordFilter,
f: (r: PeerPullPaymentInitiationRecord) => Promise<void>,
f: (r: PeerPullCreditRecord) => Promise<void>,
): Promise<void> {
if (filter.onlyState === "nonfinal") {
const keyRange = GlobalIDB.KeyRange.bound(
PeerPullPaymentInitiationStatus.PendingCreatePurse,
PeerPullPaymentInitiationStatus.AbortingDeletePurse,
PeerPullPaymentCreditStatus.PendingCreatePurse,
PeerPullPaymentCreditStatus.AbortingDeletePurse,
);
await tx.peerPullPaymentInitiations.indexes.byStatus
await tx.peerPullCredit.indexes.byStatus
.iter(keyRange)
.forEachAsync(f);
} else {
await tx.peerPullPaymentInitiations.indexes.byStatus.iter().forEachAsync(f);
await tx.peerPullCredit.indexes.byStatus.iter().forEachAsync(f);
}
}
async function gatherPeerPullInitiationPending(
ws: InternalWalletState,
tx: GetReadOnlyAccess<{
peerPullPaymentInitiations: typeof WalletStoresV1.peerPullPaymentInitiations;
peerPullCredit: typeof WalletStoresV1.peerPullCredit;
operationRetries: typeof WalletStoresV1.operationRetries;
}>,
now: AbsoluteTime,
@ -518,7 +518,7 @@ async function gatherPeerPullInitiationPending(
export async function iterRecordsForPeerPullDebit(
tx: GetReadOnlyAccess<{
peerPullPaymentIncoming: typeof WalletStoresV1.peerPullPaymentIncoming;
peerPullDebit: typeof WalletStoresV1.peerPullDebit;
}>,
filter: TransactionRecordFilter,
f: (r: PeerPullPaymentIncomingRecord) => Promise<void>,
@ -528,18 +528,18 @@ export async function iterRecordsForPeerPullDebit(
PeerPullDebitRecordStatus.PendingDeposit,
PeerPullDebitRecordStatus.AbortingRefresh,
);
await tx.peerPullPaymentIncoming.indexes.byStatus
await tx.peerPullDebit.indexes.byStatus
.iter(keyRange)
.forEachAsync(f);
} else {
await tx.peerPullPaymentIncoming.indexes.byStatus.iter().forEachAsync(f);
await tx.peerPullDebit.indexes.byStatus.iter().forEachAsync(f);
}
}
async function gatherPeerPullDebitPending(
ws: InternalWalletState,
tx: GetReadOnlyAccess<{
peerPullPaymentIncoming: typeof WalletStoresV1.peerPullPaymentIncoming;
peerPullDebit: typeof WalletStoresV1.peerPullDebit;
operationRetries: typeof WalletStoresV1.operationRetries;
}>,
now: AbsoluteTime,
@ -558,7 +558,7 @@ async function gatherPeerPullDebitPending(
...getPendingCommon(ws, opId, timestampDue),
givesLifeness: true,
retryInfo: retryRecord?.retryInfo,
peerPullPaymentIncomingId: pi.peerPullPaymentIncomingId,
peerPullDebitId: pi.peerPullDebitId,
});
},
);
@ -566,28 +566,28 @@ async function gatherPeerPullDebitPending(
export async function iterRecordsForPeerPushInitiation(
tx: GetReadOnlyAccess<{
peerPushPaymentInitiations: typeof WalletStoresV1.peerPushPaymentInitiations;
peerPushDebit: typeof WalletStoresV1.peerPushDebit;
}>,
filter: TransactionRecordFilter,
f: (r: PeerPushPaymentInitiationRecord) => Promise<void>,
f: (r: PeerPushDebitRecord) => Promise<void>,
): Promise<void> {
if (filter.onlyState === "nonfinal") {
const keyRange = GlobalIDB.KeyRange.bound(
PeerPushPaymentInitiationStatus.PendingCreatePurse,
PeerPushPaymentInitiationStatus.AbortingRefresh,
PeerPushDebitStatus.PendingCreatePurse,
PeerPushDebitStatus.AbortingRefresh,
);
await tx.peerPushPaymentInitiations.indexes.byStatus
await tx.peerPushDebit.indexes.byStatus
.iter(keyRange)
.forEachAsync(f);
} else {
await tx.peerPushPaymentInitiations.indexes.byStatus.iter().forEachAsync(f);
await tx.peerPushDebit.indexes.byStatus.iter().forEachAsync(f);
}
}
async function gatherPeerPushInitiationPending(
ws: InternalWalletState,
tx: GetReadOnlyAccess<{
peerPushPaymentInitiations: typeof WalletStoresV1.peerPushPaymentInitiations;
peerPushDebit: typeof WalletStoresV1.peerPushDebit;
operationRetries: typeof WalletStoresV1.operationRetries;
}>,
now: AbsoluteTime,
@ -614,36 +614,36 @@ async function gatherPeerPushInitiationPending(
export async function iterRecordsForPeerPushCredit(
tx: GetReadOnlyAccess<{
peerPushPaymentIncoming: typeof WalletStoresV1.peerPushPaymentIncoming;
peerPushCredit: typeof WalletStoresV1.peerPushCredit;
}>,
filter: TransactionRecordFilter,
f: (r: PeerPushPaymentIncomingRecord) => Promise<void>,
): Promise<void> {
if (filter.onlyState === "nonfinal") {
const keyRange = GlobalIDB.KeyRange.bound(
PeerPushPaymentIncomingStatus.PendingMerge,
PeerPushPaymentIncomingStatus.PendingWithdrawing,
PeerPushCreditStatus.PendingMerge,
PeerPushCreditStatus.PendingWithdrawing,
);
await tx.peerPushPaymentIncoming.indexes.byStatus
await tx.peerPushCredit.indexes.byStatus
.iter(keyRange)
.forEachAsync(f);
} else {
await tx.peerPushPaymentIncoming.indexes.byStatus.iter().forEachAsync(f);
await tx.peerPushCredit.indexes.byStatus.iter().forEachAsync(f);
}
}
async function gatherPeerPushCreditPending(
ws: InternalWalletState,
tx: GetReadOnlyAccess<{
peerPushPaymentIncoming: typeof WalletStoresV1.peerPushPaymentIncoming;
peerPushCredit: typeof WalletStoresV1.peerPushCredit;
operationRetries: typeof WalletStoresV1.operationRetries;
}>,
now: AbsoluteTime,
resp: PendingOperationsResponse,
): Promise<void> {
const keyRange = GlobalIDB.KeyRange.bound(
PeerPushPaymentIncomingStatus.PendingMerge,
PeerPushPaymentIncomingStatus.PendingWithdrawing,
PeerPushCreditStatus.PendingMerge,
PeerPushCreditStatus.PendingWithdrawing,
);
await iterRecordsForPeerPushCredit(
tx,
@ -658,7 +658,7 @@ async function gatherPeerPushCreditPending(
...getPendingCommon(ws, opId, timestampDue),
givesLifeness: true,
retryInfo: retryRecord?.retryInfo,
peerPushPaymentIncomingId: pi.peerPushPaymentIncomingId,
peerPushCreditId: pi.peerPushCreditId,
});
},
);
@ -682,10 +682,10 @@ export async function getPendingOperations(
x.depositGroups,
x.recoupGroups,
x.operationRetries,
x.peerPullPaymentInitiations,
x.peerPushPaymentInitiations,
x.peerPullPaymentIncoming,
x.peerPushPaymentIncoming,
x.peerPullCredit,
x.peerPushDebit,
x.peerPullDebit,
x.peerPushCredit,
])
.runReadWrite(async (tx) => {
const resp: PendingOperationsResponse = {

View File

@ -108,7 +108,7 @@ export function computeRewardTransactionStatus(
major: TransactionMajorState.Dialog,
minor: TransactionMinorState.Proposed,
};
case RewardRecordStatus.SuspendidPickup:
case RewardRecordStatus.SuspendedPickup:
return {
major: TransactionMajorState.Pending,
minor: TransactionMinorState.Pickup,
@ -128,7 +128,7 @@ export function computeTipTransactionActions(
return [TransactionAction.Delete];
case RewardRecordStatus.PendingPickup:
return [TransactionAction.Suspend, TransactionAction.Fail];
case RewardRecordStatus.SuspendidPickup:
case RewardRecordStatus.SuspendedPickup:
return [TransactionAction.Resume, TransactionAction.Fail];
case RewardRecordStatus.DialogAccept:
return [TransactionAction.Abort];
@ -255,7 +255,7 @@ export async function processTip(
case RewardRecordStatus.Aborted:
case RewardRecordStatus.DialogAccept:
case RewardRecordStatus.Done:
case RewardRecordStatus.SuspendidPickup:
case RewardRecordStatus.SuspendedPickup:
return TaskRunResult.finished();
}
@ -496,12 +496,12 @@ export async function suspendRewardTransaction(
let newStatus: RewardRecordStatus | undefined = undefined;
switch (tipRec.status) {
case RewardRecordStatus.Done:
case RewardRecordStatus.SuspendidPickup:
case RewardRecordStatus.SuspendedPickup:
case RewardRecordStatus.Aborted:
case RewardRecordStatus.DialogAccept:
break;
case RewardRecordStatus.PendingPickup:
newStatus = RewardRecordStatus.SuspendidPickup;
newStatus = RewardRecordStatus.SuspendedPickup;
break;
default:
@ -551,7 +551,7 @@ export async function resumeTipTransaction(
case RewardRecordStatus.Aborted:
case RewardRecordStatus.DialogAccept:
break;
case RewardRecordStatus.SuspendidPickup:
case RewardRecordStatus.SuspendedPickup:
newStatus = RewardRecordStatus.PendingPickup;
break;
default:
@ -608,7 +608,7 @@ export async function abortTipTransaction(
case RewardRecordStatus.PendingPickup:
case RewardRecordStatus.DialogAccept:
break;
case RewardRecordStatus.SuspendidPickup:
case RewardRecordStatus.SuspendedPickup:
newStatus = RewardRecordStatus.Aborted;
break;
default:

View File

@ -700,7 +700,7 @@ export async function runIntegrationTest2(
});
await confirmPeerPushCredit(ws, {
peerPushPaymentIncomingId: peerPushCredit.peerPushPaymentIncomingId,
peerPushCreditId: peerPushCredit.peerPushCreditId,
});
const peerPullInit = await initiatePeerPullPayment(ws, {
@ -723,7 +723,7 @@ export async function runIntegrationTest2(
});
await confirmPeerPullDebit(ws, {
peerPullPaymentIncomingId: peerPullInc.peerPullPaymentIncomingId,
peerPullDebitId: peerPullInc.peerPullDebitId,
});
await waitUntilDone(ws);

View File

@ -50,10 +50,10 @@ import {
OperationRetryRecord,
PeerPullPaymentIncomingRecord,
PeerPullDebitRecordStatus,
PeerPullPaymentInitiationRecord,
PeerPullCreditRecord,
PeerPushPaymentIncomingRecord,
PeerPushPaymentIncomingStatus,
PeerPushPaymentInitiationRecord,
PeerPushCreditStatus,
PeerPushDebitRecord,
PurchaseRecord,
PurchaseStatus,
RefreshGroupRecord,
@ -335,10 +335,10 @@ export async function getTransactionById(
}
case TransactionType.PeerPullDebit: {
return await ws.db
.mktx((x) => [x.peerPullPaymentIncoming])
.mktx((x) => [x.peerPullDebit])
.runReadWrite(async (tx) => {
const debit = await tx.peerPullPaymentIncoming.get(
parsedTx.peerPullPaymentIncomingId,
const debit = await tx.peerPullDebit.get(
parsedTx.peerPullDebitId,
);
if (!debit) throw Error("not found");
return buildTransactionForPullPaymentDebit(debit);
@ -347,9 +347,9 @@ export async function getTransactionById(
case TransactionType.PeerPushDebit: {
return await ws.db
.mktx((x) => [x.peerPushPaymentInitiations, x.contractTerms])
.mktx((x) => [x.peerPushDebit, x.contractTerms])
.runReadWrite(async (tx) => {
const debit = await tx.peerPushPaymentInitiations.get(
const debit = await tx.peerPushDebit.get(
parsedTx.pursePub,
);
if (!debit) throw Error("not found");
@ -363,17 +363,17 @@ export async function getTransactionById(
}
case TransactionType.PeerPushCredit: {
const peerPushPaymentIncomingId = parsedTx.peerPushPaymentIncomingId;
const peerPushCreditId = parsedTx.peerPushCreditId;
return await ws.db
.mktx((x) => [
x.peerPushPaymentIncoming,
x.peerPushCredit,
x.contractTerms,
x.withdrawalGroups,
x.operationRetries,
])
.runReadWrite(async (tx) => {
const pushInc = await tx.peerPushPaymentIncoming.get(
peerPushPaymentIncomingId,
const pushInc = await tx.peerPushCredit.get(
peerPushCreditId,
);
if (!pushInc) throw Error("not found");
const ct = await tx.contractTerms.get(pushInc.contractTermsHash);
@ -405,13 +405,13 @@ export async function getTransactionById(
const pursePub = parsedTx.pursePub;
return await ws.db
.mktx((x) => [
x.peerPullPaymentInitiations,
x.peerPullCredit,
x.contractTerms,
x.withdrawalGroups,
x.operationRetries,
])
.runReadWrite(async (tx) => {
const pushInc = await tx.peerPullPaymentInitiations.get(pursePub);
const pushInc = await tx.peerPullCredit.get(pursePub);
if (!pushInc) throw Error("not found");
const ct = await tx.contractTerms.get(pushInc.contractTermsHash);
checkDbInvariant(!!ct);
@ -442,7 +442,7 @@ export async function getTransactionById(
}
function buildTransactionForPushPaymentDebit(
pi: PeerPushPaymentInitiationRecord,
pi: PeerPushDebitRecord,
contractTerms: PeerContractTerms,
ort?: OperationRetryRecord,
): Transaction {
@ -490,14 +490,14 @@ function buildTransactionForPullPaymentDebit(
timestamp: pi.timestampCreated,
transactionId: constructTransactionIdentifier({
tag: TransactionType.PeerPullDebit,
peerPullPaymentIncomingId: pi.peerPullPaymentIncomingId,
peerPullDebitId: pi.peerPullDebitId,
}),
...(ort?.lastError ? { error: ort.lastError } : {}),
};
}
function buildTransactionForPeerPullCredit(
pullCredit: PeerPullPaymentInitiationRecord,
pullCredit: PeerPullCreditRecord,
pullCreditOrt: OperationRetryRecord | undefined,
peerContractTerms: PeerContractTerms,
wsr: WithdrawalGroupRecord | undefined,
@ -606,7 +606,7 @@ function buildTransactionForPeerPushCredit(
timestamp: wsr.timestampStart,
transactionId: constructTransactionIdentifier({
tag: TransactionType.PeerPushCredit,
peerPushPaymentIncomingId: pushInc.peerPushPaymentIncomingId,
peerPushCreditId: pushInc.peerPushCreditId,
}),
kycUrl: pushInc.kycUrl,
...(wsrOrt?.lastError ? { error: wsrOrt.lastError } : {}),
@ -629,7 +629,7 @@ function buildTransactionForPeerPushCredit(
timestamp: pushInc.timestamp,
transactionId: constructTransactionIdentifier({
tag: TransactionType.PeerPushCredit,
peerPushPaymentIncomingId: pushInc.peerPushPaymentIncomingId,
peerPushCreditId: pushInc.peerPushCreditId,
}),
...(pushOrt?.lastError ? { error: pushOrt.lastError } : {}),
};
@ -654,7 +654,7 @@ function buildTransactionForBankIntegratedWithdraw(
reservePub: wgRecord.reservePub,
bankConfirmationUrl: wgRecord.wgInfo.bankInfo.confirmUrl,
reserveIsReady:
wgRecord.status === WithdrawalGroupStatus.Finished ||
wgRecord.status === WithdrawalGroupStatus.Done ||
wgRecord.status === WithdrawalGroupStatus.PendingReady,
},
kycUrl: wgRecord.kycUrl,
@ -698,7 +698,7 @@ function buildTransactionForManualWithdraw(
reservePub: withdrawalGroup.reservePub,
exchangePaytoUris,
reserveIsReady:
withdrawalGroup.status === WithdrawalGroupStatus.Finished ||
withdrawalGroup.status === WithdrawalGroupStatus.Done ||
withdrawalGroup.status === WithdrawalGroupStatus.PendingReady,
},
kycUrl: withdrawalGroup.kycUrl,
@ -944,10 +944,10 @@ export async function getTransactions(
x.exchangeDetails,
x.exchanges,
x.operationRetries,
x.peerPullPaymentIncoming,
x.peerPushPaymentInitiations,
x.peerPushPaymentIncoming,
x.peerPullPaymentInitiations,
x.peerPullDebit,
x.peerPushDebit,
x.peerPushCredit,
x.peerPullCredit,
x.planchets,
x.purchases,
x.contractTerms,
@ -985,7 +985,7 @@ export async function getTransactions(
}
if (
pi.status !== PeerPullDebitRecordStatus.PendingDeposit &&
pi.status !== PeerPullDebitRecordStatus.DonePaid
pi.status !== PeerPullDebitRecordStatus.Done
) {
return;
}
@ -1004,7 +1004,7 @@ export async function getTransactions(
if (shouldSkipSearch(transactionsRequest, [])) {
return;
}
if (pi.status === PeerPushPaymentIncomingStatus.DialogProposed) {
if (pi.status === PeerPushCreditStatus.DialogProposed) {
// We don't report proposed push credit transactions, user needs
// to scan URI again and confirm to see it.
return;
@ -1268,9 +1268,9 @@ export async function getTransactions(
export type ParsedTransactionIdentifier =
| { tag: TransactionType.Deposit; depositGroupId: string }
| { tag: TransactionType.Payment; proposalId: string }
| { tag: TransactionType.PeerPullDebit; peerPullPaymentIncomingId: string }
| { tag: TransactionType.PeerPullDebit; peerPullDebitId: string }
| { tag: TransactionType.PeerPullCredit; pursePub: string }
| { tag: TransactionType.PeerPushCredit; peerPushPaymentIncomingId: string }
| { tag: TransactionType.PeerPushCredit; peerPushCreditId: string }
| { tag: TransactionType.PeerPushDebit; pursePub: string }
| { tag: TransactionType.Refresh; refreshGroupId: string }
| { tag: TransactionType.Refund; refundGroupId: string }
@ -1289,9 +1289,9 @@ export function constructTransactionIdentifier(
case TransactionType.PeerPullCredit:
return `txn:${pTxId.tag}:${pTxId.pursePub}` as TransactionIdStr;
case TransactionType.PeerPullDebit:
return `txn:${pTxId.tag}:${pTxId.peerPullPaymentIncomingId}` as TransactionIdStr;
return `txn:${pTxId.tag}:${pTxId.peerPullDebitId}` as TransactionIdStr;
case TransactionType.PeerPushCredit:
return `txn:${pTxId.tag}:${pTxId.peerPushPaymentIncomingId}` as TransactionIdStr;
return `txn:${pTxId.tag}:${pTxId.peerPushCreditId}` as TransactionIdStr;
case TransactionType.PeerPushDebit:
return `txn:${pTxId.tag}:${pTxId.pursePub}` as TransactionIdStr;
case TransactionType.Refresh:
@ -1337,12 +1337,12 @@ export function parseTransactionIdentifier(
case TransactionType.PeerPullDebit:
return {
tag: TransactionType.PeerPullDebit,
peerPullPaymentIncomingId: rest[0],
peerPullDebitId: rest[0],
};
case TransactionType.PeerPushCredit:
return {
tag: TransactionType.PeerPushCredit,
peerPushPaymentIncomingId: rest[0],
peerPushCreditId: rest[0],
};
case TransactionType.PeerPushDebit:
return { tag: TransactionType.PeerPushDebit, pursePub: rest[0] };
@ -1455,7 +1455,7 @@ export async function retryTransaction(
case TransactionType.PeerPullDebit: {
const taskId = constructTaskIdentifier({
tag: PendingTaskType.PeerPullDebit,
peerPullPaymentIncomingId: parsedTx.peerPullPaymentIncomingId,
peerPullDebitId: parsedTx.peerPullDebitId,
});
await resetPendingTaskTimeout(ws, taskId);
stopLongpolling(ws, taskId);
@ -1464,7 +1464,7 @@ export async function retryTransaction(
case TransactionType.PeerPushCredit: {
const taskId = constructTaskIdentifier({
tag: PendingTaskType.PeerPushCredit,
peerPushPaymentIncomingId: parsedTx.peerPushPaymentIncomingId,
peerPushCreditId: parsedTx.peerPushCreditId,
});
await resetPendingTaskTimeout(ws, taskId);
stopLongpolling(ws, taskId);
@ -1522,10 +1522,10 @@ export async function suspendTransaction(
await suspendPeerPushDebitTransaction(ws, tx.pursePub);
break;
case TransactionType.PeerPullDebit:
await suspendPeerPullDebitTransaction(ws, tx.peerPullPaymentIncomingId);
await suspendPeerPullDebitTransaction(ws, tx.peerPullDebitId);
break;
case TransactionType.PeerPushCredit:
await suspendPeerPushCreditTransaction(ws, tx.peerPushPaymentIncomingId);
await suspendPeerPushCreditTransaction(ws, tx.peerPushCreditId);
break;
case TransactionType.Refund:
throw Error("refund transactions can't be suspended or resumed");
@ -1568,10 +1568,10 @@ export async function failTransaction(
await failPeerPullCreditTransaction(ws, tx.pursePub);
return;
case TransactionType.PeerPullDebit:
await failPeerPullDebitTransaction(ws, tx.peerPullPaymentIncomingId);
await failPeerPullDebitTransaction(ws, tx.peerPullDebitId);
return;
case TransactionType.PeerPushCredit:
await failPeerPushCreditTransaction(ws, tx.peerPushPaymentIncomingId);
await failPeerPushCreditTransaction(ws, tx.peerPushCreditId);
return;
case TransactionType.PeerPushDebit:
await failPeerPushDebitTransaction(ws, tx.pursePub);
@ -1613,10 +1613,10 @@ export async function resumeTransaction(
await resumePeerPushDebitTransaction(ws, tx.pursePub);
break;
case TransactionType.PeerPullDebit:
await resumePeerPullDebitTransaction(ws, tx.peerPullPaymentIncomingId);
await resumePeerPullDebitTransaction(ws, tx.peerPullDebitId);
break;
case TransactionType.PeerPushCredit:
await resumePeerPushCreditTransaction(ws, tx.peerPushPaymentIncomingId);
await resumePeerPushCreditTransaction(ws, tx.peerPushCreditId);
break;
case TransactionType.Refund:
throw Error("refund transactions can't be suspended or resumed");
@ -1641,16 +1641,16 @@ export async function deleteTransaction(
switch (parsedTx.tag) {
case TransactionType.PeerPushCredit: {
const peerPushPaymentIncomingId = parsedTx.peerPushPaymentIncomingId;
const peerPushCreditId = parsedTx.peerPushCreditId;
await ws.db
.mktx((x) => [
x.withdrawalGroups,
x.peerPushPaymentIncoming,
x.peerPushCredit,
x.tombstones,
])
.runReadWrite(async (tx) => {
const pushInc = await tx.peerPushPaymentIncoming.get(
peerPushPaymentIncomingId,
const pushInc = await tx.peerPushCredit.get(
peerPushCreditId,
);
if (!pushInc) {
return;
@ -1668,12 +1668,12 @@ export async function deleteTransaction(
});
}
}
await tx.peerPushPaymentIncoming.delete(peerPushPaymentIncomingId);
await tx.peerPushCredit.delete(peerPushCreditId);
await tx.tombstones.put({
id:
TombstoneTag.DeletePeerPushCredit +
":" +
peerPushPaymentIncomingId,
peerPushCreditId,
});
});
return;
@ -1684,11 +1684,11 @@ export async function deleteTransaction(
await ws.db
.mktx((x) => [
x.withdrawalGroups,
x.peerPullPaymentInitiations,
x.peerPullCredit,
x.tombstones,
])
.runReadWrite(async (tx) => {
const pullIni = await tx.peerPullPaymentInitiations.get(pursePub);
const pullIni = await tx.peerPullCredit.get(pursePub);
if (!pullIni) {
return;
}
@ -1705,7 +1705,7 @@ export async function deleteTransaction(
});
}
}
await tx.peerPullPaymentInitiations.delete(pursePub);
await tx.peerPullCredit.delete(pursePub);
await tx.tombstones.put({
id: TombstoneTag.DeletePeerPullCredit + ":" + pursePub,
});
@ -1795,7 +1795,7 @@ export async function deleteTransaction(
case TransactionType.Refund: {
const refundGroupId = parsedTx.refundGroupId;
await ws.db
.mktx((x) => [x.refundGroups, x.tombstones, x.refundItems])
.mktx((x) => [x.refundGroups, x.tombstones])
.runReadWrite(async (tx) => {
const refundRecord = await tx.refundGroups.get(refundGroupId);
if (!refundRecord) {
@ -1809,15 +1809,15 @@ export async function deleteTransaction(
}
case TransactionType.PeerPullDebit: {
const peerPullPaymentIncomingId = parsedTx.peerPullPaymentIncomingId;
const peerPullDebitId = parsedTx.peerPullDebitId;
await ws.db
.mktx((x) => [x.peerPullPaymentIncoming, x.tombstones])
.mktx((x) => [x.peerPullDebit, x.tombstones])
.runReadWrite(async (tx) => {
const debit = await tx.peerPullPaymentIncoming.get(
peerPullPaymentIncomingId,
const debit = await tx.peerPullDebit.get(
peerPullDebitId,
);
if (debit) {
await tx.peerPullPaymentIncoming.delete(peerPullPaymentIncomingId);
await tx.peerPullDebit.delete(peerPullDebitId);
await tx.tombstones.put({ id: transactionId });
}
});
@ -1828,11 +1828,11 @@ export async function deleteTransaction(
case TransactionType.PeerPushDebit: {
const pursePub = parsedTx.pursePub;
await ws.db
.mktx((x) => [x.peerPushPaymentInitiations, x.tombstones])
.mktx((x) => [x.peerPushDebit, x.tombstones])
.runReadWrite(async (tx) => {
const debit = await tx.peerPushPaymentInitiations.get(pursePub);
const debit = await tx.peerPushDebit.get(pursePub);
if (debit) {
await tx.peerPushPaymentInitiations.delete(pursePub);
await tx.peerPushDebit.delete(pursePub);
await tx.tombstones.put({ id: transactionId });
}
});
@ -1875,10 +1875,10 @@ export async function abortTransaction(
await abortPeerPullCreditTransaction(ws, txId.pursePub);
break;
case TransactionType.PeerPullDebit:
await abortPeerPullDebitTransaction(ws, txId.peerPullPaymentIncomingId);
await abortPeerPullDebitTransaction(ws, txId.peerPullDebitId);
break;
case TransactionType.PeerPushCredit:
await abortPeerPushCreditTransaction(ws, txId.peerPushPaymentIncomingId);
await abortPeerPushCreditTransaction(ws, txId.peerPushCreditId);
break;
case TransactionType.PeerPushDebit:
await abortPeerPushDebitTransaction(ws, txId.pursePub);

View File

@ -315,7 +315,7 @@ export async function abortWithdrawalTransaction(
case WithdrawalGroupStatus.AbortingBank:
// No transition needed, but not an error
break;
case WithdrawalGroupStatus.Finished:
case WithdrawalGroupStatus.Done:
case WithdrawalGroupStatus.FailedBankAborted:
case WithdrawalGroupStatus.AbortedExchange:
case WithdrawalGroupStatus.AbortedBank:
@ -395,7 +395,7 @@ export function computeWithdrawalTransactionStatus(
return {
major: TransactionMajorState.Aborted,
};
case WithdrawalGroupStatus.Finished:
case WithdrawalGroupStatus.Done:
return {
major: TransactionMajorState.Done,
};
@ -499,7 +499,7 @@ export function computeWithdrawalTransactionActions(
switch (wgRecord.status) {
case WithdrawalGroupStatus.FailedBankAborted:
return [TransactionAction.Delete];
case WithdrawalGroupStatus.Finished:
case WithdrawalGroupStatus.Done:
return [TransactionAction.Delete];
case WithdrawalGroupStatus.PendingRegisteringBank:
return [TransactionAction.Suspend, TransactionAction.Abort];
@ -1457,7 +1457,7 @@ async function processWithdrawalGroupPendingReady(
return undefined;
}
const txStatusOld = computeWithdrawalTransactionStatus(wg);
wg.status = WithdrawalGroupStatus.Finished;
wg.status = WithdrawalGroupStatus.Done;
wg.timestampFinish = TalerPreciseTimestamp.now();
const txStatusNew = computeWithdrawalTransactionStatus(wg);
await tx.withdrawalGroups.put(wg);
@ -1555,7 +1555,7 @@ async function processWithdrawalGroupPendingReady(
logger.info(`now withdrawn ${numFinished} of ${numTotalCoins} coins`);
if (wg.timestampFinish === undefined && numFinished === numTotalCoins) {
wg.timestampFinish = TalerPreciseTimestamp.now();
wg.status = WithdrawalGroupStatus.Finished;
wg.status = WithdrawalGroupStatus.Done;
await makeCoinsVisible(ws, tx, transactionId);
}
@ -1647,7 +1647,7 @@ export async function processWithdrawalGroup(
}
break;
}
case WithdrawalGroupStatus.Finished:
case WithdrawalGroupStatus.Done:
case WithdrawalGroupStatus.FailedBankAborted: {
// FIXME
return TaskRunResult.pending();

View File

@ -99,14 +99,14 @@ export interface PendingPeerPullInitiationTask {
*/
export interface PendingPeerPullDebitTask {
type: PendingTaskType.PeerPullDebit;
peerPullPaymentIncomingId: string;
peerPullDebitId: string;
}
/**
*/
export interface PendingPeerPushCreditTask {
type: PendingTaskType.PeerPushCredit;
peerPushPaymentIncomingId: string;
peerPushCreditId: string;
}
/**

View File

@ -1002,7 +1002,7 @@ export async function selectPeerCoins(
x.coinAvailability,
x.denominations,
x.refreshGroups,
x.peerPushPaymentInitiations,
x.peerPushDebit,
])
.runReadWrite(async (tx) => {
const exchanges = await tx.exchanges.iter().toArray();

View File

@ -35,7 +35,7 @@ import {
IDBKeyPath,
IDBKeyRange,
} from "@gnu-taler/idb-bridge";
import { Logger, j2s } from "@gnu-taler/taler-util";
import { Codec, Logger, j2s } from "@gnu-taler/taler-util";
const logger = new Logger("query.ts");
@ -387,11 +387,11 @@ export interface StoreReadWriteAccessor<RecordType, IndexMap> {
export interface StoreWithIndexes<
StoreName extends string,
SD extends StoreDescriptor<unknown>,
RecordType,
IndexMap,
> {
storeName: StoreName;
store: SD;
store: StoreDescriptor<RecordType>;
indexMap: IndexMap;
/**
@ -401,19 +401,13 @@ export interface StoreWithIndexes<
mark: Symbol;
}
export type GetRecordType<T> = T extends StoreDescriptor<infer X> ? X : unknown;
const storeWithIndexesSymbol = Symbol("StoreWithIndexesMark");
export function describeStore<
StoreName extends string,
SD extends StoreDescriptor<unknown>,
IndexMap,
>(
export function describeStore<StoreName extends string, RecordType, IndexMap>(
name: StoreName,
s: SD,
s: StoreDescriptor<RecordType>,
m: IndexMap,
): StoreWithIndexes<StoreName, SD, IndexMap> {
): StoreWithIndexes<StoreName, RecordType, IndexMap> {
return {
storeName: name,
store: s,
@ -422,13 +416,72 @@ export function describeStore<
};
}
export function describeStoreV2<
StoreName extends string,
RecordType,
IndexMap extends { [x: string]: IndexDescriptor } = {},
>(args: {
storeName: StoreName;
recordCodec: Codec<RecordType>;
keyPath?: IDBKeyPath | IDBKeyPath[];
autoIncrement?: boolean;
/**
* Database version that this store was added in, or
* undefined if added in the first version.
*/
versionAdded?: number;
indexes?: IndexMap;
}): StoreWithIndexes<StoreName, RecordType, IndexMap> {
return {
storeName: args.storeName,
store: {
_dummy: undefined as any,
autoIncrement: args.autoIncrement,
keyPath: args.keyPath,
versionAdded: args.versionAdded,
},
indexMap: args.indexes ?? ({} as IndexMap),
mark: storeWithIndexesSymbol,
};
}
type KeyPathComponents = string | number;
/**
* Follow a key path (dot-separated) in an object.
*/
type DerefKeyPath<T, P> = P extends `${infer PX extends keyof T &
KeyPathComponents}`
? T[PX]
: P extends `${infer P0 extends keyof T & KeyPathComponents}.${infer Rest}`
? DerefKeyPath<T[P0], Rest>
: unknown;
/**
* Return a path if it is a valid dot-separate path to an object.
* Otherwise, return "never".
*/
type ValidateKeyPath<T, P> = P extends `${infer PX extends keyof T &
KeyPathComponents}`
? PX
: P extends `${infer P0 extends keyof T & KeyPathComponents}.${infer Rest}`
? `${P0}.${ValidateKeyPath<T[P0], Rest>}`
: never;
// function foo<T, P>(
// x: T,
// p: P extends ValidateKeyPath<T, P> ? P : never,
// ): void {}
// foo({x: [0,1,2]}, "x.0");
export type GetReadOnlyAccess<BoundStores> = {
[P in keyof BoundStores]: BoundStores[P] extends StoreWithIndexes<
infer SN,
infer SD,
infer IM
infer StoreName,
infer RecordType,
infer IndexMap
>
? StoreReadOnlyAccessor<GetRecordType<SD>, IM>
? StoreReadOnlyAccessor<RecordType, IndexMap>
: unknown;
};
@ -446,11 +499,11 @@ export type DbReadOnlyTransaction<
}
? {
[P in Stores]: StoreMap[P] extends StoreWithIndexes<
infer SN,
infer SD,
infer IM
infer StoreName,
infer RecordType,
infer IndexMap
>
? StoreReadOnlyAccessor<GetRecordType<SD>, IM>
? StoreReadOnlyAccessor<RecordType, IndexMap>
: unknown;
}
: unknown;
@ -463,22 +516,22 @@ export type DbReadWriteTransaction<
}
? {
[P in Stores]: StoreMap[P] extends StoreWithIndexes<
infer SN,
infer SD,
infer IM
infer StoreName,
infer RecordType,
infer IndexMap
>
? StoreReadWriteAccessor<GetRecordType<SD>, IM>
? StoreReadWriteAccessor<RecordType, IndexMap>
: unknown;
}
: unknown;
export type GetReadWriteAccess<BoundStores> = {
[P in keyof BoundStores]: BoundStores[P] extends StoreWithIndexes<
infer SN,
infer SD,
infer IM
infer StoreName,
infer RecordType,
infer IndexMap
>
? StoreReadWriteAccessor<GetRecordType<SD>, IM>
? StoreReadWriteAccessor<RecordType, IndexMap>
: unknown;
};

View File

@ -354,9 +354,9 @@ async function callOperationHandler(
case PendingTaskType.PeerPullCredit:
return await processPeerPullCredit(ws, pending.pursePub);
case PendingTaskType.PeerPullDebit:
return await processPeerPullDebit(ws, pending.peerPullPaymentIncomingId);
return await processPeerPullDebit(ws, pending.peerPullDebitId);
case PendingTaskType.PeerPushCredit:
return await processPeerPushCredit(ws, pending.peerPushPaymentIncomingId);
return await processPeerPushCredit(ws, pending.peerPushCreditId);
default:
return assertUnreachable(pending);
}
@ -1876,7 +1876,7 @@ class InternalWalletStateImpl implements InternalWalletState {
return computeRefundTransactionState(rec);
}
case TransactionType.PeerPullCredit:
const rec = await tx.peerPullPaymentInitiations.get(
const rec = await tx.peerPullCredit.get(
parsedTxId.pursePub,
);
if (!rec) {
@ -1884,8 +1884,8 @@ class InternalWalletStateImpl implements InternalWalletState {
}
return computePeerPullCreditTransactionState(rec);
case TransactionType.PeerPullDebit: {
const rec = await tx.peerPullPaymentIncoming.get(
parsedTxId.peerPullPaymentIncomingId,
const rec = await tx.peerPullDebit.get(
parsedTxId.peerPullDebitId,
);
if (!rec) {
return undefined;
@ -1893,8 +1893,8 @@ class InternalWalletStateImpl implements InternalWalletState {
return computePeerPullDebitTransactionState(rec);
}
case TransactionType.PeerPushCredit: {
const rec = await tx.peerPushPaymentIncoming.get(
parsedTxId.peerPushPaymentIncomingId,
const rec = await tx.peerPushCredit.get(
parsedTxId.peerPushCreditId,
);
if (!rec) {
return undefined;
@ -1902,7 +1902,7 @@ class InternalWalletStateImpl implements InternalWalletState {
return computePeerPushCreditTransactionState(rec);
}
case TransactionType.PeerPushDebit: {
const rec = await tx.peerPushPaymentInitiations.get(
const rec = await tx.peerPushDebit.get(
parsedTxId.pursePub,
);
if (!rec) {

View File

@ -78,7 +78,7 @@ export function useComponentState({
const {
contractTerms,
peerPullPaymentIncomingId,
peerPullDebitId,
amountEffective,
amountRaw,
} = hook.response.p2p;
@ -155,7 +155,7 @@ export function useComponentState({
const resp = await api.wallet.call(
WalletApiOperation.ConfirmPeerPullDebit,
{
peerPullPaymentIncomingId,
peerPullDebitId,
},
);
onSuccess(resp.transactionId);

View File

@ -58,7 +58,7 @@ export function useComponentState({
const {
contractTerms,
peerPushPaymentIncomingId,
peerPushCreditId,
amountEffective,
amountRaw,
} = hook.response;
@ -72,7 +72,7 @@ export function useComponentState({
const resp = await api.wallet.call(
WalletApiOperation.ConfirmPeerPushCredit,
{
peerPushPaymentIncomingId,
peerPushCreditId,
},
);
onSuccess(resp.transactionId);