From 2f34cbe4cb35f48bbe8db95dcfc261d79d99cc72 Mon Sep 17 00:00:00 2001
From: fosse <matt.cfosse@gmail.com>
Date: Thu, 8 Feb 2024 14:45:21 -0500
Subject: [PATCH] lightning work

---
 cw_bitcoin/lib/bitcoin_wallet_service.dart    |    1 -
 cw_core/lib/wallet_type.dart                  |   15 +-
 cw_lightning/.gitignore                       |   74 +
 cw_lightning/.metadata                        |   10 +
 cw_lightning/CHANGELOG.md                     |    3 +
 cw_lightning/LICENSE                          |    1 +
 cw_lightning/README.md                        |   14 +
 cw_lightning/lib/bitcoin_mnemonic.dart        | 2300 +++++++++++++++++
 ...tcoin_mnemonic_is_incorrect_exception.dart |    5 +
 .../bitcoin_wallet_creation_credentials.dart  |   23 +
 cw_lightning/lib/cw_lightning.dart            |    7 +
 cw_lightning/lib/lightning_wallet.dart        |  149 ++
 .../lib/lightning_wallet_service.dart         |  105 +
 .../lib/pending_bitcoin_transaction.dart      |   62 +
 cw_lightning/pubspec.lock                     |  871 +++++++
 cw_lightning/pubspec.yaml                     |   83 +
 cw_lightning/test/cw_lightning_test.dart      |   12 +
 lib/di.dart                                   |    2 +
 lib/entities/provider_types.dart              |    2 +
 lib/lightning/cw_lightning.dart               |  173 ++
 lib/lightning/lightning.dart                  |   78 +
 tool/configure.dart                           |   58 +-
 22 files changed, 4045 insertions(+), 3 deletions(-)
 create mode 100644 cw_lightning/.gitignore
 create mode 100644 cw_lightning/.metadata
 create mode 100644 cw_lightning/CHANGELOG.md
 create mode 100644 cw_lightning/LICENSE
 create mode 100644 cw_lightning/README.md
 create mode 100644 cw_lightning/lib/bitcoin_mnemonic.dart
 create mode 100644 cw_lightning/lib/bitcoin_mnemonic_is_incorrect_exception.dart
 create mode 100644 cw_lightning/lib/bitcoin_wallet_creation_credentials.dart
 create mode 100644 cw_lightning/lib/cw_lightning.dart
 create mode 100644 cw_lightning/lib/lightning_wallet.dart
 create mode 100644 cw_lightning/lib/lightning_wallet_service.dart
 create mode 100644 cw_lightning/lib/pending_bitcoin_transaction.dart
 create mode 100644 cw_lightning/pubspec.lock
 create mode 100644 cw_lightning/pubspec.yaml
 create mode 100644 cw_lightning/test/cw_lightning_test.dart
 create mode 100644 lib/lightning/cw_lightning.dart
 create mode 100644 lib/lightning/lightning.dart

diff --git a/cw_bitcoin/lib/bitcoin_wallet_service.dart b/cw_bitcoin/lib/bitcoin_wallet_service.dart
index 0ac0f46f0..89d29ff1c 100644
--- a/cw_bitcoin/lib/bitcoin_wallet_service.dart
+++ b/cw_bitcoin/lib/bitcoin_wallet_service.dart
@@ -11,7 +11,6 @@ import 'package:cw_core/wallet_info.dart';
 import 'package:cw_core/wallet_type.dart';
 import 'package:hive/hive.dart';
 import 'package:collection/collection.dart';
-import 'package:breez_sdk/breez_sdk.dart';
 
 class BitcoinWalletService extends WalletService<
     BitcoinNewWalletCredentials,
diff --git a/cw_core/lib/wallet_type.dart b/cw_core/lib/wallet_type.dart
index 20f0bdb19..e070e144e 100644
--- a/cw_core/lib/wallet_type.dart
+++ b/cw_core/lib/wallet_type.dart
@@ -46,7 +46,10 @@ enum WalletType {
   bitcoinCash,
 
   @HiveField(9)
-  polygon
+  polygon,
+
+  @HiveField(10)
+  lightning
 }
 
 int serializeToInt(WalletType type) {
@@ -69,6 +72,8 @@ int serializeToInt(WalletType type) {
       return 7;
     case WalletType.polygon:
       return 8;
+    case WalletType.lightning:
+      return 9;
     default:
       return -1;
   }
@@ -94,6 +99,8 @@ WalletType deserializeFromInt(int raw) {
       return WalletType.bitcoinCash;
     case 8:
       return WalletType.polygon;
+    case 9:
+      return WalletType.lightning;
     default:
       throw Exception('Unexpected token: $raw for WalletType deserializeFromInt');
   }
@@ -119,6 +126,8 @@ String walletTypeToString(WalletType type) {
       return 'Banano';
     case WalletType.polygon:
       return 'Polygon';
+    case WalletType.lightning:
+      return 'Lightning';
     default:
       return '';
   }
@@ -144,6 +153,8 @@ String walletTypeToDisplayName(WalletType type) {
       return 'Banano (BAN)';
     case WalletType.polygon:
       return 'Polygon (MATIC)';
+    case WalletType.lightning:
+      return 'Bitcoin (Lightning)';
     default:
       return '';
   }
@@ -169,6 +180,8 @@ CryptoCurrency walletTypeToCryptoCurrency(WalletType type) {
       return CryptoCurrency.banano;
     case WalletType.polygon:
       return CryptoCurrency.maticpoly;
+    case WalletType.lightning:
+      return CryptoCurrency.btc;
     default:
       throw Exception(
           'Unexpected wallet type: ${type.toString()} for CryptoCurrency walletTypeToCryptoCurrency');
diff --git a/cw_lightning/.gitignore b/cw_lightning/.gitignore
new file mode 100644
index 000000000..1985397a2
--- /dev/null
+++ b/cw_lightning/.gitignore
@@ -0,0 +1,74 @@
+# Miscellaneous
+*.class
+*.log
+*.pyc
+*.swp
+.DS_Store
+.atom/
+.buildlog/
+.history
+.svn/
+
+# IntelliJ related
+*.iml
+*.ipr
+*.iws
+.idea/
+
+# The .vscode folder contains launch configuration and tasks you configure in
+# VS Code which you may wish to be included in version control, so this line
+# is commented out by default.
+#.vscode/
+
+# Flutter/Dart/Pub related
+**/doc/api/
+.dart_tool/
+.flutter-plugins
+.flutter-plugins-dependencies
+.packages
+.pub-cache/
+.pub/
+build/
+
+# Android related
+**/android/**/gradle-wrapper.jar
+**/android/.gradle
+**/android/captures/
+**/android/gradlew
+**/android/gradlew.bat
+**/android/local.properties
+**/android/**/GeneratedPluginRegistrant.java
+
+# iOS/XCode related
+**/ios/**/*.mode1v3
+**/ios/**/*.mode2v3
+**/ios/**/*.moved-aside
+**/ios/**/*.pbxuser
+**/ios/**/*.perspectivev3
+**/ios/**/*sync/
+**/ios/**/.sconsign.dblite
+**/ios/**/.tags*
+**/ios/**/.vagrant/
+**/ios/**/DerivedData/
+**/ios/**/Icon?
+**/ios/**/Pods/
+**/ios/**/.symlinks/
+**/ios/**/profile
+**/ios/**/xcuserdata
+**/ios/.generated/
+**/ios/Flutter/App.framework
+**/ios/Flutter/Flutter.framework
+**/ios/Flutter/Flutter.podspec
+**/ios/Flutter/Generated.xcconfig
+**/ios/Flutter/app.flx
+**/ios/Flutter/app.zip
+**/ios/Flutter/flutter_assets/
+**/ios/Flutter/flutter_export_environment.sh
+**/ios/ServiceDefinitions.json
+**/ios/Runner/GeneratedPluginRegistrant.*
+
+# Exceptions to above rules.
+!**/ios/**/default.mode1v3
+!**/ios/**/default.mode2v3
+!**/ios/**/default.pbxuser
+!**/ios/**/default.perspectivev3
diff --git a/cw_lightning/.metadata b/cw_lightning/.metadata
new file mode 100644
index 000000000..4ce247fd6
--- /dev/null
+++ b/cw_lightning/.metadata
@@ -0,0 +1,10 @@
+# This file tracks properties of this Flutter project.
+# Used by Flutter tool to assess capabilities and perform upgrades etc.
+#
+# This file should be version controlled and should not be manually edited.
+
+version:
+  revision: b1395592de68cc8ac4522094ae59956dd21a91db
+  channel: stable
+
+project_type: package
diff --git a/cw_lightning/CHANGELOG.md b/cw_lightning/CHANGELOG.md
new file mode 100644
index 000000000..ac071598e
--- /dev/null
+++ b/cw_lightning/CHANGELOG.md
@@ -0,0 +1,3 @@
+## [0.0.1] - TODO: Add release date.
+
+* TODO: Describe initial release.
diff --git a/cw_lightning/LICENSE b/cw_lightning/LICENSE
new file mode 100644
index 000000000..ba75c69f7
--- /dev/null
+++ b/cw_lightning/LICENSE
@@ -0,0 +1 @@
+TODO: Add your license here.
diff --git a/cw_lightning/README.md b/cw_lightning/README.md
new file mode 100644
index 000000000..af26c1780
--- /dev/null
+++ b/cw_lightning/README.md
@@ -0,0 +1,14 @@
+# cw_bitcoin
+
+A new Flutter package project.
+
+## Getting Started
+
+This project is a starting point for a Dart
+[package](https://flutter.dev/developing-packages/),
+a library module containing code that can be shared easily across
+multiple Flutter or Dart projects.
+
+For help getting started with Flutter, view our 
+[online documentation](https://flutter.dev/docs), which offers tutorials, 
+samples, guidance on mobile development, and a full API reference.
diff --git a/cw_lightning/lib/bitcoin_mnemonic.dart b/cw_lightning/lib/bitcoin_mnemonic.dart
new file mode 100644
index 000000000..9163fcb11
--- /dev/null
+++ b/cw_lightning/lib/bitcoin_mnemonic.dart
@@ -0,0 +1,2300 @@
+import 'dart:convert';
+import 'dart:math';
+import 'dart:typed_data';
+import 'package:crypto/crypto.dart';
+import 'package:unorm_dart/unorm_dart.dart' as unorm;
+import 'package:cryptography/cryptography.dart' as cryptography;
+import 'package:cw_core/sec_random_native.dart';
+
+const segwit = '100';
+final wordlist = englishWordlist;
+
+double logBase(num x, num base) => log(x) / log(base);
+
+String mnemonicEncode(int i) {
+  var _i = i;
+  final n = wordlist.length;
+  final words = <String>[];
+
+  while (_i > 0) {
+    final x = i % n;
+    _i = (i / n).floor();
+    words.add(wordlist[x]);
+  }
+
+  return words.join(' ');
+}
+
+int mnemonicDecode(String seed) {
+  var i = 0;
+  final n = wordlist.length;
+  final words = seed.split(' ');
+
+  while (words.length > 0) {
+    final word = words.removeLast();
+    final k = wordlist.indexOf(word);
+    i = i * n + k;
+  }
+
+  return i;
+}
+
+bool isNewSeed(String seed, {String prefix = segwit}) {
+  final hmacSha512 = Hmac(sha512, utf8.encode('Seed version'));
+  final digest = hmacSha512.convert(utf8.encode(normalizeText(seed)));
+  final hx = digest.toString();
+  return hx.startsWith(prefix.toLowerCase());
+}
+
+void maskBytes(Uint8List bytes, int bits) {
+  final skipCount = (bits / 8).floor();
+  var lastByte = (1 << bits % 8) - 1;
+
+  for (var i = bytes.length - 1 - skipCount; i >= 0; i--) {
+    bytes[i] &= lastByte;
+
+    if (lastByte > 0) {
+      lastByte = 0;
+    }
+  }
+}
+
+String bufferToBin(Uint8List data) {
+  final q1 = data.map((e) => e.toRadixString(2).padLeft(8, '0'));
+  final q2 = q1.join('');
+  return q2;
+}
+
+String encode(Uint8List data) {
+  final dataBitLen = data.length * 8;
+  final wordBitLen = logBase(wordlist.length, 2).ceil();
+  final wordCount = (dataBitLen / wordBitLen).floor();
+  maskBytes(data, wordCount * wordBitLen);
+  final bin = bufferToBin(data);
+  final binStr = bin.substring(bin.length - (wordCount * wordBitLen));
+  final result = <Object>[];
+
+  for (var i = 0; i < wordCount; i++) {
+    final wordBin = binStr.substring(i * wordBitLen, (i + 1) * wordBitLen);
+    result.add(wordlist[int.parse(wordBin, radix: 2)]);
+  }
+
+  return result.join(' ');
+}
+
+List<bool> prefixMatches(String source, List<String> prefixes) {
+  final hmacSha512 = Hmac(sha512, utf8.encode('Seed version'));
+  final digest = hmacSha512.convert(utf8.encode(normalizeText(source)));
+  final hx = digest.toString();
+
+  return prefixes.map((prefix) => hx.startsWith(prefix.toLowerCase())).toList();
+}
+
+Future<String> generateMnemonic(
+    {int strength = 264, String prefix = segwit}) async {
+  final wordBitlen = logBase(wordlist.length, 2).ceil();
+  final wordCount = strength / wordBitlen;
+  final byteCount = ((wordCount * wordBitlen).ceil() / 8).ceil();
+  var result = '';
+
+  do {
+    final bytes = await secRandom(byteCount);
+    maskBytes(bytes, strength);
+    result = encode(bytes);
+  } while (!prefixMatches(result, [prefix]).first);
+
+  return result;
+}
+
+Future<Uint8List> mnemonicToSeedBytes(String mnemonic, {String prefix = segwit}) async {
+  final pbkdf2 = cryptography.Pbkdf2(
+      macAlgorithm: cryptography.Hmac.sha512(),
+      iterations: 2048,
+      bits: 512);
+  final text = normalizeText(mnemonic);
+  // pbkdf2.deriveKey(secretKey: secretKey, nonce: nonce)
+  final key = await pbkdf2.deriveKey(
+      secretKey: cryptography.SecretKey(text.codeUnits),
+      nonce: 'electrum'.codeUnits);
+  final bytes = await key.extractBytes();
+  return Uint8List.fromList(bytes);
+}
+
+bool matchesAnyPrefix(String mnemonic) =>
+    prefixMatches(mnemonic, [segwit]).any((el) => el);
+
+bool validateMnemonic(String mnemonic, {String prefix = segwit}) {
+  try {
+    return matchesAnyPrefix(mnemonic);
+  } catch (e) {
+    return false;
+  }
+}
+
+final COMBININGCODEPOINTS = combiningcodepoints();
+
+List<int> combiningcodepoints() {
+  final source = '300:34e|350:36f|483:487|591:5bd|5bf|5c1|5c2|5c4|5c5|5c7|610:61a|64b:65f|670|' +
+      '6d6:6dc|6df:6e4|6e7|6e8|6ea:6ed|711|730:74a|7eb:7f3|816:819|81b:823|825:827|' +
+      '829:82d|859:85b|8d4:8e1|8e3:8ff|93c|94d|951:954|9bc|9cd|a3c|a4d|abc|acd|b3c|' +
+      'b4d|bcd|c4d|c55|c56|cbc|ccd|d4d|dca|e38:e3a|e48:e4b|eb8|eb9|ec8:ecb|f18|f19|' +
+      'f35|f37|f39|f71|f72|f74|f7a:f7d|f80|f82:f84|f86|f87|fc6|1037|1039|103a|108d|' +
+      '135d:135f|1714|1734|17d2|17dd|18a9|1939:193b|1a17|1a18|1a60|1a75:1a7c|1a7f|' +
+      '1ab0:1abd|1b34|1b44|1b6b:1b73|1baa|1bab|1be6|1bf2|1bf3|1c37|1cd0:1cd2|' +
+      '1cd4:1ce0|1ce2:1ce8|1ced|1cf4|1cf8|1cf9|1dc0:1df5|1dfb:1dff|20d0:20dc|20e1|' +
+      '20e5:20f0|2cef:2cf1|2d7f|2de0:2dff|302a:302f|3099|309a|a66f|a674:a67d|a69e|' +
+      'a69f|a6f0|a6f1|a806|a8c4|a8e0:a8f1|a92b:a92d|a953|a9b3|a9c0|aab0|aab2:aab4|' +
+      'aab7|aab8|aabe|aabf|aac1|aaf6|abed|fb1e|fe20:fe2f|101fd|102e0|10376:1037a|' +
+      '10a0d|10a0f|10a38:10a3a|10a3f|10ae5|10ae6|11046|1107f|110b9|110ba|11100:11102|' +
+      '11133|11134|11173|111c0|111ca|11235|11236|112e9|112ea|1133c|1134d|11366:1136c|' +
+      '11370:11374|11442|11446|114c2|114c3|115bf|115c0|1163f|116b6|116b7|1172b|11c3f|' +
+      '16af0:16af4|16b30:16b36|1bc9e|1d165:1d169|1d16d:1d172|1d17b:1d182|1d185:1d18b|' +
+      '1d1aa:1d1ad|1d242:1d244|1e000:1e006|1e008:1e018|1e01b:1e021|1e023|1e024|' +
+      '1e026:1e02a|1e8d0:1e8d6|1e944:1e94a';
+
+  return source.split('|').map((e) {
+    if (e.contains(':')) {
+      return e.split(':').map((hex) => int.parse(hex, radix: 16));
+    }
+
+    return int.parse(e, radix: 16);
+  }).fold(<int>[], (List<int> acc, element) {
+    if (element is List) {
+      for (var i = element[0] as int; i <= (element[1] as int); i++) {}
+    } else if (element is int) {
+      acc.add(element);
+    }
+
+    return acc;
+  }).toList();
+}
+
+String removeCombiningCharacters(String source) {
+  return source
+      .split('')
+      .where((char) => !COMBININGCODEPOINTS.contains(char.codeUnits.first))
+      .join('');
+}
+
+bool isCJK(String char) {
+  final n = char.codeUnitAt(0);
+
+  for (var x in CJKINTERVALS) {
+    final imin = x[0] as num;
+    final imax = x[1] as num;
+
+    if (n >= imin && n <= imax) return true;
+  }
+
+  return false;
+}
+
+String removeCJKSpaces(String source) {
+  final splitted = source.split('');
+  final filtered = <String>[];
+
+  for (var i = 0; i < splitted.length; i++) {
+    final char = splitted[i];
+    final isSpace = char.trim() == '';
+    final prevIsCJK = i != 0 && isCJK(splitted[i - 1]);
+    final nextIsCJK = i != splitted.length - 1 && isCJK(splitted[i + 1]);
+
+    if (!(isSpace && prevIsCJK && nextIsCJK)) {
+      filtered.add(char);
+    }
+  }
+
+  return filtered.join('');
+}
+
+String normalizeText(String source) {
+  final res = removeCombiningCharacters(unorm.nfkd(source).toLowerCase())
+      .trim()
+      .split('/\s+/')
+      .join(' ');
+
+  return removeCJKSpaces(res);
+}
+
+const CJKINTERVALS = [
+  [0x4e00, 0x9fff, 'CJK Unified Ideographs'],
+  [0x3400, 0x4dbf, 'CJK Unified Ideographs Extension A'],
+  [0x20000, 0x2a6df, 'CJK Unified Ideographs Extension B'],
+  [0x2a700, 0x2b73f, 'CJK Unified Ideographs Extension C'],
+  [0x2b740, 0x2b81f, 'CJK Unified Ideographs Extension D'],
+  [0xf900, 0xfaff, 'CJK Compatibility Ideographs'],
+  [0x2f800, 0x2fa1d, 'CJK Compatibility Ideographs Supplement'],
+  [0x3190, 0x319f, 'Kanbun'],
+  [0x2e80, 0x2eff, 'CJK Radicals Supplement'],
+  [0x2f00, 0x2fdf, 'CJK Radicals'],
+  [0x31c0, 0x31ef, 'CJK Strokes'],
+  [0x2ff0, 0x2fff, 'Ideographic Description Characters'],
+  [0xe0100, 0xe01ef, 'Variation Selectors Supplement'],
+  [0x3100, 0x312f, 'Bopomofo'],
+  [0x31a0, 0x31bf, 'Bopomofo Extended'],
+  [0xff00, 0xffef, 'Halfwidth and Fullwidth Forms'],
+  [0x3040, 0x309f, 'Hiragana'],
+  [0x30a0, 0x30ff, 'Katakana'],
+  [0x31f0, 0x31ff, 'Katakana Phonetic Extensions'],
+  [0x1b000, 0x1b0ff, 'Kana Supplement'],
+  [0xac00, 0xd7af, 'Hangul Syllables'],
+  [0x1100, 0x11ff, 'Hangul Jamo'],
+  [0xa960, 0xa97f, 'Hangul Jamo Extended A'],
+  [0xd7b0, 0xd7ff, 'Hangul Jamo Extended B'],
+  [0x3130, 0x318f, 'Hangul Compatibility Jamo'],
+  [0xa4d0, 0xa4ff, 'Lisu'],
+  [0x16f00, 0x16f9f, 'Miao'],
+  [0xa000, 0xa48f, 'Yi Syllables'],
+  [0xa490, 0xa4cf, 'Yi Radicals'],
+];
+
+final englishWordlist = <String>[
+  'abandon',
+  'ability',
+  'able',
+  'about',
+  'above',
+  'absent',
+  'absorb',
+  'abstract',
+  'absurd',
+  'abuse',
+  'access',
+  'accident',
+  'account',
+  'accuse',
+  'achieve',
+  'acid',
+  'acoustic',
+  'acquire',
+  'across',
+  'act',
+  'action',
+  'actor',
+  'actress',
+  'actual',
+  'adapt',
+  'add',
+  'addict',
+  'address',
+  'adjust',
+  'admit',
+  'adult',
+  'advance',
+  'advice',
+  'aerobic',
+  'affair',
+  'afford',
+  'afraid',
+  'again',
+  'age',
+  'agent',
+  'agree',
+  'ahead',
+  'aim',
+  'air',
+  'airport',
+  'aisle',
+  'alarm',
+  'album',
+  'alcohol',
+  'alert',
+  'alien',
+  'all',
+  'alley',
+  'allow',
+  'almost',
+  'alone',
+  'alpha',
+  'already',
+  'also',
+  'alter',
+  'always',
+  'amateur',
+  'amazing',
+  'among',
+  'amount',
+  'amused',
+  'analyst',
+  'anchor',
+  'ancient',
+  'anger',
+  'angle',
+  'angry',
+  'animal',
+  'ankle',
+  'announce',
+  'annual',
+  'another',
+  'answer',
+  'antenna',
+  'antique',
+  'anxiety',
+  'any',
+  'apart',
+  'apology',
+  'appear',
+  'apple',
+  'approve',
+  'april',
+  'arch',
+  'arctic',
+  'area',
+  'arena',
+  'argue',
+  'arm',
+  'armed',
+  'armor',
+  'army',
+  'around',
+  'arrange',
+  'arrest',
+  'arrive',
+  'arrow',
+  'art',
+  'artefact',
+  'artist',
+  'artwork',
+  'ask',
+  'aspect',
+  'assault',
+  'asset',
+  'assist',
+  'assume',
+  'asthma',
+  'athlete',
+  'atom',
+  'attack',
+  'attend',
+  'attitude',
+  'attract',
+  'auction',
+  'audit',
+  'august',
+  'aunt',
+  'author',
+  'auto',
+  'autumn',
+  'average',
+  'avocado',
+  'avoid',
+  'awake',
+  'aware',
+  'away',
+  'awesome',
+  'awful',
+  'awkward',
+  'axis',
+  'baby',
+  'bachelor',
+  'bacon',
+  'badge',
+  'bag',
+  'balance',
+  'balcony',
+  'ball',
+  'bamboo',
+  'banana',
+  'banner',
+  'bar',
+  'barely',
+  'bargain',
+  'barrel',
+  'base',
+  'basic',
+  'basket',
+  'battle',
+  'beach',
+  'bean',
+  'beauty',
+  'because',
+  'become',
+  'beef',
+  'before',
+  'begin',
+  'behave',
+  'behind',
+  'believe',
+  'below',
+  'belt',
+  'bench',
+  'benefit',
+  'best',
+  'betray',
+  'better',
+  'between',
+  'beyond',
+  'bicycle',
+  'bid',
+  'bike',
+  'bind',
+  'biology',
+  'bird',
+  'birth',
+  'bitter',
+  'black',
+  'blade',
+  'blame',
+  'blanket',
+  'blast',
+  'bleak',
+  'bless',
+  'blind',
+  'blood',
+  'blossom',
+  'blouse',
+  'blue',
+  'blur',
+  'blush',
+  'board',
+  'boat',
+  'body',
+  'boil',
+  'bomb',
+  'bone',
+  'bonus',
+  'book',
+  'boost',
+  'border',
+  'boring',
+  'borrow',
+  'boss',
+  'bottom',
+  'bounce',
+  'box',
+  'boy',
+  'bracket',
+  'brain',
+  'brand',
+  'brass',
+  'brave',
+  'bread',
+  'breeze',
+  'brick',
+  'bridge',
+  'brief',
+  'bright',
+  'bring',
+  'brisk',
+  'broccoli',
+  'broken',
+  'bronze',
+  'broom',
+  'brother',
+  'brown',
+  'brush',
+  'bubble',
+  'buddy',
+  'budget',
+  'buffalo',
+  'build',
+  'bulb',
+  'bulk',
+  'bullet',
+  'bundle',
+  'bunker',
+  'burden',
+  'burger',
+  'burst',
+  'bus',
+  'business',
+  'busy',
+  'butter',
+  'buyer',
+  'buzz',
+  'cabbage',
+  'cabin',
+  'cable',
+  'cactus',
+  'cage',
+  'cake',
+  'call',
+  'calm',
+  'camera',
+  'camp',
+  'can',
+  'canal',
+  'cancel',
+  'candy',
+  'cannon',
+  'canoe',
+  'canvas',
+  'canyon',
+  'capable',
+  'capital',
+  'captain',
+  'car',
+  'carbon',
+  'card',
+  'cargo',
+  'carpet',
+  'carry',
+  'cart',
+  'case',
+  'cash',
+  'casino',
+  'castle',
+  'casual',
+  'cat',
+  'catalog',
+  'catch',
+  'category',
+  'cattle',
+  'caught',
+  'cause',
+  'caution',
+  'cave',
+  'ceiling',
+  'celery',
+  'cement',
+  'census',
+  'century',
+  'cereal',
+  'certain',
+  'chair',
+  'chalk',
+  'champion',
+  'change',
+  'chaos',
+  'chapter',
+  'charge',
+  'chase',
+  'chat',
+  'cheap',
+  'check',
+  'cheese',
+  'chef',
+  'cherry',
+  'chest',
+  'chicken',
+  'chief',
+  'child',
+  'chimney',
+  'choice',
+  'choose',
+  'chronic',
+  'chuckle',
+  'chunk',
+  'churn',
+  'cigar',
+  'cinnamon',
+  'circle',
+  'citizen',
+  'city',
+  'civil',
+  'claim',
+  'clap',
+  'clarify',
+  'claw',
+  'clay',
+  'clean',
+  'clerk',
+  'clever',
+  'click',
+  'client',
+  'cliff',
+  'climb',
+  'clinic',
+  'clip',
+  'clock',
+  'clog',
+  'close',
+  'cloth',
+  'cloud',
+  'clown',
+  'club',
+  'clump',
+  'cluster',
+  'clutch',
+  'coach',
+  'coast',
+  'coconut',
+  'code',
+  'coffee',
+  'coil',
+  'coin',
+  'collect',
+  'color',
+  'column',
+  'combine',
+  'come',
+  'comfort',
+  'comic',
+  'common',
+  'company',
+  'concert',
+  'conduct',
+  'confirm',
+  'congress',
+  'connect',
+  'consider',
+  'control',
+  'convince',
+  'cook',
+  'cool',
+  'copper',
+  'copy',
+  'coral',
+  'core',
+  'corn',
+  'correct',
+  'cost',
+  'cotton',
+  'couch',
+  'country',
+  'couple',
+  'course',
+  'cousin',
+  'cover',
+  'coyote',
+  'crack',
+  'cradle',
+  'craft',
+  'cram',
+  'crane',
+  'crash',
+  'crater',
+  'crawl',
+  'crazy',
+  'cream',
+  'credit',
+  'creek',
+  'crew',
+  'cricket',
+  'crime',
+  'crisp',
+  'critic',
+  'crop',
+  'cross',
+  'crouch',
+  'crowd',
+  'crucial',
+  'cruel',
+  'cruise',
+  'crumble',
+  'crunch',
+  'crush',
+  'cry',
+  'crystal',
+  'cube',
+  'culture',
+  'cup',
+  'cupboard',
+  'curious',
+  'current',
+  'curtain',
+  'curve',
+  'cushion',
+  'custom',
+  'cute',
+  'cycle',
+  'dad',
+  'damage',
+  'damp',
+  'dance',
+  'danger',
+  'daring',
+  'dash',
+  'daughter',
+  'dawn',
+  'day',
+  'deal',
+  'debate',
+  'debris',
+  'decade',
+  'december',
+  'decide',
+  'decline',
+  'decorate',
+  'decrease',
+  'deer',
+  'defense',
+  'define',
+  'defy',
+  'degree',
+  'delay',
+  'deliver',
+  'demand',
+  'demise',
+  'denial',
+  'dentist',
+  'deny',
+  'depart',
+  'depend',
+  'deposit',
+  'depth',
+  'deputy',
+  'derive',
+  'describe',
+  'desert',
+  'design',
+  'desk',
+  'despair',
+  'destroy',
+  'detail',
+  'detect',
+  'develop',
+  'device',
+  'devote',
+  'diagram',
+  'dial',
+  'diamond',
+  'diary',
+  'dice',
+  'diesel',
+  'diet',
+  'differ',
+  'digital',
+  'dignity',
+  'dilemma',
+  'dinner',
+  'dinosaur',
+  'direct',
+  'dirt',
+  'disagree',
+  'discover',
+  'disease',
+  'dish',
+  'dismiss',
+  'disorder',
+  'display',
+  'distance',
+  'divert',
+  'divide',
+  'divorce',
+  'dizzy',
+  'doctor',
+  'document',
+  'dog',
+  'doll',
+  'dolphin',
+  'domain',
+  'donate',
+  'donkey',
+  'donor',
+  'door',
+  'dose',
+  'double',
+  'dove',
+  'draft',
+  'dragon',
+  'drama',
+  'drastic',
+  'draw',
+  'dream',
+  'dress',
+  'drift',
+  'drill',
+  'drink',
+  'drip',
+  'drive',
+  'drop',
+  'drum',
+  'dry',
+  'duck',
+  'dumb',
+  'dune',
+  'during',
+  'dust',
+  'dutch',
+  'duty',
+  'dwarf',
+  'dynamic',
+  'eager',
+  'eagle',
+  'early',
+  'earn',
+  'earth',
+  'easily',
+  'east',
+  'easy',
+  'echo',
+  'ecology',
+  'economy',
+  'edge',
+  'edit',
+  'educate',
+  'effort',
+  'egg',
+  'eight',
+  'either',
+  'elbow',
+  'elder',
+  'electric',
+  'elegant',
+  'element',
+  'elephant',
+  'elevator',
+  'elite',
+  'else',
+  'embark',
+  'embody',
+  'embrace',
+  'emerge',
+  'emotion',
+  'employ',
+  'empower',
+  'empty',
+  'enable',
+  'enact',
+  'end',
+  'endless',
+  'endorse',
+  'enemy',
+  'energy',
+  'enforce',
+  'engage',
+  'engine',
+  'enhance',
+  'enjoy',
+  'enlist',
+  'enough',
+  'enrich',
+  'enroll',
+  'ensure',
+  'enter',
+  'entire',
+  'entry',
+  'envelope',
+  'episode',
+  'equal',
+  'equip',
+  'era',
+  'erase',
+  'erode',
+  'erosion',
+  'error',
+  'erupt',
+  'escape',
+  'essay',
+  'essence',
+  'estate',
+  'eternal',
+  'ethics',
+  'evidence',
+  'evil',
+  'evoke',
+  'evolve',
+  'exact',
+  'example',
+  'excess',
+  'exchange',
+  'excite',
+  'exclude',
+  'excuse',
+  'execute',
+  'exercise',
+  'exhaust',
+  'exhibit',
+  'exile',
+  'exist',
+  'exit',
+  'exotic',
+  'expand',
+  'expect',
+  'expire',
+  'explain',
+  'expose',
+  'express',
+  'extend',
+  'extra',
+  'eye',
+  'eyebrow',
+  'fabric',
+  'face',
+  'faculty',
+  'fade',
+  'faint',
+  'faith',
+  'fall',
+  'false',
+  'fame',
+  'family',
+  'famous',
+  'fan',
+  'fancy',
+  'fantasy',
+  'farm',
+  'fashion',
+  'fat',
+  'fatal',
+  'father',
+  'fatigue',
+  'fault',
+  'favorite',
+  'feature',
+  'february',
+  'federal',
+  'fee',
+  'feed',
+  'feel',
+  'female',
+  'fence',
+  'festival',
+  'fetch',
+  'fever',
+  'few',
+  'fiber',
+  'fiction',
+  'field',
+  'figure',
+  'file',
+  'film',
+  'filter',
+  'final',
+  'find',
+  'fine',
+  'finger',
+  'finish',
+  'fire',
+  'firm',
+  'first',
+  'fiscal',
+  'fish',
+  'fit',
+  'fitness',
+  'fix',
+  'flag',
+  'flame',
+  'flash',
+  'flat',
+  'flavor',
+  'flee',
+  'flight',
+  'flip',
+  'float',
+  'flock',
+  'floor',
+  'flower',
+  'fluid',
+  'flush',
+  'fly',
+  'foam',
+  'focus',
+  'fog',
+  'foil',
+  'fold',
+  'follow',
+  'food',
+  'foot',
+  'force',
+  'forest',
+  'forget',
+  'fork',
+  'fortune',
+  'forum',
+  'forward',
+  'fossil',
+  'foster',
+  'found',
+  'fox',
+  'fragile',
+  'frame',
+  'frequent',
+  'fresh',
+  'friend',
+  'fringe',
+  'frog',
+  'front',
+  'frost',
+  'frown',
+  'frozen',
+  'fruit',
+  'fuel',
+  'fun',
+  'funny',
+  'furnace',
+  'fury',
+  'future',
+  'gadget',
+  'gain',
+  'galaxy',
+  'gallery',
+  'game',
+  'gap',
+  'garage',
+  'garbage',
+  'garden',
+  'garlic',
+  'garment',
+  'gas',
+  'gasp',
+  'gate',
+  'gather',
+  'gauge',
+  'gaze',
+  'general',
+  'genius',
+  'genre',
+  'gentle',
+  'genuine',
+  'gesture',
+  'ghost',
+  'giant',
+  'gift',
+  'giggle',
+  'ginger',
+  'giraffe',
+  'girl',
+  'give',
+  'glad',
+  'glance',
+  'glare',
+  'glass',
+  'glide',
+  'glimpse',
+  'globe',
+  'gloom',
+  'glory',
+  'glove',
+  'glow',
+  'glue',
+  'goat',
+  'goddess',
+  'gold',
+  'good',
+  'goose',
+  'gorilla',
+  'gospel',
+  'gossip',
+  'govern',
+  'gown',
+  'grab',
+  'grace',
+  'grain',
+  'grant',
+  'grape',
+  'grass',
+  'gravity',
+  'great',
+  'green',
+  'grid',
+  'grief',
+  'grit',
+  'grocery',
+  'group',
+  'grow',
+  'grunt',
+  'guard',
+  'guess',
+  'guide',
+  'guilt',
+  'guitar',
+  'gun',
+  'gym',
+  'habit',
+  'hair',
+  'half',
+  'hammer',
+  'hamster',
+  'hand',
+  'happy',
+  'harbor',
+  'hard',
+  'harsh',
+  'harvest',
+  'hat',
+  'have',
+  'hawk',
+  'hazard',
+  'head',
+  'health',
+  'heart',
+  'heavy',
+  'hedgehog',
+  'height',
+  'hello',
+  'helmet',
+  'help',
+  'hen',
+  'hero',
+  'hidden',
+  'high',
+  'hill',
+  'hint',
+  'hip',
+  'hire',
+  'history',
+  'hobby',
+  'hockey',
+  'hold',
+  'hole',
+  'holiday',
+  'hollow',
+  'home',
+  'honey',
+  'hood',
+  'hope',
+  'horn',
+  'horror',
+  'horse',
+  'hospital',
+  'host',
+  'hotel',
+  'hour',
+  'hover',
+  'hub',
+  'huge',
+  'human',
+  'humble',
+  'humor',
+  'hundred',
+  'hungry',
+  'hunt',
+  'hurdle',
+  'hurry',
+  'hurt',
+  'husband',
+  'hybrid',
+  'ice',
+  'icon',
+  'idea',
+  'identify',
+  'idle',
+  'ignore',
+  'ill',
+  'illegal',
+  'illness',
+  'image',
+  'imitate',
+  'immense',
+  'immune',
+  'impact',
+  'impose',
+  'improve',
+  'impulse',
+  'inch',
+  'include',
+  'income',
+  'increase',
+  'index',
+  'indicate',
+  'indoor',
+  'industry',
+  'infant',
+  'inflict',
+  'inform',
+  'inhale',
+  'inherit',
+  'initial',
+  'inject',
+  'injury',
+  'inmate',
+  'inner',
+  'innocent',
+  'input',
+  'inquiry',
+  'insane',
+  'insect',
+  'inside',
+  'inspire',
+  'install',
+  'intact',
+  'interest',
+  'into',
+  'invest',
+  'invite',
+  'involve',
+  'iron',
+  'island',
+  'isolate',
+  'issue',
+  'item',
+  'ivory',
+  'jacket',
+  'jaguar',
+  'jar',
+  'jazz',
+  'jealous',
+  'jeans',
+  'jelly',
+  'jewel',
+  'job',
+  'join',
+  'joke',
+  'journey',
+  'joy',
+  'judge',
+  'juice',
+  'jump',
+  'jungle',
+  'junior',
+  'junk',
+  'just',
+  'kangaroo',
+  'keen',
+  'keep',
+  'ketchup',
+  'key',
+  'kick',
+  'kid',
+  'kidney',
+  'kind',
+  'kingdom',
+  'kiss',
+  'kit',
+  'kitchen',
+  'kite',
+  'kitten',
+  'kiwi',
+  'knee',
+  'knife',
+  'knock',
+  'know',
+  'lab',
+  'label',
+  'labor',
+  'ladder',
+  'lady',
+  'lake',
+  'lamp',
+  'language',
+  'laptop',
+  'large',
+  'later',
+  'latin',
+  'laugh',
+  'laundry',
+  'lava',
+  'law',
+  'lawn',
+  'lawsuit',
+  'layer',
+  'lazy',
+  'leader',
+  'leaf',
+  'learn',
+  'leave',
+  'lecture',
+  'left',
+  'leg',
+  'legal',
+  'legend',
+  'leisure',
+  'lemon',
+  'lend',
+  'length',
+  'lens',
+  'leopard',
+  'lesson',
+  'letter',
+  'level',
+  'liar',
+  'liberty',
+  'library',
+  'license',
+  'life',
+  'lift',
+  'light',
+  'like',
+  'limb',
+  'limit',
+  'link',
+  'lion',
+  'liquid',
+  'list',
+  'little',
+  'live',
+  'lizard',
+  'load',
+  'loan',
+  'lobster',
+  'local',
+  'lock',
+  'logic',
+  'lonely',
+  'long',
+  'loop',
+  'lottery',
+  'loud',
+  'lounge',
+  'love',
+  'loyal',
+  'lucky',
+  'luggage',
+  'lumber',
+  'lunar',
+  'lunch',
+  'luxury',
+  'lyrics',
+  'machine',
+  'mad',
+  'magic',
+  'magnet',
+  'maid',
+  'mail',
+  'main',
+  'major',
+  'make',
+  'mammal',
+  'man',
+  'manage',
+  'mandate',
+  'mango',
+  'mansion',
+  'manual',
+  'maple',
+  'marble',
+  'march',
+  'margin',
+  'marine',
+  'market',
+  'marriage',
+  'mask',
+  'mass',
+  'master',
+  'match',
+  'material',
+  'math',
+  'matrix',
+  'matter',
+  'maximum',
+  'maze',
+  'meadow',
+  'mean',
+  'measure',
+  'meat',
+  'mechanic',
+  'medal',
+  'media',
+  'melody',
+  'melt',
+  'member',
+  'memory',
+  'mention',
+  'menu',
+  'mercy',
+  'merge',
+  'merit',
+  'merry',
+  'mesh',
+  'message',
+  'metal',
+  'method',
+  'middle',
+  'midnight',
+  'milk',
+  'million',
+  'mimic',
+  'mind',
+  'minimum',
+  'minor',
+  'minute',
+  'miracle',
+  'mirror',
+  'misery',
+  'miss',
+  'mistake',
+  'mix',
+  'mixed',
+  'mixture',
+  'mobile',
+  'model',
+  'modify',
+  'mom',
+  'moment',
+  'monitor',
+  'monkey',
+  'monster',
+  'month',
+  'moon',
+  'moral',
+  'more',
+  'morning',
+  'mosquito',
+  'mother',
+  'motion',
+  'motor',
+  'mountain',
+  'mouse',
+  'move',
+  'movie',
+  'much',
+  'muffin',
+  'mule',
+  'multiply',
+  'muscle',
+  'museum',
+  'mushroom',
+  'music',
+  'must',
+  'mutual',
+  'myself',
+  'mystery',
+  'myth',
+  'naive',
+  'name',
+  'napkin',
+  'narrow',
+  'nasty',
+  'nation',
+  'nature',
+  'near',
+  'neck',
+  'need',
+  'negative',
+  'neglect',
+  'neither',
+  'nephew',
+  'nerve',
+  'nest',
+  'net',
+  'network',
+  'neutral',
+  'never',
+  'news',
+  'next',
+  'nice',
+  'night',
+  'noble',
+  'noise',
+  'nominee',
+  'noodle',
+  'normal',
+  'north',
+  'nose',
+  'notable',
+  'note',
+  'nothing',
+  'notice',
+  'novel',
+  'now',
+  'nuclear',
+  'number',
+  'nurse',
+  'nut',
+  'oak',
+  'obey',
+  'object',
+  'oblige',
+  'obscure',
+  'observe',
+  'obtain',
+  'obvious',
+  'occur',
+  'ocean',
+  'october',
+  'odor',
+  'off',
+  'offer',
+  'office',
+  'often',
+  'oil',
+  'okay',
+  'old',
+  'olive',
+  'olympic',
+  'omit',
+  'once',
+  'one',
+  'onion',
+  'online',
+  'only',
+  'open',
+  'opera',
+  'opinion',
+  'oppose',
+  'option',
+  'orange',
+  'orbit',
+  'orchard',
+  'order',
+  'ordinary',
+  'organ',
+  'orient',
+  'original',
+  'orphan',
+  'ostrich',
+  'other',
+  'outdoor',
+  'outer',
+  'output',
+  'outside',
+  'oval',
+  'oven',
+  'over',
+  'own',
+  'owner',
+  'oxygen',
+  'oyster',
+  'ozone',
+  'pact',
+  'paddle',
+  'page',
+  'pair',
+  'palace',
+  'palm',
+  'panda',
+  'panel',
+  'panic',
+  'panther',
+  'paper',
+  'parade',
+  'parent',
+  'park',
+  'parrot',
+  'party',
+  'pass',
+  'patch',
+  'path',
+  'patient',
+  'patrol',
+  'pattern',
+  'pause',
+  'pave',
+  'payment',
+  'peace',
+  'peanut',
+  'pear',
+  'peasant',
+  'pelican',
+  'pen',
+  'penalty',
+  'pencil',
+  'people',
+  'pepper',
+  'perfect',
+  'permit',
+  'person',
+  'pet',
+  'phone',
+  'photo',
+  'phrase',
+  'physical',
+  'piano',
+  'picnic',
+  'picture',
+  'piece',
+  'pig',
+  'pigeon',
+  'pill',
+  'pilot',
+  'pink',
+  'pioneer',
+  'pipe',
+  'pistol',
+  'pitch',
+  'pizza',
+  'place',
+  'planet',
+  'plastic',
+  'plate',
+  'play',
+  'please',
+  'pledge',
+  'pluck',
+  'plug',
+  'plunge',
+  'poem',
+  'poet',
+  'point',
+  'polar',
+  'pole',
+  'police',
+  'pond',
+  'pony',
+  'pool',
+  'popular',
+  'portion',
+  'position',
+  'possible',
+  'post',
+  'potato',
+  'pottery',
+  'poverty',
+  'powder',
+  'power',
+  'practice',
+  'praise',
+  'predict',
+  'prefer',
+  'prepare',
+  'present',
+  'pretty',
+  'prevent',
+  'price',
+  'pride',
+  'primary',
+  'print',
+  'priority',
+  'prison',
+  'private',
+  'prize',
+  'problem',
+  'process',
+  'produce',
+  'profit',
+  'program',
+  'project',
+  'promote',
+  'proof',
+  'property',
+  'prosper',
+  'protect',
+  'proud',
+  'provide',
+  'public',
+  'pudding',
+  'pull',
+  'pulp',
+  'pulse',
+  'pumpkin',
+  'punch',
+  'pupil',
+  'puppy',
+  'purchase',
+  'purity',
+  'purpose',
+  'purse',
+  'push',
+  'put',
+  'puzzle',
+  'pyramid',
+  'quality',
+  'quantum',
+  'quarter',
+  'question',
+  'quick',
+  'quit',
+  'quiz',
+  'quote',
+  'rabbit',
+  'raccoon',
+  'race',
+  'rack',
+  'radar',
+  'radio',
+  'rail',
+  'rain',
+  'raise',
+  'rally',
+  'ramp',
+  'ranch',
+  'random',
+  'range',
+  'rapid',
+  'rare',
+  'rate',
+  'rather',
+  'raven',
+  'raw',
+  'razor',
+  'ready',
+  'real',
+  'reason',
+  'rebel',
+  'rebuild',
+  'recall',
+  'receive',
+  'recipe',
+  'record',
+  'recycle',
+  'reduce',
+  'reflect',
+  'reform',
+  'refuse',
+  'region',
+  'regret',
+  'regular',
+  'reject',
+  'relax',
+  'release',
+  'relief',
+  'rely',
+  'remain',
+  'remember',
+  'remind',
+  'remove',
+  'render',
+  'renew',
+  'rent',
+  'reopen',
+  'repair',
+  'repeat',
+  'replace',
+  'report',
+  'require',
+  'rescue',
+  'resemble',
+  'resist',
+  'resource',
+  'response',
+  'result',
+  'retire',
+  'retreat',
+  'return',
+  'reunion',
+  'reveal',
+  'review',
+  'reward',
+  'rhythm',
+  'rib',
+  'ribbon',
+  'rice',
+  'rich',
+  'ride',
+  'ridge',
+  'rifle',
+  'right',
+  'rigid',
+  'ring',
+  'riot',
+  'ripple',
+  'risk',
+  'ritual',
+  'rival',
+  'river',
+  'road',
+  'roast',
+  'robot',
+  'robust',
+  'rocket',
+  'romance',
+  'roof',
+  'rookie',
+  'room',
+  'rose',
+  'rotate',
+  'rough',
+  'round',
+  'route',
+  'royal',
+  'rubber',
+  'rude',
+  'rug',
+  'rule',
+  'run',
+  'runway',
+  'rural',
+  'sad',
+  'saddle',
+  'sadness',
+  'safe',
+  'sail',
+  'salad',
+  'salmon',
+  'salon',
+  'salt',
+  'salute',
+  'same',
+  'sample',
+  'sand',
+  'satisfy',
+  'satoshi',
+  'sauce',
+  'sausage',
+  'save',
+  'say',
+  'scale',
+  'scan',
+  'scare',
+  'scatter',
+  'scene',
+  'scheme',
+  'school',
+  'science',
+  'scissors',
+  'scorpion',
+  'scout',
+  'scrap',
+  'screen',
+  'script',
+  'scrub',
+  'sea',
+  'search',
+  'season',
+  'seat',
+  'second',
+  'secret',
+  'section',
+  'security',
+  'seed',
+  'seek',
+  'segment',
+  'select',
+  'sell',
+  'seminar',
+  'senior',
+  'sense',
+  'sentence',
+  'series',
+  'service',
+  'session',
+  'settle',
+  'setup',
+  'seven',
+  'shadow',
+  'shaft',
+  'shallow',
+  'share',
+  'shed',
+  'shell',
+  'sheriff',
+  'shield',
+  'shift',
+  'shine',
+  'ship',
+  'shiver',
+  'shock',
+  'shoe',
+  'shoot',
+  'shop',
+  'short',
+  'shoulder',
+  'shove',
+  'shrimp',
+  'shrug',
+  'shuffle',
+  'shy',
+  'sibling',
+  'sick',
+  'side',
+  'siege',
+  'sight',
+  'sign',
+  'silent',
+  'silk',
+  'silly',
+  'silver',
+  'similar',
+  'simple',
+  'since',
+  'sing',
+  'siren',
+  'sister',
+  'situate',
+  'six',
+  'size',
+  'skate',
+  'sketch',
+  'ski',
+  'skill',
+  'skin',
+  'skirt',
+  'skull',
+  'slab',
+  'slam',
+  'sleep',
+  'slender',
+  'slice',
+  'slide',
+  'slight',
+  'slim',
+  'slogan',
+  'slot',
+  'slow',
+  'slush',
+  'small',
+  'smart',
+  'smile',
+  'smoke',
+  'smooth',
+  'snack',
+  'snake',
+  'snap',
+  'sniff',
+  'snow',
+  'soap',
+  'soccer',
+  'social',
+  'sock',
+  'soda',
+  'soft',
+  'solar',
+  'soldier',
+  'solid',
+  'solution',
+  'solve',
+  'someone',
+  'song',
+  'soon',
+  'sorry',
+  'sort',
+  'soul',
+  'sound',
+  'soup',
+  'source',
+  'south',
+  'space',
+  'spare',
+  'spatial',
+  'spawn',
+  'speak',
+  'special',
+  'speed',
+  'spell',
+  'spend',
+  'sphere',
+  'spice',
+  'spider',
+  'spike',
+  'spin',
+  'spirit',
+  'split',
+  'spoil',
+  'sponsor',
+  'spoon',
+  'sport',
+  'spot',
+  'spray',
+  'spread',
+  'spring',
+  'spy',
+  'square',
+  'squeeze',
+  'squirrel',
+  'stable',
+  'stadium',
+  'staff',
+  'stage',
+  'stairs',
+  'stamp',
+  'stand',
+  'start',
+  'state',
+  'stay',
+  'steak',
+  'steel',
+  'stem',
+  'step',
+  'stereo',
+  'stick',
+  'still',
+  'sting',
+  'stock',
+  'stomach',
+  'stone',
+  'stool',
+  'story',
+  'stove',
+  'strategy',
+  'street',
+  'strike',
+  'strong',
+  'struggle',
+  'student',
+  'stuff',
+  'stumble',
+  'style',
+  'subject',
+  'submit',
+  'subway',
+  'success',
+  'such',
+  'sudden',
+  'suffer',
+  'sugar',
+  'suggest',
+  'suit',
+  'summer',
+  'sun',
+  'sunny',
+  'sunset',
+  'super',
+  'supply',
+  'supreme',
+  'sure',
+  'surface',
+  'surge',
+  'surprise',
+  'surround',
+  'survey',
+  'suspect',
+  'sustain',
+  'swallow',
+  'swamp',
+  'swap',
+  'swarm',
+  'swear',
+  'sweet',
+  'swift',
+  'swim',
+  'swing',
+  'switch',
+  'sword',
+  'symbol',
+  'symptom',
+  'syrup',
+  'system',
+  'table',
+  'tackle',
+  'tag',
+  'tail',
+  'talent',
+  'talk',
+  'tank',
+  'tape',
+  'target',
+  'task',
+  'taste',
+  'tattoo',
+  'taxi',
+  'teach',
+  'team',
+  'tell',
+  'ten',
+  'tenant',
+  'tennis',
+  'tent',
+  'term',
+  'test',
+  'text',
+  'thank',
+  'that',
+  'theme',
+  'then',
+  'theory',
+  'there',
+  'they',
+  'thing',
+  'this',
+  'thought',
+  'three',
+  'thrive',
+  'throw',
+  'thumb',
+  'thunder',
+  'ticket',
+  'tide',
+  'tiger',
+  'tilt',
+  'timber',
+  'time',
+  'tiny',
+  'tip',
+  'tired',
+  'tissue',
+  'title',
+  'toast',
+  'tobacco',
+  'today',
+  'toddler',
+  'toe',
+  'together',
+  'toilet',
+  'token',
+  'tomato',
+  'tomorrow',
+  'tone',
+  'tongue',
+  'tonight',
+  'tool',
+  'tooth',
+  'top',
+  'topic',
+  'topple',
+  'torch',
+  'tornado',
+  'tortoise',
+  'toss',
+  'total',
+  'tourist',
+  'toward',
+  'tower',
+  'town',
+  'toy',
+  'track',
+  'trade',
+  'traffic',
+  'tragic',
+  'train',
+  'transfer',
+  'trap',
+  'trash',
+  'travel',
+  'tray',
+  'treat',
+  'tree',
+  'trend',
+  'trial',
+  'tribe',
+  'trick',
+  'trigger',
+  'trim',
+  'trip',
+  'trophy',
+  'trouble',
+  'truck',
+  'true',
+  'truly',
+  'trumpet',
+  'trust',
+  'truth',
+  'try',
+  'tube',
+  'tuition',
+  'tumble',
+  'tuna',
+  'tunnel',
+  'turkey',
+  'turn',
+  'turtle',
+  'twelve',
+  'twenty',
+  'twice',
+  'twin',
+  'twist',
+  'two',
+  'type',
+  'typical',
+  'ugly',
+  'umbrella',
+  'unable',
+  'unaware',
+  'uncle',
+  'uncover',
+  'under',
+  'undo',
+  'unfair',
+  'unfold',
+  'unhappy',
+  'uniform',
+  'unique',
+  'unit',
+  'universe',
+  'unknown',
+  'unlock',
+  'until',
+  'unusual',
+  'unveil',
+  'update',
+  'upgrade',
+  'uphold',
+  'upon',
+  'upper',
+  'upset',
+  'urban',
+  'urge',
+  'usage',
+  'use',
+  'used',
+  'useful',
+  'useless',
+  'usual',
+  'utility',
+  'vacant',
+  'vacuum',
+  'vague',
+  'valid',
+  'valley',
+  'valve',
+  'van',
+  'vanish',
+  'vapor',
+  'various',
+  'vast',
+  'vault',
+  'vehicle',
+  'velvet',
+  'vendor',
+  'venture',
+  'venue',
+  'verb',
+  'verify',
+  'version',
+  'very',
+  'vessel',
+  'veteran',
+  'viable',
+  'vibrant',
+  'vicious',
+  'victory',
+  'video',
+  'view',
+  'village',
+  'vintage',
+  'violin',
+  'virtual',
+  'virus',
+  'visa',
+  'visit',
+  'visual',
+  'vital',
+  'vivid',
+  'vocal',
+  'voice',
+  'void',
+  'volcano',
+  'volume',
+  'vote',
+  'voyage',
+  'wage',
+  'wagon',
+  'wait',
+  'walk',
+  'wall',
+  'walnut',
+  'want',
+  'warfare',
+  'warm',
+  'warrior',
+  'wash',
+  'wasp',
+  'waste',
+  'water',
+  'wave',
+  'way',
+  'wealth',
+  'weapon',
+  'wear',
+  'weasel',
+  'weather',
+  'web',
+  'wedding',
+  'weekend',
+  'weird',
+  'welcome',
+  'west',
+  'wet',
+  'whale',
+  'what',
+  'wheat',
+  'wheel',
+  'when',
+  'where',
+  'whip',
+  'whisper',
+  'wide',
+  'width',
+  'wife',
+  'wild',
+  'will',
+  'win',
+  'window',
+  'wine',
+  'wing',
+  'wink',
+  'winner',
+  'winter',
+  'wire',
+  'wisdom',
+  'wise',
+  'wish',
+  'witness',
+  'wolf',
+  'woman',
+  'wonder',
+  'wood',
+  'wool',
+  'word',
+  'work',
+  'world',
+  'worry',
+  'worth',
+  'wrap',
+  'wreck',
+  'wrestle',
+  'wrist',
+  'write',
+  'wrong',
+  'yard',
+  'year',
+  'yellow',
+  'you',
+  'young',
+  'youth',
+  'zebra',
+  'zero',
+  'zone',
+  'zoo'
+];
\ No newline at end of file
diff --git a/cw_lightning/lib/bitcoin_mnemonic_is_incorrect_exception.dart b/cw_lightning/lib/bitcoin_mnemonic_is_incorrect_exception.dart
new file mode 100644
index 000000000..8d0583ce5
--- /dev/null
+++ b/cw_lightning/lib/bitcoin_mnemonic_is_incorrect_exception.dart
@@ -0,0 +1,5 @@
+class BitcoinMnemonicIsIncorrectException implements Exception {
+  @override
+  String toString() =>
+      'Bitcoin mnemonic has incorrect format. Mnemonic should contain 12 or 24 words separated by space.';
+}
diff --git a/cw_lightning/lib/bitcoin_wallet_creation_credentials.dart b/cw_lightning/lib/bitcoin_wallet_creation_credentials.dart
new file mode 100644
index 000000000..37b272a1b
--- /dev/null
+++ b/cw_lightning/lib/bitcoin_wallet_creation_credentials.dart
@@ -0,0 +1,23 @@
+import 'package:cw_core/wallet_credentials.dart';
+import 'package:cw_core/wallet_info.dart';
+
+class BitcoinNewWalletCredentials extends WalletCredentials {
+  BitcoinNewWalletCredentials({required String name, WalletInfo? walletInfo})
+      : super(name: name, walletInfo: walletInfo);
+}
+
+class BitcoinRestoreWalletFromSeedCredentials extends WalletCredentials {
+  BitcoinRestoreWalletFromSeedCredentials(
+      {required String name, required String password, required this.mnemonic, WalletInfo? walletInfo})
+      : super(name: name, password: password, walletInfo: walletInfo);
+
+  final String mnemonic;
+}
+
+class BitcoinRestoreWalletFromWIFCredentials extends WalletCredentials {
+  BitcoinRestoreWalletFromWIFCredentials(
+      {required String name, required String password, required this.wif, WalletInfo? walletInfo})
+      : super(name: name, password: password, walletInfo: walletInfo);
+
+  final String wif;
+}
\ No newline at end of file
diff --git a/cw_lightning/lib/cw_lightning.dart b/cw_lightning/lib/cw_lightning.dart
new file mode 100644
index 000000000..d3fa89338
--- /dev/null
+++ b/cw_lightning/lib/cw_lightning.dart
@@ -0,0 +1,7 @@
+library cw_bitcoin;
+
+/// A Calculator.
+class Calculator {
+  /// Returns [value] plus 1.
+  int addOne(int value) => value + 1;
+}
diff --git a/cw_lightning/lib/lightning_wallet.dart b/cw_lightning/lib/lightning_wallet.dart
new file mode 100644
index 000000000..c6f04cdc7
--- /dev/null
+++ b/cw_lightning/lib/lightning_wallet.dart
@@ -0,0 +1,149 @@
+import 'dart:io';
+
+import 'package:breez_sdk/breez_sdk.dart';
+import 'package:breez_sdk/bridge_generated.dart';
+import 'package:cw_bitcoin/bitcoin_mnemonic.dart';
+import 'package:cw_core/crypto_currency.dart';
+import 'package:cw_core/unspent_coins_info.dart';
+import 'package:hive/hive.dart';
+import 'package:mobx/mobx.dart';
+import 'package:flutter/foundation.dart';
+import 'package:bitcoin_flutter/bitcoin_flutter.dart' as bitcoin;
+import 'package:cw_bitcoin/electrum_wallet_snapshot.dart';
+import 'package:cw_lightning/electrum_wallet.dart';
+import 'package:cw_core/wallet_info.dart';
+import 'package:cw_lightning/bitcoin_address_record.dart';
+import 'package:cw_lightning/electrum_balance.dart';
+import 'package:cw_lightning/bitcoin_wallet_addresses.dart';
+import 'package:path_provider/path_provider.dart';
+import 'package:cw_lightning/.secrets.g.dart' as secrets;
+
+part 'bitcoin_wallet.g.dart';
+
+class LightningWallet = LightningWalletBase with _$LightningWallet;
+
+abstract class LightningWalletBase extends ElectrumWallet with Store {
+  LightningWalletBase(
+      {required String mnemonic,
+      required String password,
+      required WalletInfo walletInfo,
+      required Box<UnspentCoinsInfo> unspentCoinsInfo,
+      required Uint8List seedBytes,
+      List<BitcoinAddressRecord>? initialAddresses,
+      ElectrumBalance? initialBalance,
+      int initialRegularAddressIndex = 0,
+      int initialChangeAddressIndex = 0})
+      : super(
+            mnemonic: mnemonic,
+            password: password,
+            walletInfo: walletInfo,
+            unspentCoinsInfo: unspentCoinsInfo,
+            networkType: bitcoin.bitcoin,
+            initialAddresses: initialAddresses,
+            initialBalance: initialBalance,
+            seedBytes: seedBytes,
+            currency: CryptoCurrency.btc) {
+    walletAddresses = BitcoinWalletAddresses(walletInfo,
+        electrumClient: electrumClient,
+        initialAddresses: initialAddresses,
+        initialRegularAddressIndex: initialRegularAddressIndex,
+        initialChangeAddressIndex: initialChangeAddressIndex,
+        mainHd: hd,
+        sideHd: bitcoin.HDWallet.fromSeed(seedBytes, network: networkType).derivePath("m/0'/1"),
+        networkType: networkType);
+
+    // initialize breeze:
+    setupBreeze(seedBytes);
+
+    autorun((_) {
+      this.walletAddresses.isEnabledAutoGenerateSubaddress = this.isEnabledAutoGenerateSubaddress;
+    });
+  }
+
+  static Future<BitcoinWallet> create(
+      {required String mnemonic,
+      required String password,
+      required WalletInfo walletInfo,
+      required Box<UnspentCoinsInfo> unspentCoinsInfo,
+      List<BitcoinAddressRecord>? initialAddresses,
+      ElectrumBalance? initialBalance,
+      int initialRegularAddressIndex = 0,
+      int initialChangeAddressIndex = 0}) async {
+    return BitcoinWallet(
+        mnemonic: mnemonic,
+        password: password,
+        walletInfo: walletInfo,
+        unspentCoinsInfo: unspentCoinsInfo,
+        initialAddresses: initialAddresses,
+        initialBalance: initialBalance,
+        seedBytes: await mnemonicToSeedBytes(mnemonic),
+        initialRegularAddressIndex: initialRegularAddressIndex,
+        initialChangeAddressIndex: initialChangeAddressIndex);
+  }
+
+  static Future<BitcoinWallet> open({
+    required String name,
+    required WalletInfo walletInfo,
+    required Box<UnspentCoinsInfo> unspentCoinsInfo,
+    required String password,
+  }) async {
+    final snp = await ElectrumWallletSnapshot.load(name, walletInfo.type, password);
+    return BitcoinWallet(
+        mnemonic: snp.mnemonic,
+        password: password,
+        walletInfo: walletInfo,
+        unspentCoinsInfo: unspentCoinsInfo,
+        initialAddresses: snp.addresses,
+        initialBalance: snp.balance,
+        seedBytes: await mnemonicToSeedBytes(snp.mnemonic),
+        initialRegularAddressIndex: snp.regularAddressIndex,
+        initialChangeAddressIndex: snp.changeAddressIndex);
+  }
+
+  void printDirectoryTree(Directory directory, {String prefix = ''}) {
+    try {
+      final files = directory.listSync();
+      for (var i = 0; i < files.length; i++) {
+        final isLast = i == files.length - 1;
+        if (files[i] is File) {
+          print(
+              '${prefix}${isLast ? '└─' : '├─'} ${files[i].path.split(Platform.pathSeparator).last}');
+        } else if (files[i] is Directory) {
+          print(
+              '${prefix}${isLast ? '└─' : '├─'} ${files[i].path.split(Platform.pathSeparator).last}');
+          printDirectoryTree(files[i] as Directory, prefix: '${prefix}${isLast ? '   ' : '│  '}');
+        }
+      }
+    } catch (e) {
+      print('Error: $e');
+    }
+  }
+
+  Future<void> setupBreeze(Uint8List seedBytes) async {
+    // Initialize SDK logs listener
+    final sdk = BreezSDK();
+    sdk.initialize();
+
+    NodeConfig breezNodeConfig = NodeConfig.greenlight(
+      config: GreenlightNodeConfig(
+        partnerCredentials: null,
+        inviteCode: secrets.breezInviteCode,
+      ),
+    );
+    Config breezConfig = await sdk.defaultConfig(
+      envType: EnvironmentType.Production,
+      apiKey: secrets.breezApiKey,
+      nodeConfig: breezNodeConfig,
+    );
+
+    printDirectoryTree(Directory((await getApplicationDocumentsDirectory()).path));
+    // Customize the config object according to your needs
+    String workingDir = (await getApplicationDocumentsDirectory()).path;
+    workingDir = "$workingDir/wallets/bitcoin/${walletInfo.name}/breez/";
+    new Directory(workingDir).createSync(recursive: true);
+    breezConfig = breezConfig.copyWith(workingDir: workingDir);
+    await sdk.connect(config: breezConfig, seed: seedBytes);
+
+    print("initialized: ${(await sdk.isInitialized())}");
+  }
+}
diff --git a/cw_lightning/lib/lightning_wallet_service.dart b/cw_lightning/lib/lightning_wallet_service.dart
new file mode 100644
index 000000000..6c4c2b18d
--- /dev/null
+++ b/cw_lightning/lib/lightning_wallet_service.dart
@@ -0,0 +1,105 @@
+import 'dart:io';
+import 'package:cw_lightning/bitcoin_mnemonic.dart';
+import 'package:cw_lightning/bitcoin_mnemonic_is_incorrect_exception.dart';
+import 'package:cw_lightning/bitcoin_wallet_creation_credentials.dart';
+import 'package:cw_core/unspent_coins_info.dart';
+import 'package:cw_core/wallet_base.dart';
+import 'package:cw_core/wallet_service.dart';
+import 'package:cw_bitcoin/lightning_wallet.dart';
+import 'package:cw_core/pathForWallet.dart';
+import 'package:cw_core/wallet_info.dart';
+import 'package:cw_core/wallet_type.dart';
+import 'package:hive/hive.dart';
+import 'package:collection/collection.dart';
+import 'package:breez_sdk/breez_sdk.dart';
+
+class LightningWalletService extends WalletService<
+    BitcoinNewWalletCredentials,
+    BitcoinRestoreWalletFromSeedCredentials,
+    BitcoinRestoreWalletFromWIFCredentials> {
+  BitcoinWalletService(this.walletInfoSource, this.unspentCoinsInfoSource);
+
+  final Box<WalletInfo> walletInfoSource;
+  final Box<UnspentCoinsInfo> unspentCoinsInfoSource;
+
+  @override
+  WalletType getType() => WalletType.bitcoin;
+
+  @override
+  Future<LightningWallet> create(BitcoinNewWalletCredentials credentials) async {
+    final wallet = await LightningWalletBase.create(
+        mnemonic: await generateMnemonic(),
+        password: credentials.password!,
+        walletInfo: credentials.walletInfo!,
+        unspentCoinsInfo: unspentCoinsInfoSource);
+    await wallet.save();
+    await wallet.init();
+    return wallet;
+  }
+
+  @override
+  Future<bool> isWalletExit(String name) async =>
+      File(await pathForWallet(name: name, type: getType())).existsSync();
+
+  @override
+  Future<BitcoinWallet> openWallet(String name, String password) async {
+    final walletInfo = walletInfoSource.values.firstWhereOrNull(
+        (info) => info.id == WalletBase.idFor(name, getType()))!;
+
+    final wallet = await BitcoinWalletBase.open(
+        password: password, name: name, walletInfo: walletInfo,
+        unspentCoinsInfo: unspentCoinsInfoSource);
+    await wallet.init();
+    return wallet;
+  }
+
+  @override
+  Future<void> remove(String wallet) async {
+    File(await pathForWalletDir(name: wallet, type: getType()))
+        .delete(recursive: true);
+    final walletInfo = walletInfoSource.values.firstWhereOrNull(
+        (info) => info.id == WalletBase.idFor(wallet, getType()))!;
+    await walletInfoSource.delete(walletInfo.key);
+  }
+
+  @override
+  Future<void> rename(String currentName, String password, String newName) async {
+    final currentWalletInfo = walletInfoSource.values.firstWhereOrNull(
+        (info) => info.id == WalletBase.idFor(currentName, getType()))!;
+    final currentWallet = await BitcoinWalletBase.open(
+        password: password,
+        name: currentName,
+        walletInfo: currentWalletInfo,
+        unspentCoinsInfo: unspentCoinsInfoSource);
+
+    await currentWallet.renameWalletFiles(newName);
+
+    final newWalletInfo = currentWalletInfo;
+    newWalletInfo.id = WalletBase.idFor(newName, getType());
+    newWalletInfo.name = newName;
+
+    await walletInfoSource.put(currentWalletInfo.key, newWalletInfo);
+  }
+
+  @override
+  Future<BitcoinWallet> restoreFromKeys(
+          BitcoinRestoreWalletFromWIFCredentials credentials) async =>
+      throw UnimplementedError();
+
+  @override
+  Future<BitcoinWallet> restoreFromSeed(
+      BitcoinRestoreWalletFromSeedCredentials credentials) async {
+    if (!validateMnemonic(credentials.mnemonic)) {
+      throw BitcoinMnemonicIsIncorrectException();
+    }
+
+    final wallet = await BitcoinWalletBase.create(
+        password: credentials.password!,
+        mnemonic: credentials.mnemonic,
+        walletInfo: credentials.walletInfo!,
+        unspentCoinsInfo: unspentCoinsInfoSource);
+    await wallet.save();
+    await wallet.init();
+    return wallet;
+  }
+}
\ No newline at end of file
diff --git a/cw_lightning/lib/pending_bitcoin_transaction.dart b/cw_lightning/lib/pending_bitcoin_transaction.dart
new file mode 100644
index 000000000..e2dc10bfb
--- /dev/null
+++ b/cw_lightning/lib/pending_bitcoin_transaction.dart
@@ -0,0 +1,62 @@
+import 'package:cw_bitcoin/bitcoin_commit_transaction_exception.dart';
+import 'package:bitcoin_flutter/bitcoin_flutter.dart' as bitcoin;
+import 'package:cw_core/pending_transaction.dart';
+import 'package:cw_bitcoin/electrum.dart';
+import 'package:cw_bitcoin/bitcoin_amount_format.dart';
+import 'package:cw_bitcoin/electrum_transaction_info.dart';
+import 'package:cw_core/transaction_direction.dart';
+import 'package:cw_core/wallet_type.dart';
+
+class PendingBitcoinTransaction with PendingTransaction {
+  PendingBitcoinTransaction(this._tx, this.type,
+      {required this.electrumClient,
+      required this.amount,
+      required this.fee})
+      : _listeners = <void Function(ElectrumTransactionInfo transaction)>[];
+
+  final WalletType type;
+  final bitcoin.Transaction _tx;
+  final ElectrumClient electrumClient;
+  final int amount;
+  final int fee;
+
+  @override
+  String get id => _tx.getId();
+
+  @override
+  String get hex => _tx.toHex();
+
+  @override
+  String get amountFormatted => bitcoinAmountToString(amount: amount);
+
+  @override
+  String get feeFormatted => bitcoinAmountToString(amount: fee);
+
+  final List<void Function(ElectrumTransactionInfo transaction)> _listeners;
+
+  @override
+  Future<void> commit() async {
+    final result =
+      await electrumClient.broadcastTransaction(transactionRaw: _tx.toHex());
+
+    if (result.isEmpty) {
+      throw BitcoinCommitTransactionException();
+    }
+
+    _listeners?.forEach((listener) => listener(transactionInfo()));
+  }
+
+  void addListener(
+          void Function(ElectrumTransactionInfo transaction) listener) =>
+      _listeners.add(listener);
+
+  ElectrumTransactionInfo transactionInfo() => ElectrumTransactionInfo(type,
+      id: id,
+      height: 0,
+      amount: amount,
+      direction: TransactionDirection.outgoing,
+      date: DateTime.now(),
+      isPending: true,
+      confirmations: 0,
+      fee: fee);
+}
diff --git a/cw_lightning/pubspec.lock b/cw_lightning/pubspec.lock
new file mode 100644
index 000000000..288d2f100
--- /dev/null
+++ b/cw_lightning/pubspec.lock
@@ -0,0 +1,871 @@
+# Generated by pub
+# See https://dart.dev/tools/pub/glossary#lockfile
+packages:
+  _fe_analyzer_shared:
+    dependency: transitive
+    description:
+      name: _fe_analyzer_shared
+      sha256: ae92f5d747aee634b87f89d9946000c2de774be1d6ac3e58268224348cd0101a
+      url: "https://pub.dev"
+    source: hosted
+    version: "61.0.0"
+  analyzer:
+    dependency: transitive
+    description:
+      name: analyzer
+      sha256: ea3d8652bda62982addfd92fdc2d0214e5f82e43325104990d4f4c4a2a313562
+      url: "https://pub.dev"
+    source: hosted
+    version: "5.13.0"
+  archive:
+    dependency: transitive
+    description:
+      name: archive
+      sha256: "20071638cbe4e5964a427cfa0e86dce55d060bc7d82d56f3554095d7239a8765"
+      url: "https://pub.dev"
+    source: hosted
+    version: "3.4.2"
+  args:
+    dependency: transitive
+    description:
+      name: args
+      sha256: "139d809800a412ebb26a3892da228b2d0ba36f0ef5d9a82166e5e52ec8d61611"
+      url: "https://pub.dev"
+    source: hosted
+    version: "2.3.2"
+  asn1lib:
+    dependency: transitive
+    description:
+      name: asn1lib
+      sha256: ab96a1cb3beeccf8145c52e449233fe68364c9641623acd3adad66f8184f1039
+      url: "https://pub.dev"
+    source: hosted
+    version: "1.4.0"
+  async:
+    dependency: transitive
+    description:
+      name: async
+      sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c"
+      url: "https://pub.dev"
+    source: hosted
+    version: "2.11.0"
+  bech32:
+    dependency: transitive
+    description:
+      path: "."
+      ref: "cake-0.2.2"
+      resolved-ref: "05755063b593aa6cca0a4820a318e0ce17de6192"
+      url: "https://github.com/cake-tech/bech32.git"
+    source: git
+    version: "0.2.2"
+  bip32:
+    dependency: transitive
+    description:
+      name: bip32
+      sha256: "54787cd7a111e9d37394aabbf53d1fc5e2e0e0af2cd01c459147a97c0e3f8a97"
+      url: "https://pub.dev"
+    source: hosted
+    version: "2.0.0"
+  bip39:
+    dependency: transitive
+    description:
+      name: bip39
+      sha256: de1ee27ebe7d96b84bb3a04a4132a0a3007dcdd5ad27dd14aa87a29d97c45edc
+      url: "https://pub.dev"
+    source: hosted
+    version: "1.0.6"
+  bitbox:
+    dependency: "direct main"
+    description:
+      path: "."
+      ref: master
+      resolved-ref: ea65073efbaf395a5557e8cd7bd72f195cd7eb11
+      url: "https://github.com/cake-tech/bitbox-flutter.git"
+    source: git
+    version: "1.0.1"
+  bitcoin_flutter:
+    dependency: "direct main"
+    description:
+      path: "."
+      ref: cake-update-v4
+      resolved-ref: e19ffb7e7977278a75b27e0479b3c6f4034223b3
+      url: "https://github.com/cake-tech/bitcoin_flutter.git"
+    source: git
+    version: "2.1.0"
+  boolean_selector:
+    dependency: transitive
+    description:
+      name: boolean_selector
+      sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66"
+      url: "https://pub.dev"
+    source: hosted
+    version: "2.1.1"
+  breez_sdk:
+    dependency: "direct main"
+    description:
+      path: "."
+      ref: "v0.2.14"
+      resolved-ref: "695948a0776b49445fced722a07024edd65ca5cc"
+      url: "https://github.com/breez/breez-sdk-flutter.git"
+    source: git
+    version: "0.2.14"
+  bs58check:
+    dependency: transitive
+    description:
+      name: bs58check
+      sha256: c4a164d42b25c2f6bc88a8beccb9fc7d01440f3c60ba23663a20a70faf484ea9
+      url: "https://pub.dev"
+    source: hosted
+    version: "1.0.2"
+  build:
+    dependency: transitive
+    description:
+      name: build
+      sha256: "3fbda25365741f8251b39f3917fb3c8e286a96fd068a5a242e11c2012d495777"
+      url: "https://pub.dev"
+    source: hosted
+    version: "2.3.1"
+  build_cli_annotations:
+    dependency: transitive
+    description:
+      name: build_cli_annotations
+      sha256: b59d2769769efd6c9ff6d4c4cede0be115a566afc591705c2040b707534b1172
+      url: "https://pub.dev"
+    source: hosted
+    version: "2.1.0"
+  build_config:
+    dependency: transitive
+    description:
+      name: build_config
+      sha256: bf80fcfb46a29945b423bd9aad884590fb1dc69b330a4d4700cac476af1708d1
+      url: "https://pub.dev"
+    source: hosted
+    version: "1.1.1"
+  build_daemon:
+    dependency: transitive
+    description:
+      name: build_daemon
+      sha256: "6bc5544ea6ce4428266e7ea680e945c68806c4aae2da0eb5e9ccf38df8d6acbf"
+      url: "https://pub.dev"
+    source: hosted
+    version: "3.1.0"
+  build_resolvers:
+    dependency: "direct dev"
+    description:
+      name: build_resolvers
+      sha256: "687cf90a3951affac1bd5f9ecb5e3e90b60487f3d9cdc359bb310f8876bb02a6"
+      url: "https://pub.dev"
+    source: hosted
+    version: "2.0.10"
+  build_runner:
+    dependency: "direct dev"
+    description:
+      name: build_runner
+      sha256: b0a8a7b8a76c493e85f1b84bffa0588859a06197863dba8c9036b15581fd9727
+      url: "https://pub.dev"
+    source: hosted
+    version: "2.3.3"
+  build_runner_core:
+    dependency: transitive
+    description:
+      name: build_runner_core
+      sha256: "14febe0f5bac5ae474117a36099b4de6f1dbc52df6c5e55534b3da9591bf4292"
+      url: "https://pub.dev"
+    source: hosted
+    version: "7.2.7"
+  built_collection:
+    dependency: transitive
+    description:
+      name: built_collection
+      sha256: "376e3dd27b51ea877c28d525560790aee2e6fbb5f20e2f85d5081027d94e2100"
+      url: "https://pub.dev"
+    source: hosted
+    version: "5.1.1"
+  built_value:
+    dependency: transitive
+    description:
+      name: built_value
+      sha256: "169565c8ad06adb760c3645bf71f00bff161b00002cace266cad42c5d22a7725"
+      url: "https://pub.dev"
+    source: hosted
+    version: "8.4.3"
+  characters:
+    dependency: transitive
+    description:
+      name: characters
+      sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605"
+      url: "https://pub.dev"
+    source: hosted
+    version: "1.3.0"
+  checked_yaml:
+    dependency: transitive
+    description:
+      name: checked_yaml
+      sha256: "3d1505d91afa809d177efd4eed5bb0eb65805097a1463abdd2add076effae311"
+      url: "https://pub.dev"
+    source: hosted
+    version: "2.0.2"
+  clock:
+    dependency: transitive
+    description:
+      name: clock
+      sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf
+      url: "https://pub.dev"
+    source: hosted
+    version: "1.1.1"
+  code_builder:
+    dependency: transitive
+    description:
+      name: code_builder
+      sha256: "0d43dd1288fd145de1ecc9a3948ad4a6d5a82f0a14c4fdd0892260787d975cbe"
+      url: "https://pub.dev"
+    source: hosted
+    version: "4.4.0"
+  collection:
+    dependency: transitive
+    description:
+      name: collection
+      sha256: "4a07be6cb69c84d677a6c3096fcf960cc3285a8330b4603e0d463d15d9bd934c"
+      url: "https://pub.dev"
+    source: hosted
+    version: "1.17.1"
+  convert:
+    dependency: transitive
+    description:
+      name: convert
+      sha256: "0f08b14755d163f6e2134cb58222dd25ea2a2ee8a195e53983d57c075324d592"
+      url: "https://pub.dev"
+    source: hosted
+    version: "3.1.1"
+  crypto:
+    dependency: transitive
+    description:
+      name: crypto
+      sha256: aa274aa7774f8964e4f4f38cc994db7b6158dd36e9187aaceaddc994b35c6c67
+      url: "https://pub.dev"
+    source: hosted
+    version: "3.0.2"
+  cryptography:
+    dependency: "direct main"
+    description:
+      name: cryptography
+      sha256: e0e37f79665cd5c86e8897f9abe1accfe813c0cc5299dab22256e22fddc1fef8
+      url: "https://pub.dev"
+    source: hosted
+    version: "2.0.5"
+  cw_bitcoin:
+    dependency: "direct main"
+    description:
+      path: "../cw_bitcoin"
+      relative: true
+    source: path
+    version: "0.0.1"
+  cw_core:
+    dependency: "direct main"
+    description:
+      path: "../cw_core"
+      relative: true
+    source: path
+    version: "0.0.1"
+  dart_style:
+    dependency: transitive
+    description:
+      name: dart_style
+      sha256: "7a03456c3490394c8e7665890333e91ae8a49be43542b616e414449ac358acd4"
+      url: "https://pub.dev"
+    source: hosted
+    version: "2.2.4"
+  encrypt:
+    dependency: transitive
+    description:
+      name: encrypt
+      sha256: "4fd4e4fdc21b9d7d4141823e1e6515cd94e7b8d84749504c232999fba25d9bbb"
+      url: "https://pub.dev"
+    source: hosted
+    version: "5.0.1"
+  fake_async:
+    dependency: transitive
+    description:
+      name: fake_async
+      sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78"
+      url: "https://pub.dev"
+    source: hosted
+    version: "1.3.1"
+  ffi:
+    dependency: transitive
+    description:
+      name: ffi
+      sha256: "7bf0adc28a23d395f19f3f1eb21dd7cfd1dd9f8e1c50051c069122e6853bc878"
+      url: "https://pub.dev"
+    source: hosted
+    version: "2.1.0"
+  file:
+    dependency: transitive
+    description:
+      name: file
+      sha256: "1b92bec4fc2a72f59a8e15af5f52cd441e4a7860b49499d69dfa817af20e925d"
+      url: "https://pub.dev"
+    source: hosted
+    version: "6.1.4"
+  fixnum:
+    dependency: transitive
+    description:
+      name: fixnum
+      sha256: "25517a4deb0c03aa0f32fd12db525856438902d9c16536311e76cdc57b31d7d1"
+      url: "https://pub.dev"
+    source: hosted
+    version: "1.1.0"
+  flutter:
+    dependency: "direct main"
+    description: flutter
+    source: sdk
+    version: "0.0.0"
+  flutter_mobx:
+    dependency: "direct main"
+    description:
+      name: flutter_mobx
+      sha256: "0da4add0016387a7bf309a0d0c41d36c6b3ae25ed7a176409267f166509e723e"
+      url: "https://pub.dev"
+    source: hosted
+    version: "2.0.6+5"
+  flutter_rust_bridge:
+    dependency: transitive
+    description:
+      name: flutter_rust_bridge
+      sha256: "02720226035257ad0b571c1256f43df3e1556a499f6bcb004849a0faaa0e87f0"
+      url: "https://pub.dev"
+    source: hosted
+    version: "1.82.6"
+  flutter_test:
+    dependency: "direct dev"
+    description: flutter
+    source: sdk
+    version: "0.0.0"
+  freezed:
+    dependency: transitive
+    description:
+      name: freezed
+      sha256: "57247f692f35f068cae297549a46a9a097100685c6780fe67177503eea5ed4e5"
+      url: "https://pub.dev"
+    source: hosted
+    version: "2.4.7"
+  freezed_annotation:
+    dependency: transitive
+    description:
+      name: freezed_annotation
+      sha256: c3fd9336eb55a38cc1bbd79ab17573113a8deccd0ecbbf926cca3c62803b5c2d
+      url: "https://pub.dev"
+    source: hosted
+    version: "2.4.1"
+  frontend_server_client:
+    dependency: transitive
+    description:
+      name: frontend_server_client
+      sha256: "408e3ca148b31c20282ad6f37ebfa6f4bdc8fede5b74bc2f08d9d92b55db3612"
+      url: "https://pub.dev"
+    source: hosted
+    version: "3.2.0"
+  glob:
+    dependency: transitive
+    description:
+      name: glob
+      sha256: "4515b5b6ddb505ebdd242a5f2cc5d22d3d6a80013789debfbda7777f47ea308c"
+      url: "https://pub.dev"
+    source: hosted
+    version: "2.1.1"
+  graphs:
+    dependency: transitive
+    description:
+      name: graphs
+      sha256: f9e130f3259f52d26f0cfc0e964513796dafed572fa52e45d2f8d6ca14db39b2
+      url: "https://pub.dev"
+    source: hosted
+    version: "2.2.0"
+  hex:
+    dependency: transitive
+    description:
+      name: hex
+      sha256: "4e7cd54e4b59ba026432a6be2dd9d96e4c5205725194997193bf871703b82c4a"
+      url: "https://pub.dev"
+    source: hosted
+    version: "0.2.0"
+  hive:
+    dependency: transitive
+    description:
+      name: hive
+      sha256: "8dcf6db979d7933da8217edcec84e9df1bdb4e4edc7fc77dbd5aa74356d6d941"
+      url: "https://pub.dev"
+    source: hosted
+    version: "2.2.3"
+  hive_generator:
+    dependency: "direct dev"
+    description:
+      name: hive_generator
+      sha256: "06cb8f58ace74de61f63500564931f9505368f45f98958bd7a6c35ba24159db4"
+      url: "https://pub.dev"
+    source: hosted
+    version: "2.0.1"
+  http:
+    dependency: "direct main"
+    description:
+      name: http
+      sha256: "759d1a329847dd0f39226c688d3e06a6b8679668e350e2891a6474f8b4bb8525"
+      url: "https://pub.dev"
+    source: hosted
+    version: "1.1.0"
+  http_multi_server:
+    dependency: transitive
+    description:
+      name: http_multi_server
+      sha256: "97486f20f9c2f7be8f514851703d0119c3596d14ea63227af6f7a481ef2b2f8b"
+      url: "https://pub.dev"
+    source: hosted
+    version: "3.2.1"
+  http_parser:
+    dependency: transitive
+    description:
+      name: http_parser
+      sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b"
+      url: "https://pub.dev"
+    source: hosted
+    version: "4.0.2"
+  intl:
+    dependency: "direct main"
+    description:
+      name: intl
+      sha256: "3bc132a9dbce73a7e4a21a17d06e1878839ffbf975568bc875c60537824b0c4d"
+      url: "https://pub.dev"
+    source: hosted
+    version: "0.18.1"
+  io:
+    dependency: transitive
+    description:
+      name: io
+      sha256: "2ec25704aba361659e10e3e5f5d672068d332fc8ac516421d483a11e5cbd061e"
+      url: "https://pub.dev"
+    source: hosted
+    version: "1.0.4"
+  js:
+    dependency: transitive
+    description:
+      name: js
+      sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3
+      url: "https://pub.dev"
+    source: hosted
+    version: "0.6.7"
+  json_annotation:
+    dependency: transitive
+    description:
+      name: json_annotation
+      sha256: c33da08e136c3df0190bd5bbe51ae1df4a7d96e7954d1d7249fea2968a72d317
+      url: "https://pub.dev"
+    source: hosted
+    version: "4.8.0"
+  logging:
+    dependency: transitive
+    description:
+      name: logging
+      sha256: "04094f2eb032cbb06c6f6e8d3607edcfcb0455e2bb6cbc010cb01171dcb64e6d"
+      url: "https://pub.dev"
+    source: hosted
+    version: "1.1.1"
+  matcher:
+    dependency: transitive
+    description:
+      name: matcher
+      sha256: "6501fbd55da300384b768785b83e5ce66991266cec21af89ab9ae7f5ce1c4cbb"
+      url: "https://pub.dev"
+    source: hosted
+    version: "0.12.15"
+  material_color_utilities:
+    dependency: transitive
+    description:
+      name: material_color_utilities
+      sha256: d92141dc6fe1dad30722f9aa826c7fbc896d021d792f80678280601aff8cf724
+      url: "https://pub.dev"
+    source: hosted
+    version: "0.2.0"
+  meta:
+    dependency: transitive
+    description:
+      name: meta
+      sha256: "3c74dbf8763d36539f114c799d8a2d87343b5067e9d796ca22b5eb8437090ee3"
+      url: "https://pub.dev"
+    source: hosted
+    version: "1.9.1"
+  mime:
+    dependency: transitive
+    description:
+      name: mime
+      sha256: e4ff8e8564c03f255408decd16e7899da1733852a9110a58fe6d1b817684a63e
+      url: "https://pub.dev"
+    source: hosted
+    version: "1.0.4"
+  mobx:
+    dependency: "direct main"
+    description:
+      name: mobx
+      sha256: f1862bd92c6a903fab67338f27e2f731117c3cb9ea37cee1a487f9e4e0de314a
+      url: "https://pub.dev"
+    source: hosted
+    version: "2.1.3+1"
+  mobx_codegen:
+    dependency: "direct dev"
+    description:
+      name: mobx_codegen
+      sha256: "86122e410d8ea24dda0c69adb5c2a6ccadd5ce02ad46e144764e0d0184a06181"
+      url: "https://pub.dev"
+    source: hosted
+    version: "2.1.1"
+  package_config:
+    dependency: transitive
+    description:
+      name: package_config
+      sha256: "1c5b77ccc91e4823a5af61ee74e6b972db1ef98c2ff5a18d3161c982a55448bd"
+      url: "https://pub.dev"
+    source: hosted
+    version: "2.1.0"
+  path:
+    dependency: transitive
+    description:
+      name: path
+      sha256: "8829d8a55c13fc0e37127c29fedf290c102f4e40ae94ada574091fe0ff96c917"
+      url: "https://pub.dev"
+    source: hosted
+    version: "1.8.3"
+  path_provider:
+    dependency: "direct main"
+    description:
+      name: path_provider
+      sha256: a1aa8aaa2542a6bc57e381f132af822420216c80d4781f7aa085ca3229208aaa
+      url: "https://pub.dev"
+    source: hosted
+    version: "2.1.1"
+  path_provider_android:
+    dependency: transitive
+    description:
+      name: path_provider_android
+      sha256: e595b98692943b4881b219f0a9e3945118d3c16bd7e2813f98ec6e532d905f72
+      url: "https://pub.dev"
+    source: hosted
+    version: "2.2.1"
+  path_provider_foundation:
+    dependency: transitive
+    description:
+      name: path_provider_foundation
+      sha256: "19314d595120f82aca0ba62787d58dde2cc6b5df7d2f0daf72489e38d1b57f2d"
+      url: "https://pub.dev"
+    source: hosted
+    version: "2.3.1"
+  path_provider_linux:
+    dependency: transitive
+    description:
+      name: path_provider_linux
+      sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279
+      url: "https://pub.dev"
+    source: hosted
+    version: "2.2.1"
+  path_provider_platform_interface:
+    dependency: transitive
+    description:
+      name: path_provider_platform_interface
+      sha256: "94b1e0dd80970c1ce43d5d4e050a9918fce4f4a775e6142424c30a29a363265c"
+      url: "https://pub.dev"
+    source: hosted
+    version: "2.1.1"
+  path_provider_windows:
+    dependency: transitive
+    description:
+      name: path_provider_windows
+      sha256: "8bc9f22eee8690981c22aa7fc602f5c85b497a6fb2ceb35ee5a5e5ed85ad8170"
+      url: "https://pub.dev"
+    source: hosted
+    version: "2.2.1"
+  petitparser:
+    dependency: transitive
+    description:
+      name: petitparser
+      sha256: cb3798bef7fc021ac45b308f4b51208a152792445cce0448c9a4ba5879dd8750
+      url: "https://pub.dev"
+    source: hosted
+    version: "5.4.0"
+  platform:
+    dependency: transitive
+    description:
+      name: platform
+      sha256: "4a451831508d7d6ca779f7ac6e212b4023dd5a7d08a27a63da33756410e32b76"
+      url: "https://pub.dev"
+    source: hosted
+    version: "3.1.0"
+  plugin_platform_interface:
+    dependency: transitive
+    description:
+      name: plugin_platform_interface
+      sha256: dbf0f707c78beedc9200146ad3cb0ab4d5da13c246336987be6940f026500d3a
+      url: "https://pub.dev"
+    source: hosted
+    version: "2.1.3"
+  pointycastle:
+    dependency: transitive
+    description:
+      name: pointycastle
+      sha256: db7306cf0249f838d1a24af52b5a5887c5bf7f31d8bb4e827d071dc0939ad346
+      url: "https://pub.dev"
+    source: hosted
+    version: "3.6.2"
+  pool:
+    dependency: transitive
+    description:
+      name: pool
+      sha256: "20fe868b6314b322ea036ba325e6fc0711a22948856475e2c2b6306e8ab39c2a"
+      url: "https://pub.dev"
+    source: hosted
+    version: "1.5.1"
+  process:
+    dependency: transitive
+    description:
+      name: process
+      sha256: "53fd8db9cec1d37b0574e12f07520d582019cb6c44abf5479a01505099a34a09"
+      url: "https://pub.dev"
+    source: hosted
+    version: "4.2.4"
+  pub_semver:
+    dependency: transitive
+    description:
+      name: pub_semver
+      sha256: "307de764d305289ff24ad257ad5c5793ce56d04947599ad68b3baa124105fc17"
+      url: "https://pub.dev"
+    source: hosted
+    version: "2.1.3"
+  pubspec_parse:
+    dependency: transitive
+    description:
+      name: pubspec_parse
+      sha256: "75f6614d6dde2dc68948dffbaa4fe5dae32cd700eb9fb763fe11dfb45a3c4d0a"
+      url: "https://pub.dev"
+    source: hosted
+    version: "1.2.1"
+  puppeteer:
+    dependency: transitive
+    description:
+      name: puppeteer
+      sha256: "59e723cc5b69537159a7c34efd645dc08a6a1ac4647d7d7823606802c0f93cdb"
+      url: "https://pub.dev"
+    source: hosted
+    version: "3.2.0"
+  rxdart:
+    dependency: "direct main"
+    description:
+      name: rxdart
+      sha256: "0c7c0cedd93788d996e33041ffecda924cc54389199cde4e6a34b440f50044cb"
+      url: "https://pub.dev"
+    source: hosted
+    version: "0.27.7"
+  shelf:
+    dependency: transitive
+    description:
+      name: shelf
+      sha256: c24a96135a2ccd62c64b69315a14adc5c3419df63b4d7c05832a346fdb73682c
+      url: "https://pub.dev"
+    source: hosted
+    version: "1.4.0"
+  shelf_static:
+    dependency: transitive
+    description:
+      name: shelf_static
+      sha256: a41d3f53c4adf0f57480578c1d61d90342cd617de7fc8077b1304643c2d85c1e
+      url: "https://pub.dev"
+    source: hosted
+    version: "1.1.2"
+  shelf_web_socket:
+    dependency: transitive
+    description:
+      name: shelf_web_socket
+      sha256: a988c0e8d8ffbdb8a28aa7ec8e449c260f3deb808781fe1284d22c5bba7156e8
+      url: "https://pub.dev"
+    source: hosted
+    version: "1.0.3"
+  sky_engine:
+    dependency: transitive
+    description: flutter
+    source: sdk
+    version: "0.0.99"
+  socks5_proxy:
+    dependency: transitive
+    description:
+      name: socks5_proxy
+      sha256: "1d21b5606169654bbf4cfb904e8e6ed897e9f763358709f87310c757096d909a"
+      url: "https://pub.dev"
+    source: hosted
+    version: "1.0.4"
+  source_gen:
+    dependency: transitive
+    description:
+      name: source_gen
+      sha256: "2d79738b6bbf38a43920e2b8d189e9a3ce6cc201f4b8fc76be5e4fe377b1c38d"
+      url: "https://pub.dev"
+    source: hosted
+    version: "1.2.6"
+  source_helper:
+    dependency: transitive
+    description:
+      name: source_helper
+      sha256: "3b67aade1d52416149c633ba1bb36df44d97c6b51830c2198e934e3fca87ca1f"
+      url: "https://pub.dev"
+    source: hosted
+    version: "1.3.3"
+  source_span:
+    dependency: transitive
+    description:
+      name: source_span
+      sha256: dd904f795d4b4f3b870833847c461801f6750a9fa8e61ea5ac53f9422b31f250
+      url: "https://pub.dev"
+    source: hosted
+    version: "1.9.1"
+  sprintf:
+    dependency: transitive
+    description:
+      name: sprintf
+      sha256: "1fc9ffe69d4df602376b52949af107d8f5703b77cda567c4d7d86a0693120f23"
+      url: "https://pub.dev"
+    source: hosted
+    version: "7.0.0"
+  stack_trace:
+    dependency: transitive
+    description:
+      name: stack_trace
+      sha256: c3c7d8edb15bee7f0f74debd4b9c5f3c2ea86766fe4178eb2a18eb30a0bdaed5
+      url: "https://pub.dev"
+    source: hosted
+    version: "1.11.0"
+  stream_channel:
+    dependency: transitive
+    description:
+      name: stream_channel
+      sha256: "83615bee9045c1d322bbbd1ba209b7a749c2cbcdcb3fdd1df8eb488b3279c1c8"
+      url: "https://pub.dev"
+    source: hosted
+    version: "2.1.1"
+  stream_transform:
+    dependency: transitive
+    description:
+      name: stream_transform
+      sha256: "14a00e794c7c11aa145a170587321aedce29769c08d7f58b1d141da75e3b1c6f"
+      url: "https://pub.dev"
+    source: hosted
+    version: "2.1.0"
+  string_scanner:
+    dependency: transitive
+    description:
+      name: string_scanner
+      sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde"
+      url: "https://pub.dev"
+    source: hosted
+    version: "1.2.0"
+  term_glyph:
+    dependency: transitive
+    description:
+      name: term_glyph
+      sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84
+      url: "https://pub.dev"
+    source: hosted
+    version: "1.2.1"
+  test_api:
+    dependency: transitive
+    description:
+      name: test_api
+      sha256: eb6ac1540b26de412b3403a163d919ba86f6a973fe6cc50ae3541b80092fdcfb
+      url: "https://pub.dev"
+    source: hosted
+    version: "0.5.1"
+  timing:
+    dependency: transitive
+    description:
+      name: timing
+      sha256: "70a3b636575d4163c477e6de42f247a23b315ae20e86442bebe32d3cabf61c32"
+      url: "https://pub.dev"
+    source: hosted
+    version: "1.0.1"
+  tuple:
+    dependency: transitive
+    description:
+      name: tuple
+      sha256: a97ce2013f240b2f3807bcbaf218765b6f301c3eff91092bcfa23a039e7dd151
+      url: "https://pub.dev"
+    source: hosted
+    version: "2.0.2"
+  typed_data:
+    dependency: transitive
+    description:
+      name: typed_data
+      sha256: "26f87ade979c47a150c9eaab93ccd2bebe70a27dc0b4b29517f2904f04eb11a5"
+      url: "https://pub.dev"
+    source: hosted
+    version: "1.3.1"
+  unorm_dart:
+    dependency: "direct main"
+    description:
+      name: unorm_dart
+      sha256: "5b35bff83fce4d76467641438f9e867dc9bcfdb8c1694854f230579d68cd8f4b"
+      url: "https://pub.dev"
+    source: hosted
+    version: "0.2.0"
+  uuid:
+    dependency: transitive
+    description:
+      name: uuid
+      sha256: "22c94e5ad1e75f9934b766b53c742572ee2677c56bc871d850a57dad0f82127f"
+      url: "https://pub.dev"
+    source: hosted
+    version: "4.2.2"
+  vector_math:
+    dependency: transitive
+    description:
+      name: vector_math
+      sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803"
+      url: "https://pub.dev"
+    source: hosted
+    version: "2.1.4"
+  watcher:
+    dependency: transitive
+    description:
+      name: watcher
+      sha256: "6a7f46926b01ce81bfc339da6a7f20afbe7733eff9846f6d6a5466aa4c6667c0"
+      url: "https://pub.dev"
+    source: hosted
+    version: "1.0.2"
+  web_socket_channel:
+    dependency: transitive
+    description:
+      name: web_socket_channel
+      sha256: ca49c0bc209c687b887f30527fb6a9d80040b072cc2990f34b9bec3e7663101b
+      url: "https://pub.dev"
+    source: hosted
+    version: "2.3.0"
+  win32:
+    dependency: transitive
+    description:
+      name: win32
+      sha256: c9ebe7ee4ab0c2194e65d3a07d8c54c5d00bb001b76081c4a04cdb8448b59e46
+      url: "https://pub.dev"
+    source: hosted
+    version: "3.1.3"
+  xdg_directories:
+    dependency: transitive
+    description:
+      name: xdg_directories
+      sha256: bd512f03919aac5f1313eb8249f223bacf4927031bf60b02601f81f687689e86
+      url: "https://pub.dev"
+    source: hosted
+    version: "0.2.0+3"
+  yaml:
+    dependency: transitive
+    description:
+      name: yaml
+      sha256: "23812a9b125b48d4007117254bca50abb6c712352927eece9e155207b1db2370"
+      url: "https://pub.dev"
+    source: hosted
+    version: "3.1.1"
+sdks:
+  dart: ">=3.0.0 <4.0.0"
+  flutter: ">=3.10.0"
diff --git a/cw_lightning/pubspec.yaml b/cw_lightning/pubspec.yaml
new file mode 100644
index 000000000..ad3ed8388
--- /dev/null
+++ b/cw_lightning/pubspec.yaml
@@ -0,0 +1,83 @@
+name: cw_lightning
+description: A new Flutter package project.
+version: 0.0.1
+publish_to: none
+author: Cake Wallet
+homepage: https://cakewallet.com
+
+environment:
+  sdk: ">=2.17.5 <3.0.0"
+  flutter: ">=1.20.0"
+
+dependencies:
+  flutter:
+    sdk: flutter
+  path_provider: ^2.0.11
+  http: ^1.1.0
+  mobx: ^2.0.7+4
+  flutter_mobx: ^2.0.6+1
+  intl: ^0.18.0
+  cw_core:
+    path: ../cw_core
+  cw_bitcoin:
+    path: ../cw_bitcoin
+  bitcoin_flutter:
+    git:
+      url: https://github.com/cake-tech/bitcoin_flutter.git
+      ref: cake-update-v4
+  bitbox:
+    git:
+      url: https://github.com/cake-tech/bitbox-flutter.git
+      ref: master
+  breez_sdk:
+    git:
+      url: https://github.com/breez/breez-sdk-flutter.git
+      ref: v0.2.14
+  rxdart: ^0.27.5
+  unorm_dart: ^0.2.0
+  cryptography: ^2.0.5
+
+dev_dependencies:
+  flutter_test:
+    sdk: flutter
+  build_runner: ^2.1.11
+  build_resolvers: ^2.0.9
+  mobx_codegen: ^2.0.7
+  hive_generator: ^2.0.1
+
+# For information on the generic Dart part of this file, see the
+# following page: https://dart.dev/tools/pub/pubspec
+
+# The following section is specific to Flutter.
+flutter:
+
+  # To add assets to your package, add an assets section, like this:
+  # assets:
+  #   - images/a_dot_burr.jpeg
+  #   - images/a_dot_ham.jpeg
+  #
+  # For details regarding assets in packages, see
+  # https://flutter.dev/assets-and-images/#from-packages
+  #
+  # An image asset can refer to one or more resolution-specific "variants", see
+  # https://flutter.dev/assets-and-images/#resolution-aware.
+
+  # To add custom fonts to your package, add a fonts section here,
+  # in this "flutter" section. Each entry in this list should have a
+  # "family" key with the font family name, and a "fonts" key with a
+  # list giving the asset and other descriptors for the font. For
+  # example:
+  # fonts:
+  #   - family: Schyler
+  #     fonts:
+  #       - asset: fonts/Schyler-Regular.ttf
+  #       - asset: fonts/Schyler-Italic.ttf
+  #         style: italic
+  #   - family: Trajan Pro
+  #     fonts:
+  #       - asset: fonts/TrajanPro.ttf
+  #       - asset: fonts/TrajanPro_Bold.ttf
+  #         weight: 700
+  #
+  # For details regarding fonts in packages, see
+  # https://flutter.dev/custom-fonts/#from-packages
diff --git a/cw_lightning/test/cw_lightning_test.dart b/cw_lightning/test/cw_lightning_test.dart
new file mode 100644
index 000000000..58f02e00a
--- /dev/null
+++ b/cw_lightning/test/cw_lightning_test.dart
@@ -0,0 +1,12 @@
+import 'package:flutter_test/flutter_test.dart';
+
+import 'package:cw_lightning/cw_lightning.dart';
+
+void main() {
+  test('adds one to input values', () {
+    final calculator = Calculator();
+    expect(calculator.addOne(2), 3);
+    expect(calculator.addOne(-7), -6);
+    expect(calculator.addOne(0), 1);
+  });
+}
diff --git a/lib/di.dart b/lib/di.dart
index 05019a562..d56c585a7 100644
--- a/lib/di.dart
+++ b/lib/di.dart
@@ -863,6 +863,8 @@ Future<void> setup({
         return nano!.createNanoWalletService(_walletInfoSource);
       case WalletType.polygon:
         return polygon!.createPolygonWalletService(_walletInfoSource);
+      case WalletType.lightning:
+        return lightning!.createLightningWalletService(_walletInfoSource);
       default:
         throw Exception('Unexpected token: ${param1.toString()} for generating of WalletService');
     }
diff --git a/lib/entities/provider_types.dart b/lib/entities/provider_types.dart
index ed688590c..1a8399b5a 100644
--- a/lib/entities/provider_types.dart
+++ b/lib/entities/provider_types.dart
@@ -55,6 +55,7 @@ class ProvidersHelper {
       case WalletType.monero:
         return [ProviderType.askEachTime, ProviderType.onramper, ProviderType.dfx];
       case WalletType.bitcoin:
+      case WalletType.lightning:
       case WalletType.ethereum:
         return [
           ProviderType.askEachTime,
@@ -76,6 +77,7 @@ class ProvidersHelper {
   static List<ProviderType> getAvailableSellProviderTypes(WalletType walletType) {
     switch (walletType) {
       case WalletType.bitcoin:
+      case WalletType.lightning:
       case WalletType.ethereum:
         return [
           ProviderType.askEachTime,
diff --git a/lib/lightning/cw_lightning.dart b/lib/lightning/cw_lightning.dart
new file mode 100644
index 000000000..e4438cb05
--- /dev/null
+++ b/lib/lightning/cw_lightning.dart
@@ -0,0 +1,173 @@
+part of 'lightning.dart';
+
+class CWLightning extends Lightning {
+	@override
+	TransactionPriority getMediumTransactionPriority() => BitcoinTransactionPriority.medium;	
+
+	@override
+	WalletCredentials createLightningRestoreWalletFromSeedCredentials({
+    required String name,
+    required String mnemonic,
+    required String password})
+		=> BitcoinRestoreWalletFromSeedCredentials(name: name, mnemonic: mnemonic, password: password);
+
+	@override
+	WalletCredentials createLightningRestoreWalletFromWIFCredentials({
+    required String name,
+    required String password,
+    required String wif,
+    WalletInfo? walletInfo})
+		=> BitcoinRestoreWalletFromWIFCredentials(name: name, password: password, wif: wif, walletInfo: walletInfo);
+	
+	@override
+	WalletCredentials createLightningNewWalletCredentials({
+    required String name,
+    WalletInfo? walletInfo})
+		=> BitcoinNewWalletCredentials(name: name, walletInfo: walletInfo);
+
+	@override
+	List<String> getWordList() => wordlist;
+
+	@override
+	Map<String, String> getWalletKeys(Object wallet) {
+		final lightningWallet = wallet as ElectrumWallet;
+		final keys = lightningWallet.keys;
+		
+		return <String, String>{
+			'wif': keys.wif,
+			'privateKey': keys.privateKey,
+			'publicKey': keys.publicKey	
+		};
+	}
+	
+	@override
+	List<TransactionPriority> getTransactionPriorities() 
+		=> BitcoinTransactionPriority.all;
+
+	@override
+	List<TransactionPriority> getLitecoinTransactionPriorities()
+		=> LitecoinTransactionPriority.all;
+
+	@override
+	TransactionPriority deserializeLightningTransactionPriority(int raw)
+		=> BitcoinTransactionPriority.deserialize(raw: raw);
+
+	@override
+	TransactionPriority deserializeLitecoinTransactionPriority(int raw)
+		=> LitecoinTransactionPriority.deserialize(raw: raw);
+
+	@override
+	int getFeeRate(Object wallet, TransactionPriority priority) {
+		final lightningWallet = wallet as ElectrumWallet;
+		return lightningWallet.feeRate(priority);
+	}
+
+	@override
+	Future<void> generateNewAddress(Object wallet, String label) async {
+		final lightningWallet = wallet as ElectrumWallet;
+		await lightningWallet.walletAddresses.generateNewAddress(label: label);
+		await wallet.save();
+	}
+
+	@override
+	Future<void> updateAddress(Object wallet,String address, String label) async {
+		final lightningWallet = wallet as ElectrumWallet;
+		lightningWallet.walletAddresses.updateAddress(address, label);
+		await wallet.save();
+	}
+	
+	@override
+	Object createLightningTransactionCredentials(List<Output> outputs, {required TransactionPriority priority, int? feeRate})
+		=> BitcoinTransactionCredentials(
+			outputs.map((out) => OutputInfo(
+					fiatAmount: out.fiatAmount,
+					cryptoAmount: out.cryptoAmount,
+					address: out.address,
+					note: out.note,
+					sendAll: out.sendAll,
+					extractedAddress: out.extractedAddress,
+					isParsedAddress: out.isParsedAddress,
+					formattedCryptoAmount: out.formattedCryptoAmount))
+			.toList(),
+			priority: priority as BitcoinTransactionPriority,
+			feeRate: feeRate);
+
+	@override
+	Object createLightningTransactionCredentialsRaw(List<OutputInfo> outputs, {TransactionPriority? priority, required int feeRate})
+		=> BitcoinTransactionCredentials(
+				outputs,
+				priority: priority != null ? priority as BitcoinTransactionPriority : null,
+				feeRate: feeRate);
+
+	@override
+	List<String> getAddresses(Object wallet) {
+		final lightningWallet = wallet as ElectrumWallet;
+		return lightningWallet.walletAddresses.addresses
+			.map((BitcoinAddressRecord addr) => addr.address)
+			.toList();
+	}
+
+	@override
+	@computed
+	List<ElectrumSubAddress> getSubAddresses(Object wallet) {
+		final electrumWallet = wallet as ElectrumWallet;
+		return electrumWallet.walletAddresses.addresses
+			.map((BitcoinAddressRecord addr) => ElectrumSubAddress(
+				id: addr.index,
+				name: addr.name,
+				address: addr.address,
+				txCount: addr.txCount,
+				balance: addr.balance,
+				isChange: addr.isHidden))
+			.toList();
+	}
+
+	@override
+	String getAddress(Object wallet) {
+		final lightningWallet = wallet as ElectrumWallet;
+		return lightningWallet.walletAddresses.address;
+	}
+
+	@override
+	String formatterLightningAmountToString({required int amount})
+		=> bitcoinAmountToString(amount: amount);
+
+	@override	
+	double formatterLightningAmountToDouble({required int amount})
+		=> bitcoinAmountToDouble(amount: amount);
+
+	@override	
+	int formatterStringDoubleToLightningAmount(String amount)
+		=> stringDoubleToBitcoinAmount(amount);
+
+  @override
+  String lightningTransactionPriorityWithLabel(TransactionPriority priority, int rate)
+    => (priority as BitcoinTransactionPriority).labelWithRate(rate);
+
+	@override
+	List<BitcoinUnspent> getUnspents(Object wallet) {
+		final lightningWallet = wallet as ElectrumWallet;
+		return lightningWallet.unspentCoins;
+	}
+
+	Future<void> updateUnspents(Object wallet) async {
+		final lightningWallet = wallet as ElectrumWallet;
+		await lightningWallet.updateUnspent();
+	}
+
+	WalletService createLightningWalletService(Box<WalletInfo> walletInfoSource, Box<UnspentCoinsInfo> unspentCoinSource) {
+		return LightningWalletService(walletInfoSource, unspentCoinSource);
+	}
+
+	WalletService createLitecoinWalletService(Box<WalletInfo> walletInfoSource, Box<UnspentCoinsInfo> unspentCoinSource) {
+		return LitecoinWalletService(walletInfoSource, unspentCoinSource);
+	}
+  
+  @override
+  TransactionPriority getLightningTransactionPriorityMedium()
+    => BitcoinTransactionPriority.medium;
+
+  @override
+  TransactionPriority getLightningTransactionPrioritySlow()
+    => BitcoinTransactionPriority.slow;
+}
\ No newline at end of file
diff --git a/lib/lightning/lightning.dart b/lib/lightning/lightning.dart
new file mode 100644
index 000000000..dcd1410c3
--- /dev/null
+++ b/lib/lightning/lightning.dart
@@ -0,0 +1,78 @@
+import 'package:cw_core/unspent_transaction_output.dart';
+import 'package:cw_core/wallet_credentials.dart';
+import 'package:cw_core/wallet_info.dart';
+import 'package:cw_core/transaction_priority.dart';
+import 'package:cw_core/output_info.dart';
+import 'package:cw_core/unspent_coins_info.dart';
+import 'package:cw_core/wallet_service.dart';
+import 'package:cake_wallet/view_model/send/output.dart';
+import 'package:cw_core/wallet_type.dart';
+import 'package:hive/hive.dart';
+import 'package:cw_bitcoin/electrum_wallet.dart';
+import 'package:cw_bitcoin/bitcoin_unspent.dart';
+import 'package:cw_bitcoin/bitcoin_mnemonic.dart';
+import 'package:cw_bitcoin/bitcoin_transaction_priority.dart';
+import 'package:cw_bitcoin/bitcoin_wallet_service.dart';
+import 'package:cw_bitcoin/bitcoin_wallet_creation_credentials.dart';
+import 'package:cw_bitcoin/bitcoin_amount_format.dart';
+import 'package:cw_bitcoin/bitcoin_address_record.dart';
+import 'package:cw_bitcoin/bitcoin_transaction_credentials.dart';
+import 'package:cw_lightning/lightning_wallet_service.dart';
+import 'package:mobx/mobx.dart';
+
+part 'cw_lightning.dart';
+
+Lightning? lightning = CWLightning();
+
+  
+  class ElectrumSubAddress {
+  ElectrumSubAddress({
+    required this.id,
+    required this.name,
+    required this.address,
+    required this.txCount,
+    required this.balance,
+    required this.isChange});
+  final int id;
+  final String name;
+  final String address;
+  final int txCount;
+  final int balance;
+  final bool isChange;
+}
+
+abstract class Lightning {
+  TransactionPriority getMediumTransactionPriority();
+
+  WalletCredentials createLightningRestoreWalletFromSeedCredentials({required String name, required String mnemonic, required String password});
+  WalletCredentials createLightningRestoreWalletFromWIFCredentials({required String name, required String password, required String wif, WalletInfo? walletInfo});
+  WalletCredentials createLightningNewWalletCredentials({required String name, WalletInfo? walletInfo});
+  List<String> getWordList();
+  Map<String, String> getWalletKeys(Object wallet);
+  List<TransactionPriority> getTransactionPriorities();
+  List<TransactionPriority> getLitecoinTransactionPriorities();
+  TransactionPriority deserializeLightningTransactionPriority(int raw);
+  TransactionPriority deserializeLitecoinTransactionPriority(int raw);
+  int getFeeRate(Object wallet, TransactionPriority priority);
+  Future<void> generateNewAddress(Object wallet, String label);
+  Future<void> updateAddress(Object wallet,String address, String label);
+  Object createLightningTransactionCredentials(List<Output> outputs, {required TransactionPriority priority, int? feeRate});
+  Object createLightningTransactionCredentialsRaw(List<OutputInfo> outputs, {TransactionPriority? priority, required int feeRate});
+
+  List<String> getAddresses(Object wallet);
+  String getAddress(Object wallet);
+
+  List<ElectrumSubAddress> getSubAddresses(Object wallet);
+
+  String formatterLightningAmountToString({required int amount});
+  double formatterLightningAmountToDouble({required int amount});
+  int formatterStringDoubleToLightningAmount(String amount);
+  String lightningTransactionPriorityWithLabel(TransactionPriority priority, int rate);
+
+  List<Unspent> getUnspents(Object wallet);
+  Future<void> updateUnspents(Object wallet);
+  WalletService createLightningWalletService(Box<WalletInfo> walletInfoSource, Box<UnspentCoinsInfo> unspentCoinSource);
+  TransactionPriority getLightningTransactionPriorityMedium();
+  TransactionPriority getLightningTransactionPrioritySlow();
+}
+  
\ No newline at end of file
diff --git a/tool/configure.dart b/tool/configure.dart
index 8297d8a39..ca23403b3 100644
--- a/tool/configure.dart
+++ b/tool/configure.dart
@@ -7,6 +7,7 @@ const ethereumOutputPath = 'lib/ethereum/ethereum.dart';
 const bitcoinCashOutputPath = 'lib/bitcoin_cash/bitcoin_cash.dart';
 const nanoOutputPath = 'lib/nano/nano.dart';
 const polygonOutputPath = 'lib/polygon/polygon.dart';
+const lightningOutputPath = 'lib/lightning/lightning.dart';
 const walletTypesPath = 'lib/wallet_types.g.dart';
 const pubspecDefaultPath = 'pubspec_default.yaml';
 const pubspecOutputPath = 'pubspec.yaml';
@@ -21,6 +22,7 @@ Future<void> main(List<String> args) async {
   final hasNano = args.contains('${prefix}nano');
   final hasBanano = args.contains('${prefix}banano');
   final hasPolygon = args.contains('${prefix}polygon');
+  final hasLightning = args.contains('${prefix}lightning');
 
   await generateBitcoin(hasBitcoin);
   await generateMonero(hasMonero);
@@ -29,6 +31,7 @@ Future<void> main(List<String> args) async {
   await generateBitcoinCash(hasBitcoinCash);
   await generateNano(hasNano);
   await generatePolygon(hasPolygon);
+  await generateLightning(hasLightning);
   // await generateBanano(hasEthereum);
 
   await generatePubspec(
@@ -40,6 +43,7 @@ Future<void> main(List<String> args) async {
     hasBanano: hasBanano,
     hasBitcoinCash: hasBitcoinCash,
     hasPolygon: hasPolygon,
+    hasLightning: hasLightning,
   );
   await generateWalletTypes(
     hasMonero: hasMonero,
@@ -696,6 +700,49 @@ abstract class Polygon {
   await outputFile.writeAsString(output);
 }
 
+Future<void> generateLightning(bool hasImplementation) async {
+  final outputFile = File(lightningOutputPath);
+  const lightningCommonHeaders = """
+import 'package:cake_wallet/view_model/send/output.dart';
+import 'package:cw_core/crypto_currency.dart';
+import 'package:cw_core/erc20_token.dart';
+import 'package:cw_core/output_info.dart';
+import 'package:cw_core/transaction_info.dart';
+import 'package:cw_core/transaction_priority.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';
+
+""";
+  const lightningCWHeaders = """
+
+
+""";
+  const lightningCwPart = "part 'cw_lightning.dart';";
+  const lightningContent = """
+abstract class Lightning {
+
+}
+  """;
+
+  const lightningEmptyDefinition = 'Lightning? lightning;\n';
+  const lightningCWDefinition = 'Lightning? lightning = CWLightning();\n';
+
+  final output = '$lightningCommonHeaders\n' +
+      (hasImplementation ? '$lightningCWHeaders\n' : '\n') +
+      (hasImplementation ? '$lightningCwPart\n\n' : '\n') +
+      (hasImplementation ? lightningCWDefinition : lightningEmptyDefinition) +
+      '\n' +
+      lightningContent;
+
+  if (outputFile.existsSync()) {
+    await outputFile.delete();
+  }
+
+  await outputFile.writeAsString(output);
+}
+
 Future<void> generateBitcoinCash(bool hasImplementation) async {
   final outputFile = File(bitcoinCashOutputPath);
   const bitcoinCashCommonHeaders = """
@@ -893,7 +940,8 @@ Future<void> generatePubspec(
     required bool hasNano,
     required bool hasBanano,
     required bool hasBitcoinCash,
-    required bool hasPolygon}) async {
+    required bool hasPolygon,
+    required bool hasLightning}) async {
   const cwCore = """
   cw_core:
     path: ./cw_core
@@ -938,6 +986,10 @@ Future<void> generatePubspec(
   cw_evm:
     path: ./cw_evm
     """;
+  const cwLightning = """
+  cw_lightning:
+    path: ./cw_lightning
+    """;
   final inputFile = File(pubspecOutputPath);
   final inputText = await inputFile.readAsString();
   final inputLines = inputText.split('\n');
@@ -982,6 +1034,10 @@ Future<void> generatePubspec(
     output += '\n$cwEVM';
   }
 
+  if (hasLightning) {
+    output += '\n$cwLightning';
+  }
+
   final outputLines = output.split('\n');
   inputLines.insertAll(dependenciesIndex + 1, outputLines);
   final outputContent = inputLines.join('\n');