mirror of
https://github.com/cake-tech/cake_wallet.git
synced 2024-12-22 19:49:22 +00:00
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
This commit is contained in:
parent
af7fe05099
commit
bca59ad5e4
7 changed files with 44 additions and 35 deletions
2
.github/workflows/pr_test_build.yml
vendored
2
.github/workflows/pr_test_build.yml
vendored
|
@ -143,7 +143,7 @@ jobs:
|
||||||
echo "const chatwootWebsiteToken = '${{ secrets.CHATWOOT_WEBSITE_TOKEN }}';" >> lib/.secrets.g.dart
|
echo "const chatwootWebsiteToken = '${{ secrets.CHATWOOT_WEBSITE_TOKEN }}';" >> lib/.secrets.g.dart
|
||||||
echo "const exolixApiKey = '${{ secrets.EXOLIX_API_KEY }}';" >> lib/.secrets.g.dart
|
echo "const exolixApiKey = '${{ secrets.EXOLIX_API_KEY }}';" >> lib/.secrets.g.dart
|
||||||
echo "const robinhoodApplicationId = '${{ secrets.ROBINHOOD_APPLICATION_ID }}';" >> lib/.secrets.g.dart
|
echo "const robinhoodApplicationId = '${{ secrets.ROBINHOOD_APPLICATION_ID }}';" >> lib/.secrets.g.dart
|
||||||
echo "const robinhoodCIdApiSecret = '${{ secrets.ROBINHOOD_CID_CLIENT_SECRET }}';" >> lib/.secrets.g.dart
|
echo "const exchangeHelperApiKey = '${{ secrets.ROBINHOOD_CID_CLIENT_SECRET }}';" >> lib/.secrets.g.dart
|
||||||
echo "const walletConnectProjectId = '${{ secrets.WALLET_CONNECT_PROJECT_ID }}';" >> lib/.secrets.g.dart
|
echo "const walletConnectProjectId = '${{ secrets.WALLET_CONNECT_PROJECT_ID }}';" >> lib/.secrets.g.dart
|
||||||
echo "const moralisApiKey = '${{ secrets.MORALIS_API_KEY }}';" >> lib/.secrets.g.dart
|
echo "const moralisApiKey = '${{ secrets.MORALIS_API_KEY }}';" >> lib/.secrets.g.dart
|
||||||
echo "const polygonScanApiKey = '${{ secrets.POLYGON_SCAN_API_KEY }}';" >> cw_evm/lib/.secrets.g.dart
|
echo "const polygonScanApiKey = '${{ secrets.POLYGON_SCAN_API_KEY }}';" >> cw_evm/lib/.secrets.g.dart
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
import 'dart:async';
|
import 'dart:async';
|
||||||
import 'dart:convert';
|
import 'dart:convert';
|
||||||
import 'dart:developer';
|
|
||||||
import 'dart:io';
|
import 'dart:io';
|
||||||
import 'package:cw_core/cake_hive.dart';
|
import 'package:cw_core/cake_hive.dart';
|
||||||
import 'package:cw_core/crypto_currency.dart';
|
import 'package:cw_core/crypto_currency.dart';
|
||||||
|
@ -30,7 +29,6 @@ import 'package:mobx/mobx.dart';
|
||||||
import 'package:shared_preferences/shared_preferences.dart';
|
import 'package:shared_preferences/shared_preferences.dart';
|
||||||
import 'package:solana/metaplex.dart' as metaplex;
|
import 'package:solana/metaplex.dart' as metaplex;
|
||||||
import 'package:solana/solana.dart';
|
import 'package:solana/solana.dart';
|
||||||
import 'package:web3dart/crypto.dart';
|
|
||||||
|
|
||||||
part 'solana_wallet.g.dart';
|
part 'solana_wallet.g.dart';
|
||||||
|
|
||||||
|
@ -134,7 +132,7 @@ abstract class SolanaWalletBase
|
||||||
assert(mnemonic != null || privateKey != null);
|
assert(mnemonic != null || privateKey != null);
|
||||||
|
|
||||||
if (privateKey != null) {
|
if (privateKey != null) {
|
||||||
final privateKeyBytes = hexToBytes(privateKey);
|
final privateKeyBytes = HEX.decode(privateKey);
|
||||||
return await Wallet.fromPrivateKeyBytes(privateKey: privateKeyBytes);
|
return await Wallet.fromPrivateKeyBytes(privateKey: privateKeyBytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -491,7 +489,7 @@ abstract class SolanaWalletBase
|
||||||
final signature = await _walletKeyPair!.sign(messageBytes);
|
final signature = await _walletKeyPair!.sign(messageBytes);
|
||||||
|
|
||||||
// Convert the signature to a hexadecimal string
|
// Convert the signature to a hexadecimal string
|
||||||
final hex = bytesToHex(signature.bytes);
|
final hex = HEX.encode(signature.bytes);
|
||||||
|
|
||||||
return hex;
|
return hex;
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,7 +19,6 @@ dependencies:
|
||||||
bip39: ^1.0.6
|
bip39: ^1.0.6
|
||||||
mobx: ^2.3.0+1
|
mobx: ^2.3.0+1
|
||||||
shared_preferences: ^2.0.15
|
shared_preferences: ^2.0.15
|
||||||
web3dart: ^2.7.1
|
|
||||||
bip32: ^2.0.0
|
bip32: ^2.0.0
|
||||||
hex: ^0.2.0
|
hex: ^0.2.0
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,13 @@
|
||||||
import 'dart:convert';
|
import 'dart:convert';
|
||||||
|
|
||||||
|
import 'package:cake_wallet/.secrets.g.dart' as secrets;
|
||||||
|
import 'package:cake_wallet/buy/buy_amount.dart';
|
||||||
|
import 'package:cake_wallet/buy/buy_exception.dart';
|
||||||
|
import 'package:cake_wallet/buy/buy_provider.dart';
|
||||||
|
import 'package:cake_wallet/buy/buy_provider_description.dart';
|
||||||
|
import 'package:cake_wallet/buy/order.dart';
|
||||||
|
import 'package:cake_wallet/exchange/trade_state.dart';
|
||||||
|
import 'package:cake_wallet/generated/i18n.dart';
|
||||||
import 'package:cake_wallet/palette.dart';
|
import 'package:cake_wallet/palette.dart';
|
||||||
import 'package:cake_wallet/routes.dart';
|
import 'package:cake_wallet/routes.dart';
|
||||||
import 'package:cake_wallet/src/widgets/alert_with_one_action.dart';
|
import 'package:cake_wallet/src/widgets/alert_with_one_action.dart';
|
||||||
|
@ -6,19 +15,11 @@ import 'package:cake_wallet/store/settings_store.dart';
|
||||||
import 'package:cake_wallet/themes/theme_base.dart';
|
import 'package:cake_wallet/themes/theme_base.dart';
|
||||||
import 'package:cake_wallet/utils/device_info.dart';
|
import 'package:cake_wallet/utils/device_info.dart';
|
||||||
import 'package:crypto/crypto.dart';
|
import 'package:crypto/crypto.dart';
|
||||||
import 'package:cake_wallet/buy/buy_exception.dart';
|
import 'package:cw_core/crypto_currency.dart';
|
||||||
import 'package:cake_wallet/generated/i18n.dart';
|
|
||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'package:http/http.dart';
|
|
||||||
import 'package:cake_wallet/buy/buy_amount.dart';
|
|
||||||
import 'package:cake_wallet/buy/buy_provider.dart';
|
|
||||||
import 'package:cake_wallet/buy/buy_provider_description.dart';
|
|
||||||
import 'package:cake_wallet/buy/order.dart';
|
|
||||||
import 'package:cw_core/wallet_base.dart';
|
import 'package:cw_core/wallet_base.dart';
|
||||||
import 'package:cw_core/wallet_type.dart';
|
import 'package:cw_core/wallet_type.dart';
|
||||||
import 'package:cake_wallet/exchange/trade_state.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:cake_wallet/.secrets.g.dart' as secrets;
|
import 'package:http/http.dart';
|
||||||
import 'package:cw_core/crypto_currency.dart';
|
|
||||||
import 'package:url_launcher/url_launcher.dart';
|
import 'package:url_launcher/url_launcher.dart';
|
||||||
|
|
||||||
class MoonPaySellProvider extends BuyProvider {
|
class MoonPaySellProvider extends BuyProvider {
|
||||||
|
@ -34,6 +35,7 @@ class MoonPaySellProvider extends BuyProvider {
|
||||||
|
|
||||||
static const _baseTestUrl = 'sell-sandbox.moonpay.com';
|
static const _baseTestUrl = 'sell-sandbox.moonpay.com';
|
||||||
static const _baseProductUrl = 'sell.moonpay.com';
|
static const _baseProductUrl = 'sell.moonpay.com';
|
||||||
|
static const _cIdBaseUrl = 'exchange-helper.cakewallet.com';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get providerDescription =>
|
String get providerDescription =>
|
||||||
|
@ -60,9 +62,29 @@ class MoonPaySellProvider extends BuyProvider {
|
||||||
|
|
||||||
static String get _apiKey => secrets.moonPayApiKey;
|
static String get _apiKey => secrets.moonPayApiKey;
|
||||||
|
|
||||||
static String get _secretKey => secrets.moonPaySecretKey;
|
static String get _exchangeHelperApiKey => secrets.exchangeHelperApiKey;
|
||||||
final String baseUrl;
|
final String baseUrl;
|
||||||
|
|
||||||
|
Future<String> getMoonpaySignature(String query) async {
|
||||||
|
final uri = Uri.https(_cIdBaseUrl, "/api/moonpay");
|
||||||
|
|
||||||
|
final response = await post(
|
||||||
|
uri,
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
'x-api-key': _exchangeHelperApiKey,
|
||||||
|
},
|
||||||
|
body: json.encode({'query': query}),
|
||||||
|
);
|
||||||
|
|
||||||
|
if (response.statusCode == 200) {
|
||||||
|
return (jsonDecode(response.body) as Map<String, dynamic>)['signature'] as String;
|
||||||
|
} else {
|
||||||
|
throw Exception(
|
||||||
|
'Provider currently unavailable. Status: ${response.statusCode} ${response.body}');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Future<Uri> requestMoonPayUrl({
|
Future<Uri> requestMoonPayUrl({
|
||||||
required CryptoCurrency currency,
|
required CryptoCurrency currency,
|
||||||
required String refundWalletAddress,
|
required String refundWalletAddress,
|
||||||
|
@ -86,11 +108,7 @@ class MoonPaySellProvider extends BuyProvider {
|
||||||
}..addAll(customParams),
|
}..addAll(customParams),
|
||||||
);
|
);
|
||||||
|
|
||||||
final messageBytes = utf8.encode('?${originalUri.query}');
|
final signature = await getMoonpaySignature('?${originalUri.query}');
|
||||||
final key = utf8.encode(_secretKey);
|
|
||||||
final hmac = Hmac(sha256, key);
|
|
||||||
final digest = hmac.convert(messageBytes);
|
|
||||||
final signature = base64.encode(digest.bytes);
|
|
||||||
|
|
||||||
if (isTestEnvironment) {
|
if (isTestEnvironment) {
|
||||||
return originalUri;
|
return originalUri;
|
||||||
|
|
|
@ -32,11 +32,12 @@ class RobinhoodBuyProvider extends BuyProvider {
|
||||||
|
|
||||||
String get _applicationId => secrets.robinhoodApplicationId;
|
String get _applicationId => secrets.robinhoodApplicationId;
|
||||||
|
|
||||||
String get _apiSecret => secrets.robinhoodCIdApiSecret;
|
String get _apiSecret => secrets.exchangeHelperApiKey;
|
||||||
|
|
||||||
String getSignature(String message) {
|
String getSignature(String message) {
|
||||||
switch (wallet.type) {
|
switch (wallet.type) {
|
||||||
case WalletType.ethereum:
|
case WalletType.ethereum:
|
||||||
|
case WalletType.polygon:
|
||||||
return wallet.signMessage(message);
|
return wallet.signMessage(message);
|
||||||
case WalletType.litecoin:
|
case WalletType.litecoin:
|
||||||
case WalletType.bitcoin:
|
case WalletType.bitcoin:
|
||||||
|
|
|
@ -55,6 +55,7 @@ class ProvidersHelper {
|
||||||
case WalletType.monero:
|
case WalletType.monero:
|
||||||
return [ProviderType.askEachTime, ProviderType.onramper, ProviderType.dfx];
|
return [ProviderType.askEachTime, ProviderType.onramper, ProviderType.dfx];
|
||||||
case WalletType.bitcoin:
|
case WalletType.bitcoin:
|
||||||
|
case WalletType.polygon:
|
||||||
case WalletType.ethereum:
|
case WalletType.ethereum:
|
||||||
return [
|
return [
|
||||||
ProviderType.askEachTime,
|
ProviderType.askEachTime,
|
||||||
|
@ -65,8 +66,6 @@ class ProvidersHelper {
|
||||||
case WalletType.litecoin:
|
case WalletType.litecoin:
|
||||||
case WalletType.bitcoinCash:
|
case WalletType.bitcoinCash:
|
||||||
return [ProviderType.askEachTime, ProviderType.onramper, ProviderType.robinhood];
|
return [ProviderType.askEachTime, ProviderType.onramper, ProviderType.robinhood];
|
||||||
case WalletType.polygon:
|
|
||||||
return [ProviderType.askEachTime, ProviderType.onramper, ProviderType.dfx];
|
|
||||||
case WalletType.solana:
|
case WalletType.solana:
|
||||||
return [ProviderType.askEachTime, ProviderType.onramper, ProviderType.robinhood];
|
return [ProviderType.askEachTime, ProviderType.onramper, ProviderType.robinhood];
|
||||||
case WalletType.none:
|
case WalletType.none:
|
||||||
|
@ -79,6 +78,7 @@ class ProvidersHelper {
|
||||||
switch (walletType) {
|
switch (walletType) {
|
||||||
case WalletType.bitcoin:
|
case WalletType.bitcoin:
|
||||||
case WalletType.ethereum:
|
case WalletType.ethereum:
|
||||||
|
case WalletType.polygon:
|
||||||
return [
|
return [
|
||||||
ProviderType.askEachTime,
|
ProviderType.askEachTime,
|
||||||
ProviderType.onramper,
|
ProviderType.onramper,
|
||||||
|
@ -88,13 +88,6 @@ class ProvidersHelper {
|
||||||
case WalletType.litecoin:
|
case WalletType.litecoin:
|
||||||
case WalletType.bitcoinCash:
|
case WalletType.bitcoinCash:
|
||||||
return [ProviderType.askEachTime, ProviderType.moonpaySell];
|
return [ProviderType.askEachTime, ProviderType.moonpaySell];
|
||||||
case WalletType.polygon:
|
|
||||||
return [
|
|
||||||
ProviderType.askEachTime,
|
|
||||||
ProviderType.onramper,
|
|
||||||
ProviderType.moonpaySell,
|
|
||||||
ProviderType.dfx,
|
|
||||||
];
|
|
||||||
case WalletType.solana:
|
case WalletType.solana:
|
||||||
return [
|
return [
|
||||||
ProviderType.askEachTime,
|
ProviderType.askEachTime,
|
||||||
|
|
|
@ -34,7 +34,7 @@ class SecretKey {
|
||||||
SecretKey('chatwootWebsiteToken', () => ''),
|
SecretKey('chatwootWebsiteToken', () => ''),
|
||||||
SecretKey('exolixApiKey', () => ''),
|
SecretKey('exolixApiKey', () => ''),
|
||||||
SecretKey('robinhoodApplicationId', () => ''),
|
SecretKey('robinhoodApplicationId', () => ''),
|
||||||
SecretKey('robinhoodCIdApiSecret', () => ''),
|
SecretKey('exchangeHelperApiKey', () => ''),
|
||||||
SecretKey('walletConnectProjectId', () => ''),
|
SecretKey('walletConnectProjectId', () => ''),
|
||||||
SecretKey('moralisApiKey', () => ''),
|
SecretKey('moralisApiKey', () => ''),
|
||||||
];
|
];
|
||||||
|
|
Loading…
Reference in a new issue