diff --git a/lib/bitcoin/electrum.dart b/lib/bitcoin/electrum.dart index 71813ac3..712b2e08 100644 --- a/lib/bitcoin/electrum.dart +++ b/lib/bitcoin/electrum.dart @@ -318,11 +318,15 @@ class ElectrumClient { {@required String id, @required String method, List params = const []}) { - final subscription = BehaviorSubject(); - _regisrySubscription(id, subscription); - socket.write(jsonrpc(method: method, id: _id, params: params)); + try { + final subscription = BehaviorSubject(); + _regisrySubscription(id, subscription); + socket.write(jsonrpc(method: method, id: _id, params: params)); - return subscription; + return subscription; + } catch(e) { + print(e.toString()); + } } Future call({String method, List params = const []}) async { @@ -339,18 +343,22 @@ class ElectrumClient { {String method, List params = const [], int timeout = 2000}) async { - final completer = Completer(); - _id += 1; - final id = _id; - _registryTask(id, completer); - socket.write(jsonrpc(method: method, id: id, params: params)); - Timer(Duration(milliseconds: timeout), () { - if (!completer.isCompleted) { - completer.completeError(RequestFailedTimeoutException(method, id)); - } - }); + try { + final completer = Completer(); + _id += 1; + final id = _id; + _registryTask(id, completer); + socket.write(jsonrpc(method: method, id: id, params: params)); + Timer(Duration(milliseconds: timeout), () { + if (!completer.isCompleted) { + completer.completeError(RequestFailedTimeoutException(method, id)); + } + }); - return completer.future; + return completer.future; + } catch(e) { + print(e.toString()); + } } Future close() async { diff --git a/lib/bitcoin/electrum_wallet.dart b/lib/bitcoin/electrum_wallet.dart index d8024104..988c0ed7 100644 --- a/lib/bitcoin/electrum_wallet.dart +++ b/lib/bitcoin/electrum_wallet.dart @@ -90,6 +90,11 @@ abstract class ElectrumWalletBase extends WalletBase scriptHash(addr.address, networkType: networkType)) .toList(); + List get publicScriptHashes => walletAddresses.addresses + .where((addr) => !addr.isHidden) + .map((addr) => scriptHash(addr.address, networkType: networkType)) + .toList(); + String get xpub => hd.base58; @override @@ -476,7 +481,7 @@ abstract class ElectrumWalletBase extends WalletBase> fetchTransactions() async { final histories = - scriptHashes.map((scriptHash) => electrumClient.getHistory(scriptHash)); + publicScriptHashes.map((scriptHash) => electrumClient.getHistory(scriptHash)); final _historiesWithDetails = await Future.wait(histories) .then((histories) => histories.expand((i) => i).toList()) .then((histories) => histories.map((tx) => fetchTransactionInfo( diff --git a/lib/bitcoin/electrum_wallet_addresses.dart b/lib/bitcoin/electrum_wallet_addresses.dart index bf4bc064..6d2d7af2 100644 --- a/lib/bitcoin/electrum_wallet_addresses.dart +++ b/lib/bitcoin/electrum_wallet_addresses.dart @@ -100,7 +100,6 @@ abstract class ElectrumWalletAddressesBase extends WalletAddresses with Store { for (var i = startIndex; i < count + startIndex; i++) { final address = BitcoinAddressRecord(getAddress(index: i, hd: hd), index: i, isHidden: isHidden); - print(address.address); list.add(address); } diff --git a/lib/buy/moonpay/moonpay_buy_provider.dart b/lib/buy/moonpay/moonpay_buy_provider.dart index 65effe48..ab0ef4b4 100644 --- a/lib/buy/moonpay/moonpay_buy_provider.dart +++ b/lib/buy/moonpay/moonpay_buy_provider.dart @@ -10,6 +10,42 @@ import 'package:cake_wallet/core/wallet_base.dart'; import 'package:cake_wallet/entities/wallet_type.dart'; import 'package:cake_wallet/exchange/trade_state.dart'; import 'package:cake_wallet/.secrets.g.dart' as secrets; +import 'package:cake_wallet/entities/crypto_currency.dart'; + +class MoonPaySellProvider { + MoonPaySellProvider({this.isTest = false}) + : baseUrl = isTest ? _baseTestUrl : _baseProductUrl; + + static const _baseTestUrl = 'sell-staging.moonpay.com'; + static const _baseProductUrl = 'sell.moonpay.com'; + static String get _apiKey => secrets.moonPayApiKey; + static String get _secretKey => secrets.moonPaySecretKey; + final bool isTest; + final String baseUrl; + + Future requestUrl({CryptoCurrency currency, String refundWalletAddress}) async { + final originalUri = Uri.https( + baseUrl, '', { + 'apiKey': _apiKey, + 'defaultBaseCurrencyCode': currency.toString().toLowerCase(), + 'refundWalletAddress': refundWalletAddress + }); + final messageBytes = utf8.encode('?${originalUri.query}'); + final key = utf8.encode(_secretKey); + final hmac = Hmac(sha256, key); + final digest = hmac.convert(messageBytes); + final signature = base64.encode(digest.bytes); + + if (isTest) { + return originalUri.toString(); + } + + final query = Map.from(originalUri.queryParameters); + query['signature'] = signature; + final signedUri = originalUri.replace(queryParameters: query); + return signedUri.toString(); + } +} class MoonPayBuyProvider extends BuyProvider { MoonPayBuyProvider({WalletBase wallet, bool isTestEnvironment = false}) diff --git a/lib/src/screens/dashboard/dashboard_page.dart b/lib/src/screens/dashboard/dashboard_page.dart index eec1b5bb..5fb4fb32 100644 --- a/lib/src/screens/dashboard/dashboard_page.dart +++ b/lib/src/screens/dashboard/dashboard_page.dart @@ -24,6 +24,8 @@ import 'package:smooth_page_indicator/smooth_page_indicator.dart'; import 'package:flutter_spinkit/flutter_spinkit.dart'; import 'package:cake_wallet/main.dart'; import 'package:cake_wallet/router.dart'; +import 'package:cake_wallet/buy/moonpay/moonpay_buy_provider.dart'; +import 'package:url_launcher/url_launcher.dart'; class DashboardPage extends BasePage { DashboardPage({ @@ -261,10 +263,11 @@ class DashboardPage extends BasePage { switch (walletType) { case WalletType.bitcoin: - Navigator.of(context).pushNamed(Routes.preOrder); - break; - case WalletType.litecoin: - Navigator.of(context).pushNamed(Routes.preOrder); + final moonPaySellProvider = MoonPaySellProvider(); + final uri = await moonPaySellProvider.requestUrl( + currency: walletViewModel.wallet.currency, + refundWalletAddress: walletViewModel.wallet.walletAddresses.address); + await launch(uri); break; default: await showPopUp(