Skip to content

Commit 9fb920a

Browse files
authored
Merge pull request #1937 from MixinNetwork/feature/invoice
Show memo in invoice preview
2 parents d7ece21 + c6044fa commit 9fb920a

File tree

8 files changed

+82
-43
lines changed

8 files changed

+82
-43
lines changed

Mixin.xcodeproj/project.pbxproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1413,6 +1413,7 @@
14131413
94E34123261D829200E2F9D3 /* code.css in Resources */ = {isa = PBXBuildFile; fileRef = 94E34120261D829200E2F9D3 /* code.css */; };
14141414
94E34124261D829200E2F9D3 /* highlight.js in Resources */ = {isa = PBXBuildFile; fileRef = 94E34121261D829200E2F9D3 /* highlight.js */; };
14151415
94E35CA3298B836300ADB40D /* WalletConnectService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94E35CA2298B836300ADB40D /* WalletConnectService.swift */; };
1416+
94E41A8B2ED60B1C0019704A /* TransferExtra.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94E41A8A2ED60B190019704A /* TransferExtra.swift */; };
14161417
94E531BE2D7F5D750008DC76 /* MixinTransactionHistoryTokenFilterPickerViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94E531BD2D7F5D750008DC76 /* MixinTransactionHistoryTokenFilterPickerViewController.swift */; };
14171418
94E531CF2D7F62410008DC76 /* Web3TransactionHistoryTokenFilterPickerViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94E531CE2D7F62410008DC76 /* Web3TransactionHistoryTokenFilterPickerViewController.swift */; };
14181419
94E533D22D82B52E0008DC76 /* SnapshotTableHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94E533D12D82B5280008DC76 /* SnapshotTableHeaderView.swift */; };
@@ -3192,6 +3193,7 @@
31923193
94E34120261D829200E2F9D3 /* code.css */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.css; path = code.css; sourceTree = "<group>"; };
31933194
94E34121261D829200E2F9D3 /* highlight.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = highlight.js; sourceTree = "<group>"; };
31943195
94E35CA2298B836300ADB40D /* WalletConnectService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WalletConnectService.swift; sourceTree = "<group>"; };
3196+
94E41A8A2ED60B190019704A /* TransferExtra.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TransferExtra.swift; sourceTree = "<group>"; };
31953197
94E531BD2D7F5D750008DC76 /* MixinTransactionHistoryTokenFilterPickerViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MixinTransactionHistoryTokenFilterPickerViewController.swift; sourceTree = "<group>"; };
31963198
94E531CE2D7F62410008DC76 /* Web3TransactionHistoryTokenFilterPickerViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Web3TransactionHistoryTokenFilterPickerViewController.swift; sourceTree = "<group>"; };
31973199
94E533D12D82B5280008DC76 /* SnapshotTableHeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SnapshotTableHeaderView.swift; sourceTree = "<group>"; };
@@ -5050,6 +5052,7 @@
50505052
94F35A5F2D255B5F001BCAE7 /* Invoice.swift */,
50515053
94C5A8922B2157CE00201CDA /* Payment.swift */,
50525054
94C6987A2B23257B002377EA /* PaymentPrecondition.swift */,
5055+
94E41A8A2ED60B190019704A /* TransferExtra.swift */,
50535056
94A40C462B2781AF0028BC02 /* TransferPaymentOperation.swift */,
50545057
945ED2B12B28342A00C138BF /* WithdrawPaymentOperation.swift */,
50555058
947084B32D93F88F007DF965 /* InvoicePaymentOperation.swift */,
@@ -8348,6 +8351,7 @@
83488351
94735E732E28FED90001C179 /* PrivateKeyViewController.swift in Sources */,
83498352
94F2F9812DEF50590013B820 /* CancelPendingMembershipOrderViewController.swift in Sources */,
83508353
7B4E307A22966FF900A03F6E /* MediaPreviewMaskView.swift in Sources */,
8354+
94E41A8B2ED60B1C0019704A /* TransferExtra.swift in Sources */,
83518355
94FE11F72DA7AC830026AB9A /* Web3TransactionCell.swift in Sources */,
83528356
9462A6CB2E2790F3001E4C3E /* ExportImportedSecretValidationViewController.swift in Sources */,
83538357
94C0D7E929AD348500E372FC /* InPlaceKeyStorage.swift in Sources */,

Mixin/UserInterface/Controllers/Wallet/Payment/AtomicInvoicePaymentOperation.swift

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,10 +104,16 @@ final class AtomicInvoicePaymentOperation: InvoicePaymentOperation {
104104

105105
let destination: Payment.TransferDestination
106106
let transactions: [Transaction]
107+
let memo: TransferExtra?
107108

108-
init(destination: Payment.TransferDestination, transactions: [Transaction]) {
109+
init(
110+
destination: Payment.TransferDestination,
111+
transactions: [Transaction],
112+
memo: TransferExtra?,
113+
) {
109114
self.destination = destination
110115
self.transactions = transactions
116+
self.memo = memo
111117
}
112118

113119
func start(pin: String) async throws {

Mixin/UserInterface/Controllers/Wallet/Payment/Invoice.swift

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -424,6 +424,18 @@ extension Invoice: PaymentPreconditionChecker {
424424
onFailure(reason)
425425
}
426426
case .passed(let issues):
427+
let memo: TransferExtra? = {
428+
guard let entry = entries.first else {
429+
return nil
430+
}
431+
return if entry.isStorage {
432+
.hexEncoded(entry.extra.hexEncodedString())
433+
} else if let extra = String(data: entry.extra, encoding: .utf8) {
434+
.plain(extra)
435+
} else {
436+
nil
437+
}
438+
}()
427439
if sendingSameTokenMultipleTimes {
428440
var transactions: [NonAtomicInvoicePaymentOperation.Transaction] = []
429441
for entry in entries {
@@ -439,7 +451,8 @@ extension Invoice: PaymentPreconditionChecker {
439451
let operation = NonAtomicInvoicePaymentOperation(
440452
destination: destination,
441453
transactions: transactions,
442-
paidEntriesHash: paidEntriesHash
454+
paidEntriesHash: paidEntriesHash,
455+
memo: memo,
443456
)
444457
await MainActor.run {
445458
onSuccess(operation, issues)
@@ -470,7 +483,11 @@ extension Invoice: PaymentPreconditionChecker {
470483
return
471484
}
472485
}
473-
let operation = AtomicInvoicePaymentOperation(destination: destination, transactions: transactions)
486+
let operation = AtomicInvoicePaymentOperation(
487+
destination: destination,
488+
transactions: transactions,
489+
memo: memo,
490+
)
474491
await MainActor.run {
475492
onSuccess(operation, issues)
476493
}

Mixin/UserInterface/Controllers/Wallet/Payment/InvoicePaymentOperation.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ protocol InvoicePaymentOperation {
1414

1515
var destination: Payment.TransferDestination { get }
1616
var transactions: [Transaction] { get }
17+
var memo: TransferExtra? { get }
1718

1819
func start(pin: String) async throws
1920

Mixin/UserInterface/Controllers/Wallet/Payment/InvoicePreviewViewController.swift

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,13 @@ final class InvoicePreviewViewController: AuthenticationPreviewViewController {
125125
))
126126
}
127127

128+
if let memo = operation.memo,
129+
let value = memo.plainValue ?? memo.hexEncodedValue,
130+
!value.isEmpty
131+
{
132+
rows.append(.info(caption: .memo, content: value))
133+
}
134+
128135
reloadData(with: rows)
129136
reporter.report(event: .sendPreview)
130137
}

Mixin/UserInterface/Controllers/Wallet/Payment/NonAtomicInvoicePaymentOperation.swift

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,20 +29,23 @@ final class NonAtomicInvoicePaymentOperation: InvoicePaymentOperation {
2929
let destination: Payment.TransferDestination
3030
let transactions: [Transaction]
3131
let paidEntriesHash: [String]
32+
let memo: TransferExtra?
3233

3334
init(
3435
destination: Payment.TransferDestination,
3536
transactions: [Transaction],
36-
paidEntriesHash: [String]
37+
paidEntriesHash: [String],
38+
memo: TransferExtra?,
3739
) {
3840
self.destination = destination
3941
self.transactions = transactions
4042
self.paidEntriesHash = paidEntriesHash
43+
self.memo = memo
4144
}
4245

4346
func start(pin: String) async throws {
4447
// In case of decoding failure, do it earlier to avoid partial success
45-
let extras: [TransferPaymentOperation.Extra] = try transactions.map { transaction in
48+
let extras: [TransferExtra] = try transactions.map { transaction in
4649
let entry = transaction.entry
4750
if entry.isStorage {
4851
return .hexEncoded(entry.extra.hexEncodedString())
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import Foundation
2+
3+
enum TransferExtra {
4+
5+
case plain(String)
6+
case hexEncoded(String)
7+
8+
var plainValue: String? {
9+
switch self {
10+
case .plain(let value):
11+
value
12+
case .hexEncoded(let hexEncoded):
13+
if let data = Data(hexEncodedString: hexEncoded),
14+
let value = String(data: data, encoding: .utf8)
15+
{
16+
value
17+
} else {
18+
nil
19+
}
20+
}
21+
}
22+
23+
var hexEncodedValue: String? {
24+
switch self {
25+
case .plain(let plain):
26+
if let data = plain.data(using: .utf8) {
27+
data.hexEncodedString()
28+
} else {
29+
nil
30+
}
31+
case .hexEncoded(let value):
32+
value
33+
}
34+
}
35+
36+
}

Mixin/UserInterface/Controllers/Wallet/Payment/TransferPaymentOperation.swift

Lines changed: 3 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -48,56 +48,21 @@ final class TransferPaymentOperation {
4848

4949
}
5050

51-
enum Extra {
52-
53-
case plain(String)
54-
case hexEncoded(String)
55-
56-
var plainValue: String? {
57-
switch self {
58-
case .plain(let value):
59-
value
60-
case .hexEncoded(let hexEncoded):
61-
if let data = Data(hexEncodedString: hexEncoded),
62-
let value = String(data: data, encoding: .utf8)
63-
{
64-
value
65-
} else {
66-
nil
67-
}
68-
}
69-
}
70-
71-
var hexEncodedValue: String? {
72-
switch self {
73-
case .plain(let plain):
74-
if let data = plain.data(using: .utf8) {
75-
data.hexEncodedString()
76-
} else {
77-
nil
78-
}
79-
case .hexEncoded(let value):
80-
value
81-
}
82-
}
83-
84-
}
85-
8651
let behavior: Behavior
8752
let traceID: String
8853
let spendingOutputs: UTXOService.OutputCollection
8954
let destination: Payment.TransferDestination
9055
let token: MixinTokenItem
9156
let amount: Decimal
92-
let extra: Extra
57+
let extra: TransferExtra
9358
let reference: String?
9459

9560
private(set) var kernelTransactionHash: String?
9661

9762
private init(
9863
behavior: Behavior, traceID: String, spendingOutputs: UTXOService.OutputCollection,
9964
destination: Payment.TransferDestination, token: MixinTokenItem, amount: Decimal,
100-
extra: Extra, reference: String?
65+
extra: TransferExtra, reference: String?
10166
) {
10267
self.behavior = behavior
10368
self.traceID = traceID
@@ -112,7 +77,7 @@ final class TransferPaymentOperation {
11277
static func transfer(
11378
traceID: String, spendingOutputs: UTXOService.OutputCollection,
11479
destination: Payment.TransferDestination, token: MixinTokenItem,
115-
amount: Decimal, extra: Extra, reference: String?
80+
amount: Decimal, extra: TransferExtra, reference: String?
11681
) -> TransferPaymentOperation {
11782
TransferPaymentOperation(
11883
behavior: .transfer,

0 commit comments

Comments
 (0)