Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
signalapp
GitHub Repository: signalapp/Signal-iOS
Path: blob/main/SignalServiceKit/Payments/TSPaymentModels.m
1 views
1
//
2
// Copyright 2021 Signal Messenger, LLC
3
// SPDX-License-Identifier: AGPL-3.0-only
4
//
5
6
#import "TSPaymentModels.h"
7
#import <SignalServiceKit/SignalServiceKit-Swift.h>
8
9
NS_ASSUME_NONNULL_BEGIN
10
11
NSString *NSStringFromTSPaymentCurrency(TSPaymentCurrency value)
12
{
13
switch (value) {
14
case TSPaymentCurrencyUnknown:
15
return @"Unknown";
16
case TSPaymentCurrencyMobileCoin:
17
return @"MobileCoin";
18
}
19
}
20
21
NSString *NSStringFromTSPaymentType(TSPaymentType value)
22
{
23
switch (value) {
24
case TSPaymentTypeIncomingPayment:
25
return @"IncomingPayment";
26
case TSPaymentTypeOutgoingPaymentNotFromLocalDevice:
27
return @"OutgoingPaymentNotFromLocalDevice";
28
case TSPaymentTypeOutgoingPayment:
29
return @"OutgoingPayment";
30
case TSPaymentTypeIncomingUnidentified:
31
return @"IncomingUnidentified";
32
case TSPaymentTypeOutgoingUnidentified:
33
return @"OutgoingUnidentified";
34
case TSPaymentTypeOutgoingTransfer:
35
return @"OutgoingTransfer";
36
case TSPaymentTypeOutgoingDefragmentation:
37
return @"OutgoingDefragmentation";
38
case TSPaymentTypeOutgoingDefragmentationNotFromLocalDevice:
39
return @"OutgoingDefragmentationNotFromLocalDevice";
40
case TSPaymentTypeIncomingRestored:
41
return @"IncomingRestoredPayment";
42
case TSPaymentTypeOutgoingRestored:
43
return @"OutgoingRestoredPayment";
44
default:
45
OWSCFailDebug(@"Unknown value: %d", (int)value);
46
return @"Unknown";
47
}
48
}
49
50
NSString *NSStringFromTSPaymentState(TSPaymentState value)
51
{
52
switch (value) {
53
case TSPaymentStateOutgoingUnsubmitted:
54
return @"OutgoingUnsubmitted";
55
case TSPaymentStateOutgoingUnverified:
56
return @"OutgoingUnverified";
57
case TSPaymentStateOutgoingVerified:
58
return @"OutgoingVerified";
59
case TSPaymentStateOutgoingSending:
60
return @"OutgoingSending";
61
case TSPaymentStateOutgoingSent:
62
return @"OutgoingSent";
63
case TSPaymentStateOutgoingComplete:
64
return @"OutgoingComplete";
65
case TSPaymentStateOutgoingFailed:
66
return @"OutgoingFailed";
67
68
case TSPaymentStateIncomingUnverified:
69
return @"IncomingUnverified";
70
case TSPaymentStateIncomingVerified:
71
return @"IncomingVerified";
72
case TSPaymentStateIncomingComplete:
73
return @"IncomingComplete";
74
case TSPaymentStateIncomingFailed:
75
return @"IncomingFailed";
76
default:
77
OWSCFailDebug(@"Unknown TSPaymentState.");
78
return @"Unknown";
79
}
80
}
81
82
NSString *NSStringFromTSPaymentFailure(TSPaymentFailure value)
83
{
84
switch (value) {
85
case TSPaymentFailureNone:
86
return @"None";
87
case TSPaymentFailureUnknown:
88
return @"Unknown";
89
case TSPaymentFailureInsufficientFunds:
90
return @"InsufficientFunds";
91
case TSPaymentFailureValidationFailed:
92
return @"ValidationFailed";
93
case TSPaymentFailureNotificationSendFailed:
94
return @"NotificationSendFailed";
95
case TSPaymentFailureInvalid:
96
return @"Invalid";
97
case TSPaymentFailureExpired:
98
return @"Expired";
99
default:
100
OWSCFailDebug(@"Unknown TSPaymentFailure.");
101
return @"Unknown";
102
}
103
}
104
105
#pragma mark -
106
107
@implementation TSPaymentAmount
108
109
- (instancetype)initWithCurrency:(TSPaymentCurrency)currency picoMob:(uint64_t)picoMob
110
{
111
self = [super init];
112
113
if (!self) {
114
return self;
115
}
116
117
_currency = currency;
118
_picoMob = picoMob;
119
120
OWSAssertDebug([self isValidAmountWithCanBeEmpty:YES]);
121
122
return self;
123
}
124
125
+ (BOOL)supportsSecureCoding
126
{
127
return YES;
128
}
129
130
- (void)encodeWithCoder:(NSCoder *)coder
131
{
132
[coder encodeObject:[self valueForKey:@"currency"] forKey:@"currency"];
133
[coder encodeObject:[self valueForKey:@"picoMob"] forKey:@"picoMob"];
134
}
135
136
- (nullable instancetype)initWithCoder:(NSCoder *)coder
137
{
138
self = [super init];
139
if (!self) {
140
return self;
141
}
142
self->_currency = [(NSNumber *)[coder decodeObjectOfClass:[NSNumber class]
143
forKey:@"currency"] unsignedIntegerValue];
144
self->_picoMob = [(NSNumber *)[coder decodeObjectOfClass:[NSNumber class] forKey:@"picoMob"] unsignedLongLongValue];
145
return self;
146
}
147
148
- (NSUInteger)hash
149
{
150
NSUInteger result = 0;
151
result ^= self.currency;
152
result ^= self.picoMob;
153
return result;
154
}
155
156
- (BOOL)isEqual:(id)other
157
{
158
if (![other isMemberOfClass:self.class]) {
159
return NO;
160
}
161
TSPaymentAmount *typedOther = (TSPaymentAmount *)other;
162
if (self.currency != typedOther.currency) {
163
return NO;
164
}
165
if (self.picoMob != typedOther.picoMob) {
166
return NO;
167
}
168
return YES;
169
}
170
171
- (id)copyWithZone:(nullable NSZone *)zone
172
{
173
TSPaymentAmount *result = [[[self class] allocWithZone:zone] init];
174
result->_currency = self.currency;
175
result->_picoMob = self.picoMob;
176
return result;
177
}
178
179
@end
180
181
#pragma mark -
182
183
@implementation TSPaymentAddress
184
185
- (instancetype)initWithCurrency:(TSPaymentCurrency)currency
186
mobileCoinPublicAddressData:(NSData *)mobileCoinPublicAddressData
187
{
188
self = [super init];
189
190
if (!self) {
191
return self;
192
}
193
194
_currency = currency;
195
_mobileCoinPublicAddressData = mobileCoinPublicAddressData;
196
197
OWSAssertDebug(self.isValid);
198
199
return self;
200
}
201
202
- (NSUInteger)hash
203
{
204
NSUInteger result = 0;
205
result ^= self.currency;
206
result ^= self.mobileCoinPublicAddressData.hash;
207
return result;
208
}
209
210
- (BOOL)isEqual:(id)other
211
{
212
if (![other isMemberOfClass:self.class]) {
213
return NO;
214
}
215
TSPaymentAddress *typedOther = (TSPaymentAddress *)other;
216
if (self.currency != typedOther.currency) {
217
return NO;
218
}
219
if (![NSObject isObject:self.mobileCoinPublicAddressData equalToObject:typedOther.mobileCoinPublicAddressData]) {
220
return NO;
221
}
222
return YES;
223
}
224
225
@end
226
227
#pragma mark -
228
229
@implementation TSPaymentNotification
230
231
- (instancetype)initWithMemoMessage:(nullable NSString *)memoMessage mcReceiptData:(NSData *)mcReceiptData
232
{
233
self = [super init];
234
235
if (!self) {
236
return self;
237
}
238
239
_memoMessage = memoMessage;
240
_mcReceiptData = mcReceiptData;
241
242
OWSAssertDebug(self.isValid);
243
244
return self;
245
}
246
247
+ (BOOL)supportsSecureCoding
248
{
249
return YES;
250
}
251
252
- (void)encodeWithCoder:(NSCoder *)coder
253
{
254
NSData *mcReceiptData = self.mcReceiptData;
255
if (mcReceiptData != nil) {
256
[coder encodeObject:mcReceiptData forKey:@"mcReceiptData"];
257
}
258
NSString *memoMessage = self.memoMessage;
259
if (memoMessage != nil) {
260
[coder encodeObject:memoMessage forKey:@"memoMessage"];
261
}
262
}
263
264
- (nullable instancetype)initWithCoder:(NSCoder *)coder
265
{
266
self = [super init];
267
if (!self) {
268
return self;
269
}
270
self->_mcReceiptData = [coder decodeObjectOfClass:[NSData class] forKey:@"mcReceiptData"];
271
self->_memoMessage = [coder decodeObjectOfClass:[NSString class] forKey:@"memoMessage"];
272
return self;
273
}
274
275
- (NSUInteger)hash
276
{
277
NSUInteger result = 0;
278
result ^= self.mcReceiptData.hash;
279
result ^= self.memoMessage.hash;
280
return result;
281
}
282
283
- (BOOL)isEqual:(id)other
284
{
285
if (![other isMemberOfClass:self.class]) {
286
return NO;
287
}
288
TSPaymentNotification *typedOther = (TSPaymentNotification *)other;
289
if (![NSObject isObject:self.mcReceiptData equalToObject:typedOther.mcReceiptData]) {
290
return NO;
291
}
292
if (![NSObject isObject:self.memoMessage equalToObject:typedOther.memoMessage]) {
293
return NO;
294
}
295
return YES;
296
}
297
298
- (id)copyWithZone:(nullable NSZone *)zone
299
{
300
TSPaymentNotification *result = [[[self class] allocWithZone:zone] init];
301
result->_mcReceiptData = self.mcReceiptData;
302
result->_memoMessage = self.memoMessage;
303
return result;
304
}
305
306
@end
307
308
#pragma mark -
309
310
@implementation TSArchivedPaymentInfo
311
312
- (instancetype)initWithAmount:(nullable NSString *)amount fee:(nullable NSString *)fee note:(nullable NSString *)note
313
{
314
self = [super init];
315
316
if (!self) {
317
return self;
318
}
319
320
_amount = amount;
321
_fee = fee;
322
_note = note;
323
324
return self;
325
}
326
327
+ (BOOL)supportsSecureCoding
328
{
329
return YES;
330
}
331
332
- (void)encodeWithCoder:(NSCoder *)coder
333
{
334
NSString *amount = self.amount;
335
if (amount != nil) {
336
[coder encodeObject:amount forKey:@"amount"];
337
}
338
NSString *fee = self.fee;
339
if (fee != nil) {
340
[coder encodeObject:fee forKey:@"fee"];
341
}
342
NSString *note = self.note;
343
if (note != nil) {
344
[coder encodeObject:note forKey:@"note"];
345
}
346
}
347
348
- (nullable instancetype)initWithCoder:(NSCoder *)coder
349
{
350
self = [super init];
351
if (!self) {
352
return self;
353
}
354
self->_amount = [coder decodeObjectOfClass:[NSString class] forKey:@"amount"];
355
self->_fee = [coder decodeObjectOfClass:[NSString class] forKey:@"fee"];
356
self->_note = [coder decodeObjectOfClass:[NSString class] forKey:@"note"];
357
return self;
358
}
359
360
- (NSUInteger)hash
361
{
362
NSUInteger result = 0;
363
result ^= self.amount.hash;
364
result ^= self.fee.hash;
365
result ^= self.note.hash;
366
return result;
367
}
368
369
- (BOOL)isEqual:(id)other
370
{
371
if (![other isMemberOfClass:self.class]) {
372
return NO;
373
}
374
TSArchivedPaymentInfo *typedOther = (TSArchivedPaymentInfo *)other;
375
if (![NSObject isObject:self.amount equalToObject:typedOther.amount]) {
376
return NO;
377
}
378
if (![NSObject isObject:self.fee equalToObject:typedOther.fee]) {
379
return NO;
380
}
381
if (![NSObject isObject:self.note equalToObject:typedOther.note]) {
382
return NO;
383
}
384
return YES;
385
}
386
387
- (id)copyWithZone:(nullable NSZone *)zone
388
{
389
TSArchivedPaymentInfo *result = [[[self class] allocWithZone:zone] init];
390
result->_amount = self.amount;
391
result->_fee = self.fee;
392
result->_note = self.note;
393
return result;
394
}
395
396
@end
397
398
NS_ASSUME_NONNULL_END
399
400