wallet-core: address DB FIXMEs, systematic state numbering
This commit is contained in:
parent
33f2798004
commit
c660db82c1
@ -130,7 +130,7 @@ export async function runPeerRepairTest(t: GlobalTestState) {
|
||||
);
|
||||
|
||||
await wallet2.client.call(WalletApiOperation.ConfirmPeerPushCredit, {
|
||||
peerPushPaymentIncomingId: resp2.peerPushPaymentIncomingId,
|
||||
peerPushCreditId: resp2.peerPushCreditId,
|
||||
});
|
||||
|
||||
await peerPushCreditDone1Cond;
|
||||
|
@ -123,7 +123,7 @@ export async function runPeerToPeerPullTest(t: GlobalTestState) {
|
||||
);
|
||||
|
||||
await wallet2.client.call(WalletApiOperation.ConfirmPeerPullDebit, {
|
||||
peerPullPaymentIncomingId: checkResp.peerPullPaymentIncomingId,
|
||||
peerPullDebitId: checkResp.peerPullDebitId,
|
||||
});
|
||||
|
||||
await peerPullCreditDoneCond;
|
||||
|
@ -126,7 +126,7 @@ export async function runPeerToPeerPushTest(t: GlobalTestState) {
|
||||
const acceptResp = await w2.walletClient.call(
|
||||
WalletApiOperation.ConfirmPeerPushCredit,
|
||||
{
|
||||
peerPushPaymentIncomingId: checkResp.peerPushPaymentIncomingId,
|
||||
peerPushCreditId: checkResp.peerPushCreditId,
|
||||
},
|
||||
);
|
||||
|
||||
|
@ -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");
|
||||
|
||||
|
@ -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));
|
||||
|
@ -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.
|
||||
* 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
|
||||
*
|
||||
* All individual enums should make sure that the values they
|
||||
* defined are in the right range.
|
||||
* 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");
|
||||
|
||||
|
@ -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:
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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];
|
||||
|
@ -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];
|
||||
}
|
||||
}
|
||||
|
@ -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];
|
||||
|
@ -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);
|
||||
|
@ -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,
|
||||
};
|
||||
|
@ -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 = {
|
||||
|
@ -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:
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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();
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -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();
|
||||
|
@ -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;
|
||||
};
|
||||
|
||||
|
@ -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) {
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user