dev
dart 113 lines 3.62 KB
Raw
1 import 'dart:convert';
2 import 'package:cake_wallet/anypay/any_pay_payment_committed_info.dart';
3 import 'package:cake_wallet/utils/exception_handler.dart';
4 import 'package:cw_core/utils/proxy_wrapper.dart';
5 import 'package:flutter/foundation.dart';
6 import 'package:cw_core/crypto_currency.dart';
7 import 'package:cake_wallet/anypay/any_pay_payment.dart';
8 import 'package:cake_wallet/anypay/any_pay_trasnaction.dart';
9 import 'package:cake_wallet/.secrets.g.dart' as secrets;
10
11 class AnyPayApi {
12 static const contentTypePaymentRequest = 'application/payment-request';
13 static const contentTypePayment = 'application/payment';
14 static const xPayproVersion = '2';
15 static const anypayToken = secrets.anypayToken;
16
17 static String chainByScheme(String scheme) {
18 switch (scheme.toLowerCase()) {
19 case 'monero':
20 return CryptoCurrency.xmr.title;
21 case 'bitcoin':
22 return CryptoCurrency.btc.title;
23 case 'litecoin':
24 return CryptoCurrency.ltc.title;
25 default:
26 return '';
27 }
28 }
29
30 static CryptoCurrency currencyByScheme(String scheme) {
31 switch (scheme.toLowerCase()) {
32 case 'monero':
33 return CryptoCurrency.xmr;
34 case 'bitcoin':
35 return CryptoCurrency.btc;
36 case 'litecoin':
37 return CryptoCurrency.ltc;
38 default:
39 throw Exception('Unexpected scheme: ${scheme}');
40 }
41 }
42
43 Future<AnyPayPayment> paymentRequest(String uri) async {
44 final fragments = uri.split(':?r=');
45 final scheme = fragments.first;
46 final url = Uri.parse(fragments[1]);
47 final headers = <String, String>{
48 'Content-Type': contentTypePaymentRequest,
49 'X-Paypro-Version': xPayproVersion,
50 'Accept': '*/*',
51 'x-wallet': 'cake',
52 'x-wallet-token': anypayToken,
53 };
54 final body = <String, dynamic>{
55 'chain': chainByScheme(scheme),
56 'currency': currencyByScheme(scheme).title
57 };
58 final response = await ProxyWrapper().post(
59 clearnetUri: url,
60 headers: headers,
61 body: json.encode(body),
62 );
63
64 if (response.statusCode != 200) {
65 await ExceptionHandler.onError(FlutterErrorDetails(exception: response));
66 throw Exception('Unexpected response http code: ${response.statusCode}');
67 }
68
69 final decodedBody = json.decode(response.body) as Map<String, dynamic>;
70 return AnyPayPayment.fromMap(decodedBody);
71 }
72
73 Future<AnyPayPaymentCommittedInfo> payment(String uri,
74 {required String chain,
75 required String currency,
76 required List<AnyPayTransaction> transactions}) async {
77 final headers = <String, String>{
78 'Content-Type': contentTypePayment,
79 'X-Paypro-Version': xPayproVersion,
80 'Accept': '*/*',
81 'x-wallet': 'cake',
82 'x-wallet-token': anypayToken,
83 };
84 final body = <String, dynamic>{
85 'chain': chain,
86 'currency': currency,
87 'transactions':
88 transactions.map((tx) => {'tx': tx.tx, 'tx_hash': tx.id, 'tx_key': tx.key}).toList()
89 };
90 final response = await ProxyWrapper().post(
91 clearnetUri: Uri.parse(uri),
92 headers: headers,
93 body: json.encode(body),
94 );
95
96 if (response.statusCode == 400) {
97 final decodedBody = json.decode(response.body) as Map<String, dynamic>;
98 throw Exception(decodedBody['message'] as String? ?? 'Unexpected response\nError code: 400');
99 }
100
101 if (response.statusCode != 200) {
102 throw Exception('Unexpected response');
103 }
104
105 final decodedBody = json.decode(response.body) as Map<String, dynamic>;
106 return AnyPayPaymentCommittedInfo(
107 uri: uri,
108 currency: currency,
109 chain: chain,
110 transactions: transactions,
111 memo: decodedBody['memo'] as String);
112 }
113 }