2022-10-14 03:13:42 +00:00
import ' dart:core ' ;
import ' dart:io ' ;
import ' dart:math ' ;
import ' package:cw_core/node.dart ' ;
import ' package:cw_core/unspent_coins_info.dart ' ;
import ' package:cw_core/wallet_base.dart ' ;
import ' package:cw_core/wallet_credentials.dart ' ;
import ' package:cw_core/wallet_info.dart ' ;
import ' package:cw_core/wallet_service.dart ' ;
import ' package:cw_core/wallet_type.dart ' ;
import ' package:cw_monero/monero_wallet.dart ' ;
import ' package:flutter_libmonero/core/key_service.dart ' ;
import ' package:flutter_libmonero/core/wallet_creation_service.dart ' ;
import ' package:flutter_libmonero/monero/monero.dart ' ;
2022-11-10 22:21:58 +00:00
import ' package:flutter_test/flutter_test.dart ' ;
2022-10-14 03:13:42 +00:00
import ' package:hive/hive.dart ' ;
2022-11-10 22:21:58 +00:00
import ' package:hive_test/hive_test.dart ' ;
import ' package:mockito/annotations.dart ' ;
2022-10-14 03:13:42 +00:00
import ' package:path_provider/path_provider.dart ' ;
2023-01-19 21:13:03 +00:00
import ' package:stackwallet/db/main_db.dart ' ;
2022-10-14 15:09:17 +00:00
import ' package:stackwallet/services/wallets.dart ' ;
2022-11-10 22:21:58 +00:00
import ' package:stackwallet/utilities/flutter_secure_storage_interface.dart ' ;
2022-10-14 03:13:42 +00:00
import ' monero_wallet_test_data.dart ' ;
FakeSecureStorage ? storage ;
WalletService ? walletService ;
KeyService ? keysStorage ;
MoneroWalletBase ? walletBase ;
late WalletCreationService _walletCreationService ;
dynamic _walletInfoSource ;
2022-10-14 15:09:17 +00:00
Wallets ? walletsService ;
2022-10-14 03:13:42 +00:00
2022-10-14 15:24:05 +00:00
String path = ' ' ;
2022-10-14 03:13:42 +00:00
String name = ' namee ${ Random ( ) . nextInt ( 10000000 ) } ' ;
int nettype = 0 ;
WalletType type = WalletType . monero ;
2023-01-19 21:13:03 +00:00
@ GenerateMocks ( [
MainDB ,
] )
2022-10-14 03:13:42 +00:00
void main ( ) async {
storage = FakeSecureStorage ( ) ;
keysStorage = KeyService ( storage ! ) ;
WalletInfo walletInfo = WalletInfo . external (
id: ' ' ,
name: ' ' ,
type: type ,
isRecovery: false ,
restoreHeight: 0 ,
date: DateTime . now ( ) ,
path: ' ' ,
address: ' ' ,
dirPath: ' ' ) ;
late WalletCredentials credentials ;
monero . onStartup ( ) ;
2022-11-10 22:21:58 +00:00
bool hiveAdaptersRegistered = false ;
2022-10-14 03:13:42 +00:00
2022-11-10 23:03:01 +00:00
group ( " Mainnet tests " , ( ) {
2022-10-14 03:13:42 +00:00
setUp ( ( ) async {
2022-11-10 22:21:58 +00:00
await setUpTestHive ( ) ;
if ( ! hiveAdaptersRegistered ) {
hiveAdaptersRegistered = true ;
Hive . registerAdapter ( NodeAdapter ( ) ) ;
Hive . registerAdapter ( WalletInfoAdapter ( ) ) ;
Hive . registerAdapter ( WalletTypeAdapter ( ) ) ;
Hive . registerAdapter ( UnspentCoinsInfoAdapter ( ) ) ;
2023-01-19 19:24:16 +00:00
final wallets = await Hive . openBox < dynamic > ( ' wallets ' ) ;
2022-11-10 22:21:58 +00:00
await wallets . put ( ' currentWalletName ' , name ) ;
_walletInfoSource = await Hive . openBox < WalletInfo > ( WalletInfo . boxName ) ;
2022-11-10 23:03:01 +00:00
walletService = monero
. createMoneroWalletService ( _walletInfoSource as Box < WalletInfo > ) ;
2022-11-10 22:21:58 +00:00
}
2022-10-14 03:13:42 +00:00
try {
// if (name?.isEmpty ?? true) {
// name = await generateName();
// }
final dirPath = await pathForWalletDir ( name: name , type: type ) ;
2022-10-14 15:24:05 +00:00
path = await pathForWallet ( name: name , type: type ) ;
2022-10-14 03:13:42 +00:00
credentials =
2022-11-12 15:16:07 +00:00
// // creating a new wallet
// monero.createMoneroNewWalletCredentials(
// name: name, language: "English");
// restoring a previous wallet
monero . createMoneroRestoreWalletFromSeedCredentials (
name: name , height: 2580000 , mnemonic: testMnemonic ) ;
2022-10-14 03:13:42 +00:00
walletInfo = WalletInfo . external (
id: WalletBase . idFor ( name , type ) ,
name: name ,
type: type ,
isRecovery: false ,
restoreHeight: credentials . height ? ? 0 ,
date: DateTime . now ( ) ,
path: path ,
address: " " ,
dirPath: dirPath ) ;
credentials . walletInfo = walletInfo ;
_walletCreationService = WalletCreationService (
secureStorage: storage ,
walletService: walletService ,
keyService: keysStorage ,
) ;
_walletCreationService . changeWalletType ( ) ;
} catch ( e , s ) {
print ( e ) ;
print ( s ) ;
}
} ) ;
test ( " Test mainnet address generation from seed " , ( ) async {
final wallet = await
2022-11-12 15:16:07 +00:00
// _walletCreationService.create(credentials);
_walletCreationService . restoreFromSeed ( credentials ) ;
2022-10-14 03:13:42 +00:00
walletInfo . address = wallet . walletAddresses . address ;
//print(walletInfo.address);
await _walletInfoSource . add ( walletInfo ) ;
walletBase ? . close ( ) ;
walletBase = wallet as MoneroWalletBase ;
//print("${walletBase?.seed}");
2022-11-12 15:16:07 +00:00
expect ( await walletBase ! . validateAddress ( walletInfo . address ? ? ' ' ) , true ) ;
2022-11-10 23:03:01 +00:00
2022-10-14 03:13:42 +00:00
// print(walletBase);
// loggerPrint(walletBase.toString());
// loggerPrint("name: ${walletBase!.name} seed: ${walletBase!.seed} id: "
// "${walletBase!.id} walletinfo: ${toStringForinfo(walletBase!.walletInfo)} type: ${walletBase!.type} balance: "
// "${walletBase!.balance.entries.first.value.available} currency: ${walletBase!.currency}");
expect ( walletInfo . address , mainnetTestData [ 0 ] [ 0 ] ) ;
2023-01-19 21:13:03 +00:00
expect ( walletBase ! . getTransactionAddress ( 0 , 0 ) , mainnetTestData [ 0 ] [ 0 ] ) ;
expect ( walletBase ! . getTransactionAddress ( 0 , 1 ) , mainnetTestData [ 0 ] [ 1 ] ) ;
expect ( walletBase ! . getTransactionAddress ( 0 , 2 ) , mainnetTestData [ 0 ] [ 2 ] ) ;
expect ( walletBase ! . getTransactionAddress ( 1 , 0 ) , mainnetTestData [ 1 ] [ 0 ] ) ;
expect ( walletBase ! . getTransactionAddress ( 1 , 1 ) , mainnetTestData [ 1 ] [ 1 ] ) ;
expect ( walletBase ! . getTransactionAddress ( 1 , 2 ) , mainnetTestData [ 1 ] [ 2 ] ) ;
expect ( walletBase ! . validateAddress ( ' ' ) , false ) ;
2022-10-14 03:13:42 +00:00
expect (
2023-01-19 21:13:03 +00:00
walletBase ! . validateAddress (
2022-11-12 15:16:07 +00:00
' 4AeRgkWZsMJhAWKMeCZ3h4ZSPnAcW5VBtRFyLd6gBEf6GgJU2FHXDA6i1DnQTd6h8R3VU5AkbGcWSNhtSwNNPgaD48gp4nn ' ) ,
true ) ;
2022-11-10 23:03:01 +00:00
expect (
2023-01-19 21:13:03 +00:00
walletBase ! . validateAddress (
2022-11-12 15:16:07 +00:00
' 4asdfkWZsMJhAWKMeCZ3h4ZSPnAcW5VBtRFyLd6gBEf6GgJU2FHXDA6i1DnQTd6h8R3VU5AkbGcWSNhtSwNNPgaD48gpjkl ' ) ,
false ) ;
2022-11-10 23:03:01 +00:00
expect (
2023-01-19 21:13:03 +00:00
walletBase ! . validateAddress (
2022-11-12 15:16:07 +00:00
' 8AeRgkWZsMJhAWKMeCZ3h4ZSPnAcW5VBtRFyLd6gBEf6GgJU2FHXDA6i1DnQTd6h8R3VU5AkbGcWSNhtSwNNPgaD48gp4nn ' ) ,
false ) ;
2022-11-10 23:03:01 +00:00
expect (
2023-01-19 21:13:03 +00:00
walletBase ! . validateAddress (
2022-11-12 15:16:07 +00:00
' 84kYPuZ1eaVKGQhf26QPNWbSLQG16BywXdLYYShVrPNMLAUAWce5vcpRc78FxwRphrG6Cda7faCKdUMr8fUCH3peHPenvHy ' ) ,
true ) ;
2022-11-10 23:03:01 +00:00
expect (
2023-01-19 21:13:03 +00:00
walletBase ! . validateAddress (
2022-11-12 15:16:07 +00:00
' 8asdfuZ1eaVKGQhf26QPNWbSLQG16BywXdLYYShVrPNMLAUAWce5vcpRc78FxwRphrG6Cda7faCKdUMr8fUCH3peHPenjkl ' ) ,
false ) ;
2022-11-10 23:03:01 +00:00
expect (
2023-01-19 21:13:03 +00:00
walletBase ! . validateAddress (
2022-11-12 15:16:07 +00:00
' 44kYPuZ1eaVKGQhf26QPNWbSLQG16BywXdLYYShVrPNMLAUAWce5vcpRc78FxwRphrG6Cda7faCKdUMr8fUCH3peHPenvHy ' ) ,
false ) ;
2022-10-14 03:13:42 +00:00
} ) ;
} ) ;
2022-10-14 15:24:05 +00:00
/ *
// Not needed; only folder created, wallet files not saved yet. TODO test saving and deleting wallet files and make sure to clean up leftover folder afterwards
2022-10-14 15:09:17 +00:00
group ( " Mainnet wallet deletion test " , ( ) {
2022-10-14 15:24:05 +00:00
test ( " Test mainnet wallet existence " , ( ) {
expect ( monero_wallet_manager . isWalletExistSync ( path: path ) , true ) ;
} ) ;
test ( " Test mainnet wallet deletion " , ( ) {
2022-10-14 15:09:17 +00:00
// Remove wallet from wallet service
walletService ? . remove ( name ) ;
walletsService ? . removeWallet ( walletId: name ) ;
2022-10-14 15:24:05 +00:00
expect ( monero_wallet_manager . isWalletExistSync ( path: path ) , false ) ;
2022-10-14 15:09:17 +00:00
} ) ;
} ) ;
2022-10-14 15:24:05 +00:00
2022-10-14 03:13:42 +00:00
group ( " Mainnet node tests " , ( ) {
test ( " Test mainnet node connection " , ( ) async {
await walletBase ? . connectToNode (
node: Node (
uri: " monero-stagenet.stackwallet.com:38081 " ,
type: WalletType . moneroStageNet ) ) ;
await walletBase ! . rescan (
height:
credentials . height ) ; // Probably shouldn't be rescanning from 0...
await walletBase ! . getNodeHeight ( ) ;
int height = await walletBase ! . getNodeHeight ( ) ;
print ( ' height: $ height ' ) ;
bool connected = await walletBase ! . isConnected ( ) ;
print ( ' connected: $ connected ' ) ;
//expect...
} ) ;
} ) ;
* /
// TODO test deletion of wallets ... and delete them
}
Future < String > pathForWalletDir (
{ required String name , required WalletType type } ) async {
Directory root = ( await getApplicationDocumentsDirectory ( ) ) ;
if ( Platform . isIOS ) {
root = ( await getLibraryDirectory ( ) ) ;
}
final prefix = walletTypeToString ( type ) . toLowerCase ( ) ;
final walletsDir = Directory ( ' ${ root . path } /wallets ' ) ;
final walletDire = Directory ( ' ${ walletsDir . path } / $ prefix / $ name ' ) ;
if ( ! walletDire . existsSync ( ) ) {
walletDire . createSync ( recursive: true ) ;
}
return walletDire . path ;
}
Future < String > pathForWallet (
2022-11-12 15:16:07 +00:00
{ required String name , required WalletType type } ) async = >
2022-10-14 03:13:42 +00:00
await pathForWalletDir ( name: name , type: type )
2023-01-19 21:13:03 +00:00
. then ( ( path ) = > ' $ path / $ name ' ) ;