import 'package:cw_monero/api/account_list.dart'; import 'package:cw_monero/api/exceptions/wallet_creation_exception.dart'; import 'package:cw_monero/api/exceptions/wallet_opening_exception.dart'; import 'package:cw_monero/api/exceptions/wallet_restore_from_keys_exception.dart'; import 'package:cw_monero/api/exceptions/wallet_restore_from_seed_exception.dart'; import 'package:cw_monero/api/wallet.dart'; import 'package:ffi/ffi.dart'; import 'package:monero/monero.dart' as monero; import 'dart:ffi'; monero.WalletManager? _wmPtr; final monero.WalletManager wmPtr = Pointer.fromAddress((() { try { monero.printStarts = true; _wmPtr ??= monero.WalletManagerFactory_getWalletManager(); print("ptr: $_wmPtr"); } catch (e) { print(e); } return _wmPtr!.address; })()); void createWalletSync( {required String path, required String password, required String language, int nettype = 0}) { wptr = monero.WalletManager_createWallet(wmPtr, path: path, password: password, language: language); final status = monero.Wallet_status(wptr!); if (status != 0) { throw WalletCreationException(message: monero.Wallet_errorString(wptr!)); } // is the line below needed? // setupNodeSync(address: "node.moneroworld.com:18089"); } bool isWalletExistSync({required String path}) { return monero.WalletManager_walletExists(wmPtr, path); } void restoreWalletFromSeedSync( {required String path, required String password, required String seed, int nettype = 0, int restoreHeight = 0}) { final pathPointer = path.toNativeUtf8(); final passwordPointer = password.toNativeUtf8(); final seedPointer = seed.toNativeUtf8(); final errorMessagePointer = ''.toNativeUtf8(); wptr = monero.WalletManager_recoveryWallet( wmPtr, path: path, password: password, mnemonic: seed, restoreHeight: restoreHeight, seedOffset: '', ); final status = monero.Wallet_status(wptr!); if (status != 0) { throw WalletRestoreFromSeedException(message: monero.Wallet_errorString(wptr!)); } } void restoreWalletFromKeysSync( {required String path, required String password, required String language, required String address, required String viewKey, required String spendKey, int nettype = 0, int restoreHeight = 0}) { final pathPointer = path.toNativeUtf8(); final passwordPointer = password.toNativeUtf8(); final languagePointer = language.toNativeUtf8(); final addressPointer = address.toNativeUtf8(); final viewKeyPointer = viewKey.toNativeUtf8(); final spendKeyPointer = spendKey.toNativeUtf8(); final errorMessagePointer = ''.toNativeUtf8(); wptr = monero.WalletManager_createWalletFromKeys( wmPtr, path: path, password: password, restoreHeight: restoreHeight, addressString: address, viewKeyString: viewKey, spendKeyString: spendKey, ); final status = monero.Wallet_status(wptr!); if (status != 0) { throw WalletRestoreFromKeysException(message: monero.Wallet_errorString(wptr!)); } } void restoreWalletFromSpendKeySync( {required String path, required String password, required String seed, required String language, required String spendKey, int nettype = 0, int restoreHeight = 0}) { final pathPointer = path.toNativeUtf8(); final passwordPointer = password.toNativeUtf8(); final seedPointer = seed.toNativeUtf8(); final languagePointer = language.toNativeUtf8(); final spendKeyPointer = spendKey.toNativeUtf8(); final errorMessagePointer = ''.toNativeUtf8(); wptr = monero.WalletManager_createWalletFromKeys( wmPtr, path: path, password: password, restoreHeight: restoreHeight, addressString: '', spendKeyString: spendKey, viewKeyString: '', ); final status = monero.Wallet_status(wptr!); if (status == 0) { throw WalletRestoreFromKeysException(message: monero.Wallet_errorString(wptr!)); } storeSync(); } void loadWallet({ required String path, required String password, int nettype = 0}) { try { wptr ??= monero.WalletManager_openWallet(wmPtr, path: path, password: password); } catch (e) { print(e); } final status = monero.Wallet_status(wptr!); if (status != 0) { final err = monero.Wallet_errorString(wptr!); print(err); throw WalletOpeningException(message: err); } } void _createWallet(Map args) { final path = args['path'] as String; final password = args['password'] as String; final language = args['language'] as String; createWalletSync(path: path, password: password, language: language); } void _restoreFromSeed(Map args) { final path = args['path'] as String; final password = args['password'] as String; final seed = args['seed'] as String; final restoreHeight = args['restoreHeight'] as int; restoreWalletFromSeedSync( path: path, password: password, seed: seed, restoreHeight: restoreHeight); } void _restoreFromKeys(Map args) { final path = args['path'] as String; final password = args['password'] as String; final language = args['language'] as String; final restoreHeight = args['restoreHeight'] as int; final address = args['address'] as String; final viewKey = args['viewKey'] as String; final spendKey = args['spendKey'] as String; restoreWalletFromKeysSync( path: path, password: password, language: language, restoreHeight: restoreHeight, address: address, viewKey: viewKey, spendKey: spendKey); } void _restoreFromSpendKey(Map args) { final path = args['path'] as String; final password = args['password'] as String; final seed = args['seed'] as String; final language = args['language'] as String; final spendKey = args['spendKey'] as String; final restoreHeight = args['restoreHeight'] as int; restoreWalletFromSpendKeySync( path: path, password: password, seed: seed, language: language, restoreHeight: restoreHeight, spendKey: spendKey); } Future _openWallet(Map args) async => loadWallet(path: args['path'] as String, password: args['password'] as String); Future _isWalletExist(String path) async => isWalletExistSync(path: path); void openWallet({required String path, required String password, int nettype = 0}) async => loadWallet(path: path, password: password, nettype: nettype); Future openWalletAsync(Map args) async => _openWallet(args); Future createWallet( {required String path, required String password, required String language, int nettype = 0}) async => _createWallet({ 'path': path, 'password': password, 'language': language, 'nettype': nettype }); Future restoreFromSeed( {required String path, required String password, required String seed, int nettype = 0, int restoreHeight = 0}) async => _restoreFromSeed({ 'path': path, 'password': password, 'seed': seed, 'nettype': nettype, 'restoreHeight': restoreHeight }); Future restoreFromKeys( {required String path, required String password, required String language, required String address, required String viewKey, required String spendKey, int nettype = 0, int restoreHeight = 0}) async => _restoreFromKeys({ 'path': path, 'password': password, 'language': language, 'address': address, 'viewKey': viewKey, 'spendKey': spendKey, 'nettype': nettype, 'restoreHeight': restoreHeight }); Future restoreFromSpendKey( {required String path, required String password, required String seed, required String language, required String spendKey, int nettype = 0, int restoreHeight = 0}) async => _restoreFromSpendKey({ 'path': path, 'password': password, 'seed': seed, 'language': language, 'spendKey': spendKey, 'nettype': nettype, 'restoreHeight': restoreHeight }); Future isWalletExist({required String path}) => _isWalletExist(path);