diff --git a/.gitignore b/.gitignore
index 4102cec3e..0e6907b4f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -89,4 +89,6 @@ android/key.properties
**/tool/.secrets-prod.json
**/lib/.secrets.g.dart
-vendor/
\ No newline at end of file
+vendor/
+
+android/app/.cxx/**
diff --git a/assets/electrum_server_list.yml b/assets/electrum_server_list.yml
index 4baf56aec..0331f42ea 100644
--- a/assets/electrum_server_list.yml
+++ b/assets/electrum_server_list.yml
@@ -1,2 +1,4 @@
-
- uri: electrum2.hodlister.co:50002
\ No newline at end of file
+ uri: electrum2.hodlister.co:50002
+-
+ uri: bitcoin.electrumx.multicoin.co:50002
\ No newline at end of file
diff --git a/assets/images/2.0x/back_vector.png b/assets/images/2.0x/back_vector.png
new file mode 100644
index 000000000..8d9239aa9
Binary files /dev/null and b/assets/images/2.0x/back_vector.png differ
diff --git a/assets/images/2.0x/question_mark.png b/assets/images/2.0x/question_mark.png
new file mode 100644
index 000000000..37f5edfcc
Binary files /dev/null and b/assets/images/2.0x/question_mark.png differ
diff --git a/assets/images/3.0x/back_vector.png b/assets/images/3.0x/back_vector.png
new file mode 100644
index 000000000..d01030e5d
Binary files /dev/null and b/assets/images/3.0x/back_vector.png differ
diff --git a/assets/images/3.0x/question_mark.png b/assets/images/3.0x/question_mark.png
new file mode 100644
index 000000000..7b08436f2
Binary files /dev/null and b/assets/images/3.0x/question_mark.png differ
diff --git a/assets/images/back_vector.png b/assets/images/back_vector.png
new file mode 100644
index 000000000..8717a3463
Binary files /dev/null and b/assets/images/back_vector.png differ
diff --git a/assets/images/question_mark.png b/assets/images/question_mark.png
new file mode 100644
index 000000000..8a4b4fa70
Binary files /dev/null and b/assets/images/question_mark.png differ
diff --git a/ios/Flutter/.last_build_id b/ios/Flutter/.last_build_id
new file mode 100644
index 000000000..8e3e3da7e
--- /dev/null
+++ b/ios/Flutter/.last_build_id
@@ -0,0 +1 @@
+a2dce69f54a78f5b00e19850e4b2d402
\ No newline at end of file
diff --git a/ios/Podfile.lock b/ios/Podfile.lock
index 959c597e1..64e81a4e8 100644
--- a/ios/Podfile.lock
+++ b/ios/Podfile.lock
@@ -44,6 +44,8 @@ PODS:
- Flutter
- shared_preferences (0.0.1):
- Flutter
+ - shared_preferences_linux (0.0.1):
+ - Flutter
- shared_preferences_macos (0.0.1):
- Flutter
- shared_preferences_web (0.0.1):
@@ -51,6 +53,8 @@ PODS:
- SwiftProtobuf (1.8.0)
- url_launcher (0.0.1):
- Flutter
+ - url_launcher_linux (0.0.1):
+ - Flutter
- url_launcher_macos (0.0.1):
- Flutter
- url_launcher_web (0.0.1):
@@ -71,9 +75,11 @@ DEPENDENCIES:
- path_provider_macos (from `.symlinks/plugins/path_provider_macos/ios`)
- share (from `.symlinks/plugins/share/ios`)
- shared_preferences (from `.symlinks/plugins/shared_preferences/ios`)
+ - shared_preferences_linux (from `.symlinks/plugins/shared_preferences_linux/ios`)
- shared_preferences_macos (from `.symlinks/plugins/shared_preferences_macos/ios`)
- shared_preferences_web (from `.symlinks/plugins/shared_preferences_web/ios`)
- url_launcher (from `.symlinks/plugins/url_launcher/ios`)
+ - url_launcher_linux (from `.symlinks/plugins/url_launcher_linux/ios`)
- url_launcher_macos (from `.symlinks/plugins/url_launcher_macos/ios`)
- url_launcher_web (from `.symlinks/plugins/url_launcher_web/ios`)
@@ -111,12 +117,16 @@ EXTERNAL SOURCES:
:path: ".symlinks/plugins/share/ios"
shared_preferences:
:path: ".symlinks/plugins/shared_preferences/ios"
+ shared_preferences_linux:
+ :path: ".symlinks/plugins/shared_preferences_linux/ios"
shared_preferences_macos:
:path: ".symlinks/plugins/shared_preferences_macos/ios"
shared_preferences_web:
:path: ".symlinks/plugins/shared_preferences_web/ios"
url_launcher:
:path: ".symlinks/plugins/url_launcher/ios"
+ url_launcher_linux:
+ :path: ".symlinks/plugins/url_launcher_linux/ios"
url_launcher_macos:
:path: ".symlinks/plugins/url_launcher_macos/ios"
url_launcher_web:
@@ -138,10 +148,12 @@ SPEC CHECKSUMS:
path_provider_macos: f760a3c5b04357c380e2fddb6f9db6f3015897e0
share: 0b2c3e82132f5888bccca3351c504d0003b3b410
shared_preferences: af6bfa751691cdc24be3045c43ec037377ada40d
+ shared_preferences_linux: afefbfe8d921e207f01ede8b60373d9e3b566b78
shared_preferences_macos: f3f29b71ccbb56bf40c9dd6396c9acf15e214087
shared_preferences_web: 141cce0c3ed1a1c5bf2a0e44f52d31eeb66e5ea9
SwiftProtobuf: 2cbd9409689b7df170d82a92a33443c8e3e14a70
url_launcher: 6fef411d543ceb26efce54b05a0a40bfd74cbbef
+ url_launcher_linux: ac237cb7a8058736e4aae38bdbcc748a4b394cc0
url_launcher_macos: fd7894421cd39320dce5f292fc99ea9270b2a313
url_launcher_web: e5527357f037c87560776e36436bf2b0288b965c
diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj
index 54901a5a7..cf8308171 100644
--- a/ios/Runner.xcodeproj/project.pbxproj
+++ b/ios/Runner.xcodeproj/project.pbxproj
@@ -319,7 +319,6 @@
/* Begin XCBuildConfiguration section */
249021D3217E4FDB00AE95B9 /* Profile */ = {
isa = XCBuildConfiguration;
- baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
@@ -373,7 +372,7 @@
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
- CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
+ CURRENT_PROJECT_VERSION = 12;
DEVELOPMENT_TEAM = 32J6BB6VUS;
ENABLE_BITCODE = NO;
FRAMEWORK_SEARCH_PATHS = (
@@ -387,7 +386,7 @@
"$(inherited)",
"$(PROJECT_DIR)/Flutter",
);
- MARKETING_VERSION = 3.1.28;
+ MARKETING_VERSION = 3.2.0;
PRODUCT_BUNDLE_IDENTIFIER = com.cakewallet.cakewallet;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
@@ -399,7 +398,6 @@
};
97C147031CF9000F007C117D /* Debug */ = {
isa = XCBuildConfiguration;
- baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
@@ -455,7 +453,6 @@
};
97C147041CF9000F007C117D /* Release */ = {
isa = XCBuildConfiguration;
- baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
@@ -509,7 +506,7 @@
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
- CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
+ CURRENT_PROJECT_VERSION = 12;
DEVELOPMENT_TEAM = 32J6BB6VUS;
ENABLE_BITCODE = NO;
FRAMEWORK_SEARCH_PATHS = (
@@ -523,7 +520,7 @@
"$(inherited)",
"$(PROJECT_DIR)/Flutter",
);
- MARKETING_VERSION = 3.1.28;
+ MARKETING_VERSION = 3.2.0;
PRODUCT_BUNDLE_IDENTIFIER = com.cakewallet.cakewallet;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
@@ -540,7 +537,7 @@
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
- CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
+ CURRENT_PROJECT_VERSION = 12;
DEVELOPMENT_TEAM = 32J6BB6VUS;
ENABLE_BITCODE = NO;
FRAMEWORK_SEARCH_PATHS = (
@@ -554,7 +551,7 @@
"$(inherited)",
"$(PROJECT_DIR)/Flutter",
);
- MARKETING_VERSION = 3.1.28;
+ MARKETING_VERSION = 3.2.0;
PRODUCT_BUNDLE_IDENTIFIER = com.cakewallet.cakewallet;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist
index 40f292e53..65000c894 100644
--- a/ios/Runner/Info.plist
+++ b/ios/Runner/Info.plist
@@ -19,9 +19,11 @@
CFBundleSignature
????
CFBundleVersion
- $(FLUTTER_BUILD_NUMBER)
+ $(CURRENT_PROJECT_VERSION)
LSRequiresIPhoneOS
+ NSCameraUsageDescription
+ Cake Wallet requires access to your phone’s camera.
UILaunchStoryboardName
LaunchScreen
UIMainStoryboardFile
diff --git a/lib/bitcoin/bitcoin_address_record.dart b/lib/bitcoin/bitcoin_address_record.dart
index cd2e21495..98cd1c9da 100644
--- a/lib/bitcoin/bitcoin_address_record.dart
+++ b/lib/bitcoin/bitcoin_address_record.dart
@@ -1,17 +1,19 @@
import 'dart:convert';
class BitcoinAddressRecord {
- BitcoinAddressRecord(this.address, {this.label});
+ BitcoinAddressRecord(this.address, {this.label, this.index});
factory BitcoinAddressRecord.fromJSON(String jsonSource) {
final decoded = json.decode(jsonSource) as Map;
return BitcoinAddressRecord(decoded['address'] as String,
- label: decoded['label'] as String);
+ label: decoded['label'] as String, index: decoded['index'] as int);
}
final String address;
+ int index;
String label;
- String toJSON() => json.encode({'label': label, 'address': address});
+ String toJSON() =>
+ json.encode({'label': label, 'address': address, 'index': index});
}
diff --git a/lib/bitcoin/bitcoin_transaction_credentials.dart b/lib/bitcoin/bitcoin_transaction_credentials.dart
index 52f2d5ec6..874da1263 100644
--- a/lib/bitcoin/bitcoin_transaction_credentials.dart
+++ b/lib/bitcoin/bitcoin_transaction_credentials.dart
@@ -1,6 +1,9 @@
+import 'package:cake_wallet/src/domain/common/transaction_priority.dart';
+
class BitcoinTransactionCredentials {
- const BitcoinTransactionCredentials(this.address, this.amount);
+ BitcoinTransactionCredentials(this.address, this.amount, this.priority);
final String address;
final double amount;
+ TransactionPriority priority;
}
diff --git a/lib/bitcoin/bitcoin_transaction_history.dart b/lib/bitcoin/bitcoin_transaction_history.dart
index 1a3990bf7..4a18d18c1 100644
--- a/lib/bitcoin/bitcoin_transaction_history.dart
+++ b/lib/bitcoin/bitcoin_transaction_history.dart
@@ -6,8 +6,6 @@ import 'package:cake_wallet/bitcoin/file.dart';
import 'package:cake_wallet/bitcoin/bitcoin_wallet.dart';
import 'package:cake_wallet/bitcoin/bitcoin_transaction_info.dart';
import 'package:cake_wallet/bitcoin/electrum.dart';
-import 'package:cake_wallet/src/domain/common/transaction_info.dart';
-import 'package:cake_wallet/src/domain/common/transaction_direction.dart';
part 'bitcoin_transaction_history.g.dart';
@@ -24,100 +22,176 @@ abstract class BitcoinTransactionHistoryBase
{this.eclient, String dirPath, @required String password})
: path = '$dirPath/$_transactionsHistoryFileName',
_password = password,
- _height = 0;
+ _height = 0,
+ _isUpdating = false {
+ transactions = ObservableMap();
+ }
BitcoinWalletBase wallet;
final ElectrumClient eclient;
final String path;
final String _password;
int _height;
+ bool _isUpdating;
Future init() async {
- final info = await _read();
- _height = info['height'] as int ?? _height;
- transactions = ObservableList.of(
- info['transactions'] as List ??
- []);
+ await _load();
}
@override
Future update() async {
- await super.update();
- _updateHeight();
+ if (_isUpdating) {
+ return;
+ }
+
+ try {
+ _isUpdating = true;
+ final txs = await fetchTransactions();
+ await add(txs);
+ _isUpdating = false;
+ } catch (_) {
+ _isUpdating = false;
+ rethrow;
+ }
}
@override
- Future> fetchTransactions() async {
- final addresses = wallet.addresses;
+ Future