mirror of
https://github.com/cake-tech/cake_wallet.git
synced 2024-12-25 21:19:37 +00:00
2c37e427e9
* Fix conflicts with main
* fix for multiple wallets
* Add tron to windows application configuration.
* Add macOS option for description message in configure_cake_wallet.sh
* Include missed monero dll for windows.
* fix conflicts with main
* Disable haven configuration for iOS as default. Add ability to configure cakewallet for iOS with for configuration script. Remove cw_shared configuration for cw_monero.
* fix: scan fixes, add date, allow sending while scanning
* add missing nano secrets file [skip ci]
* ios library
* don't pull prebuilds android
* Add auto generation of manifest file for android project even for iOS, macOS, Windows.
* feat: sync fixes, sp settings
* feat: fix resyncing
* store crash fix
* make init async so it won't lag
disable print starts
* fix monero_c build issues
* libstdc++
* Fix MacOS saving wallet file issue
Fix Secure Storage issue (somehow)
* update pubspec.lock
* fix build script
* Use dylib as iOS framework. Use custom path for loading of iOS framework for monero.dart. Add script for generate iOS framework for monero wallet.
* fix: date from height logic, status disconnected & chain tip get
* fix: params
* feat: electrum migration if using cake electrum
* fix nodes
update versions
* re-enable tron
* update sp_scanner to work on iOS [skip ci]
* bump monero_c hash
* bump monero_c commit
* bump moneroc version
* bump monero_c commit
* Add ability to build monero wallet lib as universal lib. Update macOS build guide. Change default arch for macOS project to .
* fix: wrong socket for old electrum nodes
* Fix unchecked wallet type call
* get App Dir correctly in default_settings_migration.dart
* handle previous issue with fetching linux documents directory [skip ci]
* backup fix
* fix NTFS issues
* Close the wallet when the wallet gets changed
* fix: double balance
* feat: node domain
* fix: menu name
* bump monero_c commit
* fix: update tip on set scanning
* fix: connection switching back and forth
* feat: check if node is electrs, and supports sp
* chore: fix build
* minor enhancements
* fixes and enhancements
* solve conflicts with main
* Only stop wallet on rename and delete
* fix: status toggle
* minor enhancement
* Monero.com fixes
* bump monero_c commit
* update sp_scanner to include windows and linux
* Update macOS build guide. Change brew dependencies for build unbound locally.
* fix conflicts and update macos build guide
* remove build cache when on gh actions
* update secure storage
* free up even more storage
* free up more storage
* Add initial wownero
* fix conflicts
* fix workflow issue
* build wownero
* ios and windows changes
* macos
* complete wownero flow (app side)
* add keychain group entitlement and update script for RunnerBase on macos
* update secure_storage version to 8.1.0 in configure.dart
* add wownero framework
* update ios builds
* proper path for wownero and monero
* finalizing wownero
* finalizing wownero
* free up even more storage
* revert commenting of build gradle configs
* revert commenting of secrets [skip ci]
* free more storage
* minor fixes
* link android wownero libraries
* bump monero_c commit
* wownero fixes
* rename target
* build_single.sh using clean env
* bump monero_c commit
* minor fix
* Add wownero polyseed
* fix conflicts with main
* fix: wallet seed display
fix: wownero not refreshing
* fix: wallet seed display
fix: wownero not refreshing
* bump monero_c commit
* minor fixes
* fix: incorrectly displaying XMR instead of WOW
* fix: incorrect restore height in wownero
* bump monero_c commit
* Add Inno Setup Script for windows exe installer
* drop libc++_shared.so
* fixes from comments
* Fix CMake for windows
* Merge latest monero dart changes [skip ci]
* bump monero_c commit
* add wownero to build scripts for macos [skip ci]
* add 14 word seed support to wownero
* UI fixes for wownero seed restore
* minor fixes
* reformat code to pass lints
* Add debug ledger code
* Add Litecoin Hardware Wallet Creation
* Add Litecoin Hardware Wallet Creation
* Fix Bitcoin not sending on Ledger
* Fixes to sending LTC using Ledger
* CW-679 Fix merge conflicts
* CW-679 Fix merge conflicts
* CW-679 Minor fixes
* CW-679 Add derivation Path of change address
* Add create Monero Wallet from Ledger
* bug fix to create Monero Wallet from Ledger
* ledger flutter plus refactoring
* ledger flutter plus refactoring
* ledger flutter plus refactoring
* Ups :|
* Ups :| I forgot USB
* Handle BT Off
* Fix Issue with A14 and USB
* Small Ledger Quality of life improvements
* Small Ledger Quality of life improvements
* Small Ledger Quality of life improvements
* Small Ledger Quality of life improvements
* Small Ledger Quality of life improvements
* Small Ledger Quality of life improvements
* Small Ledger Quality of life improvements
* Pls work
* Pls work
* Pls work
* Pls work
* Fix overpopulation
* Fix ble device detection and support for Stax and Flex
* clean up pubspec
* clean up
* MWeb merge fix
* MWeb merge fix
* Migrate to Ledger Flutter Plus
* Add connect device page before loading the wallet (Only monero)
* Add connect device page before loading the wallet (Only monero)
* Fix merge error
* Fix merge error
* Fix merge error && Allow for wallet switching
* Please compile now
* Move monero/ledger.dart from monero_c to cw_monero
* Upgrade ledger_flutter_plus
* Add more popups if action on the device is needed.
* Update monero_c dependency hash
* Yay ledger monero is even more efficient and avoids memory leaks 🥳
* [skip-ci] more code
* Fix Minor Bug
* Fix Minor Bug
* Apply requested changes
* [skip ci] Apply requested changes
* Minor Cleanup
* Welp I'm dumb :/
* Implement requested changes
* Increase ledger refresh speed
* Add Monero Ledger keep connection alive
* Add Monero Ledger keep connection alive
---------
Co-authored-by: OmarHatem <omarh.ismail1@gmail.com>
Co-authored-by: Czarek Nakamoto <cyjan@mrcyjanek.net>
Co-authored-by: m <m@cakewallet.com>
Co-authored-by: Rafael Saes <git@rafael.saes.dev>
Co-authored-by: Matthew Fosse <matt@fosse.co>
146 lines
4.3 KiB
Dart
146 lines
4.3 KiB
Dart
import 'dart:async';
|
|
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/monero/monero.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_plus/ledger_flutter_plus.dart' as sdk;
|
|
import 'package:mobx/mobx.dart';
|
|
import 'package:permission_handler/permission_handler.dart';
|
|
|
|
part 'ledger_view_model.g.dart';
|
|
|
|
class LedgerViewModel = LedgerViewModelBase with _$LedgerViewModel;
|
|
|
|
abstract class LedgerViewModelBase with Store {
|
|
// late final Ledger ledger;
|
|
late final sdk.LedgerInterface ledgerPlusBLE;
|
|
late final sdk.LedgerInterface ledgerPlusUSB;
|
|
|
|
bool get _doesSupportHardwareWallets {
|
|
if (!DeviceInfo.instance.isMobile) {
|
|
return false;
|
|
}
|
|
|
|
if (isMoneroOnly) {
|
|
return DeviceConnectionType.supportedConnectionTypes(
|
|
WalletType.monero, Platform.isIOS)
|
|
.isNotEmpty;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
LedgerViewModelBase() {
|
|
if (_doesSupportHardwareWallets) {
|
|
reaction((_) => bleIsEnabled, (_) {
|
|
if (bleIsEnabled) _initBLE();
|
|
});
|
|
updateBleState();
|
|
|
|
if (!Platform.isIOS) {
|
|
ledgerPlusUSB = sdk.LedgerInterface.usb();
|
|
}
|
|
}
|
|
}
|
|
|
|
@observable
|
|
bool bleIsEnabled = false;
|
|
|
|
bool _bleIsInitialized = false;
|
|
Future<void> _initBLE() async {
|
|
if (bleIsEnabled && !_bleIsInitialized) {
|
|
ledgerPlusBLE = sdk.LedgerInterface.ble(onPermissionRequest: (_) async {
|
|
Map<Permission, PermissionStatus> statuses = await [
|
|
Permission.bluetoothScan,
|
|
Permission.bluetoothConnect,
|
|
Permission.bluetoothAdvertise,
|
|
].request();
|
|
|
|
return statuses.values.where((status) => status.isDenied).isEmpty;
|
|
});
|
|
_bleIsInitialized = true;
|
|
}
|
|
}
|
|
|
|
Future<void> updateBleState() async {
|
|
final bleState = await sdk.UniversalBle.getBluetoothAvailabilityState();
|
|
|
|
final newState = bleState == sdk.AvailabilityState.poweredOn;
|
|
|
|
if (newState != bleIsEnabled) bleIsEnabled = newState;
|
|
}
|
|
|
|
Stream<sdk.LedgerDevice> scanForBleDevices() => ledgerPlusBLE.scan();
|
|
|
|
Stream<sdk.LedgerDevice> scanForUsbDevices() => ledgerPlusUSB.scan();
|
|
|
|
Future<void> connectLedger(sdk.LedgerDevice device, WalletType type) async {
|
|
if (isConnected) {
|
|
try {
|
|
await _connection!.disconnect();
|
|
} catch (_) {}
|
|
}
|
|
final ledger = device.connectionType == sdk.ConnectionType.ble
|
|
? ledgerPlusBLE
|
|
: ledgerPlusUSB;
|
|
|
|
if (_connectionChangeListener == null) {
|
|
_connectionChangeListener = ledger.deviceStateChanges.listen((event) {
|
|
print('Ledger Device State Changed: $event');
|
|
if (event == sdk.BleConnectionState.disconnected) {
|
|
_connection = null;
|
|
_connectionChangeListener?.cancel();
|
|
}
|
|
});
|
|
}
|
|
|
|
_connection = await ledger.connect(device);
|
|
}
|
|
|
|
StreamSubscription<sdk.BleConnectionState>? _connectionChangeListener;
|
|
sdk.LedgerConnection? _connection;
|
|
|
|
bool get isConnected => _connection != null && !(_connection!.isDisconnected);
|
|
|
|
sdk.LedgerConnection get connection => _connection!;
|
|
|
|
void setLedger(WalletBase wallet) {
|
|
switch (wallet.type) {
|
|
case WalletType.monero:
|
|
return monero!.setLedgerConnection(wallet, connection);
|
|
case WalletType.bitcoin:
|
|
case WalletType.litecoin:
|
|
return bitcoin!.setLedgerConnection(wallet, connection);
|
|
case WalletType.ethereum:
|
|
return ethereum!.setLedgerConnection(wallet, connection);
|
|
case WalletType.polygon:
|
|
return polygon!.setLedgerConnection(wallet, connection);
|
|
default:
|
|
throw Exception('Unexpected wallet type: ${wallet.type}');
|
|
}
|
|
}
|
|
|
|
String? interpretErrorCode(String errorCode) {
|
|
switch (errorCode) {
|
|
case "6985":
|
|
return S.current.ledger_error_tx_rejected_by_user;
|
|
case "5515":
|
|
return S.current.ledger_error_device_locked;
|
|
case "6d02": // UNKNOWN_APDU
|
|
case "6511":
|
|
case "6e00":
|
|
return S.current.ledger_error_wrong_app;
|
|
default:
|
|
return null;
|
|
}
|
|
}
|
|
}
|