last updates

This commit is contained in:
leo 2023-11-17 17:40:23 +00:00
parent 58e505944c
commit dda6d4c750
26 changed files with 734 additions and 330 deletions

View file

@ -200,7 +200,7 @@ class CryptoCurrency extends EnumerableItem<int> with Serializable<int> implemen
static const dydx = CryptoCurrency(title: 'DYDX', tag: 'ETH', fullName: 'dYdX', raw: 84, name: 'dydx', iconPath: 'assets/images/dydx_icon.png'); static const dydx = CryptoCurrency(title: 'DYDX', tag: 'ETH', fullName: 'dYdX', raw: 84, name: 'dydx', iconPath: 'assets/images/dydx_icon.png');
static const steth = CryptoCurrency(title: 'STETH', tag: 'ETH', fullName: 'Lido Staked Ethereum', raw: 85, name: 'steth', iconPath: 'assets/images/steth_icon.png'); static const steth = CryptoCurrency(title: 'STETH', tag: 'ETH', fullName: 'Lido Staked Ethereum', raw: 85, name: 'steth', iconPath: 'assets/images/steth_icon.png');
static const zano = CryptoCurrency(title: 'ZANO', tag: 'ZANO', fullName: 'Zano', raw: 86, name: 'zano', iconPath: 'assets/images/zano_icon.png'); static const zano = CryptoCurrency(title: 'ZANO', tag: 'ZANO', fullName: 'Zano', raw: 86, name: 'zano', iconPath: 'assets/images/zano_icon.png');
static const dummy = CryptoCurrency(title: 'DUMMY', tag: 'DUMMY', fullName: 'Dummy', raw: 87, name: 'dummy', iconPath: 'assets/images/dummy_icon.png'); static const dummy = CryptoCurrency(title: 'DUMMY', tag: 'DUMMY', fullName: 'Dummy', raw: 87, name: 'dummy', iconPath: 'assets/images/zano_icon.png');
static final Map<int, CryptoCurrency> _rawCurrencyMap = static final Map<int, CryptoCurrency> _rawCurrencyMap =

View file

@ -132,7 +132,7 @@ class Node extends HiveObject with Keyable {
case WalletType.haven: case WalletType.haven:
return requestMoneroNode(); return requestMoneroNode();
case WalletType.zano: case WalletType.zano:
return requestMoneroNode(); return requestZanoNode();
case WalletType.ethereum: case WalletType.ethereum:
return requestElectrumServer(); return requestElectrumServer();
case WalletType.dummy: case WalletType.dummy:
@ -145,6 +145,11 @@ class Node extends HiveObject with Keyable {
} }
} }
Future<bool> requestZanoNode() async {
// TODO: fix it
return true;
}
Future<bool> requestMoneroNode() async { Future<bool> requestMoneroNode() async {
final path = '/json_rpc'; final path = '/json_rpc';
final rpcUri = isSSL ? Uri.https(uri.authority, path) : Uri.http(uri.authority, path); final rpcUri = isSSL ? Uri.https(uri.authority, path) : Uri.http(uri.authority, path);

View file

@ -428,6 +428,11 @@ extern "C"
return strdup(plain_wallet::try_pull_result(job_id).c_str()); return strdup(plain_wallet::try_pull_result(job_id).c_str());
} }
char* sync_call(const std::string& method_name, uint64_t instance_id, const std::string& params)
{
return strdup(plain_wallet::sync_call(method_name, instance_id, params).c_str());
}
char* get_connectivity_status() char* get_connectivity_status()
{ {
return strdup(plain_wallet::get_connectivity_status().c_str()); return strdup(plain_wallet::get_connectivity_status().c_str());
@ -847,6 +852,11 @@ extern "C"
//return m_wallet->trustedDaemon(); //return m_wallet->trustedDaemon();
} }
char* get_version()
{
return strdup(plain_wallet::get_version().c_str());
}
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif

View file

@ -7,29 +7,29 @@ import 'package:cw_zano/api/structs/account_row.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:cw_zano/api/wallet.dart'; import 'package:cw_zano/api/wallet.dart';
final accountSizeNative = zanoApi // final accountSizeNative = zanoApi
.lookup<NativeFunction<account_size>>('account_size') // .lookup<NativeFunction<account_size>>('account_size')
.asFunction<SubaddressSize>(); // .asFunction<SubaddressSize>();
final accountRefreshNative = zanoApi // final accountRefreshNative = zanoApi
.lookup<NativeFunction<account_refresh>>('account_refresh') // .lookup<NativeFunction<account_refresh>>('account_refresh')
.asFunction<AccountRefresh>(); // .asFunction<AccountRefresh>();
final accountGetAllNative = zanoApi // final accountGetAllNative = zanoApi
.lookup<NativeFunction<account_get_all>>('account_get_all') // .lookup<NativeFunction<account_get_all>>('account_get_all')
.asFunction<AccountGetAll>(); // .asFunction<AccountGetAll>();
final accountAddNewNative = zanoApi // final accountAddNewNative = zanoApi
.lookup<NativeFunction<account_add_new>>('account_add_row') // .lookup<NativeFunction<account_add_new>>('account_add_row')
.asFunction<AccountAddNew>(); // .asFunction<AccountAddNew>();
final accountSetLabelNative = zanoApi // final accountSetLabelNative = zanoApi
.lookup<NativeFunction<account_set_label>>('account_set_label_row') // .lookup<NativeFunction<account_set_label>>('account_set_label_row')
.asFunction<AccountSetLabel>(); // .asFunction<AccountSetLabel>();
bool isUpdating = false; bool isUpdating = false;
void refreshAccounts() { /**void refreshAccounts() {
try { try {
isUpdating = true; isUpdating = true;
accountRefreshNative(); accountRefreshNative();
@ -38,9 +38,9 @@ void refreshAccounts() {
isUpdating = false; isUpdating = false;
rethrow; rethrow;
} }
} }*/
List<AccountRow> getAllAccount() { /**List<AccountRow> getAllAccount() {
final size = accountSizeNative(); final size = accountSizeNative();
final accountAddressesPointer = accountGetAllNative(); final accountAddressesPointer = accountGetAllNative();
final accountAddresses = accountAddressesPointer.asTypedList(size); final accountAddresses = accountAddressesPointer.asTypedList(size);
@ -48,38 +48,38 @@ List<AccountRow> getAllAccount() {
return accountAddresses return accountAddresses
.map((addr) => Pointer<AccountRow>.fromAddress(addr).ref) .map((addr) => Pointer<AccountRow>.fromAddress(addr).ref)
.toList(); .toList();
} }*/
void addAccountSync({required String label}) { /**void addAccountSync({required String label}) {
final labelPointer = label.toNativeUtf8(); final labelPointer = label.toNativeUtf8();
accountAddNewNative(labelPointer); accountAddNewNative(labelPointer);
calloc.free(labelPointer); calloc.free(labelPointer);
} }*/
void setLabelForAccountSync( /**void setLabelForAccountSync(
{required int accountIndex, required String label}) { {required int accountIndex, required String label}) {
final labelPointer = label.toNativeUtf8(); final labelPointer = label.toNativeUtf8();
accountSetLabelNative(accountIndex, labelPointer); accountSetLabelNative(accountIndex, labelPointer);
calloc.free(labelPointer); calloc.free(labelPointer);
} }*/
void _addAccount(String label) => addAccountSync(label: label); /**void _addAccount(String label) => addAccountSync(label: label);*/
void _setLabelForAccount(Map<String, dynamic> args) { /**void _setLabelForAccount(Map<String, dynamic> args) {
final label = args['label'] as String; final label = args['label'] as String;
final accountIndex = args['accountIndex'] as int; final accountIndex = args['accountIndex'] as int;
setLabelForAccountSync(label: label, accountIndex: accountIndex); setLabelForAccountSync(label: label, accountIndex: accountIndex);
} }*/
Future<void> addAccount({required String label}) async { /**Future<void> addAccount({required String label}) async {
await compute(_addAccount, label); await compute(_addAccount, label);
await store(); await store();
} }*/
Future<void> setLabelForAccount( /**Future<void> setLabelForAccount(
{required int accountIndex, required String label}) async { {required int accountIndex, required String label}) async {
await compute( await compute(
_setLabelForAccount, {'accountIndex': accountIndex, 'label': label}); _setLabelForAccount, {'accountIndex': accountIndex, 'label': label});
await store(); await store();
} }*/

189
cw_zano/lib/api/calls.dart Normal file
View file

@ -0,0 +1,189 @@
import 'dart:ffi';
import 'dart:convert';
import 'package:cw_zano/api/convert_utf8_to_string.dart';
import 'package:cw_zano/api/model.dart';
import 'package:cw_zano/api/zano_api.dart';
import 'package:ffi/ffi.dart';
import 'package:flutter/foundation.dart';
final _asyncCallNative = zanoApi
.lookup<NativeFunction<_async_call>>('async_call')
.asFunction<_AsyncCall>();
typedef _async_call = Pointer<Utf8> Function(
Pointer<Utf8>, Int64, Pointer<Utf8>);
typedef _AsyncCall = Pointer<Utf8> Function(
Pointer<Utf8> methodName, int hWallet, Pointer<Utf8> params);
// get_wallet_status
final _getWalletStatusNative = zanoApi
.lookup<NativeFunction<_get_wallet_status>>('get_wallet_status')
.asFunction<_GetWalletStatus>();
typedef _get_wallet_status = Pointer<Utf8> Function(Int64);
typedef _GetWalletStatus = Pointer<Utf8> Function(int hWallet);
// get_wallet_info
final _getWalletInfoNative = zanoApi
.lookup<NativeFunction<_get_wallet_info>>('get_wallet_info')
.asFunction<_GetWalletInfo>();
typedef _get_wallet_info = Pointer<Utf8> Function(Int64);
typedef _GetWalletInfo = Pointer<Utf8> Function(int hWallet);
// get_connectivity_status
final _getConnectivityStatusNative = zanoApi
.lookup<NativeFunction<_get_connectivity_status>>('get_connectivity_status')
.asFunction<_GetConnectivityStatus>();
typedef _get_connectivity_status = Pointer<Utf8> Function();
typedef _GetConnectivityStatus = Pointer<Utf8> Function();
// get_version
final _getVersionNative = zanoApi
.lookup<NativeFunction<_get_version>>('get_version')
.asFunction<_GetVersion>();
typedef _get_version = Pointer<Utf8> Function();
typedef _GetVersion = Pointer<Utf8> Function();
// load_wallet
final _loadWalletNative = zanoApi
.lookup<NativeFunction<_load_wallet>>('load_wallet')
.asFunction<_LoadWallet>();
typedef _load_wallet = Pointer<Utf8> Function(
Pointer<Utf8>, Pointer<Utf8>, Int8);
typedef _LoadWallet = Pointer<Utf8> Function(Pointer<Utf8>, Pointer<Utf8>, int);
// try_pull_result
final _tryPullResultNative = zanoApi
.lookup<NativeFunction<_try_pull_result>>('try_pull_result')
.asFunction<_TryPullResult>();
typedef _try_pull_result = Pointer<Utf8> Function(Int64);
typedef _TryPullResult = Pointer<Utf8> Function(int hWallet);
// close_wallet
final _closeWalletNative = zanoApi
.lookup<NativeFunction<_close_wallet>>('close_wallet')
.asFunction<_closeWalletStatus>();
typedef _close_wallet = Void Function(Int64);
typedef _closeWalletStatus = void Function(int hWallet);
String doAsyncCall(
{required String methodName,
required int hWallet,
required String params}) {
final methodNamePointer = methodName.toNativeUtf8();
final paramsPointer = params.toNativeUtf8();
debugPrint(
"async_call method_name $methodName hWallet $hWallet params $params");
final result = convertUTF8ToString(
pointer: _asyncCallNative(methodNamePointer, hWallet, paramsPointer));
calloc.free(methodNamePointer);
calloc.free(paramsPointer);
return result;
}
Future<String> invokeMethod(
int hWallet, String methodName, String params) async {
debugPrint('invoke method $methodName params $params');
final invokeResult = doAsyncCall(
methodName: 'invoke',
hWallet: hWallet,
params: json.encode({
'method': methodName,
'params': params,
}));
debugPrint('invoke result $invokeResult');
final map = json.decode(invokeResult);
if (map["job_id"] != null) {
bool done = false;
do {
await Future.delayed(Duration(seconds: 3));
final result = tryPullResult(map["job_id"] as int);
final map2 = json.decode(result);
done = map2["result"] == null || map2["result"]["error"] == null;
} while (!done);
}
return "";
}
Future<String> store(int hWallet) async {
// debugPrint("store hWallet $hWallet");
// final result = doAsyncCall(
// methodName: 'invoke',
// hWallet: hWallet,
// params: "{method: 'store', params: {}}");
// debugPrint('store result $result');
// final map = json.decode(result);
// if (map["job_id"] != null) {
// await Future.delayed(Duration(seconds: 1));
// tryPullResult(map["job_id"] as int);
// }
return await invokeMethod(hWallet, 'store', '{}');
}
Future<String> getRecentTxsAndInfo(
{required int hWallet,
required int offset,
required int count,
bool updateProvisionInfo = true}) async {
return await invokeMethod(
hWallet,
'get_recent_txs_and_info',
json.encode(
GetRecentTxsAndInfoParams(
offset: offset,
count: count,
updateProvisionInfo: updateProvisionInfo),
),
);
}
String getWalletStatus(int hWallet) {
debugPrint("get_wallet_status hWallet $hWallet");
final result = convertUTF8ToString(pointer: _getWalletStatusNative(hWallet));
debugPrint('get_wallet_status result $result');
return result;
}
void closeWallet(int hWallet) {
debugPrint("close_wallet hWallet $hWallet");
_closeWalletNative(hWallet);
}
String getWalletInfo(int hWallet) {
debugPrint('get_wallet_info hWallet $hWallet');
final result = convertUTF8ToString(pointer: _getWalletInfoNative(hWallet));
debugPrint('get_wallet_info result $result');
return result;
}
String getConnectivityStatus() {
final result = convertUTF8ToString(pointer: _getConnectivityStatusNative());
debugPrint('get_connectivity_status result $result');
return result;
}
String getVersion() {
final result = convertUTF8ToString(pointer: _getVersionNative());
debugPrint('get_version result $result');
return result;
}
String loadWallet(String path, String password, int nettype) {
debugPrint("load_wallet path $path password $password nettype $nettype");
final pathPointer = path.toNativeUtf8();
final passwordPointer = password.toNativeUtf8();
final result = convertUTF8ToString(
pointer: _loadWalletNative(pathPointer, passwordPointer, nettype),
);
debugPrint("load_wallet result $result");
return result;
}
String tryPullResult(int jobId) {
debugPrint('try_pull_result jobId $jobId');
final result = convertUTF8ToString(pointer: _tryPullResultNative(jobId));
debugPrint('try_pull_result result $result');
return result;
}

View file

@ -0,0 +1,49 @@
class Destination {
final String amount;
final String address;
final String assetId;
Destination({required this.amount, required this.address, required this.assetId});
Map<String, dynamic> toJson() => {
"amount": amount,
"address": address,
"asset_id": assetId,
};
}
class TransferParams {
final List<Destination> destinations;
final int fee;
final int mixin;
final String paymentId;
final String comment;
final bool pushPayer;
final bool hideReceiver;
TransferParams({required this.destinations, required this.fee, required this.mixin, required this.paymentId, required this.comment, required this.pushPayer, required this.hideReceiver});
Map<String, dynamic> toJson() => {
"destinations": destinations,
"fee": fee,
"mixin": mixin,
"payment_id": paymentId,
"comment": comment,
"push_payer": pushPayer,
"hide_receiver": hideReceiver,
};
}
class GetRecentTxsAndInfoParams {
final int offset;
final int count;
final bool updateProvisionInfo;
GetRecentTxsAndInfoParams({required this.offset, required this.count, required this.updateProvisionInfo});
Map<String, dynamic> toJson() => {
"offset": offset,
"count": count,
"update_provision_info": updateProvisionInfo,
};
}

View file

@ -3,7 +3,7 @@ import 'package:cw_zano/api/structs/pending_transaction.dart';
import 'package:cw_zano/api/structs/ut8_box.dart'; import 'package:cw_zano/api/structs/ut8_box.dart';
import 'package:ffi/ffi.dart'; import 'package:ffi/ffi.dart';
typedef create_wallet = Int8 Function( typedef create_wallet = Pointer<Utf8> Function(
Pointer<Utf8>, Pointer<Utf8>, Pointer<Utf8>, Int32, Pointer<Utf8>); Pointer<Utf8>, Pointer<Utf8>, Pointer<Utf8>, Int32, Pointer<Utf8>);
typedef restore_wallet_from_seed = Int8 Function( typedef restore_wallet_from_seed = Int8 Function(
@ -47,7 +47,7 @@ typedef get_node_height = Int64 Function();
typedef is_connected = Int8 Function(); typedef is_connected = Int8 Function();
typedef setup_node = Int8 Function(Pointer<Utf8>, Pointer<Utf8>?, typedef setup_node = Int8 Function(Pointer<Utf8>, Pointer<Utf8>?,
Pointer<Utf8>?, Int8, Int8, Pointer<Utf8>?, Pointer<Utf8>); Pointer<Utf8>?, Int8, Int8, Pointer<Utf8>);
typedef start_refresh = Void Function(); typedef start_refresh = Void Function();
@ -107,7 +107,6 @@ typedef transaction_create = Int8 Function(
Pointer<Utf8> paymentId, Pointer<Utf8> paymentId,
Pointer<Utf8> amount, Pointer<Utf8> amount,
Int8 priorityRaw, Int8 priorityRaw,
Int32 subaddrAccount,
Pointer<Utf8Box> error, Pointer<Utf8Box> error,
Pointer<PendingTransactionRaw> pendingTransaction); Pointer<PendingTransactionRaw> pendingTransaction);
@ -118,7 +117,6 @@ typedef transaction_create_mult_dest = Int8 Function(
Pointer<Pointer<Utf8>> amounts, Pointer<Pointer<Utf8>> amounts,
Int32 size, Int32 size,
Int8 priorityRaw, Int8 priorityRaw,
Int32 subaddrAccount,
Pointer<Utf8Box> error, Pointer<Utf8Box> error,
Pointer<PendingTransactionRaw> pendingTransaction); Pointer<PendingTransactionRaw> pendingTransaction);

View file

@ -7,6 +7,7 @@ import 'package:cw_zano/api/zano_api.dart';
import 'package:cw_zano/api/structs/subaddress_row.dart'; import 'package:cw_zano/api/structs/subaddress_row.dart';
import 'package:cw_zano/api/wallet.dart'; import 'package:cw_zano/api/wallet.dart';
/**
final subaddressSizeNative = zanoApi final subaddressSizeNative = zanoApi
.lookup<NativeFunction<subaddrress_size>>('subaddrress_size') .lookup<NativeFunction<subaddrress_size>>('subaddrress_size')
.asFunction<SubaddressSize>(); .asFunction<SubaddressSize>();
@ -99,3 +100,4 @@ Future setLabelForSubaddress(
}); });
await store(); await store();
} }
*/

View file

@ -1,6 +1,6 @@
import 'dart:ffi'; import 'dart:ffi';
import 'package:cw_zano/api/convert_utf8_to_string.dart'; import 'package:cw_zano/api/convert_utf8_to_string.dart';
import 'package:cw_zano/api/monero_output.dart'; import 'package:cw_zano/api/zano_output.dart';
import 'package:cw_zano/api/structs/ut8_box.dart'; import 'package:cw_zano/api/structs/ut8_box.dart';
import 'package:ffi/ffi.dart'; import 'package:ffi/ffi.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
@ -11,13 +11,13 @@ import 'package:cw_zano/api/structs/transaction_info_row.dart';
import 'package:cw_zano/api/structs/pending_transaction.dart'; import 'package:cw_zano/api/structs/pending_transaction.dart';
import 'package:cw_zano/api/exceptions/creation_transaction_exception.dart'; import 'package:cw_zano/api/exceptions/creation_transaction_exception.dart';
final transactionsRefreshNative = zanoApi /**final transactionsRefreshNative = zanoApi
.lookup<NativeFunction<transactions_refresh>>('transactions_refresh') .lookup<NativeFunction<transactions_refresh>>('transactions_refresh')
.asFunction<TransactionsRefresh>(); .asFunction<TransactionsRefresh>();*/
final transactionsCountNative = zanoApi /**final transactionsCountNative = zanoApi
.lookup<NativeFunction<transactions_count>>('transactions_count') .lookup<NativeFunction<transactions_count>>('transactions_count')
.asFunction<TransactionsCount>(); .asFunction<TransactionsCount>();*/
final transactionsGetAllNative = zanoApi final transactionsGetAllNative = zanoApi
.lookup<NativeFunction<transactions_get_all>>('transactions_get_all') .lookup<NativeFunction<transactions_get_all>>('transactions_get_all')
@ -53,18 +53,29 @@ String getTxKey(String txId) {
return ''; return '';
} }
void refreshTransactions() => transactionsRefreshNative(); void refreshTransactions() {
// TODO: fix it
//transactionsRefreshNative();
debugPrint("refreshing transactions");
}
int countOfTransactions() => transactionsCountNative(); int countOfTransactions() {
//return transactionsCountNative();
// TODO: fix it
debugPrint("count of transactions");
return 0;
}
List<TransactionInfoRow> getAllTransations() { List<TransactionInfoRow> getAllTransations() {
final size = transactionsCountNative(); // TODO: fix it
return [];
/*final size = transactionsCountNative();
final transactionsPointer = transactionsGetAllNative(); final transactionsPointer = transactionsGetAllNative();
final transactionsAddresses = transactionsPointer.asTypedList(size); final transactionsAddresses = transactionsPointer.asTypedList(size);
return transactionsAddresses return transactionsAddresses
.map((addr) => Pointer<TransactionInfoRow>.fromAddress(addr).ref) .map((addr) => Pointer<TransactionInfoRow>.fromAddress(addr).ref)
.toList(); .toList();*/
} }
PendingTransactionDescription createTransactionSync( PendingTransactionDescription createTransactionSync(
@ -72,8 +83,7 @@ PendingTransactionDescription createTransactionSync(
required String assetType, required String assetType,
required String paymentId, required String paymentId,
required int priorityRaw, required int priorityRaw,
String? amount, String? amount}) {
int accountIndex = 0}) {
final addressPointer = address.toNativeUtf8(); final addressPointer = address.toNativeUtf8();
final assetTypePointer = assetType.toNativeUtf8(); final assetTypePointer = assetType.toNativeUtf8();
final paymentIdPointer = paymentId.toNativeUtf8(); final paymentIdPointer = paymentId.toNativeUtf8();
@ -86,7 +96,6 @@ PendingTransactionDescription createTransactionSync(
paymentIdPointer, paymentIdPointer,
amountPointer, amountPointer,
priorityRaw, priorityRaw,
accountIndex,
errorMessagePointer, errorMessagePointer,
pendingTransactionRawPointer) != pendingTransactionRawPointer) !=
0; 0;
@ -113,11 +122,10 @@ PendingTransactionDescription createTransactionSync(
} }
PendingTransactionDescription createTransactionMultDestSync( PendingTransactionDescription createTransactionMultDestSync(
{required List<MoneroOutput> outputs, {required List<ZanoOutput> outputs,
required String assetType, required String assetType,
required String paymentId, required String paymentId,
required int priorityRaw, required int priorityRaw}) {
int accountIndex = 0}) {
final int size = outputs.length; final int size = outputs.length;
final List<Pointer<Utf8>> addressesPointers = final List<Pointer<Utf8>> addressesPointers =
outputs.map((output) => output.address.toNativeUtf8()).toList(); outputs.map((output) => output.address.toNativeUtf8()).toList();
@ -142,7 +150,6 @@ PendingTransactionDescription createTransactionMultDestSync(
amountsPointerPointer, amountsPointerPointer,
size, size,
priorityRaw, priorityRaw,
accountIndex,
errorMessagePointer, errorMessagePointer,
pendingTransactionRawPointer) != pendingTransactionRawPointer) !=
0; 0;
@ -193,30 +200,26 @@ PendingTransactionDescription _createTransactionSync(Map args) {
final paymentId = args['paymentId'] as String; final paymentId = args['paymentId'] as String;
final amount = args['amount'] as String; final amount = args['amount'] as String;
final priorityRaw = args['priorityRaw'] as int; final priorityRaw = args['priorityRaw'] as int;
final accountIndex = args['accountIndex'] as int;
return createTransactionSync( return createTransactionSync(
address: address, address: address,
assetType: assetType, assetType: assetType,
paymentId: paymentId, paymentId: paymentId,
amount: amount, amount: amount,
priorityRaw: priorityRaw, priorityRaw: priorityRaw);
accountIndex: accountIndex);
} }
PendingTransactionDescription _createTransactionMultDestSync(Map args) { PendingTransactionDescription _createTransactionMultDestSync(Map args) {
final outputs = args['outputs'] as List<MoneroOutput>; final outputs = args['outputs'] as List<ZanoOutput>;
final assetType = args['assetType'] as String; final assetType = args['assetType'] as String;
final paymentId = args['paymentId'] as String; final paymentId = args['paymentId'] as String;
final priorityRaw = args['priorityRaw'] as int; final priorityRaw = args['priorityRaw'] as int;
final accountIndex = args['accountIndex'] as int;
return createTransactionMultDestSync( return createTransactionMultDestSync(
outputs: outputs, outputs: outputs,
assetType: assetType, assetType: assetType,
paymentId: paymentId, paymentId: paymentId,
priorityRaw: priorityRaw, priorityRaw: priorityRaw);
accountIndex: accountIndex);
} }
Future<PendingTransactionDescription> createTransaction( Future<PendingTransactionDescription> createTransaction(
@ -224,27 +227,23 @@ Future<PendingTransactionDescription> createTransaction(
required String assetType, required String assetType,
required int priorityRaw, required int priorityRaw,
String? amount, String? amount,
String paymentId = '', String paymentId = ''}) =>
int accountIndex = 0}) =>
compute(_createTransactionSync, { compute(_createTransactionSync, {
'address': address, 'address': address,
'assetType': assetType, 'assetType': assetType,
'paymentId': paymentId, 'paymentId': paymentId,
'amount': amount, 'amount': amount,
'priorityRaw': priorityRaw, 'priorityRaw': priorityRaw,
'accountIndex': accountIndex
}); });
Future<PendingTransactionDescription> createTransactionMultDest( Future<PendingTransactionDescription> createTransactionMultDest(
{required List<MoneroOutput> outputs, {required List<ZanoOutput> outputs,
required int priorityRaw, required int priorityRaw,
String? assetType, String? assetType,
String paymentId = '', String paymentId = ''}) =>
int accountIndex = 0}) =>
compute(_createTransactionMultDestSync, { compute(_createTransactionMultDestSync, {
'outputs': outputs, 'outputs': outputs,
'assetType': assetType, 'assetType': assetType,
'paymentId': paymentId, 'paymentId': paymentId,
'priorityRaw': priorityRaw, 'priorityRaw': priorityRaw,
'accountIndex': accountIndex
}); });

View file

@ -3,7 +3,7 @@ import 'package:cw_zano/api/structs/pending_transaction.dart';
import 'package:cw_zano/api/structs/ut8_box.dart'; import 'package:cw_zano/api/structs/ut8_box.dart';
import 'package:ffi/ffi.dart'; import 'package:ffi/ffi.dart';
typedef CreateWallet = int Function( typedef CreateWallet = Pointer<Utf8> Function(
Pointer<Utf8>, Pointer<Utf8>, Pointer<Utf8>, int, Pointer<Utf8>); Pointer<Utf8>, Pointer<Utf8>, Pointer<Utf8>, int, Pointer<Utf8>);
typedef RestoreWalletFromSeed = int Function( typedef RestoreWalletFromSeed = int Function(
@ -47,7 +47,7 @@ typedef GetNodeHeight = int Function();
typedef IsConnected = int Function(); typedef IsConnected = int Function();
typedef SetupNode = int Function(Pointer<Utf8>, Pointer<Utf8>?, Pointer<Utf8>?, typedef SetupNode = int Function(Pointer<Utf8>, Pointer<Utf8>?, Pointer<Utf8>?,
int, int, Pointer<Utf8>?, Pointer<Utf8>); int, int, Pointer<Utf8>);
typedef StartRefresh = void Function(); typedef StartRefresh = void Function();
@ -105,7 +105,6 @@ typedef TransactionCreate = int Function(
Pointer<Utf8> paymentId, Pointer<Utf8> paymentId,
Pointer<Utf8> amount, Pointer<Utf8> amount,
int priorityRaw, int priorityRaw,
int subaddrAccount,
Pointer<Utf8Box> error, Pointer<Utf8Box> error,
Pointer<PendingTransactionRaw> pendingTransaction); Pointer<PendingTransactionRaw> pendingTransaction);
@ -116,7 +115,6 @@ typedef TransactionCreateMultDest = int Function(
Pointer<Pointer<Utf8>> amounts, Pointer<Pointer<Utf8>> amounts,
int size, int size,
int priorityRaw, int priorityRaw,
int subaddrAccount,
Pointer<Utf8Box> error, Pointer<Utf8Box> error,
Pointer<PendingTransactionRaw> pendingTransaction); Pointer<PendingTransactionRaw> pendingTransaction);

View file

@ -6,6 +6,7 @@ import 'package:cw_zano/api/convert_utf8_to_string.dart';
import 'package:cw_zano/api/signatures.dart'; import 'package:cw_zano/api/signatures.dart';
import 'package:cw_zano/api/types.dart'; import 'package:cw_zano/api/types.dart';
import 'package:cw_zano/api/zano_api.dart'; import 'package:cw_zano/api/zano_api.dart';
import 'package:cw_zano/api/calls.dart' as calls;
import 'package:cw_zano/api/exceptions/setup_wallet_exception.dart'; import 'package:cw_zano/api/exceptions/setup_wallet_exception.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
@ -16,8 +17,8 @@ final getFileNameNative = zanoApi
.lookup<NativeFunction<get_filename>>('get_filename') .lookup<NativeFunction<get_filename>>('get_filename')
.asFunction<GetFilename>(); .asFunction<GetFilename>();
final getSeedNative = /*final getSeedNative =
zanoApi.lookup<NativeFunction<get_seed>>('seed').asFunction<GetSeed>(); zanoApi.lookup<NativeFunction<get_seed>>('seed').asFunction<GetSeed>();*/
final getAddressNative = zanoApi final getAddressNative = zanoApi
.lookup<NativeFunction<get_address>>('get_address') .lookup<NativeFunction<get_address>>('get_address')
@ -31,9 +32,9 @@ final getUnlockedBalanceNative = zanoApi
.lookup<NativeFunction<get_unlocked_balanace>>('get_unlocked_balance') .lookup<NativeFunction<get_unlocked_balanace>>('get_unlocked_balance')
.asFunction<GetUnlockedBalance>(); .asFunction<GetUnlockedBalance>();
final getCurrentHeightNative = zanoApi /**final getCurrentHeightNative = zanoApi
.lookup<NativeFunction<get_current_height>>('get_current_height') .lookup<NativeFunction<get_current_height>>('get_current_height')
.asFunction<GetCurrentHeight>(); .asFunction<GetCurrentHeight>();*/
final getNodeHeightNative = zanoApi final getNodeHeightNative = zanoApi
.lookup<NativeFunction<get_node_height>>('get_node_height') .lookup<NativeFunction<get_node_height>>('get_node_height')
@ -72,9 +73,9 @@ final setPasswordNative = zanoApi
.lookup<NativeFunction<set_password>>('set_password') .lookup<NativeFunction<set_password>>('set_password')
.asFunction<SetPassword>(); .asFunction<SetPassword>();
final setListenerNative = zanoApi /**final setListenerNative = zanoApi
.lookup<NativeFunction<set_listener>>('set_listener') .lookup<NativeFunction<set_listener>>('set_listener')
.asFunction<SetListener>(); .asFunction<SetListener>();*/
final getSyncingHeightNative = zanoApi final getSyncingHeightNative = zanoApi
.lookup<NativeFunction<get_syncing_height>>('get_syncing_height') .lookup<NativeFunction<get_syncing_height>>('get_syncing_height')
@ -133,7 +134,7 @@ bool isNewTransactionExist() => isNewTransactionExistNative() != 0;
String getFilename() => convertUTF8ToString(pointer: getFileNameNative()); String getFilename() => convertUTF8ToString(pointer: getFileNameNative());
String getSeed() => convertUTF8ToString(pointer: getSeedNative()); /**String getSeed() => convertUTF8ToString(pointer: getSeedNative());*/
String getAddress({int accountIndex = 0, int addressIndex = 0}) => String getAddress({int accountIndex = 0, int addressIndex = 0}) =>
convertUTF8ToString(pointer: getAddressNative(accountIndex, addressIndex)); convertUTF8ToString(pointer: getAddressNative(accountIndex, addressIndex));
@ -144,7 +145,11 @@ int getFullBalance({int accountIndex = 0}) =>
int getUnlockedBalance({int accountIndex = 0}) => int getUnlockedBalance({int accountIndex = 0}) =>
getUnlockedBalanceNative(accountIndex); getUnlockedBalanceNative(accountIndex);
int getCurrentHeight() => getCurrentHeightNative(); int getCurrentHeight(int hWallet) {
calls.getWalletStatus(hWallet);
return -1;
//return getCurrentHeightNative();
}
int getNodeHeightSync() => getNodeHeightNative(); int getNodeHeightSync() => getNodeHeightNative();
@ -156,7 +161,7 @@ bool setupNodeSync(
String? password, String? password,
bool useSSL = false, bool useSSL = false,
bool isLightWallet = false, bool isLightWallet = false,
String? socksProxyAddress}) { /*String? socksProxyAddress*/}) {
final addressPointer = address.toNativeUtf8(); final addressPointer = address.toNativeUtf8();
Pointer<Utf8>? loginPointer; Pointer<Utf8>? loginPointer;
Pointer<Utf8>? socksProxyAddressPointer; Pointer<Utf8>? socksProxyAddressPointer;
@ -170,20 +175,23 @@ bool setupNodeSync(
passwordPointer = password.toNativeUtf8(); passwordPointer = password.toNativeUtf8();
} }
if (socksProxyAddress != null) { /*if (socksProxyAddress != null) {
socksProxyAddressPointer = socksProxyAddress.toNativeUtf8(); socksProxyAddressPointer = socksProxyAddress.toNativeUtf8();
} }*/
final errorMessagePointer = ''.toNativeUtf8(); final errorMessagePointer = ''.toNativeUtf8();
debugPrint("setup_node address $address login $login password $password useSSL $useSSL isLightWallet $isLightWallet");
// TODO: here can be ZERO! upd: no
final isSetupNode = setupNodeNative( final isSetupNode = setupNodeNative(
addressPointer, addressPointer,
loginPointer, loginPointer,
passwordPointer, passwordPointer,
_boolToInt(useSSL), _boolToInt(useSSL),
_boolToInt(isLightWallet), _boolToInt(isLightWallet),
socksProxyAddressPointer, /*socksProxyAddressPointer,*/
errorMessagePointer) != errorMessagePointer) !=
0; 0;
debugPrint("setup_node result $isSetupNode");
calloc.free(addressPointer); calloc.free(addressPointer);
@ -195,10 +203,11 @@ bool setupNodeSync(
calloc.free(passwordPointer); calloc.free(passwordPointer);
} }
if (!isSetupNode) { // TODO: fix it
/**if (!isSetupNode) {
throw SetupWalletException( throw SetupWalletException(
message: convertUTF8ToString(pointer: errorMessagePointer)); message: convertUTF8ToString(pointer: errorMessagePointer));
} }*/
return isSetupNode; return isSetupNode;
} }
@ -213,10 +222,12 @@ void setRefreshFromBlockHeight({required int height}) =>
void setRecoveringFromSeed({required bool isRecovery}) => void setRecoveringFromSeed({required bool isRecovery}) =>
setRecoveringFromSeedNative(_boolToInt(isRecovery)); setRecoveringFromSeedNative(_boolToInt(isRecovery));
void storeSync() { void storeSync(int hWallet) {
final pathPointer = ''.toNativeUtf8(); calls.store(hWallet);
// TODO: fixit
/*final pathPointer = ''.toNativeUtf8();
storeNative(pathPointer); storeNative(pathPointer);
calloc.free(pathPointer); calloc.free(pathPointer);*/
} }
void setPasswordSync(String password) { void setPasswordSync(String password) {
@ -283,7 +294,8 @@ class SyncListener {
var syncHeight = getSyncingHeight(); var syncHeight = getSyncingHeight();
if (syncHeight <= 0) { if (syncHeight <= 0) {
syncHeight = getCurrentHeight(); // TODO: fix it
syncHeight = getCurrentHeight(-1);
} }
if (_initialSyncHeight <= 0) { if (_initialSyncHeight <= 0) {
@ -317,13 +329,13 @@ class SyncListener {
SyncListener setListeners(void Function(int, int, double) onNewBlock, SyncListener setListeners(void Function(int, int, double) onNewBlock,
void Function() onNewTransaction) { void Function() onNewTransaction) {
final listener = SyncListener(onNewBlock, onNewTransaction); final listener = SyncListener(onNewBlock, onNewTransaction);
setListenerNative(); /**setListenerNative();*/
return listener; return listener;
} }
void onStartup() => onStartupNative(); void onStartup() => onStartupNative();
void _storeSync(Object _) => storeSync(); void _storeSync(int hWallet) => storeSync(hWallet);
bool _setupNodeSync(Map args) { bool _setupNodeSync(Map args) {
final address = args['address'] as String; final address = args['address'] as String;
@ -331,7 +343,7 @@ bool _setupNodeSync(Map args) {
final password = (args['password'] ?? '') as String; final password = (args['password'] ?? '') as String;
final useSSL = args['useSSL'] as bool; final useSSL = args['useSSL'] as bool;
final isLightWallet = args['isLightWallet'] as bool; final isLightWallet = args['isLightWallet'] as bool;
final socksProxyAddress = (args['socksProxyAddress'] ?? '') as String; /*final socksProxyAddress = (args['socksProxyAddress'] ?? '') as String;*/
return setupNodeSync( return setupNodeSync(
address: address, address: address,
@ -339,7 +351,7 @@ bool _setupNodeSync(Map args) {
password: password, password: password,
useSSL: useSSL, useSSL: useSSL,
isLightWallet: isLightWallet, isLightWallet: isLightWallet,
socksProxyAddress: socksProxyAddress); /*socksProxyAddress: socksProxyAddress*/);
} }
bool _isConnected(Object _) => isConnectedSync(); bool _isConnected(Object _) => isConnectedSync();
@ -348,23 +360,23 @@ int _getNodeHeight(Object _) => getNodeHeightSync();
void startRefresh() => startRefreshSync(); void startRefresh() => startRefreshSync();
Future<void> setupNode( Future<bool> setupNode(
{required String address, {required String address,
String? login, String? login,
String? password, String? password,
bool useSSL = false, bool useSSL = false,
String? socksProxyAddress, /*String? socksProxyAddress,*/
bool isLightWallet = false}) => bool isLightWallet = false}) =>
compute<Map<String, Object?>, void>(_setupNodeSync, { compute<Map<String, Object?>, bool>(_setupNodeSync, {
'address': address, 'address': address,
'login': login, 'login': login,
'password': password, 'password': password,
'useSSL': useSSL, 'useSSL': useSSL,
'isLightWallet': isLightWallet, 'isLightWallet': isLightWallet,
'socksProxyAddress': socksProxyAddress //'socksProxyAddress': socksProxyAddress
}); });
Future<void> store() => compute<int, void>(_storeSync, 0); Future<void> store(int hWallet) => compute<int, void>(_storeSync, 0);
Future<bool> isConnected() => compute(_isConnected, 0); Future<bool> isConnected() => compute(_isConnected, 0);

View file

@ -37,7 +37,7 @@ final errorStringNative = zanoApi
.lookup<NativeFunction<error_string>>('error_string') .lookup<NativeFunction<error_string>>('error_string')
.asFunction<ErrorString>(); .asFunction<ErrorString>();
void createWalletSync( String createWalletSync(
{required String path, {required String path,
required String password, required String password,
required String language, required String language,
@ -46,20 +46,23 @@ void createWalletSync(
final passwordPointer = password.toNativeUtf8(); final passwordPointer = password.toNativeUtf8();
final languagePointer = language.toNativeUtf8(); final languagePointer = language.toNativeUtf8();
final errorMessagePointer = ''.toNativeUtf8(); final errorMessagePointer = ''.toNativeUtf8();
final isWalletCreated = createWalletNative(pathPointer, passwordPointer, debugPrint("create_wallet path $path password $password language $language");
languagePointer, nettype, errorMessagePointer) != final result = convertUTF8ToString(pointer: createWalletNative(pathPointer, passwordPointer,
0; languagePointer, nettype, errorMessagePointer));
//debugPrint("create_wallet $result");
calloc.free(pathPointer); calloc.free(pathPointer);
calloc.free(passwordPointer); calloc.free(passwordPointer);
calloc.free(languagePointer); calloc.free(languagePointer);
if (!isWalletCreated) { return result;
/*if (hWallet == 0) {
throw WalletCreationException( throw WalletCreationException(
message: convertUTF8ToString(pointer: errorMessagePointer)); message: convertUTF8ToString(pointer: errorMessagePointer));
} }
// setupNodeSync(address: "node.moneroworld.com:18089"); return hWallet;
// setupNodeSync(address: "node.moneroworld.com:18089");*/
} }
bool isWalletExistSync({required String path}) { bool isWalletExistSync({required String path}) {
@ -155,12 +158,12 @@ void loadWallet(
} }
} }
void _createWallet(Map<String, dynamic> args) { String _createWallet(Map<String, dynamic> args) {
final path = args['path'] as String; final path = args['path'] as String;
final password = args['password'] as String; final password = args['password'] as String;
final language = args['language'] as String; final language = args['language'] as String;
createWalletSync(path: path, password: password, language: language); return createWalletSync(path: path, password: password, language: language);
} }
void _restoreFromSeed(Map<String, dynamic> args) { void _restoreFromSeed(Map<String, dynamic> args) {
@ -206,12 +209,12 @@ void openWallet(
Future<void> openWalletAsync(Map<String, String> args) async => Future<void> openWalletAsync(Map<String, String> args) async =>
compute(_openWallet, args); compute(_openWallet, args);
Future<void> createWallet( Future<String> createWallet(
{required String path, {required String path,
required String password, required String password,
required String language, required String language,
int nettype = 0}) async => int nettype = 0}) async =>
compute(_createWallet, { compute<Map<String, dynamic>, String>(_createWallet, {
'path': path, 'path': path,
'password': password, 'password': password,
'language': language, 'language': language,

View file

@ -1,7 +1,7 @@
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
class MoneroOutput { class ZanoOutput {
MoneroOutput({required this.address, required this.amount}); ZanoOutput({required this.address, required this.amount});
final String address; final String address;
final String amount; final String amount;

View file

@ -3,11 +3,16 @@ import 'package:cw_core/account.dart';
import 'package:cw_core/account_list.dart'; import 'package:cw_core/account_list.dart';
import 'package:cw_zano/api/account_list.dart' as account_list; import 'package:cw_zano/api/account_list.dart' as account_list;
part 'zano_account_list.g.dart'; //part 'zano_account_list.g.dart';
/*
class ZanoAccountList = ZanoAccountListBase with _$ZanoAccountList; class ZanoAccountList = ZanoAccountListBase with _$ZanoAccountList;
abstract class ZanoAccountListBase extends AccountList<Account> with Store { abstract class ZanoAccountListBase extends AccountList<Account> with Store {
ZanoAccountListBase.simple()
: accounts = ObservableList<Account>(),
_isRefreshing = false,
_isUpdating = false {}
ZanoAccountListBase() ZanoAccountListBase()
: accounts = ObservableList<Account>(), : accounts = ObservableList<Account>(),
_isRefreshing = false, _isRefreshing = false,
@ -67,7 +72,7 @@ abstract class ZanoAccountListBase extends AccountList<Account> with Store {
@override @override
void refresh() { void refresh() {
if (_isRefreshing) { /**if (_isRefreshing) {
return; return;
} }
@ -80,5 +85,5 @@ abstract class ZanoAccountListBase extends AccountList<Account> with Store {
print(e); print(e);
rethrow; rethrow;
} }
} }*/
} }*/

View file

@ -1,16 +1,34 @@
import 'package:cw_core/balance.dart';
import 'package:cw_core/crypto_currency.dart'; import 'package:cw_core/crypto_currency.dart';
import 'package:cw_core/monero_balance.dart'; import 'package:cw_core/monero_balance.dart';
import 'package:cw_zano/api/balance_list.dart'; import 'package:cw_zano/api/balance_list.dart';
import 'package:cw_zano/api/structs/zano_balance_row.dart'; import 'package:cw_zano/api/structs/zano_balance_row.dart';
const inactiveBalances = [ class ZanoBalance extends Balance {
CryptoCurrency.xcad, ZanoBalance(super.available, super.additional);
CryptoCurrency.xjpy, late int unlockedBalance;
CryptoCurrency.xnok, @override
CryptoCurrency.xnzd // TODO: implement formattedAdditionalBalance
]; String get formattedAdditionalBalance {
// TODO: fix it
return "0";
}
Map<CryptoCurrency, MoneroBalance> getZanoBalance({required int accountIndex}) { @override
// TODO: implement formattedAvailableBalance
String get formattedAvailableBalance {
// TODO: fix it
return "0";
}
}
Map<CryptoCurrency, ZanoBalance> getZanoBalance() {
// TODO: fix it
return { CryptoCurrency.zano: ZanoBalance(0, 0) };
}
/*Map<CryptoCurrency, MoneroBalance> getZanoBalance({required int accountIndex}) {
final fullBalances = getZanoFullBalance(accountIndex: accountIndex); final fullBalances = getZanoFullBalance(accountIndex: accountIndex);
final unlockedBalances = getZanoUnlockedBalance(accountIndex: accountIndex); final unlockedBalances = getZanoUnlockedBalance(accountIndex: accountIndex);
final zanoBalances = <CryptoCurrency, MoneroBalance>{}; final zanoBalances = <CryptoCurrency, MoneroBalance>{};
@ -32,4 +50,4 @@ Map<CryptoCurrency, MoneroBalance> getZanoBalance({required int accountIndex}) {
} }
return zanoBalances; return zanoBalances;
} }*/

View file

@ -4,9 +4,9 @@ import 'package:mobx/mobx.dart';
import 'package:cw_zano/api/subaddress_list.dart' as subaddress_list; import 'package:cw_zano/api/subaddress_list.dart' as subaddress_list;
import 'package:cw_core/subaddress.dart'; import 'package:cw_core/subaddress.dart';
part 'zano_subaddress_list.g.dart'; //part 'zano_subaddress_list.g.dart';
class ZanoSubaddressList = ZanoSubaddressListBase with _$ZanoSubaddressList; /*class ZanoSubaddressList = ZanoSubaddressListBase with _$ZanoSubaddressList;
abstract class ZanoSubaddressListBase with Store { abstract class ZanoSubaddressListBase with Store {
ZanoSubaddressListBase() ZanoSubaddressListBase()
@ -85,4 +85,4 @@ abstract class ZanoSubaddressListBase with Store {
rethrow; rethrow;
} }
} }
} }*/

View file

@ -3,11 +3,13 @@ import 'dart:io';
import 'package:cw_core/crypto_currency.dart'; import 'package:cw_core/crypto_currency.dart';
import 'package:cw_core/pathForWallet.dart'; import 'package:cw_core/pathForWallet.dart';
import 'package:cw_core/transaction_priority.dart'; import 'package:cw_core/transaction_priority.dart';
import 'package:cw_zano/api/zano_output.dart';
import 'package:cw_zano/zano_transaction_creation_credentials.dart'; import 'package:cw_zano/zano_transaction_creation_credentials.dart';
import 'package:cw_core/monero_amount_format.dart'; import 'package:cw_core/monero_amount_format.dart';
import 'package:cw_zano/zano_transaction_creation_exception.dart'; import 'package:cw_zano/zano_transaction_creation_exception.dart';
import 'package:cw_zano/zano_transaction_info.dart'; import 'package:cw_zano/zano_transaction_info.dart';
import 'package:cw_zano/zano_wallet_addresses.dart'; import 'package:cw_zano/zano_wallet_addresses.dart';
import 'package:cw_zano/api/calls.dart' as calls;
import 'package:cw_core/monero_wallet_utils.dart'; import 'package:cw_core/monero_wallet_utils.dart';
import 'package:cw_zano/api/structs/pending_transaction.dart'; import 'package:cw_zano/api/structs/pending_transaction.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
@ -17,7 +19,7 @@ import 'package:cw_zano/api/transaction_history.dart'
//import 'package:cw_zano/wallet.dart'; //import 'package:cw_zano/wallet.dart';
import 'package:cw_zano/api/wallet.dart' as zano_wallet; import 'package:cw_zano/api/wallet.dart' as zano_wallet;
import 'package:cw_zano/api/transaction_history.dart' as transaction_history; import 'package:cw_zano/api/transaction_history.dart' as transaction_history;
import 'package:cw_zano/api/monero_output.dart'; import 'package:cw_zano/api/zano_output.dart';
import 'package:cw_zano/pending_zano_transaction.dart'; import 'package:cw_zano/pending_zano_transaction.dart';
import 'package:cw_core/monero_wallet_keys.dart'; import 'package:cw_core/monero_wallet_keys.dart';
import 'package:cw_core/monero_balance.dart'; import 'package:cw_core/monero_balance.dart';
@ -37,24 +39,35 @@ const moneroBlockSize = 1000;
class ZanoWallet = ZanoWalletBase with _$ZanoWallet; class ZanoWallet = ZanoWalletBase with _$ZanoWallet;
abstract class ZanoWalletBase extends WalletBase<MoneroBalance, abstract class ZanoWalletBase
ZanoTransactionHistory, ZanoTransactionInfo> with Store { extends WalletBase<ZanoBalance, ZanoTransactionHistory, ZanoTransactionInfo>
with Store {
ZanoWalletBase.simple({required WalletInfo walletInfo})
: balance = ObservableMap(),
_isTransactionUpdating = false,
_hasSyncAfterStartup = false,
walletAddresses = ZanoWalletAddresses(walletInfo),
syncStatus = NotConnectedSyncStatus(),
super(walletInfo) {
transactionHistory = ZanoTransactionHistory();
}
ZanoWalletBase({required WalletInfo walletInfo}) ZanoWalletBase({required WalletInfo walletInfo})
: balance = ObservableMap.of(getZanoBalance(accountIndex: 0)), : balance = ObservableMap.of({CryptoCurrency.zano: ZanoBalance(0, 0)}),
_isTransactionUpdating = false, _isTransactionUpdating = false,
_hasSyncAfterStartup = false, _hasSyncAfterStartup = false,
walletAddresses = ZanoWalletAddresses(walletInfo), walletAddresses = ZanoWalletAddresses(walletInfo),
syncStatus = NotConnectedSyncStatus(), syncStatus = NotConnectedSyncStatus(),
super(walletInfo) { super(walletInfo) {
transactionHistory = ZanoTransactionHistory(); transactionHistory = ZanoTransactionHistory();
_onAccountChangeReaction = /*_onAccountChangeReaction =
reaction((_) => walletAddresses.account, (Account? account) { reaction((_) => walletAddresses.account, (Account? account) {
if (account == null) { if (account == null) {
return; return;
} }
balance.addAll(getZanoBalance(accountIndex: account.id)); balance.addAll(getZanoBalance(accountIndex: account.id));
walletAddresses.updateSubaddressList(accountIndex: account.id); /**walletAddresses.updateSubaddressList(accountIndex: account.id);*/
}); });*/
} }
static const int _autoSaveInterval = 30; static const int _autoSaveInterval = 30;
@ -68,12 +81,18 @@ abstract class ZanoWalletBase extends WalletBase<MoneroBalance,
@override @override
@observable @observable
ObservableMap<CryptoCurrency, MoneroBalance> balance; ObservableMap<CryptoCurrency, ZanoBalance> balance;
@override @override
String get seed => zano_wallet.getSeed(); String get seed {
// TODO: fix it
//return calls.seed(hWallet);
return "test";
/**zano_wallet.getSeed();*/
}
@override @override
// TODO: ?? why monero
MoneroWalletKeys get keys => MoneroWalletKeys( MoneroWalletKeys get keys => MoneroWalletKeys(
privateSpendKey: zano_wallet.getSecretSpendKey(), privateSpendKey: zano_wallet.getSecretSpendKey(),
privateViewKey: zano_wallet.getSecretViewKey(), privateViewKey: zano_wallet.getSecretViewKey(),
@ -81,22 +100,30 @@ abstract class ZanoWalletBase extends WalletBase<MoneroBalance,
publicViewKey: zano_wallet.getPublicViewKey()); publicViewKey: zano_wallet.getPublicViewKey());
zano_wallet.SyncListener? _listener; zano_wallet.SyncListener? _listener;
ReactionDisposer? _onAccountChangeReaction; /**ReactionDisposer? _onAccountChangeReaction;*/
bool _isTransactionUpdating; bool _isTransactionUpdating;
bool _hasSyncAfterStartup; bool _hasSyncAfterStartup;
Timer? _autoSaveTimer; Timer? _autoSaveTimer;
int _hWallet = 0;
int get hWallet => _hWallet;
set hWallet(int value) {
_hWallet = value;
}
Future<void> init() async { Future<void> init() async {
await walletAddresses.init(); await walletAddresses.init();
balance balance
.addAll(getZanoBalance(accountIndex: walletAddresses.account?.id ?? 0)); .addAll(getZanoBalance(/**accountIndex: walletAddresses.account?.id ?? 0*/));
_setListeners(); _setListeners();
await updateTransactions(); await updateTransactions();
if (walletInfo.isRecovery) { if (walletInfo.isRecovery) {
zano_wallet.setRecoveringFromSeed(isRecovery: walletInfo.isRecovery); zano_wallet.setRecoveringFromSeed(isRecovery: walletInfo.isRecovery);
if (zano_wallet.getCurrentHeight() <= 1) { if (zano_wallet.getCurrentHeight(hWallet) <= 1) {
zano_wallet.setRefreshFromBlockHeight(height: walletInfo.restoreHeight); zano_wallet.setRefreshFromBlockHeight(height: walletInfo.restoreHeight);
} }
} }
@ -111,7 +138,7 @@ abstract class ZanoWalletBase extends WalletBase<MoneroBalance,
@override @override
void close() { void close() {
_listener?.stop(); _listener?.stop();
_onAccountChangeReaction?.reaction.dispose(); /**_onAccountChangeReaction?.reaction.dispose();*/
_autoSaveTimer?.cancel(); _autoSaveTimer?.cancel();
} }
@ -120,12 +147,13 @@ abstract class ZanoWalletBase extends WalletBase<MoneroBalance,
try { try {
syncStatus = ConnectingSyncStatus(); syncStatus = ConnectingSyncStatus();
await zano_wallet.setupNode( await zano_wallet.setupNode(
address: node.uriRaw, address: "195.201.107.230:33336", // node.uriRaw,
login: node.login, login: "", // node.login,
password: node.password, password: "", // node.password,
useSSL: node.useSSL ?? false, useSSL: false, // node.useSSL ?? false,
isLightWallet: false, // FIXME: hardcoded value isLightWallet: false, // FIXME: hardcoded value
socksProxyAddress: node.socksProxyAddress); /*socksProxyAddress: node.socksProxyAddress*/
);
zano_wallet.setTrustedDaemon(node.trusted); zano_wallet.setTrustedDaemon(node.trusted);
syncStatus = ConnectedSyncStatus(); syncStatus = ConnectedSyncStatus();
@ -160,7 +188,7 @@ abstract class ZanoWalletBase extends WalletBase<MoneroBalance,
final hasMultiDestination = outputs.length > 1; final hasMultiDestination = outputs.length > 1;
final assetType = final assetType =
CryptoCurrency.fromString(_credentials.assetType.toLowerCase()); CryptoCurrency.fromString(_credentials.assetType.toLowerCase());
final balances = getZanoBalance(accountIndex: walletAddresses.account!.id); final balances = getZanoBalance(/*accountIndex: walletAddresses.account!.id*/);
final unlockedBalance = balances[assetType]!.unlockedBalance; final unlockedBalance = balances[assetType]!.unlockedBalance;
PendingTransactionDescription pendingTransactionDescription; PendingTransactionDescription pendingTransactionDescription;
@ -184,17 +212,16 @@ abstract class ZanoWalletBase extends WalletBase<MoneroBalance,
'You do not have enough coins to send this amount.'); 'You do not have enough coins to send this amount.');
} }
final moneroOutputs = outputs final zanoOutputs = outputs
.map((output) => MoneroOutput( .map((output) => ZanoOutput(
address: output.address, address: output.address,
amount: output.cryptoAmount!.replaceAll(',', '.'))) amount: output.cryptoAmount!.replaceAll(',', '.')))
.toList(); .toList();
pendingTransactionDescription = pendingTransactionDescription =
await transaction_history.createTransactionMultDest( await transaction_history.createTransactionMultDest(
outputs: moneroOutputs, outputs: zanoOutputs,
priorityRaw: _credentials.priority.serialize(), priorityRaw: _credentials.priority.serialize());
accountIndex: walletAddresses.account!.id);
} else { } else {
final output = outputs.first; final output = outputs.first;
final address = output.isParsedAddress && final address = output.isParsedAddress &&
@ -219,8 +246,7 @@ abstract class ZanoWalletBase extends WalletBase<MoneroBalance,
address: address, address: address,
assetType: _credentials.assetType, assetType: _credentials.assetType,
amount: amount, amount: amount,
priorityRaw: _credentials.priority.serialize(), priorityRaw: _credentials.priority.serialize());
accountIndex: walletAddresses.account!.id);
} }
return PendingZanoTransaction(pendingTransactionDescription, assetType); return PendingZanoTransaction(pendingTransactionDescription, assetType);
@ -252,7 +278,7 @@ abstract class ZanoWalletBase extends WalletBase<MoneroBalance,
Future<void> save() async { Future<void> save() async {
await walletAddresses.updateAddressesInBox(); await walletAddresses.updateAddressesInBox();
await backupWalletFiles(name); await backupWalletFiles(name);
await zano_wallet.store(); await zano_wallet.store(hWallet);
} }
@override @override
@ -301,7 +327,7 @@ abstract class ZanoWalletBase extends WalletBase<MoneroBalance,
zano_wallet.rescanBlockchainAsync(); zano_wallet.rescanBlockchainAsync();
await startSync(); await startSync();
_askForUpdateBalance(); _askForUpdateBalance();
walletAddresses.accountList.update(); /**walletAddresses.accountList.update();*/
await _askForUpdateTransactionHistory(); await _askForUpdateTransactionHistory();
await save(); await save();
await walletInfo.save(); await walletInfo.save();
@ -355,7 +381,7 @@ abstract class ZanoWalletBase extends WalletBase<MoneroBalance,
return; return;
} }
final currentHeight = zano_wallet.getCurrentHeight(); final currentHeight = zano_wallet.getCurrentHeight(hWallet);
if (currentHeight <= 1) { if (currentHeight <= 1) {
final height = _getHeightByDate(walletInfo.date); final height = _getHeightByDate(walletInfo.date);
@ -385,7 +411,7 @@ abstract class ZanoWalletBase extends WalletBase<MoneroBalance,
} }
void _askForUpdateBalance() => void _askForUpdateBalance() =>
balance.addAll(getZanoBalance(accountIndex: walletAddresses.account!.id)); balance.addAll(getZanoBalance());
Future<void> _askForUpdateTransactionHistory() async => Future<void> _askForUpdateTransactionHistory() async =>
await updateTransactions(); await updateTransactions();
@ -395,13 +421,13 @@ abstract class ZanoWalletBase extends WalletBase<MoneroBalance,
if (walletInfo.isRecovery) { if (walletInfo.isRecovery) {
await _askForUpdateTransactionHistory(); await _askForUpdateTransactionHistory();
_askForUpdateBalance(); _askForUpdateBalance();
walletAddresses.accountList.update(); /*walletAddresses.accountList.update();*/
} }
if (blocksLeft < 1000) { if (blocksLeft < 1000) {
await _askForUpdateTransactionHistory(); await _askForUpdateTransactionHistory();
_askForUpdateBalance(); _askForUpdateBalance();
walletAddresses.accountList.update(); /*walletAddresses.accountList.update();*/
syncStatus = SyncedSyncStatus(); syncStatus = SyncedSyncStatus();
if (!_hasSyncAfterStartup) { if (!_hasSyncAfterStartup) {

View file

@ -1,4 +1,4 @@
import 'package:cw_core/wallet_addresses_with_account.dart'; import 'package:cw_core/wallet_addresses.dart';
import 'package:cw_core/wallet_info.dart'; import 'package:cw_core/wallet_info.dart';
import 'package:cw_core/account.dart'; import 'package:cw_core/account.dart';
import 'package:cw_zano/zano_account_list.dart'; import 'package:cw_zano/zano_account_list.dart';
@ -10,12 +10,10 @@ part 'zano_wallet_addresses.g.dart';
class ZanoWalletAddresses = ZanoWalletAddressesBase with _$ZanoWalletAddresses; class ZanoWalletAddresses = ZanoWalletAddressesBase with _$ZanoWalletAddresses;
abstract class ZanoWalletAddressesBase /**abstract class ZanoWalletAddressesBase extends WalletAddressesWithAccount<Account> with Store {*/
extends WalletAddressesWithAccount<Account> with Store { abstract class ZanoWalletAddressesBase extends WalletAddresses with Store {
ZanoWalletAddressesBase(WalletInfo walletInfo) ZanoWalletAddressesBase(WalletInfo walletInfo)
: accountList = ZanoAccountList(), : address = '',
subaddressList = ZanoSubaddressList(),
address = '',
super(walletInfo); super(walletInfo);
@override @override
@ -23,65 +21,68 @@ abstract class ZanoWalletAddressesBase
String address; String address;
// @override // @override
@observable /**@observable
Account? account; Account? account;*/
@observable /**@observable
Subaddress? subaddress; Subaddress? subaddress;*/
ZanoSubaddressList subaddressList; /**ZanoSubaddressList subaddressList;*/
ZanoAccountList accountList; /**ZanoAccountList accountList;*/
@override @override
Future<void> init() async { Future<void> init() async {
accountList.update(); /*accountList.update();
account = accountList.accounts.first; account = accountList.accounts.first;*/
updateSubaddressList(accountIndex: account?.id ?? 0); /**updateSubaddressList(accountIndex: account?.id ?? 0);*/
address = walletInfo.address;
await updateAddressesInBox(); await updateAddressesInBox();
} }
@override @override
Future<void> updateAddressesInBox() async { Future<void> updateAddressesInBox() async {
try { try {
final _subaddressList = ZanoSubaddressList(); /**final _subaddressList = ZanoSubaddressList();*/
addressesMap.clear(); addressesMap.clear();
addressesMap[address] = '';
await saveAddressesInBox();
accountList.accounts.forEach((account) { /*accountList.accounts.forEach((account) {
_subaddressList.update(accountIndex: account.id); _subaddressList.update(accountIndex: account.id);
_subaddressList.subaddresses.forEach((subaddress) { _subaddressList.subaddresses.forEach((subaddress) {
addressesMap[subaddress.address] = subaddress.label; addressesMap[subaddress.address] = subaddress.label;
}); });
}); });
await saveAddressesInBox(); await saveAddressesInBox();*/
} catch (e) { } catch (e) {
print(e.toString()); print(e.toString());
} }
} }
bool validate() { // bool validate() {
accountList.update(); // accountList.update();
final accountListLength = accountList.accounts.length ?? 0; // final accountListLength = accountList.accounts.length ?? 0;
if (accountListLength <= 0) { // if (accountListLength <= 0) {
return false; // return false;
} // }
subaddressList.update(accountIndex: accountList.accounts.first.id); // /**subaddressList.update(accountIndex: accountList.accounts.first.id);
final subaddressListLength = subaddressList.subaddresses.length ?? 0; // final subaddressListLength = subaddressList.subaddresses.length ?? 0;
if (subaddressListLength <= 0) { // if (subaddressListLength <= 0) {
return false; // return false;
} // }*/
return true; // return true;
} // }
void updateSubaddressList({required int accountIndex}) { /*void updateSubaddressList({required int accountIndex}) {
subaddressList.update(accountIndex: accountIndex); subaddressList.update(accountIndex: accountIndex);
subaddress = subaddressList.subaddresses.first; subaddress = subaddressList.subaddresses.first;
address = subaddress!.address; address = subaddress!.address;
} }*/
} }

View file

@ -1,10 +1,12 @@
import 'dart:io'; import 'dart:io';
import 'package:collection/collection.dart'; import 'package:collection/collection.dart';
import 'package:cw_core/node.dart';
import 'package:cw_core/wallet_base.dart'; import 'package:cw_core/wallet_base.dart';
import 'package:cw_core/monero_wallet_utils.dart'; import 'package:cw_core/monero_wallet_utils.dart';
import 'package:hive/hive.dart'; import 'package:hive/hive.dart';
import 'package:cw_zano/api/wallet_manager.dart' as zano_wallet_manager; import 'package:cw_zano/api/wallet_manager.dart' as zano_wallet_manager;
import 'package:cw_zano/api/wallet.dart' as zano_wallet; import 'package:cw_zano/api/wallet.dart' as zano_wallet;
import 'package:cw_zano/api/calls.dart' as calls;
import 'package:cw_zano/api/exceptions/wallet_opening_exception.dart'; import 'package:cw_zano/api/exceptions/wallet_opening_exception.dart';
import 'package:cw_zano/zano_wallet.dart'; import 'package:cw_zano/zano_wallet.dart';
import 'package:cw_core/wallet_credentials.dart'; import 'package:cw_core/wallet_credentials.dart';
@ -14,11 +16,8 @@ import 'package:cw_core/wallet_info.dart';
import 'package:cw_core/wallet_type.dart'; import 'package:cw_core/wallet_type.dart';
class ZanoNewWalletCredentials extends WalletCredentials { class ZanoNewWalletCredentials extends WalletCredentials {
ZanoNewWalletCredentials( ZanoNewWalletCredentials({required String name, String? password})
{required String name, required this.language, String? password})
: super(name: name, password: password); : super(name: name, password: password);
final String language;
} }
class ZanoRestoreWalletFromSeedCredentials extends WalletCredentials { class ZanoRestoreWalletFromSeedCredentials extends WalletCredentials {
@ -65,18 +64,23 @@ class ZanoWalletService extends WalletService<
static bool walletFilesExist(String path) => static bool walletFilesExist(String path) =>
!File(path).existsSync() && !File('$path.keys').existsSync(); !File(path).existsSync() && !File('$path.keys').existsSync();
int hWallet = 0;
@override @override
WalletType getType() => WalletType.zano; WalletType getType() => WalletType.zano;
@override @override
Future<ZanoWallet> create(ZanoNewWalletCredentials credentials) async { Future<ZanoWallet> create(ZanoNewWalletCredentials credentials) async {
try { try {
final wallet = ZanoWallet.simple(walletInfo: credentials.walletInfo!);
wallet.connectToNode(node: Node());
final path = await pathForWallet(name: credentials.name, type: getType()); final path = await pathForWallet(name: credentials.name, type: getType());
await zano_wallet_manager.createWallet( final result = await zano_wallet_manager.createWallet(
path: path, language: "", path: path, password: credentials.password!);
password: credentials.password!, hWallet = -1;
language: credentials.language); wallet.hWallet = hWallet;
final wallet = ZanoWallet(walletInfo: credentials.walletInfo!); // TODO: remove it
calls.store(hWallet);
await wallet.init(); await wallet.init();
return wallet; return wallet;
} catch (e) { } catch (e) {
@ -112,13 +116,13 @@ class ZanoWalletService extends WalletService<
final walletInfo = walletInfoSource.values.firstWhereOrNull( final walletInfo = walletInfoSource.values.firstWhereOrNull(
(info) => info.id == WalletBase.idFor(name, getType()))!; (info) => info.id == WalletBase.idFor(name, getType()))!;
final wallet = ZanoWallet(walletInfo: walletInfo); final wallet = ZanoWallet(walletInfo: walletInfo);
final isValid = wallet.walletAddresses.validate(); /*final isValid = wallet.walletAddresses.validate();
if (!isValid) { if (!isValid) {
await restoreOrResetWalletFiles(name); await restoreOrResetWalletFiles(name);
wallet.close(); wallet.close();
return openWallet(name, password); return openWallet(name, password);
} }*/
await wallet.init(); await wallet.init();

View file

@ -34,7 +34,7 @@ class _DesktopWalletSelectionDropDownState extends State<DesktopWalletSelectionD
final havenIcon = Image.asset('assets/images/haven_logo.png', height: 24, width: 24); final havenIcon = Image.asset('assets/images/haven_logo.png', height: 24, width: 24);
final ethereumIcon = Image.asset('assets/images/eth_icon.png', height: 24, width: 24); final ethereumIcon = Image.asset('assets/images/eth_icon.png', height: 24, width: 24);
final zanoIcon = Image.asset('assets/images/zano_icon.png', height: 24, width: 24); final zanoIcon = Image.asset('assets/images/zano_icon.png', height: 24, width: 24);
final dummyIcon = Image.asset('assets/images/dummy_icon.png', height: 24, width: 24); final dummyIcon = Image.asset('assets/images/zano_icon.png', height: 24, width: 24);
final nonWalletTypeIcon = Image.asset('assets/images/close.png', height: 24, width: 24); final nonWalletTypeIcon = Image.asset('assets/images/close.png', height: 24, width: 24);
Image _newWalletImage(BuildContext context) => Image.asset( Image _newWalletImage(BuildContext context) => Image.asset(

View file

@ -31,7 +31,7 @@ class MenuWidgetState extends State<MenuWidget> {
this.havenIcon = Image.asset('assets/images/haven_menu.png'), this.havenIcon = Image.asset('assets/images/haven_menu.png'),
this.ethereumIcon = Image.asset('assets/images/eth_icon.png'), this.ethereumIcon = Image.asset('assets/images/eth_icon.png'),
this.zanoIcon = Image.asset('assets/images/zano_icon.png'), this.zanoIcon = Image.asset('assets/images/zano_icon.png'),
this.dummyIcon = Image.asset('assets/images/dummy_icon.png'); this.dummyIcon = Image.asset('assets/images/zano_icon.png');
final largeScreen = 731; final largeScreen = 731;

View file

@ -49,7 +49,7 @@ class WalletListBodyState extends State<WalletListBody> {
final havenIcon = Image.asset('assets/images/haven_logo.png', height: 24, width: 24); final havenIcon = Image.asset('assets/images/haven_logo.png', height: 24, width: 24);
final ethereumIcon = Image.asset('assets/images/eth_icon.png', height: 24, width: 24); final ethereumIcon = Image.asset('assets/images/eth_icon.png', height: 24, width: 24);
final zanoIcon = Image.asset('assets/images/zano_icon.png', height: 24, width: 24); final zanoIcon = Image.asset('assets/images/zano_icon.png', height: 24, width: 24);
final dummyIcon = Image.asset('assets/images/dummy_icon.png', height: 24, width: 24); final dummyIcon = Image.asset('assets/images/zano_icon.png', height: 24, width: 24);
final scrollController = ScrollController(); final scrollController = ScrollController();
final double tileHeight = 60; final double tileHeight = 60;
Flushbar<void>? _progressBar; Flushbar<void>? _progressBar;

View file

@ -48,8 +48,7 @@ abstract class WalletNewVMBase extends WalletCreationVM with Store {
case WalletType.ethereum: case WalletType.ethereum:
return ethereum!.createEthereumNewWalletCredentials(name: name); return ethereum!.createEthereumNewWalletCredentials(name: name);
case WalletType.zano: case WalletType.zano:
return zano!.createZanoNewWalletCredentials( return zano!.createZanoNewWalletCredentials(name: name);
name: name, language: "en");
case WalletType.dummy: case WalletType.dummy:
return dummy!.createDummyNewWalletCredentials(name: name); return dummy!.createDummyNewWalletCredentials(name: name);
default: default:

146
lib/zano.dart Normal file
View file

@ -0,0 +1,146 @@
import 'dart:async';
import 'dart:convert';
import 'package:cake_wallet/core/generate_wallet_password.dart';
import 'package:cake_wallet/core/key_service.dart';
import 'package:cake_wallet/utils/exception_handler.dart';
import 'package:cw_core/pathForWallet.dart';
import 'package:cw_core/wallet_type.dart';
import 'package:cw_zano/api/wallet.dart' as zano_wallet;
import 'package:cw_zano/api/wallet_manager.dart' as zano_wallet_manager;
import 'package:cw_zano/api/calls.dart' as calls;
import 'package:cw_zano/zano_wallet_service.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
import 'package:get_it/get_it.dart';
Future<void> main() async {
await runZonedGuarded(() async {
WidgetsFlutterBinding.ensureInitialized();
FlutterError.onError = ExceptionHandler.onError;
/// A callback that is invoked when an unhandled error occurs in the root
/// isolate.
PlatformDispatcher.instance.onError = (error, stack) {
ExceptionHandler.onError(
FlutterErrorDetails(exception: error, stack: stack));
return true;
};
await setup();
runApp(App());
}, (error, stackTrace) async {
ExceptionHandler.onError(
FlutterErrorDetails(exception: error, stack: stackTrace));
});
}
final getIt = GetIt.instance;
Future<void> setup() async {
getIt.registerFactory<KeyService>(
() => KeyService(getIt.get<FlutterSecureStorage>()));
}
class App extends StatefulWidget {
const App({super.key});
@override
State<App> createState() => _AppState();
}
class HomeWidget extends StatefulWidget {
const HomeWidget({super.key});
@override
State<HomeWidget> createState() => _HomeWidgetState();
}
class _AppState extends State<App> {
@override
Widget build(BuildContext context) {
return MaterialApp(home: HomeWidget());
}
}
class _HomeWidgetState extends State<HomeWidget> {
@override
Widget build(BuildContext context) {
return Scaffold(
body: FutureBuilder(
future: connect(),
builder: (context, snapshot) {
if (!snapshot.hasData) return CircularProgressIndicator();
return Center(child: Text("connected"));
},
),
);
}
static const name = "leo1";
Future<bool> connect() async {
calls.getVersion();
final setupNode = await zano_wallet.setupNode(
address: "195.201.107.230:33336",
login: "",
password: "",
useSSL: false,
isLightWallet: false);
final path = await pathForWallet(name: name, type: WalletType.zano);
final credentials = ZanoNewWalletCredentials(name: name);
final keyService = KeyService(FlutterSecureStorage());
final password = await keyService.getWalletPassword(walletName: credentials.name);
debugPrint("path $path password $password");
final result = await calls.loadWallet(path, password, 0);
final map = json.decode(result) as Map<String, dynamic>;
int hWallet = 0;
if (map["result"] != null) {
hWallet = (map["result"] as Map<String, dynamic>)["wallet_id"] as int;
debugPrint("hWallet $hWallet");
}
Future.delayed(Duration(seconds: 10));
await calls.getWalletStatus(hWallet);
Future.delayed(Duration(seconds: 10));
await calls.getRecentTxsAndInfo(hWallet: hWallet, offset: 0, count: 30);
Future.delayed(Duration(seconds: 2));
calls.closeWallet(hWallet);
return true;
}
Future<bool> _connect() async {
calls.getVersion();
final result = await zano_wallet.setupNode(
address: "195.201.107.230:33336",
login: "",
password: "",
useSSL: false,
isLightWallet: false);
//debugPrint("setup node result ${result}");
//final name = "leo1";
final path = await pathForWallet(name: name, type: WalletType.zano);
final credentials = ZanoNewWalletCredentials(name: name);
final keyService = KeyService(FlutterSecureStorage());
final password = generateWalletPassword();
credentials.password = password;
await keyService.saveWalletPassword(
password: password, walletName: credentials.name);
final createResult = await zano_wallet_manager.createWallet(
language: "", path: path, password: credentials.password!);
debugPrint("createWallet result $createResult");
final map = json.decode(createResult) as Map<String, dynamic>;
int hWallet = -1;
if (map["result"] != null) {
hWallet = (map["result"] as Map<String, dynamic>)["wallet_id"] as int;
debugPrint("hWallet $hWallet");
}
//await calls.loadWallet(path, password, 0);
calls.getConnectivityStatus();
await calls.store(hWallet);
calls.getWalletInfo(hWallet);
calls.getWalletStatus(hWallet);
return true;
}
}

View file

@ -1,6 +1,6 @@
part of 'zano.dart'; part of 'zano.dart';
class CWZanoAccountList extends ZanoAccountList { /**class CWZanoAccountList extends ZanoAccountList {
CWZanoAccountList(this._wallet); CWZanoAccountList(this._wallet);
final Object _wallet; final Object _wallet;
@ -49,73 +49,20 @@ class CWZanoAccountList extends ZanoAccountList {
await zanoWallet.walletAddresses.accountList await zanoWallet.walletAddresses.accountList
.setLabelAccount(accountIndex: accountIndex, label: label); .setLabelAccount(accountIndex: accountIndex, label: label);
} }
} }*/
class CWZanoSubaddressList extends MoneroSubaddressList {
CWZanoSubaddressList(this._wallet);
final Object _wallet;
@override
@computed
ObservableList<Subaddress> get subaddresses {
final zanoWallet = _wallet as ZanoWallet;
final subAddresses = zanoWallet.walletAddresses.subaddressList.subaddresses
.map((sub) => Subaddress(id: sub.id, address: sub.address, label: sub.label))
.toList();
return ObservableList<Subaddress>.of(subAddresses);
}
@override
void update(Object wallet, {required int accountIndex}) {
final zanoWallet = wallet as ZanoWallet;
zanoWallet.walletAddresses.subaddressList.update(accountIndex: accountIndex);
}
@override
void refresh(Object wallet, {required int accountIndex}) {
final zanoWallet = wallet as ZanoWallet;
zanoWallet.walletAddresses.subaddressList.refresh(accountIndex: accountIndex);
}
@override
List<Subaddress> getAll(Object wallet) {
final zanoWallet = wallet as ZanoWallet;
return zanoWallet.walletAddresses.subaddressList
.getAll()
.map((sub) => Subaddress(id: sub.id, label: sub.label, address: sub.address))
.toList();
}
@override
Future<void> addSubaddress(Object wallet,
{required int accountIndex, required String label}) async {
final zanoWallet = wallet as ZanoWallet;
await zanoWallet.walletAddresses.subaddressList
.addSubaddress(accountIndex: accountIndex, label: label);
}
@override
Future<void> setLabelSubaddress(Object wallet,
{required int accountIndex, required int addressIndex, required String label}) async {
final zanoWallet = wallet as ZanoWallet;
await zanoWallet.walletAddresses.subaddressList
.setLabelSubaddress(accountIndex: accountIndex, addressIndex: addressIndex, label: label);
}
}
class CWZanoWalletDetails extends ZanoWalletDetails { class CWZanoWalletDetails extends ZanoWalletDetails {
CWZanoWalletDetails(this._wallet); CWZanoWalletDetails(this._wallet);
final Object _wallet; final Object _wallet;
@computed // @computed
@override // @override
Account get account { // Account get account {
final zanoWallet = _wallet as ZanoWallet; // final zanoWallet = _wallet as ZanoWallet;
final acc = zanoWallet.walletAddresses.account as monero_account.Account; // final acc = zanoWallet.walletAddresses.account as monero_account.Account;
return Account(id: acc.id, label: acc.label); // return Account(id: acc.id, label: acc.label);
} // }
@computed @computed
@override @override
@ -130,15 +77,10 @@ class CWZanoWalletDetails extends ZanoWalletDetails {
} }
class CWZano extends Zano { class CWZano extends Zano {
@override /**@override
ZanoAccountList getAccountList(Object wallet) { ZanoAccountList getAccountList(Object wallet) {
return CWZanoAccountList(wallet); return CWZanoAccountList(wallet);
} }*/
@override
MoneroSubaddressList getSubaddressList(Object wallet) {
return CWZanoSubaddressList(wallet);
}
@override @override
TransactionHistoryBase getTransactionHistory(Object wallet) { TransactionHistoryBase getTransactionHistory(Object wallet) {
@ -147,7 +89,7 @@ class CWZano extends Zano {
} }
@override @override
ZanoWalletDetails getMoneroWalletDetails(Object wallet) { ZanoWalletDetails getZanoWalletDetails(Object wallet) {
return CWZanoWalletDetails(wallet); return CWZanoWalletDetails(wallet);
} }
@ -231,8 +173,8 @@ class CWZano extends Zano {
@override @override
WalletCredentials createZanoNewWalletCredentials( WalletCredentials createZanoNewWalletCredentials(
{required String name, required String language, String? password}) { {required String name, String? password}) {
return ZanoNewWalletCredentials(name: name, password: password, language: language); return ZanoNewWalletCredentials(name: name, password: password);
} }
@override @override
@ -283,18 +225,18 @@ class CWZano extends Zano {
return moneroParseAmount(amount: amount); return moneroParseAmount(amount: amount);
} }
@override // @override
Account getCurrentAccount(Object wallet) { // Account getCurrentAccount(Object wallet) {
final zanoWallet = wallet as ZanoWallet; // final zanoWallet = wallet as ZanoWallet;
final acc = zanoWallet.walletAddresses.account as monero_account.Account; // final acc = zanoWallet.walletAddresses.account as monero_account.Account;
return Account(id: acc.id, label: acc.label); // return Account(id: acc.id, label: acc.label);
} // }
@override // @override
void setCurrentAccount(Object wallet, int id, String label) { // void setCurrentAccount(Object wallet, int id, String label) {
final zanoWallet = wallet as ZanoWallet; // final zanoWallet = wallet as ZanoWallet;
zanoWallet.walletAddresses.account = monero_account.Account(id: id, label: label); // zanoWallet.walletAddresses.account = monero_account.Account(id: id, label: label);
} // }
@override @override
void onStartup() { void onStartup() {

View file

@ -37,21 +37,21 @@ part 'cw_zano.dart';
Zano? zano = CWZano(); Zano? zano = CWZano();
class Account { // class Account {
Account({required this.id, required this.label}); // Account({required this.id, required this.label});
final int id; // final int id;
final String label; // final String label;
} // }
class Subaddress { // class Subaddress {
Subaddress({ // Subaddress({
required this.id, // required this.id,
required this.label, // required this.label,
required this.address}); // required this.address});
final int id; // final int id;
final String label; // final String label;
final String address; // final String address;
} // }
class ZanoBalance extends Balance { class ZanoBalance extends Balance {
ZanoBalance({required this.fullBalance, required this.unlockedBalance}) ZanoBalance({required this.fullBalance, required this.unlockedBalance})
@ -89,21 +89,19 @@ class AssetRate {
abstract class ZanoWalletDetails { abstract class ZanoWalletDetails {
// FIX-ME: it's abstruct class // FIX-ME: it's abstruct class
@observable // @observable
late Account account; // late Account account;
// FIX-ME: it's abstruct class // FIX-ME: it's abstruct class
@observable @observable
late ZanoBalance balance; late ZanoBalance balance;
} }
abstract class Zano { abstract class Zano {
ZanoAccountList getAccountList(Object wallet); /**ZanoAccountList getAccountList(Object wallet);*/
MoneroSubaddressList getSubaddressList(Object wallet);
TransactionHistoryBase getTransactionHistory(Object wallet); TransactionHistoryBase getTransactionHistory(Object wallet);
ZanoWalletDetails getMoneroWalletDetails(Object wallet); ZanoWalletDetails getZanoWalletDetails(Object wallet);
String getTransactionAddress(Object wallet, int accountIndex, int addressIndex); String getTransactionAddress(Object wallet, int accountIndex, int addressIndex);
@ -123,14 +121,14 @@ abstract class Zano {
required String language, required String language,
required int height}); required int height});
WalletCredentials createZanoRestoreWalletFromSeedCredentials({required String name, required String password, required int height, required String mnemonic}); WalletCredentials createZanoRestoreWalletFromSeedCredentials({required String name, required String password, required int height, required String mnemonic});
WalletCredentials createZanoNewWalletCredentials({required String name, required String language, String password}); WalletCredentials createZanoNewWalletCredentials({required String name, String password});
Map<String, String> getKeys(Object wallet); Map<String, String> getKeys(Object wallet);
Object createZanoTransactionCreationCredentials({required List<Output> outputs, required TransactionPriority priority, required String assetType}); Object createZanoTransactionCreationCredentials({required List<Output> outputs, required TransactionPriority priority, required String assetType});
String formatterMoneroAmountToString({required int amount}); String formatterMoneroAmountToString({required int amount});
double formatterMoneroAmountToDouble({required int amount}); double formatterMoneroAmountToDouble({required int amount});
int formatterMoneroParseAmount({required String amount}); int formatterMoneroParseAmount({required String amount});
Account getCurrentAccount(Object wallet); // Account getCurrentAccount(Object wallet);
void setCurrentAccount(Object wallet, int id, String label); // void setCurrentAccount(Object wallet, int id, String label);
void onStartup(); void onStartup();
int getTransactionInfoAccountId(TransactionInfo tx); int getTransactionInfoAccountId(TransactionInfo tx);
WalletService createZanoWalletService(Box<WalletInfo> walletInfoSource); WalletService createZanoWalletService(Box<WalletInfo> walletInfoSource);
@ -138,22 +136,22 @@ abstract class Zano {
List<AssetRate> getAssetRate(); List<AssetRate> getAssetRate();
} }
abstract class MoneroSubaddressList { // abstract class MoneroSubaddressList {
ObservableList<Subaddress> get subaddresses; // ObservableList<Subaddress> get subaddresses;
void update(Object wallet, {required int accountIndex}); // void update(Object wallet, {required int accountIndex});
void refresh(Object wallet, {required int accountIndex}); // void refresh(Object wallet, {required int accountIndex});
List<Subaddress> getAll(Object wallet); // List<Subaddress> getAll(Object wallet);
Future<void> addSubaddress(Object wallet, {required int accountIndex, required String label}); // Future<void> addSubaddress(Object wallet, {required int accountIndex, required String label});
Future<void> setLabelSubaddress(Object wallet, // Future<void> setLabelSubaddress(Object wallet,
{required int accountIndex, required int addressIndex, required String label}); // {required int accountIndex, required int addressIndex, required String label});
} // }
abstract class ZanoAccountList { // abstract class ZanoAccountList {
ObservableList<Account> get accounts; // ObservableList<Account> get accounts;
void update(Object wallet); // void update(Object wallet);
void refresh(Object wallet); // void refresh(Object wallet);
List<Account> getAll(Object wallet); // List<Account> getAll(Object wallet);
Future<void> addAccount(Object wallet, {required String label}); // Future<void> addAccount(Object wallet, {required String label});
Future<void> setLabelAccount(Object wallet, {required int accountIndex, required String label}); // Future<void> setLabelAccount(Object wallet, {required int accountIndex, required String label});
} // }