mirror of
https://github.com/cake-tech/cake_wallet.git
synced 2024-11-17 01:37:40 +00:00
CW-411 Update sideshift api (#959)
* Update sideshift api * Fix sideShift api v2 rate * Fix rate calculation on sideshift * Additional fixes * Minor: Add additional unsupported * Add network to quote * Add amount and affiliateID to quote * Refactor tag/network assigning * Fix syntax errors with rate qpi * Add network for fetching rate * Remove amount from rate endpoint * Fix transaction depositAmount * Fix issues from code review * Fix issues from code review * Remove affiliate ID --------- Co-authored-by: Justin Ehrenhofer <justin.ehrenhofer@gmail.com>
This commit is contained in:
parent
e8446f0c98
commit
a4c279b538
5 changed files with 118 additions and 89 deletions
1
.github/workflows/pr_test_build.yml
vendored
1
.github/workflows/pr_test_build.yml
vendored
|
@ -106,7 +106,6 @@ jobs:
|
||||||
echo "const moonPayApiKey = '${{ secrets.MOON_PAY_API_KEY }}';" >> lib/.secrets.g.dart
|
echo "const moonPayApiKey = '${{ secrets.MOON_PAY_API_KEY }}';" >> lib/.secrets.g.dart
|
||||||
echo "const moonPaySecretKey = '${{ secrets.MOON_PAY_SECRET_KEY }}';" >> lib/.secrets.g.dart
|
echo "const moonPaySecretKey = '${{ secrets.MOON_PAY_SECRET_KEY }}';" >> lib/.secrets.g.dart
|
||||||
echo "const sideShiftAffiliateId = '${{ secrets.SIDE_SHIFT_AFFILIATE_ID }}';" >> lib/.secrets.g.dart
|
echo "const sideShiftAffiliateId = '${{ secrets.SIDE_SHIFT_AFFILIATE_ID }}';" >> lib/.secrets.g.dart
|
||||||
echo "const sideShiftApiKey = '${{ secrets.SIDE_SHIFT_API_KEY }}';" >> lib/.secrets.g.dart
|
|
||||||
echo "const simpleSwapApiKey = '${{ secrets.SIMPLE_SWAP_API_KEY }}';" >> lib/.secrets.g.dart
|
echo "const simpleSwapApiKey = '${{ secrets.SIMPLE_SWAP_API_KEY }}';" >> lib/.secrets.g.dart
|
||||||
echo "const simpleSwapApiKeyDesktop = '${{ secrets.SIMPLE_SWAP_API_KEY_DESKTOP }}';" >> lib/.secrets.g.dart
|
echo "const simpleSwapApiKeyDesktop = '${{ secrets.SIMPLE_SWAP_API_KEY_DESKTOP }}';" >> lib/.secrets.g.dart
|
||||||
echo "const onramperApiKey = '${{ secrets.ONRAMPER_API_KEY }}';" >> lib/.secrets.g.dart
|
echo "const onramperApiKey = '${{ secrets.ONRAMPER_API_KEY }}';" >> lib/.secrets.g.dart
|
||||||
|
|
|
@ -19,10 +19,10 @@ class SideShiftExchangeProvider extends ExchangeProvider {
|
||||||
|
|
||||||
static const affiliateId = secrets.sideShiftAffiliateId;
|
static const affiliateId = secrets.sideShiftAffiliateId;
|
||||||
static const apiBaseUrl = 'https://sideshift.ai/api';
|
static const apiBaseUrl = 'https://sideshift.ai/api';
|
||||||
static const rangePath = '/v1/pairs';
|
static const rangePath = '/v2/pair';
|
||||||
static const orderPath = '/v1/orders';
|
static const orderPath = '/v2/shifts';
|
||||||
static const quotePath = '/v1/quotes';
|
static const quotePath = '/v2/quotes';
|
||||||
static const permissionPath = '/v1/permissions';
|
static const permissionPath = '/v2/permissions';
|
||||||
|
|
||||||
static const List<CryptoCurrency> _notSupported = [
|
static const List<CryptoCurrency> _notSupported = [
|
||||||
CryptoCurrency.xhv,
|
CryptoCurrency.xhv,
|
||||||
|
@ -36,23 +36,22 @@ class SideShiftExchangeProvider extends ExchangeProvider {
|
||||||
CryptoCurrency.scrt,
|
CryptoCurrency.scrt,
|
||||||
CryptoCurrency.stx,
|
CryptoCurrency.stx,
|
||||||
CryptoCurrency.bttc,
|
CryptoCurrency.bttc,
|
||||||
|
CryptoCurrency.usdt,
|
||||||
|
CryptoCurrency.eos,
|
||||||
];
|
];
|
||||||
|
|
||||||
static List<ExchangePair> _supportedPairs() {
|
static List<ExchangePair> _supportedPairs() {
|
||||||
final supportedCurrencies = CryptoCurrency.all
|
final supportedCurrencies =
|
||||||
.where((element) => !_notSupported.contains(element))
|
CryptoCurrency.all.where((element) => !_notSupported.contains(element)).toList();
|
||||||
.toList();
|
|
||||||
|
|
||||||
return supportedCurrencies
|
return supportedCurrencies
|
||||||
.map((i) => supportedCurrencies
|
.map((i) => supportedCurrencies.map((k) => ExchangePair(from: i, to: k, reverse: true)))
|
||||||
.map((k) => ExchangePair(from: i, to: k, reverse: true)))
|
|
||||||
.expand((i) => i)
|
.expand((i) => i)
|
||||||
.toList();
|
.toList();
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
ExchangeProviderDescription get description =>
|
ExchangeProviderDescription get description => ExchangeProviderDescription.sideShift;
|
||||||
ExchangeProviderDescription.sideShift;
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Future<double> fetchRate(
|
Future<double> fetchRate(
|
||||||
|
@ -65,17 +64,18 @@ class SideShiftExchangeProvider extends ExchangeProvider {
|
||||||
if (amount == 0) {
|
if (amount == 0) {
|
||||||
return 0.0;
|
return 0.0;
|
||||||
}
|
}
|
||||||
final fromCurrency = _normalizeCryptoCurrency(from);
|
|
||||||
final toCurrency = _normalizeCryptoCurrency(to);
|
final fromCurrency = from.title.toLowerCase();
|
||||||
final url =
|
final toCurrency = to.title.toLowerCase();
|
||||||
apiBaseUrl + rangePath + '/' + fromCurrency + '/' + toCurrency;
|
final depositNetwork = _networkFor(from);
|
||||||
|
final settleNetwork = _networkFor(to);
|
||||||
|
|
||||||
|
final url = "$apiBaseUrl$rangePath/$fromCurrency-$depositNetwork/$toCurrency-$settleNetwork";
|
||||||
|
|
||||||
final uri = Uri.parse(url);
|
final uri = Uri.parse(url);
|
||||||
final response = await get(uri);
|
final response = await get(uri);
|
||||||
final responseJSON = json.decode(response.body) as Map<String, dynamic>;
|
final responseJSON = json.decode(response.body) as Map<String, dynamic>;
|
||||||
final rate = double.parse(responseJSON['rate'] as String);
|
final rate = double.parse(responseJSON['rate'] as String);
|
||||||
final max = double.parse(responseJSON['max'] as String);
|
|
||||||
|
|
||||||
if (amount > max) return 0.00;
|
|
||||||
|
|
||||||
return rate;
|
return rate;
|
||||||
} catch (_) {
|
} catch (_) {
|
||||||
|
@ -101,25 +101,38 @@ class SideShiftExchangeProvider extends ExchangeProvider {
|
||||||
}
|
}
|
||||||
|
|
||||||
final responseJSON = json.decode(response.body) as Map<String, dynamic>;
|
final responseJSON = json.decode(response.body) as Map<String, dynamic>;
|
||||||
final canCreateOrder = responseJSON['createOrder'] as bool;
|
final cancreateShift = responseJSON['createShift'] as bool;
|
||||||
final canCreateQuote = responseJSON['createQuote'] as bool;
|
return cancreateShift;
|
||||||
return canCreateOrder && canCreateQuote;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Future<Trade> createTrade(
|
Future<Trade> createTrade({required TradeRequest request, required bool isFixedRateMode}) async {
|
||||||
{required TradeRequest request, required bool isFixedRateMode}) async {
|
|
||||||
final _request = request as SideShiftRequest;
|
final _request = request as SideShiftRequest;
|
||||||
final quoteId = await _createQuote(_request);
|
String url = '';
|
||||||
final url = apiBaseUrl + orderPath;
|
final depositCoin = request.depositMethod.title.toLowerCase();
|
||||||
final headers = {'Content-Type': 'application/json'};
|
final settleCoin = request.settleMethod.title.toLowerCase();
|
||||||
final body = {
|
final body = {
|
||||||
'type': 'fixed',
|
|
||||||
'quoteId': quoteId,
|
|
||||||
'affiliateId': affiliateId,
|
'affiliateId': affiliateId,
|
||||||
'settleAddress': _request.settleAddress,
|
'settleAddress': _request.settleAddress,
|
||||||
'refundAddress': _request.refundAddress
|
'refundAddress': _request.refundAddress,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
if (isFixedRateMode) {
|
||||||
|
final quoteId = await _createQuote(_request);
|
||||||
|
body['quoteId'] = quoteId;
|
||||||
|
|
||||||
|
url = apiBaseUrl + orderPath + '/fixed';
|
||||||
|
} else {
|
||||||
|
url = apiBaseUrl + orderPath + '/variable';
|
||||||
|
final depositNetwork = _networkFor(request.depositMethod);
|
||||||
|
final settleNetwork = _networkFor(request.settleMethod);
|
||||||
|
body["depositCoin"] = depositCoin;
|
||||||
|
body["settleCoin"] = settleCoin;
|
||||||
|
body["settleNetwork"] = settleNetwork;
|
||||||
|
body["depositNetwork"] = depositNetwork;
|
||||||
|
}
|
||||||
|
final headers = {'Content-Type': 'application/json'};
|
||||||
|
|
||||||
final uri = Uri.parse(url);
|
final uri = Uri.parse(url);
|
||||||
final response = await post(uri, headers: headers, body: json.encode(body));
|
final response = await post(uri, headers: headers, body: json.encode(body));
|
||||||
|
|
||||||
|
@ -136,8 +149,9 @@ class SideShiftExchangeProvider extends ExchangeProvider {
|
||||||
|
|
||||||
final responseJSON = json.decode(response.body) as Map<String, dynamic>;
|
final responseJSON = json.decode(response.body) as Map<String, dynamic>;
|
||||||
final id = responseJSON['id'] as String;
|
final id = responseJSON['id'] as String;
|
||||||
final inputAddress = responseJSON['depositAddress']['address'] as String;
|
final inputAddress = responseJSON['depositAddress'] as String;
|
||||||
final settleAddress = responseJSON['settleAddress']['address'] as String;
|
final settleAddress = responseJSON['settleAddress'] as String;
|
||||||
|
final depositAmount = responseJSON['depositAmount'] as String?;
|
||||||
|
|
||||||
return Trade(
|
return Trade(
|
||||||
id: id,
|
id: id,
|
||||||
|
@ -147,7 +161,7 @@ class SideShiftExchangeProvider extends ExchangeProvider {
|
||||||
inputAddress: inputAddress,
|
inputAddress: inputAddress,
|
||||||
refundAddress: settleAddress,
|
refundAddress: settleAddress,
|
||||||
state: TradeState.created,
|
state: TradeState.created,
|
||||||
amount: _request.depositAmount,
|
amount: depositAmount ?? _request.depositAmount,
|
||||||
payoutAddress: settleAddress,
|
payoutAddress: settleAddress,
|
||||||
createdAt: DateTime.now(),
|
createdAt: DateTime.now(),
|
||||||
);
|
);
|
||||||
|
@ -156,13 +170,17 @@ class SideShiftExchangeProvider extends ExchangeProvider {
|
||||||
Future<String> _createQuote(SideShiftRequest request) async {
|
Future<String> _createQuote(SideShiftRequest request) async {
|
||||||
final url = apiBaseUrl + quotePath;
|
final url = apiBaseUrl + quotePath;
|
||||||
final headers = {'Content-Type': 'application/json'};
|
final headers = {'Content-Type': 'application/json'};
|
||||||
final depositMethod = _normalizeCryptoCurrency(request.depositMethod);
|
final depositMethod = request.depositMethod.title.toLowerCase();
|
||||||
final settleMethod = _normalizeCryptoCurrency(request.settleMethod);
|
final settleMethod = request.settleMethod.title.toLowerCase();
|
||||||
|
final depositNetwork = _networkFor(request.depositMethod);
|
||||||
|
final settleNetwork = _networkFor(request.settleMethod);
|
||||||
final body = {
|
final body = {
|
||||||
'depositMethod': depositMethod,
|
'depositCoin': depositMethod,
|
||||||
'settleMethod': settleMethod,
|
'settleCoin': settleMethod,
|
||||||
'affiliateId': affiliateId,
|
'affiliateId': affiliateId,
|
||||||
'depositAmount': request.depositAmount,
|
'settleAmount': request.depositAmount,
|
||||||
|
'settleNetwork': settleNetwork,
|
||||||
|
'depositNetwork': depositNetwork,
|
||||||
};
|
};
|
||||||
final uri = Uri.parse(url);
|
final uri = Uri.parse(url);
|
||||||
final response = await post(uri, headers: headers, body: json.encode(body));
|
final response = await post(uri, headers: headers, body: json.encode(body));
|
||||||
|
@ -189,9 +207,15 @@ class SideShiftExchangeProvider extends ExchangeProvider {
|
||||||
{required CryptoCurrency from,
|
{required CryptoCurrency from,
|
||||||
required CryptoCurrency to,
|
required CryptoCurrency to,
|
||||||
required bool isFixedRateMode}) async {
|
required bool isFixedRateMode}) async {
|
||||||
final fromCurrency = _normalizeCryptoCurrency(from);
|
final fromCurrency = isFixedRateMode ? to : from;
|
||||||
final toCurrency = _normalizeCryptoCurrency(to);
|
final toCurrency = isFixedRateMode ? from : to;
|
||||||
final url = apiBaseUrl + rangePath + '/' + fromCurrency + '/' + toCurrency;
|
|
||||||
|
final fromNetwork = _networkFor(fromCurrency);
|
||||||
|
final toNetwork = _networkFor(toCurrency);
|
||||||
|
|
||||||
|
final url =
|
||||||
|
"$apiBaseUrl$rangePath/${fromCurrency.title.toLowerCase()}-$fromNetwork/${toCurrency.title.toLowerCase()}-$toNetwork";
|
||||||
|
|
||||||
final uri = Uri.parse(url);
|
final uri = Uri.parse(url);
|
||||||
final response = await get(uri);
|
final response = await get(uri);
|
||||||
|
|
||||||
|
@ -210,6 +234,14 @@ class SideShiftExchangeProvider extends ExchangeProvider {
|
||||||
final min = double.tryParse(responseJSON['min'] as String? ?? '');
|
final min = double.tryParse(responseJSON['min'] as String? ?? '');
|
||||||
final max = double.tryParse(responseJSON['max'] as String? ?? '');
|
final max = double.tryParse(responseJSON['max'] as String? ?? '');
|
||||||
|
|
||||||
|
if (isFixedRateMode) {
|
||||||
|
final currentRate = double.parse(responseJSON['rate'] as String);
|
||||||
|
return Limits(
|
||||||
|
min: min != null ? (min * currentRate) : null,
|
||||||
|
max: max != null ? (max * currentRate) : null,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
return Limits(min: min, max: max);
|
return Limits(min: min, max: max);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -227,8 +259,7 @@ class SideShiftExchangeProvider extends ExchangeProvider {
|
||||||
final responseJSON = json.decode(response.body) as Map<String, dynamic>;
|
final responseJSON = json.decode(response.body) as Map<String, dynamic>;
|
||||||
final error = responseJSON['error']['message'] as String;
|
final error = responseJSON['error']['message'] as String;
|
||||||
|
|
||||||
throw TradeNotFoundException(id,
|
throw TradeNotFoundException(id, provider: description, description: error);
|
||||||
provider: description, description: error);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (response.statusCode != 200) {
|
if (response.statusCode != 200) {
|
||||||
|
@ -236,36 +267,32 @@ class SideShiftExchangeProvider extends ExchangeProvider {
|
||||||
}
|
}
|
||||||
|
|
||||||
final responseJSON = json.decode(response.body) as Map<String, dynamic>;
|
final responseJSON = json.decode(response.body) as Map<String, dynamic>;
|
||||||
final fromCurrency = responseJSON['depositMethodId'] as String;
|
final fromCurrency = responseJSON['depositCoin'] as String;
|
||||||
final from = CryptoCurrency.fromString(fromCurrency);
|
final from = CryptoCurrency.fromString(fromCurrency);
|
||||||
final toCurrency = responseJSON['settleMethodId'] as String;
|
final toCurrency = responseJSON['settleCoin'] as String;
|
||||||
final to = CryptoCurrency.fromString(toCurrency);
|
final to = CryptoCurrency.fromString(toCurrency);
|
||||||
final inputAddress = responseJSON['depositAddress']['address'] as String;
|
final inputAddress = responseJSON['depositAddress'] as String;
|
||||||
final expectedSendAmount = responseJSON['depositAmount'].toString();
|
final expectedSendAmount = responseJSON['depositAmount'] as String?;
|
||||||
final deposits = responseJSON['deposits'] as List?;
|
final status = responseJSON['status'] as String?;
|
||||||
final settleAddress = responseJSON['settleAddress']['address'] as String;
|
final settleAddress = responseJSON['settleAddress'] as String;
|
||||||
TradeState? state;
|
TradeState? state;
|
||||||
String? status;
|
|
||||||
|
|
||||||
if (deposits?.isNotEmpty ?? false) {
|
|
||||||
status = deposits![0]['status'] as String?;
|
|
||||||
}
|
|
||||||
state = TradeState.deserialize(raw: status ?? 'created');
|
state = TradeState.deserialize(raw: status ?? 'created');
|
||||||
|
final isVariable = (responseJSON['type'] as String) == 'variable';
|
||||||
|
|
||||||
final expiredAtRaw = responseJSON['expiresAtISO'] as String;
|
final expiredAtRaw = responseJSON['expiresAt'] as String;
|
||||||
final expiredAt = DateTime.tryParse(expiredAtRaw)?.toLocal();
|
final expiredAt = isVariable ? null : DateTime.tryParse(expiredAtRaw)?.toLocal();
|
||||||
|
|
||||||
return Trade(
|
return Trade(
|
||||||
id: id,
|
id: id,
|
||||||
from: from,
|
from: from,
|
||||||
to: to,
|
to: to,
|
||||||
provider: description,
|
provider: description,
|
||||||
inputAddress: inputAddress,
|
inputAddress: inputAddress,
|
||||||
amount: expectedSendAmount,
|
amount: expectedSendAmount ?? '',
|
||||||
state: state,
|
state: state,
|
||||||
expiredAt: expiredAt,
|
expiredAt: expiredAt,
|
||||||
payoutAddress: settleAddress
|
payoutAddress: settleAddress);
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
|
@ -280,28 +307,25 @@ class SideShiftExchangeProvider extends ExchangeProvider {
|
||||||
@override
|
@override
|
||||||
String get title => 'SideShift';
|
String get title => 'SideShift';
|
||||||
|
|
||||||
static String _normalizeCryptoCurrency(CryptoCurrency currency) {
|
String _networkFor(CryptoCurrency currency) =>
|
||||||
switch (currency) {
|
currency.tag != null ? _normalizeTag(currency.tag!) : 'mainnet';
|
||||||
case CryptoCurrency.zaddr:
|
|
||||||
return 'zaddr';
|
String _normalizeTag(String tag) {
|
||||||
case CryptoCurrency.zec:
|
switch (tag) {
|
||||||
return 'zec';
|
case 'ETH':
|
||||||
case CryptoCurrency.bnb:
|
return 'ethereum';
|
||||||
return currency.tag!.toLowerCase();
|
case 'TRX':
|
||||||
case CryptoCurrency.usdterc20:
|
return 'tron';
|
||||||
return 'usdtErc20';
|
case 'LN':
|
||||||
case CryptoCurrency.usdttrc20:
|
return 'lightning';
|
||||||
return 'usdtTrc20';
|
case 'POLY':
|
||||||
case CryptoCurrency.usdcpoly:
|
|
||||||
return 'usdcpolygon';
|
|
||||||
case CryptoCurrency.usdcsol:
|
|
||||||
return 'usdcsol';
|
|
||||||
case CryptoCurrency.maticpoly:
|
|
||||||
return 'polygon';
|
return 'polygon';
|
||||||
case CryptoCurrency.btcln:
|
case 'ZEC':
|
||||||
return 'ln';
|
return 'zcash';
|
||||||
|
case 'AVAXC':
|
||||||
|
return 'avax';
|
||||||
default:
|
default:
|
||||||
return currency.title.toLowerCase();
|
return tag.toLowerCase();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -47,7 +47,7 @@ abstract class ExchangeTradeViewModelBase with Store {
|
||||||
case ExchangeProviderDescription.simpleSwap:
|
case ExchangeProviderDescription.simpleSwap:
|
||||||
_provider = SimpleSwapExchangeProvider();
|
_provider = SimpleSwapExchangeProvider();
|
||||||
break;
|
break;
|
||||||
case ExchangeProviderDescription.trocador:
|
case ExchangeProviderDescription.trocador:
|
||||||
_provider = TrocadorExchangeProvider();
|
_provider = TrocadorExchangeProvider();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -114,6 +114,10 @@ abstract class ExchangeTradeViewModelBase with Store {
|
||||||
updatedTrade.createdAt = trade.createdAt;
|
updatedTrade.createdAt = trade.createdAt;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (updatedTrade.amount.isEmpty) {
|
||||||
|
updatedTrade.amount = trade.amount;
|
||||||
|
}
|
||||||
|
|
||||||
trade = updatedTrade;
|
trade = updatedTrade;
|
||||||
|
|
||||||
_updateItems();
|
_updateItems();
|
||||||
|
@ -123,7 +127,8 @@ abstract class ExchangeTradeViewModelBase with Store {
|
||||||
}
|
}
|
||||||
|
|
||||||
void _updateItems() {
|
void _updateItems() {
|
||||||
final tagFrom = tradesStore.trade!.from.tag != null ? '${tradesStore.trade!.from.tag}' + ' ' : '';
|
final tagFrom =
|
||||||
|
tradesStore.trade!.from.tag != null ? '${tradesStore.trade!.from.tag}' + ' ' : '';
|
||||||
final tagTo = tradesStore.trade!.to.tag != null ? '${tradesStore.trade!.to.tag}' + ' ' : '';
|
final tagTo = tradesStore.trade!.to.tag != null ? '${tradesStore.trade!.to.tag}' + ' ' : '';
|
||||||
items.clear();
|
items.clear();
|
||||||
items.add(ExchangeTradeItem(
|
items.add(ExchangeTradeItem(
|
||||||
|
|
|
@ -443,7 +443,9 @@ abstract class ExchangeViewModelBase with Store {
|
||||||
request = SideShiftRequest(
|
request = SideShiftRequest(
|
||||||
depositMethod: depositCurrency,
|
depositMethod: depositCurrency,
|
||||||
settleMethod: receiveCurrency,
|
settleMethod: receiveCurrency,
|
||||||
depositAmount: depositAmount.replaceAll(',', '.'),
|
depositAmount: isFixedRateMode
|
||||||
|
? receiveAmount.replaceAll(',', '.')
|
||||||
|
: depositAmount.replaceAll(',', '.'),
|
||||||
settleAddress: receiveAddress,
|
settleAddress: receiveAddress,
|
||||||
refundAddress: depositAddress,
|
refundAddress: depositAddress,
|
||||||
);
|
);
|
||||||
|
|
|
@ -20,7 +20,6 @@ class SecretKey {
|
||||||
SecretKey('moonPayApiKey', () => ''),
|
SecretKey('moonPayApiKey', () => ''),
|
||||||
SecretKey('moonPaySecretKey', () => ''),
|
SecretKey('moonPaySecretKey', () => ''),
|
||||||
SecretKey('sideShiftAffiliateId', () => ''),
|
SecretKey('sideShiftAffiliateId', () => ''),
|
||||||
SecretKey('sideShiftApiKey', () => ''),
|
|
||||||
SecretKey('simpleSwapApiKey', () => ''),
|
SecretKey('simpleSwapApiKey', () => ''),
|
||||||
SecretKey('simpleSwapApiKeyDesktop', () => ''),
|
SecretKey('simpleSwapApiKeyDesktop', () => ''),
|
||||||
SecretKey('anypayToken', () => ''),
|
SecretKey('anypayToken', () => ''),
|
||||||
|
|
Loading…
Reference in a new issue