Skip to content

Commit a5ec1ca

Browse files
authored
feat: add 'settlementDisplayFee' selection to graphql Transaction object (#2411)
* feat: add 'settlementDisplayFee' to WalletTransaction type * feat: add 'settlementDisplayFee' to Transaction gql object * test: remove displayAmount calc to resolve some flakiness
1 parent 84603b0 commit a5ec1ca

File tree

13 files changed

+81
-17
lines changed

13 files changed

+81
-17
lines changed

src/domain/wallets/index.types.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ type BaseWalletTransaction = {
5353
readonly settlementFee: Satoshis | UsdCents
5454
readonly settlementCurrency: WalletCurrency
5555
readonly settlementDisplayAmount: DisplayCurrencyMajorAmount
56+
readonly settlementDisplayFee: DisplayCurrencyMajorAmount
5657
readonly settlementDisplayCurrency: DisplayCurrency | ""
5758
readonly displayCurrencyPerSettlementCurrencyUnit: number
5859
readonly status: TxStatus

src/domain/wallets/settlement-amounts.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ export const SettlementAmounts = () => {
88
): {
99
settlementAmount: Satoshis | UsdCents
1010
settlementDisplayAmount: DisplayCurrencyMajorAmount
11+
settlementDisplayFee: DisplayCurrencyMajorAmount
1112
} => {
1213
// ======
1314
// Calculate: settlementAmount
@@ -102,6 +103,10 @@ export const SettlementAmounts = () => {
102103
amount: settlementDisplayAmountAsNumber,
103104
displayMajorExponent: MajorExponent.STANDARD,
104105
}),
106+
settlementDisplayFee: minorToMajorUnit({
107+
amount: displayFee,
108+
displayMajorExponent: MajorExponent.STANDARD,
109+
}),
105110
}
106111
}
107112

src/domain/wallets/tx-history.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,13 +42,19 @@ const filterPendingIncoming = ({
4242
displayMajorExponent: MajorExponent.STANDARD,
4343
})
4444

45+
const settlementDisplayFee = minorToMajorUnit({
46+
amount: Math.round(priceForMinorUnit * fee),
47+
displayMajorExponent: MajorExponent.STANDARD,
48+
})
49+
4550
walletTransactions.push({
4651
id: rawTx.txHash,
4752
walletId,
4853
settlementAmount,
4954
settlementFee: fee,
5055
settlementCurrency: walletDetailsByWalletId[walletId].currency,
5156
settlementDisplayAmount,
57+
settlementDisplayFee,
5258
settlementDisplayCurrency: displayCurrencyPerSat.currency,
5359
displayCurrencyPerSettlementCurrencyUnit: displayCurrencyPerSat.price,
5460
status: TxStatus.Pending,
@@ -99,7 +105,8 @@ const translateLedgerTxnToWalletTxn = <S extends WalletCurrency>({
99105
type as AdminLedgerTransactionType,
100106
)
101107

102-
const { settlementAmount, settlementDisplayAmount } = SettlementAmounts().fromTxn(txn)
108+
const { settlementAmount, settlementDisplayAmount, settlementDisplayFee } =
109+
SettlementAmounts().fromTxn(txn)
103110

104111
let satsAmount = satsAmountRaw || 0
105112
let centsAmount = centsAmountRaw || 0
@@ -136,6 +143,7 @@ const translateLedgerTxnToWalletTxn = <S extends WalletCurrency>({
136143
settlementFee: currency === WalletCurrency.Btc ? toSats(satsFee) : toCents(centsFee),
137144
settlementCurrency: txn.currency,
138145
settlementDisplayAmount,
146+
settlementDisplayFee,
139147
settlementDisplayCurrency: displayCurrency || "",
140148
displayCurrencyPerSettlementCurrencyUnit: displayCurrencyPerBaseUnitFromAmounts({
141149
displayAmount,

src/graphql/admin/schema.graphql

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -431,6 +431,7 @@ type Transaction {
431431
settlementCurrency: WalletCurrency!
432432
settlementDisplayAmount: SignedDisplayMajorAmount!
433433
settlementDisplayCurrency: DisplayCurrency!
434+
settlementDisplayFee: SignedDisplayMajorAmount!
434435
settlementFee: SignedAmount!
435436

436437
"""

src/graphql/main/schema.graphql

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1168,6 +1168,7 @@ type Transaction {
11681168
settlementCurrency: WalletCurrency!
11691169
settlementDisplayAmount: SignedDisplayMajorAmount!
11701170
settlementDisplayCurrency: DisplayCurrency!
1171+
settlementDisplayFee: SignedDisplayMajorAmount!
11711172
settlementFee: SignedAmount!
11721173

11731174
"""

src/graphql/types/object/transaction.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,10 @@ const Transaction = GT.Object<WalletTransaction>({
105105
type: GT.NonNull(SignedDisplayMajorAmount),
106106
resolve: (source) => `${source.settlementDisplayAmount}`,
107107
},
108+
settlementDisplayFee: {
109+
type: GT.NonNull(SignedDisplayMajorAmount),
110+
resolve: (source) => `${source.settlementDisplayFee}`,
111+
},
108112
settlementDisplayCurrency: {
109113
type: GT.NonNull(DisplayCurrency),
110114
},

test/e2e/servers/graphql-main-server/queries/main.gql

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ fragment TransactionList on TransactionConnection {
7373
settlementAmount
7474
settlementFee
7575
settlementDisplayAmount
76+
settlementDisplayFee
7677
settlementDisplayCurrency
7778
settlementCurrency
7879
settlementPrice {

test/e2e/servers/graphql-main-server/queries/transactions-by-wallet-ids.gql

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ fragment TransactionList on TransactionConnection {
2626
settlementFee
2727
settlementCurrency
2828
settlementDisplayAmount
29+
settlementDisplayFee
2930
settlementDisplayCurrency
3031
settlementPrice {
3132
base

test/e2e/servers/graphql-main-server/with-auth-requests.spec.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,7 @@ describe("graphql", () => {
197197
settlementAmount: expect.any(Number),
198198
settlementFee: expect.any(Number),
199199
settlementDisplayAmount: expect.any(String),
200+
settlementDisplayFee: expect.any(String),
200201
settlementDisplayCurrency: DisplayCurrency.Usd,
201202
createdAt: expect.any(Number),
202203
}),
@@ -260,6 +261,7 @@ describe("graphql", () => {
260261
settlementAmount: 4_000,
261262
settlementCurrency: WalletCurrency.Usd,
262263
settlementDisplayAmount: "40.00",
264+
settlementDisplayFee: "0.00",
263265
settlementDisplayCurrency: DisplayCurrency.Usd,
264266
}),
265267
}),
@@ -268,6 +270,7 @@ describe("graphql", () => {
268270
settlementAmount: 50_000,
269271
settlementCurrency: WalletCurrency.Btc,
270272
settlementDisplayAmount: expect.any(String),
273+
settlementDisplayFee: expect.any(String),
271274
settlementDisplayCurrency: DisplayCurrency.Usd,
272275
}),
273276
}),

test/integration/02-user-wallet/02-receive-onchain.spec.ts

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import {
1212
} from "@config"
1313

1414
import { sat2btc, toSats } from "@domain/bitcoin"
15-
import { DisplayCurrency, toCents } from "@domain/fiat"
15+
import { DisplayCurrency, MajorExponent, toCents } from "@domain/fiat"
1616
import { LedgerTransactionType } from "@domain/ledger"
1717
import { NotificationType } from "@domain/notifications"
1818
import { WalletPriceRatio } from "@domain/payments"
@@ -412,7 +412,12 @@ describe("UserWallet - On chain", () => {
412412
expect(pendingTx.settlementDisplayAmount).toBe(
413413
(
414414
pendingTx.settlementAmount * pendingTx.displayCurrencyPerSettlementCurrencyUnit
415-
).toFixed(2),
415+
).toFixed(MajorExponent.STANDARD),
416+
)
417+
expect(pendingTx.settlementDisplayFee).toBe(
418+
(
419+
pendingTx.settlementFee * pendingTx.displayCurrencyPerSettlementCurrencyUnit
420+
).toFixed(MajorExponent.STANDARD),
416421
)
417422

418423
// Check pendingTx from cache
@@ -428,16 +433,14 @@ describe("UserWallet - On chain", () => {
428433

429434
await sleep(1000)
430435

431-
const satsPrice = await Prices.getCurrentSatPrice({ currency: DisplayCurrency.Usd })
432-
if (satsPrice instanceof Error) throw satsPrice
433-
434436
const paymentAmount = {
435437
amount: BigInt(pendingTx.settlementAmount),
436438
currency: WalletCurrency.Btc,
437439
}
440+
438441
const displayPaymentAmount = {
439-
amount: pendingTx.settlementAmount * satsPrice.price,
440-
currency: satsPrice.currency,
442+
amount: Number(pendingTx.settlementDisplayAmount),
443+
currency: pendingTx.settlementDisplayCurrency as DisplayCurrency,
441444
}
442445

443446
const pendingNotification = createPushNotificationContent({

test/integration/02-user-wallet/02-send-onchain.spec.ts

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,14 @@ import {
3434

3535
import { LedgerTransactionType } from "@domain/ledger"
3636

37-
import { add, DisplayCurrency, sub, toCents, usdMinorToMajorUnit } from "@domain/fiat"
37+
import {
38+
add,
39+
DisplayCurrency,
40+
MajorExponent,
41+
sub,
42+
toCents,
43+
usdMinorToMajorUnit,
44+
} from "@domain/fiat"
3845

3946
import { createPushNotificationContent } from "@services/notifications/create-push-notification-content"
4047
import { WalletsRepository } from "@services/mongoose"
@@ -242,8 +249,10 @@ const testExternalSend = async ({
242249
pendingTx.id as LedgerTransactionId,
243250
)
244251
if (pendingLedgerTx instanceof Error) throw pendingLedgerTx
245-
const { settlementDisplayAmount } = SettlementAmounts().fromTxn(pendingLedgerTx)
252+
const { settlementDisplayAmount, settlementDisplayFee } =
253+
SettlementAmounts().fromTxn(pendingLedgerTx)
246254
expect(pendingTx.settlementDisplayAmount).toBe(settlementDisplayAmount)
255+
expect(pendingTx.settlementDisplayFee).toBe(settlementDisplayFee)
247256

248257
if (sendAll) {
249258
expect(pendingTx.settlementAmount).toBe(-initialWalletBalance)
@@ -304,8 +313,10 @@ const testExternalSend = async ({
304313
settledTx.id as LedgerTransactionId,
305314
)
306315
if (settledLedgerTx instanceof Error) throw settledLedgerTx
307-
const { settlementDisplayAmount } = SettlementAmounts().fromTxn(settledLedgerTx)
316+
const { settlementDisplayAmount, settlementDisplayFee } =
317+
SettlementAmounts().fromTxn(settledLedgerTx)
308318
expect(settledTx.settlementDisplayAmount).toBe(settlementDisplayAmount)
319+
expect(settledTx.settlementDisplayFee).toBe(settlementDisplayFee)
309320

310321
const finalBalance = await getBalanceHelper(senderWalletId)
311322

@@ -560,8 +571,10 @@ const testInternalSend = async ({
560571
senderSettledTx.id as LedgerTransactionId,
561572
)
562573
if (senderSettledLedgerTx instanceof Error) throw senderSettledLedgerTx
563-
const { settlementDisplayAmount } = SettlementAmounts().fromTxn(senderSettledLedgerTx)
574+
const { settlementDisplayAmount, settlementDisplayFee } =
575+
SettlementAmounts().fromTxn(senderSettledLedgerTx)
564576
expect(senderSettledTx.settlementDisplayAmount).toBe(settlementDisplayAmount)
577+
expect(senderSettledTx.settlementDisplayFee).toBe(settlementDisplayFee)
565578

566579
// Check txn details for received wallet
567580
// ===
@@ -592,7 +605,13 @@ const testInternalSend = async ({
592605
(
593606
recipientSettledTx.settlementAmount *
594607
recipientSettledTx.displayCurrencyPerSettlementCurrencyUnit
595-
).toFixed(2),
608+
).toFixed(MajorExponent.STANDARD),
609+
)
610+
expect(recipientSettledTx.settlementDisplayFee).toBe(
611+
(
612+
recipientSettledTx.settlementFee *
613+
recipientSettledTx.displayCurrencyPerSettlementCurrencyUnit
614+
).toFixed(MajorExponent.STANDARD),
596615
)
597616

598617
// Check memos

test/unit/domain/wallets/settlement-amounts.spec.ts

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,11 @@ describe("SettlementAmounts", () => {
3636
displayCurrency,
3737
}
3838

39+
const expectedDisplayFee = minorToMajorUnit({
40+
amount: displayFee,
41+
displayMajorExponent: MajorExponent.STANDARD,
42+
})
43+
3944
const debitCreditScenarios = {
4045
"amount": {
4146
sats: satsAmount,
@@ -81,14 +86,16 @@ describe("SettlementAmounts", () => {
8186
debit: toSats(debit),
8287
}
8388
const settlementAmounts = SettlementAmounts().fromTxn(txnDebit)
84-
const { settlementAmount, settlementDisplayAmount } = settlementAmounts
89+
const { settlementAmount, settlementDisplayAmount, settlementDisplayFee } =
90+
settlementAmounts
8591

8692
const expectedDisplayAmountForDebit = minorToMajorUnit({
8793
amount: expectedDisplayAmount,
8894
displayMajorExponent: MajorExponent.STANDARD,
8995
})
9096
expect(settlementAmount).toEqual(expectedSettlementAmountForDebit)
9197
expect(settlementDisplayAmount).toEqual(expectedDisplayAmountForDebit)
98+
expect(settlementDisplayFee).toEqual(expectedDisplayFee)
9299
})
93100
}
94101
})
@@ -108,14 +115,16 @@ describe("SettlementAmounts", () => {
108115
debit: toSats(0),
109116
}
110117
const settlementAmounts = SettlementAmounts().fromTxn(txnCredit)
111-
const { settlementAmount, settlementDisplayAmount } = settlementAmounts
118+
const { settlementAmount, settlementDisplayAmount, settlementDisplayFee } =
119+
settlementAmounts
112120

113121
const expectedDisplayAmountForCredit = minorToMajorUnit({
114122
amount: expectedDisplayAmount,
115123
displayMajorExponent: MajorExponent.STANDARD,
116124
})
117125
expect(settlementAmount).toEqual(expectedSettlementAmountForCredit)
118126
expect(settlementDisplayAmount).toEqual(expectedDisplayAmountForCredit)
127+
expect(settlementDisplayFee).toEqual(expectedDisplayFee)
119128
})
120129
}
121130
})
@@ -143,14 +152,16 @@ describe("SettlementAmounts", () => {
143152
debit: toCents(debit),
144153
}
145154
const settlementAmounts = SettlementAmounts().fromTxn(txnDebit)
146-
const { settlementAmount, settlementDisplayAmount } = settlementAmounts
155+
const { settlementAmount, settlementDisplayAmount, settlementDisplayFee } =
156+
settlementAmounts
147157

148158
const expectedDisplayAmountForDebit = minorToMajorUnit({
149159
amount: expectedDisplayAmount,
150160
displayMajorExponent: MajorExponent.STANDARD,
151161
})
152162
expect(settlementAmount).toEqual(expectedSettlementAmountForDebit)
153163
expect(settlementDisplayAmount).toEqual(expectedDisplayAmountForDebit)
164+
expect(settlementDisplayFee).toEqual(expectedDisplayFee)
154165
})
155166
}
156167
})
@@ -170,14 +181,16 @@ describe("SettlementAmounts", () => {
170181
debit: toCents(0),
171182
}
172183
const settlementAmounts = SettlementAmounts().fromTxn(txnCredit)
173-
const { settlementAmount, settlementDisplayAmount } = settlementAmounts
184+
const { settlementAmount, settlementDisplayAmount, settlementDisplayFee } =
185+
settlementAmounts
174186

175187
const expectedDisplayAmountForCredit = minorToMajorUnit({
176188
amount: expectedDisplayAmount,
177189
displayMajorExponent: MajorExponent.STANDARD,
178190
})
179191
expect(settlementAmount).toEqual(expectedSettlementAmountForCredit)
180192
expect(settlementDisplayAmount).toEqual(expectedDisplayAmountForCredit)
193+
expect(settlementDisplayFee).toEqual(expectedDisplayFee)
181194
})
182195
}
183196
})

test/unit/domain/wallets/tx-history.spec.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,7 @@ describe("translates ledger txs to wallet txs", () => {
138138
settlementAmount,
139139
settlementFee,
140140
settlementDisplayAmount: (centsAmount / 100).toFixed(2),
141+
settlementDisplayFee: (centsFee / 100).toFixed(2),
141142
settlementDisplayCurrency: DisplayCurrency.Usd,
142143
displayCurrencyPerSettlementCurrencyUnit,
143144
}
@@ -419,6 +420,7 @@ describe("ConfirmedTransactionHistory.addPendingIncoming", () => {
419420
settlementAmount: toSats(25000),
420421
settlementFee: toSats(0),
421422
settlementDisplayAmount: (25000 / 100).toFixed(2),
423+
settlementDisplayFee: (0).toFixed(2),
422424
settlementDisplayCurrency: DisplayCurrency.Usd,
423425
settlementCurrency: WalletCurrency.Btc,
424426
displayCurrencyPerSettlementCurrencyUnit: 0.01,
@@ -439,6 +441,7 @@ describe("ConfirmedTransactionHistory.addPendingIncoming", () => {
439441
settlementAmount: toSats(50000),
440442
settlementCurrency: WalletCurrency.Btc,
441443
settlementDisplayAmount: (50000 / 100).toFixed(2),
444+
settlementDisplayFee: (0).toFixed(2),
442445
settlementDisplayCurrency: DisplayCurrency.Usd,
443446
memo: null,
444447
settlementFee: toSats(0),
@@ -508,6 +511,7 @@ describe("ConfirmedTransactionHistory.addPendingIncoming", () => {
508511
settlementFee: toSats(0),
509512
settlementCurrency: WalletCurrency.Btc,
510513
settlementDisplayAmount: "NaN",
514+
settlementDisplayFee: "NaN",
511515
settlementDisplayCurrency: DisplayCurrency.Usd,
512516
displayCurrencyPerSettlementCurrencyUnit: NaN,
513517
status: TxStatus.Pending,

0 commit comments

Comments
 (0)