diff --git a/cw_bitcoin_cash/lib/src/bitcoin_cash_address_utils.dart b/cw_bitcoin_cash/lib/src/bitcoin_cash_address_utils.dart index ca47ea9f..5832835e 100644 --- a/cw_bitcoin_cash/lib/src/bitcoin_cash_address_utils.dart +++ b/cw_bitcoin_cash/lib/src/bitcoin_cash_address_utils.dart @@ -2,4 +2,5 @@ import 'package:bitbox/bitbox.dart' as bitbox; class AddressUtils { static String getCashAddrFormat(String address) => bitbox.Address.toCashAddress(address); + static String toLegacyAddress(String address) => bitbox.Address.toLegacyAddress(address); } diff --git a/cw_bitcoin_cash/lib/src/bitcoin_cash_wallet.dart b/cw_bitcoin_cash/lib/src/bitcoin_cash_wallet.dart index b4924e2d..5f2a33ab 100644 --- a/cw_bitcoin_cash/lib/src/bitcoin_cash_wallet.dart +++ b/cw_bitcoin_cash/lib/src/bitcoin_cash_wallet.dart @@ -1,3 +1,5 @@ +import 'dart:convert'; + import 'package:bitbox/bitbox.dart' as bitbox; import 'package:bitcoin_flutter/bitcoin_flutter.dart' as bitcoin; import 'package:cw_bitcoin/bitcoin_address_record.dart'; @@ -294,4 +296,16 @@ abstract class BitcoinCashWalletBase extends ElectrumWallet with Store { return 0; } + + @override + String signMessage(String message, {String? address = null}) { + final index = address != null + ? walletAddresses.addresses + .firstWhere((element) => element.address == AddressUtils.toLegacyAddress(address)) + .index + : null; + return index == null + ? base64Encode(hd.sign(message)) + : base64Encode(hd.derive(index).sign(message)); + } } diff --git a/lib/buy/robinhood/robinhood_buy_provider.dart b/lib/buy/robinhood/robinhood_buy_provider.dart index e7a9e057..ade0bf99 100644 --- a/lib/buy/robinhood/robinhood_buy_provider.dart +++ b/lib/buy/robinhood/robinhood_buy_provider.dart @@ -3,7 +3,6 @@ import 'dart:convert'; import 'package:cake_wallet/.secrets.g.dart' as secrets; import 'package:cake_wallet/generated/i18n.dart'; import 'package:cake_wallet/src/widgets/alert_with_one_action.dart'; -import 'package:cake_wallet/utils/exception_handler.dart'; import 'package:cake_wallet/utils/show_pop_up.dart'; import 'package:cw_core/wallet_base.dart'; import 'package:cw_core/wallet_type.dart'; @@ -12,8 +11,7 @@ import 'package:http/http.dart' as http; import 'package:url_launcher/url_launcher.dart'; class RobinhoodBuyProvider { - RobinhoodBuyProvider({required WalletBase wallet}) - : this._wallet = wallet; + RobinhoodBuyProvider({required WalletBase wallet}) : this._wallet = wallet; final WalletBase _wallet; @@ -21,10 +19,15 @@ class RobinhoodBuyProvider { static const _cIdBaseUrl = 'exchange-helper.cakewallet.com'; String get _applicationId => secrets.robinhoodApplicationId; + String get _apiSecret => secrets.robinhoodCIdApiSecret; - bool get isAvailable => - [WalletType.bitcoin, WalletType.litecoin, WalletType.ethereum].contains(_wallet.type); + bool get isAvailable => [ + WalletType.bitcoin, + WalletType.bitcoinCash, + WalletType.litecoin, + WalletType.ethereum + ].contains(_wallet.type); String getSignature(String message) { switch (_wallet.type) { @@ -32,6 +35,7 @@ class RobinhoodBuyProvider { return _wallet.signMessage(message); case WalletType.litecoin: case WalletType.bitcoin: + case WalletType.bitcoinCash: return _wallet.signMessage(message, address: _wallet.walletAddresses.address); default: throw Exception("WalletType is not available for Robinhood ${_wallet.type}"); @@ -55,7 +59,8 @@ class RobinhoodBuyProvider { if (response.statusCode == 200) { return (jsonDecode(response.body) as Map)['connectId'] as String; } else { - throw Exception('Provider currently unavailable. Status: ${response.statusCode} ${response.body}'); + throw Exception( + 'Provider currently unavailable. Status: ${response.statusCode} ${response.body}'); } } @@ -76,8 +81,7 @@ class RobinhoodBuyProvider { try { final uri = await requestUrl(); await launchUrl(uri, mode: LaunchMode.externalApplication); - } catch (e, s) { - ExceptionHandler.onError(FlutterErrorDetails(exception: e, stack: s)); + } catch (_) { await showPopUp( context: context, builder: (BuildContext context) { diff --git a/lib/entities/main_actions.dart b/lib/entities/main_actions.dart index 5f270dea..46865cbc 100644 --- a/lib/entities/main_actions.dart +++ b/lib/entities/main_actions.dart @@ -52,7 +52,7 @@ class MainActions { case WalletType.bitcoin: case WalletType.litecoin: case WalletType.ethereum: - // case WalletType.bitcoinCash: // TODO: add sign message function to BCH first + case WalletType.bitcoinCash: switch (defaultBuyProvider) { case BuyProviderType.AskEachTime: Navigator.pushNamed(context, Routes.buy);