Merge branch 'v4.6.7_v1.3.8' of https://github.com/cake-tech/cake_wallet into linux/password-direct-input

 Conflicts:
	cw_bitcoin/lib/electrum_wallet.dart
	lib/di.dart
	lib/main.dart
	lib/src/screens/dashboard/widgets/market_place_page.dart
This commit is contained in:
OmarHatem 2023-06-16 22:14:52 +03:00
commit 2da9112aa2
100 changed files with 1037 additions and 906 deletions

View file

@ -106,7 +106,6 @@ jobs:
echo "const moonPayApiKey = '${{ secrets.MOON_PAY_API_KEY }}';" >> lib/.secrets.g.dart echo "const moonPayApiKey = '${{ secrets.MOON_PAY_API_KEY }}';" >> lib/.secrets.g.dart
echo "const moonPaySecretKey = '${{ secrets.MOON_PAY_SECRET_KEY }}';" >> lib/.secrets.g.dart echo "const moonPaySecretKey = '${{ secrets.MOON_PAY_SECRET_KEY }}';" >> lib/.secrets.g.dart
echo "const sideShiftAffiliateId = '${{ secrets.SIDE_SHIFT_AFFILIATE_ID }}';" >> lib/.secrets.g.dart echo "const sideShiftAffiliateId = '${{ secrets.SIDE_SHIFT_AFFILIATE_ID }}';" >> lib/.secrets.g.dart
echo "const sideShiftApiKey = '${{ secrets.SIDE_SHIFT_API_KEY }}';" >> lib/.secrets.g.dart
echo "const simpleSwapApiKey = '${{ secrets.SIMPLE_SWAP_API_KEY }}';" >> lib/.secrets.g.dart echo "const simpleSwapApiKey = '${{ secrets.SIMPLE_SWAP_API_KEY }}';" >> lib/.secrets.g.dart
echo "const simpleSwapApiKeyDesktop = '${{ secrets.SIMPLE_SWAP_API_KEY_DESKTOP }}';" >> lib/.secrets.g.dart echo "const simpleSwapApiKeyDesktop = '${{ secrets.SIMPLE_SWAP_API_KEY_DESKTOP }}';" >> lib/.secrets.g.dart
echo "const onramperApiKey = '${{ secrets.ONRAMPER_API_KEY }}';" >> lib/.secrets.g.dart echo "const onramperApiKey = '${{ secrets.ONRAMPER_API_KEY }}';" >> lib/.secrets.g.dart

View file

Before

Width:  |  Height:  |  Size: 193 B

After

Width:  |  Height:  |  Size: 193 B

View file

@ -1,6 +1,3 @@
Opt-in to Cake 2FA for security. More info: https://guides.cakewallet.com/docs/advanced-features/authentication/#cake-2fa Enable iPad/Tablet separate layout from mobile UI
Auto generate restore height for Monero restore QR codes SideShift update and fixes
Hausa and Yoruba languages Bug Fixes
Additional privacy settings
Update Monero to 0.18.2.2
Refactoring and bug fixes

View file

@ -1,6 +1,4 @@
Opt-in to Cake 2FA for security. More info: https://guides.cakewallet.com/docs/advanced-features/authentication/#cake-2fa Enable iPad/Tablet separate layout from mobile UI
Auto generate restore height for Monero restore QR codes SideShift update and fixes
Hausa and Yoruba languages Add MoonPay sell
Additional privacy settings Bug Fixes
Update Monero to 0.18.2.2
Refactoring and bug fixes

View file

@ -35,7 +35,7 @@ abstract class ElectrumTransactionHistoryBase
@override @override
void addMany(Map<String, ElectrumTransactionInfo> transactions) => void addMany(Map<String, ElectrumTransactionInfo> transactions) =>
transactions.forEach((_, tx) => _updateOrInsert(tx)); transactions.forEach((_, tx) => _update(tx));
@override @override
Future<void> save() async { Future<void> save() async {
@ -74,7 +74,7 @@ abstract class ElectrumTransactionHistoryBase
if (val is Map<String, dynamic>) { if (val is Map<String, dynamic>) {
final tx = ElectrumTransactionInfo.fromJson(val, walletInfo.type); final tx = ElectrumTransactionInfo.fromJson(val, walletInfo.type);
_updateOrInsert(tx); _update(tx);
} }
}); });
@ -84,18 +84,6 @@ abstract class ElectrumTransactionHistoryBase
} }
} }
void _updateOrInsert(ElectrumTransactionInfo transaction) { void _update(ElectrumTransactionInfo transaction) =>
if (transactions[transaction.id] == null) {
transactions[transaction.id] = transaction; transactions[transaction.id] = transaction;
} else {
final originalTx = transactions[transaction.id];
originalTx?.confirmations = transaction.confirmations;
originalTx?.amount = transaction.amount;
originalTx?.height = transaction.height;
originalTx?.date ??= transaction.date;
originalTx?.isPending = transaction.isPending;
originalTx?.direction = transaction.direction;
}
}
} }

View file

@ -15,7 +15,6 @@ import 'package:cw_core/pathForWallet.dart';
import 'package:cw_bitcoin/address_to_output_script.dart'; import 'package:cw_bitcoin/address_to_output_script.dart';
import 'package:cw_bitcoin/bitcoin_address_record.dart'; import 'package:cw_bitcoin/bitcoin_address_record.dart';
import 'package:cw_bitcoin/electrum_balance.dart'; import 'package:cw_bitcoin/electrum_balance.dart';
import 'package:cw_bitcoin/bitcoin_mnemonic.dart';
import 'package:cw_bitcoin/bitcoin_transaction_credentials.dart'; import 'package:cw_bitcoin/bitcoin_transaction_credentials.dart';
import 'package:cw_bitcoin/electrum_transaction_history.dart'; import 'package:cw_bitcoin/electrum_transaction_history.dart';
import 'package:cw_bitcoin/bitcoin_transaction_no_inputs_exception.dart'; import 'package:cw_bitcoin/bitcoin_transaction_no_inputs_exception.dart';
@ -128,6 +127,8 @@ abstract class ElectrumWalletBase extends WalletBase<ElectrumBalance,
Map<String, BehaviorSubject<Object>?> _scripthashesUpdateSubject; Map<String, BehaviorSubject<Object>?> _scripthashesUpdateSubject;
bool _isTransactionUpdating; bool _isTransactionUpdating;
void Function(FlutterErrorDetails)? _onError;
Future<void> init() async { Future<void> init() async {
await walletAddresses.init(); await walletAddresses.init();
await transactionHistory.init(); await transactionHistory.init();
@ -330,7 +331,7 @@ abstract class ElectrumWalletBase extends WalletBase<ElectrumBalance,
} else { } else {
feeAmount = feeRate(transactionCredentials.priority!) * estimatedSize; feeAmount = feeRate(transactionCredentials.priority!) * estimatedSize;
} }
final changeValue = totalInputAmount - amount - feeAmount; final changeValue = totalInputAmount - amount - feeAmount;
if (changeValue > minAmount) { if (changeValue > minAmount) {
@ -649,8 +650,13 @@ abstract class ElectrumWalletBase extends WalletBase<ElectrumBalance,
await updateUnspent(); await updateUnspent();
await updateBalance(); await updateBalance();
await updateTransactions(); await updateTransactions();
} catch (e) { } catch (e, s) {
print(e.toString()); print(e.toString());
_onError?.call(FlutterErrorDetails(
exception: e,
stack: s,
library: this.runtimeType.toString(),
));
} }
}); });
}); });
@ -716,4 +722,7 @@ abstract class ElectrumWalletBase extends WalletBase<ElectrumBalance,
return addresses[random.nextInt(addresses.length)].address; return addresses[random.nextInt(addresses.length)].address;
} }
@override
void setExceptionHandler(void Function(FlutterErrorDetails) onError) => _onError = onError;
} }

View file

@ -75,4 +75,6 @@ abstract class WalletBase<
String get password; String get password;
Future<void>? updateBalance(); Future<void>? updateBalance();
void setExceptionHandler(void Function(FlutterErrorDetails) onError) => null;
} }

View file

@ -44,6 +44,7 @@ post_install do |installer|
flutter_additional_ios_build_settings(target) flutter_additional_ios_build_settings(target)
target.build_configurations.each do |config| target.build_configurations.each do |config|
config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '11.0'
config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= [ config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= [
'$(inherited)', '$(inherited)',

View file

@ -4,10 +4,10 @@ PODS:
- MTBBarcodeScanner - MTBBarcodeScanner
- SwiftProtobuf - SwiftProtobuf
- BigInt (5.2.0) - BigInt (5.2.0)
- connectivity (0.0.1): - connectivity_plus (0.0.1):
- Flutter - Flutter
- Reachability - ReachabilitySwift
- CryptoSwift (1.6.0) - CryptoSwift (1.7.1)
- cw_haven (0.0.1): - cw_haven (0.0.1):
- cw_haven/Boost (= 0.0.1) - cw_haven/Boost (= 0.0.1)
- cw_haven/Haven (= 0.0.1) - cw_haven/Haven (= 0.0.1)
@ -126,20 +126,20 @@ PODS:
- path_provider_foundation (0.0.1): - path_provider_foundation (0.0.1):
- Flutter - Flutter
- FlutterMacOS - FlutterMacOS
- permission_handler_apple (9.0.4): - permission_handler_apple (9.1.0):
- Flutter - Flutter
- platform_device_id (0.0.1): - platform_device_id (0.0.1):
- Flutter - Flutter
- Reachability (3.2) - ReachabilitySwift (5.0.0)
- SDWebImage (5.15.5): - SDWebImage (5.16.0):
- SDWebImage/Core (= 5.15.5) - SDWebImage/Core (= 5.16.0)
- SDWebImage/Core (5.15.5) - SDWebImage/Core (5.16.0)
- share_plus (0.0.1): - share_plus (0.0.1):
- Flutter - Flutter
- shared_preferences_foundation (0.0.1): - shared_preferences_foundation (0.0.1):
- Flutter - Flutter
- FlutterMacOS - FlutterMacOS
- SwiftProtobuf (1.21.0) - SwiftProtobuf (1.22.0)
- SwiftyGif (5.4.4) - SwiftyGif (5.4.4)
- uni_links (0.0.1): - uni_links (0.0.1):
- Flutter - Flutter
@ -153,7 +153,7 @@ PODS:
DEPENDENCIES: DEPENDENCIES:
- barcode_scan2 (from `.symlinks/plugins/barcode_scan2/ios`) - barcode_scan2 (from `.symlinks/plugins/barcode_scan2/ios`)
- connectivity (from `.symlinks/plugins/connectivity/ios`) - connectivity_plus (from `.symlinks/plugins/connectivity_plus/ios`)
- CryptoSwift - CryptoSwift
- cw_haven (from `.symlinks/plugins/cw_haven/ios`) - cw_haven (from `.symlinks/plugins/cw_haven/ios`)
- cw_monero (from `.symlinks/plugins/cw_monero/ios`) - cw_monero (from `.symlinks/plugins/cw_monero/ios`)
@ -188,7 +188,7 @@ SPEC REPOS:
- DKPhotoGallery - DKPhotoGallery
- MTBBarcodeScanner - MTBBarcodeScanner
- OrderedSet - OrderedSet
- Reachability - ReachabilitySwift
- SDWebImage - SDWebImage
- SwiftProtobuf - SwiftProtobuf
- SwiftyGif - SwiftyGif
@ -197,8 +197,8 @@ SPEC REPOS:
EXTERNAL SOURCES: EXTERNAL SOURCES:
barcode_scan2: barcode_scan2:
:path: ".symlinks/plugins/barcode_scan2/ios" :path: ".symlinks/plugins/barcode_scan2/ios"
connectivity: connectivity_plus:
:path: ".symlinks/plugins/connectivity/ios" :path: ".symlinks/plugins/connectivity_plus/ios"
cw_haven: cw_haven:
:path: ".symlinks/plugins/cw_haven/ios" :path: ".symlinks/plugins/cw_haven/ios"
cw_monero: cw_monero:
@ -249,8 +249,8 @@ EXTERNAL SOURCES:
SPEC CHECKSUMS: SPEC CHECKSUMS:
barcode_scan2: 0af2bb63c81b4565aab6cd78278e4c0fa136dbb0 barcode_scan2: 0af2bb63c81b4565aab6cd78278e4c0fa136dbb0
BigInt: f668a80089607f521586bbe29513d708491ef2f7 BigInt: f668a80089607f521586bbe29513d708491ef2f7
connectivity: c4130b2985d4ef6fd26f9702e886bd5260681467 connectivity_plus: 413a8857dd5d9f1c399a39130850d02fe0feaf7e
CryptoSwift: 562f8eceb40e80796fffc668b0cad9313284cfa6 CryptoSwift: d3d18dc357932f7e6d580689e065cf1f176007c1
cw_haven: b3e54e1fbe7b8e6fda57a93206bc38f8e89b898a cw_haven: b3e54e1fbe7b8e6fda57a93206bc38f8e89b898a
cw_monero: 4cf3b96f2da8e95e2ef7d6703dd4d2c509127b7d cw_monero: 4cf3b96f2da8e95e2ef7d6703dd4d2c509127b7d
cw_shared_external: 2972d872b8917603478117c9957dfca611845a92 cw_shared_external: 2972d872b8917603478117c9957dfca611845a92
@ -271,19 +271,19 @@ SPEC CHECKSUMS:
OrderedSet: aaeb196f7fef5a9edf55d89760da9176ad40b93c OrderedSet: aaeb196f7fef5a9edf55d89760da9176ad40b93c
package_info: 873975fc26034f0b863a300ad47e7f1ac6c7ec62 package_info: 873975fc26034f0b863a300ad47e7f1ac6c7ec62
path_provider_foundation: eaf5b3e458fc0e5fbb9940fb09980e853fe058b8 path_provider_foundation: eaf5b3e458fc0e5fbb9940fb09980e853fe058b8
permission_handler_apple: 44366e37eaf29454a1e7b1b7d736c2cceaeb17ce permission_handler_apple: 8f116445eff3c0e7c65ad60f5fef5490aa94b4e4
platform_device_id: 81b3e2993881f87d0c82ef151dc274df4869aef5 platform_device_id: 81b3e2993881f87d0c82ef151dc274df4869aef5
Reachability: 33e18b67625424e47b6cde6d202dce689ad7af96 ReachabilitySwift: 985039c6f7b23a1da463388634119492ff86c825
SDWebImage: fd7e1a22f00303e058058278639bf6196ee431fe SDWebImage: 2aea163b50bfcb569a2726b6a754c54a4506fcf6
share_plus: 056a1e8ac890df3e33cb503afffaf1e9b4fbae68 share_plus: 056a1e8ac890df3e33cb503afffaf1e9b4fbae68
shared_preferences_foundation: e2dae3258e06f44cc55f49d42024fd8dd03c590c shared_preferences_foundation: e2dae3258e06f44cc55f49d42024fd8dd03c590c
SwiftProtobuf: afced68785854575756db965e9da52bbf3dc45e7 SwiftProtobuf: 40bd808372cb8706108f22d28f8ab4a6b9bc6989
SwiftyGif: 93a1cc87bf3a51916001cf8f3d63835fb64c819f SwiftyGif: 93a1cc87bf3a51916001cf8f3d63835fb64c819f
uni_links: d97da20c7701486ba192624d99bffaaffcfc298a uni_links: d97da20c7701486ba192624d99bffaaffcfc298a
UnstoppableDomainsResolution: c3c67f4d0a5e2437cb00d4bd50c2e00d6e743841 UnstoppableDomainsResolution: c3c67f4d0a5e2437cb00d4bd50c2e00d6e743841
url_launcher_ios: 08a3dfac5fb39e8759aeb0abbd5d9480f30fc8b4 url_launcher_ios: 08a3dfac5fb39e8759aeb0abbd5d9480f30fc8b4
wakelock: d0fc7c864128eac40eba1617cb5264d9c940b46f wakelock: d0fc7c864128eac40eba1617cb5264d9c940b46f
PODFILE CHECKSUM: ae71bdf0eb731a1ffc399c122f6aa4dea0cb5f6f PODFILE CHECKSUM: 09df1114e7c360f55770d35a79356bf5446e0100
COCOAPODS: 1.11.3 COCOAPODS: 1.11.3

View file

@ -10,8 +10,8 @@
0C44A71A2518EF8000B570ED /* decrypt.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0C44A7192518EF8000B570ED /* decrypt.swift */; }; 0C44A71A2518EF8000B570ED /* decrypt.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0C44A7192518EF8000B570ED /* decrypt.swift */; };
0C9D68C9264854B60011B691 /* secRandom.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0C9D68C8264854B60011B691 /* secRandom.swift */; }; 0C9D68C9264854B60011B691 /* secRandom.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0C9D68C8264854B60011B691 /* secRandom.swift */; };
1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
20ED0868E1BD7E12278C0CB3 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B26E3F56D69167FBB1DC160A /* Pods_Runner.framework */; };
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
4DFD1BB54A3A50573E19A583 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3C663361C56EBB242598F609 /* Pods_Runner.framework */; };
74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };
@ -23,13 +23,13 @@
0C44A7192518EF8000B570ED /* decrypt.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = decrypt.swift; sourceTree = "<group>"; }; 0C44A7192518EF8000B570ED /* decrypt.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = decrypt.swift; sourceTree = "<group>"; };
0C9986A3251A932F00D566FD /* CryptoSwift.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = CryptoSwift.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 0C9986A3251A932F00D566FD /* CryptoSwift.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = CryptoSwift.framework; sourceTree = BUILT_PRODUCTS_DIR; };
0C9D68C8264854B60011B691 /* secRandom.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = secRandom.swift; sourceTree = "<group>"; }; 0C9D68C8264854B60011B691 /* secRandom.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = secRandom.swift; sourceTree = "<group>"; };
11F9FC13F9EE2A705B213FA9 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = "<group>"; };
1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = "<group>"; }; 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = "<group>"; };
1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = "<group>"; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = "<group>"; };
20F67A1B2C2FCB2A3BB048C1 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = "<group>"; }; 1F083F2041D1F553F2AF8B62 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = "<group>"; };
3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = "<group>"; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = "<group>"; };
501EA9286675DC8636978EA4 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = "<group>"; }; 3C663361C56EBB242598F609 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };
5AFFEBFC279AD49C00F906A4 /* wakeLock.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = wakeLock.swift; sourceTree = "<group>"; }; 5AFFEBFC279AD49C00F906A4 /* wakeLock.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = wakeLock.swift; sourceTree = "<group>"; };
61CAA8652B54F23356F7592A /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = "<group>"; };
74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = "<group>"; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = "<group>"; };
74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = "<group>"; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = "<group>"; };
@ -40,7 +40,7 @@
97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; }; 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
B26E3F56D69167FBB1DC160A /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; AD0937B0140D5A4C24E73BEA /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = "<group>"; };
/* End PBXFileReference section */ /* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */ /* Begin PBXFrameworksBuildPhase section */
@ -48,7 +48,7 @@
isa = PBXFrameworksBuildPhase; isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
20ED0868E1BD7E12278C0CB3 /* Pods_Runner.framework in Frameworks */, 4DFD1BB54A3A50573E19A583 /* Pods_Runner.framework in Frameworks */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
}; };
@ -59,7 +59,7 @@
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
0C9986A3251A932F00D566FD /* CryptoSwift.framework */, 0C9986A3251A932F00D566FD /* CryptoSwift.framework */,
B26E3F56D69167FBB1DC160A /* Pods_Runner.framework */, 3C663361C56EBB242598F609 /* Pods_Runner.framework */,
); );
name = Frameworks; name = Frameworks;
sourceTree = "<group>"; sourceTree = "<group>";
@ -77,9 +77,9 @@
84389F1A05D5860790D82820 /* Pods */ = { 84389F1A05D5860790D82820 /* Pods */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
20F67A1B2C2FCB2A3BB048C1 /* Pods-Runner.debug.xcconfig */, 11F9FC13F9EE2A705B213FA9 /* Pods-Runner.debug.xcconfig */,
501EA9286675DC8636978EA4 /* Pods-Runner.release.xcconfig */, 1F083F2041D1F553F2AF8B62 /* Pods-Runner.release.xcconfig */,
61CAA8652B54F23356F7592A /* Pods-Runner.profile.xcconfig */, AD0937B0140D5A4C24E73BEA /* Pods-Runner.profile.xcconfig */,
); );
path = Pods; path = Pods;
sourceTree = "<group>"; sourceTree = "<group>";
@ -138,13 +138,13 @@
isa = PBXNativeTarget; isa = PBXNativeTarget;
buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */;
buildPhases = ( buildPhases = (
0843B0813AFBAF53935AD24E /* [CP] Check Pods Manifest.lock */, B91154210ADCED81FBF06A85 /* [CP] Check Pods Manifest.lock */,
9740EEB61CF901F6004384FC /* Run Script */, 9740EEB61CF901F6004384FC /* Run Script */,
97C146EA1CF9000F007C117D /* Sources */, 97C146EA1CF9000F007C117D /* Sources */,
97C146EB1CF9000F007C117D /* Frameworks */, 97C146EB1CF9000F007C117D /* Frameworks */,
97C146EC1CF9000F007C117D /* Resources */, 97C146EC1CF9000F007C117D /* Resources */,
3B06AD1E1E4923F5004D2608 /* Thin Binary */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */,
DD8DB3179CA4E511F9954A6F /* [CP] Embed Pods Frameworks */, 32D0076A9969C0C38D68AF62 /* [CP] Embed Pods Frameworks */,
); );
buildRules = ( buildRules = (
); );
@ -203,26 +203,21 @@
/* End PBXResourcesBuildPhase section */ /* End PBXResourcesBuildPhase section */
/* Begin PBXShellScriptBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */
0843B0813AFBAF53935AD24E /* [CP] Check Pods Manifest.lock */ = { 32D0076A9969C0C38D68AF62 /* [CP] Embed Pods Frameworks */ = {
isa = PBXShellScriptBuildPhase; isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
); );
inputFileListPaths = ( inputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist",
); );
inputPaths = ( name = "[CP] Embed Pods Frameworks";
"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
"${PODS_ROOT}/Manifest.lock",
);
name = "[CP] Check Pods Manifest.lock";
outputFileListPaths = ( outputFileListPaths = (
); "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist",
outputPaths = (
"$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt",
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh; 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"; shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n";
showEnvVarsInLog = 0; showEnvVarsInLog = 0;
}; };
3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {
@ -255,21 +250,26 @@
shellPath = /bin/sh; shellPath = /bin/sh;
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build\n"; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build\n";
}; };
DD8DB3179CA4E511F9954A6F /* [CP] Embed Pods Frameworks */ = { B91154210ADCED81FBF06A85 /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase; isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
); );
inputFileListPaths = ( inputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist",
); );
name = "[CP] Embed Pods Frameworks"; inputPaths = (
"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
"${PODS_ROOT}/Manifest.lock",
);
name = "[CP] Check Pods Manifest.lock";
outputFileListPaths = ( outputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", );
outputPaths = (
"$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt",
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh; shellPath = /bin/sh;
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.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; showEnvVarsInLog = 0;
}; };
/* End PBXShellScriptBuildPhase section */ /* End PBXShellScriptBuildPhase section */
@ -390,7 +390,7 @@
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0; SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = 1; TARGETED_DEVICE_FAMILY = "1,2";
VALID_ARCHS = arm64; VALID_ARCHS = arm64;
VERSIONING_SYSTEM = "apple-generic"; VERSIONING_SYSTEM = "apple-generic";
}; };
@ -537,7 +537,7 @@
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 5.0; SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = 1; TARGETED_DEVICE_FAMILY = "1,2";
VALID_ARCHS = arm64; VALID_ARCHS = arm64;
VERSIONING_SYSTEM = "apple-generic"; VERSIONING_SYSTEM = "apple-generic";
}; };
@ -574,7 +574,7 @@
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0; SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = 1; TARGETED_DEVICE_FAMILY = "1,2";
VALID_ARCHS = arm64; VALID_ARCHS = arm64;
VERSIONING_SYSTEM = "apple-generic"; VERSIONING_SYSTEM = "apple-generic";
}; };

View file

@ -1,21 +1,25 @@
{ {
"images" : [ "images" : [
{ {
"filename" : "Icon-App-40x40@1x.png",
"idiom" : "iphone", "idiom" : "iphone",
"scale" : "2x", "scale" : "2x",
"size" : "20x20" "size" : "20x20"
}, },
{ {
"filename" : "Icon-App-20x20@3x.png",
"idiom" : "iphone", "idiom" : "iphone",
"scale" : "3x", "scale" : "3x",
"size" : "20x20" "size" : "20x20"
}, },
{ {
"filename" : "Icon-App-29x29@2x 1.png",
"idiom" : "iphone", "idiom" : "iphone",
"scale" : "2x", "scale" : "2x",
"size" : "29x29" "size" : "29x29"
}, },
{ {
"filename" : "Icon-App-29x29@3x.png",
"idiom" : "iphone", "idiom" : "iphone",
"scale" : "3x", "scale" : "3x",
"size" : "29x29" "size" : "29x29"
@ -26,6 +30,7 @@
"size" : "40x40" "size" : "40x40"
}, },
{ {
"filename" : "Icon-App-40x40@3x.png",
"idiom" : "iphone", "idiom" : "iphone",
"scale" : "3x", "scale" : "3x",
"size" : "40x40" "size" : "40x40"
@ -43,26 +48,31 @@
"size" : "60x60" "size" : "60x60"
}, },
{ {
"filename" : "Icon-App-20x20@1x.png",
"idiom" : "ipad", "idiom" : "ipad",
"scale" : "1x", "scale" : "1x",
"size" : "20x20" "size" : "20x20"
}, },
{ {
"filename" : "Icon-App-20x20@2x.png",
"idiom" : "ipad", "idiom" : "ipad",
"scale" : "2x", "scale" : "2x",
"size" : "20x20" "size" : "20x20"
}, },
{ {
"filename" : "Icon-App-29x29@1x.png",
"idiom" : "ipad", "idiom" : "ipad",
"scale" : "1x", "scale" : "1x",
"size" : "29x29" "size" : "29x29"
}, },
{ {
"filename" : "Icon-App-29x29@2x.png",
"idiom" : "ipad", "idiom" : "ipad",
"scale" : "2x", "scale" : "2x",
"size" : "29x29" "size" : "29x29"
}, },
{ {
"filename" : "Icon-App-40x40@1x 1.png",
"idiom" : "ipad", "idiom" : "ipad",
"scale" : "1x", "scale" : "1x",
"size" : "40x40" "size" : "40x40"
@ -73,16 +83,19 @@
"size" : "40x40" "size" : "40x40"
}, },
{ {
"filename" : "Icon-App-76x76@1x.png",
"idiom" : "ipad", "idiom" : "ipad",
"scale" : "1x", "scale" : "1x",
"size" : "76x76" "size" : "76x76"
}, },
{ {
"filename" : "Icon-App-76x76@2x.png",
"idiom" : "ipad", "idiom" : "ipad",
"scale" : "2x", "scale" : "2x",
"size" : "76x76" "size" : "76x76"
}, },
{ {
"filename" : "Icon-App-83.5x83.5@2x.png",
"idiom" : "ipad", "idiom" : "ipad",
"scale" : "2x", "scale" : "2x",
"size" : "83.5x83.5" "size" : "83.5x83.5"

Binary file not shown.

After

Width:  |  Height:  |  Size: 880 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

View file

@ -1,4 +1,7 @@
import 'dart:convert'; import 'dart:convert';
import 'package:cake_wallet/palette.dart';
import 'package:cake_wallet/store/settings_store.dart';
import 'package:cake_wallet/themes/theme_base.dart';
import 'package:crypto/crypto.dart'; import 'package:crypto/crypto.dart';
import 'package:cake_wallet/buy/buy_exception.dart'; import 'package:cake_wallet/buy/buy_exception.dart';
import 'package:http/http.dart'; import 'package:http/http.dart';
@ -16,20 +19,42 @@ class MoonPaySellProvider {
MoonPaySellProvider({this.isTest = false}) MoonPaySellProvider({this.isTest = false})
: baseUrl = isTest ? _baseTestUrl : _baseProductUrl; : baseUrl = isTest ? _baseTestUrl : _baseProductUrl;
static const _baseTestUrl = 'sell-staging.moonpay.com'; static const _baseTestUrl = 'sell-sandbox.moonpay.com';
static const _baseProductUrl = 'sell.moonpay.com'; static const _baseProductUrl = 'sell.moonpay.com';
static String themeToMoonPayTheme(ThemeBase theme) {
switch (theme.type) {
case ThemeType.bright:
return 'light';
case ThemeType.light:
return 'light';
case ThemeType.dark:
return 'dark';
}
}
static String get _apiKey => secrets.moonPayApiKey; static String get _apiKey => secrets.moonPayApiKey;
static String get _secretKey => secrets.moonPaySecretKey; static String get _secretKey => secrets.moonPaySecretKey;
final bool isTest; final bool isTest;
final String baseUrl; final String baseUrl;
Future<Uri> requestUrl({required CryptoCurrency currency, required String refundWalletAddress}) async { Future<Uri> requestUrl(
{required CryptoCurrency currency,
required String refundWalletAddress,
required SettingsStore settingsStore}) async {
final customParams = {
'theme': themeToMoonPayTheme(settingsStore.currentTheme),
'language': settingsStore.languageCode,
'colorCode': settingsStore.currentTheme.type == ThemeType.dark
? '#${Palette.blueCraiola.value.toRadixString(16).substring(2, 8)}'
: '#${Palette.moderateSlateBlue.value.toRadixString(16).substring(2, 8)}',
};
final originalUri = Uri.https( final originalUri = Uri.https(
baseUrl, '', <String, dynamic>{ baseUrl, '', <String, dynamic>{
'apiKey': _apiKey, 'apiKey': _apiKey,
'defaultBaseCurrencyCode': currency.toString().toLowerCase(), 'defaultBaseCurrencyCode': currency.toString().toLowerCase(),
'refundWalletAddress': refundWalletAddress 'refundWalletAddress': refundWalletAddress
}); }..addAll(customParams));
final messageBytes = utf8.encode('?${originalUri.query}'); final messageBytes = utf8.encode('?${originalUri.query}');
final key = utf8.encode(_secretKey); final key = utf8.encode(_secretKey);
final hmac = Hmac(sha256, key); final hmac = Hmac(sha256, key);

View file

@ -18,10 +18,9 @@ import 'package:cake_wallet/ionia/ionia_gift_card.dart';
import 'package:cake_wallet/ionia/ionia_tip.dart'; import 'package:cake_wallet/ionia/ionia_tip.dart';
import 'package:cake_wallet/routes.dart'; import 'package:cake_wallet/routes.dart';
import 'package:cake_wallet/src/screens/anonpay_details/anonpay_details_page.dart'; import 'package:cake_wallet/src/screens/anonpay_details/anonpay_details_page.dart';
import 'package:cake_wallet/src/screens/buy/onramper_page.dart'; import 'package:cake_wallet/src/screens/buy/webview_page.dart';
import 'package:cake_wallet/src/screens/dashboard/desktop_widgets/desktop_wallet_selection_dropdown.dart'; import 'package:cake_wallet/src/screens/dashboard/desktop_widgets/desktop_wallet_selection_dropdown.dart';
import 'package:cake_wallet/src/screens/dashboard/widgets/transactions_page.dart'; import 'package:cake_wallet/src/screens/dashboard/widgets/transactions_page.dart';
import 'package:cake_wallet/src/screens/buy/payfura_page.dart';
import 'package:cake_wallet/src/screens/dashboard/desktop_dashboard_page.dart'; import 'package:cake_wallet/src/screens/dashboard/desktop_dashboard_page.dart';
import 'package:cake_wallet/src/screens/dashboard/desktop_widgets/desktop_sidebar_wrapper.dart'; import 'package:cake_wallet/src/screens/dashboard/desktop_widgets/desktop_sidebar_wrapper.dart';
import 'package:cake_wallet/src/screens/dashboard/desktop_widgets/desktop_wallet_selection_dropdown.dart'; import 'package:cake_wallet/src/screens/dashboard/desktop_widgets/desktop_wallet_selection_dropdown.dart';
@ -48,9 +47,11 @@ import 'package:cake_wallet/themes/theme_list.dart';
import 'package:cake_wallet/utils/device_info.dart'; import 'package:cake_wallet/utils/device_info.dart';
import 'package:cake_wallet/store/anonpay/anonpay_transactions_store.dart'; import 'package:cake_wallet/store/anonpay/anonpay_transactions_store.dart';
import 'package:cake_wallet/utils/payment_request.dart'; import 'package:cake_wallet/utils/payment_request.dart';
import 'package:cake_wallet/utils/responsive_layout_util.dart';
import 'package:cake_wallet/view_model/dashboard/desktop_sidebar_view_model.dart'; import 'package:cake_wallet/view_model/dashboard/desktop_sidebar_view_model.dart';
import 'package:cake_wallet/view_model/anon_invoice_page_view_model.dart'; import 'package:cake_wallet/view_model/anon_invoice_page_view_model.dart';
import 'package:cake_wallet/view_model/anonpay_details_view_model.dart'; import 'package:cake_wallet/view_model/anonpay_details_view_model.dart';
import 'package:cake_wallet/view_model/dashboard/market_place_view_model.dart';
import 'package:cake_wallet/view_model/dashboard/receive_option_view_model.dart'; import 'package:cake_wallet/view_model/dashboard/receive_option_view_model.dart';
import 'package:cake_wallet/view_model/ionia/ionia_auth_view_model.dart'; import 'package:cake_wallet/view_model/ionia/ionia_auth_view_model.dart';
import 'package:cake_wallet/view_model/ionia/ionia_buy_card_view_model.dart'; import 'package:cake_wallet/view_model/ionia/ionia_buy_card_view_model.dart';
@ -260,7 +261,7 @@ Future setup({
nodeSource: _nodeSource, nodeSource: _nodeSource,
isBitcoinBuyEnabled: isBitcoinBuyEnabled, isBitcoinBuyEnabled: isBitcoinBuyEnabled,
// Enforce darkTheme on platforms other than mobile till the design for other themes is completed // Enforce darkTheme on platforms other than mobile till the design for other themes is completed
initialTheme: DeviceInfo.instance.isMobile ? null : ThemeList.darkTheme, initialTheme: ResponsiveLayoutUtil.instance.isMobile && DeviceInfo.instance.isMobile ? null : ThemeList.darkTheme,
); );
if (_isSetupFinished) { if (_isSetupFinished) {
@ -691,15 +692,13 @@ Future setup({
wallet: getIt.get<AppStore>().wallet!, wallet: getIt.get<AppStore>().wallet!,
)); ));
getIt.registerFactory(() => OnRamperPage(getIt.get<OnRamperBuyProvider>())); getIt.registerFactoryParam<WebViewPage, String, Uri>((title, uri) => WebViewPage(title, uri));
getIt.registerFactory<PayfuraBuyProvider>(() => PayfuraBuyProvider( getIt.registerFactory<PayfuraBuyProvider>(() => PayfuraBuyProvider(
settingsStore: getIt.get<AppStore>().settingsStore, settingsStore: getIt.get<AppStore>().settingsStore,
wallet: getIt.get<AppStore>().wallet!, wallet: getIt.get<AppStore>().wallet!,
)); ));
getIt.registerFactory(() => PayFuraPage(getIt.get<PayfuraBuyProvider>()));
getIt.registerFactory(() => ExchangeViewModel( getIt.registerFactory(() => ExchangeViewModel(
getIt.get<AppStore>().wallet!, getIt.get<AppStore>().wallet!,
_tradesSource, _tradesSource,
@ -896,6 +895,8 @@ Future setup({
getIt.registerFactory(() => IoniaGiftCardsListViewModel(ioniaService: getIt.get<IoniaService>())); getIt.registerFactory(() => IoniaGiftCardsListViewModel(ioniaService: getIt.get<IoniaService>()));
getIt.registerFactory(()=> MarketPlaceViewModel(getIt.get<IoniaService>()));
getIt.registerFactory(() => IoniaAuthViewModel(ioniaService: getIt.get<IoniaService>())); getIt.registerFactory(() => IoniaAuthViewModel(ioniaService: getIt.get<IoniaService>()));
getIt.registerFactoryParam<IoniaMerchPurchaseViewModel, double, IoniaMerchant>( getIt.registerFactoryParam<IoniaMerchPurchaseViewModel, double, IoniaMerchant>(
@ -925,7 +926,7 @@ Future setup({
return IoniaVerifyIoniaOtp(getIt.get<IoniaAuthViewModel>(), email, isSignIn); return IoniaVerifyIoniaOtp(getIt.get<IoniaAuthViewModel>(), email, isSignIn);
}); });
getIt.registerFactory(() => IoniaWelcomePage(getIt.get<IoniaGiftCardsListViewModel>())); getIt.registerFactory(() => IoniaWelcomePage());
getIt.registerFactoryParam<IoniaBuyGiftCardPage, List, void>((List args, _) { getIt.registerFactoryParam<IoniaBuyGiftCardPage, List, void>((List args, _) {
final merchant = args.first as IoniaMerchant; final merchant = args.first as IoniaMerchant;

View file

@ -55,11 +55,11 @@ class LanguageService {
'cs': 'czk', 'cs': 'czk',
'ur': 'pak', 'ur': 'pak',
'id': 'idn', 'id': 'idn',
'yo': 'yor', 'yo': 'nga',
'ha': 'hau' 'ha': 'hau'
}; };
static final list = <String, String> {}; static final list = <String, String>{};
static void loadLocaleList() { static void loadLocaleList() {
supportedLocales.forEach((key, value) { supportedLocales.forEach((key, value) {

View file

@ -1,6 +1,5 @@
import 'package:cake_wallet/buy/moonpay/moonpay_buy_provider.dart'; import 'package:cake_wallet/buy/moonpay/moonpay_buy_provider.dart';
import 'package:cake_wallet/buy/onramper/onramper_buy_provider.dart'; import 'package:cake_wallet/buy/onramper/onramper_buy_provider.dart';
import 'package:cake_wallet/buy/payfura/payfura_buy_provider.dart';
import 'package:cake_wallet/di.dart'; import 'package:cake_wallet/di.dart';
import 'package:cake_wallet/generated/i18n.dart'; import 'package:cake_wallet/generated/i18n.dart';
import 'package:cake_wallet/routes.dart'; import 'package:cake_wallet/routes.dart';
@ -48,22 +47,20 @@ class MainActions {
case WalletType.bitcoin: case WalletType.bitcoin:
case WalletType.litecoin: case WalletType.litecoin:
if (viewModel.isEnabledBuyAction) { if (viewModel.isEnabledBuyAction) {
final uri = getIt.get<OnRamperBuyProvider>().requestUrl();
if (DeviceInfo.instance.isMobile) { if (DeviceInfo.instance.isMobile) {
Navigator.of(context).pushNamed(Routes.onramperPage); Navigator.of(context)
.pushNamed(Routes.webViewPage, arguments: [S.of(context).buy, uri]);
} else { } else {
final uri = getIt.get<OnRamperBuyProvider>().requestUrl();
await launchUrl(uri); await launchUrl(uri);
} }
} }
break; break;
case WalletType.monero: case WalletType.monero:
if (viewModel.isEnabledBuyAction) { if (viewModel.isEnabledBuyAction) {
if (DeviceInfo.instance.isMobile) { // final uri = getIt.get<PayfuraBuyProvider>().requestUrl();
Navigator.of(context).pushNamed(Routes.payfuraPage); final uri = Uri.parse("https://monero.com/trade");
} else { await launchUrl(uri);
final uri = getIt.get<PayfuraBuyProvider>().requestUrl();
await launchUrl(uri);
}
} }
break; break;
default: default:
@ -118,14 +115,22 @@ class MainActions {
switch (walletType) { switch (walletType) {
case WalletType.bitcoin: case WalletType.bitcoin:
case WalletType.litecoin:
if (viewModel.isEnabledSellAction) { if (viewModel.isEnabledSellAction) {
final moonPaySellProvider = MoonPaySellProvider(); final moonPaySellProvider = MoonPaySellProvider();
final uri = await moonPaySellProvider.requestUrl( final uri = await moonPaySellProvider.requestUrl(
currency: viewModel.wallet.currency, currency: viewModel.wallet.currency,
refundWalletAddress: viewModel.wallet.walletAddresses.address, refundWalletAddress: viewModel.wallet.walletAddresses.address,
settingsStore: viewModel.settingsStore,
); );
await launchUrl(uri); if (DeviceInfo.instance.isMobile) {
Navigator.of(context).pushNamed(Routes.webViewPage,
arguments: [S.of(context).sell, uri]);
} else {
await launchUrl(uri);
}
} }
break; break;
default: default:
await showPopUp<void>( await showPopUp<void>(

View file

@ -192,11 +192,11 @@ class ChangeNowExchangeProvider extends ExchangeProvider {
final expectedSendAmount = responseJSON['expectedAmountFrom'].toString(); final expectedSendAmount = responseJSON['expectedAmountFrom'].toString();
final status = responseJSON['status'] as String; final status = responseJSON['status'] as String;
final state = TradeState.deserialize(raw: status); final state = TradeState.deserialize(raw: status);
final extraId = responseJSON['payinExtraId'] as String; final extraId = responseJSON['payinExtraId'] as String?;
final outputTransaction = responseJSON['payoutHash'] as String; final outputTransaction = responseJSON['payoutHash'] as String?;
final expiredAtRaw = responseJSON['validUntil'] as String; final expiredAtRaw = responseJSON['validUntil'] as String?;
final payoutAddress = responseJSON['payoutAddress'] as String; final payoutAddress = responseJSON['payoutAddress'] as String;
final expiredAt = DateTime.tryParse(expiredAtRaw)?.toLocal(); final expiredAt = DateTime.tryParse(expiredAtRaw ?? '')?.toLocal();
return Trade( return Trade(
id: id, id: id,

View file

@ -19,10 +19,10 @@ class SideShiftExchangeProvider extends ExchangeProvider {
static const affiliateId = secrets.sideShiftAffiliateId; static const affiliateId = secrets.sideShiftAffiliateId;
static const apiBaseUrl = 'https://sideshift.ai/api'; static const apiBaseUrl = 'https://sideshift.ai/api';
static const rangePath = '/v1/pairs'; static const rangePath = '/v2/pair';
static const orderPath = '/v1/orders'; static const orderPath = '/v2/shifts';
static const quotePath = '/v1/quotes'; static const quotePath = '/v2/quotes';
static const permissionPath = '/v1/permissions'; static const permissionPath = '/v2/permissions';
static const List<CryptoCurrency> _notSupported = [ static const List<CryptoCurrency> _notSupported = [
CryptoCurrency.xhv, CryptoCurrency.xhv,
@ -36,23 +36,22 @@ class SideShiftExchangeProvider extends ExchangeProvider {
CryptoCurrency.scrt, CryptoCurrency.scrt,
CryptoCurrency.stx, CryptoCurrency.stx,
CryptoCurrency.bttc, CryptoCurrency.bttc,
CryptoCurrency.usdt,
CryptoCurrency.eos,
]; ];
static List<ExchangePair> _supportedPairs() { static List<ExchangePair> _supportedPairs() {
final supportedCurrencies = CryptoCurrency.all final supportedCurrencies =
.where((element) => !_notSupported.contains(element)) CryptoCurrency.all.where((element) => !_notSupported.contains(element)).toList();
.toList();
return supportedCurrencies return supportedCurrencies
.map((i) => supportedCurrencies .map((i) => supportedCurrencies.map((k) => ExchangePair(from: i, to: k, reverse: true)))
.map((k) => ExchangePair(from: i, to: k, reverse: true)))
.expand((i) => i) .expand((i) => i)
.toList(); .toList();
} }
@override @override
ExchangeProviderDescription get description => ExchangeProviderDescription get description => ExchangeProviderDescription.sideShift;
ExchangeProviderDescription.sideShift;
@override @override
Future<double> fetchRate( Future<double> fetchRate(
@ -65,17 +64,18 @@ class SideShiftExchangeProvider extends ExchangeProvider {
if (amount == 0) { if (amount == 0) {
return 0.0; return 0.0;
} }
final fromCurrency = _normalizeCryptoCurrency(from);
final toCurrency = _normalizeCryptoCurrency(to); final fromCurrency = from.title.toLowerCase();
final url = final toCurrency = to.title.toLowerCase();
apiBaseUrl + rangePath + '/' + fromCurrency + '/' + toCurrency; final depositNetwork = _networkFor(from);
final settleNetwork = _networkFor(to);
final url = "$apiBaseUrl$rangePath/$fromCurrency-$depositNetwork/$toCurrency-$settleNetwork";
final uri = Uri.parse(url); final uri = Uri.parse(url);
final response = await get(uri); final response = await get(uri);
final responseJSON = json.decode(response.body) as Map<String, dynamic>; final responseJSON = json.decode(response.body) as Map<String, dynamic>;
final rate = double.parse(responseJSON['rate'] as String); final rate = double.parse(responseJSON['rate'] as String);
final max = double.parse(responseJSON['max'] as String);
if (amount > max) return 0.00;
return rate; return rate;
} catch (_) { } catch (_) {
@ -101,25 +101,38 @@ class SideShiftExchangeProvider extends ExchangeProvider {
} }
final responseJSON = json.decode(response.body) as Map<String, dynamic>; final responseJSON = json.decode(response.body) as Map<String, dynamic>;
final canCreateOrder = responseJSON['createOrder'] as bool; final cancreateShift = responseJSON['createShift'] as bool;
final canCreateQuote = responseJSON['createQuote'] as bool; return cancreateShift;
return canCreateOrder && canCreateQuote;
} }
@override @override
Future<Trade> createTrade( Future<Trade> createTrade({required TradeRequest request, required bool isFixedRateMode}) async {
{required TradeRequest request, required bool isFixedRateMode}) async {
final _request = request as SideShiftRequest; final _request = request as SideShiftRequest;
final quoteId = await _createQuote(_request); String url = '';
final url = apiBaseUrl + orderPath; final depositCoin = request.depositMethod.title.toLowerCase();
final headers = {'Content-Type': 'application/json'}; final settleCoin = request.settleMethod.title.toLowerCase();
final body = { final body = {
'type': 'fixed',
'quoteId': quoteId,
'affiliateId': affiliateId, 'affiliateId': affiliateId,
'settleAddress': _request.settleAddress, 'settleAddress': _request.settleAddress,
'refundAddress': _request.refundAddress 'refundAddress': _request.refundAddress,
}; };
if (isFixedRateMode) {
final quoteId = await _createQuote(_request);
body['quoteId'] = quoteId;
url = apiBaseUrl + orderPath + '/fixed';
} else {
url = apiBaseUrl + orderPath + '/variable';
final depositNetwork = _networkFor(request.depositMethod);
final settleNetwork = _networkFor(request.settleMethod);
body["depositCoin"] = depositCoin;
body["settleCoin"] = settleCoin;
body["settleNetwork"] = settleNetwork;
body["depositNetwork"] = depositNetwork;
}
final headers = {'Content-Type': 'application/json'};
final uri = Uri.parse(url); final uri = Uri.parse(url);
final response = await post(uri, headers: headers, body: json.encode(body)); final response = await post(uri, headers: headers, body: json.encode(body));
@ -136,8 +149,9 @@ class SideShiftExchangeProvider extends ExchangeProvider {
final responseJSON = json.decode(response.body) as Map<String, dynamic>; final responseJSON = json.decode(response.body) as Map<String, dynamic>;
final id = responseJSON['id'] as String; final id = responseJSON['id'] as String;
final inputAddress = responseJSON['depositAddress']['address'] as String; final inputAddress = responseJSON['depositAddress'] as String;
final settleAddress = responseJSON['settleAddress']['address'] as String; final settleAddress = responseJSON['settleAddress'] as String;
final depositAmount = responseJSON['depositAmount'] as String?;
return Trade( return Trade(
id: id, id: id,
@ -147,7 +161,7 @@ class SideShiftExchangeProvider extends ExchangeProvider {
inputAddress: inputAddress, inputAddress: inputAddress,
refundAddress: settleAddress, refundAddress: settleAddress,
state: TradeState.created, state: TradeState.created,
amount: _request.depositAmount, amount: depositAmount ?? _request.depositAmount,
payoutAddress: settleAddress, payoutAddress: settleAddress,
createdAt: DateTime.now(), createdAt: DateTime.now(),
); );
@ -156,13 +170,17 @@ class SideShiftExchangeProvider extends ExchangeProvider {
Future<String> _createQuote(SideShiftRequest request) async { Future<String> _createQuote(SideShiftRequest request) async {
final url = apiBaseUrl + quotePath; final url = apiBaseUrl + quotePath;
final headers = {'Content-Type': 'application/json'}; final headers = {'Content-Type': 'application/json'};
final depositMethod = _normalizeCryptoCurrency(request.depositMethod); final depositMethod = request.depositMethod.title.toLowerCase();
final settleMethod = _normalizeCryptoCurrency(request.settleMethod); final settleMethod = request.settleMethod.title.toLowerCase();
final depositNetwork = _networkFor(request.depositMethod);
final settleNetwork = _networkFor(request.settleMethod);
final body = { final body = {
'depositMethod': depositMethod, 'depositCoin': depositMethod,
'settleMethod': settleMethod, 'settleCoin': settleMethod,
'affiliateId': affiliateId, 'affiliateId': affiliateId,
'depositAmount': request.depositAmount, 'settleAmount': request.depositAmount,
'settleNetwork': settleNetwork,
'depositNetwork': depositNetwork,
}; };
final uri = Uri.parse(url); final uri = Uri.parse(url);
final response = await post(uri, headers: headers, body: json.encode(body)); final response = await post(uri, headers: headers, body: json.encode(body));
@ -189,9 +207,15 @@ class SideShiftExchangeProvider extends ExchangeProvider {
{required CryptoCurrency from, {required CryptoCurrency from,
required CryptoCurrency to, required CryptoCurrency to,
required bool isFixedRateMode}) async { required bool isFixedRateMode}) async {
final fromCurrency = _normalizeCryptoCurrency(from); final fromCurrency = isFixedRateMode ? to : from;
final toCurrency = _normalizeCryptoCurrency(to); final toCurrency = isFixedRateMode ? from : to;
final url = apiBaseUrl + rangePath + '/' + fromCurrency + '/' + toCurrency;
final fromNetwork = _networkFor(fromCurrency);
final toNetwork = _networkFor(toCurrency);
final url =
"$apiBaseUrl$rangePath/${fromCurrency.title.toLowerCase()}-$fromNetwork/${toCurrency.title.toLowerCase()}-$toNetwork";
final uri = Uri.parse(url); final uri = Uri.parse(url);
final response = await get(uri); final response = await get(uri);
@ -210,6 +234,14 @@ class SideShiftExchangeProvider extends ExchangeProvider {
final min = double.tryParse(responseJSON['min'] as String? ?? ''); final min = double.tryParse(responseJSON['min'] as String? ?? '');
final max = double.tryParse(responseJSON['max'] as String? ?? ''); final max = double.tryParse(responseJSON['max'] as String? ?? '');
if (isFixedRateMode) {
final currentRate = double.parse(responseJSON['rate'] as String);
return Limits(
min: min != null ? (min * currentRate) : null,
max: max != null ? (max * currentRate) : null,
);
}
return Limits(min: min, max: max); return Limits(min: min, max: max);
} }
@ -227,8 +259,7 @@ class SideShiftExchangeProvider extends ExchangeProvider {
final responseJSON = json.decode(response.body) as Map<String, dynamic>; final responseJSON = json.decode(response.body) as Map<String, dynamic>;
final error = responseJSON['error']['message'] as String; final error = responseJSON['error']['message'] as String;
throw TradeNotFoundException(id, throw TradeNotFoundException(id, provider: description, description: error);
provider: description, description: error);
} }
if (response.statusCode != 200) { if (response.statusCode != 200) {
@ -236,36 +267,32 @@ class SideShiftExchangeProvider extends ExchangeProvider {
} }
final responseJSON = json.decode(response.body) as Map<String, dynamic>; final responseJSON = json.decode(response.body) as Map<String, dynamic>;
final fromCurrency = responseJSON['depositMethodId'] as String; final fromCurrency = responseJSON['depositCoin'] as String;
final from = CryptoCurrency.fromString(fromCurrency); final from = CryptoCurrency.fromString(fromCurrency);
final toCurrency = responseJSON['settleMethodId'] as String; final toCurrency = responseJSON['settleCoin'] as String;
final to = CryptoCurrency.fromString(toCurrency); final to = CryptoCurrency.fromString(toCurrency);
final inputAddress = responseJSON['depositAddress']['address'] as String; final inputAddress = responseJSON['depositAddress'] as String;
final expectedSendAmount = responseJSON['depositAmount'].toString(); final expectedSendAmount = responseJSON['depositAmount'] as String?;
final deposits = responseJSON['deposits'] as List?; final status = responseJSON['status'] as String?;
final settleAddress = responseJSON['settleAddress']['address'] as String; final settleAddress = responseJSON['settleAddress'] as String;
TradeState? state; TradeState? state;
String? status;
if (deposits?.isNotEmpty ?? false) {
status = deposits![0]['status'] as String?;
}
state = TradeState.deserialize(raw: status ?? 'created'); state = TradeState.deserialize(raw: status ?? 'created');
final isVariable = (responseJSON['type'] as String) == 'variable';
final expiredAtRaw = responseJSON['expiresAtISO'] as String; final expiredAtRaw = responseJSON['expiresAt'] as String;
final expiredAt = DateTime.tryParse(expiredAtRaw)?.toLocal(); final expiredAt = isVariable ? null : DateTime.tryParse(expiredAtRaw)?.toLocal();
return Trade( return Trade(
id: id, id: id,
from: from, from: from,
to: to, to: to,
provider: description, provider: description,
inputAddress: inputAddress, inputAddress: inputAddress,
amount: expectedSendAmount, amount: expectedSendAmount ?? '',
state: state, state: state,
expiredAt: expiredAt, expiredAt: expiredAt,
payoutAddress: settleAddress payoutAddress: settleAddress);
);
} }
@override @override
@ -280,28 +307,25 @@ class SideShiftExchangeProvider extends ExchangeProvider {
@override @override
String get title => 'SideShift'; String get title => 'SideShift';
static String _normalizeCryptoCurrency(CryptoCurrency currency) { String _networkFor(CryptoCurrency currency) =>
switch (currency) { currency.tag != null ? _normalizeTag(currency.tag!) : 'mainnet';
case CryptoCurrency.zaddr:
return 'zaddr'; String _normalizeTag(String tag) {
case CryptoCurrency.zec: switch (tag) {
return 'zec'; case 'ETH':
case CryptoCurrency.bnb: return 'ethereum';
return currency.tag!.toLowerCase(); case 'TRX':
case CryptoCurrency.usdterc20: return 'tron';
return 'usdtErc20'; case 'LN':
case CryptoCurrency.usdttrc20: return 'lightning';
return 'usdtTrc20'; case 'POLY':
case CryptoCurrency.usdcpoly:
return 'usdcpolygon';
case CryptoCurrency.usdcsol:
return 'usdcsol';
case CryptoCurrency.maticpoly:
return 'polygon'; return 'polygon';
case CryptoCurrency.btcln: case 'ZEC':
return 'ln'; return 'zcash';
case 'AVAXC':
return 'avax';
default: default:
return currency.title.toLowerCase(); return tag.toLowerCase();
} }
} }
} }

View file

@ -6,6 +6,7 @@ import 'package:cake_wallet/buy/order.dart';
import 'package:cake_wallet/locales/locale.dart'; import 'package:cake_wallet/locales/locale.dart';
import 'package:cake_wallet/store/yat/yat_store.dart'; import 'package:cake_wallet/store/yat/yat_store.dart';
import 'package:cake_wallet/utils/exception_handler.dart'; import 'package:cake_wallet/utils/exception_handler.dart';
import 'package:cake_wallet/utils/responsive_layout_util.dart';
import 'package:cw_core/root_dir.dart'; import 'package:cw_core/root_dir.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
@ -195,7 +196,9 @@ class App extends StatefulWidget {
class AppState extends State<App> with SingleTickerProviderStateMixin { class AppState extends State<App> with SingleTickerProviderStateMixin {
AppState() : yatStore = getIt.get<YatStore>() { AppState() : yatStore = getIt.get<YatStore>() {
SystemChrome.setPreferredOrientations( SystemChrome.setPreferredOrientations(
[DeviceOrientation.portraitUp, DeviceOrientation.portraitDown]); ResponsiveLayoutUtil.instance.isIpad ?
[DeviceOrientation.landscapeLeft, DeviceOrientation.landscapeRight] :
[DeviceOrientation.portraitUp, DeviceOrientation.portraitDown]);
} }
YatStore yatStore; YatStore yatStore;

View file

@ -1,10 +1,9 @@
import 'dart:async'; import 'dart:async';
import 'package:connectivity_plus/connectivity_plus.dart';
import 'package:cw_core/wallet_base.dart'; import 'package:cw_core/wallet_base.dart';
import 'package:cw_core/sync_status.dart'; import 'package:cw_core/sync_status.dart';
import 'package:cake_wallet/store/settings_store.dart'; import 'package:cake_wallet/store/settings_store.dart';
import 'package:connectivity/connectivity.dart';
Timer? _checkConnectionTimer; Timer? _checkConnectionTimer;
void startCheckConnectionReaction( void startCheckConnectionReaction(

View file

@ -8,8 +8,7 @@ import 'package:cake_wallet/src/screens/anonpay_details/anonpay_details_page.dar
import 'package:cake_wallet/src/screens/backup/backup_page.dart'; import 'package:cake_wallet/src/screens/backup/backup_page.dart';
import 'package:cake_wallet/src/screens/backup/edit_backup_password_page.dart'; import 'package:cake_wallet/src/screens/backup/edit_backup_password_page.dart';
import 'package:cake_wallet/src/screens/buy/buy_webview_page.dart'; import 'package:cake_wallet/src/screens/buy/buy_webview_page.dart';
import 'package:cake_wallet/src/screens/buy/onramper_page.dart'; import 'package:cake_wallet/src/screens/buy/webview_page.dart';
import 'package:cake_wallet/src/screens/buy/payfura_page.dart';
import 'package:cake_wallet/src/screens/buy/pre_order_page.dart'; import 'package:cake_wallet/src/screens/buy/pre_order_page.dart';
import 'package:cake_wallet/src/screens/restore/sweeping_wallet_page.dart'; import 'package:cake_wallet/src/screens/restore/sweeping_wallet_page.dart';
import 'package:cake_wallet/src/screens/receive/anonpay_invoice_page.dart'; import 'package:cake_wallet/src/screens/receive/anonpay_invoice_page.dart';
@ -190,7 +189,6 @@ Route<dynamic> createRoute(RouteSettings settings) {
fullscreenDialog: true); fullscreenDialog: true);
} else if (isSingleCoin) { } else if (isSingleCoin) {
return MaterialPageRoute<void>( return MaterialPageRoute<void>(
fullscreenDialog: true,
builder: (_) => getIt.get<WalletRestorePage>( builder: (_) => getIt.get<WalletRestorePage>(
param1: availableWalletTypes.first param1: availableWalletTypes.first
)); ));
@ -211,7 +209,6 @@ Route<dynamic> createRoute(RouteSettings settings) {
case Routes.restoreWallet: case Routes.restoreWallet:
return MaterialPageRoute<void>( return MaterialPageRoute<void>(
fullscreenDialog: true,
builder: (_) => getIt.get<WalletRestorePage>( builder: (_) => getIt.get<WalletRestorePage>(
param1: settings.arguments as WalletType)); param1: settings.arguments as WalletType));
@ -221,6 +218,7 @@ Route<dynamic> createRoute(RouteSettings settings) {
case Routes.dashboard: case Routes.dashboard:
return CupertinoPageRoute<void>( return CupertinoPageRoute<void>(
settings: settings,
builder: (_) => getIt.get<DashboardPage>()); builder: (_) => getIt.get<DashboardPage>());
case Routes.send: case Routes.send:
@ -506,7 +504,8 @@ Route<dynamic> createRoute(RouteSettings settings) {
return CupertinoPageRoute<void>( builder: (_) => getIt.get<IoniaCreateAccountPage>()); return CupertinoPageRoute<void>( builder: (_) => getIt.get<IoniaCreateAccountPage>());
case Routes.ioniaManageCardsPage: case Routes.ioniaManageCardsPage:
return CupertinoPageRoute<void>(builder: (_) => getIt.get<IoniaManageCardsPage>()); return CupertinoPageRoute<void>(
builder: (_) => getIt.get<IoniaManageCardsPage>());
case Routes.ioniaBuyGiftCardPage: case Routes.ioniaBuyGiftCardPage:
final args = settings.arguments as List; final args = settings.arguments as List;
@ -556,11 +555,13 @@ Route<dynamic> createRoute(RouteSettings settings) {
param1: paymentInfo, param1: paymentInfo,
param2: commitedInfo)); param2: commitedInfo));
case Routes.onramperPage: case Routes.webViewPage:
return CupertinoPageRoute<void>(builder: (_) => getIt.get<OnRamperPage>()); final args = settings.arguments as List;
final title = args.first as String;
case Routes.payfuraPage: final url = args[1] as Uri;
return CupertinoPageRoute<void>(builder: (_) => getIt.get<PayFuraPage>()); return CupertinoPageRoute<void>(builder: (_) => getIt.get<WebViewPage>(
param1: title,
param2: url));
case Routes.advancedPrivacySettings: case Routes.advancedPrivacySettings:
final type = settings.arguments as WalletType; final type = settings.arguments as WalletType;
@ -574,7 +575,6 @@ Route<dynamic> createRoute(RouteSettings settings) {
case Routes.anonPayInvoicePage: case Routes.anonPayInvoicePage:
final args = settings.arguments as List; final args = settings.arguments as List;
return CupertinoPageRoute<void>( return CupertinoPageRoute<void>(
fullscreenDialog: true,
builder: (_) => getIt.get<AnonPayInvoicePage>(param1: args)); builder: (_) => getIt.get<AnonPayInvoicePage>(param1: args));
case Routes.anonPayReceivePage: case Routes.anonPayReceivePage:

View file

@ -70,7 +70,7 @@ class Routes {
static const ioniaPaymentStatusPage = '/ionia_payment_status_page'; static const ioniaPaymentStatusPage = '/ionia_payment_status_page';
static const ioniaMoreOptionsPage = '/ionia_more_options_page'; static const ioniaMoreOptionsPage = '/ionia_more_options_page';
static const ioniaCustomRedeemPage = '/ionia_custom_redeem_page'; static const ioniaCustomRedeemPage = '/ionia_custom_redeem_page';
static const onramperPage = '/onramper'; static const webViewPage = '/web_view_page';
static const connectionSync = '/connection_sync_page'; static const connectionSync = '/connection_sync_page';
static const securityBackupPage = '/security_and_backup_page'; static const securityBackupPage = '/security_and_backup_page';
static const privacyPage = '/privacy_page'; static const privacyPage = '/privacy_page';
@ -83,7 +83,6 @@ class Routes {
static const anonPayInvoicePage = '/anon_pay_invoice_page'; static const anonPayInvoicePage = '/anon_pay_invoice_page';
static const anonPayReceivePage = '/anon_pay_receive_page'; static const anonPayReceivePage = '/anon_pay_receive_page';
static const anonPayDetailsPage = '/anon_pay_details_page'; static const anonPayDetailsPage = '/anon_pay_details_page';
static const payfuraPage = '/pay_fura_page';
static const desktop_actions = '/desktop_actions'; static const desktop_actions = '/desktop_actions';
static const transactionsPage = '/transactions_page'; static const transactionsPage = '/transactions_page';
static const setup_2faPage = '/setup_2fa_page'; static const setup_2faPage = '/setup_2fa_page';

View file

@ -1,58 +0,0 @@
import 'package:cake_wallet/buy/payfura/payfura_buy_provider.dart';
import 'package:cake_wallet/generated/i18n.dart';
import 'package:cake_wallet/src/screens/base_page.dart';
import 'package:flutter/material.dart';
import 'package:flutter_inappwebview/flutter_inappwebview.dart';
import 'package:permission_handler/permission_handler.dart';
class PayFuraPage extends BasePage {
PayFuraPage(this._PayfuraBuyProvider);
final PayfuraBuyProvider _PayfuraBuyProvider;
@override
String get title => S.current.buy;
@override
Widget body(BuildContext context) {
return PayFuraPageBody(_PayfuraBuyProvider);
}
}
class PayFuraPageBody extends StatefulWidget {
PayFuraPageBody(this._PayfuraBuyProvider);
final PayfuraBuyProvider _PayfuraBuyProvider;
Uri get uri => _PayfuraBuyProvider.requestUrl();
@override
PayFuraPageBodyState createState() => PayFuraPageBodyState();
}
class PayFuraPageBodyState extends State<PayFuraPageBody> {
PayFuraPageBodyState();
@override
Widget build(BuildContext context) {
return InAppWebView(
initialOptions: InAppWebViewGroupOptions(
crossPlatform: InAppWebViewOptions(transparentBackground: true),
),
initialUrlRequest: URLRequest(url: widget.uri),
androidOnPermissionRequest: (_, __, resources) async {
bool permissionGranted = await Permission.camera.status == PermissionStatus.granted;
if (!permissionGranted) {
permissionGranted = await Permission.camera.request().isGranted;
}
return PermissionRequestResponse(
resources: resources,
action: permissionGranted
? PermissionRequestResponseAction.GRANT
: PermissionRequestResponseAction.DENY,
);
},
);
}
}

View file

@ -5,33 +5,32 @@ import 'package:flutter/material.dart';
import 'package:flutter_inappwebview/flutter_inappwebview.dart'; import 'package:flutter_inappwebview/flutter_inappwebview.dart';
import 'package:permission_handler/permission_handler.dart'; import 'package:permission_handler/permission_handler.dart';
class OnRamperPage extends BasePage { class WebViewPage extends BasePage {
OnRamperPage(this._onRamperBuyProvider); WebViewPage(this._title, this._url);
final OnRamperBuyProvider _onRamperBuyProvider; final String _title;
final Uri _url;
@override @override
String get title => S.current.buy; String get title => _title;
@override @override
Widget body(BuildContext context) { Widget body(BuildContext context) {
return OnRamperPageBody(_onRamperBuyProvider); return WebViewPageBody(_url);
} }
} }
class OnRamperPageBody extends StatefulWidget { class WebViewPageBody extends StatefulWidget {
OnRamperPageBody(this.onRamperBuyProvider); WebViewPageBody(this.uri);
final OnRamperBuyProvider onRamperBuyProvider; final Uri uri;
Uri get uri => onRamperBuyProvider.requestUrl();
@override @override
OnRamperPageBodyState createState() => OnRamperPageBodyState(); WebViewPageBodyState createState() => WebViewPageBodyState();
} }
class OnRamperPageBodyState extends State<OnRamperPageBody> { class WebViewPageBodyState extends State<WebViewPageBody> {
OnRamperPageBodyState(); WebViewPageBodyState();
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {

View file

@ -5,7 +5,7 @@ import 'package:cake_wallet/entities/main_actions.dart';
import 'package:cake_wallet/src/screens/dashboard/desktop_widgets/desktop_sidebar_wrapper.dart'; import 'package:cake_wallet/src/screens/dashboard/desktop_widgets/desktop_sidebar_wrapper.dart';
import 'package:cake_wallet/src/screens/dashboard/widgets/market_place_page.dart'; import 'package:cake_wallet/src/screens/dashboard/widgets/market_place_page.dart';
import 'package:cake_wallet/utils/version_comparator.dart'; import 'package:cake_wallet/utils/version_comparator.dart';
import 'package:cake_wallet/wallet_type_utils.dart'; import 'package:cake_wallet/view_model/dashboard/market_place_view_model.dart';
import 'package:cake_wallet/generated/i18n.dart'; import 'package:cake_wallet/generated/i18n.dart';
import 'package:cake_wallet/routes.dart'; import 'package:cake_wallet/routes.dart';
import 'package:cake_wallet/src/screens/yat_emoji_id.dart'; import 'package:cake_wallet/src/screens/yat_emoji_id.dart';
@ -27,8 +27,6 @@ import 'package:mobx/mobx.dart';
import 'package:shared_preferences/shared_preferences.dart'; import 'package:shared_preferences/shared_preferences.dart';
import 'package:smooth_page_indicator/smooth_page_indicator.dart'; import 'package:smooth_page_indicator/smooth_page_indicator.dart';
import 'package:cake_wallet/main.dart'; import 'package:cake_wallet/main.dart';
import 'package:cake_wallet/buy/moonpay/moonpay_buy_provider.dart';
import 'package:url_launcher/url_launcher.dart';
import 'package:cake_wallet/src/screens/release_notes/release_notes_screen.dart'; import 'package:cake_wallet/src/screens/release_notes/release_notes_screen.dart';
class DashboardPage extends StatelessWidget { class DashboardPage extends StatelessWidget {
@ -45,7 +43,7 @@ class DashboardPage extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return Scaffold(
body: ResponsiveLayoutUtil.instance.isMobile(context) body: ResponsiveLayoutUtil.instance.isMobile
? _DashboardPageView( ? _DashboardPageView(
balancePage: balancePage, balancePage: balancePage,
dashboardViewModel: dashboardViewModel, dashboardViewModel: dashboardViewModel,
@ -251,7 +249,12 @@ class _DashboardPageView extends BasePage {
if (dashboardViewModel.shouldShowMarketPlaceInDashboard) { if (dashboardViewModel.shouldShowMarketPlaceInDashboard) {
pages.add(Semantics( pages.add(Semantics(
label: 'Marketplace Page', label: 'Marketplace Page',
child: MarketPlacePage(dashboardViewModel: dashboardViewModel))); child: MarketPlacePage(
dashboardViewModel: dashboardViewModel,
marketPlaceViewModel: getIt.get<MarketPlaceViewModel>(),
),
),
);
} }
pages.add(Semantics(label: 'Balance Page', child: balancePage)); pages.add(Semantics(label: 'Balance Page', child: balancePage));
pages.add(Semantics( pages.add(Semantics(

View file

@ -1,7 +1,9 @@
import 'package:cake_wallet/di.dart';
import 'package:cake_wallet/entities/main_actions.dart'; import 'package:cake_wallet/entities/main_actions.dart';
import 'package:cake_wallet/src/screens/dashboard/desktop_widgets/desktop_action_button.dart'; import 'package:cake_wallet/src/screens/dashboard/desktop_widgets/desktop_action_button.dart';
import 'package:cake_wallet/src/screens/dashboard/widgets/market_place_page.dart'; import 'package:cake_wallet/src/screens/dashboard/widgets/market_place_page.dart';
import 'package:cake_wallet/view_model/dashboard/dashboard_view_model.dart'; import 'package:cake_wallet/view_model/dashboard/dashboard_view_model.dart';
import 'package:cake_wallet/view_model/dashboard/market_place_view_model.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_mobx/flutter_mobx.dart'; import 'package:flutter_mobx/flutter_mobx.dart';
@ -70,7 +72,10 @@ class DesktopDashboardActions extends StatelessWidget {
], ],
), ),
Expanded( Expanded(
child: MarketPlacePage(dashboardViewModel: dashboardViewModel), child: MarketPlacePage(
dashboardViewModel: dashboardViewModel,
marketPlaceViewModel: getIt.get<MarketPlaceViewModel>(),
),
), ),
], ],
); );

View file

@ -73,7 +73,7 @@ class AddressPage extends BasePage {
? closeButtonImageDarkTheme ? closeButtonImageDarkTheme
: closeButtonImage; : closeButtonImage;
bool isMobileView = ResponsiveLayoutUtil.instance.isMobile(context); bool isMobileView = ResponsiveLayoutUtil.instance.isMobile;
return MergeSemantics( return MergeSemantics(
child: SizedBox( child: SizedBox(
@ -273,7 +273,7 @@ class AddressPage extends BasePage {
reaction((_) => receiveOptionViewModel.selectedReceiveOption, (ReceivePageOption option) { reaction((_) => receiveOptionViewModel.selectedReceiveOption, (ReceivePageOption option) {
switch (option) { switch (option) {
case ReceivePageOption.anonPayInvoice: case ReceivePageOption.anonPayInvoice:
Navigator.pushReplacementNamed( Navigator.pushNamed(
context, context,
Routes.anonPayInvoicePage, Routes.anonPayInvoicePage,
arguments: [addressListViewModel.address.address, option], arguments: [addressListViewModel.address.address, option],
@ -285,7 +285,7 @@ class AddressPage extends BasePage {
final onionUrl = sharedPreferences.getString(PreferencesKey.onionDonationLink); final onionUrl = sharedPreferences.getString(PreferencesKey.onionDonationLink);
if (clearnetUrl != null && onionUrl != null) { if (clearnetUrl != null && onionUrl != null) {
Navigator.pushReplacementNamed( Navigator.pushNamed(
context, context,
Routes.anonPayReceivePage, Routes.anonPayReceivePage,
arguments: AnonpayDonationLinkInfo( arguments: AnonpayDonationLinkInfo(
@ -295,7 +295,7 @@ class AddressPage extends BasePage {
), ),
); );
} else { } else {
Navigator.pushReplacementNamed( Navigator.pushNamed(
context, context,
Routes.anonPayInvoicePage, Routes.anonPayInvoicePage,
arguments: [addressListViewModel.address.address, option], arguments: [addressListViewModel.address.address, option],

View file

@ -120,19 +120,22 @@ class BalancePage extends StatelessWidget {
.backgroundColor!, .backgroundColor!,
height: 1)), height: 1)),
SizedBox(height: 5), SizedBox(height: 5),
Row(mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Row(
AutoSizeText(availableBalance, mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [
style: TextStyle( Expanded(
fontSize: 24, child: AutoSizeText(availableBalance,
fontFamily: 'Lato', style: TextStyle(
fontWeight: FontWeight.w900, fontSize: 24,
color: Theme.of(context) fontFamily: 'Lato',
.accentTextTheme! fontWeight: FontWeight.w900,
.displayMedium! color: Theme.of(context)
.backgroundColor!, .accentTextTheme!
height: 1), .displayMedium!
maxLines: 1, .backgroundColor!,
textAlign: TextAlign.center), height: 1),
maxLines: 1,
textAlign: TextAlign.start),
),
Text(currency, Text(currency,
style: TextStyle( style: TextStyle(
fontSize: 28, fontSize: 28,

View file

@ -4,16 +4,20 @@ import 'package:cake_wallet/src/widgets/market_place_item.dart';
import 'package:cake_wallet/store/settings_store.dart'; import 'package:cake_wallet/store/settings_store.dart';
import 'package:cake_wallet/utils/show_pop_up.dart'; import 'package:cake_wallet/utils/show_pop_up.dart';
import 'package:cake_wallet/view_model/dashboard/dashboard_view_model.dart'; import 'package:cake_wallet/view_model/dashboard/dashboard_view_model.dart';
import 'package:cake_wallet/view_model/dashboard/market_place_view_model.dart';
import 'package:cw_core/wallet_type.dart'; import 'package:cw_core/wallet_type.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:cake_wallet/generated/i18n.dart'; import 'package:cake_wallet/generated/i18n.dart';
import 'package:url_launcher/url_launcher.dart'; import 'package:url_launcher/url_launcher.dart';
class MarketPlacePage extends StatelessWidget { class MarketPlacePage extends StatelessWidget {
MarketPlacePage({
MarketPlacePage({required this.dashboardViewModel}); required this.dashboardViewModel,
required this.marketPlaceViewModel,
});
final DashboardViewModel dashboardViewModel; final DashboardViewModel dashboardViewModel;
final MarketPlaceViewModel marketPlaceViewModel;
final _scrollController = ScrollController(); final _scrollController = ScrollController();
@override @override
@ -50,7 +54,7 @@ class MarketPlacePage extends StatelessWidget {
if (!SettingsStoreBase.walletPasswordDirectInput) if (!SettingsStoreBase.walletPasswordDirectInput)
...[SizedBox(height: 20), ...[SizedBox(height: 20),
MarketPlaceItem( MarketPlaceItem(
onTap: () =>_navigatorToGiftCardsPage(context), onTap: () => _navigatorToGiftCardsPage(context),
title: S.of(context).cake_pay_title, title: S.of(context).cake_pay_title,
subTitle: S.of(context).cake_pay_subtitle, subTitle: S.of(context).cake_pay_subtitle,
)], )],
@ -72,12 +76,13 @@ class MarketPlacePage extends StatelessWidget {
), ),
); );
} }
void _navigatorToGiftCardsPage(BuildContext context) { void _navigatorToGiftCardsPage(BuildContext context) {
final walletType = dashboardViewModel.type; final walletType = dashboardViewModel.type;
switch (walletType) { switch (walletType) {
case WalletType.haven: case WalletType.haven:
showPopUp<void>( showPopUp<void>(
context: context, context: context,
builder: (BuildContext context) { builder: (BuildContext context) {
return AlertWithOneAction( return AlertWithOneAction(
@ -87,9 +92,14 @@ class MarketPlacePage extends StatelessWidget {
buttonAction: () => Navigator.of(context).pop()); buttonAction: () => Navigator.of(context).pop());
}); });
break; break;
default: default:
Navigator.of(context).pushNamed(Routes.ioniaWelcomePage); marketPlaceViewModel.isIoniaUserAuthenticated().then((value) {
if (value) {
Navigator.pushNamed(context, Routes.ioniaManageCardsPage);
return;
}
Navigator.of(context).pushNamed(Routes.ioniaWelcomePage);
});
} }
} }
} }

View file

@ -25,107 +25,126 @@ class TransactionsPage extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Container( return GestureDetector(
color: ResponsiveLayoutUtil.instance.isMobile(context) onLongPress: () => dashboardViewModel.balanceViewModel.isReversing =
? null !dashboardViewModel.balanceViewModel.isReversing,
: Theme.of(context).colorScheme.background, onLongPressUp: () => dashboardViewModel.balanceViewModel.isReversing =
padding: EdgeInsets.only(top: 24, bottom: 24), !dashboardViewModel.balanceViewModel.isReversing,
child: Column( child: Container(
children: <Widget>[ color: ResponsiveLayoutUtil.instance.isMobile
HeaderRow(dashboardViewModel: dashboardViewModel), ? null
Expanded(child: Observer(builder: (_) { : Theme.of(context).colorScheme.background,
final items = dashboardViewModel.items; padding: EdgeInsets.only(top: 24, bottom: 24),
child: Column(
children: <Widget>[
HeaderRow(dashboardViewModel: dashboardViewModel),
Expanded(child: Observer(builder: (_) {
final items = dashboardViewModel.items;
return items.isNotEmpty return items.isNotEmpty
? ListView.builder( ? ListView.builder(
itemCount: items.length, itemCount: items.length,
itemBuilder: (context, index) { itemBuilder: (context, index) {
final item = items[index]; final item = items[index];
if (item is DateSectionItem) { if (item is DateSectionItem) {
return DateSectionRaw(date: item.date); return DateSectionRaw(date: item.date);
} }
if (item is TransactionListItem) { if (item is TransactionListItem) {
final transaction = item.transaction; final transaction = item.transaction;
return Observer( return Observer(
builder: (_) => TransactionRow( builder: (_) => TransactionRow(
onTap: () => Navigator.of(context) onTap: () => Navigator.of(context).pushNamed(
.pushNamed(Routes.transactionDetails, arguments: transaction), Routes.transactionDetails,
direction: transaction.direction, arguments: transaction),
formattedDate: DateFormat('HH:mm').format(transaction.date), direction: transaction.direction,
formattedAmount: item.formattedCryptoAmount, formattedDate: DateFormat('HH:mm')
formattedFiatAmount: .format(transaction.date),
dashboardViewModel.balanceViewModel.isFiatDisabled formattedAmount: item.formattedCryptoAmount,
? '' formattedFiatAmount: dashboardViewModel
: item.formattedFiatAmount, .balanceViewModel.isFiatDisabled
isPending: transaction.isPending, ? ''
title: item.formattedTitle + item.formattedStatus)); : item.formattedFiatAmount,
} isPending: transaction.isPending,
title: item.formattedTitle +
item.formattedStatus));
}
if (item is AnonpayTransactionListItem) { if (item is AnonpayTransactionListItem) {
final transactionInfo = item.transaction; final transactionInfo = item.transaction;
return AnonpayTransactionRow( return AnonpayTransactionRow(
onTap: () => Navigator.of(context) onTap: () => Navigator.of(context).pushNamed(
.pushNamed(Routes.anonPayDetailsPage, arguments: transactionInfo), Routes.anonPayDetailsPage,
currency: transactionInfo.fiatAmount != null arguments: transactionInfo),
? transactionInfo.fiatEquiv ?? '' currency: transactionInfo.fiatAmount != null
: CryptoCurrency.fromFullName(transactionInfo.coinTo) ? transactionInfo.fiatEquiv ?? ''
.name : CryptoCurrency.fromFullName(
.toUpperCase(), transactionInfo.coinTo)
provider: transactionInfo.provider, .name
amount: transactionInfo.fiatAmount?.toString() ?? .toUpperCase(),
(transactionInfo.amountTo?.toString() ?? ''), provider: transactionInfo.provider,
createdAt: DateFormat('HH:mm').format(transactionInfo.createdAt), amount: transactionInfo.fiatAmount?.toString() ??
); (transactionInfo.amountTo?.toString() ?? ''),
} createdAt: DateFormat('HH:mm')
.format(transactionInfo.createdAt),
);
}
if (item is TradeListItem) { if (item is TradeListItem) {
final trade = item.trade; final trade = item.trade;
return Observer( return Observer(
builder: (_) => TradeRow( builder: (_) => TradeRow(
onTap: () => Navigator.of(context) onTap: () => Navigator.of(context).pushNamed(
.pushNamed(Routes.tradeDetails, arguments: trade), Routes.tradeDetails,
provider: trade.provider, arguments: trade),
from: trade.from, provider: trade.provider,
to: trade.to, from: trade.from,
createdAtFormattedDate: trade.createdAt != null to: trade.to,
? DateFormat('HH:mm').format(trade.createdAt!)
: null,
formattedAmount: item.tradeFormattedAmount));
}
if (item is OrderListItem) {
final order = item.order;
return Observer(
builder: (_) => OrderRow(
onTap: () => Navigator.of(context)
.pushNamed(Routes.orderDetails, arguments: order),
provider: order.provider,
from: order.from!,
to: order.to!,
createdAtFormattedDate: createdAtFormattedDate:
DateFormat('HH:mm').format(order.createdAt), trade.createdAt != null
formattedAmount: item.orderFormattedAmount, ? DateFormat('HH:mm')
)); .format(trade.createdAt!)
} : null,
formattedAmount: item.tradeFormattedAmount));
}
return Container(color: Colors.transparent, height: 1); if (item is OrderListItem) {
}) final order = item.order;
: Center(
child: Text( return Observer(
S.of(context).placeholder_transactions, builder: (_) => OrderRow(
style: TextStyle( onTap: () => Navigator.of(context)
fontSize: 14, .pushNamed(Routes.orderDetails,
color: Theme.of(context).primaryTextTheme!.labelSmall!.decorationColor!), arguments: order),
), provider: order.provider,
); from: order.from!,
})) to: order.to!,
], createdAtFormattedDate: DateFormat('HH:mm')
.format(order.createdAt),
formattedAmount: item.orderFormattedAmount,
));
}
return Container(color: Colors.transparent, height: 1);
})
: Center(
child: Text(
S.of(context).placeholder_transactions,
style: TextStyle(
fontSize: 14,
color: Theme.of(context)
.primaryTextTheme
.labelSmall!
.decorationColor!),
),
);
}))
],
),
), ),
); );
} }

View file

@ -117,7 +117,7 @@ class ExchangePage extends BasePage {
final _closeButton = currentTheme.type == ThemeType.dark final _closeButton = currentTheme.type == ThemeType.dark
? closeButtonImageDarkTheme : closeButtonImage; ? closeButtonImageDarkTheme : closeButtonImage;
bool isMobileView = ResponsiveLayoutUtil.instance.isMobile(context); bool isMobileView = ResponsiveLayoutUtil.instance.isMobile;
return MergeSemantics( return MergeSemantics(
child: SizedBox( child: SizedBox(
@ -599,8 +599,8 @@ class ExchangePage extends BasePage {
alertContent: S.of(context).low_fee_alert, alertContent: S.of(context).low_fee_alert,
leftButtonText: S.of(context).ignor, leftButtonText: S.of(context).ignor,
rightButtonText: S.of(context).use_suggested, rightButtonText: S.of(context).use_suggested,
actionLeftButton: () => Navigator.of(context).pop(false), actionLeftButton: () => Navigator.of(dialogContext).pop(false),
actionRightButton: () => Navigator.of(context).pop(true)); actionRightButton: () => Navigator.of(dialogContext).pop(true));
}) ?? false; }) ?? false;
if (confirmed) { if (confirmed) {
exchangeViewModel.setDefaultTransactionPriority(); exchangeViewModel.setDefaultTransactionPriority();
@ -731,7 +731,7 @@ class ExchangePage extends BasePage {
}, },
)); ));
if (ResponsiveLayoutUtil.instance.isMobile(context)) { if (ResponsiveLayoutUtil.instance.isMobile) {
return MobileExchangeCardsSection( return MobileExchangeCardsSection(
firstExchangeCard: firstExchangeCard, firstExchangeCard: firstExchangeCard,
secondExchangeCard: secondExchangeCard, secondExchangeCard: secondExchangeCard,

View file

@ -3,14 +3,11 @@ import 'package:cake_wallet/routes.dart';
import 'package:cake_wallet/src/screens/base_page.dart'; import 'package:cake_wallet/src/screens/base_page.dart';
import 'package:cake_wallet/src/widgets/primary_button.dart'; import 'package:cake_wallet/src/widgets/primary_button.dart';
import 'package:cake_wallet/typography.dart'; import 'package:cake_wallet/typography.dart';
import 'package:cake_wallet/view_model/ionia/ionia_gift_cards_list_view_model.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/src/widgets/framework.dart';
import 'package:cake_wallet/generated/i18n.dart'; import 'package:cake_wallet/generated/i18n.dart';
import 'package:mobx/mobx.dart';
class IoniaWelcomePage extends BasePage { class IoniaWelcomePage extends BasePage {
IoniaWelcomePage(this._cardsListViewModel); IoniaWelcomePage();
@override @override
Widget middle(BuildContext context) { Widget middle(BuildContext context) {
@ -25,15 +22,8 @@ class IoniaWelcomePage extends BasePage {
); );
} }
final IoniaGiftCardsListViewModel _cardsListViewModel;
@override @override
Widget body(BuildContext context) { Widget body(BuildContext context) {
reaction((_) => _cardsListViewModel.isLoggedIn, (bool state) {
if (state) {
Navigator.pushReplacementNamed(context, Routes.ioniaManageCardsPage);
}
});
return Padding( return Padding(
padding: const EdgeInsets.all(24.0), padding: const EdgeInsets.all(24.0),
child: Column( child: Column(
@ -41,7 +31,7 @@ class IoniaWelcomePage extends BasePage {
children: [ children: [
Column( Column(
children: [ children: [
SizedBox(height: 100), SizedBox(height: 90),
Text( Text(
S.of(context).about_cake_pay, S.of(context).about_cake_pay,
style: TextStyle( style: TextStyle(

View file

@ -17,7 +17,7 @@ import 'package:cake_wallet/generated/i18n.dart';
import 'package:flutter_mobx/flutter_mobx.dart'; import 'package:flutter_mobx/flutter_mobx.dart';
class IoniaManageCardsPage extends BasePage { class IoniaManageCardsPage extends BasePage {
IoniaManageCardsPage(this._cardsListViewModel) { IoniaManageCardsPage(this._cardsListViewModel): searchFocusNode = FocusNode() {
_searchController.addListener(() { _searchController.addListener(() {
if (_searchController.text != _cardsListViewModel.searchString) { if (_searchController.text != _cardsListViewModel.searchString) {
_searchDebounce.run(() { _searchDebounce.run(() {
@ -29,6 +29,7 @@ class IoniaManageCardsPage extends BasePage {
_cardsListViewModel.getMerchants(); _cardsListViewModel.getMerchants();
} }
final FocusNode searchFocusNode;
final IoniaGiftCardsListViewModel _cardsListViewModel; final IoniaGiftCardsListViewModel _cardsListViewModel;
final _searchDebounce = Debounce(Duration(milliseconds: 500)); final _searchDebounce = Debounce(Duration(milliseconds: 500));
@ -86,7 +87,14 @@ class IoniaManageCardsPage extends BasePage {
//highlightColor: Colors.transparent, //highlightColor: Colors.transparent,
//splashColor: Colors.transparent, //splashColor: Colors.transparent,
//padding: EdgeInsets.all(0), //padding: EdgeInsets.all(0),
onPressed: () => Navigator.pop(context), onPressed: (){
if (searchFocusNode.hasFocus) {
searchFocusNode.unfocus();
return;
}
Navigator.of(context).pop();
},
child: _backButton), child: _backButton),
), ),
); );
@ -149,6 +157,7 @@ class IoniaManageCardsPage extends BasePage {
Expanded( Expanded(
child: _SearchWidget( child: _SearchWidget(
controller: _searchController, controller: _searchController,
focusNode: searchFocusNode,
)), )),
SizedBox(width: 10), SizedBox(width: 10),
filterButton filterButton
@ -266,9 +275,10 @@ class _SearchWidget extends StatelessWidget {
const _SearchWidget({ const _SearchWidget({
Key? key, Key? key,
required this.controller, required this.controller,
required this.focusNode,
}) : super(key: key); }) : super(key: key);
final TextEditingController controller; final TextEditingController controller;
final FocusNode focusNode;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final searchIcon = Padding( final searchIcon = Padding(
@ -280,6 +290,7 @@ class _SearchWidget extends StatelessWidget {
); );
return TextField( return TextField(
focusNode: focusNode,
style: TextStyle(color: Theme.of(context).accentTextTheme!.displayMedium!.backgroundColor!), style: TextStyle(color: Theme.of(context).accentTextTheme!.displayMedium!.backgroundColor!),
controller: controller, controller: controller,
decoration: InputDecoration( decoration: InputDecoration(

View file

@ -9,6 +9,7 @@ import 'package:cake_wallet/src/screens/receive/widgets/anonpay_input_form.dart'
import 'package:cake_wallet/src/widgets/alert_with_one_action.dart'; import 'package:cake_wallet/src/widgets/alert_with_one_action.dart';
import 'package:cake_wallet/src/widgets/keyboard_done_button.dart'; import 'package:cake_wallet/src/widgets/keyboard_done_button.dart';
import 'package:cake_wallet/utils/device_info.dart'; import 'package:cake_wallet/utils/device_info.dart';
import 'package:cake_wallet/utils/responsive_layout_util.dart';
import 'package:cake_wallet/view_model/anon_invoice_page_view_model.dart'; import 'package:cake_wallet/view_model/anon_invoice_page_view_model.dart';
import 'package:cake_wallet/view_model/dashboard/receive_option_view_model.dart'; import 'package:cake_wallet/view_model/dashboard/receive_option_view_model.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
@ -27,8 +28,7 @@ class AnonPayInvoicePage extends BasePage {
AnonPayInvoicePage( AnonPayInvoicePage(
this.anonInvoicePageViewModel, this.anonInvoicePageViewModel,
this.receiveOptionViewModel, this.receiveOptionViewModel,
) : _amountFocusNode = FocusNode() { ) : _amountFocusNode = FocusNode() {}
}
final _nameController = TextEditingController(); final _nameController = TextEditingController();
final _emailController = TextEditingController(); final _emailController = TextEditingController();
@ -53,6 +53,11 @@ class AnonPayInvoicePage extends BasePage {
@override @override
AppBarStyle get appBarStyle => AppBarStyle.transparent; AppBarStyle get appBarStyle => AppBarStyle.transparent;
@override
void onClose(BuildContext context) {
Navigator.popUntil(context, ModalRoute.withName(Routes.dashboard));
}
@override @override
Widget middle(BuildContext context) => Widget middle(BuildContext context) =>
PresentReceiveOptionPicker(receiveOptionViewModel: receiveOptionViewModel); PresentReceiveOptionPicker(receiveOptionViewModel: receiveOptionViewModel);
@ -65,15 +70,22 @@ class AnonPayInvoicePage extends BasePage {
anonInvoicePageViewModel.reset(); anonInvoicePageViewModel.reset();
}); });
Future<bool> _onNavigateBack(BuildContext context) async {
onClose(context);
return false;
}
@override @override
Widget body(BuildContext context) { Widget body(BuildContext context) {
WidgetsBinding.instance.addPostFrameCallback((_) => _setReactions(context)); WidgetsBinding.instance.addPostFrameCallback((_) => _setReactions(context));
return KeyboardActions( return WillPopScope(
disableScroll: true, onWillPop: () => _onNavigateBack(context),
config: KeyboardActionsConfig( child: KeyboardActions(
keyboardActionsPlatform: KeyboardActionsPlatform.IOS, disableScroll: true,
keyboardBarColor: Theme.of(context) config: KeyboardActionsConfig(
keyboardActionsPlatform: KeyboardActionsPlatform.IOS,
keyboardBarColor: Theme.of(context)
.accentTextTheme! .accentTextTheme!
.bodyLarge! .bodyLarge!
.backgroundColor!, .backgroundColor!,
@ -89,7 +101,7 @@ class AnonPayInvoicePage extends BasePage {
child: ScrollableWithBottomSection( child: ScrollableWithBottomSection(
contentPadding: EdgeInsets.only(bottom: 24), contentPadding: EdgeInsets.only(bottom: 24),
content: Container( content: Container(
decoration: DeviceInfo.instance.isMobile ? BoxDecoration( decoration: ResponsiveLayoutUtil.instance.isMobile ? BoxDecoration(
borderRadius: BorderRadius.only( borderRadius: BorderRadius.only(
bottomLeft: Radius.circular(24), bottomRight: Radius.circular(24)), bottomLeft: Radius.circular(24), bottomRight: Radius.circular(24)),
gradient: LinearGradient( gradient: LinearGradient(
@ -100,79 +112,81 @@ class AnonPayInvoicePage extends BasePage {
begin: Alignment.topLeft, begin: Alignment.topLeft,
end: Alignment.bottomRight, end: Alignment.bottomRight,
), ),
) : null, ) : null,
child: Observer(builder: (_) { child: Observer(builder: (_) {
return Padding( return Padding(
padding: EdgeInsets.fromLTRB(24, 120, 24, 0), padding: EdgeInsets.fromLTRB(24, 120, 24, 0),
child: AnonInvoiceForm( child: AnonInvoiceForm(
nameController: _nameController, nameController: _nameController,
descriptionController: _descriptionController, descriptionController: _descriptionController,
amountController: _amountController, amountController: _amountController,
emailController: _emailController, emailController: _emailController,
depositAmountFocus: _amountFocusNode, depositAmountFocus: _amountFocusNode,
formKey: _formKey, formKey: _formKey,
isInvoice: receiveOptionViewModel.selectedReceiveOption == isInvoice: receiveOptionViewModel.selectedReceiveOption ==
ReceivePageOption.anonPayInvoice, ReceivePageOption.anonPayInvoice,
anonInvoicePageViewModel: anonInvoicePageViewModel, anonInvoicePageViewModel: anonInvoicePageViewModel,
), ),
); );
}), }),
), ),
bottomSectionPadding: EdgeInsets.only(left: 24, right: 24, bottom: 24), bottomSectionPadding: EdgeInsets.only(left: 24, right: 24, bottom: 24),
bottomSection: Observer(builder: (_) { bottomSection: Observer(builder: (_) {
final isInvoice = final isInvoice =
receiveOptionViewModel.selectedReceiveOption == ReceivePageOption.anonPayInvoice; receiveOptionViewModel.selectedReceiveOption == ReceivePageOption.anonPayInvoice;
return Column( return Column(
children: <Widget>[ children: <Widget>[
Padding( Padding(
padding: EdgeInsets.only(bottom: 15), padding: EdgeInsets.only(bottom: 15),
child: Center( child: Center(
child: Text( child: Text(
isInvoice isInvoice
? S.of(context).anonpay_description("an invoice", "pay") ? S.of(context).anonpay_description("an invoice", "pay")
: S.of(context).anonpay_description("a donation link", "donate"), : S.of(context).anonpay_description("a donation link", "donate"),
textAlign: TextAlign.center, textAlign: TextAlign.center,
style: TextStyle( style: TextStyle(
color: Theme.of(context) color: Theme.of(context)
.primaryTextTheme! .primaryTextTheme!
.displayLarge! .displayLarge!
.decorationColor!, .decorationColor!,
fontWeight: FontWeight.w500, fontWeight: FontWeight.w500,
fontSize: 12), fontSize: 12),
),
), ),
), ),
), LoadingPrimaryButton(
LoadingPrimaryButton( text: isInvoice
text: ? S.of(context).create_invoice
isInvoice ? S.of(context).create_invoice : S.of(context).create_donation_link, : S.of(context).create_donation_link,
onPressed: () { onPressed: () {
anonInvoicePageViewModel.setRequestParams( anonInvoicePageViewModel.setRequestParams(
inputAmount: _amountController.text, inputAmount: _amountController.text,
inputName: _nameController.text, inputName: _nameController.text,
inputEmail: _emailController.text, inputEmail: _emailController.text,
inputDescription: _descriptionController.text, inputDescription: _descriptionController.text,
); );
if (anonInvoicePageViewModel.receipientEmail.isNotEmpty && if (anonInvoicePageViewModel.receipientEmail.isNotEmpty &&
_formKey.currentState != null && _formKey.currentState != null &&
!_formKey.currentState!.validate()) { !_formKey.currentState!.validate()) {
return; return;
} }
if (isInvoice) { if (isInvoice) {
anonInvoicePageViewModel.createInvoice(); anonInvoicePageViewModel.createInvoice();
} else { } else {
anonInvoicePageViewModel.generateDonationLink(); anonInvoicePageViewModel.generateDonationLink();
} }
}, },
color: Theme.of(context) color: Theme.of(context)
.accentTextTheme! .accentTextTheme!
.bodyLarge! .bodyLarge!
.color!, .color!,
textColor: Colors.white, textColor: Colors.white,
isLoading: anonInvoicePageViewModel.state is IsExecutingState, isLoading: anonInvoicePageViewModel.state is IsExecutingState,
), ),
], ],
); );
}), }),
),
), ),
), ),
); );

View file

@ -1,4 +1,5 @@
import 'package:cake_wallet/src/widgets/base_text_form_field.dart'; import 'package:cake_wallet/src/widgets/base_text_form_field.dart';
import 'package:cake_wallet/utils/responsive_layout_util.dart';
import 'package:cw_core/currency.dart'; import 'package:cw_core/currency.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
@ -9,7 +10,8 @@ class CurrencyInputField extends StatelessWidget {
required this.onTapPicker, required this.onTapPicker,
required this.selectedCurrency, required this.selectedCurrency,
this.focusNode, this.focusNode,
required this.controller, required this.isLight, required this.controller,
required this.isLight,
}); });
final Function() onTapPicker; final Function() onTapPicker;
@ -22,13 +24,12 @@ class CurrencyInputField extends StatelessWidget {
Widget build(BuildContext context) { Widget build(BuildContext context) {
final arrowBottomPurple = Image.asset( final arrowBottomPurple = Image.asset(
'assets/images/arrow_bottom_purple_icon.png', 'assets/images/arrow_bottom_purple_icon.png',
color: Theme.of(context) color: Theme.of(context).accentTextTheme!.displayMedium!.backgroundColor!,
.accentTextTheme!
.displayMedium!
.backgroundColor!,
height: 8, height: 8,
); );
final _width = MediaQuery.of(context).size.width; // This magic number for wider screen sets the text input focus at center of the inputfield
final _width =
ResponsiveLayoutUtil.instance.isMobile ? MediaQuery.of(context).size.width : 500;
return Column( return Column(
children: [ children: [
@ -42,10 +43,12 @@ class CurrencyInputField extends StatelessWidget {
keyboardType: TextInputType.numberWithOptions(signed: false, decimal: true), keyboardType: TextInputType.numberWithOptions(signed: false, decimal: true),
inputFormatters: [FilteringTextInputFormatter.allow(RegExp(r'^\d+(\.|\,)?\d{0,8}'))], inputFormatters: [FilteringTextInputFormatter.allow(RegExp(r'^\d+(\.|\,)?\d{0,8}'))],
hintText: '0.000', hintText: '0.000',
placeholderTextStyle: isLight ? null : TextStyle( placeholderTextStyle: isLight
color: Theme.of(context).primaryTextTheme!.headlineSmall!.color!, ? null
fontWeight: FontWeight.w600, : TextStyle(
), color: Theme.of(context).primaryTextTheme!.headlineSmall!.color!,
fontWeight: FontWeight.w600,
),
borderColor: Theme.of(context).accentTextTheme!.titleLarge!.backgroundColor!, borderColor: Theme.of(context).accentTextTheme!.titleLarge!.backgroundColor!,
textColor: Theme.of(context).accentTextTheme!.displayMedium!.backgroundColor!, textColor: Theme.of(context).accentTextTheme!.displayMedium!.backgroundColor!,
textStyle: TextStyle( textStyle: TextStyle(
@ -72,7 +75,10 @@ class CurrencyInputField extends StatelessWidget {
style: TextStyle( style: TextStyle(
fontWeight: FontWeight.w600, fontWeight: FontWeight.w600,
fontSize: 16, fontSize: 16,
color: Theme.of(context).accentTextTheme!.displayMedium!.backgroundColor!, color: Theme.of(context)
.accentTextTheme!
.displayMedium!
.backgroundColor!,
), ),
), ),
if (selectedCurrency.tag != null) if (selectedCurrency.tag != null)
@ -107,8 +113,10 @@ class CurrencyInputField extends StatelessWidget {
style: TextStyle( style: TextStyle(
fontWeight: FontWeight.w600, fontWeight: FontWeight.w600,
fontSize: 20, fontSize: 20,
color: color: Theme.of(context)
Theme.of(context).accentTextTheme!.displayMedium!.backgroundColor!, .accentTextTheme!
.displayMedium!
.backgroundColor!,
), ),
), ),
), ),

View file

@ -274,6 +274,8 @@ class WalletRestorePage extends BasePage {
} }
void _confirmForm() { void _confirmForm() {
// Dismissing all visible keyboard to provide context for navigation
FocusManager.instance.primaryFocus?.unfocus();
final formContext = walletRestoreViewModel.mode == WalletRestoreMode.seed final formContext = walletRestoreViewModel.mode == WalletRestoreMode.seed
? walletRestoreFromSeedFormKey.currentContext ? walletRestoreFromSeedFormKey.currentContext
: walletRestoreFromKeysFormKey.currentContext; : walletRestoreFromKeysFormKey.currentContext;

View file

@ -62,7 +62,7 @@ class SendPage extends BasePage {
final _closeButton = currentTheme.type == ThemeType.dark final _closeButton = currentTheme.type == ThemeType.dark
? closeButtonImageDarkTheme : closeButtonImage; ? closeButtonImageDarkTheme : closeButtonImage;
bool isMobileView = ResponsiveLayoutUtil.instance.isMobile(context); bool isMobileView = ResponsiveLayoutUtil.instance.isMobile;
return MergeSemantics( return MergeSemantics(
child: SizedBox( child: SizedBox(
@ -92,7 +92,7 @@ class SendPage extends BasePage {
double _sendCardHeight(BuildContext context) { double _sendCardHeight(BuildContext context) {
final double initialHeight = sendViewModel.isElectrumWallet ? 490 : 465; final double initialHeight = sendViewModel.isElectrumWallet ? 490 : 465;
if (!ResponsiveLayoutUtil.instance.isMobile(context)) { if (!ResponsiveLayoutUtil.instance.isMobile) {
return initialHeight - 66; return initialHeight - 66;
} }
return initialHeight; return initialHeight;
@ -145,216 +145,247 @@ class SendPage extends BasePage {
Widget body(BuildContext context) { Widget body(BuildContext context) {
_setEffects(context); _setEffects(context);
return Form( return GestureDetector(
key: _formKey, onLongPress: () => sendViewModel.balanceViewModel.isReversing =
child: ScrollableWithBottomSection( !sendViewModel.balanceViewModel.isReversing,
contentPadding: EdgeInsets.only(bottom: 24), onLongPressUp: () => sendViewModel.balanceViewModel.isReversing =
content: FocusTraversalGroup( !sendViewModel.balanceViewModel.isReversing,
policy: OrderedTraversalPolicy(), child: Form(
child: Column( key: _formKey,
children: <Widget>[ child: ScrollableWithBottomSection(
Container( contentPadding: EdgeInsets.only(bottom: 24),
height: _sendCardHeight(context), content: FocusTraversalGroup(
child: Observer( policy: OrderedTraversalPolicy(),
builder: (_) { child: Column(
return PageView.builder( children: <Widget>[
scrollDirection: Axis.horizontal, Container(
controller: controller, height: _sendCardHeight(context),
itemCount: sendViewModel.outputs.length, child: Observer(
itemBuilder: (context, index) { builder: (_) {
final output = sendViewModel.outputs[index]; return PageView.builder(
scrollDirection: Axis.horizontal,
return SendCard( controller: controller,
key: output.key, itemCount: sendViewModel.outputs.length,
output: output, itemBuilder: (context, index) {
sendViewModel: sendViewModel, final output = sendViewModel.outputs[index];
initialPaymentRequest: initialPaymentRequest,
); return SendCard(
}); key: output.key,
}, output: output,
)), sendViewModel: sendViewModel,
Padding( initialPaymentRequest: initialPaymentRequest,
padding: );
EdgeInsets.only(top: 10, left: 24, right: 24, bottom: 10), });
child: Container( },
height: 10, )),
child: Observer( Padding(
builder: (_) { padding: EdgeInsets.only(
final count = sendViewModel.outputs.length; top: 10, left: 24, right: 24, bottom: 10),
child: Container(
return count > 1 height: 10,
? SmoothPageIndicator( child: Observer(
controller: controller, builder: (_) {
count: count, final count = sendViewModel.outputs.length;
effect: ScrollingDotsEffect(
spacing: 6.0, return count > 1
radius: 6.0, ? SmoothPageIndicator(
dotWidth: 6.0, controller: controller,
dotHeight: 6.0, count: count,
dotColor: Theme.of(context) effect: ScrollingDotsEffect(
.primaryTextTheme!.displaySmall! spacing: 6.0,
.backgroundColor!, radius: 6.0,
activeDotColor: Theme.of(context) dotWidth: 6.0,
.primaryTextTheme!.displayMedium! dotHeight: 6.0,
.backgroundColor!), dotColor: Theme.of(context)
) .primaryTextTheme
: Offstage(); !.displaySmall!
}, .backgroundColor!,
activeDotColor: Theme.of(context)
.primaryTextTheme
!.displayMedium!
.backgroundColor!),
)
: Offstage();
},
),
), ),
), ),
), if (sendViewModel.hasMultiRecipient)
if (sendViewModel.hasMultiRecipient) Container(
Container( height: 40,
height: 40, width: double.infinity,
width: double.infinity, padding: EdgeInsets.only(left: 24),
padding: EdgeInsets.only(left: 24), child: SingleChildScrollView(
child: SingleChildScrollView( scrollDirection: Axis.horizontal,
scrollDirection: Axis.horizontal, child: Observer(
child: Observer( builder: (_) {
builder: (_) { final templates = sendViewModel.templates;
final templates = sendViewModel.templates; final itemCount = templates.length;
final itemCount = templates.length;
return Row(
return Row( children: <Widget>[
children: <Widget>[ AddTemplateButton(
AddTemplateButton( onTap: () => Navigator.of(context)
onTap: () => Navigator.of(context).pushNamed(Routes.sendTemplate), .pushNamed(Routes.sendTemplate),
currentTemplatesLength: templates.length, currentTemplatesLength: templates.length,
), ),
ListView.builder( ListView.builder(
scrollDirection: Axis.horizontal, scrollDirection: Axis.horizontal,
shrinkWrap: true, shrinkWrap: true,
physics: NeverScrollableScrollPhysics(), physics: NeverScrollableScrollPhysics(),
itemCount: itemCount, itemCount: itemCount,
itemBuilder: (context, index) { itemBuilder: (context, index) {
final template = templates[index]; final template = templates[index];
return TemplateTile( return TemplateTile(
key: UniqueKey(), key: UniqueKey(),
to: template.name, to: template.name,
amount: template.isCurrencySelected ? template.amount : template.amountFiat, amount: template.isCurrencySelected
from: template.isCurrencySelected ? template.cryptoCurrency : template.fiatCurrency, ? template.amount
onTap: () async { : template.amountFiat,
final fiatFromTemplate = FiatCurrency.all.singleWhere((element) => element.title == template.fiatCurrency); from: template.isCurrencySelected
final output = _defineCurrentOutput(); ? template.cryptoCurrency
output.address = template.address; : template.fiatCurrency,
if(template.isCurrencySelected){ onTap: () async {
output.setCryptoAmount(template.amount); final fiatFromTemplate = FiatCurrency
}else{ .all
sendViewModel.setFiatCurrency(fiatFromTemplate); .singleWhere((element) =>
output.setFiatAmount(template.amountFiat); element.title ==
} template.fiatCurrency);
output.resetParsedAddress(); final output = _defineCurrentOutput();
await output.fetchParsedAddress(context); output.address = template.address;
}, if (template.isCurrencySelected) {
onRemove: () { output
showPopUp<void>( .setCryptoAmount(template.amount);
context: context, } else {
builder: (dialogContext) { sendViewModel.setFiatCurrency(
return AlertWithTwoActions( fiatFromTemplate);
alertTitle: S.of(context).template, output.setFiatAmount(
alertContent: S template.amountFiat);
.of(context) }
.confirm_delete_template, output.resetParsedAddress();
rightButtonText: S.of(context).delete, await output
leftButtonText: S.of(context).cancel, .fetchParsedAddress(context);
actionRightButton: () { },
Navigator.of(dialogContext).pop(); onRemove: () {
sendViewModel.sendTemplateViewModel showPopUp<void>(
.removeTemplate( context: context,
template: template); builder: (dialogContext) {
}, return AlertWithTwoActions(
actionLeftButton: () => alertTitle:
Navigator.of(dialogContext) S.of(context).template,
.pop()); alertContent: S
.of(context)
.confirm_delete_template,
rightButtonText:
S.of(context).delete,
leftButtonText:
S.of(context).cancel,
actionRightButton: () {
Navigator.of(dialogContext)
.pop();
sendViewModel
.sendTemplateViewModel
.removeTemplate(
template: template);
},
actionLeftButton: () =>
Navigator.of(dialogContext)
.pop());
},
);
}, },
); );
}, },
); ),
}, ],
), );
], },
); ),
}, ),
),
),
)
],
),
),
bottomSectionPadding:
EdgeInsets.only(left: 24, right: 24, bottom: 24),
bottomSection: Column(
children: [
if (sendViewModel.hasCurrecyChanger)
Observer(builder: (_) =>
Padding(
padding: EdgeInsets.only(bottom: 12),
child: PrimaryButton(
onPressed: () => presentCurrencyPicker(context),
text: 'Change your asset (${sendViewModel.selectedCryptoCurrency})',
color: Colors.transparent,
textColor: Theme.of(context)
.accentTextTheme!.displaySmall!
.decorationColor!,
) )
) ],
), ),
if (sendViewModel.hasMultiRecipient) ),
Padding( bottomSectionPadding:
padding: EdgeInsets.only(bottom: 12), EdgeInsets.only(left: 24, right: 24, bottom: 24),
child: PrimaryButton( bottomSection: Column(
onPressed: () { children: [
sendViewModel.addOutput(); if (sendViewModel.hasCurrecyChanger)
Future.delayed(const Duration(milliseconds: 250), () { Observer(
controller.jumpToPage(sendViewModel.outputs.length - 1); builder: (_) => Padding(
}); padding: EdgeInsets.only(bottom: 12),
}, child: PrimaryButton(
text: S.of(context).add_receiver, onPressed: () => presentCurrencyPicker(context),
color: Colors.transparent, text:
textColor: Theme.of(context) 'Change your asset (${sendViewModel.selectedCryptoCurrency})',
.accentTextTheme!.displaySmall! color: Colors.transparent,
.decorationColor!, textColor: Theme.of(context)
isDottedBorder: true, .accentTextTheme
borderColor: Theme.of(context) !.displaySmall!
.primaryTextTheme!.displaySmall! .decorationColor!,
.decorationColor!, ))),
)), if (sendViewModel.hasMultiRecipient)
Observer( Padding(
builder: (_) { padding: EdgeInsets.only(bottom: 12),
return LoadingPrimaryButton( child: PrimaryButton(
onPressed: () async { onPressed: () {
if (_formKey.currentState != null && !_formKey.currentState!.validate()) { sendViewModel.addOutput();
if (sendViewModel.outputs.length > 1) { Future.delayed(const Duration(milliseconds: 250), () {
showErrorValidationAlert(context); controller
.jumpToPage(sendViewModel.outputs.length - 1);
});
},
text: S.of(context).add_receiver,
color: Colors.transparent,
textColor: Theme.of(context)
.accentTextTheme
!.displaySmall!
.decorationColor!,
isDottedBorder: true,
borderColor: Theme.of(context)
.primaryTextTheme
!.displaySmall!
.decorationColor!,
)),
Observer(
builder: (_) {
return LoadingPrimaryButton(
onPressed: () async {
if (_formKey.currentState != null &&
!_formKey.currentState!.validate()) {
if (sendViewModel.outputs.length > 1) {
showErrorValidationAlert(context);
}
return;
} }
return; final notValidItems = sendViewModel.outputs
} .where((item) =>
item.address.isEmpty ||
item.cryptoAmount.isEmpty)
.toList();
final notValidItems = sendViewModel.outputs if (notValidItems.isNotEmpty ?? false) {
.where((item) => showErrorValidationAlert(context);
item.address.isEmpty || item.cryptoAmount.isEmpty) return;
.toList(); }
if (notValidItems.isNotEmpty ?? false) { await sendViewModel.createTransaction();
showErrorValidationAlert(context); },
return; text: S.of(context).send,
} color:
Theme.of(context).accentTextTheme!.bodyLarge!.color!,
await sendViewModel.createTransaction(); textColor: Colors.white,
isLoading: sendViewModel.state is IsExecutingState ||
}, sendViewModel.state is TransactionCommitting,
text: S.of(context).send, isDisabled: !sendViewModel.isReadyForSend,
color: Theme.of(context).accentTextTheme!.bodyLarge!.color!, );
textColor: Colors.white, },
isLoading: sendViewModel.state is IsExecutingState || )
sendViewModel.state is TransactionCommitting, ],
isDisabled: !sendViewModel.isReadyForSend, )),
); ),
},
)
],
)),
); );
} }
@ -382,51 +413,54 @@ class SendPage extends BasePage {
WidgetsBinding.instance.addPostFrameCallback((_) { WidgetsBinding.instance.addPostFrameCallback((_) {
if (context.mounted) { if (context.mounted) {
showPopUp<void>( showPopUp<void>(
context: context, context: context,
builder: (BuildContext context) { builder: (BuildContext context) {
return ConfirmSendingAlert( return ConfirmSendingAlert(
alertTitle: S.of(context).confirm_sending, alertTitle: S.of(context).confirm_sending,
amount: S.of(context).send_amount, amount: S.of(context).send_amount,
amountValue: amountValue:
sendViewModel.pendingTransaction!.amountFormatted, sendViewModel.pendingTransaction!.amountFormatted,
fiatAmountValue: sendViewModel.pendingTransactionFiatAmountFormatted, fiatAmountValue:
fee: S.of(context).send_fee, sendViewModel.pendingTransactionFiatAmountFormatted,
feeValue: sendViewModel.pendingTransaction!.feeFormatted, fee: S.of(context).send_fee,
feeFiatAmount: sendViewModel.pendingTransactionFeeFiatAmountFormatted, feeValue: sendViewModel.pendingTransaction!.feeFormatted,
outputs: sendViewModel.outputs, feeFiatAmount: sendViewModel
rightButtonText: S.of(context).ok, .pendingTransactionFeeFiatAmountFormatted,
leftButtonText: S.of(context).cancel, outputs: sendViewModel.outputs,
actionRightButton: () { rightButtonText: S.of(context).ok,
Navigator.of(context).pop(); leftButtonText: S.of(context).cancel,
sendViewModel.commitTransaction(); actionRightButton: () {
showPopUp<void>( Navigator.of(context).pop();
context: context, sendViewModel.commitTransaction();
builder: (BuildContext context) { showPopUp<void>(
return Observer(builder: (_) { context: context,
final state = sendViewModel.state; builder: (BuildContext context) {
return Observer(builder: (_) {
final state = sendViewModel.state;
if (state is FailureState) { if (state is FailureState) {
Navigator.of(context).pop(); Navigator.of(context).pop();
}
if (state is TransactionCommitted) {
return AlertWithOneAction(
alertTitle: '',
alertContent: S.of(context).send_success(
sendViewModel.selectedCryptoCurrency.toString()),
buttonText: S.of(context).ok,
buttonAction: () {
Navigator.of(context).pop();
RequestReviewHandler.requestReview();
});
} }
return Offstage(); if (state is TransactionCommitted) {
return AlertWithOneAction(
alertTitle: '',
alertContent: S.of(context).send_success(
sendViewModel.selectedCryptoCurrency
.toString()),
buttonText: S.of(context).ok,
buttonAction: () {
Navigator.of(context).pop();
RequestReviewHandler.requestReview();
});
}
return Offstage();
});
}); });
}); },
}, actionLeftButton: () => Navigator.of(context).pop());
actionLeftButton: () => Navigator.of(context).pop()); });
});
} }
}); });
} }
@ -461,16 +495,18 @@ class SendPage extends BasePage {
}); });
} }
void presentCurrencyPicker(BuildContext context) async { void presentCurrencyPicker(BuildContext context) async {
await showPopUp<CryptoCurrency>( await showPopUp<CryptoCurrency>(
builder: (_) => Picker( builder: (_) => Picker(
items: sendViewModel.currencies, items: sendViewModel.currencies,
displayItem: (Object item) => item.toString(), displayItem: (Object item) => item.toString(),
selectedAtIndex: sendViewModel.currencies.indexOf(sendViewModel.selectedCryptoCurrency), selectedAtIndex: sendViewModel.currencies
title: S.of(context).please_select, .indexOf(sendViewModel.selectedCryptoCurrency),
mainAxisAlignment: MainAxisAlignment.center, title: S.of(context).please_select,
onItemSelected: (CryptoCurrency cur) => sendViewModel.selectedCryptoCurrency = cur, mainAxisAlignment: MainAxisAlignment.center,
), onItemSelected: (CryptoCurrency cur) =>
sendViewModel.selectedCryptoCurrency = cur,
),
context: context); context: context);
} }
} }

View file

@ -122,7 +122,7 @@ class SendCardState extends State<SendCard>
color: Colors.transparent, color: Colors.transparent,
)), )),
Container( Container(
decoration: ResponsiveLayoutUtil.instance.isMobile(context) ? BoxDecoration( decoration: ResponsiveLayoutUtil.instance.isMobile ? BoxDecoration(
borderRadius: BorderRadius.only( borderRadius: BorderRadius.only(
bottomLeft: Radius.circular(24), bottomLeft: Radius.circular(24),
bottomRight: Radius.circular(24)), bottomRight: Radius.circular(24)),
@ -137,9 +137,9 @@ class SendCardState extends State<SendCard>
child: Padding( child: Padding(
padding: EdgeInsets.fromLTRB( padding: EdgeInsets.fromLTRB(
24, 24,
ResponsiveLayoutUtil.instance.isMobile(context) ? 100 : 55, ResponsiveLayoutUtil.instance.isMobile ? 100 : 55,
24, 24,
ResponsiveLayoutUtil.instance.isMobile(context) ? 32 : 0, ResponsiveLayoutUtil.instance.isMobile ? 32 : 0,
), ),
child: SingleChildScrollView( child: SingleChildScrollView(
child: Observer(builder: (_) => Column( child: Observer(builder: (_) => Column(

View file

@ -8,6 +8,7 @@ import 'package:cake_wallet/src/screens/settings/widgets/settings_switcher_cell.
import 'package:cake_wallet/themes/theme_base.dart'; import 'package:cake_wallet/themes/theme_base.dart';
import 'package:cake_wallet/themes/theme_list.dart'; import 'package:cake_wallet/themes/theme_list.dart';
import 'package:cake_wallet/utils/device_info.dart'; import 'package:cake_wallet/utils/device_info.dart';
import 'package:cake_wallet/utils/responsive_layout_util.dart';
import 'package:cake_wallet/view_model/settings/choices_list_item.dart'; import 'package:cake_wallet/view_model/settings/choices_list_item.dart';
import 'package:cake_wallet/view_model/settings/display_settings_view_model.dart'; import 'package:cake_wallet/view_model/settings/display_settings_view_model.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
@ -29,11 +30,11 @@ class DisplaySettingsPage extends BasePage {
child: Column( child: Column(
children: [ children: [
SettingsSwitcherCell( SettingsSwitcherCell(
title: S.current.settings_display_balance, title: S.current.settings_display_balance,
value: _displaySettingsViewModel.shouldDisplayBalance, value: _displaySettingsViewModel.shouldDisplayBalance,
onValueChange: (_, bool value) { onValueChange: (_, bool value) {
_displaySettingsViewModel.setShouldDisplayBalance(value); _displaySettingsViewModel.setShouldDisplayBalance(value);
}), }),
SettingsSwitcherCell( SettingsSwitcherCell(
title: S.current.show_market_place, title: S.current.show_market_place,
value: _displaySettingsViewModel.shouldShowMarketPlaceInDashboard, value: _displaySettingsViewModel.shouldShowMarketPlaceInDashboard,
@ -42,14 +43,17 @@ class DisplaySettingsPage extends BasePage {
}, },
), ),
//if (!isHaven) it does not work correctly //if (!isHaven) it does not work correctly
if(!_displaySettingsViewModel.disabledFiatApiMode) if (!_displaySettingsViewModel.disabledFiatApiMode)
SettingsPickerCell<FiatCurrency>( SettingsPickerCell<FiatCurrency>(
title: S.current.settings_currency, title: S.current.settings_currency,
searchHintText: S.current.search_currency, searchHintText: S.current.search_currency,
items: FiatCurrency.all, items: FiatCurrency.all,
selectedItem: _displaySettingsViewModel.fiatCurrency, selectedItem: _displaySettingsViewModel.fiatCurrency,
onItemSelected: (FiatCurrency currency) => _displaySettingsViewModel.setFiatCurrency(currency), onItemSelected: (FiatCurrency currency) =>
images: FiatCurrency.all.map((e) => Image.asset("assets/images/flags/${e.countryCode}.png")).toList(), _displaySettingsViewModel.setFiatCurrency(currency),
images: FiatCurrency.all
.map((e) => Image.asset("assets/images/flags/${e.countryCode}.png"))
.toList(),
isGridView: true, isGridView: true,
matchingCriteria: (FiatCurrency currency, String searchText) { matchingCriteria: (FiatCurrency currency, String searchText) {
return currency.title.toLowerCase().contains(searchText) || return currency.title.toLowerCase().contains(searchText) ||
@ -66,13 +70,14 @@ class DisplaySettingsPage extends BasePage {
selectedItem: _displaySettingsViewModel.languageCode, selectedItem: _displaySettingsViewModel.languageCode,
onItemSelected: _displaySettingsViewModel.onLanguageSelected, onItemSelected: _displaySettingsViewModel.onLanguageSelected,
images: LanguageService.list.keys images: LanguageService.list.keys
.map((e) => Image.asset("assets/images/flags/${LanguageService.localeCountryCode[e]}.png")) .map((e) => Image.asset(
"assets/images/flags/${LanguageService.localeCountryCode[e]}.png"))
.toList(), .toList(),
matchingCriteria: (String code, String searchText) { matchingCriteria: (String code, String searchText) {
return LanguageService.list[code]?.toLowerCase().contains(searchText) ?? false; return LanguageService.list[code]?.toLowerCase().contains(searchText) ?? false;
}, },
), ),
if (DeviceInfo.instance.isMobile) if (ResponsiveLayoutUtil.instance.isMobile && DeviceInfo.instance.isMobile)
SettingsChoicesCell( SettingsChoicesCell(
ChoicesListItem<ThemeBase>( ChoicesListItem<ThemeBase>(
title: S.current.color_theme, title: S.current.color_theme,

View file

@ -43,26 +43,24 @@ class TotpAuthCodePageState extends State<TotpAuthCodePage> {
@override @override
void initState() { void initState() {
_reaction ??= reaction((_) => widget.setup2FAViewModel.state, (ExecutionState state) { if(widget.totpArguments.onTotpAuthenticationFinished != null) {
if (state is ExecutedSuccessfullyState) { _reaction ??= reaction((_) => widget.setup2FAViewModel.state, (ExecutionState state) {
WidgetsBinding.instance.addPostFrameCallback((_) { WidgetsBinding.instance.addPostFrameCallback((_) {
widget.totpArguments.onTotpAuthenticationFinished!(true, this); if (state is ExecutedSuccessfullyState) {
}); widget.totpArguments.onTotpAuthenticationFinished!(true, this);
} }
if (state is FailureState) { if (state is FailureState) {
print(state.error); print(state.error);
WidgetsBinding.instance.addPostFrameCallback((_) { widget.totpArguments.onTotpAuthenticationFinished!(false, this);
widget.totpArguments.onTotpAuthenticationFinished!(false, this); }
});
}
if (state is AuthenticationBanned) { if (state is AuthenticationBanned) {
WidgetsBinding.instance.addPostFrameCallback((_) { widget.totpArguments.onTotpAuthenticationFinished!(false, this);
widget.totpArguments.onTotpAuthenticationFinished!(false, this); }
}); });
}
}); });
}
super.initState(); super.initState();
} }

View file

@ -2,7 +2,7 @@ import 'package:cake_wallet/main.dart';
import 'package:cake_wallet/src/screens/auth/auth_page.dart'; import 'package:cake_wallet/src/screens/auth/auth_page.dart';
import 'package:cake_wallet/core/auth_service.dart'; import 'package:cake_wallet/core/auth_service.dart';
import 'package:cake_wallet/src/widgets/alert_with_two_actions.dart'; import 'package:cake_wallet/src/widgets/alert_with_two_actions.dart';
import 'package:cake_wallet/utils/device_info.dart'; import 'package:cake_wallet/utils/responsive_layout_util.dart';
import 'package:cake_wallet/utils/show_bar.dart'; import 'package:cake_wallet/utils/show_bar.dart';
import 'package:cake_wallet/utils/show_pop_up.dart'; import 'package:cake_wallet/utils/show_pop_up.dart';
import 'package:cake_wallet/view_model/wallet_list/wallet_list_item.dart'; import 'package:cake_wallet/view_model/wallet_list/wallet_list_item.dart';
@ -217,7 +217,7 @@ class WalletListBodyState extends State<WalletListBody> {
await hideProgressText(); await hideProgressText();
// only pop the wallets route in mobile as it will go back to dashboard page // only pop the wallets route in mobile as it will go back to dashboard page
// in desktop platforms the navigation tree is different // in desktop platforms the navigation tree is different
if (DeviceInfo.instance.isMobile) { if (ResponsiveLayoutUtil.instance.isMobile) {
WidgetsBinding.instance.addPostFrameCallback((_) { WidgetsBinding.instance.addPostFrameCallback((_) {
Navigator.of(context).pop(); Navigator.of(context).pop();
}); });
@ -281,16 +281,16 @@ class WalletListBodyState extends State<WalletListBody> {
} }
ActionPane _actionPane(WalletListItem wallet) => ActionPane( ActionPane _actionPane(WalletListItem wallet) => ActionPane(
motion: const ScrollMotion(), motion: const ScrollMotion(),
extentRatio: 0.3, extentRatio: 0.3,
children: [ children: [
SlidableAction( SlidableAction(
onPressed: (_) => _removeWallet(wallet), onPressed: (_) => _removeWallet(wallet),
backgroundColor: Colors.red, backgroundColor: Colors.red,
foregroundColor: Colors.white, foregroundColor: Colors.white,
icon: CupertinoIcons.delete, icon: CupertinoIcons.delete,
label: S.of(context).delete, label: S.of(context).delete,
), ),
], ],
); );
} }

View file

@ -26,7 +26,7 @@ class AddTemplateButton extends StatelessWidget {
child: Container( child: Container(
height: 34, height: 34,
padding: EdgeInsets.symmetric( padding: EdgeInsets.symmetric(
horizontal: ResponsiveLayoutUtil.instance.isMobile(context) ? 10 : 30), horizontal: ResponsiveLayoutUtil.instance.isMobile ? 10 : 30),
alignment: Alignment.center, alignment: Alignment.center,
decoration: BoxDecoration( decoration: BoxDecoration(
borderRadius: BorderRadius.all(Radius.circular(20)), borderRadius: BorderRadius.all(Radius.circular(20)),

View file

@ -1,6 +1,6 @@
import 'dart:io';
import 'package:cake_wallet/utils/device_info.dart'; import 'package:cake_wallet/utils/device_info.dart';
import 'package:cake_wallet/utils/responsive_layout_util.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:cake_wallet/routes.dart'; import 'package:cake_wallet/routes.dart';
@ -105,7 +105,7 @@ class AddressTextField extends StatelessWidget {
width: prefixIconWidth * options.length + width: prefixIconWidth * options.length +
(spaceBetweenPrefixIcons * options.length), (spaceBetweenPrefixIcons * options.length),
child: Row( child: Row(
mainAxisAlignment: DeviceInfo.instance.isMobile mainAxisAlignment: ResponsiveLayoutUtil.instance.isMobile
? MainAxisAlignment.spaceBetween : MainAxisAlignment.end, ? MainAxisAlignment.spaceBetween : MainAxisAlignment.end,
children: [ children: [
SizedBox(width: 5), SizedBox(width: 5),

View file

@ -1,3 +1,4 @@
import 'package:cake_wallet/utils/exception_handler.dart';
import 'package:cw_core/transaction_info.dart'; import 'package:cw_core/transaction_info.dart';
import 'package:mobx/mobx.dart'; import 'package:mobx/mobx.dart';
import 'package:cw_core/balance.dart'; import 'package:cw_core/balance.dart';
@ -38,5 +39,6 @@ abstract class AppStoreBase with Store {
wallet) { wallet) {
this.wallet?.close(); this.wallet?.close();
this.wallet = wallet; this.wallet = wallet;
this.wallet!.setExceptionHandler(ExceptionHandler.onError);
} }
} }

View file

@ -587,7 +587,6 @@ abstract class SettingsStoreBase with Store {
if (Platform.isAndroid) { if (Platform.isAndroid) {
final androidInfo = await deviceInfoPlugin.androidInfo; final androidInfo = await deviceInfoPlugin.androidInfo;
deviceName = '${androidInfo.brand}%20${androidInfo.manufacturer}%20${androidInfo.model}'; deviceName = '${androidInfo.brand}%20${androidInfo.manufacturer}%20${androidInfo.model}';
print(deviceName);
} else if (Platform.isIOS) { } else if (Platform.isIOS) {
final iosInfo = await deviceInfoPlugin.iosInfo; final iosInfo = await deviceInfoPlugin.iosInfo;
deviceName = iosInfo.model; deviceName = iosInfo.model;

View file

@ -131,17 +131,16 @@ class ExceptionHandler {
_ignoredErrors.any((element) => error.contains(element)); _ignoredErrors.any((element) => error.contains(element));
static const List<String> _ignoredErrors = const [ static const List<String> _ignoredErrors = const [
"errno = 9", // SocketException: Bad file descriptor "Bad file descriptor",
"errno = 28", // OS Error: No space left on device "No space left on device",
"errno = 32", // SocketException: Write failed (OS Error: Broken pipe) "Write failed (OS Error: Broken pipe)",
"errno = 49", // SocketException: Can't assign requested address "Can't assign requested address",
"errno = 54", // SocketException: Connection reset by peer "Read failed (OS Error: Socket is not connected)",
"errno = 57", // SocketException: Read failed (OS Error: Socket is not connected) "Operation timed out",
"errno = 60", // SocketException: Operation timed out "No route to host",
"errno = 65", // SocketException: No route to host "Software caused connection abort",
"errno = 103", // SocketException: Software caused connection abort "Connection reset by peer",
"errno = 104", // SocketException: Connection reset by peer "Connection timed out",
"errno = 110", // SocketException: Connection timed out
"Connection reset by peer", "Connection reset by peer",
"Connection closed before full header was received", "Connection closed before full header was received",
"Connection terminated during handshake", "Connection terminated during handshake",

View file

@ -1,33 +1,35 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
class ResponsiveLayoutUtil { class ResponsiveLayoutUtil {
static const double _kMobileThreshold = 900; static const double _kMobileThreshold = 768;
static const double kDesktopMaxWidthConstraint = 400; static const double kDesktopMaxWidthConstraint = 400;
static const double kPopupWidth = 400; static const double kPopupWidth = 400;
static const double kPopupSpaceHeight = 100; static const double kPopupSpaceHeight = 100;
static const _kIpadMaxWidth = 2560.0;
const ResponsiveLayoutUtil._(); const ResponsiveLayoutUtil._();
static final instance = ResponsiveLayoutUtil._(); static final instance = ResponsiveLayoutUtil._();
bool isMobile(BuildContext context) { bool get isMobile =>
final MediaQueryData mediaQueryData = MediaQuery.of(context); MediaQueryData.fromWindow(WidgetsBinding.instance.window).size.width < _kMobileThreshold;
return mediaQueryData.size.width < _kMobileThreshold;
bool get isIpad {
final width = MediaQueryData.fromWindow(WidgetsBinding.instance.window).size.width;
return width >= _kMobileThreshold && !(width > _kIpadMaxWidth);
} }
/// Returns dynamic size. /// Returns dynamic size.
/// ///
/// If screen size is mobile, it returns 66% ([scale]) of the [originalValue]. /// If screen size is mobile, it returns 66% ([scale]) of the [originalValue].
double getDynamicSize( double getDynamicSize(
BuildContext context,
double originalValue, { double originalValue, {
double? mobileSize, double? mobileSize,
double? scale, double? scale,
}) { }) {
scale ??= 2 / 3; scale ??= 2 / 3;
mobileSize ??= originalValue * scale; mobileSize ??= originalValue * scale;
final value = isMobile(context) ? mobileSize : originalValue; final value = isMobile ? mobileSize : originalValue;
return value.roundToDouble(); return value.roundToDouble();
} }

View file

@ -296,8 +296,7 @@ abstract class DashboardViewModelBase with Store {
bool get isEnabledSellAction => bool get isEnabledSellAction =>
!settingsStore.disableSell && !settingsStore.disableSell &&
wallet.type != WalletType.haven && wallet.type != WalletType.haven &&
wallet.type != WalletType.monero && wallet.type != WalletType.monero;
wallet.type != WalletType.litecoin;
@observable @observable
bool hasSellAction; bool hasSellAction;

View file

@ -0,0 +1,17 @@
import 'package:cake_wallet/ionia/ionia_service.dart';
import 'package:mobx/mobx.dart';
part 'market_place_view_model.g.dart';
class MarketPlaceViewModel = MarketPlaceViewModelBase with _$MarketPlaceViewModel;
abstract class MarketPlaceViewModelBase with Store {
final IoniaService _ioniaService;
MarketPlaceViewModelBase(this._ioniaService);
Future<bool> isIoniaUserAuthenticated() async {
return await _ioniaService.isLogined();
}
}

View file

@ -13,7 +13,6 @@ import 'package:cake_wallet/view_model/dashboard/balance_view_model.dart';
import 'package:cw_core/keyable.dart'; import 'package:cw_core/keyable.dart';
import 'package:cw_core/wallet_type.dart'; import 'package:cw_core/wallet_type.dart';
class TransactionListItem extends ActionListItem with Keyable { class TransactionListItem extends ActionListItem with Keyable {
TransactionListItem( TransactionListItem(
{required this.transaction, {required this.transaction,
@ -28,7 +27,7 @@ class TransactionListItem extends ActionListItem with Keyable {
FiatCurrency get fiatCurrency => settingsStore.fiatCurrency; FiatCurrency get fiatCurrency => settingsStore.fiatCurrency;
BalanceDisplayMode get displayMode => settingsStore.balanceDisplayMode; BalanceDisplayMode get displayMode => balanceViewModel.displayMode;
@override @override
dynamic get keyIndex => transaction.id; dynamic get keyIndex => transaction.id;

View file

@ -47,7 +47,7 @@ abstract class ExchangeTradeViewModelBase with Store {
case ExchangeProviderDescription.simpleSwap: case ExchangeProviderDescription.simpleSwap:
_provider = SimpleSwapExchangeProvider(); _provider = SimpleSwapExchangeProvider();
break; break;
case ExchangeProviderDescription.trocador: case ExchangeProviderDescription.trocador:
_provider = TrocadorExchangeProvider(); _provider = TrocadorExchangeProvider();
break; break;
} }
@ -114,6 +114,10 @@ abstract class ExchangeTradeViewModelBase with Store {
updatedTrade.createdAt = trade.createdAt; updatedTrade.createdAt = trade.createdAt;
} }
if (updatedTrade.amount.isEmpty) {
updatedTrade.amount = trade.amount;
}
trade = updatedTrade; trade = updatedTrade;
_updateItems(); _updateItems();
@ -123,7 +127,8 @@ abstract class ExchangeTradeViewModelBase with Store {
} }
void _updateItems() { void _updateItems() {
final tagFrom = tradesStore.trade!.from.tag != null ? '${tradesStore.trade!.from.tag}' + ' ' : ''; final tagFrom =
tradesStore.trade!.from.tag != null ? '${tradesStore.trade!.from.tag}' + ' ' : '';
final tagTo = tradesStore.trade!.to.tag != null ? '${tradesStore.trade!.to.tag}' + ' ' : ''; final tagTo = tradesStore.trade!.to.tag != null ? '${tradesStore.trade!.to.tag}' + ' ' : '';
items.clear(); items.clear();
items.add(ExchangeTradeItem( items.add(ExchangeTradeItem(

View file

@ -443,7 +443,9 @@ abstract class ExchangeViewModelBase with Store {
request = SideShiftRequest( request = SideShiftRequest(
depositMethod: depositCurrency, depositMethod: depositCurrency,
settleMethod: receiveCurrency, settleMethod: receiveCurrency,
depositAmount: depositAmount.replaceAll(',', '.'), depositAmount: isFixedRateMode
? receiveAmount.replaceAll(',', '.')
: depositAmount.replaceAll(',', '.'),
settleAddress: receiveAddress, settleAddress: receiveAddress,
refundAddress: depositAddress, refundAddress: depositAddress,
); );

View file

@ -16,12 +16,10 @@ abstract class IoniaGiftCardsListViewModelBase with Store {
ioniaCategories = IoniaCategory.allCategories, ioniaCategories = IoniaCategory.allCategories,
selectedIndices = ObservableList<IoniaCategory>.of([IoniaCategory.all]), selectedIndices = ObservableList<IoniaCategory>.of([IoniaCategory.all]),
scrollOffsetFromTop = 0.0, scrollOffsetFromTop = 0.0,
isLoggedIn = false,
merchantState = InitialIoniaMerchantLoadingState(), merchantState = InitialIoniaMerchantLoadingState(),
createCardState = IoniaCreateCardState(), createCardState = IoniaCreateCardState(),
searchString = '', searchString = '',
ioniaMerchantList = <IoniaMerchant>[] { ioniaMerchantList = <IoniaMerchant>[] {
_getAuthStatus().then((value) => isLoggedIn = value);
} }
final IoniaService ioniaService; final IoniaService ioniaService;
@ -45,24 +43,17 @@ abstract class IoniaGiftCardsListViewModelBase with Store {
@observable @observable
List<IoniaMerchant> ioniaMerchants; List<IoniaMerchant> ioniaMerchants;
@observable
bool isLoggedIn;
@observable @observable
List<IoniaCategory> ioniaCategories; List<IoniaCategory> ioniaCategories;
@observable @observable
ObservableList<IoniaCategory> selectedIndices; ObservableList<IoniaCategory> selectedIndices;
Future<bool> _getAuthStatus() async {
return await ioniaService.isLogined();
}
@action @action
Future<void> createCard() async { Future<void> createCard() async {
try { try {
createCardState = IoniaCreateCardLoading(); createCardState = IoniaCreateCardLoading();
final card = await ioniaService.createCard(); await ioniaService.createCard();
createCardState = IoniaCreateCardSuccess(); createCardState = IoniaCreateCardSuccess();
} catch (e) { } catch (e) {
createCardState = IoniaCreateCardFailure(error: e.toString()); createCardState = IoniaCreateCardFailure(error: e.toString());

View file

@ -21,6 +21,7 @@ import 'package:cake_wallet/src/screens/trade_details/track_trade_list_item.dart
import 'package:cake_wallet/src/screens/trade_details/trade_details_list_card.dart'; import 'package:cake_wallet/src/screens/trade_details/trade_details_list_card.dart';
import 'package:cake_wallet/src/screens/trade_details/trade_details_status_item.dart'; import 'package:cake_wallet/src/screens/trade_details/trade_details_status_item.dart';
import 'package:url_launcher/url_launcher.dart'; import 'package:url_launcher/url_launcher.dart';
import 'package:collection/collection.dart';
part 'trade_details_view_model.g.dart'; part 'trade_details_view_model.g.dart';
@ -32,7 +33,8 @@ abstract class TradeDetailsViewModelBase with Store {
required this.trades, required this.trades,
required this.settingsStore, required this.settingsStore,
}) : items = ObservableList<StandartListItem>(), }) : items = ObservableList<StandartListItem>(),
trade = tradeForDetails { trade = trades.values.firstWhereOrNull((element) => element.id == tradeForDetails.id) ??
tradeForDetails {
switch (trade.provider) { switch (trade.provider) {
case ExchangeProviderDescription.xmrto: case ExchangeProviderDescription.xmrto:
_provider = XMRTOExchangeProvider(); _provider = XMRTOExchangeProvider();
@ -54,8 +56,6 @@ abstract class TradeDetailsViewModelBase with Store {
break; break;
} }
items = ObservableList<StandartListItem>();
_updateItems(); _updateItems();
_updateTrade(); _updateTrade();
@ -85,6 +85,12 @@ abstract class TradeDetailsViewModelBase with Store {
if (updatedTrade.createdAt == null && trade.createdAt != null) { if (updatedTrade.createdAt == null && trade.createdAt != null) {
updatedTrade.createdAt = trade.createdAt; updatedTrade.createdAt = trade.createdAt;
} }
Trade? foundElement = trades.values.firstWhereOrNull((element) => element.id == trade.id);
if (foundElement != null) {
final editedTrade = trades.get(foundElement.key);
editedTrade?.stateRaw = updatedTrade.stateRaw;
editedTrade?.save();
}
trade = updatedTrade; trade = updatedTrade;
@ -154,8 +160,9 @@ abstract class TradeDetailsViewModelBase with Store {
} }
void _launchUrl(String url) { void _launchUrl(String url) {
final uri = Uri.parse(url);
try { try {
launch(url); launchUrl(uri);
} catch (e) {} } catch (e) {}
} }
} }

View file

@ -5,7 +5,7 @@
import FlutterMacOS import FlutterMacOS
import Foundation import Foundation
import connectivity_macos import connectivity_plus_macos
import cw_monero import cw_monero
import device_info_plus import device_info_plus
import devicelocale import devicelocale

View file

@ -36,5 +36,9 @@ end
post_install do |installer| post_install do |installer|
installer.pods_project.targets.each do |target| installer.pods_project.targets.each do |target|
flutter_additional_macos_build_settings(target) flutter_additional_macos_build_settings(target)
target.build_configurations.each do |config|
config.build_settings['MACOSX_DEPLOYMENT_TARGET'] = '12.0'
end
end end
end end

View file

@ -1,7 +1,7 @@
PODS: PODS:
- connectivity_macos (0.0.1): - connectivity_plus_macos (0.0.1):
- FlutterMacOS - FlutterMacOS
- Reachability - ReachabilitySwift
- cw_monero (0.0.1): - cw_monero (0.0.1):
- cw_monero/Boost (= 0.0.1) - cw_monero/Boost (= 0.0.1)
- cw_monero/Monero (= 0.0.1) - cw_monero/Monero (= 0.0.1)
@ -37,7 +37,7 @@ PODS:
- FlutterMacOS - FlutterMacOS
- platform_device_id_macos (0.0.1): - platform_device_id_macos (0.0.1):
- FlutterMacOS - FlutterMacOS
- Reachability (3.2) - ReachabilitySwift (5.0.0)
- share_plus_macos (0.0.1): - share_plus_macos (0.0.1):
- FlutterMacOS - FlutterMacOS
- shared_preferences_foundation (0.0.1): - shared_preferences_foundation (0.0.1):
@ -49,7 +49,7 @@ PODS:
- FlutterMacOS - FlutterMacOS
DEPENDENCIES: DEPENDENCIES:
- connectivity_macos (from `Flutter/ephemeral/.symlinks/plugins/connectivity_macos/macos`) - connectivity_plus_macos (from `Flutter/ephemeral/.symlinks/plugins/connectivity_plus_macos/macos`)
- cw_monero (from `Flutter/ephemeral/.symlinks/plugins/cw_monero/macos`) - cw_monero (from `Flutter/ephemeral/.symlinks/plugins/cw_monero/macos`)
- device_info_plus (from `Flutter/ephemeral/.symlinks/plugins/device_info_plus/macos`) - device_info_plus (from `Flutter/ephemeral/.symlinks/plugins/device_info_plus/macos`)
- devicelocale (from `Flutter/ephemeral/.symlinks/plugins/devicelocale/macos`) - devicelocale (from `Flutter/ephemeral/.symlinks/plugins/devicelocale/macos`)
@ -67,11 +67,11 @@ DEPENDENCIES:
SPEC REPOS: SPEC REPOS:
trunk: trunk:
- Reachability - ReachabilitySwift
EXTERNAL SOURCES: EXTERNAL SOURCES:
connectivity_macos: connectivity_plus_macos:
:path: Flutter/ephemeral/.symlinks/plugins/connectivity_macos/macos :path: Flutter/ephemeral/.symlinks/plugins/connectivity_plus_macos/macos
cw_monero: cw_monero:
:path: Flutter/ephemeral/.symlinks/plugins/cw_monero/macos :path: Flutter/ephemeral/.symlinks/plugins/cw_monero/macos
device_info_plus: device_info_plus:
@ -102,7 +102,7 @@ EXTERNAL SOURCES:
:path: Flutter/ephemeral/.symlinks/plugins/wakelock_macos/macos :path: Flutter/ephemeral/.symlinks/plugins/wakelock_macos/macos
SPEC CHECKSUMS: SPEC CHECKSUMS:
connectivity_macos: 5dae6ee11d320fac7c05f0d08bd08fc32b5514d9 connectivity_plus_macos: f6e86fd000e971d361e54b5afcadc8c8fa773308
cw_monero: ec03de55a19c4a2b174ea687e0f4202edc716fa4 cw_monero: ec03de55a19c4a2b174ea687e0f4202edc716fa4
device_info_plus: 5401765fde0b8d062a2f8eb65510fb17e77cf07f device_info_plus: 5401765fde0b8d062a2f8eb65510fb17e77cf07f
devicelocale: 9f0f36ac651cabae2c33f32dcff4f32b61c38225 devicelocale: 9f0f36ac651cabae2c33f32dcff4f32b61c38225
@ -113,12 +113,12 @@ SPEC CHECKSUMS:
path_provider_foundation: c68054786f1b4f3343858c1e1d0caaded73f0be9 path_provider_foundation: c68054786f1b4f3343858c1e1d0caaded73f0be9
platform_device_id: 3e414428f45df149bbbfb623e2c0ca27c545b763 platform_device_id: 3e414428f45df149bbbfb623e2c0ca27c545b763
platform_device_id_macos: f763bb55f088be804d61b96eb4710b8ab6598e94 platform_device_id_macos: f763bb55f088be804d61b96eb4710b8ab6598e94
Reachability: 33e18b67625424e47b6cde6d202dce689ad7af96 ReachabilitySwift: 985039c6f7b23a1da463388634119492ff86c825
share_plus_macos: 853ee48e7dce06b633998ca0735d482dd671ade4 share_plus_macos: 853ee48e7dce06b633998ca0735d482dd671ade4
shared_preferences_foundation: e2dae3258e06f44cc55f49d42024fd8dd03c590c shared_preferences_foundation: e2dae3258e06f44cc55f49d42024fd8dd03c590c
url_launcher_macos: 5335912b679c073563f29d89d33d10d459f95451 url_launcher_macos: 5335912b679c073563f29d89d33d10d459f95451
wakelock_macos: bc3f2a9bd8d2e6c89fee1e1822e7ddac3bd004a9 wakelock_macos: bc3f2a9bd8d2e6c89fee1e1822e7ddac3bd004a9
PODFILE CHECKSUM: 505596d150d38022472859d890f709281982e016 PODFILE CHECKSUM: 5107934592df7813b33d744aebc8ddc6b5a5445f
COCOAPODS: 1.11.2 COCOAPODS: 1.11.2

View file

@ -75,7 +75,6 @@
9646C67C7114830A5ACFF5DF /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = "<group>"; }; 9646C67C7114830A5ACFF5DF /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = "<group>"; };
9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = "<group>"; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = "<group>"; };
9F565D5729954F53009A75FB /* secRandom.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = secRandom.swift; path = CakeWallet/secRandom.swift; sourceTree = "<group>"; }; 9F565D5729954F53009A75FB /* secRandom.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = secRandom.swift; path = CakeWallet/secRandom.swift; sourceTree = "<group>"; };
9F565D5829954F53009A75FB /* decrypt.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = decrypt.swift; path = CakeWallet/decrypt.swift; sourceTree = "<group>"; };
B38D1DBC56DBD386923BC063 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; B38D1DBC56DBD386923BC063 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };
/* End PBXFileReference section */ /* End PBXFileReference section */
@ -105,7 +104,6 @@
33CC10E42044A3C60003C045 = { 33CC10E42044A3C60003C045 = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
9F565D5829954F53009A75FB /* decrypt.swift */,
9F565D5729954F53009A75FB /* secRandom.swift */, 9F565D5729954F53009A75FB /* secRandom.swift */,
33FAB671232836740065AC1E /* Runner */, 33FAB671232836740065AC1E /* Runner */,
33CEB47122A05771004F2AC0 /* Flutter */, 33CEB47122A05771004F2AC0 /* Flutter */,

View file

@ -49,8 +49,8 @@ dependencies:
# password: ^1.0.0 # password: ^1.0.0
basic_utils: ^4.3.0 basic_utils: ^4.3.0
get_it: ^7.2.0 get_it: ^7.2.0
connectivity: ^3.0.3 # connectivity: ^3.0.3
# connectivity_plus: ^2.3.5 connectivity_plus: ^2.3.5
keyboard_actions: ^4.0.1 keyboard_actions: ^4.0.1
another_flushbar: ^1.12.29 another_flushbar: ^1.12.29
archive: ^3.3.0 archive: ^3.3.0

View file

@ -492,7 +492,7 @@
"submit_request":"تقديم طلب", "submit_request":"تقديم طلب",
"buy_alert_content":"لا ندعم حاليًا سوى شراء Bitcoin و Litecoin و Monero. يرجى إنشاء محفظة Bitcoin أو Litecoin أو Monero أو التبديل إليها.", "buy_alert_content":"لا ندعم حاليًا سوى شراء Bitcoin و Litecoin و Monero. يرجى إنشاء محفظة Bitcoin أو Litecoin أو Monero أو التبديل إليها.",
"sell_alert_content":"نحن ندعم حاليًا بيع البيتكوين فقط. لبيع Bitcoin ، يرجى إنشاء أو التبديل إلى محفظة Bitcoin الخاصة بك.", "sell_alert_content":"نحن ندعم حاليًا فقط بيع Bitcoin و Litecoin. يرجى إنشاء أو التبديل إلى محفظة Bitcoin أو Litecoin الخاصة بك.",
"outdated_electrum_wallet_description":"محافظ Bitcoin الجديدة التي تم إنشاؤها في Cake الآن سييد مكونة من 24 كلمة. من الضروري أن تقوم بإنشاء محفظة Bitcoin جديدة وتحويل جميع أموالك إلى المحفظة الجديدة المكونة من 24 كلمة ، والتوقف عن استخدام محافظ سييد مكونة من 12 كلمة. يرجى القيام بذلك على الفور لتأمين أموالك.", "outdated_electrum_wallet_description":"محافظ Bitcoin الجديدة التي تم إنشاؤها في Cake الآن سييد مكونة من 24 كلمة. من الضروري أن تقوم بإنشاء محفظة Bitcoin جديدة وتحويل جميع أموالك إلى المحفظة الجديدة المكونة من 24 كلمة ، والتوقف عن استخدام محافظ سييد مكونة من 12 كلمة. يرجى القيام بذلك على الفور لتأمين أموالك.",
"understand":"لقد فهمت", "understand":"لقد فهمت",

View file

@ -492,7 +492,7 @@
"submit_request" : "изпращане на заявка", "submit_request" : "изпращане на заявка",
"buy_alert_content" : "Понастоящем поддържаме само закупуване на Bitcoin, Litecoin и Monero. Моля, създайте или преминете към своя портфейл Bitcoin, Litecoin или Monero.", "buy_alert_content" : "Понастоящем поддържаме само закупуване на Bitcoin, Litecoin и Monero. Моля, създайте или преминете към своя портфейл Bitcoin, Litecoin или Monero.",
"sell_alert_content": "В момента поддържаме само продажбата на Bitcoin. За да продавате Bitcoin, създайте или изберете своя Bitcoin портфейл.", "sell_alert_content": "В момента поддържаме само продажбата на Bitcoin и Litecoin. Моля, създайте или превключете към своя биткойн или лайткойн портфейл.",
"outdated_electrum_wallet_description" : "Нови Bitcoin портфейли, създадени в Cake, сега имат seed от 24 думи. Трябва да създадете нов Bitcoin адрес и да прехвърлите всичките си средства в него и веднага да спрете използването на стари портфейли. Моля, напревете това незабавно, за да подсигурите средствата си.", "outdated_electrum_wallet_description" : "Нови Bitcoin портфейли, създадени в Cake, сега имат seed от 24 думи. Трябва да създадете нов Bitcoin адрес и да прехвърлите всичките си средства в него и веднага да спрете използването на стари портфейли. Моля, напревете това незабавно, за да подсигурите средствата си.",
"understand" : "Разбирам", "understand" : "Разбирам",

View file

@ -492,7 +492,7 @@
"submit_request" : "odeslat požadavek", "submit_request" : "odeslat požadavek",
"buy_alert_content" : "V současné době podporujeme pouze nákup Bitcoinů, Litecoinů a Monero. Vytvořte nebo přepněte na svou peněženku Bitcoinů, Litecoinů nebo Monero.", "buy_alert_content" : "V současné době podporujeme pouze nákup Bitcoinů, Litecoinů a Monero. Vytvořte nebo přepněte na svou peněženku Bitcoinů, Litecoinů nebo Monero.",
"sell_alert_content": "V současné době podporujeme pouze prodej Bitcoinu. Pro prodej Bitcoinu si prosím vytvořte Bitcoinovou peněženku, nebo se do ní přepněte.", "sell_alert_content": "V současné době podporujeme pouze prodej bitcoinů a litecoinů. Vytvořte nebo přepněte na svou bitcoinovou nebo litecoinovou peněženku.",
"outdated_electrum_wallet_description" : "Nové Bitcoinové peněženky vytvořené v Cake mají nyní seed se 24 slovy. Je třeba si vytvořit novou Bitcoinovou peněženku se 24 slovy, převést na ni všechny prostředky a přestat používat seed se 12 slovy. Prosím udělejte to hned pro zabezpečení svých prostředků.", "outdated_electrum_wallet_description" : "Nové Bitcoinové peněženky vytvořené v Cake mají nyní seed se 24 slovy. Je třeba si vytvořit novou Bitcoinovou peněženku se 24 slovy, převést na ni všechny prostředky a přestat používat seed se 12 slovy. Prosím udělejte to hned pro zabezpečení svých prostředků.",
"understand" : "Rozumím", "understand" : "Rozumím",

View file

@ -492,7 +492,7 @@
"submit_request" : "Eine Anfrage stellen", "submit_request" : "Eine Anfrage stellen",
"buy_alert_content" : "Derzeit unterstützen wir nur den Kauf von Bitcoin, Litecoin und Monero. Bitte erstellen oder wechseln Sie zu Ihrer Bitcoin-, Litecoin- oder Monero-Wallet.", "buy_alert_content" : "Derzeit unterstützen wir nur den Kauf von Bitcoin, Litecoin und Monero. Bitte erstellen oder wechseln Sie zu Ihrer Bitcoin-, Litecoin- oder Monero-Wallet.",
"sell_alert_content": "Wir unterstützen derzeit nur den Verkauf von Bitcoin. Um Bitcoin zu verkaufen, erstellen Sie bitte Ihre Bitcoin-Wallet oder wechseln Sie zu ihr.", "sell_alert_content": "Wir unterstützen derzeit nur den Verkauf von Bitcoin und Litecoin. Bitte erstellen Sie Ihr Bitcoin- oder Litecoin-Wallet oder wechseln Sie zu diesem.",
"outdated_electrum_wallet_description" : "Neue Bitcoin-Wallets, die in Cake erstellt wurden, haben jetzt einen 24-Wort-Seed. Sie müssen eine neue Bitcoin-Wallet erstellen, Ihr gesamtes Geld in die neue 24-Wort-Wallet überweisen und keine Wallet mit einem 12-Wort-Seed mehr verwenden. Bitte tun Sie dies sofort, um Ihr Geld zu sichern.", "outdated_electrum_wallet_description" : "Neue Bitcoin-Wallets, die in Cake erstellt wurden, haben jetzt einen 24-Wort-Seed. Sie müssen eine neue Bitcoin-Wallet erstellen, Ihr gesamtes Geld in die neue 24-Wort-Wallet überweisen und keine Wallet mit einem 12-Wort-Seed mehr verwenden. Bitte tun Sie dies sofort, um Ihr Geld zu sichern.",
"understand" : "Ich verstehe", "understand" : "Ich verstehe",

View file

@ -492,7 +492,7 @@
"submit_request" : "submit a request", "submit_request" : "submit a request",
"buy_alert_content" : "Currently we only support the purchase of Bitcoin, Litecoin, and Monero. Please create or switch to your Bitcoin, Litecoin, or Monero wallet.", "buy_alert_content" : "Currently we only support the purchase of Bitcoin, Litecoin, and Monero. Please create or switch to your Bitcoin, Litecoin, or Monero wallet.",
"sell_alert_content": "We currently only support the sale of Bitcoin. To sell Bitcoin, please create or switch to your Bitcoin wallet.", "sell_alert_content": "We currently only support the sale of Bitcoin and Litecoin. Please create or switch to your Bitcoin or Litecoin wallet.",
"outdated_electrum_wallet_description" : "New Bitcoin wallets created in Cake now have a 24-word seed. It is mandatory that you create a new Bitcoin wallet and transfer all of your funds to the new 24-word wallet, and stop using wallets with a 12-word seed. Please do this immediately to secure your funds.", "outdated_electrum_wallet_description" : "New Bitcoin wallets created in Cake now have a 24-word seed. It is mandatory that you create a new Bitcoin wallet and transfer all of your funds to the new 24-word wallet, and stop using wallets with a 12-word seed. Please do this immediately to secure your funds.",
"understand" : "I understand", "understand" : "I understand",

View file

@ -492,7 +492,7 @@
"submit_request" : "presentar una solicitud", "submit_request" : "presentar una solicitud",
"buy_alert_content" : "Actualmente solo admitimos la compra de Bitcoin, Litecoin y Monero. Cree o cambie a su billetera Bitcoin, Litecoin o Monero.", "buy_alert_content" : "Actualmente solo admitimos la compra de Bitcoin, Litecoin y Monero. Cree o cambie a su billetera Bitcoin, Litecoin o Monero.",
"sell_alert_content": "Actualmente solo admitimos la venta de Bitcoin. Para vender Bitcoin, cree o cambie a su billetera Bitcoin.", "sell_alert_content": "Actualmente solo admitimos la venta de Bitcoin y Litecoin. Cree o cambie a su billetera Bitcoin o Litecoin.",
"outdated_electrum_wallet_description" : "Las nuevas carteras de Bitcoin creadas en Cake ahora tienen una semilla de 24 palabras. Es obligatorio que cree una nueva billetera de Bitcoin y transfiera todos sus fondos a la nueva billetera de 24 palabras, y deje de usar billeteras con una semilla de 12 palabras. Haga esto de inmediato para asegurar sus fondos.", "outdated_electrum_wallet_description" : "Las nuevas carteras de Bitcoin creadas en Cake ahora tienen una semilla de 24 palabras. Es obligatorio que cree una nueva billetera de Bitcoin y transfiera todos sus fondos a la nueva billetera de 24 palabras, y deje de usar billeteras con una semilla de 12 palabras. Haga esto de inmediato para asegurar sus fondos.",
"understand" : "Entiendo", "understand" : "Entiendo",

View file

@ -492,7 +492,7 @@
"submit_request" : "soumettre une requête", "submit_request" : "soumettre une requête",
"buy_alert_content" : "Actuellement, nous ne prenons en charge que l'achat de Bitcoin, Litecoin et Monero. Veuillez créer ou basculer vers votre portefeuille (wallet) Bitcoin, Litecoin ou Monero.", "buy_alert_content" : "Actuellement, nous ne prenons en charge que l'achat de Bitcoin, Litecoin et Monero. Veuillez créer ou basculer vers votre portefeuille (wallet) Bitcoin, Litecoin ou Monero.",
"sell_alert_content": "Pour le moment nous ne supportons que la vente de Bitcoin. Pour vendre du Bitcoin, merci de créer ou de sélectionner votre portefeuille (wallet) Bitcoin.", "sell_alert_content": "Actuellement, nous ne prenons en charge que la vente de Bitcoin et Litecoin. Veuillez créer ou basculer vers votre portefeuille (wallet) Bitcoin ou Litecoin.",
"outdated_electrum_wallet_description" : "Les nouveaux portefeuilles (wallets) Bitcoin créés dans Cake ont dorénavant une phrase secrète (seed) de 24 mots. Il est impératif que vous créiez un nouveau portefeuille Bitcoin, que vous y transfériez tous vos fonds puis que vous cessiez d'utiliser le portefeuille avec une phrase secrète de 12 mots. Merci de faire cela immédiatement pour assurer la sécurité de vos avoirs.", "outdated_electrum_wallet_description" : "Les nouveaux portefeuilles (wallets) Bitcoin créés dans Cake ont dorénavant une phrase secrète (seed) de 24 mots. Il est impératif que vous créiez un nouveau portefeuille Bitcoin, que vous y transfériez tous vos fonds puis que vous cessiez d'utiliser le portefeuille avec une phrase secrète de 12 mots. Merci de faire cela immédiatement pour assurer la sécurité de vos avoirs.",
"understand" : "J'ai compris", "understand" : "J'ai compris",
@ -691,14 +691,14 @@
"arrive_in_this_address" : "${currency} ${tag}arrivera à cette adresse", "arrive_in_this_address" : "${currency} ${tag}arrivera à cette adresse",
"do_not_send": "Ne pas envoyer", "do_not_send": "Ne pas envoyer",
"error_dialog_content": "Oups, nous avons rencontré une erreur.\n\nMerci d'envoyer le rapport d'erreur à notre équipe d'assistance afin de nous permettre d'améliorer l'application.", "error_dialog_content": "Oups, nous avons rencontré une erreur.\n\nMerci d'envoyer le rapport d'erreur à notre équipe d'assistance afin de nous permettre d'améliorer l'application.",
"scan_qr_code": "Scannez le code QR", "scan_qr_code": "Scannez le QR code",
"cold_or_recover_wallet": "Ajoutez un cold wallet ou récupérez un paper wallet", "cold_or_recover_wallet": "Ajoutez un portefeuille froid (cold wallet) ou récupérez un portefeuille papier (paper wallet)",
"please_wait": "S'il vous plaît, attendez", "please_wait": "Merci de patienter",
"sweeping_wallet": "Portefeuille de balayage", "sweeping_wallet": "Portefeuille (wallet) de consolidation",
"sweeping_wallet_alert": "Cela ne devrait pas prendre longtemps. NE QUITTEZ PAS CET ÉCRAN OU LES FONDS BALAYÉS POURRAIENT ÊTRE PERDUS", "sweeping_wallet_alert": "Cette opération ne devrait pas prendre longtemps. NE QUITTEZ PAS CET ÉCRAN OU LES FONDS CONSOLIDÉS POURRAIENT ÊTRE PERDUS",
"decimal_places_error": "Trop de décimales", "decimal_places_error": "Trop de décimales",
"edit_node": "Modifier le nœud", "edit_node": "Modifier le nœud",
"frozen_balance": "Équilibre gelé", "frozen_balance": "Solde gelé",
"invoice_details": "Détails de la facture", "invoice_details": "Détails de la facture",
"donation_link_details": "Détails du lien de don", "donation_link_details": "Détails du lien de don",
"anonpay_description": "Générez ${type}. Le destinataire peut ${method} avec n'importe quelle crypto-monnaie prise en charge, et vous recevrez des fonds dans ce portefeuille (wallet).", "anonpay_description": "Générez ${type}. Le destinataire peut ${method} avec n'importe quelle crypto-monnaie prise en charge, et vous recevrez des fonds dans ce portefeuille (wallet).",
@ -715,22 +715,22 @@
"error_text_input_above_maximum_limit" : "Le montant est supérieur au maximum", "error_text_input_above_maximum_limit" : "Le montant est supérieur au maximum",
"show_market_place" :"Afficher la place de marché", "show_market_place" :"Afficher la place de marché",
"prevent_screenshots": "Empêcher les captures d'écran et l'enregistrement d'écran", "prevent_screenshots": "Empêcher les captures d'écran et l'enregistrement d'écran",
"modify_2fa": "Modifier le gâteau 2FA", "modify_2fa": "Modifier les paramètres Cake 2FA",
"disable_cake_2fa": "Désactiver le gâteau 2FA", "disable_cake_2fa": "Désactiver Cake 2FA",
"question_to_disable_2fa":"Êtes-vous sûr de vouloir désactiver Cake 2FA ? Un code 2FA ne sera plus nécessaire pour accéder au portefeuille et à certaines fonctions.", "question_to_disable_2fa":"Êtes-vous sûr de vouloir désactiver Cake 2FA ? Un code 2FA ne sera plus nécessaire pour accéder au portefeuille (wallet) et à certaines fonctions.",
"disable": "Désactiver", "disable": "Désactiver",
"setup_2fa": "Gâteau d'installation 2FA", "setup_2fa": "Paramétrer Cake 2FA",
"verify_with_2fa": "Vérifier avec Cake 2FA", "verify_with_2fa": "Vérifier avec Cake 2FA",
"totp_code": "Code TOTP", "totp_code": "Code TOTP",
"please_fill_totp": "Veuillez renseigner le code à 8 chiffres présent sur votre autre appareil", "please_fill_totp": "Veuillez renseigner le code à 8 chiffres affiché sur votre autre appareil",
"totp_2fa_success": "Succès! Cake 2FA activé pour ce portefeuille. N'oubliez pas de sauvegarder votre graine mnémonique au cas où vous perdriez l'accès au portefeuille.", "totp_2fa_success": "Succès! Cake 2FA est activé pour ce portefeuille. N'oubliez pas de sauvegarder votre phrase secrète (seed) au cas où vous perdriez l'accès au portefeuille (wallet).",
"totp_verification_success" :"Vérification réussie !", "totp_verification_success" :"Vérification réussie !",
"totp_2fa_failure": "Code incorrect. Veuillez essayer un code différent ou générer une nouvelle clé secrète. Utilisez une application 2FA compatible qui prend en charge les codes à 8 chiffres et SHA512.", "totp_2fa_failure": "Code incorrect. Veuillez essayer un code différent ou générer un nouveau secret TOTP. Utilisez une application 2FA compatible qui prend en charge les codes à 8 chiffres et SHA512.",
"enter_totp_code": "Veuillez entrer le code TOTP.", "enter_totp_code": "Veuillez entrer le code TOTP.",
"add_secret_code":"Ajouter ce code secret à un autre appareil", "add_secret_code":"Configurer un autre appareil à l'aide de ce secret TOTP",
"totp_secret_code":"Code secret TOTP", "totp_secret_code":"Secret TOTP",
"important_note": "Note importante", "important_note": "Note importante",
"setup_2fa_text": "Cake 2FA n'est PAS aussi sûr que le stockage à froid. 2FA protège contre les types d'attaques de base, comme votre ami fournissant votre empreinte digitale pendant que vous dormez.\n\n Cake 2FA ne protège PAS contre un appareil compromis par un attaquant sophistiqué.\n\n Si vous perdez l'accès à vos codes 2FA , VOUS PERDREZ L'ACCÈS À CE PORTEFEUILLE. Vous devrez restaurer votre portefeuille à partir de graines mnémotechniques. VOUS DEVEZ DONC SAUVEGARDER VOS SEMENCES MNEMONIQUES ! De plus, quelqu'un ayant accès à vos graines mnémoniques pourra voler vos fonds, en contournant Cake 2FA.\n\n Le personnel d'assistance de Cake ne pourra pas vous aider si vous perdez l'accès à vos graines mnémoniques, puisque Cake est un portefeuille non dépositaire.", "setup_2fa_text": "Cake 2FA (Authentification à 2 Facteurs) n'est PAS aussi sûr que le stockage à froid. Cake 2FA protège contre les attaques basiques, comme un ami fournissant votre empreinte digitale pendant que vous dormez.\n\n Cake 2FA ne protège PAS contre un appareil compromis par un attaquant sophistiqué.\n\n Si vous perdez l'accès à vos codes 2FA , VOUS PERDREZ L'ACCÈS À CE PORTEFEUILLE (WALLET). Vous devrez restaurer votre portefeuille à partir de sa phrase secrète (seed). VOUS DEVEZ DONC SAUVEGARDER VOTRE PHRASE SECRÈTE ! De plus, quelqu'un ayant accès à votre phrase secrète pourra voler vos fonds, en contournant Cake 2FA.\n\n Le personnel d'assistance de Cake ne pourra pas vous aider si vous perdez l'accès à votre phrase secrète, puisque Cake est un portefeuille non dépositaire (non custodial).",
"setup_totp_recommended": "Configurer TOTP (recommandé)", "setup_totp_recommended": "Configurer TOTP (recommandé)",
"disable_buy": "Désactiver l'action d'achat", "disable_buy": "Désactiver l'action d'achat",
"disable_sell": "Désactiver l'action de vente" "disable_sell": "Désactiver l'action de vente"

View file

@ -487,7 +487,7 @@
"submit_request": "gabatar da bukata", "submit_request": "gabatar da bukata",
"buy_alert_content": "A halin yanzu muna tallafawa kawai siyan Bitcoin da Litecoin. Don siyan Bitcoin ko Litecoin, da fatan za a ƙirƙira ko canza zuwa walat ɗin ku na Bitcoin ko Litecoin.", "buy_alert_content": "A halin yanzu muna tallafawa kawai siyan Bitcoin da Litecoin. Don siyan Bitcoin ko Litecoin, da fatan za a ƙirƙira ko canza zuwa walat ɗin ku na Bitcoin ko Litecoin.",
"sell_alert_content": "A halin yanzu muna tallafawa siyar da Bitcoin kawai. Don sayar da Bitcoin, da fatan za a ƙirƙira ko canza zuwa walat ɗin ku na Bitcoin.", "sell_alert_content": "A halin yanzu muna tallafawa siyar da Bitcoin da Litecoin kawai. Da fatan za a ƙirƙira ko canza zuwa walat ɗin ku na Bitcoin ko Litecoin.",
"outdated_electrum_wallet_description": "Sabbin walat ɗin Bitcoin da aka kirkira a cikin Cake yanzu suna da nau'in kalma 24. Ya zama dole ka ƙirƙiri sabon walat ɗin Bitcoin kuma canza duk kuɗin ku zuwa sabon walat ɗin kalmomi 24, kuma ku daina amfani da walat tare da iri mai kalma 12. Da fatan za a yi haka nan take don samun kuɗin ku.", "outdated_electrum_wallet_description": "Sabbin walat ɗin Bitcoin da aka kirkira a cikin Cake yanzu suna da nau'in kalma 24. Ya zama dole ka ƙirƙiri sabon walat ɗin Bitcoin kuma canza duk kuɗin ku zuwa sabon walat ɗin kalmomi 24, kuma ku daina amfani da walat tare da iri mai kalma 12. Da fatan za a yi haka nan take don samun kuɗin ku.",
"understand": "na gane", "understand": "na gane",

View file

@ -492,7 +492,7 @@
"submit_request" : "एक अनुरोध सबमिट करें", "submit_request" : "एक अनुरोध सबमिट करें",
"buy_alert_content" : "वर्तमान में हम केवल बिटकॉइन, लाइटकॉइन और मोनेरो की खरीद का समर्थन करते हैं। कृपया अपना बिटकॉइन, लाइटकॉइन, या मोनेरो वॉलेट बनाएं या स्विच करें।", "buy_alert_content" : "वर्तमान में हम केवल बिटकॉइन, लाइटकॉइन और मोनेरो की खरीद का समर्थन करते हैं। कृपया अपना बिटकॉइन, लाइटकॉइन, या मोनेरो वॉलेट बनाएं या स्विच करें।",
"sell_alert_content": "हम वर्तमान में केवल बिटकॉइन की बिक्री का समर्थन करते हैं। बिटकॉइन बेचने के लिए, कृपया अपना बिटकॉइन वॉलेट बनाएं या उसमें स्विच करें।", "sell_alert_content": "वर्तमान में हम केवल बिटकॉइन और लाइटकॉइन की बिक्री का समर्थन करते हैं। कृपया अपना बिटकॉइन या लाइटकॉइन वॉलेट बनाएं या स्विच करें।",
"outdated_electrum_wallet_description" : "केक में बनाए गए नए बिटकॉइन वॉलेट में अब 24-शब्द का बीज है। यह अनिवार्य है कि आप एक नया बिटकॉइन वॉलेट बनाएं और अपने सभी फंड को नए 24-शब्द वाले वॉलेट में स्थानांतरित करें, और 12-शब्द बीज वाले वॉलेट का उपयोग करना बंद करें। कृपया अपने धन को सुरक्षित करने के लिए इसे तुरंत करें।", "outdated_electrum_wallet_description" : "केक में बनाए गए नए बिटकॉइन वॉलेट में अब 24-शब्द का बीज है। यह अनिवार्य है कि आप एक नया बिटकॉइन वॉलेट बनाएं और अपने सभी फंड को नए 24-शब्द वाले वॉलेट में स्थानांतरित करें, और 12-शब्द बीज वाले वॉलेट का उपयोग करना बंद करें। कृपया अपने धन को सुरक्षित करने के लिए इसे तुरंत करें।",
"understand" : "मुझे समझ", "understand" : "मुझे समझ",

View file

@ -492,7 +492,7 @@
"submit_request" : "podnesi zahtjev", "submit_request" : "podnesi zahtjev",
"buy_alert_content" : "Trenutno podržavamo samo kupnju Bitcoina, Litecoina i Monera. Izradite ili prijeđite na svoj Bitcoin, Litecoin ili Monero novčanik.", "buy_alert_content" : "Trenutno podržavamo samo kupnju Bitcoina, Litecoina i Monera. Izradite ili prijeđite na svoj Bitcoin, Litecoin ili Monero novčanik.",
"sell_alert_content": "Trenutno podržavamo samo prodaju Bitcoina. Da biste prodali Bitcoin, stvorite ili prijeđite na svoj Bitcoin novčanik.", "sell_alert_content": "Trenutno podržavamo samo prodaju Bitcoina i Litecoina. Izradite ili prijeđite na svoj Bitcoin ili Litecoin novčanik.",
"outdated_electrum_wallet_description" : "Novi Bitcoin novčanici stvoreni u Cakeu sada imaju sjeme od 24 riječi. Obavezno je stvoriti novi Bitcoin novčanik i prenijeti sva svoja sredstva u novi novčanik od 24 riječi te prestati koristiti novčanike s sjemenkom od 12 riječi. Učinite to odmah kako biste osigurali svoja sredstva.", "outdated_electrum_wallet_description" : "Novi Bitcoin novčanici stvoreni u Cakeu sada imaju sjeme od 24 riječi. Obavezno je stvoriti novi Bitcoin novčanik i prenijeti sva svoja sredstva u novi novčanik od 24 riječi te prestati koristiti novčanike s sjemenkom od 12 riječi. Učinite to odmah kako biste osigurali svoja sredstva.",
"understand" : "Razumijem", "understand" : "Razumijem",

View file

@ -479,7 +479,7 @@
"submit_request" : "kirim permintaan", "submit_request" : "kirim permintaan",
"buy_alert_content" : "Saat ini kami hanya mendukung pembelian Bitcoin, Litecoin, dan Monero. Harap buat atau alihkan ke dompet Bitcoin, Litecoin, atau Monero Anda.", "buy_alert_content" : "Saat ini kami hanya mendukung pembelian Bitcoin, Litecoin, dan Monero. Harap buat atau alihkan ke dompet Bitcoin, Litecoin, atau Monero Anda.",
"sell_alert_content": "Saat ini kami hanya mendukung penjualan Bitcoin. Untuk menjual Bitcoin, silakan buat atau beralih ke dompet Bitcoin Anda.", "sell_alert_content": "Saat ini kami hanya mendukung penjualan Bitcoin dan Litecoin. Harap buat atau alihkan ke dompet Bitcoin atau Litecoin Anda.",
"outdated_electrum_wallet_description" : "Dompet Bitcoin baru yang dibuat di Cake sekarang memiliki biji semai 24 kata. Wajib bagi Anda untuk membuat dompet Bitcoin baru dan mentransfer semua dana Anda ke dompet 24 kata baru, dan berhenti menggunakan dompet dengan biji semai 12 kata. Silakan lakukan ini segera untuk mengamankan dana Anda.", "outdated_electrum_wallet_description" : "Dompet Bitcoin baru yang dibuat di Cake sekarang memiliki biji semai 24 kata. Wajib bagi Anda untuk membuat dompet Bitcoin baru dan mentransfer semua dana Anda ke dompet 24 kata baru, dan berhenti menggunakan dompet dengan biji semai 12 kata. Silakan lakukan ini segera untuk mengamankan dana Anda.",
"understand" : "Saya mengerti", "understand" : "Saya mengerti",

View file

@ -492,7 +492,7 @@
"submit_request" : "invia una richiesta", "submit_request" : "invia una richiesta",
"buy_alert_content" : "Attualmente supportiamo solo l'acquisto di Bitcoin, Litecoin e Monero. Crea o passa al tuo portafoglio Bitcoin, Litecoin o Monero.", "buy_alert_content" : "Attualmente supportiamo solo l'acquisto di Bitcoin, Litecoin e Monero. Crea o passa al tuo portafoglio Bitcoin, Litecoin o Monero.",
"sell_alert_content": "Al momento supportiamo solo la vendita di Bitcoin. Per vendere Bitcoin, crea o passa al tuo portafoglio Bitcoin.", "sell_alert_content": "Al momento supportiamo solo la vendita di Bitcoin e Litecoin. Crea o passa al tuo portafoglio Bitcoin o Litecoin.",
"outdated_electrum_wallet_description" : "I nuovi portafogli Bitcoin creati in Cake ora hanno un seme di 24 parole. È obbligatorio creare un nuovo portafoglio Bitcoin e trasferire tutti i fondi nel nuovo portafoglio di 24 parole e smettere di usare portafogli con un seme di 12 parole. Ti preghiamo di farlo immediatamente per proteggere i tuoi fondi.", "outdated_electrum_wallet_description" : "I nuovi portafogli Bitcoin creati in Cake ora hanno un seme di 24 parole. È obbligatorio creare un nuovo portafoglio Bitcoin e trasferire tutti i fondi nel nuovo portafoglio di 24 parole e smettere di usare portafogli con un seme di 12 parole. Ti preghiamo di farlo immediatamente per proteggere i tuoi fondi.",
"understand" : "Capisco", "understand" : "Capisco",

View file

@ -492,7 +492,7 @@
"submit_request" : "リクエストを送信する", "submit_request" : "リクエストを送信する",
"buy_alert_content" : "現在、ビットコイン、ライトコイン、モネロの購入のみをサポートしています。 Bitcoin、Litecoin、または Monero ウォレットを作成するか、切り替えてください。", "buy_alert_content" : "現在、ビットコイン、ライトコイン、モネロの購入のみをサポートしています。 Bitcoin、Litecoin、または Monero ウォレットを作成するか、切り替えてください。",
"sell_alert_content": "現在、ビットコインの販売のみをサポートしています。ビットコインを販売するには、ビットコインウォレットを作成するか切り替えてください。", "sell_alert_content": "現在、ビットコインとライトコインの販売のみをサポートしています。 ビットコインまたはライトコインウォレットを作成するか、ウォレットに切り替えてください。",
"outdated_electrum_wallet_description" : "Cakeで作成された新しいビットコインウォレットには、24ワードのシードがあります。 新しいビットコインウォレットを作成し、すべての資金を新しい24ワードのウォレットに転送し、12ワードのシードを持つウォレットの使用を停止することが必須です。 あなたの資金を確保するためにこれをすぐに行ってください。", "outdated_electrum_wallet_description" : "Cakeで作成された新しいビットコインウォレットには、24ワードのシードがあります。 新しいビットコインウォレットを作成し、すべての資金を新しい24ワードのウォレットに転送し、12ワードのシードを持つウォレットの使用を停止することが必須です。 あなたの資金を確保するためにこれをすぐに行ってください。",
"understand" : "わかります", "understand" : "わかります",

View file

@ -492,7 +492,7 @@
"submit_request" : "요청을 제출", "submit_request" : "요청을 제출",
"buy_alert_content" : "현재 우리는 Bitcoin, Litecoin 및 Monero 구매만 지원합니다. Bitcoin, Litecoin 또는 Monero 지갑을 생성하거나 전환하십시오.", "buy_alert_content" : "현재 우리는 Bitcoin, Litecoin 및 Monero 구매만 지원합니다. Bitcoin, Litecoin 또는 Monero 지갑을 생성하거나 전환하십시오.",
"sell_alert_content": "현재 비트코인 ​​판매만 지원합니다. 비트코인을 판매하려면 비트코인 ​​지갑을 생성하거나 전환하세요.", "sell_alert_content": "현재 Bitcoin 및 Litecoin 판매만 지원합니다. Bitcoin 또는 Litecoin 지갑을 생성하거나 전환하십시오.",
"outdated_electrum_wallet_description" : "Cake에서 생성 된 새로운 비트 코인 지갑에는 이제 24 단어 시드가 있습니다. 새로운 비트 코인 지갑을 생성하고 모든 자금을 새로운 24 단어 지갑으로 이체하고 12 단어 시드가있는 지갑 사용을 중지해야합니다. 자금을 확보하려면 즉시이 작업을 수행하십시오.", "outdated_electrum_wallet_description" : "Cake에서 생성 된 새로운 비트 코인 지갑에는 이제 24 단어 시드가 있습니다. 새로운 비트 코인 지갑을 생성하고 모든 자금을 새로운 24 단어 지갑으로 이체하고 12 단어 시드가있는 지갑 사용을 중지해야합니다. 자금을 확보하려면 즉시이 작업을 수행하십시오.",
"understand" : "이해 했어요", "understand" : "이해 했어요",

View file

@ -492,7 +492,7 @@
"submit_request" : "တောင်းဆိုချက်တစ်ခုတင်ပြပါ။", "submit_request" : "တောင်းဆိုချက်တစ်ခုတင်ပြပါ။",
"buy_alert_content" : "လောလောဆယ်တွင် ကျွန်ုပ်တို့သည် Bitcoin၊ Litecoin နှင့် Monero တို့ကိုသာ ဝယ်ယူမှုကို ပံ့ပိုးပေးပါသည်။ သင်၏ Bitcoin၊ Litecoin သို့မဟုတ် Monero ပိုက်ဆံအိတ်ကို ဖန်တီးပါ သို့မဟုတ် ပြောင်းပါ။", "buy_alert_content" : "လောလောဆယ်တွင် ကျွန်ုပ်တို့သည် Bitcoin၊ Litecoin နှင့် Monero တို့ကိုသာ ဝယ်ယူမှုကို ပံ့ပိုးပေးပါသည်။ သင်၏ Bitcoin၊ Litecoin သို့မဟုတ် Monero ပိုက်ဆံအိတ်ကို ဖန်တီးပါ သို့မဟုတ် ပြောင်းပါ။",
"sell_alert_content" : "ကျွန်ုပ်တို့သည် လက်ရှိတွင် Bitcoin ရောင်းချခြင်းကိုသာ ပံ့ပိုးပေးပါသည်။ Bitcoin ရောင်းချရန်၊ သင်၏ Bitcoin ပိုက်ဆံအိတ်ကို ဖန်တီးပါ သို့မဟုတ် ပြောင်းပါ။", "sell_alert_content" : "ကျွန်ုပ်တို့သည် လက်ရှိတွင် Bitcoin နှင့် Litecoin ရောင်းချခြင်းကိုသာ ထောက်ခံပါသည်။ သင်၏ Bitcoin သို့မဟုတ် Litecoin ပိုက်ဆံအိတ်ကို ဖန်တီးပါ သို့မဟုတ် ပြောင်းပါ။",
"outdated_electrum_wallet_description" : "ယခု Cake တွင်ဖန်တီးထားသော Bitcoin ပိုက်ဆံအိတ်အသစ်တွင် စကားလုံး 24 မျိုးရှိသည်။ Bitcoin ပိုက်ဆံအိတ်အသစ်တစ်ခုကို ဖန်တီးပြီး သင့်ငွေအားလုံးကို 24 စကားလုံးပိုက်ဆံအိတ်အသစ်သို့ လွှဲပြောင်းပြီး 12 စကားလုံးမျိုးစေ့ဖြင့် ပိုက်ဆံအိတ်များကို အသုံးပြုခြင်းကို ရပ်တန့်ရန် မဖြစ်မနေလိုအပ်ပါသည်။ သင့်ရန်ပုံငွေများကို လုံခြုံစေရန်အတွက် ၎င်းကိုချက်ချင်းလုပ်ဆောင်ပါ။", "outdated_electrum_wallet_description" : "ယခု Cake တွင်ဖန်တီးထားသော Bitcoin ပိုက်ဆံအိတ်အသစ်တွင် စကားလုံး 24 မျိုးရှိသည်။ Bitcoin ပိုက်ဆံအိတ်အသစ်တစ်ခုကို ဖန်တီးပြီး သင့်ငွေအားလုံးကို 24 စကားလုံးပိုက်ဆံအိတ်အသစ်သို့ လွှဲပြောင်းပြီး 12 စကားလုံးမျိုးစေ့ဖြင့် ပိုက်ဆံအိတ်များကို အသုံးပြုခြင်းကို ရပ်တန့်ရန် မဖြစ်မနေလိုအပ်ပါသည်။ သင့်ရန်ပုံငွေများကို လုံခြုံစေရန်အတွက် ၎င်းကိုချက်ချင်းလုပ်ဆောင်ပါ။",
"understand" : "ကျွန်တော်နားလည်ပါတယ်", "understand" : "ကျွန်တော်နားလည်ပါတယ်",

View file

@ -492,7 +492,7 @@
"submit_request" : "een verzoek indienen", "submit_request" : "een verzoek indienen",
"buy_alert_content" : "Momenteel ondersteunen we alleen de aankoop van Bitcoin, Litecoin en Monero. Maak of schakel over naar uw Bitcoin-, Litecoin- of Monero-portemonnee.", "buy_alert_content" : "Momenteel ondersteunen we alleen de aankoop van Bitcoin, Litecoin en Monero. Maak of schakel over naar uw Bitcoin-, Litecoin- of Monero-portemonnee.",
"sell_alert_content": "We ondersteunen momenteel alleen de verkoop van Bitcoin. Om Bitcoin te verkopen, maakt u uw Bitcoin-portemonnee aan of schakelt u over naar deze.", "sell_alert_content": "We ondersteunen momenteel alleen de verkoop van Bitcoin en Litecoin. Maak of schakel over naar uw Bitcoin- of Litecoin-portemonnee.",
"outdated_electrum_wallet_description" : "Nieuwe Bitcoin-portefeuilles die in Cake zijn gemaakt, hebben nu een zaadje van 24 woorden. Het is verplicht dat u een nieuwe Bitcoin-portemonnee maakt en al uw geld overmaakt naar de nieuwe portemonnee van 24 woorden, en stopt met het gebruik van wallets met een seed van 12 woorden. Doe dit onmiddellijk om uw geld veilig te stellen.", "outdated_electrum_wallet_description" : "Nieuwe Bitcoin-portefeuilles die in Cake zijn gemaakt, hebben nu een zaadje van 24 woorden. Het is verplicht dat u een nieuwe Bitcoin-portemonnee maakt en al uw geld overmaakt naar de nieuwe portemonnee van 24 woorden, en stopt met het gebruik van wallets met een seed van 12 woorden. Doe dit onmiddellijk om uw geld veilig te stellen.",
"understand" : "Ik begrijp het", "understand" : "Ik begrijp het",

View file

@ -492,7 +492,7 @@
"submit_request" : "Złóż wniosek", "submit_request" : "Złóż wniosek",
"buy_alert_content" : "Obecnie obsługujemy tylko zakup Bitcoin, Litecoin i Monero. Utwórz lub przełącz się na swój portfel Bitcoin, Litecoin lub Monero.", "buy_alert_content" : "Obecnie obsługujemy tylko zakup Bitcoin, Litecoin i Monero. Utwórz lub przełącz się na swój portfel Bitcoin, Litecoin lub Monero.",
"sell_alert_content": "Obecnie obsługujemy tylko sprzedaż Bitcoina. Aby sprzedać Bitcoin, utwórz lub przełącz się na swój portfel Bitcoin.", "sell_alert_content": "Obecnie obsługujemy tylko sprzedaż Bitcoin i Litecoin. Utwórz lub przełącz się na swój portfel Bitcoin lub Litecoin.",
"outdated_electrum_wallet_description" : "Nowe portfele Bitcoin utworzone w Cake mają teraz fraze seed składające się z 24 słów. Konieczne jest utworzenie nowego portfela Bitcoin i przeniesienie wszystkich środków do nowego portfela na 24 słowa oraz zaprzestanie korzystania z portfeli z frazą seed na 12 słów. Zrób to natychmiast, aby zabezpieczyć swoje fundusze.", "outdated_electrum_wallet_description" : "Nowe portfele Bitcoin utworzone w Cake mają teraz fraze seed składające się z 24 słów. Konieczne jest utworzenie nowego portfela Bitcoin i przeniesienie wszystkich środków do nowego portfela na 24 słowa oraz zaprzestanie korzystania z portfeli z frazą seed na 12 słów. Zrób to natychmiast, aby zabezpieczyć swoje fundusze.",
"understand" : "Rozumiem", "understand" : "Rozumiem",

View file

@ -492,7 +492,7 @@
"submit_request" : "enviar um pedido", "submit_request" : "enviar um pedido",
"buy_alert_content" : "Atualmente, oferecemos suporte apenas à compra de Bitcoin, Litecoin e Monero. Crie ou troque para sua carteira Bitcoin, Litecoin ou Monero.", "buy_alert_content" : "Atualmente, oferecemos suporte apenas à compra de Bitcoin, Litecoin e Monero. Crie ou troque para sua carteira Bitcoin, Litecoin ou Monero.",
"sell_alert_content": "Atualmente, apoiamos apenas a venda de Bitcoin. Para vender Bitcoin, crie ou mude para sua carteira Bitcoin.", "sell_alert_content": "Atualmente, oferecemos suporte apenas à venda de Bitcoin e Litecoin. Por favor, crie ou mude para sua carteira Bitcoin ou Litecoin.",
"outdated_electrum_wallet_description" : "As novas carteiras Bitcoin criadas no Cake agora têm uma semente de 24 palavras. É obrigatório que você crie uma nova carteira Bitcoin e transfira todos os seus fundos para a nova carteira de 24 palavras, e pare de usar carteiras com semente de 12 palavras. Faça isso imediatamente para garantir seus fundos.", "outdated_electrum_wallet_description" : "As novas carteiras Bitcoin criadas no Cake agora têm uma semente de 24 palavras. É obrigatório que você crie uma nova carteira Bitcoin e transfira todos os seus fundos para a nova carteira de 24 palavras, e pare de usar carteiras com semente de 12 palavras. Faça isso imediatamente para garantir seus fundos.",
"understand" : "Entendo", "understand" : "Entendo",

View file

@ -492,7 +492,7 @@
"submit_request" : "отправить запрос", "submit_request" : "отправить запрос",
"buy_alert_content" : "В настоящее время мы поддерживаем только покупку Bitcoin, Litecoin и Monero. Пожалуйста, создайте или переключитесь на свой кошелек Bitcoin, Litecoin или Monero.", "buy_alert_content" : "В настоящее время мы поддерживаем только покупку Bitcoin, Litecoin и Monero. Пожалуйста, создайте или переключитесь на свой кошелек Bitcoin, Litecoin или Monero.",
"sell_alert_content": "В настоящее время мы поддерживаем только продажу биткойнов. Чтобы продать биткойны, создайте или переключитесь на свой биткойн-кошелек.", "sell_alert_content": "В настоящее время мы поддерживаем только продажу биткойнов и лайткойнов. Пожалуйста, создайте или переключитесь на свой биткойн- или лайткойн-кошелек.",
"outdated_electrum_wallet_description" : "Новые биткойн-кошельки, созданные в Cake, теперь содержат мнемоническую фразу из 24 слов. Вы обязательно должны создать новый биткойн-кошелек и перевести все свои средства в новый кошелек из 24 слов, а также прекратить использование кошельков с мнемонической фразой из 12 слов. Пожалуйста, сделайте это немедленно, чтобы обезопасить свои средства.", "outdated_electrum_wallet_description" : "Новые биткойн-кошельки, созданные в Cake, теперь содержат мнемоническую фразу из 24 слов. Вы обязательно должны создать новый биткойн-кошелек и перевести все свои средства в новый кошелек из 24 слов, а также прекратить использование кошельков с мнемонической фразой из 12 слов. Пожалуйста, сделайте это немедленно, чтобы обезопасить свои средства.",
"understand" : "Понятно", "understand" : "Понятно",

View file

@ -490,7 +490,7 @@
"submit_request" : "ส่งคำขอ", "submit_request" : "ส่งคำขอ",
"buy_alert_content" : "ขณะนี้เรารองรับการซื้อ Bitcoin, Litecoin และ Monero เท่านั้น โปรดสร้างหรือเปลี่ยนเป็นกระเป๋าเงิน Bitcoin, Litecoin หรือ Monero ของคุณ", "buy_alert_content" : "ขณะนี้เรารองรับการซื้อ Bitcoin, Litecoin และ Monero เท่านั้น โปรดสร้างหรือเปลี่ยนเป็นกระเป๋าเงิน Bitcoin, Litecoin หรือ Monero ของคุณ",
"sell_alert_content" : "ในปัจจุบันเรารองรับการขาย Bitcoin เท่านั้น หากต้องการขาย Bitcoin โปรดสร้างหรือเปลี่ยนเป็นกระเป๋า Bitcoin ของคุณ", "sell_alert_content" : "ขณะนี้เราสนับสนุนการขาย Bitcoin และ Litecoin เท่านั้น โปรดสร้างหรือเปลี่ยนเป็นกระเป๋าเงิน Bitcoin หรือ Litecoin ของคุณ",
"outdated_electrum_wallet_description" : "กระเป๋า Bitcoin ใหม่ที่สร้างใน Cake มี seed ขนาด 24 คำ ซึ่งจำเป็นต้องสร้างกระเป๋า Bitcoin ใหม่และโอนทุกเงินของคุณไปยังกระเป๋าใหม่ขนาด 24 คำ และหยุดใช้กระเป๋าที่มี seed ขนาด 12 คำ กรุณาทำด่วนเพื่อรักษาเงินของคุณ", "outdated_electrum_wallet_description" : "กระเป๋า Bitcoin ใหม่ที่สร้างใน Cake มี seed ขนาด 24 คำ ซึ่งจำเป็นต้องสร้างกระเป๋า Bitcoin ใหม่และโอนทุกเงินของคุณไปยังกระเป๋าใหม่ขนาด 24 คำ และหยุดใช้กระเป๋าที่มี seed ขนาด 12 คำ กรุณาทำด่วนเพื่อรักษาเงินของคุณ",
"understand" : "ฉันเข้าใจ", "understand" : "ฉันเข้าใจ",

View file

@ -492,7 +492,7 @@
"submit_request" : "talep gönder", "submit_request" : "talep gönder",
"buy_alert_content" : "Şu anda yalnızca Bitcoin, Litecoin ve Monero satın alımını destekliyoruz. Lütfen Bitcoin, Litecoin veya Monero cüzdanınızı oluşturun veya cüzdanınıza geçiş yapın.", "buy_alert_content" : "Şu anda yalnızca Bitcoin, Litecoin ve Monero satın alımını destekliyoruz. Lütfen Bitcoin, Litecoin veya Monero cüzdanınızı oluşturun veya cüzdanınıza geçiş yapın.",
"sell_alert_content": "Şu anda sadece Bitcoin satışını destekliyoruz. Bitcoin satmak için lütfen Bitcoin cüzdanınızı oluşturun veya Bitcoin cüzdanınıza geçiş yapın.", "sell_alert_content": "Şu anda yalnızca Bitcoin ve Litecoin satışını destekliyoruz. Lütfen Bitcoin veya Litecoin cüzdanınızı oluşturun veya cüzdanınıza geçiş yapın.",
"outdated_electrum_wallet_description" : "Cake'te oluşturulan yeni Bitcoin cüzdanları artık 24 kelimelik bir tohuma sahip. Yeni bir Bitcoin cüzdanı oluşturmanız ve tüm paranızı 24 kelimelik yeni cüzdana aktarmanız ve 12 kelimelik tohuma sahip cüzdanları kullanmayı bırakmanız zorunludur. Lütfen paranızı güvence altına almak için bunu hemen yapın.", "outdated_electrum_wallet_description" : "Cake'te oluşturulan yeni Bitcoin cüzdanları artık 24 kelimelik bir tohuma sahip. Yeni bir Bitcoin cüzdanı oluşturmanız ve tüm paranızı 24 kelimelik yeni cüzdana aktarmanız ve 12 kelimelik tohuma sahip cüzdanları kullanmayı bırakmanız zorunludur. Lütfen paranızı güvence altına almak için bunu hemen yapın.",
"understand" : "Anladım", "understand" : "Anladım",

View file

@ -491,7 +491,7 @@
"submit_request" : "надіслати запит", "submit_request" : "надіслати запит",
"buy_alert_content" : "Наразі ми підтримуємо лише придбання Bitcoin, Litecoin і Monero. Створіть або перейдіть на свій гаманець Bitcoin, Litecoin або Monero.", "buy_alert_content" : "Наразі ми підтримуємо лише придбання Bitcoin, Litecoin і Monero. Створіть або перейдіть на свій гаманець Bitcoin, Litecoin або Monero.",
"sell_alert_content": "Наразі ми підтримуємо лише продаж біткойнів. Щоб продати біткойн, створіть або перейдіть на свій біткойн-гаманець.", "sell_alert_content": "Зараз ми підтримуємо лише продаж біткойнів і лайткоінів. Будь ласка, створіть або перейдіть на свій гаманець Bitcoin або Litecoin.",
"outdated_electrum_wallet_description" : "Нові біткойн-гаманці, створені в Cake, тепер містять мнемонічну фразу з 24 слів. Обов’язково стовріть новий біткойн-гаманець, переведіть всі кошти на новий гаманець із 24 слів і припиніть використання гаманців із мнемонічною фразою з 12 слів. Зробіть це негайно, щоб убезпечити свої кошти.", "outdated_electrum_wallet_description" : "Нові біткойн-гаманці, створені в Cake, тепер містять мнемонічну фразу з 24 слів. Обов’язково стовріть новий біткойн-гаманець, переведіть всі кошти на новий гаманець із 24 слів і припиніть використання гаманців із мнемонічною фразою з 12 слів. Зробіть це негайно, щоб убезпечити свої кошти.",
"understand" : "Зрозуміло", "understand" : "Зрозуміло",

View file

@ -494,7 +494,7 @@
"submit_request" : "درخواست بھیج دو", "submit_request" : "درخواست بھیج دو",
"buy_alert_content" : "فی الحال ہم صرف Bitcoin، Litecoin، اور Monero کی خریداری کی حمایت کرتے ہیں۔ براہ کرم اپنا Bitcoin، Litecoin، یا Monero والیٹ بنائیں یا اس پر سوئچ کریں۔", "buy_alert_content" : "فی الحال ہم صرف Bitcoin، Litecoin، اور Monero کی خریداری کی حمایت کرتے ہیں۔ براہ کرم اپنا Bitcoin، Litecoin، یا Monero والیٹ بنائیں یا اس پر سوئچ کریں۔",
"sell_alert_content" : "ہم فی الحال صرف Bitcoin کی فروخت کی حمایت کرتے ہیں۔ Bitcoin فروخت کرنے کے لیے، براہ کرم اپنا Bitcoin والیٹ بنائیں یا اس میں سوئچ کریں۔", "sell_alert_content" : "ہم فی الحال صرف Bitcoin اور Litecoin کی فروخت کی حمایت کرتے ہیں۔ براہ کرم اپنا Bitcoin یا Litecoin والیٹ بنائیں یا اس پر سوئچ کریں۔",
"outdated_electrum_wallet_description" : "Cake میں بنائے گئے نئے Bitcoin بٹوے میں اب 24 الفاظ کا بیج ہے۔ یہ لازمی ہے کہ آپ ایک نیا Bitcoin والیٹ بنائیں اور اپنے تمام فنڈز کو نئے 24 الفاظ والے والیٹ میں منتقل کریں، اور 12 الفاظ کے بیج والے بٹوے کا استعمال بند کریں۔ براہ کرم اپنے فنڈز کو محفوظ بنانے کے لیے فوری طور پر ایسا کریں۔", "outdated_electrum_wallet_description" : "Cake میں بنائے گئے نئے Bitcoin بٹوے میں اب 24 الفاظ کا بیج ہے۔ یہ لازمی ہے کہ آپ ایک نیا Bitcoin والیٹ بنائیں اور اپنے تمام فنڈز کو نئے 24 الفاظ والے والیٹ میں منتقل کریں، اور 12 الفاظ کے بیج والے بٹوے کا استعمال بند کریں۔ براہ کرم اپنے فنڈز کو محفوظ بنانے کے لیے فوری طور پر ایسا کریں۔",
"understand" : "میں سمجھتا ہوں۔", "understand" : "میں سمجھتا ہوں۔",

View file

@ -483,7 +483,7 @@
"submit_request" : "Ṣé ìbéèrè", "submit_request" : "Ṣé ìbéèrè",
"buy_alert_content" : "A jẹ́ kí ríra Bitcoin àti Litecoin nìkan. Ẹ jọ̀wọ́ dá tàbí sún àpamọ́wọ́ ti Bitcoin yín tàbí àpamọ́wọ́ ti Litecoin yín mọ́, t'ẹ́ bá fẹ́ ra Bitcoin tàbí Litecoin.", "buy_alert_content" : "A jẹ́ kí ríra Bitcoin àti Litecoin nìkan. Ẹ jọ̀wọ́ dá tàbí sún àpamọ́wọ́ ti Bitcoin yín tàbí àpamọ́wọ́ ti Litecoin yín mọ́, t'ẹ́ bá fẹ́ ra Bitcoin tàbí Litecoin.",
"sell_alert_content": "A jẹ́ kí títa Bitcoin nìkan. Ẹ jọ̀wọ́ dá tàbí sún àpamọ́wọ́ ti Bitcoin yín mọ́, t'ẹ́ bá fẹ́ ta Bitcoin.", "sell_alert_content": "Lọwọlọwọ a ṣe atilẹyin tita Bitcoin ati Litecoin nikan. Jọwọ ṣẹda tabi yipada si Bitcoin tabi apamọwọ Litecoin rẹ.",
"outdated_electrum_wallet_description" : "Àwọn àpamọ́wọ́ títun Bitcoin ti a ti dá nínú Cake Wallet lọ́wọ́lọ́wọ́. Àwọn àpamọ́wọ́ títun t'á dá nínú Cake Wallet ni hóró tó ní ọ̀rọ̀ mẹ́rinlélógún. Ẹ gbọ́dọ̀ dá àpamọ́wọ́. Ẹ sì sún gbogbo owó yín sí àpamọ́wọ́ títun náà tó dá lórí ọ̀rọ̀ mẹ́rinlélógún. Ẹ sì gbọ́dọ̀ yé lo àwọn àpamọ́wọ́ tó dá lórí hóró tó ní ọ̀rọ̀ méjìlá. Ẹ jọ̀wọ́ ṣe èyí láìpẹ́ kí ẹ ba owó yín.", "outdated_electrum_wallet_description" : "Àwọn àpamọ́wọ́ títun Bitcoin ti a ti dá nínú Cake Wallet lọ́wọ́lọ́wọ́. Àwọn àpamọ́wọ́ títun t'á dá nínú Cake Wallet ni hóró tó ní ọ̀rọ̀ mẹ́rinlélógún. Ẹ gbọ́dọ̀ dá àpamọ́wọ́. Ẹ sì sún gbogbo owó yín sí àpamọ́wọ́ títun náà tó dá lórí ọ̀rọ̀ mẹ́rinlélógún. Ẹ sì gbọ́dọ̀ yé lo àwọn àpamọ́wọ́ tó dá lórí hóró tó ní ọ̀rọ̀ méjìlá. Ẹ jọ̀wọ́ ṣe èyí láìpẹ́ kí ẹ ba owó yín.",
"understand" : "Ó ye mi", "understand" : "Ó ye mi",

View file

@ -491,7 +491,7 @@
"submit_request" : "提交请求", "submit_request" : "提交请求",
"buy_alert_content" : "目前我们只支持购买比特币、莱特币和门罗币。 请创建或切换到您的比特币、莱特币或门罗币钱包。", "buy_alert_content" : "目前我们只支持购买比特币、莱特币和门罗币。 请创建或切换到您的比特币、莱特币或门罗币钱包。",
"sell_alert_content" : "我们目前只支持比特币的销售。 要出售比特币,请创建或切换到您的比特币钱包。", "sell_alert_content" : "我们目前只支持比特币和莱特币的销售。 请创建或切换到您的比特币或莱特币钱包。",
"outdated_electrum_wallet_description" : "在Cake创建的新比特币钱包现在有一个24字的种子。你必须创建一个新的比特币钱包并将你所有的资金转移到新的24字钱包并停止使用12字种子的钱包。请立即这样做以保证你的资金安全。", "outdated_electrum_wallet_description" : "在Cake创建的新比特币钱包现在有一个24字的种子。你必须创建一个新的比特币钱包并将你所有的资金转移到新的24字钱包并停止使用12字种子的钱包。请立即这样做以保证你的资金安全。",
"understand" : "我已知晓", "understand" : "我已知晓",

View file

@ -14,14 +14,14 @@ TYPES=($MONERO_COM $CAKEWALLET $HAVEN)
APP_ANDROID_TYPE=$1 APP_ANDROID_TYPE=$1
MONERO_COM_NAME="Monero.com" MONERO_COM_NAME="Monero.com"
MONERO_COM_VERSION="1.3.7" MONERO_COM_VERSION="1.3.8"
MONERO_COM_BUILD_NUMBER=50 MONERO_COM_BUILD_NUMBER=51
MONERO_COM_BUNDLE_ID="com.monero.app" MONERO_COM_BUNDLE_ID="com.monero.app"
MONERO_COM_PACKAGE="com.monero.app" MONERO_COM_PACKAGE="com.monero.app"
CAKEWALLET_NAME="Cake Wallet" CAKEWALLET_NAME="Cake Wallet"
CAKEWALLET_VERSION="4.6.6" CAKEWALLET_VERSION="4.6.7"
CAKEWALLET_BUILD_NUMBER=160 CAKEWALLET_BUILD_NUMBER=161
CAKEWALLET_BUNDLE_ID="com.cakewallet.cake_wallet" CAKEWALLET_BUNDLE_ID="com.cakewallet.cake_wallet"
CAKEWALLET_PACKAGE="com.cakewallet.cake_wallet" CAKEWALLET_PACKAGE="com.cakewallet.cake_wallet"

View file

@ -13,13 +13,13 @@ TYPES=($MONERO_COM $CAKEWALLET $HAVEN)
APP_IOS_TYPE=$1 APP_IOS_TYPE=$1
MONERO_COM_NAME="Monero.com" MONERO_COM_NAME="Monero.com"
MONERO_COM_VERSION="1.3.7" MONERO_COM_VERSION="1.3.8"
MONERO_COM_BUILD_NUMBER=48 MONERO_COM_BUILD_NUMBER=49
MONERO_COM_BUNDLE_ID="com.cakewallet.monero" MONERO_COM_BUNDLE_ID="com.cakewallet.monero"
CAKEWALLET_NAME="Cake Wallet" CAKEWALLET_NAME="Cake Wallet"
CAKEWALLET_VERSION="4.6.6" CAKEWALLET_VERSION="4.6.7"
CAKEWALLET_BUILD_NUMBER=155 CAKEWALLET_BUILD_NUMBER=159
CAKEWALLET_BUNDLE_ID="com.fotolockr.cakewallet" CAKEWALLET_BUNDLE_ID="com.fotolockr.cakewallet"
HAVEN_NAME="Haven" HAVEN_NAME="Haven"

View file

@ -15,8 +15,8 @@ if [ -n "$1" ]; then
fi fi
CAKEWALLET_NAME="Cake Wallet" CAKEWALLET_NAME="Cake Wallet"
CAKEWALLET_VERSION="1.0.5" CAKEWALLET_VERSION="1.0.6"
CAKEWALLET_BUILD_NUMBER=24 CAKEWALLET_BUILD_NUMBER=25
CAKEWALLET_BUNDLE_ID="com.fotolockr.cakewallet" CAKEWALLET_BUNDLE_ID="com.fotolockr.cakewallet"
if ! [[ " ${TYPES[*]} " =~ " ${APP_MACOS_TYPE} " ]]; then if ! [[ " ${TYPES[*]} " =~ " ${APP_MACOS_TYPE} " ]]; then

View file

@ -20,7 +20,6 @@ class SecretKey {
SecretKey('moonPayApiKey', () => ''), SecretKey('moonPayApiKey', () => ''),
SecretKey('moonPaySecretKey', () => ''), SecretKey('moonPaySecretKey', () => ''),
SecretKey('sideShiftAffiliateId', () => ''), SecretKey('sideShiftAffiliateId', () => ''),
SecretKey('sideShiftApiKey', () => ''),
SecretKey('simpleSwapApiKey', () => ''), SecretKey('simpleSwapApiKey', () => ''),
SecretKey('simpleSwapApiKeyDesktop', () => ''), SecretKey('simpleSwapApiKeyDesktop', () => ''),
SecretKey('anypayToken', () => ''), SecretKey('anypayToken', () => ''),