diff --git a/test/services/coins/monero/monero_wallet_test.dart b/test/services/coins/monero/monero_wallet_test.dart
new file mode 100644
index 000000000..1ee2fc44a
--- /dev/null
+++ b/test/services/coins/monero/monero_wallet_test.dart
@@ -0,0 +1,207 @@
+import 'dart:async';
+import 'dart:core';
+import 'dart:core' as core;
+import 'dart:io';
+import 'dart:math';
+
+import 'package:flutter_test/flutter_test.dart';
+import 'package:hive/hive.dart';
+import 'package:hive_test/hive_test.dart';
+import 'package:mockito/annotations.dart';
+import 'package:mockito/mockito.dart';
+
+import 'package:cw_core/monero_amount_format.dart';
+import 'package:cw_core/node.dart';
+import 'package:cw_core/pending_transaction.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/api/wallet.dart';
+import 'package:cw_monero/pending_monero_transaction.dart';
+import 'package:cw_monero/monero_wallet.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter/services.dart';
+import 'package:flutter_libmonero/core/key_service.dart';
+import 'package:flutter_libmonero/core/wallet_creation_service.dart';
+import 'package:flutter_libmonero/view_model/send/output.dart';
+import 'package:flutter_libmonero/monero/monero.dart';
+import 'package:flutter_secure_storage/flutter_secure_storage.dart';
+import 'package:hive/hive.dart';
+import 'package:path_provider/path_provider.dart';
+import 'package:shared_preferences/shared_preferences.dart';
+import 'package:stackwallet/utilities/flutter_secure_storage_interface.dart';
+
+import 'dart:developer' as developer;
+
+// TODO trim down to the minimum imports above
+
+import 'monero_wallet_test_data.dart';
+
+//FlutterSecureStorage? storage;
+FakeSecureStorage? storage;
+WalletService? walletService;
+SharedPreferences? prefs;
+KeyService? keysStorage;
+MoneroWalletBase? walletBase;
+late WalletCreationService _walletCreationService;
+dynamic _walletInfoSource;
+
+String name = 'namee${Random().nextInt(10000000)}';
+int nettype = 0;
+WalletType type = WalletType.monero;
+
+@GenerateMocks([])
+void main() async {
+  storage = FakeSecureStorage();
+  prefs = await SharedPreferences.getInstance();
+  keysStorage = KeyService(storage!);
+  WalletInfo walletInfo = WalletInfo.external(
+      id: '',
+      name: '',
+      type: type,
+      isRecovery: false,
+      restoreHeight: 0,
+      date: DateTime.now(),
+      path: '',
+      address: '',
+      dirPath: '');
+  late WalletCredentials credentials;
+
+  WidgetsFlutterBinding.ensureInitialized();
+  Directory appDir = (await getApplicationDocumentsDirectory());
+  if (Platform.isIOS) {
+    appDir = (await getLibraryDirectory());
+  }
+  await Hive.close();
+  Hive.init(appDir.path);
+  Hive.registerAdapter(NodeAdapter());
+  Hive.registerAdapter(WalletInfoAdapter());
+  Hive.registerAdapter(WalletTypeAdapter());
+  Hive.registerAdapter(UnspentCoinsInfoAdapter());
+
+  monero.onStartup();
+  _walletInfoSource = await Hive.openBox<WalletInfo>(WalletInfo.boxName);
+  walletService = monero.createMoneroWalletService(_walletInfoSource);
+
+  group("Mainnet tests", () {
+    setUp(() async {
+      try {
+        // if (name?.isEmpty ?? true) {
+        // name = await generateName();
+        // }
+        final dirPath = await pathForWalletDir(name: name, type: type);
+        final path = await pathForWallet(name: name, type: type);
+        credentials =
+            // //     creating a new wallet
+            // monero.createMoneroNewWalletCredentials(
+            //     name: name, language: "English");
+            // restoring a previous wallet
+            monero.createMoneroRestoreWalletFromSeedCredentials(
+                name: name, height: 2580000, mnemonic: testMnemonic);
+
+        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,
+          sharedPreferences: prefs,
+          walletService: walletService,
+          keyService: keysStorage,
+        );
+        _walletCreationService.changeWalletType();
+      } catch (e, s) {
+        print(e);
+        print(s);
+      }
+    });
+
+    test("Test mainnet address generation from seed", () async {
+      final wallet = await
+          // _walletCreationService.create(credentials);
+          _walletCreationService.restoreFromSeed(credentials);
+      walletInfo.address = wallet.walletAddresses.address;
+      //print(walletInfo.address);
+
+      await _walletInfoSource.add(walletInfo);
+      walletBase?.close();
+      walletBase = wallet as MoneroWalletBase;
+      //print("${walletBase?.seed}");
+
+      // 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]);
+      expect(
+          await walletBase!.getTransactionAddress(0, 0), mainnetTestData[0][0]);
+      expect(
+          await walletBase!.getTransactionAddress(0, 1), mainnetTestData[0][1]);
+      expect(
+          await walletBase!.getTransactionAddress(0, 2), mainnetTestData[0][2]);
+      expect(
+          await walletBase!.getTransactionAddress(1, 0), mainnetTestData[1][0]);
+      expect(
+          await walletBase!.getTransactionAddress(1, 1), mainnetTestData[1][1]);
+      expect(
+          await walletBase!.getTransactionAddress(1, 2), mainnetTestData[1][2]);
+    });
+  });
+  /*
+  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(
+        {required String name, required WalletType type}) async =>
+    await pathForWalletDir(name: name, type: type)
+        .then((path) => path + '/$name');
diff --git a/test/services/coins/monero/monero_wallet_test_data.dart b/test/services/coins/monero/monero_wallet_test_data.dart
new file mode 100644
index 000000000..dc0a0f4cb
--- /dev/null
+++ b/test/services/coins/monero/monero_wallet_test_data.dart
@@ -0,0 +1,14 @@
+String testMnemonic =
+    'agreed aquarium wallets uptight karate wonders afoot guys itself nucleus reduce lamb fully fewest bimonthly dazed skulls magically mocked fugitive imbalance saga calamity dialect itself';
+var mainnetTestData = [
+  [
+    '4AeRgkWZsMJhAWKMeCZ3h4ZSPnAcW5VBtRFyLd6gBEf6GgJU2FHXDA6i1DnQTd6h8R3VU5AkbGcWSNhtSwNNPgaD48gp4nn',
+    '82WsoLmbZt3BPwJMF5PfT8GitThJzUq3FFoSQyr4fKfJdxZebgY3mHPcnAqTBA3FFwZRGxC4ZDwkfE1VVULPa55x3xXgCbj',
+    '84kYPuZ1eaVKGQhf26QPNWbSLQG16BywXdLYYShVrPNMLAUAWce5vcpRc78FxwRphrG6Cda7faCKdUMr8fUCH3peHPenvHy'
+  ],
+  [
+    '86SF44CsTBYU3vk1X7nGBbQnrUSknGbd6Uw8a9hUUgy3KBeXTDvk3pm8upMzZKw17m3mLPEzbcPp5WLpYVoHR5PKNVtFrHH',
+    '8Aa9LNGdBHwYUMsy6M9ZVXMEkTBZyEDT7aQmY32trCxbU6dwkZJSCSbcpyL7UiTB9QXXosomZtJYvUJ296vTNX5yQ81KaA2',
+    '85C5zZRcaD89PKmXEwjcYMVAUqoH5rrAXe3GokvSupXnDmccYvZagz5Qem7bQLteEw4iFEJ9oRk9BNfjTi4K2cyTJbTMMPT'
+  ]
+];