diff --git a/cw_evm/lib/evm_chain_wallet.dart b/cw_evm/lib/evm_chain_wallet.dart index b03b180df..3821d27d2 100644 --- a/cw_evm/lib/evm_chain_wallet.dart +++ b/cw_evm/lib/evm_chain_wallet.dart @@ -210,23 +210,33 @@ abstract class EVMChainWalletBase // check for Already existing scam tokens, cuz users can get scammed twice ¯\_(ツ)_/¯ await _checkForExistingScamTokens(); - if (walletInfo.hardwareWalletType == HardwareWalletType.ledger) { - _evmChainPrivateKey = EvmLedgerCredentials(walletInfo.address); - walletAddresses.address = walletInfo.address; - } else if (walletInfo.hardwareWalletType == HardwareWalletType.bitbox) { - _evmChainPrivateKey = EvmBitboxCredentials(walletInfo.address); - walletAddresses.address = walletInfo.address; - } else if (walletInfo.hardwareWalletType == HardwareWalletType.trezor) { - _evmChainPrivateKey = EvmTrezorCredentials(walletInfo.address); - walletAddresses.address = walletInfo.address; - } else { - _evmChainPrivateKey = await getPrivateKey( - mnemonic: _mnemonic, - privateKey: _hexPrivateKey, - password: _password, - passphrase: passphrase, - ); - walletAddresses.address = _evmChainPrivateKey.address.hexEip55; + switch(walletInfo.hardwareWalletType) { + case HardwareWalletType.ledger: + _evmChainPrivateKey = EvmLedgerCredentials(walletInfo.address); + walletAddresses.address = walletInfo.address; + break; + case HardwareWalletType.bitbox: + _evmChainPrivateKey = EvmBitboxCredentials(walletInfo.address); + walletAddresses.address = walletInfo.address; + break; + case HardwareWalletType.trezor: + _evmChainPrivateKey = EvmTrezorCredentials(walletInfo.address); + walletAddresses.address = walletInfo.address; + break; + case HardwareWalletType.cupcake: + case HardwareWalletType.coldcard: + case HardwareWalletType.seedsigner: + case HardwareWalletType.keystone: + throw UnimplementedError(); + case null: + _evmChainPrivateKey = await getPrivateKey( + mnemonic: _mnemonic, + privateKey: _hexPrivateKey, + password: _password, + passphrase: passphrase, + ); + walletAddresses.address = _evmChainPrivateKey.address.hexEip55; + break; } await save(); } diff --git a/lib/di.dart b/lib/di.dart index 59b3cfbaa..fcf45fb17 100644 --- a/lib/di.dart +++ b/lib/di.dart @@ -1612,13 +1612,17 @@ Future setup({ getIt.registerFactory(() => DevExchangeProviderLogsPage(getIt.get())); getIt.registerFactory(() => StartTorPage(StartTorViewModel(),)); - + getIt.registerFactory(() => DEuroViewModel( - getIt(), - getIt(), - getIt(), - getIt(), - )); + getIt(), + getIt(), + getIt(), + getIt(), + getIt.get().wallet!.isHardwareWallet + ? getIt( + param1: getIt.get().wallet!.hardwareWalletType!) + : null, + )); getIt.registerFactory(() => DEuroSavingsPage(getIt())); diff --git a/lib/src/screens/exchange_trade/exchange_trade_page.dart b/lib/src/screens/exchange_trade/exchange_trade_page.dart index 7a1587d84..e07d10cc6 100644 --- a/lib/src/screens/exchange_trade/exchange_trade_page.dart +++ b/lib/src/screens/exchange_trade/exchange_trade_page.dart @@ -1,6 +1,7 @@ import 'package:cake_wallet/exchange/exchange_provider_description.dart'; import 'package:cake_wallet/reactions/wallet_connect.dart'; import 'package:cake_wallet/routes.dart'; +import 'package:cake_wallet/src/screens/connect_device/connect_device_page.dart'; import 'package:cake_wallet/src/screens/exchange/widgets/desktop_exchange_cards_section.dart'; import 'package:cake_wallet/src/screens/exchange/widgets/mobile_exchange_cards_section.dart'; import 'package:cake_wallet/src/screens/exchange_trade/widgets/exchange_trade_card_item_widget.dart'; @@ -190,7 +191,7 @@ class ExchangeTradeState extends State { isDisabled: trade.inputAddress == null || trade.inputAddress!.isEmpty || sendingState is ExecutedSuccessfullyState, isLoading: sendingState is IsExecutingState, - onPressed: () => widget.exchangeTradeViewModel.confirmSending(), + onPressed: _onPressedSendFromCakeWallet, text: S.current.send_from_cake_wallet, color: Theme.of(context).colorScheme.primary, textColor: Theme.of(context).colorScheme.onPrimary, @@ -204,6 +205,30 @@ class ExchangeTradeState extends State { ); } + Future _onPressedSendFromCakeWallet() async { + final sendVM = widget.exchangeTradeViewModel.sendViewModel; + + if (sendVM.wallet.isHardwareWallet) { + if (!sendVM.hardwareWalletViewModel!.isConnected) { + await Navigator.of(context).pushNamed(Routes.connectDevices, + arguments: ConnectDevicePageParams( + walletType: sendVM.walletType, + hardwareWalletType: + sendVM.wallet.walletInfo.hardwareWalletType!, + onConnectDevice: (context, _) { + print(sendVM.wallet); + sendVM.hardwareWalletViewModel!.initWallet(sendVM.wallet); + Navigator.of(context).pop(); + }, + )); + } else { + sendVM.hardwareWalletViewModel!.initWallet(sendVM.wallet); + } + } + + widget.exchangeTradeViewModel.confirmSending(); + } + BuildContext? dialogContext; BuildContext? loadingBottomSheetContext; diff --git a/lib/src/screens/integrations/deuro/savings_page.dart b/lib/src/screens/integrations/deuro/savings_page.dart index 57192f2a9..4a5d62a02 100644 --- a/lib/src/screens/integrations/deuro/savings_page.dart +++ b/lib/src/screens/integrations/deuro/savings_page.dart @@ -1,6 +1,8 @@ import 'package:cake_wallet/core/execution_state.dart'; import 'package:cake_wallet/generated/i18n.dart'; +import 'package:cake_wallet/routes.dart'; import 'package:cake_wallet/src/screens/base_page.dart'; +import 'package:cake_wallet/src/screens/connect_device/connect_device_page.dart'; import 'package:cake_wallet/src/screens/integrations/deuro/widgets/info_chip.dart'; import 'package:cake_wallet/src/screens/integrations/deuro/widgets/interest_card_widget.dart'; import 'package:cake_wallet/src/screens/integrations/deuro/widgets/savings_card_widget.dart'; @@ -62,7 +64,7 @@ class DEuroSavingsPage extends BasePage { fiatCurrency: _dEuroViewModel.isFiatDisabled ? null : _dEuroViewModel.fiat, onAddSavingsPressed: () => _onSavingsAdd(context), onRemoveSavingsPressed: () => _onSavingsRemove(context), - onApproveSavingsPressed: _dEuroViewModel.prepareApproval, + onApproveSavingsPressed: () => _onApproval(context), onTooltipPressed: () => _onSavingsTooltipPressed(context), isEnabled: _dEuroViewModel.isEnabled, isLoading: _dEuroViewModel.isLoading, @@ -74,8 +76,8 @@ class DEuroSavingsPage extends BasePage { fiatAccruedInterest: _dEuroViewModel.fiatAccruedInterestFormated, fiatCurrency: _dEuroViewModel.isFiatDisabled ? null : _dEuroViewModel.fiat, accruedInterest: _dEuroViewModel.accruedInterestFormated, - onCollectInterest: _onCollectInterest, - onReinvestInterest: _onReinvestInterest, + onCollectInterest: () => _onCollectInterest(context), + onReinvestInterest: () => _onReinvestInterest(context), onTooltipPressed: () => _onInterestTooltipPressed(context), isEnabled: _dEuroViewModel.isSavingsActionsEnabled, ), @@ -117,7 +119,10 @@ class DEuroSavingsPage extends BasePage { if (_editSheetIsOpen) return; _editSheetIsOpen = true; final amount = await _showEditBottomSheet(context, isAdding: true); - if (amount != null) _dEuroViewModel.prepareSavingsEdit(amount, true); + if (amount != null) { + await _requireHardwareWallet(context); + _dEuroViewModel.prepareSavingsEdit(amount, true); + } _editSheetIsOpen = false; } @@ -125,24 +130,52 @@ class DEuroSavingsPage extends BasePage { if (_editSheetIsOpen) return; _editSheetIsOpen = true; final amount = await _showEditBottomSheet(context, isAdding: false); - if (amount != null) _dEuroViewModel.prepareSavingsEdit(amount, false); - _editSheetIsOpen = false; + if (amount != null) { + await _requireHardwareWallet(context); + _dEuroViewModel.prepareSavingsEdit(amount, false); + } + _editSheetIsOpen = false; } - Future _onReinvestInterest() async { + Future _onReinvestInterest(BuildContext context) async { if (_editSheetIsOpen) return; _editSheetIsOpen = true; + await _requireHardwareWallet(context); await _dEuroViewModel.prepareReinvestInterest(); _editSheetIsOpen = false; } - Future _onCollectInterest() async { + Future _onCollectInterest(BuildContext context) async { if (_editSheetIsOpen) return; _editSheetIsOpen = true; + await _requireHardwareWallet(context); await _dEuroViewModel.prepareCollectInterest(); _editSheetIsOpen = false; } + Future _onApproval(BuildContext context) async { + await _requireHardwareWallet(context); + _dEuroViewModel.prepareApproval(); + } + + Future _requireHardwareWallet(BuildContext context) async { + if (_dEuroViewModel.wallet.isHardwareWallet) { + if (!_dEuroViewModel.hardwareWalletViewModel!.isConnected) { + await Navigator.of(context).pushNamed(Routes.connectDevices, + arguments: ConnectDevicePageParams( + walletType: _dEuroViewModel.wallet.type, + hardwareWalletType: _dEuroViewModel.wallet.walletInfo.hardwareWalletType!, + onConnectDevice: (context, _) { + _dEuroViewModel.hardwareWalletViewModel!.initWallet(_dEuroViewModel.wallet); + Navigator.of(context).pop(); + }, + )); + } else { + _dEuroViewModel.hardwareWalletViewModel!.initWallet(_dEuroViewModel.wallet); + } + } + } + bool _isReactionsSet = false; void _setReactions(BuildContext context, DEuroViewModel dEuroViewModel) { diff --git a/lib/view_model/integrations/deuro_view_model.dart b/lib/view_model/integrations/deuro_view_model.dart index 31c3ff4a6..0bbc176a4 100644 --- a/lib/view_model/integrations/deuro_view_model.dart +++ b/lib/view_model/integrations/deuro_view_model.dart @@ -7,10 +7,12 @@ import 'package:cake_wallet/store/app_store.dart'; import 'package:cake_wallet/store/dashboard/fiat_conversion_store.dart'; import 'package:cake_wallet/store/settings_store.dart'; import 'package:cake_wallet/view_model/dashboard/balance_view_model.dart'; +import 'package:cake_wallet/view_model/hardware_wallet/hardware_wallet_view_model.dart'; import 'package:cake_wallet/view_model/send/send_view_model_state.dart'; import 'package:cw_core/crypto_currency.dart'; import 'package:cw_core/parse_fixed.dart'; import 'package:cw_core/pending_transaction.dart'; +import 'package:cw_core/wallet_base.dart'; import 'package:cw_core/wallet_type.dart'; import 'package:mobx/mobx.dart'; @@ -23,20 +25,20 @@ abstract class DEuroViewModelBase with Store { static BigInt get MIN_ACCRUED_INTEREST => BigInt.parse("1000000000000"); - DEuroViewModelBase( - this._appStore, - this.balanceViewModel, - this._settingsStore, - this._fiatConversationStore, - ) { + DEuroViewModelBase(this._appStore, this.balanceViewModel, this._settingsStore, + this._fiatConversationStore, + [this.hardwareWalletViewModel]) { reloadInterestRate(); reloadSavingsUserData(); } final BalanceViewModel balanceViewModel; + final HardwareWalletViewModel? hardwareWalletViewModel; final SettingsStore _settingsStore; final FiatConversionStore _fiatConversationStore; + WalletBase get wallet => this._appStore.wallet!; + @computed bool get isFiatDisabled => balanceViewModel.isFiatDisabled;