diff --git a/lib/services/coins/tezos/api/tezos_api.dart b/lib/services/coins/tezos/api/tezos_api.dart index 8bf237630..8f1f63087 100644 --- a/lib/services/coins/tezos/api/tezos_api.dart +++ b/lib/services/coins/tezos/api/tezos_api.dart @@ -11,7 +11,8 @@ class TezosAPI { Future?> getTransactions(String address) async { try { - String transactionsCall = "$_baseURL/explorer/account/$address/operations"; + String transactionsCall = + "$_baseURL/explorer/account/$address/operations"; var response = jsonDecode( await get(Uri.parse(transactionsCall)).then((value) => value.body)); List txs = []; @@ -20,32 +21,41 @@ class TezosAPI { int? burnedAmountInMicroTez; int? storage_limit; if (tx["burned"] != null) { - burnedAmountInMicroTez = double.parse((tx["burned"] * pow(10, Coin.tezos.decimals)).toString()).toInt(); + burnedAmountInMicroTez = double.parse( + (tx["burned"] * pow(10, Coin.tezos.decimals)).toString()) + .toInt(); } if (tx["storage_limit"] != null) { storage_limit = tx["storage_limit"] as int; } final theTx = TezosOperation( - id: tx["id"] as int, - hash: tx["hash"] as String, - type: tx["type"] as String, - height: tx["height"] as int, - timestamp: DateTime.parse(tx["time"].toString()).toUtc().millisecondsSinceEpoch ~/ 1000, - cycle: tx["cycle"] as int, - counter: tx["counter"] as int, - op_n: tx["op_n"] as int, - op_p: tx["op_p"] as int, - status: tx["status"] as String, - is_success: tx["is_success"] as bool, - gas_limit: tx["gas_limit"] as int, - gas_used: tx["gas_used"] as int, - storage_limit: storage_limit, - amountInMicroTez: double.parse((tx["volume"] * pow(10, Coin.tezos.decimals)).toString()).toInt(), - feeInMicroTez: double.parse((tx["fee"] * pow(10, Coin.tezos.decimals)).toString()).toInt(), - burnedAmountInMicroTez: burnedAmountInMicroTez, - senderAddress: tx["sender"] as String, - receiverAddress: tx["receiver"] as String, - confirmations: tx["confirmations"] as int, + id: tx["id"] as int, + hash: tx["hash"] as String, + type: tx["type"] as String, + height: tx["height"] as int, + timestamp: DateTime.parse(tx["time"].toString()) + .toUtc() + .millisecondsSinceEpoch ~/ + 1000, + cycle: tx["cycle"] as int, + counter: tx["counter"] as int, + op_n: tx["op_n"] as int, + op_p: tx["op_p"] as int, + status: tx["status"] as String, + is_success: tx["is_success"] as bool, + gas_limit: tx["gas_limit"] as int, + gas_used: tx["gas_used"] as int, + storage_limit: storage_limit, + amountInMicroTez: double.parse( + (tx["volume"] * pow(10, Coin.tezos.decimals)).toString()) + .toInt(), + feeInMicroTez: double.parse( + (tx["fee"] * pow(10, Coin.tezos.decimals)).toString()) + .toInt(), + burnedAmountInMicroTez: burnedAmountInMicroTez, + senderAddress: tx["sender"] as String, + receiverAddress: tx["receiver"] as String, + confirmations: tx["confirmations"] as int, ); txs.add(theTx); } @@ -67,47 +77,10 @@ class TezosAPI { int totalTxs = response[0][8] as int; return ((totalFees / totalTxs * Coin.tezos.decimals).floor()); } catch (e) { - Logging.instance.log("Error occured in tezos_api.dart while getting fee estimation for tezos: $e", + Logging.instance.log( + "Error occured in tezos_api.dart while getting fee estimation for tezos: $e", level: LogLevel.Error); } return null; } - - Future getBalance(String host, int port, String address) async { - try { - String balanceCall = - "$host:$port/chains/main/blocks/head/context/contracts/$address/balance"; - var response = - await get(Uri.parse(balanceCall)).then((value) => value.body); - var balance = BigInt.parse(response.substring(1, response.length - 2)); - return balance; - } catch (e) { - Logging.instance.log("Error occured in tezos_api.dart while getting balance for $address: $e", - level: LogLevel.Error); - } - return null; - } - - Future getChainHeight(String host, int port) async { - try { - var api = - "$host:$port/chains/main/blocks/head/header/shell"; - var jsonParsedResponse = jsonDecode(await get(Uri.parse(api)).then((value) => value.body)); - return int.parse(jsonParsedResponse["level"].toString()); - } catch (e) { - Logging.instance.log("Error occured in tezos_api.dart while getting chain height for tezos: $e", - level: LogLevel.Error); - } - return null; - } - - Future testNetworkConnection(String host, int port) async { - try { - await get(Uri.parse( - "$host:$port/chains/main/blocks/head/header/shell")); - return true; - } catch (e) { - return false; - } - } } diff --git a/lib/services/coins/tezos/api/tezos_rpc_api.dart b/lib/services/coins/tezos/api/tezos_rpc_api.dart new file mode 100644 index 000000000..25701842a --- /dev/null +++ b/lib/services/coins/tezos/api/tezos_rpc_api.dart @@ -0,0 +1,52 @@ +import 'dart:convert'; + +import 'package:http/http.dart'; + +import 'package:stackwallet/utilities/logger.dart'; + +class TezosRpcAPI { + Future getBalance( + {required ({String host, int port}) nodeInfo, + required String address}) async { + try { + String balanceCall = + "${nodeInfo.host}:${nodeInfo.port}/chains/main/blocks/head/context/contracts/$address/balance"; + var response = + await get(Uri.parse(balanceCall)).then((value) => value.body); + var balance = BigInt.parse(response.substring(1, response.length - 2)); + return balance; + } catch (e) { + Logging.instance.log( + "Error occured in tezos_rpc_api.dart while getting balance for $address: $e", + level: LogLevel.Error); + } + return null; + } + + Future getChainHeight( + {required ({String host, int port}) nodeInfo}) async { + try { + var api = + "${nodeInfo.host}:${nodeInfo.port}/chains/main/blocks/head/header/shell"; + var jsonParsedResponse = + jsonDecode(await get(Uri.parse(api)).then((value) => value.body)); + return int.parse(jsonParsedResponse["level"].toString()); + } catch (e) { + Logging.instance.log( + "Error occured in tezos_rpc_api.dart while getting chain height for tezos: $e", + level: LogLevel.Error); + } + return null; + } + + Future testNetworkConnection( + {required ({String host, int port}) nodeInfo}) async { + try { + await get(Uri.parse( + "${nodeInfo.host}:${nodeInfo.port}/chains/main/blocks/head/header/shell")); + return true; + } catch (e) { + return false; + } + } +} diff --git a/lib/services/coins/tezos/api/tezos_transaction.dart b/lib/services/coins/tezos/api/tezos_transaction.dart index ab40a9386..121e2d475 100644 --- a/lib/services/coins/tezos/api/tezos_transaction.dart +++ b/lib/services/coins/tezos/api/tezos_transaction.dart @@ -20,26 +20,25 @@ class TezosOperation { String receiverAddress; int? confirmations; - TezosOperation({ - this.id, - required this.hash, - this.type, - required this.height, - required this.timestamp, - this.cycle, - this.counter, - this.op_n, - this.op_p, - this.status, - this.is_success, - this.gas_limit, - this.gas_used, - this.storage_limit, - required this.amountInMicroTez, - required this.feeInMicroTez, - this.burnedAmountInMicroTez, - required this.senderAddress, - required this.receiverAddress, - this.confirmations - }); -} \ No newline at end of file + TezosOperation( + {this.id, + required this.hash, + this.type, + required this.height, + required this.timestamp, + this.cycle, + this.counter, + this.op_n, + this.op_p, + this.status, + this.is_success, + this.gas_limit, + this.gas_used, + this.storage_limit, + required this.amountInMicroTez, + required this.feeInMicroTez, + this.burnedAmountInMicroTez, + required this.senderAddress, + required this.receiverAddress, + this.confirmations}); +} diff --git a/lib/services/coins/tezos/tezos_wallet.dart b/lib/services/coins/tezos/tezos_wallet.dart index 178ae6fb1..f7d5646e6 100644 --- a/lib/services/coins/tezos/tezos_wallet.dart +++ b/lib/services/coins/tezos/tezos_wallet.dart @@ -34,6 +34,8 @@ import 'package:stackwallet/utilities/prefs.dart'; import 'package:tezart/tezart.dart'; import 'package:tuple/tuple.dart'; +import 'api/tezos_rpc_api.dart'; + const int MINIMUM_CONFIRMATIONS = 1; const int _gasLimit = 10200; @@ -58,6 +60,7 @@ class TezosWallet extends CoinServiceAPI with WalletCache, WalletDB { NodeModel? _xtzNode; TezosAPI tezosAPI = TezosAPI(); + TezosRpcAPI tezosRpcAPI = TezosRpcAPI(); NodeModel getCurrentNode() { return _xtzNode ?? @@ -491,11 +494,15 @@ class TezosWallet extends CoinServiceAPI with WalletCache, WalletDB { Future updateBalance() async { try { NodeModel currentNode = getCurrentNode(); - BigInt? balance = await tezosAPI.getBalance( - currentNode.host, currentNode.port, await currentReceivingAddress); + BigInt? balance = await tezosRpcAPI.getBalance( + nodeInfo: (host: currentNode.host, port: currentNode.port), + address: await currentReceivingAddress); if (balance == null) { return; } + Logging.instance.log( + "Balance for ${await currentReceivingAddress}: $balance", + level: LogLevel.Info); Amount balanceInAmount = Amount(rawValue: balance, fractionDigits: coin.decimals); _balance = Balance( @@ -585,8 +592,8 @@ class TezosWallet extends CoinServiceAPI with WalletCache, WalletDB { Future updateChainHeight() async { try { NodeModel currentNode = getCurrentNode(); - int? intHeight = - await tezosAPI.getChainHeight(currentNode.host, currentNode.port); + int? intHeight = await tezosRpcAPI.getChainHeight( + nodeInfo: (host: currentNode.host, port: currentNode.port)); if (intHeight == null) { return; } @@ -670,8 +677,8 @@ class TezosWallet extends CoinServiceAPI with WalletCache, WalletDB { @override Future testNetworkConnection() async { NodeModel currentNode = getCurrentNode(); - return await tezosAPI.testNetworkConnection( - currentNode.host, currentNode.port); + return await tezosRpcAPI.testNetworkConnection( + nodeInfo: (host: currentNode.host, port: currentNode.port)); } @override