diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 349893bce..dac065ec1 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -1,5 +1,4 @@ name: Continuous Integration - on: push: branches: @@ -10,7 +9,6 @@ on: branches: - master - develop - jobs: build: name: Build @@ -20,7 +18,7 @@ jobs: run: | brew install automake - name: Checkout DashSync - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: path: dashsync submodules: recursive @@ -48,13 +46,17 @@ jobs: xcode-version: '15.4' - name: Rustup add targets run: rustup target add aarch64-apple-ios x86_64-apple-ios aarch64-apple-ios-sim - - name: Dependencies + - name: Build dependencies working-directory: ./dashsync/Example run: pod install --repo-update --verbose - - name: Build + - name: Build for iOS Simulator (without code signing) working-directory: ./dashsync/Example env: - scheme: ${{ 'default' }} + scheme: ${{ 'DashSync-Example' }} platform: ${{ 'iOS Simulator' }} run: | - xcodebuild build -scheme "DashSync-Example" -workspace "DashSync.xcworkspace" -destination "platform=$platform,name=iPhone 13" + xcodebuild build \ + -scheme "DashSync-Example" \ + -workspace "DashSync.xcworkspace" \ + -destination "platform=$platform,name=iPhone 13" \ + CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED=NO CODE_SIGN_ENTITLEMENTS="" CODE_SIGNING_ALLOWED=NO \ No newline at end of file diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml index 172ddfba9..6504c8e63 100644 --- a/.github/workflows/coverage.yml +++ b/.github/workflows/coverage.yml @@ -18,7 +18,7 @@ jobs: run: | brew install automake - name: Checkout DashSync - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: path: dashsync submodules: recursive diff --git a/.github/workflows/e2eTestsTestnet.yml b/.github/workflows/e2eTestsTestnet.yml index 5592daf8a..debb99192 100644 --- a/.github/workflows/e2eTestsTestnet.yml +++ b/.github/workflows/e2eTestsTestnet.yml @@ -20,7 +20,7 @@ jobs: run: | brew install automake - name: Checkout DashSync - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: path: dashsync submodules: recursive @@ -48,17 +48,25 @@ jobs: - name: Dependencies working-directory: ./dashsync/Example run: pod install --repo-update - - name: Build + - name: Build for testing (with ad-hoc code signing) working-directory: ./dashsync/Example env: - scheme: ${{ 'default' }} + scheme: ${{ 'DashSync-Example' }} platform: ${{ 'iOS Simulator' }} run: | - xcodebuild build-for-testing -scheme "DashSync-Example" -workspace "DashSync.xcworkspace" -destination "platform=$platform,name=iPhone 13" + xcodebuild build-for-testing \ + -scheme "DashSync-Example" \ + -workspace "DashSync.xcworkspace" \ + -destination "platform=$platform,name=iPhone 13" \ + CODE_SIGN_IDENTITY="-" CODE_SIGNING_REQUIRED=YES CODE_SIGNING_ALLOWED=YES - name: Test Syncing Chain working-directory: ./dashsync/Example env: - scheme: ${{ 'default' }} + scheme: ${{ 'DashSync-Example' }} platform: ${{ 'iOS Simulator' }} run: | - xcodebuild test-without-building -scheme "DashSync-Example" -workspace "DashSync.xcworkspace" -destination "platform=$platform,name=iPhone 13" -testPlan TestnetE2ETests + xcodebuild test-without-building \ + -scheme "DashSync-Example" \ + -workspace "DashSync.xcworkspace" \ + -destination "platform=$platform,name=iPhone 13" \ + -testPlan TestnetE2ETests \ No newline at end of file diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index f92e7d6aa..2afc376d8 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -20,7 +20,7 @@ jobs: run: | brew install automake - name: Checkout DashSync - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: path: dashsync submodules: recursive diff --git a/.github/workflows/network.yml b/.github/workflows/network.yml index 753b49d44..342edf1b3 100644 --- a/.github/workflows/network.yml +++ b/.github/workflows/network.yml @@ -17,7 +17,7 @@ jobs: run: | brew install automake - name: Checkout DashSync - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: path: dashsync submodules: recursive @@ -44,7 +44,7 @@ jobs: run: cargo install cargo-lipo - name: Rustup add targets run: rustup target add x86_64-apple-darwin - - name: Dependencies + - name: Build Dependencies working-directory: ./dashsync/Example run: pod install --repo-update - name: Cache network info build @@ -71,7 +71,9 @@ jobs: run: | ./NetworkInfo -outputDir ~/ - name: Archive network ping results - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v4 # Updated to v4 with: name: testnet-network-report path: ~/networkHealth.json + retention-days: 30 + compression-level: 6 # Default, adjust as needed \ No newline at end of file diff --git a/.github/workflows/syncTestMainnet.yml b/.github/workflows/syncTestMainnet.yml index 7e12492fa..54aa929e3 100644 --- a/.github/workflows/syncTestMainnet.yml +++ b/.github/workflows/syncTestMainnet.yml @@ -19,7 +19,7 @@ jobs: run: | brew install automake - name: Checkout DashSync - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: path: dashsync submodules: recursive diff --git a/.github/workflows/syncTestTestnet.yml b/.github/workflows/syncTestTestnet.yml index 85c69d426..d55703616 100644 --- a/.github/workflows/syncTestTestnet.yml +++ b/.github/workflows/syncTestTestnet.yml @@ -29,7 +29,7 @@ jobs: git lfs ls-files -l | cut -d' ' -f1 | sort > .lfs-assets-id working-directory: ./dashsync - name: Restore LFS cache - uses: actions/cache@v2 + uses: actions/cache@v3 id: lfs-cache with: path: dashsync/.git/lfs @@ -48,17 +48,26 @@ jobs: - name: Dependencies working-directory: ./dashsync/Example run: pod install --repo-update - - name: Build + - name: Build for testing (without code signing) working-directory: ./dashsync/Example env: - scheme: ${{ 'default' }} + scheme: ${{ 'DashSync-Example' }} platform: ${{ 'iOS Simulator' }} run: | - xcodebuild build-for-testing -scheme "DashSync-Example" -workspace "DashSync.xcworkspace" -destination "platform=$platform,name=iPhone 13" + xcodebuild build-for-testing \ + -scheme "DashSync-Example" \ + -workspace "DashSync.xcworkspace" \ + -destination "platform=$platform,name=iPhone 13" \ + CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED=NO CODE_SIGN_ENTITLEMENTS="" CODE_SIGNING_ALLOWED=NO - name: Test Syncing Chain working-directory: ./dashsync/Example env: - scheme: ${{ 'default' }} + scheme: ${{ 'DashSync-Example' }} platform: ${{ 'iOS Simulator' }} run: | - xcodebuild test-without-building -scheme "DashSync-Example" -workspace "DashSync.xcworkspace" -destination "platform=$platform,name=iPhone 13" -testPlan TestnetSyncTests + xcodebuild test-without-building \ + -scheme "DashSync-Example" \ + -workspace "DashSync.xcworkspace" \ + -destination "platform=$platform,name=iPhone 13" \ + -testPlan TestnetSyncTests \ + CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED=NO CODE_SIGN_ENTITLEMENTS="" CODE_SIGNING_ALLOWED=NO \ No newline at end of file diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 857070010..205e35954 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -19,109 +19,192 @@ jobs: - name: Install automake run: | brew install automake + - name: Checkout DashSync - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: path: dashsync submodules: recursive + - name: Create LFS file list run: | git lfs ls-files -l | cut -d' ' -f1 | sort > .lfs-assets-id working-directory: ./dashsync + - name: Restore LFS cache uses: actions/cache@v3 id: lfs-cache with: path: dashsync/.git/lfs key: lfs-${{ hashFiles('.lfs-assets-id') }}-v1 + - name: Git LFS Pull run: git lfs pull working-directory: ./dashsync + - uses: actions/cache@v3 with: path: ./dashsync/Example/Pods key: ${{ runner.os }}-pods-${{ hashFiles('**/Podfile.lock') }} restore-keys: | ${{ runner.os }}-pods- + - name: Rustup add targets run: rustup target add aarch64-apple-ios x86_64-apple-ios aarch64-apple-ios-sim + - name: Dependencies working-directory: ./dashsync/Example run: pod install --repo-update - - name: Build + + - name: Build for testing (with manual code signing) working-directory: ./dashsync/Example env: - scheme: ${{ 'default' }} - platform: ${{ 'iOS Simulator' }} + scheme: 'DashSync-Example' + platform: 'iOS Simulator' run: | - xcodebuild build-for-testing -scheme "DashSync-Example" -workspace "DashSync.xcworkspace" -destination "platform=$platform,name=iPhone 13" + xcodebuild build-for-testing \ + -scheme "$scheme" \ + -workspace "DashSync.xcworkspace" \ + -destination "platform=$platform,name=iPhone 13" \ + CODE_SIGN_STYLE=Manual \ + CODE_SIGN_IDENTITY="Sign to Run Locally" + - name: Test Crypto working-directory: ./dashsync/Example env: - scheme: ${{ 'default' }} - platform: ${{ 'iOS Simulator' }} + scheme: 'DashSync-Example' + platform: 'iOS Simulator' run: | - xcodebuild test-without-building -scheme "DashSync-Example" -workspace "DashSync.xcworkspace" -destination "platform=$platform,name=iPhone 13" -testPlan CryptoTests + xcodebuild test-without-building \ + -scheme "$scheme" \ + -workspace "DashSync.xcworkspace" \ + -destination "platform=$platform,name=iPhone 13" \ + -testPlan CryptoTests \ + CODE_SIGN_STYLE=Manual \ + CODE_SIGN_IDENTITY="Sign to Run Locally" + - name: Test Derivations working-directory: ./dashsync/Example env: - scheme: ${{ 'default' }} - platform: ${{ 'iOS Simulator' }} + scheme: 'DashSync-Example' + platform: 'iOS Simulator' run: | - xcodebuild test-without-building -scheme "DashSync-Example" -workspace "DashSync.xcworkspace" -destination "platform=$platform,name=iPhone 13" -testPlan DerivationTests + xcodebuild test-without-building \ + -scheme "$scheme" \ + -workspace "DashSync.xcworkspace" \ + -destination "platform=$platform,name=iPhone 13" \ + -testPlan DerivationTests \ + CODE_SIGN_STYLE=Manual \ + CODE_SIGN_IDENTITY="Sign to Run Locally" + - name: Test Libraries working-directory: ./dashsync/Example env: - scheme: ${{ 'default' }} - platform: ${{ 'iOS Simulator' }} + scheme: 'DashSync-Example' + platform: 'iOS Simulator' run: | - xcodebuild test-without-building -scheme "DashSync-Example" -workspace "DashSync.xcworkspace" -destination "platform=$platform,name=iPhone 13" -testPlan LibraryTests + xcodebuild test-without-building \ + -scheme "$scheme" \ + -workspace "DashSync.xcworkspace" \ + -destination "platform=$platform,name=iPhone 13" \ + -testPlan LibraryTests \ + CODE_SIGN_STYLE=Manual \ + CODE_SIGN_IDENTITY="Sign to Run Locally" + - name: Test Governance working-directory: ./dashsync/Example env: - scheme: ${{ 'default' }} - platform: ${{ 'iOS Simulator' }} + scheme: 'DashSync-Example' + platform: 'iOS Simulator' run: | - xcodebuild test-without-building -scheme "DashSync-Example" -workspace "DashSync.xcworkspace" -destination "platform=$platform,name=iPhone 13" -testPlan GovernanceTests + xcodebuild test-without-building \ + -scheme "$scheme" \ + -workspace "DashSync.xcworkspace" \ + -destination "platform=$platform,name=iPhone 13" \ + -testPlan GovernanceTests \ + CODE_SIGN_STYLE=Manual \ + CODE_SIGN_IDENTITY="Sign to Run Locally" + - name: Test Payments working-directory: ./dashsync/Example env: - scheme: ${{ 'default' }} - platform: ${{ 'iOS Simulator' }} + scheme: 'DashSync-Example' + platform: 'iOS Simulator' run: | - xcodebuild test-without-building -scheme "DashSync-Example" -workspace "DashSync.xcworkspace" -destination "platform=$platform,name=iPhone 13" -testPlan PaymentTests + xcodebuild test-without-building \ + -scheme "$scheme" \ + -workspace "DashSync.xcworkspace" \ + -destination "platform=$platform,name=iPhone 13" \ + -testPlan PaymentTests \ + CODE_SIGN_STYLE=Manual \ + CODE_SIGN_IDENTITY="Sign to Run Locally" + - name: Test Masternode Lists working-directory: ./dashsync/Example env: - scheme: ${{ 'default' }} - platform: ${{ 'iOS Simulator' }} + scheme: 'DashSync-Example' + platform: 'iOS Simulator' run: | - xcodebuild test-without-building -scheme "DashSync-Example" -workspace "DashSync.xcworkspace" -destination "platform=$platform,name=iPhone 13" -testPlan MasternodeListTests + xcodebuild test-without-building \ + -scheme "$scheme" \ + -workspace "DashSync.xcworkspace" \ + -destination "platform=$platform,name=iPhone 13" \ + -testPlan MasternodeListTests \ + CODE_SIGN_STYLE=Manual \ + CODE_SIGN_IDENTITY="Sign to Run Locally" + - name: Test Wallet working-directory: ./dashsync/Example env: - scheme: ${{ 'default' }} - platform: ${{ 'iOS Simulator' }} + scheme: 'DashSync-Example' + platform: 'iOS Simulator' run: | - xcodebuild test-without-building -scheme "DashSync-Example" -workspace "DashSync.xcworkspace" -destination "platform=$platform,name=iPhone 13" -testPlan WalletTests + xcodebuild test-without-building \ + -scheme "$scheme" \ + -workspace "DashSync.xcworkspace" \ + -destination "platform=$platform,name=iPhone 13" \ + -testPlan WalletTests \ + CODE_SIGN_STYLE=Manual \ + CODE_SIGN_IDENTITY="Sign to Run Locally" + - name: Test Platform Transitions working-directory: ./dashsync/Example env: - scheme: ${{ 'default' }} - platform: ${{ 'iOS Simulator' }} + scheme: 'DashSync-Example' + platform: 'iOS Simulator' run: | - xcodebuild test-without-building -scheme "DashSync-Example" -workspace "DashSync.xcworkspace" -destination "platform=$platform,name=iPhone 13" -testPlan PlatformTransitionTests + xcodebuild test-without-building \ + -scheme "$scheme" \ + -workspace "DashSync.xcworkspace" \ + -destination "platform=$platform,name=iPhone 13" \ + -testPlan PlatformTransitionTests \ + CODE_SIGN_STYLE=Manual \ + CODE_SIGN_IDENTITY="Sign to Run Locally" + - name: Test Transactions working-directory: ./dashsync/Example env: - scheme: ${{ 'default' }} - platform: ${{ 'iOS Simulator' }} + scheme: 'DashSync-Example' + platform: 'iOS Simulator' run: | - xcodebuild test-without-building -scheme "DashSync-Example" -workspace "DashSync.xcworkspace" -destination "platform=$platform,name=iPhone 13" -testPlan TransactionTests + xcodebuild test-without-building \ + -scheme "$scheme" \ + -workspace "DashSync.xcworkspace" \ + -destination "platform=$platform,name=iPhone 13" \ + -testPlan TransactionTests \ + CODE_SIGN_STYLE=Manual \ + CODE_SIGN_IDENTITY="Sign to Run Locally" + - name: Test Locks working-directory: ./dashsync/Example env: - scheme: ${{ 'default' }} - platform: ${{ 'iOS Simulator' }} + scheme: 'DashSync-Example' + platform: 'iOS Simulator' run: | - xcodebuild test-without-building -scheme "DashSync-Example" -workspace "DashSync.xcworkspace" -destination "platform=$platform,name=iPhone 13" -testPlan LockTests + xcodebuild test-without-building \ + -scheme "$scheme" \ + -workspace "DashSync.xcworkspace" \ + -destination "platform=$platform,name=iPhone 13" \ + -testPlan LockTests \ + CODE_SIGN_STYLE=Manual \ + CODE_SIGN_IDENTITY="Sign to Run Locally" \ No newline at end of file diff --git a/DashSync.podspec b/DashSync.podspec index 98e8e450b..f052a94ad 100644 --- a/DashSync.podspec +++ b/DashSync.podspec @@ -34,7 +34,7 @@ Pod::Spec.new do |s| s.ios.framework = 'UIKit' s.macos.framework = 'Cocoa' s.compiler_flags = '-Wno-comma' - s.dependency 'DashSharedCore', '0.4.16' + s.dependency 'DashSharedCore', '0.4.19' s.dependency 'CocoaLumberjack', '3.7.2' s.ios.dependency 'DWAlertController', '0.2.1' s.dependency 'DSDynamicOptions', '0.1.2' diff --git a/DashSync/shared/DashSync.xcdatamodeld/.xccurrentversion b/DashSync/shared/DashSync.xcdatamodeld/.xccurrentversion index 5cbe4fe8d..9697cdadc 100644 --- a/DashSync/shared/DashSync.xcdatamodeld/.xccurrentversion +++ b/DashSync/shared/DashSync.xcdatamodeld/.xccurrentversion @@ -3,6 +3,6 @@ _XCCurrentVersionName - DashSync 20.xcdatamodel + DashSync 21.xcdatamodel diff --git a/DashSync/shared/DashSync.xcdatamodeld/DashSync 21.xcdatamodel/contents b/DashSync/shared/DashSync.xcdatamodeld/DashSync 21.xcdatamodel/contents new file mode 100644 index 000000000..e8661f27e --- /dev/null +++ b/DashSync/shared/DashSync.xcdatamodeld/DashSync 21.xcdatamodel/contents @@ -0,0 +1,529 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/DashSync/shared/Models/Chain/DSChainConstants.h b/DashSync/shared/Models/Chain/DSChainConstants.h index 4420efbfc..1a8b5f9b5 100644 --- a/DashSync/shared/Models/Chain/DSChainConstants.h +++ b/DashSync/shared/Models/Chain/DSChainConstants.h @@ -31,13 +31,13 @@ #define TESTNET_DAPI_GRPC_STANDARD_PORT 3010 #define DEVNET_DAPI_GRPC_STANDARD_PORT 3010 -#define PROTOCOL_VERSION_MAINNET 70232 +#define PROTOCOL_VERSION_MAINNET 70233 #define DEFAULT_MIN_PROTOCOL_VERSION_MAINNET 70228 -#define PROTOCOL_VERSION_TESTNET 70232 +#define PROTOCOL_VERSION_TESTNET 70233 #define DEFAULT_MIN_PROTOCOL_VERSION_TESTNET 70228 -#define PROTOCOL_VERSION_DEVNET 70232 +#define PROTOCOL_VERSION_DEVNET 70233 #define DEFAULT_MIN_PROTOCOL_VERSION_DEVNET 70228 #define PLATFORM_PROTOCOL_VERSION_MAINNET 1 diff --git a/DashSync/shared/Models/Entities/DSAssetLockTransactionEntity+CoreDataClass.h b/DashSync/shared/Models/Entities/DSAssetLockTransactionEntity+CoreDataClass.h new file mode 100644 index 000000000..f543fb53c --- /dev/null +++ b/DashSync/shared/Models/Entities/DSAssetLockTransactionEntity+CoreDataClass.h @@ -0,0 +1,43 @@ +// +// Created by Vladimir Pirogov +// Copyright © 2024 Dash Core Group. All rights reserved. +// +// Licensed under the MIT License (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import "DSSpecialTransactionEntity+CoreDataClass.h" +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface DSAssetLockTransactionEntity : DSSpecialTransactionEntity +@end + +@interface DSAssetLockTransactionEntity (CoreDataGeneratedAccessors) + +- (void)insertObject:(DSTxOutputEntity *)value inCreditOutputsAtIndex:(NSUInteger)idx; +- (void)removeObjectFromCreditOutputsAtIndex:(NSUInteger)idx; +- (void)insertCreditOutputs:(NSArray *)value atIndexes:(NSIndexSet *)indexes; +- (void)removeCreditOutputsAtIndexes:(NSIndexSet *)indexes; +- (void)replaceObjectInCreditOutputsAtIndex:(NSUInteger)idx withObject:(DSTxOutputEntity *)value; +- (void)replaceCreditOutputsAtIndexes:(NSIndexSet *)indexes withOutputs:(NSArray *)values; +- (void)addCreditOutputsObject:(DSTxOutputEntity *)value; +- (void)removeCreditOutputsObject:(DSTxOutputEntity *)value; +- (void)addCreditOutputs:(NSOrderedSet *)values; +- (void)removeCreditOutputs:(NSOrderedSet *)values; + +@end + +NS_ASSUME_NONNULL_END + +#import "DSAssetLockTransactionEntity+CoreDataProperties.h" diff --git a/DashSync/shared/Models/Entities/DSAssetLockTransactionEntity+CoreDataClass.m b/DashSync/shared/Models/Entities/DSAssetLockTransactionEntity+CoreDataClass.m new file mode 100644 index 000000000..8633ceca6 --- /dev/null +++ b/DashSync/shared/Models/Entities/DSAssetLockTransactionEntity+CoreDataClass.m @@ -0,0 +1,77 @@ +// +// Created by Vladimir Pirogov +// Copyright © 2024 Dash Core Group. All rights reserved. +// +// Licensed under the MIT License (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import "DSAddressEntity+CoreDataClass.h" +#import "DSAssetLockTransaction.h" +#import "DSAssetLockTransactionEntity+CoreDataClass.h" +#import "DSChain+Protected.h" +#import "DSChainEntity+CoreDataClass.h" +#import "DSKeyManager.h" +#import "DSTransactionFactory.h" +#import "DSTransactionOutput.h" +#import "DSTxOutputEntity+CoreDataClass.h" +#import "NSData+Dash.h" +#import "NSManagedObject+Sugar.h" +#import "NSString+Dash.h" + +@implementation DSAssetLockTransactionEntity + +- (instancetype)setAttributesFromTransaction:(DSTransaction *)transaction { + [self.managedObjectContext performBlockAndWait:^{ + [super setAttributesFromTransaction:transaction]; + DSAssetLockTransaction *tx = (DSAssetLockTransaction *)transaction; + self.specialTransactionVersion = tx.specialTransactionVersion; + NSMutableOrderedSet *creditOutputs = [self mutableOrderedSetValueForKey:@"creditOutputs"]; + while (creditOutputs.count < tx.creditOutputs.count) { + [creditOutputs addObject:[DSTxOutputEntity managedObjectInBlockedContext:self.managedObjectContext]]; + } + while (creditOutputs.count > tx.creditOutputs.count) { + + [self removeObjectFromCreditOutputsAtIndex:creditOutputs.count - 1]; + } + NSUInteger idx = 0; + for (DSTxOutputEntity *e in creditOutputs) { + [e setAttributesFromTransaction:tx outputIndex:idx++ forTransactionEntity:self]; + } + }]; + + return self; +} + +- (DSTransaction *)transactionForChain:(DSChain *)chain { + DSAssetLockTransaction *tx = (DSAssetLockTransaction *)[super transactionForChain:chain]; + tx.type = DSTransactionType_AssetLock; + [self.managedObjectContext performBlockAndWait:^{ + tx.specialTransactionVersion = self.specialTransactionVersion; + for (DSTxOutputEntity *e in self.creditOutputs) { + NSString *address = e.address; + if (!address && e.script) { + address = [DSKeyManager addressWithScriptPubKey:e.script forChain:tx.chain]; + } + DSTransactionOutput *transactionOutput = [DSTransactionOutput transactionOutputWithAmount:e.value address:address outScript:e.script onChain:tx.chain]; + [tx.creditOutputs addObject:transactionOutput]; + } + }]; + + return tx; +} + +- (Class)transactionClass { + return [DSAssetLockTransaction class]; +} + +@end diff --git a/DashSync/shared/Models/Entities/DSAssetLockTransactionEntity+CoreDataProperties.h b/DashSync/shared/Models/Entities/DSAssetLockTransactionEntity+CoreDataProperties.h new file mode 100644 index 000000000..fafef85b5 --- /dev/null +++ b/DashSync/shared/Models/Entities/DSAssetLockTransactionEntity+CoreDataProperties.h @@ -0,0 +1,31 @@ +// +// Created by Vladimir Pirogov +// Copyright © 2024 Dash Core Group. All rights reserved. +// +// Licensed under the MIT License (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import "DSAssetLockTransactionEntity+CoreDataClass.h" + + +NS_ASSUME_NONNULL_BEGIN + +@interface DSAssetLockTransactionEntity (CoreDataProperties) + ++ (NSFetchRequest *)fetchRequest; + +@property (nonatomic, retain) NSOrderedSet *creditOutputs; + +@end + +NS_ASSUME_NONNULL_END diff --git a/DashSync/shared/Models/Entities/DSAssetLockTransactionEntity+CoreDataProperties.m b/DashSync/shared/Models/Entities/DSAssetLockTransactionEntity+CoreDataProperties.m new file mode 100644 index 000000000..3b8e838d9 --- /dev/null +++ b/DashSync/shared/Models/Entities/DSAssetLockTransactionEntity+CoreDataProperties.m @@ -0,0 +1,28 @@ +// +// Created by Vladimir Pirogov +// Copyright © 2024 Dash Core Group. All rights reserved. +// +// Licensed under the MIT License (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import "DSAssetLockTransactionEntity+CoreDataProperties.h" + +@implementation DSAssetLockTransactionEntity (CoreDataProperties) + ++ (NSFetchRequest *)fetchRequest { + return [NSFetchRequest fetchRequestWithEntityName:@"DSAssetLockTransactionEntity"]; +} + +@dynamic creditOutputs; + +@end diff --git a/DashSync/shared/Models/Entities/DSAssetUnlockTransactionEntity+CoreDataClass.h b/DashSync/shared/Models/Entities/DSAssetUnlockTransactionEntity+CoreDataClass.h new file mode 100644 index 000000000..da8899d08 --- /dev/null +++ b/DashSync/shared/Models/Entities/DSAssetUnlockTransactionEntity+CoreDataClass.h @@ -0,0 +1,29 @@ +// +// Created by Vladimir Pirogov +// Copyright © 2024 Dash Core Group. All rights reserved. +// +// Licensed under the MIT License (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import "DSSpecialTransactionEntity+CoreDataClass.h" +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface DSAssetUnlockTransactionEntity : DSSpecialTransactionEntity + +@end + +NS_ASSUME_NONNULL_END + +#import "DSAssetUnlockTransactionEntity+CoreDataProperties.h" diff --git a/DashSync/shared/Models/Entities/DSAssetUnlockTransactionEntity+CoreDataClass.m b/DashSync/shared/Models/Entities/DSAssetUnlockTransactionEntity+CoreDataClass.m new file mode 100644 index 000000000..aa67b7306 --- /dev/null +++ b/DashSync/shared/Models/Entities/DSAssetUnlockTransactionEntity+CoreDataClass.m @@ -0,0 +1,64 @@ +// +// Created by Vladimir Pirogov +// Copyright © 2024 Dash Core Group. All rights reserved. +// +// Licensed under the MIT License (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import "DSAddressEntity+CoreDataClass.h" +#import "DSAssetUnlockTransaction.h" +#import "DSAssetUnlockTransactionEntity+CoreDataClass.h" +#import "DSChain+Protected.h" +#import "DSChainEntity+CoreDataClass.h" +#import "DSTransaction.h" +#import "DSTransactionFactory.h" +#import "NSData+Dash.h" +#import "NSManagedObject+Sugar.h" + +@implementation DSAssetUnlockTransactionEntity + +- (instancetype)setAttributesFromTransaction:(DSTransaction *)transaction { + [self.managedObjectContext performBlockAndWait:^{ + [super setAttributesFromTransaction:transaction]; + DSAssetUnlockTransaction *tx = (DSAssetUnlockTransaction *)transaction; + self.specialTransactionVersion = tx.specialTransactionVersion; + self.index = tx.index; + self.fee = tx.fee; + self.requestedHeight = tx.requestedHeight; + self.quorumHash = uint256_data(tx.quorumHash); + self.quorumSignature = uint768_data(tx.quorumSignature); + }]; + + return self; +} + +- (DSTransaction *)transactionForChain:(DSChain *)chain { + DSAssetUnlockTransaction *tx = (DSAssetUnlockTransaction *)[super transactionForChain:chain]; + tx.type = DSTransactionType_AssetUnlock; + [self.managedObjectContext performBlockAndWait:^{ + tx.specialTransactionVersion = self.specialTransactionVersion; + tx.index = self.index; + tx.fee = self.fee; + tx.requestedHeight = self.requestedHeight; + tx.quorumHash = self.quorumHash.UInt256; + tx.quorumSignature = self.quorumSignature.UInt768; + }]; + + return tx; +} + +- (Class)transactionClass { + return [DSAssetUnlockTransaction class]; +} + +@end diff --git a/DashSync/shared/Models/Entities/DSAssetUnlockTransactionEntity+CoreDataProperties.h b/DashSync/shared/Models/Entities/DSAssetUnlockTransactionEntity+CoreDataProperties.h new file mode 100644 index 000000000..9c2a7baa8 --- /dev/null +++ b/DashSync/shared/Models/Entities/DSAssetUnlockTransactionEntity+CoreDataProperties.h @@ -0,0 +1,35 @@ +// +// Created by Vladimir Pirogov +// Copyright © 2024 Dash Core Group. All rights reserved. +// +// Licensed under the MIT License (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import "DSAssetUnlockTransactionEntity+CoreDataClass.h" + + +NS_ASSUME_NONNULL_BEGIN + +@interface DSAssetUnlockTransactionEntity (CoreDataProperties) + ++ (NSFetchRequest *)fetchRequest; + +@property (nonatomic, assign) uint64_t index; +@property (nonatomic, assign) uint32_t fee; +@property (nonatomic, assign) uint32_t requestedHeight; +@property (nullable, nonatomic, retain) NSData *quorumHash; +@property (nullable, nonatomic, retain) NSData *quorumSignature; + +@end + +NS_ASSUME_NONNULL_END diff --git a/DashSync/shared/Models/Entities/DSAssetUnlockTransactionEntity+CoreDataProperties.m b/DashSync/shared/Models/Entities/DSAssetUnlockTransactionEntity+CoreDataProperties.m new file mode 100644 index 000000000..b5d9b60d6 --- /dev/null +++ b/DashSync/shared/Models/Entities/DSAssetUnlockTransactionEntity+CoreDataProperties.m @@ -0,0 +1,32 @@ +// +// Created by Vladimir Pirogov +// Copyright © 2024 Dash Core Group. All rights reserved. +// +// Licensed under the MIT License (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import "DSAssetUnlockTransactionEntity+CoreDataProperties.h" + +@implementation DSAssetUnlockTransactionEntity (CoreDataProperties) + ++ (NSFetchRequest *)fetchRequest { + return [NSFetchRequest fetchRequestWithEntityName:@"DSAssetUnlockTransactionEntity"]; +} + +@dynamic index; +@dynamic fee; +@dynamic requestedHeight; +@dynamic quorumHash; +@dynamic quorumSignature; + +@end diff --git a/DashSync/shared/Models/Managers/Chain Managers/DSBackgroundManager.m b/DashSync/shared/Models/Managers/Chain Managers/DSBackgroundManager.m index e579e6a1f..a9a9bf897 100644 --- a/DashSync/shared/Models/Managers/Chain Managers/DSBackgroundManager.m +++ b/DashSync/shared/Models/Managers/Chain Managers/DSBackgroundManager.m @@ -86,7 +86,11 @@ - (void)stopBackgroundActivities { } - (BOOL)hasValidHeadersTask { +#if TARGET_OS_IOS return self.terminalHeadersSaveTaskId != UIBackgroundTaskInvalid || [UIApplication sharedApplication].applicationState != UIApplicationStateBackground; +#else + return FALSE; +#endif } @end diff --git a/DashSync/shared/Models/Managers/Service Managers/DSPriceManager.m b/DashSync/shared/Models/Managers/Service Managers/DSPriceManager.m index 59fbebdd0..badf8fbb4 100644 --- a/DashSync/shared/Models/Managers/Service Managers/DSPriceManager.m +++ b/DashSync/shared/Models/Managers/Service Managers/DSPriceManager.m @@ -207,6 +207,7 @@ - (instancetype)init { if (_pricesByCode[systemCurrencyCode] == nil) { // if we don't have currency in our plist fallback to default systemCurrencyCode = DEFAULT_CURRENCY_CODE; + [defaults setObject:systemCurrencyCode forKey:LOCAL_CURRENCY_CODE_KEY]; } self.localCurrencyCode = (userCurrencyCode) ? userCurrencyCode : systemCurrencyCode; diff --git a/DashSync/shared/Models/Masternode/DSMasternodeListService.m b/DashSync/shared/Models/Masternode/DSMasternodeListService.m index 3c8c15700..17c7dd746 100644 --- a/DashSync/shared/Models/Masternode/DSMasternodeListService.m +++ b/DashSync/shared/Models/Masternode/DSMasternodeListService.m @@ -261,7 +261,7 @@ - (void)removeFromRetrievalQueue:(NSData *)masternodeBlockHashData { double count = self.retrievalQueue.count; @synchronized (self.chain.chainManager.syncState) { self.chain.chainManager.syncState.masternodeListSyncInfo.retrievalQueueCount = count; - self.chain.chainManager.syncState.masternodeListSyncInfo.retrievalQueueMaxAmount = self.retrievalQueueMaxAmount; + self.chain.chainManager.syncState.masternodeListSyncInfo.retrievalQueueMaxAmount = (uint32_t) self.retrievalQueueMaxAmount; DSLog(@"[%@] Masternode list queue updated: %f/%lu", self.chain.name, count, self.retrievalQueueMaxAmount); [self.chain.chainManager notifySyncStateChanged]; } @@ -275,7 +275,7 @@ - (void)cleanListsRetrievalQueue { [self.retrievalQueue removeAllObjects]; @synchronized (self.chain.chainManager.syncState) { self.chain.chainManager.syncState.masternodeListSyncInfo.retrievalQueueCount = 0; - self.chain.chainManager.syncState.masternodeListSyncInfo.retrievalQueueMaxAmount = self.retrievalQueueMaxAmount; + self.chain.chainManager.syncState.masternodeListSyncInfo.retrievalQueueMaxAmount = (uint32_t) self.retrievalQueueMaxAmount; DSLog(@"[%@] Masternode list queue cleaned up: 0/%lu", self.chain.name, self.retrievalQueueMaxAmount); [self.chain.chainManager notifySyncStateChanged]; } @@ -302,8 +302,8 @@ - (void)updateMasternodeRetrievalQueue { return [self.store heightForBlockHash:obj1.UInt256] < [self.store heightForBlockHash:obj2.UInt256] ? NSOrderedAscending : NSOrderedDescending; }]; @synchronized (self.chain.chainManager.syncState) { - self.chain.chainManager.syncState.masternodeListSyncInfo.retrievalQueueCount = currentCount; - self.chain.chainManager.syncState.masternodeListSyncInfo.retrievalQueueMaxAmount = self.retrievalQueueMaxAmount; + self.chain.chainManager.syncState.masternodeListSyncInfo.retrievalQueueCount = (uint32_t) currentCount; + self.chain.chainManager.syncState.masternodeListSyncInfo.retrievalQueueMaxAmount = (uint32_t) self.retrievalQueueMaxAmount; DSLog(@"[%@] Masternode list queue updated: %lu/%lu", self.chain.name, currentCount, self.retrievalQueueMaxAmount); [self.chain.chainManager notifySyncStateChanged]; } diff --git a/DashSync/shared/Models/Network/DSPeer.m b/DashSync/shared/Models/Network/DSPeer.m index 62f4b48f2..5a3cadb03 100644 --- a/DashSync/shared/Models/Network/DSPeer.m +++ b/DashSync/shared/Models/Network/DSPeer.m @@ -883,7 +883,7 @@ - (void)acceptVersionMessage:(NSData *)message { } _lastBlockHeight = [message UInt32AtOffset:80 + l.unsignedIntegerValue]; - if (self.version < self.chain.minProtocolVersion || self.version > self.chain.protocolVersion) { + if (self.version < self.chain.minProtocolVersion /*|| self.version > self.chain.protocolVersion*/) { #if MESSAGE_LOGGING DSLogWithLocation(self, @"protocol version %u not supported, valid versions are: [%u, %u], useragent:\"%@\", ", self.version, self.chain.minProtocolVersion, self.chain.protocolVersion, self.useragent); #endif diff --git a/DashSync/shared/Models/Notifications/DSSyncState.m b/DashSync/shared/Models/Notifications/DSSyncState.m index 8b5481480..09f03a4f7 100644 --- a/DashSync/shared/Models/Notifications/DSSyncState.m +++ b/DashSync/shared/Models/Notifications/DSSyncState.m @@ -28,7 +28,7 @@ - (id)copyWithZone:(NSZone *)zone { return copy; } - (NSString *)description { - return [NSString stringWithFormat:@"%u/%u/%u/%u", + return [NSString stringWithFormat:@"%u/%u/%f/%u", self.retrievalQueueCount, self.retrievalQueueMaxAmount, self.storedCount, diff --git a/DashSync/shared/Models/Persistence/Migration/Internal/DSCoreDataMigrationVersion.h b/DashSync/shared/Models/Persistence/Migration/Internal/DSCoreDataMigrationVersion.h index 066472548..ac5cb6549 100644 --- a/DashSync/shared/Models/Persistence/Migration/Internal/DSCoreDataMigrationVersion.h +++ b/DashSync/shared/Models/Persistence/Migration/Internal/DSCoreDataMigrationVersion.h @@ -41,6 +41,7 @@ typedef NS_ENUM(NSInteger, DSCoreDataMigrationVersionValue) DSCoreDataMigrationVersionValue_18 = 18, DSCoreDataMigrationVersionValue_19 = 19, DSCoreDataMigrationVersionValue_20 = 20, + DSCoreDataMigrationVersionValue_21 = 21, }; @interface DSCoreDataMigrationVersion : NSObject diff --git a/DashSync/shared/Models/Persistence/Migration/Internal/DSCoreDataMigrationVersion.m b/DashSync/shared/Models/Persistence/Migration/Internal/DSCoreDataMigrationVersion.m index 5703cf186..e6526f1f1 100644 --- a/DashSync/shared/Models/Persistence/Migration/Internal/DSCoreDataMigrationVersion.m +++ b/DashSync/shared/Models/Persistence/Migration/Internal/DSCoreDataMigrationVersion.m @@ -20,7 +20,7 @@ @implementation DSCoreDataMigrationVersion + (DSCoreDataMigrationVersionValue)current { - return DSCoreDataMigrationVersionValue_20; + return DSCoreDataMigrationVersionValue_21; } + (NSString *)modelResourceForVersion:(DSCoreDataMigrationVersionValue)version { @@ -45,6 +45,7 @@ + (NSString *)modelResourceForVersion:(DSCoreDataMigrationVersionValue)version { case DSCoreDataMigrationVersionValue_18: return @"DashSync 18"; case DSCoreDataMigrationVersionValue_19: return @"DashSync 19"; case DSCoreDataMigrationVersionValue_20: return @"DashSync 20"; + case DSCoreDataMigrationVersionValue_21: return @"DashSync 21"; default: return [NSString stringWithFormat:@"DashSync %ld", (long)version]; } diff --git a/DashSync/shared/Models/Transactions/Base/DSAssetLockTransaction.h b/DashSync/shared/Models/Transactions/Base/DSAssetLockTransaction.h new file mode 100644 index 000000000..241518775 --- /dev/null +++ b/DashSync/shared/Models/Transactions/Base/DSAssetLockTransaction.h @@ -0,0 +1,31 @@ +// +// Created by Vladimir Pirogov +// Copyright © 2024 Dash Core Group. All rights reserved. +// +// Licensed under the MIT License (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import +#import "DSTransaction.h" +#import "DSTransactionOutput.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface DSAssetLockTransaction : DSTransaction + +@property (nonatomic, assign) uint8_t specialTransactionVersion; +@property (nonatomic, strong) NSMutableArray *creditOutputs; + +@end + +NS_ASSUME_NONNULL_END diff --git a/DashSync/shared/Models/Transactions/Base/DSAssetLockTransaction.m b/DashSync/shared/Models/Transactions/Base/DSAssetLockTransaction.m new file mode 100644 index 000000000..1ce845e2a --- /dev/null +++ b/DashSync/shared/Models/Transactions/Base/DSAssetLockTransaction.m @@ -0,0 +1,61 @@ +// +// Created by Vladimir Pirogov +// Copyright © 2024 Dash Core Group. All rights reserved. +// +// Licensed under the MIT License (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import "DSAssetLockTransaction.h" +#import "DSChain.h" +#import "DSTransactionFactory.h" +#import "NSData+Dash.h" + +@implementation DSAssetLockTransaction + +- (instancetype)initWithMessage:(NSData *)message onChain:(DSChain *)chain { + if (!(self = [super initWithMessage:message onChain:chain])) + return nil; + self.type = DSTransactionType_AssetLock; + NSUInteger length = message.length; + uint32_t off = self.payloadOffset; + + if (length - off < 1) return nil; + NSNumber *payloadLengthSize = nil; + __unused uint64_t payloadLength = [message varIntAtOffset:off length:&payloadLengthSize]; + off += payloadLengthSize.unsignedLongValue; + + if (length - off < 1) return nil; + self.specialTransactionVersion = [message UInt8AtOffset:off]; + off += 1; + + NSNumber *l = 0; + if (length - off < 1) return nil; + uint64_t count = (NSUInteger)[message varIntAtOffset:off length:&l]; // output count + off += l.unsignedIntegerValue; + + NSMutableArray *creditOutputs = [NSMutableArray arrayWithCapacity:count]; + for (NSUInteger i = 0; i < count; i++) { // outputs + uint64_t amount = [message UInt64AtOffset:off]; // output amount + off += sizeof(uint64_t); + NSData *outScript = [message dataAtOffset:off length:&l]; // output script + off += l.unsignedIntegerValue; + DSTransactionOutput *transactionOutput = [DSTransactionOutput transactionOutputWithAmount:amount outScript:outScript onChain:self.chain]; + [creditOutputs addObject:transactionOutput]; + } + self.creditOutputs = creditOutputs; + self.payloadOffset = off; + self.txHash = self.data.SHA256_2; + + return self; +} +@end diff --git a/DashSync/shared/Models/Transactions/Base/DSAssetUnlockTransaction.h b/DashSync/shared/Models/Transactions/Base/DSAssetUnlockTransaction.h new file mode 100644 index 000000000..2a825a4de --- /dev/null +++ b/DashSync/shared/Models/Transactions/Base/DSAssetUnlockTransaction.h @@ -0,0 +1,34 @@ +// +// Created by Vladimir Pirogov +// Copyright © 2024 Dash Core Group. All rights reserved. +// +// Licensed under the MIT License (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import +#import "BigIntTypes.h" +#import "DSTransaction.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface DSAssetUnlockTransaction : DSTransaction +@property (nonatomic, assign) uint8_t specialTransactionVersion; +@property (nonatomic, assign) uint64_t index; +@property (nonatomic, assign) uint32_t fee; +@property (nonatomic, assign) uint32_t requestedHeight; +@property (nonatomic, assign) UInt256 quorumHash; +@property (nonatomic, assign) UInt768 quorumSignature; + +@end + +NS_ASSUME_NONNULL_END diff --git a/DashSync/shared/Models/Transactions/Base/DSAssetUnlockTransaction.m b/DashSync/shared/Models/Transactions/Base/DSAssetUnlockTransaction.m new file mode 100644 index 000000000..01824db34 --- /dev/null +++ b/DashSync/shared/Models/Transactions/Base/DSAssetUnlockTransaction.m @@ -0,0 +1,95 @@ +// +// Created by Vladimir Pirogov +// Copyright © 2024 Dash Core Group. All rights reserved. +// +// Licensed under the MIT License (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import "DSAssetUnlockTransaction.h" +#import "DSChain.h" +#import "DSTransactionFactory.h" +#import "NSData+Dash.h" +#import "NSMutableData+Dash.h" + +@implementation DSAssetUnlockTransaction + +- (instancetype)initWithMessage:(NSData *)message onChain:(DSChain *)chain { + if (!(self = [super initWithMessage:message onChain:chain])) + return nil; + self.type = DSTransactionType_AssetUnlock; + NSUInteger length = message.length; + uint32_t off = self.payloadOffset; + + if (length - off < 1) return nil; + NSNumber *payloadLengthSize = nil; + uint64_t payloadLength = [message varIntAtOffset:off length:&payloadLengthSize]; + off += payloadLengthSize.unsignedLongValue; + + if (length - off < 1) return nil; + self.specialTransactionVersion = [message UInt8AtOffset:off]; + off += 1; + if (length - off < 8) return nil; + self.index = [message UInt64AtOffset:off]; + off += 8; + if (length - off < 4) return nil; + self.fee = [message UInt32AtOffset:off]; + off += 4; + if (length - off < 4) return nil; + self.requestedHeight = [message UInt32AtOffset:off]; + off += 4; + + if (length - off < 32) return nil; + self.quorumHash = [message UInt256AtOffset:off]; + off += 32; + if (length - off < 96) return nil; + self.quorumSignature = [message UInt768AtOffset:off]; + off += 96; + + self.payloadOffset = off; + if ([self payloadData].length != payloadLength) return nil; + self.txHash = self.data.SHA256_2; + + return self; + +} +- (BOOL)transactionTypeRequiresInputs { + return NO; +} +- (NSData *)payloadData { + return [self basePayloadData]; +} + +- (NSData *)basePayloadData { + NSMutableData *data = [NSMutableData data]; + [data appendUInt8:self.specialTransactionVersion]; + [data appendUInt64:self.index]; + [data appendUInt32:self.fee]; + [data appendUInt32:self.requestedHeight]; + [data appendUInt256:self.quorumHash]; + [data appendUInt768:self.quorumSignature]; + return data; +} + +- (NSData *)toDataWithSubscriptIndex:(NSUInteger)subscriptIndex { + @synchronized(self) { + NSMutableData *data = [[super toDataWithSubscriptIndex:subscriptIndex] mutableCopy]; + [data appendCountedData:[self payloadData]]; + if (subscriptIndex != NSNotFound) [data appendUInt32:SIGHASH_ALL]; + return data; + } +} +- (size_t)size { + return [super size] + [self payloadData].length; +} + +@end diff --git a/DashSync/shared/Models/Transactions/Base/DSTransaction.m b/DashSync/shared/Models/Transactions/Base/DSTransaction.m index f6f0e1f9f..428853fb9 100644 --- a/DashSync/shared/Models/Transactions/Base/DSTransaction.m +++ b/DashSync/shared/Models/Transactions/Base/DSTransaction.m @@ -28,6 +28,7 @@ #import "DSAccount.h" #import "DSAddressEntity+CoreDataClass.h" +#import "DSAssetUnlockTransaction.h" #import "DSChain.h" #import "DSChainEntity+CoreDataClass.h" #import "DSChainManager.h" @@ -408,7 +409,7 @@ - (NSData *)toDataWithSubscriptIndex:(NSUInteger)subscriptIndex { NSArray *outputs = self.outputs; NSUInteger inputsCount = inputs.count; NSUInteger outputsCount = outputs.count; - BOOL forSigHash = ([self isMemberOfClass:[DSTransaction class]] || [self isMemberOfClass:[DSCreditFundingTransaction class]]) && subscriptIndex != NSNotFound; + BOOL forSigHash = ([self isMemberOfClass:[DSTransaction class]] || [self isMemberOfClass:[DSCreditFundingTransaction class]] || [self isMemberOfClass:[DSAssetUnlockTransaction class]]) && subscriptIndex != NSNotFound; NSUInteger dataSize = 8 + [NSMutableData sizeOfVarInt:inputsCount] + [NSMutableData sizeOfVarInt:outputsCount] + TX_INPUT_SIZE * inputsCount + TX_OUTPUT_SIZE * outputsCount + (forSigHash ? 4 : 0); NSMutableData *d = [NSMutableData dataWithCapacity:dataSize]; diff --git a/DashSync/shared/Models/Transactions/DSTransactionFactory.h b/DashSync/shared/Models/Transactions/DSTransactionFactory.h index a31f8c34d..6f2e876a8 100644 --- a/DashSync/shared/Models/Transactions/DSTransactionFactory.h +++ b/DashSync/shared/Models/Transactions/DSTransactionFactory.h @@ -20,8 +20,8 @@ typedef NS_ENUM(NSUInteger, DSTransactionType) DSTransactionType_ProviderUpdateRevocation = 4, DSTransactionType_Coinbase = 5, DSTransactionType_QuorumCommitment = 6, - DSTransactionType_SubscriptionRegistration = 8, - DSTransactionType_SubscriptionTopUp = 9, + DSTransactionType_AssetLock = 8, + DSTransactionType_AssetUnlock = 9, DSTransactionType_SubscriptionResetKey = 10, DSTransactionType_SubscriptionCloseAccount = 11, DSTransactionType_Transition = 12, diff --git a/DashSync/shared/Models/Transactions/DSTransactionFactory.m b/DashSync/shared/Models/Transactions/DSTransactionFactory.m index e47c7d11a..4bc66e4d9 100644 --- a/DashSync/shared/Models/Transactions/DSTransactionFactory.m +++ b/DashSync/shared/Models/Transactions/DSTransactionFactory.m @@ -5,6 +5,8 @@ // Created by Sam Westrich on 7/12/18. // +#import "DSAssetLockTransaction.h" +#import "DSAssetUnlockTransaction.h" #import "DSTransactionFactory.h" #import "DSBlockchainIdentityCloseTransition.h" #import "DSBlockchainIdentityRegistrationTransition.h" @@ -56,6 +58,10 @@ + (DSTransaction *)transactionWithMessage:(NSData *)message onChain:(DSChain *)c return [DSProviderUpdateRegistrarTransaction transactionWithMessage:message onChain:chain]; case DSTransactionType_ProviderUpdateRevocation: return [DSProviderUpdateRevocationTransaction transactionWithMessage:message onChain:chain]; + case DSTransactionType_AssetLock: + return [DSAssetLockTransaction transactionWithMessage:message onChain:chain]; + case DSTransactionType_AssetUnlock: + return [DSAssetUnlockTransaction transactionWithMessage:message onChain:chain]; case DSTransactionType_QuorumCommitment: return [DSQuorumCommitmentTransaction transactionWithMessage:message onChain:chain]; default: @@ -69,9 +75,9 @@ + (BOOL)ignoreMessagesOfTransactionType:(DSTransactionType)transactionType { return FALSE; case DSTransactionType_Coinbase: return FALSE; - case DSTransactionType_SubscriptionRegistration: + case DSTransactionType_AssetLock: return FALSE; - case DSTransactionType_SubscriptionTopUp: + case DSTransactionType_AssetUnlock: return FALSE; case DSTransactionType_SubscriptionCloseAccount: return FALSE; diff --git a/DashSync/shared/Models/Wallet/DSSpecialTransactionsWalletHolder.m b/DashSync/shared/Models/Wallet/DSSpecialTransactionsWalletHolder.m index 60509ae7d..31a6a65a1 100644 --- a/DashSync/shared/Models/Wallet/DSSpecialTransactionsWalletHolder.m +++ b/DashSync/shared/Models/Wallet/DSSpecialTransactionsWalletHolder.m @@ -5,6 +5,8 @@ // Created by Sam Westrich on 3/5/19. // +#import "DSAssetLockTransaction.h" +#import "DSAssetUnlockTransaction.h" #import "DSSpecialTransactionsWalletHolder.h" #import "DSAddressEntity+CoreDataClass.h" #import "DSChain.h" @@ -37,6 +39,8 @@ @interface DSSpecialTransactionsWalletHolder () @property (nonatomic, strong) NSMutableDictionary *providerUpdateRegistrarTransactions; @property (nonatomic, strong) NSMutableDictionary *providerUpdateRevocationTransactions; @property (nonatomic, strong) NSMutableDictionary *creditFundingTransactions; +@property (nonatomic, strong) NSMutableDictionary *assetLockTransactions; +@property (nonatomic, strong) NSMutableDictionary *assetUnlockTransactions; @property (nonatomic, strong) NSMutableArray *transactionsToSave; @property (nonatomic, strong) NSMutableDictionary *> *transactionsToSaveInBlockSave; @@ -53,6 +57,8 @@ - (instancetype)initWithWallet:(DSWallet *)wallet inContext:(NSManagedObjectCont self.providerUpdateServiceTransactions = [NSMutableDictionary dictionary]; self.providerUpdateRegistrarTransactions = [NSMutableDictionary dictionary]; self.providerUpdateRevocationTransactions = [NSMutableDictionary dictionary]; + self.assetLockTransactions = [NSMutableDictionary dictionary]; + self.assetUnlockTransactions = [NSMutableDictionary dictionary]; self.creditFundingTransactions = [NSMutableDictionary dictionary]; self.managedObjectContext = [NSManagedObjectContext chainContext]; self.wallet = wallet; @@ -62,7 +68,7 @@ - (instancetype)initWithWallet:(DSWallet *)wallet inContext:(NSManagedObjectCont } - (NSArray *)transactionDictionaries { - return @[self.providerRegistrationTransactions, self.providerUpdateServiceTransactions, self.providerUpdateRegistrarTransactions, self.providerUpdateRevocationTransactions, self.creditFundingTransactions]; + return @[self.providerRegistrationTransactions, self.providerUpdateServiceTransactions, self.providerUpdateRegistrarTransactions, self.providerUpdateRevocationTransactions, self.creditFundingTransactions, self.assetLockTransactions, self.assetUnlockTransactions]; } @@ -154,6 +160,18 @@ - (BOOL)registerTransaction:(DSTransaction *)transaction saveImmediately:(BOOL)s [self.creditFundingTransactions setObject:transaction forKey:uint256_data(creditFundingTransaction.creditBurnIdentityIdentifier)]; added = TRUE; } + } else if ([transaction isMemberOfClass:[DSAssetLockTransaction class]]) { + DSAssetLockTransaction *assetLockTransaction = (DSAssetLockTransaction *)transaction; + if (![self.assetLockTransactions objectForKey:uint256_data(assetLockTransaction.txHash)]) { + [self.assetLockTransactions setObject:transaction forKey:uint256_data(assetLockTransaction.txHash)]; + added = TRUE; + } + } else if ([transaction isMemberOfClass:[DSAssetUnlockTransaction class]]) { + DSAssetUnlockTransaction *assetUnlockTransaction = (DSAssetUnlockTransaction *)transaction; + if (![self.assetUnlockTransactions objectForKey:uint256_data(assetUnlockTransaction.txHash)]) { + [self.assetUnlockTransactions setObject:transaction forKey:uint256_data(assetUnlockTransaction.txHash)]; + added = TRUE; + } } else { NSAssert(FALSE, @"unknown transaction type being registered"); return NO; @@ -198,6 +216,12 @@ - (void)loadTransactions { } else if ([transaction isMemberOfClass:[DSCreditFundingTransaction class]]) { DSCreditFundingTransaction *creditFundingTransaction = (DSCreditFundingTransaction *)transaction; [self.creditFundingTransactions setObject:transaction forKey:uint256_data(creditFundingTransaction.creditBurnIdentityIdentifier)]; + } else if ([transaction isMemberOfClass:[DSAssetLockTransaction class]]) { + DSAssetLockTransaction *assetLockTransaction = (DSAssetLockTransaction *)transaction; + [self.assetLockTransactions setObject:transaction forKey:uint256_data(assetLockTransaction.txHash)]; + } else if ([transaction isMemberOfClass:[DSAssetUnlockTransaction class]]) { + DSAssetUnlockTransaction *assetUnlockTransaction = (DSAssetUnlockTransaction *)transaction; + [self.assetUnlockTransactions setObject:transaction forKey:uint256_data(assetUnlockTransaction.txHash)]; } else { //the other ones don't have addresses in payload NSAssert(FALSE, @"Unknown special transaction type"); } diff --git a/Example/DashSync.xcodeproj/project.pbxproj b/Example/DashSync.xcodeproj/project.pbxproj index c38885558..53cc4cd0a 100644 --- a/Example/DashSync.xcodeproj/project.pbxproj +++ b/Example/DashSync.xcodeproj/project.pbxproj @@ -51,7 +51,7 @@ 2AF8A95622847ACB00F8C72D /* TextViewFormCellModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 2AF8A95522847ACB00F8C72D /* TextViewFormCellModel.m */; }; 2AF8A95A22847E5300F8C72D /* DSContactProfileViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 2AF8A95922847E5200F8C72D /* DSContactProfileViewController.m */; }; 2AF8A95D2284820F00F8C72D /* DSContactProfileAvatarView.m in Sources */ = {isa = PBXBuildFile; fileRef = 2AF8A95C2284820F00F8C72D /* DSContactProfileAvatarView.m */; }; - 404946170FF870F9FBA4B3C7 /* libPods-NetworkInfo.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 6675EA01A2AC0589160069A4 /* libPods-NetworkInfo.a */; }; + 4BBAD0ED05B8F29532D1887E /* libPods-NetworkInfo.a in Frameworks */ = {isa = PBXBuildFile; fileRef = FCDB05396B2E9593183904E8 /* libPods-NetworkInfo.a */; }; 6003F58E195388D20070C39A /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6003F58D195388D20070C39A /* Foundation.framework */; }; 6003F590195388D20070C39A /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6003F58F195388D20070C39A /* CoreGraphics.framework */; }; 6003F592195388D20070C39A /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6003F591195388D20070C39A /* UIKit.framework */; }; @@ -64,13 +64,14 @@ 6003F5B1195388D20070C39A /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6003F58D195388D20070C39A /* Foundation.framework */; }; 6003F5B2195388D20070C39A /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6003F591195388D20070C39A /* UIKit.framework */; }; 6003F5BA195388D20070C39A /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 6003F5B8195388D20070C39A /* InfoPlist.strings */; }; + 65F8D081B17C5F08E6BBF4A8 /* libPods-DashSync-DashSync_Example.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 6F6B6FEB4981DE6989D82EB0 /* libPods-DashSync-DashSync_Example.a */; }; 71719F9F1E33DC2100824A3D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 71719F9D1E33DC2100824A3D /* LaunchScreen.storyboard */; }; - 798A60FA627EC43C0AB39611 /* libPods-DashSync-DashSync_Example.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 192956F40996DE819B9D64AC /* libPods-DashSync-DashSync_Example.a */; }; - 83CFCA70892A5DF9F64BA1AA /* libPods-DashSync_Tests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 955D615511918752AF099181 /* libPods-DashSync_Tests.a */; }; 873B8AEB1B1F5CCA007FD442 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 873B8AEA1B1F5CCA007FD442 /* Main.storyboard */; }; 93099D7228E7275400160709 /* MNLIST_1746460.dat in Resources */ = {isa = PBXBuildFile; fileRef = 93099D7028E7275300160709 /* MNLIST_1746460.dat */; }; 93099D7328E7275400160709 /* MNL_1746460_1746516.dat in Resources */ = {isa = PBXBuildFile; fileRef = 93099D7128E7275400160709 /* MNL_1746460_1746516.dat */; }; 937619A526E22E360023BE64 /* BackgroundTasks.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 937619A326E22DCD0023BE64 /* BackgroundTasks.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; + B8D9D66B2CB5A33300D289A9 /* libDashSync-macOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = B8D9D66A2CB5A33300D289A9 /* libDashSync-macOS.a */; }; + D233D44D64AE2AA230F44AA7 /* libPods-DashSync_Tests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = DE90F593715182564EB9A7E8 /* libPods-DashSync_Tests.a */; }; FB0955CC244BBDC400A93675 /* DSContactRelationshipInfoViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = FB0955CB244BBDC400A93675 /* DSContactRelationshipInfoViewController.m */; }; FB0F15A2210490C3000272E6 /* DSTransactionDetailTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = FB0F15A1210490C3000272E6 /* DSTransactionDetailTableViewCell.m */; }; FB0F15A521049432000272E6 /* DSTransactionStatusTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = FB0F15A421049432000272E6 /* DSTransactionStatusTableViewCell.m */; }; @@ -520,8 +521,6 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 131B02E9F838D9B0B88342E6 /* Pods-NetworkInfo.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-NetworkInfo.release.xcconfig"; path = "Pods/Target Support Files/Pods-NetworkInfo/Pods-NetworkInfo.release.xcconfig"; sourceTree = ""; }; - 192956F40996DE819B9D64AC /* libPods-DashSync-DashSync_Example.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-DashSync-DashSync_Example.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 27552411E6D7D4041AC16526 /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = LICENSE; path = ../LICENSE; sourceTree = ""; }; 2A1AC63A20F9012A00B3B79F /* FormSectionModel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FormSectionModel.h; sourceTree = ""; }; 2A1AC63B20F9012A00B3B79F /* FormSectionModel.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = FormSectionModel.m; sourceTree = ""; }; @@ -592,8 +591,8 @@ 2AF8A95922847E5200F8C72D /* DSContactProfileViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DSContactProfileViewController.m; sourceTree = ""; }; 2AF8A95B2284820F00F8C72D /* DSContactProfileAvatarView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DSContactProfileAvatarView.h; sourceTree = ""; }; 2AF8A95C2284820F00F8C72D /* DSContactProfileAvatarView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DSContactProfileAvatarView.m; sourceTree = ""; }; - 2CB0B2B92A8EA70CAE7DC362 /* Pods-DashSync_Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-DashSync_Example.release.xcconfig"; path = "Pods/Target Support Files/Pods-DashSync_Example/Pods-DashSync_Example.release.xcconfig"; sourceTree = ""; }; - 425B12FE369253E7F3A93D58 /* Pods-DashSync-DashSync_Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-DashSync-DashSync_Example.debug.xcconfig"; path = "Pods/Target Support Files/Pods-DashSync-DashSync_Example/Pods-DashSync-DashSync_Example.debug.xcconfig"; sourceTree = ""; }; + 3024E8DE0B1B84642E65E70D /* Pods-DashSync_Tests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-DashSync_Tests.debug.xcconfig"; path = "Target Support Files/Pods-DashSync_Tests/Pods-DashSync_Tests.debug.xcconfig"; sourceTree = ""; }; + 37CF4766B1F8739167BAFE02 /* Pods-NetworkInfo.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-NetworkInfo.debug.xcconfig"; path = "Target Support Files/Pods-NetworkInfo/Pods-NetworkInfo.debug.xcconfig"; sourceTree = ""; }; 6003F58A195388D20070C39A /* DashSync_Example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = DashSync_Example.app; sourceTree = BUILT_PRODUCTS_DIR; }; 6003F58D195388D20070C39A /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 6003F58F195388D20070C39A /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; @@ -612,19 +611,21 @@ 6003F5B7195388D20070C39A /* Tests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Tests-Info.plist"; sourceTree = ""; }; 6003F5B9195388D20070C39A /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; 606FC2411953D9B200FFA9A0 /* Tests-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Tests-Prefix.pch"; sourceTree = ""; }; + 61730B1B3737895F96BE6A54 /* Pods-DashSync-DashSync_Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-DashSync-DashSync_Example.debug.xcconfig"; path = "Target Support Files/Pods-DashSync-DashSync_Example/Pods-DashSync-DashSync_Example.debug.xcconfig"; sourceTree = ""; }; 64A245673BBAE1DA7DAB4907 /* DashSync.podspec */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = DashSync.podspec; path = ../DashSync.podspec; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; - 6675EA01A2AC0589160069A4 /* libPods-NetworkInfo.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-NetworkInfo.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + 6F6B6FEB4981DE6989D82EB0 /* libPods-DashSync-DashSync_Example.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-DashSync-DashSync_Example.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 71719F9E1E33DC2100824A3D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; - 74FDA0D6BCD2D779E20B58FC /* Pods-DashSync-DashSync_Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-DashSync-DashSync_Example.release.xcconfig"; path = "Pods/Target Support Files/Pods-DashSync-DashSync_Example/Pods-DashSync-DashSync_Example.release.xcconfig"; sourceTree = ""; }; + 77374E9036662C743187A1DA /* Pods-DashSync_Tests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-DashSync_Tests.release.xcconfig"; path = "Target Support Files/Pods-DashSync_Tests/Pods-DashSync_Tests.release.xcconfig"; sourceTree = ""; }; 873B8AEA1B1F5CCA007FD442 /* Main.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = Main.storyboard; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 93099D7028E7275300160709 /* MNLIST_1746460.dat */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = MNLIST_1746460.dat; sourceTree = ""; }; 93099D7128E7275400160709 /* MNL_1746460_1746516.dat */ = {isa = PBXFileReference; lastKnownFileType = file; path = MNL_1746460_1746516.dat; sourceTree = ""; }; 937619A326E22DCD0023BE64 /* BackgroundTasks.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = BackgroundTasks.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX11.3.sdk/System/Library/Frameworks/BackgroundTasks.framework; sourceTree = DEVELOPER_DIR; }; - 955D615511918752AF099181 /* libPods-DashSync_Tests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-DashSync_Tests.a"; sourceTree = BUILT_PRODUCTS_DIR; }; - 98472781BAD8800EFF391FA4 /* Pods-DashSync_Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-DashSync_Example.debug.xcconfig"; path = "Pods/Target Support Files/Pods-DashSync_Example/Pods-DashSync_Example.debug.xcconfig"; sourceTree = ""; }; - C90A9AD2C32828341F0E6915 /* Pods-DashSync_Tests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-DashSync_Tests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-DashSync_Tests/Pods-DashSync_Tests.debug.xcconfig"; sourceTree = ""; }; - D1B8FECBB1652E781A9E4620 /* Pods-NetworkInfo.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-NetworkInfo.debug.xcconfig"; path = "Pods/Target Support Files/Pods-NetworkInfo/Pods-NetworkInfo.debug.xcconfig"; sourceTree = ""; }; - DFA886AB709D97089A70E82A /* Pods-DashSync_Tests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-DashSync_Tests.release.xcconfig"; path = "Pods/Target Support Files/Pods-DashSync_Tests/Pods-DashSync_Tests.release.xcconfig"; sourceTree = ""; }; + B8D9D6682CB5A11B00D289A9 /* libDashSync-macOS.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; path = "libDashSync-macOS.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + B8D9D66A2CB5A33300D289A9 /* libDashSync-macOS.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; path = "libDashSync-macOS.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + B8D9D66C2CB5A36600D289A9 /* DashSharedCore.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = DashSharedCore.xcframework; path = "../../dash-shared-core/dash-spv-apple-bindings/DashSharedCore/framework/DashSharedCore.xcframework"; sourceTree = ""; }; + BD44FCB7175424B2BE7993BB /* Pods-DashSync-DashSync_Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-DashSync-DashSync_Example.release.xcconfig"; path = "Target Support Files/Pods-DashSync-DashSync_Example/Pods-DashSync-DashSync_Example.release.xcconfig"; sourceTree = ""; }; + D97E3B2F9438560328BFE431 /* Pods-NetworkInfo.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-NetworkInfo.release.xcconfig"; path = "Target Support Files/Pods-NetworkInfo/Pods-NetworkInfo.release.xcconfig"; sourceTree = ""; }; + DE90F593715182564EB9A7E8 /* libPods-DashSync_Tests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-DashSync_Tests.a"; sourceTree = BUILT_PRODUCTS_DIR; }; E47ABFD6469F1FD556CDA6C7 /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = net.daringfireball.markdown; name = README.md; path = ../README.md; sourceTree = ""; }; FB0955CA244BBDC400A93675 /* DSContactRelationshipInfoViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DSContactRelationshipInfoViewController.h; sourceTree = ""; }; FB0955CB244BBDC400A93675 /* DSContactRelationshipInfoViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DSContactRelationshipInfoViewController.m; sourceTree = ""; }; @@ -1190,6 +1191,7 @@ FBF31B6D2231C53900393301 /* DSSignPayloadViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DSSignPayloadViewController.h; sourceTree = ""; }; FBF31B6E2231C53900393301 /* DSSignPayloadViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DSSignPayloadViewController.m; sourceTree = ""; }; FBF31B7022328AA800393301 /* DSProviderTransactionsTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DSProviderTransactionsTests.m; sourceTree = ""; }; + FCDB05396B2E9593183904E8 /* libPods-NetworkInfo.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-NetworkInfo.a"; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -1200,7 +1202,7 @@ 6003F590195388D20070C39A /* CoreGraphics.framework in Frameworks */, 6003F592195388D20070C39A /* UIKit.framework in Frameworks */, 6003F58E195388D20070C39A /* Foundation.framework in Frameworks */, - 798A60FA627EC43C0AB39611 /* libPods-DashSync-DashSync_Example.a in Frameworks */, + 65F8D081B17C5F08E6BBF4A8 /* libPods-DashSync-DashSync_Example.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1212,7 +1214,7 @@ 6003F5B0195388D20070C39A /* XCTest.framework in Frameworks */, 6003F5B2195388D20070C39A /* UIKit.framework in Frameworks */, 6003F5B1195388D20070C39A /* Foundation.framework in Frameworks */, - 83CFCA70892A5DF9F64BA1AA /* libPods-DashSync_Tests.a in Frameworks */, + D233D44D64AE2AA230F44AA7 /* libPods-DashSync_Tests.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1220,13 +1222,27 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 404946170FF870F9FBA4B3C7 /* libPods-NetworkInfo.a in Frameworks */, + B8D9D66B2CB5A33300D289A9 /* libDashSync-macOS.a in Frameworks */, + 4BBAD0ED05B8F29532D1887E /* libPods-NetworkInfo.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 15D149D9AD161D779756AC18 /* Pods */ = { + isa = PBXGroup; + children = ( + 61730B1B3737895F96BE6A54 /* Pods-DashSync-DashSync_Example.debug.xcconfig */, + BD44FCB7175424B2BE7993BB /* Pods-DashSync-DashSync_Example.release.xcconfig */, + 3024E8DE0B1B84642E65E70D /* Pods-DashSync_Tests.debug.xcconfig */, + 77374E9036662C743187A1DA /* Pods-DashSync_Tests.release.xcconfig */, + 37CF4766B1F8739167BAFE02 /* Pods-NetworkInfo.debug.xcconfig */, + D97E3B2F9438560328BFE431 /* Pods-NetworkInfo.release.xcconfig */, + ); + path = Pods; + sourceTree = ""; + }; 2A1B55BC2226B15A008FED65 /* Contacts */ = { isa = PBXGroup; children = ( @@ -1360,7 +1376,7 @@ FB974F3125AE7A2200A1DCE7 /* CI */, FB974F5025AE8E7000A1DCE7 /* Docs */, FB974F0F25AE595700A1DCE7 /* Linting */, - 83DC6095687FDE098549FF30 /* Pods */, + 15D149D9AD161D779756AC18 /* Pods */, ); sourceTree = ""; }; @@ -1377,14 +1393,17 @@ 6003F58C195388D20070C39A /* Frameworks */ = { isa = PBXGroup; children = ( + B8D9D66C2CB5A36600D289A9 /* DashSharedCore.xcframework */, + B8D9D66A2CB5A33300D289A9 /* libDashSync-macOS.a */, + B8D9D6682CB5A11B00D289A9 /* libDashSync-macOS.a */, 937619A326E22DCD0023BE64 /* BackgroundTasks.framework */, 6003F58D195388D20070C39A /* Foundation.framework */, 6003F58F195388D20070C39A /* CoreGraphics.framework */, 6003F591195388D20070C39A /* UIKit.framework */, 6003F5AF195388D20070C39A /* XCTest.framework */, - 955D615511918752AF099181 /* libPods-DashSync_Tests.a */, - 6675EA01A2AC0589160069A4 /* libPods-NetworkInfo.a */, - 192956F40996DE819B9D64AC /* libPods-DashSync-DashSync_Example.a */, + 6F6B6FEB4981DE6989D82EB0 /* libPods-DashSync-DashSync_Example.a */, + DE90F593715182564EB9A7E8 /* libPods-DashSync_Tests.a */, + FCDB05396B2E9593183904E8 /* libPods-NetworkInfo.a */, ); name = Frameworks; sourceTree = ""; @@ -1470,21 +1489,6 @@ name = "Podspec Metadata"; sourceTree = ""; }; - 83DC6095687FDE098549FF30 /* Pods */ = { - isa = PBXGroup; - children = ( - 98472781BAD8800EFF391FA4 /* Pods-DashSync_Example.debug.xcconfig */, - 2CB0B2B92A8EA70CAE7DC362 /* Pods-DashSync_Example.release.xcconfig */, - C90A9AD2C32828341F0E6915 /* Pods-DashSync_Tests.debug.xcconfig */, - DFA886AB709D97089A70E82A /* Pods-DashSync_Tests.release.xcconfig */, - D1B8FECBB1652E781A9E4620 /* Pods-NetworkInfo.debug.xcconfig */, - 131B02E9F838D9B0B88342E6 /* Pods-NetworkInfo.release.xcconfig */, - 425B12FE369253E7F3A93D58 /* Pods-DashSync-DashSync_Example.debug.xcconfig */, - 74FDA0D6BCD2D779E20B58FC /* Pods-DashSync-DashSync_Example.release.xcconfig */, - ); - name = Pods; - sourceTree = ""; - }; FB0F15B421090405000272E6 /* Blockchain Identities */ = { isa = PBXGroup; children = ( @@ -2333,12 +2337,12 @@ isa = PBXNativeTarget; buildConfigurationList = 6003F5BF195388D20070C39A /* Build configuration list for PBXNativeTarget "DashSync_Example" */; buildPhases = ( - BA464DCB59BC59A2B2C9AAD7 /* [CP] Check Pods Manifest.lock */, + E5F7123626737B797889229A /* [CP] Check Pods Manifest.lock */, FB5A0FA7219506140079CF42 /* ShellScript */, 6003F586195388D20070C39A /* Sources */, 6003F587195388D20070C39A /* Frameworks */, 6003F588195388D20070C39A /* Resources */, - F3524DD5332FD019D466B225 /* [CP] Copy Pods Resources */, + CD1F79E08B3F4F0921F064A8 /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -2353,7 +2357,7 @@ isa = PBXNativeTarget; buildConfigurationList = 6003F5C2195388D20070C39A /* Build configuration list for PBXNativeTarget "DashSync_Tests" */; buildPhases = ( - 1A450F2773F81BAA9F430A99 /* [CP] Check Pods Manifest.lock */, + D4B84AE4F85D9FB04692A770 /* [CP] Check Pods Manifest.lock */, 6003F5AA195388D20070C39A /* Sources */, 6003F5AB195388D20070C39A /* Frameworks */, 6003F5AC195388D20070C39A /* Resources */, @@ -2372,11 +2376,11 @@ isa = PBXNativeTarget; buildConfigurationList = FB9C9EFE25B80DB40039880E /* Build configuration list for PBXNativeTarget "NetworkInfo" */; buildPhases = ( - 2B9966A4344269C863326096 /* [CP] Check Pods Manifest.lock */, + 8CDF557444C449CF3402DD40 /* [CP] Check Pods Manifest.lock */, FB9C9EF625B80DB40039880E /* Sources */, FB9C9EF725B80DB40039880E /* Frameworks */, FB9C9EF825B80DB40039880E /* CopyFiles */, - 2B57EF3BDD3D325283813C84 /* [CP] Copy Pods Resources */, + 544387655732F2E6FFDFAD9D /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -2398,15 +2402,16 @@ ORGANIZATIONNAME = "Dash Core Group"; TargetAttributes = { 6003F589195388D20070C39A = { - DevelopmentTeam = 44RJ69WHFF; + ProvisioningStyle = Manual; }; 6003F5AD195388D20070C39A = { DevelopmentTeam = 44RJ69WHFF; + ProvisioningStyle = Manual; TestTargetID = 6003F589195388D20070C39A; }; FB9C9EF925B80DB40039880E = { CreatedOnToolsVersion = 12.3; - DevelopmentTeam = 44RJ69WHFF; + DevelopmentTeam = VYNC8YJV73; ProvisioningStyle = Automatic; }; }; @@ -2760,25 +2765,7 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 1A450F2773F81BAA9F430A99 /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-DashSync_Tests-checkManifestLockResult.txt", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; - }; - 2B57EF3BDD3D325283813C84 /* [CP] Copy Pods Resources */ = { + 544387655732F2E6FFDFAD9D /* [CP] Copy Pods Resources */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -2800,7 +2787,7 @@ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-NetworkInfo/Pods-NetworkInfo-resources.sh\"\n"; showEnvVarsInLog = 0; }; - 2B9966A4344269C863326096 /* [CP] Check Pods Manifest.lock */ = { + 8CDF557444C449CF3402DD40 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -2822,44 +2809,70 @@ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - BA464DCB59BC59A2B2C9AAD7 /* [CP] Check Pods Manifest.lock */ = { + CD1F79E08B3F4F0921F064A8 /* [CP] Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-DashSync-DashSync_Example/Pods-DashSync-DashSync_Example-resources.sh", + "${PODS_CONFIGURATION_BUILD_DIR}/DashSync-iOS/DashSync.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/Protobuf-iOS/Protobuf_Privacy.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/gRPC-iOS/gRPCCertificates.bundle", + ); + name = "[CP] Copy Pods Resources"; + outputPaths = ( + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/DashSync.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Protobuf_Privacy.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/gRPCCertificates.bundle", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-DashSync-DashSync_Example/Pods-DashSync-DashSync_Example-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; + D4B84AE4F85D9FB04692A770 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); + inputFileListPaths = ( + ); inputPaths = ( "${PODS_PODFILE_DIR_PATH}/Podfile.lock", "${PODS_ROOT}/Manifest.lock", ); name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-DashSync-DashSync_Example-checkManifestLockResult.txt", + "$(DERIVED_FILE_DIR)/Pods-DashSync_Tests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - F3524DD5332FD019D466B225 /* [CP] Copy Pods Resources */ = { + E5F7123626737B797889229A /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); + inputFileListPaths = ( + ); inputPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-DashSync-DashSync_Example/Pods-DashSync-DashSync_Example-resources.sh", - "${PODS_CONFIGURATION_BUILD_DIR}/DashSync-iOS/DashSync.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/Protobuf-iOS/Protobuf_Privacy.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/gRPC-iOS/gRPCCertificates.bundle", + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( ); - name = "[CP] Copy Pods Resources"; outputPaths = ( - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/DashSync.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Protobuf_Privacy.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/gRPCCertificates.bundle", + "$(DERIVED_FILE_DIR)/Pods-DashSync-DashSync_Example-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-DashSync-DashSync_Example/Pods-DashSync-DashSync_Example-resources.sh\"\n"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; FB5A0FA7219506140079CF42 /* ShellScript */ = { @@ -3219,10 +3232,12 @@ }; 6003F5C0195388D20070C39A /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 425B12FE369253E7F3A93D58 /* Pods-DashSync-DashSync_Example.debug.xcconfig */; + baseConfigurationReference = 61730B1B3737895F96BE6A54 /* Pods-DashSync-DashSync_Example.debug.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - DEVELOPMENT_TEAM = 44RJ69WHFF; + CODE_SIGN_IDENTITY = "Sign to Run Locally"; + CODE_SIGN_STYLE = Manual; + DEVELOPMENT_TEAM = ""; EXCLUDED_ARCHS = ""; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "DashSync/DashSync-Prefix.pch"; @@ -3273,16 +3288,18 @@ ); PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.demo.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; WRAPPER_EXTENSION = app; }; name = Debug; }; 6003F5C1195388D20070C39A /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 74FDA0D6BCD2D779E20B58FC /* Pods-DashSync-DashSync_Example.release.xcconfig */; + baseConfigurationReference = BD44FCB7175424B2BE7993BB /* Pods-DashSync-DashSync_Example.release.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - DEVELOPMENT_TEAM = 44RJ69WHFF; + CODE_SIGN_STYLE = Manual; + DEVELOPMENT_TEAM = ""; EXCLUDED_ARCHS = ""; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "DashSync/DashSync-Prefix.pch"; @@ -3333,16 +3350,19 @@ ); PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.demo.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; WRAPPER_EXTENSION = app; }; name = Release; }; 6003F5C3195388D20070C39A /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = C90A9AD2C32828341F0E6915 /* Pods-DashSync_Tests.debug.xcconfig */; + baseConfigurationReference = 3024E8DE0B1B84642E65E70D /* Pods-DashSync_Tests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; - DEVELOPMENT_TEAM = 44RJ69WHFF; + CODE_SIGN_IDENTITY = "Sign to Run Locally"; + CODE_SIGN_STYLE = Manual; + DEVELOPMENT_TEAM = ""; "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = ""; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "Tests/Tests-Prefix.pch"; @@ -3361,7 +3381,7 @@ }; 6003F5C4195388D20070C39A /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = DFA886AB709D97089A70E82A /* Pods-DashSync_Tests.release.xcconfig */; + baseConfigurationReference = 77374E9036662C743187A1DA /* Pods-DashSync_Tests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; DEVELOPMENT_TEAM = 44RJ69WHFF; @@ -3379,7 +3399,7 @@ }; FB9C9EFF25B80DB40039880E /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = D1B8FECBB1652E781A9E4620 /* Pods-NetworkInfo.debug.xcconfig */; + baseConfigurationReference = 37CF4766B1F8739167BAFE02 /* Pods-NetworkInfo.debug.xcconfig */; buildSettings = { CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; @@ -3390,13 +3410,53 @@ CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; DEBUG_INFORMATION_FORMAT = dwarf; - DEVELOPMENT_TEAM = 44RJ69WHFF; + DEVELOPMENT_TEAM = VYNC8YJV73; ENABLE_HARDENED_RUNTIME = YES; "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = ""; GCC_C_LANGUAGE_STANDARD = gnu11; MACOSX_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; + OTHER_LDFLAGS = ( + "$(inherited)", + "-ObjC", + "-l\"BoringSSL-GRPC-macOS\"", + "-l\"CocoaImageHashing-macOS\"", + "-l\"CocoaLumberjack-macOS\"", + "-l\"DAPI-GRPC-macOS\"", + "-l\"DSDynamicOptions-macOS\"", + "-l\"DashSync-macOS\"", + "-l\"Protobuf-macOS\"", + "-l\"SDWebImage-macOS\"", + "-l\"TinyCborObjc-macOS\"", + "-l\"abseil-macOS\"", + "-l\"bz2\"", + "-l\"c++\"", + "-l\"dash_shared_core_macos\"", + "-l\"gRPC-Core-macOS\"", + "-l\"gRPC-ProtoRPC-macOS\"", + "-l\"gRPC-RxLibrary-macOS\"", + "-l\"gRPC-macOS\"", + "-l\"resolv\"", + "-l\"sqlite3\"", + "-l\"tinycbor-macOS\"", + "-l\"z\"", + "-framework", + "\"BackgroundTasks\"", + "-framework", + "\"Cocoa\"", + "-framework", + "\"CoreData\"", + "-framework", + "\"Foundation\"", + "-framework", + "\"ImageIO\"", + "-framework", + "\"Security\"", + "-framework", + "\"SystemConfiguration\"", + "\"-ld_classic\"", + ); PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; SDKROOT = macosx; @@ -3405,7 +3465,7 @@ }; FB9C9F0025B80DB40039880E /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 131B02E9F838D9B0B88342E6 /* Pods-NetworkInfo.release.xcconfig */; + baseConfigurationReference = D97E3B2F9438560328BFE431 /* Pods-NetworkInfo.release.xcconfig */; buildSettings = { CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; @@ -3417,13 +3477,53 @@ CODE_SIGN_STYLE = Automatic; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEVELOPMENT_TEAM = 44RJ69WHFF; + DEVELOPMENT_TEAM = VYNC8YJV73; ENABLE_HARDENED_RUNTIME = YES; "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = ""; GCC_C_LANGUAGE_STANDARD = gnu11; MACOSX_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; + OTHER_LDFLAGS = ( + "$(inherited)", + "-ObjC", + "-l\"BoringSSL-GRPC-macOS\"", + "-l\"CocoaImageHashing-macOS\"", + "-l\"CocoaLumberjack-macOS\"", + "-l\"DAPI-GRPC-macOS\"", + "-l\"DSDynamicOptions-macOS\"", + "-l\"DashSync-macOS\"", + "-l\"Protobuf-macOS\"", + "-l\"SDWebImage-macOS\"", + "-l\"TinyCborObjc-macOS\"", + "-l\"abseil-macOS\"", + "-l\"bz2\"", + "-l\"c++\"", + "-l\"dash_shared_core_macos\"", + "-l\"gRPC-Core-macOS\"", + "-l\"gRPC-ProtoRPC-macOS\"", + "-l\"gRPC-RxLibrary-macOS\"", + "-l\"gRPC-macOS\"", + "-l\"resolv\"", + "-l\"sqlite3\"", + "-l\"tinycbor-macOS\"", + "-l\"z\"", + "-framework", + "\"BackgroundTasks\"", + "-framework", + "\"Cocoa\"", + "-framework", + "\"CoreData\"", + "-framework", + "\"Foundation\"", + "-framework", + "\"ImageIO\"", + "-framework", + "\"Security\"", + "-framework", + "\"SystemConfiguration\"", + "\"-ld_classic\"", + ); PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; SDKROOT = macosx; diff --git a/Example/DashSync/DSTransactionDetailViewController.m b/Example/DashSync/DSTransactionDetailViewController.m index 8ba0bbde3..ed4552701 100644 --- a/Example/DashSync/DSTransactionDetailViewController.m +++ b/Example/DashSync/DSTransactionDetailViewController.m @@ -6,6 +6,8 @@ // Copyright © 2018 Dash Core Group. All rights reserved. // +#import "DSAssetLockTransaction.h" +#import "DSAssetUnlockTransaction.h" #import "DSTransactionDetailViewController.h" #import "BRCopyLabel.h" #import "DSTransactionAmountTableViewCell.h" @@ -286,6 +288,10 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N cell.statusLabel.text = @"Coinbase Transaction"; } else if ([self.transaction isMemberOfClass:[DSCreditFundingTransaction class]]) { cell.statusLabel.text = @"Classical Credit Funding Transaction"; + } else if ([self.transaction isMemberOfClass:[DSAssetLockTransaction class]]) { + cell.statusLabel.text = @"Asset Lock Transaction"; + } else if ([self.transaction isMemberOfClass:[DSAssetUnlockTransaction class]]) { + cell.statusLabel.text = @"Asset Unlock Transaction"; } else { cell.statusLabel.text = @"Classical Transaction"; } diff --git a/Example/Podfile b/Example/Podfile index 85e92f967..575852f60 100644 --- a/Example/Podfile +++ b/Example/Podfile @@ -1,6 +1,7 @@ def common_pods # pod 'DashSharedCore', :git => 'https://github.com/dashpay/dash-shared-core.git', :branch => 'fix/core-20-test-additional' -# pod 'DashSharedCore', :git => 'https://github.com/dashpay/dash-shared-core.git', :commit => 'e2dc943' +# pod 'DashSharedCore', :git => 'https://github.com/dashpay/dash-shared-core.git', :commit => '7dda9489a1d23221032e2b050c31a317a6e95631' +# pod 'DashSharedCore', :path => '../../dash-shared-core/' pod 'DashSync', :path => '../' pod 'SDWebImage', '5.14.3' pod 'CocoaImageHashing', :git => 'https://github.com/ameingast/cocoaimagehashing.git', :commit => 'ad01eee' @@ -25,17 +26,21 @@ target 'NetworkInfo' do end post_install do |installer| - installer.pods_project.targets.each do |target| - # fixes warnings about unsupported Deployment Target in Xcode 10 - target.build_configurations.each do |config| - config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '13.0' - end - # Hide warnings for specific pods - if ["gRPC"].include? target.name - target.build_configurations.each do |config| - config.build_settings['GCC_WARN_INHIBIT_ALL_WARNINGS'] = 'YES' - end + installer.pods_project.targets.each do |target| + # fixes warnings about unsupported Deployment Target in Xcode 10 + target.build_configurations.each do |config| + config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '13.0' + end + + # Ensure the GCC_WARN_INHIBIT_ALL_WARNINGS flag is removed for BoringSSL-GRPC and BoringSSL-GRPC-iOS + if ['BoringSSL-GRPC', 'BoringSSL-GRPC-iOS', 'BoringSSL-GRPC-macOS'].include? target.name + target.source_build_phase.files.each do |file| + if file.settings && file.settings['COMPILER_FLAGS'] + flags = file.settings['COMPILER_FLAGS'].split + flags.reject! { |flag| flag == '-GCC_WARN_INHIBIT_ALL_WARNINGS' } + file.settings['COMPILER_FLAGS'] = flags.join(' ') + end end + end end end - diff --git a/Example/Podfile.lock b/Example/Podfile.lock index b0fb2e24d..c12111213 100644 --- a/Example/Podfile.lock +++ b/Example/Podfile.lock @@ -586,11 +586,11 @@ PODS: - "!ProtoCompiler-gRPCPlugin (~> 1.0)" - DAPI-GRPC/Messages - gRPC-ProtoRPC - - DashSharedCore (0.4.16) + - DashSharedCore (0.4.19) - DashSync (0.1.0): - CocoaLumberjack (= 3.7.2) - DAPI-GRPC (= 0.22.0-dev.8) - - DashSharedCore (= 0.4.16) + - DashSharedCore (= 0.4.19) - DSDynamicOptions (= 0.1.2) - DWAlertController (= 0.2.1) - TinyCborObjc (= 0.4.6) @@ -657,7 +657,7 @@ PODS: - gRPC/Interface-Legacy (1.49.0): - gRPC-RxLibrary/Interface (= 1.49.0) - KVO-MVVM (0.5.1) - - Protobuf (3.27.2) + - Protobuf (3.28.3) - SDWebImage (5.14.3): - SDWebImage/Core (= 5.14.3) - SDWebImage/Core (5.14.3) @@ -712,8 +712,8 @@ SPEC CHECKSUMS: CocoaImageHashing: 8656031d0899abe6c1c415827de43e9798189c53 CocoaLumberjack: b7e05132ff94f6ae4dfa9d5bce9141893a21d9da DAPI-GRPC: 138d62523bbfe7e88a39896f1053c0bc12390d9f - DashSharedCore: 81d3327cbea4103114b768eed4d36e742417b63b - DashSync: 5c4dea6e4ef83df33f23f85b7f2b97ef6843de87 + DashSharedCore: 009f29640756017406ee2b0ab5f1073f1856f85e + DashSync: f0ee76fe1409c9071bcee21202cc8002944c801d DSDynamicOptions: 347cc5d2c4e080eb3de6a86719ad3d861b82adfc DWAlertController: 5f4cd8adf90336331c054857f709f5f8d4b16a5b gRPC: 64f36d689b2ecd99c4351f74e6f91347cdc65d9f @@ -721,11 +721,11 @@ SPEC CHECKSUMS: gRPC-ProtoRPC: 1c223e0f1732bb8d0b9e9e0ea60cc0fe995b8e2d gRPC-RxLibrary: 92327f150e11cf3b1c0f52e083944fd9f5cb5d1e KVO-MVVM: 4df3afd1f7ebcb69735458b85db59c4271ada7c6 - Protobuf: fb2c13674723f76ff6eede14f78847a776455fa2 + Protobuf: 5a8a7781d8e1004302f108977ac2d5b99323146f SDWebImage: 9c36e66c8ce4620b41a7407698dda44211a96764 tinycbor: d4d71dddda1f8392fbb4249f63faf8552f327590 TinyCborObjc: 5204540fb90ff0c40fb22d408fa51bab79d78a80 -PODFILE CHECKSUM: 8cb419eb95422ed65fbdc41960e405e8cc54dda7 +PODFILE CHECKSUM: 426e3f03a062ea4c149b0500478f0fe6bbe5bab5 COCOAPODS: 1.15.2 diff --git a/Example/Tests/DSTransactionTests.m b/Example/Tests/DSTransactionTests.m index 7ae28a403..200cf6dc3 100644 --- a/Example/Tests/DSTransactionTests.m +++ b/Example/Tests/DSTransactionTests.m @@ -8,6 +8,7 @@ #import +#import "DSAssetUnlockTransaction.h" #import "DSAuthenticationKeysDerivationPath.h" #import "DSBlockchainIdentityCloseTransition.h" #import "DSBlockchainIdentityRegistrationTransition.h" @@ -91,6 +92,11 @@ - (void)testTransaction { XCTAssertEqualObjects(d, tx.data, @"[DSTransaction transactionWithMessage:]"); processor_destroy_opaque_key(k); } +- (void)testAssetUnlockTx { + NSData *transactionData = @"030009000001a02ffa0d000000001976a9146641c13e0ee2ce2cdf70852bb7ae9853c01f29a988ac0000000091014e00000000000000be000000273e11004130304f40d1820b5e239baecd35249263b1206a1c76e66053ec39a04501000093d3851b6bda0518da51ff8932ef3570be20e7978369dd312947326e135004915c10b5fe0e31e572c40f41cdd941bed8115e314573faf472e1065ca370bdff486db8eaa6bbcba3943e6e5ada6a3c30dee70e39811814e59e1ffc54f3c9fca04f".hexToData; + DSAssetUnlockTransaction *tx = [[DSAssetUnlockTransaction alloc] initWithMessage:transactionData onChain:[DSChain testnet]]; + XCTAssert(tx, @"Bad Asset Unlock Tx"); +} - (void)testBlockchainIdentityFundingTransactionUniqueId { NSData *transactionData = @"0300000002b74030bbda6edd804d4bfb2bdbbb7c207a122f3af2f6283de17074a42c6a5417020000006b483045022100815b175ab1a8fde7d651d78541ba73d2e9b297e6190f5244e1957004aa89d3c902207e1b164499569c1f282fe5533154495186484f7db22dc3dc1ccbdc9b47d997250121027f69794d6c4c942392b1416566aef9eaade43fbf07b63323c721b4518127baadffffffffb74030bbda6edd804d4bfb2bdbbb7c207a122f3af2f6283de17074a42c6a5417010000006b483045022100a7c94fe1bb6ffb66d2bb90fd8786f5bd7a0177b0f3af20342523e64291f51b3e02201f0308f1034c0f6024e368ca18949be42a896dda434520fa95b5651dc5ad3072012102009e3f2eb633ee12c0143f009bf773155a6c1d0f14271d30809b1dc06766aff0ffffffff031027000000000000166a1414ec6c36e6c39a9181f3a261a08a5171425ac5e210270000000000001976a91414ec6c36e6c39a9181f3a261a08a5171425ac5e288acc443953b000000001976a9140d1775b9ed85abeb19fd4a7d8cc88b08a29fe6de88ac00000000".hexToData;