mirror of
https://github.com/cake-tech/cake_wallet.git
synced 2025-01-18 16:55:58 +00:00
Merge branch 'main' of https://github.com/cake-tech/cake_wallet into cw_linux_direct_input_password
Conflicts: cw_monero/example/pubspec.lock
This commit is contained in:
commit
95711f619b
12 changed files with 199 additions and 121 deletions
|
@ -1 +1 @@
|
|||
Generic bug fixes and enhancements
|
||||
Bug fixes and generic enhancements
|
|
@ -1,3 +1 @@
|
|||
Hardware wallets support for Bitcoin, Ethereum and Polygon
|
||||
Security enhancements
|
||||
Bug fixes and generic enhancements
|
|
@ -33,15 +33,6 @@ packages:
|
|||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.1.1"
|
||||
cake_backup:
|
||||
dependency: transitive
|
||||
description:
|
||||
path: "."
|
||||
ref: main
|
||||
resolved-ref: "3aba867dcab6737f6707782f5db15d71f303db38"
|
||||
url: "https://github.com/cake-tech/cake_backup.git"
|
||||
source: git
|
||||
version: "1.0.0+1"
|
||||
characters:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -82,14 +73,6 @@ packages:
|
|||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.0.2"
|
||||
cryptography:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: cryptography
|
||||
sha256: df156c5109286340817d21fa7b62f9140f17915077127dd70f8bd7a2a0997a35
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.5.0"
|
||||
cupertino_icons:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
|
@ -439,14 +422,6 @@ packages:
|
|||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.6.1"
|
||||
tuple:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: tuple
|
||||
sha256: a97ce2013f240b2f3807bcbaf218765b6f301c3eff91092bcfa23a039e7dd151
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.0.2"
|
||||
typed_data:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
|
|
@ -307,7 +307,7 @@ SPEC CHECKSUMS:
|
|||
Toast: ec33c32b8688982cecc6348adeae667c1b9938da
|
||||
uni_links: d97da20c7701486ba192624d99bffaaffcfc298a
|
||||
UnstoppableDomainsResolution: c3c67f4d0a5e2437cb00d4bd50c2e00d6e743841
|
||||
url_launcher_ios: 6116280ddcfe98ab8820085d8d76ae7449447586
|
||||
url_launcher_ios: 5334b05cef931de560670eeae103fd3e431ac3fe
|
||||
wakelock_plus: 8b09852c8876491e4b6d179e17dfe2a0b5f60d47
|
||||
workmanager: 0afdcf5628bbde6924c21af7836fed07b42e30e6
|
||||
|
||||
|
|
|
@ -5,9 +5,6 @@ import 'package:cw_core/format_amount.dart';
|
|||
import 'package:cw_core/hive_type_ids.dart';
|
||||
import 'package:hive/hive.dart';
|
||||
|
||||
part 'trade.g.dart';
|
||||
|
||||
@HiveType(typeId: Trade.typeId)
|
||||
class Trade extends HiveObject {
|
||||
Trade({
|
||||
required this.id,
|
||||
|
@ -32,6 +29,7 @@ class Trade extends HiveObject {
|
|||
this.txId,
|
||||
this.isRefund,
|
||||
this.isSendAll,
|
||||
this.router,
|
||||
}) {
|
||||
if (provider != null) providerRaw = provider.raw;
|
||||
|
||||
|
@ -121,6 +119,9 @@ class Trade extends HiveObject {
|
|||
@HiveField(21)
|
||||
bool? isSendAll;
|
||||
|
||||
@HiveField(22)
|
||||
String? router;
|
||||
|
||||
static Trade fromMap(Map<String, Object?> map) {
|
||||
return Trade(
|
||||
id: map['id'] as String,
|
||||
|
@ -135,7 +136,9 @@ class Trade extends HiveObject {
|
|||
memo: map['memo'] as String?,
|
||||
txId: map['tx_id'] as String?,
|
||||
isRefund: map['isRefund'] as bool?,
|
||||
isSendAll: map['isSendAll'] as bool?);
|
||||
isSendAll: map['isSendAll'] as bool?,
|
||||
router: map['router'] as String?,
|
||||
);
|
||||
}
|
||||
|
||||
Map<String, dynamic> toMap() {
|
||||
|
@ -152,8 +155,111 @@ class Trade extends HiveObject {
|
|||
'tx_id': txId,
|
||||
'isRefund': isRefund,
|
||||
'isSendAll': isSendAll,
|
||||
'router': router,
|
||||
};
|
||||
}
|
||||
|
||||
String amountFormatted() => formatAmount(amount);
|
||||
}
|
||||
|
||||
class TradeAdapter extends TypeAdapter<Trade> {
|
||||
@override
|
||||
final int typeId = Trade.typeId;
|
||||
|
||||
@override
|
||||
Trade read(BinaryReader reader) {
|
||||
final numOfFields = reader.readByte();
|
||||
final fields = <int, dynamic>{};
|
||||
for (int i = 0; i < numOfFields; i++) {
|
||||
try {
|
||||
fields[reader.readByte()] = reader.read();
|
||||
} catch (_) {}
|
||||
}
|
||||
|
||||
return Trade(
|
||||
id: fields[0] == null ? '' : fields[0] as String,
|
||||
amount: fields[7] == null ? '' : fields[7] as String,
|
||||
createdAt: fields[5] as DateTime?,
|
||||
expiredAt: fields[6] as DateTime?,
|
||||
inputAddress: fields[8] as String?,
|
||||
extraId: fields[9] as String?,
|
||||
outputTransaction: fields[10] as String?,
|
||||
refundAddress: fields[11] as String?,
|
||||
walletId: fields[12] as String?,
|
||||
payoutAddress: fields[13] as String?,
|
||||
password: fields[14] as String?,
|
||||
providerId: fields[15] as String?,
|
||||
providerName: fields[16] as String?,
|
||||
fromWalletAddress: fields[17] as String?,
|
||||
memo: fields[18] as String?,
|
||||
txId: fields[19] as String?,
|
||||
isRefund: fields[20] as bool?,
|
||||
isSendAll: fields[21] as bool?,
|
||||
router: fields[22] as String?,
|
||||
)
|
||||
..providerRaw = fields[1] == null ? 0 : fields[1] as int
|
||||
..fromRaw = fields[2] == null ? 0 : fields[2] as int
|
||||
..toRaw = fields[3] == null ? 0 : fields[3] as int
|
||||
..stateRaw = fields[4] == null ? '' : fields[4] as String;
|
||||
}
|
||||
|
||||
@override
|
||||
void write(BinaryWriter writer, Trade obj) {
|
||||
writer
|
||||
..writeByte(23)
|
||||
..writeByte(0)
|
||||
..write(obj.id)
|
||||
..writeByte(1)
|
||||
..write(obj.providerRaw)
|
||||
..writeByte(2)
|
||||
..write(obj.fromRaw)
|
||||
..writeByte(3)
|
||||
..write(obj.toRaw)
|
||||
..writeByte(4)
|
||||
..write(obj.stateRaw)
|
||||
..writeByte(5)
|
||||
..write(obj.createdAt)
|
||||
..writeByte(6)
|
||||
..write(obj.expiredAt)
|
||||
..writeByte(7)
|
||||
..write(obj.amount)
|
||||
..writeByte(8)
|
||||
..write(obj.inputAddress)
|
||||
..writeByte(9)
|
||||
..write(obj.extraId)
|
||||
..writeByte(10)
|
||||
..write(obj.outputTransaction)
|
||||
..writeByte(11)
|
||||
..write(obj.refundAddress)
|
||||
..writeByte(12)
|
||||
..write(obj.walletId)
|
||||
..writeByte(13)
|
||||
..write(obj.payoutAddress)
|
||||
..writeByte(14)
|
||||
..write(obj.password)
|
||||
..writeByte(15)
|
||||
..write(obj.providerId)
|
||||
..writeByte(16)
|
||||
..write(obj.providerName)
|
||||
..writeByte(17)
|
||||
..write(obj.fromWalletAddress)
|
||||
..writeByte(18)
|
||||
..write(obj.memo)
|
||||
..writeByte(19)
|
||||
..write(obj.txId)
|
||||
..writeByte(20)
|
||||
..write(obj.isRefund)
|
||||
..writeByte(21)
|
||||
..write(obj.isSendAll)
|
||||
..writeByte(22)
|
||||
..write(obj.router);
|
||||
}
|
||||
|
||||
@override
|
||||
int get hashCode => typeId.hashCode;
|
||||
|
||||
@override
|
||||
bool operator ==(Object other) =>
|
||||
identical(this, other) ||
|
||||
other is TradeAdapter && runtimeType == other.runtimeType && typeId == other.typeId;
|
||||
}
|
||||
|
|
|
@ -5,7 +5,6 @@ import 'package:cake_wallet/core/secure_storage.dart';
|
|||
import 'package:cake_wallet/entities/language_service.dart';
|
||||
import 'package:cake_wallet/buy/order.dart';
|
||||
import 'package:cake_wallet/locales/locale.dart';
|
||||
import 'package:cake_wallet/store/yat/yat_store.dart';
|
||||
import 'package:cake_wallet/utils/device_info.dart';
|
||||
import 'package:cake_wallet/utils/exception_handler.dart';
|
||||
import 'package:cake_wallet/view_model/link_view_model.dart';
|
||||
|
@ -38,7 +37,6 @@ import 'package:cake_wallet/entities/template.dart';
|
|||
import 'package:cake_wallet/exchange/trade.dart';
|
||||
import 'package:cake_wallet/exchange/exchange_template.dart';
|
||||
import 'package:cake_wallet/src/screens/root/root.dart';
|
||||
import 'package:uni_links/uni_links.dart';
|
||||
import 'package:cw_core/unspent_coins_info.dart';
|
||||
import 'package:cake_wallet/monero/monero.dart';
|
||||
import 'package:cw_core/cake_hive.dart';
|
||||
|
@ -46,7 +44,7 @@ import 'package:cw_core/window_size.dart';
|
|||
|
||||
final navigatorKey = GlobalKey<NavigatorState>();
|
||||
final rootKey = GlobalKey<RootState>();
|
||||
final RouteObserver<PageRoute> routeObserver = RouteObserver<PageRoute>();
|
||||
final RouteObserver<PageRoute<dynamic>> routeObserver = RouteObserver<PageRoute<dynamic>>();
|
||||
|
||||
Future<void> main() async {
|
||||
await runZonedGuarded(() async {
|
||||
|
@ -70,6 +68,31 @@ Future<void> main() async {
|
|||
|
||||
runApp(App());
|
||||
}, (error, stackTrace) async {
|
||||
runApp(
|
||||
MaterialApp(
|
||||
debugShowCheckedModeBanner: false,
|
||||
home: Scaffold(
|
||||
body: SingleChildScrollView(
|
||||
child: Container(
|
||||
margin: EdgeInsets.only(top: 50, left: 20, right: 20, bottom: 20),
|
||||
child: Column(
|
||||
children: [
|
||||
Text(
|
||||
'Error:\n${error.toString()}',
|
||||
style: TextStyle(fontSize: 22),
|
||||
),
|
||||
Text(
|
||||
'Stack trace:\n${stackTrace.toString()}',
|
||||
style: TextStyle(fontSize: 16),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
|
||||
ExceptionHandler.onError(FlutterErrorDetails(exception: error, stack: stackTrace));
|
||||
});
|
||||
}
|
||||
|
@ -230,61 +253,6 @@ class App extends StatefulWidget {
|
|||
}
|
||||
|
||||
class AppState extends State<App> with SingleTickerProviderStateMixin {
|
||||
AppState() : yatStore = getIt.get<YatStore>();
|
||||
|
||||
YatStore yatStore;
|
||||
StreamSubscription? stream;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
//_handleIncomingLinks();
|
||||
//_handleInitialUri();
|
||||
}
|
||||
|
||||
Future<void> _handleInitialUri() async {
|
||||
try {
|
||||
final uri = await getInitialUri();
|
||||
print('uri: $uri');
|
||||
if (uri == null) {
|
||||
return;
|
||||
}
|
||||
if (!mounted) return;
|
||||
//_fetchEmojiFromUri(uri);
|
||||
} catch (e) {
|
||||
if (!mounted) return;
|
||||
print(e.toString());
|
||||
}
|
||||
}
|
||||
|
||||
void _handleIncomingLinks() {
|
||||
if (!kIsWeb) {
|
||||
stream = getUriLinksStream().listen((Uri? uri) {
|
||||
print('uri: $uri');
|
||||
if (!mounted) return;
|
||||
//_fetchEmojiFromUri(uri);
|
||||
}, onError: (Object error) {
|
||||
if (!mounted) return;
|
||||
print('Error: $error');
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
void _fetchEmojiFromUri(Uri uri) {
|
||||
//final queryParameters = uri.queryParameters;
|
||||
//if (queryParameters?.isEmpty ?? true) {
|
||||
// return;
|
||||
//}
|
||||
//final emoji = queryParameters['eid'];
|
||||
//final refreshToken = queryParameters['refresh_token'];
|
||||
//if ((emoji?.isEmpty ?? true)||(refreshToken?.isEmpty ?? true)) {
|
||||
// return;
|
||||
//}
|
||||
//yatStore.emoji = emoji;
|
||||
//yatStore.refreshToken = refreshToken;
|
||||
//yatStore.emojiIncommingSC.add(emoji);
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Observer(builder: (BuildContext context) {
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
import 'dart:io';
|
||||
|
||||
import 'package:cake_wallet/core/execution_state.dart';
|
||||
import 'package:cake_wallet/di.dart';
|
||||
import 'package:cake_wallet/generated/i18n.dart';
|
||||
|
@ -13,6 +15,9 @@ import 'package:cake_wallet/utils/responsive_layout_util.dart';
|
|||
import 'package:cake_wallet/utils/show_pop_up.dart';
|
||||
import 'package:cake_wallet/view_model/restore/restore_from_qr_vm.dart';
|
||||
import 'package:cake_wallet/view_model/restore/wallet_restore_from_qr_code.dart';
|
||||
import 'package:cake_wallet/wallet_type_utils.dart';
|
||||
import 'package:cw_core/hardware/device_connection_type.dart';
|
||||
import 'package:cw_core/wallet_type.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:permission_handler/permission_handler.dart';
|
||||
|
||||
|
@ -24,6 +29,19 @@ class RestoreOptionsPage extends BasePage {
|
|||
|
||||
final bool isNewInstall;
|
||||
|
||||
bool get _doesSupportHardwareWallets {
|
||||
if (!DeviceInfo.instance.isMobile) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (isMoneroOnly) {
|
||||
return DeviceConnectionType.supportedConnectionTypes(WalletType.monero, Platform.isIOS)
|
||||
.isNotEmpty;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@override
|
||||
Widget body(BuildContext context) {
|
||||
final imageColor = Theme.of(context).extension<OptionTileTheme>()!.titleColor;
|
||||
|
@ -57,7 +75,7 @@ class RestoreOptionsPage extends BasePage {
|
|||
description: S.of(context).restore_description_from_backup,
|
||||
),
|
||||
),
|
||||
if (DeviceInfo.instance.isMobile)
|
||||
if (_doesSupportHardwareWallets)
|
||||
Padding(
|
||||
padding: EdgeInsets.only(top: 24),
|
||||
child: OptionTile(
|
||||
|
|
|
@ -2,10 +2,7 @@ import 'dart:async';
|
|||
import 'dart:io';
|
||||
import 'package:cake_wallet/core/auth_service.dart';
|
||||
import 'package:cake_wallet/core/totp_request_details.dart';
|
||||
import 'package:cake_wallet/generated/i18n.dart';
|
||||
import 'package:cake_wallet/reactions/wallet_connect.dart';
|
||||
import 'package:cake_wallet/utils/device_info.dart';
|
||||
import 'package:cake_wallet/utils/payment_request.dart';
|
||||
import 'package:cake_wallet/view_model/link_view_model.dart';
|
||||
import 'package:cw_core/wallet_base.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
@ -14,7 +11,6 @@ import 'package:cake_wallet/src/screens/auth/auth_page.dart';
|
|||
import 'package:cake_wallet/store/app_store.dart';
|
||||
import 'package:cake_wallet/store/authentication_store.dart';
|
||||
import 'package:cake_wallet/entities/qr_scanner.dart';
|
||||
import 'package:fluttertoast/fluttertoast.dart';
|
||||
import 'package:mobx/mobx.dart';
|
||||
import 'package:uni_links/uni_links.dart';
|
||||
import 'package:cake_wallet/src/screens/setup_2fa/setup_2fa_enter_code_page.dart';
|
||||
|
|
|
@ -1,8 +1,12 @@
|
|||
import 'dart:io';
|
||||
|
||||
import 'package:cake_wallet/bitcoin/bitcoin.dart';
|
||||
import 'package:cake_wallet/ethereum/ethereum.dart';
|
||||
import 'package:cake_wallet/generated/i18n.dart';
|
||||
import 'package:cake_wallet/polygon/polygon.dart';
|
||||
import 'package:cake_wallet/utils/device_info.dart';
|
||||
import 'package:cake_wallet/wallet_type_utils.dart';
|
||||
import 'package:cw_core/hardware/device_connection_type.dart';
|
||||
import 'package:cw_core/wallet_base.dart';
|
||||
import 'package:cw_core/wallet_type.dart';
|
||||
import 'package:ledger_flutter/ledger_flutter.dart';
|
||||
|
@ -11,8 +15,21 @@ import 'package:permission_handler/permission_handler.dart';
|
|||
class LedgerViewModel {
|
||||
late final Ledger ledger;
|
||||
|
||||
bool get _doesSupportHardwareWallets {
|
||||
if (!DeviceInfo.instance.isMobile) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (isMoneroOnly) {
|
||||
return DeviceConnectionType.supportedConnectionTypes(WalletType.monero, Platform.isIOS)
|
||||
.isNotEmpty;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
LedgerViewModel() {
|
||||
if (DeviceInfo.instance.isMobile) {
|
||||
if (_doesSupportHardwareWallets) {
|
||||
ledger = Ledger(
|
||||
options: LedgerOptions(
|
||||
scanMode: ScanMode.balanced,
|
||||
|
|
|
@ -15,15 +15,15 @@ TYPES=($MONERO_COM $CAKEWALLET $HAVEN)
|
|||
APP_ANDROID_TYPE=$1
|
||||
|
||||
MONERO_COM_NAME="Monero.com"
|
||||
MONERO_COM_VERSION="1.13.0"
|
||||
MONERO_COM_BUILD_NUMBER=86
|
||||
MONERO_COM_VERSION="1.13.1"
|
||||
MONERO_COM_BUILD_NUMBER=87
|
||||
MONERO_COM_BUNDLE_ID="com.monero.app"
|
||||
MONERO_COM_PACKAGE="com.monero.app"
|
||||
MONERO_COM_SCHEME="monero.com"
|
||||
|
||||
CAKEWALLET_NAME="Cake Wallet"
|
||||
CAKEWALLET_VERSION="4.16.0"
|
||||
CAKEWALLET_BUILD_NUMBER=210
|
||||
CAKEWALLET_VERSION="4.16.1"
|
||||
CAKEWALLET_BUILD_NUMBER=211
|
||||
CAKEWALLET_BUNDLE_ID="com.cakewallet.cake_wallet"
|
||||
CAKEWALLET_PACKAGE="com.cakewallet.cake_wallet"
|
||||
CAKEWALLET_SCHEME="cakewallet"
|
||||
|
|
|
@ -13,13 +13,13 @@ TYPES=($MONERO_COM $CAKEWALLET $HAVEN)
|
|||
APP_IOS_TYPE=$1
|
||||
|
||||
MONERO_COM_NAME="Monero.com"
|
||||
MONERO_COM_VERSION="1.13.0"
|
||||
MONERO_COM_BUILD_NUMBER=84
|
||||
MONERO_COM_VERSION="1.13.1"
|
||||
MONERO_COM_BUILD_NUMBER=85
|
||||
MONERO_COM_BUNDLE_ID="com.cakewallet.monero"
|
||||
|
||||
CAKEWALLET_NAME="Cake Wallet"
|
||||
CAKEWALLET_VERSION="4.16.0"
|
||||
CAKEWALLET_BUILD_NUMBER=236
|
||||
CAKEWALLET_VERSION="4.16.1"
|
||||
CAKEWALLET_BUILD_NUMBER=239
|
||||
CAKEWALLET_BUNDLE_ID="com.fotolockr.cakewallet"
|
||||
|
||||
HAVEN_NAME="Haven"
|
||||
|
|
|
@ -16,13 +16,13 @@ if [ -n "$1" ]; then
|
|||
fi
|
||||
|
||||
MONERO_COM_NAME="Monero.com"
|
||||
MONERO_COM_VERSION="1.3.0"
|
||||
MONERO_COM_BUILD_NUMBER=17
|
||||
MONERO_COM_VERSION="1.3.1"
|
||||
MONERO_COM_BUILD_NUMBER=18
|
||||
MONERO_COM_BUNDLE_ID="com.cakewallet.monero"
|
||||
|
||||
CAKEWALLET_NAME="Cake Wallet"
|
||||
CAKEWALLET_VERSION="1.9.0"
|
||||
CAKEWALLET_BUILD_NUMBER=71
|
||||
CAKEWALLET_VERSION="1.9.1"
|
||||
CAKEWALLET_BUILD_NUMBER=72
|
||||
CAKEWALLET_BUNDLE_ID="com.fotolockr.cakewallet"
|
||||
|
||||
if ! [[ " ${TYPES[*]} " =~ " ${APP_MACOS_TYPE} " ]]; then
|
||||
|
|
Loading…
Reference in a new issue