Remove moonpay secret use exchange-helper instead (#1343)
* Remove moonpay secret use exchange-helper instead * Update lib/buy/moonpay/moonpay_provider.dart * remove web3dart dep from cw_solana * Apply new api for moonpay exchange helper * Add Robinhood as Polygon buy-provider
Konstantin Ullrich committed
Mar 25, 2024 at 13:16 UTC
bca59ad5e486b6f0d9f6f572bc73f304b28199ae
7 files changed
+44
-35
.github/workflows/pr_test_build.yml
+1
-1
@@ -143,7 +143,7 @@ jobs:
143
echo "const chatwootWebsiteToken = '${{ secrets.CHATWOOT_WEBSITE_TOKEN }}';" >> lib/.secrets.g.dart
144
echo "const exolixApiKey = '${{ secrets.EXOLIX_API_KEY }}';" >> lib/.secrets.g.dart
145
echo "const robinhoodApplicationId = '${{ secrets.ROBINHOOD_APPLICATION_ID }}';" >> lib/.secrets.g.dart
146
- echo "const robinhoodCIdApiSecret = '${{ secrets.ROBINHOOD_CID_CLIENT_SECRET }}';" >> lib/.secrets.g.dart
146
+ echo "const exchangeHelperApiKey = '${{ secrets.ROBINHOOD_CID_CLIENT_SECRET }}';" >> lib/.secrets.g.dart
147
echo "const walletConnectProjectId = '${{ secrets.WALLET_CONNECT_PROJECT_ID }}';" >> lib/.secrets.g.dart
148
echo "const moralisApiKey = '${{ secrets.MORALIS_API_KEY }}';" >> lib/.secrets.g.dart
149
echo "const polygonScanApiKey = '${{ secrets.POLYGON_SCAN_API_KEY }}';" >> cw_evm/lib/.secrets.g.dart
cw_solana/lib/solana_wallet.dart
+2
-4
@@ -1,6 +1,5 @@
1
import 'dart:async';
2
import 'dart:convert';
3
-import 'dart:developer';
3
import 'dart:io';
4
import 'package:cw_core/cake_hive.dart';
5
import 'package:cw_core/crypto_currency.dart';
@@ -30,7 +29,6 @@ import 'package:mobx/mobx.dart';
29
import 'package:shared_preferences/shared_preferences.dart';
30
import 'package:solana/metaplex.dart' as metaplex;
31
import 'package:solana/solana.dart';
33
-import 'package:web3dart/crypto.dart';
32
33
part 'solana_wallet.g.dart';
34
@@ -134,7 +132,7 @@ abstract class SolanaWalletBase
132
assert(mnemonic != null || privateKey != null);
133
134
if (privateKey != null) {
137
- final privateKeyBytes = hexToBytes(privateKey);
135
+ final privateKeyBytes = HEX.decode(privateKey);
136
return await Wallet.fromPrivateKeyBytes(privateKey: privateKeyBytes);
137
}
138
@@ -491,7 +489,7 @@ abstract class SolanaWalletBase
489
final signature = await _walletKeyPair!.sign(messageBytes);
490
491
// Convert the signature to a hexadecimal string
494
- final hex = bytesToHex(signature.bytes);
492
+ final hex = HEX.encode(signature.bytes);
493
494
return hex;
495
}
cw_solana/pubspec.yaml
+1
-2
@@ -19,7 +19,6 @@ dependencies:
19
bip39: ^1.0.6
20
mobx: ^2.3.0+1
21
shared_preferences: ^2.0.15
22
- web3dart: ^2.7.1
22
bip32: ^2.0.0
23
hex: ^0.2.0
24
@@ -34,4 +33,4 @@ dev_dependencies:
33
flutter:
34
# assets:
35
# - images/a_dot_burr.jpeg
37
- # - images/a_dot_ham.jpeg
\ No newline at end of file
36
+ # - images/a_dot_ham.jpeg
lib/buy/moonpay/moonpay_provider.dart
+35
-17
@@ -1,4 +1,13 @@
1
import 'dart:convert';
2
+
3
+import 'package:cake_wallet/.secrets.g.dart' as secrets;
4
+import 'package:cake_wallet/buy/buy_amount.dart';
5
+import 'package:cake_wallet/buy/buy_exception.dart';
6
+import 'package:cake_wallet/buy/buy_provider.dart';
7
+import 'package:cake_wallet/buy/buy_provider_description.dart';
8
+import 'package:cake_wallet/buy/order.dart';
9
+import 'package:cake_wallet/exchange/trade_state.dart';
10
+import 'package:cake_wallet/generated/i18n.dart';
11
import 'package:cake_wallet/palette.dart';
12
import 'package:cake_wallet/routes.dart';
13
import 'package:cake_wallet/src/widgets/alert_with_one_action.dart';
@@ -6,19 +15,11 @@ import 'package:cake_wallet/store/settings_store.dart';
15
import 'package:cake_wallet/themes/theme_base.dart';
16
import 'package:cake_wallet/utils/device_info.dart';
17
import 'package:crypto/crypto.dart';
9
-import 'package:cake_wallet/buy/buy_exception.dart';
10
-import 'package:cake_wallet/generated/i18n.dart';
11
-import 'package:flutter/material.dart';
12
-import 'package:http/http.dart';
13
-import 'package:cake_wallet/buy/buy_amount.dart';
14
-import 'package:cake_wallet/buy/buy_provider.dart';
15
-import 'package:cake_wallet/buy/buy_provider_description.dart';
16
-import 'package:cake_wallet/buy/order.dart';
18
+import 'package:cw_core/crypto_currency.dart';
19
import 'package:cw_core/wallet_base.dart';
20
import 'package:cw_core/wallet_type.dart';
19
-import 'package:cake_wallet/exchange/trade_state.dart';
20
-import 'package:cake_wallet/.secrets.g.dart' as secrets;
21
-import 'package:cw_core/crypto_currency.dart';
21
+import 'package:flutter/material.dart';
22
+import 'package:http/http.dart';
23
import 'package:url_launcher/url_launcher.dart';
24
25
class MoonPaySellProvider extends BuyProvider {
@@ -34,6 +35,7 @@ class MoonPaySellProvider extends BuyProvider {
35
36
static const _baseTestUrl = 'sell-sandbox.moonpay.com';
37
static const _baseProductUrl = 'sell.moonpay.com';
38
+ static const _cIdBaseUrl = 'exchange-helper.cakewallet.com';
39
40
@override
41
String get providerDescription =>
@@ -60,9 +62,29 @@ class MoonPaySellProvider extends BuyProvider {
62
63
static String get _apiKey => secrets.moonPayApiKey;
64
63
- static String get _secretKey => secrets.moonPaySecretKey;
65
+ static String get _exchangeHelperApiKey => secrets.exchangeHelperApiKey;
66
final String baseUrl;
67
68
+ Future<String> getMoonpaySignature(String query) async {
69
+ final uri = Uri.https(_cIdBaseUrl, "/api/moonpay");
70
+
71
+ final response = await post(
72
+ uri,
73
+ headers: {
74
+ 'Content-Type': 'application/json',
75
+ 'x-api-key': _exchangeHelperApiKey,
76
+ },
77
+ body: json.encode({'query': query}),
78
+ );
79
+
80
+ if (response.statusCode == 200) {
81
+ return (jsonDecode(response.body) as Map<String, dynamic>)['signature'] as String;
82
+ } else {
83
+ throw Exception(
84
+ 'Provider currently unavailable. Status: ${response.statusCode} ${response.body}');
85
+ }
86
+ }
87
+
88
Future<Uri> requestMoonPayUrl({
89
required CryptoCurrency currency,
90
required String refundWalletAddress,
@@ -86,11 +108,7 @@ class MoonPaySellProvider extends BuyProvider {
108
}..addAll(customParams),
109
);
110
89
- final messageBytes = utf8.encode('?${originalUri.query}');
90
- final key = utf8.encode(_secretKey);
91
- final hmac = Hmac(sha256, key);
92
- final digest = hmac.convert(messageBytes);
93
- final signature = base64.encode(digest.bytes);
111
+ final signature = await getMoonpaySignature('?${originalUri.query}');
112
113
if (isTestEnvironment) {
114
return originalUri;
lib/buy/robinhood/robinhood_buy_provider.dart
+2
-1
@@ -32,11 +32,12 @@ class RobinhoodBuyProvider extends BuyProvider {
32
33
String get _applicationId => secrets.robinhoodApplicationId;
34
35
- String get _apiSecret => secrets.robinhoodCIdApiSecret;
35
+ String get _apiSecret => secrets.exchangeHelperApiKey;
36
37
String getSignature(String message) {
38
switch (wallet.type) {
39
case WalletType.ethereum:
40
+ case WalletType.polygon:
41
return wallet.signMessage(message);
42
case WalletType.litecoin:
43
case WalletType.bitcoin:
lib/entities/provider_types.dart
+2
-9
@@ -55,6 +55,7 @@ class ProvidersHelper {
55
case WalletType.monero:
56
return [ProviderType.askEachTime, ProviderType.onramper, ProviderType.dfx];
57
case WalletType.bitcoin:
58
+ case WalletType.polygon:
59
case WalletType.ethereum:
60
return [
61
ProviderType.askEachTime,
@@ -65,8 +66,6 @@ class ProvidersHelper {
66
case WalletType.litecoin:
67
case WalletType.bitcoinCash:
68
return [ProviderType.askEachTime, ProviderType.onramper, ProviderType.robinhood];
68
- case WalletType.polygon:
69
- return [ProviderType.askEachTime, ProviderType.onramper, ProviderType.dfx];
69
case WalletType.solana:
70
return [ProviderType.askEachTime, ProviderType.onramper, ProviderType.robinhood];
71
case WalletType.none:
@@ -79,6 +78,7 @@ class ProvidersHelper {
78
switch (walletType) {
79
case WalletType.bitcoin:
80
case WalletType.ethereum:
81
+ case WalletType.polygon:
82
return [
83
ProviderType.askEachTime,
84
ProviderType.onramper,
@@ -88,13 +88,6 @@ class ProvidersHelper {
88
case WalletType.litecoin:
89
case WalletType.bitcoinCash:
90
return [ProviderType.askEachTime, ProviderType.moonpaySell];
91
- case WalletType.polygon:
92
- return [
93
- ProviderType.askEachTime,
94
- ProviderType.onramper,
95
- ProviderType.moonpaySell,
96
- ProviderType.dfx,
97
- ];
91
case WalletType.solana:
92
return [
93
ProviderType.askEachTime,
tool/utils/secret_key.dart
+1
-1
@@ -34,7 +34,7 @@ class SecretKey {
34
SecretKey('chatwootWebsiteToken', () => ''),
35
SecretKey('exolixApiKey', () => ''),
36
SecretKey('robinhoodApplicationId', () => ''),
37
- SecretKey('robinhoodCIdApiSecret', () => ''),
37
+ SecretKey('exchangeHelperApiKey', () => ''),
38
SecretKey('walletConnectProjectId', () => ''),
39
SecretKey('moralisApiKey', () => ''),
40
];