Path: blob/main/SignalServiceKit/Payments/TSPaymentModels.m
1 views
//1// Copyright 2021 Signal Messenger, LLC2// SPDX-License-Identifier: AGPL-3.0-only3//45#import "TSPaymentModels.h"6#import <SignalServiceKit/SignalServiceKit-Swift.h>78NS_ASSUME_NONNULL_BEGIN910NSString *NSStringFromTSPaymentCurrency(TSPaymentCurrency value)11{12switch (value) {13case TSPaymentCurrencyUnknown:14return @"Unknown";15case TSPaymentCurrencyMobileCoin:16return @"MobileCoin";17}18}1920NSString *NSStringFromTSPaymentType(TSPaymentType value)21{22switch (value) {23case TSPaymentTypeIncomingPayment:24return @"IncomingPayment";25case TSPaymentTypeOutgoingPaymentNotFromLocalDevice:26return @"OutgoingPaymentNotFromLocalDevice";27case TSPaymentTypeOutgoingPayment:28return @"OutgoingPayment";29case TSPaymentTypeIncomingUnidentified:30return @"IncomingUnidentified";31case TSPaymentTypeOutgoingUnidentified:32return @"OutgoingUnidentified";33case TSPaymentTypeOutgoingTransfer:34return @"OutgoingTransfer";35case TSPaymentTypeOutgoingDefragmentation:36return @"OutgoingDefragmentation";37case TSPaymentTypeOutgoingDefragmentationNotFromLocalDevice:38return @"OutgoingDefragmentationNotFromLocalDevice";39case TSPaymentTypeIncomingRestored:40return @"IncomingRestoredPayment";41case TSPaymentTypeOutgoingRestored:42return @"OutgoingRestoredPayment";43default:44OWSCFailDebug(@"Unknown value: %d", (int)value);45return @"Unknown";46}47}4849NSString *NSStringFromTSPaymentState(TSPaymentState value)50{51switch (value) {52case TSPaymentStateOutgoingUnsubmitted:53return @"OutgoingUnsubmitted";54case TSPaymentStateOutgoingUnverified:55return @"OutgoingUnverified";56case TSPaymentStateOutgoingVerified:57return @"OutgoingVerified";58case TSPaymentStateOutgoingSending:59return @"OutgoingSending";60case TSPaymentStateOutgoingSent:61return @"OutgoingSent";62case TSPaymentStateOutgoingComplete:63return @"OutgoingComplete";64case TSPaymentStateOutgoingFailed:65return @"OutgoingFailed";6667case TSPaymentStateIncomingUnverified:68return @"IncomingUnverified";69case TSPaymentStateIncomingVerified:70return @"IncomingVerified";71case TSPaymentStateIncomingComplete:72return @"IncomingComplete";73case TSPaymentStateIncomingFailed:74return @"IncomingFailed";75default:76OWSCFailDebug(@"Unknown TSPaymentState.");77return @"Unknown";78}79}8081NSString *NSStringFromTSPaymentFailure(TSPaymentFailure value)82{83switch (value) {84case TSPaymentFailureNone:85return @"None";86case TSPaymentFailureUnknown:87return @"Unknown";88case TSPaymentFailureInsufficientFunds:89return @"InsufficientFunds";90case TSPaymentFailureValidationFailed:91return @"ValidationFailed";92case TSPaymentFailureNotificationSendFailed:93return @"NotificationSendFailed";94case TSPaymentFailureInvalid:95return @"Invalid";96case TSPaymentFailureExpired:97return @"Expired";98default:99OWSCFailDebug(@"Unknown TSPaymentFailure.");100return @"Unknown";101}102}103104#pragma mark -105106@implementation TSPaymentAmount107108- (instancetype)initWithCurrency:(TSPaymentCurrency)currency picoMob:(uint64_t)picoMob109{110self = [super init];111112if (!self) {113return self;114}115116_currency = currency;117_picoMob = picoMob;118119OWSAssertDebug([self isValidAmountWithCanBeEmpty:YES]);120121return self;122}123124+ (BOOL)supportsSecureCoding125{126return YES;127}128129- (void)encodeWithCoder:(NSCoder *)coder130{131[coder encodeObject:[self valueForKey:@"currency"] forKey:@"currency"];132[coder encodeObject:[self valueForKey:@"picoMob"] forKey:@"picoMob"];133}134135- (nullable instancetype)initWithCoder:(NSCoder *)coder136{137self = [super init];138if (!self) {139return self;140}141self->_currency = [(NSNumber *)[coder decodeObjectOfClass:[NSNumber class]142forKey:@"currency"] unsignedIntegerValue];143self->_picoMob = [(NSNumber *)[coder decodeObjectOfClass:[NSNumber class] forKey:@"picoMob"] unsignedLongLongValue];144return self;145}146147- (NSUInteger)hash148{149NSUInteger result = 0;150result ^= self.currency;151result ^= self.picoMob;152return result;153}154155- (BOOL)isEqual:(id)other156{157if (![other isMemberOfClass:self.class]) {158return NO;159}160TSPaymentAmount *typedOther = (TSPaymentAmount *)other;161if (self.currency != typedOther.currency) {162return NO;163}164if (self.picoMob != typedOther.picoMob) {165return NO;166}167return YES;168}169170- (id)copyWithZone:(nullable NSZone *)zone171{172TSPaymentAmount *result = [[[self class] allocWithZone:zone] init];173result->_currency = self.currency;174result->_picoMob = self.picoMob;175return result;176}177178@end179180#pragma mark -181182@implementation TSPaymentAddress183184- (instancetype)initWithCurrency:(TSPaymentCurrency)currency185mobileCoinPublicAddressData:(NSData *)mobileCoinPublicAddressData186{187self = [super init];188189if (!self) {190return self;191}192193_currency = currency;194_mobileCoinPublicAddressData = mobileCoinPublicAddressData;195196OWSAssertDebug(self.isValid);197198return self;199}200201- (NSUInteger)hash202{203NSUInteger result = 0;204result ^= self.currency;205result ^= self.mobileCoinPublicAddressData.hash;206return result;207}208209- (BOOL)isEqual:(id)other210{211if (![other isMemberOfClass:self.class]) {212return NO;213}214TSPaymentAddress *typedOther = (TSPaymentAddress *)other;215if (self.currency != typedOther.currency) {216return NO;217}218if (![NSObject isObject:self.mobileCoinPublicAddressData equalToObject:typedOther.mobileCoinPublicAddressData]) {219return NO;220}221return YES;222}223224@end225226#pragma mark -227228@implementation TSPaymentNotification229230- (instancetype)initWithMemoMessage:(nullable NSString *)memoMessage mcReceiptData:(NSData *)mcReceiptData231{232self = [super init];233234if (!self) {235return self;236}237238_memoMessage = memoMessage;239_mcReceiptData = mcReceiptData;240241OWSAssertDebug(self.isValid);242243return self;244}245246+ (BOOL)supportsSecureCoding247{248return YES;249}250251- (void)encodeWithCoder:(NSCoder *)coder252{253NSData *mcReceiptData = self.mcReceiptData;254if (mcReceiptData != nil) {255[coder encodeObject:mcReceiptData forKey:@"mcReceiptData"];256}257NSString *memoMessage = self.memoMessage;258if (memoMessage != nil) {259[coder encodeObject:memoMessage forKey:@"memoMessage"];260}261}262263- (nullable instancetype)initWithCoder:(NSCoder *)coder264{265self = [super init];266if (!self) {267return self;268}269self->_mcReceiptData = [coder decodeObjectOfClass:[NSData class] forKey:@"mcReceiptData"];270self->_memoMessage = [coder decodeObjectOfClass:[NSString class] forKey:@"memoMessage"];271return self;272}273274- (NSUInteger)hash275{276NSUInteger result = 0;277result ^= self.mcReceiptData.hash;278result ^= self.memoMessage.hash;279return result;280}281282- (BOOL)isEqual:(id)other283{284if (![other isMemberOfClass:self.class]) {285return NO;286}287TSPaymentNotification *typedOther = (TSPaymentNotification *)other;288if (![NSObject isObject:self.mcReceiptData equalToObject:typedOther.mcReceiptData]) {289return NO;290}291if (![NSObject isObject:self.memoMessage equalToObject:typedOther.memoMessage]) {292return NO;293}294return YES;295}296297- (id)copyWithZone:(nullable NSZone *)zone298{299TSPaymentNotification *result = [[[self class] allocWithZone:zone] init];300result->_mcReceiptData = self.mcReceiptData;301result->_memoMessage = self.memoMessage;302return result;303}304305@end306307#pragma mark -308309@implementation TSArchivedPaymentInfo310311- (instancetype)initWithAmount:(nullable NSString *)amount fee:(nullable NSString *)fee note:(nullable NSString *)note312{313self = [super init];314315if (!self) {316return self;317}318319_amount = amount;320_fee = fee;321_note = note;322323return self;324}325326+ (BOOL)supportsSecureCoding327{328return YES;329}330331- (void)encodeWithCoder:(NSCoder *)coder332{333NSString *amount = self.amount;334if (amount != nil) {335[coder encodeObject:amount forKey:@"amount"];336}337NSString *fee = self.fee;338if (fee != nil) {339[coder encodeObject:fee forKey:@"fee"];340}341NSString *note = self.note;342if (note != nil) {343[coder encodeObject:note forKey:@"note"];344}345}346347- (nullable instancetype)initWithCoder:(NSCoder *)coder348{349self = [super init];350if (!self) {351return self;352}353self->_amount = [coder decodeObjectOfClass:[NSString class] forKey:@"amount"];354self->_fee = [coder decodeObjectOfClass:[NSString class] forKey:@"fee"];355self->_note = [coder decodeObjectOfClass:[NSString class] forKey:@"note"];356return self;357}358359- (NSUInteger)hash360{361NSUInteger result = 0;362result ^= self.amount.hash;363result ^= self.fee.hash;364result ^= self.note.hash;365return result;366}367368- (BOOL)isEqual:(id)other369{370if (![other isMemberOfClass:self.class]) {371return NO;372}373TSArchivedPaymentInfo *typedOther = (TSArchivedPaymentInfo *)other;374if (![NSObject isObject:self.amount equalToObject:typedOther.amount]) {375return NO;376}377if (![NSObject isObject:self.fee equalToObject:typedOther.fee]) {378return NO;379}380if (![NSObject isObject:self.note equalToObject:typedOther.note]) {381return NO;382}383return YES;384}385386- (id)copyWithZone:(nullable NSZone *)zone387{388TSArchivedPaymentInfo *result = [[[self class] allocWithZone:zone] init];389result->_amount = self.amount;390result->_fee = self.fee;391result->_note = self.note;392return result;393}394395@end396397NS_ASSUME_NONNULL_END398399400