diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml
index e14b9d303..1f357846a 100644
--- a/.github/workflows/test.yaml
+++ b/.github/workflows/test.yaml
@@ -8,12 +8,12 @@ jobs:
       - name: Prepare repository
         uses: actions/checkout@v3
         with:
-          flutter-version: '3.10.3'
+          flutter-version: '3.10.6'
           channel: 'stable'
       - name: Install Flutter 
         uses: subosito/flutter-action@v2 
         with:
-          flutter-version: '3.10.3'
+          flutter-version: '3.10.6'
           channel: 'stable'
       - name: Setup | Rust
         uses: ATiltedTree/setup-rust@v1
diff --git a/.gitmodules b/.gitmodules
index 95b02e580..7474c8a54 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -6,4 +6,4 @@
 	url = https://github.com/cypherstack/flutter_libmonero.git
 [submodule "crypto_plugins/flutter_liblelantus"]
 	path = crypto_plugins/flutter_liblelantus
-	url = https://github.com/cypherstack/flutter_liblelantus.git
\ No newline at end of file
+	url = https://github.com/cypherstack/flutter_liblelantus.git
diff --git a/assets/svg/cashfusion-icon.svg b/assets/svg/cashfusion-icon.svg
new file mode 100644
index 000000000..e1d010ada
--- /dev/null
+++ b/assets/svg/cashfusion-icon.svg
@@ -0,0 +1,3 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M20.5449 14.8336V9.00229C21.2517 8.76248 21.7692 8.09352 21.7692 7.31096C21.7692 6.32645 20.974 5.53127 19.9895 5.53127C19.5225 5.53127 19.0933 5.7206 18.7652 6.02352L13.7921 3.15835C13.8174 3.03213 13.83 2.90591 13.83 2.77969C13.83 1.79518 13.0348 1 12.0503 1C11.0658 1 10.258 1.79518 10.258 2.77969C10.258 2.90591 10.2706 3.01951 10.2959 3.14573L5.27235 6.04877C4.94418 5.73322 4.50241 5.53127 4.01016 5.53127C3.02565 5.53127 2.23047 6.32645 2.23047 7.31096C2.23047 8.13138 2.78583 8.82559 3.55577 9.02754V14.8084C2.79845 15.0103 2.23047 15.7045 2.23047 16.525C2.23047 17.5095 3.02565 18.3046 4.01016 18.3046C4.47717 18.3046 4.90632 18.1153 5.23449 17.8124L10.3211 20.7533C10.2833 20.9048 10.258 21.0562 10.258 21.2203C10.258 22.2048 11.0532 23 12.0377 23C13.0222 23 13.83 22.2174 13.83 21.2329C13.83 21.0688 13.8048 20.9174 13.7669 20.7659L18.803 17.8629C19.1186 18.1406 19.5351 18.3173 19.9895 18.3173C20.974 18.3173 21.7692 17.5221 21.7692 16.5376C21.7692 15.7424 21.2517 15.0734 20.5449 14.8336ZM19.6487 17.3201C19.3584 17.1939 19.1438 16.9162 19.1312 16.5754C19.1312 16.5628 19.1312 16.5502 19.1312 16.5376V16.525C19.1312 16.5123 19.1312 16.4997 19.1312 16.4745C19.1438 16.1968 19.2953 15.9443 19.5225 15.8055C19.5351 15.7929 19.5477 15.7803 19.573 15.7803C19.5856 15.7803 19.5982 15.7676 19.6108 15.7676C19.7244 15.7045 19.8633 15.6793 20.0021 15.6793C20.1915 15.6793 20.3682 15.7424 20.5196 15.856C20.5322 15.8686 20.5575 15.8812 20.5701 15.8939C20.7468 16.0453 20.8604 16.2851 20.8604 16.5376C20.8604 17.0046 20.4818 17.3959 20.0021 17.3959C19.9012 17.3959 19.8128 17.3832 19.7244 17.3454C19.6866 17.3328 19.674 17.3201 19.6487 17.3201ZM12.0503 22.0912C11.5959 22.0912 11.2173 21.7252 11.192 21.2708C11.192 21.2582 11.192 21.2456 11.192 21.2456C11.192 21.2329 11.192 21.2329 11.192 21.2203C11.2047 20.93 11.3561 20.6776 11.5833 20.5261C11.6338 20.5009 11.6717 20.4756 11.7222 20.4504C11.7474 20.4377 11.76 20.4377 11.7853 20.4251C11.8736 20.3999 11.962 20.3873 12.0503 20.3873C12.1387 20.3873 12.227 20.3999 12.3154 20.4251C12.3406 20.4377 12.3532 20.4377 12.3785 20.4504C12.429 20.4756 12.4795 20.5009 12.5173 20.5261C12.7445 20.6776 12.896 20.93 12.9086 21.2203C12.9086 21.2329 12.9086 21.2329 12.9086 21.2456C12.9086 21.2582 12.9086 21.2708 12.9086 21.2708C12.8834 21.7252 12.5047 22.0912 12.0503 22.0912ZM4.35095 17.3201C4.24998 17.358 4.13638 17.3832 4.01016 17.3832C3.54315 17.3832 3.15187 17.0046 3.15187 16.525C3.15187 16.222 3.30333 15.957 3.54315 15.8055C3.55577 15.7929 3.56839 15.7803 3.59364 15.7803C3.71985 15.7045 3.8587 15.6667 4.01016 15.6667C4.02278 15.6667 4.04802 15.6667 4.06065 15.6667C4.23735 15.6793 4.38882 15.7424 4.52766 15.8307C4.54028 15.8434 4.56552 15.856 4.57815 15.8686C4.72961 16.0075 4.84321 16.1968 4.86845 16.4114C4.86845 16.424 4.86845 16.4492 4.86845 16.4745C4.86845 16.4871 4.86845 16.4997 4.86845 16.525C4.86845 16.5628 4.86845 16.5881 4.85583 16.6259C4.81796 16.9162 4.64125 17.1561 4.40144 17.2823C4.38882 17.2949 4.36357 17.3075 4.35095 17.3201ZM3.16449 7.31096C3.16449 6.84395 3.54315 6.45267 4.02278 6.45267C4.16162 6.45267 4.28784 6.49053 4.41406 6.54102C4.42668 6.55364 4.45193 6.55364 4.46455 6.56626C4.59077 6.642 4.70436 6.75559 4.7801 6.89443C4.84321 7.02065 4.88107 7.15949 4.88107 7.31096C4.88107 7.34882 4.88107 7.37407 4.86845 7.41193C4.86845 7.43718 4.86845 7.4498 4.85583 7.47504C4.83058 7.61388 4.76747 7.72748 4.69174 7.82846C4.65388 7.87894 4.61601 7.91681 4.57815 7.95468C4.56552 7.9673 4.5529 7.97992 4.52766 7.99254C4.38882 8.10614 4.21211 8.16925 4.01016 8.16925C3.8587 8.16925 3.71985 8.13138 3.59364 8.05565C3.58101 8.04303 3.55577 8.04303 3.54315 8.03041C3.31595 7.86632 3.16449 7.61388 3.16449 7.31096ZM12.0503 1.9214C12.4668 1.9214 12.8076 2.22433 12.8834 2.61561C12.8834 2.64085 12.896 2.65347 12.896 2.67871C12.896 2.71658 12.9086 2.74182 12.9086 2.77969C12.9086 3.09524 12.7445 3.3603 12.4921 3.51176C12.4795 3.52438 12.4542 3.52438 12.4416 3.537C12.3406 3.58749 12.227 3.62536 12.1008 3.62536C12.0882 3.62536 12.0756 3.62536 12.0503 3.62536C11.9115 3.62536 11.7853 3.58749 11.659 3.537C11.6464 3.52438 11.6212 3.52438 11.6086 3.51176C11.4697 3.42341 11.3561 3.30981 11.2804 3.15835C11.2173 3.04475 11.192 2.90591 11.192 2.76707C11.192 2.7292 11.192 2.70396 11.2047 2.66609C11.2047 2.64085 11.2047 2.62823 11.2173 2.60298C11.2804 2.22433 11.6338 1.9214 12.0503 1.9214ZM19.6487 6.5284C19.7497 6.49053 19.8633 6.46529 19.9895 6.46529C20.4565 6.46529 20.8478 6.84395 20.8478 7.32358C20.8478 7.57602 20.7342 7.81583 20.5575 7.9673C20.5449 7.97992 20.5322 7.99254 20.507 8.00516C20.3682 8.11876 20.1915 8.18187 19.9895 8.18187C19.8759 8.18187 19.7623 8.15663 19.6487 8.11876C19.6235 8.10614 19.5982 8.09352 19.5604 8.08089C19.5477 8.06827 19.5225 8.06827 19.5099 8.05565C19.3079 7.91681 19.1565 7.70224 19.1312 7.4498C19.1312 7.43718 19.1312 7.41193 19.1312 7.38669C19.1312 7.37407 19.1312 7.36144 19.1312 7.3362C19.1312 7.18474 19.1691 7.0459 19.2322 6.91968C19.3205 6.76822 19.4468 6.642 19.5982 6.56626C19.6108 6.54102 19.6361 6.5284 19.6487 6.5284ZM18.7273 15.2628L13.7669 12.3976C13.8048 12.2461 13.83 12.0947 13.83 11.9432C13.83 11.7791 13.8048 11.6277 13.7669 11.4888L18.7652 8.61101C18.9798 8.81296 19.2322 8.95181 19.5225 9.04016V14.821C19.2196 14.8967 18.9419 15.0482 18.7273 15.2628ZM5.72674 7.82846H7.70838C7.79673 8.11876 7.96082 8.3712 8.16277 8.58577L4.57815 14.7958V9.00229C5.12089 8.82559 5.55003 8.38382 5.72674 7.82846ZM9.41234 6.45267C9.87935 6.45267 10.2706 6.83133 10.2706 7.31096C10.2706 7.51291 10.2075 7.68961 10.0939 7.82846C9.95508 8.01778 9.74051 8.144 9.48807 8.15663C9.46283 8.15663 9.43758 8.15663 9.41234 8.15663C8.94533 8.15663 8.55405 7.77797 8.55405 7.29834C8.55405 7.14687 8.59192 7.00803 8.65502 6.88181C8.79387 6.62937 9.07155 6.45267 9.3871 6.44005C9.39972 6.45267 9.39972 6.45267 9.41234 6.45267ZM8.97057 9.04016C9.10941 9.07803 9.26088 9.09065 9.41234 9.09065C10.2201 9.09065 10.9017 8.56053 11.1163 7.82846H18.2477L13.2999 10.681C12.9717 10.3655 12.53 10.1635 12.0377 10.1635C11.0532 10.1635 10.258 10.9587 10.258 11.9432C10.258 12.1073 10.2833 12.2587 10.3211 12.3976L5.37333 15.2501L8.97057 9.04016ZM12.0503 12.8015C11.9115 12.8015 11.7853 12.7636 11.659 12.7131C11.6338 12.7005 11.6086 12.6879 11.5833 12.6627C11.3561 12.5112 11.192 12.2461 11.192 11.9432C11.192 11.9306 11.192 11.918 11.192 11.8927C11.2173 11.4383 11.5833 11.0849 12.0377 11.0849C12.1765 11.0849 12.3028 11.1228 12.429 11.1733C12.694 11.3121 12.8834 11.5772 12.896 11.8927C12.896 11.9053 12.896 11.918 12.896 11.9432C12.896 11.9558 12.896 11.9684 12.896 11.9937C12.8707 12.4481 12.5047 12.8015 12.0503 12.8015ZM11.1415 6.89443C11.0658 6.57889 10.9017 6.28858 10.6872 6.06139L11.5959 4.49627C11.7474 4.53414 11.8989 4.55938 12.0503 4.55938C12.5426 4.55938 12.9843 4.35743 13.3125 4.04188L18.2477 6.89443H11.1415ZM9.89197 5.59438C9.74051 5.55651 9.57642 5.53127 9.41234 5.53127C8.56667 5.53127 7.85984 6.1245 7.68314 6.90706H5.84034L10.7755 4.06713L9.89197 5.59438ZM5.75198 16.1211L10.7881 13.2054C11.0027 13.42 11.2804 13.584 11.5833 13.6598V19.5037C11.3182 19.5795 11.0784 19.7057 10.8765 19.8824L5.75198 16.9415C5.77723 16.8153 5.80247 16.6764 5.80247 16.5376C5.80247 16.3861 5.77723 16.2473 5.75198 16.1211ZM12.5173 19.5164V13.6724C12.8203 13.5841 13.0979 13.4326 13.3125 13.218L18.2729 16.0832C18.2351 16.2347 18.2098 16.3861 18.2098 16.5376C18.2098 16.7017 18.2351 16.8531 18.2729 16.992L13.2368 19.9076C13.0222 19.7183 12.7824 19.5921 12.5173 19.5164Z" fill="#22CC77"/>
+</svg>
diff --git a/assets/svg/fusing.svg b/assets/svg/fusing.svg
new file mode 100644
index 000000000..1b04f882a
--- /dev/null
+++ b/assets/svg/fusing.svg
@@ -0,0 +1,3 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M22.768 12.7778C22.0427 9.72145 19.529 7.28212 16.4516 6.67196C14.9906 6.37118 13.4811 6.47323 12.0731 6.95663C12.3953 4.84042 13.7811 3.04089 15.7469 2.19569C16.3218 1.94862 16.1929 1.09999 15.575 1.04069C14.6349 0.944011 13.6895 1.01383 12.7765 1.22868C9.68399 1.95571 7.28204 4.46938 6.63321 7.54852C6.33243 9.00946 6.47423 10.5177 6.95548 11.9227C4.84012 11.6005 3.04059 10.2169 2.19755 8.24891C1.95048 7.67743 1.10176 7.80633 1.04265 8.42079C0.945952 9.3618 1.01579 10.3071 1.23066 11.2224C1.95598 14.2787 4.46965 16.7181 7.54707 17.3282C9.00801 17.629 10.5175 17.5269 11.9256 17.0435C11.6033 19.1598 10.2176 20.9593 8.25176 21.8045C7.67684 22.0515 7.80574 22.9002 8.42363 22.9595C9.36379 23.0562 10.3091 22.9863 11.2222 22.7715C14.2786 22.0462 16.7179 19.5325 17.328 16.4551C17.6288 14.9941 17.5268 13.4847 17.0434 12.0766C19.1596 12.3988 20.9591 13.7846 21.8043 15.7504C22.0514 16.3253 22.9 16.1964 22.9593 15.5785C23.0559 14.6384 22.9828 13.6931 22.768 12.7778ZM11.9613 14.0626C10.8613 14.0626 9.89884 13.1388 9.89884 12.0001C9.89884 10.8614 10.8227 9.93758 11.9613 9.93758C13.1 9.93758 14.0625 10.8614 14.0625 12.0001C14.0625 13.1388 13.1387 14.0626 11.9613 14.0626Z" fill="black"/>
+</svg>
diff --git a/assets/svg/peers.svg b/assets/svg/peers.svg
new file mode 100644
index 000000000..26bc3a2a0
--- /dev/null
+++ b/assets/svg/peers.svg
@@ -0,0 +1,3 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M8.7 12.0002C11.1303 12.0002 13.1 10.0302 13.1 7.6002C13.1 5.17023 11.1303 3.2002 8.7 3.2002C6.26969 3.2002 4.3 5.17023 4.3 7.6002C4.3 10.0302 6.26969 12.0002 8.7 12.0002ZM10.4428 13.6502H6.95719C3.66647 13.6502 1 16.3177 1 19.6074C1 20.2674 1.5335 20.8002 2.19144 20.8002H15.2072C15.8672 20.8002 16.4 20.2674 16.4 19.6074C16.4 16.3177 13.7325 13.6502 10.4428 13.6502ZM17.4691 14.2002H14.9305C16.51 15.4961 17.5 17.4349 17.5 19.6074C17.5 20.0474 17.3694 20.453 17.1562 20.8002H21.9C22.5084 20.8002 23 20.3052 23 19.6693C23 16.6614 20.5387 14.2002 17.4691 14.2002ZM15.85 12.0002C17.9778 12.0002 19.7 10.278 19.7 8.1502C19.7 6.02238 17.9778 4.3002 15.85 4.3002C14.9868 4.3002 14.1986 4.59427 13.5565 5.07398C13.9525 5.83435 14.2 6.68582 14.2 7.6002C14.2 8.8212 13.7899 9.94251 13.1141 10.8559C13.8116 11.5602 14.7775 12.0002 15.85 12.0002Z" fill="black"/>
+</svg>
diff --git a/assets/svg/tx-cashfusion.svg b/assets/svg/tx-cashfusion.svg
new file mode 100644
index 000000000..d9055b6c6
--- /dev/null
+++ b/assets/svg/tx-cashfusion.svg
@@ -0,0 +1,11 @@
+<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g clip-path="url(#clip0_9211_24577)">
+<circle cx="16" cy="16" r="16" fill="#D2EBE4"/>
+<path d="M23.7686 18.576V13.2748C24.4112 13.0568 24.8816 12.4487 24.8816 11.7372C24.8816 10.8422 24.1587 10.1193 23.2637 10.1193C22.8392 10.1193 22.449 10.2915 22.1507 10.5668L17.6298 7.96213C17.6527 7.84739 17.6642 7.73264 17.6642 7.6179C17.6642 6.72289 16.9413 6 16.0463 6C15.1513 6 14.4169 6.72289 14.4169 7.6179C14.4169 7.73264 14.4284 7.83592 14.4513 7.95066L9.88449 10.5898C9.58615 10.3029 9.18455 10.1193 8.73704 10.1193C7.84203 10.1193 7.11914 10.8422 7.11914 11.7372C7.11914 12.4831 7.62402 13.1142 8.32396 13.2978V18.5531C7.63549 18.7367 7.11914 19.3678 7.11914 20.1136C7.11914 21.0086 7.84203 21.7315 8.73704 21.7315C9.1616 21.7315 9.55173 21.5594 9.85006 21.284L14.4743 23.9575C14.4399 24.0952 14.4169 24.2329 14.4169 24.3821C14.4169 25.2771 15.1398 26 16.0348 26C16.9298 26 17.6642 25.2886 17.6642 24.3936C17.6642 24.2444 17.6412 24.1067 17.6068 23.969L22.1851 21.3299C22.472 21.5823 22.8506 21.743 23.2637 21.743C24.1587 21.743 24.8816 21.0201 24.8816 20.1251C24.8816 19.4022 24.4112 18.794 23.7686 18.576ZM22.9539 20.8365C22.69 20.7217 22.4949 20.4693 22.4835 20.1595C22.4835 20.148 22.4835 20.1365 22.4835 20.1251V20.1136C22.4835 20.1021 22.4835 20.0906 22.4835 20.0677C22.4949 19.8153 22.6326 19.5858 22.8392 19.4596C22.8506 19.4481 22.8621 19.4366 22.8851 19.4366C22.8965 19.4366 22.908 19.4251 22.9195 19.4251C23.0228 19.3678 23.149 19.3448 23.2752 19.3448C23.4473 19.3448 23.608 19.4022 23.7456 19.5055C23.7571 19.5169 23.7801 19.5284 23.7915 19.5399C23.9522 19.6776 24.0555 19.8956 24.0555 20.1251C24.0555 20.5496 23.7112 20.9053 23.2752 20.9053C23.1834 20.9053 23.1031 20.8939 23.0228 20.8594C22.9883 20.848 22.9769 20.8365 22.9539 20.8365ZM16.0463 25.1738C15.6332 25.1738 15.289 24.8411 15.266 24.428C15.266 24.4165 15.266 24.4051 15.266 24.4051C15.266 24.3936 15.266 24.3936 15.266 24.3821C15.2775 24.1182 15.4152 23.8887 15.6217 23.751C15.6676 23.7281 15.702 23.7051 15.7479 23.6822C15.7709 23.6707 15.7824 23.6707 15.8053 23.6592C15.8856 23.6363 15.966 23.6248 16.0463 23.6248C16.1266 23.6248 16.2069 23.6363 16.2872 23.6592C16.3102 23.6707 16.3217 23.6707 16.3446 23.6822C16.3905 23.7051 16.4364 23.7281 16.4708 23.751C16.6774 23.8887 16.8151 24.1182 16.8265 24.3821C16.8265 24.3936 16.8265 24.3936 16.8265 24.4051C16.8265 24.4165 16.8265 24.428 16.8265 24.428C16.8036 24.8411 16.4594 25.1738 16.0463 25.1738ZM9.04685 20.8365C8.95506 20.8709 8.85179 20.8939 8.73704 20.8939C8.31249 20.8939 7.95678 20.5496 7.95678 20.1136C7.95678 19.8382 8.09447 19.5972 8.31249 19.4596C8.32396 19.4481 8.33543 19.4366 8.35838 19.4366C8.47313 19.3678 8.59935 19.3333 8.73704 19.3333C8.74852 19.3333 8.77146 19.3333 8.78294 19.3333C8.94358 19.3448 9.08127 19.4022 9.20749 19.4825C9.21897 19.494 9.24192 19.5055 9.25339 19.5169C9.39109 19.6431 9.49436 19.8153 9.5173 20.0103C9.5173 20.0218 9.5173 20.0448 9.5173 20.0677C9.5173 20.0792 9.5173 20.0906 9.5173 20.1136C9.5173 20.148 9.5173 20.171 9.50583 20.2054C9.47141 20.4693 9.31076 20.6873 9.09275 20.8021C9.08127 20.8135 9.05833 20.825 9.04685 20.8365ZM7.96825 11.7372C7.96825 11.3127 8.31249 10.957 8.74852 10.957C8.87473 10.957 8.98948 10.9914 9.10422 11.0373C9.1157 11.0488 9.13865 11.0488 9.15012 11.0602C9.26487 11.1291 9.36814 11.2324 9.43698 11.3586C9.49436 11.4733 9.52878 11.5995 9.52878 11.7372C9.52878 11.7717 9.52878 11.7946 9.5173 11.829C9.5173 11.852 9.5173 11.8635 9.50583 11.8864C9.48288 12.0126 9.42551 12.1159 9.35666 12.2077C9.32224 12.2536 9.28782 12.288 9.25339 12.3224C9.24192 12.3339 9.23044 12.3454 9.20749 12.3569C9.08127 12.4601 8.92063 12.5175 8.73704 12.5175C8.59935 12.5175 8.47313 12.4831 8.35838 12.4142C8.34691 12.4028 8.32396 12.4028 8.31249 12.3913C8.10594 12.2421 7.96825 12.0126 7.96825 11.7372ZM16.0463 6.83764C16.4249 6.83764 16.7347 7.11302 16.8036 7.46873C16.8036 7.49168 16.8151 7.50316 16.8151 7.5261C16.8151 7.56053 16.8265 7.58348 16.8265 7.6179C16.8265 7.90476 16.6774 8.14573 16.4479 8.28342C16.4364 8.29489 16.4135 8.29489 16.402 8.30637C16.3102 8.35227 16.2069 8.38669 16.0922 8.38669C16.0807 8.38669 16.0692 8.38669 16.0463 8.38669C15.9201 8.38669 15.8053 8.35227 15.6906 8.30637C15.6791 8.29489 15.6561 8.29489 15.6447 8.28342C15.5185 8.2031 15.4152 8.09983 15.3463 7.96213C15.289 7.85886 15.266 7.73264 15.266 7.60643C15.266 7.572 15.266 7.54905 15.2775 7.51463C15.2775 7.49168 15.2775 7.48021 15.289 7.45726C15.3463 7.11302 15.6676 6.83764 16.0463 6.83764ZM22.9539 11.0258C23.0457 10.9914 23.149 10.9684 23.2637 10.9684C23.6883 10.9684 24.044 11.3127 24.044 11.7487C24.044 11.9782 23.9407 12.1962 23.7801 12.3339C23.7686 12.3454 23.7571 12.3569 23.7342 12.3683C23.608 12.4716 23.4473 12.529 23.2637 12.529C23.1604 12.529 23.0572 12.506 22.9539 12.4716C22.931 12.4601 22.908 12.4487 22.8736 12.4372C22.8621 12.4257 22.8392 12.4257 22.8277 12.4142C22.6441 12.288 22.5064 12.0929 22.4835 11.8635C22.4835 11.852 22.4835 11.829 22.4835 11.8061C22.4835 11.7946 22.4835 11.7831 22.4835 11.7602C22.4835 11.6225 22.5179 11.4963 22.5753 11.3815C22.6556 11.2438 22.7703 11.1291 22.908 11.0602C22.9195 11.0373 22.9424 11.0258 22.9539 11.0258ZM22.1163 18.9662L17.6068 16.3614C17.6412 16.2238 17.6642 16.0861 17.6642 15.9484C17.6642 15.7992 17.6412 15.6615 17.6068 15.5353L22.1507 12.9191C22.3458 13.1027 22.5753 13.2289 22.8392 13.3092V18.5645C22.5638 18.6334 22.3113 18.7711 22.1163 18.9662ZM10.2976 12.2077H12.0991C12.1794 12.4716 12.3285 12.7011 12.5121 12.8962L9.25339 18.5416V13.2748C9.74679 13.1142 10.1369 12.7126 10.2976 12.2077ZM13.6481 10.957C14.0727 10.957 14.4284 11.3012 14.4284 11.7372C14.4284 11.9208 14.371 12.0815 14.2677 12.2077C14.1415 12.3798 13.9465 12.4945 13.717 12.506C13.694 12.506 13.6711 12.506 13.6481 12.506C13.2236 12.506 12.8678 12.1618 12.8678 11.7258C12.8678 11.5881 12.9023 11.4618 12.9596 11.3471C13.0859 11.1176 13.3383 10.957 13.6252 10.9455C13.6366 10.957 13.6366 10.957 13.6481 10.957ZM13.2465 13.3092C13.3727 13.3437 13.5104 13.3551 13.6481 13.3551C14.3825 13.3551 15.0021 12.8732 15.1972 12.2077H21.6802L17.1823 14.8009C16.8839 14.5141 16.4823 14.3305 16.0348 14.3305C15.1398 14.3305 14.4169 15.0534 14.4169 15.9484C14.4169 16.0975 14.4399 16.2352 14.4743 16.3614L9.97628 18.9547L13.2465 13.3092ZM16.0463 16.7286C15.9201 16.7286 15.8053 16.6942 15.6906 16.6483C15.6676 16.6368 15.6447 16.6254 15.6217 16.6024C15.4152 16.4647 15.266 16.2238 15.266 15.9484C15.266 15.9369 15.266 15.9254 15.266 15.9025C15.289 15.4894 15.6217 15.1681 16.0348 15.1681C16.161 15.1681 16.2758 15.2025 16.3905 15.2484C16.6315 15.3746 16.8036 15.6156 16.8151 15.9025C16.8151 15.9139 16.8151 15.9254 16.8151 15.9484C16.8151 15.9598 16.8151 15.9713 16.8151 15.9943C16.7921 16.4073 16.4594 16.7286 16.0463 16.7286ZM15.2201 11.3586C15.1513 11.0717 15.0021 10.8078 14.807 10.6013L15.6332 9.17843C15.7709 9.21285 15.9086 9.2358 16.0463 9.2358C16.4938 9.2358 16.8954 9.05221 17.1937 8.76535L21.6802 11.3586H15.2201ZM14.0841 10.1767C13.9465 10.1423 13.7973 10.1193 13.6481 10.1193C12.8793 10.1193 12.2368 10.6586 12.0761 11.3701H10.4008L14.8874 8.7883L14.0841 10.1767ZM10.3205 19.7464L14.8988 17.0958C15.0939 17.2909 15.3463 17.44 15.6217 17.5089V22.8216C15.3808 22.8904 15.1627 23.0052 14.9792 23.1658L10.3205 20.4923C10.3435 20.3775 10.3664 20.2513 10.3664 20.1251C10.3664 19.9874 10.3435 19.8612 10.3205 19.7464ZM16.4708 22.833V17.5204C16.7462 17.44 16.9987 17.3024 17.1937 17.1073L21.7032 19.712C21.6688 19.8497 21.6458 19.9874 21.6458 20.1251C21.6458 20.2742 21.6688 20.4119 21.7032 20.5382L17.1249 23.1888C16.9298 23.0166 16.7118 22.9019 16.4708 22.833Z" fill="#00A578"/>
+</g>
+<defs>
+<clipPath id="clip0_9211_24577">
+<rect width="32" height="32" fill="white"/>
+</clipPath>
+</defs>
+</svg>
diff --git a/assets/svg/up-from-line.svg b/assets/svg/up-from-line.svg
new file mode 100644
index 000000000..4e1c8f6bf
--- /dev/null
+++ b/assets/svg/up-from-line.svg
@@ -0,0 +1,3 @@
+<svg width="18" height="20" viewBox="0 0 18 20" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M15.875 16.8755H2.08633C1.36574 16.8755 0.75 17.4899 0.75 18.2118C0.75 18.9337 1.36574 19.6255 2.08633 19.6255H15.875C16.6355 19.6255 17.25 19.011 17.25 18.2505C17.25 17.4899 16.6355 16.8755 15.875 16.8755ZM3.15625 8.61687H6.25V14.1212C6.25 14.8813 6.86574 15.4979 7.625 15.4979H10.375C11.1343 15.4979 11.75 14.8813 11.75 14.1212V8.61687H14.8438C15.2553 8.61687 15.6279 8.3716 15.7912 7.99339C15.9537 7.61514 15.8765 7.1757 15.5938 6.8762L9.75006 0.684407C9.36068 0.271864 8.63975 0.271864 8.25002 0.684407L2.40627 6.8762C2.12363 7.17587 2.04641 7.61527 2.20887 7.99339C2.37207 8.37195 2.74461 8.61687 3.15625 8.61687Z" fill="black"/>
+</svg>
diff --git a/crypto_plugins/flutter_libepiccash b/crypto_plugins/flutter_libepiccash
index 2de3fa045..f677dec0b 160000
--- a/crypto_plugins/flutter_libepiccash
+++ b/crypto_plugins/flutter_libepiccash
@@ -1 +1 @@
-Subproject commit 2de3fa0459ac29361d65a86883e1d0648e6a4b1a
+Subproject commit f677dec0b34d3f9fe8fce2bc8ff5c508c3f3bb9a
diff --git a/crypto_plugins/flutter_liblelantus b/crypto_plugins/flutter_liblelantus
index 1f8fde935..9cd241b5e 160000
--- a/crypto_plugins/flutter_liblelantus
+++ b/crypto_plugins/flutter_liblelantus
@@ -1 +1 @@
-Subproject commit 1f8fde935bbb23585477b0cb884bee9be6d12a87
+Subproject commit 9cd241b5ea142e21c01dd7639b42603281c43287
diff --git a/lib/db/isar/main_db.dart b/lib/db/isar/main_db.dart
index 9465de12b..afff7e870 100644
--- a/lib/db/isar/main_db.dart
+++ b/lib/db/isar/main_db.dart
@@ -13,6 +13,7 @@ import 'package:flutter_native_splash/cli_commands.dart';
 import 'package:isar/isar.dart';
 import 'package:stackwallet/exceptions/main_db/main_db_exception.dart';
 import 'package:stackwallet/models/isar/models/block_explorer.dart';
+import 'package:stackwallet/models/isar/models/blockchain_data/v2/transaction_v2.dart';
 import 'package:stackwallet/models/isar/models/contact_entry.dart';
 import 'package:stackwallet/models/isar/models/isar_models.dart';
 import 'package:stackwallet/models/isar/ordinal.dart';
@@ -57,6 +58,7 @@ class MainDB {
         ContactEntrySchema,
         OrdinalSchema,
         LelantusCoinSchema,
+        TransactionV2Schema,
       ],
       directory: (await StackFileSystem.applicationIsarDirectory()).path,
       // inspector: kDebugMode,
@@ -241,6 +243,14 @@ class MainDB {
   QueryBuilder<UTXO, UTXO, QAfterWhereClause> getUTXOs(String walletId) =>
       isar.utxos.where().walletIdEqualTo(walletId);
 
+  QueryBuilder<UTXO, UTXO, QAfterFilterCondition> getUTXOsByAddress(
+          String walletId, String address) =>
+      isar.utxos
+          .where()
+          .walletIdEqualTo(walletId)
+          .filter()
+          .addressEqualTo(address);
+
   Future<void> putUTXO(UTXO utxo) => isar.writeTxn(() async {
         await isar.utxos.put(utxo);
       });
@@ -376,6 +386,8 @@ class MainDB {
   //
   Future<void> deleteWalletBlockchainData(String walletId) async {
     final transactionCount = await getTransactions(walletId).count();
+    final transactionCountV2 =
+        await isar.transactionV2s.where().walletIdEqualTo(walletId).count();
     final addressCount = await getAddresses(walletId).count();
     final utxoCount = await getUTXOs(walletId).count();
     final lelantusCoinCount =
@@ -394,6 +406,18 @@ class MainDB {
         await isar.transactions.deleteAll(txnIds);
       }
 
+      // transactions V2
+      for (int i = 0; i < transactionCountV2; i += paginateLimit) {
+        final txnIds = await isar.transactionV2s
+            .where()
+            .walletIdEqualTo(walletId)
+            .offset(i)
+            .limit(paginateLimit)
+            .idProperty()
+            .findAll();
+        await isar.transactionV2s.deleteAll(txnIds);
+      }
+
       // addresses
       for (int i = 0; i < addressCount; i += paginateLimit) {
         final addressIds = await getAddresses(walletId)
@@ -498,6 +522,35 @@ class MainDB {
     }
   }
 
+  Future<List<int>> updateOrPutTransactionV2s(
+    List<TransactionV2> transactions,
+  ) async {
+    try {
+      List<int> ids = [];
+      await isar.writeTxn(() async {
+        for (final tx in transactions) {
+          final storedTx = await isar.transactionV2s
+              .where()
+              .txidWalletIdEqualTo(tx.txid, tx.walletId)
+              .findFirst();
+
+          Id id;
+          if (storedTx == null) {
+            id = await isar.transactionV2s.put(tx);
+          } else {
+            tx.id = storedTx.id;
+            await isar.transactionV2s.delete(storedTx.id);
+            id = await isar.transactionV2s.put(tx);
+          }
+          ids.add(id);
+        }
+      });
+      return ids;
+    } catch (e) {
+      throw MainDBException("failed updateOrPutAddresses: $transactions", e);
+    }
+  }
+
   // ========== Ethereum =======================================================
 
   // eth contracts
diff --git a/lib/electrumx_rpc/cached_electrumx.dart b/lib/electrumx_rpc/cached_electrumx.dart
index 8366e259f..a8136dcaf 100644
--- a/lib/electrumx_rpc/cached_electrumx.dart
+++ b/lib/electrumx_rpc/cached_electrumx.dart
@@ -141,10 +141,10 @@ class CachedElectrumX {
           await box.put(txHash, result);
         }
 
-        Logging.instance.log("using fetched result", level: LogLevel.Info);
+        // Logging.instance.log("using fetched result", level: LogLevel.Info);
         return result;
       } else {
-        Logging.instance.log("using cached result", level: LogLevel.Info);
+        // Logging.instance.log("using cached result", level: LogLevel.Info);
         return Map<String, dynamic>.from(cachedTx);
       }
     } catch (e, s) {
diff --git a/lib/electrumx_rpc/electrumx.dart b/lib/electrumx_rpc/electrumx.dart
index dc07890cf..eea9bed0b 100644
--- a/lib/electrumx_rpc/electrumx.dart
+++ b/lib/electrumx_rpc/electrumx.dart
@@ -387,7 +387,14 @@ class ElectrumX {
         throw jsonRpcResponse.exception!;
       }
 
-      final response = jsonRpcResponse.data as List;
+      final List<dynamic> response;
+      try {
+        response = jsonRpcResponse.data as List;
+      } catch (_) {
+        throw Exception(
+          "Expected json list but got a map: ${jsonRpcResponse.data}",
+        );
+      }
 
       // check for errors, format and throw if there are any
       final List<String> errors = [];
@@ -726,6 +733,14 @@ class ElectrumX {
         return {"rawtx": response["result"] as String};
       }
 
+      if (response["result"] == null) {
+        Logging.instance.log(
+          "getTransaction($txHash) returned null response",
+          level: LogLevel.Error,
+        );
+        throw 'getTransaction($txHash) returned null response';
+      }
+
       return Map<String, dynamic>.from(response["result"] as Map);
     } catch (e) {
       Logging.instance.log(
diff --git a/lib/models/fusion_progress_ui_state.dart b/lib/models/fusion_progress_ui_state.dart
new file mode 100644
index 000000000..62168e359
--- /dev/null
+++ b/lib/models/fusion_progress_ui_state.dart
@@ -0,0 +1,187 @@
+import 'package:flutter/cupertino.dart';
+import 'package:stackwallet/pages_desktop_specific/cashfusion/sub_widgets/fusion_dialog.dart';
+
+class FusionProgressUIState extends ChangeNotifier {
+  /// Whether we are able to connect to the server.
+  bool _ableToConnect = false;
+
+  // _ableToConnect setter.
+  set ableToConnect(bool ableToConnect) {
+    _ableToConnect = ableToConnect;
+    notifyListeners();
+  }
+
+  bool get done {
+    if (!_ableToConnect) {
+      return false;
+    }
+
+    bool _done = (_connecting.status == CashFusionStatus.success) ||
+        (_connecting.status == CashFusionStatus.failed);
+    _done &= (_outputs.status == CashFusionStatus.success) ||
+        (_outputs.status == CashFusionStatus.failed);
+    _done &= (_peers.status == CashFusionStatus.success) ||
+        (_peers.status == CashFusionStatus.failed);
+    _done &= (_fusing.status == CashFusionStatus.success) ||
+        (_fusing.status == CashFusionStatus.failed);
+    _done &= (_complete.status == CashFusionStatus.success) ||
+        (_complete.status == CashFusionStatus.failed);
+
+    _done &= (fusionState.status == CashFusionStatus.success) ||
+        (fusionState.status == CashFusionStatus.failed);
+
+    return _done;
+  }
+
+  bool get succeeded {
+    if (!_ableToConnect) {
+      return false;
+    }
+
+    bool _succeeded = _connecting.status == CashFusionStatus.success;
+    _succeeded &= _outputs.status == CashFusionStatus.success;
+    _succeeded &= _peers.status == CashFusionStatus.success;
+    _succeeded &= _fusing.status == CashFusionStatus.success;
+    _succeeded &= _complete.status == CashFusionStatus.success;
+
+    _succeeded &= fusionState.status == CashFusionStatus.success;
+
+    return _succeeded;
+  }
+
+  CashFusionState _connecting =
+      CashFusionState(status: CashFusionStatus.waiting, info: null);
+  CashFusionState get connecting => _connecting;
+  void setConnecting(CashFusionState state, {bool shouldNotify = true}) {
+    _connecting = state;
+    _running = true;
+    if (shouldNotify) {
+      notifyListeners();
+    }
+  }
+
+  CashFusionState _outputs =
+      CashFusionState(status: CashFusionStatus.waiting, info: null);
+  CashFusionState get outputs => _outputs;
+  void setOutputs(CashFusionState state, {bool shouldNotify = true}) {
+    _outputs = state;
+    _running = true;
+    if (shouldNotify) {
+      notifyListeners();
+    }
+  }
+
+  CashFusionState _peers =
+      CashFusionState(status: CashFusionStatus.waiting, info: null);
+  CashFusionState get peers => _peers;
+  void setPeers(CashFusionState state, {bool shouldNotify = true}) {
+    _peers = state;
+    _running = true;
+    if (shouldNotify) {
+      notifyListeners();
+    }
+  }
+
+  CashFusionState _fusing =
+      CashFusionState(status: CashFusionStatus.waiting, info: null);
+  CashFusionState get fusing => _fusing;
+  void setFusing(CashFusionState state, {bool shouldNotify = true}) {
+    _fusing = state;
+    _running = true;
+    if (shouldNotify) {
+      notifyListeners();
+    }
+  }
+
+  CashFusionState _complete =
+      CashFusionState(status: CashFusionStatus.waiting, info: null);
+  CashFusionState get complete => _complete;
+  void setComplete(CashFusionState state, {bool shouldNotify = true}) {
+    _complete = state;
+    _running = true;
+    if (shouldNotify) {
+      notifyListeners();
+    }
+  }
+
+  CashFusionState _fusionStatus =
+      CashFusionState(status: CashFusionStatus.waiting, info: null);
+  CashFusionState get fusionState => _fusionStatus;
+  void setFusionState(CashFusionState state, {bool shouldNotify = true}) {
+    _fusionStatus = state;
+    _updateRunningState(state.status);
+    if (shouldNotify) {
+      notifyListeners();
+    }
+  }
+
+  /// An int storing the number of successfully completed fusion rounds.
+  int _fusionRoundsCompleted = 0;
+  int get fusionRoundsCompleted => _fusionRoundsCompleted;
+  set fusionRoundsCompleted(int fusionRoundsCompleted) {
+    _fusionRoundsCompleted = fusionRoundsCompleted;
+    notifyListeners();
+  }
+
+  /// A helper for incrementing the number of successfully completed fusion rounds.
+  void incrementFusionRoundsCompleted() {
+    _fusionRoundsCompleted++;
+    _fusionRoundsFailed = 0; // Reset failed round count on success.
+    _failed = false; // Reset failed flag on success.
+    notifyListeners();
+  }
+
+  /// An int storing the number of failed fusion rounds.
+  int _fusionRoundsFailed = 0;
+  int get fusionRoundsFailed => _fusionRoundsFailed;
+  set fusionRoundsFailed(int fusionRoundsFailed) {
+    _fusionRoundsFailed = fusionRoundsFailed;
+    notifyListeners();
+  }
+
+  /// A helper for incrementing the number of failed fusion rounds.
+  void incrementFusionRoundsFailed() {
+    _fusionRoundsFailed++;
+    notifyListeners();
+  }
+
+  /// A flag indicating that fusion has stopped because the maximum number of
+  /// consecutive failed fusion rounds has been reached.
+  ///
+  /// Set from the interface.  I didn't want to have to configure
+  ///
+  /// Used to be named maxConsecutiveFusionRoundsFailed.
+  bool _failed = false;
+  bool get failed => _failed;
+  void setFailed(bool failed, {bool shouldNotify = true}) {
+    _failed = failed;
+    if (shouldNotify) {
+      notifyListeners();
+    }
+  }
+
+  /// A flag indicating that fusion is running.
+  bool _running = false;
+  bool get running => _running;
+  void setRunning(bool running, {bool shouldNotify = true}) {
+    _running = running;
+    if (shouldNotify) {
+      notifyListeners();
+    }
+  }
+
+  /// A helper method for setting the running flag.
+  ///
+  /// Sets the running flag to true if the status is running.  Sets the flag to
+  /// false if succeeded or failed or the global failed flag is set.
+  void _updateRunningState(CashFusionStatus status) {
+    if (status == CashFusionStatus.running) {
+      _running = true;
+    } else if (((status == CashFusionStatus.success ||
+                status == CashFusionStatus.failed) &&
+            (done || succeeded)) ||
+        _failed) {
+      _running = false;
+    }
+  }
+}
diff --git a/lib/models/isar/models/blockchain_data/address.dart b/lib/models/isar/models/blockchain_data/address.dart
index 028bee04a..a26ef94b6 100644
--- a/lib/models/isar/models/blockchain_data/address.dart
+++ b/lib/models/isar/models/blockchain_data/address.dart
@@ -70,6 +70,30 @@ class Address extends CryptoCurrencyAddress {
       subType == AddressSubType.paynymSend ||
       subType == AddressSubType.paynymReceive;
 
+  /// If called on an [Address] already stored in the DB be sure to update the
+  /// [transactions] Isar Links if required
+  Address copyWith({
+    String? walletId,
+    String? value,
+    List<byte>? publicKey,
+    int? derivationIndex,
+    AddressType? type,
+    AddressSubType? subType,
+    DerivationPath? derivationPath,
+    String? otherData,
+  }) {
+    return Address(
+      walletId: walletId ?? this.walletId,
+      value: value ?? this.value,
+      publicKey: publicKey ?? this.publicKey,
+      derivationIndex: derivationIndex ?? this.derivationIndex,
+      type: type ?? this.type,
+      subType: subType ?? this.subType,
+      derivationPath: derivationPath ?? this.derivationPath,
+      otherData: otherData ?? this.otherData,
+    );
+  }
+
   @override
   String toString() => "{ "
       "id: $id, "
diff --git a/lib/models/isar/models/blockchain_data/transaction.dart b/lib/models/isar/models/blockchain_data/transaction.dart
index 5b32142c2..ecd7d51c8 100644
--- a/lib/models/isar/models/blockchain_data/transaction.dart
+++ b/lib/models/isar/models/blockchain_data/transaction.dart
@@ -22,7 +22,6 @@ part 'transaction.g.dart';
 
 @Collection()
 class Transaction {
-
   Transaction({
     required this.walletId,
     required this.txid,
@@ -252,5 +251,6 @@ enum TransactionSubType {
   bip47Notification, // bip47 payment code notification transaction flag
   mint, // firo specific
   join, // firo specific
-  ethToken; // eth token
+  ethToken, // eth token
+  cashFusion;
 }
diff --git a/lib/models/isar/models/blockchain_data/transaction.g.dart b/lib/models/isar/models/blockchain_data/transaction.g.dart
index c11649ddb..cd9132576 100644
--- a/lib/models/isar/models/blockchain_data/transaction.g.dart
+++ b/lib/models/isar/models/blockchain_data/transaction.g.dart
@@ -364,6 +364,7 @@ const _TransactionsubTypeEnumValueMap = {
   'mint': 2,
   'join': 3,
   'ethToken': 4,
+  'cashFusion': 5,
 };
 const _TransactionsubTypeValueEnumMap = {
   0: TransactionSubType.none,
@@ -371,6 +372,7 @@ const _TransactionsubTypeValueEnumMap = {
   2: TransactionSubType.mint,
   3: TransactionSubType.join,
   4: TransactionSubType.ethToken,
+  5: TransactionSubType.cashFusion,
 };
 const _TransactiontypeEnumValueMap = {
   'outgoing': 0,
diff --git a/lib/models/isar/models/blockchain_data/v2/input_v2.dart b/lib/models/isar/models/blockchain_data/v2/input_v2.dart
new file mode 100644
index 000000000..66b1c5ab1
--- /dev/null
+++ b/lib/models/isar/models/blockchain_data/v2/input_v2.dart
@@ -0,0 +1,124 @@
+import 'package:isar/isar.dart';
+
+part 'input_v2.g.dart';
+
+@Embedded()
+class OutpointV2 {
+  late final String txid;
+  late final int vout;
+
+  OutpointV2();
+
+  static OutpointV2 isarCantDoRequiredInDefaultConstructor({
+    required String txid,
+    required int vout,
+  }) =>
+      OutpointV2()
+        ..vout = vout
+        ..txid = txid;
+
+  @override
+  String toString() {
+    return 'OutpointV2(\n'
+        '  txid: $txid,\n'
+        '  vout: $vout,\n'
+        ')';
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (identical(this, other)) return true;
+
+    return other is OutpointV2 && other.txid == txid && other.vout == vout;
+  }
+
+  @override
+  int get hashCode {
+    return Object.hash(
+      txid.hashCode,
+      vout.hashCode,
+    );
+  }
+}
+
+@Embedded()
+class InputV2 {
+  late final String? scriptSigHex;
+  late final int? sequence;
+  late final OutpointV2? outpoint;
+  late final List<String> addresses;
+  late final String valueStringSats;
+
+  late final String? coinbase;
+
+  late final String? witness;
+  late final String? innerRedeemScriptAsm;
+
+  late final bool walletOwns;
+
+  @ignore
+  BigInt get value => BigInt.parse(valueStringSats);
+
+  InputV2();
+
+  static InputV2 isarCantDoRequiredInDefaultConstructor({
+    required String? scriptSigHex,
+    required int? sequence,
+    required OutpointV2? outpoint,
+    required List<String> addresses,
+    required String valueStringSats,
+    required String? witness,
+    required String? innerRedeemScriptAsm,
+    required String? coinbase,
+    required bool walletOwns,
+  }) =>
+      InputV2()
+        ..scriptSigHex = scriptSigHex
+        ..sequence = sequence
+        ..outpoint = outpoint
+        ..addresses = List.unmodifiable(addresses)
+        ..valueStringSats = valueStringSats
+        ..witness = witness
+        ..innerRedeemScriptAsm = innerRedeemScriptAsm
+        ..coinbase = coinbase
+        ..walletOwns = walletOwns;
+
+  InputV2 copyWith({
+    String? scriptSigHex,
+    int? sequence,
+    OutpointV2? outpoint,
+    List<String>? addresses,
+    String? valueStringSats,
+    String? coinbase,
+    String? witness,
+    String? innerRedeemScriptAsm,
+    bool? walletOwns,
+  }) {
+    return InputV2.isarCantDoRequiredInDefaultConstructor(
+      scriptSigHex: scriptSigHex ?? this.scriptSigHex,
+      sequence: sequence ?? this.sequence,
+      outpoint: outpoint ?? this.outpoint,
+      addresses: addresses ?? this.addresses,
+      valueStringSats: valueStringSats ?? this.valueStringSats,
+      coinbase: coinbase ?? this.coinbase,
+      witness: witness ?? this.witness,
+      innerRedeemScriptAsm: innerRedeemScriptAsm ?? this.innerRedeemScriptAsm,
+      walletOwns: walletOwns ?? this.walletOwns,
+    );
+  }
+
+  @override
+  String toString() {
+    return 'InputV2(\n'
+        '  scriptSigHex: $scriptSigHex,\n'
+        '  sequence: $sequence,\n'
+        '  outpoint: $outpoint,\n'
+        '  addresses: $addresses,\n'
+        '  valueStringSats: $valueStringSats,\n'
+        '  coinbase: $coinbase,\n'
+        '  witness: $witness,\n'
+        '  innerRedeemScriptAsm: $innerRedeemScriptAsm,\n'
+        '  walletOwns: $walletOwns,\n'
+        ')';
+  }
+}
diff --git a/lib/models/isar/models/blockchain_data/v2/input_v2.g.dart b/lib/models/isar/models/blockchain_data/v2/input_v2.g.dart
new file mode 100644
index 000000000..eb3bc3cd3
--- /dev/null
+++ b/lib/models/isar/models/blockchain_data/v2/input_v2.g.dart
@@ -0,0 +1,1574 @@
+// GENERATED CODE - DO NOT MODIFY BY HAND
+
+part of 'input_v2.dart';
+
+// **************************************************************************
+// IsarEmbeddedGenerator
+// **************************************************************************
+
+// coverage:ignore-file
+// ignore_for_file: duplicate_ignore, non_constant_identifier_names, constant_identifier_names, invalid_use_of_protected_member, unnecessary_cast, prefer_const_constructors, lines_longer_than_80_chars, require_trailing_commas, inference_failure_on_function_invocation, unnecessary_parenthesis, unnecessary_raw_strings, unnecessary_null_checks, join_return_with_assignment, prefer_final_locals, avoid_js_rounded_ints, avoid_positional_boolean_parameters
+
+const OutpointV2Schema = Schema(
+  name: r'OutpointV2',
+  id: 5327663686922028778,
+  properties: {
+    r'hashCode': PropertySchema(
+      id: 0,
+      name: r'hashCode',
+      type: IsarType.long,
+    ),
+    r'txid': PropertySchema(
+      id: 1,
+      name: r'txid',
+      type: IsarType.string,
+    ),
+    r'vout': PropertySchema(
+      id: 2,
+      name: r'vout',
+      type: IsarType.long,
+    )
+  },
+  estimateSize: _outpointV2EstimateSize,
+  serialize: _outpointV2Serialize,
+  deserialize: _outpointV2Deserialize,
+  deserializeProp: _outpointV2DeserializeProp,
+);
+
+int _outpointV2EstimateSize(
+  OutpointV2 object,
+  List<int> offsets,
+  Map<Type, List<int>> allOffsets,
+) {
+  var bytesCount = offsets.last;
+  bytesCount += 3 + object.txid.length * 3;
+  return bytesCount;
+}
+
+void _outpointV2Serialize(
+  OutpointV2 object,
+  IsarWriter writer,
+  List<int> offsets,
+  Map<Type, List<int>> allOffsets,
+) {
+  writer.writeLong(offsets[0], object.hashCode);
+  writer.writeString(offsets[1], object.txid);
+  writer.writeLong(offsets[2], object.vout);
+}
+
+OutpointV2 _outpointV2Deserialize(
+  Id id,
+  IsarReader reader,
+  List<int> offsets,
+  Map<Type, List<int>> allOffsets,
+) {
+  final object = OutpointV2();
+  object.txid = reader.readString(offsets[1]);
+  object.vout = reader.readLong(offsets[2]);
+  return object;
+}
+
+P _outpointV2DeserializeProp<P>(
+  IsarReader reader,
+  int propertyId,
+  int offset,
+  Map<Type, List<int>> allOffsets,
+) {
+  switch (propertyId) {
+    case 0:
+      return (reader.readLong(offset)) as P;
+    case 1:
+      return (reader.readString(offset)) as P;
+    case 2:
+      return (reader.readLong(offset)) as P;
+    default:
+      throw IsarError('Unknown property with id $propertyId');
+  }
+}
+
+extension OutpointV2QueryFilter
+    on QueryBuilder<OutpointV2, OutpointV2, QFilterCondition> {
+  QueryBuilder<OutpointV2, OutpointV2, QAfterFilterCondition> hashCodeEqualTo(
+      int value) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.equalTo(
+        property: r'hashCode',
+        value: value,
+      ));
+    });
+  }
+
+  QueryBuilder<OutpointV2, OutpointV2, QAfterFilterCondition>
+      hashCodeGreaterThan(
+    int value, {
+    bool include = false,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.greaterThan(
+        include: include,
+        property: r'hashCode',
+        value: value,
+      ));
+    });
+  }
+
+  QueryBuilder<OutpointV2, OutpointV2, QAfterFilterCondition> hashCodeLessThan(
+    int value, {
+    bool include = false,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.lessThan(
+        include: include,
+        property: r'hashCode',
+        value: value,
+      ));
+    });
+  }
+
+  QueryBuilder<OutpointV2, OutpointV2, QAfterFilterCondition> hashCodeBetween(
+    int lower,
+    int upper, {
+    bool includeLower = true,
+    bool includeUpper = true,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.between(
+        property: r'hashCode',
+        lower: lower,
+        includeLower: includeLower,
+        upper: upper,
+        includeUpper: includeUpper,
+      ));
+    });
+  }
+
+  QueryBuilder<OutpointV2, OutpointV2, QAfterFilterCondition> txidEqualTo(
+    String value, {
+    bool caseSensitive = true,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.equalTo(
+        property: r'txid',
+        value: value,
+        caseSensitive: caseSensitive,
+      ));
+    });
+  }
+
+  QueryBuilder<OutpointV2, OutpointV2, QAfterFilterCondition> txidGreaterThan(
+    String value, {
+    bool include = false,
+    bool caseSensitive = true,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.greaterThan(
+        include: include,
+        property: r'txid',
+        value: value,
+        caseSensitive: caseSensitive,
+      ));
+    });
+  }
+
+  QueryBuilder<OutpointV2, OutpointV2, QAfterFilterCondition> txidLessThan(
+    String value, {
+    bool include = false,
+    bool caseSensitive = true,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.lessThan(
+        include: include,
+        property: r'txid',
+        value: value,
+        caseSensitive: caseSensitive,
+      ));
+    });
+  }
+
+  QueryBuilder<OutpointV2, OutpointV2, QAfterFilterCondition> txidBetween(
+    String lower,
+    String upper, {
+    bool includeLower = true,
+    bool includeUpper = true,
+    bool caseSensitive = true,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.between(
+        property: r'txid',
+        lower: lower,
+        includeLower: includeLower,
+        upper: upper,
+        includeUpper: includeUpper,
+        caseSensitive: caseSensitive,
+      ));
+    });
+  }
+
+  QueryBuilder<OutpointV2, OutpointV2, QAfterFilterCondition> txidStartsWith(
+    String value, {
+    bool caseSensitive = true,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.startsWith(
+        property: r'txid',
+        value: value,
+        caseSensitive: caseSensitive,
+      ));
+    });
+  }
+
+  QueryBuilder<OutpointV2, OutpointV2, QAfterFilterCondition> txidEndsWith(
+    String value, {
+    bool caseSensitive = true,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.endsWith(
+        property: r'txid',
+        value: value,
+        caseSensitive: caseSensitive,
+      ));
+    });
+  }
+
+  QueryBuilder<OutpointV2, OutpointV2, QAfterFilterCondition> txidContains(
+      String value,
+      {bool caseSensitive = true}) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.contains(
+        property: r'txid',
+        value: value,
+        caseSensitive: caseSensitive,
+      ));
+    });
+  }
+
+  QueryBuilder<OutpointV2, OutpointV2, QAfterFilterCondition> txidMatches(
+      String pattern,
+      {bool caseSensitive = true}) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.matches(
+        property: r'txid',
+        wildcard: pattern,
+        caseSensitive: caseSensitive,
+      ));
+    });
+  }
+
+  QueryBuilder<OutpointV2, OutpointV2, QAfterFilterCondition> txidIsEmpty() {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.equalTo(
+        property: r'txid',
+        value: '',
+      ));
+    });
+  }
+
+  QueryBuilder<OutpointV2, OutpointV2, QAfterFilterCondition> txidIsNotEmpty() {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.greaterThan(
+        property: r'txid',
+        value: '',
+      ));
+    });
+  }
+
+  QueryBuilder<OutpointV2, OutpointV2, QAfterFilterCondition> voutEqualTo(
+      int value) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.equalTo(
+        property: r'vout',
+        value: value,
+      ));
+    });
+  }
+
+  QueryBuilder<OutpointV2, OutpointV2, QAfterFilterCondition> voutGreaterThan(
+    int value, {
+    bool include = false,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.greaterThan(
+        include: include,
+        property: r'vout',
+        value: value,
+      ));
+    });
+  }
+
+  QueryBuilder<OutpointV2, OutpointV2, QAfterFilterCondition> voutLessThan(
+    int value, {
+    bool include = false,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.lessThan(
+        include: include,
+        property: r'vout',
+        value: value,
+      ));
+    });
+  }
+
+  QueryBuilder<OutpointV2, OutpointV2, QAfterFilterCondition> voutBetween(
+    int lower,
+    int upper, {
+    bool includeLower = true,
+    bool includeUpper = true,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.between(
+        property: r'vout',
+        lower: lower,
+        includeLower: includeLower,
+        upper: upper,
+        includeUpper: includeUpper,
+      ));
+    });
+  }
+}
+
+extension OutpointV2QueryObject
+    on QueryBuilder<OutpointV2, OutpointV2, QFilterCondition> {}
+
+// coverage:ignore-file
+// ignore_for_file: duplicate_ignore, non_constant_identifier_names, constant_identifier_names, invalid_use_of_protected_member, unnecessary_cast, prefer_const_constructors, lines_longer_than_80_chars, require_trailing_commas, inference_failure_on_function_invocation, unnecessary_parenthesis, unnecessary_raw_strings, unnecessary_null_checks, join_return_with_assignment, prefer_final_locals, avoid_js_rounded_ints, avoid_positional_boolean_parameters
+
+const InputV2Schema = Schema(
+  name: r'InputV2',
+  id: 1518255311272544045,
+  properties: {
+    r'addresses': PropertySchema(
+      id: 0,
+      name: r'addresses',
+      type: IsarType.stringList,
+    ),
+    r'coinbase': PropertySchema(
+      id: 1,
+      name: r'coinbase',
+      type: IsarType.string,
+    ),
+    r'innerRedeemScriptAsm': PropertySchema(
+      id: 2,
+      name: r'innerRedeemScriptAsm',
+      type: IsarType.string,
+    ),
+    r'outpoint': PropertySchema(
+      id: 3,
+      name: r'outpoint',
+      type: IsarType.object,
+      target: r'OutpointV2',
+    ),
+    r'scriptSigHex': PropertySchema(
+      id: 4,
+      name: r'scriptSigHex',
+      type: IsarType.string,
+    ),
+    r'sequence': PropertySchema(
+      id: 5,
+      name: r'sequence',
+      type: IsarType.long,
+    ),
+    r'valueStringSats': PropertySchema(
+      id: 6,
+      name: r'valueStringSats',
+      type: IsarType.string,
+    ),
+    r'walletOwns': PropertySchema(
+      id: 7,
+      name: r'walletOwns',
+      type: IsarType.bool,
+    ),
+    r'witness': PropertySchema(
+      id: 8,
+      name: r'witness',
+      type: IsarType.string,
+    )
+  },
+  estimateSize: _inputV2EstimateSize,
+  serialize: _inputV2Serialize,
+  deserialize: _inputV2Deserialize,
+  deserializeProp: _inputV2DeserializeProp,
+);
+
+int _inputV2EstimateSize(
+  InputV2 object,
+  List<int> offsets,
+  Map<Type, List<int>> allOffsets,
+) {
+  var bytesCount = offsets.last;
+  bytesCount += 3 + object.addresses.length * 3;
+  {
+    for (var i = 0; i < object.addresses.length; i++) {
+      final value = object.addresses[i];
+      bytesCount += value.length * 3;
+    }
+  }
+  {
+    final value = object.coinbase;
+    if (value != null) {
+      bytesCount += 3 + value.length * 3;
+    }
+  }
+  {
+    final value = object.innerRedeemScriptAsm;
+    if (value != null) {
+      bytesCount += 3 + value.length * 3;
+    }
+  }
+  {
+    final value = object.outpoint;
+    if (value != null) {
+      bytesCount += 3 +
+          OutpointV2Schema.estimateSize(
+              value, allOffsets[OutpointV2]!, allOffsets);
+    }
+  }
+  {
+    final value = object.scriptSigHex;
+    if (value != null) {
+      bytesCount += 3 + value.length * 3;
+    }
+  }
+  bytesCount += 3 + object.valueStringSats.length * 3;
+  {
+    final value = object.witness;
+    if (value != null) {
+      bytesCount += 3 + value.length * 3;
+    }
+  }
+  return bytesCount;
+}
+
+void _inputV2Serialize(
+  InputV2 object,
+  IsarWriter writer,
+  List<int> offsets,
+  Map<Type, List<int>> allOffsets,
+) {
+  writer.writeStringList(offsets[0], object.addresses);
+  writer.writeString(offsets[1], object.coinbase);
+  writer.writeString(offsets[2], object.innerRedeemScriptAsm);
+  writer.writeObject<OutpointV2>(
+    offsets[3],
+    allOffsets,
+    OutpointV2Schema.serialize,
+    object.outpoint,
+  );
+  writer.writeString(offsets[4], object.scriptSigHex);
+  writer.writeLong(offsets[5], object.sequence);
+  writer.writeString(offsets[6], object.valueStringSats);
+  writer.writeBool(offsets[7], object.walletOwns);
+  writer.writeString(offsets[8], object.witness);
+}
+
+InputV2 _inputV2Deserialize(
+  Id id,
+  IsarReader reader,
+  List<int> offsets,
+  Map<Type, List<int>> allOffsets,
+) {
+  final object = InputV2();
+  object.addresses = reader.readStringList(offsets[0]) ?? [];
+  object.coinbase = reader.readStringOrNull(offsets[1]);
+  object.innerRedeemScriptAsm = reader.readStringOrNull(offsets[2]);
+  object.outpoint = reader.readObjectOrNull<OutpointV2>(
+    offsets[3],
+    OutpointV2Schema.deserialize,
+    allOffsets,
+  );
+  object.scriptSigHex = reader.readStringOrNull(offsets[4]);
+  object.sequence = reader.readLongOrNull(offsets[5]);
+  object.valueStringSats = reader.readString(offsets[6]);
+  object.walletOwns = reader.readBool(offsets[7]);
+  object.witness = reader.readStringOrNull(offsets[8]);
+  return object;
+}
+
+P _inputV2DeserializeProp<P>(
+  IsarReader reader,
+  int propertyId,
+  int offset,
+  Map<Type, List<int>> allOffsets,
+) {
+  switch (propertyId) {
+    case 0:
+      return (reader.readStringList(offset) ?? []) as P;
+    case 1:
+      return (reader.readStringOrNull(offset)) as P;
+    case 2:
+      return (reader.readStringOrNull(offset)) as P;
+    case 3:
+      return (reader.readObjectOrNull<OutpointV2>(
+        offset,
+        OutpointV2Schema.deserialize,
+        allOffsets,
+      )) as P;
+    case 4:
+      return (reader.readStringOrNull(offset)) as P;
+    case 5:
+      return (reader.readLongOrNull(offset)) as P;
+    case 6:
+      return (reader.readString(offset)) as P;
+    case 7:
+      return (reader.readBool(offset)) as P;
+    case 8:
+      return (reader.readStringOrNull(offset)) as P;
+    default:
+      throw IsarError('Unknown property with id $propertyId');
+  }
+}
+
+extension InputV2QueryFilter
+    on QueryBuilder<InputV2, InputV2, QFilterCondition> {
+  QueryBuilder<InputV2, InputV2, QAfterFilterCondition> addressesElementEqualTo(
+    String value, {
+    bool caseSensitive = true,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.equalTo(
+        property: r'addresses',
+        value: value,
+        caseSensitive: caseSensitive,
+      ));
+    });
+  }
+
+  QueryBuilder<InputV2, InputV2, QAfterFilterCondition>
+      addressesElementGreaterThan(
+    String value, {
+    bool include = false,
+    bool caseSensitive = true,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.greaterThan(
+        include: include,
+        property: r'addresses',
+        value: value,
+        caseSensitive: caseSensitive,
+      ));
+    });
+  }
+
+  QueryBuilder<InputV2, InputV2, QAfterFilterCondition>
+      addressesElementLessThan(
+    String value, {
+    bool include = false,
+    bool caseSensitive = true,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.lessThan(
+        include: include,
+        property: r'addresses',
+        value: value,
+        caseSensitive: caseSensitive,
+      ));
+    });
+  }
+
+  QueryBuilder<InputV2, InputV2, QAfterFilterCondition> addressesElementBetween(
+    String lower,
+    String upper, {
+    bool includeLower = true,
+    bool includeUpper = true,
+    bool caseSensitive = true,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.between(
+        property: r'addresses',
+        lower: lower,
+        includeLower: includeLower,
+        upper: upper,
+        includeUpper: includeUpper,
+        caseSensitive: caseSensitive,
+      ));
+    });
+  }
+
+  QueryBuilder<InputV2, InputV2, QAfterFilterCondition>
+      addressesElementStartsWith(
+    String value, {
+    bool caseSensitive = true,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.startsWith(
+        property: r'addresses',
+        value: value,
+        caseSensitive: caseSensitive,
+      ));
+    });
+  }
+
+  QueryBuilder<InputV2, InputV2, QAfterFilterCondition>
+      addressesElementEndsWith(
+    String value, {
+    bool caseSensitive = true,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.endsWith(
+        property: r'addresses',
+        value: value,
+        caseSensitive: caseSensitive,
+      ));
+    });
+  }
+
+  QueryBuilder<InputV2, InputV2, QAfterFilterCondition>
+      addressesElementContains(String value, {bool caseSensitive = true}) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.contains(
+        property: r'addresses',
+        value: value,
+        caseSensitive: caseSensitive,
+      ));
+    });
+  }
+
+  QueryBuilder<InputV2, InputV2, QAfterFilterCondition> addressesElementMatches(
+      String pattern,
+      {bool caseSensitive = true}) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.matches(
+        property: r'addresses',
+        wildcard: pattern,
+        caseSensitive: caseSensitive,
+      ));
+    });
+  }
+
+  QueryBuilder<InputV2, InputV2, QAfterFilterCondition>
+      addressesElementIsEmpty() {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.equalTo(
+        property: r'addresses',
+        value: '',
+      ));
+    });
+  }
+
+  QueryBuilder<InputV2, InputV2, QAfterFilterCondition>
+      addressesElementIsNotEmpty() {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.greaterThan(
+        property: r'addresses',
+        value: '',
+      ));
+    });
+  }
+
+  QueryBuilder<InputV2, InputV2, QAfterFilterCondition> addressesLengthEqualTo(
+      int length) {
+    return QueryBuilder.apply(this, (query) {
+      return query.listLength(
+        r'addresses',
+        length,
+        true,
+        length,
+        true,
+      );
+    });
+  }
+
+  QueryBuilder<InputV2, InputV2, QAfterFilterCondition> addressesIsEmpty() {
+    return QueryBuilder.apply(this, (query) {
+      return query.listLength(
+        r'addresses',
+        0,
+        true,
+        0,
+        true,
+      );
+    });
+  }
+
+  QueryBuilder<InputV2, InputV2, QAfterFilterCondition> addressesIsNotEmpty() {
+    return QueryBuilder.apply(this, (query) {
+      return query.listLength(
+        r'addresses',
+        0,
+        false,
+        999999,
+        true,
+      );
+    });
+  }
+
+  QueryBuilder<InputV2, InputV2, QAfterFilterCondition> addressesLengthLessThan(
+    int length, {
+    bool include = false,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.listLength(
+        r'addresses',
+        0,
+        true,
+        length,
+        include,
+      );
+    });
+  }
+
+  QueryBuilder<InputV2, InputV2, QAfterFilterCondition>
+      addressesLengthGreaterThan(
+    int length, {
+    bool include = false,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.listLength(
+        r'addresses',
+        length,
+        include,
+        999999,
+        true,
+      );
+    });
+  }
+
+  QueryBuilder<InputV2, InputV2, QAfterFilterCondition> addressesLengthBetween(
+    int lower,
+    int upper, {
+    bool includeLower = true,
+    bool includeUpper = true,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.listLength(
+        r'addresses',
+        lower,
+        includeLower,
+        upper,
+        includeUpper,
+      );
+    });
+  }
+
+  QueryBuilder<InputV2, InputV2, QAfterFilterCondition> coinbaseIsNull() {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(const FilterCondition.isNull(
+        property: r'coinbase',
+      ));
+    });
+  }
+
+  QueryBuilder<InputV2, InputV2, QAfterFilterCondition> coinbaseIsNotNull() {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(const FilterCondition.isNotNull(
+        property: r'coinbase',
+      ));
+    });
+  }
+
+  QueryBuilder<InputV2, InputV2, QAfterFilterCondition> coinbaseEqualTo(
+    String? value, {
+    bool caseSensitive = true,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.equalTo(
+        property: r'coinbase',
+        value: value,
+        caseSensitive: caseSensitive,
+      ));
+    });
+  }
+
+  QueryBuilder<InputV2, InputV2, QAfterFilterCondition> coinbaseGreaterThan(
+    String? value, {
+    bool include = false,
+    bool caseSensitive = true,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.greaterThan(
+        include: include,
+        property: r'coinbase',
+        value: value,
+        caseSensitive: caseSensitive,
+      ));
+    });
+  }
+
+  QueryBuilder<InputV2, InputV2, QAfterFilterCondition> coinbaseLessThan(
+    String? value, {
+    bool include = false,
+    bool caseSensitive = true,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.lessThan(
+        include: include,
+        property: r'coinbase',
+        value: value,
+        caseSensitive: caseSensitive,
+      ));
+    });
+  }
+
+  QueryBuilder<InputV2, InputV2, QAfterFilterCondition> coinbaseBetween(
+    String? lower,
+    String? upper, {
+    bool includeLower = true,
+    bool includeUpper = true,
+    bool caseSensitive = true,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.between(
+        property: r'coinbase',
+        lower: lower,
+        includeLower: includeLower,
+        upper: upper,
+        includeUpper: includeUpper,
+        caseSensitive: caseSensitive,
+      ));
+    });
+  }
+
+  QueryBuilder<InputV2, InputV2, QAfterFilterCondition> coinbaseStartsWith(
+    String value, {
+    bool caseSensitive = true,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.startsWith(
+        property: r'coinbase',
+        value: value,
+        caseSensitive: caseSensitive,
+      ));
+    });
+  }
+
+  QueryBuilder<InputV2, InputV2, QAfterFilterCondition> coinbaseEndsWith(
+    String value, {
+    bool caseSensitive = true,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.endsWith(
+        property: r'coinbase',
+        value: value,
+        caseSensitive: caseSensitive,
+      ));
+    });
+  }
+
+  QueryBuilder<InputV2, InputV2, QAfterFilterCondition> coinbaseContains(
+      String value,
+      {bool caseSensitive = true}) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.contains(
+        property: r'coinbase',
+        value: value,
+        caseSensitive: caseSensitive,
+      ));
+    });
+  }
+
+  QueryBuilder<InputV2, InputV2, QAfterFilterCondition> coinbaseMatches(
+      String pattern,
+      {bool caseSensitive = true}) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.matches(
+        property: r'coinbase',
+        wildcard: pattern,
+        caseSensitive: caseSensitive,
+      ));
+    });
+  }
+
+  QueryBuilder<InputV2, InputV2, QAfterFilterCondition> coinbaseIsEmpty() {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.equalTo(
+        property: r'coinbase',
+        value: '',
+      ));
+    });
+  }
+
+  QueryBuilder<InputV2, InputV2, QAfterFilterCondition> coinbaseIsNotEmpty() {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.greaterThan(
+        property: r'coinbase',
+        value: '',
+      ));
+    });
+  }
+
+  QueryBuilder<InputV2, InputV2, QAfterFilterCondition>
+      innerRedeemScriptAsmIsNull() {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(const FilterCondition.isNull(
+        property: r'innerRedeemScriptAsm',
+      ));
+    });
+  }
+
+  QueryBuilder<InputV2, InputV2, QAfterFilterCondition>
+      innerRedeemScriptAsmIsNotNull() {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(const FilterCondition.isNotNull(
+        property: r'innerRedeemScriptAsm',
+      ));
+    });
+  }
+
+  QueryBuilder<InputV2, InputV2, QAfterFilterCondition>
+      innerRedeemScriptAsmEqualTo(
+    String? value, {
+    bool caseSensitive = true,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.equalTo(
+        property: r'innerRedeemScriptAsm',
+        value: value,
+        caseSensitive: caseSensitive,
+      ));
+    });
+  }
+
+  QueryBuilder<InputV2, InputV2, QAfterFilterCondition>
+      innerRedeemScriptAsmGreaterThan(
+    String? value, {
+    bool include = false,
+    bool caseSensitive = true,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.greaterThan(
+        include: include,
+        property: r'innerRedeemScriptAsm',
+        value: value,
+        caseSensitive: caseSensitive,
+      ));
+    });
+  }
+
+  QueryBuilder<InputV2, InputV2, QAfterFilterCondition>
+      innerRedeemScriptAsmLessThan(
+    String? value, {
+    bool include = false,
+    bool caseSensitive = true,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.lessThan(
+        include: include,
+        property: r'innerRedeemScriptAsm',
+        value: value,
+        caseSensitive: caseSensitive,
+      ));
+    });
+  }
+
+  QueryBuilder<InputV2, InputV2, QAfterFilterCondition>
+      innerRedeemScriptAsmBetween(
+    String? lower,
+    String? upper, {
+    bool includeLower = true,
+    bool includeUpper = true,
+    bool caseSensitive = true,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.between(
+        property: r'innerRedeemScriptAsm',
+        lower: lower,
+        includeLower: includeLower,
+        upper: upper,
+        includeUpper: includeUpper,
+        caseSensitive: caseSensitive,
+      ));
+    });
+  }
+
+  QueryBuilder<InputV2, InputV2, QAfterFilterCondition>
+      innerRedeemScriptAsmStartsWith(
+    String value, {
+    bool caseSensitive = true,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.startsWith(
+        property: r'innerRedeemScriptAsm',
+        value: value,
+        caseSensitive: caseSensitive,
+      ));
+    });
+  }
+
+  QueryBuilder<InputV2, InputV2, QAfterFilterCondition>
+      innerRedeemScriptAsmEndsWith(
+    String value, {
+    bool caseSensitive = true,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.endsWith(
+        property: r'innerRedeemScriptAsm',
+        value: value,
+        caseSensitive: caseSensitive,
+      ));
+    });
+  }
+
+  QueryBuilder<InputV2, InputV2, QAfterFilterCondition>
+      innerRedeemScriptAsmContains(String value, {bool caseSensitive = true}) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.contains(
+        property: r'innerRedeemScriptAsm',
+        value: value,
+        caseSensitive: caseSensitive,
+      ));
+    });
+  }
+
+  QueryBuilder<InputV2, InputV2, QAfterFilterCondition>
+      innerRedeemScriptAsmMatches(String pattern, {bool caseSensitive = true}) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.matches(
+        property: r'innerRedeemScriptAsm',
+        wildcard: pattern,
+        caseSensitive: caseSensitive,
+      ));
+    });
+  }
+
+  QueryBuilder<InputV2, InputV2, QAfterFilterCondition>
+      innerRedeemScriptAsmIsEmpty() {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.equalTo(
+        property: r'innerRedeemScriptAsm',
+        value: '',
+      ));
+    });
+  }
+
+  QueryBuilder<InputV2, InputV2, QAfterFilterCondition>
+      innerRedeemScriptAsmIsNotEmpty() {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.greaterThan(
+        property: r'innerRedeemScriptAsm',
+        value: '',
+      ));
+    });
+  }
+
+  QueryBuilder<InputV2, InputV2, QAfterFilterCondition> outpointIsNull() {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(const FilterCondition.isNull(
+        property: r'outpoint',
+      ));
+    });
+  }
+
+  QueryBuilder<InputV2, InputV2, QAfterFilterCondition> outpointIsNotNull() {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(const FilterCondition.isNotNull(
+        property: r'outpoint',
+      ));
+    });
+  }
+
+  QueryBuilder<InputV2, InputV2, QAfterFilterCondition> scriptSigHexIsNull() {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(const FilterCondition.isNull(
+        property: r'scriptSigHex',
+      ));
+    });
+  }
+
+  QueryBuilder<InputV2, InputV2, QAfterFilterCondition>
+      scriptSigHexIsNotNull() {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(const FilterCondition.isNotNull(
+        property: r'scriptSigHex',
+      ));
+    });
+  }
+
+  QueryBuilder<InputV2, InputV2, QAfterFilterCondition> scriptSigHexEqualTo(
+    String? value, {
+    bool caseSensitive = true,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.equalTo(
+        property: r'scriptSigHex',
+        value: value,
+        caseSensitive: caseSensitive,
+      ));
+    });
+  }
+
+  QueryBuilder<InputV2, InputV2, QAfterFilterCondition> scriptSigHexGreaterThan(
+    String? value, {
+    bool include = false,
+    bool caseSensitive = true,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.greaterThan(
+        include: include,
+        property: r'scriptSigHex',
+        value: value,
+        caseSensitive: caseSensitive,
+      ));
+    });
+  }
+
+  QueryBuilder<InputV2, InputV2, QAfterFilterCondition> scriptSigHexLessThan(
+    String? value, {
+    bool include = false,
+    bool caseSensitive = true,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.lessThan(
+        include: include,
+        property: r'scriptSigHex',
+        value: value,
+        caseSensitive: caseSensitive,
+      ));
+    });
+  }
+
+  QueryBuilder<InputV2, InputV2, QAfterFilterCondition> scriptSigHexBetween(
+    String? lower,
+    String? upper, {
+    bool includeLower = true,
+    bool includeUpper = true,
+    bool caseSensitive = true,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.between(
+        property: r'scriptSigHex',
+        lower: lower,
+        includeLower: includeLower,
+        upper: upper,
+        includeUpper: includeUpper,
+        caseSensitive: caseSensitive,
+      ));
+    });
+  }
+
+  QueryBuilder<InputV2, InputV2, QAfterFilterCondition> scriptSigHexStartsWith(
+    String value, {
+    bool caseSensitive = true,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.startsWith(
+        property: r'scriptSigHex',
+        value: value,
+        caseSensitive: caseSensitive,
+      ));
+    });
+  }
+
+  QueryBuilder<InputV2, InputV2, QAfterFilterCondition> scriptSigHexEndsWith(
+    String value, {
+    bool caseSensitive = true,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.endsWith(
+        property: r'scriptSigHex',
+        value: value,
+        caseSensitive: caseSensitive,
+      ));
+    });
+  }
+
+  QueryBuilder<InputV2, InputV2, QAfterFilterCondition> scriptSigHexContains(
+      String value,
+      {bool caseSensitive = true}) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.contains(
+        property: r'scriptSigHex',
+        value: value,
+        caseSensitive: caseSensitive,
+      ));
+    });
+  }
+
+  QueryBuilder<InputV2, InputV2, QAfterFilterCondition> scriptSigHexMatches(
+      String pattern,
+      {bool caseSensitive = true}) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.matches(
+        property: r'scriptSigHex',
+        wildcard: pattern,
+        caseSensitive: caseSensitive,
+      ));
+    });
+  }
+
+  QueryBuilder<InputV2, InputV2, QAfterFilterCondition> scriptSigHexIsEmpty() {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.equalTo(
+        property: r'scriptSigHex',
+        value: '',
+      ));
+    });
+  }
+
+  QueryBuilder<InputV2, InputV2, QAfterFilterCondition>
+      scriptSigHexIsNotEmpty() {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.greaterThan(
+        property: r'scriptSigHex',
+        value: '',
+      ));
+    });
+  }
+
+  QueryBuilder<InputV2, InputV2, QAfterFilterCondition> sequenceIsNull() {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(const FilterCondition.isNull(
+        property: r'sequence',
+      ));
+    });
+  }
+
+  QueryBuilder<InputV2, InputV2, QAfterFilterCondition> sequenceIsNotNull() {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(const FilterCondition.isNotNull(
+        property: r'sequence',
+      ));
+    });
+  }
+
+  QueryBuilder<InputV2, InputV2, QAfterFilterCondition> sequenceEqualTo(
+      int? value) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.equalTo(
+        property: r'sequence',
+        value: value,
+      ));
+    });
+  }
+
+  QueryBuilder<InputV2, InputV2, QAfterFilterCondition> sequenceGreaterThan(
+    int? value, {
+    bool include = false,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.greaterThan(
+        include: include,
+        property: r'sequence',
+        value: value,
+      ));
+    });
+  }
+
+  QueryBuilder<InputV2, InputV2, QAfterFilterCondition> sequenceLessThan(
+    int? value, {
+    bool include = false,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.lessThan(
+        include: include,
+        property: r'sequence',
+        value: value,
+      ));
+    });
+  }
+
+  QueryBuilder<InputV2, InputV2, QAfterFilterCondition> sequenceBetween(
+    int? lower,
+    int? upper, {
+    bool includeLower = true,
+    bool includeUpper = true,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.between(
+        property: r'sequence',
+        lower: lower,
+        includeLower: includeLower,
+        upper: upper,
+        includeUpper: includeUpper,
+      ));
+    });
+  }
+
+  QueryBuilder<InputV2, InputV2, QAfterFilterCondition> valueStringSatsEqualTo(
+    String value, {
+    bool caseSensitive = true,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.equalTo(
+        property: r'valueStringSats',
+        value: value,
+        caseSensitive: caseSensitive,
+      ));
+    });
+  }
+
+  QueryBuilder<InputV2, InputV2, QAfterFilterCondition>
+      valueStringSatsGreaterThan(
+    String value, {
+    bool include = false,
+    bool caseSensitive = true,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.greaterThan(
+        include: include,
+        property: r'valueStringSats',
+        value: value,
+        caseSensitive: caseSensitive,
+      ));
+    });
+  }
+
+  QueryBuilder<InputV2, InputV2, QAfterFilterCondition> valueStringSatsLessThan(
+    String value, {
+    bool include = false,
+    bool caseSensitive = true,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.lessThan(
+        include: include,
+        property: r'valueStringSats',
+        value: value,
+        caseSensitive: caseSensitive,
+      ));
+    });
+  }
+
+  QueryBuilder<InputV2, InputV2, QAfterFilterCondition> valueStringSatsBetween(
+    String lower,
+    String upper, {
+    bool includeLower = true,
+    bool includeUpper = true,
+    bool caseSensitive = true,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.between(
+        property: r'valueStringSats',
+        lower: lower,
+        includeLower: includeLower,
+        upper: upper,
+        includeUpper: includeUpper,
+        caseSensitive: caseSensitive,
+      ));
+    });
+  }
+
+  QueryBuilder<InputV2, InputV2, QAfterFilterCondition>
+      valueStringSatsStartsWith(
+    String value, {
+    bool caseSensitive = true,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.startsWith(
+        property: r'valueStringSats',
+        value: value,
+        caseSensitive: caseSensitive,
+      ));
+    });
+  }
+
+  QueryBuilder<InputV2, InputV2, QAfterFilterCondition> valueStringSatsEndsWith(
+    String value, {
+    bool caseSensitive = true,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.endsWith(
+        property: r'valueStringSats',
+        value: value,
+        caseSensitive: caseSensitive,
+      ));
+    });
+  }
+
+  QueryBuilder<InputV2, InputV2, QAfterFilterCondition> valueStringSatsContains(
+      String value,
+      {bool caseSensitive = true}) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.contains(
+        property: r'valueStringSats',
+        value: value,
+        caseSensitive: caseSensitive,
+      ));
+    });
+  }
+
+  QueryBuilder<InputV2, InputV2, QAfterFilterCondition> valueStringSatsMatches(
+      String pattern,
+      {bool caseSensitive = true}) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.matches(
+        property: r'valueStringSats',
+        wildcard: pattern,
+        caseSensitive: caseSensitive,
+      ));
+    });
+  }
+
+  QueryBuilder<InputV2, InputV2, QAfterFilterCondition>
+      valueStringSatsIsEmpty() {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.equalTo(
+        property: r'valueStringSats',
+        value: '',
+      ));
+    });
+  }
+
+  QueryBuilder<InputV2, InputV2, QAfterFilterCondition>
+      valueStringSatsIsNotEmpty() {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.greaterThan(
+        property: r'valueStringSats',
+        value: '',
+      ));
+    });
+  }
+
+  QueryBuilder<InputV2, InputV2, QAfterFilterCondition> walletOwnsEqualTo(
+      bool value) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.equalTo(
+        property: r'walletOwns',
+        value: value,
+      ));
+    });
+  }
+
+  QueryBuilder<InputV2, InputV2, QAfterFilterCondition> witnessIsNull() {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(const FilterCondition.isNull(
+        property: r'witness',
+      ));
+    });
+  }
+
+  QueryBuilder<InputV2, InputV2, QAfterFilterCondition> witnessIsNotNull() {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(const FilterCondition.isNotNull(
+        property: r'witness',
+      ));
+    });
+  }
+
+  QueryBuilder<InputV2, InputV2, QAfterFilterCondition> witnessEqualTo(
+    String? value, {
+    bool caseSensitive = true,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.equalTo(
+        property: r'witness',
+        value: value,
+        caseSensitive: caseSensitive,
+      ));
+    });
+  }
+
+  QueryBuilder<InputV2, InputV2, QAfterFilterCondition> witnessGreaterThan(
+    String? value, {
+    bool include = false,
+    bool caseSensitive = true,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.greaterThan(
+        include: include,
+        property: r'witness',
+        value: value,
+        caseSensitive: caseSensitive,
+      ));
+    });
+  }
+
+  QueryBuilder<InputV2, InputV2, QAfterFilterCondition> witnessLessThan(
+    String? value, {
+    bool include = false,
+    bool caseSensitive = true,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.lessThan(
+        include: include,
+        property: r'witness',
+        value: value,
+        caseSensitive: caseSensitive,
+      ));
+    });
+  }
+
+  QueryBuilder<InputV2, InputV2, QAfterFilterCondition> witnessBetween(
+    String? lower,
+    String? upper, {
+    bool includeLower = true,
+    bool includeUpper = true,
+    bool caseSensitive = true,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.between(
+        property: r'witness',
+        lower: lower,
+        includeLower: includeLower,
+        upper: upper,
+        includeUpper: includeUpper,
+        caseSensitive: caseSensitive,
+      ));
+    });
+  }
+
+  QueryBuilder<InputV2, InputV2, QAfterFilterCondition> witnessStartsWith(
+    String value, {
+    bool caseSensitive = true,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.startsWith(
+        property: r'witness',
+        value: value,
+        caseSensitive: caseSensitive,
+      ));
+    });
+  }
+
+  QueryBuilder<InputV2, InputV2, QAfterFilterCondition> witnessEndsWith(
+    String value, {
+    bool caseSensitive = true,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.endsWith(
+        property: r'witness',
+        value: value,
+        caseSensitive: caseSensitive,
+      ));
+    });
+  }
+
+  QueryBuilder<InputV2, InputV2, QAfterFilterCondition> witnessContains(
+      String value,
+      {bool caseSensitive = true}) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.contains(
+        property: r'witness',
+        value: value,
+        caseSensitive: caseSensitive,
+      ));
+    });
+  }
+
+  QueryBuilder<InputV2, InputV2, QAfterFilterCondition> witnessMatches(
+      String pattern,
+      {bool caseSensitive = true}) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.matches(
+        property: r'witness',
+        wildcard: pattern,
+        caseSensitive: caseSensitive,
+      ));
+    });
+  }
+
+  QueryBuilder<InputV2, InputV2, QAfterFilterCondition> witnessIsEmpty() {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.equalTo(
+        property: r'witness',
+        value: '',
+      ));
+    });
+  }
+
+  QueryBuilder<InputV2, InputV2, QAfterFilterCondition> witnessIsNotEmpty() {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.greaterThan(
+        property: r'witness',
+        value: '',
+      ));
+    });
+  }
+}
+
+extension InputV2QueryObject
+    on QueryBuilder<InputV2, InputV2, QFilterCondition> {
+  QueryBuilder<InputV2, InputV2, QAfterFilterCondition> outpoint(
+      FilterQuery<OutpointV2> q) {
+    return QueryBuilder.apply(this, (query) {
+      return query.object(q, r'outpoint');
+    });
+  }
+}
diff --git a/lib/models/isar/models/blockchain_data/v2/output_v2.dart b/lib/models/isar/models/blockchain_data/v2/output_v2.dart
new file mode 100644
index 000000000..30e24539e
--- /dev/null
+++ b/lib/models/isar/models/blockchain_data/v2/output_v2.dart
@@ -0,0 +1,121 @@
+import 'package:decimal/decimal.dart';
+import 'package:isar/isar.dart';
+
+part 'output_v2.g.dart';
+
+@Embedded()
+class OutputV2 {
+  late final String scriptPubKeyHex;
+  late final String valueStringSats;
+  late final List<String> addresses;
+
+  late final bool walletOwns;
+
+  @ignore
+  BigInt get value => BigInt.parse(valueStringSats);
+
+  OutputV2();
+
+  static OutputV2 isarCantDoRequiredInDefaultConstructor({
+    required String scriptPubKeyHex,
+    required String valueStringSats,
+    required List<String> addresses,
+    required bool walletOwns,
+  }) =>
+      OutputV2()
+        ..scriptPubKeyHex = scriptPubKeyHex
+        ..valueStringSats = valueStringSats
+        ..walletOwns = walletOwns
+        ..addresses = List.unmodifiable(addresses);
+
+  OutputV2 copyWith({
+    String? scriptPubKeyHex,
+    String? valueStringSats,
+    List<String>? addresses,
+    bool? walletOwns,
+  }) {
+    return OutputV2.isarCantDoRequiredInDefaultConstructor(
+      scriptPubKeyHex: scriptPubKeyHex ?? this.scriptPubKeyHex,
+      valueStringSats: valueStringSats ?? this.valueStringSats,
+      addresses: addresses ?? this.addresses,
+      walletOwns: walletOwns ?? this.walletOwns,
+    );
+  }
+
+  static OutputV2 fromElectrumXJson(
+    Map<String, dynamic> json, {
+    required bool walletOwns,
+    required int decimalPlaces,
+  }) {
+    try {
+      List<String> addresses = [];
+
+      if (json["scriptPubKey"]?["addresses"] is List) {
+        for (final e in json["scriptPubKey"]["addresses"] as List) {
+          addresses.add(e as String);
+        }
+      } else if (json["scriptPubKey"]?["address"] is String) {
+        addresses.add(json["scriptPubKey"]?["address"] as String);
+      }
+
+      return OutputV2.isarCantDoRequiredInDefaultConstructor(
+        scriptPubKeyHex: json["scriptPubKey"]["hex"] as String,
+        valueStringSats: parseOutputAmountString(
+          json["value"].toString(),
+          decimalPlaces: decimalPlaces,
+        ),
+        addresses: addresses,
+        walletOwns: walletOwns,
+      );
+    } catch (e) {
+      throw Exception("Failed to parse OutputV2 from $json");
+    }
+  }
+
+  static String parseOutputAmountString(
+    String amount, {
+    required int decimalPlaces,
+  }) {
+    final temp = Decimal.parse(amount);
+    if (temp < Decimal.zero) {
+      throw Exception("Negative value found");
+    }
+
+    final String valueStringSats;
+    if (temp.isInteger) {
+      valueStringSats = temp.toString();
+    } else {
+      valueStringSats = temp.shift(decimalPlaces).toBigInt().toString();
+    }
+
+    return valueStringSats;
+  }
+
+  @override
+  String toString() {
+    return 'OutputV2(\n'
+        '  scriptPubKeyHex: $scriptPubKeyHex,\n'
+        '  value: $value,\n'
+        '  walletOwns: $walletOwns,\n'
+        '  addresses: $addresses,\n'
+        ')';
+  }
+}
+
+bool _listEquals<T, U>(List<T> a, List<U> b) {
+  if (T != U) {
+    return false;
+  }
+
+  if (a.length != b.length) {
+    return false;
+  }
+
+  for (int i = 0; i < a.length; i++) {
+    if (a[i] != b[i]) {
+      return false;
+    }
+  }
+
+  return true;
+}
diff --git a/lib/models/isar/models/blockchain_data/v2/output_v2.g.dart b/lib/models/isar/models/blockchain_data/v2/output_v2.g.dart
new file mode 100644
index 000000000..bf966d5ec
--- /dev/null
+++ b/lib/models/isar/models/blockchain_data/v2/output_v2.g.dart
@@ -0,0 +1,617 @@
+// GENERATED CODE - DO NOT MODIFY BY HAND
+
+part of 'output_v2.dart';
+
+// **************************************************************************
+// IsarEmbeddedGenerator
+// **************************************************************************
+
+// coverage:ignore-file
+// ignore_for_file: duplicate_ignore, non_constant_identifier_names, constant_identifier_names, invalid_use_of_protected_member, unnecessary_cast, prefer_const_constructors, lines_longer_than_80_chars, require_trailing_commas, inference_failure_on_function_invocation, unnecessary_parenthesis, unnecessary_raw_strings, unnecessary_null_checks, join_return_with_assignment, prefer_final_locals, avoid_js_rounded_ints, avoid_positional_boolean_parameters
+
+const OutputV2Schema = Schema(
+  name: r'OutputV2',
+  id: -6134367361914065515,
+  properties: {
+    r'addresses': PropertySchema(
+      id: 0,
+      name: r'addresses',
+      type: IsarType.stringList,
+    ),
+    r'scriptPubKeyHex': PropertySchema(
+      id: 1,
+      name: r'scriptPubKeyHex',
+      type: IsarType.string,
+    ),
+    r'valueStringSats': PropertySchema(
+      id: 2,
+      name: r'valueStringSats',
+      type: IsarType.string,
+    ),
+    r'walletOwns': PropertySchema(
+      id: 3,
+      name: r'walletOwns',
+      type: IsarType.bool,
+    )
+  },
+  estimateSize: _outputV2EstimateSize,
+  serialize: _outputV2Serialize,
+  deserialize: _outputV2Deserialize,
+  deserializeProp: _outputV2DeserializeProp,
+);
+
+int _outputV2EstimateSize(
+  OutputV2 object,
+  List<int> offsets,
+  Map<Type, List<int>> allOffsets,
+) {
+  var bytesCount = offsets.last;
+  bytesCount += 3 + object.addresses.length * 3;
+  {
+    for (var i = 0; i < object.addresses.length; i++) {
+      final value = object.addresses[i];
+      bytesCount += value.length * 3;
+    }
+  }
+  bytesCount += 3 + object.scriptPubKeyHex.length * 3;
+  bytesCount += 3 + object.valueStringSats.length * 3;
+  return bytesCount;
+}
+
+void _outputV2Serialize(
+  OutputV2 object,
+  IsarWriter writer,
+  List<int> offsets,
+  Map<Type, List<int>> allOffsets,
+) {
+  writer.writeStringList(offsets[0], object.addresses);
+  writer.writeString(offsets[1], object.scriptPubKeyHex);
+  writer.writeString(offsets[2], object.valueStringSats);
+  writer.writeBool(offsets[3], object.walletOwns);
+}
+
+OutputV2 _outputV2Deserialize(
+  Id id,
+  IsarReader reader,
+  List<int> offsets,
+  Map<Type, List<int>> allOffsets,
+) {
+  final object = OutputV2();
+  object.addresses = reader.readStringList(offsets[0]) ?? [];
+  object.scriptPubKeyHex = reader.readString(offsets[1]);
+  object.valueStringSats = reader.readString(offsets[2]);
+  object.walletOwns = reader.readBool(offsets[3]);
+  return object;
+}
+
+P _outputV2DeserializeProp<P>(
+  IsarReader reader,
+  int propertyId,
+  int offset,
+  Map<Type, List<int>> allOffsets,
+) {
+  switch (propertyId) {
+    case 0:
+      return (reader.readStringList(offset) ?? []) as P;
+    case 1:
+      return (reader.readString(offset)) as P;
+    case 2:
+      return (reader.readString(offset)) as P;
+    case 3:
+      return (reader.readBool(offset)) as P;
+    default:
+      throw IsarError('Unknown property with id $propertyId');
+  }
+}
+
+extension OutputV2QueryFilter
+    on QueryBuilder<OutputV2, OutputV2, QFilterCondition> {
+  QueryBuilder<OutputV2, OutputV2, QAfterFilterCondition>
+      addressesElementEqualTo(
+    String value, {
+    bool caseSensitive = true,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.equalTo(
+        property: r'addresses',
+        value: value,
+        caseSensitive: caseSensitive,
+      ));
+    });
+  }
+
+  QueryBuilder<OutputV2, OutputV2, QAfterFilterCondition>
+      addressesElementGreaterThan(
+    String value, {
+    bool include = false,
+    bool caseSensitive = true,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.greaterThan(
+        include: include,
+        property: r'addresses',
+        value: value,
+        caseSensitive: caseSensitive,
+      ));
+    });
+  }
+
+  QueryBuilder<OutputV2, OutputV2, QAfterFilterCondition>
+      addressesElementLessThan(
+    String value, {
+    bool include = false,
+    bool caseSensitive = true,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.lessThan(
+        include: include,
+        property: r'addresses',
+        value: value,
+        caseSensitive: caseSensitive,
+      ));
+    });
+  }
+
+  QueryBuilder<OutputV2, OutputV2, QAfterFilterCondition>
+      addressesElementBetween(
+    String lower,
+    String upper, {
+    bool includeLower = true,
+    bool includeUpper = true,
+    bool caseSensitive = true,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.between(
+        property: r'addresses',
+        lower: lower,
+        includeLower: includeLower,
+        upper: upper,
+        includeUpper: includeUpper,
+        caseSensitive: caseSensitive,
+      ));
+    });
+  }
+
+  QueryBuilder<OutputV2, OutputV2, QAfterFilterCondition>
+      addressesElementStartsWith(
+    String value, {
+    bool caseSensitive = true,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.startsWith(
+        property: r'addresses',
+        value: value,
+        caseSensitive: caseSensitive,
+      ));
+    });
+  }
+
+  QueryBuilder<OutputV2, OutputV2, QAfterFilterCondition>
+      addressesElementEndsWith(
+    String value, {
+    bool caseSensitive = true,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.endsWith(
+        property: r'addresses',
+        value: value,
+        caseSensitive: caseSensitive,
+      ));
+    });
+  }
+
+  QueryBuilder<OutputV2, OutputV2, QAfterFilterCondition>
+      addressesElementContains(String value, {bool caseSensitive = true}) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.contains(
+        property: r'addresses',
+        value: value,
+        caseSensitive: caseSensitive,
+      ));
+    });
+  }
+
+  QueryBuilder<OutputV2, OutputV2, QAfterFilterCondition>
+      addressesElementMatches(String pattern, {bool caseSensitive = true}) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.matches(
+        property: r'addresses',
+        wildcard: pattern,
+        caseSensitive: caseSensitive,
+      ));
+    });
+  }
+
+  QueryBuilder<OutputV2, OutputV2, QAfterFilterCondition>
+      addressesElementIsEmpty() {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.equalTo(
+        property: r'addresses',
+        value: '',
+      ));
+    });
+  }
+
+  QueryBuilder<OutputV2, OutputV2, QAfterFilterCondition>
+      addressesElementIsNotEmpty() {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.greaterThan(
+        property: r'addresses',
+        value: '',
+      ));
+    });
+  }
+
+  QueryBuilder<OutputV2, OutputV2, QAfterFilterCondition>
+      addressesLengthEqualTo(int length) {
+    return QueryBuilder.apply(this, (query) {
+      return query.listLength(
+        r'addresses',
+        length,
+        true,
+        length,
+        true,
+      );
+    });
+  }
+
+  QueryBuilder<OutputV2, OutputV2, QAfterFilterCondition> addressesIsEmpty() {
+    return QueryBuilder.apply(this, (query) {
+      return query.listLength(
+        r'addresses',
+        0,
+        true,
+        0,
+        true,
+      );
+    });
+  }
+
+  QueryBuilder<OutputV2, OutputV2, QAfterFilterCondition>
+      addressesIsNotEmpty() {
+    return QueryBuilder.apply(this, (query) {
+      return query.listLength(
+        r'addresses',
+        0,
+        false,
+        999999,
+        true,
+      );
+    });
+  }
+
+  QueryBuilder<OutputV2, OutputV2, QAfterFilterCondition>
+      addressesLengthLessThan(
+    int length, {
+    bool include = false,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.listLength(
+        r'addresses',
+        0,
+        true,
+        length,
+        include,
+      );
+    });
+  }
+
+  QueryBuilder<OutputV2, OutputV2, QAfterFilterCondition>
+      addressesLengthGreaterThan(
+    int length, {
+    bool include = false,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.listLength(
+        r'addresses',
+        length,
+        include,
+        999999,
+        true,
+      );
+    });
+  }
+
+  QueryBuilder<OutputV2, OutputV2, QAfterFilterCondition>
+      addressesLengthBetween(
+    int lower,
+    int upper, {
+    bool includeLower = true,
+    bool includeUpper = true,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.listLength(
+        r'addresses',
+        lower,
+        includeLower,
+        upper,
+        includeUpper,
+      );
+    });
+  }
+
+  QueryBuilder<OutputV2, OutputV2, QAfterFilterCondition>
+      scriptPubKeyHexEqualTo(
+    String value, {
+    bool caseSensitive = true,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.equalTo(
+        property: r'scriptPubKeyHex',
+        value: value,
+        caseSensitive: caseSensitive,
+      ));
+    });
+  }
+
+  QueryBuilder<OutputV2, OutputV2, QAfterFilterCondition>
+      scriptPubKeyHexGreaterThan(
+    String value, {
+    bool include = false,
+    bool caseSensitive = true,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.greaterThan(
+        include: include,
+        property: r'scriptPubKeyHex',
+        value: value,
+        caseSensitive: caseSensitive,
+      ));
+    });
+  }
+
+  QueryBuilder<OutputV2, OutputV2, QAfterFilterCondition>
+      scriptPubKeyHexLessThan(
+    String value, {
+    bool include = false,
+    bool caseSensitive = true,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.lessThan(
+        include: include,
+        property: r'scriptPubKeyHex',
+        value: value,
+        caseSensitive: caseSensitive,
+      ));
+    });
+  }
+
+  QueryBuilder<OutputV2, OutputV2, QAfterFilterCondition>
+      scriptPubKeyHexBetween(
+    String lower,
+    String upper, {
+    bool includeLower = true,
+    bool includeUpper = true,
+    bool caseSensitive = true,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.between(
+        property: r'scriptPubKeyHex',
+        lower: lower,
+        includeLower: includeLower,
+        upper: upper,
+        includeUpper: includeUpper,
+        caseSensitive: caseSensitive,
+      ));
+    });
+  }
+
+  QueryBuilder<OutputV2, OutputV2, QAfterFilterCondition>
+      scriptPubKeyHexStartsWith(
+    String value, {
+    bool caseSensitive = true,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.startsWith(
+        property: r'scriptPubKeyHex',
+        value: value,
+        caseSensitive: caseSensitive,
+      ));
+    });
+  }
+
+  QueryBuilder<OutputV2, OutputV2, QAfterFilterCondition>
+      scriptPubKeyHexEndsWith(
+    String value, {
+    bool caseSensitive = true,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.endsWith(
+        property: r'scriptPubKeyHex',
+        value: value,
+        caseSensitive: caseSensitive,
+      ));
+    });
+  }
+
+  QueryBuilder<OutputV2, OutputV2, QAfterFilterCondition>
+      scriptPubKeyHexContains(String value, {bool caseSensitive = true}) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.contains(
+        property: r'scriptPubKeyHex',
+        value: value,
+        caseSensitive: caseSensitive,
+      ));
+    });
+  }
+
+  QueryBuilder<OutputV2, OutputV2, QAfterFilterCondition>
+      scriptPubKeyHexMatches(String pattern, {bool caseSensitive = true}) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.matches(
+        property: r'scriptPubKeyHex',
+        wildcard: pattern,
+        caseSensitive: caseSensitive,
+      ));
+    });
+  }
+
+  QueryBuilder<OutputV2, OutputV2, QAfterFilterCondition>
+      scriptPubKeyHexIsEmpty() {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.equalTo(
+        property: r'scriptPubKeyHex',
+        value: '',
+      ));
+    });
+  }
+
+  QueryBuilder<OutputV2, OutputV2, QAfterFilterCondition>
+      scriptPubKeyHexIsNotEmpty() {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.greaterThan(
+        property: r'scriptPubKeyHex',
+        value: '',
+      ));
+    });
+  }
+
+  QueryBuilder<OutputV2, OutputV2, QAfterFilterCondition>
+      valueStringSatsEqualTo(
+    String value, {
+    bool caseSensitive = true,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.equalTo(
+        property: r'valueStringSats',
+        value: value,
+        caseSensitive: caseSensitive,
+      ));
+    });
+  }
+
+  QueryBuilder<OutputV2, OutputV2, QAfterFilterCondition>
+      valueStringSatsGreaterThan(
+    String value, {
+    bool include = false,
+    bool caseSensitive = true,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.greaterThan(
+        include: include,
+        property: r'valueStringSats',
+        value: value,
+        caseSensitive: caseSensitive,
+      ));
+    });
+  }
+
+  QueryBuilder<OutputV2, OutputV2, QAfterFilterCondition>
+      valueStringSatsLessThan(
+    String value, {
+    bool include = false,
+    bool caseSensitive = true,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.lessThan(
+        include: include,
+        property: r'valueStringSats',
+        value: value,
+        caseSensitive: caseSensitive,
+      ));
+    });
+  }
+
+  QueryBuilder<OutputV2, OutputV2, QAfterFilterCondition>
+      valueStringSatsBetween(
+    String lower,
+    String upper, {
+    bool includeLower = true,
+    bool includeUpper = true,
+    bool caseSensitive = true,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.between(
+        property: r'valueStringSats',
+        lower: lower,
+        includeLower: includeLower,
+        upper: upper,
+        includeUpper: includeUpper,
+        caseSensitive: caseSensitive,
+      ));
+    });
+  }
+
+  QueryBuilder<OutputV2, OutputV2, QAfterFilterCondition>
+      valueStringSatsStartsWith(
+    String value, {
+    bool caseSensitive = true,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.startsWith(
+        property: r'valueStringSats',
+        value: value,
+        caseSensitive: caseSensitive,
+      ));
+    });
+  }
+
+  QueryBuilder<OutputV2, OutputV2, QAfterFilterCondition>
+      valueStringSatsEndsWith(
+    String value, {
+    bool caseSensitive = true,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.endsWith(
+        property: r'valueStringSats',
+        value: value,
+        caseSensitive: caseSensitive,
+      ));
+    });
+  }
+
+  QueryBuilder<OutputV2, OutputV2, QAfterFilterCondition>
+      valueStringSatsContains(String value, {bool caseSensitive = true}) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.contains(
+        property: r'valueStringSats',
+        value: value,
+        caseSensitive: caseSensitive,
+      ));
+    });
+  }
+
+  QueryBuilder<OutputV2, OutputV2, QAfterFilterCondition>
+      valueStringSatsMatches(String pattern, {bool caseSensitive = true}) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.matches(
+        property: r'valueStringSats',
+        wildcard: pattern,
+        caseSensitive: caseSensitive,
+      ));
+    });
+  }
+
+  QueryBuilder<OutputV2, OutputV2, QAfterFilterCondition>
+      valueStringSatsIsEmpty() {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.equalTo(
+        property: r'valueStringSats',
+        value: '',
+      ));
+    });
+  }
+
+  QueryBuilder<OutputV2, OutputV2, QAfterFilterCondition>
+      valueStringSatsIsNotEmpty() {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.greaterThan(
+        property: r'valueStringSats',
+        value: '',
+      ));
+    });
+  }
+
+  QueryBuilder<OutputV2, OutputV2, QAfterFilterCondition> walletOwnsEqualTo(
+      bool value) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.equalTo(
+        property: r'walletOwns',
+        value: value,
+      ));
+    });
+  }
+}
+
+extension OutputV2QueryObject
+    on QueryBuilder<OutputV2, OutputV2, QFilterCondition> {}
diff --git a/lib/models/isar/models/blockchain_data/v2/transaction_v2.dart b/lib/models/isar/models/blockchain_data/v2/transaction_v2.dart
new file mode 100644
index 000000000..c39c0cf11
--- /dev/null
+++ b/lib/models/isar/models/blockchain_data/v2/transaction_v2.dart
@@ -0,0 +1,120 @@
+import 'dart:math';
+
+import 'package:isar/isar.dart';
+import 'package:stackwallet/models/isar/models/blockchain_data/transaction.dart';
+import 'package:stackwallet/models/isar/models/blockchain_data/v2/input_v2.dart';
+import 'package:stackwallet/models/isar/models/blockchain_data/v2/output_v2.dart';
+import 'package:stackwallet/utilities/amount/amount.dart';
+import 'package:stackwallet/utilities/enums/coin_enum.dart';
+
+part 'transaction_v2.g.dart';
+
+@Collection()
+class TransactionV2 {
+  Id id = Isar.autoIncrement;
+
+  @Index()
+  final String walletId;
+
+  @Index(unique: true, composite: [CompositeIndex("walletId")])
+  final String txid;
+
+  final String hash;
+
+  @Index()
+  late final int timestamp;
+
+  final int? height;
+  final String? blockHash;
+  final int version;
+
+  final List<InputV2> inputs;
+  final List<OutputV2> outputs;
+
+  @enumerated
+  final TransactionType type;
+
+  @enumerated
+  final TransactionSubType subType;
+
+  TransactionV2({
+    required this.walletId,
+    required this.blockHash,
+    required this.hash,
+    required this.txid,
+    required this.timestamp,
+    required this.height,
+    required this.inputs,
+    required this.outputs,
+    required this.version,
+    required this.type,
+    required this.subType,
+  });
+
+  int getConfirmations(int currentChainHeight) {
+    if (height == null || height! <= 0) return 0;
+    return max(0, currentChainHeight - (height! - 1));
+  }
+
+  bool isConfirmed(int currentChainHeight, int minimumConfirms) {
+    final confirmations = getConfirmations(currentChainHeight);
+    return confirmations >= minimumConfirms;
+  }
+
+  Amount getFee({required Coin coin}) {
+    final inSum =
+        inputs.map((e) => e.value).reduce((value, element) => value += element);
+    final outSum = outputs
+        .map((e) => e.value)
+        .reduce((value, element) => value += element);
+
+    return Amount(rawValue: inSum - outSum, fractionDigits: coin.decimals);
+  }
+
+  Amount getAmountReceivedThisWallet({required Coin coin}) {
+    final outSum = outputs
+        .where((e) => e.walletOwns)
+        .fold(BigInt.zero, (p, e) => p + e.value);
+
+    return Amount(rawValue: outSum, fractionDigits: coin.decimals);
+  }
+
+  Amount getAmountSentFromThisWallet({required Coin coin}) {
+    final inSum = inputs
+        .where((e) => e.walletOwns)
+        .fold(BigInt.zero, (p, e) => p + e.value);
+
+    return Amount(rawValue: inSum, fractionDigits: coin.decimals);
+  }
+
+  Set<String> associatedAddresses() => {
+        ...inputs.map((e) => e.addresses).expand((e) => e),
+        ...outputs.map((e) => e.addresses).expand((e) => e),
+      };
+
+  @override
+  String toString() {
+    return 'TransactionV2(\n'
+        '  walletId: $walletId,\n'
+        '  hash: $hash,\n'
+        '  txid: $txid,\n'
+        '  type: $type,\n'
+        '  subType: $subType,\n'
+        '  timestamp: $timestamp,\n'
+        '  height: $height,\n'
+        '  blockHash: $blockHash,\n'
+        '  version: $version,\n'
+        '  inputs: $inputs,\n'
+        '  outputs: $outputs,\n'
+        ')';
+  }
+}
+
+enum TxDirection {
+  outgoing,
+  incoming;
+}
+
+enum TxType {
+  normal,
+}
diff --git a/lib/models/isar/models/blockchain_data/v2/transaction_v2.g.dart b/lib/models/isar/models/blockchain_data/v2/transaction_v2.g.dart
new file mode 100644
index 000000000..47fd5b936
--- /dev/null
+++ b/lib/models/isar/models/blockchain_data/v2/transaction_v2.g.dart
@@ -0,0 +1,2229 @@
+// GENERATED CODE - DO NOT MODIFY BY HAND
+
+part of 'transaction_v2.dart';
+
+// **************************************************************************
+// IsarCollectionGenerator
+// **************************************************************************
+
+// coverage:ignore-file
+// ignore_for_file: duplicate_ignore, non_constant_identifier_names, constant_identifier_names, invalid_use_of_protected_member, unnecessary_cast, prefer_const_constructors, lines_longer_than_80_chars, require_trailing_commas, inference_failure_on_function_invocation, unnecessary_parenthesis, unnecessary_raw_strings, unnecessary_null_checks, join_return_with_assignment, prefer_final_locals, avoid_js_rounded_ints, avoid_positional_boolean_parameters
+
+extension GetTransactionV2Collection on Isar {
+  IsarCollection<TransactionV2> get transactionV2s => this.collection();
+}
+
+const TransactionV2Schema = CollectionSchema(
+  name: r'TransactionV2',
+  id: -4280912949179256257,
+  properties: {
+    r'blockHash': PropertySchema(
+      id: 0,
+      name: r'blockHash',
+      type: IsarType.string,
+    ),
+    r'hash': PropertySchema(
+      id: 1,
+      name: r'hash',
+      type: IsarType.string,
+    ),
+    r'height': PropertySchema(
+      id: 2,
+      name: r'height',
+      type: IsarType.long,
+    ),
+    r'inputs': PropertySchema(
+      id: 3,
+      name: r'inputs',
+      type: IsarType.objectList,
+      target: r'InputV2',
+    ),
+    r'outputs': PropertySchema(
+      id: 4,
+      name: r'outputs',
+      type: IsarType.objectList,
+      target: r'OutputV2',
+    ),
+    r'subType': PropertySchema(
+      id: 5,
+      name: r'subType',
+      type: IsarType.byte,
+      enumMap: _TransactionV2subTypeEnumValueMap,
+    ),
+    r'timestamp': PropertySchema(
+      id: 6,
+      name: r'timestamp',
+      type: IsarType.long,
+    ),
+    r'txid': PropertySchema(
+      id: 7,
+      name: r'txid',
+      type: IsarType.string,
+    ),
+    r'type': PropertySchema(
+      id: 8,
+      name: r'type',
+      type: IsarType.byte,
+      enumMap: _TransactionV2typeEnumValueMap,
+    ),
+    r'version': PropertySchema(
+      id: 9,
+      name: r'version',
+      type: IsarType.long,
+    ),
+    r'walletId': PropertySchema(
+      id: 10,
+      name: r'walletId',
+      type: IsarType.string,
+    )
+  },
+  estimateSize: _transactionV2EstimateSize,
+  serialize: _transactionV2Serialize,
+  deserialize: _transactionV2Deserialize,
+  deserializeProp: _transactionV2DeserializeProp,
+  idName: r'id',
+  indexes: {
+    r'walletId': IndexSchema(
+      id: -1783113319798776304,
+      name: r'walletId',
+      unique: false,
+      replace: false,
+      properties: [
+        IndexPropertySchema(
+          name: r'walletId',
+          type: IndexType.hash,
+          caseSensitive: true,
+        )
+      ],
+    ),
+    r'txid_walletId': IndexSchema(
+      id: -2771771174176035985,
+      name: r'txid_walletId',
+      unique: true,
+      replace: false,
+      properties: [
+        IndexPropertySchema(
+          name: r'txid',
+          type: IndexType.hash,
+          caseSensitive: true,
+        ),
+        IndexPropertySchema(
+          name: r'walletId',
+          type: IndexType.hash,
+          caseSensitive: true,
+        )
+      ],
+    ),
+    r'timestamp': IndexSchema(
+      id: 1852253767416892198,
+      name: r'timestamp',
+      unique: false,
+      replace: false,
+      properties: [
+        IndexPropertySchema(
+          name: r'timestamp',
+          type: IndexType.value,
+          caseSensitive: false,
+        )
+      ],
+    )
+  },
+  links: {},
+  embeddedSchemas: {
+    r'InputV2': InputV2Schema,
+    r'OutpointV2': OutpointV2Schema,
+    r'OutputV2': OutputV2Schema
+  },
+  getId: _transactionV2GetId,
+  getLinks: _transactionV2GetLinks,
+  attach: _transactionV2Attach,
+  version: '3.0.5',
+);
+
+int _transactionV2EstimateSize(
+  TransactionV2 object,
+  List<int> offsets,
+  Map<Type, List<int>> allOffsets,
+) {
+  var bytesCount = offsets.last;
+  {
+    final value = object.blockHash;
+    if (value != null) {
+      bytesCount += 3 + value.length * 3;
+    }
+  }
+  bytesCount += 3 + object.hash.length * 3;
+  bytesCount += 3 + object.inputs.length * 3;
+  {
+    final offsets = allOffsets[InputV2]!;
+    for (var i = 0; i < object.inputs.length; i++) {
+      final value = object.inputs[i];
+      bytesCount += InputV2Schema.estimateSize(value, offsets, allOffsets);
+    }
+  }
+  bytesCount += 3 + object.outputs.length * 3;
+  {
+    final offsets = allOffsets[OutputV2]!;
+    for (var i = 0; i < object.outputs.length; i++) {
+      final value = object.outputs[i];
+      bytesCount += OutputV2Schema.estimateSize(value, offsets, allOffsets);
+    }
+  }
+  bytesCount += 3 + object.txid.length * 3;
+  bytesCount += 3 + object.walletId.length * 3;
+  return bytesCount;
+}
+
+void _transactionV2Serialize(
+  TransactionV2 object,
+  IsarWriter writer,
+  List<int> offsets,
+  Map<Type, List<int>> allOffsets,
+) {
+  writer.writeString(offsets[0], object.blockHash);
+  writer.writeString(offsets[1], object.hash);
+  writer.writeLong(offsets[2], object.height);
+  writer.writeObjectList<InputV2>(
+    offsets[3],
+    allOffsets,
+    InputV2Schema.serialize,
+    object.inputs,
+  );
+  writer.writeObjectList<OutputV2>(
+    offsets[4],
+    allOffsets,
+    OutputV2Schema.serialize,
+    object.outputs,
+  );
+  writer.writeByte(offsets[5], object.subType.index);
+  writer.writeLong(offsets[6], object.timestamp);
+  writer.writeString(offsets[7], object.txid);
+  writer.writeByte(offsets[8], object.type.index);
+  writer.writeLong(offsets[9], object.version);
+  writer.writeString(offsets[10], object.walletId);
+}
+
+TransactionV2 _transactionV2Deserialize(
+  Id id,
+  IsarReader reader,
+  List<int> offsets,
+  Map<Type, List<int>> allOffsets,
+) {
+  final object = TransactionV2(
+    blockHash: reader.readStringOrNull(offsets[0]),
+    hash: reader.readString(offsets[1]),
+    height: reader.readLongOrNull(offsets[2]),
+    inputs: reader.readObjectList<InputV2>(
+          offsets[3],
+          InputV2Schema.deserialize,
+          allOffsets,
+          InputV2(),
+        ) ??
+        [],
+    outputs: reader.readObjectList<OutputV2>(
+          offsets[4],
+          OutputV2Schema.deserialize,
+          allOffsets,
+          OutputV2(),
+        ) ??
+        [],
+    subType:
+        _TransactionV2subTypeValueEnumMap[reader.readByteOrNull(offsets[5])] ??
+            TransactionSubType.none,
+    timestamp: reader.readLong(offsets[6]),
+    txid: reader.readString(offsets[7]),
+    type: _TransactionV2typeValueEnumMap[reader.readByteOrNull(offsets[8])] ??
+        TransactionType.outgoing,
+    version: reader.readLong(offsets[9]),
+    walletId: reader.readString(offsets[10]),
+  );
+  object.id = id;
+  return object;
+}
+
+P _transactionV2DeserializeProp<P>(
+  IsarReader reader,
+  int propertyId,
+  int offset,
+  Map<Type, List<int>> allOffsets,
+) {
+  switch (propertyId) {
+    case 0:
+      return (reader.readStringOrNull(offset)) as P;
+    case 1:
+      return (reader.readString(offset)) as P;
+    case 2:
+      return (reader.readLongOrNull(offset)) as P;
+    case 3:
+      return (reader.readObjectList<InputV2>(
+            offset,
+            InputV2Schema.deserialize,
+            allOffsets,
+            InputV2(),
+          ) ??
+          []) as P;
+    case 4:
+      return (reader.readObjectList<OutputV2>(
+            offset,
+            OutputV2Schema.deserialize,
+            allOffsets,
+            OutputV2(),
+          ) ??
+          []) as P;
+    case 5:
+      return (_TransactionV2subTypeValueEnumMap[
+              reader.readByteOrNull(offset)] ??
+          TransactionSubType.none) as P;
+    case 6:
+      return (reader.readLong(offset)) as P;
+    case 7:
+      return (reader.readString(offset)) as P;
+    case 8:
+      return (_TransactionV2typeValueEnumMap[reader.readByteOrNull(offset)] ??
+          TransactionType.outgoing) as P;
+    case 9:
+      return (reader.readLong(offset)) as P;
+    case 10:
+      return (reader.readString(offset)) as P;
+    default:
+      throw IsarError('Unknown property with id $propertyId');
+  }
+}
+
+const _TransactionV2subTypeEnumValueMap = {
+  'none': 0,
+  'bip47Notification': 1,
+  'mint': 2,
+  'join': 3,
+  'ethToken': 4,
+  'cashFusion': 5,
+};
+const _TransactionV2subTypeValueEnumMap = {
+  0: TransactionSubType.none,
+  1: TransactionSubType.bip47Notification,
+  2: TransactionSubType.mint,
+  3: TransactionSubType.join,
+  4: TransactionSubType.ethToken,
+  5: TransactionSubType.cashFusion,
+};
+const _TransactionV2typeEnumValueMap = {
+  'outgoing': 0,
+  'incoming': 1,
+  'sentToSelf': 2,
+  'unknown': 3,
+};
+const _TransactionV2typeValueEnumMap = {
+  0: TransactionType.outgoing,
+  1: TransactionType.incoming,
+  2: TransactionType.sentToSelf,
+  3: TransactionType.unknown,
+};
+
+Id _transactionV2GetId(TransactionV2 object) {
+  return object.id;
+}
+
+List<IsarLinkBase<dynamic>> _transactionV2GetLinks(TransactionV2 object) {
+  return [];
+}
+
+void _transactionV2Attach(
+    IsarCollection<dynamic> col, Id id, TransactionV2 object) {
+  object.id = id;
+}
+
+extension TransactionV2ByIndex on IsarCollection<TransactionV2> {
+  Future<TransactionV2?> getByTxidWalletId(String txid, String walletId) {
+    return getByIndex(r'txid_walletId', [txid, walletId]);
+  }
+
+  TransactionV2? getByTxidWalletIdSync(String txid, String walletId) {
+    return getByIndexSync(r'txid_walletId', [txid, walletId]);
+  }
+
+  Future<bool> deleteByTxidWalletId(String txid, String walletId) {
+    return deleteByIndex(r'txid_walletId', [txid, walletId]);
+  }
+
+  bool deleteByTxidWalletIdSync(String txid, String walletId) {
+    return deleteByIndexSync(r'txid_walletId', [txid, walletId]);
+  }
+
+  Future<List<TransactionV2?>> getAllByTxidWalletId(
+      List<String> txidValues, List<String> walletIdValues) {
+    final len = txidValues.length;
+    assert(walletIdValues.length == len,
+        'All index values must have the same length');
+    final values = <List<dynamic>>[];
+    for (var i = 0; i < len; i++) {
+      values.add([txidValues[i], walletIdValues[i]]);
+    }
+
+    return getAllByIndex(r'txid_walletId', values);
+  }
+
+  List<TransactionV2?> getAllByTxidWalletIdSync(
+      List<String> txidValues, List<String> walletIdValues) {
+    final len = txidValues.length;
+    assert(walletIdValues.length == len,
+        'All index values must have the same length');
+    final values = <List<dynamic>>[];
+    for (var i = 0; i < len; i++) {
+      values.add([txidValues[i], walletIdValues[i]]);
+    }
+
+    return getAllByIndexSync(r'txid_walletId', values);
+  }
+
+  Future<int> deleteAllByTxidWalletId(
+      List<String> txidValues, List<String> walletIdValues) {
+    final len = txidValues.length;
+    assert(walletIdValues.length == len,
+        'All index values must have the same length');
+    final values = <List<dynamic>>[];
+    for (var i = 0; i < len; i++) {
+      values.add([txidValues[i], walletIdValues[i]]);
+    }
+
+    return deleteAllByIndex(r'txid_walletId', values);
+  }
+
+  int deleteAllByTxidWalletIdSync(
+      List<String> txidValues, List<String> walletIdValues) {
+    final len = txidValues.length;
+    assert(walletIdValues.length == len,
+        'All index values must have the same length');
+    final values = <List<dynamic>>[];
+    for (var i = 0; i < len; i++) {
+      values.add([txidValues[i], walletIdValues[i]]);
+    }
+
+    return deleteAllByIndexSync(r'txid_walletId', values);
+  }
+
+  Future<Id> putByTxidWalletId(TransactionV2 object) {
+    return putByIndex(r'txid_walletId', object);
+  }
+
+  Id putByTxidWalletIdSync(TransactionV2 object, {bool saveLinks = true}) {
+    return putByIndexSync(r'txid_walletId', object, saveLinks: saveLinks);
+  }
+
+  Future<List<Id>> putAllByTxidWalletId(List<TransactionV2> objects) {
+    return putAllByIndex(r'txid_walletId', objects);
+  }
+
+  List<Id> putAllByTxidWalletIdSync(List<TransactionV2> objects,
+      {bool saveLinks = true}) {
+    return putAllByIndexSync(r'txid_walletId', objects, saveLinks: saveLinks);
+  }
+}
+
+extension TransactionV2QueryWhereSort
+    on QueryBuilder<TransactionV2, TransactionV2, QWhere> {
+  QueryBuilder<TransactionV2, TransactionV2, QAfterWhere> anyId() {
+    return QueryBuilder.apply(this, (query) {
+      return query.addWhereClause(const IdWhereClause.any());
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterWhere> anyTimestamp() {
+    return QueryBuilder.apply(this, (query) {
+      return query.addWhereClause(
+        const IndexWhereClause.any(indexName: r'timestamp'),
+      );
+    });
+  }
+}
+
+extension TransactionV2QueryWhere
+    on QueryBuilder<TransactionV2, TransactionV2, QWhereClause> {
+  QueryBuilder<TransactionV2, TransactionV2, QAfterWhereClause> idEqualTo(
+      Id id) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addWhereClause(IdWhereClause.between(
+        lower: id,
+        upper: id,
+      ));
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterWhereClause> idNotEqualTo(
+      Id id) {
+    return QueryBuilder.apply(this, (query) {
+      if (query.whereSort == Sort.asc) {
+        return query
+            .addWhereClause(
+              IdWhereClause.lessThan(upper: id, includeUpper: false),
+            )
+            .addWhereClause(
+              IdWhereClause.greaterThan(lower: id, includeLower: false),
+            );
+      } else {
+        return query
+            .addWhereClause(
+              IdWhereClause.greaterThan(lower: id, includeLower: false),
+            )
+            .addWhereClause(
+              IdWhereClause.lessThan(upper: id, includeUpper: false),
+            );
+      }
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterWhereClause> idGreaterThan(
+      Id id,
+      {bool include = false}) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addWhereClause(
+        IdWhereClause.greaterThan(lower: id, includeLower: include),
+      );
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterWhereClause> idLessThan(
+      Id id,
+      {bool include = false}) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addWhereClause(
+        IdWhereClause.lessThan(upper: id, includeUpper: include),
+      );
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterWhereClause> idBetween(
+    Id lowerId,
+    Id upperId, {
+    bool includeLower = true,
+    bool includeUpper = true,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addWhereClause(IdWhereClause.between(
+        lower: lowerId,
+        includeLower: includeLower,
+        upper: upperId,
+        includeUpper: includeUpper,
+      ));
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterWhereClause> walletIdEqualTo(
+      String walletId) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addWhereClause(IndexWhereClause.equalTo(
+        indexName: r'walletId',
+        value: [walletId],
+      ));
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterWhereClause>
+      walletIdNotEqualTo(String walletId) {
+    return QueryBuilder.apply(this, (query) {
+      if (query.whereSort == Sort.asc) {
+        return query
+            .addWhereClause(IndexWhereClause.between(
+              indexName: r'walletId',
+              lower: [],
+              upper: [walletId],
+              includeUpper: false,
+            ))
+            .addWhereClause(IndexWhereClause.between(
+              indexName: r'walletId',
+              lower: [walletId],
+              includeLower: false,
+              upper: [],
+            ));
+      } else {
+        return query
+            .addWhereClause(IndexWhereClause.between(
+              indexName: r'walletId',
+              lower: [walletId],
+              includeLower: false,
+              upper: [],
+            ))
+            .addWhereClause(IndexWhereClause.between(
+              indexName: r'walletId',
+              lower: [],
+              upper: [walletId],
+              includeUpper: false,
+            ));
+      }
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterWhereClause>
+      txidEqualToAnyWalletId(String txid) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addWhereClause(IndexWhereClause.equalTo(
+        indexName: r'txid_walletId',
+        value: [txid],
+      ));
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterWhereClause>
+      txidNotEqualToAnyWalletId(String txid) {
+    return QueryBuilder.apply(this, (query) {
+      if (query.whereSort == Sort.asc) {
+        return query
+            .addWhereClause(IndexWhereClause.between(
+              indexName: r'txid_walletId',
+              lower: [],
+              upper: [txid],
+              includeUpper: false,
+            ))
+            .addWhereClause(IndexWhereClause.between(
+              indexName: r'txid_walletId',
+              lower: [txid],
+              includeLower: false,
+              upper: [],
+            ));
+      } else {
+        return query
+            .addWhereClause(IndexWhereClause.between(
+              indexName: r'txid_walletId',
+              lower: [txid],
+              includeLower: false,
+              upper: [],
+            ))
+            .addWhereClause(IndexWhereClause.between(
+              indexName: r'txid_walletId',
+              lower: [],
+              upper: [txid],
+              includeUpper: false,
+            ));
+      }
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterWhereClause>
+      txidWalletIdEqualTo(String txid, String walletId) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addWhereClause(IndexWhereClause.equalTo(
+        indexName: r'txid_walletId',
+        value: [txid, walletId],
+      ));
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterWhereClause>
+      txidEqualToWalletIdNotEqualTo(String txid, String walletId) {
+    return QueryBuilder.apply(this, (query) {
+      if (query.whereSort == Sort.asc) {
+        return query
+            .addWhereClause(IndexWhereClause.between(
+              indexName: r'txid_walletId',
+              lower: [txid],
+              upper: [txid, walletId],
+              includeUpper: false,
+            ))
+            .addWhereClause(IndexWhereClause.between(
+              indexName: r'txid_walletId',
+              lower: [txid, walletId],
+              includeLower: false,
+              upper: [txid],
+            ));
+      } else {
+        return query
+            .addWhereClause(IndexWhereClause.between(
+              indexName: r'txid_walletId',
+              lower: [txid, walletId],
+              includeLower: false,
+              upper: [txid],
+            ))
+            .addWhereClause(IndexWhereClause.between(
+              indexName: r'txid_walletId',
+              lower: [txid],
+              upper: [txid, walletId],
+              includeUpper: false,
+            ));
+      }
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterWhereClause>
+      timestampEqualTo(int timestamp) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addWhereClause(IndexWhereClause.equalTo(
+        indexName: r'timestamp',
+        value: [timestamp],
+      ));
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterWhereClause>
+      timestampNotEqualTo(int timestamp) {
+    return QueryBuilder.apply(this, (query) {
+      if (query.whereSort == Sort.asc) {
+        return query
+            .addWhereClause(IndexWhereClause.between(
+              indexName: r'timestamp',
+              lower: [],
+              upper: [timestamp],
+              includeUpper: false,
+            ))
+            .addWhereClause(IndexWhereClause.between(
+              indexName: r'timestamp',
+              lower: [timestamp],
+              includeLower: false,
+              upper: [],
+            ));
+      } else {
+        return query
+            .addWhereClause(IndexWhereClause.between(
+              indexName: r'timestamp',
+              lower: [timestamp],
+              includeLower: false,
+              upper: [],
+            ))
+            .addWhereClause(IndexWhereClause.between(
+              indexName: r'timestamp',
+              lower: [],
+              upper: [timestamp],
+              includeUpper: false,
+            ));
+      }
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterWhereClause>
+      timestampGreaterThan(
+    int timestamp, {
+    bool include = false,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addWhereClause(IndexWhereClause.between(
+        indexName: r'timestamp',
+        lower: [timestamp],
+        includeLower: include,
+        upper: [],
+      ));
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterWhereClause>
+      timestampLessThan(
+    int timestamp, {
+    bool include = false,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addWhereClause(IndexWhereClause.between(
+        indexName: r'timestamp',
+        lower: [],
+        upper: [timestamp],
+        includeUpper: include,
+      ));
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterWhereClause>
+      timestampBetween(
+    int lowerTimestamp,
+    int upperTimestamp, {
+    bool includeLower = true,
+    bool includeUpper = true,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addWhereClause(IndexWhereClause.between(
+        indexName: r'timestamp',
+        lower: [lowerTimestamp],
+        includeLower: includeLower,
+        upper: [upperTimestamp],
+        includeUpper: includeUpper,
+      ));
+    });
+  }
+}
+
+extension TransactionV2QueryFilter
+    on QueryBuilder<TransactionV2, TransactionV2, QFilterCondition> {
+  QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition>
+      blockHashIsNull() {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(const FilterCondition.isNull(
+        property: r'blockHash',
+      ));
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition>
+      blockHashIsNotNull() {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(const FilterCondition.isNotNull(
+        property: r'blockHash',
+      ));
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition>
+      blockHashEqualTo(
+    String? value, {
+    bool caseSensitive = true,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.equalTo(
+        property: r'blockHash',
+        value: value,
+        caseSensitive: caseSensitive,
+      ));
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition>
+      blockHashGreaterThan(
+    String? value, {
+    bool include = false,
+    bool caseSensitive = true,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.greaterThan(
+        include: include,
+        property: r'blockHash',
+        value: value,
+        caseSensitive: caseSensitive,
+      ));
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition>
+      blockHashLessThan(
+    String? value, {
+    bool include = false,
+    bool caseSensitive = true,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.lessThan(
+        include: include,
+        property: r'blockHash',
+        value: value,
+        caseSensitive: caseSensitive,
+      ));
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition>
+      blockHashBetween(
+    String? lower,
+    String? upper, {
+    bool includeLower = true,
+    bool includeUpper = true,
+    bool caseSensitive = true,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.between(
+        property: r'blockHash',
+        lower: lower,
+        includeLower: includeLower,
+        upper: upper,
+        includeUpper: includeUpper,
+        caseSensitive: caseSensitive,
+      ));
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition>
+      blockHashStartsWith(
+    String value, {
+    bool caseSensitive = true,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.startsWith(
+        property: r'blockHash',
+        value: value,
+        caseSensitive: caseSensitive,
+      ));
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition>
+      blockHashEndsWith(
+    String value, {
+    bool caseSensitive = true,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.endsWith(
+        property: r'blockHash',
+        value: value,
+        caseSensitive: caseSensitive,
+      ));
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition>
+      blockHashContains(String value, {bool caseSensitive = true}) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.contains(
+        property: r'blockHash',
+        value: value,
+        caseSensitive: caseSensitive,
+      ));
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition>
+      blockHashMatches(String pattern, {bool caseSensitive = true}) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.matches(
+        property: r'blockHash',
+        wildcard: pattern,
+        caseSensitive: caseSensitive,
+      ));
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition>
+      blockHashIsEmpty() {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.equalTo(
+        property: r'blockHash',
+        value: '',
+      ));
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition>
+      blockHashIsNotEmpty() {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.greaterThan(
+        property: r'blockHash',
+        value: '',
+      ));
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition> hashEqualTo(
+    String value, {
+    bool caseSensitive = true,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.equalTo(
+        property: r'hash',
+        value: value,
+        caseSensitive: caseSensitive,
+      ));
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition>
+      hashGreaterThan(
+    String value, {
+    bool include = false,
+    bool caseSensitive = true,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.greaterThan(
+        include: include,
+        property: r'hash',
+        value: value,
+        caseSensitive: caseSensitive,
+      ));
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition>
+      hashLessThan(
+    String value, {
+    bool include = false,
+    bool caseSensitive = true,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.lessThan(
+        include: include,
+        property: r'hash',
+        value: value,
+        caseSensitive: caseSensitive,
+      ));
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition> hashBetween(
+    String lower,
+    String upper, {
+    bool includeLower = true,
+    bool includeUpper = true,
+    bool caseSensitive = true,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.between(
+        property: r'hash',
+        lower: lower,
+        includeLower: includeLower,
+        upper: upper,
+        includeUpper: includeUpper,
+        caseSensitive: caseSensitive,
+      ));
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition>
+      hashStartsWith(
+    String value, {
+    bool caseSensitive = true,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.startsWith(
+        property: r'hash',
+        value: value,
+        caseSensitive: caseSensitive,
+      ));
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition>
+      hashEndsWith(
+    String value, {
+    bool caseSensitive = true,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.endsWith(
+        property: r'hash',
+        value: value,
+        caseSensitive: caseSensitive,
+      ));
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition>
+      hashContains(String value, {bool caseSensitive = true}) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.contains(
+        property: r'hash',
+        value: value,
+        caseSensitive: caseSensitive,
+      ));
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition> hashMatches(
+      String pattern,
+      {bool caseSensitive = true}) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.matches(
+        property: r'hash',
+        wildcard: pattern,
+        caseSensitive: caseSensitive,
+      ));
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition>
+      hashIsEmpty() {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.equalTo(
+        property: r'hash',
+        value: '',
+      ));
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition>
+      hashIsNotEmpty() {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.greaterThan(
+        property: r'hash',
+        value: '',
+      ));
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition>
+      heightIsNull() {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(const FilterCondition.isNull(
+        property: r'height',
+      ));
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition>
+      heightIsNotNull() {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(const FilterCondition.isNotNull(
+        property: r'height',
+      ));
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition>
+      heightEqualTo(int? value) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.equalTo(
+        property: r'height',
+        value: value,
+      ));
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition>
+      heightGreaterThan(
+    int? value, {
+    bool include = false,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.greaterThan(
+        include: include,
+        property: r'height',
+        value: value,
+      ));
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition>
+      heightLessThan(
+    int? value, {
+    bool include = false,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.lessThan(
+        include: include,
+        property: r'height',
+        value: value,
+      ));
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition>
+      heightBetween(
+    int? lower,
+    int? upper, {
+    bool includeLower = true,
+    bool includeUpper = true,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.between(
+        property: r'height',
+        lower: lower,
+        includeLower: includeLower,
+        upper: upper,
+        includeUpper: includeUpper,
+      ));
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition> idEqualTo(
+      Id value) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.equalTo(
+        property: r'id',
+        value: value,
+      ));
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition>
+      idGreaterThan(
+    Id value, {
+    bool include = false,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.greaterThan(
+        include: include,
+        property: r'id',
+        value: value,
+      ));
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition> idLessThan(
+    Id value, {
+    bool include = false,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.lessThan(
+        include: include,
+        property: r'id',
+        value: value,
+      ));
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition> idBetween(
+    Id lower,
+    Id upper, {
+    bool includeLower = true,
+    bool includeUpper = true,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.between(
+        property: r'id',
+        lower: lower,
+        includeLower: includeLower,
+        upper: upper,
+        includeUpper: includeUpper,
+      ));
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition>
+      inputsLengthEqualTo(int length) {
+    return QueryBuilder.apply(this, (query) {
+      return query.listLength(
+        r'inputs',
+        length,
+        true,
+        length,
+        true,
+      );
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition>
+      inputsIsEmpty() {
+    return QueryBuilder.apply(this, (query) {
+      return query.listLength(
+        r'inputs',
+        0,
+        true,
+        0,
+        true,
+      );
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition>
+      inputsIsNotEmpty() {
+    return QueryBuilder.apply(this, (query) {
+      return query.listLength(
+        r'inputs',
+        0,
+        false,
+        999999,
+        true,
+      );
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition>
+      inputsLengthLessThan(
+    int length, {
+    bool include = false,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.listLength(
+        r'inputs',
+        0,
+        true,
+        length,
+        include,
+      );
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition>
+      inputsLengthGreaterThan(
+    int length, {
+    bool include = false,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.listLength(
+        r'inputs',
+        length,
+        include,
+        999999,
+        true,
+      );
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition>
+      inputsLengthBetween(
+    int lower,
+    int upper, {
+    bool includeLower = true,
+    bool includeUpper = true,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.listLength(
+        r'inputs',
+        lower,
+        includeLower,
+        upper,
+        includeUpper,
+      );
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition>
+      outputsLengthEqualTo(int length) {
+    return QueryBuilder.apply(this, (query) {
+      return query.listLength(
+        r'outputs',
+        length,
+        true,
+        length,
+        true,
+      );
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition>
+      outputsIsEmpty() {
+    return QueryBuilder.apply(this, (query) {
+      return query.listLength(
+        r'outputs',
+        0,
+        true,
+        0,
+        true,
+      );
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition>
+      outputsIsNotEmpty() {
+    return QueryBuilder.apply(this, (query) {
+      return query.listLength(
+        r'outputs',
+        0,
+        false,
+        999999,
+        true,
+      );
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition>
+      outputsLengthLessThan(
+    int length, {
+    bool include = false,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.listLength(
+        r'outputs',
+        0,
+        true,
+        length,
+        include,
+      );
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition>
+      outputsLengthGreaterThan(
+    int length, {
+    bool include = false,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.listLength(
+        r'outputs',
+        length,
+        include,
+        999999,
+        true,
+      );
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition>
+      outputsLengthBetween(
+    int lower,
+    int upper, {
+    bool includeLower = true,
+    bool includeUpper = true,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.listLength(
+        r'outputs',
+        lower,
+        includeLower,
+        upper,
+        includeUpper,
+      );
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition>
+      subTypeEqualTo(TransactionSubType value) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.equalTo(
+        property: r'subType',
+        value: value,
+      ));
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition>
+      subTypeGreaterThan(
+    TransactionSubType value, {
+    bool include = false,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.greaterThan(
+        include: include,
+        property: r'subType',
+        value: value,
+      ));
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition>
+      subTypeLessThan(
+    TransactionSubType value, {
+    bool include = false,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.lessThan(
+        include: include,
+        property: r'subType',
+        value: value,
+      ));
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition>
+      subTypeBetween(
+    TransactionSubType lower,
+    TransactionSubType upper, {
+    bool includeLower = true,
+    bool includeUpper = true,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.between(
+        property: r'subType',
+        lower: lower,
+        includeLower: includeLower,
+        upper: upper,
+        includeUpper: includeUpper,
+      ));
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition>
+      timestampEqualTo(int value) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.equalTo(
+        property: r'timestamp',
+        value: value,
+      ));
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition>
+      timestampGreaterThan(
+    int value, {
+    bool include = false,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.greaterThan(
+        include: include,
+        property: r'timestamp',
+        value: value,
+      ));
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition>
+      timestampLessThan(
+    int value, {
+    bool include = false,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.lessThan(
+        include: include,
+        property: r'timestamp',
+        value: value,
+      ));
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition>
+      timestampBetween(
+    int lower,
+    int upper, {
+    bool includeLower = true,
+    bool includeUpper = true,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.between(
+        property: r'timestamp',
+        lower: lower,
+        includeLower: includeLower,
+        upper: upper,
+        includeUpper: includeUpper,
+      ));
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition> txidEqualTo(
+    String value, {
+    bool caseSensitive = true,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.equalTo(
+        property: r'txid',
+        value: value,
+        caseSensitive: caseSensitive,
+      ));
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition>
+      txidGreaterThan(
+    String value, {
+    bool include = false,
+    bool caseSensitive = true,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.greaterThan(
+        include: include,
+        property: r'txid',
+        value: value,
+        caseSensitive: caseSensitive,
+      ));
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition>
+      txidLessThan(
+    String value, {
+    bool include = false,
+    bool caseSensitive = true,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.lessThan(
+        include: include,
+        property: r'txid',
+        value: value,
+        caseSensitive: caseSensitive,
+      ));
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition> txidBetween(
+    String lower,
+    String upper, {
+    bool includeLower = true,
+    bool includeUpper = true,
+    bool caseSensitive = true,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.between(
+        property: r'txid',
+        lower: lower,
+        includeLower: includeLower,
+        upper: upper,
+        includeUpper: includeUpper,
+        caseSensitive: caseSensitive,
+      ));
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition>
+      txidStartsWith(
+    String value, {
+    bool caseSensitive = true,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.startsWith(
+        property: r'txid',
+        value: value,
+        caseSensitive: caseSensitive,
+      ));
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition>
+      txidEndsWith(
+    String value, {
+    bool caseSensitive = true,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.endsWith(
+        property: r'txid',
+        value: value,
+        caseSensitive: caseSensitive,
+      ));
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition>
+      txidContains(String value, {bool caseSensitive = true}) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.contains(
+        property: r'txid',
+        value: value,
+        caseSensitive: caseSensitive,
+      ));
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition> txidMatches(
+      String pattern,
+      {bool caseSensitive = true}) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.matches(
+        property: r'txid',
+        wildcard: pattern,
+        caseSensitive: caseSensitive,
+      ));
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition>
+      txidIsEmpty() {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.equalTo(
+        property: r'txid',
+        value: '',
+      ));
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition>
+      txidIsNotEmpty() {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.greaterThan(
+        property: r'txid',
+        value: '',
+      ));
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition> typeEqualTo(
+      TransactionType value) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.equalTo(
+        property: r'type',
+        value: value,
+      ));
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition>
+      typeGreaterThan(
+    TransactionType value, {
+    bool include = false,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.greaterThan(
+        include: include,
+        property: r'type',
+        value: value,
+      ));
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition>
+      typeLessThan(
+    TransactionType value, {
+    bool include = false,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.lessThan(
+        include: include,
+        property: r'type',
+        value: value,
+      ));
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition> typeBetween(
+    TransactionType lower,
+    TransactionType upper, {
+    bool includeLower = true,
+    bool includeUpper = true,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.between(
+        property: r'type',
+        lower: lower,
+        includeLower: includeLower,
+        upper: upper,
+        includeUpper: includeUpper,
+      ));
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition>
+      versionEqualTo(int value) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.equalTo(
+        property: r'version',
+        value: value,
+      ));
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition>
+      versionGreaterThan(
+    int value, {
+    bool include = false,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.greaterThan(
+        include: include,
+        property: r'version',
+        value: value,
+      ));
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition>
+      versionLessThan(
+    int value, {
+    bool include = false,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.lessThan(
+        include: include,
+        property: r'version',
+        value: value,
+      ));
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition>
+      versionBetween(
+    int lower,
+    int upper, {
+    bool includeLower = true,
+    bool includeUpper = true,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.between(
+        property: r'version',
+        lower: lower,
+        includeLower: includeLower,
+        upper: upper,
+        includeUpper: includeUpper,
+      ));
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition>
+      walletIdEqualTo(
+    String value, {
+    bool caseSensitive = true,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.equalTo(
+        property: r'walletId',
+        value: value,
+        caseSensitive: caseSensitive,
+      ));
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition>
+      walletIdGreaterThan(
+    String value, {
+    bool include = false,
+    bool caseSensitive = true,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.greaterThan(
+        include: include,
+        property: r'walletId',
+        value: value,
+        caseSensitive: caseSensitive,
+      ));
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition>
+      walletIdLessThan(
+    String value, {
+    bool include = false,
+    bool caseSensitive = true,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.lessThan(
+        include: include,
+        property: r'walletId',
+        value: value,
+        caseSensitive: caseSensitive,
+      ));
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition>
+      walletIdBetween(
+    String lower,
+    String upper, {
+    bool includeLower = true,
+    bool includeUpper = true,
+    bool caseSensitive = true,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.between(
+        property: r'walletId',
+        lower: lower,
+        includeLower: includeLower,
+        upper: upper,
+        includeUpper: includeUpper,
+        caseSensitive: caseSensitive,
+      ));
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition>
+      walletIdStartsWith(
+    String value, {
+    bool caseSensitive = true,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.startsWith(
+        property: r'walletId',
+        value: value,
+        caseSensitive: caseSensitive,
+      ));
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition>
+      walletIdEndsWith(
+    String value, {
+    bool caseSensitive = true,
+  }) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.endsWith(
+        property: r'walletId',
+        value: value,
+        caseSensitive: caseSensitive,
+      ));
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition>
+      walletIdContains(String value, {bool caseSensitive = true}) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.contains(
+        property: r'walletId',
+        value: value,
+        caseSensitive: caseSensitive,
+      ));
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition>
+      walletIdMatches(String pattern, {bool caseSensitive = true}) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.matches(
+        property: r'walletId',
+        wildcard: pattern,
+        caseSensitive: caseSensitive,
+      ));
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition>
+      walletIdIsEmpty() {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.equalTo(
+        property: r'walletId',
+        value: '',
+      ));
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition>
+      walletIdIsNotEmpty() {
+    return QueryBuilder.apply(this, (query) {
+      return query.addFilterCondition(FilterCondition.greaterThan(
+        property: r'walletId',
+        value: '',
+      ));
+    });
+  }
+}
+
+extension TransactionV2QueryObject
+    on QueryBuilder<TransactionV2, TransactionV2, QFilterCondition> {
+  QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition>
+      inputsElement(FilterQuery<InputV2> q) {
+    return QueryBuilder.apply(this, (query) {
+      return query.object(q, r'inputs');
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition>
+      outputsElement(FilterQuery<OutputV2> q) {
+    return QueryBuilder.apply(this, (query) {
+      return query.object(q, r'outputs');
+    });
+  }
+}
+
+extension TransactionV2QueryLinks
+    on QueryBuilder<TransactionV2, TransactionV2, QFilterCondition> {}
+
+extension TransactionV2QuerySortBy
+    on QueryBuilder<TransactionV2, TransactionV2, QSortBy> {
+  QueryBuilder<TransactionV2, TransactionV2, QAfterSortBy> sortByBlockHash() {
+    return QueryBuilder.apply(this, (query) {
+      return query.addSortBy(r'blockHash', Sort.asc);
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterSortBy>
+      sortByBlockHashDesc() {
+    return QueryBuilder.apply(this, (query) {
+      return query.addSortBy(r'blockHash', Sort.desc);
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterSortBy> sortByHash() {
+    return QueryBuilder.apply(this, (query) {
+      return query.addSortBy(r'hash', Sort.asc);
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterSortBy> sortByHashDesc() {
+    return QueryBuilder.apply(this, (query) {
+      return query.addSortBy(r'hash', Sort.desc);
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterSortBy> sortByHeight() {
+    return QueryBuilder.apply(this, (query) {
+      return query.addSortBy(r'height', Sort.asc);
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterSortBy> sortByHeightDesc() {
+    return QueryBuilder.apply(this, (query) {
+      return query.addSortBy(r'height', Sort.desc);
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterSortBy> sortBySubType() {
+    return QueryBuilder.apply(this, (query) {
+      return query.addSortBy(r'subType', Sort.asc);
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterSortBy> sortBySubTypeDesc() {
+    return QueryBuilder.apply(this, (query) {
+      return query.addSortBy(r'subType', Sort.desc);
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterSortBy> sortByTimestamp() {
+    return QueryBuilder.apply(this, (query) {
+      return query.addSortBy(r'timestamp', Sort.asc);
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterSortBy>
+      sortByTimestampDesc() {
+    return QueryBuilder.apply(this, (query) {
+      return query.addSortBy(r'timestamp', Sort.desc);
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterSortBy> sortByTxid() {
+    return QueryBuilder.apply(this, (query) {
+      return query.addSortBy(r'txid', Sort.asc);
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterSortBy> sortByTxidDesc() {
+    return QueryBuilder.apply(this, (query) {
+      return query.addSortBy(r'txid', Sort.desc);
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterSortBy> sortByType() {
+    return QueryBuilder.apply(this, (query) {
+      return query.addSortBy(r'type', Sort.asc);
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterSortBy> sortByTypeDesc() {
+    return QueryBuilder.apply(this, (query) {
+      return query.addSortBy(r'type', Sort.desc);
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterSortBy> sortByVersion() {
+    return QueryBuilder.apply(this, (query) {
+      return query.addSortBy(r'version', Sort.asc);
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterSortBy> sortByVersionDesc() {
+    return QueryBuilder.apply(this, (query) {
+      return query.addSortBy(r'version', Sort.desc);
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterSortBy> sortByWalletId() {
+    return QueryBuilder.apply(this, (query) {
+      return query.addSortBy(r'walletId', Sort.asc);
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterSortBy>
+      sortByWalletIdDesc() {
+    return QueryBuilder.apply(this, (query) {
+      return query.addSortBy(r'walletId', Sort.desc);
+    });
+  }
+}
+
+extension TransactionV2QuerySortThenBy
+    on QueryBuilder<TransactionV2, TransactionV2, QSortThenBy> {
+  QueryBuilder<TransactionV2, TransactionV2, QAfterSortBy> thenByBlockHash() {
+    return QueryBuilder.apply(this, (query) {
+      return query.addSortBy(r'blockHash', Sort.asc);
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterSortBy>
+      thenByBlockHashDesc() {
+    return QueryBuilder.apply(this, (query) {
+      return query.addSortBy(r'blockHash', Sort.desc);
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterSortBy> thenByHash() {
+    return QueryBuilder.apply(this, (query) {
+      return query.addSortBy(r'hash', Sort.asc);
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterSortBy> thenByHashDesc() {
+    return QueryBuilder.apply(this, (query) {
+      return query.addSortBy(r'hash', Sort.desc);
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterSortBy> thenByHeight() {
+    return QueryBuilder.apply(this, (query) {
+      return query.addSortBy(r'height', Sort.asc);
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterSortBy> thenByHeightDesc() {
+    return QueryBuilder.apply(this, (query) {
+      return query.addSortBy(r'height', Sort.desc);
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterSortBy> thenById() {
+    return QueryBuilder.apply(this, (query) {
+      return query.addSortBy(r'id', Sort.asc);
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterSortBy> thenByIdDesc() {
+    return QueryBuilder.apply(this, (query) {
+      return query.addSortBy(r'id', Sort.desc);
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterSortBy> thenBySubType() {
+    return QueryBuilder.apply(this, (query) {
+      return query.addSortBy(r'subType', Sort.asc);
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterSortBy> thenBySubTypeDesc() {
+    return QueryBuilder.apply(this, (query) {
+      return query.addSortBy(r'subType', Sort.desc);
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterSortBy> thenByTimestamp() {
+    return QueryBuilder.apply(this, (query) {
+      return query.addSortBy(r'timestamp', Sort.asc);
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterSortBy>
+      thenByTimestampDesc() {
+    return QueryBuilder.apply(this, (query) {
+      return query.addSortBy(r'timestamp', Sort.desc);
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterSortBy> thenByTxid() {
+    return QueryBuilder.apply(this, (query) {
+      return query.addSortBy(r'txid', Sort.asc);
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterSortBy> thenByTxidDesc() {
+    return QueryBuilder.apply(this, (query) {
+      return query.addSortBy(r'txid', Sort.desc);
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterSortBy> thenByType() {
+    return QueryBuilder.apply(this, (query) {
+      return query.addSortBy(r'type', Sort.asc);
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterSortBy> thenByTypeDesc() {
+    return QueryBuilder.apply(this, (query) {
+      return query.addSortBy(r'type', Sort.desc);
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterSortBy> thenByVersion() {
+    return QueryBuilder.apply(this, (query) {
+      return query.addSortBy(r'version', Sort.asc);
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterSortBy> thenByVersionDesc() {
+    return QueryBuilder.apply(this, (query) {
+      return query.addSortBy(r'version', Sort.desc);
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterSortBy> thenByWalletId() {
+    return QueryBuilder.apply(this, (query) {
+      return query.addSortBy(r'walletId', Sort.asc);
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QAfterSortBy>
+      thenByWalletIdDesc() {
+    return QueryBuilder.apply(this, (query) {
+      return query.addSortBy(r'walletId', Sort.desc);
+    });
+  }
+}
+
+extension TransactionV2QueryWhereDistinct
+    on QueryBuilder<TransactionV2, TransactionV2, QDistinct> {
+  QueryBuilder<TransactionV2, TransactionV2, QDistinct> distinctByBlockHash(
+      {bool caseSensitive = true}) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addDistinctBy(r'blockHash', caseSensitive: caseSensitive);
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QDistinct> distinctByHash(
+      {bool caseSensitive = true}) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addDistinctBy(r'hash', caseSensitive: caseSensitive);
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QDistinct> distinctByHeight() {
+    return QueryBuilder.apply(this, (query) {
+      return query.addDistinctBy(r'height');
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QDistinct> distinctBySubType() {
+    return QueryBuilder.apply(this, (query) {
+      return query.addDistinctBy(r'subType');
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QDistinct> distinctByTimestamp() {
+    return QueryBuilder.apply(this, (query) {
+      return query.addDistinctBy(r'timestamp');
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QDistinct> distinctByTxid(
+      {bool caseSensitive = true}) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addDistinctBy(r'txid', caseSensitive: caseSensitive);
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QDistinct> distinctByType() {
+    return QueryBuilder.apply(this, (query) {
+      return query.addDistinctBy(r'type');
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QDistinct> distinctByVersion() {
+    return QueryBuilder.apply(this, (query) {
+      return query.addDistinctBy(r'version');
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionV2, QDistinct> distinctByWalletId(
+      {bool caseSensitive = true}) {
+    return QueryBuilder.apply(this, (query) {
+      return query.addDistinctBy(r'walletId', caseSensitive: caseSensitive);
+    });
+  }
+}
+
+extension TransactionV2QueryProperty
+    on QueryBuilder<TransactionV2, TransactionV2, QQueryProperty> {
+  QueryBuilder<TransactionV2, int, QQueryOperations> idProperty() {
+    return QueryBuilder.apply(this, (query) {
+      return query.addPropertyName(r'id');
+    });
+  }
+
+  QueryBuilder<TransactionV2, String?, QQueryOperations> blockHashProperty() {
+    return QueryBuilder.apply(this, (query) {
+      return query.addPropertyName(r'blockHash');
+    });
+  }
+
+  QueryBuilder<TransactionV2, String, QQueryOperations> hashProperty() {
+    return QueryBuilder.apply(this, (query) {
+      return query.addPropertyName(r'hash');
+    });
+  }
+
+  QueryBuilder<TransactionV2, int?, QQueryOperations> heightProperty() {
+    return QueryBuilder.apply(this, (query) {
+      return query.addPropertyName(r'height');
+    });
+  }
+
+  QueryBuilder<TransactionV2, List<InputV2>, QQueryOperations>
+      inputsProperty() {
+    return QueryBuilder.apply(this, (query) {
+      return query.addPropertyName(r'inputs');
+    });
+  }
+
+  QueryBuilder<TransactionV2, List<OutputV2>, QQueryOperations>
+      outputsProperty() {
+    return QueryBuilder.apply(this, (query) {
+      return query.addPropertyName(r'outputs');
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionSubType, QQueryOperations>
+      subTypeProperty() {
+    return QueryBuilder.apply(this, (query) {
+      return query.addPropertyName(r'subType');
+    });
+  }
+
+  QueryBuilder<TransactionV2, int, QQueryOperations> timestampProperty() {
+    return QueryBuilder.apply(this, (query) {
+      return query.addPropertyName(r'timestamp');
+    });
+  }
+
+  QueryBuilder<TransactionV2, String, QQueryOperations> txidProperty() {
+    return QueryBuilder.apply(this, (query) {
+      return query.addPropertyName(r'txid');
+    });
+  }
+
+  QueryBuilder<TransactionV2, TransactionType, QQueryOperations>
+      typeProperty() {
+    return QueryBuilder.apply(this, (query) {
+      return query.addPropertyName(r'type');
+    });
+  }
+
+  QueryBuilder<TransactionV2, int, QQueryOperations> versionProperty() {
+    return QueryBuilder.apply(this, (query) {
+      return query.addPropertyName(r'version');
+    });
+  }
+
+  QueryBuilder<TransactionV2, String, QQueryOperations> walletIdProperty() {
+    return QueryBuilder.apply(this, (query) {
+      return query.addPropertyName(r'walletId');
+    });
+  }
+}
diff --git a/lib/models/signing_data.dart b/lib/models/signing_data.dart
index ac7a0a4ed..0937a2d8b 100644
--- a/lib/models/signing_data.dart
+++ b/lib/models/signing_data.dart
@@ -28,4 +28,15 @@ class SigningData {
   Uint8List? output;
   ECPair? keyPair;
   Uint8List? redeemScript;
+
+  @override
+  String toString() {
+    return "SigningData{\n"
+        "  derivePathType: $derivePathType,\n"
+        "  utxo: $utxo,\n"
+        "  output: $output,\n"
+        "  keyPair: $keyPair,\n"
+        "  redeemScript: $redeemScript,\n"
+        "}";
+  }
 }
diff --git a/lib/pages/cashfusion/cashfusion_view.dart b/lib/pages/cashfusion/cashfusion_view.dart
new file mode 100644
index 000000000..50407a172
--- /dev/null
+++ b/lib/pages/cashfusion/cashfusion_view.dart
@@ -0,0 +1,446 @@
+/*
+ * This file is part of Stack Wallet.
+ *
+ * Copyright (c) 2023 Cypher Stack
+ * All Rights Reserved.
+ * The code is distributed under GPLv3 license, see LICENSE file for details.
+ * Generated by sneurlax on 2023-07-26
+ *
+ */
+
+import 'dart:async';
+
+import 'package:flutter/material.dart';
+import 'package:flutter/services.dart';
+import 'package:flutter_native_splash/cli_commands.dart';
+import 'package:flutter_riverpod/flutter_riverpod.dart';
+import 'package:flutter_svg/svg.dart';
+import 'package:stackwallet/pages/cashfusion/fusion_progress_view.dart';
+import 'package:stackwallet/pages/cashfusion/fusion_rounds_selection_sheet.dart';
+import 'package:stackwallet/providers/cash_fusion/fusion_progress_ui_state_provider.dart';
+import 'package:stackwallet/providers/global/prefs_provider.dart';
+import 'package:stackwallet/providers/global/wallets_provider.dart';
+import 'package:stackwallet/services/mixins/fusion_wallet_interface.dart';
+import 'package:stackwallet/themes/stack_colors.dart';
+import 'package:stackwallet/utilities/assets.dart';
+import 'package:stackwallet/utilities/constants.dart';
+import 'package:stackwallet/utilities/text_styles.dart';
+import 'package:stackwallet/widgets/background.dart';
+import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart';
+import 'package:stackwallet/widgets/custom_buttons/blue_text_button.dart';
+import 'package:stackwallet/widgets/desktop/primary_button.dart';
+import 'package:stackwallet/widgets/rounded_container.dart';
+import 'package:stackwallet/widgets/rounded_white_container.dart';
+import 'package:stackwallet/widgets/stack_text_field.dart';
+
+class CashFusionView extends ConsumerStatefulWidget {
+  const CashFusionView({
+    super.key,
+    required this.walletId,
+  });
+
+  static const routeName = "/cashFusionView";
+
+  final String walletId;
+
+  @override
+  ConsumerState<CashFusionView> createState() => _CashFusionViewState();
+}
+
+class _CashFusionViewState extends ConsumerState<CashFusionView> {
+  late final TextEditingController serverController;
+  late final FocusNode serverFocusNode;
+  late final TextEditingController portController;
+  late final FocusNode portFocusNode;
+  late final TextEditingController fusionRoundController;
+  late final FocusNode fusionRoundFocusNode;
+
+  bool _enableSSLCheckbox = false;
+  bool _enableStartButton = false;
+
+  FusionOption _option = FusionOption.continuous;
+
+  Future<void> _startFusion() async {
+    final fusionWallet = ref
+        .read(walletsChangeNotifierProvider)
+        .getManager(widget.walletId)
+        .wallet as FusionWalletInterface;
+
+    try {
+      fusionWallet.uiState = ref.read(
+        fusionProgressUIStateProvider(widget.walletId),
+      );
+    } catch (e) {
+      if (!e.toString().contains(
+          "FusionProgressUIState was already set for ${widget.walletId}")) {
+        rethrow;
+      }
+    }
+
+    final int rounds = _option == FusionOption.continuous
+        ? 0
+        : int.parse(fusionRoundController.text);
+
+    final newInfo = FusionInfo(
+      host: serverController.text,
+      port: int.parse(portController.text),
+      ssl: _enableSSLCheckbox,
+      rounds: rounds,
+    );
+
+    // update user prefs (persistent)
+    ref.read(prefsChangeNotifierProvider).fusionServerInfo = newInfo;
+
+    unawaited(
+      fusionWallet.fuse(
+        fusionInfo: newInfo,
+      ),
+    );
+
+    await Navigator.of(context).pushNamed(
+      FusionProgressView.routeName,
+      arguments: widget.walletId,
+    );
+  }
+
+  @override
+  void initState() {
+    serverController = TextEditingController();
+    portController = TextEditingController();
+    fusionRoundController = TextEditingController();
+
+    serverFocusNode = FocusNode();
+    portFocusNode = FocusNode();
+    fusionRoundFocusNode = FocusNode();
+
+    final info = ref.read(prefsChangeNotifierProvider).fusionServerInfo;
+    serverController.text = info.host;
+    portController.text = info.port.toString();
+    _enableSSLCheckbox = info.ssl;
+    _option = info.rounds == 0 ? FusionOption.continuous : FusionOption.custom;
+    fusionRoundController.text = info.rounds.toString();
+
+    _enableStartButton =
+        serverController.text.isNotEmpty && portController.text.isNotEmpty;
+
+    super.initState();
+  }
+
+  @override
+  void dispose() {
+    serverController.dispose();
+    portController.dispose();
+    fusionRoundController.dispose();
+
+    serverFocusNode.dispose();
+    portFocusNode.dispose();
+    fusionRoundFocusNode.dispose();
+
+    super.dispose();
+  }
+
+  @override
+  Widget build(BuildContext context) {
+    return Background(
+      child: SafeArea(
+        child: Scaffold(
+          backgroundColor:
+              Theme.of(context).extension<StackColors>()!.background,
+          appBar: AppBar(
+            automaticallyImplyLeading: false,
+            leading: const AppBarBackButton(),
+            title: Text(
+              "CashFusion",
+              style: STextStyles.navBarTitle(context),
+            ),
+            titleSpacing: 0,
+            actions: [
+              AspectRatio(
+                aspectRatio: 1,
+                child: AppBarIconButton(
+                  size: 36,
+                  icon: SvgPicture.asset(
+                    Assets.svg.circleQuestion,
+                    width: 20,
+                    height: 20,
+                    color: Theme.of(context)
+                        .extension<StackColors>()!
+                        .topNavIconPrimary,
+                  ),
+                  onPressed: () async {
+                    //' TODO show about?
+                  },
+                ),
+              ),
+            ],
+          ),
+          body: LayoutBuilder(
+            builder: (builderContext, constraints) {
+              return SingleChildScrollView(
+                child: ConstrainedBox(
+                  constraints: BoxConstraints(
+                    minHeight: constraints.maxHeight,
+                  ),
+                  child: IntrinsicHeight(
+                    child: Padding(
+                      padding: const EdgeInsets.all(16),
+                      child: Column(
+                        crossAxisAlignment: CrossAxisAlignment.start,
+                        children: [
+                          RoundedWhiteContainer(
+                            child: Text(
+                              "CashFusion allows you to anonymize your BCH coins.",
+                              style: STextStyles.w500_12(context).copyWith(
+                                color: Theme.of(context)
+                                    .extension<StackColors>()!
+                                    .textSubtitle1,
+                              ),
+                            ),
+                          ),
+                          const SizedBox(
+                            height: 16,
+                          ),
+                          Row(
+                            mainAxisAlignment: MainAxisAlignment.spaceBetween,
+                            children: [
+                              Text(
+                                "Server settings",
+                                style: STextStyles.w500_14(context).copyWith(
+                                  color: Theme.of(context)
+                                      .extension<StackColors>()!
+                                      .textDark3,
+                                ),
+                              ),
+                              CustomTextButton(
+                                text: "Default",
+                                onTap: () {
+                                  const def = FusionInfo.DEFAULTS;
+                                  serverController.text = def.host;
+                                  portController.text = def.port.toString();
+                                  fusionRoundController.text =
+                                      def.rounds.toString();
+                                  _option = FusionOption.continuous;
+                                  setState(() {
+                                    _enableSSLCheckbox = def.ssl;
+                                  });
+                                },
+                              ),
+                            ],
+                          ),
+                          const SizedBox(
+                            height: 12,
+                          ),
+                          ClipRRect(
+                            borderRadius: BorderRadius.circular(
+                              Constants.size.circularBorderRadius,
+                            ),
+                            child: TextField(
+                              autocorrect: false,
+                              enableSuggestions: false,
+                              controller: serverController,
+                              focusNode: serverFocusNode,
+                              onChanged: (value) {
+                                setState(() {
+                                  _enableStartButton = value.isNotEmpty &&
+                                      portController.text.isNotEmpty &&
+                                      fusionRoundController.text.isNotEmpty;
+                                });
+                              },
+                              style: STextStyles.field(context),
+                              decoration: standardInputDecoration(
+                                "Server",
+                                serverFocusNode,
+                                context,
+                                desktopMed: true,
+                              ),
+                            ),
+                          ),
+                          const SizedBox(
+                            height: 10,
+                          ),
+                          ClipRRect(
+                            borderRadius: BorderRadius.circular(
+                              Constants.size.circularBorderRadius,
+                            ),
+                            child: TextField(
+                              autocorrect: false,
+                              enableSuggestions: false,
+                              controller: portController,
+                              focusNode: portFocusNode,
+                              inputFormatters: [
+                                FilteringTextInputFormatter.digitsOnly
+                              ],
+                              keyboardType: TextInputType.number,
+                              onChanged: (value) {
+                                setState(() {
+                                  _enableStartButton = value.isNotEmpty &&
+                                      serverController.text.isNotEmpty &&
+                                      fusionRoundController.text.isNotEmpty;
+                                });
+                              },
+                              style: STextStyles.field(context),
+                              decoration: standardInputDecoration(
+                                "Port",
+                                portFocusNode,
+                                context,
+                              ),
+                            ),
+                          ),
+                          const SizedBox(
+                            height: 10,
+                          ),
+                          GestureDetector(
+                            onTap: () {
+                              setState(() {
+                                _enableSSLCheckbox = !_enableSSLCheckbox;
+                              });
+                            },
+                            child: Container(
+                              color: Colors.transparent,
+                              child: Row(
+                                children: [
+                                  SizedBox(
+                                    width: 20,
+                                    height: 20,
+                                    child: Checkbox(
+                                      materialTapTargetSize:
+                                          MaterialTapTargetSize.shrinkWrap,
+                                      value: _enableSSLCheckbox,
+                                      onChanged: (newValue) {
+                                        setState(
+                                          () {
+                                            _enableSSLCheckbox =
+                                                !_enableSSLCheckbox;
+                                          },
+                                        );
+                                      },
+                                    ),
+                                  ),
+                                  const SizedBox(
+                                    width: 12,
+                                  ),
+                                  Text(
+                                    "Use SSL",
+                                    style: STextStyles.itemSubtitle12(context),
+                                  ),
+                                ],
+                              ),
+                            ),
+                          ),
+                          const SizedBox(
+                            height: 16,
+                          ),
+                          Text(
+                            "Rounds of fusion",
+                            style: STextStyles.w500_14(context).copyWith(
+                              color: Theme.of(context)
+                                  .extension<StackColors>()!
+                                  .textDark3,
+                            ),
+                          ),
+                          const SizedBox(
+                            height: 12,
+                          ),
+                          RoundedContainer(
+                            onPressed: () async {
+                              final option =
+                                  await showModalBottomSheet<FusionOption?>(
+                                backgroundColor: Colors.transparent,
+                                context: context,
+                                shape: const RoundedRectangleBorder(
+                                  borderRadius: BorderRadius.vertical(
+                                    top: Radius.circular(20),
+                                  ),
+                                ),
+                                builder: (_) {
+                                  return FusionRoundCountSelectSheet(
+                                    currentOption: _option,
+                                  );
+                                },
+                              );
+                              if (option != null) {
+                                setState(() {
+                                  _option = option;
+                                });
+                              }
+                            },
+                            color: Theme.of(context)
+                                .extension<StackColors>()!
+                                .textFieldActiveBG,
+                            child: Padding(
+                              padding: const EdgeInsets.symmetric(vertical: 8),
+                              child: Row(
+                                mainAxisAlignment:
+                                    MainAxisAlignment.spaceBetween,
+                                children: [
+                                  Text(
+                                    _option.name.capitalize(),
+                                    style: STextStyles.w500_12(context),
+                                  ),
+                                  SvgPicture.asset(
+                                    Assets.svg.chevronDown,
+                                    width: 12,
+                                    color: Theme.of(context)
+                                        .extension<StackColors>()!
+                                        .textSubtitle1,
+                                  ),
+                                ],
+                              ),
+                            ),
+                          ),
+                          if (_option == FusionOption.custom)
+                            const SizedBox(
+                              height: 10,
+                            ),
+                          if (_option == FusionOption.custom)
+                            ClipRRect(
+                              borderRadius: BorderRadius.circular(
+                                Constants.size.circularBorderRadius,
+                              ),
+                              child: TextField(
+                                autocorrect: false,
+                                enableSuggestions: false,
+                                controller: fusionRoundController,
+                                focusNode: fusionRoundFocusNode,
+                                inputFormatters: [
+                                  FilteringTextInputFormatter.digitsOnly
+                                ],
+                                keyboardType: TextInputType.number,
+                                onChanged: (value) {
+                                  setState(() {
+                                    _enableStartButton = value.isNotEmpty &&
+                                        serverController.text.isNotEmpty &&
+                                        portController.text.isNotEmpty;
+                                  });
+                                },
+                                style: STextStyles.field(context),
+                                decoration: standardInputDecoration(
+                                  "Number of fusions",
+                                  fusionRoundFocusNode,
+                                  context,
+                                ).copyWith(
+                                    labelText: "Enter number of fusions.."),
+                              ),
+                            ),
+                          const SizedBox(
+                            height: 16,
+                          ),
+                          const Spacer(),
+                          PrimaryButton(
+                            label: "Start",
+                            enabled: _enableStartButton,
+                            onPressed: _startFusion,
+                          ),
+                        ],
+                      ),
+                    ),
+                  ),
+                ),
+              );
+            },
+          ),
+        ),
+      ),
+    );
+  }
+}
diff --git a/lib/pages/cashfusion/fusion_progress_view.dart b/lib/pages/cashfusion/fusion_progress_view.dart
new file mode 100644
index 000000000..96ef5eda9
--- /dev/null
+++ b/lib/pages/cashfusion/fusion_progress_view.dart
@@ -0,0 +1,248 @@
+/*
+ * This file is part of Stack Wallet.
+ *
+ * Copyright (c) 2023 Cypher Stack
+ * All Rights Reserved.
+ * The code is distributed under GPLv3 license, see LICENSE file for details.
+ * Generated by julian on 2023-10-16
+ *
+ */
+
+import 'dart:async';
+
+import 'package:flutter/material.dart';
+import 'package:flutter_riverpod/flutter_riverpod.dart';
+import 'package:stackwallet/pages_desktop_specific/cashfusion/sub_widgets/fusion_progress.dart';
+import 'package:stackwallet/providers/cash_fusion/fusion_progress_ui_state_provider.dart';
+import 'package:stackwallet/providers/global/prefs_provider.dart';
+import 'package:stackwallet/providers/global/wallets_provider.dart';
+import 'package:stackwallet/services/mixins/fusion_wallet_interface.dart';
+import 'package:stackwallet/themes/stack_colors.dart';
+import 'package:stackwallet/utilities/show_loading.dart';
+import 'package:stackwallet/utilities/text_styles.dart';
+import 'package:stackwallet/utilities/util.dart';
+import 'package:stackwallet/widgets/background.dart';
+import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart';
+import 'package:stackwallet/widgets/desktop/primary_button.dart';
+import 'package:stackwallet/widgets/desktop/secondary_button.dart';
+import 'package:stackwallet/widgets/rounded_container.dart';
+import 'package:stackwallet/widgets/stack_dialog.dart';
+
+class FusionProgressView extends ConsumerStatefulWidget {
+  const FusionProgressView({
+    super.key,
+    required this.walletId,
+  });
+
+  static const routeName = "/cashFusionProgressView";
+
+  final String walletId;
+
+  @override
+  ConsumerState<FusionProgressView> createState() => _FusionProgressViewState();
+}
+
+class _FusionProgressViewState extends ConsumerState<FusionProgressView> {
+  Future<bool> _requestAndProcessCancel() async {
+    final shouldCancel = await showDialog<bool?>(
+      context: context,
+      barrierDismissible: false,
+      builder: (_) => StackDialog(
+        title: "Cancel fusion?",
+        leftButton: SecondaryButton(
+          label: "No",
+          buttonHeight: null,
+          onPressed: () {
+            Navigator.of(context).pop(false);
+          },
+        ),
+        rightButton: PrimaryButton(
+          label: "Yes",
+          buttonHeight: null,
+          onPressed: () {
+            Navigator.of(context).pop(true);
+          },
+        ),
+      ),
+    );
+
+    if (shouldCancel == true && mounted) {
+      final fusionWallet = ref
+          .read(walletsChangeNotifierProvider)
+          .getManager(widget.walletId)
+          .wallet as FusionWalletInterface;
+
+      await showLoading(
+        whileFuture: Future.wait([
+          fusionWallet.stop(),
+          Future<void>.delayed(const Duration(seconds: 2)),
+        ]),
+        context: context,
+        isDesktop: Util.isDesktop,
+        message: "Stopping fusion",
+      );
+
+      return true;
+    } else {
+      return false;
+    }
+  }
+
+  @override
+  Widget build(BuildContext context) {
+    final bool _succeeded =
+        ref.watch(fusionProgressUIStateProvider(widget.walletId)).succeeded;
+
+    final bool _failed =
+        ref.watch(fusionProgressUIStateProvider(widget.walletId)).failed;
+
+    final int _fusionRoundsCompleted = ref
+        .watch(fusionProgressUIStateProvider(widget.walletId))
+        .fusionRoundsCompleted;
+
+    return WillPopScope(
+      onWillPop: () async {
+        return await _requestAndProcessCancel();
+      },
+      child: Background(
+        child: SafeArea(
+          child: Scaffold(
+            backgroundColor:
+                Theme.of(context).extension<StackColors>()!.background,
+            appBar: AppBar(
+              automaticallyImplyLeading: false,
+              leading: AppBarBackButton(
+                onPressed: () async {
+                  if (await _requestAndProcessCancel()) {
+                    if (mounted) {
+                      Navigator.of(context).pop();
+                    }
+                  }
+                },
+              ),
+              title: Text(
+                "Fusion progress",
+                style: STextStyles.navBarTitle(context),
+              ),
+              titleSpacing: 0,
+            ),
+            body: LayoutBuilder(
+              builder: (builderContext, constraints) {
+                return SingleChildScrollView(
+                  child: ConstrainedBox(
+                    constraints: BoxConstraints(
+                      minHeight: constraints.maxHeight,
+                    ),
+                    child: IntrinsicHeight(
+                      child: Padding(
+                        padding: const EdgeInsets.all(16),
+                        child: Column(
+                          crossAxisAlignment: CrossAxisAlignment.stretch,
+                          children: [
+                            if (_fusionRoundsCompleted == 0)
+                              RoundedContainer(
+                                color: Theme.of(context)
+                                    .extension<StackColors>()!
+                                    .snackBarBackError,
+                                child: Text(
+                                  "Do not close this window. If you exit, "
+                                  "the process will be canceled.",
+                                  style:
+                                      STextStyles.smallMed14(context).copyWith(
+                                    color: Theme.of(context)
+                                        .extension<StackColors>()!
+                                        .snackBarTextError,
+                                  ),
+                                  textAlign: TextAlign.center,
+                                ),
+                              ),
+                            if (_fusionRoundsCompleted > 0)
+                              RoundedContainer(
+                                color: Theme.of(context)
+                                    .extension<StackColors>()!
+                                    .snackBarBackInfo,
+                                child: Text(
+                                  "Fusion rounds completed: $_fusionRoundsCompleted",
+                                  style: STextStyles.w500_14(context).copyWith(
+                                    color: Theme.of(context)
+                                        .extension<StackColors>()!
+                                        .snackBarTextInfo,
+                                  ),
+                                  textAlign: TextAlign.center,
+                                ),
+                              ),
+                            const SizedBox(
+                              height: 20,
+                            ),
+                            FusionProgress(
+                              walletId: widget.walletId,
+                            ),
+                            const Spacer(),
+                            const SizedBox(
+                              height: 16,
+                            ),
+                            if (_succeeded)
+                              PrimaryButton(
+                                label: "Fuse again",
+                                onPressed: _fuseAgain,
+                              ),
+                            if (_succeeded)
+                              const SizedBox(
+                                height: 16,
+                              ),
+                            if (_failed)
+                              PrimaryButton(
+                                label: "Try again",
+                                onPressed: _fuseAgain,
+                              ),
+                            if (_failed)
+                              const SizedBox(
+                                height: 16,
+                              ),
+                            SecondaryButton(
+                              label: "Cancel",
+                              onPressed: () async {
+                                if (await _requestAndProcessCancel()) {
+                                  if (mounted) {
+                                    Navigator.of(context).pop();
+                                  }
+                                }
+                              },
+                            ),
+                          ],
+                        ),
+                      ),
+                    ),
+                  ),
+                );
+              },
+            ),
+          ),
+        ),
+      ),
+    );
+  }
+
+  /// Fuse again.
+  void _fuseAgain() async {
+    final fusionWallet = ref
+        .read(walletsChangeNotifierProvider)
+        .getManager(widget.walletId)
+        .wallet as FusionWalletInterface;
+
+    final fusionInfo = ref.read(prefsChangeNotifierProvider).fusionServerInfo;
+
+    try {
+      fusionWallet.uiState = ref.read(
+        fusionProgressUIStateProvider(widget.walletId),
+      );
+    } catch (e) {
+      if (!e.toString().contains(
+          "FusionProgressUIState was already set for ${widget.walletId}")) {
+        rethrow;
+      }
+    }
+
+    unawaited(fusionWallet.fuse(fusionInfo: fusionInfo));
+  }
+}
diff --git a/lib/pages/cashfusion/fusion_rounds_selection_sheet.dart b/lib/pages/cashfusion/fusion_rounds_selection_sheet.dart
new file mode 100644
index 000000000..3b36864ab
--- /dev/null
+++ b/lib/pages/cashfusion/fusion_rounds_selection_sheet.dart
@@ -0,0 +1,168 @@
+/*
+ * This file is part of Stack Wallet.
+ *
+ * Copyright (c) 2023 Cypher Stack
+ * All Rights Reserved.
+ * The code is distributed under GPLv3 license, see LICENSE file for details.
+ * Generated by julian on 2023-10-16
+ *
+ */
+
+import 'package:flutter/material.dart';
+import 'package:flutter_hooks/flutter_hooks.dart';
+import 'package:flutter_native_splash/cli_commands.dart';
+import 'package:stackwallet/themes/stack_colors.dart';
+import 'package:stackwallet/utilities/constants.dart';
+import 'package:stackwallet/utilities/text_styles.dart';
+
+enum FusionOption {
+  continuous,
+  custom;
+}
+
+class FusionRoundCountSelectSheet extends HookWidget {
+  const FusionRoundCountSelectSheet({
+    Key? key,
+    required this.currentOption,
+  }) : super(key: key);
+
+  final FusionOption currentOption;
+
+  @override
+  Widget build(BuildContext context) {
+    final option = useState(currentOption);
+
+    return WillPopScope(
+      onWillPop: () async {
+        Navigator.of(context).pop(option.value);
+        return false;
+      },
+      child: Container(
+        decoration: BoxDecoration(
+          color: Theme.of(context).extension<StackColors>()!.popupBG,
+          borderRadius: const BorderRadius.vertical(
+            top: Radius.circular(20),
+          ),
+        ),
+        child: Padding(
+          padding: const EdgeInsets.only(
+            left: 24,
+            right: 24,
+            top: 10,
+            bottom: 0,
+          ),
+          child: Column(
+            mainAxisSize: MainAxisSize.min,
+            crossAxisAlignment: CrossAxisAlignment.start,
+            children: [
+              Center(
+                child: Container(
+                  decoration: BoxDecoration(
+                    color: Theme.of(context)
+                        .extension<StackColors>()!
+                        .textFieldDefaultBG,
+                    borderRadius: BorderRadius.circular(
+                      Constants.size.circularBorderRadius,
+                    ),
+                  ),
+                  width: 60,
+                  height: 4,
+                ),
+              ),
+              const SizedBox(
+                height: 36,
+              ),
+              Column(
+                crossAxisAlignment: CrossAxisAlignment.start,
+                children: [
+                  Text(
+                    "Rounds of fusion",
+                    style: STextStyles.pageTitleH2(context),
+                    textAlign: TextAlign.left,
+                  ),
+                  const SizedBox(
+                    height: 20,
+                  ),
+                  for (int i = 0; i < FusionOption.values.length; i++)
+                    Column(
+                      children: [
+                        GestureDetector(
+                          onTap: () {
+                            option.value = FusionOption.values[i];
+                            Navigator.of(context).pop(option.value);
+                          },
+                          child: Container(
+                            color: Colors.transparent,
+                            child: Row(
+                              crossAxisAlignment: CrossAxisAlignment.start,
+                              children: [
+                                // Column(
+                                //   mainAxisAlignment: MainAxisAlignment.start,
+                                //   children: [
+                                SizedBox(
+                                  width: 20,
+                                  height: 20,
+                                  child: Radio(
+                                    activeColor: Theme.of(context)
+                                        .extension<StackColors>()!
+                                        .radioButtonIconEnabled,
+                                    value: FusionOption.values[i],
+                                    groupValue: option.value,
+                                    onChanged: (_) {
+                                      option.value = FusionOption.values[i];
+                                      Navigator.of(context).pop(option.value);
+                                    },
+                                  ),
+                                ),
+                                //   ],
+                                // ),
+                                const SizedBox(
+                                  width: 12,
+                                ),
+                                Column(
+                                  crossAxisAlignment: CrossAxisAlignment.start,
+                                  children: [
+                                    Text(
+                                      FusionOption.values[i].name.capitalize(),
+                                      style: STextStyles.titleBold12(context),
+                                      textAlign: TextAlign.left,
+                                    ),
+                                    const SizedBox(
+                                      height: 2,
+                                    ),
+                                    Text(
+                                      FusionOption.values[i] ==
+                                              FusionOption.continuous
+                                          ? "Keep fusing until manually stopped"
+                                          : "Stop after a set number of fusions",
+                                      style: STextStyles.itemSubtitle12(context)
+                                          .copyWith(
+                                        color: Theme.of(context)
+                                            .extension<StackColors>()!
+                                            .textDark3,
+                                      ),
+                                      textAlign: TextAlign.left,
+                                    ),
+                                  ],
+                                ),
+                              ],
+                            ),
+                          ),
+                        ),
+                        const SizedBox(
+                          height: 16,
+                        ),
+                      ],
+                    ),
+                  const SizedBox(
+                    height: 16,
+                  ),
+                ],
+              ),
+            ],
+          ),
+        ),
+      ),
+    );
+  }
+}
diff --git a/lib/pages/receive_view/addresses/address_details_view.dart b/lib/pages/receive_view/addresses/address_details_view.dart
index 75d41b073..fa8b02617 100644
--- a/lib/pages/receive_view/addresses/address_details_view.dart
+++ b/lib/pages/receive_view/addresses/address_details_view.dart
@@ -13,13 +13,19 @@ import 'package:flutter_riverpod/flutter_riverpod.dart';
 import 'package:isar/isar.dart';
 import 'package:qr_flutter/qr_flutter.dart';
 import 'package:stackwallet/db/isar/main_db.dart';
+import 'package:stackwallet/models/isar/models/blockchain_data/v2/input_v2.dart';
+import 'package:stackwallet/models/isar/models/blockchain_data/v2/output_v2.dart';
+import 'package:stackwallet/models/isar/models/blockchain_data/v2/transaction_v2.dart';
 import 'package:stackwallet/models/isar/models/isar_models.dart';
 import 'package:stackwallet/pages/receive_view/addresses/address_tag.dart';
 import 'package:stackwallet/pages/wallet_view/sub_widgets/no_transactions_found.dart';
 import 'package:stackwallet/pages/wallet_view/transaction_views/transaction_details_view.dart';
+import 'package:stackwallet/pages/wallet_view/transaction_views/tx_v2/transaction_v2_card.dart';
+import 'package:stackwallet/providers/db/main_db_provider.dart';
 import 'package:stackwallet/providers/global/wallets_provider.dart';
 import 'package:stackwallet/themes/stack_colors.dart';
 import 'package:stackwallet/utilities/address_utils.dart';
+import 'package:stackwallet/utilities/enums/coin_enum.dart';
 import 'package:stackwallet/utilities/text_styles.dart';
 import 'package:stackwallet/utilities/util.dart';
 import 'package:stackwallet/widgets/background.dart';
@@ -145,6 +151,8 @@ class _AddressDetailsViewState extends ConsumerState<AddressDetailsView> {
 
   @override
   Widget build(BuildContext context) {
+    final coin = ref.watch(walletsChangeNotifierProvider
+        .select((value) => value.getManager(widget.walletId).coin));
     return ConditionalParent(
       condition: !isDesktop,
       builder: (child) => Background(
@@ -258,10 +266,16 @@ class _AddressDetailsViewState extends ConsumerState<AddressDetailsView> {
                           borderColor: Theme.of(context)
                               .extension<StackColors>()!
                               .backgroundAppBar,
-                          child: _AddressDetailsTxList(
-                            walletId: widget.walletId,
-                            address: address,
-                          ),
+                          child: coin == Coin.bitcoincash ||
+                                  coin == Coin.bitcoincashTestnet
+                              ? _AddressDetailsTxV2List(
+                                  walletId: widget.walletId,
+                                  address: address,
+                                )
+                              : _AddressDetailsTxList(
+                                  walletId: widget.walletId,
+                                  address: address,
+                                ),
                         ),
                       ],
                     ),
@@ -377,10 +391,15 @@ class _AddressDetailsViewState extends ConsumerState<AddressDetailsView> {
                     height: 12,
                   ),
                 if (!isDesktop)
-                  _AddressDetailsTxList(
-                    walletId: widget.walletId,
-                    address: address,
-                  ),
+                  coin == Coin.bitcoincash || coin == Coin.bitcoincashTestnet
+                      ? _AddressDetailsTxV2List(
+                          walletId: widget.walletId,
+                          address: address,
+                        )
+                      : _AddressDetailsTxList(
+                          walletId: widget.walletId,
+                          address: address,
+                        ),
               ],
             ),
           );
@@ -445,6 +464,66 @@ class _AddressDetailsTxList extends StatelessWidget {
   }
 }
 
+class _AddressDetailsTxV2List extends ConsumerWidget {
+  const _AddressDetailsTxV2List({
+    Key? key,
+    required this.walletId,
+    required this.address,
+  }) : super(key: key);
+
+  final String walletId;
+  final Address address;
+
+  @override
+  Widget build(BuildContext context, WidgetRef ref) {
+    final query = ref
+        .watch(mainDBProvider)
+        .isar
+        .transactionV2s
+        .where()
+        .walletIdEqualTo(walletId)
+        .filter()
+        .inputsElement((q) => q.addressesElementContains(address.value))
+        .or()
+        .outputsElement((q) => q.addressesElementContains(address.value))
+        .sortByTimestampDesc();
+
+    final count = query.countSync();
+
+    if (count > 0) {
+      if (Util.isDesktop) {
+        final txns = query.findAllSync();
+        return ListView.separated(
+          shrinkWrap: true,
+          primary: false,
+          itemBuilder: (_, index) => TransactionCardV2(
+            transaction: txns[index],
+          ),
+          separatorBuilder: (_, __) => const _Div(height: 1),
+          itemCount: count,
+        );
+      } else {
+        return RoundedWhiteContainer(
+          padding: EdgeInsets.zero,
+          child: Column(
+            mainAxisSize: MainAxisSize.min,
+            children: query
+                .findAllSync()
+                .map(
+                  (e) => TransactionCardV2(
+                    transaction: e,
+                  ),
+                )
+                .toList(),
+          ),
+        );
+      }
+    } else {
+      return const NoTransActionsFound();
+    }
+  }
+}
+
 class _Div extends StatelessWidget {
   const _Div({
     Key? key,
diff --git a/lib/pages/settings_views/global_settings_view/hidden_settings.dart b/lib/pages/settings_views/global_settings_view/hidden_settings.dart
index 924524de7..2f34a89a9 100644
--- a/lib/pages/settings_views/global_settings_view/hidden_settings.dart
+++ b/lib/pages/settings_views/global_settings_view/hidden_settings.dart
@@ -9,18 +9,27 @@
  */
 
 import 'dart:async';
+import 'dart:typed_data';
 
+import 'package:bitbox/bitbox.dart' as bb;
+import 'package:bitcoindart/bitcoindart.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter_riverpod/flutter_riverpod.dart';
 import 'package:flutter_svg/flutter_svg.dart';
 import 'package:hive_flutter/hive_flutter.dart';
 import 'package:stackwallet/db/hive/db.dart';
+import 'package:stackwallet/electrumx_rpc/cached_electrumx.dart';
+import 'package:stackwallet/electrumx_rpc/electrumx.dart';
 import 'package:stackwallet/notifications/show_flush_bar.dart';
 import 'package:stackwallet/providers/global/debug_service_provider.dart';
 import 'package:stackwallet/providers/providers.dart';
+import 'package:stackwallet/services/coins/bitcoincash/bitcoincash_wallet.dart';
+import 'package:stackwallet/services/mixins/electrum_x_parsing.dart';
 import 'package:stackwallet/themes/stack_colors.dart';
+import 'package:stackwallet/utilities/address_utils.dart';
 import 'package:stackwallet/utilities/assets.dart';
 import 'package:stackwallet/utilities/constants.dart';
+import 'package:stackwallet/utilities/enums/coin_enum.dart';
 import 'package:stackwallet/utilities/text_styles.dart';
 import 'package:stackwallet/utilities/util.dart';
 import 'package:stackwallet/widgets/background.dart';
@@ -343,6 +352,181 @@ class HiddenSettings extends StatelessWidget {
                             }
                           },
                         ),
+                        const SizedBox(
+                          height: 12,
+                        ),
+                        Consumer(
+                          builder: (_, ref, __) {
+                            return GestureDetector(
+                              onTap: () async {
+                                try {
+                                  final p = TT();
+
+                                  final n = ref
+                                      .read(nodeServiceChangeNotifierProvider)
+                                      .getPrimaryNodeFor(
+                                          coin: Coin.bitcoincash)!;
+
+                                  final e = ElectrumX.from(
+                                    node: ElectrumXNode(
+                                      address: n.host,
+                                      port: n.port,
+                                      name: n.name,
+                                      id: n.id,
+                                      useSSL: n.useSSL,
+                                    ),
+                                    prefs:
+                                        ref.read(prefsChangeNotifierProvider),
+                                    failovers: [],
+                                  );
+
+                                  final ce =
+                                      CachedElectrumX(electrumXClient: e);
+
+                                  final txids = [
+                                    "", //  cashTokenTxid
+                                    "6a0444358bc41913c5b04a8dc06896053184b3641bc62502d18f954865b6ce1e", // normalTxid
+                                    "67f13c375f9be897036cac77b7900dc74312c4ba6fe22f419f5cb21d4151678c", // fusionTxid
+                                    "c0ac3f88b238a023d2a87226dc90c3b0f9abc3eeb227e2730087b0b95ee5b3f9", // slpTokenSendTxid
+                                    "7a427a156fe70f83d3ccdd17e75804cc0df8c95c64ce04d256b3851385002a0b", // slpTokenGenesisTxid
+                                  ];
+
+                                  // final json =
+                                  //     await e.getTransaction(txHash: txids[1]);
+                                  // await p.parseBchTx(json, "NORMAL TXID:");
+                                  //
+                                  // final json2 =
+                                  //     await e.getTransaction(txHash: txids[2]);
+                                  // await p.parseBchTx(json2, "FUSION TXID:");
+                                  //
+                                  // // print("CASH TOKEN TXID:");
+                                  // // final json3 =
+                                  // //     await e.getTransaction(txHash: txids[2]);
+                                  // // await p.parseBchTx(json3);
+                                  //
+                                  await p.getTransaction(
+                                      txids[3],
+                                      Coin.bitcoincash,
+                                      "lol",
+                                      ce,
+                                      "SLP TOKEN SEND TXID:");
+                                  await p.getTransaction(
+                                      "009d31380d2dbfb5c91500c861d55b531a8b762b0abb19353db884548dbac8b6",
+                                      Coin.bitcoincash,
+                                      "lol",
+                                      ce,
+                                      "COINBASE TXID:");
+
+                                  // final json5 =
+                                  //     await e.getTransaction(txHash: txids[4]);
+                                  // await p.parseBchTx(
+                                  //     json5, "SLP TOKEN GENESIS TXID:");
+                                } catch (e, s) {
+                                  print("$e\n$s");
+                                }
+                              },
+                              child: RoundedWhiteContainer(
+                                child: Text(
+                                  "Parse BCH tx test",
+                                  style: STextStyles.button(context).copyWith(
+                                      color: Theme.of(context)
+                                          .extension<StackColors>()!
+                                          .accentColorDark),
+                                ),
+                              ),
+                            );
+                          },
+                        ),
+                        const SizedBox(
+                          height: 12,
+                        ),
+                        Consumer(
+                          builder: (_, ref, __) {
+                            return GestureDetector(
+                              onTap: () async {
+                                try {
+                                  final p = TT();
+
+                                  final n = ref
+                                      .read(nodeServiceChangeNotifierProvider)
+                                      .getPrimaryNodeFor(
+                                          coin: Coin.bitcoincash)!;
+
+                                  final e = ElectrumX.from(
+                                    node: ElectrumXNode(
+                                      address: n.host,
+                                      port: n.port,
+                                      name: n.name,
+                                      id: n.id,
+                                      useSSL: n.useSSL,
+                                    ),
+                                    prefs:
+                                        ref.read(prefsChangeNotifierProvider),
+                                    failovers: [],
+                                  );
+
+                                  final address =
+                                      "qzmd5vxgh9m22m6fgvm57yd6kjnjl9qnwyztz2p80d";
+
+                                  List<int> _base32Decode(String string) {
+                                    final data = Uint8List(string.length);
+                                    for (int i = 0; i < string.length; i++) {
+                                      final value = string[i];
+                                      if (!_CHARSET_INVERSE_INDEX
+                                          .containsKey(value))
+                                        throw FormatException(
+                                            "Invalid character '$value'");
+                                      data[i] =
+                                          _CHARSET_INVERSE_INDEX[string[i]]!;
+                                    }
+
+                                    return data.sublist(1);
+                                  }
+
+                                  final dec = _base32Decode(address);
+
+                                  final pd = PaymentData(
+                                      pubkey: Uint8List.fromList(dec));
+
+                                  final p2pkh =
+                                      P2PKH(data: pd, network: bitcoincash);
+
+                                  // final addr = p2pkh.data.address!;
+
+                                  final addr = bb.Address.toLegacyAddress(
+                                    "bitcoincash:qp352c2skpdxwzzd090mec3v37au5dmfwgwfw686sz",
+                                  );
+
+                                  final scripthash =
+                                      AddressUtils.convertToScriptHash(
+                                          addr, bitcoincash);
+
+                                  final utxos =
+                                      await e.getUTXOs(scripthash: scripthash);
+
+                                  Util.printJson(utxos, "UTXOS for $address");
+
+                                  final hist = await e.getTransaction(
+                                    txHash: utxos.first["tx_hash"] as String,
+                                  );
+
+                                  Util.printJson(hist, "HISTORY for $address");
+                                } catch (e, s) {
+                                  print("$e\n$s");
+                                }
+                              },
+                              child: RoundedWhiteContainer(
+                                child: Text(
+                                  "UTXOs",
+                                  style: STextStyles.button(context).copyWith(
+                                      color: Theme.of(context)
+                                          .extension<StackColors>()!
+                                          .accentColorDark),
+                                ),
+                              ),
+                            );
+                          },
+                        ),
                         // const SizedBox(
                         //   height: 12,
                         // ),
@@ -384,3 +568,38 @@ class HiddenSettings extends StatelessWidget {
     );
   }
 }
+
+const _CHARSET_INVERSE_INDEX = {
+  'q': 0,
+  'p': 1,
+  'z': 2,
+  'r': 3,
+  'y': 4,
+  '9': 5,
+  'x': 6,
+  '8': 7,
+  'g': 8,
+  'f': 9,
+  '2': 10,
+  't': 11,
+  'v': 12,
+  'd': 13,
+  'w': 14,
+  '0': 15,
+  's': 16,
+  '3': 17,
+  'j': 18,
+  'n': 19,
+  '5': 20,
+  '4': 21,
+  'k': 22,
+  'h': 23,
+  'c': 24,
+  'e': 25,
+  '6': 26,
+  'm': 27,
+  'u': 28,
+  'a': 29,
+  '7': 30,
+  'l': 31,
+};
diff --git a/lib/pages/token_view/sub_widgets/token_transaction_list_widget.dart b/lib/pages/token_view/sub_widgets/token_transaction_list_widget.dart
index 68f5c76b8..e460fbe53 100644
--- a/lib/pages/token_view/sub_widgets/token_transaction_list_widget.dart
+++ b/lib/pages/token_view/sub_widgets/token_transaction_list_widget.dart
@@ -225,8 +225,8 @@ class _TransactionsListState extends ConsumerState<TokenTransactionsList> {
           _hasLoaded = true;
         }
         if (!_hasLoaded) {
-          return Column(
-            children: const [
+          return const Column(
+            children: [
               Spacer(),
               Center(
                 child: LoadingIndicator(
diff --git a/lib/pages/token_view/token_view.dart b/lib/pages/token_view/token_view.dart
index 421e00422..54f0efe58 100644
--- a/lib/pages/token_view/token_view.dart
+++ b/lib/pages/token_view/token_view.dart
@@ -37,12 +37,14 @@ class TokenView extends ConsumerStatefulWidget {
   const TokenView({
     Key? key,
     required this.walletId,
+    this.popPrevious = false,
     this.eventBus,
   }) : super(key: key);
 
   static const String routeName = "/token";
 
   final String walletId;
+  final bool popPrevious;
   final EventBus? eventBus;
 
   @override
@@ -69,157 +71,175 @@ class _TokenViewState extends ConsumerState<TokenView> {
   Widget build(BuildContext context) {
     debugPrint("BUILD: $runtimeType");
 
-    return Background(
-      child: Scaffold(
-        backgroundColor: Theme.of(context).extension<StackColors>()!.background,
-        appBar: AppBar(
-          leading: AppBarBackButton(
-            onPressed: () {
-              Navigator.of(context).pop();
-            },
-          ),
-          centerTitle: true,
-          title: Row(
-            mainAxisAlignment: MainAxisAlignment.center,
-            mainAxisSize: MainAxisSize.min,
-            children: [
-              Expanded(
-                child: Row(
-                  mainAxisAlignment: MainAxisAlignment.center,
-                  children: [
-                    EthTokenIcon(
-                      contractAddress: ref.watch(
-                        tokenServiceProvider.select(
-                          (value) => value!.tokenContract.address,
+    return WillPopScope(
+      onWillPop: () async {
+        final nav = Navigator.of(context);
+        if (widget.popPrevious) {
+          nav.pop();
+        }
+        nav.pop();
+        return false;
+      },
+      child: Background(
+        child: Scaffold(
+          backgroundColor:
+              Theme.of(context).extension<StackColors>()!.background,
+          appBar: AppBar(
+            leading: AppBarBackButton(
+              onPressed: () {
+                final nav = Navigator.of(context);
+                if (widget.popPrevious) {
+                  nav.pop();
+                }
+                nav.pop();
+              },
+            ),
+            centerTitle: true,
+            title: Row(
+              mainAxisAlignment: MainAxisAlignment.center,
+              mainAxisSize: MainAxisSize.min,
+              children: [
+                Expanded(
+                  child: Row(
+                    mainAxisAlignment: MainAxisAlignment.center,
+                    children: [
+                      EthTokenIcon(
+                        contractAddress: ref.watch(
+                          tokenServiceProvider.select(
+                            (value) => value!.tokenContract.address,
+                          ),
+                        ),
+                        size: 24,
+                      ),
+                      const SizedBox(
+                        width: 10,
+                      ),
+                      Flexible(
+                        child: Text(
+                          ref.watch(tokenServiceProvider
+                              .select((value) => value!.tokenContract.name)),
+                          style: STextStyles.navBarTitle(context),
+                          overflow: TextOverflow.ellipsis,
+                          textAlign: TextAlign.center,
                         ),
                       ),
-                      size: 24,
+                    ],
+                  ),
+                ),
+              ],
+            ),
+            actions: [
+              Padding(
+                padding: const EdgeInsets.only(right: 2),
+                child: AspectRatio(
+                  aspectRatio: 1,
+                  child: AppBarIconButton(
+                    icon: SvgPicture.asset(
+                      Assets.svg.verticalEllipsis,
+                      color: Theme.of(context)
+                          .extension<StackColors>()!
+                          .topNavIconPrimary,
                     ),
-                    const SizedBox(
-                      width: 10,
-                    ),
-                    Flexible(
-                      child: Text(
-                        ref.watch(tokenServiceProvider
-                            .select((value) => value!.tokenContract.name)),
-                        style: STextStyles.navBarTitle(context),
-                        overflow: TextOverflow.ellipsis,
-                        textAlign: TextAlign.center,
-                      ),
-                    ),
-                  ],
+                    onPressed: () {
+                      // todo: context menu
+                      Navigator.of(context).pushNamed(
+                        TokenContractDetailsView.routeName,
+                        arguments: Tuple2(
+                          ref.watch(tokenServiceProvider
+                              .select((value) => value!.tokenContract.address)),
+                          widget.walletId,
+                        ),
+                      );
+                    },
+                  ),
                 ),
               ),
             ],
           ),
-          actions: [
-            Padding(
-              padding: const EdgeInsets.only(right: 2),
-              child: AspectRatio(
-                aspectRatio: 1,
-                child: AppBarIconButton(
-                  icon: SvgPicture.asset(
-                    Assets.svg.verticalEllipsis,
-                    color: Theme.of(context)
-                        .extension<StackColors>()!
-                        .topNavIconPrimary,
-                  ),
-                  onPressed: () {
-                    // todo: context menu
-                    Navigator.of(context).pushNamed(
-                      TokenContractDetailsView.routeName,
-                      arguments: Tuple2(
-                        ref.watch(tokenServiceProvider
-                            .select((value) => value!.tokenContract.address)),
-                        widget.walletId,
-                      ),
-                    );
-                  },
+          body: Container(
+            color: Theme.of(context).extension<StackColors>()!.background,
+            child: Column(
+              children: [
+                const SizedBox(
+                  height: 10,
                 ),
-              ),
-            ),
-          ],
-        ),
-        body: Container(
-          color: Theme.of(context).extension<StackColors>()!.background,
-          child: Column(
-            children: [
-              const SizedBox(
-                height: 10,
-              ),
-              Padding(
-                padding: const EdgeInsets.symmetric(horizontal: 16),
-                child: TokenSummary(
-                  walletId: widget.walletId,
-                  initialSyncStatus: initialSyncStatus,
-                ),
-              ),
-              const SizedBox(
-                height: 20,
-              ),
-              Padding(
-                padding: const EdgeInsets.symmetric(horizontal: 16),
-                child: Row(
-                  mainAxisAlignment: MainAxisAlignment.spaceBetween,
-                  children: [
-                    Text(
-                      "Transactions",
-                      style: STextStyles.itemSubtitle(context).copyWith(
-                        color: Theme.of(context)
-                            .extension<StackColors>()!
-                            .textDark3,
-                      ),
-                    ),
-                    CustomTextButton(
-                      text: "See all",
-                      onTap: () {
-                        Navigator.of(context).pushNamed(
-                          AllTransactionsView.routeName,
-                          arguments: widget.walletId,
-                        );
-                      },
-                    ),
-                  ],
-                ),
-              ),
-              const SizedBox(
-                height: 12,
-              ),
-              Expanded(
-                child: Padding(
+                Padding(
                   padding: const EdgeInsets.symmetric(horizontal: 16),
-                  child: ClipRRect(
-                    borderRadius: BorderRadius.vertical(
-                      top: Radius.circular(
-                        Constants.size.circularBorderRadius,
+                  child: TokenSummary(
+                    walletId: widget.walletId,
+                    initialSyncStatus: initialSyncStatus,
+                  ),
+                ),
+                const SizedBox(
+                  height: 20,
+                ),
+                Padding(
+                  padding: const EdgeInsets.symmetric(horizontal: 16),
+                  child: Row(
+                    mainAxisAlignment: MainAxisAlignment.spaceBetween,
+                    children: [
+                      Text(
+                        "Transactions",
+                        style: STextStyles.itemSubtitle(context).copyWith(
+                          color: Theme.of(context)
+                              .extension<StackColors>()!
+                              .textDark3,
+                        ),
                       ),
-                      bottom: Radius.circular(
-                        // TokenView.navBarHeight / 2.0,
-                        Constants.size.circularBorderRadius,
+                      CustomTextButton(
+                        text: "See all",
+                        onTap: () {
+                          Navigator.of(context).pushNamed(
+                            AllTransactionsView.routeName,
+                            arguments: (
+                              walletId: widget.walletId,
+                              isTokens: true,
+                            ),
+                          );
+                        },
                       ),
-                    ),
-                    child: Container(
-                      decoration: BoxDecoration(
-                        color: Colors.transparent,
-                        borderRadius: BorderRadius.circular(
+                    ],
+                  ),
+                ),
+                const SizedBox(
+                  height: 12,
+                ),
+                Expanded(
+                  child: Padding(
+                    padding: const EdgeInsets.symmetric(horizontal: 16),
+                    child: ClipRRect(
+                      borderRadius: BorderRadius.vertical(
+                        top: Radius.circular(
+                          Constants.size.circularBorderRadius,
+                        ),
+                        bottom: Radius.circular(
+                          // TokenView.navBarHeight / 2.0,
                           Constants.size.circularBorderRadius,
                         ),
                       ),
-                      child: Column(
-                        crossAxisAlignment: CrossAxisAlignment.stretch,
-                        children: [
-                          Expanded(
-                            child: TokenTransactionsList(
-                              walletId: widget.walletId,
-                            ),
+                      child: Container(
+                        decoration: BoxDecoration(
+                          color: Colors.transparent,
+                          borderRadius: BorderRadius.circular(
+                            Constants.size.circularBorderRadius,
                           ),
-                        ],
+                        ),
+                        child: Column(
+                          crossAxisAlignment: CrossAxisAlignment.stretch,
+                          children: [
+                            Expanded(
+                              child: TokenTransactionsList(
+                                walletId: widget.walletId,
+                              ),
+                            ),
+                          ],
+                        ),
                       ),
                     ),
                   ),
                 ),
-              ),
-            ],
+              ],
+            ),
           ),
         ),
       ),
diff --git a/lib/pages/wallet_view/sub_widgets/tx_icon.dart b/lib/pages/wallet_view/sub_widgets/tx_icon.dart
index bcf7c3780..1cff381ee 100644
--- a/lib/pages/wallet_view/sub_widgets/tx_icon.dart
+++ b/lib/pages/wallet_view/sub_widgets/tx_icon.dart
@@ -13,6 +13,7 @@ import 'dart:io';
 import 'package:flutter/cupertino.dart';
 import 'package:flutter_riverpod/flutter_riverpod.dart';
 import 'package:flutter_svg/svg.dart';
+import 'package:stackwallet/models/isar/models/blockchain_data/v2/transaction_v2.dart';
 import 'package:stackwallet/models/isar/models/isar_models.dart';
 import 'package:stackwallet/models/isar/stack_theme.dart';
 import 'package:stackwallet/themes/theme_providers.dart';
@@ -27,15 +28,24 @@ class TxIcon extends ConsumerWidget {
     required this.coin,
   }) : super(key: key);
 
-  final Transaction transaction;
+  final Object transaction;
   final int currentHeight;
   final Coin coin;
 
   static const Size size = Size(32, 32);
 
   String _getAssetName(
-      bool isCancelled, bool isReceived, bool isPending, IThemeAssets assets) {
-    if (!isReceived && transaction.subType == TransactionSubType.mint) {
+    bool isCancelled,
+    bool isReceived,
+    bool isPending,
+    TransactionSubType subType,
+    IThemeAssets assets,
+  ) {
+    if (subType == TransactionSubType.cashFusion) {
+      return Assets.svg.txCashFusion;
+    }
+
+    if (!isReceived && subType == TransactionSubType.mint) {
       if (isCancelled) {
         return Assets.svg.anonymizeFailed;
       }
@@ -66,37 +76,61 @@ class TxIcon extends ConsumerWidget {
 
   @override
   Widget build(BuildContext context, WidgetRef ref) {
-    final txIsReceived = transaction.type == TransactionType.incoming;
+    final bool txIsReceived;
+    final String assetName;
 
-    final assetName = _getAssetName(
-      transaction.isCancelled,
-      txIsReceived,
-      !transaction.isConfirmed(
-        currentHeight,
-        coin.requiredConfirmations,
-      ),
-      ref.watch(themeAssetsProvider),
-    );
+    if (transaction is Transaction) {
+      final tx = transaction as Transaction;
+      txIsReceived = tx.type == TransactionType.incoming;
+      assetName = _getAssetName(
+        tx.isCancelled,
+        txIsReceived,
+        !tx.isConfirmed(
+          currentHeight,
+          coin.requiredConfirmations,
+        ),
+        tx.subType,
+        ref.watch(themeAssetsProvider),
+      );
+    } else if (transaction is TransactionV2) {
+      final tx = transaction as TransactionV2;
+      txIsReceived = tx.type == TransactionType.incoming;
+      assetName = _getAssetName(
+        false,
+        txIsReceived,
+        !tx.isConfirmed(
+          currentHeight,
+          coin.requiredConfirmations,
+        ),
+        tx.subType,
+        ref.watch(themeAssetsProvider),
+      );
+    } else {
+      throw ArgumentError(
+        "Unknown transaction type ${transaction.runtimeType}",
+      );
+    }
 
     return SizedBox(
       width: size.width,
       height: size.height,
       child: Center(
-          // if it starts with "assets" we assume its local
-          // TODO: a more thorough check
-          child: assetName.startsWith("assets")
-              ? SvgPicture.asset(
+        // if it starts with "assets" we assume its local
+        // TODO: a more thorough check
+        child: assetName.startsWith("assets")
+            ? SvgPicture.asset(
+                assetName,
+                width: size.width,
+                height: size.height,
+              )
+            : SvgPicture.file(
+                File(
                   assetName,
-                  width: size.width,
-                  height: size.height,
-                )
-              : SvgPicture.file(
-                  File(
-                    assetName,
-                  ),
-                  width: size.width,
-                  height: size.height,
-                )),
+                ),
+                width: size.width,
+                height: size.height,
+              ),
+      ),
     );
   }
 }
diff --git a/lib/pages/wallet_view/transaction_views/all_transactions_view.dart b/lib/pages/wallet_view/transaction_views/all_transactions_view.dart
index 32cd8fb30..eae121a44 100644
--- a/lib/pages/wallet_view/transaction_views/all_transactions_view.dart
+++ b/lib/pages/wallet_view/transaction_views/all_transactions_view.dart
@@ -17,6 +17,7 @@ import 'package:stackwallet/models/isar/models/blockchain_data/transaction.dart'
 import 'package:stackwallet/models/isar/models/contact_entry.dart';
 import 'package:stackwallet/models/transaction_filter.dart';
 import 'package:stackwallet/notifications/show_flush_bar.dart';
+import 'package:stackwallet/pages/token_view/token_view.dart';
 import 'package:stackwallet/pages/wallet_view/sub_widgets/tx_icon.dart';
 import 'package:stackwallet/pages/wallet_view/transaction_views/transaction_details_view.dart';
 import 'package:stackwallet/pages/wallet_view/transaction_views/transaction_search_filter_view.dart';
@@ -46,15 +47,23 @@ import 'package:stackwallet/widgets/textfield_icon_button.dart';
 import 'package:stackwallet/widgets/transaction_card.dart';
 import 'package:tuple/tuple.dart';
 
+typedef _GroupedTransactions = ({
+  String label,
+  DateTime startDate,
+  List<Transaction> transactions
+});
+
 class AllTransactionsView extends ConsumerStatefulWidget {
   const AllTransactionsView({
     Key? key,
     required this.walletId,
+    this.isTokens = false,
   }) : super(key: key);
 
   static const String routeName = "/allTransactions";
 
   final String walletId;
+  final bool isTokens;
 
   @override
   ConsumerState<AllTransactionsView> createState() =>
@@ -189,25 +198,24 @@ class _TransactionDetailsViewState extends ConsumerState<AllTransactionsView> {
         .toList();
   }
 
-  List<Tuple2<String, List<Transaction>>> groupTransactionsByMonth(
-      List<Transaction> transactions) {
-    Map<String, List<Transaction>> map = {};
+  List<_GroupedTransactions> groupTransactionsByMonth(
+    List<Transaction> transactions,
+  ) {
+    Map<String, _GroupedTransactions> map = {};
 
     for (var tx in transactions) {
       final date = DateTime.fromMillisecondsSinceEpoch(tx.timestamp * 1000);
       final monthYear = "${Constants.monthMap[date.month]} ${date.year}";
       if (map[monthYear] == null) {
-        map[monthYear] = [];
+        map[monthYear] =
+            (label: monthYear, startDate: date, transactions: [tx]);
+      } else {
+        map[monthYear]!.transactions.add(tx);
       }
-      map[monthYear]!.add(tx);
     }
 
-    List<Tuple2<String, List<Transaction>>> result = [];
-    map.forEach((key, value) {
-      result.add(Tuple2(key, value));
-    });
-
-    return result;
+    return map.values.toList()
+      ..sort((a, b) => b.startDate.compareTo(a.startDate));
   }
 
   @override
@@ -445,12 +453,12 @@ class _TransactionDetailsViewState extends ConsumerState<AllTransactionsView> {
               ),
             if (isDesktop &&
                 ref.watch(transactionFilterProvider.state).state != null)
-              Padding(
-                padding: const EdgeInsets.symmetric(
+              const Padding(
+                padding: EdgeInsets.symmetric(
                   vertical: 8,
                 ),
                 child: Row(
-                  children: const [
+                  children: [
                     TransactionFilterOptionBar(),
                   ],
                 ),
@@ -472,8 +480,11 @@ class _TransactionDetailsViewState extends ConsumerState<AllTransactionsView> {
                   // debugPrint("Consumer build called");
 
                   return FutureBuilder(
-                    future: ref.watch(
-                        managerProvider.select((value) => value.transactions)),
+                    future: widget.isTokens
+                        ? ref.watch(tokenServiceProvider
+                            .select((value) => value!.transactions))
+                        : ref.watch(managerProvider
+                            .select((value) => value.transactions)),
                     builder: (_, AsyncSnapshot<List<Transaction>> snapshot) {
                       if (snapshot.connectionState == ConnectionState.done &&
                           snapshot.hasData) {
@@ -498,7 +509,7 @@ class _TransactionDetailsViewState extends ConsumerState<AllTransactionsView> {
                                       height: 12,
                                     ),
                                   Text(
-                                    month.item1,
+                                    month.label,
                                     style: STextStyles.smallMed12(context),
                                   ),
                                   const SizedBox(
@@ -517,14 +528,15 @@ class _TransactionDetailsViewState extends ConsumerState<AllTransactionsView> {
                                               .extension<StackColors>()!
                                               .background,
                                         ),
-                                        itemCount: month.item2.length,
+                                        itemCount: month.transactions.length,
                                         itemBuilder: (context, index) =>
                                             Padding(
                                           padding: const EdgeInsets.all(4),
                                           child: DesktopTransactionCardRow(
                                             key: Key(
-                                                "transactionCard_key_${month.item2[index].txid}"),
-                                            transaction: month.item2[index],
+                                                "transactionCard_key_${month.transactions[index].txid}"),
+                                            transaction:
+                                                month.transactions[index],
                                             walletId: walletId,
                                           ),
                                         ),
@@ -535,7 +547,7 @@ class _TransactionDetailsViewState extends ConsumerState<AllTransactionsView> {
                                       padding: const EdgeInsets.all(0),
                                       child: Column(
                                         children: [
-                                          ...month.item2.map(
+                                          ...month.transactions.map(
                                             (tx) => TransactionCard(
                                               key: Key(
                                                   "transactionCard_key_${tx.txid}"),
diff --git a/lib/pages/wallet_view/transaction_views/transaction_details_view.dart b/lib/pages/wallet_view/transaction_views/transaction_details_view.dart
index 54b528245..d1af131a5 100644
--- a/lib/pages/wallet_view/transaction_views/transaction_details_view.dart
+++ b/lib/pages/wallet_view/transaction_views/transaction_details_view.dart
@@ -831,7 +831,7 @@ class _TransactionDetailsViewState
                                     ),
                                     if (isDesktop)
                                       IconCopyButton(
-                                        data: _transaction.address.value!.value,
+                                        data: _transaction.otherData ?? "",
                                       ),
                                   ],
                                 ),
diff --git a/lib/pages/wallet_view/transaction_views/tx_v2/all_transactions_v2_view.dart b/lib/pages/wallet_view/transaction_views/tx_v2/all_transactions_v2_view.dart
new file mode 100644
index 000000000..1c5f2b361
--- /dev/null
+++ b/lib/pages/wallet_view/transaction_views/tx_v2/all_transactions_v2_view.dart
@@ -0,0 +1,1022 @@
+/* 
+ * This file is part of Stack Wallet.
+ * 
+ * Copyright (c) 2023 Cypher Stack
+ * All Rights Reserved.
+ * The code is distributed under GPLv3 license, see LICENSE file for details.
+ * Generated by Cypher Stack on 2023-05-26
+ *
+ */
+
+import 'dart:async';
+
+import 'package:flutter/material.dart';
+import 'package:flutter_riverpod/flutter_riverpod.dart';
+import 'package:flutter_svg/svg.dart';
+import 'package:isar/isar.dart';
+import 'package:stackwallet/models/isar/models/blockchain_data/transaction.dart';
+import 'package:stackwallet/models/isar/models/blockchain_data/v2/transaction_v2.dart';
+import 'package:stackwallet/models/isar/models/contact_entry.dart';
+import 'package:stackwallet/models/transaction_filter.dart';
+import 'package:stackwallet/pages/wallet_view/sub_widgets/tx_icon.dart';
+import 'package:stackwallet/pages/wallet_view/transaction_views/transaction_search_filter_view.dart';
+import 'package:stackwallet/pages/wallet_view/transaction_views/tx_v2/transaction_v2_card.dart';
+import 'package:stackwallet/pages/wallet_view/transaction_views/tx_v2/transaction_v2_details_view.dart';
+import 'package:stackwallet/providers/db/main_db_provider.dart';
+import 'package:stackwallet/providers/global/address_book_service_provider.dart';
+import 'package:stackwallet/providers/providers.dart';
+import 'package:stackwallet/providers/ui/transaction_filter_provider.dart';
+import 'package:stackwallet/themes/stack_colors.dart';
+import 'package:stackwallet/utilities/amount/amount.dart';
+import 'package:stackwallet/utilities/amount/amount_formatter.dart';
+import 'package:stackwallet/utilities/assets.dart';
+import 'package:stackwallet/utilities/constants.dart';
+import 'package:stackwallet/utilities/enums/coin_enum.dart';
+import 'package:stackwallet/utilities/format.dart';
+import 'package:stackwallet/utilities/text_styles.dart';
+import 'package:stackwallet/utilities/util.dart';
+import 'package:stackwallet/widgets/conditional_parent.dart';
+import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart';
+import 'package:stackwallet/widgets/desktop/desktop_app_bar.dart';
+import 'package:stackwallet/widgets/desktop/desktop_dialog.dart';
+import 'package:stackwallet/widgets/desktop/desktop_scaffold.dart';
+import 'package:stackwallet/widgets/desktop/secondary_button.dart';
+import 'package:stackwallet/widgets/icon_widgets/x_icon.dart';
+import 'package:stackwallet/widgets/loading_indicator.dart';
+import 'package:stackwallet/widgets/rounded_white_container.dart';
+import 'package:stackwallet/widgets/stack_text_field.dart';
+import 'package:stackwallet/widgets/textfield_icon_button.dart';
+
+typedef _GroupedTransactions = ({
+  String label,
+  DateTime startDate,
+  List<TransactionV2> transactions
+});
+
+class AllTransactionsV2View extends ConsumerStatefulWidget {
+  const AllTransactionsV2View({
+    Key? key,
+    required this.walletId,
+  }) : super(key: key);
+
+  static const String routeName = "/allTransactionsV2";
+
+  final String walletId;
+
+  @override
+  ConsumerState<AllTransactionsV2View> createState() =>
+      _AllTransactionsV2ViewState();
+}
+
+class _AllTransactionsV2ViewState extends ConsumerState<AllTransactionsV2View> {
+  late final String walletId;
+
+  late final TextEditingController _searchController;
+  final searchFieldFocusNode = FocusNode();
+
+  @override
+  void initState() {
+    walletId = widget.walletId;
+    _searchController = TextEditingController();
+
+    super.initState();
+  }
+
+  @override
+  void dispose() {
+    _searchController.dispose();
+    searchFieldFocusNode.dispose();
+    super.dispose();
+  }
+
+  // TODO: optimise search+filter
+  List<TransactionV2> filter(
+      {required List<TransactionV2> transactions, TransactionFilter? filter}) {
+    if (filter == null) {
+      return transactions;
+    }
+
+    //todo: check if print needed
+    // debugPrint("FILTER: $filter");
+
+    final contacts = ref.read(addressBookServiceProvider).contacts;
+    final notes =
+        ref.read(notesServiceChangeNotifierProvider(walletId)).notesSync;
+
+    return transactions.where((tx) {
+      if (!filter.sent && !filter.received) {
+        return false;
+      }
+
+      if (filter.received &&
+          !filter.sent &&
+          tx.type == TransactionType.outgoing) {
+        return false;
+      }
+
+      if (filter.sent &&
+          !filter.received &&
+          tx.type == TransactionType.incoming) {
+        return false;
+      }
+
+      final date = DateTime.fromMillisecondsSinceEpoch(tx.timestamp * 1000);
+      if ((filter.to != null &&
+              date.millisecondsSinceEpoch >
+                  filter.to!.millisecondsSinceEpoch) ||
+          (filter.from != null &&
+              date.millisecondsSinceEpoch <
+                  filter.from!.millisecondsSinceEpoch)) {
+        return false;
+      }
+
+      return _isKeywordMatch(tx, filter.keyword.toLowerCase(), contacts, notes);
+    }).toList();
+  }
+
+  bool _isKeywordMatch(
+    TransactionV2 tx,
+    String keyword,
+    List<ContactEntry> contacts,
+    Map<String, String> notes,
+  ) {
+    if (keyword.isEmpty) {
+      return true;
+    }
+
+    bool contains = false;
+
+    // check if address book name contains
+    contains |= contacts
+        .where((e) =>
+            e.addresses
+                .map((e) => e.address)
+                .toSet()
+                .intersection(tx.associatedAddresses())
+                .isNotEmpty &&
+            e.name.toLowerCase().contains(keyword))
+        .isNotEmpty;
+
+    // check if address contains
+    contains |= tx
+        .associatedAddresses()
+        .where((e) => e.toLowerCase().contains(keyword))
+        .isNotEmpty;
+
+    // check if note contains
+    contains |= notes[tx.txid] != null &&
+        notes[tx.txid]!.toLowerCase().contains(keyword);
+
+    // check if txid contains
+    contains |= tx.txid.toLowerCase().contains(keyword);
+
+    // check if subType contains
+    contains |= tx.subType.name.toLowerCase().contains(keyword);
+
+    // check if txType contains
+    contains |= tx.type.name.toLowerCase().contains(keyword);
+
+    // check if date contains
+    contains |=
+        Format.extractDateFrom(tx.timestamp).toLowerCase().contains(keyword);
+
+    return contains;
+  }
+
+  String _searchString = "";
+
+  // TODO search more tx fields
+  List<TransactionV2> search(String text, List<TransactionV2> transactions) {
+    if (text.isEmpty) {
+      return transactions;
+    }
+    text = text.toLowerCase();
+    final contacts = ref.read(addressBookServiceProvider).contacts;
+    final notes =
+        ref.read(notesServiceChangeNotifierProvider(walletId)).notesSync;
+
+    return transactions
+        .where((tx) => _isKeywordMatch(tx, text, contacts, notes))
+        .toList();
+  }
+
+  List<_GroupedTransactions> groupTransactionsByMonth(
+    List<TransactionV2> transactions,
+  ) {
+    Map<String, _GroupedTransactions> map = {};
+
+    for (var tx in transactions) {
+      final date = DateTime.fromMillisecondsSinceEpoch(tx.timestamp * 1000);
+      final monthYear = "${Constants.monthMap[date.month]} ${date.year}";
+      if (map[monthYear] == null) {
+        map[monthYear] =
+            (label: monthYear, startDate: date, transactions: [tx]);
+      } else {
+        map[monthYear]!.transactions.add(tx);
+      }
+    }
+
+    return map.values.toList()
+      ..sort((a, b) => b.startDate.compareTo(a.startDate));
+  }
+
+  @override
+  Widget build(BuildContext context) {
+    final isDesktop = Util.isDesktop;
+
+    return MasterScaffold(
+      background: Theme.of(context).extension<StackColors>()!.background,
+      isDesktop: isDesktop,
+      appBar: isDesktop
+          ? DesktopAppBar(
+              isCompactHeight: true,
+              background: Theme.of(context).extension<StackColors>()!.popupBG,
+              leading: Row(
+                children: [
+                  const SizedBox(
+                    width: 32,
+                  ),
+                  AppBarIconButton(
+                    size: 32,
+                    color: Theme.of(context)
+                        .extension<StackColors>()!
+                        .textFieldDefaultBG,
+                    shadows: const [],
+                    icon: SvgPicture.asset(
+                      Assets.svg.arrowLeft,
+                      width: 18,
+                      height: 18,
+                      color: Theme.of(context)
+                          .extension<StackColors>()!
+                          .topNavIconPrimary,
+                    ),
+                    onPressed: Navigator.of(context).pop,
+                  ),
+                  const SizedBox(
+                    width: 12,
+                  ),
+                  Text(
+                    "Transactions",
+                    style: STextStyles.desktopH3(context),
+                  ),
+                ],
+              ),
+            )
+          : AppBar(
+              backgroundColor:
+                  Theme.of(context).extension<StackColors>()!.background,
+              leading: AppBarBackButton(
+                onPressed: () async {
+                  if (FocusScope.of(context).hasFocus) {
+                    FocusScope.of(context).unfocus();
+                    await Future<void>.delayed(
+                        const Duration(milliseconds: 75));
+                  }
+                  if (mounted) {
+                    Navigator.of(context).pop();
+                  }
+                },
+              ),
+              title: Text(
+                "Transactions",
+                style: STextStyles.navBarTitle(context),
+              ),
+              actions: [
+                Padding(
+                  padding: const EdgeInsets.only(
+                    top: 10,
+                    bottom: 10,
+                    right: 20,
+                  ),
+                  child: AspectRatio(
+                    aspectRatio: 1,
+                    child: AppBarIconButton(
+                      key: const Key("transactionSearchFilterViewButton"),
+                      size: 36,
+                      shadows: const [],
+                      color: Theme.of(context)
+                          .extension<StackColors>()!
+                          .background,
+                      icon: SvgPicture.asset(
+                        Assets.svg.filter,
+                        color: Theme.of(context)
+                            .extension<StackColors>()!
+                            .accentColorDark,
+                        width: 20,
+                        height: 20,
+                      ),
+                      onPressed: () {
+                        Navigator.of(context).pushNamed(
+                          TransactionSearchFilterView.routeName,
+                          arguments: ref
+                              .read(walletsChangeNotifierProvider)
+                              .getManager(walletId)
+                              .coin,
+                        );
+                      },
+                    ),
+                  ),
+                ),
+              ],
+            ),
+      body: Padding(
+        padding: EdgeInsets.only(
+          left: isDesktop ? 20 : 12,
+          top: isDesktop ? 20 : 12,
+          right: isDesktop ? 20 : 12,
+        ),
+        child: Column(
+          children: [
+            Padding(
+              padding: const EdgeInsets.all(4),
+              child: Row(
+                children: [
+                  ConditionalParent(
+                    condition: isDesktop,
+                    builder: (child) => SizedBox(
+                      width: 570,
+                      child: child,
+                    ),
+                    child: ConditionalParent(
+                      condition: !isDesktop,
+                      builder: (child) => Expanded(
+                        child: child,
+                      ),
+                      child: ClipRRect(
+                        borderRadius: BorderRadius.circular(
+                          Constants.size.circularBorderRadius,
+                        ),
+                        child: TextField(
+                          autocorrect: !isDesktop,
+                          enableSuggestions: !isDesktop,
+                          controller: _searchController,
+                          focusNode: searchFieldFocusNode,
+                          onChanged: (value) {
+                            setState(() {
+                              _searchString = value;
+                            });
+                          },
+                          style: isDesktop
+                              ? STextStyles.desktopTextExtraSmall(context)
+                                  .copyWith(
+                                  color: Theme.of(context)
+                                      .extension<StackColors>()!
+                                      .textFieldActiveText,
+                                  height: 1.8,
+                                )
+                              : STextStyles.field(context),
+                          decoration: standardInputDecoration(
+                            "Search...",
+                            searchFieldFocusNode,
+                            context,
+                            desktopMed: isDesktop,
+                          ).copyWith(
+                            prefixIcon: Padding(
+                              padding: EdgeInsets.symmetric(
+                                horizontal: isDesktop ? 12 : 10,
+                                vertical: isDesktop ? 18 : 16,
+                              ),
+                              child: SvgPicture.asset(
+                                Assets.svg.search,
+                                width: isDesktop ? 20 : 16,
+                                height: isDesktop ? 20 : 16,
+                              ),
+                            ),
+                            suffixIcon: _searchController.text.isNotEmpty
+                                ? Padding(
+                                    padding: const EdgeInsets.only(right: 0),
+                                    child: UnconstrainedBox(
+                                      child: Row(
+                                        children: [
+                                          TextFieldIconButton(
+                                            child: const XIcon(),
+                                            onTap: () async {
+                                              setState(() {
+                                                _searchController.text = "";
+                                                _searchString = "";
+                                              });
+                                            },
+                                          ),
+                                        ],
+                                      ),
+                                    ),
+                                  )
+                                : null,
+                          ),
+                        ),
+                      ),
+                    ),
+                  ),
+                  if (isDesktop)
+                    const SizedBox(
+                      width: 20,
+                    ),
+                  if (isDesktop)
+                    SecondaryButton(
+                      buttonHeight: ButtonHeight.l,
+                      width: 200,
+                      label: "Filter",
+                      icon: SvgPicture.asset(
+                        Assets.svg.filter,
+                        color: Theme.of(context)
+                            .extension<StackColors>()!
+                            .accentColorDark,
+                        width: 20,
+                        height: 20,
+                      ),
+                      onPressed: () {
+                        final coin = ref
+                            .read(walletsChangeNotifierProvider)
+                            .getManager(walletId)
+                            .coin;
+                        if (isDesktop) {
+                          showDialog<void>(
+                            context: context,
+                            builder: (context) {
+                              return TransactionSearchFilterView(
+                                coin: coin,
+                              );
+                            },
+                          );
+                        } else {
+                          Navigator.of(context).pushNamed(
+                            TransactionSearchFilterView.routeName,
+                            arguments: coin,
+                          );
+                        }
+                      },
+                    ),
+                ],
+              ),
+            ),
+            if (isDesktop)
+              const SizedBox(
+                height: 8,
+              ),
+            if (isDesktop &&
+                ref.watch(transactionFilterProvider.state).state != null)
+              const Padding(
+                padding: EdgeInsets.symmetric(
+                  vertical: 8,
+                ),
+                child: Row(
+                  children: [
+                    TransactionFilterOptionBar(),
+                  ],
+                ),
+              ),
+            const SizedBox(
+              height: 8,
+            ),
+            Expanded(
+              child: Consumer(
+                builder: (_, ref, __) {
+                  final managerProvider = ref.watch(
+                      walletsChangeNotifierProvider.select(
+                          (value) => value.getManagerProvider(walletId)));
+
+                  final criteria =
+                      ref.watch(transactionFilterProvider.state).state;
+
+                  //todo: check if print needed
+                  // debugPrint("Consumer build called");
+
+                  return FutureBuilder(
+                    future: ref
+                        .watch(mainDBProvider)
+                        .isar
+                        .transactionV2s
+                        .where()
+                        .walletIdEqualTo(walletId)
+                        .sortByTimestampDesc()
+                        .findAll(),
+                    builder: (_, AsyncSnapshot<List<TransactionV2>> snapshot) {
+                      if (snapshot.connectionState == ConnectionState.done &&
+                          snapshot.hasData) {
+                        final filtered = filter(
+                            transactions: snapshot.data!, filter: criteria);
+
+                        final searched = search(_searchString, filtered);
+
+                        final monthlyList = groupTransactionsByMonth(searched);
+                        return ListView.builder(
+                          primary: isDesktop ? false : null,
+                          itemCount: monthlyList.length,
+                          itemBuilder: (_, index) {
+                            final month = monthlyList[index];
+                            return Padding(
+                              padding: const EdgeInsets.all(4),
+                              child: Column(
+                                crossAxisAlignment: CrossAxisAlignment.start,
+                                children: [
+                                  if (index != 0)
+                                    const SizedBox(
+                                      height: 12,
+                                    ),
+                                  Text(
+                                    month.label,
+                                    style: STextStyles.smallMed12(context),
+                                  ),
+                                  const SizedBox(
+                                    height: 12,
+                                  ),
+                                  if (isDesktop)
+                                    RoundedWhiteContainer(
+                                      padding: const EdgeInsets.all(0),
+                                      child: ListView.separated(
+                                        shrinkWrap: true,
+                                        primary: false,
+                                        separatorBuilder: (context, _) =>
+                                            Container(
+                                          height: 1,
+                                          color: Theme.of(context)
+                                              .extension<StackColors>()!
+                                              .background,
+                                        ),
+                                        itemCount: month.transactions.length,
+                                        itemBuilder: (context, index) =>
+                                            Padding(
+                                          padding: const EdgeInsets.all(4),
+                                          child: DesktopTransactionCardRow(
+                                            key: Key(
+                                                "transactionCard_key_${month.transactions[index].txid}"),
+                                            transaction:
+                                                month.transactions[index],
+                                            walletId: walletId,
+                                          ),
+                                        ),
+                                      ),
+                                    ),
+                                  if (!isDesktop)
+                                    RoundedWhiteContainer(
+                                      padding: const EdgeInsets.all(0),
+                                      child: Column(
+                                        children: [
+                                          ...month.transactions.map(
+                                            (tx) => TransactionCardV2(
+                                              key: Key(
+                                                  "transactionCard_key_${tx.txid}"),
+                                              transaction: tx,
+                                            ),
+                                          ),
+                                        ],
+                                      ),
+                                    ),
+                                ],
+                              ),
+                            );
+                          },
+                        );
+                      } else {
+                        // TODO: proper loading indicator
+                        return const LoadingIndicator();
+                      }
+                    },
+                  );
+                },
+              ),
+            ),
+          ],
+        ),
+      ),
+    );
+  }
+}
+
+class TransactionFilterOptionBar extends ConsumerStatefulWidget {
+  const TransactionFilterOptionBar({Key? key}) : super(key: key);
+
+  @override
+  ConsumerState<TransactionFilterOptionBar> createState() =>
+      _TransactionFilterOptionBarState();
+}
+
+class _TransactionFilterOptionBarState
+    extends ConsumerState<TransactionFilterOptionBar> {
+  final List<TransactionFilterOptionBarItem> items = [];
+  TransactionFilter? _filter;
+
+  @override
+  void initState() {
+    _filter = ref.read(transactionFilterProvider.state).state;
+
+    if (_filter != null) {
+      if (_filter!.sent) {
+        const label = "Sent";
+        final item = TransactionFilterOptionBarItem(
+          label: label,
+          onPressed: (s) {
+            items.removeWhere((e) => e.label == label);
+            if (items.isEmpty) {
+              ref.read(transactionFilterProvider.state).state = null;
+            } else {
+              ref.read(transactionFilterProvider.state).state =
+                  ref.read(transactionFilterProvider.state).state?.copyWith(
+                        sent: false,
+                      );
+              setState(() {});
+            }
+          },
+        );
+        items.add(item);
+      }
+      if (_filter!.received) {
+        const label = ("Received");
+        final item = TransactionFilterOptionBarItem(
+          label: label,
+          onPressed: (s) {
+            items.removeWhere((e) => e.label == label);
+            if (items.isEmpty) {
+              ref.read(transactionFilterProvider.state).state = null;
+            } else {
+              ref.read(transactionFilterProvider.state).state =
+                  ref.read(transactionFilterProvider.state).state?.copyWith(
+                        received: false,
+                      );
+              setState(() {});
+            }
+          },
+        );
+        items.add(item);
+      }
+
+      if (_filter!.to != null) {
+        final label = _filter!.from.toString();
+        final item = TransactionFilterOptionBarItem(
+          label: label,
+          onPressed: (s) {
+            items.removeWhere((e) => e.label == label);
+            if (items.isEmpty) {
+              ref.read(transactionFilterProvider.state).state = null;
+            } else {
+              ref.read(transactionFilterProvider.state).state =
+                  ref.read(transactionFilterProvider.state).state?.copyWith(
+                        to: null,
+                      );
+              setState(() {});
+            }
+          },
+        );
+        items.add(item);
+      }
+      if (_filter!.from != null) {
+        final label2 = _filter!.to.toString();
+        final item2 = TransactionFilterOptionBarItem(
+          label: label2,
+          onPressed: (s) {
+            items.removeWhere((e) => e.label == label2);
+            if (items.isEmpty) {
+              ref.read(transactionFilterProvider.state).state = null;
+            } else {
+              ref.read(transactionFilterProvider.state).state =
+                  ref.read(transactionFilterProvider.state).state?.copyWith(
+                        from: null,
+                      );
+              setState(() {});
+            }
+          },
+        );
+        items.add(item2);
+      }
+
+      if (_filter!.amount != null) {
+        final label = _filter!.amount!.toString();
+        final item = TransactionFilterOptionBarItem(
+          label: label,
+          onPressed: (s) {
+            items.removeWhere((e) => e.label == label);
+            if (items.isEmpty) {
+              ref.read(transactionFilterProvider.state).state = null;
+            } else {
+              ref.read(transactionFilterProvider.state).state =
+                  ref.read(transactionFilterProvider.state).state?.copyWith(
+                        amount: null,
+                      );
+              setState(() {});
+            }
+          },
+        );
+        items.add(item);
+      }
+      if (_filter!.keyword.isNotEmpty) {
+        final label = _filter!.keyword;
+        final item = TransactionFilterOptionBarItem(
+          label: label,
+          onPressed: (s) {
+            items.removeWhere((e) => e.label == label);
+            if (items.isEmpty) {
+              ref.read(transactionFilterProvider.state).state = null;
+            } else {
+              ref.read(transactionFilterProvider.state).state =
+                  ref.read(transactionFilterProvider.state).state?.copyWith(
+                        keyword: "",
+                      );
+              setState(() {});
+            }
+          },
+        );
+        items.add(item);
+      }
+    }
+
+    super.initState();
+  }
+
+  @override
+  Widget build(BuildContext context) {
+    return SizedBox(
+      height: 32,
+      child: ListView.separated(
+        primary: false,
+        scrollDirection: Axis.horizontal,
+        shrinkWrap: true,
+        itemCount: items.length,
+        separatorBuilder: (_, __) => const SizedBox(
+          width: 16,
+        ),
+        itemBuilder: (context, index) => items[index],
+      ),
+    );
+  }
+}
+
+class TransactionFilterOptionBarItem extends StatelessWidget {
+  const TransactionFilterOptionBarItem({
+    Key? key,
+    required this.label,
+    this.onPressed,
+  }) : super(key: key);
+
+  final String label;
+  final void Function(String)? onPressed;
+
+  @override
+  Widget build(BuildContext context) {
+    return GestureDetector(
+      onTap: () => onPressed?.call(label),
+      child: Container(
+        height: 32,
+        decoration: BoxDecoration(
+            color:
+                Theme.of(context).extension<StackColors>()!.buttonBackSecondary,
+            borderRadius: BorderRadius.circular(1000)),
+        child: Padding(
+          padding: const EdgeInsets.symmetric(
+            horizontal: 14,
+          ),
+          child: Row(
+            mainAxisAlignment: MainAxisAlignment.center,
+            crossAxisAlignment: CrossAxisAlignment.stretch,
+            children: [
+              Center(
+                child: Padding(
+                  padding: const EdgeInsets.only(top: 2),
+                  child: Text(
+                    label,
+                    textAlign: TextAlign.center,
+                    style: STextStyles.labelExtraExtraSmall(context).copyWith(
+                      color:
+                          Theme.of(context).extension<StackColors>()!.textDark,
+                    ),
+                  ),
+                ),
+              ),
+              const SizedBox(
+                width: 10,
+              ),
+              XIcon(
+                width: 16,
+                height: 16,
+                color: Theme.of(context).extension<StackColors>()!.textDark,
+              ),
+            ],
+          ),
+        ),
+      ),
+    );
+  }
+}
+
+class DesktopTransactionCardRow extends ConsumerStatefulWidget {
+  const DesktopTransactionCardRow({
+    Key? key,
+    required this.transaction,
+    required this.walletId,
+  }) : super(key: key);
+
+  final TransactionV2 transaction;
+  final String walletId;
+
+  @override
+  ConsumerState<DesktopTransactionCardRow> createState() =>
+      _DesktopTransactionCardRowState();
+}
+
+class _DesktopTransactionCardRowState
+    extends ConsumerState<DesktopTransactionCardRow> {
+  late final TransactionV2 _transaction;
+  late final String walletId;
+
+  String whatIsIt(TransactionType type, Coin coin, int height) {
+    if (_transaction.subType == TransactionSubType.mint ||
+        _transaction.subType == TransactionSubType.cashFusion) {
+      if (_transaction.isConfirmed(height, coin.requiredConfirmations)) {
+        return "Anonymized";
+      } else {
+        return "Anonymizing";
+      }
+    }
+
+    if (type == TransactionType.incoming) {
+      if (_transaction.isConfirmed(height, coin.requiredConfirmations)) {
+        return "Received";
+      } else {
+        return "Receiving";
+      }
+    } else if (type == TransactionType.outgoing) {
+      if (_transaction.isConfirmed(height, coin.requiredConfirmations)) {
+        return "Sent";
+      } else {
+        return "Sending";
+      }
+    } else if (type == TransactionType.sentToSelf) {
+      return "Sent to self";
+    } else {
+      return type.name;
+    }
+  }
+
+  @override
+  void initState() {
+    walletId = widget.walletId;
+    _transaction = widget.transaction;
+    super.initState();
+  }
+
+  @override
+  Widget build(BuildContext context) {
+    final locale = ref.watch(
+        localeServiceChangeNotifierProvider.select((value) => value.locale));
+    final manager = ref.watch(walletsChangeNotifierProvider
+        .select((value) => value.getManager(walletId)));
+
+    final baseCurrency = ref
+        .watch(prefsChangeNotifierProvider.select((value) => value.currency));
+
+    final coin = manager.coin;
+
+    final price = ref
+        .watch(priceAnd24hChangeNotifierProvider
+            .select((value) => value.getPrice(coin)))
+        .item1;
+
+    late final String prefix;
+    if (Util.isDesktop) {
+      if (_transaction.type == TransactionType.outgoing) {
+        prefix = "-";
+      } else if (_transaction.type == TransactionType.incoming) {
+        prefix = "+";
+      } else {
+        prefix = "";
+      }
+    } else {
+      prefix = "";
+    }
+
+    final currentHeight = ref.watch(walletsChangeNotifierProvider
+        .select((value) => value.getManager(walletId).currentHeight));
+
+    final Amount amount;
+
+    if (_transaction.subType == TransactionSubType.cashFusion) {
+      amount = _transaction.getAmountReceivedThisWallet(coin: coin);
+    } else {
+      switch (_transaction.type) {
+        case TransactionType.outgoing:
+          amount = _transaction.getAmountSentFromThisWallet(coin: coin);
+          break;
+
+        case TransactionType.incoming:
+        case TransactionType.sentToSelf:
+          amount = _transaction.getAmountReceivedThisWallet(coin: coin);
+          break;
+
+        case TransactionType.unknown:
+          amount = _transaction.getAmountSentFromThisWallet(coin: coin);
+          break;
+      }
+    }
+
+    return Material(
+      color: Theme.of(context).extension<StackColors>()!.popupBG,
+      elevation: 0,
+      shape: RoundedRectangleBorder(
+        borderRadius:
+            BorderRadius.circular(Constants.size.circularBorderRadius),
+      ),
+      child: RawMaterialButton(
+        shape: RoundedRectangleBorder(
+          borderRadius: BorderRadius.circular(
+            Constants.size.circularBorderRadius,
+          ),
+        ),
+        onPressed: () async {
+          if (Util.isDesktop) {
+            await showDialog<void>(
+              context: context,
+              builder: (context) => DesktopDialog(
+                maxHeight: MediaQuery.of(context).size.height - 64,
+                maxWidth: 580,
+                child: TransactionV2DetailsView(
+                  transaction: _transaction,
+                  coin: coin,
+                  walletId: walletId,
+                ),
+              ),
+            );
+          } else {
+            unawaited(
+              Navigator.of(context).pushNamed(
+                TransactionV2DetailsView.routeName,
+                arguments: (
+                  tx: _transaction,
+                  coin: coin,
+                  walletId: walletId,
+                ),
+              ),
+            );
+          }
+        },
+        child: Padding(
+          padding: const EdgeInsets.symmetric(
+            vertical: 10,
+            horizontal: 16,
+          ),
+          child: Row(
+            children: [
+              TxIcon(
+                transaction: _transaction,
+                currentHeight: currentHeight,
+                coin: coin,
+              ),
+              const SizedBox(
+                width: 12,
+              ),
+              Expanded(
+                flex: 3,
+                child: Text(
+                  whatIsIt(
+                    _transaction.type,
+                    coin,
+                    currentHeight,
+                  ),
+                  style:
+                      STextStyles.desktopTextExtraExtraSmall(context).copyWith(
+                    color: Theme.of(context).extension<StackColors>()!.textDark,
+                  ),
+                ),
+              ),
+              Expanded(
+                flex: 4,
+                child: Text(
+                  Format.extractDateFrom(_transaction.timestamp),
+                  style: STextStyles.label(context),
+                ),
+              ),
+              Expanded(
+                flex: 6,
+                child: Text(
+                  "$prefix${ref.watch(pAmountFormatter(coin)).format(amount)}",
+                  style:
+                      STextStyles.desktopTextExtraExtraSmall(context).copyWith(
+                    color: Theme.of(context).extension<StackColors>()!.textDark,
+                  ),
+                ),
+              ),
+              if (ref.watch(prefsChangeNotifierProvider
+                  .select((value) => value.externalCalls)))
+                Expanded(
+                  flex: 4,
+                  child: Text(
+                    "$prefix${(amount.decimal * price).toAmount(
+                          fractionDigits: 2,
+                        ).fiatString(
+                          locale: locale,
+                        )} $baseCurrency",
+                    style: STextStyles.desktopTextExtraExtraSmall(context),
+                  ),
+                ),
+              SvgPicture.asset(
+                Assets.svg.circleInfo,
+                width: 20,
+                height: 20,
+                color:
+                    Theme.of(context).extension<StackColors>()!.textSubtitle2,
+              ),
+            ],
+          ),
+        ),
+      ),
+    );
+  }
+}
diff --git a/lib/pages/wallet_view/transaction_views/tx_v2/fusion_group_details_view.dart b/lib/pages/wallet_view/transaction_views/tx_v2/fusion_group_details_view.dart
new file mode 100644
index 000000000..874d1fdba
--- /dev/null
+++ b/lib/pages/wallet_view/transaction_views/tx_v2/fusion_group_details_view.dart
@@ -0,0 +1,196 @@
+/* 
+ * This file is part of Stack Wallet.
+ * 
+ * Copyright (c) 2023 Cypher Stack
+ * All Rights Reserved.
+ * The code is distributed under GPLv3 license, see LICENSE file for details.
+ * Generated by Cypher Stack on 2023-05-26
+ *
+ */
+
+import 'package:flutter/material.dart';
+import 'package:flutter_riverpod/flutter_riverpod.dart';
+import 'package:stackwallet/models/isar/models/blockchain_data/v2/transaction_v2.dart';
+import 'package:stackwallet/pages/wallet_view/transaction_views/tx_v2/transaction_v2_list_item.dart';
+import 'package:stackwallet/themes/stack_colors.dart';
+import 'package:stackwallet/utilities/constants.dart';
+import 'package:stackwallet/utilities/enums/coin_enum.dart';
+import 'package:stackwallet/utilities/text_styles.dart';
+import 'package:stackwallet/utilities/util.dart';
+import 'package:stackwallet/widgets/background.dart';
+import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart';
+import 'package:stackwallet/widgets/desktop/desktop_dialog_close_button.dart';
+import 'package:stackwallet/widgets/rounded_white_container.dart';
+
+class FusionGroupDetailsView extends ConsumerStatefulWidget {
+  const FusionGroupDetailsView({
+    Key? key,
+    required this.transactions,
+    required this.walletId,
+    required this.coin,
+  }) : super(key: key);
+
+  static const String routeName = "/fusionGroupDetailsView";
+
+  final List<TransactionV2> transactions;
+  final String walletId;
+  final Coin coin;
+
+  @override
+  ConsumerState<FusionGroupDetailsView> createState() =>
+      _FusionGroupDetailsViewState();
+}
+
+class _FusionGroupDetailsViewState
+    extends ConsumerState<FusionGroupDetailsView> {
+  late final bool isDesktop;
+  late final String walletId;
+
+  BorderRadius get _borderRadiusFirst {
+    return BorderRadius.only(
+      topLeft: Radius.circular(
+        Constants.size.circularBorderRadius,
+      ),
+      topRight: Radius.circular(
+        Constants.size.circularBorderRadius,
+      ),
+    );
+  }
+
+  BorderRadius get _borderRadiusLast {
+    return BorderRadius.only(
+      bottomLeft: Radius.circular(
+        Constants.size.circularBorderRadius,
+      ),
+      bottomRight: Radius.circular(
+        Constants.size.circularBorderRadius,
+      ),
+    );
+  }
+
+  @override
+  void initState() {
+    isDesktop = Util.isDesktop;
+    walletId = widget.walletId;
+
+    super.initState();
+  }
+
+  @override
+  Widget build(BuildContext context) {
+    if (isDesktop) {
+      return Material(
+        color: Colors.transparent,
+        child: Padding(
+          padding: const EdgeInsets.only(left: 32),
+          child: Column(
+            children: [
+              Row(
+                mainAxisAlignment: MainAxisAlignment.spaceBetween,
+                children: [
+                  Text(
+                    "Fusion transactions",
+                    style: STextStyles.desktopH3(context),
+                  ),
+                  const DesktopDialogCloseButton(),
+                ],
+              ),
+              Flexible(
+                child: Padding(
+                  padding: const EdgeInsets.only(
+                    right: 32,
+                    bottom: 32,
+                  ),
+                  child: RoundedWhiteContainer(
+                    borderColor: isDesktop
+                        ? Theme.of(context)
+                            .extension<StackColors>()!
+                            .backgroundAppBar
+                        : null,
+                    padding: const EdgeInsets.all(0),
+                    child: ListView.separated(
+                      shrinkWrap: true,
+                      itemBuilder: (context, index) {
+                        BorderRadius? radius;
+                        if (widget.transactions.length == 1) {
+                          radius = BorderRadius.circular(
+                            Constants.size.circularBorderRadius,
+                          );
+                        } else if (index == widget.transactions.length - 1) {
+                          radius = _borderRadiusLast;
+                        } else if (index == 0) {
+                          radius = _borderRadiusFirst;
+                        }
+                        final tx = widget.transactions[index];
+                        return TxListItem(
+                          tx: tx,
+                          coin: widget.coin,
+                          radius: radius,
+                        );
+                      },
+                      separatorBuilder: (context, index) {
+                        return Container(
+                          width: double.infinity,
+                          height: 1.2,
+                          color: Theme.of(context)
+                              .extension<StackColors>()!
+                              .background,
+                        );
+                      },
+                      itemCount: widget.transactions.length,
+                    ),
+                  ),
+                ),
+              ),
+            ],
+          ),
+        ),
+      );
+    } else {
+      return Background(
+        child: Scaffold(
+          backgroundColor:
+              Theme.of(context).extension<StackColors>()!.background,
+          appBar: AppBar(
+            backgroundColor:
+                Theme.of(context).extension<StackColors>()!.background,
+            leading: AppBarBackButton(
+              onPressed: () async {
+                Navigator.of(context).pop();
+              },
+            ),
+            title: Text(
+              "Fusion transactions",
+              style: STextStyles.navBarTitle(context),
+            ),
+          ),
+          body: Padding(
+            padding: const EdgeInsets.all(16),
+            child: ListView.builder(
+              itemCount: widget.transactions.length,
+              itemBuilder: (context, index) {
+                BorderRadius? radius;
+                if (widget.transactions.length == 1) {
+                  radius = BorderRadius.circular(
+                    Constants.size.circularBorderRadius,
+                  );
+                } else if (index == widget.transactions.length - 1) {
+                  radius = _borderRadiusLast;
+                } else if (index == 0) {
+                  radius = _borderRadiusFirst;
+                }
+                final tx = widget.transactions[index];
+
+                return TxListItem(
+                  tx: tx,
+                  coin: widget.coin,
+                  radius: radius,
+                );
+              },
+            ),
+          ),
+        ),
+      );
+    }
+  }
+}
diff --git a/lib/pages/wallet_view/transaction_views/tx_v2/fusion_tx_group_card.dart b/lib/pages/wallet_view/transaction_views/tx_v2/fusion_tx_group_card.dart
new file mode 100644
index 000000000..aad00fa1e
--- /dev/null
+++ b/lib/pages/wallet_view/transaction_views/tx_v2/fusion_tx_group_card.dart
@@ -0,0 +1,179 @@
+import 'dart:async';
+
+import 'package:flutter/material.dart';
+import 'package:flutter_riverpod/flutter_riverpod.dart';
+import 'package:stackwallet/models/isar/models/blockchain_data/v2/transaction_v2.dart';
+import 'package:stackwallet/pages/wallet_view/sub_widgets/tx_icon.dart';
+import 'package:stackwallet/pages/wallet_view/transaction_views/tx_v2/fusion_group_details_view.dart';
+import 'package:stackwallet/providers/providers.dart';
+import 'package:stackwallet/themes/stack_colors.dart';
+import 'package:stackwallet/utilities/constants.dart';
+import 'package:stackwallet/utilities/format.dart';
+import 'package:stackwallet/utilities/text_styles.dart';
+import 'package:stackwallet/utilities/util.dart';
+import 'package:stackwallet/widgets/desktop/desktop_dialog.dart';
+
+class FusionTxGroup {
+  final List<TransactionV2> transactions;
+  FusionTxGroup(this.transactions);
+}
+
+class FusionTxGroupCard extends ConsumerWidget {
+  const FusionTxGroupCard({super.key, required this.group});
+
+  final FusionTxGroup group;
+
+  @override
+  Widget build(BuildContext context, WidgetRef ref) {
+    final walletId = group.transactions.first.walletId;
+
+    final coin = ref.watch(walletsChangeNotifierProvider
+        .select((value) => value.getManager(walletId).coin));
+
+    final currentHeight = ref.watch(walletsChangeNotifierProvider
+        .select((value) => value.getManager(walletId).currentHeight));
+
+    return Material(
+      color: Theme.of(context).extension<StackColors>()!.popupBG,
+      elevation: 0,
+      shape: RoundedRectangleBorder(
+        borderRadius:
+            BorderRadius.circular(Constants.size.circularBorderRadius),
+      ),
+      child: Padding(
+        padding: const EdgeInsets.all(6),
+        child: RawMaterialButton(
+          shape: RoundedRectangleBorder(
+            borderRadius: BorderRadius.circular(
+              Constants.size.circularBorderRadius,
+            ),
+          ),
+          onPressed: () async {
+            if (Util.isDesktop) {
+              await showDialog<void>(
+                context: context,
+                builder: (context) => DesktopDialog(
+                  maxWidth: 580,
+                  child: FusionGroupDetailsView(
+                    transactions: group.transactions,
+                    coin: coin,
+                    walletId: walletId,
+                  ),
+                ),
+              );
+            } else {
+              unawaited(
+                Navigator.of(context).pushNamed(
+                  FusionGroupDetailsView.routeName,
+                  arguments: (
+                    transactions: group.transactions,
+                    coin: coin,
+                    walletId: walletId,
+                  ),
+                ),
+              );
+            }
+          },
+          child: Padding(
+            padding: const EdgeInsets.all(8),
+            child: Row(
+              children: [
+                TxIcon(
+                  transaction: group.transactions.first,
+                  coin: coin,
+                  currentHeight: currentHeight,
+                ),
+                const SizedBox(
+                  width: 14,
+                ),
+                Expanded(
+                  child: Column(
+                    mainAxisAlignment: MainAxisAlignment.spaceBetween,
+                    // crossAxisAlignment: CrossAxisAlignment.stretch,
+                    children: [
+                      Row(
+                        mainAxisAlignment: MainAxisAlignment.spaceBetween,
+                        children: [
+                          Flexible(
+                            child: FittedBox(
+                              fit: BoxFit.scaleDown,
+                              child: Text(
+                                "Fusions",
+                                style: STextStyles.itemSubtitle12(context),
+                              ),
+                            ),
+                          ),
+                          const SizedBox(
+                            width: 10,
+                          ),
+                          Flexible(
+                            child: FittedBox(
+                              fit: BoxFit.scaleDown,
+                              child: Builder(
+                                builder: (_) {
+                                  return Text(
+                                    "${group.transactions.length} fusion transactions",
+                                    style: STextStyles.itemSubtitle12(context),
+                                  );
+                                },
+                              ),
+                            ),
+                          ),
+                        ],
+                      ),
+                      const SizedBox(
+                        height: 4,
+                      ),
+                      Row(
+                        mainAxisAlignment: MainAxisAlignment.spaceBetween,
+                        // crossAxisAlignment: CrossAxisAlignment.end,
+                        children: [
+                          Flexible(
+                            child: FittedBox(
+                              fit: BoxFit.scaleDown,
+                              child: Text(
+                                Format.extractDateFrom(
+                                  group.transactions.last.timestamp,
+                                ),
+                                style: STextStyles.label(context),
+                              ),
+                            ),
+                          ),
+                          // if (ref.watch(prefsChangeNotifierProvider
+                          //     .select((value) => value.externalCalls)))
+                          //   const SizedBox(
+                          //     width: 10,
+                          //   ),
+                          // if (ref.watch(prefsChangeNotifierProvider
+                          //     .select((value) => value.externalCalls)))
+                          //   Flexible(
+                          //     child: FittedBox(
+                          //       fit: BoxFit.scaleDown,
+                          //       child: Builder(
+                          //         builder: (_) {
+                          //           return Text(
+                          //             "$prefix${Amount.fromDecimal(
+                          //               amount.decimal * price,
+                          //               fractionDigits: 2,
+                          //             ).fiatString(
+                          //               locale: locale,
+                          //             )} $baseCurrency",
+                          //             style: STextStyles.label(context),
+                          //           );
+                          //         },
+                          //       ),
+                          //     ),
+                          //   ),
+                        ],
+                      ),
+                    ],
+                  ),
+                ),
+              ],
+            ),
+          ),
+        ),
+      ),
+    );
+  }
+}
diff --git a/lib/pages/wallet_view/transaction_views/tx_v2/transaction_v2_card.dart b/lib/pages/wallet_view/transaction_views/tx_v2/transaction_v2_card.dart
new file mode 100644
index 000000000..c8162fbb1
--- /dev/null
+++ b/lib/pages/wallet_view/transaction_views/tx_v2/transaction_v2_card.dart
@@ -0,0 +1,287 @@
+import 'dart:async';
+
+import 'package:flutter/material.dart';
+import 'package:flutter_riverpod/flutter_riverpod.dart';
+import 'package:stackwallet/models/isar/models/blockchain_data/v2/transaction_v2.dart';
+import 'package:stackwallet/models/isar/models/isar_models.dart';
+import 'package:stackwallet/pages/wallet_view/sub_widgets/tx_icon.dart';
+import 'package:stackwallet/pages/wallet_view/transaction_views/tx_v2/transaction_v2_details_view.dart';
+import 'package:stackwallet/providers/global/locale_provider.dart';
+import 'package:stackwallet/providers/global/prefs_provider.dart';
+import 'package:stackwallet/providers/global/price_provider.dart';
+import 'package:stackwallet/providers/global/wallets_provider.dart';
+import 'package:stackwallet/themes/stack_colors.dart';
+import 'package:stackwallet/utilities/amount/amount.dart';
+import 'package:stackwallet/utilities/amount/amount_formatter.dart';
+import 'package:stackwallet/utilities/constants.dart';
+import 'package:stackwallet/utilities/enums/coin_enum.dart';
+import 'package:stackwallet/utilities/format.dart';
+import 'package:stackwallet/utilities/text_styles.dart';
+import 'package:stackwallet/utilities/util.dart';
+import 'package:stackwallet/widgets/desktop/desktop_dialog.dart';
+
+class TransactionCardV2 extends ConsumerStatefulWidget {
+  const TransactionCardV2({
+    Key? key,
+    required this.transaction,
+  }) : super(key: key);
+
+  final TransactionV2 transaction;
+
+  @override
+  ConsumerState<TransactionCardV2> createState() => _TransactionCardStateV2();
+}
+
+class _TransactionCardStateV2 extends ConsumerState<TransactionCardV2> {
+  late final TransactionV2 _transaction;
+  late final String walletId;
+  late final String prefix;
+  late final String unit;
+  late final Coin coin;
+  late final TransactionType txType;
+
+  String whatIsIt(
+    Coin coin,
+    int currentHeight,
+  ) {
+    final confirmedStatus = _transaction.isConfirmed(
+      currentHeight,
+      coin.requiredConfirmations,
+    );
+
+    if (_transaction.subType == TransactionSubType.cashFusion) {
+      if (confirmedStatus) {
+        return "Anonymized";
+      } else {
+        return "Anonymizing";
+      }
+    }
+
+    if (_transaction.type == TransactionType.incoming) {
+      // if (_transaction.isMinting) {
+      //   return "Minting";
+      // } else
+      if (confirmedStatus) {
+        return "Received";
+      } else {
+        return "Receiving";
+      }
+    } else if (_transaction.type == TransactionType.outgoing) {
+      if (confirmedStatus) {
+        return "Sent";
+      } else {
+        return "Sending";
+      }
+    } else if (_transaction.type == TransactionType.sentToSelf) {
+      return "Sent to self";
+    } else {
+      return _transaction.type.name;
+    }
+  }
+
+  @override
+  void initState() {
+    _transaction = widget.transaction;
+    walletId = _transaction.walletId;
+
+    if (Util.isDesktop) {
+      if (_transaction.type == TransactionType.outgoing &&
+          _transaction.subType != TransactionSubType.cashFusion) {
+        prefix = "-";
+      } else if (_transaction.type == TransactionType.incoming) {
+        prefix = "+";
+      } else {
+        prefix = "";
+      }
+    } else {
+      prefix = "";
+    }
+    coin = ref.read(walletsChangeNotifierProvider).getManager(walletId).coin;
+
+    unit = coin.ticker;
+    super.initState();
+  }
+
+  @override
+  Widget build(BuildContext context) {
+    final locale = ref.watch(
+        localeServiceChangeNotifierProvider.select((value) => value.locale));
+
+    final baseCurrency = ref
+        .watch(prefsChangeNotifierProvider.select((value) => value.currency));
+
+    final price = ref
+        .watch(priceAnd24hChangeNotifierProvider
+            .select((value) => value.getPrice(coin)))
+        .item1;
+
+    final currentHeight = ref.watch(walletsChangeNotifierProvider
+        .select((value) => value.getManager(walletId).currentHeight));
+
+    final Amount amount;
+
+    if (_transaction.subType == TransactionSubType.cashFusion) {
+      amount = _transaction.getAmountReceivedThisWallet(coin: coin);
+    } else {
+      switch (_transaction.type) {
+        case TransactionType.outgoing:
+          amount = _transaction.getAmountSentFromThisWallet(coin: coin);
+          break;
+
+        case TransactionType.incoming:
+        case TransactionType.sentToSelf:
+          amount = _transaction.getAmountReceivedThisWallet(coin: coin);
+          break;
+
+        case TransactionType.unknown:
+          amount = _transaction.getAmountSentFromThisWallet(coin: coin);
+          break;
+      }
+    }
+
+    return Material(
+      color: Theme.of(context).extension<StackColors>()!.popupBG,
+      elevation: 0,
+      shape: RoundedRectangleBorder(
+        borderRadius:
+            BorderRadius.circular(Constants.size.circularBorderRadius),
+      ),
+      child: Padding(
+        padding: const EdgeInsets.all(6),
+        child: RawMaterialButton(
+          shape: RoundedRectangleBorder(
+            borderRadius: BorderRadius.circular(
+              Constants.size.circularBorderRadius,
+            ),
+          ),
+          onPressed: () async {
+            if (Util.isDesktop) {
+              await showDialog<void>(
+                context: context,
+                builder: (context) => DesktopDialog(
+                  maxHeight: MediaQuery.of(context).size.height - 64,
+                  maxWidth: 580,
+                  child: TransactionV2DetailsView(
+                    transaction: _transaction,
+                    coin: coin,
+                    walletId: walletId,
+                  ),
+                ),
+              );
+            } else {
+              unawaited(
+                Navigator.of(context).pushNamed(
+                  TransactionV2DetailsView.routeName,
+                  arguments: (
+                    tx: _transaction,
+                    coin: coin,
+                    walletId: walletId,
+                  ),
+                ),
+              );
+            }
+          },
+          child: Padding(
+            padding: const EdgeInsets.all(8),
+            child: Row(
+              children: [
+                TxIcon(
+                  transaction: _transaction,
+                  coin: coin,
+                  currentHeight: currentHeight,
+                ),
+                const SizedBox(
+                  width: 14,
+                ),
+                Expanded(
+                  child: Column(
+                    mainAxisAlignment: MainAxisAlignment.spaceBetween,
+                    // crossAxisAlignment: CrossAxisAlignment.stretch,
+                    children: [
+                      Row(
+                        mainAxisAlignment: MainAxisAlignment.spaceBetween,
+                        children: [
+                          Flexible(
+                            child: FittedBox(
+                              fit: BoxFit.scaleDown,
+                              child: Text(
+                                whatIsIt(
+                                  coin,
+                                  currentHeight,
+                                ),
+                                style: STextStyles.itemSubtitle12(context),
+                              ),
+                            ),
+                          ),
+                          const SizedBox(
+                            width: 10,
+                          ),
+                          Flexible(
+                            child: FittedBox(
+                              fit: BoxFit.scaleDown,
+                              child: Builder(
+                                builder: (_) {
+                                  return Text(
+                                    "$prefix${ref.watch(pAmountFormatter(coin)).format(amount)}",
+                                    style: STextStyles.itemSubtitle12(context),
+                                  );
+                                },
+                              ),
+                            ),
+                          ),
+                        ],
+                      ),
+                      const SizedBox(
+                        height: 4,
+                      ),
+                      Row(
+                        mainAxisAlignment: MainAxisAlignment.spaceBetween,
+                        // crossAxisAlignment: CrossAxisAlignment.end,
+                        children: [
+                          Flexible(
+                            child: FittedBox(
+                              fit: BoxFit.scaleDown,
+                              child: Text(
+                                Format.extractDateFrom(_transaction.timestamp),
+                                style: STextStyles.label(context),
+                              ),
+                            ),
+                          ),
+                          if (ref.watch(prefsChangeNotifierProvider
+                              .select((value) => value.externalCalls)))
+                            const SizedBox(
+                              width: 10,
+                            ),
+                          if (ref.watch(prefsChangeNotifierProvider
+                              .select((value) => value.externalCalls)))
+                            Flexible(
+                              child: FittedBox(
+                                fit: BoxFit.scaleDown,
+                                child: Builder(
+                                  builder: (_) {
+                                    return Text(
+                                      "$prefix${Amount.fromDecimal(
+                                        amount.decimal * price,
+                                        fractionDigits: 2,
+                                      ).fiatString(
+                                        locale: locale,
+                                      )} $baseCurrency",
+                                      style: STextStyles.label(context),
+                                    );
+                                  },
+                                ),
+                              ),
+                            ),
+                        ],
+                      ),
+                    ],
+                  ),
+                ),
+              ],
+            ),
+          ),
+        ),
+      ),
+    );
+  }
+}
diff --git a/lib/pages/wallet_view/transaction_views/tx_v2/transaction_v2_details_view.dart b/lib/pages/wallet_view/transaction_views/tx_v2/transaction_v2_details_view.dart
new file mode 100644
index 000000000..d52a504c6
--- /dev/null
+++ b/lib/pages/wallet_view/transaction_views/tx_v2/transaction_v2_details_view.dart
@@ -0,0 +1,1679 @@
+/* 
+ * This file is part of Stack Wallet.
+ * 
+ * Copyright (c) 2023 Cypher Stack
+ * All Rights Reserved.
+ * The code is distributed under GPLv3 license, see LICENSE file for details.
+ * Generated by Cypher Stack on 2023-05-26
+ *
+ */
+
+import 'dart:async';
+
+import 'package:flutter/foundation.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter/services.dart';
+import 'package:flutter_riverpod/flutter_riverpod.dart';
+import 'package:flutter_svg/flutter_svg.dart';
+import 'package:stackwallet/models/isar/models/blockchain_data/transaction.dart';
+import 'package:stackwallet/models/isar/models/blockchain_data/v2/transaction_v2.dart';
+import 'package:stackwallet/notifications/show_flush_bar.dart';
+import 'package:stackwallet/pages/wallet_view/sub_widgets/tx_icon.dart';
+import 'package:stackwallet/pages/wallet_view/transaction_views/edit_note_view.dart';
+import 'package:stackwallet/providers/global/address_book_service_provider.dart';
+import 'package:stackwallet/providers/providers.dart';
+import 'package:stackwallet/themes/stack_colors.dart';
+import 'package:stackwallet/utilities/amount/amount.dart';
+import 'package:stackwallet/utilities/amount/amount_formatter.dart';
+import 'package:stackwallet/utilities/assets.dart';
+import 'package:stackwallet/utilities/block_explorers.dart';
+import 'package:stackwallet/utilities/constants.dart';
+import 'package:stackwallet/utilities/enums/coin_enum.dart';
+import 'package:stackwallet/utilities/format.dart';
+import 'package:stackwallet/utilities/logger.dart';
+import 'package:stackwallet/utilities/text_styles.dart';
+import 'package:stackwallet/utilities/util.dart';
+import 'package:stackwallet/widgets/background.dart';
+import 'package:stackwallet/widgets/conditional_parent.dart';
+import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart';
+import 'package:stackwallet/widgets/custom_buttons/blue_text_button.dart';
+import 'package:stackwallet/widgets/desktop/desktop_dialog.dart';
+import 'package:stackwallet/widgets/desktop/desktop_dialog_close_button.dart';
+import 'package:stackwallet/widgets/desktop/primary_button.dart';
+import 'package:stackwallet/widgets/desktop/secondary_button.dart';
+import 'package:stackwallet/widgets/icon_widgets/copy_icon.dart';
+import 'package:stackwallet/widgets/icon_widgets/pencil_icon.dart';
+import 'package:stackwallet/widgets/rounded_white_container.dart';
+import 'package:stackwallet/widgets/stack_dialog.dart';
+import 'package:tuple/tuple.dart';
+import 'package:url_launcher/url_launcher.dart';
+
+class TransactionV2DetailsView extends ConsumerStatefulWidget {
+  const TransactionV2DetailsView({
+    Key? key,
+    required this.transaction,
+    required this.walletId,
+    required this.coin,
+  }) : super(key: key);
+
+  static const String routeName = "/transactionV2Details";
+
+  final TransactionV2 transaction;
+  final String walletId;
+  final Coin coin;
+
+  @override
+  ConsumerState<TransactionV2DetailsView> createState() =>
+      _TransactionV2DetailsViewState();
+}
+
+class _TransactionV2DetailsViewState
+    extends ConsumerState<TransactionV2DetailsView> {
+  late final bool isDesktop;
+  late TransactionV2 _transaction;
+  late final String walletId;
+
+  late final Coin coin;
+  late final Amount amount;
+  late final Amount fee;
+  late final String amountPrefix;
+  late final String unit;
+
+  late final List<({List<String> addresses, Amount amount})> data;
+
+  bool showFeePending = false;
+
+  @override
+  void initState() {
+    isDesktop = Util.isDesktop;
+    _transaction = widget.transaction;
+    walletId = widget.walletId;
+
+    coin = widget.coin;
+
+    fee = _transaction.getFee(coin: coin);
+
+    if (_transaction.subType == TransactionSubType.cashFusion ||
+        _transaction.type == TransactionType.sentToSelf) {
+      amountPrefix = "";
+    } else {
+      amountPrefix = _transaction.type == TransactionType.outgoing ? "-" : "+";
+    }
+
+    unit = coin.ticker;
+
+    if (_transaction.subType == TransactionSubType.cashFusion) {
+      amount = _transaction.getAmountReceivedThisWallet(coin: coin);
+      data = _transaction.outputs
+          .where((e) => e.walletOwns)
+          .map((e) => (
+                addresses: e.addresses,
+                amount: Amount(rawValue: e.value, fractionDigits: coin.decimals)
+              ))
+          .toList();
+    } else {
+      switch (_transaction.type) {
+        case TransactionType.outgoing:
+          amount = _transaction.getAmountSentFromThisWallet(coin: coin);
+          data = _transaction.outputs
+              .where((e) => !e.walletOwns)
+              .map((e) => (
+                    addresses: e.addresses,
+                    amount:
+                        Amount(rawValue: e.value, fractionDigits: coin.decimals)
+                  ))
+              .toList();
+          break;
+
+        case TransactionType.incoming:
+        case TransactionType.sentToSelf:
+          amount = _transaction.getAmountReceivedThisWallet(coin: coin);
+          data = _transaction.outputs
+              .where((e) => e.walletOwns)
+              .map((e) => (
+                    addresses: e.addresses,
+                    amount:
+                        Amount(rawValue: e.value, fractionDigits: coin.decimals)
+                  ))
+              .toList();
+          break;
+
+        case TransactionType.unknown:
+          amount = _transaction.getAmountSentFromThisWallet(coin: coin);
+          data = _transaction.inputs
+              .where((e) => e.walletOwns)
+              .map((e) => (
+                    addresses: e.addresses,
+                    amount:
+                        Amount(rawValue: e.value, fractionDigits: coin.decimals)
+                  ))
+              .toList();
+          break;
+      }
+    }
+
+    super.initState();
+  }
+
+  @override
+  void dispose() {
+    super.dispose();
+  }
+
+  String whatIsIt(TransactionV2 tx, int height) {
+    final type = tx.type;
+    if (coin == Coin.firo || coin == Coin.firoTestNet) {
+      if (tx.subType == TransactionSubType.mint) {
+        if (tx.isConfirmed(height, coin.requiredConfirmations)) {
+          return "Minted";
+        } else {
+          return "Minting";
+        }
+      }
+    }
+
+    // if (coin == Coin.epicCash) {
+    //   if (_transaction.isCancelled) {
+    //     return "Cancelled";
+    //   } else if (type == TransactionType.incoming) {
+    //     if (tx.isConfirmed(height, coin.requiredConfirmations)) {
+    //       return "Received";
+    //     } else {
+    //       if (_transaction.numberOfMessages == 1) {
+    //         return "Receiving (waiting for sender)";
+    //       } else if ((_transaction.numberOfMessages ?? 0) > 1) {
+    //         return "Receiving (waiting for confirmations)"; // TODO test if the sender still has to open again after the receiver has 2 messages present, ie. sender->receiver->sender->node (yes) vs. sender->receiver->node (no)
+    //       } else {
+    //         return "Receiving";
+    //       }
+    //     }
+    //   } else if (type == TransactionType.outgoing) {
+    //     if (tx.isConfirmed(height, coin.requiredConfirmations)) {
+    //       return "Sent (confirmed)";
+    //     } else {
+    //       if (_transaction.numberOfMessages == 1) {
+    //         return "Sending (waiting for receiver)";
+    //       } else if ((_transaction.numberOfMessages ?? 0) > 1) {
+    //         return "Sending (waiting for confirmations)";
+    //       } else {
+    //         return "Sending";
+    //       }
+    //     }
+    //   }
+    // }
+
+    if (tx.subType == TransactionSubType.cashFusion) {
+      if (tx.isConfirmed(height, coin.requiredConfirmations)) {
+        return "Anonymized";
+      } else {
+        return "Anonymizing";
+      }
+    }
+
+    if (type == TransactionType.incoming) {
+      // if (_transaction.isMinting) {
+      //   return "Minting";
+      // } else
+      if (tx.isConfirmed(height, coin.requiredConfirmations)) {
+        return "Received";
+      } else {
+        return "Receiving";
+      }
+    } else if (type == TransactionType.outgoing) {
+      if (tx.isConfirmed(height, coin.requiredConfirmations)) {
+        return "Sent";
+      } else {
+        return "Sending";
+      }
+    } else if (type == TransactionType.sentToSelf) {
+      return "Sent to self";
+    } else {
+      return type.name;
+    }
+  }
+
+  Future<String> fetchContactNameFor(String address) async {
+    if (address.isEmpty) {
+      return address;
+    }
+    try {
+      final contacts = ref.read(addressBookServiceProvider).contacts.where(
+          (element) => element.addresses
+              .where((element) => element.address == address)
+              .isNotEmpty);
+      if (contacts.isNotEmpty) {
+        return contacts.first.name;
+      } else {
+        return address;
+      }
+    } catch (e, s) {
+      Logging.instance.log("$e\n$s", level: LogLevel.Warning);
+      return address;
+    }
+  }
+
+  String _note = "";
+
+  Future<bool> showExplorerWarning(String explorer) async {
+    final bool? shouldContinue = await showDialog<bool>(
+        context: context,
+        barrierDismissible: false,
+        builder: (_) {
+          if (!isDesktop) {
+            return StackDialog(
+              title: "Attention",
+              message:
+                  "You are about to view this transaction in a block explorer. The explorer may log your IP address and link it to the transaction. Only proceed if you trust $explorer.",
+              icon: Row(
+                children: [
+                  Consumer(builder: (_, ref, __) {
+                    return Checkbox(
+                      value: ref.watch(prefsChangeNotifierProvider
+                          .select((value) => value.hideBlockExplorerWarning)),
+                      onChanged: (value) {
+                        if (value is bool) {
+                          ref
+                              .read(prefsChangeNotifierProvider)
+                              .hideBlockExplorerWarning = value;
+                          setState(() {});
+                        }
+                      },
+                    );
+                  }),
+                  Text(
+                    "Never show again",
+                    style: STextStyles.smallMed14(context),
+                  )
+                ],
+              ),
+              leftButton: TextButton(
+                onPressed: () {
+                  Navigator.of(context).pop(false);
+                },
+                child: Text(
+                  "Cancel",
+                  style: STextStyles.button(context).copyWith(
+                      color: Theme.of(context)
+                          .extension<StackColors>()!
+                          .accentColorDark),
+                ),
+              ),
+              rightButton: TextButton(
+                style: Theme.of(context)
+                    .extension<StackColors>()!
+                    .getPrimaryEnabledButtonStyle(context),
+                onPressed: () {
+                  Navigator.of(context).pop(true);
+                },
+                child: Text(
+                  "Continue",
+                  style: STextStyles.button(context),
+                ),
+              ),
+            );
+          } else {
+            return DesktopDialog(
+              maxWidth: 550,
+              maxHeight: 300,
+              child: Padding(
+                padding:
+                    const EdgeInsets.symmetric(horizontal: 32, vertical: 20),
+                child: Column(
+                  children: [
+                    Row(
+                      mainAxisAlignment: MainAxisAlignment.spaceBetween,
+                      children: [
+                        Text(
+                          "Attention",
+                          style: STextStyles.desktopH2(context),
+                        ),
+                        Row(
+                          children: [
+                            Consumer(builder: (_, ref, __) {
+                              return Checkbox(
+                                value: ref.watch(prefsChangeNotifierProvider
+                                    .select((value) =>
+                                        value.hideBlockExplorerWarning)),
+                                onChanged: (value) {
+                                  if (value is bool) {
+                                    ref
+                                        .read(prefsChangeNotifierProvider)
+                                        .hideBlockExplorerWarning = value;
+                                    setState(() {});
+                                  }
+                                },
+                              );
+                            }),
+                            Text(
+                              "Never show again",
+                              style: STextStyles.smallMed14(context),
+                            )
+                          ],
+                        ),
+                      ],
+                    ),
+                    const SizedBox(height: 16),
+                    Text(
+                      "You are about to view this transaction in a block explorer. The explorer may log your IP address and link it to the transaction. Only proceed if you trust $explorer.",
+                      style: STextStyles.desktopTextSmall(context),
+                    ),
+                    const SizedBox(height: 35),
+                    Row(
+                      mainAxisAlignment: MainAxisAlignment.center,
+                      children: [
+                        SecondaryButton(
+                          width: 200,
+                          buttonHeight: ButtonHeight.l,
+                          label: "Cancel",
+                          onPressed: () {
+                            Navigator.of(
+                              context,
+                              rootNavigator: true,
+                            ).pop(false);
+                          },
+                        ),
+                        const SizedBox(width: 20),
+                        PrimaryButton(
+                          width: 200,
+                          buttonHeight: ButtonHeight.l,
+                          label: "Continue",
+                          onPressed: () {
+                            Navigator.of(
+                              context,
+                              rootNavigator: true,
+                            ).pop(true);
+                          },
+                        ),
+                      ],
+                    ),
+                  ],
+                ),
+              ),
+            );
+          }
+        });
+    return shouldContinue ?? false;
+  }
+
+  @override
+  Widget build(BuildContext context) {
+    final currentHeight = ref.watch(walletsChangeNotifierProvider
+        .select((value) => value.getManager(walletId).currentHeight));
+
+    final String outputLabel;
+
+    if (_transaction.subType == TransactionSubType.cashFusion) {
+      outputLabel = "Outputs";
+    } else if (_transaction.type == TransactionType.incoming) {
+      if (data.length == 1 && data.first.addresses.length == 1) {
+        outputLabel = "Receiving address";
+      } else {
+        outputLabel = "Receiving addresses";
+      }
+    } else {
+      outputLabel = "Sent to";
+    }
+
+    return ConditionalParent(
+      condition: !isDesktop,
+      builder: (child) => Background(
+        child: child,
+      ),
+      child: Scaffold(
+        backgroundColor: isDesktop
+            ? Colors.transparent
+            : Theme.of(context).extension<StackColors>()!.background,
+        appBar: isDesktop
+            ? null
+            : AppBar(
+                backgroundColor:
+                    Theme.of(context).extension<StackColors>()!.background,
+                leading: AppBarBackButton(
+                  onPressed: () async {
+                    // if (FocusScope.of(context).hasFocus) {
+                    //   FocusScope.of(context).unfocus();
+                    //   await Future<void>.delayed(Duration(milliseconds: 50));
+                    // }
+                    Navigator.of(context).pop();
+                  },
+                ),
+                title: Text(
+                  "Transaction details",
+                  style: STextStyles.navBarTitle(context),
+                ),
+              ),
+        body: Padding(
+          padding: isDesktop
+              ? const EdgeInsets.only(left: 32)
+              : const EdgeInsets.all(12),
+          child: Column(
+            mainAxisSize: MainAxisSize.min,
+            children: [
+              if (isDesktop)
+                Row(
+                  mainAxisAlignment: MainAxisAlignment.spaceBetween,
+                  children: [
+                    Text(
+                      "Transaction details",
+                      style: STextStyles.desktopH3(context),
+                    ),
+                    const DesktopDialogCloseButton(),
+                  ],
+                ),
+              Flexible(
+                child: Padding(
+                  padding: isDesktop
+                      ? const EdgeInsets.only(
+                          right: 32,
+                          bottom: 32,
+                        )
+                      : const EdgeInsets.all(0),
+                  child: ConditionalParent(
+                    condition: isDesktop,
+                    builder: (child) {
+                      return RoundedWhiteContainer(
+                        borderColor: isDesktop
+                            ? Theme.of(context)
+                                .extension<StackColors>()!
+                                .backgroundAppBar
+                            : null,
+                        padding: const EdgeInsets.all(0),
+                        child: child,
+                      );
+                    },
+                    child: SingleChildScrollView(
+                      primary: isDesktop ? false : null,
+                      child: Padding(
+                        padding: isDesktop
+                            ? const EdgeInsets.all(0)
+                            : const EdgeInsets.all(4),
+                        child: Column(
+                          mainAxisSize: MainAxisSize.min,
+                          crossAxisAlignment: CrossAxisAlignment.stretch,
+                          children: [
+                            RoundedWhiteContainer(
+                              padding: isDesktop
+                                  ? const EdgeInsets.all(0)
+                                  : const EdgeInsets.all(12),
+                              child: Container(
+                                decoration: isDesktop
+                                    ? BoxDecoration(
+                                        color: Theme.of(context)
+                                            .extension<StackColors>()!
+                                            .backgroundAppBar,
+                                        borderRadius: BorderRadius.vertical(
+                                          top: Radius.circular(
+                                            Constants.size.circularBorderRadius,
+                                          ),
+                                        ),
+                                      )
+                                    : null,
+                                child: Padding(
+                                  padding: isDesktop
+                                      ? const EdgeInsets.all(12)
+                                      : const EdgeInsets.all(0),
+                                  child: Row(
+                                    mainAxisAlignment:
+                                        MainAxisAlignment.spaceBetween,
+                                    children: [
+                                      if (isDesktop)
+                                        Row(
+                                          children: [
+                                            TxIcon(
+                                              transaction: _transaction,
+                                              currentHeight: currentHeight,
+                                              coin: coin,
+                                            ),
+                                            const SizedBox(
+                                              width: 16,
+                                            ),
+                                            SelectableText(
+                                              whatIsIt(
+                                                _transaction,
+                                                currentHeight,
+                                              ),
+                                              style:
+                                                  STextStyles.desktopTextMedium(
+                                                      context),
+                                            ),
+                                          ],
+                                        ),
+                                      Column(
+                                        crossAxisAlignment: isDesktop
+                                            ? CrossAxisAlignment.end
+                                            : CrossAxisAlignment.start,
+                                        children: [
+                                          SelectableText(
+                                            "$amountPrefix${ref.watch(pAmountFormatter(coin)).format(amount)}",
+                                            style: isDesktop
+                                                ? STextStyles
+                                                        .desktopTextExtraExtraSmall(
+                                                            context)
+                                                    .copyWith(
+                                                    color: Theme.of(context)
+                                                        .extension<
+                                                            StackColors>()!
+                                                        .textDark,
+                                                  )
+                                                : STextStyles.titleBold12(
+                                                    context),
+                                          ),
+                                          const SizedBox(
+                                            height: 2,
+                                          ),
+                                          if (ref.watch(
+                                              prefsChangeNotifierProvider
+                                                  .select((value) =>
+                                                      value.externalCalls)))
+                                            SelectableText(
+                                              "$amountPrefix${(amount.decimal * ref.watch(
+                                                        priceAnd24hChangeNotifierProvider
+                                                            .select((value) =>
+                                                                value
+                                                                    .getPrice(
+                                                                        coin)
+                                                                    .item1),
+                                                      )).toAmount(fractionDigits: 2).fiatString(
+                                                    locale: ref.watch(
+                                                      localeServiceChangeNotifierProvider
+                                                          .select(
+                                                        (value) => value.locale,
+                                                      ),
+                                                    ),
+                                                  )} ${ref.watch(
+                                                prefsChangeNotifierProvider
+                                                    .select(
+                                                  (value) => value.currency,
+                                                ),
+                                              )}",
+                                              style: isDesktop
+                                                  ? STextStyles
+                                                      .desktopTextExtraExtraSmall(
+                                                          context)
+                                                  : STextStyles.itemSubtitle(
+                                                      context),
+                                            ),
+                                        ],
+                                      ),
+                                      if (!isDesktop)
+                                        TxIcon(
+                                          transaction: _transaction,
+                                          currentHeight: currentHeight,
+                                          coin: coin,
+                                        ),
+                                    ],
+                                  ),
+                                ),
+                              ),
+                            ),
+
+                            isDesktop
+                                ? const _Divider()
+                                : const SizedBox(
+                                    height: 12,
+                                  ),
+                            RoundedWhiteContainer(
+                              padding: isDesktop
+                                  ? const EdgeInsets.all(16)
+                                  : const EdgeInsets.all(12),
+                              child: Row(
+                                mainAxisAlignment:
+                                    MainAxisAlignment.spaceBetween,
+                                children: [
+                                  Text(
+                                    "Status",
+                                    style: isDesktop
+                                        ? STextStyles
+                                            .desktopTextExtraExtraSmall(context)
+                                        : STextStyles.itemSubtitle(context),
+                                  ),
+                                  // Flexible(
+                                  //   child: FittedBox(
+                                  //     fit: BoxFit.scaleDown,
+                                  //     child:
+                                  SelectableText(
+                                    whatIsIt(
+                                      _transaction,
+                                      currentHeight,
+                                    ),
+                                    style: isDesktop
+                                        ? STextStyles
+                                                .desktopTextExtraExtraSmall(
+                                                    context)
+                                            .copyWith(
+                                            color: _transaction.type ==
+                                                        TransactionType
+                                                            .outgoing &&
+                                                    _transaction.subType !=
+                                                        TransactionSubType
+                                                            .cashFusion
+                                                ? Theme.of(context)
+                                                    .extension<StackColors>()!
+                                                    .accentColorOrange
+                                                : Theme.of(context)
+                                                    .extension<StackColors>()!
+                                                    .accentColorGreen,
+                                          )
+                                        : STextStyles.itemSubtitle12(context),
+                                  ),
+                                  //   ),
+                                  // ),
+                                ],
+                              ),
+                            ),
+                            if (!((coin == Coin.monero ||
+                                        coin == Coin.wownero) &&
+                                    _transaction.type ==
+                                        TransactionType.outgoing) &&
+                                !((coin == Coin.firo ||
+                                        coin == Coin.firoTestNet) &&
+                                    _transaction.subType ==
+                                        TransactionSubType.mint))
+                              isDesktop
+                                  ? const _Divider()
+                                  : const SizedBox(
+                                      height: 12,
+                                    ),
+                            if (!((coin == Coin.monero ||
+                                        coin == Coin.wownero) &&
+                                    _transaction.type ==
+                                        TransactionType.outgoing) &&
+                                !((coin == Coin.firo ||
+                                        coin == Coin.firoTestNet) &&
+                                    _transaction.subType ==
+                                        TransactionSubType.mint))
+                              RoundedWhiteContainer(
+                                padding: isDesktop
+                                    ? const EdgeInsets.all(16)
+                                    : const EdgeInsets.all(12),
+                                child: Row(
+                                  mainAxisAlignment:
+                                      MainAxisAlignment.spaceBetween,
+                                  crossAxisAlignment: CrossAxisAlignment.start,
+                                  children: [
+                                    Expanded(
+                                      child: Column(
+                                        crossAxisAlignment:
+                                            CrossAxisAlignment.start,
+                                        children: [
+                                          ConditionalParent(
+                                            condition: kDebugMode,
+                                            builder: (child) {
+                                              return Row(
+                                                mainAxisAlignment:
+                                                    MainAxisAlignment
+                                                        .spaceBetween,
+                                                children: [
+                                                  child,
+                                                  // CustomTextButton(
+                                                  //   text: "Info",
+                                                  //   onTap: () async {
+                                                  //     final adr = await ref
+                                                  //         .read(mainDBProvider)
+                                                  //         .getAddress(walletId,
+                                                  //             addresses.first);
+                                                  //     if (adr != null &&
+                                                  //         mounted) {
+                                                  //       if (isDesktop) {
+                                                  //         await showDialog<
+                                                  //             void>(
+                                                  //           context: context,
+                                                  //           builder: (_) =>
+                                                  //               DesktopDialog(
+                                                  //             maxHeight: double
+                                                  //                 .infinity,
+                                                  //             child:
+                                                  //                 AddressDetailsView(
+                                                  //               addressId:
+                                                  //                   adr.id,
+                                                  //               walletId: widget
+                                                  //                   .walletId,
+                                                  //             ),
+                                                  //           ),
+                                                  //         );
+                                                  //       } else {
+                                                  //         await Navigator.of(
+                                                  //                 context)
+                                                  //             .pushNamed(
+                                                  //           AddressDetailsView
+                                                  //               .routeName,
+                                                  //           arguments: Tuple2(
+                                                  //             adr.id,
+                                                  //             widget.walletId,
+                                                  //           ),
+                                                  //         );
+                                                  //       }
+                                                  //     }
+                                                  //   },
+                                                  // )
+                                                ],
+                                              );
+                                            },
+                                            child: Text(
+                                              outputLabel,
+                                              style: isDesktop
+                                                  ? STextStyles
+                                                      .desktopTextExtraExtraSmall(
+                                                          context)
+                                                  : STextStyles.itemSubtitle(
+                                                      context),
+                                            ),
+                                          ),
+                                          const SizedBox(
+                                            height: 8,
+                                          ),
+                                          Column(
+                                            crossAxisAlignment:
+                                                CrossAxisAlignment.start,
+                                            children: [
+                                              if (data.length == 1 &&
+                                                  data.first.addresses.length ==
+                                                      1)
+                                                FutureBuilder(
+                                                  future: fetchContactNameFor(
+                                                      data.first.addresses
+                                                          .first),
+                                                  builder: (builderContext,
+                                                      AsyncSnapshot<String>
+                                                          snapshot) {
+                                                    String
+                                                        addressOrContactName =
+                                                        data.first.addresses
+                                                            .first;
+                                                    if (snapshot.connectionState ==
+                                                            ConnectionState
+                                                                .done &&
+                                                        snapshot.hasData) {
+                                                      addressOrContactName =
+                                                          snapshot.data!;
+                                                    }
+                                                    return SelectableText(
+                                                      addressOrContactName,
+                                                      style: isDesktop
+                                                          ? STextStyles
+                                                                  .desktopTextExtraExtraSmall(
+                                                                      context)
+                                                              .copyWith(
+                                                              color: Theme.of(
+                                                                      context)
+                                                                  .extension<
+                                                                      StackColors>()!
+                                                                  .textDark,
+                                                            )
+                                                          : STextStyles
+                                                              .itemSubtitle12(
+                                                                  context),
+                                                    );
+                                                  },
+                                                )
+                                              else
+                                                for (int i = 0;
+                                                    i < data.length;
+                                                    i++)
+                                                  ConditionalParent(
+                                                    condition: i > 0,
+                                                    builder: (child) => Column(
+                                                      crossAxisAlignment:
+                                                          CrossAxisAlignment
+                                                              .stretch,
+                                                      children: [
+                                                        const _Divider(),
+                                                        child,
+                                                      ],
+                                                    ),
+                                                    child: Padding(
+                                                      padding:
+                                                          const EdgeInsets.all(
+                                                              8.0),
+                                                      child: Column(
+                                                        crossAxisAlignment:
+                                                            CrossAxisAlignment
+                                                                .start,
+                                                        children: [
+                                                          ...data[i]
+                                                              .addresses
+                                                              .map(
+                                                            (e) {
+                                                              return FutureBuilder(
+                                                                future:
+                                                                    fetchContactNameFor(
+                                                                        e),
+                                                                builder: (builderContext,
+                                                                    AsyncSnapshot<
+                                                                            String>
+                                                                        snapshot) {
+                                                                  final String
+                                                                      addressOrContactName;
+                                                                  if (snapshot.connectionState ==
+                                                                          ConnectionState
+                                                                              .done &&
+                                                                      snapshot
+                                                                          .hasData) {
+                                                                    addressOrContactName =
+                                                                        snapshot
+                                                                            .data!;
+                                                                  } else {
+                                                                    addressOrContactName =
+                                                                        e;
+                                                                  }
+
+                                                                  return OutputCard(
+                                                                    address:
+                                                                        addressOrContactName,
+                                                                    amount: data[
+                                                                            i]
+                                                                        .amount,
+                                                                    coin: coin,
+                                                                  );
+                                                                },
+                                                              );
+                                                            },
+                                                          ),
+                                                        ],
+                                                      ),
+                                                    ),
+                                                  ),
+                                            ],
+                                          ),
+                                        ],
+                                      ),
+                                    ),
+                                    // if (isDesktop)
+                                    //   IconCopyButton(
+                                    //     data: addresses.first,
+                                    //   ),
+                                  ],
+                                ),
+                              ),
+
+                            isDesktop
+                                ? const _Divider()
+                                : const SizedBox(
+                                    height: 12,
+                                  ),
+                            RoundedWhiteContainer(
+                              padding: isDesktop
+                                  ? const EdgeInsets.all(16)
+                                  : const EdgeInsets.all(12),
+                              child: Column(
+                                crossAxisAlignment: CrossAxisAlignment.start,
+                                children: [
+                                  Row(
+                                    mainAxisAlignment:
+                                        MainAxisAlignment.spaceBetween,
+                                    children: [
+                                      Text(
+                                        (coin == Coin.epicCash)
+                                            ? "Local Note"
+                                            : "Note ",
+                                        style: isDesktop
+                                            ? STextStyles
+                                                .desktopTextExtraExtraSmall(
+                                                    context)
+                                            : STextStyles.itemSubtitle(context),
+                                      ),
+                                      isDesktop
+                                          ? IconPencilButton(
+                                              onPressed: () {
+                                                showDialog<void>(
+                                                  context: context,
+                                                  builder: (context) {
+                                                    return DesktopDialog(
+                                                      maxWidth: 580,
+                                                      maxHeight: 360,
+                                                      child: EditNoteView(
+                                                        txid: _transaction.txid,
+                                                        walletId: walletId,
+                                                        note: _note,
+                                                      ),
+                                                    );
+                                                  },
+                                                );
+                                              },
+                                            )
+                                          : GestureDetector(
+                                              onTap: () {
+                                                Navigator.of(context).pushNamed(
+                                                  EditNoteView.routeName,
+                                                  arguments: Tuple3(
+                                                    _transaction.txid,
+                                                    walletId,
+                                                    _note,
+                                                  ),
+                                                );
+                                              },
+                                              child: Row(
+                                                children: [
+                                                  SvgPicture.asset(
+                                                    Assets.svg.pencil,
+                                                    width: 10,
+                                                    height: 10,
+                                                    color: Theme.of(context)
+                                                        .extension<
+                                                            StackColors>()!
+                                                        .infoItemIcons,
+                                                  ),
+                                                  const SizedBox(
+                                                    width: 4,
+                                                  ),
+                                                  Text(
+                                                    "Edit",
+                                                    style: STextStyles.link2(
+                                                        context),
+                                                  ),
+                                                ],
+                                              ),
+                                            ),
+                                    ],
+                                  ),
+                                  const SizedBox(
+                                    height: 8,
+                                  ),
+                                  FutureBuilder(
+                                    future: ref.watch(
+                                        notesServiceChangeNotifierProvider(
+                                                walletId)
+                                            .select((value) => value.getNoteFor(
+                                                txid: _transaction.txid))),
+                                    builder: (builderContext,
+                                        AsyncSnapshot<String> snapshot) {
+                                      if (snapshot.connectionState ==
+                                              ConnectionState.done &&
+                                          snapshot.hasData) {
+                                        _note = snapshot.data ?? "";
+                                      }
+                                      return SelectableText(
+                                        _note,
+                                        style: isDesktop
+                                            ? STextStyles
+                                                    .desktopTextExtraExtraSmall(
+                                                        context)
+                                                .copyWith(
+                                                color: Theme.of(context)
+                                                    .extension<StackColors>()!
+                                                    .textDark,
+                                              )
+                                            : STextStyles.itemSubtitle12(
+                                                context),
+                                      );
+                                    },
+                                  ),
+                                ],
+                              ),
+                            ),
+                            isDesktop
+                                ? const _Divider()
+                                : const SizedBox(
+                                    height: 12,
+                                  ),
+                            RoundedWhiteContainer(
+                              padding: isDesktop
+                                  ? const EdgeInsets.all(16)
+                                  : const EdgeInsets.all(12),
+                              child: Row(
+                                mainAxisAlignment:
+                                    MainAxisAlignment.spaceBetween,
+                                crossAxisAlignment: CrossAxisAlignment.start,
+                                children: [
+                                  Column(
+                                    crossAxisAlignment:
+                                        CrossAxisAlignment.start,
+                                    children: [
+                                      Text(
+                                        "Date",
+                                        style: isDesktop
+                                            ? STextStyles
+                                                .desktopTextExtraExtraSmall(
+                                                    context)
+                                            : STextStyles.itemSubtitle(context),
+                                      ),
+                                      if (isDesktop)
+                                        const SizedBox(
+                                          height: 2,
+                                        ),
+                                      if (isDesktop)
+                                        SelectableText(
+                                          Format.extractDateFrom(
+                                            _transaction.timestamp,
+                                          ),
+                                          style: isDesktop
+                                              ? STextStyles
+                                                      .desktopTextExtraExtraSmall(
+                                                          context)
+                                                  .copyWith(
+                                                  color: Theme.of(context)
+                                                      .extension<StackColors>()!
+                                                      .textDark,
+                                                )
+                                              : STextStyles.itemSubtitle12(
+                                                  context),
+                                        ),
+                                    ],
+                                  ),
+                                  if (!isDesktop)
+                                    SelectableText(
+                                      Format.extractDateFrom(
+                                        _transaction.timestamp,
+                                      ),
+                                      style: isDesktop
+                                          ? STextStyles
+                                                  .desktopTextExtraExtraSmall(
+                                                      context)
+                                              .copyWith(
+                                              color: Theme.of(context)
+                                                  .extension<StackColors>()!
+                                                  .textDark,
+                                            )
+                                          : STextStyles.itemSubtitle12(context),
+                                    ),
+                                  if (isDesktop)
+                                    IconCopyButton(
+                                      data: Format.extractDateFrom(
+                                        _transaction.timestamp,
+                                      ),
+                                    ),
+                                ],
+                              ),
+                            ),
+                            if (coin != Coin.banano && coin != Coin.nano)
+                              isDesktop
+                                  ? const _Divider()
+                                  : const SizedBox(
+                                      height: 12,
+                                    ),
+                            if (coin != Coin.banano && coin != Coin.nano)
+                              RoundedWhiteContainer(
+                                padding: isDesktop
+                                    ? const EdgeInsets.all(16)
+                                    : const EdgeInsets.all(12),
+                                child: Builder(builder: (context) {
+                                  String feeString = showFeePending
+                                      ? _transaction.isConfirmed(
+                                          currentHeight,
+                                          coin.requiredConfirmations,
+                                        )
+                                          ? ref
+                                              .watch(pAmountFormatter(coin))
+                                              .format(
+                                                fee,
+                                              )
+                                          : "Pending"
+                                      : ref
+                                          .watch(pAmountFormatter(coin))
+                                          .format(
+                                            fee,
+                                          );
+
+                                  return Row(
+                                    mainAxisAlignment:
+                                        MainAxisAlignment.spaceBetween,
+                                    crossAxisAlignment:
+                                        CrossAxisAlignment.start,
+                                    children: [
+                                      Column(
+                                        crossAxisAlignment:
+                                            CrossAxisAlignment.start,
+                                        children: [
+                                          Text(
+                                            "Transaction fee",
+                                            style: isDesktop
+                                                ? STextStyles
+                                                    .desktopTextExtraExtraSmall(
+                                                        context)
+                                                : STextStyles.itemSubtitle(
+                                                    context),
+                                          ),
+                                          if (isDesktop)
+                                            const SizedBox(
+                                              height: 2,
+                                            ),
+                                          if (isDesktop)
+                                            SelectableText(
+                                              feeString,
+                                              style: isDesktop
+                                                  ? STextStyles
+                                                          .desktopTextExtraExtraSmall(
+                                                              context)
+                                                      .copyWith(
+                                                      color: Theme.of(context)
+                                                          .extension<
+                                                              StackColors>()!
+                                                          .textDark,
+                                                    )
+                                                  : STextStyles.itemSubtitle12(
+                                                      context),
+                                            ),
+                                        ],
+                                      ),
+                                      if (!isDesktop)
+                                        SelectableText(
+                                          feeString,
+                                          style: isDesktop
+                                              ? STextStyles
+                                                      .desktopTextExtraExtraSmall(
+                                                          context)
+                                                  .copyWith(
+                                                  color: Theme.of(context)
+                                                      .extension<StackColors>()!
+                                                      .textDark,
+                                                )
+                                              : STextStyles.itemSubtitle12(
+                                                  context),
+                                        ),
+                                      if (isDesktop)
+                                        IconCopyButton(data: feeString)
+                                    ],
+                                  );
+                                }),
+                              ),
+                            isDesktop
+                                ? const _Divider()
+                                : const SizedBox(
+                                    height: 12,
+                                  ),
+                            RoundedWhiteContainer(
+                              padding: isDesktop
+                                  ? const EdgeInsets.all(16)
+                                  : const EdgeInsets.all(12),
+                              child: Builder(builder: (context) {
+                                final String height;
+
+                                if (widget.coin == Coin.bitcoincash ||
+                                    widget.coin == Coin.eCash ||
+                                    widget.coin == Coin.bitcoincashTestnet) {
+                                  height =
+                                      "${_transaction.height != null && _transaction.height! > 0 ? _transaction.height! : "Pending"}";
+                                } else {
+                                  height = widget.coin != Coin.epicCash &&
+                                          _transaction.isConfirmed(
+                                            currentHeight,
+                                            coin.requiredConfirmations,
+                                          )
+                                      ? "${_transaction.height == 0 ? "Unknown" : _transaction.height}"
+                                      : _transaction.getConfirmations(
+                                                  currentHeight) >
+                                              0
+                                          ? "${_transaction.height}"
+                                          : "Pending";
+                                }
+
+                                return Row(
+                                  mainAxisAlignment:
+                                      MainAxisAlignment.spaceBetween,
+                                  crossAxisAlignment: CrossAxisAlignment.start,
+                                  children: [
+                                    Column(
+                                      crossAxisAlignment:
+                                          CrossAxisAlignment.start,
+                                      children: [
+                                        Text(
+                                          "Block height",
+                                          style: isDesktop
+                                              ? STextStyles
+                                                  .desktopTextExtraExtraSmall(
+                                                      context)
+                                              : STextStyles.itemSubtitle(
+                                                  context),
+                                        ),
+                                        if (isDesktop)
+                                          const SizedBox(
+                                            height: 2,
+                                          ),
+                                        if (isDesktop)
+                                          SelectableText(
+                                            height,
+                                            style: isDesktop
+                                                ? STextStyles
+                                                        .desktopTextExtraExtraSmall(
+                                                            context)
+                                                    .copyWith(
+                                                    color: Theme.of(context)
+                                                        .extension<
+                                                            StackColors>()!
+                                                        .textDark,
+                                                  )
+                                                : STextStyles.itemSubtitle12(
+                                                    context),
+                                          ),
+                                      ],
+                                    ),
+                                    if (!isDesktop)
+                                      SelectableText(
+                                        height,
+                                        style: isDesktop
+                                            ? STextStyles
+                                                    .desktopTextExtraExtraSmall(
+                                                        context)
+                                                .copyWith(
+                                                color: Theme.of(context)
+                                                    .extension<StackColors>()!
+                                                    .textDark,
+                                              )
+                                            : STextStyles.itemSubtitle12(
+                                                context),
+                                      ),
+                                    if (isDesktop) IconCopyButton(data: height),
+                                  ],
+                                );
+                              }),
+                            ),
+
+                            if (kDebugMode)
+                              isDesktop
+                                  ? const _Divider()
+                                  : const SizedBox(
+                                      height: 12,
+                                    ),
+                            if (kDebugMode)
+                              RoundedWhiteContainer(
+                                padding: isDesktop
+                                    ? const EdgeInsets.all(16)
+                                    : const EdgeInsets.all(12),
+                                child: Row(
+                                  crossAxisAlignment: CrossAxisAlignment.start,
+                                  mainAxisAlignment:
+                                      MainAxisAlignment.spaceBetween,
+                                  children: [
+                                    Text(
+                                      "Tx sub type",
+                                      style: isDesktop
+                                          ? STextStyles
+                                              .desktopTextExtraExtraSmall(
+                                                  context)
+                                          : STextStyles.itemSubtitle(context),
+                                    ),
+                                    SelectableText(
+                                      _transaction.subType.toString(),
+                                      style: isDesktop
+                                          ? STextStyles
+                                                  .desktopTextExtraExtraSmall(
+                                                      context)
+                                              .copyWith(
+                                              color: Theme.of(context)
+                                                  .extension<StackColors>()!
+                                                  .textDark,
+                                            )
+                                          : STextStyles.itemSubtitle12(context),
+                                    ),
+                                  ],
+                                ),
+                              ),
+                            isDesktop
+                                ? const _Divider()
+                                : const SizedBox(
+                                    height: 12,
+                                  ),
+                            RoundedWhiteContainer(
+                              padding: isDesktop
+                                  ? const EdgeInsets.all(16)
+                                  : const EdgeInsets.all(12),
+                              child: Row(
+                                crossAxisAlignment: CrossAxisAlignment.start,
+                                mainAxisAlignment:
+                                    MainAxisAlignment.spaceBetween,
+                                children: [
+                                  Expanded(
+                                    child: Column(
+                                      crossAxisAlignment:
+                                          CrossAxisAlignment.start,
+                                      children: [
+                                        Text(
+                                          "Transaction ID",
+                                          style: isDesktop
+                                              ? STextStyles
+                                                  .desktopTextExtraExtraSmall(
+                                                      context)
+                                              : STextStyles.itemSubtitle(
+                                                  context),
+                                        ),
+                                        const SizedBox(
+                                          height: 8,
+                                        ),
+                                        // Flexible(
+                                        //   child: FittedBox(
+                                        //     fit: BoxFit.scaleDown,
+                                        //     child:
+                                        SelectableText(
+                                          _transaction.txid,
+                                          style: isDesktop
+                                              ? STextStyles
+                                                      .desktopTextExtraExtraSmall(
+                                                          context)
+                                                  .copyWith(
+                                                  color: Theme.of(context)
+                                                      .extension<StackColors>()!
+                                                      .textDark,
+                                                )
+                                              : STextStyles.itemSubtitle12(
+                                                  context),
+                                        ),
+                                        if (coin != Coin.epicCash)
+                                          const SizedBox(
+                                            height: 8,
+                                          ),
+                                        if (coin != Coin.epicCash)
+                                          CustomTextButton(
+                                            text: "Open in block explorer",
+                                            onTap: () async {
+                                              final uri =
+                                                  getBlockExplorerTransactionUrlFor(
+                                                coin: coin,
+                                                txid: _transaction.txid,
+                                              );
+
+                                              if (ref
+                                                      .read(
+                                                          prefsChangeNotifierProvider)
+                                                      .hideBlockExplorerWarning ==
+                                                  false) {
+                                                final shouldContinue =
+                                                    await showExplorerWarning(
+                                                        "${uri.scheme}://${uri.host}");
+
+                                                if (!shouldContinue) {
+                                                  return;
+                                                }
+                                              }
+
+                                              // ref
+                                              //     .read(
+                                              //         shouldShowLockscreenOnResumeStateProvider
+                                              //             .state)
+                                              //     .state = false;
+                                              try {
+                                                await launchUrl(
+                                                  uri,
+                                                  mode: LaunchMode
+                                                      .externalApplication,
+                                                );
+                                              } catch (_) {
+                                                if (mounted) {
+                                                  unawaited(
+                                                    showDialog<void>(
+                                                      context: context,
+                                                      builder: (_) =>
+                                                          StackOkDialog(
+                                                        title:
+                                                            "Could not open in block explorer",
+                                                        message:
+                                                            "Failed to open \"${uri.toString()}\"",
+                                                      ),
+                                                    ),
+                                                  );
+                                                }
+                                              } finally {
+                                                // Future<void>.delayed(
+                                                //   const Duration(seconds: 1),
+                                                //   () => ref
+                                                //       .read(
+                                                //           shouldShowLockscreenOnResumeStateProvider
+                                                //               .state)
+                                                //       .state = true,
+                                                // );
+                                              }
+                                            },
+                                          ),
+                                        //   ),
+                                        // ),
+                                      ],
+                                    ),
+                                  ),
+                                  if (isDesktop)
+                                    const SizedBox(
+                                      width: 12,
+                                    ),
+                                  if (isDesktop)
+                                    IconCopyButton(
+                                      data: _transaction.txid,
+                                    ),
+                                ],
+                              ),
+                            ),
+                            // if ((coin == Coin.firoTestNet || coin == Coin.firo) &&
+                            //     _transaction.subType == "mint")
+                            //   const SizedBox(
+                            //     height: 12,
+                            //   ),
+                            // if ((coin == Coin.firoTestNet || coin == Coin.firo) &&
+                            //     _transaction.subType == "mint")
+                            //   RoundedWhiteContainer(
+                            //     child: Column(
+                            //       crossAxisAlignment: CrossAxisAlignment.start,
+                            //       children: [
+                            //         Row(
+                            //           mainAxisAlignment: MainAxisAlignment.spaceBetween,
+                            //           children: [
+                            //             Text(
+                            //               "Mint Transaction ID",
+                            //               style: STextStyles.itemSubtitle(context),
+                            //             ),
+                            //           ],
+                            //         ),
+                            //         const SizedBox(
+                            //           height: 8,
+                            //         ),
+                            //         // Flexible(
+                            //         //   child: FittedBox(
+                            //         //     fit: BoxFit.scaleDown,
+                            //         //     child:
+                            //         SelectableText(
+                            //           _transaction.otherData ?? "Unknown",
+                            //           style: STextStyles.itemSubtitle12(context),
+                            //         ),
+                            //         //   ),
+                            //         // ),
+                            //         const SizedBox(
+                            //           height: 8,
+                            //         ),
+                            //         BlueTextButton(
+                            //           text: "Open in block explorer",
+                            //           onTap: () async {
+                            //             final uri = getBlockExplorerTransactionUrlFor(
+                            //               coin: coin,
+                            //               txid: _transaction.otherData ?? "Unknown",
+                            //             );
+                            //             // ref
+                            //             //     .read(
+                            //             //         shouldShowLockscreenOnResumeStateProvider
+                            //             //             .state)
+                            //             //     .state = false;
+                            //             try {
+                            //               await launchUrl(
+                            //                 uri,
+                            //                 mode: LaunchMode.externalApplication,
+                            //               );
+                            //             } catch (_) {
+                            //               unawaited(showDialog<void>(
+                            //                 context: context,
+                            //                 builder: (_) => StackOkDialog(
+                            //                   title: "Could not open in block explorer",
+                            //                   message:
+                            //                       "Failed to open \"${uri.toString()}\"",
+                            //                 ),
+                            //               ));
+                            //             } finally {
+                            //               // Future<void>.delayed(
+                            //               //   const Duration(seconds: 1),
+                            //               //   () => ref
+                            //               //       .read(
+                            //               //           shouldShowLockscreenOnResumeStateProvider
+                            //               //               .state)
+                            //               //       .state = true,
+                            //               // );
+                            //             }
+                            //           },
+                            //         ),
+                            //       ],
+                            //     ),
+                            //   ),
+
+                            if (!isDesktop)
+                              const SizedBox(
+                                height: 12,
+                              ),
+                          ],
+                        ),
+                      ),
+                    ),
+                  ),
+                ),
+              ),
+            ],
+          ),
+        ),
+      ),
+    );
+  }
+}
+
+class OutputCard extends ConsumerWidget {
+  const OutputCard({
+    super.key,
+    required this.address,
+    required this.amount,
+    required this.coin,
+  });
+
+  final String address;
+  final Amount amount;
+  final Coin coin;
+
+  @override
+  Widget build(BuildContext context, WidgetRef ref) {
+    return Column(
+      crossAxisAlignment: CrossAxisAlignment.start,
+      children: [
+        Text(
+          "Address",
+          style: Util.isDesktop
+              ? STextStyles.desktopTextExtraExtraSmall(context)
+              : STextStyles.itemSubtitle(context),
+        ),
+        SelectableText(
+          address,
+          style: Util.isDesktop
+              ? STextStyles.desktopTextExtraExtraSmall(context).copyWith(
+                  color: Theme.of(context).extension<StackColors>()!.textDark,
+                )
+              : STextStyles.itemSubtitle12(context),
+        ),
+        const SizedBox(
+          height: 10,
+        ),
+        Row(
+          mainAxisAlignment: MainAxisAlignment.spaceBetween,
+          children: [
+            Text(
+              "Amount",
+              style: Util.isDesktop
+                  ? STextStyles.desktopTextExtraExtraSmall(context)
+                  : STextStyles.itemSubtitle(context),
+            ),
+            SelectableText(
+              ref.watch(pAmountFormatter(coin)).format(amount),
+              style: Util.isDesktop
+                  ? STextStyles.desktopTextExtraExtraSmall(context).copyWith(
+                      color:
+                          Theme.of(context).extension<StackColors>()!.textDark,
+                    )
+                  : STextStyles.itemSubtitle12(context),
+            ),
+          ],
+        )
+      ],
+    );
+  }
+}
+
+class _Divider extends StatelessWidget {
+  const _Divider({Key? key}) : super(key: key);
+
+  @override
+  Widget build(BuildContext context) {
+    return Container(
+      height: 1,
+      color: Theme.of(context).extension<StackColors>()!.backgroundAppBar,
+    );
+  }
+}
+
+class IconCopyButton extends StatelessWidget {
+  const IconCopyButton({
+    Key? key,
+    required this.data,
+  }) : super(key: key);
+
+  final String data;
+
+  @override
+  Widget build(BuildContext context) {
+    return SizedBox(
+      height: 26,
+      width: 26,
+      child: RawMaterialButton(
+        fillColor:
+            Theme.of(context).extension<StackColors>()!.buttonBackSecondary,
+        elevation: 0,
+        hoverElevation: 0,
+        shape: RoundedRectangleBorder(
+          borderRadius: BorderRadius.circular(6),
+        ),
+        onPressed: () async {
+          await Clipboard.setData(ClipboardData(text: data));
+          if (context.mounted) {
+            unawaited(
+              showFloatingFlushBar(
+                type: FlushBarType.info,
+                message: "Copied to clipboard",
+                context: context,
+              ),
+            );
+          }
+        },
+        child: Padding(
+          padding: const EdgeInsets.all(5),
+          child: CopyIcon(
+            width: 16,
+            height: 16,
+            color: Theme.of(context).extension<StackColors>()!.textDark,
+          ),
+        ),
+      ),
+    );
+  }
+}
+
+class IconPencilButton extends StatelessWidget {
+  const IconPencilButton({
+    Key? key,
+    this.onPressed,
+  }) : super(key: key);
+
+  final VoidCallback? onPressed;
+
+  @override
+  Widget build(BuildContext context) {
+    return SizedBox(
+      height: 26,
+      width: 26,
+      child: RawMaterialButton(
+        fillColor:
+            Theme.of(context).extension<StackColors>()!.buttonBackSecondary,
+        elevation: 0,
+        hoverElevation: 0,
+        shape: RoundedRectangleBorder(
+          borderRadius: BorderRadius.circular(6),
+        ),
+        onPressed: () => onPressed?.call(),
+        child: Padding(
+          padding: const EdgeInsets.all(5),
+          child: PencilIcon(
+            width: 16,
+            height: 16,
+            color: Theme.of(context).extension<StackColors>()!.textDark,
+          ),
+        ),
+      ),
+    );
+  }
+}
diff --git a/lib/pages/wallet_view/transaction_views/tx_v2/transaction_v2_list.dart b/lib/pages/wallet_view/transaction_views/tx_v2/transaction_v2_list.dart
new file mode 100644
index 000000000..3179fedcc
--- /dev/null
+++ b/lib/pages/wallet_view/transaction_views/tx_v2/transaction_v2_list.dart
@@ -0,0 +1,230 @@
+/* 
+ * This file is part of Stack Wallet.
+ * 
+ * Copyright (c) 2023 Cypher Stack
+ * All Rights Reserved.
+ * The code is distributed under GPLv3 license, see LICENSE file for details.
+ * Generated by Cypher Stack on 2023-10-19
+ *
+ */
+
+import 'dart:async';
+
+import 'package:flutter/material.dart';
+import 'package:flutter_riverpod/flutter_riverpod.dart';
+import 'package:isar/isar.dart';
+import 'package:stackwallet/models/isar/models/blockchain_data/transaction.dart';
+import 'package:stackwallet/models/isar/models/blockchain_data/v2/transaction_v2.dart';
+import 'package:stackwallet/pages/wallet_view/sub_widgets/no_transactions_found.dart';
+import 'package:stackwallet/pages/wallet_view/transaction_views/tx_v2/fusion_tx_group_card.dart';
+import 'package:stackwallet/pages/wallet_view/transaction_views/tx_v2/transaction_v2_list_item.dart';
+import 'package:stackwallet/pages/wallet_view/wallet_view.dart';
+import 'package:stackwallet/providers/db/main_db_provider.dart';
+import 'package:stackwallet/providers/global/wallets_provider.dart';
+import 'package:stackwallet/themes/stack_colors.dart';
+import 'package:stackwallet/utilities/constants.dart';
+import 'package:stackwallet/utilities/util.dart';
+import 'package:stackwallet/widgets/loading_indicator.dart';
+
+class TransactionsV2List extends ConsumerStatefulWidget {
+  const TransactionsV2List({
+    Key? key,
+    required this.walletId,
+  }) : super(key: key);
+
+  final String walletId;
+
+  @override
+  ConsumerState<TransactionsV2List> createState() => _TransactionsV2ListState();
+}
+
+class _TransactionsV2ListState extends ConsumerState<TransactionsV2List> {
+  bool _hasLoaded = false;
+  List<TransactionV2> _transactions = [];
+
+  BorderRadius get _borderRadiusFirst {
+    return BorderRadius.only(
+      topLeft: Radius.circular(
+        Constants.size.circularBorderRadius,
+      ),
+      topRight: Radius.circular(
+        Constants.size.circularBorderRadius,
+      ),
+    );
+  }
+
+  BorderRadius get _borderRadiusLast {
+    return BorderRadius.only(
+      bottomLeft: Radius.circular(
+        Constants.size.circularBorderRadius,
+      ),
+      bottomRight: Radius.circular(
+        Constants.size.circularBorderRadius,
+      ),
+    );
+  }
+
+  @override
+  Widget build(BuildContext context) {
+    final manager = ref.watch(walletsChangeNotifierProvider
+        .select((value) => value.getManager(widget.walletId)));
+
+    return FutureBuilder(
+      future: ref
+          .watch(mainDBProvider)
+          .isar
+          .transactionV2s
+          .where()
+          .walletIdEqualTo(widget.walletId)
+          .sortByTimestampDesc()
+          .findAll(),
+      builder: (fbContext, AsyncSnapshot<List<TransactionV2>> snapshot) {
+        if (snapshot.connectionState == ConnectionState.done &&
+            snapshot.hasData) {
+          _transactions = snapshot.data!;
+          _hasLoaded = true;
+        }
+        if (!_hasLoaded) {
+          return const Column(
+            children: [
+              Spacer(),
+              Center(
+                child: LoadingIndicator(
+                  height: 50,
+                  width: 50,
+                ),
+              ),
+              Spacer(
+                flex: 4,
+              ),
+            ],
+          );
+        }
+        if (_transactions.isEmpty) {
+          return const NoTransActionsFound();
+        } else {
+          _transactions.sort((a, b) => b.timestamp - a.timestamp);
+
+          final List<Object> _txns = [];
+
+          List<TransactionV2> fusions = [];
+
+          for (int i = 0; i < _transactions.length; i++) {
+            final tx = _transactions[i];
+
+            if (tx.subType == TransactionSubType.cashFusion) {
+              if (fusions.isNotEmpty) {
+                final prevTime = DateTime.fromMillisecondsSinceEpoch(
+                    fusions.last.timestamp * 1000);
+                final thisTime =
+                    DateTime.fromMillisecondsSinceEpoch(tx.timestamp * 1000);
+
+                if (prevTime.difference(thisTime).inMinutes > 30) {
+                  _txns.add(FusionTxGroup(fusions));
+                  fusions = [tx];
+                  continue;
+                }
+              }
+
+              fusions.add(tx);
+            }
+
+            if (i + 1 < _transactions.length) {
+              final nextTx = _transactions[i + 1];
+              if (nextTx.subType != TransactionSubType.cashFusion &&
+                  fusions.isNotEmpty) {
+                _txns.add(FusionTxGroup(fusions));
+                fusions = [];
+              }
+            }
+
+            if (tx.subType != TransactionSubType.cashFusion) {
+              _txns.add(tx);
+            }
+          }
+
+          return RefreshIndicator(
+            onRefresh: () async {
+              final managerProvider = ref
+                  .read(walletsChangeNotifierProvider)
+                  .getManagerProvider(widget.walletId);
+              if (!ref.read(managerProvider).isRefreshing) {
+                unawaited(ref.read(managerProvider).refresh());
+              }
+            },
+            child: Util.isDesktop
+                ? ListView.separated(
+                    shrinkWrap: true,
+                    itemBuilder: (context, index) {
+                      BorderRadius? radius;
+                      if (_txns.length == 1) {
+                        radius = BorderRadius.circular(
+                          Constants.size.circularBorderRadius,
+                        );
+                      } else if (index == _txns.length - 1) {
+                        radius = _borderRadiusLast;
+                      } else if (index == 0) {
+                        radius = _borderRadiusFirst;
+                      }
+                      final tx = _txns[index];
+                      return TxListItem(
+                        tx: tx,
+                        coin: manager.coin,
+                        radius: radius,
+                      );
+                    },
+                    separatorBuilder: (context, index) {
+                      return Container(
+                        width: double.infinity,
+                        height: 2,
+                        color: Theme.of(context)
+                            .extension<StackColors>()!
+                            .background,
+                      );
+                    },
+                    itemCount: _txns.length,
+                  )
+                : ListView.builder(
+                    itemCount: _txns.length,
+                    itemBuilder: (context, index) {
+                      BorderRadius? radius;
+                      bool shouldWrap = false;
+                      if (_txns.length == 1) {
+                        radius = BorderRadius.circular(
+                          Constants.size.circularBorderRadius,
+                        );
+                      } else if (index == _txns.length - 1) {
+                        radius = _borderRadiusLast;
+                        shouldWrap = true;
+                      } else if (index == 0) {
+                        radius = _borderRadiusFirst;
+                      }
+                      final tx = _txns[index];
+                      if (shouldWrap) {
+                        return Column(
+                          children: [
+                            TxListItem(
+                              tx: tx,
+                              coin: manager.coin,
+                              radius: radius,
+                            ),
+                            const SizedBox(
+                              height: WalletView.navBarHeight + 14,
+                            ),
+                          ],
+                        );
+                      } else {
+                        return TxListItem(
+                          tx: tx,
+                          coin: manager.coin,
+                          radius: radius,
+                        );
+                      }
+                    },
+                  ),
+          );
+        }
+      },
+    );
+  }
+}
diff --git a/lib/pages/wallet_view/transaction_views/tx_v2/transaction_v2_list_item.dart b/lib/pages/wallet_view/transaction_views/tx_v2/transaction_v2_list_item.dart
new file mode 100644
index 000000000..b0171c950
--- /dev/null
+++ b/lib/pages/wallet_view/transaction_views/tx_v2/transaction_v2_list_item.dart
@@ -0,0 +1,179 @@
+import 'dart:async';
+
+import 'package:flutter/material.dart';
+import 'package:flutter_riverpod/flutter_riverpod.dart';
+import 'package:stackwallet/models/isar/models/blockchain_data/v2/transaction_v2.dart';
+import 'package:stackwallet/models/isar/models/isar_models.dart';
+import 'package:stackwallet/pages/exchange_view/trade_details_view.dart';
+import 'package:stackwallet/pages/wallet_view/transaction_views/tx_v2/fusion_tx_group_card.dart';
+import 'package:stackwallet/pages/wallet_view/transaction_views/tx_v2/transaction_v2_card.dart';
+import 'package:stackwallet/providers/global/trades_service_provider.dart';
+import 'package:stackwallet/providers/global/wallets_provider.dart';
+import 'package:stackwallet/route_generator.dart';
+import 'package:stackwallet/themes/stack_colors.dart';
+import 'package:stackwallet/utilities/enums/coin_enum.dart';
+import 'package:stackwallet/utilities/text_styles.dart';
+import 'package:stackwallet/utilities/util.dart';
+import 'package:stackwallet/widgets/desktop/desktop_dialog.dart';
+import 'package:stackwallet/widgets/desktop/desktop_dialog_close_button.dart';
+import 'package:stackwallet/widgets/trade_card.dart';
+import 'package:tuple/tuple.dart';
+
+class TxListItem extends ConsumerWidget {
+  const TxListItem({
+    super.key,
+    required this.tx,
+    this.radius,
+    required this.coin,
+  }) : assert(tx is TransactionV2 || tx is FusionTxGroup);
+
+  final Object tx;
+  final BorderRadius? radius;
+  final Coin coin;
+
+  @override
+  Widget build(BuildContext context, WidgetRef ref) {
+    if (tx is TransactionV2) {
+      final _tx = tx as TransactionV2;
+
+      final matchingTrades = ref
+          .read(tradesServiceProvider)
+          .trades
+          .where((e) => e.payInTxid == _tx.txid || e.payOutTxid == _tx.txid);
+
+      if (_tx.type == TransactionType.outgoing && matchingTrades.isNotEmpty) {
+        final trade = matchingTrades.first;
+        return Container(
+          decoration: BoxDecoration(
+            color: Theme.of(context).extension<StackColors>()!.popupBG,
+            borderRadius: radius,
+          ),
+          child: Column(
+            mainAxisSize: MainAxisSize.min,
+            children: [
+              TransactionCardV2(
+                key: UniqueKey(),
+                transaction: _tx,
+              ),
+              TradeCard(
+                key: Key(_tx.txid +
+                    _tx.type.name +
+                    _tx.hashCode.toString() +
+                    trade.uuid), //
+                trade: trade,
+                onTap: () async {
+                  if (Util.isDesktop) {
+                    await showDialog<void>(
+                      context: context,
+                      builder: (context) => Navigator(
+                        initialRoute: TradeDetailsView.routeName,
+                        onGenerateRoute: RouteGenerator.generateRoute,
+                        onGenerateInitialRoutes: (_, __) {
+                          return [
+                            FadePageRoute(
+                              DesktopDialog(
+                                maxHeight: null,
+                                maxWidth: 580,
+                                child: Column(
+                                  mainAxisSize: MainAxisSize.min,
+                                  children: [
+                                    Padding(
+                                      padding: const EdgeInsets.only(
+                                        left: 32,
+                                        bottom: 16,
+                                      ),
+                                      child: Row(
+                                        mainAxisAlignment:
+                                            MainAxisAlignment.spaceBetween,
+                                        children: [
+                                          Text(
+                                            "Trade details",
+                                            style:
+                                                STextStyles.desktopH3(context),
+                                          ),
+                                          DesktopDialogCloseButton(
+                                            onPressedOverride: Navigator.of(
+                                              context,
+                                              rootNavigator: true,
+                                            ).pop,
+                                          ),
+                                        ],
+                                      ),
+                                    ),
+                                    Flexible(
+                                      child: TradeDetailsView(
+                                        tradeId: trade.tradeId,
+                                        // TODO
+                                        // transactionIfSentFromStack: tx,
+                                        transactionIfSentFromStack: null,
+                                        walletName: ref.watch(
+                                          walletsChangeNotifierProvider.select(
+                                            (value) => value
+                                                .getManager(_tx.walletId)
+                                                .walletName,
+                                          ),
+                                        ),
+                                        walletId: _tx.walletId,
+                                      ),
+                                    ),
+                                  ],
+                                ),
+                              ),
+                              const RouteSettings(
+                                name: TradeDetailsView.routeName,
+                              ),
+                            ),
+                          ];
+                        },
+                      ),
+                    );
+                  } else {
+                    unawaited(
+                      Navigator.of(context).pushNamed(
+                        TradeDetailsView.routeName,
+                        arguments: Tuple4(
+                          trade.tradeId,
+                          _tx,
+                          _tx.walletId,
+                          ref
+                              .read(walletsChangeNotifierProvider)
+                              .getManager(_tx.walletId)
+                              .walletName,
+                        ),
+                      ),
+                    );
+                  }
+                },
+              )
+            ],
+          ),
+        );
+      } else {
+        return Container(
+          decoration: BoxDecoration(
+            color: Theme.of(context).extension<StackColors>()!.popupBG,
+            borderRadius: radius,
+          ),
+          child: TransactionCardV2(
+            // this may mess with combined firo transactions
+            key: UniqueKey(),
+            transaction: _tx,
+          ),
+        );
+      }
+    }
+
+    final group = tx as FusionTxGroup;
+
+    return Container(
+      decoration: BoxDecoration(
+        color: Theme.of(context).extension<StackColors>()!.popupBG,
+        borderRadius: radius,
+      ),
+      child: FusionTxGroupCard(
+        key: UniqueKey(),
+        group: group,
+      ),
+    );
+  }
+}
diff --git a/lib/pages/wallet_view/wallet_view.dart b/lib/pages/wallet_view/wallet_view.dart
index cf73e8eee..34456cebd 100644
--- a/lib/pages/wallet_view/wallet_view.dart
+++ b/lib/pages/wallet_view/wallet_view.dart
@@ -19,6 +19,7 @@ import 'package:isar/isar.dart';
 import 'package:stackwallet/models/isar/exchange_cache/currency.dart';
 import 'package:stackwallet/notifications/show_flush_bar.dart';
 import 'package:stackwallet/pages/buy_view/buy_in_wallet_view.dart';
+import 'package:stackwallet/pages/cashfusion/cashfusion_view.dart';
 import 'package:stackwallet/pages/coin_control/coin_control_view.dart';
 import 'package:stackwallet/pages/exchange_view/wallet_initiated_exchange_view.dart';
 import 'package:stackwallet/pages/home_view/home_view.dart';
@@ -36,6 +37,8 @@ import 'package:stackwallet/pages/token_view/my_tokens_view.dart';
 import 'package:stackwallet/pages/wallet_view/sub_widgets/transactions_list.dart';
 import 'package:stackwallet/pages/wallet_view/sub_widgets/wallet_summary.dart';
 import 'package:stackwallet/pages/wallet_view/transaction_views/all_transactions_view.dart';
+import 'package:stackwallet/pages/wallet_view/transaction_views/tx_v2/all_transactions_v2_view.dart';
+import 'package:stackwallet/pages/wallet_view/transaction_views/tx_v2/transaction_v2_list.dart';
 import 'package:stackwallet/providers/global/auto_swb_service_provider.dart';
 import 'package:stackwallet/providers/global/paynym_api_provider.dart';
 import 'package:stackwallet/providers/providers.dart';
@@ -84,6 +87,8 @@ import 'package:stackwallet/widgets/wallet_navigation_bar/components/wallet_navi
 import 'package:stackwallet/widgets/wallet_navigation_bar/wallet_navigation_bar.dart';
 import 'package:tuple/tuple.dart';
 
+import '../../widgets/wallet_navigation_bar/components/icons/fusion_nav_icon.dart';
+
 /// [eventBus] should only be set during testing
 class WalletView extends ConsumerStatefulWidget {
   const WalletView({
@@ -839,7 +844,10 @@ class _WalletViewState extends ConsumerState<WalletView> {
                                 text: "See all",
                                 onTap: () {
                                   Navigator.of(context).pushNamed(
-                                    AllTransactionsView.routeName,
+                                    coin == Coin.bitcoincash ||
+                                            coin == Coin.bitcoincashTestnet
+                                        ? AllTransactionsV2View.routeName
+                                        : AllTransactionsView.routeName,
                                     arguments: walletId,
                                   );
                                 },
@@ -878,7 +886,7 @@ class _WalletViewState extends ConsumerState<WalletView> {
                                       0.0,
                                       0.8,
                                       1.0,
-                                    ], // 10% purple, 80% transparent, 10% purple
+                                    ],
                                   ).createShader(bounds);
                                 },
                                 child: Container(
@@ -893,10 +901,16 @@ class _WalletViewState extends ConsumerState<WalletView> {
                                         CrossAxisAlignment.stretch,
                                     children: [
                                       Expanded(
-                                        child: TransactionsList(
-                                          managerProvider: managerProvider,
-                                          walletId: walletId,
-                                        ),
+                                        child: coin == Coin.bitcoincash ||
+                                                coin == Coin.bitcoincashTestnet
+                                            ? TransactionsV2List(
+                                                walletId: widget.walletId,
+                                              )
+                                            : TransactionsList(
+                                                managerProvider:
+                                                    managerProvider,
+                                                walletId: walletId,
+                                              ),
                                       ),
                                     ],
                                   ),
@@ -1101,6 +1115,22 @@ class _WalletViewState extends ConsumerState<WalletView> {
                         );
                       },
                     ),
+                  if (ref.watch(
+                    walletsChangeNotifierProvider.select(
+                      (value) =>
+                          value.getManager(widget.walletId).hasFusionSupport,
+                    ),
+                  ))
+                    WalletNavigationBarItemData(
+                      label: "Fusion",
+                      icon: const FusionNavIcon(),
+                      onTap: () {
+                        Navigator.of(context).pushNamed(
+                          CashFusionView.routeName,
+                          arguments: walletId,
+                        );
+                      },
+                    ),
                 ],
               ),
             ],
diff --git a/lib/pages_desktop_specific/addresses/sub_widgets/desktop_address_list.dart b/lib/pages_desktop_specific/addresses/sub_widgets/desktop_address_list.dart
index f0b4836f8..62645f858 100644
--- a/lib/pages_desktop_specific/addresses/sub_widgets/desktop_address_list.dart
+++ b/lib/pages_desktop_specific/addresses/sub_widgets/desktop_address_list.dart
@@ -210,30 +210,27 @@ class _DesktopAddressListState extends ConsumerState<DesktopAddressList> {
           height: 20,
         ),
         Expanded(
-          child: SingleChildScrollView(
-            child: RoundedWhiteContainer(
-              padding: EdgeInsets.zero,
-              child: ListView.separated(
-                shrinkWrap: true,
-                itemCount: ids.length,
-                separatorBuilder: (_, __) => Container(
-                  height: 1,
-                  color: Theme.of(context)
-                      .extension<StackColors>()!
-                      .backgroundAppBar,
-                ),
-                itemBuilder: (_, index) => Padding(
-                  padding: const EdgeInsets.all(4),
-                  child: AddressCard(
-                    key: Key("addressCardDesktop_key_${ids[index]}"),
-                    walletId: widget.walletId,
-                    addressId: ids[index],
-                    coin: coin,
-                    onPressed: () {
-                      ref.read(desktopSelectedAddressId.state).state =
-                          ids[index];
-                    },
-                  ),
+          child: RoundedWhiteContainer(
+            padding: EdgeInsets.zero,
+            child: ListView.separated(
+              shrinkWrap: true,
+              itemCount: ids.length,
+              separatorBuilder: (_, __) => Container(
+                height: 1,
+                color: Theme.of(context)
+                    .extension<StackColors>()!
+                    .backgroundAppBar,
+              ),
+              itemBuilder: (_, index) => Padding(
+                padding: const EdgeInsets.all(4),
+                child: AddressCard(
+                  key: Key("addressCardDesktop_key_${ids[index]}"),
+                  walletId: widget.walletId,
+                  addressId: ids[index],
+                  coin: coin,
+                  onPressed: () {
+                    ref.read(desktopSelectedAddressId.state).state = ids[index];
+                  },
                 ),
               ),
             ),
diff --git a/lib/pages_desktop_specific/cashfusion/desktop_cashfusion_view.dart b/lib/pages_desktop_specific/cashfusion/desktop_cashfusion_view.dart
new file mode 100644
index 000000000..7759d0885
--- /dev/null
+++ b/lib/pages_desktop_specific/cashfusion/desktop_cashfusion_view.dart
@@ -0,0 +1,586 @@
+/* 
+ * This file is part of Stack Wallet.
+ * 
+ * Copyright (c) 2023 Cypher Stack
+ * All Rights Reserved.
+ * The code is distributed under GPLv3 license, see LICENSE file for details.
+ * Generated by Cypher Stack on 2023-05-26
+ *
+ */
+
+import 'dart:async';
+
+import 'package:dropdown_button2/dropdown_button2.dart';
+import 'package:flutter/gestures.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter/services.dart';
+import 'package:flutter_native_splash/cli_commands.dart';
+import 'package:flutter_riverpod/flutter_riverpod.dart';
+import 'package:flutter_svg/svg.dart';
+import 'package:stackwallet/pages/cashfusion/fusion_rounds_selection_sheet.dart';
+import 'package:stackwallet/pages_desktop_specific/cashfusion/sub_widgets/fusion_dialog.dart';
+import 'package:stackwallet/providers/cash_fusion/fusion_progress_ui_state_provider.dart';
+import 'package:stackwallet/providers/global/prefs_provider.dart';
+import 'package:stackwallet/providers/global/wallets_provider.dart';
+import 'package:stackwallet/services/mixins/fusion_wallet_interface.dart';
+import 'package:stackwallet/themes/stack_colors.dart';
+import 'package:stackwallet/utilities/assets.dart';
+import 'package:stackwallet/utilities/constants.dart';
+import 'package:stackwallet/utilities/text_styles.dart';
+import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart';
+import 'package:stackwallet/widgets/custom_buttons/blue_text_button.dart';
+import 'package:stackwallet/widgets/desktop/desktop_app_bar.dart';
+import 'package:stackwallet/widgets/desktop/desktop_dialog.dart';
+import 'package:stackwallet/widgets/desktop/desktop_dialog_close_button.dart';
+import 'package:stackwallet/widgets/desktop/desktop_scaffold.dart';
+import 'package:stackwallet/widgets/desktop/primary_button.dart';
+import 'package:stackwallet/widgets/rounded_white_container.dart';
+import 'package:stackwallet/widgets/stack_text_field.dart';
+
+class DesktopCashFusionView extends ConsumerStatefulWidget {
+  const DesktopCashFusionView({
+    super.key,
+    required this.walletId,
+  });
+
+  static const String routeName = "/desktopCashFusionView";
+
+  final String walletId;
+
+  @override
+  ConsumerState<DesktopCashFusionView> createState() => _DesktopCashFusion();
+}
+
+class _DesktopCashFusion extends ConsumerState<DesktopCashFusionView> {
+  late final TextEditingController serverController;
+  late final FocusNode serverFocusNode;
+  late final TextEditingController portController;
+  late final FocusNode portFocusNode;
+  late final TextEditingController fusionRoundController;
+  late final FocusNode fusionRoundFocusNode;
+
+  bool _enableStartButton = false;
+  bool _enableSSLCheckbox = false;
+
+  FusionOption _roundType = FusionOption.continuous;
+
+  Future<void> _startFusion() async {
+    final fusionWallet = ref
+        .read(walletsChangeNotifierProvider)
+        .getManager(widget.walletId)
+        .wallet as FusionWalletInterface;
+
+    try {
+      fusionWallet.uiState = ref.read(
+        fusionProgressUIStateProvider(widget.walletId),
+      );
+    } catch (e) {
+      if (!e.toString().contains(
+          "FusionProgressUIState was already set for ${widget.walletId}")) {
+        rethrow;
+      }
+    }
+
+    final int rounds = _roundType == FusionOption.continuous
+        ? 0
+        : int.parse(fusionRoundController.text);
+
+    final newInfo = FusionInfo(
+      host: serverController.text,
+      port: int.parse(portController.text),
+      ssl: _enableSSLCheckbox,
+      rounds: rounds,
+    );
+
+    // update user prefs (persistent)
+    ref.read(prefsChangeNotifierProvider).fusionServerInfo = newInfo;
+
+    unawaited(
+      fusionWallet.fuse(
+        fusionInfo: newInfo,
+      ),
+    );
+
+    await showDialog<void>(
+      context: context,
+      barrierDismissible: false,
+      builder: (context) {
+        return FusionDialogView(
+          walletId: widget.walletId,
+        );
+      },
+    );
+  }
+
+  @override
+  void initState() {
+    serverController = TextEditingController();
+    portController = TextEditingController();
+    fusionRoundController = TextEditingController();
+
+    serverFocusNode = FocusNode();
+    portFocusNode = FocusNode();
+    fusionRoundFocusNode = FocusNode();
+
+    final info = ref.read(prefsChangeNotifierProvider).fusionServerInfo;
+    serverController.text = info.host;
+    portController.text = info.port.toString();
+    _enableSSLCheckbox = info.ssl;
+    _roundType =
+        info.rounds == 0 ? FusionOption.continuous : FusionOption.custom;
+    fusionRoundController.text = info.rounds.toString();
+
+    _enableStartButton =
+        serverController.text.isNotEmpty && portController.text.isNotEmpty;
+
+    super.initState();
+  }
+
+  @override
+  void dispose() {
+    serverController.dispose();
+    portController.dispose();
+    fusionRoundController.dispose();
+
+    serverFocusNode.dispose();
+    portFocusNode.dispose();
+    fusionRoundFocusNode.dispose();
+
+    super.dispose();
+  }
+
+  @override
+  Widget build(BuildContext context) {
+    debugPrint("BUILD: $runtimeType");
+
+    return DesktopScaffold(
+      appBar: DesktopAppBar(
+        background: Theme.of(context).extension<StackColors>()!.popupBG,
+        isCompactHeight: true,
+        useSpacers: false,
+        leading: Expanded(
+          child: Padding(
+            padding: const EdgeInsets.all(24.0),
+            child: Row(
+              mainAxisAlignment: MainAxisAlignment.spaceBetween,
+              children: [
+                Row(
+                  children: [
+                    // const SizedBox(
+                    //   width: 32,
+                    // ),
+                    AppBarIconButton(
+                      size: 32,
+                      color: Theme.of(context)
+                          .extension<StackColors>()!
+                          .textFieldDefaultBG,
+                      shadows: const [],
+                      icon: SvgPicture.asset(
+                        Assets.svg.arrowLeft,
+                        width: 18,
+                        height: 18,
+                        color: Theme.of(context)
+                            .extension<StackColors>()!
+                            .topNavIconPrimary,
+                      ),
+                      onPressed: Navigator.of(context).pop,
+                    ),
+                    const SizedBox(
+                      width: 15,
+                    ),
+                    SvgPicture.asset(
+                      Assets.svg.cashFusion,
+                      width: 32,
+                      height: 32,
+                    ),
+                    const SizedBox(
+                      width: 12,
+                    ),
+                    Text(
+                      "CashFusion",
+                      style: STextStyles.desktopH3(context),
+                    ),
+                  ],
+                ),
+                MouseRegion(
+                  cursor: SystemMouseCursors.click,
+                  child: GestureDetector(
+                    onTap: () {},
+                    child: Row(
+                      children: [
+                        SvgPicture.asset(
+                          Assets.svg.circleQuestion,
+                          color: Theme.of(context)
+                              .extension<StackColors>()!
+                              .radioButtonIconBorder,
+                        ),
+                        const SizedBox(
+                          width: 8,
+                        ),
+                        RichText(
+                          text: TextSpan(
+                            text: "What is CashFusion?",
+                            style: STextStyles.richLink(context).copyWith(
+                              fontSize: 16,
+                            ),
+                            recognizer: TapGestureRecognizer()
+                              ..onTap = () {
+                                showDialog<dynamic>(
+                                  context: context,
+                                  useSafeArea: false,
+                                  barrierDismissible: true,
+                                  builder: (context) {
+                                    return DesktopDialog(
+                                      maxWidth: 580,
+                                      maxHeight: double.infinity,
+                                      child: Padding(
+                                        padding: const EdgeInsets.only(
+                                          top: 10,
+                                          left: 20,
+                                          bottom: 20,
+                                          right: 10,
+                                        ),
+                                        child: Column(
+                                          children: [
+                                            Row(
+                                              mainAxisAlignment:
+                                                  MainAxisAlignment
+                                                      .spaceBetween,
+                                              children: [
+                                                Text(
+                                                  "What is CashFusion?",
+                                                  style: STextStyles.desktopH2(
+                                                      context),
+                                                ),
+                                                DesktopDialogCloseButton(
+                                                  onPressedOverride: () =>
+                                                      Navigator.of(context)
+                                                          .pop(true),
+                                                ),
+                                              ],
+                                            ),
+                                            const SizedBox(
+                                              height: 16,
+                                            ),
+                                            Text(
+                                              "A fully decentralized privacy protocol that allows "
+                                              "anyone to create multi-party transactions with other "
+                                              "network participants. This process obscures your real "
+                                              "spending and makes it difficult for chain-analysis "
+                                              "companies to track your coins.",
+                                              style:
+                                                  STextStyles.desktopTextMedium(
+                                                          context)
+                                                      .copyWith(
+                                                color: Theme.of(context)
+                                                    .extension<StackColors>()!
+                                                    .textDark3,
+                                              ),
+                                            ),
+                                          ],
+                                        ),
+                                      ),
+                                    );
+                                  },
+                                );
+                              },
+                          ),
+                        ),
+                      ],
+                    ),
+                  ),
+                ),
+              ],
+            ),
+          ),
+        ),
+      ),
+      body: Row(
+        children: [
+          Padding(
+            padding: const EdgeInsets.all(24),
+            child: Column(
+              crossAxisAlignment: CrossAxisAlignment.start,
+              children: [
+                SizedBox(
+                  width: 460,
+                  child: RoundedWhiteContainer(
+                    child: Row(
+                      children: [
+                        Text(
+                          "CashFusion allows you to anonymize your BCH coins.",
+                          style:
+                              STextStyles.desktopTextExtraExtraSmall(context),
+                        ),
+                      ],
+                    ),
+                  ),
+                ),
+                const SizedBox(
+                  height: 24,
+                ),
+                SizedBox(
+                  width: 460,
+                  child: RoundedWhiteContainer(
+                    child: Column(
+                      crossAxisAlignment: CrossAxisAlignment.start,
+                      children: [
+                        Row(
+                          mainAxisAlignment: MainAxisAlignment.spaceBetween,
+                          children: [
+                            Text(
+                              "Server settings",
+                              style: STextStyles.desktopTextExtraExtraSmall(
+                                  context),
+                            ),
+                            CustomTextButton(
+                              text: "Default",
+                              onTap: () {
+                                const def = FusionInfo.DEFAULTS;
+                                serverController.text = def.host;
+                                portController.text = def.port.toString();
+                                fusionRoundController.text =
+                                    def.rounds.toString();
+                                _roundType = FusionOption.continuous;
+                                setState(() {
+                                  _enableSSLCheckbox = def.ssl;
+                                });
+                              },
+                            ),
+                          ],
+                        ),
+                        const SizedBox(
+                          height: 12,
+                        ),
+                        ClipRRect(
+                          borderRadius: BorderRadius.circular(
+                            Constants.size.circularBorderRadius,
+                          ),
+                          child: TextField(
+                            autocorrect: false,
+                            enableSuggestions: false,
+                            controller: serverController,
+                            focusNode: serverFocusNode,
+                            onChanged: (value) {
+                              setState(() {
+                                _enableStartButton = value.isNotEmpty &&
+                                    portController.text.isNotEmpty &&
+                                    fusionRoundController.text.isNotEmpty;
+                              });
+                            },
+                            style: STextStyles.field(context),
+                            decoration: standardInputDecoration(
+                              "Server",
+                              serverFocusNode,
+                              context,
+                              desktopMed: true,
+                            ),
+                          ),
+                        ),
+                        const SizedBox(
+                          height: 12,
+                        ),
+                        ClipRRect(
+                          borderRadius: BorderRadius.circular(
+                            Constants.size.circularBorderRadius,
+                          ),
+                          child: TextField(
+                            autocorrect: false,
+                            enableSuggestions: false,
+                            controller: portController,
+                            focusNode: portFocusNode,
+                            inputFormatters: [
+                              FilteringTextInputFormatter.digitsOnly
+                            ],
+                            onChanged: (value) {
+                              setState(() {
+                                _enableStartButton = value.isNotEmpty &&
+                                    serverController.text.isNotEmpty &&
+                                    fusionRoundController.text.isNotEmpty;
+                              });
+                            },
+                            style: STextStyles.field(context),
+                            decoration: standardInputDecoration(
+                              "Port",
+                              portFocusNode,
+                              context,
+                              desktopMed: true,
+                            ),
+                          ),
+                        ),
+                        const SizedBox(
+                          height: 12,
+                        ),
+                        GestureDetector(
+                          onTap: () {
+                            setState(() {
+                              _enableSSLCheckbox = !_enableSSLCheckbox;
+                            });
+                          },
+                          child: Container(
+                            color: Colors.transparent,
+                            child: Row(
+                              children: [
+                                SizedBox(
+                                  width: 20,
+                                  height: 20,
+                                  child: Checkbox(
+                                    materialTapTargetSize:
+                                        MaterialTapTargetSize.shrinkWrap,
+                                    value: _enableSSLCheckbox,
+                                    onChanged: (newValue) {
+                                      setState(
+                                        () {
+                                          _enableSSLCheckbox =
+                                              !_enableSSLCheckbox;
+                                        },
+                                      );
+                                    },
+                                  ),
+                                ),
+                                const SizedBox(
+                                  width: 12,
+                                ),
+                                Text(
+                                  "Use SSL",
+                                  style: STextStyles.itemSubtitle12(context),
+                                ),
+                              ],
+                            ),
+                          ),
+                        ),
+                        const SizedBox(
+                          height: 20,
+                        ),
+                        Text(
+                          "Rounds of fusion",
+                          style:
+                              STextStyles.desktopTextExtraExtraSmall(context),
+                        ),
+                        const SizedBox(
+                          height: 10,
+                        ),
+                        DropdownButtonHideUnderline(
+                          child: DropdownButton2<FusionOption>(
+                            value: _roundType,
+                            items: [
+                              ...FusionOption.values.map(
+                                (e) => DropdownMenuItem(
+                                  value: e,
+                                  child: Text(
+                                    e.name.capitalize(),
+                                    style: STextStyles.smallMed14(context)
+                                        .copyWith(
+                                      color: Theme.of(context)
+                                          .extension<StackColors>()!
+                                          .textDark,
+                                    ),
+                                  ),
+                                ),
+                              ),
+                            ],
+                            onChanged: (value) {
+                              if (value is FusionOption) {
+                                setState(() {
+                                  _roundType = value;
+                                });
+                              }
+                            },
+                            isExpanded: true,
+                            iconStyleData: IconStyleData(
+                              icon: SvgPicture.asset(
+                                Assets.svg.chevronDown,
+                                width: 12,
+                                height: 6,
+                                color: Theme.of(context)
+                                    .extension<StackColors>()!
+                                    .textFieldActiveSearchIconRight,
+                              ),
+                            ),
+                            dropdownStyleData: DropdownStyleData(
+                              offset: const Offset(0, -10),
+                              elevation: 0,
+                              decoration: BoxDecoration(
+                                color: Theme.of(context)
+                                    .extension<StackColors>()!
+                                    .textFieldActiveBG,
+                                borderRadius: BorderRadius.circular(
+                                  Constants.size.circularBorderRadius,
+                                ),
+                              ),
+                            ),
+                            menuItemStyleData: const MenuItemStyleData(
+                              padding: EdgeInsets.symmetric(
+                                horizontal: 16,
+                                vertical: 8,
+                              ),
+                            ),
+                          ),
+                        ),
+                        if (_roundType == FusionOption.custom)
+                          const SizedBox(
+                            height: 10,
+                          ),
+                        if (_roundType == FusionOption.custom)
+                          SizedBox(
+                            width: 460,
+                            child: RoundedWhiteContainer(
+                              child: Column(
+                                crossAxisAlignment: CrossAxisAlignment.start,
+                                children: [
+                                  ClipRRect(
+                                    borderRadius: BorderRadius.circular(
+                                      Constants.size.circularBorderRadius,
+                                    ),
+                                    child: TextField(
+                                      autocorrect: false,
+                                      enableSuggestions: false,
+                                      controller: fusionRoundController,
+                                      focusNode: fusionRoundFocusNode,
+                                      inputFormatters: [
+                                        FilteringTextInputFormatter.digitsOnly
+                                      ],
+                                      onChanged: (value) {
+                                        setState(() {
+                                          _enableStartButton = value
+                                                  .isNotEmpty &&
+                                              serverController
+                                                  .text.isNotEmpty &&
+                                              portController.text.isNotEmpty;
+                                        });
+                                      },
+                                      style: STextStyles.field(context),
+                                      decoration: standardInputDecoration(
+                                        "Number of fusions",
+                                        fusionRoundFocusNode,
+                                        context,
+                                        desktopMed: true,
+                                      ).copyWith(
+                                          labelText:
+                                              "Enter number of fusions.."),
+                                    ),
+                                  ),
+                                ],
+                              ),
+                            ),
+                          ),
+                        const SizedBox(
+                          height: 20,
+                        ),
+                        PrimaryButton(
+                          label: "Start",
+                          enabled: _enableStartButton,
+                          onPressed: _startFusion,
+                        ),
+                      ],
+                    ),
+                  ),
+                ),
+              ],
+            ),
+          ),
+        ],
+      ),
+    );
+  }
+}
diff --git a/lib/pages_desktop_specific/cashfusion/sub_widgets/fusion_dialog.dart b/lib/pages_desktop_specific/cashfusion/sub_widgets/fusion_dialog.dart
new file mode 100644
index 000000000..ca9067129
--- /dev/null
+++ b/lib/pages_desktop_specific/cashfusion/sub_widgets/fusion_dialog.dart
@@ -0,0 +1,306 @@
+import 'dart:async';
+
+import 'package:flutter/material.dart';
+import 'package:flutter_riverpod/flutter_riverpod.dart';
+import 'package:stackwallet/pages_desktop_specific/cashfusion/sub_widgets/fusion_progress.dart';
+import 'package:stackwallet/providers/cash_fusion/fusion_progress_ui_state_provider.dart';
+import 'package:stackwallet/providers/global/prefs_provider.dart';
+import 'package:stackwallet/providers/global/wallets_provider.dart';
+import 'package:stackwallet/services/mixins/fusion_wallet_interface.dart';
+import 'package:stackwallet/themes/stack_colors.dart';
+import 'package:stackwallet/utilities/show_loading.dart';
+import 'package:stackwallet/utilities/text_styles.dart';
+import 'package:stackwallet/widgets/desktop/desktop_dialog.dart';
+import 'package:stackwallet/widgets/desktop/desktop_dialog_close_button.dart';
+import 'package:stackwallet/widgets/desktop/primary_button.dart';
+import 'package:stackwallet/widgets/desktop/secondary_button.dart';
+import 'package:stackwallet/widgets/rounded_container.dart';
+import 'package:stackwallet/widgets/rounded_white_container.dart';
+
+enum CashFusionStatus { waiting, running, success, failed }
+
+class CashFusionState {
+  final CashFusionStatus status;
+  final String? info;
+
+  CashFusionState({required this.status, this.info});
+}
+
+class FusionDialogView extends ConsumerStatefulWidget {
+  const FusionDialogView({
+    Key? key,
+    required this.walletId,
+  }) : super(key: key);
+
+  final String walletId;
+
+  @override
+  ConsumerState<FusionDialogView> createState() => _FusionDialogViewState();
+}
+
+class _FusionDialogViewState extends ConsumerState<FusionDialogView> {
+  Future<bool> _requestAndProcessCancel() async {
+    if (!ref.read(fusionProgressUIStateProvider(widget.walletId)).running) {
+      return true;
+    } else {
+      bool? shouldCancel = await showDialog<bool?>(
+        context: context,
+        barrierDismissible: false,
+        builder: (_) => DesktopDialog(
+          maxWidth: 580,
+          maxHeight: double.infinity,
+          child: Padding(
+            padding: const EdgeInsets.only(
+              left: 32,
+              right: 0,
+              top: 0,
+              bottom: 32,
+            ),
+            child: Column(
+              children: [
+                Row(
+                  mainAxisAlignment: MainAxisAlignment.spaceBetween,
+                  children: [
+                    Text(
+                      "Cancel fusion?",
+                      style: STextStyles.desktopH3(context),
+                    ),
+                    DesktopDialogCloseButton(
+                      onPressedOverride: () => Navigator.of(context).pop(false),
+                    ),
+                  ],
+                ),
+                Padding(
+                  padding: const EdgeInsets.only(
+                    left: 0,
+                    right: 32,
+                    top: 0,
+                    bottom: 0,
+                  ),
+                  child: Column(
+                    crossAxisAlignment: CrossAxisAlignment.start,
+                    children: [
+                      Text(
+                        "Do you really want to cancel the fusion process?",
+                        style: STextStyles.smallMed14(context),
+                        textAlign: TextAlign.left,
+                      ),
+                      const SizedBox(height: 40),
+                      Row(
+                        children: [
+                          Expanded(
+                            child: SecondaryButton(
+                              label: "No",
+                              buttonHeight: ButtonHeight.l,
+                              onPressed: () {
+                                Navigator.of(context).pop(false);
+                              },
+                            ),
+                          ),
+                          const SizedBox(width: 16),
+                          Expanded(
+                            child: PrimaryButton(
+                              label: "Yes",
+                              buttonHeight: ButtonHeight.l,
+                              onPressed: () {
+                                Navigator.of(context).pop(true);
+                              },
+                            ),
+                          ),
+                        ],
+                      ),
+                    ],
+                  ),
+                ),
+              ],
+            ),
+          ),
+        ),
+      );
+
+      if (shouldCancel == true && mounted) {
+        final fusionWallet = ref
+            .read(walletsChangeNotifierProvider)
+            .getManager(widget.walletId)
+            .wallet as FusionWalletInterface;
+
+        await showLoading(
+          whileFuture: Future.wait([
+            fusionWallet.stop(),
+            Future<void>.delayed(const Duration(seconds: 2)),
+          ]),
+          context: context,
+          isDesktop: true,
+          message: "Stopping fusion",
+        );
+
+        return true;
+      } else {
+        return false;
+      }
+    }
+  }
+
+  @override
+  Widget build(BuildContext context) {
+    final bool _succeeded =
+        ref.watch(fusionProgressUIStateProvider(widget.walletId)).succeeded;
+
+    final bool _failed =
+        ref.watch(fusionProgressUIStateProvider(widget.walletId)).failed;
+
+    final int _fusionRoundsCompleted = ref
+        .watch(fusionProgressUIStateProvider(widget.walletId))
+        .fusionRoundsCompleted;
+
+    return DesktopDialog(
+      maxHeight: 600,
+      child: SingleChildScrollView(
+        child: Column(
+          children: [
+            Row(
+              mainAxisAlignment: MainAxisAlignment.spaceBetween,
+              children: [
+                Padding(
+                  padding: const EdgeInsets.only(left: 32),
+                  child: Text(
+                    "Fusion progress",
+                    style: STextStyles.desktopH2(context),
+                  ),
+                ),
+                DesktopDialogCloseButton(
+                  onPressedOverride: () async {
+                    if (await _requestAndProcessCancel()) {
+                      if (mounted) {
+                        Navigator.of(context).pop();
+                      }
+                    }
+                  },
+                ),
+              ],
+            ),
+            Padding(
+              padding: const EdgeInsets.only(
+                top: 20,
+                left: 32,
+                right: 32,
+                bottom: 32,
+              ),
+              child: Column(
+                crossAxisAlignment: CrossAxisAlignment.stretch,
+                children: [
+                  _fusionRoundsCompleted > 0
+                      ? RoundedWhiteContainer(
+                          child: Text(
+                            "Fusion rounds completed: $_fusionRoundsCompleted",
+                            style: STextStyles.w500_14(context).copyWith(
+                              color: Theme.of(context)
+                                  .extension<StackColors>()!
+                                  .textSubtitle1,
+                            ),
+                            textAlign: TextAlign.center,
+                          ),
+                        )
+                      : RoundedContainer(
+                          color: Theme.of(context)
+                              .extension<StackColors>()!
+                              .snackBarBackError,
+                          child: Text(
+                            "Do not close this window. If you exit, "
+                            "the process will be canceled.",
+                            style: STextStyles.smallMed14(context).copyWith(
+                              color: Theme.of(context)
+                                  .extension<StackColors>()!
+                                  .snackBarTextError,
+                            ),
+                            textAlign: TextAlign.center,
+                          ),
+                        ),
+                  const SizedBox(
+                    height: 20,
+                  ),
+                  FusionProgress(
+                    walletId: widget.walletId,
+                  ),
+                  const SizedBox(
+                    height: 12,
+                  ),
+                  Row(
+                    children: [
+                      if (_succeeded)
+                        Expanded(
+                          child: PrimaryButton(
+                            buttonHeight: ButtonHeight.m,
+                            label: "Fuse again",
+                            onPressed: _fuseAgain,
+                          ),
+                        ),
+                      if (_succeeded)
+                        const SizedBox(
+                          width: 16,
+                        ),
+                      if (_failed)
+                        Expanded(
+                          child: PrimaryButton(
+                            buttonHeight: ButtonHeight.m,
+                            label: "Try again",
+                            onPressed: _fuseAgain,
+                          ),
+                        ),
+                      if (_failed)
+                        const SizedBox(
+                          width: 16,
+                        ),
+                      if (!_succeeded && !_failed) const Spacer(),
+                      if (!_succeeded && !_failed)
+                        const SizedBox(
+                          width: 16,
+                        ),
+                      Expanded(
+                        child: SecondaryButton(
+                          buttonHeight: ButtonHeight.m,
+                          enabled: true,
+                          label: "Cancel",
+                          onPressed: () async {
+                            if (await _requestAndProcessCancel()) {
+                              if (mounted) {
+                                Navigator.of(context).pop();
+                              }
+                            }
+                          },
+                        ),
+                      ),
+                    ],
+                  ),
+                ],
+              ),
+            ),
+          ],
+        ),
+      ),
+    );
+  }
+
+  /// Fuse again.
+  void _fuseAgain() async {
+    final fusionWallet = ref
+        .read(walletsChangeNotifierProvider)
+        .getManager(widget.walletId)
+        .wallet as FusionWalletInterface;
+
+    final fusionInfo = ref.read(prefsChangeNotifierProvider).fusionServerInfo;
+
+    try {
+      fusionWallet.uiState = ref.read(
+        fusionProgressUIStateProvider(widget.walletId),
+      );
+    } catch (e) {
+      if (!e.toString().contains(
+          "FusionProgressUIState was already set for ${widget.walletId}")) {
+        rethrow;
+      }
+    }
+
+    unawaited(fusionWallet.fuse(fusionInfo: fusionInfo));
+  }
+}
diff --git a/lib/pages_desktop_specific/cashfusion/sub_widgets/fusion_progress.dart b/lib/pages_desktop_specific/cashfusion/sub_widgets/fusion_progress.dart
new file mode 100644
index 000000000..a976c225d
--- /dev/null
+++ b/lib/pages_desktop_specific/cashfusion/sub_widgets/fusion_progress.dart
@@ -0,0 +1,149 @@
+import 'package:flutter/material.dart';
+import 'package:flutter_riverpod/flutter_riverpod.dart';
+import 'package:flutter_svg/flutter_svg.dart';
+import 'package:stackwallet/pages/settings_views/global_settings_view/stack_backup_views/sub_widgets/restoring_item_card.dart';
+import 'package:stackwallet/pages_desktop_specific/cashfusion/sub_widgets/fusion_dialog.dart';
+import 'package:stackwallet/providers/cash_fusion/fusion_progress_ui_state_provider.dart';
+import 'package:stackwallet/themes/stack_colors.dart';
+import 'package:stackwallet/utilities/assets.dart';
+import 'package:stackwallet/utilities/text_styles.dart';
+import 'package:stackwallet/utilities/util.dart';
+import 'package:stackwallet/widgets/conditional_parent.dart';
+import 'package:stackwallet/widgets/rounded_container.dart';
+
+class FusionProgress extends ConsumerWidget {
+  const FusionProgress({super.key, required this.walletId});
+
+  final String walletId;
+
+  @override
+  Widget build(BuildContext context, WidgetRef ref) {
+    return Column(
+      crossAxisAlignment: CrossAxisAlignment.stretch,
+      children: [
+        _ProgressItem(
+            iconAsset: Assets.svg.node,
+            label: "Connecting to server",
+            state: ref.watch(fusionProgressUIStateProvider(walletId)
+                .select((value) => value.connecting))),
+        const SizedBox(
+          height: 12,
+        ),
+        _ProgressItem(
+            iconAsset: Assets.svg.upFromLine,
+            label: "Allocating outputs",
+            state: ref.watch(fusionProgressUIStateProvider(walletId)
+                .select((value) => value.outputs))),
+        const SizedBox(
+          height: 12,
+        ),
+        _ProgressItem(
+            iconAsset: Assets.svg.peers,
+            label: "Waiting for peers",
+            state: ref.watch(fusionProgressUIStateProvider(walletId)
+                .select((value) => value.peers))),
+        const SizedBox(
+          height: 12,
+        ),
+        _ProgressItem(
+            iconAsset: Assets.svg.fusing,
+            label: "Fusing",
+            state: ref.watch(fusionProgressUIStateProvider(walletId)
+                .select((value) => value.fusing))),
+        const SizedBox(
+          height: 12,
+        ),
+        _ProgressItem(
+            iconAsset: Assets.svg.checkCircle,
+            label: "Complete",
+            state: ref.watch(fusionProgressUIStateProvider(walletId)
+                .select((value) => value.complete))),
+      ],
+    );
+  }
+}
+
+class _ProgressItem extends StatelessWidget {
+  const _ProgressItem({
+    super.key,
+    required this.iconAsset,
+    required this.label,
+    required this.state,
+  });
+
+  final String iconAsset;
+  final String label;
+  final CashFusionState state;
+
+  Widget _getIconForState(CashFusionStatus state, BuildContext context) {
+    switch (state) {
+      case CashFusionStatus.waiting:
+        return SvgPicture.asset(
+          Assets.svg.loader,
+          color:
+              Theme.of(context).extension<StackColors>()!.buttonBackSecondary,
+        );
+      case CashFusionStatus.running:
+        return SvgPicture.asset(
+          Assets.svg.loader,
+          color: Theme.of(context).extension<StackColors>()!.accentColorGreen,
+        );
+      case CashFusionStatus.success:
+        return SvgPicture.asset(
+          Assets.svg.checkCircle,
+          color: Theme.of(context).extension<StackColors>()!.accentColorGreen,
+        );
+      case CashFusionStatus.failed:
+        return SvgPicture.asset(
+          Assets.svg.circleAlert,
+          color: Theme.of(context).extension<StackColors>()!.textError,
+        );
+    }
+  }
+
+  @override
+  Widget build(BuildContext context) {
+    return ConditionalParent(
+      condition: Util.isDesktop,
+      builder: (child) => RoundedContainer(
+        padding: EdgeInsets.zero,
+        color: Theme.of(context).extension<StackColors>()!.popupBG,
+        borderColor: Theme.of(context).extension<StackColors>()!.background,
+        child: child,
+      ),
+      child: RestoringItemCard(
+        left: SizedBox(
+          width: 32,
+          height: 32,
+          child: RoundedContainer(
+            padding: const EdgeInsets.all(0),
+            color:
+                Theme.of(context).extension<StackColors>()!.buttonBackSecondary,
+            child: Center(
+              child: SvgPicture.asset(
+                iconAsset,
+                width: 18,
+                height: 18,
+                color: Theme.of(context).extension<StackColors>()!.textDark,
+              ),
+            ),
+          ),
+        ),
+        right: SizedBox(
+          width: 20,
+          height: 20,
+          child: _getIconForState(state.status, context),
+        ),
+        title: label,
+        subTitle: state.info != null && state.info!.isNotEmpty
+            ? Text(
+                state.info!,
+                style: STextStyles.w500_12(context).copyWith(
+                  color: Theme.of(context).extension<StackColors>()!.textError,
+                ),
+              )
+            : null,
+      ),
+    );
+  }
+}
diff --git a/lib/pages_desktop_specific/my_stack_view/wallet_view/desktop_token_view.dart b/lib/pages_desktop_specific/my_stack_view/wallet_view/desktop_token_view.dart
index 18edc2bff..b03b67959 100644
--- a/lib/pages_desktop_specific/my_stack_view/wallet_view/desktop_token_view.dart
+++ b/lib/pages_desktop_specific/my_stack_view/wallet_view/desktop_token_view.dart
@@ -218,7 +218,10 @@ class _DesktopTokenViewState extends ConsumerState<DesktopTokenView> {
                         onTap: () {
                           Navigator.of(context).pushNamed(
                             AllTransactionsView.routeName,
-                            arguments: widget.walletId,
+                            arguments: (
+                              walletId: widget.walletId,
+                              isTokens: true,
+                            ),
                           );
                         },
                       ),
diff --git a/lib/pages_desktop_specific/my_stack_view/wallet_view/desktop_wallet_view.dart b/lib/pages_desktop_specific/my_stack_view/wallet_view/desktop_wallet_view.dart
index 0df83088b..466a900ef 100644
--- a/lib/pages_desktop_specific/my_stack_view/wallet_view/desktop_wallet_view.dart
+++ b/lib/pages_desktop_specific/my_stack_view/wallet_view/desktop_wallet_view.dart
@@ -21,6 +21,8 @@ import 'package:stackwallet/pages/special/firo_rescan_recovery_error_dialog.dart
 import 'package:stackwallet/pages/token_view/my_tokens_view.dart';
 import 'package:stackwallet/pages/wallet_view/sub_widgets/transactions_list.dart';
 import 'package:stackwallet/pages/wallet_view/transaction_views/all_transactions_view.dart';
+import 'package:stackwallet/pages/wallet_view/transaction_views/tx_v2/all_transactions_v2_view.dart';
+import 'package:stackwallet/pages/wallet_view/transaction_views/tx_v2/transaction_v2_list.dart';
 import 'package:stackwallet/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/desktop_wallet_features.dart';
 import 'package:stackwallet/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/desktop_wallet_summary.dart';
 import 'package:stackwallet/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/my_wallet.dart';
@@ -445,7 +447,7 @@ class _DesktopWalletViewState extends ConsumerState<DesktopWalletView> {
                                       .getManager(widget.walletId)
                                       .hasTokenSupport))
                               ? "Tokens"
-                              : "Recent transactions",
+                              : "Recent activity",
                           style: STextStyles.desktopTextExtraSmall(context)
                               .copyWith(
                             color: Theme.of(context)
@@ -460,30 +462,33 @@ class _DesktopWalletViewState extends ConsumerState<DesktopWalletView> {
                                       .hasTokenSupport))
                               ? "Edit"
                               : "See all",
-                          onTap: ref.watch(walletsChangeNotifierProvider.select(
-                                  (value) => value
-                                      .getManager(widget.walletId)
-                                      .hasTokenSupport))
-                              ? () async {
-                                  final result = await showDialog<int?>(
-                                    context: context,
-                                    builder: (context) => EditWalletTokensView(
-                                      walletId: widget.walletId,
-                                      isDesktopPopup: true,
-                                    ),
-                                  );
+                          onTap: () async {
+                            if (ref
+                                .read(walletsChangeNotifierProvider)
+                                .getManager(widget.walletId)
+                                .hasTokenSupport) {
+                              final result = await showDialog<int?>(
+                                context: context,
+                                builder: (context) => EditWalletTokensView(
+                                  walletId: widget.walletId,
+                                  isDesktopPopup: true,
+                                ),
+                              );
 
-                                  if (result == 42) {
-                                    // wallet tokens were edited so update ui
-                                    setState(() {});
-                                  }
-                                }
-                              : () {
-                                  Navigator.of(context).pushNamed(
-                                    AllTransactionsView.routeName,
-                                    arguments: widget.walletId,
-                                  );
-                                },
+                              if (result == 42) {
+                                // wallet tokens were edited so update ui
+                                setState(() {});
+                              }
+                            } else {
+                              await Navigator.of(context).pushNamed(
+                                coin == Coin.bitcoincash ||
+                                        coin == Coin.bitcoincashTestnet
+                                    ? AllTransactionsV2View.routeName
+                                    : AllTransactionsView.routeName,
+                                arguments: widget.walletId,
+                              );
+                            }
+                          },
                         ),
                       ],
                     ),
@@ -514,13 +519,18 @@ class _DesktopWalletViewState extends ConsumerState<DesktopWalletView> {
                           ? MyTokensView(
                               walletId: widget.walletId,
                             )
-                          : TransactionsList(
-                              managerProvider: ref.watch(
-                                  walletsChangeNotifierProvider.select(
-                                      (value) => value.getManagerProvider(
-                                          widget.walletId))),
-                              walletId: widget.walletId,
-                            ),
+                          : coin == Coin.bitcoincash ||
+                                  coin == Coin.bitcoincashTestnet
+                              ? TransactionsV2List(
+                                  walletId: widget.walletId,
+                                )
+                              : TransactionsList(
+                                  managerProvider: ref.watch(
+                                      walletsChangeNotifierProvider.select(
+                                          (value) => value.getManagerProvider(
+                                              widget.walletId))),
+                                  walletId: widget.walletId,
+                                ),
                     ),
                   ],
                 ),
diff --git a/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/desktop_wallet_features.dart b/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/desktop_wallet_features.dart
index 7679956f3..7e5c8cd06 100644
--- a/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/desktop_wallet_features.dart
+++ b/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/desktop_wallet_features.dart
@@ -19,6 +19,7 @@ import 'package:stackwallet/notifications/show_flush_bar.dart';
 import 'package:stackwallet/pages/monkey/monkey_view.dart';
 import 'package:stackwallet/pages/paynym/paynym_claim_view.dart';
 import 'package:stackwallet/pages/paynym/paynym_home_view.dart';
+import 'package:stackwallet/pages_desktop_specific/cashfusion/desktop_cashfusion_view.dart';
 import 'package:stackwallet/pages_desktop_specific/coin_control/desktop_coin_control_view.dart';
 import 'package:stackwallet/pages_desktop_specific/desktop_menu.dart';
 import 'package:stackwallet/pages_desktop_specific/my_stack_view/wallet_view/desktop_wallet_view.dart';
@@ -84,6 +85,7 @@ class _DesktopWalletFeaturesState extends ConsumerState<DesktopWalletFeatures> {
         onWhirlpoolPressed: _onWhirlpoolPressed,
         onOrdinalsPressed: _onOrdinalsPressed,
         onMonkeyPressed: _onMonkeyPressed,
+        onFusionPressed: _onFusionPressed,
       ),
     );
   }
@@ -335,6 +337,15 @@ class _DesktopWalletFeaturesState extends ConsumerState<DesktopWalletFeatures> {
     );
   }
 
+  void _onFusionPressed() {
+    Navigator.of(context, rootNavigator: true).pop();
+
+    Navigator.of(context).pushNamed(
+      DesktopCashFusionView.routeName,
+      arguments: widget.walletId,
+    );
+  }
+
   @override
   Widget build(BuildContext context) {
     final manager = ref.watch(
@@ -354,7 +365,9 @@ class _DesktopWalletFeaturesState extends ConsumerState<DesktopWalletFeatures> {
         manager.coin == Coin.firoTestNet ||
         manager.hasWhirlpoolSupport ||
         manager.coin == Coin.banano ||
-        manager.hasOrdinalsSupport;
+        manager.hasOrdinalsSupport ||
+        manager.hasFusionSupport;
+
     return Row(
       children: [
         if (Constants.enableExchange)
diff --git a/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/more_features/more_features_dialog.dart b/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/more_features/more_features_dialog.dart
index 09c400324..2c32d3ebc 100644
--- a/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/more_features/more_features_dialog.dart
+++ b/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/more_features/more_features_dialog.dart
@@ -31,6 +31,7 @@ class MoreFeaturesDialog extends ConsumerStatefulWidget {
     required this.onWhirlpoolPressed,
     required this.onOrdinalsPressed,
     required this.onMonkeyPressed,
+    required this.onFusionPressed,
   }) : super(key: key);
 
   final String walletId;
@@ -40,6 +41,7 @@ class MoreFeaturesDialog extends ConsumerStatefulWidget {
   final VoidCallback? onWhirlpoolPressed;
   final VoidCallback? onOrdinalsPressed;
   final VoidCallback? onMonkeyPressed;
+  final VoidCallback? onFusionPressed;
 
   @override
   ConsumerState<MoreFeaturesDialog> createState() => _MoreFeaturesDialogState();
@@ -121,6 +123,13 @@ class _MoreFeaturesDialogState extends ConsumerState<MoreFeaturesDialog> {
               iconAsset: Assets.svg.monkey,
               onPressed: () => widget.onMonkeyPressed?.call(),
             ),
+          if (manager.hasFusionSupport)
+            _MoreFeaturesItem(
+              label: "CashFusion",
+              detail: "Decentralized Bitcoin Cash mixing protocol",
+              iconAsset: Assets.svg.cashFusion,
+              onPressed: () => widget.onFusionPressed?.call(),
+            ),
           const SizedBox(
             height: 28,
           ),
diff --git a/lib/pages_desktop_specific/settings/settings_menu/tor_settings/tor_settings.dart b/lib/pages_desktop_specific/settings/settings_menu/tor_settings/tor_settings.dart
index ff507b79e..28b585c75 100644
--- a/lib/pages_desktop_specific/settings/settings_menu/tor_settings/tor_settings.dart
+++ b/lib/pages_desktop_specific/settings/settings_menu/tor_settings/tor_settings.dart
@@ -215,40 +215,37 @@ class _TorSettingsState extends ConsumerState<TorSettings> {
                                       return DesktopDialog(
                                         maxWidth: 580,
                                         maxHeight: double.infinity,
-                                        child: Column(
-                                          children: [
-                                            Row(
-                                              mainAxisAlignment:
-                                                  MainAxisAlignment
-                                                      .spaceBetween,
-                                              children: [
-                                                Padding(
-                                                  padding:
-                                                      const EdgeInsets.only(
-                                                    left: 32,
-                                                  ),
-                                                  child: Text(
+                                        child: Padding(
+                                          padding: const EdgeInsets.only(
+                                            top: 10,
+                                            left: 20,
+                                            bottom: 20,
+                                            right: 10,
+                                          ),
+                                          child: Column(
+                                            children: [
+                                              Row(
+                                                mainAxisAlignment:
+                                                    MainAxisAlignment
+                                                        .spaceBetween,
+                                                children: [
+                                                  Text(
                                                     "What is Tor?",
                                                     style:
                                                         STextStyles.desktopH2(
                                                             context),
                                                   ),
-                                                ),
-                                                DesktopDialogCloseButton(
-                                                  onPressedOverride: () =>
-                                                      Navigator.of(context)
-                                                          .pop(true),
-                                                ),
-                                              ],
-                                            ),
-                                            Padding(
-                                              padding: const EdgeInsets.only(
-                                                top: 12,
-                                                left: 32,
-                                                bottom: 32,
-                                                right: 32,
+                                                  DesktopDialogCloseButton(
+                                                    onPressedOverride: () =>
+                                                        Navigator.of(context)
+                                                            .pop(true),
+                                                  ),
+                                                ],
                                               ),
-                                              child: Text(
+                                              const SizedBox(
+                                                height: 16,
+                                              ),
+                                              Text(
                                                 "Short for \"The Onion Router\", is an open-source software that enables internet communication"
                                                 " to remain anonymous by routing internet traffic through a series of layered nodes,"
                                                 " to obscure the origin and destination of data.",
@@ -261,8 +258,8 @@ class _TorSettingsState extends ConsumerState<TorSettings> {
                                                       .textDark3,
                                                 ),
                                               ),
-                                            ),
-                                          ],
+                                            ],
+                                          ),
                                         ),
                                       );
                                     },
@@ -287,43 +284,49 @@ class _TorSettingsState extends ConsumerState<TorSettings> {
                 ),
                 Padding(
                   padding: const EdgeInsets.all(10.0),
-                  child: Row(
-                    mainAxisAlignment: MainAxisAlignment.spaceBetween,
-                    children: [
-                      Row(
-                        children: [
-                          Column(
-                            crossAxisAlignment: CrossAxisAlignment.start,
-                            children: [
-                              Text(
-                                "Tor killswitch",
-                                style: STextStyles.desktopTextExtraExtraSmall(
-                                        context)
-                                    .copyWith(
-                                        color: Theme.of(context)
-                                            .extension<StackColors>()!
-                                            .textDark),
-                              ),
-                              const SizedBox(
-                                height: 8,
-                              ),
-                              RichText(
-                                textAlign: TextAlign.start,
-                                text: TextSpan(
-                                  text: "What is Tor killswitch?",
-                                  style: STextStyles.richLink(context).copyWith(
-                                    fontSize: 14,
-                                  ),
-                                  recognizer: TapGestureRecognizer()
-                                    ..onTap = () {
-                                      showDialog<dynamic>(
-                                        context: context,
-                                        useSafeArea: false,
-                                        barrierDismissible: true,
-                                        builder: (context) {
-                                          return DesktopDialog(
-                                            maxWidth: 580,
-                                            maxHeight: double.infinity,
+                  child: Expanded(
+                    child: Row(
+                      mainAxisAlignment: MainAxisAlignment.spaceBetween,
+                      children: [
+                        Column(
+                          crossAxisAlignment: CrossAxisAlignment.start,
+                          children: [
+                            Text(
+                              "Tor killswitch",
+                              style: STextStyles.desktopTextExtraExtraSmall(
+                                      context)
+                                  .copyWith(
+                                      color: Theme.of(context)
+                                          .extension<StackColors>()!
+                                          .textDark),
+                            ),
+                            const SizedBox(
+                              height: 8,
+                            ),
+                            RichText(
+                              textAlign: TextAlign.start,
+                              text: TextSpan(
+                                text: "What is Tor killswitch?",
+                                style: STextStyles.richLink(context).copyWith(
+                                  fontSize: 14,
+                                ),
+                                recognizer: TapGestureRecognizer()
+                                  ..onTap = () {
+                                    showDialog<dynamic>(
+                                      context: context,
+                                      useSafeArea: false,
+                                      barrierDismissible: true,
+                                      builder: (context) {
+                                        return DesktopDialog(
+                                          maxWidth: 580,
+                                          maxHeight: double.infinity,
+                                          child: Padding(
+                                            padding: const EdgeInsets.only(
+                                              top: 10,
+                                              left: 20,
+                                              bottom: 20,
+                                              right: 10,
+                                            ),
                                             child: Column(
                                               children: [
                                                 Row(
@@ -331,16 +334,11 @@ class _TorSettingsState extends ConsumerState<TorSettings> {
                                                       MainAxisAlignment
                                                           .spaceBetween,
                                                   children: [
-                                                    Padding(
-                                                      padding:
-                                                          const EdgeInsets.only(
-                                                        left: 32,
-                                                      ),
-                                                      child: Text(
-                                                        "What is Tor killswitch?",
-                                                        style: STextStyles
-                                                            .desktopH2(context),
-                                                      ),
+                                                    Text(
+                                                      "What is Tor killswitch?",
+                                                      style:
+                                                          STextStyles.desktopH2(
+                                                              context),
                                                     ),
                                                     DesktopDialogCloseButton(
                                                       onPressedOverride: () =>
@@ -349,44 +347,36 @@ class _TorSettingsState extends ConsumerState<TorSettings> {
                                                     ),
                                                   ],
                                                 ),
-                                                Padding(
-                                                  padding:
-                                                      const EdgeInsets.only(
-                                                    top: 12,
-                                                    left: 32,
-                                                    bottom: 32,
-                                                    right: 32,
-                                                  ),
-                                                  child: Text(
-                                                    "A security feature that protects your information from accidental exposure by"
-                                                    " disconnecting your device from the Tor network if the"
-                                                    " connection is disrupted or compromised.",
-                                                    style: STextStyles
-                                                            .desktopTextMedium(
-                                                                context)
-                                                        .copyWith(
-                                                      color: Theme.of(context)
-                                                          .extension<
-                                                              StackColors>()!
-                                                          .textDark3,
-                                                    ),
+                                                const SizedBox(
+                                                  height: 16,
+                                                ),
+                                                Text(
+                                                  "A security feature that protects your information from accidental exposure by"
+                                                  " disconnecting your device from the Tor network if the"
+                                                  " connection is disrupted or compromised.",
+                                                  style: STextStyles
+                                                          .desktopTextMedium(
+                                                              context)
+                                                      .copyWith(
+                                                    color: Theme.of(context)
+                                                        .extension<
+                                                            StackColors>()!
+                                                        .textDark3,
                                                   ),
                                                 ),
                                               ],
                                             ),
-                                          );
-                                        },
-                                      );
-                                    },
-                                ),
+                                          ),
+                                        );
+                                      },
+                                    );
+                                  },
                               ),
-                            ],
-                          ),
-                        ],
-                      ),
-                      Padding(
-                        padding: const EdgeInsets.only(right: 8.0),
-                        child: SizedBox(
+                            ),
+                          ],
+                        ),
+                        const Spacer(),
+                        SizedBox(
                           height: 20,
                           width: 40,
                           child: DraggableSwitchButton(
@@ -401,13 +391,13 @@ class _TorSettingsState extends ConsumerState<TorSettings> {
                             },
                           ),
                         ),
-                      ),
-                    ],
+                        const SizedBox(
+                          height: 10,
+                        ),
+                      ],
+                    ),
                   ),
                 ),
-                const SizedBox(
-                  height: 10,
-                ),
               ],
             ),
           ),
diff --git a/lib/providers/cash_fusion/fusion_progress_ui_state_provider.dart b/lib/providers/cash_fusion/fusion_progress_ui_state_provider.dart
new file mode 100644
index 000000000..872b6586a
--- /dev/null
+++ b/lib/providers/cash_fusion/fusion_progress_ui_state_provider.dart
@@ -0,0 +1,19 @@
+/*
+ * This file is part of Stack Wallet.
+ *
+ * Copyright (c) 2023 Cypher Stack
+ * All Rights Reserved.
+ * The code is distributed under GPLv3 license, see LICENSE file for details.
+ * Generated by Cypher Stack on 2023-05-26
+ *
+ */
+
+import 'package:flutter_riverpod/flutter_riverpod.dart';
+import 'package:stackwallet/models/fusion_progress_ui_state.dart';
+
+final fusionProgressUIStateProvider =
+    ChangeNotifierProvider.family<FusionProgressUIState, String>(
+  (ref, walletId) {
+    return FusionProgressUIState();
+  },
+);
diff --git a/lib/route_generator.dart b/lib/route_generator.dart
index 38604bc33..3c02b7cbf 100644
--- a/lib/route_generator.dart
+++ b/lib/route_generator.dart
@@ -17,6 +17,7 @@ import 'package:stackwallet/models/add_wallet_list_entity/sub_classes/eth_token_
 import 'package:stackwallet/models/buy/response_objects/quote.dart';
 import 'package:stackwallet/models/exchange/incomplete_exchange.dart';
 import 'package:stackwallet/models/exchange/response_objects/trade.dart';
+import 'package:stackwallet/models/isar/models/blockchain_data/v2/transaction_v2.dart';
 import 'package:stackwallet/models/isar/models/contact_entry.dart';
 import 'package:stackwallet/models/isar/models/isar_models.dart';
 import 'package:stackwallet/models/isar/ordinal.dart';
@@ -44,6 +45,8 @@ import 'package:stackwallet/pages/address_book_views/subviews/edit_contact_name_
 import 'package:stackwallet/pages/buy_view/buy_in_wallet_view.dart';
 import 'package:stackwallet/pages/buy_view/buy_quote_preview.dart';
 import 'package:stackwallet/pages/buy_view/buy_view.dart';
+import 'package:stackwallet/pages/cashfusion/cashfusion_view.dart';
+import 'package:stackwallet/pages/cashfusion/fusion_progress_view.dart';
 import 'package:stackwallet/pages/coin_control/coin_control_view.dart';
 import 'package:stackwallet/pages/coin_control/utxo_details_view.dart';
 import 'package:stackwallet/pages/exchange_view/choose_from_stack_view.dart';
@@ -129,11 +132,15 @@ import 'package:stackwallet/pages/wallet_view/transaction_views/all_transactions
 import 'package:stackwallet/pages/wallet_view/transaction_views/edit_note_view.dart';
 import 'package:stackwallet/pages/wallet_view/transaction_views/transaction_details_view.dart';
 import 'package:stackwallet/pages/wallet_view/transaction_views/transaction_search_filter_view.dart';
+import 'package:stackwallet/pages/wallet_view/transaction_views/tx_v2/all_transactions_v2_view.dart';
+import 'package:stackwallet/pages/wallet_view/transaction_views/tx_v2/fusion_group_details_view.dart';
+import 'package:stackwallet/pages/wallet_view/transaction_views/tx_v2/transaction_v2_details_view.dart';
 import 'package:stackwallet/pages/wallet_view/wallet_view.dart';
 import 'package:stackwallet/pages/wallets_view/wallets_overview.dart';
 import 'package:stackwallet/pages/wallets_view/wallets_view.dart';
 import 'package:stackwallet/pages_desktop_specific/address_book_view/desktop_address_book.dart';
 import 'package:stackwallet/pages_desktop_specific/addresses/desktop_wallet_addresses_view.dart';
+import 'package:stackwallet/pages_desktop_specific/cashfusion/desktop_cashfusion_view.dart';
 import 'package:stackwallet/pages_desktop_specific/coin_control/desktop_coin_control_view.dart';
 // import 'package:stackwallet/pages_desktop_specific/desktop_exchange/desktop_all_buys_view.dart';
 import 'package:stackwallet/pages_desktop_specific/desktop_buy/desktop_buy_view.dart';
@@ -579,6 +586,48 @@ class RouteGenerator {
         }
         return _routeError("${settings.name} invalid args: ${args.toString()}");
 
+      case CashFusionView.routeName:
+        if (args is String) {
+          return getRoute(
+            shouldUseMaterialRoute: useMaterialPageRoute,
+            builder: (_) => CashFusionView(
+              walletId: args,
+            ),
+            settings: RouteSettings(
+              name: settings.name,
+            ),
+          );
+        }
+        return _routeError("${settings.name} invalid args: ${args.toString()}");
+
+      case FusionProgressView.routeName:
+        if (args is String) {
+          return getRoute(
+            shouldUseMaterialRoute: useMaterialPageRoute,
+            builder: (_) => FusionProgressView(
+              walletId: args,
+            ),
+            settings: RouteSettings(
+              name: settings.name,
+            ),
+          );
+        }
+        return _routeError("${settings.name} invalid args: ${args.toString()}");
+
+      case DesktopCashFusionView.routeName:
+        if (args is String) {
+          return getRoute(
+            shouldUseMaterialRoute: useMaterialPageRoute,
+            builder: (_) => DesktopCashFusionView(
+              walletId: args,
+            ),
+            settings: RouteSettings(
+              name: settings.name,
+            ),
+          );
+        }
+        return _routeError("${settings.name} invalid args: ${args.toString()}");
+
       case GlobalSettingsView.routeName:
         return getRoute(
             shouldUseMaterialRoute: useMaterialPageRoute,
@@ -1214,7 +1263,55 @@ class RouteGenerator {
         }
         return _routeError("${settings.name} invalid args: ${args.toString()}");
 
+      case TransactionV2DetailsView.routeName:
+        if (args is ({TransactionV2 tx, Coin coin, String walletId})) {
+          return getRoute(
+            shouldUseMaterialRoute: useMaterialPageRoute,
+            builder: (_) => TransactionV2DetailsView(
+              transaction: args.tx,
+              coin: args.coin,
+              walletId: args.walletId,
+            ),
+            settings: RouteSettings(
+              name: settings.name,
+            ),
+          );
+        }
+        return _routeError("${settings.name} invalid args: ${args.toString()}");
+
+      case FusionGroupDetailsView.routeName:
+        if (args is ({
+          List<TransactionV2> transactions,
+          Coin coin,
+          String walletId
+        })) {
+          return getRoute(
+            shouldUseMaterialRoute: useMaterialPageRoute,
+            builder: (_) => FusionGroupDetailsView(
+              transactions: args.transactions,
+              coin: args.coin,
+              walletId: args.walletId,
+            ),
+            settings: RouteSettings(
+              name: settings.name,
+            ),
+          );
+        }
+        return _routeError("${settings.name} invalid args: ${args.toString()}");
+
       case AllTransactionsView.routeName:
+        if (args is ({String walletId, bool isTokens})) {
+          return getRoute(
+            shouldUseMaterialRoute: useMaterialPageRoute,
+            builder: (_) => AllTransactionsView(
+              walletId: args.walletId,
+              isTokens: args.isTokens,
+            ),
+            settings: RouteSettings(
+              name: settings.name,
+            ),
+          );
+        }
         if (args is String) {
           return getRoute(
             shouldUseMaterialRoute: useMaterialPageRoute,
@@ -1228,6 +1325,20 @@ class RouteGenerator {
         }
         return _routeError("${settings.name} invalid args: ${args.toString()}");
 
+      case AllTransactionsV2View.routeName:
+        if (args is String) {
+          return getRoute(
+            shouldUseMaterialRoute: useMaterialPageRoute,
+            builder: (_) => AllTransactionsV2View(
+              walletId: args,
+            ),
+            settings: RouteSettings(
+              name: settings.name,
+            ),
+          );
+        }
+        return _routeError("${settings.name} invalid args: ${args.toString()}");
+
       case TransactionSearchFilterView.routeName:
         if (args is Coin) {
           return getRoute(
@@ -1992,6 +2103,17 @@ class RouteGenerator {
               name: settings.name,
             ),
           );
+        } else if (args is ({String walletId, bool popPrevious})) {
+          return getRoute(
+            shouldUseMaterialRoute: useMaterialPageRoute,
+            builder: (_) => TokenView(
+              walletId: args.walletId,
+              popPrevious: args.popPrevious,
+            ),
+            settings: RouteSettings(
+              name: settings.name,
+            ),
+          );
         }
         return _routeError("${settings.name} invalid args: ${args.toString()}");
 
diff --git a/lib/services/coins/bitcoincash/bch_utils.dart b/lib/services/coins/bitcoincash/bch_utils.dart
new file mode 100644
index 000000000..dfe78a2e8
--- /dev/null
+++ b/lib/services/coins/bitcoincash/bch_utils.dart
@@ -0,0 +1,61 @@
+import 'dart:typed_data';
+
+import 'package:bitcoindart/src/utils/constants/op.dart' as op;
+import 'package:bitcoindart/src/utils/script.dart' as bscript;
+import 'package:stackwallet/utilities/extensions/impl/string.dart';
+
+abstract final class BchUtils {
+  static const FUSE_ID = 'FUZ\x00';
+
+  static bool isSLP(Uint8List scriptPubKey) {
+    const id = [83, 76, 80, 0]; // 'SLP\x00'
+    final decompiled = bscript.decompile(scriptPubKey);
+
+    if (decompiled != null &&
+        decompiled.length > 1 &&
+        decompiled.first == op.OPS["OP_RETURN"]) {
+      final _id = decompiled[1];
+
+      if (_id is List<int> && _id.length == id.length) {
+        for (int i = 0; i < id.length; i++) {
+          if (_id[i] != id[i]) {
+            return false;
+          }
+        }
+        // lists match!
+        return true;
+      }
+    }
+
+    return false;
+  }
+
+  static bool isFUZE(Uint8List scriptPubKey) {
+    final id = FUSE_ID.toUint8ListFromUtf8;
+    final decompiled = bscript.decompile(scriptPubKey);
+
+    if (decompiled != null &&
+        decompiled.length > 2 &&
+        decompiled.first == op.OPS["OP_RETURN"]) {
+      // check session hash length. Should be 32 bytes
+      final sessionHash = decompiled[2];
+      if (!(sessionHash is List<int> && sessionHash.length == 32)) {
+        return false;
+      }
+
+      final _id = decompiled[1];
+
+      if (_id is List<int> && _id.length == id.length) {
+        for (int i = 0; i < id.length; i++) {
+          if (_id[i] != id[i]) {
+            return false;
+          }
+        }
+        // lists match!
+        return true;
+      }
+    }
+
+    return false;
+  }
+}
diff --git a/lib/services/coins/bitcoincash/bitcoincash_wallet.dart b/lib/services/coins/bitcoincash/bitcoincash_wallet.dart
index 1f4057353..875aed471 100644
--- a/lib/services/coins/bitcoincash/bitcoincash_wallet.dart
+++ b/lib/services/coins/bitcoincash/bitcoincash_wallet.dart
@@ -19,17 +19,22 @@ import 'package:bip39/bip39.dart' as bip39;
 import 'package:bitbox/bitbox.dart' as bitbox;
 import 'package:bitcoindart/bitcoindart.dart';
 import 'package:bs58check/bs58check.dart' as bs58check;
-import 'package:decimal/decimal.dart';
 import 'package:flutter/foundation.dart';
 import 'package:isar/isar.dart';
 import 'package:stackwallet/db/isar/main_db.dart';
 import 'package:stackwallet/electrumx_rpc/cached_electrumx.dart';
 import 'package:stackwallet/electrumx_rpc/electrumx.dart';
 import 'package:stackwallet/models/balance.dart';
-import 'package:stackwallet/models/isar/models/blockchain_data/address.dart';
+import 'package:stackwallet/models/isar/models/blockchain_data/address.dart'
+    as stack_address;
+import 'package:stackwallet/models/isar/models/blockchain_data/v2/input_v2.dart';
+import 'package:stackwallet/models/isar/models/blockchain_data/v2/output_v2.dart';
+import 'package:stackwallet/models/isar/models/blockchain_data/v2/transaction_v2.dart';
 import 'package:stackwallet/models/isar/models/isar_models.dart' as isar_models;
 import 'package:stackwallet/models/paymint/fee_object_model.dart';
 import 'package:stackwallet/models/signing_data.dart';
+import 'package:stackwallet/services/coins/bitcoincash/bch_utils.dart';
+import 'package:stackwallet/services/coins/bitcoincash/cashtokens.dart' as ct;
 import 'package:stackwallet/services/coins/coin_service.dart';
 import 'package:stackwallet/services/event_bus/events/global/node_connection_status_changed_event.dart';
 import 'package:stackwallet/services/event_bus/events/global/refresh_percent_changed_event.dart';
@@ -37,6 +42,7 @@ import 'package:stackwallet/services/event_bus/events/global/updated_in_backgrou
 import 'package:stackwallet/services/event_bus/events/global/wallet_sync_status_changed_event.dart';
 import 'package:stackwallet/services/event_bus/global_event_bus.dart';
 import 'package:stackwallet/services/mixins/coin_control_interface.dart';
+import 'package:stackwallet/services/mixins/fusion_wallet_interface.dart';
 import 'package:stackwallet/services/mixins/wallet_cache.dart';
 import 'package:stackwallet/services/mixins/wallet_db.dart';
 import 'package:stackwallet/services/mixins/xpubable.dart';
@@ -50,6 +56,7 @@ import 'package:stackwallet/utilities/default_nodes.dart';
 import 'package:stackwallet/utilities/enums/coin_enum.dart';
 import 'package:stackwallet/utilities/enums/derive_path_type_enum.dart';
 import 'package:stackwallet/utilities/enums/fee_rate_type_enum.dart';
+import 'package:stackwallet/utilities/extensions/impl/string.dart';
 import 'package:stackwallet/utilities/flutter_secure_storage_interface.dart';
 import 'package:stackwallet/utilities/format.dart';
 import 'package:stackwallet/utilities/logger.dart';
@@ -112,7 +119,7 @@ String constructDerivePath({
 }
 
 class BitcoinCashWallet extends CoinServiceAPI
-    with WalletCache, WalletDB, CoinControlInterface
+    with WalletCache, WalletDB, CoinControlInterface, FusionWalletInterface
     implements XPubAble {
   BitcoinCashWallet({
     required String walletId,
@@ -133,6 +140,19 @@ class BitcoinCashWallet extends CoinServiceAPI
     _secureStore = secureStore;
     initCache(walletId, coin);
     initWalletDB(mockableOverride: mockableOverride);
+    initFusionInterface(
+      walletId: walletId,
+      coin: coin,
+      db: db,
+      getWalletCachedElectrumX: () => cachedElectrumXClient,
+      getNextUnusedChangeAddress: _getUnusedChangeAddresses,
+      getChainHeight: () async => chainHeight,
+      updateWalletUTXOS: _updateUTXOs,
+      mnemonic: mnemonicString,
+      mnemonicPassphrase: mnemonicPassphrase,
+      network: _network,
+      convertToScriptHash: _convertToScriptHash,
+    );
     initCoinControlInterface(
       walletId: walletId,
       walletName: walletName,
@@ -169,6 +189,7 @@ class BitcoinCashWallet extends CoinServiceAPI
   @override
   Future<List<isar_models.UTXO>> get utxos => db.getUTXOs(walletId).findAll();
 
+  @Deprecated("V2 soon (tm)")
   @override
   Future<List<isar_models.Transaction>> get transactions =>
       db.getTransactions(walletId).sortByTimestampDesc().findAll();
@@ -191,19 +212,80 @@ class BitcoinCashWallet extends CoinServiceAPI
           .findFirst()) ??
       await _generateAddressForChain(0, 0, DerivePathTypeExt.primaryFor(coin));
 
-  Future<String> get currentChangeAddress async =>
-      (await _currentChangeAddress).value;
+  Future<List<isar_models.Address>> _getUnusedChangeAddresses({
+    int numberOfAddresses = 1,
+  }) async {
+    if (numberOfAddresses < 1) {
+      throw ArgumentError.value(
+        numberOfAddresses,
+        "numberOfAddresses",
+        "Must not be less than 1",
+      );
+    }
 
-  Future<isar_models.Address> get _currentChangeAddress async =>
-      (await db
-          .getAddresses(walletId)
-          .filter()
-          .typeEqualTo(isar_models.AddressType.p2pkh)
-          .subTypeEqualTo(isar_models.AddressSubType.change)
-          .derivationPath((q) => q.not().valueStartsWith("m/44'/0'"))
-          .sortByDerivationIndexDesc()
-          .findFirst()) ??
-      await _generateAddressForChain(1, 0, DerivePathTypeExt.primaryFor(coin));
+    final changeAddresses = await db
+        .getAddresses(walletId)
+        .filter()
+        .typeEqualTo(isar_models.AddressType.p2pkh)
+        .subTypeEqualTo(isar_models.AddressSubType.change)
+        .derivationPath((q) => q.not().valueStartsWith("m/44'/0'"))
+        .sortByDerivationIndex()
+        .findAll();
+
+    final List<isar_models.Address> unused = [];
+
+    for (final addr in changeAddresses) {
+      if (await _isUnused(addr.value)) {
+        unused.add(addr);
+        if (unused.length == numberOfAddresses) {
+          return unused;
+        }
+      }
+    }
+
+    // if not returned by now, we need to create more addresses
+    int countMissing = numberOfAddresses - unused.length;
+
+    int nextIndex =
+        changeAddresses.isEmpty ? 0 : changeAddresses.last.derivationIndex + 1;
+
+    while (countMissing > 0) {
+      //   create a new address
+      final address = await _generateAddressForChain(
+        1,
+        nextIndex,
+        DerivePathTypeExt.primaryFor(coin),
+      );
+      nextIndex++;
+      await db.updateOrPutAddresses([address]);
+
+      // check if it has been used before adding
+      if (await _isUnused(address.value)) {
+        unused.add(address);
+        countMissing--;
+      }
+    }
+
+    return unused;
+  }
+
+  Future<bool> _isUnused(String address) async {
+    final txCountInDB = await db
+        .getTransactions(_walletId)
+        .filter()
+        .address((q) => q.valueEqualTo(address))
+        .count();
+    if (txCountInDB == 0) {
+      // double check via electrumx
+      // _getTxCountForAddress can throw!
+      // final count = await getTxCount(address: address);
+      // if (count == 0) {
+      return true;
+      // }
+    }
+
+    return false;
+  }
 
   @override
   Future<void> exit() async {
@@ -380,7 +462,7 @@ class BitcoinCashWallet extends CoinServiceAPI
   }
 
   Future<Tuple3<List<isar_models.Address>, DerivePathType, int>> _checkGaps(
-    int maxNumberOfIndexesToCheck,
+    int minNumberOfIndexesToCheck,
     int maxUnusedAddressGap,
     int txCountBatchSize,
     bip32.BIP32 root,
@@ -391,8 +473,15 @@ class BitcoinCashWallet extends CoinServiceAPI
     int gapCounter = 0;
     int highestIndexWithHistory = 0;
 
+    // Scan addresses until the minimum required addresses have been scanned or
+    // until the highest index with activity, plus the gap limit, whichever is
+    // higher, so that we if there is activity above the minimum index, we don't
+    // miss it.
     for (int index = 0;
-        index < maxNumberOfIndexesToCheck && gapCounter < maxUnusedAddressGap;
+        index <
+                max(minNumberOfIndexesToCheck,
+                    highestIndexWithHistory + maxUnusedAddressGap) &&
+            gapCounter < maxUnusedAddressGap;
         index += txCountBatchSize) {
       List<String> iterationsAddressArray = [];
       Logging.instance.log(
@@ -496,7 +585,7 @@ class BitcoinCashWallet extends CoinServiceAPI
   Future<void> _recoverWalletFromBIP32SeedPhrase({
     required String mnemonic,
     required String mnemonicPassphrase,
-    int maxUnusedAddressGap = 20,
+    int maxUnusedAddressGap = 50,
     int maxNumberOfIndexesToCheck = 1000,
     bool isRescan = false,
     Coin? coin,
@@ -713,18 +802,20 @@ class BitcoinCashWallet extends CoinServiceAPI
 
   Future<void> getAllTxsToWatch() async {
     if (_hasCalledExit) return;
-    List<isar_models.Transaction> unconfirmedTxnsToNotifyPending = [];
-    List<isar_models.Transaction> unconfirmedTxnsToNotifyConfirmed = [];
+    List<TransactionV2> unconfirmedTxnsToNotifyPending = [];
+    List<TransactionV2> unconfirmedTxnsToNotifyConfirmed = [];
 
     final currentChainHeight = await chainHeight;
 
-    final txCount = await db.getTransactions(walletId).count();
+    final txCount =
+        await db.isar.transactionV2s.where().walletIdEqualTo(walletId).count();
 
     const paginateLimit = 50;
 
     for (int i = 0; i < txCount; i += paginateLimit) {
-      final transactions = await db
-          .getTransactions(walletId)
+      final transactions = await db.isar.transactionV2s
+          .where()
+          .walletIdEqualTo(walletId)
           .offset(i)
           .limit(paginateLimit)
           .findAll();
@@ -874,7 +965,6 @@ class BitcoinCashWallet extends CoinServiceAPI
 
       if (currentHeight != storedHeight) {
         GlobalEventBus.instance.fire(RefreshPercentChangedEvent(0.2, walletId));
-        await _checkChangeAddressForTransactions();
 
         GlobalEventBus.instance.fire(RefreshPercentChangedEvent(0.3, walletId));
         await _checkCurrentReceivingAddressesForTransactions();
@@ -1196,8 +1286,6 @@ class BitcoinCashWallet extends CoinServiceAPI
     }
 
     await _prefs.init();
-    // await _checkCurrentChangeAddressesForTransactions();
-    // await _checkCurrentReceivingAddressesForTransactions();
   }
 
   // hack to add tx to txData before refresh completes
@@ -1205,37 +1293,38 @@ class BitcoinCashWallet extends CoinServiceAPI
   // transactions locally in a good way
   @override
   Future<void> updateSentCachedTxData(Map<String, dynamic> txData) async {
-    final transaction = isar_models.Transaction(
-      walletId: walletId,
-      txid: txData["txid"] as String,
-      timestamp: DateTime.now().millisecondsSinceEpoch ~/ 1000,
-      type: isar_models.TransactionType.outgoing,
-      subType: isar_models.TransactionSubType.none,
-      // precision may be lost here hence the following amountString
-      amount: (txData["recipientAmt"] as Amount).raw.toInt(),
-      amountString: (txData["recipientAmt"] as Amount).toJsonString(),
-      fee: txData["fee"] as int,
-      height: null,
-      isCancelled: false,
-      isLelantus: false,
-      otherData: null,
-      slateId: null,
-      nonce: null,
-      inputs: [],
-      outputs: [],
-      numberOfMessages: null,
-    );
-
-    final address = txData["address"] is String
-        ? await db.getAddress(walletId, txData["address"] as String)
-        : null;
-
-    await db.addNewTransactionData(
-      [
-        Tuple2(transaction, address),
-      ],
-      walletId,
-    );
+    //. TODO update this to V2 properly
+    // final transaction = TransactionV2(
+    //   walletId: walletId,
+    //   txid: txData["txid"] as String,
+    //   timestamp: DateTime.now().millisecondsSinceEpoch ~/ 1000,
+    //   type: isar_models.TransactionType.outgoing,
+    //   subType: isar_models.TransactionSubType.none,
+    //   // precision may be lost here hence the following amountString
+    //   amount: (txData["recipientAmt"] as Amount).raw.toInt(),
+    //   amountString: (txData["recipientAmt"] as Amount).toJsonString(),
+    //   fee: txData["fee"] as int,
+    //   height: null,
+    //   isCancelled: false,
+    //   isLelantus: false,
+    //   otherData: null,
+    //   slateId: null,
+    //   nonce: null,
+    //   inputs: [],
+    //   outputs: [],
+    //   numberOfMessages: null,
+    // );
+    //
+    // final address = txData["address"] is String
+    //     ? await db.getAddress(walletId, txData["address"] as String)
+    //     : null;
+    //
+    // await db.addNewTransactionData(
+    //   [
+    //     Tuple2(transaction, address),
+    //   ],
+    //   walletId,
+    // );
   }
 
   bool validateCashAddr(String cashAddr) {
@@ -1561,6 +1650,8 @@ class BitcoinCashWallet extends CoinServiceAPI
         .typeEqualTo(type)
         .subTypeEqualTo(subType)
         .derivationPath((q) => q.valueStartsWith("m/$purpose'/$coinType"))
+        .not()
+        .otherDataEqualTo(kReservedFusionAddress)
         .sortByDerivationIndexDesc()
         .findFirst();
     return address!.value;
@@ -1613,9 +1704,7 @@ class BitcoinCashWallet extends CoinServiceAPI
         }
         final scripthash =
             _convertToScriptHash(allAddresses[i].value, _network);
-        if (kDebugMode) {
-          print("SCRIPT_HASH_FOR_ADDRESS ${allAddresses[i]} IS $scripthash");
-        }
+
         batches[batchNumber]!.addAll({
           scripthash: [scripthash]
         });
@@ -1650,24 +1739,54 @@ class BitcoinCashWallet extends CoinServiceAPI
 
           final outputs = txn["vout"] as List;
 
+          String? scriptPubKey;
           String? utxoOwnerAddress;
           // get UTXO owner address
           for (final output in outputs) {
             if (output["n"] == vout) {
+              scriptPubKey = output["scriptPubKey"]?["hex"] as String?;
               utxoOwnerAddress =
                   output["scriptPubKey"]?["addresses"]?[0] as String? ??
                       output["scriptPubKey"]?["address"] as String?;
             }
           }
 
+          bool blocked = false;
+          String? blockedReason;
+
+          if (scriptPubKey != null) {
+            // check for cash tokens
+            try {
+              final ctOutput = ct.unwrap_spk(scriptPubKey.toUint8ListFromHex);
+              if (ctOutput.token_data != null) {
+                // found a token!
+                blocked = true;
+                blockedReason = "Cash token output detected";
+              }
+            } catch (e, s) {
+              // Probably doesn't contain a cash token so just log failure
+              Logging.instance.log(
+                "Script pub key \"$scriptPubKey\" cash token"
+                " parsing check failed: $e\n$s",
+                level: LogLevel.Warning,
+              );
+            }
+
+            // check for SLP tokens if not already blocked
+            if (!blocked && BchUtils.isSLP(scriptPubKey.toUint8ListFromHex)) {
+              blocked = true;
+              blockedReason = "SLP token output detected";
+            }
+          }
+
           final utxo = isar_models.UTXO(
             walletId: walletId,
             txid: txn["txid"] as String,
             vout: vout,
             value: jsonUTXO["value"] as int,
             name: "",
-            isBlocked: false,
-            blockedReason: null,
+            isBlocked: blocked,
+            blockedReason: blockedReason,
             isCoinbase: txn["is_coinbase"] as bool? ?? false,
             blockHash: txn["blockhash"] as String?,
             blockHeight: jsonUTXO["height"] as int?,
@@ -1796,50 +1915,6 @@ class BitcoinCashWallet extends CoinServiceAPI
     }
   }
 
-  Future<void> _checkChangeAddressForTransactions() async {
-    try {
-      final currentChange = await _currentChangeAddress;
-      final int txCount = await getTxCount(address: currentChange.value);
-      Logging.instance.log(
-          'Number of txs for current change address $currentChange: $txCount',
-          level: LogLevel.Info);
-
-      if (txCount >= 1 || currentChange.derivationIndex < 0) {
-        // First increment the change index
-        final newChangeIndex = currentChange.derivationIndex + 1;
-
-        // Use new index to derive a new change address
-        final newChangeAddress = await _generateAddressForChain(
-            1, newChangeIndex, DerivePathTypeExt.primaryFor(coin));
-
-        final existing = await db
-            .getAddresses(walletId)
-            .filter()
-            .valueEqualTo(newChangeAddress.value)
-            .findFirst();
-        if (existing == null) {
-          // Add that new change address
-          await db.putAddress(newChangeAddress);
-        } else {
-          // we need to update the address
-          await db.updateAddress(existing, newChangeAddress);
-        }
-        // keep checking until address with no tx history is set as current
-        await _checkChangeAddressForTransactions();
-      }
-    } on SocketException catch (se, s) {
-      Logging.instance.log(
-          "SocketException caught in _checkReceivingAddressForTransactions(${DerivePathTypeExt.primaryFor(coin)}): $se\n$s",
-          level: LogLevel.Error);
-      return;
-    } catch (e, s) {
-      Logging.instance.log(
-          "Exception rethrown from _checkReceivingAddressForTransactions(${DerivePathTypeExt.primaryFor(coin)}): $e\n$s",
-          level: LogLevel.Error);
-      rethrow;
-    }
-  }
-
   Future<void> _checkCurrentReceivingAddressesForTransactions() async {
     try {
       // for (final type in DerivePathType.values) {
@@ -1864,30 +1939,6 @@ class BitcoinCashWallet extends CoinServiceAPI
     }
   }
 
-  Future<void> _checkCurrentChangeAddressesForTransactions() async {
-    try {
-      // for (final type in DerivePathType.values) {
-      await _checkChangeAddressForTransactions();
-      // }
-    } catch (e, s) {
-      Logging.instance.log(
-          "Exception rethrown from _checkCurrentChangeAddressesForTransactions(): $e\n$s",
-          level: LogLevel.Error);
-      rethrow;
-    }
-  }
-
-  /// public wrapper because dart can't test private...
-  Future<void> checkCurrentChangeAddressesForTransactions() async {
-    if (Platform.environment["FLUTTER_TEST"] == "true") {
-      try {
-        return _checkCurrentChangeAddressesForTransactions();
-      } catch (_) {
-        rethrow;
-      }
-    }
-  }
-
   /// attempts to convert a string to a valid scripthash
   ///
   /// Returns the scripthash or throws an exception on invalid bch address
@@ -1905,7 +1956,7 @@ class BitcoinCashWallet extends CoinServiceAPI
   }
 
   Future<List<Map<String, dynamic>>> _fetchHistory(
-      List<String> allAddresses) async {
+      Iterable<String> allAddresses) async {
     try {
       List<Map<String, dynamic>> allTxHashes = [];
 
@@ -1917,9 +1968,10 @@ class BitcoinCashWallet extends CoinServiceAPI
         if (batches[batchNumber] == null) {
           batches[batchNumber] = {};
         }
-        final scripthash = _convertToScriptHash(allAddresses[i], _network);
+        final scripthash =
+            _convertToScriptHash(allAddresses.elementAt(i), _network);
         final id = Logger.isTestEnv ? "$i" : const Uuid().v1();
-        requestIdToAddressMap[id] = allAddresses[i];
+        requestIdToAddressMap[id] = allAddresses.elementAt(i);
         batches[batchNumber]!.addAll({
           id: [scripthash]
         });
@@ -1985,25 +2037,22 @@ class BitcoinCashWallet extends CoinServiceAPI
       }
     }).toSet();
 
+    final allAddressesSet = {...receivingAddresses, ...changeAddresses};
+
     final List<Map<String, dynamic>> allTxHashes =
-        await _fetchHistory([...receivingAddresses, ...changeAddresses]);
+        await _fetchHistory(allAddressesSet);
 
     List<Map<String, dynamic>> allTransactions = [];
 
     for (final txHash in allTxHashes) {
-      final storedTx = await db
-          .getTransactions(walletId)
-          .filter()
-          .txidEqualTo(txHash["tx_hash"] as String)
+      final storedTx = await db.isar.transactionV2s
+          .where()
+          .txidWalletIdEqualTo(txHash["tx_hash"] as String, walletId)
           .findFirst();
 
       if (storedTx == null ||
-              storedTx.address.value == null ||
-              storedTx.height == null ||
-              (storedTx.height != null && storedTx.height! <= 0)
-          // zero conf messes this up
-          // !storedTx.isConfirmed(currentHeight, MINIMUM_CONFIRMATIONS)
-          ) {
+          storedTx.height == null ||
+          (storedTx.height != null && storedTx.height! <= 0)) {
         final tx = await cachedElectrumXClient.getTransaction(
           txHash: txHash["tx_hash"] as String,
           verbose: true,
@@ -2012,222 +2061,172 @@ class BitcoinCashWallet extends CoinServiceAPI
 
         // Logging.instance.log("TRANSACTION: ${jsonEncode(tx)}");
         if (!_duplicateTxCheck(allTransactions, tx["txid"] as String)) {
-          tx["address"] = await db
-              .getAddresses(walletId)
-              .filter()
-              .valueEqualTo(txHash["address"] as String)
-              .findFirst();
           tx["height"] = txHash["height"];
           allTransactions.add(tx);
         }
       }
     }
-    //
-    // Logging.instance.log("addAddresses: $allAddresses", level: LogLevel.Info);
-    // Logging.instance.log("allTxHashes: $allTxHashes", level: LogLevel.Info);
-    //
-    // Logging.instance.log("allTransactions length: ${allTransactions.length}",
-    //     level: LogLevel.Info);
 
-    final List<Tuple2<isar_models.Transaction, isar_models.Address?>> txns = [];
+    final List<TransactionV2> txns = [];
 
     for (final txData in allTransactions) {
-      Set<String> inputAddresses = {};
-      Set<String> outputAddresses = {};
+      // set to true if any inputs were detected as owned by this wallet
+      bool wasSentFromThisWallet = false;
 
-      Amount totalInputValue = Amount(
-        rawValue: BigInt.from(0),
-        fractionDigits: coin.decimals,
-      );
-      Amount totalOutputValue = Amount(
-        rawValue: BigInt.from(0),
-        fractionDigits: coin.decimals,
-      );
-
-      Amount amountSentFromWallet = Amount(
-        rawValue: BigInt.from(0),
-        fractionDigits: coin.decimals,
-      );
-      Amount amountReceivedInWallet = Amount(
-        rawValue: BigInt.from(0),
-        fractionDigits: coin.decimals,
-      );
-      Amount changeAmount = Amount(
-        rawValue: BigInt.from(0),
-        fractionDigits: coin.decimals,
-      );
+      // set to true if any outputs were detected as owned by this wallet
+      bool wasReceivedInThisWallet = false;
+      BigInt amountReceivedInThisWallet = BigInt.zero;
+      BigInt changeAmountReceivedInThisWallet = BigInt.zero;
 
       // parse inputs
-      for (final input in txData["vin"] as List) {
-        final prevTxid = input["txid"] as String;
-        final prevOut = input["vout"] as int;
+      final List<InputV2> inputs = [];
+      for (final jsonInput in txData["vin"] as List) {
+        final map = Map<String, dynamic>.from(jsonInput as Map);
 
-        // fetch input tx to get address
-        final inputTx = await cachedElectrumXClient.getTransaction(
-          txHash: prevTxid,
-          coin: coin,
-        );
+        final List<String> addresses = [];
+        String valueStringSats = "0";
+        OutpointV2? outpoint;
 
-        for (final output in inputTx["vout"] as List) {
-          // check matching output
-          if (prevOut == output["n"]) {
-            // get value
-            final value = Amount.fromDecimal(
-              Decimal.parse(output["value"].toString()),
-              fractionDigits: coin.decimals,
-            );
+        final coinbase = map["coinbase"] as String?;
 
-            // add value to total
-            totalInputValue = totalInputValue + value;
+        if (coinbase == null) {
+          final txid = map["txid"] as String;
+          final vout = map["vout"] as int;
 
-            // get input(prevOut) address
-            final address =
-                output["scriptPubKey"]?["addresses"]?[0] as String? ??
-                    output["scriptPubKey"]?["address"] as String?;
+          final inputTx = await cachedElectrumXClient.getTransaction(
+              txHash: txid, coin: coin);
 
-            if (address != null) {
-              inputAddresses.add(address);
+          final prevOutJson = Map<String, dynamic>.from(
+              (inputTx["vout"] as List).firstWhere((e) => e["n"] == vout)
+                  as Map);
 
-              // if input was from my wallet, add value to amount sent
-              if (receivingAddresses.contains(address) ||
-                  changeAddresses.contains(address)) {
-                amountSentFromWallet = amountSentFromWallet + value;
-              }
-            }
-          }
-        }
-      }
-
-      // parse outputs
-      for (final output in txData["vout"] as List) {
-        // get value
-        final value = Amount.fromDecimal(
-          Decimal.parse(output["value"].toString()),
-          fractionDigits: coin.decimals,
-        );
-
-        // add value to total
-        totalOutputValue += value;
-
-        // get output address
-        final address = output["scriptPubKey"]?["addresses"]?[0] as String? ??
-            output["scriptPubKey"]?["address"] as String?;
-        if (address != null) {
-          outputAddresses.add(address);
-
-          // if output was to my wallet, add value to amount received
-          if (receivingAddresses.contains(address)) {
-            amountReceivedInWallet += value;
-          } else if (changeAddresses.contains(address)) {
-            changeAmount += value;
-          }
-        }
-      }
-
-      final mySentFromAddresses = [
-        ...receivingAddresses.intersection(inputAddresses),
-        ...changeAddresses.intersection(inputAddresses)
-      ];
-      final myReceivedOnAddresses =
-          receivingAddresses.intersection(outputAddresses);
-      final myChangeReceivedOnAddresses =
-          changeAddresses.intersection(outputAddresses);
-
-      final fee = totalInputValue - totalOutputValue;
-
-      // this is the address initially used to fetch the txid
-      isar_models.Address transactionAddress =
-          txData["address"] as isar_models.Address;
-
-      isar_models.TransactionType type;
-      Amount amount;
-      if (mySentFromAddresses.isNotEmpty && myReceivedOnAddresses.isNotEmpty) {
-        // tx is sent to self
-        type = isar_models.TransactionType.sentToSelf;
-        amount =
-            amountSentFromWallet - amountReceivedInWallet - fee - changeAmount;
-      } else if (mySentFromAddresses.isNotEmpty) {
-        // outgoing tx
-        type = isar_models.TransactionType.outgoing;
-        amount = amountSentFromWallet - changeAmount - fee;
-        final possible =
-            outputAddresses.difference(myChangeReceivedOnAddresses).first;
-
-        if (transactionAddress.value != possible) {
-          transactionAddress = isar_models.Address(
-            walletId: walletId,
-            value: possible,
-            publicKey: [],
-            type: AddressType.nonWallet,
-            derivationIndex: -1,
-            derivationPath: null,
-            subType: AddressSubType.nonWallet,
+          final prevOut = OutputV2.fromElectrumXJson(
+            prevOutJson,
+            decimalPlaces: coin.decimals,
+            walletOwns: false, // doesn't matter here as this is not saved
           );
+
+          outpoint = OutpointV2.isarCantDoRequiredInDefaultConstructor(
+            txid: txid,
+            vout: vout,
+          );
+          valueStringSats = prevOut.valueStringSats;
+          addresses.addAll(prevOut.addresses);
         }
-      } else {
-        // incoming tx
-        type = isar_models.TransactionType.incoming;
-        amount = amountReceivedInWallet;
-      }
 
-      List<isar_models.Input> inputs = [];
-      List<isar_models.Output> outputs = [];
-
-      for (final json in txData["vin"] as List) {
-        bool isCoinBase = json['coinbase'] != null;
-        final input = isar_models.Input(
-          txid: json['txid'] as String,
-          vout: json['vout'] as int? ?? -1,
-          scriptSig: json['scriptSig']?['hex'] as String?,
-          scriptSigAsm: json['scriptSig']?['asm'] as String?,
-          isCoinbase: isCoinBase ? isCoinBase : json['is_coinbase'] as bool?,
-          sequence: json['sequence'] as int?,
-          innerRedeemScriptAsm: json['innerRedeemscriptAsm'] as String?,
+        InputV2 input = InputV2.isarCantDoRequiredInDefaultConstructor(
+          scriptSigHex: map["scriptSig"]?["hex"] as String?,
+          sequence: map["sequence"] as int?,
+          outpoint: outpoint,
+          valueStringSats: valueStringSats,
+          addresses: addresses,
+          witness: map["witness"] as String?,
+          coinbase: coinbase,
+          innerRedeemScriptAsm: map["innerRedeemscriptAsm"] as String?,
+          // don't know yet if wallet owns. Need addresses first
+          walletOwns: false,
         );
+
+        if (allAddressesSet.intersection(input.addresses.toSet()).isNotEmpty) {
+          wasSentFromThisWallet = true;
+          input = input.copyWith(walletOwns: true);
+        }
+
         inputs.add(input);
       }
 
-      for (final json in txData["vout"] as List) {
-        final output = isar_models.Output(
-          scriptPubKey: json['scriptPubKey']?['hex'] as String?,
-          scriptPubKeyAsm: json['scriptPubKey']?['asm'] as String?,
-          scriptPubKeyType: json['scriptPubKey']?['type'] as String?,
-          scriptPubKeyAddress:
-              json["scriptPubKey"]?["addresses"]?[0] as String? ??
-                  json['scriptPubKey']['type'] as String,
-          value: Amount.fromDecimal(
-            Decimal.parse(json["value"].toString()),
-            fractionDigits: coin.decimals,
-          ).raw.toInt(),
+      // parse outputs
+      final List<OutputV2> outputs = [];
+      for (final outputJson in txData["vout"] as List) {
+        OutputV2 output = OutputV2.fromElectrumXJson(
+          Map<String, dynamic>.from(outputJson as Map),
+          decimalPlaces: coin.decimals,
+          // don't know yet if wallet owns. Need addresses first
+          walletOwns: false,
         );
+
+        // if output was to my wallet, add value to amount received
+        if (receivingAddresses
+            .intersection(output.addresses.toSet())
+            .isNotEmpty) {
+          wasReceivedInThisWallet = true;
+          amountReceivedInThisWallet += output.value;
+          output = output.copyWith(walletOwns: true);
+        } else if (changeAddresses
+            .intersection(output.addresses.toSet())
+            .isNotEmpty) {
+          wasReceivedInThisWallet = true;
+          changeAmountReceivedInThisWallet += output.value;
+          output = output.copyWith(walletOwns: true);
+        }
+
         outputs.add(output);
       }
 
-      final tx = isar_models.Transaction(
+      final totalOut = outputs
+          .map((e) => e.value)
+          .fold(BigInt.zero, (value, element) => value + element);
+
+      isar_models.TransactionType type;
+      isar_models.TransactionSubType subType =
+          isar_models.TransactionSubType.none;
+
+      // at least one input was owned by this wallet
+      if (wasSentFromThisWallet) {
+        type = isar_models.TransactionType.outgoing;
+
+        if (wasReceivedInThisWallet) {
+          if (changeAmountReceivedInThisWallet + amountReceivedInThisWallet ==
+              totalOut) {
+            // definitely sent all to self
+            type = isar_models.TransactionType.sentToSelf;
+          } else if (amountReceivedInThisWallet == BigInt.zero) {
+            // most likely just a typical send
+            // do nothing here yet
+          }
+
+          // check vout 0 for special scripts
+          if (outputs.isNotEmpty) {
+            final output = outputs.first;
+
+            // check for fusion
+            if (BchUtils.isFUZE(output.scriptPubKeyHex.toUint8ListFromHex)) {
+              subType = isar_models.TransactionSubType.cashFusion;
+            } else {
+              // check other cases here such as SLP or cash tokens etc
+            }
+          }
+        }
+      } else if (wasReceivedInThisWallet) {
+        // only found outputs owned by this wallet
+        type = isar_models.TransactionType.incoming;
+      } else {
+        Logging.instance.log(
+          "Unexpected tx found: $txData",
+          level: LogLevel.Error,
+        );
+        continue;
+      }
+
+      final tx = TransactionV2(
         walletId: walletId,
+        blockHash: txData["blockhash"] as String?,
+        hash: txData["hash"] as String,
         txid: txData["txid"] as String,
-        timestamp: txData["blocktime"] as int? ??
-            (DateTime.now().millisecondsSinceEpoch ~/ 1000),
-        type: type,
-        subType: isar_models.TransactionSubType.none,
-        amount: amount.raw.toInt(),
-        amountString: amount.toJsonString(),
-        fee: fee.raw.toInt(),
         height: txData["height"] as int?,
-        isCancelled: false,
-        isLelantus: false,
-        slateId: null,
-        otherData: null,
-        nonce: null,
-        inputs: inputs,
-        outputs: outputs,
-        numberOfMessages: null,
+        version: txData["version"] as int,
+        timestamp: txData["blocktime"] as int? ??
+            DateTime.timestamp().millisecondsSinceEpoch ~/ 1000,
+        inputs: List.unmodifiable(inputs),
+        outputs: List.unmodifiable(outputs),
+        type: type,
+        subType: subType,
       );
 
-      txns.add(Tuple2(tx, transactionAddress));
+      txns.add(tx);
     }
 
-    await db.addNewTransactionData(txns, walletId);
+    await db.updateOrPutTransactionV2s(txns);
 
     // quick hack to notify manager to call notifyListeners if
     // transactions changed
@@ -2466,10 +2465,11 @@ class BitcoinCashWallet extends CoinServiceAPI
         if (changeOutputSize > DUST_LIMIT.raw.toInt() &&
             satoshisBeingUsed - satoshiAmountToSend - changeOutputSize ==
                 feeForTwoOutputs) {
-          // generate new change address if current change address has been used
-          await _checkChangeAddressForTransactions();
-          final String newChangeAddress = await _getCurrentAddressForChain(
-              1, DerivePathTypeExt.primaryFor(coin));
+          // get the next unused change address
+          final String newChangeAddress =
+              (await _getUnusedChangeAddresses(numberOfAddresses: 1))
+                  .first
+                  .value;
 
           int feeBeingPaid =
               satoshisBeingUsed - satoshiAmountToSend - changeOutputSize;
@@ -2668,28 +2668,30 @@ class BitcoinCashWallet extends CoinServiceAPI
     try {
       // Populating the addresses to check
       for (var i = 0; i < utxosToUse.length; i++) {
-        final txid = utxosToUse[i].txid;
-        final tx = await _cachedElectrumXClient.getTransaction(
-          txHash: txid,
-          coin: coin,
-        );
+        if (utxosToUse[i].address == null) {
+          final txid = utxosToUse[i].txid;
+          final tx = await _cachedElectrumXClient.getTransaction(
+            txHash: txid,
+            coin: coin,
+          );
 
-        for (final output in tx["vout"] as List) {
-          final n = output["n"];
-          if (n != null && n == utxosToUse[i].vout) {
-            String address =
-                output["scriptPubKey"]?["addresses"]?[0] as String? ??
-                    output["scriptPubKey"]["address"] as String;
-            if (bitbox.Address.detectFormat(address) !=
-                bitbox.Address.formatCashAddr) {
-              try {
-                address = bitbox.Address.toCashAddress(address);
-              } catch (_) {
-                rethrow;
+          for (final output in tx["vout"] as List) {
+            final n = output["n"];
+            if (n != null && n == utxosToUse[i].vout) {
+              String address =
+                  output["scriptPubKey"]?["addresses"]?[0] as String? ??
+                      output["scriptPubKey"]["address"] as String;
+              if (bitbox.Address.detectFormat(address) !=
+                  bitbox.Address.formatCashAddr) {
+                try {
+                  address = bitbox.Address.toCashAddress(address);
+                } catch (_) {
+                  rethrow;
+                }
               }
-            }
 
-            utxosToUse[i] = utxosToUse[i].copyWith(address: address);
+              utxosToUse[i] = utxosToUse[i].copyWith(address: address);
+            }
           }
         }
 
@@ -2800,66 +2802,43 @@ class BitcoinCashWallet extends CoinServiceAPI
       testnet: coin == Coin.bitcoincashTestnet,
     );
 
-    // retrieve address' utxos from the rest api
-    List<bitbox.Utxo> _utxos =
-        []; // await Bitbox.Address.utxo(address) as List<Bitbox.Utxo>;
-    for (var element in utxosToUse) {
-      _utxos.add(bitbox.Utxo(
-          element.txid,
-          element.vout,
-          bitbox.BitcoinCash.fromSatoshi(element.value),
-          element.value,
-          0,
-          MINIMUM_CONFIRMATIONS + 1));
-    }
-    Logger.print("bch utxos: $_utxos");
-
-    // placeholder for input signatures
-    final List<Map<dynamic, dynamic>> signatures = [];
-
-    // placeholder for total input balance
-    // int totalBalance = 0;
-
-    // iterate through the list of address _utxos and use them as inputs for the
-    // withdrawal transaction
-    for (var utxo in _utxos) {
-      // add the utxo as an input for the transaction
-      builder.addInput(utxo.txid, utxo.vout);
-      final ec =
-          utxoSigningData.firstWhere((e) => e.utxo.txid == utxo.txid).keyPair!;
-
-      final bitboxEC = bitbox.ECPair.fromWIF(ec.toWIF());
-
-      // add a signature to the list to be used later
-      signatures.add({
-        "vin": signatures.length,
-        "key_pair": bitboxEC,
-        "original_amount": utxo.satoshis
-      });
-
-      // totalBalance += utxo.satoshis;
-    }
-
-    // calculate the fee based on number of inputs and one expected output
-    // final fee =
-    //     bitbox.BitcoinCash.getByteCount(signatures.length, recipients.length);
-
-    // calculate how much balance will be left over to spend after the fee
-    // final sendAmount = totalBalance - fee;
-
     // add the output based on the address provided in the testing data
     for (int i = 0; i < recipients.length; i++) {
-      String recipient = recipients[i];
-      int satoshiAmount = satoshiAmounts[i];
-      builder.addOutput(recipient, satoshiAmount);
+      builder.addOutput(recipients[i], satoshiAmounts[i]);
     }
 
-    // sign all inputs
-    for (var signature in signatures) {
+    assert(utxosToUse.length == utxoSigningData.length);
+
+    final List<({bitbox.ECPair ecPair, int sats})> signingData = [];
+
+    for (final sd in utxoSigningData) {
+      final utxo = bitbox.Utxo(
+        sd.utxo.txid,
+        sd.utxo.vout,
+        bitbox.BitcoinCash.fromSatoshi(sd.utxo.value),
+        sd.utxo.value,
+        0,
+        MINIMUM_CONFIRMATIONS + 1, // why +1 ?
+      );
+
+      // add the utxo as an input for the transaction
+      builder.addInput(utxo.txid, utxo.vout);
+
+      // prepare signing data
+      signingData.add(
+        (
+          ecPair: bitbox.ECPair.fromWIF(sd.keyPair!.toWIF()),
+          sats: utxo.satoshis,
+        ),
+      );
+    }
+
+    for (int i = 0; i < signingData.length; i++) {
       builder.sign(
-          signature["vin"] as int,
-          signature["key_pair"] as bitbox.ECPair,
-          signature["original_amount"] as int);
+        i,
+        signingData[i].ecPair,
+        signingData[i].sats,
+      );
     }
 
     // build the transaction
diff --git a/lib/services/coins/bitcoincash/cashtokens.dart b/lib/services/coins/bitcoincash/cashtokens.dart
new file mode 100644
index 000000000..d35d2838c
--- /dev/null
+++ b/lib/services/coins/bitcoincash/cashtokens.dart
@@ -0,0 +1,317 @@
+import 'dart:typed_data';
+
+// The Structure enum
+enum Structure {
+  HasAmount,
+  HasNFT,
+  HasCommitmentLength,
+}
+
+// The Capability enum
+enum Capability {
+  NoCapability,
+  Mutable,
+  Minting,
+}
+
+// Used as a "custom tuple" for the supporting functions of readCompactSize to return
+// a convenient data structure.
+class CompactSizeResult {
+  final int amount;
+  final int bytesRead;
+
+  CompactSizeResult({required this.amount, required this.bytesRead});
+}
+
+// This class is a data structure representing the entire output, comprised of both the
+// normal Script pub key and the token data.  We get this after we parse/unwrap the raw
+// output.
+class ParsedOutput {
+  List<int>? script_pub_key;
+  TokenOutputData? token_data;
+  ParsedOutput({this.script_pub_key, this.token_data});
+}
+
+// This is equivalent to the Electron Cash python's "OutputData" in token.py.
+// Named here specifically as "TokenOutputData" to reflect the fact that
+// it is specifically for tokens, whereas the other class ParsedOutput represents
+// the entire output, comprised of both the normal Script pub key and the token data.
+class TokenOutputData {
+  Uint8List? id;
+  int? amount;
+  Uint8List? commitment;
+  Uint8List? bitfield; // A byte (Uint8List of length 1)
+
+  // Constructor
+  TokenOutputData({
+    this.id,
+    this.amount,
+    this.commitment,
+    this.bitfield,
+  });
+
+  // Get the "capability", see Capability enum.
+  int getCapability() {
+    if (bitfield != null) {
+      return bitfield![0] & 0x0f;
+    }
+    return 0;
+  }
+
+  // functions to return attributes of the token bitfield.
+  bool hasCommitmentLength() {
+    if (bitfield != null) {
+      return (bitfield![0] & 0x40) != 0;
+    }
+    return false;
+  }
+
+  bool hasAmount() {
+    if (bitfield != null) {
+      return (bitfield![0] & 0x10) != 0;
+    }
+    return false;
+  }
+
+  bool hasNFT() {
+    if (bitfield != null) {
+      return (bitfield![0] & 0x20) != 0;
+    }
+    return false;
+  }
+
+  // Functions to return specific attributes based on the Capability.
+  bool isMintingNFT() {
+    return hasNFT() && getCapability() == Capability.Minting.index;
+  }
+
+  bool isMutableNFT() {
+    return hasNFT() && getCapability() == Capability.Mutable.index;
+  }
+
+  bool isImmutableNFT() {
+    return hasNFT() && getCapability() == Capability.NoCapability.index;
+  }
+
+  // This function validates if the bitfield makes sense or violates known rules/logic.
+  bool isValidBitfield() {
+    if (bitfield == null) {
+      return false;
+    }
+
+    int s = bitfield![0] & 0xf0;
+    if (s >= 0x80 || s == 0x00) {
+      return false;
+    }
+    if (bitfield![0] & 0x0f > 2) {
+      return false;
+    }
+    if (!hasNFT() && !hasAmount()) {
+      return false;
+    }
+    if (!hasNFT() && (bitfield![0] & 0x0f) != 0) {
+      return false;
+    }
+    if (!hasNFT() && hasCommitmentLength()) {
+      return false;
+    }
+    return true;
+  }
+
+  // The serialze and deserialize functions are the nuts and bolts of how we unpack
+  // and pack outputs.  These are called by the wrap and unwrap functions.
+  int deserialize(Uint8List buffer, {int cursor = 0, bool strict = false}) {
+    try {
+      this.id = buffer.sublist(cursor, cursor + 32);
+      cursor += 32;
+
+      this.bitfield = Uint8List.fromList([buffer[cursor]]);
+      cursor += 1;
+
+      if (this.hasCommitmentLength()) {
+        // Read the first byte to determine the length of the commitment data
+        int commitmentLength = buffer[cursor];
+
+        // Move cursor to the next byte
+        cursor += 1;
+
+        // Read 'commitmentLength' bytes for the commitment data
+        this.commitment = buffer.sublist(cursor, cursor + commitmentLength);
+
+        // Adjust the cursor by the length of the commitment data
+        cursor += commitmentLength;
+      } else {
+        this.commitment = null;
+      }
+
+      if (this.hasAmount()) {
+        // Use readCompactSize that returns CompactSizeResult
+        CompactSizeResult result =
+            readCompactSize(buffer, cursor, strict: strict);
+        this.amount = result.amount;
+        cursor += result.bytesRead;
+      } else {
+        this.amount = 0;
+      }
+
+      if (!this.isValidBitfield() ||
+          (this.hasAmount() && this.amount == 0) ||
+          (this.amount! < 0 || this.amount! > (1 << 63) - 1) ||
+          (this.hasCommitmentLength() && this.commitment!.isEmpty) ||
+          (this.amount! == 0 && !this.hasNFT())) {
+        throw Exception('Unable to parse token data or token data is invalid');
+      }
+
+      return cursor; // Return the number of bytes read
+    } catch (e) {
+      throw Exception('Deserialization failed: $e');
+    }
+  }
+
+  // Serialize method
+  Uint8List serialize() {
+    var buffer = BytesBuilder();
+
+    // write ID and bitfield
+    buffer.add(this.id!);
+    buffer.addByte(this.bitfield![0]);
+
+    // Write optional fields
+    if (this.hasCommitmentLength()) {
+      buffer.add(this.commitment!);
+    }
+
+    if (this.hasAmount()) {
+      List<int> compactSizeBytes = writeCompactSize(this.amount!);
+      buffer.add(compactSizeBytes);
+    }
+
+    return buffer.toBytes();
+  }
+} //END OF OUTPUTDATA CLASS
+
+// The prefix byte is specified by the CashTokens spec.
+final List<int> PREFIX_BYTE = [0xef];
+
+// This function wraps a "normal" output together with token data.
+ParsedOutput wrap_spk(TokenOutputData? token_data, Uint8List script_pub_key) {
+  ParsedOutput parsedOutput = ParsedOutput();
+
+  if (token_data == null) {
+    parsedOutput.script_pub_key = script_pub_key;
+    return parsedOutput;
+  }
+
+  final buf = BytesBuilder();
+
+  buf.add(PREFIX_BYTE);
+  buf.add(token_data.serialize());
+  buf.add(script_pub_key);
+
+  parsedOutput.script_pub_key = buf.toBytes();
+  parsedOutput.token_data = token_data;
+
+  return parsedOutput;
+}
+
+// This function unwraps any output, either "normal" (containing no token data)
+// or an output with token data.  If no token data, just the output is returned,
+// and if token data exists, both the output and token data are returned.
+// Note that the data returend in both cases in of ParsedOutput type, which
+// holds both the script pub key and token data.
+ParsedOutput unwrap_spk(Uint8List wrapped_spk) {
+  ParsedOutput parsedOutput = ParsedOutput();
+
+  if (wrapped_spk.isEmpty || wrapped_spk[0] != PREFIX_BYTE[0]) {
+    parsedOutput.script_pub_key = wrapped_spk;
+    return parsedOutput;
+  }
+
+  int read_cursor = 1; // Start after the PREFIX_BYTE
+  TokenOutputData token_data = TokenOutputData();
+
+  Uint8List wrapped_spk_without_prefix_byte;
+  try {
+    // Deserialize updates read_cursor by the number of bytes read
+
+    wrapped_spk_without_prefix_byte = wrapped_spk.sublist(read_cursor);
+    int bytesRead = token_data.deserialize(wrapped_spk_without_prefix_byte);
+
+    read_cursor += bytesRead;
+    parsedOutput.token_data = token_data;
+    parsedOutput.script_pub_key = wrapped_spk.sublist(read_cursor);
+  } catch (e) {
+    // If unable to deserialize, return all bytes as the full scriptPubKey
+    parsedOutput.script_pub_key = wrapped_spk;
+  }
+
+  return parsedOutput;
+}
+
+// HELPER FUNCTIONS
+
+//These are part of a "length value " scheme where the length (and endianness) are given first
+// and inform the program of how many bytes to grab next.  These are in turn used by the serialize
+// and deserialize functions.-
+CompactSizeResult readCompactSize(
+  Uint8List buffer,
+  int cursor, {
+  bool strict = false,
+}) {
+  int bytesRead = 0; // Variable to count bytes read
+  int val;
+  try {
+    val = buffer[cursor];
+    cursor += 1;
+    bytesRead += 1;
+    int minVal;
+    if (val == 253) {
+      val = buffer.buffer.asByteData().getUint16(cursor, Endian.little);
+      cursor += 2;
+      bytesRead += 2;
+      minVal = 253;
+    } else if (val == 254) {
+      val = buffer.buffer.asByteData().getUint32(cursor, Endian.little);
+      cursor += 4;
+      bytesRead += 4;
+      minVal = 1 << 16;
+    } else if (val == 255) {
+      val = buffer.buffer.asByteData().getInt64(cursor, Endian.little);
+      cursor += 8;
+      bytesRead += 8;
+      minVal = 1 << 32;
+    } else {
+      minVal = 0;
+    }
+    if (strict && val < minVal) {
+      throw Exception("CompactSize is not minimally encoded");
+    }
+
+    return CompactSizeResult(amount: val, bytesRead: bytesRead);
+  } catch (e) {
+    throw Exception("attempt to read past end of buffer");
+  }
+}
+
+Uint8List writeCompactSize(int size) {
+  var buffer = ByteData(9); // Maximum needed size for compact size is 9 bytes
+  if (size < 0) {
+    throw Exception("attempt to write size < 0");
+  } else if (size < 253) {
+    return Uint8List.fromList([size]);
+  } else if (size < (1 << 16)) {
+    buffer.setUint8(0, 253);
+    buffer.setUint16(1, size, Endian.little);
+    return buffer.buffer.asUint8List(0, 3);
+  } else if (size < (1 << 32)) {
+    buffer.setUint8(0, 254);
+    buffer.setUint32(1, size, Endian.little);
+    return buffer.buffer.asUint8List(0, 5);
+  } else if (size < (1 << 64)) {
+    buffer.setUint8(0, 255);
+    buffer.setInt64(1, size, Endian.little);
+    return buffer.buffer.asUint8List(0, 9);
+  } else {
+    throw Exception("Size too large to represent as CompactSize");
+  }
+}
diff --git a/lib/services/coins/manager.dart b/lib/services/coins/manager.dart
index 05f27d503..074c20499 100644
--- a/lib/services/coins/manager.dart
+++ b/lib/services/coins/manager.dart
@@ -21,6 +21,7 @@ import 'package:stackwallet/services/event_bus/events/global/node_connection_sta
 import 'package:stackwallet/services/event_bus/events/global/updated_in_background_event.dart';
 import 'package:stackwallet/services/event_bus/global_event_bus.dart';
 import 'package:stackwallet/services/mixins/coin_control_interface.dart';
+import 'package:stackwallet/services/mixins/fusion_wallet_interface.dart';
 import 'package:stackwallet/services/mixins/ordinals_interface.dart';
 import 'package:stackwallet/services/mixins/paynym_wallet_interface.dart';
 import 'package:stackwallet/services/mixins/xpubable.dart';
@@ -253,6 +254,8 @@ class Manager with ChangeNotifier {
 
   bool get hasWhirlpoolSupport => false;
 
+  bool get hasFusionSupport => _currentWallet is FusionWalletInterface;
+
   int get rescanOnOpenVersion =>
       DB.instance.get<dynamic>(
         boxName: DB.boxNameDBInfo,
diff --git a/lib/services/ethereum/ethereum_token_service.dart b/lib/services/ethereum/ethereum_token_service.dart
index a42867485..239d8770e 100644
--- a/lib/services/ethereum/ethereum_token_service.dart
+++ b/lib/services/ethereum/ethereum_token_service.dart
@@ -468,7 +468,7 @@ class EthTokenWallet extends ChangeNotifier with EthTokenCache {
     }
 
     final response2 = await EthereumAPI.getEthTokenTransactionsByTxids(
-      response.value!.map((e) => e.transactionHash).toList(),
+      response.value!.map((e) => e.transactionHash).toSet().toList(),
     );
 
     if (response2.value == null) {
@@ -477,14 +477,25 @@ class EthTokenWallet extends ChangeNotifier with EthTokenCache {
     }
     final List<Tuple2<EthTokenTxDto, EthTokenTxExtraDTO>> data = [];
     for (final tokenDto in response.value!) {
-      data.add(
-        Tuple2(
-          tokenDto,
-          response2.value!.firstWhere(
-            (e) => e.hash == tokenDto.transactionHash,
+      try {
+        final txExtra = response2.value!.firstWhere(
+          (e) => e.hash == tokenDto.transactionHash,
+        );
+        data.add(
+          Tuple2(
+            tokenDto,
+            txExtra,
           ),
-        ),
-      );
+        );
+      } catch (_) {
+        // Server indexing failed for some reason. Instead of hard crashing or
+        // showing no transactions we just skip it here. Not ideal but better
+        // than nothing showing up
+        Logging.instance.log(
+          "Server error: Transaction ${tokenDto.transactionHash} not found.",
+          level: LogLevel.Error,
+        );
+      }
     }
 
     final List<Tuple2<Transaction, Address?>> txnsData = [];
diff --git a/lib/services/fusion_tor_service.dart b/lib/services/fusion_tor_service.dart
new file mode 100644
index 000000000..eb8914e30
--- /dev/null
+++ b/lib/services/fusion_tor_service.dart
@@ -0,0 +1,71 @@
+import 'dart:io';
+
+import 'package:stackwallet/utilities/logger.dart';
+import 'package:tor_ffi_plugin/tor_ffi_plugin.dart';
+
+class FusionTorService {
+  Tor? _tor;
+  String? _torDataDirPath;
+
+  TorStatus get status => _tor!.status;
+
+  /// Singleton instance of the TorService.
+  ///
+  /// Use this to access the TorService and its properties.
+  static final sharedInstance = FusionTorService._();
+
+  // private constructor for singleton
+  FusionTorService._();
+
+  /// Getter for the proxyInfo.
+  ///
+  /// Throws if Tor is not connected.
+  ({
+    InternetAddress host,
+    int port,
+  }) getProxyInfo() {
+    try {
+      return (
+        host: InternetAddress.loopbackIPv4,
+        port: _tor!.port,
+      );
+    } catch (_) {
+      throw Exception("Tor proxy info fetched while not connected!");
+    }
+  }
+
+  /// Initialize the tor ffi lib instance if it hasn't already been set. Nothing
+  /// changes if _tor is already been set.
+  void init({
+    required String torDataDirPath,
+    Tor? mockableOverride,
+  }) {
+    _tor ??= mockableOverride ?? Tor.instance;
+    _torDataDirPath ??= torDataDirPath;
+  }
+
+  /// Start the Tor service.
+  ///
+  /// This will start the Tor service and establish a Tor circuit.
+  ///
+  /// Throws an exception if the Tor library was not inited or if the Tor
+  /// service fails to start.
+  ///
+  /// Returns a Future that completes when the Tor service has started.
+  Future<void> start() async {
+    if (_tor == null || _torDataDirPath == null) {
+      throw Exception("FusionTorService.init has not been called!");
+    }
+
+    // Start the Tor service.
+    try {
+      await _tor!.start(torDataDirPath: _torDataDirPath!);
+    } catch (e, s) {
+      Logging.instance.log(
+        "FusionTorService.start failed: $e\n$s",
+        level: LogLevel.Warning,
+      );
+      rethrow;
+    }
+  }
+}
diff --git a/lib/services/mixins/electrum_x_parsing.dart b/lib/services/mixins/electrum_x_parsing.dart
index d0b88ba35..acc9c6e76 100644
--- a/lib/services/mixins/electrum_x_parsing.dart
+++ b/lib/services/mixins/electrum_x_parsing.dart
@@ -12,13 +12,114 @@ import 'dart:convert';
 
 import 'package:bip47/src/util.dart';
 import 'package:decimal/decimal.dart';
+import 'package:stackwallet/electrumx_rpc/cached_electrumx.dart';
+import 'package:stackwallet/models/isar/models/blockchain_data/v2/input_v2.dart';
+import 'package:stackwallet/models/isar/models/blockchain_data/v2/output_v2.dart';
+import 'package:stackwallet/models/isar/models/blockchain_data/v2/transaction_v2.dart';
 import 'package:stackwallet/models/isar/models/isar_models.dart';
 import 'package:stackwallet/services/mixins/paynym_wallet_interface.dart';
 import 'package:stackwallet/utilities/amount/amount.dart';
 import 'package:stackwallet/utilities/enums/coin_enum.dart';
+import 'package:stackwallet/utilities/util.dart' as util;
 import 'package:tuple/tuple.dart';
 
+class TT with ElectrumXParsing {
+  //
+}
+
 mixin ElectrumXParsing {
+  Future<TransactionV2> getTransaction(
+    String txHash,
+    Coin coin,
+    String walletId,
+    CachedElectrumX cachedElectrumX, [
+    String? debugTitle,
+  ]) async {
+    final jsonTx = await cachedElectrumX.getTransaction(
+      txHash: txHash,
+      coin: coin,
+    );
+    print("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
+    util.Util.printJson(jsonTx, debugTitle);
+    print("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
+
+    // parse inputs
+    final List<InputV2> inputs = [];
+    for (final jsonInput in jsonTx["vin"] as List) {
+      final map = Map<String, dynamic>.from(jsonInput as Map);
+
+      final List<String> addresses = [];
+      String valueStringSats = "0";
+      OutpointV2? outpoint;
+
+      final coinbase = map["coinbase"] as String?;
+
+      if (coinbase == null) {
+        final txid = map["txid"] as String;
+        final vout = map["vout"] as int;
+
+        final inputTx =
+            await cachedElectrumX.getTransaction(txHash: txid, coin: coin);
+
+        final prevOutJson = Map<String, dynamic>.from(
+            (inputTx["vout"] as List).firstWhere((e) => e["n"] == vout) as Map);
+
+        final prevOut = OutputV2.fromElectrumXJson(
+          prevOutJson,
+          decimalPlaces: coin.decimals,
+          walletOwns: false,
+        );
+
+        outpoint = OutpointV2.isarCantDoRequiredInDefaultConstructor(
+          txid: txid,
+          vout: vout,
+        );
+        valueStringSats = prevOut.valueStringSats;
+        addresses.addAll(prevOut.addresses);
+      }
+
+      final input = InputV2.isarCantDoRequiredInDefaultConstructor(
+        scriptSigHex: map["scriptSig"]?["hex"] as String?,
+        sequence: map["sequence"] as int?,
+        outpoint: outpoint,
+        valueStringSats: valueStringSats,
+        addresses: addresses,
+        witness: map["witness"] as String?,
+        coinbase: coinbase,
+        innerRedeemScriptAsm: map["innerRedeemscriptAsm"] as String?,
+        walletOwns: false,
+      );
+
+      inputs.add(input);
+    }
+
+    // parse outputs
+    final List<OutputV2> outputs = [];
+    for (final outputJson in jsonTx["vout"] as List) {
+      final output = OutputV2.fromElectrumXJson(
+        Map<String, dynamic>.from(outputJson as Map),
+        decimalPlaces: coin.decimals,
+        walletOwns: false,
+      );
+      outputs.add(output);
+    }
+
+    return TransactionV2(
+      walletId: walletId,
+      blockHash: jsonTx["blockhash"] as String?,
+      hash: jsonTx["hash"] as String,
+      txid: jsonTx["txid"] as String,
+      height: jsonTx["height"] as int?,
+      version: jsonTx["version"] as int,
+      timestamp: jsonTx["blocktime"] as int? ??
+          DateTime.timestamp().millisecondsSinceEpoch ~/ 1000,
+      inputs: List.unmodifiable(inputs),
+      outputs: List.unmodifiable(outputs),
+      subType: TransactionSubType.none,
+      type: TransactionType.unknown,
+    );
+  }
+
   Future<Tuple2<Transaction, Address>> parseTransaction(
     Map<String, dynamic> txData,
     dynamic electrumxClient,
diff --git a/lib/services/mixins/fusion_wallet_interface.dart b/lib/services/mixins/fusion_wallet_interface.dart
new file mode 100644
index 000000000..dc26b4618
--- /dev/null
+++ b/lib/services/mixins/fusion_wallet_interface.dart
@@ -0,0 +1,744 @@
+import 'dart:async';
+import 'dart:convert';
+import 'dart:io';
+
+import 'package:bitbox/bitbox.dart' as bitbox;
+import 'package:bitcoindart/bitcoindart.dart' as btcdart;
+import 'package:flutter/foundation.dart';
+import 'package:fusiondart/fusiondart.dart' as fusion;
+import 'package:isar/isar.dart';
+import 'package:stackwallet/db/isar/main_db.dart';
+import 'package:stackwallet/electrumx_rpc/cached_electrumx.dart';
+import 'package:stackwallet/models/fusion_progress_ui_state.dart';
+import 'package:stackwallet/models/isar/models/isar_models.dart';
+import 'package:stackwallet/pages_desktop_specific/cashfusion/sub_widgets/fusion_dialog.dart';
+import 'package:stackwallet/services/coins/bitcoincash/bitcoincash_wallet.dart';
+import 'package:stackwallet/services/fusion_tor_service.dart';
+import 'package:stackwallet/utilities/bip32_utils.dart';
+import 'package:stackwallet/utilities/enums/coin_enum.dart';
+import 'package:stackwallet/utilities/logger.dart';
+import 'package:stackwallet/utilities/prefs.dart';
+import 'package:stackwallet/utilities/stack_file_system.dart';
+
+const String kReservedFusionAddress = "reserved_fusion_address";
+
+class FusionInfo {
+  final String host;
+  final int port;
+  final bool ssl;
+
+  /// set to 0 for continuous
+  final int rounds;
+
+  const FusionInfo({
+    required this.host,
+    required this.port,
+    required this.ssl,
+    required this.rounds,
+  }) : assert(rounds >= 0);
+
+  static const DEFAULTS = FusionInfo(
+    host: "fusion.servo.cash",
+    port: 8789,
+    ssl: true,
+    // host: "cashfusion.stackwallet.com",
+    // port: 8787,
+    // ssl: false,
+    rounds: 0, // 0 is continuous
+  );
+
+  factory FusionInfo.fromJsonString(String jsonString) {
+    final json = jsonDecode(jsonString);
+    return FusionInfo(
+      host: json['host'] as String,
+      port: json['port'] as int,
+      ssl: json['ssl'] as bool,
+      rounds: json['rounds'] as int,
+    );
+  }
+
+  String toJsonString() {
+    return jsonEncode({
+      'host': host,
+      'port': port,
+      'ssl': ssl,
+      'rounds': rounds,
+    });
+  }
+
+  @override
+  String toString() {
+    return toJsonString();
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (identical(this, other)) {
+      return true;
+    }
+
+    return other is FusionInfo &&
+        other.host == host &&
+        other.port == port &&
+        other.ssl == ssl &&
+        other.rounds == rounds;
+  }
+
+  @override
+  int get hashCode {
+    return Object.hash(
+      host.hashCode,
+      port.hashCode,
+      ssl.hashCode,
+      rounds.hashCode,
+    );
+  }
+}
+
+/// A mixin for the BitcoinCashWallet class that adds CashFusion functionality.
+mixin FusionWalletInterface {
+  // Passed in wallet data.
+  late final String _walletId;
+  late final Coin _coin;
+  late final MainDB _db;
+  late final FusionTorService _torService;
+  late final Future<String?> _mnemonic;
+  late final Future<String?> _mnemonicPassphrase;
+  late final btcdart.NetworkType _network;
+
+  final _prefs = Prefs.instance;
+
+  // setting values on this should notify any listeners (the GUI)
+  FusionProgressUIState? _uiState;
+  FusionProgressUIState get uiState {
+    if (_uiState == null) {
+      throw Exception("FusionProgressUIState has not been set for $_walletId");
+    }
+    return _uiState!;
+  }
+
+  set uiState(FusionProgressUIState state) {
+    if (_uiState != null) {
+      throw Exception("FusionProgressUIState was already set for $_walletId");
+    }
+    _uiState = state;
+  }
+
+  // Passed in wallet functions.
+  late final Future<List<Address>> Function({int numberOfAddresses})
+      _getNextUnusedChangeAddresses;
+  late final CachedElectrumX Function() _getWalletCachedElectrumX;
+  late final Future<int> Function() _getChainHeight;
+  late final Future<void> Function() _updateWalletUTXOS;
+  late final String Function(String bchAddress, btcdart.NetworkType network)
+      _convertToScriptHash;
+
+  // Fusion object.
+  fusion.Fusion? _mainFusionObject;
+  bool _stopRequested = false;
+
+  /// An int storing the number of successfully completed fusion rounds.
+  int _completedFuseCount = 0;
+
+  /// An int storing the number of failed fusion rounds.
+  int _failedFuseCount = 0;
+
+  /// The maximum number of consecutive failed fusion rounds before stopping.
+  int get maxFailedFuseCount => 5;
+
+  /// Initializes the FusionWalletInterface mixin.
+  ///
+  /// This function must be called before any other functions in this mixin.
+  Future<void> initFusionInterface({
+    required String walletId,
+    required Coin coin,
+    required MainDB db,
+    required Future<List<Address>> Function({int numberOfAddresses})
+        getNextUnusedChangeAddress,
+    required CachedElectrumX Function() getWalletCachedElectrumX,
+    required Future<int> Function() getChainHeight,
+    required Future<void> Function() updateWalletUTXOS,
+    required Future<String?> mnemonic,
+    required Future<String?> mnemonicPassphrase,
+    required btcdart.NetworkType network,
+    required final String Function(
+            String bchAddress, btcdart.NetworkType network)
+        convertToScriptHash,
+  }) async {
+    // Set passed in wallet data.
+    _walletId = walletId;
+    _coin = coin;
+    _db = db;
+    _getNextUnusedChangeAddresses = getNextUnusedChangeAddress;
+    _torService = FusionTorService.sharedInstance;
+    _getWalletCachedElectrumX = getWalletCachedElectrumX;
+    _getChainHeight = getChainHeight;
+    _updateWalletUTXOS = updateWalletUTXOS;
+    _mnemonic = mnemonic;
+    _mnemonicPassphrase = mnemonicPassphrase;
+    _network = network;
+    _convertToScriptHash = convertToScriptHash;
+  }
+
+  // callback to update the ui state object
+  void _updateStatus({required fusion.FusionStatus status, String? info}) {
+    switch (status) {
+      case fusion.FusionStatus.connecting:
+        _uiState?.setConnecting(
+            CashFusionState(status: CashFusionStatus.running, info: null),
+            shouldNotify: false);
+        _uiState?.setOutputs(
+            CashFusionState(status: CashFusionStatus.waiting, info: null),
+            shouldNotify: false);
+        _uiState?.setPeers(
+            CashFusionState(status: CashFusionStatus.waiting, info: null),
+            shouldNotify: false);
+        _uiState?.setFusing(
+            CashFusionState(status: CashFusionStatus.waiting, info: null),
+            shouldNotify: false);
+        _uiState?.setComplete(
+            CashFusionState(status: CashFusionStatus.waiting, info: null),
+            shouldNotify: true);
+        break;
+      case fusion.FusionStatus.setup:
+        _uiState?.setConnecting(
+            CashFusionState(status: CashFusionStatus.success, info: null),
+            shouldNotify: false);
+        _uiState?.setOutputs(
+            CashFusionState(status: CashFusionStatus.running, info: null),
+            shouldNotify: false);
+        _uiState?.setPeers(
+            CashFusionState(status: CashFusionStatus.waiting, info: null),
+            shouldNotify: false);
+        _uiState?.setFusing(
+            CashFusionState(status: CashFusionStatus.waiting, info: null),
+            shouldNotify: false);
+        _uiState?.setComplete(
+            CashFusionState(status: CashFusionStatus.waiting, info: null),
+            shouldNotify: true);
+        break;
+      case fusion.FusionStatus.waiting:
+        _uiState?.setConnecting(
+            CashFusionState(status: CashFusionStatus.success, info: null),
+            shouldNotify: false);
+        _uiState?.setOutputs(
+            CashFusionState(status: CashFusionStatus.success, info: null),
+            shouldNotify: false);
+        _uiState?.setPeers(
+            CashFusionState(status: CashFusionStatus.running, info: null),
+            shouldNotify: false);
+        _uiState?.setFusing(
+            CashFusionState(status: CashFusionStatus.waiting, info: null),
+            shouldNotify: false);
+        _uiState?.setComplete(
+            CashFusionState(status: CashFusionStatus.waiting, info: null),
+            shouldNotify: true);
+        break;
+      case fusion.FusionStatus.running:
+        _uiState?.setConnecting(
+            CashFusionState(status: CashFusionStatus.success, info: null),
+            shouldNotify: false);
+        _uiState?.setOutputs(
+            CashFusionState(status: CashFusionStatus.success, info: null),
+            shouldNotify: false);
+        _uiState?.setPeers(
+            CashFusionState(status: CashFusionStatus.success, info: null),
+            shouldNotify: false);
+        _uiState?.setFusing(
+            CashFusionState(status: CashFusionStatus.running, info: null),
+            shouldNotify: false);
+        _uiState?.setComplete(
+            CashFusionState(status: CashFusionStatus.waiting, info: null),
+            shouldNotify: true);
+        break;
+      case fusion.FusionStatus.complete:
+        _uiState?.setConnecting(
+            CashFusionState(status: CashFusionStatus.success, info: null),
+            shouldNotify: false);
+        _uiState?.setOutputs(
+            CashFusionState(status: CashFusionStatus.success, info: null),
+            shouldNotify: false);
+        _uiState?.setPeers(
+            CashFusionState(status: CashFusionStatus.success, info: null),
+            shouldNotify: false);
+        _uiState?.setFusing(
+            CashFusionState(status: CashFusionStatus.success, info: null),
+            shouldNotify: false);
+        _uiState?.setComplete(
+            CashFusionState(status: CashFusionStatus.success, info: null),
+            shouldNotify: true);
+        break;
+      case fusion.FusionStatus.failed:
+        failCurrentUiState(info);
+        break;
+      case fusion.FusionStatus.exception:
+        failCurrentUiState(info);
+        break;
+      case fusion.FusionStatus.reset:
+        _uiState?.setConnecting(
+            CashFusionState(status: CashFusionStatus.waiting, info: info),
+            shouldNotify: false);
+        _uiState?.setOutputs(
+            CashFusionState(status: CashFusionStatus.waiting, info: info),
+            shouldNotify: false);
+        _uiState?.setPeers(
+            CashFusionState(status: CashFusionStatus.waiting, info: info),
+            shouldNotify: false);
+        _uiState?.setFusing(
+            CashFusionState(status: CashFusionStatus.waiting, info: info),
+            shouldNotify: false);
+        _uiState?.setComplete(
+            CashFusionState(status: CashFusionStatus.waiting, info: info),
+            shouldNotify: false);
+
+        _uiState?.setFusionState(
+            CashFusionState(status: CashFusionStatus.waiting, info: info),
+            shouldNotify: false);
+
+        _uiState?.setFailed(false, shouldNotify: true);
+        break;
+    }
+  }
+
+  void failCurrentUiState(String? info) {
+    // Check each _uiState value to see if it is running.  If so, set it to failed.
+    if (_uiState?.connecting.status == CashFusionStatus.running) {
+      _uiState?.setConnecting(
+          CashFusionState(status: CashFusionStatus.failed, info: info),
+          shouldNotify: true);
+      return;
+    }
+    if (_uiState?.outputs.status == CashFusionStatus.running) {
+      _uiState?.setOutputs(
+          CashFusionState(status: CashFusionStatus.failed, info: info),
+          shouldNotify: true);
+      return;
+    }
+    if (_uiState?.peers.status == CashFusionStatus.running) {
+      _uiState?.setPeers(
+          CashFusionState(status: CashFusionStatus.failed, info: info),
+          shouldNotify: true);
+      return;
+    }
+    if (_uiState?.fusing.status == CashFusionStatus.running) {
+      _uiState?.setFusing(
+          CashFusionState(status: CashFusionStatus.failed, info: info),
+          shouldNotify: true);
+      return;
+    }
+    if (_uiState?.complete.status == CashFusionStatus.running) {
+      _uiState?.setComplete(
+          CashFusionState(status: CashFusionStatus.failed, info: info),
+          shouldNotify: true);
+      return;
+    }
+  }
+
+  /// Returns a list of all transactions in the wallet for the given address.
+  Future<List<Map<String, dynamic>>> _getTransactionsByAddress(
+    String address,
+  ) async {
+    final txidList =
+        await _db.getTransactions(_walletId).txidProperty().findAll();
+
+    final futures = txidList.map(
+      (e) => _getWalletCachedElectrumX().getTransaction(
+        txHash: e,
+        coin: _coin,
+      ),
+    );
+
+    return await Future.wait(futures);
+  }
+
+  Future<Uint8List> _getPrivateKeyForPubKey(List<int> pubKey) async {
+    // can't directly query for equal lists in isar so we need to fetch
+    // all addresses then search in dart
+    try {
+      final derivationPath = (await _db
+              .getAddresses(_walletId)
+              .filter()
+              .typeEqualTo(AddressType.p2pkh)
+              .and()
+              .derivationPathIsNotNull()
+              .and()
+              .group((q) => q
+                  .subTypeEqualTo(AddressSubType.receiving)
+                  .or()
+                  .subTypeEqualTo(AddressSubType.change))
+              .findAll())
+          .firstWhere((e) => e.publicKey.toString() == pubKey.toString())
+          .derivationPath!
+          .value;
+
+      final node = await Bip32Utils.getBip32Node(
+        (await _mnemonic)!,
+        (await _mnemonicPassphrase)!,
+        _network,
+        derivationPath,
+      );
+
+      return node.privateKey!;
+    } catch (e, s) {
+      Logging.instance.log("$e\n$s", level: LogLevel.Fatal);
+      throw Exception("Derivation path for pubkey=$pubKey could not be found");
+    }
+  }
+
+  /// Reserve an address for fusion.
+  Future<List<Address>> _reserveAddresses(Iterable<Address> addresses) async {
+    if (addresses.isEmpty) {
+      return [];
+    }
+
+    final updatedAddresses = addresses
+        .map((e) => e.copyWith(otherData: kReservedFusionAddress))
+        .toList();
+
+    await _db.isar.writeTxn(() async {
+      for (final newAddress in updatedAddresses) {
+        final oldAddress = await _db.getAddress(
+          newAddress.walletId,
+          newAddress.value,
+        );
+
+        if (oldAddress != null) {
+          newAddress.id = oldAddress.id;
+          await _db.isar.addresses.delete(oldAddress.id);
+        }
+
+        await _db.isar.addresses.put(newAddress);
+      }
+    });
+
+    return updatedAddresses;
+  }
+
+  /// un reserve a fusion reserved address.
+  /// If [address] is not reserved nothing happens
+  Future<Address> _unReserveAddress(Address address) async {
+    if (address.otherData != kReservedFusionAddress) {
+      return address;
+    }
+
+    final updated = address.copyWith(otherData: null);
+
+    // Make sure the address is updated in the database.
+    await _db.updateAddress(address, updated);
+
+    return updated;
+  }
+
+  /// Returns a list of unused reserved change addresses.
+  ///
+  /// If there are not enough unused reserved change addresses, new ones are created.
+  Future<List<fusion.Address>> _getUnusedReservedChangeAddresses(
+    int numberOfAddresses,
+  ) async {
+    final unusedChangeAddresses = await _getNextUnusedChangeAddresses(
+      numberOfAddresses: numberOfAddresses,
+    );
+
+    // Initialize a list of unused reserved change addresses.
+    final List<Address> unusedReservedAddresses = unusedChangeAddresses
+        .where((e) => e.otherData == kReservedFusionAddress)
+        .toList();
+
+    unusedReservedAddresses.addAll(await _reserveAddresses(
+        unusedChangeAddresses.where((e) => e.otherData == null)));
+
+    // Return the list of unused reserved change addresses.
+    return unusedReservedAddresses
+        .map(
+          (e) => fusion.Address(
+            address: e.value,
+            publicKey: e.publicKey,
+            fusionReserved: true,
+            derivationPath: fusion.DerivationPath(
+              e.derivationPath!.value,
+            ),
+          ),
+        )
+        .toList();
+  }
+
+  int _torStartCount = 0;
+
+  /// Returns the current Tor proxy address.
+  Future<({InternetAddress host, int port})> _getSocksProxyAddress() async {
+    if (_torStartCount > 5) {
+      // something is quite broken so stop trying to recursively fetch
+      // start up tor and fetch proxy info
+      throw Exception(
+        "Fusion interface attempted to start tor $_torStartCount times and failed!",
+      );
+    }
+
+    try {
+      final info = _torService.getProxyInfo();
+
+      // reset counter before return info;
+      _torStartCount = 0;
+
+      return info;
+    } catch (_) {
+      // tor is probably not running so lets fix that
+      final torDir = await StackFileSystem.applicationTorDirectory();
+      _torService.init(torDataDirPath: torDir.path);
+
+      // increment start attempt count
+      _torStartCount++;
+
+      await _torService.start();
+
+      // try again to fetch proxy info
+      return await _getSocksProxyAddress();
+    }
+  }
+
+  Future<bool> _checkUtxoExists(
+    String address,
+    String prevTxid,
+    int prevIndex,
+  ) async {
+    final scriptHash = _convertToScriptHash(address, _network);
+
+    final utxos = await _getWalletCachedElectrumX()
+        .electrumXClient
+        .getUTXOs(scripthash: scriptHash);
+
+    for (final utxo in utxos) {
+      if (utxo["tx_hash"] == prevTxid && utxo["tx_pos"] == prevIndex) {
+        return true;
+      }
+    }
+
+    return false;
+  }
+
+  // Initial attempt for CashFusion integration goes here.
+
+  /// Fuse the wallet's UTXOs.
+  ///
+  /// This function is called when the user taps the "Fuse" button in the UI.
+  Future<void> fuse({
+    required FusionInfo fusionInfo,
+  }) async {
+    // Initial attempt for CashFusion integration goes here.
+
+    try {
+      _updateStatus(status: fusion.FusionStatus.reset);
+      _updateStatus(
+        status: fusion.FusionStatus.connecting,
+        info: "Connecting to the CashFusion server.",
+      );
+
+      // Use server host and port which ultimately come from text fields.
+      fusion.FusionParams serverParams = fusion.FusionParams(
+        serverHost: fusionInfo.host,
+        serverPort: fusionInfo.port,
+        serverSsl: fusionInfo.ssl,
+        genesisHashHex:
+            _coin.isTestNet ? GENESIS_HASH_TESTNET : GENESIS_HASH_MAINNET,
+        enableDebugPrint: kDebugMode,
+        torForOvert: _prefs.useTor,
+        mode: fusion.FusionMode.normal,
+      );
+
+      // Instantiate a Fusion object with custom parameters.
+      _mainFusionObject = fusion.Fusion(serverParams);
+
+      // Pass wallet functions to the Fusion object
+      await _mainFusionObject!.initFusion(
+        getTransactionsByAddress: _getTransactionsByAddress,
+        getUnusedReservedChangeAddresses: _getUnusedReservedChangeAddresses,
+        getSocksProxyAddress: _getSocksProxyAddress,
+        getChainHeight: _getChainHeight,
+        updateStatusCallback: _updateStatus,
+        checkUtxoExists: _checkUtxoExists,
+        getTransactionJson: (String txid) async =>
+            await _getWalletCachedElectrumX().getTransaction(
+          coin: _coin,
+          txHash: txid,
+        ),
+        getPrivateKeyForPubKey: _getPrivateKeyForPubKey,
+        broadcastTransaction: (String txHex) => _getWalletCachedElectrumX()
+            .electrumXClient
+            .broadcastTransaction(rawTx: txHex),
+        unReserveAddresses: (List<fusion.Address> addresses) async {
+          final List<Future<void>> futures = [];
+          for (final addr in addresses) {
+            futures.add(
+              _db.getAddress(_walletId, addr.address).then(
+                (address) async {
+                  if (address == null) {
+                    // matching address not found in db so cannot mark as unreserved
+                    // just ignore I guess. Should never actually happen in practice.
+                    // Might be useful check in debugging cases?
+                    return;
+                  } else {
+                    await _unReserveAddress(address);
+                  }
+                },
+              ),
+            );
+          }
+          await Future.wait(futures);
+        },
+      );
+
+      // Reset internal and UI counts and flag.
+      _completedFuseCount = 0;
+      _uiState?.fusionRoundsCompleted = 0;
+      _failedFuseCount = 0;
+      _uiState?.fusionRoundsFailed = 0;
+      _stopRequested = false;
+
+      bool shouldFuzeAgain() {
+        if (fusionInfo.rounds <= 0) {
+          // ignore count if continuous
+          return !_stopRequested;
+        } else {
+          // not continuous
+          // check to make sure we aren't doing more fusions than requested
+          return !_stopRequested && _completedFuseCount < fusionInfo.rounds;
+        }
+      }
+
+      while (shouldFuzeAgain()) {
+        if (_completedFuseCount > 0 || _failedFuseCount > 0) {
+          _updateStatus(status: fusion.FusionStatus.reset);
+          _updateStatus(
+            status: fusion.FusionStatus.connecting,
+            info: "Connecting to the CashFusion server.",
+          );
+        }
+
+        //   refresh wallet utxos
+        await _updateWalletUTXOS();
+
+        // Add unfrozen stack UTXOs.
+        final List<UTXO> walletUtxos = await _db
+            .getUTXOs(_walletId)
+            .filter()
+            .isBlockedEqualTo(false)
+            .and()
+            .addressIsNotNull()
+            .findAll();
+
+        final List<fusion.UtxoDTO> coinList = [];
+        // Loop through UTXOs, checking and adding valid ones.
+        for (final utxo in walletUtxos) {
+          final String addressString = utxo.address!;
+          final List<String> possibleAddresses = [addressString];
+
+          if (bitbox.Address.detectFormat(addressString) ==
+              bitbox.Address.formatCashAddr) {
+            possibleAddresses
+                .add(bitbox.Address.toLegacyAddress(addressString));
+          } else {
+            possibleAddresses.add(bitbox.Address.toCashAddress(addressString));
+          }
+
+          // Fetch address to get pubkey
+          final addr = await _db
+              .getAddresses(_walletId)
+              .filter()
+              .anyOf<String,
+                      QueryBuilder<Address, Address, QAfterFilterCondition>>(
+                  possibleAddresses, (q, e) => q.valueEqualTo(e))
+              .and()
+              .group((q) => q
+                  .subTypeEqualTo(AddressSubType.change)
+                  .or()
+                  .subTypeEqualTo(AddressSubType.receiving))
+              .and()
+              .typeEqualTo(AddressType.p2pkh)
+              .findFirst();
+
+          // depending on the address type in the query above this can be null
+          if (addr == null) {
+            // A utxo object should always have a non null address.
+            // If non found then just ignore the UTXO (aka don't fuse it)
+            Logging.instance.log(
+              "Ignoring utxo=$utxo for address=\"$addressString\" while selecting UTXOs for Fusion",
+              level: LogLevel.Info,
+            );
+            continue;
+          }
+
+          final dto = fusion.UtxoDTO(
+            txid: utxo.txid,
+            vout: utxo.vout,
+            value: utxo.value,
+            address: utxo.address!,
+            pubKey: addr.publicKey,
+          );
+
+          // Add UTXO to coinList.
+          coinList.add(dto);
+        }
+
+        // Fuse UTXOs.
+        try {
+          await _mainFusionObject!.fuse(
+            inputsFromWallet: coinList,
+            network: _coin.isTestNet
+                ? fusion.Utilities.testNet
+                : fusion.Utilities.mainNet,
+          );
+
+          // Increment the number of successfully completed fusion rounds.
+          _completedFuseCount++;
+
+          // Do the same for the UI state.  This also resets the failed count (for
+          // the UI state only).
+          _uiState?.incrementFusionRoundsCompleted();
+
+          // Also reset the failed count here.
+          _failedFuseCount = 0;
+        } catch (e, s) {
+          Logging.instance.log(
+            "$e\n$s",
+            level: LogLevel.Error,
+          );
+          // just continue on attempt failure
+
+          // Increment the number of failed fusion rounds.
+          _failedFuseCount++;
+
+          // Do the same for the UI state.
+          _uiState?.incrementFusionRoundsFailed();
+
+          // If we fail too many times in a row, stop trying.
+          if (_failedFuseCount >= maxFailedFuseCount) {
+            _updateStatus(
+                status: fusion.FusionStatus.failed,
+                info: "Failed $maxFailedFuseCount times in a row, stopping.");
+            _stopRequested = true;
+            _uiState?.setFailed(true, shouldNotify: true);
+          }
+        }
+      }
+    } catch (e, s) {
+      Logging.instance.log(
+        "$e\n$s",
+        level: LogLevel.Error,
+      );
+
+      // Stop the fusion process and update the UI state.
+      await _mainFusionObject?.stop();
+      _mainFusionObject = null;
+      _uiState?.setRunning(false, shouldNotify: true);
+    }
+  }
+
+  /// Stop the fusion process.
+  ///
+  /// This function is called when the user taps the "Cancel" button in the UI
+  /// or closes the fusion progress dialog.
+  Future<void> stop() async {
+    _stopRequested = true;
+    await _mainFusionObject?.stop();
+  }
+}
diff --git a/lib/services/tor_service.dart b/lib/services/tor_service.dart
index c4e7a0117..3458f1612 100644
--- a/lib/services/tor_service.dart
+++ b/lib/services/tor_service.dart
@@ -12,7 +12,7 @@ class TorService {
   Tor? _tor;
   String? _torDataDirPath;
 
-  /// Current status. Same as that fired on the event bus
+  /// Current status. Same as that fired on the event bus.
   TorConnectionStatus get status => _status;
   TorConnectionStatus _status = TorConnectionStatus.disconnected;
 
@@ -26,7 +26,7 @@ class TorService {
 
   /// Getter for the proxyInfo.
   ///
-  /// Returns null if disabled on the stack wallet level.
+  /// Throws if Tor is not connected.
   ({
     InternetAddress host,
     int port,
@@ -55,7 +55,8 @@ class TorService {
   ///
   /// This will start the Tor service and establish a Tor circuit.
   ///
-  /// Throws an exception if the Tor service fails to start.
+  /// Throws an exception if the Tor library was not inited or if the Tor
+  /// service fails to start.
   ///
   /// Returns a Future that completes when the Tor service has started.
   Future<void> start() async {
@@ -79,6 +80,9 @@ class TorService {
         status: TorConnectionStatus.connected,
         message: "TorService.start call success",
       );
+
+      // Complete the future.
+      return;
     } catch (e, s) {
       Logging.instance.log(
         "TorService.start failed: $e\n$s",
@@ -110,6 +114,8 @@ class TorService {
       status: TorConnectionStatus.disconnected,
       message: "TorService.disable call success",
     );
+
+    return;
   }
 
   void _updateStatusAndFireEvent({
diff --git a/lib/utilities/assets.dart b/lib/utilities/assets.dart
index c664849b3..9bb22c805 100644
--- a/lib/utilities/assets.dart
+++ b/lib/utilities/assets.dart
@@ -93,6 +93,9 @@ class _SVG {
 
   final coinControl = const _COIN_CONTROL();
 
+  String get peers => "assets/svg/peers.svg";
+  String get fusing => "assets/svg/fusing.svg";
+  String get upFromLine => "assets/svg/up-from-line.svg";
   String get connectedButton => "assets/svg/connected-button.svg";
   String get connectingButton => "assets/svg/connecting-button.svg";
   String get disconnectedButton => "assets/svg/disconnected-button.svg";
@@ -195,6 +198,7 @@ class _SVG {
   String get arrowDown => "assets/svg/arrow-down.svg";
   String get robotHead => "assets/svg/robot-head.svg";
   String get whirlPool => "assets/svg/whirlpool.svg";
+  String get cashFusion => "assets/svg/cashfusion-icon.svg";
   String get fingerprint => "assets/svg/fingerprint.svg";
   String get faceId => "assets/svg/faceid.svg";
   String get tokens => "assets/svg/tokens.svg";
@@ -202,6 +206,7 @@ class _SVG {
   String get creditCard => "assets/svg/cc.svg";
   String get file => "assets/svg/file.svg";
   String get fileUpload => "assets/svg/file-upload.svg";
+  String get txCashFusion => "assets/svg/tx-cashfusion.svg";
 
   String get ellipse1 => "assets/svg/Ellipse-43.svg";
   String get ellipse2 => "assets/svg/Ellipse-42.svg";
diff --git a/lib/utilities/format.dart b/lib/utilities/format.dart
index 2139a750e..216be7099 100644
--- a/lib/utilities/format.dart
+++ b/lib/utilities/format.dart
@@ -50,16 +50,27 @@ abstract class Format {
   // }
 
   // format date string from unix timestamp
-  static String extractDateFrom(int timestamp, {bool localized = true}) {
+  static String extractDateFrom(
+    int timestamp, {
+    bool localized = true,
+    bool noTime = false,
+  }) {
     var date = DateTime.fromMillisecondsSinceEpoch(timestamp * 1000);
 
     if (!localized) {
       date = date.toUtc();
     }
 
+    final dayAndYear =
+        "${date.day} ${Constants.monthMapShort[date.month]} ${date.year}";
+
+    if (noTime) {
+      return dayAndYear;
+    }
+
     final minutes =
         date.minute < 10 ? "0${date.minute}" : date.minute.toString();
-    return "${date.day} ${Constants.monthMapShort[date.month]} ${date.year}, ${date.hour}:$minutes";
+    return "$dayAndYear, ${date.hour}:$minutes";
   }
 
   // static String localizedStringAsFixed({
diff --git a/lib/utilities/prefs.dart b/lib/utilities/prefs.dart
index 583d9804b..6fe9689ab 100644
--- a/lib/utilities/prefs.dart
+++ b/lib/utilities/prefs.dart
@@ -12,6 +12,7 @@ import 'package:flutter/cupertino.dart';
 import 'package:stackwallet/db/hive/db.dart';
 import 'package:stackwallet/services/event_bus/events/global/tor_status_changed_event.dart';
 import 'package:stackwallet/services/event_bus/global_event_bus.dart';
+import 'package:stackwallet/services/mixins/fusion_wallet_interface.dart';
 import 'package:stackwallet/utilities/amount/amount_unit.dart';
 import 'package:stackwallet/utilities/constants.dart';
 import 'package:stackwallet/utilities/enums/backup_frequency_type.dart';
@@ -64,6 +65,7 @@ class Prefs extends ChangeNotifier {
       await _setAmountUnits();
       await _setMaxDecimals();
       _useTor = await _getUseTor();
+      _fusionServerInfo = await _getFusionServerInfo();
 
       _initialized = true;
     }
@@ -931,4 +933,35 @@ class Prefs extends ChangeNotifier {
         ) as bool? ??
         false;
   }
+
+  // fusion server info
+
+  FusionInfo _fusionServerInfo = FusionInfo.DEFAULTS;
+
+  FusionInfo get fusionServerInfo => _fusionServerInfo;
+
+  set fusionServerInfo(FusionInfo fusionServerInfo) {
+    if (this.fusionServerInfo != fusionServerInfo) {
+      DB.instance.put<dynamic>(
+        boxName: DB.boxNamePrefs,
+        key: "fusionServerInfo",
+        value: fusionServerInfo.toJsonString(),
+      );
+      _fusionServerInfo = fusionServerInfo;
+      notifyListeners();
+    }
+  }
+
+  Future<FusionInfo> _getFusionServerInfo() async {
+    final saved = await DB.instance.get<dynamic>(
+      boxName: DB.boxNamePrefs,
+      key: "fusionServerInfo",
+    ) as String?;
+
+    try {
+      return FusionInfo.fromJsonString(saved!);
+    } catch (_) {
+      return FusionInfo.DEFAULTS;
+    }
+  }
 }
diff --git a/lib/utilities/util.dart b/lib/utilities/util.dart
index c73f697cc..cdfc1bfb7 100644
--- a/lib/utilities/util.dart
+++ b/lib/utilities/util.dart
@@ -73,14 +73,21 @@ abstract class Util {
     return MaterialColor(color.value, swatch);
   }
 
-  static void printJson(dynamic json) {
+  static void printJson(dynamic json, [String? debugTitle]) {
+    final String result;
     if (json is Map || json is List) {
       final spaces = ' ' * 4;
       final encoder = JsonEncoder.withIndent(spaces);
       final pretty = encoder.convert(json);
-      log(pretty);
+      result = pretty;
     } else {
-      log(dynamic.toString());
+      result = dynamic.toString();
+    }
+
+    if (debugTitle != null) {
+      log("$debugTitle\n$result");
+    } else {
+      log(result);
     }
   }
 }
diff --git a/lib/widgets/master_wallet_card.dart b/lib/widgets/master_wallet_card.dart
index a3fc626a7..5b9890d3f 100644
--- a/lib/widgets/master_wallet_card.dart
+++ b/lib/widgets/master_wallet_card.dart
@@ -16,6 +16,7 @@ import 'package:stackwallet/services/coins/ethereum/ethereum_wallet.dart';
 import 'package:stackwallet/themes/stack_colors.dart';
 import 'package:stackwallet/utilities/assets.dart';
 import 'package:stackwallet/utilities/constants.dart';
+import 'package:stackwallet/utilities/util.dart';
 import 'package:stackwallet/widgets/animated_widgets/rotate_icon.dart';
 import 'package:stackwallet/widgets/expandable.dart';
 import 'package:stackwallet/widgets/rounded_white_container.dart';
@@ -141,7 +142,7 @@ class _MasterWalletCardState extends ConsumerState<MasterWalletCard> {
                 child: SimpleWalletCard(
                   walletId: widget.walletId,
                   contractAddress: e,
-                  popPrevious: true,
+                  popPrevious: Util.isDesktop,
                 ),
               ),
             ),
diff --git a/lib/widgets/wallet_card.dart b/lib/widgets/wallet_card.dart
index 09dcb0e2e..ce7a351e2 100644
--- a/lib/widgets/wallet_card.dart
+++ b/lib/widgets/wallet_card.dart
@@ -157,7 +157,7 @@ class SimpleWalletCard extends ConsumerWidget {
         } else {
           await nav.pushNamed(
             TokenView.routeName,
-            arguments: walletId,
+            arguments: (walletId: walletId, popPrevious: !Util.isDesktop),
           );
         }
       }
diff --git a/lib/widgets/wallet_navigation_bar/components/icons/fusion_nav_icon.dart b/lib/widgets/wallet_navigation_bar/components/icons/fusion_nav_icon.dart
new file mode 100644
index 000000000..ce1d4bef0
--- /dev/null
+++ b/lib/widgets/wallet_navigation_bar/components/icons/fusion_nav_icon.dart
@@ -0,0 +1,28 @@
+/* 
+ * This file is part of Stack Wallet.
+ * 
+ * Copyright (c) 2023 Cypher Stack
+ * All Rights Reserved.
+ * The code is distributed under GPLv3 license, see LICENSE file for details.
+ * Generated by Cypher Stack on 2023-05-26
+ *
+ */
+
+import 'package:flutter/material.dart';
+import 'package:flutter_svg/flutter_svg.dart';
+import 'package:stackwallet/themes/stack_colors.dart';
+import 'package:stackwallet/utilities/assets.dart';
+
+class FusionNavIcon extends StatelessWidget {
+  const FusionNavIcon({Key? key}) : super(key: key);
+
+  @override
+  Widget build(BuildContext context) {
+    return SvgPicture.asset(
+      Assets.svg.cashFusion,
+      height: 20,
+      width: 20,
+      color: Theme.of(context).extension<StackColors>()!.bottomNavIconIcon,
+    );
+  }
+}
diff --git a/linux/flutter/generated_plugins.cmake b/linux/flutter/generated_plugins.cmake
index f48fdcd94..3a02b87cf 100644
--- a/linux/flutter/generated_plugins.cmake
+++ b/linux/flutter/generated_plugins.cmake
@@ -15,6 +15,7 @@ list(APPEND FLUTTER_PLUGIN_LIST
 )
 
 list(APPEND FLUTTER_FFI_PLUGIN_LIST
+  coinlib_flutter
   tor_ffi_plugin
 )
 
diff --git a/pubspec.lock b/pubspec.lock
index f81c999e9..d7d431c54 100644
--- a/pubspec.lock
+++ b/pubspec.lock
@@ -98,6 +98,14 @@ packages:
       url: "https://pub.dev"
     source: hosted
     version: "2.0.0"
+  bip340:
+    dependency: "direct main"
+    description:
+      name: bip340
+      sha256: "2a92f6ed68959f75d67c9a304c17928b9c9449587d4f75ee68f34152f7f69e87"
+      url: "https://pub.dev"
+    source: hosted
+    version: "0.2.0"
   bip39:
     dependency: "direct main"
     description:
@@ -254,6 +262,22 @@ packages:
       url: "https://pub.dev"
     source: hosted
     version: "4.6.0"
+  coinlib:
+    dependency: transitive
+    description:
+      name: coinlib
+      sha256: "410993f49aef30e48b76bbad8a33fef33f6b90e103b15b6be0277683ffe15399"
+      url: "https://pub.dev"
+    source: hosted
+    version: "1.0.0"
+  coinlib_flutter:
+    dependency: "direct main"
+    description:
+      name: coinlib_flutter
+      sha256: d0a6a3694fc8c851f6b912bb1c552e33998e3f453efab3d62f75c0b1773d1ab9
+      url: "https://pub.dev"
+    source: hosted
+    version: "1.0.0"
   collection:
     dependency: transitive
     description:
@@ -279,7 +303,7 @@ packages:
     source: hosted
     version: "1.2.4"
   convert:
-    dependency: transitive
+    dependency: "direct main"
     description:
       name: convert
       sha256: "0f08b14755d163f6e2134cb58222dd25ea2a2ee8a195e53983d57c075324d592"
@@ -597,6 +621,14 @@ packages:
       url: "https://pub.dev"
     source: hosted
     version: "2.0.0+1"
+  flutter_hooks:
+    dependency: "direct main"
+    description:
+      name: flutter_hooks
+      sha256: "7c8db779c2d1010aa7f9ea3fbefe8f86524fcb87b69e8b0af31e1a4b55422dec"
+      url: "https://pub.dev"
+    source: hosted
+    version: "0.20.3"
   flutter_launcher_icons:
     dependency: "direct dev"
     description:
@@ -770,6 +802,15 @@ packages:
     description: flutter
     source: sdk
     version: "0.0.0"
+  fusiondart:
+    dependency: "direct main"
+    description:
+      path: "."
+      ref: df8f7c627cfc77eaa3e364c0d166f3d04169ae05
+      resolved-ref: df8f7c627cfc77eaa3e364c0d166f3d04169ae05
+      url: "https://github.com/cypherstack/fusiondart.git"
+    source: git
+    version: "1.0.0"
   glob:
     dependency: transitive
     description:
@@ -1451,6 +1492,15 @@ packages:
       url: "https://pub.dev"
     source: hosted
     version: "1.0.3+dev.3"
+  socks_socket:
+    dependency: "direct main"
+    description:
+      path: "."
+      ref: master
+      resolved-ref: ac6d721fe655208a6d488a088a35bab0ddc25702
+      url: "https://github.com/cypherstack/socks_socket.git"
+    source: git
+    version: "0.1.0"
   source_gen:
     dependency: transitive
     description:
@@ -1648,8 +1698,8 @@ packages:
     dependency: "direct main"
     description:
       path: "."
-      ref: c8b97bc118c7bbfe1027d0442cfadea44dc285aa
-      resolved-ref: c8b97bc118c7bbfe1027d0442cfadea44dc285aa
+      ref: "0a6888282f4e98401051a396e9d2293bd55ac2c2"
+      resolved-ref: "0a6888282f4e98401051a396e9d2293bd55ac2c2"
       url: "https://github.com/cypherstack/tor.git"
     source: git
     version: "0.0.1"
@@ -1846,6 +1896,14 @@ packages:
       url: "https://pub.dev"
     source: hosted
     version: "0.0.12+1"
+  wasm_interop:
+    dependency: transitive
+    description:
+      name: wasm_interop
+      sha256: b1b378f07a4cf0103c25faf34d9a64d2c3312135b9efb47e0ec116ec3b14e48f
+      url: "https://pub.dev"
+    source: hosted
+    version: "2.0.1"
   watcher:
     dependency: transitive
     description:
@@ -1960,5 +2018,5 @@ packages:
     source: hosted
     version: "1.0.0"
 sdks:
-  dart: ">=3.0.2 <4.0.0"
+  dart: ">=3.0.6 <4.0.0"
   flutter: ">=3.10.3"
diff --git a/pubspec.yaml b/pubspec.yaml
index 978ba8b8d..561d4ce5e 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -62,6 +62,11 @@ dependencies:
       url: https://github.com/cypherstack/tor.git
       ref: 0a6888282f4e98401051a396e9d2293bd55ac2c2
 
+  fusiondart:
+    git:
+      url: https://github.com/cypherstack/fusiondart.git
+      ref: df8f7c627cfc77eaa3e364c0d166f3d04169ae05
+
   # Utility plugins
   http: ^0.13.0
   local_auth: ^1.1.10
@@ -144,8 +149,16 @@ dependencies:
   nanodart: ^2.0.0
   basic_utils: ^5.5.4
   stellar_flutter_sdk: ^1.5.3
+  socks_socket:
+    git:
+      url: https://github.com/cypherstack/socks_socket.git
+      ref: master
+  bip340: ^0.2.0
   tezart: ^2.0.5
   socks5_proxy: ^1.0.3+dev.3
+  coinlib_flutter: ^1.0.0
+  convert: ^3.1.1
+  flutter_hooks: ^0.20.3
 
 dev_dependencies:
   flutter_test:
@@ -233,132 +246,7 @@ flutter:
     - assets/images/splash.png
     - assets/icon/icon.png
     - google_fonts/
-    - assets/svg/circle-check.svg
-    - assets/svg/clipboard.svg
-    - assets/images/glasses.png
-    - assets/images/glasses-hidden.png
-    - assets/svg/unclaimed.svg
-    - assets/svg/plus.svg
-    - assets/svg/gear.svg
-    - assets/svg/bell.svg
-    - assets/svg/arrow-left-fa.svg
-    - assets/svg/copy-fa.svg
-    - assets/svg/star.svg
-    - assets/svg/x-circle.svg
-    - assets/svg/check.svg
-    - assets/svg/alert-circle.svg
-    - assets/svg/alert-circle2.svg
-    - assets/svg/arrow-down-left.svg
-    - assets/svg/arrow-up-right.svg
-    - assets/svg/bars.svg
-    - assets/svg/filter.svg
-    - assets/svg/pending.svg
-    - assets/svg/signal-stream.svg
-    - assets/svg/Ellipse-43.svg
-    - assets/svg/Ellipse-42.svg
-    - assets/svg/arrow-rotate.svg
-    - assets/svg/arrow-rotate2.svg
-    - assets/svg/qrcode1.svg
-    - assets/svg/gear-3.svg
-    - assets/svg/swap.svg
-    - assets/svg/chevron-down.svg
-    - assets/svg/chevron-up.svg
-    - assets/svg/lock-keyhole.svg
-    - assets/svg/lock-open.svg
-    - assets/svg/folder-down.svg
-    - assets/svg/network-wired.svg
-    - assets/svg/network-wired-2.svg
-    - assets/svg/address-book.svg
-    - assets/svg/address-book2.svg
-    - assets/svg/arrow-right.svg
-    - assets/svg/delete.svg
-    - assets/svg/dollar-sign.svg
-    - assets/svg/sun-bright2.svg
-    - assets/svg/language2.svg
-    - assets/svg/pen-solid-fa.svg
-    - assets/svg/magnifying-glass.svg
-    - assets/svg/x.svg
-    - assets/svg/x-fat.svg
-    - assets/svg/user.svg
-    - assets/svg/user-plus.svg
-    - assets/svg/user-minus.svg
-    - assets/svg/trash.svg
-    - assets/svg/eye.svg
-    - assets/svg/eye-slash.svg
-    - assets/svg/folder.svg
-    - assets/svg/calendar-days.svg
-    - assets/svg/circle-question.svg
-    - assets/svg/info-circle.svg
-    - assets/svg/key.svg
-    - assets/svg/node-alt.svg
-    - assets/svg/signal-problem-alt.svg
-    - assets/svg/signal-sync-alt.svg
-    - assets/svg/wallet-settings.svg
-    - assets/svg/ellipsis-vertical1.svg
-    - assets/svg/dice-alt.svg
-    - assets/svg/circle-arrow-up-right2.svg
-    - assets/svg/loader.svg
-    - assets/svg/add-backup.svg
-    - assets/svg/auto-backup.svg
-    - assets/svg/restore-backup.svg
-    - assets/svg/sliders-solid.svg
-    - assets/svg/message-question.svg
-    - assets/svg/envelope.svg
-    - assets/svg/share-2.svg
-    - assets/svg/anonymize.svg
-    - assets/svg/tx-icon-anonymize.svg
-    - assets/svg/tx-icon-anonymize-pending.svg
-    - assets/svg/tx-icon-anonymize-failed.svg
-    - assets/svg/Polygon.svg
-    - assets/svg/Button.svg
-    - assets/svg/enabled-button.svg
-    - assets/svg/lock-circle.svg
-    - assets/svg/dollar-sign-circle.svg
-    - assets/svg/language-circle.svg
-    - assets/svg/rotate-circle.svg
-    - assets/svg/sun-circle.svg
-    - assets/svg/node-circle.svg
-    - assets/svg/address-book-desktop.svg
-    - assets/svg/about-desktop.svg
-    - assets/svg/exchange-desktop.svg
-    - assets/svg/wallet-desktop.svg
-    - assets/svg/exit-desktop.svg
-    - assets/svg/keys.svg
-    - assets/svg/arrow-down.svg
-    - assets/svg/plus-circle.svg
-    - assets/svg/circle-plus-filled.svg
-    - assets/svg/configuration.svg
-    - assets/svg/tokens.svg
-    - assets/svg/circle-plus.svg
-    - assets/svg/robot-head.svg
-    - assets/svg/whirlpool.svg
-    - assets/svg/fingerprint.svg
-    - assets/svg/faceid.svg
-    - assets/svg/chevron-right.svg
-    - assets/svg/minimize.svg
-    - assets/svg/wallet-fa.svg
-    - assets/svg/exchange-3.svg
-    - assets/svg/message-question-1.svg
-    - assets/svg/drd-icon.svg
-    - assets/svg/box-auto.svg
-    - assets/svg/framed-address-book.svg
-    - assets/svg/framed-gear.svg
-    - assets/svg/list-ul.svg
-    - assets/svg/cc.svg
-    - assets/svg/file.svg
-    - assets/svg/file-upload.svg
-    - assets/svg/trocador_rating_a.svg
-    - assets/svg/trocador_rating_b.svg
-    - assets/svg/trocador_rating_c.svg
-    - assets/svg/trocador_rating_d.svg
-    - assets/svg/send.svg
-    - assets/svg/ordinal.svg
-    - assets/svg/monkey.svg
-    - assets/svg/tor.svg
-    - assets/svg/tor-circle.svg
-    - assets/svg/connected-button.svg
-    - assets/svg/connecting-button.svg
-    - assets/svg/disconnected-button.svg
+    - assets/svg/
 
     # coin control icons
     - assets/svg/coin_control/
diff --git a/test/cached_electrumx_test.mocks.dart b/test/cached_electrumx_test.mocks.dart
index e44d745d9..468a8c90b 100644
--- a/test/cached_electrumx_test.mocks.dart
+++ b/test/cached_electrumx_test.mocks.dart
@@ -3,17 +3,19 @@
 // Do not manually edit this file.
 
 // ignore_for_file: no_leading_underscores_for_library_prefixes
-import 'dart:async' as _i4;
-import 'dart:ui' as _i10;
+import 'dart:async' as _i5;
+import 'dart:ui' as _i11;
 
 import 'package:decimal/decimal.dart' as _i2;
 import 'package:mockito/mockito.dart' as _i1;
-import 'package:stackwallet/electrumx_rpc/electrumx.dart' as _i3;
-import 'package:stackwallet/utilities/amount/amount_unit.dart' as _i8;
-import 'package:stackwallet/utilities/enums/backup_frequency_type.dart' as _i7;
-import 'package:stackwallet/utilities/enums/coin_enum.dart' as _i9;
-import 'package:stackwallet/utilities/enums/sync_type_enum.dart' as _i6;
-import 'package:stackwallet/utilities/prefs.dart' as _i5;
+import 'package:stackwallet/electrumx_rpc/electrumx.dart' as _i4;
+import 'package:stackwallet/services/mixins/fusion_wallet_interface.dart'
+    as _i3;
+import 'package:stackwallet/utilities/amount/amount_unit.dart' as _i9;
+import 'package:stackwallet/utilities/enums/backup_frequency_type.dart' as _i8;
+import 'package:stackwallet/utilities/enums/coin_enum.dart' as _i10;
+import 'package:stackwallet/utilities/enums/sync_type_enum.dart' as _i7;
+import 'package:stackwallet/utilities/prefs.dart' as _i6;
 
 // ignore_for_file: type=lint
 // ignore_for_file: avoid_redundant_argument_values
@@ -46,16 +48,26 @@ class _FakeDecimal_1 extends _i1.SmartFake implements _i2.Decimal {
         );
 }
 
+class _FakeFusionInfo_2 extends _i1.SmartFake implements _i3.FusionInfo {
+  _FakeFusionInfo_2(
+    Object parent,
+    Invocation parentInvocation,
+  ) : super(
+          parent,
+          parentInvocation,
+        );
+}
+
 /// A class which mocks [ElectrumX].
 ///
 /// See the documentation for Mockito's code generation for more information.
-class MockElectrumX extends _i1.Mock implements _i3.ElectrumX {
+class MockElectrumX extends _i1.Mock implements _i4.ElectrumX {
   MockElectrumX() {
     _i1.throwOnMissingStub(this);
   }
 
   @override
-  set failovers(List<_i3.ElectrumXNode>? _failovers) => super.noSuchMethod(
+  set failovers(List<_i4.ElectrumXNode>? _failovers) => super.noSuchMethod(
         Invocation.setter(
           #failovers,
           _failovers,
@@ -100,7 +112,7 @@ class MockElectrumX extends _i1.Mock implements _i3.ElectrumX {
         returnValue: false,
       ) as bool);
   @override
-  _i4.Future<dynamic> request({
+  _i5.Future<dynamic> request({
     required String? command,
     List<dynamic>? args = const [],
     String? requestID,
@@ -119,10 +131,10 @@ class MockElectrumX extends _i1.Mock implements _i3.ElectrumX {
             #requestTimeout: requestTimeout,
           },
         ),
-        returnValue: _i4.Future<dynamic>.value(),
-      ) as _i4.Future<dynamic>);
+        returnValue: _i5.Future<dynamic>.value(),
+      ) as _i5.Future<dynamic>);
   @override
-  _i4.Future<List<Map<String, dynamic>>> batchRequest({
+  _i5.Future<List<Map<String, dynamic>>> batchRequest({
     required String? command,
     required Map<String, List<dynamic>>? args,
     Duration? requestTimeout = const Duration(seconds: 60),
@@ -139,11 +151,11 @@ class MockElectrumX extends _i1.Mock implements _i3.ElectrumX {
             #retries: retries,
           },
         ),
-        returnValue: _i4.Future<List<Map<String, dynamic>>>.value(
+        returnValue: _i5.Future<List<Map<String, dynamic>>>.value(
             <Map<String, dynamic>>[]),
-      ) as _i4.Future<List<Map<String, dynamic>>>);
+      ) as _i5.Future<List<Map<String, dynamic>>>);
   @override
-  _i4.Future<bool> ping({
+  _i5.Future<bool> ping({
     String? requestID,
     int? retryCount = 1,
   }) =>
@@ -156,10 +168,10 @@ class MockElectrumX extends _i1.Mock implements _i3.ElectrumX {
             #retryCount: retryCount,
           },
         ),
-        returnValue: _i4.Future<bool>.value(false),
-      ) as _i4.Future<bool>);
+        returnValue: _i5.Future<bool>.value(false),
+      ) as _i5.Future<bool>);
   @override
-  _i4.Future<Map<String, dynamic>> getBlockHeadTip({String? requestID}) =>
+  _i5.Future<Map<String, dynamic>> getBlockHeadTip({String? requestID}) =>
       (super.noSuchMethod(
         Invocation.method(
           #getBlockHeadTip,
@@ -167,10 +179,10 @@ class MockElectrumX extends _i1.Mock implements _i3.ElectrumX {
           {#requestID: requestID},
         ),
         returnValue:
-            _i4.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
-      ) as _i4.Future<Map<String, dynamic>>);
+            _i5.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
+      ) as _i5.Future<Map<String, dynamic>>);
   @override
-  _i4.Future<Map<String, dynamic>> getServerFeatures({String? requestID}) =>
+  _i5.Future<Map<String, dynamic>> getServerFeatures({String? requestID}) =>
       (super.noSuchMethod(
         Invocation.method(
           #getServerFeatures,
@@ -178,10 +190,10 @@ class MockElectrumX extends _i1.Mock implements _i3.ElectrumX {
           {#requestID: requestID},
         ),
         returnValue:
-            _i4.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
-      ) as _i4.Future<Map<String, dynamic>>);
+            _i5.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
+      ) as _i5.Future<Map<String, dynamic>>);
   @override
-  _i4.Future<String> broadcastTransaction({
+  _i5.Future<String> broadcastTransaction({
     required String? rawTx,
     String? requestID,
   }) =>
@@ -194,10 +206,10 @@ class MockElectrumX extends _i1.Mock implements _i3.ElectrumX {
             #requestID: requestID,
           },
         ),
-        returnValue: _i4.Future<String>.value(''),
-      ) as _i4.Future<String>);
+        returnValue: _i5.Future<String>.value(''),
+      ) as _i5.Future<String>);
   @override
-  _i4.Future<Map<String, dynamic>> getBalance({
+  _i5.Future<Map<String, dynamic>> getBalance({
     required String? scripthash,
     String? requestID,
   }) =>
@@ -211,10 +223,10 @@ class MockElectrumX extends _i1.Mock implements _i3.ElectrumX {
           },
         ),
         returnValue:
-            _i4.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
-      ) as _i4.Future<Map<String, dynamic>>);
+            _i5.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
+      ) as _i5.Future<Map<String, dynamic>>);
   @override
-  _i4.Future<List<Map<String, dynamic>>> getHistory({
+  _i5.Future<List<Map<String, dynamic>>> getHistory({
     required String? scripthash,
     String? requestID,
   }) =>
@@ -227,11 +239,11 @@ class MockElectrumX extends _i1.Mock implements _i3.ElectrumX {
             #requestID: requestID,
           },
         ),
-        returnValue: _i4.Future<List<Map<String, dynamic>>>.value(
+        returnValue: _i5.Future<List<Map<String, dynamic>>>.value(
             <Map<String, dynamic>>[]),
-      ) as _i4.Future<List<Map<String, dynamic>>>);
+      ) as _i5.Future<List<Map<String, dynamic>>>);
   @override
-  _i4.Future<Map<String, List<Map<String, dynamic>>>> getBatchHistory(
+  _i5.Future<Map<String, List<Map<String, dynamic>>>> getBatchHistory(
           {required Map<String, List<dynamic>>? args}) =>
       (super.noSuchMethod(
         Invocation.method(
@@ -239,11 +251,11 @@ class MockElectrumX extends _i1.Mock implements _i3.ElectrumX {
           [],
           {#args: args},
         ),
-        returnValue: _i4.Future<Map<String, List<Map<String, dynamic>>>>.value(
+        returnValue: _i5.Future<Map<String, List<Map<String, dynamic>>>>.value(
             <String, List<Map<String, dynamic>>>{}),
-      ) as _i4.Future<Map<String, List<Map<String, dynamic>>>>);
+      ) as _i5.Future<Map<String, List<Map<String, dynamic>>>>);
   @override
-  _i4.Future<List<Map<String, dynamic>>> getUTXOs({
+  _i5.Future<List<Map<String, dynamic>>> getUTXOs({
     required String? scripthash,
     String? requestID,
   }) =>
@@ -256,11 +268,11 @@ class MockElectrumX extends _i1.Mock implements _i3.ElectrumX {
             #requestID: requestID,
           },
         ),
-        returnValue: _i4.Future<List<Map<String, dynamic>>>.value(
+        returnValue: _i5.Future<List<Map<String, dynamic>>>.value(
             <Map<String, dynamic>>[]),
-      ) as _i4.Future<List<Map<String, dynamic>>>);
+      ) as _i5.Future<List<Map<String, dynamic>>>);
   @override
-  _i4.Future<Map<String, List<Map<String, dynamic>>>> getBatchUTXOs(
+  _i5.Future<Map<String, List<Map<String, dynamic>>>> getBatchUTXOs(
           {required Map<String, List<dynamic>>? args}) =>
       (super.noSuchMethod(
         Invocation.method(
@@ -268,11 +280,11 @@ class MockElectrumX extends _i1.Mock implements _i3.ElectrumX {
           [],
           {#args: args},
         ),
-        returnValue: _i4.Future<Map<String, List<Map<String, dynamic>>>>.value(
+        returnValue: _i5.Future<Map<String, List<Map<String, dynamic>>>>.value(
             <String, List<Map<String, dynamic>>>{}),
-      ) as _i4.Future<Map<String, List<Map<String, dynamic>>>>);
+      ) as _i5.Future<Map<String, List<Map<String, dynamic>>>>);
   @override
-  _i4.Future<Map<String, dynamic>> getTransaction({
+  _i5.Future<Map<String, dynamic>> getTransaction({
     required String? txHash,
     bool? verbose = true,
     String? requestID,
@@ -288,10 +300,10 @@ class MockElectrumX extends _i1.Mock implements _i3.ElectrumX {
           },
         ),
         returnValue:
-            _i4.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
-      ) as _i4.Future<Map<String, dynamic>>);
+            _i5.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
+      ) as _i5.Future<Map<String, dynamic>>);
   @override
-  _i4.Future<Map<String, dynamic>> getAnonymitySet({
+  _i5.Future<Map<String, dynamic>> getAnonymitySet({
     String? groupId = r'1',
     String? blockhash = r'',
     String? requestID,
@@ -307,10 +319,10 @@ class MockElectrumX extends _i1.Mock implements _i3.ElectrumX {
           },
         ),
         returnValue:
-            _i4.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
-      ) as _i4.Future<Map<String, dynamic>>);
+            _i5.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
+      ) as _i5.Future<Map<String, dynamic>>);
   @override
-  _i4.Future<dynamic> getMintData({
+  _i5.Future<dynamic> getMintData({
     dynamic mints,
     String? requestID,
   }) =>
@@ -323,10 +335,10 @@ class MockElectrumX extends _i1.Mock implements _i3.ElectrumX {
             #requestID: requestID,
           },
         ),
-        returnValue: _i4.Future<dynamic>.value(),
-      ) as _i4.Future<dynamic>);
+        returnValue: _i5.Future<dynamic>.value(),
+      ) as _i5.Future<dynamic>);
   @override
-  _i4.Future<Map<String, dynamic>> getUsedCoinSerials({
+  _i5.Future<Map<String, dynamic>> getUsedCoinSerials({
     String? requestID,
     required int? startNumber,
   }) =>
@@ -340,19 +352,19 @@ class MockElectrumX extends _i1.Mock implements _i3.ElectrumX {
           },
         ),
         returnValue:
-            _i4.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
-      ) as _i4.Future<Map<String, dynamic>>);
+            _i5.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
+      ) as _i5.Future<Map<String, dynamic>>);
   @override
-  _i4.Future<int> getLatestCoinId({String? requestID}) => (super.noSuchMethod(
+  _i5.Future<int> getLatestCoinId({String? requestID}) => (super.noSuchMethod(
         Invocation.method(
           #getLatestCoinId,
           [],
           {#requestID: requestID},
         ),
-        returnValue: _i4.Future<int>.value(0),
-      ) as _i4.Future<int>);
+        returnValue: _i5.Future<int>.value(0),
+      ) as _i5.Future<int>);
   @override
-  _i4.Future<Map<String, dynamic>> getFeeRate({String? requestID}) =>
+  _i5.Future<Map<String, dynamic>> getFeeRate({String? requestID}) =>
       (super.noSuchMethod(
         Invocation.method(
           #getFeeRate,
@@ -360,10 +372,10 @@ class MockElectrumX extends _i1.Mock implements _i3.ElectrumX {
           {#requestID: requestID},
         ),
         returnValue:
-            _i4.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
-      ) as _i4.Future<Map<String, dynamic>>);
+            _i5.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
+      ) as _i5.Future<Map<String, dynamic>>);
   @override
-  _i4.Future<_i2.Decimal> estimateFee({
+  _i5.Future<_i2.Decimal> estimateFee({
     String? requestID,
     required int? blocks,
   }) =>
@@ -376,7 +388,7 @@ class MockElectrumX extends _i1.Mock implements _i3.ElectrumX {
             #blocks: blocks,
           },
         ),
-        returnValue: _i4.Future<_i2.Decimal>.value(_FakeDecimal_1(
+        returnValue: _i5.Future<_i2.Decimal>.value(_FakeDecimal_1(
           this,
           Invocation.method(
             #estimateFee,
@@ -387,15 +399,15 @@ class MockElectrumX extends _i1.Mock implements _i3.ElectrumX {
             },
           ),
         )),
-      ) as _i4.Future<_i2.Decimal>);
+      ) as _i5.Future<_i2.Decimal>);
   @override
-  _i4.Future<_i2.Decimal> relayFee({String? requestID}) => (super.noSuchMethod(
+  _i5.Future<_i2.Decimal> relayFee({String? requestID}) => (super.noSuchMethod(
         Invocation.method(
           #relayFee,
           [],
           {#requestID: requestID},
         ),
-        returnValue: _i4.Future<_i2.Decimal>.value(_FakeDecimal_1(
+        returnValue: _i5.Future<_i2.Decimal>.value(_FakeDecimal_1(
           this,
           Invocation.method(
             #relayFee,
@@ -403,13 +415,13 @@ class MockElectrumX extends _i1.Mock implements _i3.ElectrumX {
             {#requestID: requestID},
           ),
         )),
-      ) as _i4.Future<_i2.Decimal>);
+      ) as _i5.Future<_i2.Decimal>);
 }
 
 /// A class which mocks [Prefs].
 ///
 /// See the documentation for Mockito's code generation for more information.
-class MockPrefs extends _i1.Mock implements _i5.Prefs {
+class MockPrefs extends _i1.Mock implements _i6.Prefs {
   MockPrefs() {
     _i1.throwOnMissingStub(this);
   }
@@ -465,12 +477,12 @@ class MockPrefs extends _i1.Mock implements _i5.Prefs {
         returnValueForMissingStub: null,
       );
   @override
-  _i6.SyncingType get syncType => (super.noSuchMethod(
+  _i7.SyncingType get syncType => (super.noSuchMethod(
         Invocation.getter(#syncType),
-        returnValue: _i6.SyncingType.currentWalletOnly,
-      ) as _i6.SyncingType);
+        returnValue: _i7.SyncingType.currentWalletOnly,
+      ) as _i7.SyncingType);
   @override
-  set syncType(_i6.SyncingType? syncType) => super.noSuchMethod(
+  set syncType(_i7.SyncingType? syncType) => super.noSuchMethod(
         Invocation.setter(
           #syncType,
           syncType,
@@ -629,12 +641,12 @@ class MockPrefs extends _i1.Mock implements _i5.Prefs {
         returnValueForMissingStub: null,
       );
   @override
-  _i7.BackupFrequencyType get backupFrequencyType => (super.noSuchMethod(
+  _i8.BackupFrequencyType get backupFrequencyType => (super.noSuchMethod(
         Invocation.getter(#backupFrequencyType),
-        returnValue: _i7.BackupFrequencyType.everyTenMinutes,
-      ) as _i7.BackupFrequencyType);
+        returnValue: _i8.BackupFrequencyType.everyTenMinutes,
+      ) as _i8.BackupFrequencyType);
   @override
-  set backupFrequencyType(_i7.BackupFrequencyType? backupFrequencyType) =>
+  set backupFrequencyType(_i8.BackupFrequencyType? backupFrequencyType) =>
       super.noSuchMethod(
         Invocation.setter(
           #backupFrequencyType,
@@ -780,66 +792,82 @@ class MockPrefs extends _i1.Mock implements _i5.Prefs {
         returnValueForMissingStub: null,
       );
   @override
+  _i3.FusionInfo get fusionServerInfo => (super.noSuchMethod(
+        Invocation.getter(#fusionServerInfo),
+        returnValue: _FakeFusionInfo_2(
+          this,
+          Invocation.getter(#fusionServerInfo),
+        ),
+      ) as _i3.FusionInfo);
+  @override
+  set fusionServerInfo(_i3.FusionInfo? fusionServerInfo) => super.noSuchMethod(
+        Invocation.setter(
+          #fusionServerInfo,
+          fusionServerInfo,
+        ),
+        returnValueForMissingStub: null,
+      );
+  @override
   bool get hasListeners => (super.noSuchMethod(
         Invocation.getter(#hasListeners),
         returnValue: false,
       ) as bool);
   @override
-  _i4.Future<void> init() => (super.noSuchMethod(
+  _i5.Future<void> init() => (super.noSuchMethod(
         Invocation.method(
           #init,
           [],
         ),
-        returnValue: _i4.Future<void>.value(),
-        returnValueForMissingStub: _i4.Future<void>.value(),
-      ) as _i4.Future<void>);
+        returnValue: _i5.Future<void>.value(),
+        returnValueForMissingStub: _i5.Future<void>.value(),
+      ) as _i5.Future<void>);
   @override
-  _i4.Future<void> incrementCurrentNotificationIndex() => (super.noSuchMethod(
+  _i5.Future<void> incrementCurrentNotificationIndex() => (super.noSuchMethod(
         Invocation.method(
           #incrementCurrentNotificationIndex,
           [],
         ),
-        returnValue: _i4.Future<void>.value(),
-        returnValueForMissingStub: _i4.Future<void>.value(),
-      ) as _i4.Future<void>);
+        returnValue: _i5.Future<void>.value(),
+        returnValueForMissingStub: _i5.Future<void>.value(),
+      ) as _i5.Future<void>);
   @override
-  _i4.Future<bool> isExternalCallsSet() => (super.noSuchMethod(
+  _i5.Future<bool> isExternalCallsSet() => (super.noSuchMethod(
         Invocation.method(
           #isExternalCallsSet,
           [],
         ),
-        returnValue: _i4.Future<bool>.value(false),
-      ) as _i4.Future<bool>);
+        returnValue: _i5.Future<bool>.value(false),
+      ) as _i5.Future<bool>);
   @override
-  _i4.Future<void> saveUserID(String? userId) => (super.noSuchMethod(
+  _i5.Future<void> saveUserID(String? userId) => (super.noSuchMethod(
         Invocation.method(
           #saveUserID,
           [userId],
         ),
-        returnValue: _i4.Future<void>.value(),
-        returnValueForMissingStub: _i4.Future<void>.value(),
-      ) as _i4.Future<void>);
+        returnValue: _i5.Future<void>.value(),
+        returnValueForMissingStub: _i5.Future<void>.value(),
+      ) as _i5.Future<void>);
   @override
-  _i4.Future<void> saveSignupEpoch(int? signupEpoch) => (super.noSuchMethod(
+  _i5.Future<void> saveSignupEpoch(int? signupEpoch) => (super.noSuchMethod(
         Invocation.method(
           #saveSignupEpoch,
           [signupEpoch],
         ),
-        returnValue: _i4.Future<void>.value(),
-        returnValueForMissingStub: _i4.Future<void>.value(),
-      ) as _i4.Future<void>);
+        returnValue: _i5.Future<void>.value(),
+        returnValueForMissingStub: _i5.Future<void>.value(),
+      ) as _i5.Future<void>);
   @override
-  _i8.AmountUnit amountUnit(_i9.Coin? coin) => (super.noSuchMethod(
+  _i9.AmountUnit amountUnit(_i10.Coin? coin) => (super.noSuchMethod(
         Invocation.method(
           #amountUnit,
           [coin],
         ),
-        returnValue: _i8.AmountUnit.normal,
-      ) as _i8.AmountUnit);
+        returnValue: _i9.AmountUnit.normal,
+      ) as _i9.AmountUnit);
   @override
   void updateAmountUnit({
-    required _i9.Coin? coin,
-    required _i8.AmountUnit? amountUnit,
+    required _i10.Coin? coin,
+    required _i9.AmountUnit? amountUnit,
   }) =>
       super.noSuchMethod(
         Invocation.method(
@@ -853,7 +881,7 @@ class MockPrefs extends _i1.Mock implements _i5.Prefs {
         returnValueForMissingStub: null,
       );
   @override
-  int maxDecimals(_i9.Coin? coin) => (super.noSuchMethod(
+  int maxDecimals(_i10.Coin? coin) => (super.noSuchMethod(
         Invocation.method(
           #maxDecimals,
           [coin],
@@ -862,7 +890,7 @@ class MockPrefs extends _i1.Mock implements _i5.Prefs {
       ) as int);
   @override
   void updateMaxDecimals({
-    required _i9.Coin? coin,
+    required _i10.Coin? coin,
     required int? maxDecimals,
   }) =>
       super.noSuchMethod(
@@ -877,7 +905,7 @@ class MockPrefs extends _i1.Mock implements _i5.Prefs {
         returnValueForMissingStub: null,
       );
   @override
-  void addListener(_i10.VoidCallback? listener) => super.noSuchMethod(
+  void addListener(_i11.VoidCallback? listener) => super.noSuchMethod(
         Invocation.method(
           #addListener,
           [listener],
@@ -885,7 +913,7 @@ class MockPrefs extends _i1.Mock implements _i5.Prefs {
         returnValueForMissingStub: null,
       );
   @override
-  void removeListener(_i10.VoidCallback? listener) => super.noSuchMethod(
+  void removeListener(_i11.VoidCallback? listener) => super.noSuchMethod(
         Invocation.method(
           #removeListener,
           [listener],
diff --git a/test/electrumx_test.mocks.dart b/test/electrumx_test.mocks.dart
index 557b983a6..8f683b2f1 100644
--- a/test/electrumx_test.mocks.dart
+++ b/test/electrumx_test.mocks.dart
@@ -3,21 +3,23 @@
 // Do not manually edit this file.
 
 // ignore_for_file: no_leading_underscores_for_library_prefixes
-import 'dart:async' as _i4;
-import 'dart:io' as _i3;
-import 'dart:ui' as _i10;
+import 'dart:async' as _i5;
+import 'dart:io' as _i4;
+import 'dart:ui' as _i11;
 
 import 'package:mockito/mockito.dart' as _i1;
 import 'package:stackwallet/electrumx_rpc/rpc.dart' as _i2;
 import 'package:stackwallet/services/event_bus/events/global/tor_connection_status_changed_event.dart'
-    as _i12;
-import 'package:stackwallet/services/tor_service.dart' as _i11;
-import 'package:stackwallet/utilities/amount/amount_unit.dart' as _i8;
-import 'package:stackwallet/utilities/enums/backup_frequency_type.dart' as _i7;
-import 'package:stackwallet/utilities/enums/coin_enum.dart' as _i9;
-import 'package:stackwallet/utilities/enums/sync_type_enum.dart' as _i6;
-import 'package:stackwallet/utilities/prefs.dart' as _i5;
-import 'package:tor_ffi_plugin/tor_ffi_plugin.dart' as _i13;
+    as _i13;
+import 'package:stackwallet/services/mixins/fusion_wallet_interface.dart'
+    as _i3;
+import 'package:stackwallet/services/tor_service.dart' as _i12;
+import 'package:stackwallet/utilities/amount/amount_unit.dart' as _i9;
+import 'package:stackwallet/utilities/enums/backup_frequency_type.dart' as _i8;
+import 'package:stackwallet/utilities/enums/coin_enum.dart' as _i10;
+import 'package:stackwallet/utilities/enums/sync_type_enum.dart' as _i7;
+import 'package:stackwallet/utilities/prefs.dart' as _i6;
+import 'package:tor_ffi_plugin/tor_ffi_plugin.dart' as _i14;
 
 // ignore_for_file: type=lint
 // ignore_for_file: avoid_redundant_argument_values
@@ -51,9 +53,19 @@ class _FakeJsonRPCResponse_1 extends _i1.SmartFake
         );
 }
 
-class _FakeInternetAddress_2 extends _i1.SmartFake
-    implements _i3.InternetAddress {
-  _FakeInternetAddress_2(
+class _FakeFusionInfo_2 extends _i1.SmartFake implements _i3.FusionInfo {
+  _FakeFusionInfo_2(
+    Object parent,
+    Invocation parentInvocation,
+  ) : super(
+          parent,
+          parentInvocation,
+        );
+}
+
+class _FakeInternetAddress_3 extends _i1.SmartFake
+    implements _i4.InternetAddress {
+  _FakeInternetAddress_3(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -94,7 +106,7 @@ class MockJsonRPC extends _i1.Mock implements _i2.JsonRPC {
         ),
       ) as Duration);
   @override
-  set proxyInfo(({_i3.InternetAddress host, int port})? _proxyInfo) =>
+  set proxyInfo(({_i4.InternetAddress host, int port})? _proxyInfo) =>
       super.noSuchMethod(
         Invocation.setter(
           #proxyInfo,
@@ -103,7 +115,7 @@ class MockJsonRPC extends _i1.Mock implements _i2.JsonRPC {
         returnValueForMissingStub: null,
       );
   @override
-  _i4.Future<_i2.JsonRPCResponse> request(
+  _i5.Future<_i2.JsonRPCResponse> request(
     String? jsonRpcRequest,
     Duration? requestTimeout,
   ) =>
@@ -116,7 +128,7 @@ class MockJsonRPC extends _i1.Mock implements _i2.JsonRPC {
           ],
         ),
         returnValue:
-            _i4.Future<_i2.JsonRPCResponse>.value(_FakeJsonRPCResponse_1(
+            _i5.Future<_i2.JsonRPCResponse>.value(_FakeJsonRPCResponse_1(
           this,
           Invocation.method(
             #request,
@@ -126,32 +138,32 @@ class MockJsonRPC extends _i1.Mock implements _i2.JsonRPC {
             ],
           ),
         )),
-      ) as _i4.Future<_i2.JsonRPCResponse>);
+      ) as _i5.Future<_i2.JsonRPCResponse>);
   @override
-  _i4.Future<void> disconnect({required String? reason}) => (super.noSuchMethod(
+  _i5.Future<void> disconnect({required String? reason}) => (super.noSuchMethod(
         Invocation.method(
           #disconnect,
           [],
           {#reason: reason},
         ),
-        returnValue: _i4.Future<void>.value(),
-        returnValueForMissingStub: _i4.Future<void>.value(),
-      ) as _i4.Future<void>);
+        returnValue: _i5.Future<void>.value(),
+        returnValueForMissingStub: _i5.Future<void>.value(),
+      ) as _i5.Future<void>);
   @override
-  _i4.Future<void> connect() => (super.noSuchMethod(
+  _i5.Future<void> connect() => (super.noSuchMethod(
         Invocation.method(
           #connect,
           [],
         ),
-        returnValue: _i4.Future<void>.value(),
-        returnValueForMissingStub: _i4.Future<void>.value(),
-      ) as _i4.Future<void>);
+        returnValue: _i5.Future<void>.value(),
+        returnValueForMissingStub: _i5.Future<void>.value(),
+      ) as _i5.Future<void>);
 }
 
 /// A class which mocks [Prefs].
 ///
 /// See the documentation for Mockito's code generation for more information.
-class MockPrefs extends _i1.Mock implements _i5.Prefs {
+class MockPrefs extends _i1.Mock implements _i6.Prefs {
   MockPrefs() {
     _i1.throwOnMissingStub(this);
   }
@@ -207,12 +219,12 @@ class MockPrefs extends _i1.Mock implements _i5.Prefs {
         returnValueForMissingStub: null,
       );
   @override
-  _i6.SyncingType get syncType => (super.noSuchMethod(
+  _i7.SyncingType get syncType => (super.noSuchMethod(
         Invocation.getter(#syncType),
-        returnValue: _i6.SyncingType.currentWalletOnly,
-      ) as _i6.SyncingType);
+        returnValue: _i7.SyncingType.currentWalletOnly,
+      ) as _i7.SyncingType);
   @override
-  set syncType(_i6.SyncingType? syncType) => super.noSuchMethod(
+  set syncType(_i7.SyncingType? syncType) => super.noSuchMethod(
         Invocation.setter(
           #syncType,
           syncType,
@@ -371,12 +383,12 @@ class MockPrefs extends _i1.Mock implements _i5.Prefs {
         returnValueForMissingStub: null,
       );
   @override
-  _i7.BackupFrequencyType get backupFrequencyType => (super.noSuchMethod(
+  _i8.BackupFrequencyType get backupFrequencyType => (super.noSuchMethod(
         Invocation.getter(#backupFrequencyType),
-        returnValue: _i7.BackupFrequencyType.everyTenMinutes,
-      ) as _i7.BackupFrequencyType);
+        returnValue: _i8.BackupFrequencyType.everyTenMinutes,
+      ) as _i8.BackupFrequencyType);
   @override
-  set backupFrequencyType(_i7.BackupFrequencyType? backupFrequencyType) =>
+  set backupFrequencyType(_i8.BackupFrequencyType? backupFrequencyType) =>
       super.noSuchMethod(
         Invocation.setter(
           #backupFrequencyType,
@@ -522,66 +534,82 @@ class MockPrefs extends _i1.Mock implements _i5.Prefs {
         returnValueForMissingStub: null,
       );
   @override
+  _i3.FusionInfo get fusionServerInfo => (super.noSuchMethod(
+        Invocation.getter(#fusionServerInfo),
+        returnValue: _FakeFusionInfo_2(
+          this,
+          Invocation.getter(#fusionServerInfo),
+        ),
+      ) as _i3.FusionInfo);
+  @override
+  set fusionServerInfo(_i3.FusionInfo? fusionServerInfo) => super.noSuchMethod(
+        Invocation.setter(
+          #fusionServerInfo,
+          fusionServerInfo,
+        ),
+        returnValueForMissingStub: null,
+      );
+  @override
   bool get hasListeners => (super.noSuchMethod(
         Invocation.getter(#hasListeners),
         returnValue: false,
       ) as bool);
   @override
-  _i4.Future<void> init() => (super.noSuchMethod(
+  _i5.Future<void> init() => (super.noSuchMethod(
         Invocation.method(
           #init,
           [],
         ),
-        returnValue: _i4.Future<void>.value(),
-        returnValueForMissingStub: _i4.Future<void>.value(),
-      ) as _i4.Future<void>);
+        returnValue: _i5.Future<void>.value(),
+        returnValueForMissingStub: _i5.Future<void>.value(),
+      ) as _i5.Future<void>);
   @override
-  _i4.Future<void> incrementCurrentNotificationIndex() => (super.noSuchMethod(
+  _i5.Future<void> incrementCurrentNotificationIndex() => (super.noSuchMethod(
         Invocation.method(
           #incrementCurrentNotificationIndex,
           [],
         ),
-        returnValue: _i4.Future<void>.value(),
-        returnValueForMissingStub: _i4.Future<void>.value(),
-      ) as _i4.Future<void>);
+        returnValue: _i5.Future<void>.value(),
+        returnValueForMissingStub: _i5.Future<void>.value(),
+      ) as _i5.Future<void>);
   @override
-  _i4.Future<bool> isExternalCallsSet() => (super.noSuchMethod(
+  _i5.Future<bool> isExternalCallsSet() => (super.noSuchMethod(
         Invocation.method(
           #isExternalCallsSet,
           [],
         ),
-        returnValue: _i4.Future<bool>.value(false),
-      ) as _i4.Future<bool>);
+        returnValue: _i5.Future<bool>.value(false),
+      ) as _i5.Future<bool>);
   @override
-  _i4.Future<void> saveUserID(String? userId) => (super.noSuchMethod(
+  _i5.Future<void> saveUserID(String? userId) => (super.noSuchMethod(
         Invocation.method(
           #saveUserID,
           [userId],
         ),
-        returnValue: _i4.Future<void>.value(),
-        returnValueForMissingStub: _i4.Future<void>.value(),
-      ) as _i4.Future<void>);
+        returnValue: _i5.Future<void>.value(),
+        returnValueForMissingStub: _i5.Future<void>.value(),
+      ) as _i5.Future<void>);
   @override
-  _i4.Future<void> saveSignupEpoch(int? signupEpoch) => (super.noSuchMethod(
+  _i5.Future<void> saveSignupEpoch(int? signupEpoch) => (super.noSuchMethod(
         Invocation.method(
           #saveSignupEpoch,
           [signupEpoch],
         ),
-        returnValue: _i4.Future<void>.value(),
-        returnValueForMissingStub: _i4.Future<void>.value(),
-      ) as _i4.Future<void>);
+        returnValue: _i5.Future<void>.value(),
+        returnValueForMissingStub: _i5.Future<void>.value(),
+      ) as _i5.Future<void>);
   @override
-  _i8.AmountUnit amountUnit(_i9.Coin? coin) => (super.noSuchMethod(
+  _i9.AmountUnit amountUnit(_i10.Coin? coin) => (super.noSuchMethod(
         Invocation.method(
           #amountUnit,
           [coin],
         ),
-        returnValue: _i8.AmountUnit.normal,
-      ) as _i8.AmountUnit);
+        returnValue: _i9.AmountUnit.normal,
+      ) as _i9.AmountUnit);
   @override
   void updateAmountUnit({
-    required _i9.Coin? coin,
-    required _i8.AmountUnit? amountUnit,
+    required _i10.Coin? coin,
+    required _i9.AmountUnit? amountUnit,
   }) =>
       super.noSuchMethod(
         Invocation.method(
@@ -595,7 +623,7 @@ class MockPrefs extends _i1.Mock implements _i5.Prefs {
         returnValueForMissingStub: null,
       );
   @override
-  int maxDecimals(_i9.Coin? coin) => (super.noSuchMethod(
+  int maxDecimals(_i10.Coin? coin) => (super.noSuchMethod(
         Invocation.method(
           #maxDecimals,
           [coin],
@@ -604,7 +632,7 @@ class MockPrefs extends _i1.Mock implements _i5.Prefs {
       ) as int);
   @override
   void updateMaxDecimals({
-    required _i9.Coin? coin,
+    required _i10.Coin? coin,
     required int? maxDecimals,
   }) =>
       super.noSuchMethod(
@@ -619,7 +647,7 @@ class MockPrefs extends _i1.Mock implements _i5.Prefs {
         returnValueForMissingStub: null,
       );
   @override
-  void addListener(_i10.VoidCallback? listener) => super.noSuchMethod(
+  void addListener(_i11.VoidCallback? listener) => super.noSuchMethod(
         Invocation.method(
           #addListener,
           [listener],
@@ -627,7 +655,7 @@ class MockPrefs extends _i1.Mock implements _i5.Prefs {
         returnValueForMissingStub: null,
       );
   @override
-  void removeListener(_i10.VoidCallback? listener) => super.noSuchMethod(
+  void removeListener(_i11.VoidCallback? listener) => super.noSuchMethod(
         Invocation.method(
           #removeListener,
           [listener],
@@ -655,24 +683,24 @@ class MockPrefs extends _i1.Mock implements _i5.Prefs {
 /// A class which mocks [TorService].
 ///
 /// See the documentation for Mockito's code generation for more information.
-class MockTorService extends _i1.Mock implements _i11.TorService {
+class MockTorService extends _i1.Mock implements _i12.TorService {
   MockTorService() {
     _i1.throwOnMissingStub(this);
   }
 
   @override
-  _i12.TorConnectionStatus get status => (super.noSuchMethod(
+  _i13.TorConnectionStatus get status => (super.noSuchMethod(
         Invocation.getter(#status),
-        returnValue: _i12.TorConnectionStatus.disconnected,
-      ) as _i12.TorConnectionStatus);
+        returnValue: _i13.TorConnectionStatus.disconnected,
+      ) as _i13.TorConnectionStatus);
   @override
-  ({_i3.InternetAddress host, int port}) getProxyInfo() => (super.noSuchMethod(
+  ({_i4.InternetAddress host, int port}) getProxyInfo() => (super.noSuchMethod(
         Invocation.method(
           #getProxyInfo,
           [],
         ),
         returnValue: (
-          host: _FakeInternetAddress_2(
+          host: _FakeInternetAddress_3(
             this,
             Invocation.method(
               #getProxyInfo,
@@ -681,11 +709,11 @@ class MockTorService extends _i1.Mock implements _i11.TorService {
           ),
           port: 0
         ),
-      ) as ({_i3.InternetAddress host, int port}));
+      ) as ({_i4.InternetAddress host, int port}));
   @override
   void init({
     required String? torDataDirPath,
-    _i13.Tor? mockableOverride,
+    _i14.Tor? mockableOverride,
   }) =>
       super.noSuchMethod(
         Invocation.method(
@@ -699,21 +727,21 @@ class MockTorService extends _i1.Mock implements _i11.TorService {
         returnValueForMissingStub: null,
       );
   @override
-  _i4.Future<void> start() => (super.noSuchMethod(
+  _i5.Future<void> start() => (super.noSuchMethod(
         Invocation.method(
           #start,
           [],
         ),
-        returnValue: _i4.Future<void>.value(),
-        returnValueForMissingStub: _i4.Future<void>.value(),
-      ) as _i4.Future<void>);
+        returnValue: _i5.Future<void>.value(),
+        returnValueForMissingStub: _i5.Future<void>.value(),
+      ) as _i5.Future<void>);
   @override
-  _i4.Future<void> disable() => (super.noSuchMethod(
+  _i5.Future<void> disable() => (super.noSuchMethod(
         Invocation.method(
           #disable,
           [],
         ),
-        returnValue: _i4.Future<void>.value(),
-        returnValueForMissingStub: _i4.Future<void>.value(),
-      ) as _i4.Future<void>);
+        returnValue: _i5.Future<void>.value(),
+        returnValueForMissingStub: _i5.Future<void>.value(),
+      ) as _i5.Future<void>);
 }
diff --git a/test/pages/send_view/send_view_test.mocks.dart b/test/pages/send_view/send_view_test.mocks.dart
index d2d5de661..44ab4fc52 100644
--- a/test/pages/send_view/send_view_test.mocks.dart
+++ b/test/pages/send_view/send_view_test.mocks.dart
@@ -3,12 +3,12 @@
 // Do not manually edit this file.
 
 // ignore_for_file: no_leading_underscores_for_library_prefixes
-import 'dart:async' as _i24;
-import 'dart:typed_data' as _i31;
-import 'dart:ui' as _i26;
+import 'dart:async' as _i26;
+import 'dart:typed_data' as _i33;
+import 'dart:ui' as _i28;
 
-import 'package:bip32/bip32.dart' as _i17;
-import 'package:bip47/bip47.dart' as _i19;
+import 'package:bip32/bip32.dart' as _i18;
+import 'package:bip47/bip47.dart' as _i20;
 import 'package:bitcoindart/bitcoindart.dart' as _i14;
 import 'package:flutter/foundation.dart' as _i4;
 import 'package:flutter_riverpod/flutter_riverpod.dart' as _i5;
@@ -17,32 +17,36 @@ import 'package:stackwallet/db/isar/main_db.dart' as _i13;
 import 'package:stackwallet/electrumx_rpc/cached_electrumx.dart' as _i11;
 import 'package:stackwallet/electrumx_rpc/electrumx.dart' as _i10;
 import 'package:stackwallet/models/balance.dart' as _i12;
-import 'package:stackwallet/models/isar/models/isar_models.dart' as _i18;
-import 'package:stackwallet/models/isar/stack_theme.dart' as _i34;
-import 'package:stackwallet/models/node_model.dart' as _i27;
+import 'package:stackwallet/models/isar/models/blockchain_data/v2/transaction_v2.dart'
+    as _i16;
+import 'package:stackwallet/models/isar/models/isar_models.dart' as _i19;
+import 'package:stackwallet/models/isar/stack_theme.dart' as _i36;
+import 'package:stackwallet/models/node_model.dart' as _i29;
 import 'package:stackwallet/models/paymint/fee_object_model.dart' as _i9;
-import 'package:stackwallet/models/signing_data.dart' as _i30;
-import 'package:stackwallet/networking/http.dart' as _i20;
-import 'package:stackwallet/services/coins/bitcoin/bitcoin_wallet.dart' as _i28;
-import 'package:stackwallet/services/coins/coin_service.dart' as _i21;
+import 'package:stackwallet/models/signing_data.dart' as _i32;
+import 'package:stackwallet/networking/http.dart' as _i21;
+import 'package:stackwallet/services/coins/bitcoin/bitcoin_wallet.dart' as _i30;
+import 'package:stackwallet/services/coins/coin_service.dart' as _i23;
 import 'package:stackwallet/services/coins/manager.dart' as _i6;
-import 'package:stackwallet/services/locale_service.dart' as _i32;
+import 'package:stackwallet/services/locale_service.dart' as _i34;
+import 'package:stackwallet/services/mixins/fusion_wallet_interface.dart'
+    as _i22;
 import 'package:stackwallet/services/node_service.dart' as _i3;
 import 'package:stackwallet/services/transaction_notification_tracker.dart'
     as _i8;
-import 'package:stackwallet/services/wallets.dart' as _i22;
+import 'package:stackwallet/services/wallets.dart' as _i24;
 import 'package:stackwallet/services/wallets_service.dart' as _i2;
-import 'package:stackwallet/themes/theme_service.dart' as _i33;
+import 'package:stackwallet/themes/theme_service.dart' as _i35;
 import 'package:stackwallet/utilities/amount/amount.dart' as _i15;
-import 'package:stackwallet/utilities/amount/amount_unit.dart' as _i37;
-import 'package:stackwallet/utilities/enums/backup_frequency_type.dart' as _i36;
-import 'package:stackwallet/utilities/enums/coin_enum.dart' as _i23;
-import 'package:stackwallet/utilities/enums/derive_path_type_enum.dart' as _i29;
-import 'package:stackwallet/utilities/enums/sync_type_enum.dart' as _i35;
+import 'package:stackwallet/utilities/amount/amount_unit.dart' as _i39;
+import 'package:stackwallet/utilities/enums/backup_frequency_type.dart' as _i38;
+import 'package:stackwallet/utilities/enums/coin_enum.dart' as _i25;
+import 'package:stackwallet/utilities/enums/derive_path_type_enum.dart' as _i31;
+import 'package:stackwallet/utilities/enums/sync_type_enum.dart' as _i37;
 import 'package:stackwallet/utilities/flutter_secure_storage_interface.dart'
     as _i7;
-import 'package:stackwallet/utilities/prefs.dart' as _i25;
-import 'package:tuple/tuple.dart' as _i16;
+import 'package:stackwallet/utilities/prefs.dart' as _i27;
+import 'package:tuple/tuple.dart' as _i17;
 
 // ignore_for_file: type=lint
 // ignore_for_file: avoid_redundant_argument_values
@@ -201,9 +205,9 @@ class _FakeAmount_13 extends _i1.SmartFake implements _i15.Amount {
         );
 }
 
-class _FakeTuple2_14<T1, T2> extends _i1.SmartFake
-    implements _i16.Tuple2<T1, T2> {
-  _FakeTuple2_14(
+class _FakeTransactionV2_14 extends _i1.SmartFake
+    implements _i16.TransactionV2 {
+  _FakeTransactionV2_14(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -212,8 +216,9 @@ class _FakeTuple2_14<T1, T2> extends _i1.SmartFake
         );
 }
 
-class _FakeBIP32_15 extends _i1.SmartFake implements _i17.BIP32 {
-  _FakeBIP32_15(
+class _FakeTuple2_15<T1, T2> extends _i1.SmartFake
+    implements _i17.Tuple2<T1, T2> {
+  _FakeTuple2_15(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -222,8 +227,8 @@ class _FakeBIP32_15 extends _i1.SmartFake implements _i17.BIP32 {
         );
 }
 
-class _FakeAddress_16 extends _i1.SmartFake implements _i18.Address {
-  _FakeAddress_16(
+class _FakeBIP32_16 extends _i1.SmartFake implements _i18.BIP32 {
+  _FakeBIP32_16(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -232,8 +237,8 @@ class _FakeAddress_16 extends _i1.SmartFake implements _i18.Address {
         );
 }
 
-class _FakePaymentCode_17 extends _i1.SmartFake implements _i19.PaymentCode {
-  _FakePaymentCode_17(
+class _FakeAddress_17 extends _i1.SmartFake implements _i19.Address {
+  _FakeAddress_17(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -242,8 +247,8 @@ class _FakePaymentCode_17 extends _i1.SmartFake implements _i19.PaymentCode {
         );
 }
 
-class _FakeHTTP_18 extends _i1.SmartFake implements _i20.HTTP {
-  _FakeHTTP_18(
+class _FakePaymentCode_18 extends _i1.SmartFake implements _i20.PaymentCode {
+  _FakePaymentCode_18(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -252,9 +257,29 @@ class _FakeHTTP_18 extends _i1.SmartFake implements _i20.HTTP {
         );
 }
 
-class _FakeCoinServiceAPI_19 extends _i1.SmartFake
-    implements _i21.CoinServiceAPI {
-  _FakeCoinServiceAPI_19(
+class _FakeHTTP_19 extends _i1.SmartFake implements _i21.HTTP {
+  _FakeHTTP_19(
+    Object parent,
+    Invocation parentInvocation,
+  ) : super(
+          parent,
+          parentInvocation,
+        );
+}
+
+class _FakeFusionInfo_20 extends _i1.SmartFake implements _i22.FusionInfo {
+  _FakeFusionInfo_20(
+    Object parent,
+    Invocation parentInvocation,
+  ) : super(
+          parent,
+          parentInvocation,
+        );
+}
+
+class _FakeCoinServiceAPI_21 extends _i1.SmartFake
+    implements _i23.CoinServiceAPI {
+  _FakeCoinServiceAPI_21(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -266,7 +291,7 @@ class _FakeCoinServiceAPI_19 extends _i1.SmartFake
 /// A class which mocks [Wallets].
 ///
 /// See the documentation for Mockito's code generation for more information.
-class MockWallets extends _i1.Mock implements _i22.Wallets {
+class MockWallets extends _i1.Mock implements _i24.Wallets {
   MockWallets() {
     _i1.throwOnMissingStub(this);
   }
@@ -333,7 +358,7 @@ class MockWallets extends _i1.Mock implements _i22.Wallets {
         returnValueForMissingStub: null,
       );
   @override
-  List<String> getWalletIdsFor({required _i23.Coin? coin}) =>
+  List<String> getWalletIdsFor({required _i25.Coin? coin}) =>
       (super.noSuchMethod(
         Invocation.method(
           #getWalletIdsFor,
@@ -343,20 +368,20 @@ class MockWallets extends _i1.Mock implements _i22.Wallets {
         returnValue: <String>[],
       ) as List<String>);
   @override
-  List<_i16.Tuple2<_i23.Coin, List<_i5.ChangeNotifierProvider<_i6.Manager>>>>
+  List<_i17.Tuple2<_i25.Coin, List<_i5.ChangeNotifierProvider<_i6.Manager>>>>
       getManagerProvidersByCoin() => (super.noSuchMethod(
             Invocation.method(
               #getManagerProvidersByCoin,
               [],
             ),
-            returnValue: <_i16.Tuple2<_i23.Coin,
+            returnValue: <_i17.Tuple2<_i25.Coin,
                 List<_i5.ChangeNotifierProvider<_i6.Manager>>>>[],
           ) as List<
-              _i16.Tuple2<_i23.Coin,
+              _i17.Tuple2<_i25.Coin,
                   List<_i5.ChangeNotifierProvider<_i6.Manager>>>>);
   @override
   List<_i5.ChangeNotifierProvider<_i6.Manager>> getManagerProvidersForCoin(
-          _i23.Coin? coin) =>
+          _i25.Coin? coin) =>
       (super.noSuchMethod(
         Invocation.method(
           #getManagerProvidersForCoin,
@@ -420,17 +445,17 @@ class MockWallets extends _i1.Mock implements _i22.Wallets {
         returnValueForMissingStub: null,
       );
   @override
-  _i24.Future<void> load(_i25.Prefs? prefs) => (super.noSuchMethod(
+  _i26.Future<void> load(_i27.Prefs? prefs) => (super.noSuchMethod(
         Invocation.method(
           #load,
           [prefs],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
-  _i24.Future<void> loadAfterStackRestore(
-    _i25.Prefs? prefs,
+  _i26.Future<void> loadAfterStackRestore(
+    _i27.Prefs? prefs,
     List<_i6.Manager>? managers,
   ) =>
       (super.noSuchMethod(
@@ -441,11 +466,11 @@ class MockWallets extends _i1.Mock implements _i22.Wallets {
             managers,
           ],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
-  void addListener(_i26.VoidCallback? listener) => super.noSuchMethod(
+  void addListener(_i28.VoidCallback? listener) => super.noSuchMethod(
         Invocation.method(
           #addListener,
           [listener],
@@ -453,7 +478,7 @@ class MockWallets extends _i1.Mock implements _i22.Wallets {
         returnValueForMissingStub: null,
       );
   @override
-  void removeListener(_i26.VoidCallback? listener) => super.noSuchMethod(
+  void removeListener(_i28.VoidCallback? listener) => super.noSuchMethod(
         Invocation.method(
           #removeListener,
           [listener],
@@ -479,19 +504,19 @@ class MockWalletsService extends _i1.Mock implements _i2.WalletsService {
   }
 
   @override
-  _i24.Future<Map<String, _i2.WalletInfo>> get walletNames =>
+  _i26.Future<Map<String, _i2.WalletInfo>> get walletNames =>
       (super.noSuchMethod(
         Invocation.getter(#walletNames),
-        returnValue: _i24.Future<Map<String, _i2.WalletInfo>>.value(
+        returnValue: _i26.Future<Map<String, _i2.WalletInfo>>.value(
             <String, _i2.WalletInfo>{}),
-      ) as _i24.Future<Map<String, _i2.WalletInfo>>);
+      ) as _i26.Future<Map<String, _i2.WalletInfo>>);
   @override
   bool get hasListeners => (super.noSuchMethod(
         Invocation.getter(#hasListeners),
         returnValue: false,
       ) as bool);
   @override
-  _i24.Future<bool> renameWallet({
+  _i26.Future<bool> renameWallet({
     required String? from,
     required String? to,
     required bool? shouldNotifyListeners,
@@ -506,8 +531,8 @@ class MockWalletsService extends _i1.Mock implements _i2.WalletsService {
             #shouldNotifyListeners: shouldNotifyListeners,
           },
         ),
-        returnValue: _i24.Future<bool>.value(false),
-      ) as _i24.Future<bool>);
+        returnValue: _i26.Future<bool>.value(false),
+      ) as _i26.Future<bool>);
   @override
   Map<String, _i2.WalletInfo> fetchWalletsData() => (super.noSuchMethod(
         Invocation.method(
@@ -517,10 +542,10 @@ class MockWalletsService extends _i1.Mock implements _i2.WalletsService {
         returnValue: <String, _i2.WalletInfo>{},
       ) as Map<String, _i2.WalletInfo>);
   @override
-  _i24.Future<void> addExistingStackWallet({
+  _i26.Future<void> addExistingStackWallet({
     required String? name,
     required String? walletId,
-    required _i23.Coin? coin,
+    required _i25.Coin? coin,
     required bool? shouldNotifyListeners,
   }) =>
       (super.noSuchMethod(
@@ -534,13 +559,13 @@ class MockWalletsService extends _i1.Mock implements _i2.WalletsService {
             #shouldNotifyListeners: shouldNotifyListeners,
           },
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
-  _i24.Future<String?> addNewWallet({
+  _i26.Future<String?> addNewWallet({
     required String? name,
-    required _i23.Coin? coin,
+    required _i25.Coin? coin,
     required bool? shouldNotifyListeners,
   }) =>
       (super.noSuchMethod(
@@ -553,46 +578,46 @@ class MockWalletsService extends _i1.Mock implements _i2.WalletsService {
             #shouldNotifyListeners: shouldNotifyListeners,
           },
         ),
-        returnValue: _i24.Future<String?>.value(),
-      ) as _i24.Future<String?>);
+        returnValue: _i26.Future<String?>.value(),
+      ) as _i26.Future<String?>);
   @override
-  _i24.Future<List<String>> getFavoriteWalletIds() => (super.noSuchMethod(
+  _i26.Future<List<String>> getFavoriteWalletIds() => (super.noSuchMethod(
         Invocation.method(
           #getFavoriteWalletIds,
           [],
         ),
-        returnValue: _i24.Future<List<String>>.value(<String>[]),
-      ) as _i24.Future<List<String>>);
+        returnValue: _i26.Future<List<String>>.value(<String>[]),
+      ) as _i26.Future<List<String>>);
   @override
-  _i24.Future<void> saveFavoriteWalletIds(List<String>? walletIds) =>
+  _i26.Future<void> saveFavoriteWalletIds(List<String>? walletIds) =>
       (super.noSuchMethod(
         Invocation.method(
           #saveFavoriteWalletIds,
           [walletIds],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
-  _i24.Future<void> addFavorite(String? walletId) => (super.noSuchMethod(
+  _i26.Future<void> addFavorite(String? walletId) => (super.noSuchMethod(
         Invocation.method(
           #addFavorite,
           [walletId],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
-  _i24.Future<void> removeFavorite(String? walletId) => (super.noSuchMethod(
+  _i26.Future<void> removeFavorite(String? walletId) => (super.noSuchMethod(
         Invocation.method(
           #removeFavorite,
           [walletId],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
-  _i24.Future<void> moveFavorite({
+  _i26.Future<void> moveFavorite({
     required int? fromIndex,
     required int? toIndex,
   }) =>
@@ -605,48 +630,48 @@ class MockWalletsService extends _i1.Mock implements _i2.WalletsService {
             #toIndex: toIndex,
           },
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
-  _i24.Future<bool> checkForDuplicate(String? name) => (super.noSuchMethod(
+  _i26.Future<bool> checkForDuplicate(String? name) => (super.noSuchMethod(
         Invocation.method(
           #checkForDuplicate,
           [name],
         ),
-        returnValue: _i24.Future<bool>.value(false),
-      ) as _i24.Future<bool>);
+        returnValue: _i26.Future<bool>.value(false),
+      ) as _i26.Future<bool>);
   @override
-  _i24.Future<String?> getWalletId(String? walletName) => (super.noSuchMethod(
+  _i26.Future<String?> getWalletId(String? walletName) => (super.noSuchMethod(
         Invocation.method(
           #getWalletId,
           [walletName],
         ),
-        returnValue: _i24.Future<String?>.value(),
-      ) as _i24.Future<String?>);
+        returnValue: _i26.Future<String?>.value(),
+      ) as _i26.Future<String?>);
   @override
-  _i24.Future<bool> isMnemonicVerified({required String? walletId}) =>
+  _i26.Future<bool> isMnemonicVerified({required String? walletId}) =>
       (super.noSuchMethod(
         Invocation.method(
           #isMnemonicVerified,
           [],
           {#walletId: walletId},
         ),
-        returnValue: _i24.Future<bool>.value(false),
-      ) as _i24.Future<bool>);
+        returnValue: _i26.Future<bool>.value(false),
+      ) as _i26.Future<bool>);
   @override
-  _i24.Future<void> setMnemonicVerified({required String? walletId}) =>
+  _i26.Future<void> setMnemonicVerified({required String? walletId}) =>
       (super.noSuchMethod(
         Invocation.method(
           #setMnemonicVerified,
           [],
           {#walletId: walletId},
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
-  _i24.Future<int> deleteWallet(
+  _i26.Future<int> deleteWallet(
     String? name,
     bool? shouldNotifyListeners,
   ) =>
@@ -658,20 +683,20 @@ class MockWalletsService extends _i1.Mock implements _i2.WalletsService {
             shouldNotifyListeners,
           ],
         ),
-        returnValue: _i24.Future<int>.value(0),
-      ) as _i24.Future<int>);
+        returnValue: _i26.Future<int>.value(0),
+      ) as _i26.Future<int>);
   @override
-  _i24.Future<void> refreshWallets(bool? shouldNotifyListeners) =>
+  _i26.Future<void> refreshWallets(bool? shouldNotifyListeners) =>
       (super.noSuchMethod(
         Invocation.method(
           #refreshWallets,
           [shouldNotifyListeners],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
-  void addListener(_i26.VoidCallback? listener) => super.noSuchMethod(
+  void addListener(_i28.VoidCallback? listener) => super.noSuchMethod(
         Invocation.method(
           #addListener,
           [listener],
@@ -679,7 +704,7 @@ class MockWalletsService extends _i1.Mock implements _i2.WalletsService {
         returnValueForMissingStub: null,
       );
   @override
-  void removeListener(_i26.VoidCallback? listener) => super.noSuchMethod(
+  void removeListener(_i28.VoidCallback? listener) => super.noSuchMethod(
         Invocation.method(
           #removeListener,
           [listener],
@@ -721,33 +746,33 @@ class MockNodeService extends _i1.Mock implements _i3.NodeService {
         ),
       ) as _i7.SecureStorageInterface);
   @override
-  List<_i27.NodeModel> get primaryNodes => (super.noSuchMethod(
+  List<_i29.NodeModel> get primaryNodes => (super.noSuchMethod(
         Invocation.getter(#primaryNodes),
-        returnValue: <_i27.NodeModel>[],
-      ) as List<_i27.NodeModel>);
+        returnValue: <_i29.NodeModel>[],
+      ) as List<_i29.NodeModel>);
   @override
-  List<_i27.NodeModel> get nodes => (super.noSuchMethod(
+  List<_i29.NodeModel> get nodes => (super.noSuchMethod(
         Invocation.getter(#nodes),
-        returnValue: <_i27.NodeModel>[],
-      ) as List<_i27.NodeModel>);
+        returnValue: <_i29.NodeModel>[],
+      ) as List<_i29.NodeModel>);
   @override
   bool get hasListeners => (super.noSuchMethod(
         Invocation.getter(#hasListeners),
         returnValue: false,
       ) as bool);
   @override
-  _i24.Future<void> updateDefaults() => (super.noSuchMethod(
+  _i26.Future<void> updateDefaults() => (super.noSuchMethod(
         Invocation.method(
           #updateDefaults,
           [],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
-  _i24.Future<void> setPrimaryNodeFor({
-    required _i23.Coin? coin,
-    required _i27.NodeModel? node,
+  _i26.Future<void> setPrimaryNodeFor({
+    required _i25.Coin? coin,
+    required _i29.NodeModel? node,
     bool? shouldNotifyListeners = false,
   }) =>
       (super.noSuchMethod(
@@ -760,44 +785,44 @@ class MockNodeService extends _i1.Mock implements _i3.NodeService {
             #shouldNotifyListeners: shouldNotifyListeners,
           },
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
-  _i27.NodeModel? getPrimaryNodeFor({required _i23.Coin? coin}) =>
+  _i29.NodeModel? getPrimaryNodeFor({required _i25.Coin? coin}) =>
       (super.noSuchMethod(Invocation.method(
         #getPrimaryNodeFor,
         [],
         {#coin: coin},
-      )) as _i27.NodeModel?);
+      )) as _i29.NodeModel?);
   @override
-  List<_i27.NodeModel> getNodesFor(_i23.Coin? coin) => (super.noSuchMethod(
+  List<_i29.NodeModel> getNodesFor(_i25.Coin? coin) => (super.noSuchMethod(
         Invocation.method(
           #getNodesFor,
           [coin],
         ),
-        returnValue: <_i27.NodeModel>[],
-      ) as List<_i27.NodeModel>);
+        returnValue: <_i29.NodeModel>[],
+      ) as List<_i29.NodeModel>);
   @override
-  _i27.NodeModel? getNodeById({required String? id}) =>
+  _i29.NodeModel? getNodeById({required String? id}) =>
       (super.noSuchMethod(Invocation.method(
         #getNodeById,
         [],
         {#id: id},
-      )) as _i27.NodeModel?);
+      )) as _i29.NodeModel?);
   @override
-  List<_i27.NodeModel> failoverNodesFor({required _i23.Coin? coin}) =>
+  List<_i29.NodeModel> failoverNodesFor({required _i25.Coin? coin}) =>
       (super.noSuchMethod(
         Invocation.method(
           #failoverNodesFor,
           [],
           {#coin: coin},
         ),
-        returnValue: <_i27.NodeModel>[],
-      ) as List<_i27.NodeModel>);
+        returnValue: <_i29.NodeModel>[],
+      ) as List<_i29.NodeModel>);
   @override
-  _i24.Future<void> add(
-    _i27.NodeModel? node,
+  _i26.Future<void> add(
+    _i29.NodeModel? node,
     String? password,
     bool? shouldNotifyListeners,
   ) =>
@@ -810,11 +835,11 @@ class MockNodeService extends _i1.Mock implements _i3.NodeService {
             shouldNotifyListeners,
           ],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
-  _i24.Future<void> delete(
+  _i26.Future<void> delete(
     String? id,
     bool? shouldNotifyListeners,
   ) =>
@@ -826,11 +851,11 @@ class MockNodeService extends _i1.Mock implements _i3.NodeService {
             shouldNotifyListeners,
           ],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
-  _i24.Future<void> setEnabledState(
+  _i26.Future<void> setEnabledState(
     String? id,
     bool? enabled,
     bool? shouldNotifyListeners,
@@ -844,12 +869,12 @@ class MockNodeService extends _i1.Mock implements _i3.NodeService {
             shouldNotifyListeners,
           ],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
-  _i24.Future<void> edit(
-    _i27.NodeModel? editedNode,
+  _i26.Future<void> edit(
+    _i29.NodeModel? editedNode,
     String? password,
     bool? shouldNotifyListeners,
   ) =>
@@ -862,20 +887,20 @@ class MockNodeService extends _i1.Mock implements _i3.NodeService {
             shouldNotifyListeners,
           ],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
-  _i24.Future<void> updateCommunityNodes() => (super.noSuchMethod(
+  _i26.Future<void> updateCommunityNodes() => (super.noSuchMethod(
         Invocation.method(
           #updateCommunityNodes,
           [],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
-  void addListener(_i26.VoidCallback? listener) => super.noSuchMethod(
+  void addListener(_i28.VoidCallback? listener) => super.noSuchMethod(
         Invocation.method(
           #addListener,
           [listener],
@@ -883,7 +908,7 @@ class MockNodeService extends _i1.Mock implements _i3.NodeService {
         returnValueForMissingStub: null,
       );
   @override
-  void removeListener(_i26.VoidCallback? listener) => super.noSuchMethod(
+  void removeListener(_i28.VoidCallback? listener) => super.noSuchMethod(
         Invocation.method(
           #removeListener,
           [listener],
@@ -911,13 +936,13 @@ class MockNodeService extends _i1.Mock implements _i3.NodeService {
 /// A class which mocks [BitcoinWallet].
 ///
 /// See the documentation for Mockito's code generation for more information.
-class MockBitcoinWallet extends _i1.Mock implements _i28.BitcoinWallet {
+class MockBitcoinWallet extends _i1.Mock implements _i30.BitcoinWallet {
   MockBitcoinWallet() {
     _i1.throwOnMissingStub(this);
   }
 
   @override
-  set timer(_i24.Timer? _timer) => super.noSuchMethod(
+  set timer(_i26.Timer? _timer) => super.noSuchMethod(
         Invocation.setter(
           #timer,
           _timer,
@@ -994,74 +1019,74 @@ class MockBitcoinWallet extends _i1.Mock implements _i28.BitcoinWallet {
         returnValue: false,
       ) as bool);
   @override
-  _i23.Coin get coin => (super.noSuchMethod(
+  _i25.Coin get coin => (super.noSuchMethod(
         Invocation.getter(#coin),
-        returnValue: _i23.Coin.bitcoin,
-      ) as _i23.Coin);
+        returnValue: _i25.Coin.bitcoin,
+      ) as _i25.Coin);
   @override
-  _i24.Future<List<_i18.UTXO>> get utxos => (super.noSuchMethod(
+  _i26.Future<List<_i19.UTXO>> get utxos => (super.noSuchMethod(
         Invocation.getter(#utxos),
-        returnValue: _i24.Future<List<_i18.UTXO>>.value(<_i18.UTXO>[]),
-      ) as _i24.Future<List<_i18.UTXO>>);
+        returnValue: _i26.Future<List<_i19.UTXO>>.value(<_i19.UTXO>[]),
+      ) as _i26.Future<List<_i19.UTXO>>);
   @override
-  _i24.Future<List<_i18.Transaction>> get transactions => (super.noSuchMethod(
+  _i26.Future<List<_i19.Transaction>> get transactions => (super.noSuchMethod(
         Invocation.getter(#transactions),
         returnValue:
-            _i24.Future<List<_i18.Transaction>>.value(<_i18.Transaction>[]),
-      ) as _i24.Future<List<_i18.Transaction>>);
+            _i26.Future<List<_i19.Transaction>>.value(<_i19.Transaction>[]),
+      ) as _i26.Future<List<_i19.Transaction>>);
   @override
-  _i24.Future<String> get currentReceivingAddress => (super.noSuchMethod(
+  _i26.Future<String> get currentReceivingAddress => (super.noSuchMethod(
         Invocation.getter(#currentReceivingAddress),
-        returnValue: _i24.Future<String>.value(''),
-      ) as _i24.Future<String>);
+        returnValue: _i26.Future<String>.value(''),
+      ) as _i26.Future<String>);
   @override
-  _i24.Future<String> get currentChangeAddress => (super.noSuchMethod(
+  _i26.Future<String> get currentChangeAddress => (super.noSuchMethod(
         Invocation.getter(#currentChangeAddress),
-        returnValue: _i24.Future<String>.value(''),
-      ) as _i24.Future<String>);
+        returnValue: _i26.Future<String>.value(''),
+      ) as _i26.Future<String>);
   @override
-  _i24.Future<String> get currentChangeAddressP2PKH => (super.noSuchMethod(
+  _i26.Future<String> get currentChangeAddressP2PKH => (super.noSuchMethod(
         Invocation.getter(#currentChangeAddressP2PKH),
-        returnValue: _i24.Future<String>.value(''),
-      ) as _i24.Future<String>);
+        returnValue: _i26.Future<String>.value(''),
+      ) as _i26.Future<String>);
   @override
   bool get hasCalledExit => (super.noSuchMethod(
         Invocation.getter(#hasCalledExit),
         returnValue: false,
       ) as bool);
   @override
-  _i24.Future<_i9.FeeObject> get fees => (super.noSuchMethod(
+  _i26.Future<_i9.FeeObject> get fees => (super.noSuchMethod(
         Invocation.getter(#fees),
-        returnValue: _i24.Future<_i9.FeeObject>.value(_FakeFeeObject_6(
+        returnValue: _i26.Future<_i9.FeeObject>.value(_FakeFeeObject_6(
           this,
           Invocation.getter(#fees),
         )),
-      ) as _i24.Future<_i9.FeeObject>);
+      ) as _i26.Future<_i9.FeeObject>);
   @override
-  _i24.Future<int> get maxFee => (super.noSuchMethod(
+  _i26.Future<int> get maxFee => (super.noSuchMethod(
         Invocation.getter(#maxFee),
-        returnValue: _i24.Future<int>.value(0),
-      ) as _i24.Future<int>);
+        returnValue: _i26.Future<int>.value(0),
+      ) as _i26.Future<int>);
   @override
-  _i24.Future<List<String>> get mnemonic => (super.noSuchMethod(
+  _i26.Future<List<String>> get mnemonic => (super.noSuchMethod(
         Invocation.getter(#mnemonic),
-        returnValue: _i24.Future<List<String>>.value(<String>[]),
-      ) as _i24.Future<List<String>>);
+        returnValue: _i26.Future<List<String>>.value(<String>[]),
+      ) as _i26.Future<List<String>>);
   @override
-  _i24.Future<String?> get mnemonicString => (super.noSuchMethod(
+  _i26.Future<String?> get mnemonicString => (super.noSuchMethod(
         Invocation.getter(#mnemonicString),
-        returnValue: _i24.Future<String?>.value(),
-      ) as _i24.Future<String?>);
+        returnValue: _i26.Future<String?>.value(),
+      ) as _i26.Future<String?>);
   @override
-  _i24.Future<String?> get mnemonicPassphrase => (super.noSuchMethod(
+  _i26.Future<String?> get mnemonicPassphrase => (super.noSuchMethod(
         Invocation.getter(#mnemonicPassphrase),
-        returnValue: _i24.Future<String?>.value(),
-      ) as _i24.Future<String?>);
+        returnValue: _i26.Future<String?>.value(),
+      ) as _i26.Future<String?>);
   @override
-  _i24.Future<int> get chainHeight => (super.noSuchMethod(
+  _i26.Future<int> get chainHeight => (super.noSuchMethod(
         Invocation.getter(#chainHeight),
-        returnValue: _i24.Future<int>.value(0),
-      ) as _i24.Future<int>);
+        returnValue: _i26.Future<int>.value(0),
+      ) as _i26.Future<int>);
   @override
   int get storedChainHeight => (super.noSuchMethod(
         Invocation.getter(#storedChainHeight),
@@ -1133,10 +1158,10 @@ class MockBitcoinWallet extends _i1.Mock implements _i28.BitcoinWallet {
         ),
       ) as _i12.Balance);
   @override
-  _i24.Future<String> get xpub => (super.noSuchMethod(
+  _i26.Future<String> get xpub => (super.noSuchMethod(
         Invocation.getter(#xpub),
-        returnValue: _i24.Future<String>.value(''),
-      ) as _i24.Future<String>);
+        returnValue: _i26.Future<String>.value(''),
+      ) as _i26.Future<String>);
   @override
   set onIsActiveWalletChanged(void Function(bool)? _onIsActiveWalletChanged) =>
       super.noSuchMethod(
@@ -1163,26 +1188,26 @@ class MockBitcoinWallet extends _i1.Mock implements _i28.BitcoinWallet {
         ),
       ) as _i14.NetworkType);
   @override
-  _i24.Future<void> exit() => (super.noSuchMethod(
+  _i26.Future<void> exit() => (super.noSuchMethod(
         Invocation.method(
           #exit,
           [],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
-  _i29.DerivePathType addressType({required String? address}) =>
+  _i31.DerivePathType addressType({required String? address}) =>
       (super.noSuchMethod(
         Invocation.method(
           #addressType,
           [],
           {#address: address},
         ),
-        returnValue: _i29.DerivePathType.bip44,
-      ) as _i29.DerivePathType);
+        returnValue: _i31.DerivePathType.bip44,
+      ) as _i31.DerivePathType);
   @override
-  _i24.Future<void> recoverFromMnemonic({
+  _i26.Future<void> recoverFromMnemonic({
     required String? mnemonic,
     String? mnemonicPassphrase,
     required int? maxUnusedAddressGap,
@@ -1201,47 +1226,47 @@ class MockBitcoinWallet extends _i1.Mock implements _i28.BitcoinWallet {
             #height: height,
           },
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
-  _i24.Future<void> getTransactionCacheEarly(List<String>? allAddresses) =>
+  _i26.Future<void> getTransactionCacheEarly(List<String>? allAddresses) =>
       (super.noSuchMethod(
         Invocation.method(
           #getTransactionCacheEarly,
           [allAddresses],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
-  _i24.Future<bool> refreshIfThereIsNewData() => (super.noSuchMethod(
+  _i26.Future<bool> refreshIfThereIsNewData() => (super.noSuchMethod(
         Invocation.method(
           #refreshIfThereIsNewData,
           [],
         ),
-        returnValue: _i24.Future<bool>.value(false),
-      ) as _i24.Future<bool>);
+        returnValue: _i26.Future<bool>.value(false),
+      ) as _i26.Future<bool>);
   @override
-  _i24.Future<void> getAllTxsToWatch() => (super.noSuchMethod(
+  _i26.Future<void> getAllTxsToWatch() => (super.noSuchMethod(
         Invocation.method(
           #getAllTxsToWatch,
           [],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
-  _i24.Future<void> refresh() => (super.noSuchMethod(
+  _i26.Future<void> refresh() => (super.noSuchMethod(
         Invocation.method(
           #refresh,
           [],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
-  _i24.Future<Map<String, dynamic>> prepareSend({
+  _i26.Future<Map<String, dynamic>> prepareSend({
     required String? address,
     required _i15.Amount? amount,
     Map<String, dynamic>? args,
@@ -1257,26 +1282,26 @@ class MockBitcoinWallet extends _i1.Mock implements _i28.BitcoinWallet {
           },
         ),
         returnValue:
-            _i24.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
-      ) as _i24.Future<Map<String, dynamic>>);
+            _i26.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
+      ) as _i26.Future<Map<String, dynamic>>);
   @override
-  _i24.Future<String> confirmSend({required Map<String, dynamic>? txData}) =>
+  _i26.Future<String> confirmSend({required Map<String, dynamic>? txData}) =>
       (super.noSuchMethod(
         Invocation.method(
           #confirmSend,
           [],
           {#txData: txData},
         ),
-        returnValue: _i24.Future<String>.value(''),
-      ) as _i24.Future<String>);
+        returnValue: _i26.Future<String>.value(''),
+      ) as _i26.Future<String>);
   @override
-  _i24.Future<bool> testNetworkConnection() => (super.noSuchMethod(
+  _i26.Future<bool> testNetworkConnection() => (super.noSuchMethod(
         Invocation.method(
           #testNetworkConnection,
           [],
         ),
-        returnValue: _i24.Future<bool>.value(false),
-      ) as _i24.Future<bool>);
+        returnValue: _i26.Future<bool>.value(false),
+      ) as _i26.Future<bool>);
   @override
   void startNetworkAlivePinging() => super.noSuchMethod(
         Invocation.method(
@@ -1294,35 +1319,35 @@ class MockBitcoinWallet extends _i1.Mock implements _i28.BitcoinWallet {
         returnValueForMissingStub: null,
       );
   @override
-  _i24.Future<void> initializeNew(
+  _i26.Future<void> initializeNew(
           ({String mnemonicPassphrase, int wordCount})? data) =>
       (super.noSuchMethod(
         Invocation.method(
           #initializeNew,
           [data],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
-  _i24.Future<void> initializeExisting() => (super.noSuchMethod(
+  _i26.Future<void> initializeExisting() => (super.noSuchMethod(
         Invocation.method(
           #initializeExisting,
           [],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
-  _i24.Future<void> updateSentCachedTxData(Map<String, dynamic>? txData) =>
+  _i26.Future<void> updateSentCachedTxData(Map<String, dynamic>? txData) =>
       (super.noSuchMethod(
         Invocation.method(
           #updateSentCachedTxData,
           [txData],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
   bool validateAddress(String? address) => (super.noSuchMethod(
         Invocation.method(
@@ -1332,70 +1357,70 @@ class MockBitcoinWallet extends _i1.Mock implements _i28.BitcoinWallet {
         returnValue: false,
       ) as bool);
   @override
-  _i24.Future<void> updateNode(bool? shouldRefresh) => (super.noSuchMethod(
+  _i26.Future<void> updateNode(bool? shouldRefresh) => (super.noSuchMethod(
         Invocation.method(
           #updateNode,
           [shouldRefresh],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
-  _i24.Future<_i10.ElectrumXNode> getCurrentNode() => (super.noSuchMethod(
+  _i26.Future<_i10.ElectrumXNode> getCurrentNode() => (super.noSuchMethod(
         Invocation.method(
           #getCurrentNode,
           [],
         ),
         returnValue:
-            _i24.Future<_i10.ElectrumXNode>.value(_FakeElectrumXNode_12(
+            _i26.Future<_i10.ElectrumXNode>.value(_FakeElectrumXNode_12(
           this,
           Invocation.method(
             #getCurrentNode,
             [],
           ),
         )),
-      ) as _i24.Future<_i10.ElectrumXNode>);
+      ) as _i26.Future<_i10.ElectrumXNode>);
   @override
-  _i24.Future<List<Map<String, dynamic>>> fastFetch(
+  _i26.Future<List<Map<String, dynamic>>> fastFetch(
           List<String>? allTxHashes) =>
       (super.noSuchMethod(
         Invocation.method(
           #fastFetch,
           [allTxHashes],
         ),
-        returnValue: _i24.Future<List<Map<String, dynamic>>>.value(
+        returnValue: _i26.Future<List<Map<String, dynamic>>>.value(
             <Map<String, dynamic>>[]),
-      ) as _i24.Future<List<Map<String, dynamic>>>);
+      ) as _i26.Future<List<Map<String, dynamic>>>);
   @override
-  _i24.Future<int> getTxCount({required String? address}) =>
+  _i26.Future<int> getTxCount({required String? address}) =>
       (super.noSuchMethod(
         Invocation.method(
           #getTxCount,
           [],
           {#address: address},
         ),
-        returnValue: _i24.Future<int>.value(0),
-      ) as _i24.Future<int>);
+        returnValue: _i26.Future<int>.value(0),
+      ) as _i26.Future<int>);
   @override
-  _i24.Future<void> checkCurrentReceivingAddressesForTransactions() =>
+  _i26.Future<void> checkCurrentReceivingAddressesForTransactions() =>
       (super.noSuchMethod(
         Invocation.method(
           #checkCurrentReceivingAddressesForTransactions,
           [],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
-  _i24.Future<void> checkCurrentChangeAddressesForTransactions() =>
+  _i26.Future<void> checkCurrentChangeAddressesForTransactions() =>
       (super.noSuchMethod(
         Invocation.method(
           #checkCurrentChangeAddressesForTransactions,
           [],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
   int estimateTxFee({
     required int? vSize,
@@ -1421,7 +1446,7 @@ class MockBitcoinWallet extends _i1.Mock implements _i28.BitcoinWallet {
     required bool? isSendAll,
     int? satsPerVByte,
     int? additionalOutputs = 0,
-    List<_i18.UTXO>? utxos,
+    List<_i19.UTXO>? utxos,
   }) =>
       super.noSuchMethod(Invocation.method(
         #coinSelection,
@@ -1438,19 +1463,19 @@ class MockBitcoinWallet extends _i1.Mock implements _i28.BitcoinWallet {
         },
       ));
   @override
-  _i24.Future<List<_i30.SigningData>> fetchBuildTxData(
-          List<_i18.UTXO>? utxosToUse) =>
+  _i26.Future<List<_i32.SigningData>> fetchBuildTxData(
+          List<_i19.UTXO>? utxosToUse) =>
       (super.noSuchMethod(
         Invocation.method(
           #fetchBuildTxData,
           [utxosToUse],
         ),
         returnValue:
-            _i24.Future<List<_i30.SigningData>>.value(<_i30.SigningData>[]),
-      ) as _i24.Future<List<_i30.SigningData>>);
+            _i26.Future<List<_i32.SigningData>>.value(<_i32.SigningData>[]),
+      ) as _i26.Future<List<_i32.SigningData>>);
   @override
-  _i24.Future<Map<String, dynamic>> buildTransaction({
-    required List<_i30.SigningData>? utxoSigningData,
+  _i26.Future<Map<String, dynamic>> buildTransaction({
+    required List<_i32.SigningData>? utxoSigningData,
     required List<String>? recipients,
     required List<int>? satoshiAmounts,
   }) =>
@@ -1465,10 +1490,10 @@ class MockBitcoinWallet extends _i1.Mock implements _i28.BitcoinWallet {
           },
         ),
         returnValue:
-            _i24.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
-      ) as _i24.Future<Map<String, dynamic>>);
+            _i26.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
+      ) as _i26.Future<Map<String, dynamic>>);
   @override
-  _i24.Future<void> fullRescan(
+  _i26.Future<void> fullRescan(
     int? maxUnusedAddressGap,
     int? maxNumberOfIndexesToCheck,
   ) =>
@@ -1480,11 +1505,11 @@ class MockBitcoinWallet extends _i1.Mock implements _i28.BitcoinWallet {
             maxNumberOfIndexesToCheck,
           ],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
-  _i24.Future<_i15.Amount> estimateFeeFor(
+  _i26.Future<_i15.Amount> estimateFeeFor(
     _i15.Amount? amount,
     int? feeRate,
   ) =>
@@ -1496,7 +1521,7 @@ class MockBitcoinWallet extends _i1.Mock implements _i28.BitcoinWallet {
             feeRate,
           ],
         ),
-        returnValue: _i24.Future<_i15.Amount>.value(_FakeAmount_13(
+        returnValue: _i26.Future<_i15.Amount>.value(_FakeAmount_13(
           this,
           Invocation.method(
             #estimateFeeFor,
@@ -1506,7 +1531,7 @@ class MockBitcoinWallet extends _i1.Mock implements _i28.BitcoinWallet {
             ],
           ),
         )),
-      ) as _i24.Future<_i15.Amount>);
+      ) as _i26.Future<_i15.Amount>);
   @override
   _i15.Amount roughFeeEstimate(
     int? inputCount,
@@ -1535,32 +1560,32 @@ class MockBitcoinWallet extends _i1.Mock implements _i28.BitcoinWallet {
         ),
       ) as _i15.Amount);
   @override
-  _i24.Future<_i15.Amount> sweepAllEstimate(int? feeRate) =>
+  _i26.Future<_i15.Amount> sweepAllEstimate(int? feeRate) =>
       (super.noSuchMethod(
         Invocation.method(
           #sweepAllEstimate,
           [feeRate],
         ),
-        returnValue: _i24.Future<_i15.Amount>.value(_FakeAmount_13(
+        returnValue: _i26.Future<_i15.Amount>.value(_FakeAmount_13(
           this,
           Invocation.method(
             #sweepAllEstimate,
             [feeRate],
           ),
         )),
-      ) as _i24.Future<_i15.Amount>);
+      ) as _i26.Future<_i15.Amount>);
   @override
-  _i24.Future<bool> generateNewAddress() => (super.noSuchMethod(
+  _i26.Future<bool> generateNewAddress() => (super.noSuchMethod(
         Invocation.method(
           #generateNewAddress,
           [],
         ),
-        returnValue: _i24.Future<bool>.value(false),
-      ) as _i24.Future<bool>);
+        returnValue: _i26.Future<bool>.value(false),
+      ) as _i26.Future<bool>);
   @override
   void initCache(
     String? walletId,
-    _i23.Coin? coin,
+    _i25.Coin? coin,
   ) =>
       super.noSuchMethod(
         Invocation.method(
@@ -1573,14 +1598,14 @@ class MockBitcoinWallet extends _i1.Mock implements _i28.BitcoinWallet {
         returnValueForMissingStub: null,
       );
   @override
-  _i24.Future<void> updateCachedId(String? id) => (super.noSuchMethod(
+  _i26.Future<void> updateCachedId(String? id) => (super.noSuchMethod(
         Invocation.method(
           #updateCachedId,
           [id],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
   int getCachedChainHeight() => (super.noSuchMethod(
         Invocation.method(
@@ -1590,14 +1615,14 @@ class MockBitcoinWallet extends _i1.Mock implements _i28.BitcoinWallet {
         returnValue: 0,
       ) as int);
   @override
-  _i24.Future<void> updateCachedChainHeight(int? height) => (super.noSuchMethod(
+  _i26.Future<void> updateCachedChainHeight(int? height) => (super.noSuchMethod(
         Invocation.method(
           #updateCachedChainHeight,
           [height],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
   bool getCachedIsFavorite() => (super.noSuchMethod(
         Invocation.method(
@@ -1607,15 +1632,15 @@ class MockBitcoinWallet extends _i1.Mock implements _i28.BitcoinWallet {
         returnValue: false,
       ) as bool);
   @override
-  _i24.Future<void> updateCachedIsFavorite(bool? isFavorite) =>
+  _i26.Future<void> updateCachedIsFavorite(bool? isFavorite) =>
       (super.noSuchMethod(
         Invocation.method(
           #updateCachedIsFavorite,
           [isFavorite],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
   _i12.Balance getCachedBalance() => (super.noSuchMethod(
         Invocation.method(
@@ -1631,15 +1656,15 @@ class MockBitcoinWallet extends _i1.Mock implements _i28.BitcoinWallet {
         ),
       ) as _i12.Balance);
   @override
-  _i24.Future<void> updateCachedBalance(_i12.Balance? balance) =>
+  _i26.Future<void> updateCachedBalance(_i12.Balance? balance) =>
       (super.noSuchMethod(
         Invocation.method(
           #updateCachedBalance,
           [balance],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
   _i12.Balance getCachedBalanceSecondary() => (super.noSuchMethod(
         Invocation.method(
@@ -1655,15 +1680,15 @@ class MockBitcoinWallet extends _i1.Mock implements _i28.BitcoinWallet {
         ),
       ) as _i12.Balance);
   @override
-  _i24.Future<void> updateCachedBalanceSecondary(_i12.Balance? balance) =>
+  _i26.Future<void> updateCachedBalanceSecondary(_i12.Balance? balance) =>
       (super.noSuchMethod(
         Invocation.method(
           #updateCachedBalanceSecondary,
           [balance],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
   List<String> getWalletTokenContractAddresses() => (super.noSuchMethod(
         Invocation.method(
@@ -1673,16 +1698,16 @@ class MockBitcoinWallet extends _i1.Mock implements _i28.BitcoinWallet {
         returnValue: <String>[],
       ) as List<String>);
   @override
-  _i24.Future<void> updateWalletTokenContractAddresses(
+  _i26.Future<void> updateWalletTokenContractAddresses(
           List<String>? contractAddresses) =>
       (super.noSuchMethod(
         Invocation.method(
           #updateWalletTokenContractAddresses,
           [contractAddresses],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
   void initWalletDB({_i13.MainDB? mockableOverride}) => super.noSuchMethod(
         Invocation.method(
@@ -1693,11 +1718,45 @@ class MockBitcoinWallet extends _i1.Mock implements _i28.BitcoinWallet {
         returnValueForMissingStub: null,
       );
   @override
-  _i24.Future<_i16.Tuple2<_i18.Transaction, _i18.Address>> parseTransaction(
+  _i26.Future<_i16.TransactionV2> getTransaction(
+    String? txHash,
+    _i25.Coin? coin,
+    String? walletId,
+    _i11.CachedElectrumX? cachedElectrumX, [
+    String? debugTitle,
+  ]) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #getTransaction,
+          [
+            txHash,
+            coin,
+            walletId,
+            cachedElectrumX,
+            debugTitle,
+          ],
+        ),
+        returnValue:
+            _i26.Future<_i16.TransactionV2>.value(_FakeTransactionV2_14(
+          this,
+          Invocation.method(
+            #getTransaction,
+            [
+              txHash,
+              coin,
+              walletId,
+              cachedElectrumX,
+              debugTitle,
+            ],
+          ),
+        )),
+      ) as _i26.Future<_i16.TransactionV2>);
+  @override
+  _i26.Future<_i17.Tuple2<_i19.Transaction, _i19.Address>> parseTransaction(
     Map<String, dynamic>? txData,
     dynamic electrumxClient,
-    List<_i18.Address>? myAddresses,
-    _i23.Coin? coin,
+    List<_i19.Address>? myAddresses,
+    _i25.Coin? coin,
     int? minConfirms,
     String? walletId,
   ) =>
@@ -1714,8 +1773,8 @@ class MockBitcoinWallet extends _i1.Mock implements _i28.BitcoinWallet {
           ],
         ),
         returnValue:
-            _i24.Future<_i16.Tuple2<_i18.Transaction, _i18.Address>>.value(
-                _FakeTuple2_14<_i18.Transaction, _i18.Address>(
+            _i26.Future<_i17.Tuple2<_i19.Transaction, _i19.Address>>.value(
+                _FakeTuple2_15<_i19.Transaction, _i19.Address>(
           this,
           Invocation.method(
             #parseTransaction,
@@ -1729,37 +1788,37 @@ class MockBitcoinWallet extends _i1.Mock implements _i28.BitcoinWallet {
             ],
           ),
         )),
-      ) as _i24.Future<_i16.Tuple2<_i18.Transaction, _i18.Address>>);
+      ) as _i26.Future<_i17.Tuple2<_i19.Transaction, _i19.Address>>);
   @override
   void initPaynymWalletInterface({
     required String? walletId,
     required String? walletName,
     required _i14.NetworkType? network,
-    required _i23.Coin? coin,
+    required _i25.Coin? coin,
     required _i13.MainDB? db,
     required _i10.ElectrumX? electrumXClient,
     required _i7.SecureStorageInterface? secureStorage,
     required int? dustLimit,
     required int? dustLimitP2PKH,
     required int? minConfirms,
-    required _i24.Future<String?> Function()? getMnemonicString,
-    required _i24.Future<String?> Function()? getMnemonicPassphrase,
-    required _i24.Future<int> Function()? getChainHeight,
-    required _i24.Future<String> Function()? getCurrentChangeAddress,
+    required _i26.Future<String?> Function()? getMnemonicString,
+    required _i26.Future<String?> Function()? getMnemonicPassphrase,
+    required _i26.Future<int> Function()? getChainHeight,
+    required _i26.Future<String> Function()? getCurrentChangeAddress,
     required int Function({
       required int feeRatePerKB,
       required int vSize,
     })? estimateTxFee,
-    required _i24.Future<Map<String, dynamic>> Function({
+    required _i26.Future<Map<String, dynamic>> Function({
       required String address,
       required _i15.Amount amount,
       Map<String, dynamic>? args,
     })? prepareSend,
-    required _i24.Future<int> Function({required String address})? getTxCount,
-    required _i24.Future<List<_i30.SigningData>> Function(List<_i18.UTXO>)?
+    required _i26.Future<int> Function({required String address})? getTxCount,
+    required _i26.Future<List<_i32.SigningData>> Function(List<_i19.UTXO>)?
         fetchBuildTxData,
-    required _i24.Future<void> Function()? refresh,
-    required _i24.Future<void> Function()? checkChangeAddressForTransactions,
+    required _i26.Future<void> Function()? refresh,
+    required _i26.Future<void> Function()? checkChangeAddressForTransactions,
   }) =>
       super.noSuchMethod(
         Invocation.method(
@@ -1792,21 +1851,21 @@ class MockBitcoinWallet extends _i1.Mock implements _i28.BitcoinWallet {
         returnValueForMissingStub: null,
       );
   @override
-  _i24.Future<_i17.BIP32> getBip47BaseNode() => (super.noSuchMethod(
+  _i26.Future<_i18.BIP32> getBip47BaseNode() => (super.noSuchMethod(
         Invocation.method(
           #getBip47BaseNode,
           [],
         ),
-        returnValue: _i24.Future<_i17.BIP32>.value(_FakeBIP32_15(
+        returnValue: _i26.Future<_i18.BIP32>.value(_FakeBIP32_16(
           this,
           Invocation.method(
             #getBip47BaseNode,
             [],
           ),
         )),
-      ) as _i24.Future<_i17.BIP32>);
+      ) as _i26.Future<_i18.BIP32>);
   @override
-  _i24.Future<_i31.Uint8List> getPrivateKeyForPaynymReceivingAddress({
+  _i26.Future<_i33.Uint8List> getPrivateKeyForPaynymReceivingAddress({
     required String? paymentCodeString,
     required int? index,
   }) =>
@@ -1819,11 +1878,11 @@ class MockBitcoinWallet extends _i1.Mock implements _i28.BitcoinWallet {
             #index: index,
           },
         ),
-        returnValue: _i24.Future<_i31.Uint8List>.value(_i31.Uint8List(0)),
-      ) as _i24.Future<_i31.Uint8List>);
+        returnValue: _i26.Future<_i33.Uint8List>.value(_i33.Uint8List(0)),
+      ) as _i26.Future<_i33.Uint8List>);
   @override
-  _i24.Future<_i18.Address> currentReceivingPaynymAddress({
-    required _i19.PaymentCode? sender,
+  _i26.Future<_i19.Address> currentReceivingPaynymAddress({
+    required _i20.PaymentCode? sender,
     required bool? isSegwit,
   }) =>
       (super.noSuchMethod(
@@ -1835,7 +1894,7 @@ class MockBitcoinWallet extends _i1.Mock implements _i28.BitcoinWallet {
             #isSegwit: isSegwit,
           },
         ),
-        returnValue: _i24.Future<_i18.Address>.value(_FakeAddress_16(
+        returnValue: _i26.Future<_i19.Address>.value(_FakeAddress_17(
           this,
           Invocation.method(
             #currentReceivingPaynymAddress,
@@ -1846,10 +1905,10 @@ class MockBitcoinWallet extends _i1.Mock implements _i28.BitcoinWallet {
             },
           ),
         )),
-      ) as _i24.Future<_i18.Address>);
+      ) as _i26.Future<_i19.Address>);
   @override
-  _i24.Future<void> checkCurrentPaynymReceivingAddressForTransactions({
-    required _i19.PaymentCode? sender,
+  _i26.Future<void> checkCurrentPaynymReceivingAddressForTransactions({
+    required _i20.PaymentCode? sender,
     required bool? isSegwit,
   }) =>
       (super.noSuchMethod(
@@ -1861,42 +1920,42 @@ class MockBitcoinWallet extends _i1.Mock implements _i28.BitcoinWallet {
             #isSegwit: isSegwit,
           },
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
-  _i24.Future<void> checkAllCurrentReceivingPaynymAddressesForTransactions() =>
+  _i26.Future<void> checkAllCurrentReceivingPaynymAddressesForTransactions() =>
       (super.noSuchMethod(
         Invocation.method(
           #checkAllCurrentReceivingPaynymAddressesForTransactions,
           [],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
-  _i24.Future<_i17.BIP32> deriveNotificationBip32Node() => (super.noSuchMethod(
+  _i26.Future<_i18.BIP32> deriveNotificationBip32Node() => (super.noSuchMethod(
         Invocation.method(
           #deriveNotificationBip32Node,
           [],
         ),
-        returnValue: _i24.Future<_i17.BIP32>.value(_FakeBIP32_15(
+        returnValue: _i26.Future<_i18.BIP32>.value(_FakeBIP32_16(
           this,
           Invocation.method(
             #deriveNotificationBip32Node,
             [],
           ),
         )),
-      ) as _i24.Future<_i17.BIP32>);
+      ) as _i26.Future<_i18.BIP32>);
   @override
-  _i24.Future<_i19.PaymentCode> getPaymentCode({required bool? isSegwit}) =>
+  _i26.Future<_i20.PaymentCode> getPaymentCode({required bool? isSegwit}) =>
       (super.noSuchMethod(
         Invocation.method(
           #getPaymentCode,
           [],
           {#isSegwit: isSegwit},
         ),
-        returnValue: _i24.Future<_i19.PaymentCode>.value(_FakePaymentCode_17(
+        returnValue: _i26.Future<_i20.PaymentCode>.value(_FakePaymentCode_18(
           this,
           Invocation.method(
             #getPaymentCode,
@@ -1904,28 +1963,28 @@ class MockBitcoinWallet extends _i1.Mock implements _i28.BitcoinWallet {
             {#isSegwit: isSegwit},
           ),
         )),
-      ) as _i24.Future<_i19.PaymentCode>);
+      ) as _i26.Future<_i20.PaymentCode>);
   @override
-  _i24.Future<_i31.Uint8List> signWithNotificationKey(_i31.Uint8List? data) =>
+  _i26.Future<_i33.Uint8List> signWithNotificationKey(_i33.Uint8List? data) =>
       (super.noSuchMethod(
         Invocation.method(
           #signWithNotificationKey,
           [data],
         ),
-        returnValue: _i24.Future<_i31.Uint8List>.value(_i31.Uint8List(0)),
-      ) as _i24.Future<_i31.Uint8List>);
+        returnValue: _i26.Future<_i33.Uint8List>.value(_i33.Uint8List(0)),
+      ) as _i26.Future<_i33.Uint8List>);
   @override
-  _i24.Future<String> signStringWithNotificationKey(String? data) =>
+  _i26.Future<String> signStringWithNotificationKey(String? data) =>
       (super.noSuchMethod(
         Invocation.method(
           #signStringWithNotificationKey,
           [data],
         ),
-        returnValue: _i24.Future<String>.value(''),
-      ) as _i24.Future<String>);
+        returnValue: _i26.Future<String>.value(''),
+      ) as _i26.Future<String>);
   @override
-  _i24.Future<Map<String, dynamic>> preparePaymentCodeSend({
-    required _i19.PaymentCode? paymentCode,
+  _i26.Future<Map<String, dynamic>> preparePaymentCodeSend({
+    required _i20.PaymentCode? paymentCode,
     required bool? isSegwit,
     required _i15.Amount? amount,
     Map<String, dynamic>? args,
@@ -1942,13 +2001,13 @@ class MockBitcoinWallet extends _i1.Mock implements _i28.BitcoinWallet {
           },
         ),
         returnValue:
-            _i24.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
-      ) as _i24.Future<Map<String, dynamic>>);
+            _i26.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
+      ) as _i26.Future<Map<String, dynamic>>);
   @override
-  _i24.Future<_i18.Address> nextUnusedSendAddressFrom({
-    required _i19.PaymentCode? pCode,
+  _i26.Future<_i19.Address> nextUnusedSendAddressFrom({
+    required _i20.PaymentCode? pCode,
     required bool? isSegwit,
-    required _i17.BIP32? privateKeyNode,
+    required _i18.BIP32? privateKeyNode,
     int? startIndex = 0,
   }) =>
       (super.noSuchMethod(
@@ -1962,7 +2021,7 @@ class MockBitcoinWallet extends _i1.Mock implements _i28.BitcoinWallet {
             #startIndex: startIndex,
           },
         ),
-        returnValue: _i24.Future<_i18.Address>.value(_FakeAddress_16(
+        returnValue: _i26.Future<_i19.Address>.value(_FakeAddress_17(
           this,
           Invocation.method(
             #nextUnusedSendAddressFrom,
@@ -1975,13 +2034,13 @@ class MockBitcoinWallet extends _i1.Mock implements _i28.BitcoinWallet {
             },
           ),
         )),
-      ) as _i24.Future<_i18.Address>);
+      ) as _i26.Future<_i19.Address>);
   @override
-  _i24.Future<Map<String, dynamic>> prepareNotificationTx({
+  _i26.Future<Map<String, dynamic>> prepareNotificationTx({
     required int? selectedTxFeeRate,
     required String? targetPaymentCodeString,
     int? additionalOutputs = 0,
-    List<_i18.UTXO>? utxos,
+    List<_i19.UTXO>? utxos,
   }) =>
       (super.noSuchMethod(
         Invocation.method(
@@ -1995,10 +2054,10 @@ class MockBitcoinWallet extends _i1.Mock implements _i28.BitcoinWallet {
           },
         ),
         returnValue:
-            _i24.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
-      ) as _i24.Future<Map<String, dynamic>>);
+            _i26.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
+      ) as _i26.Future<Map<String, dynamic>>);
   @override
-  _i24.Future<String> broadcastNotificationTx(
+  _i26.Future<String> broadcastNotificationTx(
           {required Map<String, dynamic>? preparedTx}) =>
       (super.noSuchMethod(
         Invocation.method(
@@ -2006,62 +2065,62 @@ class MockBitcoinWallet extends _i1.Mock implements _i28.BitcoinWallet {
           [],
           {#preparedTx: preparedTx},
         ),
-        returnValue: _i24.Future<String>.value(''),
-      ) as _i24.Future<String>);
+        returnValue: _i26.Future<String>.value(''),
+      ) as _i26.Future<String>);
   @override
-  _i24.Future<bool> hasConnected(String? paymentCodeString) =>
+  _i26.Future<bool> hasConnected(String? paymentCodeString) =>
       (super.noSuchMethod(
         Invocation.method(
           #hasConnected,
           [paymentCodeString],
         ),
-        returnValue: _i24.Future<bool>.value(false),
-      ) as _i24.Future<bool>);
+        returnValue: _i26.Future<bool>.value(false),
+      ) as _i26.Future<bool>);
   @override
-  _i24.Future<_i19.PaymentCode?> unBlindedPaymentCodeFromTransaction(
-          {required _i18.Transaction? transaction}) =>
+  _i26.Future<_i20.PaymentCode?> unBlindedPaymentCodeFromTransaction(
+          {required _i19.Transaction? transaction}) =>
       (super.noSuchMethod(
         Invocation.method(
           #unBlindedPaymentCodeFromTransaction,
           [],
           {#transaction: transaction},
         ),
-        returnValue: _i24.Future<_i19.PaymentCode?>.value(),
-      ) as _i24.Future<_i19.PaymentCode?>);
+        returnValue: _i26.Future<_i20.PaymentCode?>.value(),
+      ) as _i26.Future<_i20.PaymentCode?>);
   @override
-  _i24.Future<_i19.PaymentCode?> unBlindedPaymentCodeFromTransactionBad(
-          {required _i18.Transaction? transaction}) =>
+  _i26.Future<_i20.PaymentCode?> unBlindedPaymentCodeFromTransactionBad(
+          {required _i19.Transaction? transaction}) =>
       (super.noSuchMethod(
         Invocation.method(
           #unBlindedPaymentCodeFromTransactionBad,
           [],
           {#transaction: transaction},
         ),
-        returnValue: _i24.Future<_i19.PaymentCode?>.value(),
-      ) as _i24.Future<_i19.PaymentCode?>);
+        returnValue: _i26.Future<_i20.PaymentCode?>.value(),
+      ) as _i26.Future<_i20.PaymentCode?>);
   @override
-  _i24.Future<List<_i19.PaymentCode>>
+  _i26.Future<List<_i20.PaymentCode>>
       getAllPaymentCodesFromNotificationTransactions() => (super.noSuchMethod(
             Invocation.method(
               #getAllPaymentCodesFromNotificationTransactions,
               [],
             ),
             returnValue:
-                _i24.Future<List<_i19.PaymentCode>>.value(<_i19.PaymentCode>[]),
-          ) as _i24.Future<List<_i19.PaymentCode>>);
+                _i26.Future<List<_i20.PaymentCode>>.value(<_i20.PaymentCode>[]),
+          ) as _i26.Future<List<_i20.PaymentCode>>);
   @override
-  _i24.Future<void> checkForNotificationTransactionsTo(
+  _i26.Future<void> checkForNotificationTransactionsTo(
           Set<String>? otherCodeStrings) =>
       (super.noSuchMethod(
         Invocation.method(
           #checkForNotificationTransactionsTo,
           [otherCodeStrings],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
-  _i24.Future<void> restoreAllHistory({
+  _i26.Future<void> restoreAllHistory({
     required int? maxUnusedAddressGap,
     required int? maxNumberOfIndexesToCheck,
     required Set<String>? paymentCodeStrings,
@@ -2076,12 +2135,12 @@ class MockBitcoinWallet extends _i1.Mock implements _i28.BitcoinWallet {
             #paymentCodeStrings: paymentCodeStrings,
           },
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
-  _i24.Future<void> restoreHistoryWith({
-    required _i19.PaymentCode? other,
+  _i26.Future<void> restoreHistoryWith({
+    required _i20.PaymentCode? other,
     required bool? checkSegwitAsWell,
     required int? maxUnusedAddressGap,
     required int? maxNumberOfIndexesToCheck,
@@ -2097,58 +2156,58 @@ class MockBitcoinWallet extends _i1.Mock implements _i28.BitcoinWallet {
             #maxNumberOfIndexesToCheck: maxNumberOfIndexesToCheck,
           },
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
-  _i24.Future<_i18.Address> getMyNotificationAddress() => (super.noSuchMethod(
+  _i26.Future<_i19.Address> getMyNotificationAddress() => (super.noSuchMethod(
         Invocation.method(
           #getMyNotificationAddress,
           [],
         ),
-        returnValue: _i24.Future<_i18.Address>.value(_FakeAddress_16(
+        returnValue: _i26.Future<_i19.Address>.value(_FakeAddress_17(
           this,
           Invocation.method(
             #getMyNotificationAddress,
             [],
           ),
         )),
-      ) as _i24.Future<_i18.Address>);
+      ) as _i26.Future<_i19.Address>);
   @override
-  _i24.Future<List<String>> lookupKey(String? paymentCodeString) =>
+  _i26.Future<List<String>> lookupKey(String? paymentCodeString) =>
       (super.noSuchMethod(
         Invocation.method(
           #lookupKey,
           [paymentCodeString],
         ),
-        returnValue: _i24.Future<List<String>>.value(<String>[]),
-      ) as _i24.Future<List<String>>);
+        returnValue: _i26.Future<List<String>>.value(<String>[]),
+      ) as _i26.Future<List<String>>);
   @override
-  _i24.Future<String?> paymentCodeStringByKey(String? key) =>
+  _i26.Future<String?> paymentCodeStringByKey(String? key) =>
       (super.noSuchMethod(
         Invocation.method(
           #paymentCodeStringByKey,
           [key],
         ),
-        returnValue: _i24.Future<String?>.value(),
-      ) as _i24.Future<String?>);
+        returnValue: _i26.Future<String?>.value(),
+      ) as _i26.Future<String?>);
   @override
-  _i24.Future<String> storeCode(String? paymentCodeString) =>
+  _i26.Future<String> storeCode(String? paymentCodeString) =>
       (super.noSuchMethod(
         Invocation.method(
           #storeCode,
           [paymentCodeString],
         ),
-        returnValue: _i24.Future<String>.value(''),
-      ) as _i24.Future<String>);
+        returnValue: _i26.Future<String>.value(''),
+      ) as _i26.Future<String>);
   @override
   void initCoinControlInterface({
     required String? walletId,
     required String? walletName,
-    required _i23.Coin? coin,
+    required _i25.Coin? coin,
     required _i13.MainDB? db,
-    required _i24.Future<int> Function()? getChainHeight,
-    required _i24.Future<void> Function(_i12.Balance)? refreshedBalanceCallback,
+    required _i26.Future<int> Function()? getChainHeight,
+    required _i26.Future<void> Function(_i12.Balance)? refreshedBalanceCallback,
   }) =>
       super.noSuchMethod(
         Invocation.method(
@@ -2166,22 +2225,22 @@ class MockBitcoinWallet extends _i1.Mock implements _i28.BitcoinWallet {
         returnValueForMissingStub: null,
       );
   @override
-  _i24.Future<void> refreshBalance({bool? notify = false}) =>
+  _i26.Future<void> refreshBalance({bool? notify = false}) =>
       (super.noSuchMethod(
         Invocation.method(
           #refreshBalance,
           [],
           {#notify: notify},
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
 }
 
 /// A class which mocks [LocaleService].
 ///
 /// See the documentation for Mockito's code generation for more information.
-class MockLocaleService extends _i1.Mock implements _i32.LocaleService {
+class MockLocaleService extends _i1.Mock implements _i34.LocaleService {
   MockLocaleService() {
     _i1.throwOnMissingStub(this);
   }
@@ -2197,17 +2256,17 @@ class MockLocaleService extends _i1.Mock implements _i32.LocaleService {
         returnValue: false,
       ) as bool);
   @override
-  _i24.Future<void> loadLocale({bool? notify = true}) => (super.noSuchMethod(
+  _i26.Future<void> loadLocale({bool? notify = true}) => (super.noSuchMethod(
         Invocation.method(
           #loadLocale,
           [],
           {#notify: notify},
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
-  void addListener(_i26.VoidCallback? listener) => super.noSuchMethod(
+  void addListener(_i28.VoidCallback? listener) => super.noSuchMethod(
         Invocation.method(
           #addListener,
           [listener],
@@ -2215,7 +2274,7 @@ class MockLocaleService extends _i1.Mock implements _i32.LocaleService {
         returnValueForMissingStub: null,
       );
   @override
-  void removeListener(_i26.VoidCallback? listener) => super.noSuchMethod(
+  void removeListener(_i28.VoidCallback? listener) => super.noSuchMethod(
         Invocation.method(
           #removeListener,
           [listener],
@@ -2243,21 +2302,21 @@ class MockLocaleService extends _i1.Mock implements _i32.LocaleService {
 /// A class which mocks [ThemeService].
 ///
 /// See the documentation for Mockito's code generation for more information.
-class MockThemeService extends _i1.Mock implements _i33.ThemeService {
+class MockThemeService extends _i1.Mock implements _i35.ThemeService {
   MockThemeService() {
     _i1.throwOnMissingStub(this);
   }
 
   @override
-  _i20.HTTP get client => (super.noSuchMethod(
+  _i21.HTTP get client => (super.noSuchMethod(
         Invocation.getter(#client),
-        returnValue: _FakeHTTP_18(
+        returnValue: _FakeHTTP_19(
           this,
           Invocation.getter(#client),
         ),
-      ) as _i20.HTTP);
+      ) as _i21.HTTP);
   @override
-  set client(_i20.HTTP? _client) => super.noSuchMethod(
+  set client(_i21.HTTP? _client) => super.noSuchMethod(
         Invocation.setter(
           #client,
           _client,
@@ -2273,10 +2332,10 @@ class MockThemeService extends _i1.Mock implements _i33.ThemeService {
         ),
       ) as _i13.MainDB);
   @override
-  List<_i34.StackTheme> get installedThemes => (super.noSuchMethod(
+  List<_i36.StackTheme> get installedThemes => (super.noSuchMethod(
         Invocation.getter(#installedThemes),
-        returnValue: <_i34.StackTheme>[],
-      ) as List<_i34.StackTheme>);
+        returnValue: <_i36.StackTheme>[],
+      ) as List<_i36.StackTheme>);
   @override
   void init(_i13.MainDB? db) => super.noSuchMethod(
         Invocation.method(
@@ -2286,79 +2345,79 @@ class MockThemeService extends _i1.Mock implements _i33.ThemeService {
         returnValueForMissingStub: null,
       );
   @override
-  _i24.Future<void> install({required _i31.Uint8List? themeArchiveData}) =>
+  _i26.Future<void> install({required _i33.Uint8List? themeArchiveData}) =>
       (super.noSuchMethod(
         Invocation.method(
           #install,
           [],
           {#themeArchiveData: themeArchiveData},
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
-  _i24.Future<void> remove({required String? themeId}) => (super.noSuchMethod(
+  _i26.Future<void> remove({required String? themeId}) => (super.noSuchMethod(
         Invocation.method(
           #remove,
           [],
           {#themeId: themeId},
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
-  _i24.Future<void> checkDefaultThemesOnStartup() => (super.noSuchMethod(
+  _i26.Future<void> checkDefaultThemesOnStartup() => (super.noSuchMethod(
         Invocation.method(
           #checkDefaultThemesOnStartup,
           [],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
-  _i24.Future<bool> verifyInstalled({required String? themeId}) =>
+  _i26.Future<bool> verifyInstalled({required String? themeId}) =>
       (super.noSuchMethod(
         Invocation.method(
           #verifyInstalled,
           [],
           {#themeId: themeId},
         ),
-        returnValue: _i24.Future<bool>.value(false),
-      ) as _i24.Future<bool>);
+        returnValue: _i26.Future<bool>.value(false),
+      ) as _i26.Future<bool>);
   @override
-  _i24.Future<List<_i33.StackThemeMetaData>> fetchThemes() =>
+  _i26.Future<List<_i35.StackThemeMetaData>> fetchThemes() =>
       (super.noSuchMethod(
         Invocation.method(
           #fetchThemes,
           [],
         ),
-        returnValue: _i24.Future<List<_i33.StackThemeMetaData>>.value(
-            <_i33.StackThemeMetaData>[]),
-      ) as _i24.Future<List<_i33.StackThemeMetaData>>);
+        returnValue: _i26.Future<List<_i35.StackThemeMetaData>>.value(
+            <_i35.StackThemeMetaData>[]),
+      ) as _i26.Future<List<_i35.StackThemeMetaData>>);
   @override
-  _i24.Future<_i31.Uint8List> fetchTheme(
-          {required _i33.StackThemeMetaData? themeMetaData}) =>
+  _i26.Future<_i33.Uint8List> fetchTheme(
+          {required _i35.StackThemeMetaData? themeMetaData}) =>
       (super.noSuchMethod(
         Invocation.method(
           #fetchTheme,
           [],
           {#themeMetaData: themeMetaData},
         ),
-        returnValue: _i24.Future<_i31.Uint8List>.value(_i31.Uint8List(0)),
-      ) as _i24.Future<_i31.Uint8List>);
+        returnValue: _i26.Future<_i33.Uint8List>.value(_i33.Uint8List(0)),
+      ) as _i26.Future<_i33.Uint8List>);
   @override
-  _i34.StackTheme? getTheme({required String? themeId}) =>
+  _i36.StackTheme? getTheme({required String? themeId}) =>
       (super.noSuchMethod(Invocation.method(
         #getTheme,
         [],
         {#themeId: themeId},
-      )) as _i34.StackTheme?);
+      )) as _i36.StackTheme?);
 }
 
 /// A class which mocks [Prefs].
 ///
 /// See the documentation for Mockito's code generation for more information.
-class MockPrefs extends _i1.Mock implements _i25.Prefs {
+class MockPrefs extends _i1.Mock implements _i27.Prefs {
   MockPrefs() {
     _i1.throwOnMissingStub(this);
   }
@@ -2414,12 +2473,12 @@ class MockPrefs extends _i1.Mock implements _i25.Prefs {
         returnValueForMissingStub: null,
       );
   @override
-  _i35.SyncingType get syncType => (super.noSuchMethod(
+  _i37.SyncingType get syncType => (super.noSuchMethod(
         Invocation.getter(#syncType),
-        returnValue: _i35.SyncingType.currentWalletOnly,
-      ) as _i35.SyncingType);
+        returnValue: _i37.SyncingType.currentWalletOnly,
+      ) as _i37.SyncingType);
   @override
-  set syncType(_i35.SyncingType? syncType) => super.noSuchMethod(
+  set syncType(_i37.SyncingType? syncType) => super.noSuchMethod(
         Invocation.setter(
           #syncType,
           syncType,
@@ -2578,12 +2637,12 @@ class MockPrefs extends _i1.Mock implements _i25.Prefs {
         returnValueForMissingStub: null,
       );
   @override
-  _i36.BackupFrequencyType get backupFrequencyType => (super.noSuchMethod(
+  _i38.BackupFrequencyType get backupFrequencyType => (super.noSuchMethod(
         Invocation.getter(#backupFrequencyType),
-        returnValue: _i36.BackupFrequencyType.everyTenMinutes,
-      ) as _i36.BackupFrequencyType);
+        returnValue: _i38.BackupFrequencyType.everyTenMinutes,
+      ) as _i38.BackupFrequencyType);
   @override
-  set backupFrequencyType(_i36.BackupFrequencyType? backupFrequencyType) =>
+  set backupFrequencyType(_i38.BackupFrequencyType? backupFrequencyType) =>
       super.noSuchMethod(
         Invocation.setter(
           #backupFrequencyType,
@@ -2729,66 +2788,82 @@ class MockPrefs extends _i1.Mock implements _i25.Prefs {
         returnValueForMissingStub: null,
       );
   @override
+  _i22.FusionInfo get fusionServerInfo => (super.noSuchMethod(
+        Invocation.getter(#fusionServerInfo),
+        returnValue: _FakeFusionInfo_20(
+          this,
+          Invocation.getter(#fusionServerInfo),
+        ),
+      ) as _i22.FusionInfo);
+  @override
+  set fusionServerInfo(_i22.FusionInfo? fusionServerInfo) => super.noSuchMethod(
+        Invocation.setter(
+          #fusionServerInfo,
+          fusionServerInfo,
+        ),
+        returnValueForMissingStub: null,
+      );
+  @override
   bool get hasListeners => (super.noSuchMethod(
         Invocation.getter(#hasListeners),
         returnValue: false,
       ) as bool);
   @override
-  _i24.Future<void> init() => (super.noSuchMethod(
+  _i26.Future<void> init() => (super.noSuchMethod(
         Invocation.method(
           #init,
           [],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
-  _i24.Future<void> incrementCurrentNotificationIndex() => (super.noSuchMethod(
+  _i26.Future<void> incrementCurrentNotificationIndex() => (super.noSuchMethod(
         Invocation.method(
           #incrementCurrentNotificationIndex,
           [],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
-  _i24.Future<bool> isExternalCallsSet() => (super.noSuchMethod(
+  _i26.Future<bool> isExternalCallsSet() => (super.noSuchMethod(
         Invocation.method(
           #isExternalCallsSet,
           [],
         ),
-        returnValue: _i24.Future<bool>.value(false),
-      ) as _i24.Future<bool>);
+        returnValue: _i26.Future<bool>.value(false),
+      ) as _i26.Future<bool>);
   @override
-  _i24.Future<void> saveUserID(String? userId) => (super.noSuchMethod(
+  _i26.Future<void> saveUserID(String? userId) => (super.noSuchMethod(
         Invocation.method(
           #saveUserID,
           [userId],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
-  _i24.Future<void> saveSignupEpoch(int? signupEpoch) => (super.noSuchMethod(
+  _i26.Future<void> saveSignupEpoch(int? signupEpoch) => (super.noSuchMethod(
         Invocation.method(
           #saveSignupEpoch,
           [signupEpoch],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
-  _i37.AmountUnit amountUnit(_i23.Coin? coin) => (super.noSuchMethod(
+  _i39.AmountUnit amountUnit(_i25.Coin? coin) => (super.noSuchMethod(
         Invocation.method(
           #amountUnit,
           [coin],
         ),
-        returnValue: _i37.AmountUnit.normal,
-      ) as _i37.AmountUnit);
+        returnValue: _i39.AmountUnit.normal,
+      ) as _i39.AmountUnit);
   @override
   void updateAmountUnit({
-    required _i23.Coin? coin,
-    required _i37.AmountUnit? amountUnit,
+    required _i25.Coin? coin,
+    required _i39.AmountUnit? amountUnit,
   }) =>
       super.noSuchMethod(
         Invocation.method(
@@ -2802,7 +2877,7 @@ class MockPrefs extends _i1.Mock implements _i25.Prefs {
         returnValueForMissingStub: null,
       );
   @override
-  int maxDecimals(_i23.Coin? coin) => (super.noSuchMethod(
+  int maxDecimals(_i25.Coin? coin) => (super.noSuchMethod(
         Invocation.method(
           #maxDecimals,
           [coin],
@@ -2811,7 +2886,7 @@ class MockPrefs extends _i1.Mock implements _i25.Prefs {
       ) as int);
   @override
   void updateMaxDecimals({
-    required _i23.Coin? coin,
+    required _i25.Coin? coin,
     required int? maxDecimals,
   }) =>
       super.noSuchMethod(
@@ -2826,7 +2901,7 @@ class MockPrefs extends _i1.Mock implements _i25.Prefs {
         returnValueForMissingStub: null,
       );
   @override
-  void addListener(_i26.VoidCallback? listener) => super.noSuchMethod(
+  void addListener(_i28.VoidCallback? listener) => super.noSuchMethod(
         Invocation.method(
           #addListener,
           [listener],
@@ -2834,7 +2909,7 @@ class MockPrefs extends _i1.Mock implements _i25.Prefs {
         returnValueForMissingStub: null,
       );
   @override
-  void removeListener(_i26.VoidCallback? listener) => super.noSuchMethod(
+  void removeListener(_i28.VoidCallback? listener) => super.noSuchMethod(
         Invocation.method(
           #removeListener,
           [listener],
@@ -2877,23 +2952,23 @@ class MockManager extends _i1.Mock implements _i6.Manager {
         returnValueForMissingStub: null,
       );
   @override
-  _i21.CoinServiceAPI get wallet => (super.noSuchMethod(
+  _i23.CoinServiceAPI get wallet => (super.noSuchMethod(
         Invocation.getter(#wallet),
-        returnValue: _FakeCoinServiceAPI_19(
+        returnValue: _FakeCoinServiceAPI_21(
           this,
           Invocation.getter(#wallet),
         ),
-      ) as _i21.CoinServiceAPI);
+      ) as _i23.CoinServiceAPI);
   @override
   bool get hasBackgroundRefreshListener => (super.noSuchMethod(
         Invocation.getter(#hasBackgroundRefreshListener),
         returnValue: false,
       ) as bool);
   @override
-  _i23.Coin get coin => (super.noSuchMethod(
+  _i25.Coin get coin => (super.noSuchMethod(
         Invocation.getter(#coin),
-        returnValue: _i23.Coin.bitcoin,
-      ) as _i23.Coin);
+        returnValue: _i25.Coin.bitcoin,
+      ) as _i25.Coin);
   @override
   bool get isRefreshing => (super.noSuchMethod(
         Invocation.getter(#isRefreshing),
@@ -2926,23 +3001,23 @@ class MockManager extends _i1.Mock implements _i6.Manager {
         returnValueForMissingStub: null,
       );
   @override
-  _i24.Future<_i9.FeeObject> get fees => (super.noSuchMethod(
+  _i26.Future<_i9.FeeObject> get fees => (super.noSuchMethod(
         Invocation.getter(#fees),
-        returnValue: _i24.Future<_i9.FeeObject>.value(_FakeFeeObject_6(
+        returnValue: _i26.Future<_i9.FeeObject>.value(_FakeFeeObject_6(
           this,
           Invocation.getter(#fees),
         )),
-      ) as _i24.Future<_i9.FeeObject>);
+      ) as _i26.Future<_i9.FeeObject>);
   @override
-  _i24.Future<int> get maxFee => (super.noSuchMethod(
+  _i26.Future<int> get maxFee => (super.noSuchMethod(
         Invocation.getter(#maxFee),
-        returnValue: _i24.Future<int>.value(0),
-      ) as _i24.Future<int>);
+        returnValue: _i26.Future<int>.value(0),
+      ) as _i26.Future<int>);
   @override
-  _i24.Future<String> get currentReceivingAddress => (super.noSuchMethod(
+  _i26.Future<String> get currentReceivingAddress => (super.noSuchMethod(
         Invocation.getter(#currentReceivingAddress),
-        returnValue: _i24.Future<String>.value(''),
-      ) as _i24.Future<String>);
+        returnValue: _i26.Future<String>.value(''),
+      ) as _i26.Future<String>);
   @override
   _i12.Balance get balance => (super.noSuchMethod(
         Invocation.getter(#balance),
@@ -2952,16 +3027,16 @@ class MockManager extends _i1.Mock implements _i6.Manager {
         ),
       ) as _i12.Balance);
   @override
-  _i24.Future<List<_i18.Transaction>> get transactions => (super.noSuchMethod(
+  _i26.Future<List<_i19.Transaction>> get transactions => (super.noSuchMethod(
         Invocation.getter(#transactions),
         returnValue:
-            _i24.Future<List<_i18.Transaction>>.value(<_i18.Transaction>[]),
-      ) as _i24.Future<List<_i18.Transaction>>);
+            _i26.Future<List<_i19.Transaction>>.value(<_i19.Transaction>[]),
+      ) as _i26.Future<List<_i19.Transaction>>);
   @override
-  _i24.Future<List<_i18.UTXO>> get utxos => (super.noSuchMethod(
+  _i26.Future<List<_i19.UTXO>> get utxos => (super.noSuchMethod(
         Invocation.getter(#utxos),
-        returnValue: _i24.Future<List<_i18.UTXO>>.value(<_i18.UTXO>[]),
-      ) as _i24.Future<List<_i18.UTXO>>);
+        returnValue: _i26.Future<List<_i19.UTXO>>.value(<_i19.UTXO>[]),
+      ) as _i26.Future<List<_i19.UTXO>>);
   @override
   set walletName(String? newName) => super.noSuchMethod(
         Invocation.setter(
@@ -2981,15 +3056,15 @@ class MockManager extends _i1.Mock implements _i6.Manager {
         returnValue: '',
       ) as String);
   @override
-  _i24.Future<List<String>> get mnemonic => (super.noSuchMethod(
+  _i26.Future<List<String>> get mnemonic => (super.noSuchMethod(
         Invocation.getter(#mnemonic),
-        returnValue: _i24.Future<List<String>>.value(<String>[]),
-      ) as _i24.Future<List<String>>);
+        returnValue: _i26.Future<List<String>>.value(<String>[]),
+      ) as _i26.Future<List<String>>);
   @override
-  _i24.Future<String?> get mnemonicPassphrase => (super.noSuchMethod(
+  _i26.Future<String?> get mnemonicPassphrase => (super.noSuchMethod(
         Invocation.getter(#mnemonicPassphrase),
-        returnValue: _i24.Future<String?>.value(),
-      ) as _i24.Future<String?>);
+        returnValue: _i26.Future<String?>.value(),
+      ) as _i26.Future<String?>);
   @override
   bool get isConnected => (super.noSuchMethod(
         Invocation.getter(#isConnected),
@@ -3026,6 +3101,11 @@ class MockManager extends _i1.Mock implements _i6.Manager {
         returnValue: false,
       ) as bool);
   @override
+  bool get hasFusionSupport => (super.noSuchMethod(
+        Invocation.getter(#hasFusionSupport),
+        returnValue: false,
+      ) as bool);
+  @override
   int get rescanOnOpenVersion => (super.noSuchMethod(
         Invocation.getter(#rescanOnOpenVersion),
         returnValue: 0,
@@ -3036,24 +3116,24 @@ class MockManager extends _i1.Mock implements _i6.Manager {
         returnValue: false,
       ) as bool);
   @override
-  _i24.Future<String> get xpub => (super.noSuchMethod(
+  _i26.Future<String> get xpub => (super.noSuchMethod(
         Invocation.getter(#xpub),
-        returnValue: _i24.Future<String>.value(''),
-      ) as _i24.Future<String>);
+        returnValue: _i26.Future<String>.value(''),
+      ) as _i26.Future<String>);
   @override
   bool get hasListeners => (super.noSuchMethod(
         Invocation.getter(#hasListeners),
         returnValue: false,
       ) as bool);
   @override
-  _i24.Future<void> updateNode(bool? shouldRefresh) => (super.noSuchMethod(
+  _i26.Future<void> updateNode(bool? shouldRefresh) => (super.noSuchMethod(
         Invocation.method(
           #updateNode,
           [shouldRefresh],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
   void dispose() => super.noSuchMethod(
         Invocation.method(
@@ -3063,7 +3143,7 @@ class MockManager extends _i1.Mock implements _i6.Manager {
         returnValueForMissingStub: null,
       );
   @override
-  _i24.Future<Map<String, dynamic>> prepareSend({
+  _i26.Future<Map<String, dynamic>> prepareSend({
     required String? address,
     required _i15.Amount? amount,
     Map<String, dynamic>? args,
@@ -3079,27 +3159,27 @@ class MockManager extends _i1.Mock implements _i6.Manager {
           },
         ),
         returnValue:
-            _i24.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
-      ) as _i24.Future<Map<String, dynamic>>);
+            _i26.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
+      ) as _i26.Future<Map<String, dynamic>>);
   @override
-  _i24.Future<String> confirmSend({required Map<String, dynamic>? txData}) =>
+  _i26.Future<String> confirmSend({required Map<String, dynamic>? txData}) =>
       (super.noSuchMethod(
         Invocation.method(
           #confirmSend,
           [],
           {#txData: txData},
         ),
-        returnValue: _i24.Future<String>.value(''),
-      ) as _i24.Future<String>);
+        returnValue: _i26.Future<String>.value(''),
+      ) as _i26.Future<String>);
   @override
-  _i24.Future<void> refresh() => (super.noSuchMethod(
+  _i26.Future<void> refresh() => (super.noSuchMethod(
         Invocation.method(
           #refresh,
           [],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
   bool validateAddress(String? address) => (super.noSuchMethod(
         Invocation.method(
@@ -3109,35 +3189,35 @@ class MockManager extends _i1.Mock implements _i6.Manager {
         returnValue: false,
       ) as bool);
   @override
-  _i24.Future<bool> testNetworkConnection() => (super.noSuchMethod(
+  _i26.Future<bool> testNetworkConnection() => (super.noSuchMethod(
         Invocation.method(
           #testNetworkConnection,
           [],
         ),
-        returnValue: _i24.Future<bool>.value(false),
-      ) as _i24.Future<bool>);
+        returnValue: _i26.Future<bool>.value(false),
+      ) as _i26.Future<bool>);
   @override
-  _i24.Future<void> initializeNew(
+  _i26.Future<void> initializeNew(
           ({String mnemonicPassphrase, int wordCount})? data) =>
       (super.noSuchMethod(
         Invocation.method(
           #initializeNew,
           [data],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
-  _i24.Future<void> initializeExisting() => (super.noSuchMethod(
+  _i26.Future<void> initializeExisting() => (super.noSuchMethod(
         Invocation.method(
           #initializeExisting,
           [],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
-  _i24.Future<void> recoverFromMnemonic({
+  _i26.Future<void> recoverFromMnemonic({
     required String? mnemonic,
     String? mnemonicPassphrase,
     required int? maxUnusedAddressGap,
@@ -3156,20 +3236,20 @@ class MockManager extends _i1.Mock implements _i6.Manager {
             #height: height,
           },
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
-  _i24.Future<void> exitCurrentWallet() => (super.noSuchMethod(
+  _i26.Future<void> exitCurrentWallet() => (super.noSuchMethod(
         Invocation.method(
           #exitCurrentWallet,
           [],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
-  _i24.Future<void> fullRescan(
+  _i26.Future<void> fullRescan(
     int? maxUnusedAddressGap,
     int? maxNumberOfIndexesToCheck,
   ) =>
@@ -3181,11 +3261,11 @@ class MockManager extends _i1.Mock implements _i6.Manager {
             maxNumberOfIndexesToCheck,
           ],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
-  _i24.Future<_i15.Amount> estimateFeeFor(
+  _i26.Future<_i15.Amount> estimateFeeFor(
     _i15.Amount? amount,
     int? feeRate,
   ) =>
@@ -3197,7 +3277,7 @@ class MockManager extends _i1.Mock implements _i6.Manager {
             feeRate,
           ],
         ),
-        returnValue: _i24.Future<_i15.Amount>.value(_FakeAmount_13(
+        returnValue: _i26.Future<_i15.Amount>.value(_FakeAmount_13(
           this,
           Invocation.method(
             #estimateFeeFor,
@@ -3207,26 +3287,26 @@ class MockManager extends _i1.Mock implements _i6.Manager {
             ],
           ),
         )),
-      ) as _i24.Future<_i15.Amount>);
+      ) as _i26.Future<_i15.Amount>);
   @override
-  _i24.Future<bool> generateNewAddress() => (super.noSuchMethod(
+  _i26.Future<bool> generateNewAddress() => (super.noSuchMethod(
         Invocation.method(
           #generateNewAddress,
           [],
         ),
-        returnValue: _i24.Future<bool>.value(false),
-      ) as _i24.Future<bool>);
+        returnValue: _i26.Future<bool>.value(false),
+      ) as _i26.Future<bool>);
   @override
-  _i24.Future<void> resetRescanOnOpen() => (super.noSuchMethod(
+  _i26.Future<void> resetRescanOnOpen() => (super.noSuchMethod(
         Invocation.method(
           #resetRescanOnOpen,
           [],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
-  void addListener(_i26.VoidCallback? listener) => super.noSuchMethod(
+  void addListener(_i28.VoidCallback? listener) => super.noSuchMethod(
         Invocation.method(
           #addListener,
           [listener],
@@ -3234,7 +3314,7 @@ class MockManager extends _i1.Mock implements _i6.Manager {
         returnValueForMissingStub: null,
       );
   @override
-  void removeListener(_i26.VoidCallback? listener) => super.noSuchMethod(
+  void removeListener(_i28.VoidCallback? listener) => super.noSuchMethod(
         Invocation.method(
           #removeListener,
           [listener],
@@ -3254,7 +3334,7 @@ class MockManager extends _i1.Mock implements _i6.Manager {
 /// A class which mocks [CoinServiceAPI].
 ///
 /// See the documentation for Mockito's code generation for more information.
-class MockCoinServiceAPI extends _i1.Mock implements _i21.CoinServiceAPI {
+class MockCoinServiceAPI extends _i1.Mock implements _i23.CoinServiceAPI {
   @override
   set onIsActiveWalletChanged(void Function(bool)? _onIsActiveWalletChanged) =>
       super.noSuchMethod(
@@ -3265,10 +3345,10 @@ class MockCoinServiceAPI extends _i1.Mock implements _i21.CoinServiceAPI {
         returnValueForMissingStub: null,
       );
   @override
-  _i23.Coin get coin => (super.noSuchMethod(
+  _i25.Coin get coin => (super.noSuchMethod(
         Invocation.getter(#coin),
-        returnValue: _i23.Coin.bitcoin,
-      ) as _i23.Coin);
+        returnValue: _i25.Coin.bitcoin,
+      ) as _i25.Coin);
   @override
   bool get isRefreshing => (super.noSuchMethod(
         Invocation.getter(#isRefreshing),
@@ -3301,23 +3381,23 @@ class MockCoinServiceAPI extends _i1.Mock implements _i21.CoinServiceAPI {
         returnValueForMissingStub: null,
       );
   @override
-  _i24.Future<_i9.FeeObject> get fees => (super.noSuchMethod(
+  _i26.Future<_i9.FeeObject> get fees => (super.noSuchMethod(
         Invocation.getter(#fees),
-        returnValue: _i24.Future<_i9.FeeObject>.value(_FakeFeeObject_6(
+        returnValue: _i26.Future<_i9.FeeObject>.value(_FakeFeeObject_6(
           this,
           Invocation.getter(#fees),
         )),
-      ) as _i24.Future<_i9.FeeObject>);
+      ) as _i26.Future<_i9.FeeObject>);
   @override
-  _i24.Future<int> get maxFee => (super.noSuchMethod(
+  _i26.Future<int> get maxFee => (super.noSuchMethod(
         Invocation.getter(#maxFee),
-        returnValue: _i24.Future<int>.value(0),
-      ) as _i24.Future<int>);
+        returnValue: _i26.Future<int>.value(0),
+      ) as _i26.Future<int>);
   @override
-  _i24.Future<String> get currentReceivingAddress => (super.noSuchMethod(
+  _i26.Future<String> get currentReceivingAddress => (super.noSuchMethod(
         Invocation.getter(#currentReceivingAddress),
-        returnValue: _i24.Future<String>.value(''),
-      ) as _i24.Future<String>);
+        returnValue: _i26.Future<String>.value(''),
+      ) as _i26.Future<String>);
   @override
   _i12.Balance get balance => (super.noSuchMethod(
         Invocation.getter(#balance),
@@ -3327,16 +3407,16 @@ class MockCoinServiceAPI extends _i1.Mock implements _i21.CoinServiceAPI {
         ),
       ) as _i12.Balance);
   @override
-  _i24.Future<List<_i18.Transaction>> get transactions => (super.noSuchMethod(
+  _i26.Future<List<_i19.Transaction>> get transactions => (super.noSuchMethod(
         Invocation.getter(#transactions),
         returnValue:
-            _i24.Future<List<_i18.Transaction>>.value(<_i18.Transaction>[]),
-      ) as _i24.Future<List<_i18.Transaction>>);
+            _i26.Future<List<_i19.Transaction>>.value(<_i19.Transaction>[]),
+      ) as _i26.Future<List<_i19.Transaction>>);
   @override
-  _i24.Future<List<_i18.UTXO>> get utxos => (super.noSuchMethod(
+  _i26.Future<List<_i19.UTXO>> get utxos => (super.noSuchMethod(
         Invocation.getter(#utxos),
-        returnValue: _i24.Future<List<_i18.UTXO>>.value(<_i18.UTXO>[]),
-      ) as _i24.Future<List<_i18.UTXO>>);
+        returnValue: _i26.Future<List<_i19.UTXO>>.value(<_i19.UTXO>[]),
+      ) as _i26.Future<List<_i19.UTXO>>);
   @override
   set walletName(String? newName) => super.noSuchMethod(
         Invocation.setter(
@@ -3356,20 +3436,20 @@ class MockCoinServiceAPI extends _i1.Mock implements _i21.CoinServiceAPI {
         returnValue: '',
       ) as String);
   @override
-  _i24.Future<List<String>> get mnemonic => (super.noSuchMethod(
+  _i26.Future<List<String>> get mnemonic => (super.noSuchMethod(
         Invocation.getter(#mnemonic),
-        returnValue: _i24.Future<List<String>>.value(<String>[]),
-      ) as _i24.Future<List<String>>);
+        returnValue: _i26.Future<List<String>>.value(<String>[]),
+      ) as _i26.Future<List<String>>);
   @override
-  _i24.Future<String?> get mnemonicString => (super.noSuchMethod(
+  _i26.Future<String?> get mnemonicString => (super.noSuchMethod(
         Invocation.getter(#mnemonicString),
-        returnValue: _i24.Future<String?>.value(),
-      ) as _i24.Future<String?>);
+        returnValue: _i26.Future<String?>.value(),
+      ) as _i26.Future<String?>);
   @override
-  _i24.Future<String?> get mnemonicPassphrase => (super.noSuchMethod(
+  _i26.Future<String?> get mnemonicPassphrase => (super.noSuchMethod(
         Invocation.getter(#mnemonicPassphrase),
-        returnValue: _i24.Future<String?>.value(),
-      ) as _i24.Future<String?>);
+        returnValue: _i26.Future<String?>.value(),
+      ) as _i26.Future<String?>);
   @override
   bool get hasCalledExit => (super.noSuchMethod(
         Invocation.getter(#hasCalledExit),
@@ -3386,7 +3466,7 @@ class MockCoinServiceAPI extends _i1.Mock implements _i21.CoinServiceAPI {
         returnValue: 0,
       ) as int);
   @override
-  _i24.Future<Map<String, dynamic>> prepareSend({
+  _i26.Future<Map<String, dynamic>> prepareSend({
     required String? address,
     required _i15.Amount? amount,
     Map<String, dynamic>? args,
@@ -3402,36 +3482,36 @@ class MockCoinServiceAPI extends _i1.Mock implements _i21.CoinServiceAPI {
           },
         ),
         returnValue:
-            _i24.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
-      ) as _i24.Future<Map<String, dynamic>>);
+            _i26.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
+      ) as _i26.Future<Map<String, dynamic>>);
   @override
-  _i24.Future<String> confirmSend({required Map<String, dynamic>? txData}) =>
+  _i26.Future<String> confirmSend({required Map<String, dynamic>? txData}) =>
       (super.noSuchMethod(
         Invocation.method(
           #confirmSend,
           [],
           {#txData: txData},
         ),
-        returnValue: _i24.Future<String>.value(''),
-      ) as _i24.Future<String>);
+        returnValue: _i26.Future<String>.value(''),
+      ) as _i26.Future<String>);
   @override
-  _i24.Future<void> refresh() => (super.noSuchMethod(
+  _i26.Future<void> refresh() => (super.noSuchMethod(
         Invocation.method(
           #refresh,
           [],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
-  _i24.Future<void> updateNode(bool? shouldRefresh) => (super.noSuchMethod(
+  _i26.Future<void> updateNode(bool? shouldRefresh) => (super.noSuchMethod(
         Invocation.method(
           #updateNode,
           [shouldRefresh],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
   bool validateAddress(String? address) => (super.noSuchMethod(
         Invocation.method(
@@ -3441,15 +3521,15 @@ class MockCoinServiceAPI extends _i1.Mock implements _i21.CoinServiceAPI {
         returnValue: false,
       ) as bool);
   @override
-  _i24.Future<bool> testNetworkConnection() => (super.noSuchMethod(
+  _i26.Future<bool> testNetworkConnection() => (super.noSuchMethod(
         Invocation.method(
           #testNetworkConnection,
           [],
         ),
-        returnValue: _i24.Future<bool>.value(false),
-      ) as _i24.Future<bool>);
+        returnValue: _i26.Future<bool>.value(false),
+      ) as _i26.Future<bool>);
   @override
-  _i24.Future<void> recoverFromMnemonic({
+  _i26.Future<void> recoverFromMnemonic({
     required String? mnemonic,
     String? mnemonicPassphrase,
     required int? maxUnusedAddressGap,
@@ -3468,40 +3548,40 @@ class MockCoinServiceAPI extends _i1.Mock implements _i21.CoinServiceAPI {
             #height: height,
           },
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
-  _i24.Future<void> initializeNew(
+  _i26.Future<void> initializeNew(
           ({String mnemonicPassphrase, int wordCount})? data) =>
       (super.noSuchMethod(
         Invocation.method(
           #initializeNew,
           [data],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
-  _i24.Future<void> initializeExisting() => (super.noSuchMethod(
+  _i26.Future<void> initializeExisting() => (super.noSuchMethod(
         Invocation.method(
           #initializeExisting,
           [],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
-  _i24.Future<void> exit() => (super.noSuchMethod(
+  _i26.Future<void> exit() => (super.noSuchMethod(
         Invocation.method(
           #exit,
           [],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
-  _i24.Future<void> fullRescan(
+  _i26.Future<void> fullRescan(
     int? maxUnusedAddressGap,
     int? maxNumberOfIndexesToCheck,
   ) =>
@@ -3513,11 +3593,11 @@ class MockCoinServiceAPI extends _i1.Mock implements _i21.CoinServiceAPI {
             maxNumberOfIndexesToCheck,
           ],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
-  _i24.Future<_i15.Amount> estimateFeeFor(
+  _i26.Future<_i15.Amount> estimateFeeFor(
     _i15.Amount? amount,
     int? feeRate,
   ) =>
@@ -3529,7 +3609,7 @@ class MockCoinServiceAPI extends _i1.Mock implements _i21.CoinServiceAPI {
             feeRate,
           ],
         ),
-        returnValue: _i24.Future<_i15.Amount>.value(_FakeAmount_13(
+        returnValue: _i26.Future<_i15.Amount>.value(_FakeAmount_13(
           this,
           Invocation.method(
             #estimateFeeFor,
@@ -3539,23 +3619,23 @@ class MockCoinServiceAPI extends _i1.Mock implements _i21.CoinServiceAPI {
             ],
           ),
         )),
-      ) as _i24.Future<_i15.Amount>);
+      ) as _i26.Future<_i15.Amount>);
   @override
-  _i24.Future<bool> generateNewAddress() => (super.noSuchMethod(
+  _i26.Future<bool> generateNewAddress() => (super.noSuchMethod(
         Invocation.method(
           #generateNewAddress,
           [],
         ),
-        returnValue: _i24.Future<bool>.value(false),
-      ) as _i24.Future<bool>);
+        returnValue: _i26.Future<bool>.value(false),
+      ) as _i26.Future<bool>);
   @override
-  _i24.Future<void> updateSentCachedTxData(Map<String, dynamic>? txData) =>
+  _i26.Future<void> updateSentCachedTxData(Map<String, dynamic>? txData) =>
       (super.noSuchMethod(
         Invocation.method(
           #updateSentCachedTxData,
           [txData],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
 }
diff --git a/test/screen_tests/address_book_view/subviews/add_address_book_view_screen_test.mocks.dart b/test/screen_tests/address_book_view/subviews/add_address_book_view_screen_test.mocks.dart
index 29318d2c5..12b403ecc 100644
--- a/test/screen_tests/address_book_view/subviews/add_address_book_view_screen_test.mocks.dart
+++ b/test/screen_tests/address_book_view/subviews/add_address_book_view_screen_test.mocks.dart
@@ -401,6 +401,11 @@ class MockManager extends _i1.Mock implements _i12.Manager {
         returnValue: false,
       ) as bool);
   @override
+  bool get hasFusionSupport => (super.noSuchMethod(
+        Invocation.getter(#hasFusionSupport),
+        returnValue: false,
+      ) as bool);
+  @override
   int get rescanOnOpenVersion => (super.noSuchMethod(
         Invocation.getter(#rescanOnOpenVersion),
         returnValue: 0,
diff --git a/test/screen_tests/address_book_view/subviews/address_book_entry_details_view_screen_test.mocks.dart b/test/screen_tests/address_book_view/subviews/address_book_entry_details_view_screen_test.mocks.dart
index cd9108d2a..6139b42aa 100644
--- a/test/screen_tests/address_book_view/subviews/address_book_entry_details_view_screen_test.mocks.dart
+++ b/test/screen_tests/address_book_view/subviews/address_book_entry_details_view_screen_test.mocks.dart
@@ -362,6 +362,11 @@ class MockManager extends _i1.Mock implements _i10.Manager {
         returnValue: false,
       ) as bool);
   @override
+  bool get hasFusionSupport => (super.noSuchMethod(
+        Invocation.getter(#hasFusionSupport),
+        returnValue: false,
+      ) as bool);
+  @override
   int get rescanOnOpenVersion => (super.noSuchMethod(
         Invocation.getter(#rescanOnOpenVersion),
         returnValue: 0,
diff --git a/test/screen_tests/address_book_view/subviews/edit_address_book_entry_view_screen_test.mocks.dart b/test/screen_tests/address_book_view/subviews/edit_address_book_entry_view_screen_test.mocks.dart
index 65ab3b1f2..24bc3f793 100644
--- a/test/screen_tests/address_book_view/subviews/edit_address_book_entry_view_screen_test.mocks.dart
+++ b/test/screen_tests/address_book_view/subviews/edit_address_book_entry_view_screen_test.mocks.dart
@@ -360,6 +360,11 @@ class MockManager extends _i1.Mock implements _i10.Manager {
         returnValue: false,
       ) as bool);
   @override
+  bool get hasFusionSupport => (super.noSuchMethod(
+        Invocation.getter(#hasFusionSupport),
+        returnValue: false,
+      ) as bool);
+  @override
   int get rescanOnOpenVersion => (super.noSuchMethod(
         Invocation.getter(#rescanOnOpenVersion),
         returnValue: 0,
diff --git a/test/screen_tests/exchange/exchange_view_test.mocks.dart b/test/screen_tests/exchange/exchange_view_test.mocks.dart
index 5e23da459..ceec69497 100644
--- a/test/screen_tests/exchange/exchange_view_test.mocks.dart
+++ b/test/screen_tests/exchange/exchange_view_test.mocks.dart
@@ -3,38 +3,40 @@
 // Do not manually edit this file.
 
 // ignore_for_file: no_leading_underscores_for_library_prefixes
-import 'dart:async' as _i7;
-import 'dart:ui' as _i10;
+import 'dart:async' as _i8;
+import 'dart:ui' as _i11;
 
-import 'package:decimal/decimal.dart' as _i16;
+import 'package:decimal/decimal.dart' as _i17;
 import 'package:mockito/mockito.dart' as _i1;
 import 'package:stackwallet/models/exchange/change_now/cn_exchange_estimate.dart'
-    as _i19;
-import 'package:stackwallet/models/exchange/change_now/exchange_transaction.dart'
-    as _i21;
-import 'package:stackwallet/models/exchange/change_now/exchange_transaction_status.dart'
-    as _i22;
-import 'package:stackwallet/models/exchange/response_objects/estimate.dart'
-    as _i18;
-import 'package:stackwallet/models/exchange/response_objects/fixed_rate_market.dart'
     as _i20;
+import 'package:stackwallet/models/exchange/change_now/exchange_transaction.dart'
+    as _i22;
+import 'package:stackwallet/models/exchange/change_now/exchange_transaction_status.dart'
+    as _i23;
+import 'package:stackwallet/models/exchange/response_objects/estimate.dart'
+    as _i19;
+import 'package:stackwallet/models/exchange/response_objects/fixed_rate_market.dart'
+    as _i21;
 import 'package:stackwallet/models/exchange/response_objects/range.dart'
-    as _i17;
+    as _i18;
 import 'package:stackwallet/models/exchange/response_objects/trade.dart'
-    as _i12;
-import 'package:stackwallet/models/isar/exchange_cache/currency.dart' as _i15;
-import 'package:stackwallet/models/isar/exchange_cache/pair.dart' as _i23;
-import 'package:stackwallet/networking/http.dart' as _i2;
+    as _i13;
+import 'package:stackwallet/models/isar/exchange_cache/currency.dart' as _i16;
+import 'package:stackwallet/models/isar/exchange_cache/pair.dart' as _i24;
+import 'package:stackwallet/networking/http.dart' as _i3;
 import 'package:stackwallet/services/exchange/change_now/change_now_api.dart'
-    as _i14;
-import 'package:stackwallet/services/exchange/exchange_response.dart' as _i3;
-import 'package:stackwallet/services/trade_notes_service.dart' as _i13;
-import 'package:stackwallet/services/trade_service.dart' as _i11;
-import 'package:stackwallet/utilities/amount/amount_unit.dart' as _i8;
-import 'package:stackwallet/utilities/enums/backup_frequency_type.dart' as _i6;
-import 'package:stackwallet/utilities/enums/coin_enum.dart' as _i9;
-import 'package:stackwallet/utilities/enums/sync_type_enum.dart' as _i5;
-import 'package:stackwallet/utilities/prefs.dart' as _i4;
+    as _i15;
+import 'package:stackwallet/services/exchange/exchange_response.dart' as _i4;
+import 'package:stackwallet/services/mixins/fusion_wallet_interface.dart'
+    as _i2;
+import 'package:stackwallet/services/trade_notes_service.dart' as _i14;
+import 'package:stackwallet/services/trade_service.dart' as _i12;
+import 'package:stackwallet/utilities/amount/amount_unit.dart' as _i9;
+import 'package:stackwallet/utilities/enums/backup_frequency_type.dart' as _i7;
+import 'package:stackwallet/utilities/enums/coin_enum.dart' as _i10;
+import 'package:stackwallet/utilities/enums/sync_type_enum.dart' as _i6;
+import 'package:stackwallet/utilities/prefs.dart' as _i5;
 
 // ignore_for_file: type=lint
 // ignore_for_file: avoid_redundant_argument_values
@@ -47,8 +49,8 @@ import 'package:stackwallet/utilities/prefs.dart' as _i4;
 // ignore_for_file: camel_case_types
 // ignore_for_file: subtype_of_sealed_class
 
-class _FakeHTTP_0 extends _i1.SmartFake implements _i2.HTTP {
-  _FakeHTTP_0(
+class _FakeFusionInfo_0 extends _i1.SmartFake implements _i2.FusionInfo {
+  _FakeFusionInfo_0(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -57,9 +59,19 @@ class _FakeHTTP_0 extends _i1.SmartFake implements _i2.HTTP {
         );
 }
 
-class _FakeExchangeResponse_1<T> extends _i1.SmartFake
-    implements _i3.ExchangeResponse<T> {
-  _FakeExchangeResponse_1(
+class _FakeHTTP_1 extends _i1.SmartFake implements _i3.HTTP {
+  _FakeHTTP_1(
+    Object parent,
+    Invocation parentInvocation,
+  ) : super(
+          parent,
+          parentInvocation,
+        );
+}
+
+class _FakeExchangeResponse_2<T> extends _i1.SmartFake
+    implements _i4.ExchangeResponse<T> {
+  _FakeExchangeResponse_2(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -71,7 +83,7 @@ class _FakeExchangeResponse_1<T> extends _i1.SmartFake
 /// A class which mocks [Prefs].
 ///
 /// See the documentation for Mockito's code generation for more information.
-class MockPrefs extends _i1.Mock implements _i4.Prefs {
+class MockPrefs extends _i1.Mock implements _i5.Prefs {
   MockPrefs() {
     _i1.throwOnMissingStub(this);
   }
@@ -127,12 +139,12 @@ class MockPrefs extends _i1.Mock implements _i4.Prefs {
         returnValueForMissingStub: null,
       );
   @override
-  _i5.SyncingType get syncType => (super.noSuchMethod(
+  _i6.SyncingType get syncType => (super.noSuchMethod(
         Invocation.getter(#syncType),
-        returnValue: _i5.SyncingType.currentWalletOnly,
-      ) as _i5.SyncingType);
+        returnValue: _i6.SyncingType.currentWalletOnly,
+      ) as _i6.SyncingType);
   @override
-  set syncType(_i5.SyncingType? syncType) => super.noSuchMethod(
+  set syncType(_i6.SyncingType? syncType) => super.noSuchMethod(
         Invocation.setter(
           #syncType,
           syncType,
@@ -291,12 +303,12 @@ class MockPrefs extends _i1.Mock implements _i4.Prefs {
         returnValueForMissingStub: null,
       );
   @override
-  _i6.BackupFrequencyType get backupFrequencyType => (super.noSuchMethod(
+  _i7.BackupFrequencyType get backupFrequencyType => (super.noSuchMethod(
         Invocation.getter(#backupFrequencyType),
-        returnValue: _i6.BackupFrequencyType.everyTenMinutes,
-      ) as _i6.BackupFrequencyType);
+        returnValue: _i7.BackupFrequencyType.everyTenMinutes,
+      ) as _i7.BackupFrequencyType);
   @override
-  set backupFrequencyType(_i6.BackupFrequencyType? backupFrequencyType) =>
+  set backupFrequencyType(_i7.BackupFrequencyType? backupFrequencyType) =>
       super.noSuchMethod(
         Invocation.setter(
           #backupFrequencyType,
@@ -442,66 +454,82 @@ class MockPrefs extends _i1.Mock implements _i4.Prefs {
         returnValueForMissingStub: null,
       );
   @override
+  _i2.FusionInfo get fusionServerInfo => (super.noSuchMethod(
+        Invocation.getter(#fusionServerInfo),
+        returnValue: _FakeFusionInfo_0(
+          this,
+          Invocation.getter(#fusionServerInfo),
+        ),
+      ) as _i2.FusionInfo);
+  @override
+  set fusionServerInfo(_i2.FusionInfo? fusionServerInfo) => super.noSuchMethod(
+        Invocation.setter(
+          #fusionServerInfo,
+          fusionServerInfo,
+        ),
+        returnValueForMissingStub: null,
+      );
+  @override
   bool get hasListeners => (super.noSuchMethod(
         Invocation.getter(#hasListeners),
         returnValue: false,
       ) as bool);
   @override
-  _i7.Future<void> init() => (super.noSuchMethod(
+  _i8.Future<void> init() => (super.noSuchMethod(
         Invocation.method(
           #init,
           [],
         ),
-        returnValue: _i7.Future<void>.value(),
-        returnValueForMissingStub: _i7.Future<void>.value(),
-      ) as _i7.Future<void>);
+        returnValue: _i8.Future<void>.value(),
+        returnValueForMissingStub: _i8.Future<void>.value(),
+      ) as _i8.Future<void>);
   @override
-  _i7.Future<void> incrementCurrentNotificationIndex() => (super.noSuchMethod(
+  _i8.Future<void> incrementCurrentNotificationIndex() => (super.noSuchMethod(
         Invocation.method(
           #incrementCurrentNotificationIndex,
           [],
         ),
-        returnValue: _i7.Future<void>.value(),
-        returnValueForMissingStub: _i7.Future<void>.value(),
-      ) as _i7.Future<void>);
+        returnValue: _i8.Future<void>.value(),
+        returnValueForMissingStub: _i8.Future<void>.value(),
+      ) as _i8.Future<void>);
   @override
-  _i7.Future<bool> isExternalCallsSet() => (super.noSuchMethod(
+  _i8.Future<bool> isExternalCallsSet() => (super.noSuchMethod(
         Invocation.method(
           #isExternalCallsSet,
           [],
         ),
-        returnValue: _i7.Future<bool>.value(false),
-      ) as _i7.Future<bool>);
+        returnValue: _i8.Future<bool>.value(false),
+      ) as _i8.Future<bool>);
   @override
-  _i7.Future<void> saveUserID(String? userId) => (super.noSuchMethod(
+  _i8.Future<void> saveUserID(String? userId) => (super.noSuchMethod(
         Invocation.method(
           #saveUserID,
           [userId],
         ),
-        returnValue: _i7.Future<void>.value(),
-        returnValueForMissingStub: _i7.Future<void>.value(),
-      ) as _i7.Future<void>);
+        returnValue: _i8.Future<void>.value(),
+        returnValueForMissingStub: _i8.Future<void>.value(),
+      ) as _i8.Future<void>);
   @override
-  _i7.Future<void> saveSignupEpoch(int? signupEpoch) => (super.noSuchMethod(
+  _i8.Future<void> saveSignupEpoch(int? signupEpoch) => (super.noSuchMethod(
         Invocation.method(
           #saveSignupEpoch,
           [signupEpoch],
         ),
-        returnValue: _i7.Future<void>.value(),
-        returnValueForMissingStub: _i7.Future<void>.value(),
-      ) as _i7.Future<void>);
+        returnValue: _i8.Future<void>.value(),
+        returnValueForMissingStub: _i8.Future<void>.value(),
+      ) as _i8.Future<void>);
   @override
-  _i8.AmountUnit amountUnit(_i9.Coin? coin) => (super.noSuchMethod(
+  _i9.AmountUnit amountUnit(_i10.Coin? coin) => (super.noSuchMethod(
         Invocation.method(
           #amountUnit,
           [coin],
         ),
-        returnValue: _i8.AmountUnit.normal,
-      ) as _i8.AmountUnit);
+        returnValue: _i9.AmountUnit.normal,
+      ) as _i9.AmountUnit);
   @override
   void updateAmountUnit({
-    required _i9.Coin? coin,
-    required _i8.AmountUnit? amountUnit,
+    required _i10.Coin? coin,
+    required _i9.AmountUnit? amountUnit,
   }) =>
       super.noSuchMethod(
         Invocation.method(
@@ -515,7 +543,7 @@ class MockPrefs extends _i1.Mock implements _i4.Prefs {
         returnValueForMissingStub: null,
       );
   @override
-  int maxDecimals(_i9.Coin? coin) => (super.noSuchMethod(
+  int maxDecimals(_i10.Coin? coin) => (super.noSuchMethod(
         Invocation.method(
           #maxDecimals,
           [coin],
@@ -524,7 +552,7 @@ class MockPrefs extends _i1.Mock implements _i4.Prefs {
       ) as int);
   @override
   void updateMaxDecimals({
-    required _i9.Coin? coin,
+    required _i10.Coin? coin,
     required int? maxDecimals,
   }) =>
       super.noSuchMethod(
@@ -539,7 +567,7 @@ class MockPrefs extends _i1.Mock implements _i4.Prefs {
         returnValueForMissingStub: null,
       );
   @override
-  void addListener(_i10.VoidCallback? listener) => super.noSuchMethod(
+  void addListener(_i11.VoidCallback? listener) => super.noSuchMethod(
         Invocation.method(
           #addListener,
           [listener],
@@ -547,7 +575,7 @@ class MockPrefs extends _i1.Mock implements _i4.Prefs {
         returnValueForMissingStub: null,
       );
   @override
-  void removeListener(_i10.VoidCallback? listener) => super.noSuchMethod(
+  void removeListener(_i11.VoidCallback? listener) => super.noSuchMethod(
         Invocation.method(
           #removeListener,
           [listener],
@@ -575,29 +603,29 @@ class MockPrefs extends _i1.Mock implements _i4.Prefs {
 /// A class which mocks [TradesService].
 ///
 /// See the documentation for Mockito's code generation for more information.
-class MockTradesService extends _i1.Mock implements _i11.TradesService {
+class MockTradesService extends _i1.Mock implements _i12.TradesService {
   MockTradesService() {
     _i1.throwOnMissingStub(this);
   }
 
   @override
-  List<_i12.Trade> get trades => (super.noSuchMethod(
+  List<_i13.Trade> get trades => (super.noSuchMethod(
         Invocation.getter(#trades),
-        returnValue: <_i12.Trade>[],
-      ) as List<_i12.Trade>);
+        returnValue: <_i13.Trade>[],
+      ) as List<_i13.Trade>);
   @override
   bool get hasListeners => (super.noSuchMethod(
         Invocation.getter(#hasListeners),
         returnValue: false,
       ) as bool);
   @override
-  _i12.Trade? get(String? tradeId) => (super.noSuchMethod(Invocation.method(
+  _i13.Trade? get(String? tradeId) => (super.noSuchMethod(Invocation.method(
         #get,
         [tradeId],
-      )) as _i12.Trade?);
+      )) as _i13.Trade?);
   @override
-  _i7.Future<void> add({
-    required _i12.Trade? trade,
+  _i8.Future<void> add({
+    required _i13.Trade? trade,
     required bool? shouldNotifyListeners,
   }) =>
       (super.noSuchMethod(
@@ -609,12 +637,12 @@ class MockTradesService extends _i1.Mock implements _i11.TradesService {
             #shouldNotifyListeners: shouldNotifyListeners,
           },
         ),
-        returnValue: _i7.Future<void>.value(),
-        returnValueForMissingStub: _i7.Future<void>.value(),
-      ) as _i7.Future<void>);
+        returnValue: _i8.Future<void>.value(),
+        returnValueForMissingStub: _i8.Future<void>.value(),
+      ) as _i8.Future<void>);
   @override
-  _i7.Future<void> edit({
-    required _i12.Trade? trade,
+  _i8.Future<void> edit({
+    required _i13.Trade? trade,
     required bool? shouldNotifyListeners,
   }) =>
       (super.noSuchMethod(
@@ -626,12 +654,12 @@ class MockTradesService extends _i1.Mock implements _i11.TradesService {
             #shouldNotifyListeners: shouldNotifyListeners,
           },
         ),
-        returnValue: _i7.Future<void>.value(),
-        returnValueForMissingStub: _i7.Future<void>.value(),
-      ) as _i7.Future<void>);
+        returnValue: _i8.Future<void>.value(),
+        returnValueForMissingStub: _i8.Future<void>.value(),
+      ) as _i8.Future<void>);
   @override
-  _i7.Future<void> delete({
-    required _i12.Trade? trade,
+  _i8.Future<void> delete({
+    required _i13.Trade? trade,
     required bool? shouldNotifyListeners,
   }) =>
       (super.noSuchMethod(
@@ -643,11 +671,11 @@ class MockTradesService extends _i1.Mock implements _i11.TradesService {
             #shouldNotifyListeners: shouldNotifyListeners,
           },
         ),
-        returnValue: _i7.Future<void>.value(),
-        returnValueForMissingStub: _i7.Future<void>.value(),
-      ) as _i7.Future<void>);
+        returnValue: _i8.Future<void>.value(),
+        returnValueForMissingStub: _i8.Future<void>.value(),
+      ) as _i8.Future<void>);
   @override
-  _i7.Future<void> deleteByUuid({
+  _i8.Future<void> deleteByUuid({
     required String? uuid,
     required bool? shouldNotifyListeners,
   }) =>
@@ -660,11 +688,11 @@ class MockTradesService extends _i1.Mock implements _i11.TradesService {
             #shouldNotifyListeners: shouldNotifyListeners,
           },
         ),
-        returnValue: _i7.Future<void>.value(),
-        returnValueForMissingStub: _i7.Future<void>.value(),
-      ) as _i7.Future<void>);
+        returnValue: _i8.Future<void>.value(),
+        returnValueForMissingStub: _i8.Future<void>.value(),
+      ) as _i8.Future<void>);
   @override
-  void addListener(_i10.VoidCallback? listener) => super.noSuchMethod(
+  void addListener(_i11.VoidCallback? listener) => super.noSuchMethod(
         Invocation.method(
           #addListener,
           [listener],
@@ -672,7 +700,7 @@ class MockTradesService extends _i1.Mock implements _i11.TradesService {
         returnValueForMissingStub: null,
       );
   @override
-  void removeListener(_i10.VoidCallback? listener) => super.noSuchMethod(
+  void removeListener(_i11.VoidCallback? listener) => super.noSuchMethod(
         Invocation.method(
           #removeListener,
           [listener],
@@ -700,7 +728,7 @@ class MockTradesService extends _i1.Mock implements _i11.TradesService {
 /// A class which mocks [TradeNotesService].
 ///
 /// See the documentation for Mockito's code generation for more information.
-class MockTradeNotesService extends _i1.Mock implements _i13.TradeNotesService {
+class MockTradeNotesService extends _i1.Mock implements _i14.TradeNotesService {
   MockTradeNotesService() {
     _i1.throwOnMissingStub(this);
   }
@@ -725,7 +753,7 @@ class MockTradeNotesService extends _i1.Mock implements _i13.TradeNotesService {
         returnValue: '',
       ) as String);
   @override
-  _i7.Future<void> set({
+  _i8.Future<void> set({
     required String? tradeId,
     required String? note,
   }) =>
@@ -738,21 +766,21 @@ class MockTradeNotesService extends _i1.Mock implements _i13.TradeNotesService {
             #note: note,
           },
         ),
-        returnValue: _i7.Future<void>.value(),
-        returnValueForMissingStub: _i7.Future<void>.value(),
-      ) as _i7.Future<void>);
+        returnValue: _i8.Future<void>.value(),
+        returnValueForMissingStub: _i8.Future<void>.value(),
+      ) as _i8.Future<void>);
   @override
-  _i7.Future<void> delete({required String? tradeId}) => (super.noSuchMethod(
+  _i8.Future<void> delete({required String? tradeId}) => (super.noSuchMethod(
         Invocation.method(
           #delete,
           [],
           {#tradeId: tradeId},
         ),
-        returnValue: _i7.Future<void>.value(),
-        returnValueForMissingStub: _i7.Future<void>.value(),
-      ) as _i7.Future<void>);
+        returnValue: _i8.Future<void>.value(),
+        returnValueForMissingStub: _i8.Future<void>.value(),
+      ) as _i8.Future<void>);
   @override
-  void addListener(_i10.VoidCallback? listener) => super.noSuchMethod(
+  void addListener(_i11.VoidCallback? listener) => super.noSuchMethod(
         Invocation.method(
           #addListener,
           [listener],
@@ -760,7 +788,7 @@ class MockTradeNotesService extends _i1.Mock implements _i13.TradeNotesService {
         returnValueForMissingStub: null,
       );
   @override
-  void removeListener(_i10.VoidCallback? listener) => super.noSuchMethod(
+  void removeListener(_i11.VoidCallback? listener) => super.noSuchMethod(
         Invocation.method(
           #removeListener,
           [listener],
@@ -788,21 +816,21 @@ class MockTradeNotesService extends _i1.Mock implements _i13.TradeNotesService {
 /// A class which mocks [ChangeNowAPI].
 ///
 /// See the documentation for Mockito's code generation for more information.
-class MockChangeNowAPI extends _i1.Mock implements _i14.ChangeNowAPI {
+class MockChangeNowAPI extends _i1.Mock implements _i15.ChangeNowAPI {
   MockChangeNowAPI() {
     _i1.throwOnMissingStub(this);
   }
 
   @override
-  _i2.HTTP get client => (super.noSuchMethod(
+  _i3.HTTP get client => (super.noSuchMethod(
         Invocation.getter(#client),
-        returnValue: _FakeHTTP_0(
+        returnValue: _FakeHTTP_1(
           this,
           Invocation.getter(#client),
         ),
-      ) as _i2.HTTP);
+      ) as _i3.HTTP);
   @override
-  _i7.Future<_i3.ExchangeResponse<List<_i15.Currency>>> getAvailableCurrencies({
+  _i8.Future<_i4.ExchangeResponse<List<_i16.Currency>>> getAvailableCurrencies({
     bool? fixedRate,
     bool? active,
   }) =>
@@ -816,8 +844,8 @@ class MockChangeNowAPI extends _i1.Mock implements _i14.ChangeNowAPI {
           },
         ),
         returnValue:
-            _i7.Future<_i3.ExchangeResponse<List<_i15.Currency>>>.value(
-                _FakeExchangeResponse_1<List<_i15.Currency>>(
+            _i8.Future<_i4.ExchangeResponse<List<_i16.Currency>>>.value(
+                _FakeExchangeResponse_2<List<_i16.Currency>>(
           this,
           Invocation.method(
             #getAvailableCurrencies,
@@ -828,26 +856,26 @@ class MockChangeNowAPI extends _i1.Mock implements _i14.ChangeNowAPI {
             },
           ),
         )),
-      ) as _i7.Future<_i3.ExchangeResponse<List<_i15.Currency>>>);
+      ) as _i8.Future<_i4.ExchangeResponse<List<_i16.Currency>>>);
   @override
-  _i7.Future<_i3.ExchangeResponse<List<_i15.Currency>>> getCurrenciesV2() =>
+  _i8.Future<_i4.ExchangeResponse<List<_i16.Currency>>> getCurrenciesV2() =>
       (super.noSuchMethod(
         Invocation.method(
           #getCurrenciesV2,
           [],
         ),
         returnValue:
-            _i7.Future<_i3.ExchangeResponse<List<_i15.Currency>>>.value(
-                _FakeExchangeResponse_1<List<_i15.Currency>>(
+            _i8.Future<_i4.ExchangeResponse<List<_i16.Currency>>>.value(
+                _FakeExchangeResponse_2<List<_i16.Currency>>(
           this,
           Invocation.method(
             #getCurrenciesV2,
             [],
           ),
         )),
-      ) as _i7.Future<_i3.ExchangeResponse<List<_i15.Currency>>>);
+      ) as _i8.Future<_i4.ExchangeResponse<List<_i16.Currency>>>);
   @override
-  _i7.Future<_i3.ExchangeResponse<List<_i15.Currency>>> getPairedCurrencies({
+  _i8.Future<_i4.ExchangeResponse<List<_i16.Currency>>> getPairedCurrencies({
     required String? ticker,
     bool? fixedRate,
   }) =>
@@ -861,8 +889,8 @@ class MockChangeNowAPI extends _i1.Mock implements _i14.ChangeNowAPI {
           },
         ),
         returnValue:
-            _i7.Future<_i3.ExchangeResponse<List<_i15.Currency>>>.value(
-                _FakeExchangeResponse_1<List<_i15.Currency>>(
+            _i8.Future<_i4.ExchangeResponse<List<_i16.Currency>>>.value(
+                _FakeExchangeResponse_2<List<_i16.Currency>>(
           this,
           Invocation.method(
             #getPairedCurrencies,
@@ -873,9 +901,9 @@ class MockChangeNowAPI extends _i1.Mock implements _i14.ChangeNowAPI {
             },
           ),
         )),
-      ) as _i7.Future<_i3.ExchangeResponse<List<_i15.Currency>>>);
+      ) as _i8.Future<_i4.ExchangeResponse<List<_i16.Currency>>>);
   @override
-  _i7.Future<_i3.ExchangeResponse<_i16.Decimal>> getMinimalExchangeAmount({
+  _i8.Future<_i4.ExchangeResponse<_i17.Decimal>> getMinimalExchangeAmount({
     required String? fromTicker,
     required String? toTicker,
     String? apiKey,
@@ -890,8 +918,8 @@ class MockChangeNowAPI extends _i1.Mock implements _i14.ChangeNowAPI {
             #apiKey: apiKey,
           },
         ),
-        returnValue: _i7.Future<_i3.ExchangeResponse<_i16.Decimal>>.value(
-            _FakeExchangeResponse_1<_i16.Decimal>(
+        returnValue: _i8.Future<_i4.ExchangeResponse<_i17.Decimal>>.value(
+            _FakeExchangeResponse_2<_i17.Decimal>(
           this,
           Invocation.method(
             #getMinimalExchangeAmount,
@@ -903,9 +931,9 @@ class MockChangeNowAPI extends _i1.Mock implements _i14.ChangeNowAPI {
             },
           ),
         )),
-      ) as _i7.Future<_i3.ExchangeResponse<_i16.Decimal>>);
+      ) as _i8.Future<_i4.ExchangeResponse<_i17.Decimal>>);
   @override
-  _i7.Future<_i3.ExchangeResponse<_i17.Range>> getRange({
+  _i8.Future<_i4.ExchangeResponse<_i18.Range>> getRange({
     required String? fromTicker,
     required String? toTicker,
     required bool? isFixedRate,
@@ -922,8 +950,8 @@ class MockChangeNowAPI extends _i1.Mock implements _i14.ChangeNowAPI {
             #apiKey: apiKey,
           },
         ),
-        returnValue: _i7.Future<_i3.ExchangeResponse<_i17.Range>>.value(
-            _FakeExchangeResponse_1<_i17.Range>(
+        returnValue: _i8.Future<_i4.ExchangeResponse<_i18.Range>>.value(
+            _FakeExchangeResponse_2<_i18.Range>(
           this,
           Invocation.method(
             #getRange,
@@ -936,12 +964,12 @@ class MockChangeNowAPI extends _i1.Mock implements _i14.ChangeNowAPI {
             },
           ),
         )),
-      ) as _i7.Future<_i3.ExchangeResponse<_i17.Range>>);
+      ) as _i8.Future<_i4.ExchangeResponse<_i18.Range>>);
   @override
-  _i7.Future<_i3.ExchangeResponse<_i18.Estimate>> getEstimatedExchangeAmount({
+  _i8.Future<_i4.ExchangeResponse<_i19.Estimate>> getEstimatedExchangeAmount({
     required String? fromTicker,
     required String? toTicker,
-    required _i16.Decimal? fromAmount,
+    required _i17.Decimal? fromAmount,
     String? apiKey,
   }) =>
       (super.noSuchMethod(
@@ -955,8 +983,8 @@ class MockChangeNowAPI extends _i1.Mock implements _i14.ChangeNowAPI {
             #apiKey: apiKey,
           },
         ),
-        returnValue: _i7.Future<_i3.ExchangeResponse<_i18.Estimate>>.value(
-            _FakeExchangeResponse_1<_i18.Estimate>(
+        returnValue: _i8.Future<_i4.ExchangeResponse<_i19.Estimate>>.value(
+            _FakeExchangeResponse_2<_i19.Estimate>(
           this,
           Invocation.method(
             #getEstimatedExchangeAmount,
@@ -969,13 +997,13 @@ class MockChangeNowAPI extends _i1.Mock implements _i14.ChangeNowAPI {
             },
           ),
         )),
-      ) as _i7.Future<_i3.ExchangeResponse<_i18.Estimate>>);
+      ) as _i8.Future<_i4.ExchangeResponse<_i19.Estimate>>);
   @override
-  _i7.Future<_i3.ExchangeResponse<_i18.Estimate>>
+  _i8.Future<_i4.ExchangeResponse<_i19.Estimate>>
       getEstimatedExchangeAmountFixedRate({
     required String? fromTicker,
     required String? toTicker,
-    required _i16.Decimal? fromAmount,
+    required _i17.Decimal? fromAmount,
     required bool? reversed,
     bool? useRateId = true,
     String? apiKey,
@@ -993,8 +1021,8 @@ class MockChangeNowAPI extends _i1.Mock implements _i14.ChangeNowAPI {
                 #apiKey: apiKey,
               },
             ),
-            returnValue: _i7.Future<_i3.ExchangeResponse<_i18.Estimate>>.value(
-                _FakeExchangeResponse_1<_i18.Estimate>(
+            returnValue: _i8.Future<_i4.ExchangeResponse<_i19.Estimate>>.value(
+                _FakeExchangeResponse_2<_i19.Estimate>(
               this,
               Invocation.method(
                 #getEstimatedExchangeAmountFixedRate,
@@ -1009,17 +1037,17 @@ class MockChangeNowAPI extends _i1.Mock implements _i14.ChangeNowAPI {
                 },
               ),
             )),
-          ) as _i7.Future<_i3.ExchangeResponse<_i18.Estimate>>);
+          ) as _i8.Future<_i4.ExchangeResponse<_i19.Estimate>>);
   @override
-  _i7.Future<_i3.ExchangeResponse<_i19.CNExchangeEstimate>>
+  _i8.Future<_i4.ExchangeResponse<_i20.CNExchangeEstimate>>
       getEstimatedExchangeAmountV2({
     required String? fromTicker,
     required String? toTicker,
-    required _i19.CNEstimateType? fromOrTo,
-    required _i16.Decimal? amount,
+    required _i20.CNEstimateType? fromOrTo,
+    required _i17.Decimal? amount,
     String? fromNetwork,
     String? toNetwork,
-    _i19.CNFlowType? flow = _i19.CNFlowType.standard,
+    _i20.CNFlowType? flow = _i20.CNFlowType.standard,
     String? apiKey,
   }) =>
           (super.noSuchMethod(
@@ -1038,8 +1066,8 @@ class MockChangeNowAPI extends _i1.Mock implements _i14.ChangeNowAPI {
               },
             ),
             returnValue:
-                _i7.Future<_i3.ExchangeResponse<_i19.CNExchangeEstimate>>.value(
-                    _FakeExchangeResponse_1<_i19.CNExchangeEstimate>(
+                _i8.Future<_i4.ExchangeResponse<_i20.CNExchangeEstimate>>.value(
+                    _FakeExchangeResponse_2<_i20.CNExchangeEstimate>(
               this,
               Invocation.method(
                 #getEstimatedExchangeAmountV2,
@@ -1056,18 +1084,18 @@ class MockChangeNowAPI extends _i1.Mock implements _i14.ChangeNowAPI {
                 },
               ),
             )),
-          ) as _i7.Future<_i3.ExchangeResponse<_i19.CNExchangeEstimate>>);
+          ) as _i8.Future<_i4.ExchangeResponse<_i20.CNExchangeEstimate>>);
   @override
-  _i7.Future<_i3.ExchangeResponse<List<_i20.FixedRateMarket>>>
+  _i8.Future<_i4.ExchangeResponse<List<_i21.FixedRateMarket>>>
       getAvailableFixedRateMarkets({String? apiKey}) => (super.noSuchMethod(
             Invocation.method(
               #getAvailableFixedRateMarkets,
               [],
               {#apiKey: apiKey},
             ),
-            returnValue: _i7
-                .Future<_i3.ExchangeResponse<List<_i20.FixedRateMarket>>>.value(
-                _FakeExchangeResponse_1<List<_i20.FixedRateMarket>>(
+            returnValue: _i8
+                .Future<_i4.ExchangeResponse<List<_i21.FixedRateMarket>>>.value(
+                _FakeExchangeResponse_2<List<_i21.FixedRateMarket>>(
               this,
               Invocation.method(
                 #getAvailableFixedRateMarkets,
@@ -1075,14 +1103,14 @@ class MockChangeNowAPI extends _i1.Mock implements _i14.ChangeNowAPI {
                 {#apiKey: apiKey},
               ),
             )),
-          ) as _i7.Future<_i3.ExchangeResponse<List<_i20.FixedRateMarket>>>);
+          ) as _i8.Future<_i4.ExchangeResponse<List<_i21.FixedRateMarket>>>);
   @override
-  _i7.Future<_i3.ExchangeResponse<_i21.ExchangeTransaction>>
+  _i8.Future<_i4.ExchangeResponse<_i22.ExchangeTransaction>>
       createStandardExchangeTransaction({
     required String? fromTicker,
     required String? toTicker,
     required String? receivingAddress,
-    required _i16.Decimal? amount,
+    required _i17.Decimal? amount,
     String? extraId = r'',
     String? userId = r'',
     String? contactEmail = r'',
@@ -1107,9 +1135,9 @@ class MockChangeNowAPI extends _i1.Mock implements _i14.ChangeNowAPI {
                 #apiKey: apiKey,
               },
             ),
-            returnValue: _i7
-                .Future<_i3.ExchangeResponse<_i21.ExchangeTransaction>>.value(
-                _FakeExchangeResponse_1<_i21.ExchangeTransaction>(
+            returnValue: _i8
+                .Future<_i4.ExchangeResponse<_i22.ExchangeTransaction>>.value(
+                _FakeExchangeResponse_2<_i22.ExchangeTransaction>(
               this,
               Invocation.method(
                 #createStandardExchangeTransaction,
@@ -1128,14 +1156,14 @@ class MockChangeNowAPI extends _i1.Mock implements _i14.ChangeNowAPI {
                 },
               ),
             )),
-          ) as _i7.Future<_i3.ExchangeResponse<_i21.ExchangeTransaction>>);
+          ) as _i8.Future<_i4.ExchangeResponse<_i22.ExchangeTransaction>>);
   @override
-  _i7.Future<_i3.ExchangeResponse<_i21.ExchangeTransaction>>
+  _i8.Future<_i4.ExchangeResponse<_i22.ExchangeTransaction>>
       createFixedRateExchangeTransaction({
     required String? fromTicker,
     required String? toTicker,
     required String? receivingAddress,
-    required _i16.Decimal? amount,
+    required _i17.Decimal? amount,
     required String? rateId,
     required bool? reversed,
     String? extraId = r'',
@@ -1164,9 +1192,9 @@ class MockChangeNowAPI extends _i1.Mock implements _i14.ChangeNowAPI {
                 #apiKey: apiKey,
               },
             ),
-            returnValue: _i7
-                .Future<_i3.ExchangeResponse<_i21.ExchangeTransaction>>.value(
-                _FakeExchangeResponse_1<_i21.ExchangeTransaction>(
+            returnValue: _i8
+                .Future<_i4.ExchangeResponse<_i22.ExchangeTransaction>>.value(
+                _FakeExchangeResponse_2<_i22.ExchangeTransaction>(
               this,
               Invocation.method(
                 #createFixedRateExchangeTransaction,
@@ -1187,11 +1215,11 @@ class MockChangeNowAPI extends _i1.Mock implements _i14.ChangeNowAPI {
                 },
               ),
             )),
-          ) as _i7.Future<_i3.ExchangeResponse<_i21.ExchangeTransaction>>);
+          ) as _i8.Future<_i4.ExchangeResponse<_i22.ExchangeTransaction>>);
   @override
-  _i7.Future<
-      _i3
-      .ExchangeResponse<_i22.ExchangeTransactionStatus>> getTransactionStatus({
+  _i8.Future<
+      _i4
+      .ExchangeResponse<_i23.ExchangeTransactionStatus>> getTransactionStatus({
     required String? id,
     String? apiKey,
   }) =>
@@ -1204,9 +1232,9 @@ class MockChangeNowAPI extends _i1.Mock implements _i14.ChangeNowAPI {
             #apiKey: apiKey,
           },
         ),
-        returnValue: _i7
-            .Future<_i3.ExchangeResponse<_i22.ExchangeTransactionStatus>>.value(
-            _FakeExchangeResponse_1<_i22.ExchangeTransactionStatus>(
+        returnValue: _i8
+            .Future<_i4.ExchangeResponse<_i23.ExchangeTransactionStatus>>.value(
+            _FakeExchangeResponse_2<_i23.ExchangeTransactionStatus>(
           this,
           Invocation.method(
             #getTransactionStatus,
@@ -1217,9 +1245,9 @@ class MockChangeNowAPI extends _i1.Mock implements _i14.ChangeNowAPI {
             },
           ),
         )),
-      ) as _i7.Future<_i3.ExchangeResponse<_i22.ExchangeTransactionStatus>>);
+      ) as _i8.Future<_i4.ExchangeResponse<_i23.ExchangeTransactionStatus>>);
   @override
-  _i7.Future<_i3.ExchangeResponse<List<_i23.Pair>>>
+  _i8.Future<_i4.ExchangeResponse<List<_i24.Pair>>>
       getAvailableFloatingRatePairs({bool? includePartners = false}) =>
           (super.noSuchMethod(
             Invocation.method(
@@ -1228,8 +1256,8 @@ class MockChangeNowAPI extends _i1.Mock implements _i14.ChangeNowAPI {
               {#includePartners: includePartners},
             ),
             returnValue:
-                _i7.Future<_i3.ExchangeResponse<List<_i23.Pair>>>.value(
-                    _FakeExchangeResponse_1<List<_i23.Pair>>(
+                _i8.Future<_i4.ExchangeResponse<List<_i24.Pair>>>.value(
+                    _FakeExchangeResponse_2<List<_i24.Pair>>(
               this,
               Invocation.method(
                 #getAvailableFloatingRatePairs,
@@ -1237,5 +1265,5 @@ class MockChangeNowAPI extends _i1.Mock implements _i14.ChangeNowAPI {
                 {#includePartners: includePartners},
               ),
             )),
-          ) as _i7.Future<_i3.ExchangeResponse<List<_i23.Pair>>>);
+          ) as _i8.Future<_i4.ExchangeResponse<List<_i24.Pair>>>);
 }
diff --git a/test/screen_tests/lockscreen_view_screen_test.mocks.dart b/test/screen_tests/lockscreen_view_screen_test.mocks.dart
index dd8f32b04..2e72a280e 100644
--- a/test/screen_tests/lockscreen_view_screen_test.mocks.dart
+++ b/test/screen_tests/lockscreen_view_screen_test.mocks.dart
@@ -680,6 +680,11 @@ class MockManager extends _i1.Mock implements _i13.Manager {
         returnValue: false,
       ) as bool);
   @override
+  bool get hasFusionSupport => (super.noSuchMethod(
+        Invocation.getter(#hasFusionSupport),
+        returnValue: false,
+      ) as bool);
+  @override
   int get rescanOnOpenVersion => (super.noSuchMethod(
         Invocation.getter(#rescanOnOpenVersion),
         returnValue: 0,
diff --git a/test/screen_tests/main_view_tests/main_view_screen_testA_test.mocks.dart b/test/screen_tests/main_view_tests/main_view_screen_testA_test.mocks.dart
index 87686d271..e85c12de3 100644
--- a/test/screen_tests/main_view_tests/main_view_screen_testA_test.mocks.dart
+++ b/test/screen_tests/main_view_tests/main_view_screen_testA_test.mocks.dart
@@ -467,6 +467,11 @@ class MockManager extends _i1.Mock implements _i10.Manager {
         returnValue: false,
       ) as bool);
   @override
+  bool get hasFusionSupport => (super.noSuchMethod(
+        Invocation.getter(#hasFusionSupport),
+        returnValue: false,
+      ) as bool);
+  @override
   int get rescanOnOpenVersion => (super.noSuchMethod(
         Invocation.getter(#rescanOnOpenVersion),
         returnValue: 0,
diff --git a/test/screen_tests/main_view_tests/main_view_screen_testB_test.mocks.dart b/test/screen_tests/main_view_tests/main_view_screen_testB_test.mocks.dart
index 221cbb329..577863c66 100644
--- a/test/screen_tests/main_view_tests/main_view_screen_testB_test.mocks.dart
+++ b/test/screen_tests/main_view_tests/main_view_screen_testB_test.mocks.dart
@@ -467,6 +467,11 @@ class MockManager extends _i1.Mock implements _i10.Manager {
         returnValue: false,
       ) as bool);
   @override
+  bool get hasFusionSupport => (super.noSuchMethod(
+        Invocation.getter(#hasFusionSupport),
+        returnValue: false,
+      ) as bool);
+  @override
   int get rescanOnOpenVersion => (super.noSuchMethod(
         Invocation.getter(#rescanOnOpenVersion),
         returnValue: 0,
diff --git a/test/screen_tests/main_view_tests/main_view_screen_testC_test.mocks.dart b/test/screen_tests/main_view_tests/main_view_screen_testC_test.mocks.dart
index abb608127..900b926c9 100644
--- a/test/screen_tests/main_view_tests/main_view_screen_testC_test.mocks.dart
+++ b/test/screen_tests/main_view_tests/main_view_screen_testC_test.mocks.dart
@@ -467,6 +467,11 @@ class MockManager extends _i1.Mock implements _i10.Manager {
         returnValue: false,
       ) as bool);
   @override
+  bool get hasFusionSupport => (super.noSuchMethod(
+        Invocation.getter(#hasFusionSupport),
+        returnValue: false,
+      ) as bool);
+  @override
   int get rescanOnOpenVersion => (super.noSuchMethod(
         Invocation.getter(#rescanOnOpenVersion),
         returnValue: 0,
diff --git a/test/screen_tests/onboarding/backup_key_view_screen_test.mocks.dart b/test/screen_tests/onboarding/backup_key_view_screen_test.mocks.dart
index b60b30832..90c66fe48 100644
--- a/test/screen_tests/onboarding/backup_key_view_screen_test.mocks.dart
+++ b/test/screen_tests/onboarding/backup_key_view_screen_test.mocks.dart
@@ -234,6 +234,11 @@ class MockManager extends _i1.Mock implements _i6.Manager {
         returnValue: false,
       ) as bool);
   @override
+  bool get hasFusionSupport => (super.noSuchMethod(
+        Invocation.getter(#hasFusionSupport),
+        returnValue: false,
+      ) as bool);
+  @override
   int get rescanOnOpenVersion => (super.noSuchMethod(
         Invocation.getter(#rescanOnOpenVersion),
         returnValue: 0,
diff --git a/test/screen_tests/onboarding/backup_key_warning_view_screen_test.mocks.dart b/test/screen_tests/onboarding/backup_key_warning_view_screen_test.mocks.dart
index 90907cd14..78f26c643 100644
--- a/test/screen_tests/onboarding/backup_key_warning_view_screen_test.mocks.dart
+++ b/test/screen_tests/onboarding/backup_key_warning_view_screen_test.mocks.dart
@@ -465,6 +465,11 @@ class MockManager extends _i1.Mock implements _i10.Manager {
         returnValue: false,
       ) as bool);
   @override
+  bool get hasFusionSupport => (super.noSuchMethod(
+        Invocation.getter(#hasFusionSupport),
+        returnValue: false,
+      ) as bool);
+  @override
   int get rescanOnOpenVersion => (super.noSuchMethod(
         Invocation.getter(#rescanOnOpenVersion),
         returnValue: 0,
diff --git a/test/screen_tests/onboarding/create_pin_view_screen_test.mocks.dart b/test/screen_tests/onboarding/create_pin_view_screen_test.mocks.dart
index 460a35f50..da0bf466e 100644
--- a/test/screen_tests/onboarding/create_pin_view_screen_test.mocks.dart
+++ b/test/screen_tests/onboarding/create_pin_view_screen_test.mocks.dart
@@ -680,6 +680,11 @@ class MockManager extends _i1.Mock implements _i13.Manager {
         returnValue: false,
       ) as bool);
   @override
+  bool get hasFusionSupport => (super.noSuchMethod(
+        Invocation.getter(#hasFusionSupport),
+        returnValue: false,
+      ) as bool);
+  @override
   int get rescanOnOpenVersion => (super.noSuchMethod(
         Invocation.getter(#rescanOnOpenVersion),
         returnValue: 0,
diff --git a/test/screen_tests/onboarding/restore_wallet_view_screen_test.mocks.dart b/test/screen_tests/onboarding/restore_wallet_view_screen_test.mocks.dart
index b4a8329da..6da3bf138 100644
--- a/test/screen_tests/onboarding/restore_wallet_view_screen_test.mocks.dart
+++ b/test/screen_tests/onboarding/restore_wallet_view_screen_test.mocks.dart
@@ -521,6 +521,11 @@ class MockManager extends _i1.Mock implements _i13.Manager {
         returnValue: false,
       ) as bool);
   @override
+  bool get hasFusionSupport => (super.noSuchMethod(
+        Invocation.getter(#hasFusionSupport),
+        returnValue: false,
+      ) as bool);
+  @override
   int get rescanOnOpenVersion => (super.noSuchMethod(
         Invocation.getter(#rescanOnOpenVersion),
         returnValue: 0,
diff --git a/test/screen_tests/onboarding/verify_backup_key_view_screen_test.mocks.dart b/test/screen_tests/onboarding/verify_backup_key_view_screen_test.mocks.dart
index 25241ab80..30dd39893 100644
--- a/test/screen_tests/onboarding/verify_backup_key_view_screen_test.mocks.dart
+++ b/test/screen_tests/onboarding/verify_backup_key_view_screen_test.mocks.dart
@@ -234,6 +234,11 @@ class MockManager extends _i1.Mock implements _i6.Manager {
         returnValue: false,
       ) as bool);
   @override
+  bool get hasFusionSupport => (super.noSuchMethod(
+        Invocation.getter(#hasFusionSupport),
+        returnValue: false,
+      ) as bool);
+  @override
   int get rescanOnOpenVersion => (super.noSuchMethod(
         Invocation.getter(#rescanOnOpenVersion),
         returnValue: 0,
diff --git a/test/screen_tests/settings_view/settings_subviews/currency_view_screen_test.mocks.dart b/test/screen_tests/settings_view/settings_subviews/currency_view_screen_test.mocks.dart
index d77078d9c..34810b643 100644
--- a/test/screen_tests/settings_view/settings_subviews/currency_view_screen_test.mocks.dart
+++ b/test/screen_tests/settings_view/settings_subviews/currency_view_screen_test.mocks.dart
@@ -234,6 +234,11 @@ class MockManager extends _i1.Mock implements _i6.Manager {
         returnValue: false,
       ) as bool);
   @override
+  bool get hasFusionSupport => (super.noSuchMethod(
+        Invocation.getter(#hasFusionSupport),
+        returnValue: false,
+      ) as bool);
+  @override
   int get rescanOnOpenVersion => (super.noSuchMethod(
         Invocation.getter(#rescanOnOpenVersion),
         returnValue: 0,
diff --git a/test/screen_tests/settings_view/settings_subviews/network_settings_subviews/add_custom_node_view_screen_test.mocks.dart b/test/screen_tests/settings_view/settings_subviews/network_settings_subviews/add_custom_node_view_screen_test.mocks.dart
index 0b8976a88..5655d968d 100644
--- a/test/screen_tests/settings_view/settings_subviews/network_settings_subviews/add_custom_node_view_screen_test.mocks.dart
+++ b/test/screen_tests/settings_view/settings_subviews/network_settings_subviews/add_custom_node_view_screen_test.mocks.dart
@@ -449,6 +449,11 @@ class MockManager extends _i1.Mock implements _i12.Manager {
         returnValue: false,
       ) as bool);
   @override
+  bool get hasFusionSupport => (super.noSuchMethod(
+        Invocation.getter(#hasFusionSupport),
+        returnValue: false,
+      ) as bool);
+  @override
   int get rescanOnOpenVersion => (super.noSuchMethod(
         Invocation.getter(#rescanOnOpenVersion),
         returnValue: 0,
diff --git a/test/screen_tests/settings_view/settings_subviews/network_settings_subviews/node_details_view_screen_test.mocks.dart b/test/screen_tests/settings_view/settings_subviews/network_settings_subviews/node_details_view_screen_test.mocks.dart
index 803ef81c6..46fec4f9d 100644
--- a/test/screen_tests/settings_view/settings_subviews/network_settings_subviews/node_details_view_screen_test.mocks.dart
+++ b/test/screen_tests/settings_view/settings_subviews/network_settings_subviews/node_details_view_screen_test.mocks.dart
@@ -449,6 +449,11 @@ class MockManager extends _i1.Mock implements _i12.Manager {
         returnValue: false,
       ) as bool);
   @override
+  bool get hasFusionSupport => (super.noSuchMethod(
+        Invocation.getter(#hasFusionSupport),
+        returnValue: false,
+      ) as bool);
+  @override
   int get rescanOnOpenVersion => (super.noSuchMethod(
         Invocation.getter(#rescanOnOpenVersion),
         returnValue: 0,
diff --git a/test/screen_tests/settings_view/settings_subviews/wallet_backup_view_screen_test.mocks.dart b/test/screen_tests/settings_view/settings_subviews/wallet_backup_view_screen_test.mocks.dart
index 4e59b2a40..2ca2dadc6 100644
--- a/test/screen_tests/settings_view/settings_subviews/wallet_backup_view_screen_test.mocks.dart
+++ b/test/screen_tests/settings_view/settings_subviews/wallet_backup_view_screen_test.mocks.dart
@@ -234,6 +234,11 @@ class MockManager extends _i1.Mock implements _i6.Manager {
         returnValue: false,
       ) as bool);
   @override
+  bool get hasFusionSupport => (super.noSuchMethod(
+        Invocation.getter(#hasFusionSupport),
+        returnValue: false,
+      ) as bool);
+  @override
   int get rescanOnOpenVersion => (super.noSuchMethod(
         Invocation.getter(#rescanOnOpenVersion),
         returnValue: 0,
diff --git a/test/screen_tests/settings_view/settings_subviews/wallet_settings_subviews/rescan_warning_view_screen_test.mocks.dart b/test/screen_tests/settings_view/settings_subviews/wallet_settings_subviews/rescan_warning_view_screen_test.mocks.dart
index 151ecd1ab..7a6f10121 100644
--- a/test/screen_tests/settings_view/settings_subviews/wallet_settings_subviews/rescan_warning_view_screen_test.mocks.dart
+++ b/test/screen_tests/settings_view/settings_subviews/wallet_settings_subviews/rescan_warning_view_screen_test.mocks.dart
@@ -234,6 +234,11 @@ class MockManager extends _i1.Mock implements _i6.Manager {
         returnValue: false,
       ) as bool);
   @override
+  bool get hasFusionSupport => (super.noSuchMethod(
+        Invocation.getter(#hasFusionSupport),
+        returnValue: false,
+      ) as bool);
+  @override
   int get rescanOnOpenVersion => (super.noSuchMethod(
         Invocation.getter(#rescanOnOpenVersion),
         returnValue: 0,
diff --git a/test/screen_tests/settings_view/settings_subviews/wallet_settings_subviews/wallet_delete_mnemonic_view_screen_test.mocks.dart b/test/screen_tests/settings_view/settings_subviews/wallet_settings_subviews/wallet_delete_mnemonic_view_screen_test.mocks.dart
index d9e9603d3..bfbf51cce 100644
--- a/test/screen_tests/settings_view/settings_subviews/wallet_settings_subviews/wallet_delete_mnemonic_view_screen_test.mocks.dart
+++ b/test/screen_tests/settings_view/settings_subviews/wallet_settings_subviews/wallet_delete_mnemonic_view_screen_test.mocks.dart
@@ -465,6 +465,11 @@ class MockManager extends _i1.Mock implements _i10.Manager {
         returnValue: false,
       ) as bool);
   @override
+  bool get hasFusionSupport => (super.noSuchMethod(
+        Invocation.getter(#hasFusionSupport),
+        returnValue: false,
+      ) as bool);
+  @override
   int get rescanOnOpenVersion => (super.noSuchMethod(
         Invocation.getter(#rescanOnOpenVersion),
         returnValue: 0,
diff --git a/test/screen_tests/settings_view/settings_subviews/wallet_settings_view_screen_test.mocks.dart b/test/screen_tests/settings_view/settings_subviews/wallet_settings_view_screen_test.mocks.dart
index e0fae8b21..cae55e4e5 100644
--- a/test/screen_tests/settings_view/settings_subviews/wallet_settings_view_screen_test.mocks.dart
+++ b/test/screen_tests/settings_view/settings_subviews/wallet_settings_view_screen_test.mocks.dart
@@ -701,6 +701,11 @@ class MockManager extends _i1.Mock implements _i15.Manager {
         returnValue: false,
       ) as bool);
   @override
+  bool get hasFusionSupport => (super.noSuchMethod(
+        Invocation.getter(#hasFusionSupport),
+        returnValue: false,
+      ) as bool);
+  @override
   int get rescanOnOpenVersion => (super.noSuchMethod(
         Invocation.getter(#rescanOnOpenVersion),
         returnValue: 0,
diff --git a/test/screen_tests/settings_view/settings_view_screen_test.mocks.dart b/test/screen_tests/settings_view/settings_view_screen_test.mocks.dart
index 97837b511..fd36e25f6 100644
--- a/test/screen_tests/settings_view/settings_view_screen_test.mocks.dart
+++ b/test/screen_tests/settings_view/settings_view_screen_test.mocks.dart
@@ -465,6 +465,11 @@ class MockManager extends _i1.Mock implements _i10.Manager {
         returnValue: false,
       ) as bool);
   @override
+  bool get hasFusionSupport => (super.noSuchMethod(
+        Invocation.getter(#hasFusionSupport),
+        returnValue: false,
+      ) as bool);
+  @override
   int get rescanOnOpenVersion => (super.noSuchMethod(
         Invocation.getter(#rescanOnOpenVersion),
         returnValue: 0,
diff --git a/test/screen_tests/transaction_subviews/transaction_search_results_view_screen_test.mocks.dart b/test/screen_tests/transaction_subviews/transaction_search_results_view_screen_test.mocks.dart
index 97563c8ad..b32d80a56 100644
--- a/test/screen_tests/transaction_subviews/transaction_search_results_view_screen_test.mocks.dart
+++ b/test/screen_tests/transaction_subviews/transaction_search_results_view_screen_test.mocks.dart
@@ -236,6 +236,11 @@ class MockManager extends _i1.Mock implements _i6.Manager {
         returnValue: false,
       ) as bool);
   @override
+  bool get hasFusionSupport => (super.noSuchMethod(
+        Invocation.getter(#hasFusionSupport),
+        returnValue: false,
+      ) as bool);
+  @override
   int get rescanOnOpenVersion => (super.noSuchMethod(
         Invocation.getter(#rescanOnOpenVersion),
         returnValue: 0,
diff --git a/test/screen_tests/wallet_view/confirm_send_view_screen_test.mocks.dart b/test/screen_tests/wallet_view/confirm_send_view_screen_test.mocks.dart
index bab69e5d2..a30ef5112 100644
--- a/test/screen_tests/wallet_view/confirm_send_view_screen_test.mocks.dart
+++ b/test/screen_tests/wallet_view/confirm_send_view_screen_test.mocks.dart
@@ -235,6 +235,11 @@ class MockManager extends _i1.Mock implements _i6.Manager {
         returnValue: false,
       ) as bool);
   @override
+  bool get hasFusionSupport => (super.noSuchMethod(
+        Invocation.getter(#hasFusionSupport),
+        returnValue: false,
+      ) as bool);
+  @override
   int get rescanOnOpenVersion => (super.noSuchMethod(
         Invocation.getter(#rescanOnOpenVersion),
         returnValue: 0,
diff --git a/test/screen_tests/wallet_view/receive_view_screen_test.mocks.dart b/test/screen_tests/wallet_view/receive_view_screen_test.mocks.dart
index 75c6d795e..0bf963ecb 100644
--- a/test/screen_tests/wallet_view/receive_view_screen_test.mocks.dart
+++ b/test/screen_tests/wallet_view/receive_view_screen_test.mocks.dart
@@ -234,6 +234,11 @@ class MockManager extends _i1.Mock implements _i6.Manager {
         returnValue: false,
       ) as bool);
   @override
+  bool get hasFusionSupport => (super.noSuchMethod(
+        Invocation.getter(#hasFusionSupport),
+        returnValue: false,
+      ) as bool);
+  @override
   int get rescanOnOpenVersion => (super.noSuchMethod(
         Invocation.getter(#rescanOnOpenVersion),
         returnValue: 0,
diff --git a/test/screen_tests/wallet_view/send_view_screen_test.mocks.dart b/test/screen_tests/wallet_view/send_view_screen_test.mocks.dart
index eb261af73..80f4f26f3 100644
--- a/test/screen_tests/wallet_view/send_view_screen_test.mocks.dart
+++ b/test/screen_tests/wallet_view/send_view_screen_test.mocks.dart
@@ -276,6 +276,11 @@ class MockManager extends _i1.Mock implements _i9.Manager {
         returnValue: false,
       ) as bool);
   @override
+  bool get hasFusionSupport => (super.noSuchMethod(
+        Invocation.getter(#hasFusionSupport),
+        returnValue: false,
+      ) as bool);
+  @override
   int get rescanOnOpenVersion => (super.noSuchMethod(
         Invocation.getter(#rescanOnOpenVersion),
         returnValue: 0,
diff --git a/test/screen_tests/wallet_view/wallet_view_screen_test.mocks.dart b/test/screen_tests/wallet_view/wallet_view_screen_test.mocks.dart
index d43cb5430..6ea98befe 100644
--- a/test/screen_tests/wallet_view/wallet_view_screen_test.mocks.dart
+++ b/test/screen_tests/wallet_view/wallet_view_screen_test.mocks.dart
@@ -236,6 +236,11 @@ class MockManager extends _i1.Mock implements _i6.Manager {
         returnValue: false,
       ) as bool);
   @override
+  bool get hasFusionSupport => (super.noSuchMethod(
+        Invocation.getter(#hasFusionSupport),
+        returnValue: false,
+      ) as bool);
+  @override
   int get rescanOnOpenVersion => (super.noSuchMethod(
         Invocation.getter(#rescanOnOpenVersion),
         returnValue: 0,
diff --git a/test/services/coins/bitcoincash/bch_utils_test.dart b/test/services/coins/bitcoincash/bch_utils_test.dart
new file mode 100644
index 000000000..fb2e3220d
--- /dev/null
+++ b/test/services/coins/bitcoincash/bch_utils_test.dart
@@ -0,0 +1,46 @@
+import 'package:flutter_test/flutter_test.dart';
+import 'package:stackwallet/services/coins/bitcoincash/bch_utils.dart';
+import 'package:stackwallet/utilities/extensions/impl/string.dart';
+
+void main() {
+  test("script pub key check for SLP is true", () {
+    expect(
+      BchUtils.isSLP(
+          "6a04534c500001010747454e45534953044d5430320f4d757461626c652054657374"
+                  "2030321668747470733a2f2f46756c6c537461636b2e63617368200e9a18"
+                  "8911ec0f2ac10cc9425b457d10ba14151a64eb4640f95ed7dab9e8f62601"
+                  "004c00080000000000000001"
+              .toUint8ListFromHex),
+      true,
+    );
+  });
+
+  test("script pub key check for SLP is not true", () {
+    expect(
+      BchUtils.isSLP("76a914a78bb9aa1b54c859b5fe72e6f6f576248b3231c888ac"
+          .toUint8ListFromHex),
+      false,
+    );
+  });
+
+  test("script pub key check for fuze is true", () {
+    expect(
+      BchUtils.isFUZE("6a0446555a00204d662fb69f34dc23434a61c7bbb65c9f99a247f9c8"
+              "b377cb4de3cadf7542f8f0"
+          .toUint8ListFromHex),
+      true,
+    );
+  });
+
+  test("script pub key check for fuze is not true", () {
+    expect(
+      BchUtils.isFUZE(
+          "6a04534c500001010747454e45534953044d5430320f4d757461626c652054657374"
+                  "2030321668747470733a2f2f46756c6c537461636b2e63617368200e9a18"
+                  "8911ec0f2ac10cc9425b457d10ba14151a64eb4640f95ed7dab9e8f62601"
+                  "004c00080000000000000001"
+              .toUint8ListFromHex),
+      false,
+    );
+  });
+}
diff --git a/test/services/coins/bitcoincash/bitcoincash_wallet_test.dart b/test/services/coins/bitcoincash/bitcoincash_wallet_test.dart
index f3598dfa1..f5619ac9a 100644
--- a/test/services/coins/bitcoincash/bitcoincash_wallet_test.dart
+++ b/test/services/coins/bitcoincash/bitcoincash_wallet_test.dart
@@ -91,7 +91,7 @@ void main() async {
           mainnetWallet?.addressType(
               address: "1DP3PUePwMa5CoZwzjznVKhzdLsZftjcAT"),
           DerivePathType.bip44);
-      expect(secureStore.interactions, 0);
+      expect(secureStore.interactions, 2);
       verifyNoMoreInteractions(client);
       verifyNoMoreInteractions(cachedClient);
       verifyNoMoreInteractions(tracker);
@@ -102,7 +102,7 @@ void main() async {
           () => mainnetWallet?.addressType(
               address: "mhqpGtwhcR6gFuuRjLTpHo41919QfuGy8Y"),
           throwsArgumentError);
-      expect(secureStore.interactions, 0);
+      expect(secureStore.interactions, 2);
       verifyNoMoreInteractions(client);
       verifyNoMoreInteractions(cachedClient);
       verifyNoMoreInteractions(tracker);
@@ -113,7 +113,7 @@ void main() async {
           () => mainnetWallet?.addressType(
               address: "tb1qzzlm6mnc8k54mx6akehl8p9ray8r439va5ndyq"),
           throwsArgumentError);
-      expect(secureStore.interactions, 0);
+      expect(secureStore.interactions, 2);
       verifyNoMoreInteractions(client);
       verifyNoMoreInteractions(cachedClient);
       verifyNoMoreInteractions(tracker);
@@ -124,7 +124,7 @@ void main() async {
           () => mainnetWallet?.addressType(
               address: "mpMk94ETazqonHutyC1v6ajshgtP8oiFKU"),
           throwsArgumentError);
-      expect(secureStore.interactions, 0);
+      expect(secureStore.interactions, 2);
       verifyNoMoreInteractions(client);
       verifyNoMoreInteractions(cachedClient);
       verifyNoMoreInteractions(tracker);
@@ -136,7 +136,7 @@ void main() async {
               address:
                   "bitcoincash:qrwjyc4pewj9utzrtnh0whkzkuvy5q8wg52n254x6k"),
           DerivePathType.bip44);
-      expect(secureStore.interactions, 0);
+      expect(secureStore.interactions, 2);
       verifyNoMoreInteractions(client);
       verifyNoMoreInteractions(cachedClient);
       verifyNoMoreInteractions(tracker);
@@ -147,7 +147,7 @@ void main() async {
           mainnetWallet?.addressType(
               address: "qrwjyc4pewj9utzrtnh0whkzkuvy5q8wg52n254x6k"),
           DerivePathType.bip44);
-      expect(secureStore.interactions, 0);
+      expect(secureStore.interactions, 2);
       verifyNoMoreInteractions(client);
       verifyNoMoreInteractions(cachedClient);
       verifyNoMoreInteractions(tracker);
@@ -159,7 +159,7 @@ void main() async {
               address:
                   "bitcoincash:pzpp3nchmzzf0gr69lj82ymurg5u3ds6kcwr5m07np"),
           throwsArgumentError);
-      expect(secureStore.interactions, 0);
+      expect(secureStore.interactions, 2);
       verifyNoMoreInteractions(client);
       verifyNoMoreInteractions(cachedClient);
       verifyNoMoreInteractions(tracker);
@@ -170,7 +170,7 @@ void main() async {
           () => mainnetWallet?.addressType(
               address: "pzpp3nchmzzf0gr69lj82ymurg5u3ds6kcwr5m07np"),
           throwsArgumentError);
-      expect(secureStore.interactions, 0);
+      expect(secureStore.interactions, 2);
       verifyNoMoreInteractions(client);
       verifyNoMoreInteractions(cachedClient);
       verifyNoMoreInteractions(tracker);
@@ -208,7 +208,7 @@ void main() async {
       expect(
           mainnetWallet?.validateAddress("1DP3PUePwMa5CoZwzjznVKhzdLsZftjcAT"),
           true);
-      expect(secureStore.interactions, 0);
+      expect(secureStore.interactions, 2);
       verifyNoMoreInteractions(client);
       verifyNoMoreInteractions(cachedClient);
       verifyNoMoreInteractions(tracker);
@@ -219,7 +219,7 @@ void main() async {
           mainnetWallet?.validateAddress(
               "bitcoincash:qrwjyc4pewj9utzrtnh0whkzkuvy5q8wg52n254x6k"),
           true);
-      expect(secureStore.interactions, 0);
+      expect(secureStore.interactions, 2);
       verifyNoMoreInteractions(client);
       verifyNoMoreInteractions(cachedClient);
       verifyNoMoreInteractions(tracker);
@@ -230,7 +230,7 @@ void main() async {
           mainnetWallet
               ?.validateAddress("qrwjyc4pewj9utzrtnh0whkzkuvy5q8wg52n254x6k"),
           true);
-      expect(secureStore.interactions, 0);
+      expect(secureStore.interactions, 2);
       verifyNoMoreInteractions(client);
       verifyNoMoreInteractions(cachedClient);
       verifyNoMoreInteractions(tracker);
@@ -240,7 +240,7 @@ void main() async {
       expect(
           mainnetWallet?.validateAddress("mhqpGtwhcR6gFuuRjLTpHo41919QfuGy8Y"),
           false);
-      expect(secureStore.interactions, 0);
+      expect(secureStore.interactions, 2);
       verifyNoMoreInteractions(client);
       verifyNoMoreInteractions(cachedClient);
       verifyNoMoreInteractions(tracker);
@@ -253,7 +253,7 @@ void main() async {
           mainnetWallet
               ?.validateAddress("pzpp3nchmzzf0gr69lj82ymurg5u3ds6kcwr5m07np"),
           false);
-      expect(secureStore.interactions, 0);
+      expect(secureStore.interactions, 2);
       verifyNoMoreInteractions(client);
       verifyNoMoreInteractions(cachedClient);
       verifyNoMoreInteractions(tracker);
@@ -263,7 +263,7 @@ void main() async {
       expect(
           mainnetWallet?.validateAddress("3DYuVEmuKWQFxJcF7jDPhwPiXLTiNnyMFb"),
           false);
-      expect(secureStore.interactions, 0);
+      expect(secureStore.interactions, 2);
       verifyNoMoreInteractions(client);
       verifyNoMoreInteractions(cachedClient);
       verifyNoMoreInteractions(tracker);
@@ -273,7 +273,7 @@ void main() async {
       expect(
           mainnetWallet?.validateAddress("mhqpGtwhcR6gFuuRjLTpHo41919QfuGy8Y"),
           false);
-      expect(secureStore.interactions, 0);
+      expect(secureStore.interactions, 2);
       verifyNoMoreInteractions(client);
       verifyNoMoreInteractions(cachedClient);
       verifyNoMoreInteractions(tracker);
@@ -311,7 +311,7 @@ void main() async {
       when(client?.ping()).thenAnswer((_) async => false);
       final bool? result = await bch?.testNetworkConnection();
       expect(result, false);
-      expect(secureStore.interactions, 0);
+      expect(secureStore.interactions, 2);
       verify(client?.ping()).called(1);
       verifyNoMoreInteractions(client);
       verifyNoMoreInteractions(cachedClient);
@@ -322,7 +322,7 @@ void main() async {
       when(client?.ping()).thenThrow(Exception);
       final bool? result = await bch?.testNetworkConnection();
       expect(result, false);
-      expect(secureStore.interactions, 0);
+      expect(secureStore.interactions, 2);
       verify(client?.ping()).called(1);
       verifyNoMoreInteractions(client);
       verifyNoMoreInteractions(cachedClient);
@@ -333,7 +333,7 @@ void main() async {
       when(client?.ping()).thenAnswer((_) async => true);
       final bool? result = await bch?.testNetworkConnection();
       expect(result, true);
-      expect(secureStore.interactions, 0);
+      expect(secureStore.interactions, 2);
       verify(client?.ping()).called(1);
       verifyNoMoreInteractions(client);
       verifyNoMoreInteractions(cachedClient);
@@ -374,7 +374,7 @@ void main() async {
 
     test("get networkType main", () async {
       expect(bch?.coin, bchcoin);
-      expect(secureStore.interactions, 0);
+      expect(secureStore.interactions, 2);
       verifyNoMoreInteractions(client);
       verifyNoMoreInteractions(cachedClient);
       verifyNoMoreInteractions(tracker);
@@ -391,7 +391,7 @@ void main() async {
         secureStore: secureStore,
       );
       expect(bch?.coin, bchcoin);
-      expect(secureStore.interactions, 0);
+      expect(secureStore.interactions, 4);
       verifyNoMoreInteractions(client);
       verifyNoMoreInteractions(cachedClient);
       verifyNoMoreInteractions(tracker);
@@ -399,7 +399,7 @@ void main() async {
 
     test("get cryptoCurrency", () async {
       expect(Coin.bitcoincash, Coin.bitcoincash);
-      expect(secureStore.interactions, 0);
+      expect(secureStore.interactions, 2);
       verifyNoMoreInteractions(client);
       verifyNoMoreInteractions(cachedClient);
       verifyNoMoreInteractions(tracker);
@@ -407,7 +407,7 @@ void main() async {
 
     test("get coinName", () async {
       expect(Coin.bitcoincash, Coin.bitcoincash);
-      expect(secureStore.interactions, 0);
+      expect(secureStore.interactions, 2);
       verifyNoMoreInteractions(client);
       verifyNoMoreInteractions(cachedClient);
       verifyNoMoreInteractions(tracker);
@@ -415,7 +415,7 @@ void main() async {
 
     test("get coinTicker", () async {
       expect(Coin.bitcoincash, Coin.bitcoincash);
-      expect(secureStore.interactions, 0);
+      expect(secureStore.interactions, 2);
       verifyNoMoreInteractions(client);
       verifyNoMoreInteractions(cachedClient);
       verifyNoMoreInteractions(tracker);
@@ -425,7 +425,7 @@ void main() async {
       expect(Coin.bitcoincash, Coin.bitcoincash);
       bch?.walletName = "new name";
       expect(bch?.walletName, "new name");
-      expect(secureStore.interactions, 0);
+      expect(secureStore.interactions, 2);
       verifyNoMoreInteractions(client);
       verifyNoMoreInteractions(cachedClient);
       verifyNoMoreInteractions(tracker);
@@ -440,7 +440,7 @@ void main() async {
       expect(bch?.estimateTxFee(vSize: 356, feeRatePerKB: 1699), 712);
       expect(bch?.estimateTxFee(vSize: 356, feeRatePerKB: 2000), 712);
       expect(bch?.estimateTxFee(vSize: 356, feeRatePerKB: 12345), 4628);
-      expect(secureStore.interactions, 0);
+      expect(secureStore.interactions, 2);
       verifyNoMoreInteractions(client);
       verifyNoMoreInteractions(cachedClient);
       verifyNoMoreInteractions(tracker);
@@ -474,7 +474,7 @@ void main() async {
       verify(client?.estimateFee(blocks: 1)).called(1);
       verify(client?.estimateFee(blocks: 5)).called(1);
       verify(client?.estimateFee(blocks: 20)).called(1);
-      expect(secureStore.interactions, 0);
+      expect(secureStore.interactions, 2);
       verifyNoMoreInteractions(client);
       verifyNoMoreInteractions(cachedClient);
       verifyNoMoreInteractions(tracker);
@@ -511,7 +511,7 @@ void main() async {
       verify(client?.estimateFee(blocks: 1)).called(1);
       verify(client?.estimateFee(blocks: 5)).called(1);
       verify(client?.estimateFee(blocks: 20)).called(1);
-      expect(secureStore.interactions, 0);
+      expect(secureStore.interactions, 2);
       verifyNoMoreInteractions(client);
       verifyNoMoreInteractions(cachedClient);
       verifyNoMoreInteractions(tracker);
@@ -629,7 +629,7 @@ void main() async {
       await expectLater(
               () => bch?.initializeNew(null), throwsA(isA<Exception>()))
           .then((_) {
-        expect(secureStore.interactions, 2);
+        expect(secureStore.interactions, 4);
         verifyNever(client?.ping()).called(0);
         verify(client?.getServerFeatures()).called(1);
         verifyNoMoreInteractions(client);
@@ -1209,7 +1209,7 @@ void main() async {
                   "1df1cab6d109d506aa424b00b6a013c5e1947dc13b78d62b4d0e9f518b3035d1"))
           .called(1);
 
-      expect(secureStore.interactions, 0);
+      expect(secureStore.interactions, 2);
       verifyNoMoreInteractions(client);
       verifyNoMoreInteractions(cachedClient);
       verifyNoMoreInteractions(tracker);
@@ -1234,7 +1234,7 @@ void main() async {
                   "64953f7db441a21172de206bf70b920c8c718ed4f03df9a85073c0400be0053c"))
           .called(0);
 
-      expect(secureStore.interactions, 0);
+      expect(secureStore.interactions, 2);
       verifyNoMoreInteractions(client);
       verifyNoMoreInteractions(cachedClient);
       verifyNoMoreInteractions(tracker);
@@ -1894,7 +1894,7 @@ void main() async {
 
       verify(client?.getServerFeatures()).called(1);
 
-      expect(secureStore.interactions, 0);
+      expect(secureStore.interactions, 2);
       verifyNoMoreInteractions(client);
       verifyNoMoreInteractions(cachedClient);
     });
@@ -1936,7 +1936,7 @@ void main() async {
 
       verify(client?.getServerFeatures()).called(1);
 
-      expect(secureStore.interactions, 0);
+      expect(secureStore.interactions, 4);
       verifyNoMoreInteractions(client);
       verifyNoMoreInteractions(cachedClient);
     });
@@ -1972,7 +1972,7 @@ void main() async {
 
       verify(client?.getServerFeatures()).called(1);
 
-      expect(secureStore.interactions, 2);
+      expect(secureStore.interactions, 4);
       verifyNoMoreInteractions(client);
       verifyNoMoreInteractions(cachedClient);
     });
@@ -2731,7 +2731,7 @@ void main() async {
 
       expect(didThrow, true);
 
-      expect(secureStore.interactions, 0);
+      expect(secureStore.interactions, 2);
       verifyNoMoreInteractions(client);
       verifyNoMoreInteractions(cachedClient);
       verifyNoMoreInteractions(tracker);
@@ -2747,7 +2747,7 @@ void main() async {
 
       expect(didThrow, true);
 
-      expect(secureStore.interactions, 0);
+      expect(secureStore.interactions, 2);
       verifyNoMoreInteractions(client);
       verifyNoMoreInteractions(cachedClient);
       verifyNoMoreInteractions(tracker);
@@ -2763,7 +2763,7 @@ void main() async {
 
       expect(didThrow, true);
 
-      expect(secureStore.interactions, 0);
+      expect(secureStore.interactions, 2);
       verifyNoMoreInteractions(client);
       verifyNoMoreInteractions(cachedClient);
       verifyNoMoreInteractions(tracker);
@@ -2779,7 +2779,7 @@ void main() async {
 
       expect(didThrow, true);
 
-      expect(secureStore.interactions, 0);
+      expect(secureStore.interactions, 2);
       verifyNoMoreInteractions(client);
       verifyNoMoreInteractions(cachedClient);
       verifyNoMoreInteractions(tracker);
@@ -2800,7 +2800,7 @@ void main() async {
               rawTx: "a string", requestID: anyNamed("requestID")))
           .called(1);
 
-      expect(secureStore.interactions, 0);
+      expect(secureStore.interactions, 2);
       verifyNoMoreInteractions(client);
       verifyNoMoreInteractions(cachedClient);
       verifyNoMoreInteractions(tracker);
@@ -2825,7 +2825,7 @@ void main() async {
               rawTx: "a string", requestID: anyNamed("requestID")))
           .called(1);
 
-      expect(secureStore.interactions, 0);
+      expect(secureStore.interactions, 2);
       verifyNoMoreInteractions(client);
       verifyNoMoreInteractions(cachedClient);
       verifyNoMoreInteractions(tracker);
diff --git a/test/services/coins/bitcoincash/cashtokens_test.dart b/test/services/coins/bitcoincash/cashtokens_test.dart
new file mode 100644
index 000000000..be8a8b24b
--- /dev/null
+++ b/test/services/coins/bitcoincash/cashtokens_test.dart
@@ -0,0 +1,40 @@
+import 'dart:typed_data';
+
+import 'package:convert/convert.dart';
+import 'package:flutter_test/flutter_test.dart';
+import 'package:hex/hex.dart';
+import 'package:stackwallet/services/coins/bitcoincash/cashtokens.dart';
+
+void main() {
+  // Just a testing function which can be called in standalone fashion.
+  // Replace "var1" with a hex string containing an output (script pub key)
+  test("testUnwrapSPK", () {
+    // Example Hex format string
+    String var1 = "76a91463456150b05a67084d795fbce22c8fbbca37697288ac";
+    // Convert the Hex string to Uint8List
+    Uint8List wrapped_spk = Uint8List.fromList(HEX.decode(var1));
+
+    // Call unwrap_spk
+    ParsedOutput parsedOutput = unwrap_spk(wrapped_spk);
+
+    print("Parsed Output: $parsedOutput");
+
+    // Access token_data inside parsedOutput
+    TokenOutputData? tokenData = parsedOutput.token_data;
+
+    // Check if tokenData is null
+    if (tokenData != null) {
+      // Print specific fields
+      if (tokenData.id != null) {
+        print("ID: ${hex.encode(tokenData.id!)}"); // hex is imported
+      } else {
+        print("ID: null");
+      }
+      print("amount of tokens");
+      print(tokenData.amount);
+      print("Is it an NFT?: ${tokenData.hasNFT()}");
+    } else {
+      print("Token data is null.");
+    }
+  });
+}
diff --git a/test/services/coins/firo/firo_wallet_test.mocks.dart b/test/services/coins/firo/firo_wallet_test.mocks.dart
index 0f7a0b0a3..51d443e5a 100644
--- a/test/services/coins/firo/firo_wallet_test.mocks.dart
+++ b/test/services/coins/firo/firo_wallet_test.mocks.dart
@@ -12,6 +12,8 @@ import 'package:stackwallet/db/isar/main_db.dart' as _i9;
 import 'package:stackwallet/electrumx_rpc/cached_electrumx.dart' as _i6;
 import 'package:stackwallet/electrumx_rpc/electrumx.dart' as _i3;
 import 'package:stackwallet/models/isar/models/block_explorer.dart' as _i11;
+import 'package:stackwallet/models/isar/models/blockchain_data/v2/transaction_v2.dart'
+    as _i14;
 import 'package:stackwallet/models/isar/models/contact_entry.dart' as _i10;
 import 'package:stackwallet/models/isar/models/isar_models.dart' as _i12;
 import 'package:stackwallet/services/transaction_notification_tracker.dart'
@@ -855,6 +857,33 @@ class MockMainDB extends _i1.Mock implements _i9.MainDB {
         ),
       ) as _i4.QueryBuilder<_i12.UTXO, _i12.UTXO, _i4.QAfterWhereClause>);
   @override
+  _i4.QueryBuilder<_i12.UTXO, _i12.UTXO, _i4.QAfterFilterCondition>
+      getUTXOsByAddress(
+    String? walletId,
+    String? address,
+  ) =>
+          (super.noSuchMethod(
+            Invocation.method(
+              #getUTXOsByAddress,
+              [
+                walletId,
+                address,
+              ],
+            ),
+            returnValue: _FakeQueryBuilder_4<_i12.UTXO, _i12.UTXO,
+                _i4.QAfterFilterCondition>(
+              this,
+              Invocation.method(
+                #getUTXOsByAddress,
+                [
+                  walletId,
+                  address,
+                ],
+              ),
+            ),
+          ) as _i4
+              .QueryBuilder<_i12.UTXO, _i12.UTXO, _i4.QAfterFilterCondition>);
+  @override
   _i5.Future<void> putUTXO(_i12.UTXO? utxo) => (super.noSuchMethod(
         Invocation.method(
           #putUTXO,
@@ -1117,6 +1146,16 @@ class MockMainDB extends _i1.Mock implements _i9.MainDB {
         returnValueForMissingStub: _i5.Future<void>.value(),
       ) as _i5.Future<void>);
   @override
+  _i5.Future<List<int>> updateOrPutTransactionV2s(
+          List<_i14.TransactionV2>? transactions) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #updateOrPutTransactionV2s,
+          [transactions],
+        ),
+        returnValue: _i5.Future<List<int>>.value(<int>[]),
+      ) as _i5.Future<List<int>>);
+  @override
   _i4.QueryBuilder<_i12.EthContract, _i12.EthContract, _i4.QWhere>
       getEthContracts() => (super.noSuchMethod(
             Invocation.method(
diff --git a/test/widget_tests/managed_favorite_test.mocks.dart b/test/widget_tests/managed_favorite_test.mocks.dart
index e2232e066..03b0f083a 100644
--- a/test/widget_tests/managed_favorite_test.mocks.dart
+++ b/test/widget_tests/managed_favorite_test.mocks.dart
@@ -3,12 +3,12 @@
 // Do not manually edit this file.
 
 // ignore_for_file: no_leading_underscores_for_library_prefixes
-import 'dart:async' as _i24;
-import 'dart:typed_data' as _i30;
-import 'dart:ui' as _i26;
+import 'dart:async' as _i26;
+import 'dart:typed_data' as _i32;
+import 'dart:ui' as _i28;
 
-import 'package:bip32/bip32.dart' as _i16;
-import 'package:bip47/bip47.dart' as _i18;
+import 'package:bip32/bip32.dart' as _i17;
+import 'package:bip47/bip47.dart' as _i19;
 import 'package:bitcoindart/bitcoindart.dart' as _i13;
 import 'package:flutter/foundation.dart' as _i4;
 import 'package:flutter_riverpod/flutter_riverpod.dart' as _i5;
@@ -17,32 +17,36 @@ import 'package:stackwallet/db/isar/main_db.dart' as _i12;
 import 'package:stackwallet/electrumx_rpc/cached_electrumx.dart' as _i10;
 import 'package:stackwallet/electrumx_rpc/electrumx.dart' as _i9;
 import 'package:stackwallet/models/balance.dart' as _i11;
-import 'package:stackwallet/models/isar/models/isar_models.dart' as _i17;
-import 'package:stackwallet/models/isar/stack_theme.dart' as _i32;
-import 'package:stackwallet/models/node_model.dart' as _i37;
+import 'package:stackwallet/models/isar/models/blockchain_data/v2/transaction_v2.dart'
+    as _i15;
+import 'package:stackwallet/models/isar/models/isar_models.dart' as _i18;
+import 'package:stackwallet/models/isar/stack_theme.dart' as _i34;
+import 'package:stackwallet/models/node_model.dart' as _i39;
 import 'package:stackwallet/models/paymint/fee_object_model.dart' as _i8;
-import 'package:stackwallet/models/signing_data.dart' as _i29;
-import 'package:stackwallet/networking/http.dart' as _i19;
-import 'package:stackwallet/services/coins/bitcoin/bitcoin_wallet.dart' as _i27;
-import 'package:stackwallet/services/coins/coin_service.dart' as _i21;
+import 'package:stackwallet/models/signing_data.dart' as _i31;
+import 'package:stackwallet/networking/http.dart' as _i20;
+import 'package:stackwallet/services/coins/bitcoin/bitcoin_wallet.dart' as _i29;
+import 'package:stackwallet/services/coins/coin_service.dart' as _i23;
 import 'package:stackwallet/services/coins/manager.dart' as _i6;
-import 'package:stackwallet/services/locale_service.dart' as _i36;
+import 'package:stackwallet/services/locale_service.dart' as _i38;
+import 'package:stackwallet/services/mixins/fusion_wallet_interface.dart'
+    as _i21;
 import 'package:stackwallet/services/node_service.dart' as _i3;
 import 'package:stackwallet/services/transaction_notification_tracker.dart'
     as _i7;
-import 'package:stackwallet/services/wallets.dart' as _i22;
+import 'package:stackwallet/services/wallets.dart' as _i24;
 import 'package:stackwallet/services/wallets_service.dart' as _i2;
-import 'package:stackwallet/themes/theme_service.dart' as _i31;
+import 'package:stackwallet/themes/theme_service.dart' as _i33;
 import 'package:stackwallet/utilities/amount/amount.dart' as _i14;
-import 'package:stackwallet/utilities/amount/amount_unit.dart' as _i35;
-import 'package:stackwallet/utilities/enums/backup_frequency_type.dart' as _i34;
-import 'package:stackwallet/utilities/enums/coin_enum.dart' as _i23;
-import 'package:stackwallet/utilities/enums/derive_path_type_enum.dart' as _i28;
-import 'package:stackwallet/utilities/enums/sync_type_enum.dart' as _i33;
+import 'package:stackwallet/utilities/amount/amount_unit.dart' as _i37;
+import 'package:stackwallet/utilities/enums/backup_frequency_type.dart' as _i36;
+import 'package:stackwallet/utilities/enums/coin_enum.dart' as _i25;
+import 'package:stackwallet/utilities/enums/derive_path_type_enum.dart' as _i30;
+import 'package:stackwallet/utilities/enums/sync_type_enum.dart' as _i35;
 import 'package:stackwallet/utilities/flutter_secure_storage_interface.dart'
-    as _i20;
-import 'package:stackwallet/utilities/prefs.dart' as _i25;
-import 'package:tuple/tuple.dart' as _i15;
+    as _i22;
+import 'package:stackwallet/utilities/prefs.dart' as _i27;
+import 'package:tuple/tuple.dart' as _i16;
 
 // ignore_for_file: type=lint
 // ignore_for_file: avoid_redundant_argument_values
@@ -189,9 +193,9 @@ class _FakeAmount_12 extends _i1.SmartFake implements _i14.Amount {
         );
 }
 
-class _FakeTuple2_13<T1, T2> extends _i1.SmartFake
-    implements _i15.Tuple2<T1, T2> {
-  _FakeTuple2_13(
+class _FakeTransactionV2_13 extends _i1.SmartFake
+    implements _i15.TransactionV2 {
+  _FakeTransactionV2_13(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -200,8 +204,9 @@ class _FakeTuple2_13<T1, T2> extends _i1.SmartFake
         );
 }
 
-class _FakeBIP32_14 extends _i1.SmartFake implements _i16.BIP32 {
-  _FakeBIP32_14(
+class _FakeTuple2_14<T1, T2> extends _i1.SmartFake
+    implements _i16.Tuple2<T1, T2> {
+  _FakeTuple2_14(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -210,8 +215,8 @@ class _FakeBIP32_14 extends _i1.SmartFake implements _i16.BIP32 {
         );
 }
 
-class _FakeAddress_15 extends _i1.SmartFake implements _i17.Address {
-  _FakeAddress_15(
+class _FakeBIP32_15 extends _i1.SmartFake implements _i17.BIP32 {
+  _FakeBIP32_15(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -220,8 +225,8 @@ class _FakeAddress_15 extends _i1.SmartFake implements _i17.Address {
         );
 }
 
-class _FakePaymentCode_16 extends _i1.SmartFake implements _i18.PaymentCode {
-  _FakePaymentCode_16(
+class _FakeAddress_16 extends _i1.SmartFake implements _i18.Address {
+  _FakeAddress_16(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -230,8 +235,8 @@ class _FakePaymentCode_16 extends _i1.SmartFake implements _i18.PaymentCode {
         );
 }
 
-class _FakeHTTP_17 extends _i1.SmartFake implements _i19.HTTP {
-  _FakeHTTP_17(
+class _FakePaymentCode_17 extends _i1.SmartFake implements _i19.PaymentCode {
+  _FakePaymentCode_17(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -240,9 +245,8 @@ class _FakeHTTP_17 extends _i1.SmartFake implements _i19.HTTP {
         );
 }
 
-class _FakeSecureStorageInterface_18 extends _i1.SmartFake
-    implements _i20.SecureStorageInterface {
-  _FakeSecureStorageInterface_18(
+class _FakeHTTP_18 extends _i1.SmartFake implements _i20.HTTP {
+  _FakeHTTP_18(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -251,9 +255,30 @@ class _FakeSecureStorageInterface_18 extends _i1.SmartFake
         );
 }
 
-class _FakeCoinServiceAPI_19 extends _i1.SmartFake
-    implements _i21.CoinServiceAPI {
-  _FakeCoinServiceAPI_19(
+class _FakeFusionInfo_19 extends _i1.SmartFake implements _i21.FusionInfo {
+  _FakeFusionInfo_19(
+    Object parent,
+    Invocation parentInvocation,
+  ) : super(
+          parent,
+          parentInvocation,
+        );
+}
+
+class _FakeSecureStorageInterface_20 extends _i1.SmartFake
+    implements _i22.SecureStorageInterface {
+  _FakeSecureStorageInterface_20(
+    Object parent,
+    Invocation parentInvocation,
+  ) : super(
+          parent,
+          parentInvocation,
+        );
+}
+
+class _FakeCoinServiceAPI_21 extends _i1.SmartFake
+    implements _i23.CoinServiceAPI {
+  _FakeCoinServiceAPI_21(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -265,7 +290,7 @@ class _FakeCoinServiceAPI_19 extends _i1.SmartFake
 /// A class which mocks [Wallets].
 ///
 /// See the documentation for Mockito's code generation for more information.
-class MockWallets extends _i1.Mock implements _i22.Wallets {
+class MockWallets extends _i1.Mock implements _i24.Wallets {
   MockWallets() {
     _i1.throwOnMissingStub(this);
   }
@@ -332,7 +357,7 @@ class MockWallets extends _i1.Mock implements _i22.Wallets {
         returnValueForMissingStub: null,
       );
   @override
-  List<String> getWalletIdsFor({required _i23.Coin? coin}) =>
+  List<String> getWalletIdsFor({required _i25.Coin? coin}) =>
       (super.noSuchMethod(
         Invocation.method(
           #getWalletIdsFor,
@@ -342,20 +367,20 @@ class MockWallets extends _i1.Mock implements _i22.Wallets {
         returnValue: <String>[],
       ) as List<String>);
   @override
-  List<_i15.Tuple2<_i23.Coin, List<_i5.ChangeNotifierProvider<_i6.Manager>>>>
+  List<_i16.Tuple2<_i25.Coin, List<_i5.ChangeNotifierProvider<_i6.Manager>>>>
       getManagerProvidersByCoin() => (super.noSuchMethod(
             Invocation.method(
               #getManagerProvidersByCoin,
               [],
             ),
-            returnValue: <_i15.Tuple2<_i23.Coin,
+            returnValue: <_i16.Tuple2<_i25.Coin,
                 List<_i5.ChangeNotifierProvider<_i6.Manager>>>>[],
           ) as List<
-              _i15.Tuple2<_i23.Coin,
+              _i16.Tuple2<_i25.Coin,
                   List<_i5.ChangeNotifierProvider<_i6.Manager>>>>);
   @override
   List<_i5.ChangeNotifierProvider<_i6.Manager>> getManagerProvidersForCoin(
-          _i23.Coin? coin) =>
+          _i25.Coin? coin) =>
       (super.noSuchMethod(
         Invocation.method(
           #getManagerProvidersForCoin,
@@ -419,17 +444,17 @@ class MockWallets extends _i1.Mock implements _i22.Wallets {
         returnValueForMissingStub: null,
       );
   @override
-  _i24.Future<void> load(_i25.Prefs? prefs) => (super.noSuchMethod(
+  _i26.Future<void> load(_i27.Prefs? prefs) => (super.noSuchMethod(
         Invocation.method(
           #load,
           [prefs],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
-  _i24.Future<void> loadAfterStackRestore(
-    _i25.Prefs? prefs,
+  _i26.Future<void> loadAfterStackRestore(
+    _i27.Prefs? prefs,
     List<_i6.Manager>? managers,
   ) =>
       (super.noSuchMethod(
@@ -440,11 +465,11 @@ class MockWallets extends _i1.Mock implements _i22.Wallets {
             managers,
           ],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
-  void addListener(_i26.VoidCallback? listener) => super.noSuchMethod(
+  void addListener(_i28.VoidCallback? listener) => super.noSuchMethod(
         Invocation.method(
           #addListener,
           [listener],
@@ -452,7 +477,7 @@ class MockWallets extends _i1.Mock implements _i22.Wallets {
         returnValueForMissingStub: null,
       );
   @override
-  void removeListener(_i26.VoidCallback? listener) => super.noSuchMethod(
+  void removeListener(_i28.VoidCallback? listener) => super.noSuchMethod(
         Invocation.method(
           #removeListener,
           [listener],
@@ -478,19 +503,19 @@ class MockWalletsService extends _i1.Mock implements _i2.WalletsService {
   }
 
   @override
-  _i24.Future<Map<String, _i2.WalletInfo>> get walletNames =>
+  _i26.Future<Map<String, _i2.WalletInfo>> get walletNames =>
       (super.noSuchMethod(
         Invocation.getter(#walletNames),
-        returnValue: _i24.Future<Map<String, _i2.WalletInfo>>.value(
+        returnValue: _i26.Future<Map<String, _i2.WalletInfo>>.value(
             <String, _i2.WalletInfo>{}),
-      ) as _i24.Future<Map<String, _i2.WalletInfo>>);
+      ) as _i26.Future<Map<String, _i2.WalletInfo>>);
   @override
   bool get hasListeners => (super.noSuchMethod(
         Invocation.getter(#hasListeners),
         returnValue: false,
       ) as bool);
   @override
-  _i24.Future<bool> renameWallet({
+  _i26.Future<bool> renameWallet({
     required String? from,
     required String? to,
     required bool? shouldNotifyListeners,
@@ -505,8 +530,8 @@ class MockWalletsService extends _i1.Mock implements _i2.WalletsService {
             #shouldNotifyListeners: shouldNotifyListeners,
           },
         ),
-        returnValue: _i24.Future<bool>.value(false),
-      ) as _i24.Future<bool>);
+        returnValue: _i26.Future<bool>.value(false),
+      ) as _i26.Future<bool>);
   @override
   Map<String, _i2.WalletInfo> fetchWalletsData() => (super.noSuchMethod(
         Invocation.method(
@@ -516,10 +541,10 @@ class MockWalletsService extends _i1.Mock implements _i2.WalletsService {
         returnValue: <String, _i2.WalletInfo>{},
       ) as Map<String, _i2.WalletInfo>);
   @override
-  _i24.Future<void> addExistingStackWallet({
+  _i26.Future<void> addExistingStackWallet({
     required String? name,
     required String? walletId,
-    required _i23.Coin? coin,
+    required _i25.Coin? coin,
     required bool? shouldNotifyListeners,
   }) =>
       (super.noSuchMethod(
@@ -533,13 +558,13 @@ class MockWalletsService extends _i1.Mock implements _i2.WalletsService {
             #shouldNotifyListeners: shouldNotifyListeners,
           },
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
-  _i24.Future<String?> addNewWallet({
+  _i26.Future<String?> addNewWallet({
     required String? name,
-    required _i23.Coin? coin,
+    required _i25.Coin? coin,
     required bool? shouldNotifyListeners,
   }) =>
       (super.noSuchMethod(
@@ -552,46 +577,46 @@ class MockWalletsService extends _i1.Mock implements _i2.WalletsService {
             #shouldNotifyListeners: shouldNotifyListeners,
           },
         ),
-        returnValue: _i24.Future<String?>.value(),
-      ) as _i24.Future<String?>);
+        returnValue: _i26.Future<String?>.value(),
+      ) as _i26.Future<String?>);
   @override
-  _i24.Future<List<String>> getFavoriteWalletIds() => (super.noSuchMethod(
+  _i26.Future<List<String>> getFavoriteWalletIds() => (super.noSuchMethod(
         Invocation.method(
           #getFavoriteWalletIds,
           [],
         ),
-        returnValue: _i24.Future<List<String>>.value(<String>[]),
-      ) as _i24.Future<List<String>>);
+        returnValue: _i26.Future<List<String>>.value(<String>[]),
+      ) as _i26.Future<List<String>>);
   @override
-  _i24.Future<void> saveFavoriteWalletIds(List<String>? walletIds) =>
+  _i26.Future<void> saveFavoriteWalletIds(List<String>? walletIds) =>
       (super.noSuchMethod(
         Invocation.method(
           #saveFavoriteWalletIds,
           [walletIds],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
-  _i24.Future<void> addFavorite(String? walletId) => (super.noSuchMethod(
+  _i26.Future<void> addFavorite(String? walletId) => (super.noSuchMethod(
         Invocation.method(
           #addFavorite,
           [walletId],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
-  _i24.Future<void> removeFavorite(String? walletId) => (super.noSuchMethod(
+  _i26.Future<void> removeFavorite(String? walletId) => (super.noSuchMethod(
         Invocation.method(
           #removeFavorite,
           [walletId],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
-  _i24.Future<void> moveFavorite({
+  _i26.Future<void> moveFavorite({
     required int? fromIndex,
     required int? toIndex,
   }) =>
@@ -604,48 +629,48 @@ class MockWalletsService extends _i1.Mock implements _i2.WalletsService {
             #toIndex: toIndex,
           },
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
-  _i24.Future<bool> checkForDuplicate(String? name) => (super.noSuchMethod(
+  _i26.Future<bool> checkForDuplicate(String? name) => (super.noSuchMethod(
         Invocation.method(
           #checkForDuplicate,
           [name],
         ),
-        returnValue: _i24.Future<bool>.value(false),
-      ) as _i24.Future<bool>);
+        returnValue: _i26.Future<bool>.value(false),
+      ) as _i26.Future<bool>);
   @override
-  _i24.Future<String?> getWalletId(String? walletName) => (super.noSuchMethod(
+  _i26.Future<String?> getWalletId(String? walletName) => (super.noSuchMethod(
         Invocation.method(
           #getWalletId,
           [walletName],
         ),
-        returnValue: _i24.Future<String?>.value(),
-      ) as _i24.Future<String?>);
+        returnValue: _i26.Future<String?>.value(),
+      ) as _i26.Future<String?>);
   @override
-  _i24.Future<bool> isMnemonicVerified({required String? walletId}) =>
+  _i26.Future<bool> isMnemonicVerified({required String? walletId}) =>
       (super.noSuchMethod(
         Invocation.method(
           #isMnemonicVerified,
           [],
           {#walletId: walletId},
         ),
-        returnValue: _i24.Future<bool>.value(false),
-      ) as _i24.Future<bool>);
+        returnValue: _i26.Future<bool>.value(false),
+      ) as _i26.Future<bool>);
   @override
-  _i24.Future<void> setMnemonicVerified({required String? walletId}) =>
+  _i26.Future<void> setMnemonicVerified({required String? walletId}) =>
       (super.noSuchMethod(
         Invocation.method(
           #setMnemonicVerified,
           [],
           {#walletId: walletId},
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
-  _i24.Future<int> deleteWallet(
+  _i26.Future<int> deleteWallet(
     String? name,
     bool? shouldNotifyListeners,
   ) =>
@@ -657,20 +682,20 @@ class MockWalletsService extends _i1.Mock implements _i2.WalletsService {
             shouldNotifyListeners,
           ],
         ),
-        returnValue: _i24.Future<int>.value(0),
-      ) as _i24.Future<int>);
+        returnValue: _i26.Future<int>.value(0),
+      ) as _i26.Future<int>);
   @override
-  _i24.Future<void> refreshWallets(bool? shouldNotifyListeners) =>
+  _i26.Future<void> refreshWallets(bool? shouldNotifyListeners) =>
       (super.noSuchMethod(
         Invocation.method(
           #refreshWallets,
           [shouldNotifyListeners],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
-  void addListener(_i26.VoidCallback? listener) => super.noSuchMethod(
+  void addListener(_i28.VoidCallback? listener) => super.noSuchMethod(
         Invocation.method(
           #addListener,
           [listener],
@@ -678,7 +703,7 @@ class MockWalletsService extends _i1.Mock implements _i2.WalletsService {
         returnValueForMissingStub: null,
       );
   @override
-  void removeListener(_i26.VoidCallback? listener) => super.noSuchMethod(
+  void removeListener(_i28.VoidCallback? listener) => super.noSuchMethod(
         Invocation.method(
           #removeListener,
           [listener],
@@ -706,13 +731,13 @@ class MockWalletsService extends _i1.Mock implements _i2.WalletsService {
 /// A class which mocks [BitcoinWallet].
 ///
 /// See the documentation for Mockito's code generation for more information.
-class MockBitcoinWallet extends _i1.Mock implements _i27.BitcoinWallet {
+class MockBitcoinWallet extends _i1.Mock implements _i29.BitcoinWallet {
   MockBitcoinWallet() {
     _i1.throwOnMissingStub(this);
   }
 
   @override
-  set timer(_i24.Timer? _timer) => super.noSuchMethod(
+  set timer(_i26.Timer? _timer) => super.noSuchMethod(
         Invocation.setter(
           #timer,
           _timer,
@@ -789,74 +814,74 @@ class MockBitcoinWallet extends _i1.Mock implements _i27.BitcoinWallet {
         returnValue: false,
       ) as bool);
   @override
-  _i23.Coin get coin => (super.noSuchMethod(
+  _i25.Coin get coin => (super.noSuchMethod(
         Invocation.getter(#coin),
-        returnValue: _i23.Coin.bitcoin,
-      ) as _i23.Coin);
+        returnValue: _i25.Coin.bitcoin,
+      ) as _i25.Coin);
   @override
-  _i24.Future<List<_i17.UTXO>> get utxos => (super.noSuchMethod(
+  _i26.Future<List<_i18.UTXO>> get utxos => (super.noSuchMethod(
         Invocation.getter(#utxos),
-        returnValue: _i24.Future<List<_i17.UTXO>>.value(<_i17.UTXO>[]),
-      ) as _i24.Future<List<_i17.UTXO>>);
+        returnValue: _i26.Future<List<_i18.UTXO>>.value(<_i18.UTXO>[]),
+      ) as _i26.Future<List<_i18.UTXO>>);
   @override
-  _i24.Future<List<_i17.Transaction>> get transactions => (super.noSuchMethod(
+  _i26.Future<List<_i18.Transaction>> get transactions => (super.noSuchMethod(
         Invocation.getter(#transactions),
         returnValue:
-            _i24.Future<List<_i17.Transaction>>.value(<_i17.Transaction>[]),
-      ) as _i24.Future<List<_i17.Transaction>>);
+            _i26.Future<List<_i18.Transaction>>.value(<_i18.Transaction>[]),
+      ) as _i26.Future<List<_i18.Transaction>>);
   @override
-  _i24.Future<String> get currentReceivingAddress => (super.noSuchMethod(
+  _i26.Future<String> get currentReceivingAddress => (super.noSuchMethod(
         Invocation.getter(#currentReceivingAddress),
-        returnValue: _i24.Future<String>.value(''),
-      ) as _i24.Future<String>);
+        returnValue: _i26.Future<String>.value(''),
+      ) as _i26.Future<String>);
   @override
-  _i24.Future<String> get currentChangeAddress => (super.noSuchMethod(
+  _i26.Future<String> get currentChangeAddress => (super.noSuchMethod(
         Invocation.getter(#currentChangeAddress),
-        returnValue: _i24.Future<String>.value(''),
-      ) as _i24.Future<String>);
+        returnValue: _i26.Future<String>.value(''),
+      ) as _i26.Future<String>);
   @override
-  _i24.Future<String> get currentChangeAddressP2PKH => (super.noSuchMethod(
+  _i26.Future<String> get currentChangeAddressP2PKH => (super.noSuchMethod(
         Invocation.getter(#currentChangeAddressP2PKH),
-        returnValue: _i24.Future<String>.value(''),
-      ) as _i24.Future<String>);
+        returnValue: _i26.Future<String>.value(''),
+      ) as _i26.Future<String>);
   @override
   bool get hasCalledExit => (super.noSuchMethod(
         Invocation.getter(#hasCalledExit),
         returnValue: false,
       ) as bool);
   @override
-  _i24.Future<_i8.FeeObject> get fees => (super.noSuchMethod(
+  _i26.Future<_i8.FeeObject> get fees => (super.noSuchMethod(
         Invocation.getter(#fees),
-        returnValue: _i24.Future<_i8.FeeObject>.value(_FakeFeeObject_5(
+        returnValue: _i26.Future<_i8.FeeObject>.value(_FakeFeeObject_5(
           this,
           Invocation.getter(#fees),
         )),
-      ) as _i24.Future<_i8.FeeObject>);
+      ) as _i26.Future<_i8.FeeObject>);
   @override
-  _i24.Future<int> get maxFee => (super.noSuchMethod(
+  _i26.Future<int> get maxFee => (super.noSuchMethod(
         Invocation.getter(#maxFee),
-        returnValue: _i24.Future<int>.value(0),
-      ) as _i24.Future<int>);
+        returnValue: _i26.Future<int>.value(0),
+      ) as _i26.Future<int>);
   @override
-  _i24.Future<List<String>> get mnemonic => (super.noSuchMethod(
+  _i26.Future<List<String>> get mnemonic => (super.noSuchMethod(
         Invocation.getter(#mnemonic),
-        returnValue: _i24.Future<List<String>>.value(<String>[]),
-      ) as _i24.Future<List<String>>);
+        returnValue: _i26.Future<List<String>>.value(<String>[]),
+      ) as _i26.Future<List<String>>);
   @override
-  _i24.Future<String?> get mnemonicString => (super.noSuchMethod(
+  _i26.Future<String?> get mnemonicString => (super.noSuchMethod(
         Invocation.getter(#mnemonicString),
-        returnValue: _i24.Future<String?>.value(),
-      ) as _i24.Future<String?>);
+        returnValue: _i26.Future<String?>.value(),
+      ) as _i26.Future<String?>);
   @override
-  _i24.Future<String?> get mnemonicPassphrase => (super.noSuchMethod(
+  _i26.Future<String?> get mnemonicPassphrase => (super.noSuchMethod(
         Invocation.getter(#mnemonicPassphrase),
-        returnValue: _i24.Future<String?>.value(),
-      ) as _i24.Future<String?>);
+        returnValue: _i26.Future<String?>.value(),
+      ) as _i26.Future<String?>);
   @override
-  _i24.Future<int> get chainHeight => (super.noSuchMethod(
+  _i26.Future<int> get chainHeight => (super.noSuchMethod(
         Invocation.getter(#chainHeight),
-        returnValue: _i24.Future<int>.value(0),
-      ) as _i24.Future<int>);
+        returnValue: _i26.Future<int>.value(0),
+      ) as _i26.Future<int>);
   @override
   int get storedChainHeight => (super.noSuchMethod(
         Invocation.getter(#storedChainHeight),
@@ -928,10 +953,10 @@ class MockBitcoinWallet extends _i1.Mock implements _i27.BitcoinWallet {
         ),
       ) as _i11.Balance);
   @override
-  _i24.Future<String> get xpub => (super.noSuchMethod(
+  _i26.Future<String> get xpub => (super.noSuchMethod(
         Invocation.getter(#xpub),
-        returnValue: _i24.Future<String>.value(''),
-      ) as _i24.Future<String>);
+        returnValue: _i26.Future<String>.value(''),
+      ) as _i26.Future<String>);
   @override
   set onIsActiveWalletChanged(void Function(bool)? _onIsActiveWalletChanged) =>
       super.noSuchMethod(
@@ -958,26 +983,26 @@ class MockBitcoinWallet extends _i1.Mock implements _i27.BitcoinWallet {
         ),
       ) as _i13.NetworkType);
   @override
-  _i24.Future<void> exit() => (super.noSuchMethod(
+  _i26.Future<void> exit() => (super.noSuchMethod(
         Invocation.method(
           #exit,
           [],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
-  _i28.DerivePathType addressType({required String? address}) =>
+  _i30.DerivePathType addressType({required String? address}) =>
       (super.noSuchMethod(
         Invocation.method(
           #addressType,
           [],
           {#address: address},
         ),
-        returnValue: _i28.DerivePathType.bip44,
-      ) as _i28.DerivePathType);
+        returnValue: _i30.DerivePathType.bip44,
+      ) as _i30.DerivePathType);
   @override
-  _i24.Future<void> recoverFromMnemonic({
+  _i26.Future<void> recoverFromMnemonic({
     required String? mnemonic,
     String? mnemonicPassphrase,
     required int? maxUnusedAddressGap,
@@ -996,47 +1021,47 @@ class MockBitcoinWallet extends _i1.Mock implements _i27.BitcoinWallet {
             #height: height,
           },
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
-  _i24.Future<void> getTransactionCacheEarly(List<String>? allAddresses) =>
+  _i26.Future<void> getTransactionCacheEarly(List<String>? allAddresses) =>
       (super.noSuchMethod(
         Invocation.method(
           #getTransactionCacheEarly,
           [allAddresses],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
-  _i24.Future<bool> refreshIfThereIsNewData() => (super.noSuchMethod(
+  _i26.Future<bool> refreshIfThereIsNewData() => (super.noSuchMethod(
         Invocation.method(
           #refreshIfThereIsNewData,
           [],
         ),
-        returnValue: _i24.Future<bool>.value(false),
-      ) as _i24.Future<bool>);
+        returnValue: _i26.Future<bool>.value(false),
+      ) as _i26.Future<bool>);
   @override
-  _i24.Future<void> getAllTxsToWatch() => (super.noSuchMethod(
+  _i26.Future<void> getAllTxsToWatch() => (super.noSuchMethod(
         Invocation.method(
           #getAllTxsToWatch,
           [],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
-  _i24.Future<void> refresh() => (super.noSuchMethod(
+  _i26.Future<void> refresh() => (super.noSuchMethod(
         Invocation.method(
           #refresh,
           [],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
-  _i24.Future<Map<String, dynamic>> prepareSend({
+  _i26.Future<Map<String, dynamic>> prepareSend({
     required String? address,
     required _i14.Amount? amount,
     Map<String, dynamic>? args,
@@ -1052,26 +1077,26 @@ class MockBitcoinWallet extends _i1.Mock implements _i27.BitcoinWallet {
           },
         ),
         returnValue:
-            _i24.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
-      ) as _i24.Future<Map<String, dynamic>>);
+            _i26.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
+      ) as _i26.Future<Map<String, dynamic>>);
   @override
-  _i24.Future<String> confirmSend({required Map<String, dynamic>? txData}) =>
+  _i26.Future<String> confirmSend({required Map<String, dynamic>? txData}) =>
       (super.noSuchMethod(
         Invocation.method(
           #confirmSend,
           [],
           {#txData: txData},
         ),
-        returnValue: _i24.Future<String>.value(''),
-      ) as _i24.Future<String>);
+        returnValue: _i26.Future<String>.value(''),
+      ) as _i26.Future<String>);
   @override
-  _i24.Future<bool> testNetworkConnection() => (super.noSuchMethod(
+  _i26.Future<bool> testNetworkConnection() => (super.noSuchMethod(
         Invocation.method(
           #testNetworkConnection,
           [],
         ),
-        returnValue: _i24.Future<bool>.value(false),
-      ) as _i24.Future<bool>);
+        returnValue: _i26.Future<bool>.value(false),
+      ) as _i26.Future<bool>);
   @override
   void startNetworkAlivePinging() => super.noSuchMethod(
         Invocation.method(
@@ -1089,35 +1114,35 @@ class MockBitcoinWallet extends _i1.Mock implements _i27.BitcoinWallet {
         returnValueForMissingStub: null,
       );
   @override
-  _i24.Future<void> initializeNew(
+  _i26.Future<void> initializeNew(
           ({String mnemonicPassphrase, int wordCount})? data) =>
       (super.noSuchMethod(
         Invocation.method(
           #initializeNew,
           [data],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
-  _i24.Future<void> initializeExisting() => (super.noSuchMethod(
+  _i26.Future<void> initializeExisting() => (super.noSuchMethod(
         Invocation.method(
           #initializeExisting,
           [],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
-  _i24.Future<void> updateSentCachedTxData(Map<String, dynamic>? txData) =>
+  _i26.Future<void> updateSentCachedTxData(Map<String, dynamic>? txData) =>
       (super.noSuchMethod(
         Invocation.method(
           #updateSentCachedTxData,
           [txData],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
   bool validateAddress(String? address) => (super.noSuchMethod(
         Invocation.method(
@@ -1127,69 +1152,69 @@ class MockBitcoinWallet extends _i1.Mock implements _i27.BitcoinWallet {
         returnValue: false,
       ) as bool);
   @override
-  _i24.Future<void> updateNode(bool? shouldRefresh) => (super.noSuchMethod(
+  _i26.Future<void> updateNode(bool? shouldRefresh) => (super.noSuchMethod(
         Invocation.method(
           #updateNode,
           [shouldRefresh],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
-  _i24.Future<_i9.ElectrumXNode> getCurrentNode() => (super.noSuchMethod(
+  _i26.Future<_i9.ElectrumXNode> getCurrentNode() => (super.noSuchMethod(
         Invocation.method(
           #getCurrentNode,
           [],
         ),
-        returnValue: _i24.Future<_i9.ElectrumXNode>.value(_FakeElectrumXNode_11(
+        returnValue: _i26.Future<_i9.ElectrumXNode>.value(_FakeElectrumXNode_11(
           this,
           Invocation.method(
             #getCurrentNode,
             [],
           ),
         )),
-      ) as _i24.Future<_i9.ElectrumXNode>);
+      ) as _i26.Future<_i9.ElectrumXNode>);
   @override
-  _i24.Future<List<Map<String, dynamic>>> fastFetch(
+  _i26.Future<List<Map<String, dynamic>>> fastFetch(
           List<String>? allTxHashes) =>
       (super.noSuchMethod(
         Invocation.method(
           #fastFetch,
           [allTxHashes],
         ),
-        returnValue: _i24.Future<List<Map<String, dynamic>>>.value(
+        returnValue: _i26.Future<List<Map<String, dynamic>>>.value(
             <Map<String, dynamic>>[]),
-      ) as _i24.Future<List<Map<String, dynamic>>>);
+      ) as _i26.Future<List<Map<String, dynamic>>>);
   @override
-  _i24.Future<int> getTxCount({required String? address}) =>
+  _i26.Future<int> getTxCount({required String? address}) =>
       (super.noSuchMethod(
         Invocation.method(
           #getTxCount,
           [],
           {#address: address},
         ),
-        returnValue: _i24.Future<int>.value(0),
-      ) as _i24.Future<int>);
+        returnValue: _i26.Future<int>.value(0),
+      ) as _i26.Future<int>);
   @override
-  _i24.Future<void> checkCurrentReceivingAddressesForTransactions() =>
+  _i26.Future<void> checkCurrentReceivingAddressesForTransactions() =>
       (super.noSuchMethod(
         Invocation.method(
           #checkCurrentReceivingAddressesForTransactions,
           [],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
-  _i24.Future<void> checkCurrentChangeAddressesForTransactions() =>
+  _i26.Future<void> checkCurrentChangeAddressesForTransactions() =>
       (super.noSuchMethod(
         Invocation.method(
           #checkCurrentChangeAddressesForTransactions,
           [],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
   int estimateTxFee({
     required int? vSize,
@@ -1215,7 +1240,7 @@ class MockBitcoinWallet extends _i1.Mock implements _i27.BitcoinWallet {
     required bool? isSendAll,
     int? satsPerVByte,
     int? additionalOutputs = 0,
-    List<_i17.UTXO>? utxos,
+    List<_i18.UTXO>? utxos,
   }) =>
       super.noSuchMethod(Invocation.method(
         #coinSelection,
@@ -1232,19 +1257,19 @@ class MockBitcoinWallet extends _i1.Mock implements _i27.BitcoinWallet {
         },
       ));
   @override
-  _i24.Future<List<_i29.SigningData>> fetchBuildTxData(
-          List<_i17.UTXO>? utxosToUse) =>
+  _i26.Future<List<_i31.SigningData>> fetchBuildTxData(
+          List<_i18.UTXO>? utxosToUse) =>
       (super.noSuchMethod(
         Invocation.method(
           #fetchBuildTxData,
           [utxosToUse],
         ),
         returnValue:
-            _i24.Future<List<_i29.SigningData>>.value(<_i29.SigningData>[]),
-      ) as _i24.Future<List<_i29.SigningData>>);
+            _i26.Future<List<_i31.SigningData>>.value(<_i31.SigningData>[]),
+      ) as _i26.Future<List<_i31.SigningData>>);
   @override
-  _i24.Future<Map<String, dynamic>> buildTransaction({
-    required List<_i29.SigningData>? utxoSigningData,
+  _i26.Future<Map<String, dynamic>> buildTransaction({
+    required List<_i31.SigningData>? utxoSigningData,
     required List<String>? recipients,
     required List<int>? satoshiAmounts,
   }) =>
@@ -1259,10 +1284,10 @@ class MockBitcoinWallet extends _i1.Mock implements _i27.BitcoinWallet {
           },
         ),
         returnValue:
-            _i24.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
-      ) as _i24.Future<Map<String, dynamic>>);
+            _i26.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
+      ) as _i26.Future<Map<String, dynamic>>);
   @override
-  _i24.Future<void> fullRescan(
+  _i26.Future<void> fullRescan(
     int? maxUnusedAddressGap,
     int? maxNumberOfIndexesToCheck,
   ) =>
@@ -1274,11 +1299,11 @@ class MockBitcoinWallet extends _i1.Mock implements _i27.BitcoinWallet {
             maxNumberOfIndexesToCheck,
           ],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
-  _i24.Future<_i14.Amount> estimateFeeFor(
+  _i26.Future<_i14.Amount> estimateFeeFor(
     _i14.Amount? amount,
     int? feeRate,
   ) =>
@@ -1290,7 +1315,7 @@ class MockBitcoinWallet extends _i1.Mock implements _i27.BitcoinWallet {
             feeRate,
           ],
         ),
-        returnValue: _i24.Future<_i14.Amount>.value(_FakeAmount_12(
+        returnValue: _i26.Future<_i14.Amount>.value(_FakeAmount_12(
           this,
           Invocation.method(
             #estimateFeeFor,
@@ -1300,7 +1325,7 @@ class MockBitcoinWallet extends _i1.Mock implements _i27.BitcoinWallet {
             ],
           ),
         )),
-      ) as _i24.Future<_i14.Amount>);
+      ) as _i26.Future<_i14.Amount>);
   @override
   _i14.Amount roughFeeEstimate(
     int? inputCount,
@@ -1329,32 +1354,32 @@ class MockBitcoinWallet extends _i1.Mock implements _i27.BitcoinWallet {
         ),
       ) as _i14.Amount);
   @override
-  _i24.Future<_i14.Amount> sweepAllEstimate(int? feeRate) =>
+  _i26.Future<_i14.Amount> sweepAllEstimate(int? feeRate) =>
       (super.noSuchMethod(
         Invocation.method(
           #sweepAllEstimate,
           [feeRate],
         ),
-        returnValue: _i24.Future<_i14.Amount>.value(_FakeAmount_12(
+        returnValue: _i26.Future<_i14.Amount>.value(_FakeAmount_12(
           this,
           Invocation.method(
             #sweepAllEstimate,
             [feeRate],
           ),
         )),
-      ) as _i24.Future<_i14.Amount>);
+      ) as _i26.Future<_i14.Amount>);
   @override
-  _i24.Future<bool> generateNewAddress() => (super.noSuchMethod(
+  _i26.Future<bool> generateNewAddress() => (super.noSuchMethod(
         Invocation.method(
           #generateNewAddress,
           [],
         ),
-        returnValue: _i24.Future<bool>.value(false),
-      ) as _i24.Future<bool>);
+        returnValue: _i26.Future<bool>.value(false),
+      ) as _i26.Future<bool>);
   @override
   void initCache(
     String? walletId,
-    _i23.Coin? coin,
+    _i25.Coin? coin,
   ) =>
       super.noSuchMethod(
         Invocation.method(
@@ -1367,14 +1392,14 @@ class MockBitcoinWallet extends _i1.Mock implements _i27.BitcoinWallet {
         returnValueForMissingStub: null,
       );
   @override
-  _i24.Future<void> updateCachedId(String? id) => (super.noSuchMethod(
+  _i26.Future<void> updateCachedId(String? id) => (super.noSuchMethod(
         Invocation.method(
           #updateCachedId,
           [id],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
   int getCachedChainHeight() => (super.noSuchMethod(
         Invocation.method(
@@ -1384,14 +1409,14 @@ class MockBitcoinWallet extends _i1.Mock implements _i27.BitcoinWallet {
         returnValue: 0,
       ) as int);
   @override
-  _i24.Future<void> updateCachedChainHeight(int? height) => (super.noSuchMethod(
+  _i26.Future<void> updateCachedChainHeight(int? height) => (super.noSuchMethod(
         Invocation.method(
           #updateCachedChainHeight,
           [height],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
   bool getCachedIsFavorite() => (super.noSuchMethod(
         Invocation.method(
@@ -1401,15 +1426,15 @@ class MockBitcoinWallet extends _i1.Mock implements _i27.BitcoinWallet {
         returnValue: false,
       ) as bool);
   @override
-  _i24.Future<void> updateCachedIsFavorite(bool? isFavorite) =>
+  _i26.Future<void> updateCachedIsFavorite(bool? isFavorite) =>
       (super.noSuchMethod(
         Invocation.method(
           #updateCachedIsFavorite,
           [isFavorite],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
   _i11.Balance getCachedBalance() => (super.noSuchMethod(
         Invocation.method(
@@ -1425,15 +1450,15 @@ class MockBitcoinWallet extends _i1.Mock implements _i27.BitcoinWallet {
         ),
       ) as _i11.Balance);
   @override
-  _i24.Future<void> updateCachedBalance(_i11.Balance? balance) =>
+  _i26.Future<void> updateCachedBalance(_i11.Balance? balance) =>
       (super.noSuchMethod(
         Invocation.method(
           #updateCachedBalance,
           [balance],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
   _i11.Balance getCachedBalanceSecondary() => (super.noSuchMethod(
         Invocation.method(
@@ -1449,15 +1474,15 @@ class MockBitcoinWallet extends _i1.Mock implements _i27.BitcoinWallet {
         ),
       ) as _i11.Balance);
   @override
-  _i24.Future<void> updateCachedBalanceSecondary(_i11.Balance? balance) =>
+  _i26.Future<void> updateCachedBalanceSecondary(_i11.Balance? balance) =>
       (super.noSuchMethod(
         Invocation.method(
           #updateCachedBalanceSecondary,
           [balance],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
   List<String> getWalletTokenContractAddresses() => (super.noSuchMethod(
         Invocation.method(
@@ -1467,16 +1492,16 @@ class MockBitcoinWallet extends _i1.Mock implements _i27.BitcoinWallet {
         returnValue: <String>[],
       ) as List<String>);
   @override
-  _i24.Future<void> updateWalletTokenContractAddresses(
+  _i26.Future<void> updateWalletTokenContractAddresses(
           List<String>? contractAddresses) =>
       (super.noSuchMethod(
         Invocation.method(
           #updateWalletTokenContractAddresses,
           [contractAddresses],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
   void initWalletDB({_i12.MainDB? mockableOverride}) => super.noSuchMethod(
         Invocation.method(
@@ -1487,11 +1512,45 @@ class MockBitcoinWallet extends _i1.Mock implements _i27.BitcoinWallet {
         returnValueForMissingStub: null,
       );
   @override
-  _i24.Future<_i15.Tuple2<_i17.Transaction, _i17.Address>> parseTransaction(
+  _i26.Future<_i15.TransactionV2> getTransaction(
+    String? txHash,
+    _i25.Coin? coin,
+    String? walletId,
+    _i10.CachedElectrumX? cachedElectrumX, [
+    String? debugTitle,
+  ]) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #getTransaction,
+          [
+            txHash,
+            coin,
+            walletId,
+            cachedElectrumX,
+            debugTitle,
+          ],
+        ),
+        returnValue:
+            _i26.Future<_i15.TransactionV2>.value(_FakeTransactionV2_13(
+          this,
+          Invocation.method(
+            #getTransaction,
+            [
+              txHash,
+              coin,
+              walletId,
+              cachedElectrumX,
+              debugTitle,
+            ],
+          ),
+        )),
+      ) as _i26.Future<_i15.TransactionV2>);
+  @override
+  _i26.Future<_i16.Tuple2<_i18.Transaction, _i18.Address>> parseTransaction(
     Map<String, dynamic>? txData,
     dynamic electrumxClient,
-    List<_i17.Address>? myAddresses,
-    _i23.Coin? coin,
+    List<_i18.Address>? myAddresses,
+    _i25.Coin? coin,
     int? minConfirms,
     String? walletId,
   ) =>
@@ -1508,8 +1567,8 @@ class MockBitcoinWallet extends _i1.Mock implements _i27.BitcoinWallet {
           ],
         ),
         returnValue:
-            _i24.Future<_i15.Tuple2<_i17.Transaction, _i17.Address>>.value(
-                _FakeTuple2_13<_i17.Transaction, _i17.Address>(
+            _i26.Future<_i16.Tuple2<_i18.Transaction, _i18.Address>>.value(
+                _FakeTuple2_14<_i18.Transaction, _i18.Address>(
           this,
           Invocation.method(
             #parseTransaction,
@@ -1523,37 +1582,37 @@ class MockBitcoinWallet extends _i1.Mock implements _i27.BitcoinWallet {
             ],
           ),
         )),
-      ) as _i24.Future<_i15.Tuple2<_i17.Transaction, _i17.Address>>);
+      ) as _i26.Future<_i16.Tuple2<_i18.Transaction, _i18.Address>>);
   @override
   void initPaynymWalletInterface({
     required String? walletId,
     required String? walletName,
     required _i13.NetworkType? network,
-    required _i23.Coin? coin,
+    required _i25.Coin? coin,
     required _i12.MainDB? db,
     required _i9.ElectrumX? electrumXClient,
-    required _i20.SecureStorageInterface? secureStorage,
+    required _i22.SecureStorageInterface? secureStorage,
     required int? dustLimit,
     required int? dustLimitP2PKH,
     required int? minConfirms,
-    required _i24.Future<String?> Function()? getMnemonicString,
-    required _i24.Future<String?> Function()? getMnemonicPassphrase,
-    required _i24.Future<int> Function()? getChainHeight,
-    required _i24.Future<String> Function()? getCurrentChangeAddress,
+    required _i26.Future<String?> Function()? getMnemonicString,
+    required _i26.Future<String?> Function()? getMnemonicPassphrase,
+    required _i26.Future<int> Function()? getChainHeight,
+    required _i26.Future<String> Function()? getCurrentChangeAddress,
     required int Function({
       required int feeRatePerKB,
       required int vSize,
     })? estimateTxFee,
-    required _i24.Future<Map<String, dynamic>> Function({
+    required _i26.Future<Map<String, dynamic>> Function({
       required String address,
       required _i14.Amount amount,
       Map<String, dynamic>? args,
     })? prepareSend,
-    required _i24.Future<int> Function({required String address})? getTxCount,
-    required _i24.Future<List<_i29.SigningData>> Function(List<_i17.UTXO>)?
+    required _i26.Future<int> Function({required String address})? getTxCount,
+    required _i26.Future<List<_i31.SigningData>> Function(List<_i18.UTXO>)?
         fetchBuildTxData,
-    required _i24.Future<void> Function()? refresh,
-    required _i24.Future<void> Function()? checkChangeAddressForTransactions,
+    required _i26.Future<void> Function()? refresh,
+    required _i26.Future<void> Function()? checkChangeAddressForTransactions,
   }) =>
       super.noSuchMethod(
         Invocation.method(
@@ -1586,21 +1645,21 @@ class MockBitcoinWallet extends _i1.Mock implements _i27.BitcoinWallet {
         returnValueForMissingStub: null,
       );
   @override
-  _i24.Future<_i16.BIP32> getBip47BaseNode() => (super.noSuchMethod(
+  _i26.Future<_i17.BIP32> getBip47BaseNode() => (super.noSuchMethod(
         Invocation.method(
           #getBip47BaseNode,
           [],
         ),
-        returnValue: _i24.Future<_i16.BIP32>.value(_FakeBIP32_14(
+        returnValue: _i26.Future<_i17.BIP32>.value(_FakeBIP32_15(
           this,
           Invocation.method(
             #getBip47BaseNode,
             [],
           ),
         )),
-      ) as _i24.Future<_i16.BIP32>);
+      ) as _i26.Future<_i17.BIP32>);
   @override
-  _i24.Future<_i30.Uint8List> getPrivateKeyForPaynymReceivingAddress({
+  _i26.Future<_i32.Uint8List> getPrivateKeyForPaynymReceivingAddress({
     required String? paymentCodeString,
     required int? index,
   }) =>
@@ -1613,11 +1672,11 @@ class MockBitcoinWallet extends _i1.Mock implements _i27.BitcoinWallet {
             #index: index,
           },
         ),
-        returnValue: _i24.Future<_i30.Uint8List>.value(_i30.Uint8List(0)),
-      ) as _i24.Future<_i30.Uint8List>);
+        returnValue: _i26.Future<_i32.Uint8List>.value(_i32.Uint8List(0)),
+      ) as _i26.Future<_i32.Uint8List>);
   @override
-  _i24.Future<_i17.Address> currentReceivingPaynymAddress({
-    required _i18.PaymentCode? sender,
+  _i26.Future<_i18.Address> currentReceivingPaynymAddress({
+    required _i19.PaymentCode? sender,
     required bool? isSegwit,
   }) =>
       (super.noSuchMethod(
@@ -1629,7 +1688,7 @@ class MockBitcoinWallet extends _i1.Mock implements _i27.BitcoinWallet {
             #isSegwit: isSegwit,
           },
         ),
-        returnValue: _i24.Future<_i17.Address>.value(_FakeAddress_15(
+        returnValue: _i26.Future<_i18.Address>.value(_FakeAddress_16(
           this,
           Invocation.method(
             #currentReceivingPaynymAddress,
@@ -1640,10 +1699,10 @@ class MockBitcoinWallet extends _i1.Mock implements _i27.BitcoinWallet {
             },
           ),
         )),
-      ) as _i24.Future<_i17.Address>);
+      ) as _i26.Future<_i18.Address>);
   @override
-  _i24.Future<void> checkCurrentPaynymReceivingAddressForTransactions({
-    required _i18.PaymentCode? sender,
+  _i26.Future<void> checkCurrentPaynymReceivingAddressForTransactions({
+    required _i19.PaymentCode? sender,
     required bool? isSegwit,
   }) =>
       (super.noSuchMethod(
@@ -1655,42 +1714,42 @@ class MockBitcoinWallet extends _i1.Mock implements _i27.BitcoinWallet {
             #isSegwit: isSegwit,
           },
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
-  _i24.Future<void> checkAllCurrentReceivingPaynymAddressesForTransactions() =>
+  _i26.Future<void> checkAllCurrentReceivingPaynymAddressesForTransactions() =>
       (super.noSuchMethod(
         Invocation.method(
           #checkAllCurrentReceivingPaynymAddressesForTransactions,
           [],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
-  _i24.Future<_i16.BIP32> deriveNotificationBip32Node() => (super.noSuchMethod(
+  _i26.Future<_i17.BIP32> deriveNotificationBip32Node() => (super.noSuchMethod(
         Invocation.method(
           #deriveNotificationBip32Node,
           [],
         ),
-        returnValue: _i24.Future<_i16.BIP32>.value(_FakeBIP32_14(
+        returnValue: _i26.Future<_i17.BIP32>.value(_FakeBIP32_15(
           this,
           Invocation.method(
             #deriveNotificationBip32Node,
             [],
           ),
         )),
-      ) as _i24.Future<_i16.BIP32>);
+      ) as _i26.Future<_i17.BIP32>);
   @override
-  _i24.Future<_i18.PaymentCode> getPaymentCode({required bool? isSegwit}) =>
+  _i26.Future<_i19.PaymentCode> getPaymentCode({required bool? isSegwit}) =>
       (super.noSuchMethod(
         Invocation.method(
           #getPaymentCode,
           [],
           {#isSegwit: isSegwit},
         ),
-        returnValue: _i24.Future<_i18.PaymentCode>.value(_FakePaymentCode_16(
+        returnValue: _i26.Future<_i19.PaymentCode>.value(_FakePaymentCode_17(
           this,
           Invocation.method(
             #getPaymentCode,
@@ -1698,28 +1757,28 @@ class MockBitcoinWallet extends _i1.Mock implements _i27.BitcoinWallet {
             {#isSegwit: isSegwit},
           ),
         )),
-      ) as _i24.Future<_i18.PaymentCode>);
+      ) as _i26.Future<_i19.PaymentCode>);
   @override
-  _i24.Future<_i30.Uint8List> signWithNotificationKey(_i30.Uint8List? data) =>
+  _i26.Future<_i32.Uint8List> signWithNotificationKey(_i32.Uint8List? data) =>
       (super.noSuchMethod(
         Invocation.method(
           #signWithNotificationKey,
           [data],
         ),
-        returnValue: _i24.Future<_i30.Uint8List>.value(_i30.Uint8List(0)),
-      ) as _i24.Future<_i30.Uint8List>);
+        returnValue: _i26.Future<_i32.Uint8List>.value(_i32.Uint8List(0)),
+      ) as _i26.Future<_i32.Uint8List>);
   @override
-  _i24.Future<String> signStringWithNotificationKey(String? data) =>
+  _i26.Future<String> signStringWithNotificationKey(String? data) =>
       (super.noSuchMethod(
         Invocation.method(
           #signStringWithNotificationKey,
           [data],
         ),
-        returnValue: _i24.Future<String>.value(''),
-      ) as _i24.Future<String>);
+        returnValue: _i26.Future<String>.value(''),
+      ) as _i26.Future<String>);
   @override
-  _i24.Future<Map<String, dynamic>> preparePaymentCodeSend({
-    required _i18.PaymentCode? paymentCode,
+  _i26.Future<Map<String, dynamic>> preparePaymentCodeSend({
+    required _i19.PaymentCode? paymentCode,
     required bool? isSegwit,
     required _i14.Amount? amount,
     Map<String, dynamic>? args,
@@ -1736,13 +1795,13 @@ class MockBitcoinWallet extends _i1.Mock implements _i27.BitcoinWallet {
           },
         ),
         returnValue:
-            _i24.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
-      ) as _i24.Future<Map<String, dynamic>>);
+            _i26.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
+      ) as _i26.Future<Map<String, dynamic>>);
   @override
-  _i24.Future<_i17.Address> nextUnusedSendAddressFrom({
-    required _i18.PaymentCode? pCode,
+  _i26.Future<_i18.Address> nextUnusedSendAddressFrom({
+    required _i19.PaymentCode? pCode,
     required bool? isSegwit,
-    required _i16.BIP32? privateKeyNode,
+    required _i17.BIP32? privateKeyNode,
     int? startIndex = 0,
   }) =>
       (super.noSuchMethod(
@@ -1756,7 +1815,7 @@ class MockBitcoinWallet extends _i1.Mock implements _i27.BitcoinWallet {
             #startIndex: startIndex,
           },
         ),
-        returnValue: _i24.Future<_i17.Address>.value(_FakeAddress_15(
+        returnValue: _i26.Future<_i18.Address>.value(_FakeAddress_16(
           this,
           Invocation.method(
             #nextUnusedSendAddressFrom,
@@ -1769,13 +1828,13 @@ class MockBitcoinWallet extends _i1.Mock implements _i27.BitcoinWallet {
             },
           ),
         )),
-      ) as _i24.Future<_i17.Address>);
+      ) as _i26.Future<_i18.Address>);
   @override
-  _i24.Future<Map<String, dynamic>> prepareNotificationTx({
+  _i26.Future<Map<String, dynamic>> prepareNotificationTx({
     required int? selectedTxFeeRate,
     required String? targetPaymentCodeString,
     int? additionalOutputs = 0,
-    List<_i17.UTXO>? utxos,
+    List<_i18.UTXO>? utxos,
   }) =>
       (super.noSuchMethod(
         Invocation.method(
@@ -1789,10 +1848,10 @@ class MockBitcoinWallet extends _i1.Mock implements _i27.BitcoinWallet {
           },
         ),
         returnValue:
-            _i24.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
-      ) as _i24.Future<Map<String, dynamic>>);
+            _i26.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
+      ) as _i26.Future<Map<String, dynamic>>);
   @override
-  _i24.Future<String> broadcastNotificationTx(
+  _i26.Future<String> broadcastNotificationTx(
           {required Map<String, dynamic>? preparedTx}) =>
       (super.noSuchMethod(
         Invocation.method(
@@ -1800,62 +1859,62 @@ class MockBitcoinWallet extends _i1.Mock implements _i27.BitcoinWallet {
           [],
           {#preparedTx: preparedTx},
         ),
-        returnValue: _i24.Future<String>.value(''),
-      ) as _i24.Future<String>);
+        returnValue: _i26.Future<String>.value(''),
+      ) as _i26.Future<String>);
   @override
-  _i24.Future<bool> hasConnected(String? paymentCodeString) =>
+  _i26.Future<bool> hasConnected(String? paymentCodeString) =>
       (super.noSuchMethod(
         Invocation.method(
           #hasConnected,
           [paymentCodeString],
         ),
-        returnValue: _i24.Future<bool>.value(false),
-      ) as _i24.Future<bool>);
+        returnValue: _i26.Future<bool>.value(false),
+      ) as _i26.Future<bool>);
   @override
-  _i24.Future<_i18.PaymentCode?> unBlindedPaymentCodeFromTransaction(
-          {required _i17.Transaction? transaction}) =>
+  _i26.Future<_i19.PaymentCode?> unBlindedPaymentCodeFromTransaction(
+          {required _i18.Transaction? transaction}) =>
       (super.noSuchMethod(
         Invocation.method(
           #unBlindedPaymentCodeFromTransaction,
           [],
           {#transaction: transaction},
         ),
-        returnValue: _i24.Future<_i18.PaymentCode?>.value(),
-      ) as _i24.Future<_i18.PaymentCode?>);
+        returnValue: _i26.Future<_i19.PaymentCode?>.value(),
+      ) as _i26.Future<_i19.PaymentCode?>);
   @override
-  _i24.Future<_i18.PaymentCode?> unBlindedPaymentCodeFromTransactionBad(
-          {required _i17.Transaction? transaction}) =>
+  _i26.Future<_i19.PaymentCode?> unBlindedPaymentCodeFromTransactionBad(
+          {required _i18.Transaction? transaction}) =>
       (super.noSuchMethod(
         Invocation.method(
           #unBlindedPaymentCodeFromTransactionBad,
           [],
           {#transaction: transaction},
         ),
-        returnValue: _i24.Future<_i18.PaymentCode?>.value(),
-      ) as _i24.Future<_i18.PaymentCode?>);
+        returnValue: _i26.Future<_i19.PaymentCode?>.value(),
+      ) as _i26.Future<_i19.PaymentCode?>);
   @override
-  _i24.Future<List<_i18.PaymentCode>>
+  _i26.Future<List<_i19.PaymentCode>>
       getAllPaymentCodesFromNotificationTransactions() => (super.noSuchMethod(
             Invocation.method(
               #getAllPaymentCodesFromNotificationTransactions,
               [],
             ),
             returnValue:
-                _i24.Future<List<_i18.PaymentCode>>.value(<_i18.PaymentCode>[]),
-          ) as _i24.Future<List<_i18.PaymentCode>>);
+                _i26.Future<List<_i19.PaymentCode>>.value(<_i19.PaymentCode>[]),
+          ) as _i26.Future<List<_i19.PaymentCode>>);
   @override
-  _i24.Future<void> checkForNotificationTransactionsTo(
+  _i26.Future<void> checkForNotificationTransactionsTo(
           Set<String>? otherCodeStrings) =>
       (super.noSuchMethod(
         Invocation.method(
           #checkForNotificationTransactionsTo,
           [otherCodeStrings],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
-  _i24.Future<void> restoreAllHistory({
+  _i26.Future<void> restoreAllHistory({
     required int? maxUnusedAddressGap,
     required int? maxNumberOfIndexesToCheck,
     required Set<String>? paymentCodeStrings,
@@ -1870,12 +1929,12 @@ class MockBitcoinWallet extends _i1.Mock implements _i27.BitcoinWallet {
             #paymentCodeStrings: paymentCodeStrings,
           },
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
-  _i24.Future<void> restoreHistoryWith({
-    required _i18.PaymentCode? other,
+  _i26.Future<void> restoreHistoryWith({
+    required _i19.PaymentCode? other,
     required bool? checkSegwitAsWell,
     required int? maxUnusedAddressGap,
     required int? maxNumberOfIndexesToCheck,
@@ -1891,58 +1950,58 @@ class MockBitcoinWallet extends _i1.Mock implements _i27.BitcoinWallet {
             #maxNumberOfIndexesToCheck: maxNumberOfIndexesToCheck,
           },
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
-  _i24.Future<_i17.Address> getMyNotificationAddress() => (super.noSuchMethod(
+  _i26.Future<_i18.Address> getMyNotificationAddress() => (super.noSuchMethod(
         Invocation.method(
           #getMyNotificationAddress,
           [],
         ),
-        returnValue: _i24.Future<_i17.Address>.value(_FakeAddress_15(
+        returnValue: _i26.Future<_i18.Address>.value(_FakeAddress_16(
           this,
           Invocation.method(
             #getMyNotificationAddress,
             [],
           ),
         )),
-      ) as _i24.Future<_i17.Address>);
+      ) as _i26.Future<_i18.Address>);
   @override
-  _i24.Future<List<String>> lookupKey(String? paymentCodeString) =>
+  _i26.Future<List<String>> lookupKey(String? paymentCodeString) =>
       (super.noSuchMethod(
         Invocation.method(
           #lookupKey,
           [paymentCodeString],
         ),
-        returnValue: _i24.Future<List<String>>.value(<String>[]),
-      ) as _i24.Future<List<String>>);
+        returnValue: _i26.Future<List<String>>.value(<String>[]),
+      ) as _i26.Future<List<String>>);
   @override
-  _i24.Future<String?> paymentCodeStringByKey(String? key) =>
+  _i26.Future<String?> paymentCodeStringByKey(String? key) =>
       (super.noSuchMethod(
         Invocation.method(
           #paymentCodeStringByKey,
           [key],
         ),
-        returnValue: _i24.Future<String?>.value(),
-      ) as _i24.Future<String?>);
+        returnValue: _i26.Future<String?>.value(),
+      ) as _i26.Future<String?>);
   @override
-  _i24.Future<String> storeCode(String? paymentCodeString) =>
+  _i26.Future<String> storeCode(String? paymentCodeString) =>
       (super.noSuchMethod(
         Invocation.method(
           #storeCode,
           [paymentCodeString],
         ),
-        returnValue: _i24.Future<String>.value(''),
-      ) as _i24.Future<String>);
+        returnValue: _i26.Future<String>.value(''),
+      ) as _i26.Future<String>);
   @override
   void initCoinControlInterface({
     required String? walletId,
     required String? walletName,
-    required _i23.Coin? coin,
+    required _i25.Coin? coin,
     required _i12.MainDB? db,
-    required _i24.Future<int> Function()? getChainHeight,
-    required _i24.Future<void> Function(_i11.Balance)? refreshedBalanceCallback,
+    required _i26.Future<int> Function()? getChainHeight,
+    required _i26.Future<void> Function(_i11.Balance)? refreshedBalanceCallback,
   }) =>
       super.noSuchMethod(
         Invocation.method(
@@ -1960,36 +2019,36 @@ class MockBitcoinWallet extends _i1.Mock implements _i27.BitcoinWallet {
         returnValueForMissingStub: null,
       );
   @override
-  _i24.Future<void> refreshBalance({bool? notify = false}) =>
+  _i26.Future<void> refreshBalance({bool? notify = false}) =>
       (super.noSuchMethod(
         Invocation.method(
           #refreshBalance,
           [],
           {#notify: notify},
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
 }
 
 /// A class which mocks [ThemeService].
 ///
 /// See the documentation for Mockito's code generation for more information.
-class MockThemeService extends _i1.Mock implements _i31.ThemeService {
+class MockThemeService extends _i1.Mock implements _i33.ThemeService {
   MockThemeService() {
     _i1.throwOnMissingStub(this);
   }
 
   @override
-  _i19.HTTP get client => (super.noSuchMethod(
+  _i20.HTTP get client => (super.noSuchMethod(
         Invocation.getter(#client),
-        returnValue: _FakeHTTP_17(
+        returnValue: _FakeHTTP_18(
           this,
           Invocation.getter(#client),
         ),
-      ) as _i19.HTTP);
+      ) as _i20.HTTP);
   @override
-  set client(_i19.HTTP? _client) => super.noSuchMethod(
+  set client(_i20.HTTP? _client) => super.noSuchMethod(
         Invocation.setter(
           #client,
           _client,
@@ -2005,10 +2064,10 @@ class MockThemeService extends _i1.Mock implements _i31.ThemeService {
         ),
       ) as _i12.MainDB);
   @override
-  List<_i32.StackTheme> get installedThemes => (super.noSuchMethod(
+  List<_i34.StackTheme> get installedThemes => (super.noSuchMethod(
         Invocation.getter(#installedThemes),
-        returnValue: <_i32.StackTheme>[],
-      ) as List<_i32.StackTheme>);
+        returnValue: <_i34.StackTheme>[],
+      ) as List<_i34.StackTheme>);
   @override
   void init(_i12.MainDB? db) => super.noSuchMethod(
         Invocation.method(
@@ -2018,79 +2077,79 @@ class MockThemeService extends _i1.Mock implements _i31.ThemeService {
         returnValueForMissingStub: null,
       );
   @override
-  _i24.Future<void> install({required _i30.Uint8List? themeArchiveData}) =>
+  _i26.Future<void> install({required _i32.Uint8List? themeArchiveData}) =>
       (super.noSuchMethod(
         Invocation.method(
           #install,
           [],
           {#themeArchiveData: themeArchiveData},
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
-  _i24.Future<void> remove({required String? themeId}) => (super.noSuchMethod(
+  _i26.Future<void> remove({required String? themeId}) => (super.noSuchMethod(
         Invocation.method(
           #remove,
           [],
           {#themeId: themeId},
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
-  _i24.Future<void> checkDefaultThemesOnStartup() => (super.noSuchMethod(
+  _i26.Future<void> checkDefaultThemesOnStartup() => (super.noSuchMethod(
         Invocation.method(
           #checkDefaultThemesOnStartup,
           [],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
-  _i24.Future<bool> verifyInstalled({required String? themeId}) =>
+  _i26.Future<bool> verifyInstalled({required String? themeId}) =>
       (super.noSuchMethod(
         Invocation.method(
           #verifyInstalled,
           [],
           {#themeId: themeId},
         ),
-        returnValue: _i24.Future<bool>.value(false),
-      ) as _i24.Future<bool>);
+        returnValue: _i26.Future<bool>.value(false),
+      ) as _i26.Future<bool>);
   @override
-  _i24.Future<List<_i31.StackThemeMetaData>> fetchThemes() =>
+  _i26.Future<List<_i33.StackThemeMetaData>> fetchThemes() =>
       (super.noSuchMethod(
         Invocation.method(
           #fetchThemes,
           [],
         ),
-        returnValue: _i24.Future<List<_i31.StackThemeMetaData>>.value(
-            <_i31.StackThemeMetaData>[]),
-      ) as _i24.Future<List<_i31.StackThemeMetaData>>);
+        returnValue: _i26.Future<List<_i33.StackThemeMetaData>>.value(
+            <_i33.StackThemeMetaData>[]),
+      ) as _i26.Future<List<_i33.StackThemeMetaData>>);
   @override
-  _i24.Future<_i30.Uint8List> fetchTheme(
-          {required _i31.StackThemeMetaData? themeMetaData}) =>
+  _i26.Future<_i32.Uint8List> fetchTheme(
+          {required _i33.StackThemeMetaData? themeMetaData}) =>
       (super.noSuchMethod(
         Invocation.method(
           #fetchTheme,
           [],
           {#themeMetaData: themeMetaData},
         ),
-        returnValue: _i24.Future<_i30.Uint8List>.value(_i30.Uint8List(0)),
-      ) as _i24.Future<_i30.Uint8List>);
+        returnValue: _i26.Future<_i32.Uint8List>.value(_i32.Uint8List(0)),
+      ) as _i26.Future<_i32.Uint8List>);
   @override
-  _i32.StackTheme? getTheme({required String? themeId}) =>
+  _i34.StackTheme? getTheme({required String? themeId}) =>
       (super.noSuchMethod(Invocation.method(
         #getTheme,
         [],
         {#themeId: themeId},
-      )) as _i32.StackTheme?);
+      )) as _i34.StackTheme?);
 }
 
 /// A class which mocks [Prefs].
 ///
 /// See the documentation for Mockito's code generation for more information.
-class MockPrefs extends _i1.Mock implements _i25.Prefs {
+class MockPrefs extends _i1.Mock implements _i27.Prefs {
   MockPrefs() {
     _i1.throwOnMissingStub(this);
   }
@@ -2146,12 +2205,12 @@ class MockPrefs extends _i1.Mock implements _i25.Prefs {
         returnValueForMissingStub: null,
       );
   @override
-  _i33.SyncingType get syncType => (super.noSuchMethod(
+  _i35.SyncingType get syncType => (super.noSuchMethod(
         Invocation.getter(#syncType),
-        returnValue: _i33.SyncingType.currentWalletOnly,
-      ) as _i33.SyncingType);
+        returnValue: _i35.SyncingType.currentWalletOnly,
+      ) as _i35.SyncingType);
   @override
-  set syncType(_i33.SyncingType? syncType) => super.noSuchMethod(
+  set syncType(_i35.SyncingType? syncType) => super.noSuchMethod(
         Invocation.setter(
           #syncType,
           syncType,
@@ -2310,12 +2369,12 @@ class MockPrefs extends _i1.Mock implements _i25.Prefs {
         returnValueForMissingStub: null,
       );
   @override
-  _i34.BackupFrequencyType get backupFrequencyType => (super.noSuchMethod(
+  _i36.BackupFrequencyType get backupFrequencyType => (super.noSuchMethod(
         Invocation.getter(#backupFrequencyType),
-        returnValue: _i34.BackupFrequencyType.everyTenMinutes,
-      ) as _i34.BackupFrequencyType);
+        returnValue: _i36.BackupFrequencyType.everyTenMinutes,
+      ) as _i36.BackupFrequencyType);
   @override
-  set backupFrequencyType(_i34.BackupFrequencyType? backupFrequencyType) =>
+  set backupFrequencyType(_i36.BackupFrequencyType? backupFrequencyType) =>
       super.noSuchMethod(
         Invocation.setter(
           #backupFrequencyType,
@@ -2461,66 +2520,82 @@ class MockPrefs extends _i1.Mock implements _i25.Prefs {
         returnValueForMissingStub: null,
       );
   @override
+  _i21.FusionInfo get fusionServerInfo => (super.noSuchMethod(
+        Invocation.getter(#fusionServerInfo),
+        returnValue: _FakeFusionInfo_19(
+          this,
+          Invocation.getter(#fusionServerInfo),
+        ),
+      ) as _i21.FusionInfo);
+  @override
+  set fusionServerInfo(_i21.FusionInfo? fusionServerInfo) => super.noSuchMethod(
+        Invocation.setter(
+          #fusionServerInfo,
+          fusionServerInfo,
+        ),
+        returnValueForMissingStub: null,
+      );
+  @override
   bool get hasListeners => (super.noSuchMethod(
         Invocation.getter(#hasListeners),
         returnValue: false,
       ) as bool);
   @override
-  _i24.Future<void> init() => (super.noSuchMethod(
+  _i26.Future<void> init() => (super.noSuchMethod(
         Invocation.method(
           #init,
           [],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
-  _i24.Future<void> incrementCurrentNotificationIndex() => (super.noSuchMethod(
+  _i26.Future<void> incrementCurrentNotificationIndex() => (super.noSuchMethod(
         Invocation.method(
           #incrementCurrentNotificationIndex,
           [],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
-  _i24.Future<bool> isExternalCallsSet() => (super.noSuchMethod(
+  _i26.Future<bool> isExternalCallsSet() => (super.noSuchMethod(
         Invocation.method(
           #isExternalCallsSet,
           [],
         ),
-        returnValue: _i24.Future<bool>.value(false),
-      ) as _i24.Future<bool>);
+        returnValue: _i26.Future<bool>.value(false),
+      ) as _i26.Future<bool>);
   @override
-  _i24.Future<void> saveUserID(String? userId) => (super.noSuchMethod(
+  _i26.Future<void> saveUserID(String? userId) => (super.noSuchMethod(
         Invocation.method(
           #saveUserID,
           [userId],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
-  _i24.Future<void> saveSignupEpoch(int? signupEpoch) => (super.noSuchMethod(
+  _i26.Future<void> saveSignupEpoch(int? signupEpoch) => (super.noSuchMethod(
         Invocation.method(
           #saveSignupEpoch,
           [signupEpoch],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
-  _i35.AmountUnit amountUnit(_i23.Coin? coin) => (super.noSuchMethod(
+  _i37.AmountUnit amountUnit(_i25.Coin? coin) => (super.noSuchMethod(
         Invocation.method(
           #amountUnit,
           [coin],
         ),
-        returnValue: _i35.AmountUnit.normal,
-      ) as _i35.AmountUnit);
+        returnValue: _i37.AmountUnit.normal,
+      ) as _i37.AmountUnit);
   @override
   void updateAmountUnit({
-    required _i23.Coin? coin,
-    required _i35.AmountUnit? amountUnit,
+    required _i25.Coin? coin,
+    required _i37.AmountUnit? amountUnit,
   }) =>
       super.noSuchMethod(
         Invocation.method(
@@ -2534,7 +2609,7 @@ class MockPrefs extends _i1.Mock implements _i25.Prefs {
         returnValueForMissingStub: null,
       );
   @override
-  int maxDecimals(_i23.Coin? coin) => (super.noSuchMethod(
+  int maxDecimals(_i25.Coin? coin) => (super.noSuchMethod(
         Invocation.method(
           #maxDecimals,
           [coin],
@@ -2543,7 +2618,7 @@ class MockPrefs extends _i1.Mock implements _i25.Prefs {
       ) as int);
   @override
   void updateMaxDecimals({
-    required _i23.Coin? coin,
+    required _i25.Coin? coin,
     required int? maxDecimals,
   }) =>
       super.noSuchMethod(
@@ -2558,7 +2633,7 @@ class MockPrefs extends _i1.Mock implements _i25.Prefs {
         returnValueForMissingStub: null,
       );
   @override
-  void addListener(_i26.VoidCallback? listener) => super.noSuchMethod(
+  void addListener(_i28.VoidCallback? listener) => super.noSuchMethod(
         Invocation.method(
           #addListener,
           [listener],
@@ -2566,7 +2641,7 @@ class MockPrefs extends _i1.Mock implements _i25.Prefs {
         returnValueForMissingStub: null,
       );
   @override
-  void removeListener(_i26.VoidCallback? listener) => super.noSuchMethod(
+  void removeListener(_i28.VoidCallback? listener) => super.noSuchMethod(
         Invocation.method(
           #removeListener,
           [listener],
@@ -2594,7 +2669,7 @@ class MockPrefs extends _i1.Mock implements _i25.Prefs {
 /// A class which mocks [LocaleService].
 ///
 /// See the documentation for Mockito's code generation for more information.
-class MockLocaleService extends _i1.Mock implements _i36.LocaleService {
+class MockLocaleService extends _i1.Mock implements _i38.LocaleService {
   MockLocaleService() {
     _i1.throwOnMissingStub(this);
   }
@@ -2610,17 +2685,17 @@ class MockLocaleService extends _i1.Mock implements _i36.LocaleService {
         returnValue: false,
       ) as bool);
   @override
-  _i24.Future<void> loadLocale({bool? notify = true}) => (super.noSuchMethod(
+  _i26.Future<void> loadLocale({bool? notify = true}) => (super.noSuchMethod(
         Invocation.method(
           #loadLocale,
           [],
           {#notify: notify},
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
-  void addListener(_i26.VoidCallback? listener) => super.noSuchMethod(
+  void addListener(_i28.VoidCallback? listener) => super.noSuchMethod(
         Invocation.method(
           #addListener,
           [listener],
@@ -2628,7 +2703,7 @@ class MockLocaleService extends _i1.Mock implements _i36.LocaleService {
         returnValueForMissingStub: null,
       );
   @override
-  void removeListener(_i26.VoidCallback? listener) => super.noSuchMethod(
+  void removeListener(_i28.VoidCallback? listener) => super.noSuchMethod(
         Invocation.method(
           #removeListener,
           [listener],
@@ -2658,41 +2733,41 @@ class MockLocaleService extends _i1.Mock implements _i36.LocaleService {
 /// See the documentation for Mockito's code generation for more information.
 class MockNodeService extends _i1.Mock implements _i3.NodeService {
   @override
-  _i20.SecureStorageInterface get secureStorageInterface => (super.noSuchMethod(
+  _i22.SecureStorageInterface get secureStorageInterface => (super.noSuchMethod(
         Invocation.getter(#secureStorageInterface),
-        returnValue: _FakeSecureStorageInterface_18(
+        returnValue: _FakeSecureStorageInterface_20(
           this,
           Invocation.getter(#secureStorageInterface),
         ),
-      ) as _i20.SecureStorageInterface);
+      ) as _i22.SecureStorageInterface);
   @override
-  List<_i37.NodeModel> get primaryNodes => (super.noSuchMethod(
+  List<_i39.NodeModel> get primaryNodes => (super.noSuchMethod(
         Invocation.getter(#primaryNodes),
-        returnValue: <_i37.NodeModel>[],
-      ) as List<_i37.NodeModel>);
+        returnValue: <_i39.NodeModel>[],
+      ) as List<_i39.NodeModel>);
   @override
-  List<_i37.NodeModel> get nodes => (super.noSuchMethod(
+  List<_i39.NodeModel> get nodes => (super.noSuchMethod(
         Invocation.getter(#nodes),
-        returnValue: <_i37.NodeModel>[],
-      ) as List<_i37.NodeModel>);
+        returnValue: <_i39.NodeModel>[],
+      ) as List<_i39.NodeModel>);
   @override
   bool get hasListeners => (super.noSuchMethod(
         Invocation.getter(#hasListeners),
         returnValue: false,
       ) as bool);
   @override
-  _i24.Future<void> updateDefaults() => (super.noSuchMethod(
+  _i26.Future<void> updateDefaults() => (super.noSuchMethod(
         Invocation.method(
           #updateDefaults,
           [],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
-  _i24.Future<void> setPrimaryNodeFor({
-    required _i23.Coin? coin,
-    required _i37.NodeModel? node,
+  _i26.Future<void> setPrimaryNodeFor({
+    required _i25.Coin? coin,
+    required _i39.NodeModel? node,
     bool? shouldNotifyListeners = false,
   }) =>
       (super.noSuchMethod(
@@ -2705,44 +2780,44 @@ class MockNodeService extends _i1.Mock implements _i3.NodeService {
             #shouldNotifyListeners: shouldNotifyListeners,
           },
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
-  _i37.NodeModel? getPrimaryNodeFor({required _i23.Coin? coin}) =>
+  _i39.NodeModel? getPrimaryNodeFor({required _i25.Coin? coin}) =>
       (super.noSuchMethod(Invocation.method(
         #getPrimaryNodeFor,
         [],
         {#coin: coin},
-      )) as _i37.NodeModel?);
+      )) as _i39.NodeModel?);
   @override
-  List<_i37.NodeModel> getNodesFor(_i23.Coin? coin) => (super.noSuchMethod(
+  List<_i39.NodeModel> getNodesFor(_i25.Coin? coin) => (super.noSuchMethod(
         Invocation.method(
           #getNodesFor,
           [coin],
         ),
-        returnValue: <_i37.NodeModel>[],
-      ) as List<_i37.NodeModel>);
+        returnValue: <_i39.NodeModel>[],
+      ) as List<_i39.NodeModel>);
   @override
-  _i37.NodeModel? getNodeById({required String? id}) =>
+  _i39.NodeModel? getNodeById({required String? id}) =>
       (super.noSuchMethod(Invocation.method(
         #getNodeById,
         [],
         {#id: id},
-      )) as _i37.NodeModel?);
+      )) as _i39.NodeModel?);
   @override
-  List<_i37.NodeModel> failoverNodesFor({required _i23.Coin? coin}) =>
+  List<_i39.NodeModel> failoverNodesFor({required _i25.Coin? coin}) =>
       (super.noSuchMethod(
         Invocation.method(
           #failoverNodesFor,
           [],
           {#coin: coin},
         ),
-        returnValue: <_i37.NodeModel>[],
-      ) as List<_i37.NodeModel>);
+        returnValue: <_i39.NodeModel>[],
+      ) as List<_i39.NodeModel>);
   @override
-  _i24.Future<void> add(
-    _i37.NodeModel? node,
+  _i26.Future<void> add(
+    _i39.NodeModel? node,
     String? password,
     bool? shouldNotifyListeners,
   ) =>
@@ -2755,11 +2830,11 @@ class MockNodeService extends _i1.Mock implements _i3.NodeService {
             shouldNotifyListeners,
           ],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
-  _i24.Future<void> delete(
+  _i26.Future<void> delete(
     String? id,
     bool? shouldNotifyListeners,
   ) =>
@@ -2771,11 +2846,11 @@ class MockNodeService extends _i1.Mock implements _i3.NodeService {
             shouldNotifyListeners,
           ],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
-  _i24.Future<void> setEnabledState(
+  _i26.Future<void> setEnabledState(
     String? id,
     bool? enabled,
     bool? shouldNotifyListeners,
@@ -2789,12 +2864,12 @@ class MockNodeService extends _i1.Mock implements _i3.NodeService {
             shouldNotifyListeners,
           ],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
-  _i24.Future<void> edit(
-    _i37.NodeModel? editedNode,
+  _i26.Future<void> edit(
+    _i39.NodeModel? editedNode,
     String? password,
     bool? shouldNotifyListeners,
   ) =>
@@ -2807,20 +2882,20 @@ class MockNodeService extends _i1.Mock implements _i3.NodeService {
             shouldNotifyListeners,
           ],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
-  _i24.Future<void> updateCommunityNodes() => (super.noSuchMethod(
+  _i26.Future<void> updateCommunityNodes() => (super.noSuchMethod(
         Invocation.method(
           #updateCommunityNodes,
           [],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
-  void addListener(_i26.VoidCallback? listener) => super.noSuchMethod(
+  void addListener(_i28.VoidCallback? listener) => super.noSuchMethod(
         Invocation.method(
           #addListener,
           [listener],
@@ -2828,7 +2903,7 @@ class MockNodeService extends _i1.Mock implements _i3.NodeService {
         returnValueForMissingStub: null,
       );
   @override
-  void removeListener(_i26.VoidCallback? listener) => super.noSuchMethod(
+  void removeListener(_i28.VoidCallback? listener) => super.noSuchMethod(
         Invocation.method(
           #removeListener,
           [listener],
@@ -2871,23 +2946,23 @@ class MockManager extends _i1.Mock implements _i6.Manager {
         returnValueForMissingStub: null,
       );
   @override
-  _i21.CoinServiceAPI get wallet => (super.noSuchMethod(
+  _i23.CoinServiceAPI get wallet => (super.noSuchMethod(
         Invocation.getter(#wallet),
-        returnValue: _FakeCoinServiceAPI_19(
+        returnValue: _FakeCoinServiceAPI_21(
           this,
           Invocation.getter(#wallet),
         ),
-      ) as _i21.CoinServiceAPI);
+      ) as _i23.CoinServiceAPI);
   @override
   bool get hasBackgroundRefreshListener => (super.noSuchMethod(
         Invocation.getter(#hasBackgroundRefreshListener),
         returnValue: false,
       ) as bool);
   @override
-  _i23.Coin get coin => (super.noSuchMethod(
+  _i25.Coin get coin => (super.noSuchMethod(
         Invocation.getter(#coin),
-        returnValue: _i23.Coin.bitcoin,
-      ) as _i23.Coin);
+        returnValue: _i25.Coin.bitcoin,
+      ) as _i25.Coin);
   @override
   bool get isRefreshing => (super.noSuchMethod(
         Invocation.getter(#isRefreshing),
@@ -2920,23 +2995,23 @@ class MockManager extends _i1.Mock implements _i6.Manager {
         returnValueForMissingStub: null,
       );
   @override
-  _i24.Future<_i8.FeeObject> get fees => (super.noSuchMethod(
+  _i26.Future<_i8.FeeObject> get fees => (super.noSuchMethod(
         Invocation.getter(#fees),
-        returnValue: _i24.Future<_i8.FeeObject>.value(_FakeFeeObject_5(
+        returnValue: _i26.Future<_i8.FeeObject>.value(_FakeFeeObject_5(
           this,
           Invocation.getter(#fees),
         )),
-      ) as _i24.Future<_i8.FeeObject>);
+      ) as _i26.Future<_i8.FeeObject>);
   @override
-  _i24.Future<int> get maxFee => (super.noSuchMethod(
+  _i26.Future<int> get maxFee => (super.noSuchMethod(
         Invocation.getter(#maxFee),
-        returnValue: _i24.Future<int>.value(0),
-      ) as _i24.Future<int>);
+        returnValue: _i26.Future<int>.value(0),
+      ) as _i26.Future<int>);
   @override
-  _i24.Future<String> get currentReceivingAddress => (super.noSuchMethod(
+  _i26.Future<String> get currentReceivingAddress => (super.noSuchMethod(
         Invocation.getter(#currentReceivingAddress),
-        returnValue: _i24.Future<String>.value(''),
-      ) as _i24.Future<String>);
+        returnValue: _i26.Future<String>.value(''),
+      ) as _i26.Future<String>);
   @override
   _i11.Balance get balance => (super.noSuchMethod(
         Invocation.getter(#balance),
@@ -2946,16 +3021,16 @@ class MockManager extends _i1.Mock implements _i6.Manager {
         ),
       ) as _i11.Balance);
   @override
-  _i24.Future<List<_i17.Transaction>> get transactions => (super.noSuchMethod(
+  _i26.Future<List<_i18.Transaction>> get transactions => (super.noSuchMethod(
         Invocation.getter(#transactions),
         returnValue:
-            _i24.Future<List<_i17.Transaction>>.value(<_i17.Transaction>[]),
-      ) as _i24.Future<List<_i17.Transaction>>);
+            _i26.Future<List<_i18.Transaction>>.value(<_i18.Transaction>[]),
+      ) as _i26.Future<List<_i18.Transaction>>);
   @override
-  _i24.Future<List<_i17.UTXO>> get utxos => (super.noSuchMethod(
+  _i26.Future<List<_i18.UTXO>> get utxos => (super.noSuchMethod(
         Invocation.getter(#utxos),
-        returnValue: _i24.Future<List<_i17.UTXO>>.value(<_i17.UTXO>[]),
-      ) as _i24.Future<List<_i17.UTXO>>);
+        returnValue: _i26.Future<List<_i18.UTXO>>.value(<_i18.UTXO>[]),
+      ) as _i26.Future<List<_i18.UTXO>>);
   @override
   set walletName(String? newName) => super.noSuchMethod(
         Invocation.setter(
@@ -2975,15 +3050,15 @@ class MockManager extends _i1.Mock implements _i6.Manager {
         returnValue: '',
       ) as String);
   @override
-  _i24.Future<List<String>> get mnemonic => (super.noSuchMethod(
+  _i26.Future<List<String>> get mnemonic => (super.noSuchMethod(
         Invocation.getter(#mnemonic),
-        returnValue: _i24.Future<List<String>>.value(<String>[]),
-      ) as _i24.Future<List<String>>);
+        returnValue: _i26.Future<List<String>>.value(<String>[]),
+      ) as _i26.Future<List<String>>);
   @override
-  _i24.Future<String?> get mnemonicPassphrase => (super.noSuchMethod(
+  _i26.Future<String?> get mnemonicPassphrase => (super.noSuchMethod(
         Invocation.getter(#mnemonicPassphrase),
-        returnValue: _i24.Future<String?>.value(),
-      ) as _i24.Future<String?>);
+        returnValue: _i26.Future<String?>.value(),
+      ) as _i26.Future<String?>);
   @override
   bool get isConnected => (super.noSuchMethod(
         Invocation.getter(#isConnected),
@@ -3020,6 +3095,11 @@ class MockManager extends _i1.Mock implements _i6.Manager {
         returnValue: false,
       ) as bool);
   @override
+  bool get hasFusionSupport => (super.noSuchMethod(
+        Invocation.getter(#hasFusionSupport),
+        returnValue: false,
+      ) as bool);
+  @override
   int get rescanOnOpenVersion => (super.noSuchMethod(
         Invocation.getter(#rescanOnOpenVersion),
         returnValue: 0,
@@ -3030,24 +3110,24 @@ class MockManager extends _i1.Mock implements _i6.Manager {
         returnValue: false,
       ) as bool);
   @override
-  _i24.Future<String> get xpub => (super.noSuchMethod(
+  _i26.Future<String> get xpub => (super.noSuchMethod(
         Invocation.getter(#xpub),
-        returnValue: _i24.Future<String>.value(''),
-      ) as _i24.Future<String>);
+        returnValue: _i26.Future<String>.value(''),
+      ) as _i26.Future<String>);
   @override
   bool get hasListeners => (super.noSuchMethod(
         Invocation.getter(#hasListeners),
         returnValue: false,
       ) as bool);
   @override
-  _i24.Future<void> updateNode(bool? shouldRefresh) => (super.noSuchMethod(
+  _i26.Future<void> updateNode(bool? shouldRefresh) => (super.noSuchMethod(
         Invocation.method(
           #updateNode,
           [shouldRefresh],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
   void dispose() => super.noSuchMethod(
         Invocation.method(
@@ -3057,7 +3137,7 @@ class MockManager extends _i1.Mock implements _i6.Manager {
         returnValueForMissingStub: null,
       );
   @override
-  _i24.Future<Map<String, dynamic>> prepareSend({
+  _i26.Future<Map<String, dynamic>> prepareSend({
     required String? address,
     required _i14.Amount? amount,
     Map<String, dynamic>? args,
@@ -3073,27 +3153,27 @@ class MockManager extends _i1.Mock implements _i6.Manager {
           },
         ),
         returnValue:
-            _i24.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
-      ) as _i24.Future<Map<String, dynamic>>);
+            _i26.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
+      ) as _i26.Future<Map<String, dynamic>>);
   @override
-  _i24.Future<String> confirmSend({required Map<String, dynamic>? txData}) =>
+  _i26.Future<String> confirmSend({required Map<String, dynamic>? txData}) =>
       (super.noSuchMethod(
         Invocation.method(
           #confirmSend,
           [],
           {#txData: txData},
         ),
-        returnValue: _i24.Future<String>.value(''),
-      ) as _i24.Future<String>);
+        returnValue: _i26.Future<String>.value(''),
+      ) as _i26.Future<String>);
   @override
-  _i24.Future<void> refresh() => (super.noSuchMethod(
+  _i26.Future<void> refresh() => (super.noSuchMethod(
         Invocation.method(
           #refresh,
           [],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
   bool validateAddress(String? address) => (super.noSuchMethod(
         Invocation.method(
@@ -3103,35 +3183,35 @@ class MockManager extends _i1.Mock implements _i6.Manager {
         returnValue: false,
       ) as bool);
   @override
-  _i24.Future<bool> testNetworkConnection() => (super.noSuchMethod(
+  _i26.Future<bool> testNetworkConnection() => (super.noSuchMethod(
         Invocation.method(
           #testNetworkConnection,
           [],
         ),
-        returnValue: _i24.Future<bool>.value(false),
-      ) as _i24.Future<bool>);
+        returnValue: _i26.Future<bool>.value(false),
+      ) as _i26.Future<bool>);
   @override
-  _i24.Future<void> initializeNew(
+  _i26.Future<void> initializeNew(
           ({String mnemonicPassphrase, int wordCount})? data) =>
       (super.noSuchMethod(
         Invocation.method(
           #initializeNew,
           [data],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
-  _i24.Future<void> initializeExisting() => (super.noSuchMethod(
+  _i26.Future<void> initializeExisting() => (super.noSuchMethod(
         Invocation.method(
           #initializeExisting,
           [],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
-  _i24.Future<void> recoverFromMnemonic({
+  _i26.Future<void> recoverFromMnemonic({
     required String? mnemonic,
     String? mnemonicPassphrase,
     required int? maxUnusedAddressGap,
@@ -3150,20 +3230,20 @@ class MockManager extends _i1.Mock implements _i6.Manager {
             #height: height,
           },
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
-  _i24.Future<void> exitCurrentWallet() => (super.noSuchMethod(
+  _i26.Future<void> exitCurrentWallet() => (super.noSuchMethod(
         Invocation.method(
           #exitCurrentWallet,
           [],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
-  _i24.Future<void> fullRescan(
+  _i26.Future<void> fullRescan(
     int? maxUnusedAddressGap,
     int? maxNumberOfIndexesToCheck,
   ) =>
@@ -3175,11 +3255,11 @@ class MockManager extends _i1.Mock implements _i6.Manager {
             maxNumberOfIndexesToCheck,
           ],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
-  _i24.Future<_i14.Amount> estimateFeeFor(
+  _i26.Future<_i14.Amount> estimateFeeFor(
     _i14.Amount? amount,
     int? feeRate,
   ) =>
@@ -3191,7 +3271,7 @@ class MockManager extends _i1.Mock implements _i6.Manager {
             feeRate,
           ],
         ),
-        returnValue: _i24.Future<_i14.Amount>.value(_FakeAmount_12(
+        returnValue: _i26.Future<_i14.Amount>.value(_FakeAmount_12(
           this,
           Invocation.method(
             #estimateFeeFor,
@@ -3201,26 +3281,26 @@ class MockManager extends _i1.Mock implements _i6.Manager {
             ],
           ),
         )),
-      ) as _i24.Future<_i14.Amount>);
+      ) as _i26.Future<_i14.Amount>);
   @override
-  _i24.Future<bool> generateNewAddress() => (super.noSuchMethod(
+  _i26.Future<bool> generateNewAddress() => (super.noSuchMethod(
         Invocation.method(
           #generateNewAddress,
           [],
         ),
-        returnValue: _i24.Future<bool>.value(false),
-      ) as _i24.Future<bool>);
+        returnValue: _i26.Future<bool>.value(false),
+      ) as _i26.Future<bool>);
   @override
-  _i24.Future<void> resetRescanOnOpen() => (super.noSuchMethod(
+  _i26.Future<void> resetRescanOnOpen() => (super.noSuchMethod(
         Invocation.method(
           #resetRescanOnOpen,
           [],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
-  void addListener(_i26.VoidCallback? listener) => super.noSuchMethod(
+  void addListener(_i28.VoidCallback? listener) => super.noSuchMethod(
         Invocation.method(
           #addListener,
           [listener],
@@ -3228,7 +3308,7 @@ class MockManager extends _i1.Mock implements _i6.Manager {
         returnValueForMissingStub: null,
       );
   @override
-  void removeListener(_i26.VoidCallback? listener) => super.noSuchMethod(
+  void removeListener(_i28.VoidCallback? listener) => super.noSuchMethod(
         Invocation.method(
           #removeListener,
           [listener],
@@ -3248,7 +3328,7 @@ class MockManager extends _i1.Mock implements _i6.Manager {
 /// A class which mocks [CoinServiceAPI].
 ///
 /// See the documentation for Mockito's code generation for more information.
-class MockCoinServiceAPI extends _i1.Mock implements _i21.CoinServiceAPI {
+class MockCoinServiceAPI extends _i1.Mock implements _i23.CoinServiceAPI {
   @override
   set onIsActiveWalletChanged(void Function(bool)? _onIsActiveWalletChanged) =>
       super.noSuchMethod(
@@ -3259,10 +3339,10 @@ class MockCoinServiceAPI extends _i1.Mock implements _i21.CoinServiceAPI {
         returnValueForMissingStub: null,
       );
   @override
-  _i23.Coin get coin => (super.noSuchMethod(
+  _i25.Coin get coin => (super.noSuchMethod(
         Invocation.getter(#coin),
-        returnValue: _i23.Coin.bitcoin,
-      ) as _i23.Coin);
+        returnValue: _i25.Coin.bitcoin,
+      ) as _i25.Coin);
   @override
   bool get isRefreshing => (super.noSuchMethod(
         Invocation.getter(#isRefreshing),
@@ -3295,23 +3375,23 @@ class MockCoinServiceAPI extends _i1.Mock implements _i21.CoinServiceAPI {
         returnValueForMissingStub: null,
       );
   @override
-  _i24.Future<_i8.FeeObject> get fees => (super.noSuchMethod(
+  _i26.Future<_i8.FeeObject> get fees => (super.noSuchMethod(
         Invocation.getter(#fees),
-        returnValue: _i24.Future<_i8.FeeObject>.value(_FakeFeeObject_5(
+        returnValue: _i26.Future<_i8.FeeObject>.value(_FakeFeeObject_5(
           this,
           Invocation.getter(#fees),
         )),
-      ) as _i24.Future<_i8.FeeObject>);
+      ) as _i26.Future<_i8.FeeObject>);
   @override
-  _i24.Future<int> get maxFee => (super.noSuchMethod(
+  _i26.Future<int> get maxFee => (super.noSuchMethod(
         Invocation.getter(#maxFee),
-        returnValue: _i24.Future<int>.value(0),
-      ) as _i24.Future<int>);
+        returnValue: _i26.Future<int>.value(0),
+      ) as _i26.Future<int>);
   @override
-  _i24.Future<String> get currentReceivingAddress => (super.noSuchMethod(
+  _i26.Future<String> get currentReceivingAddress => (super.noSuchMethod(
         Invocation.getter(#currentReceivingAddress),
-        returnValue: _i24.Future<String>.value(''),
-      ) as _i24.Future<String>);
+        returnValue: _i26.Future<String>.value(''),
+      ) as _i26.Future<String>);
   @override
   _i11.Balance get balance => (super.noSuchMethod(
         Invocation.getter(#balance),
@@ -3321,16 +3401,16 @@ class MockCoinServiceAPI extends _i1.Mock implements _i21.CoinServiceAPI {
         ),
       ) as _i11.Balance);
   @override
-  _i24.Future<List<_i17.Transaction>> get transactions => (super.noSuchMethod(
+  _i26.Future<List<_i18.Transaction>> get transactions => (super.noSuchMethod(
         Invocation.getter(#transactions),
         returnValue:
-            _i24.Future<List<_i17.Transaction>>.value(<_i17.Transaction>[]),
-      ) as _i24.Future<List<_i17.Transaction>>);
+            _i26.Future<List<_i18.Transaction>>.value(<_i18.Transaction>[]),
+      ) as _i26.Future<List<_i18.Transaction>>);
   @override
-  _i24.Future<List<_i17.UTXO>> get utxos => (super.noSuchMethod(
+  _i26.Future<List<_i18.UTXO>> get utxos => (super.noSuchMethod(
         Invocation.getter(#utxos),
-        returnValue: _i24.Future<List<_i17.UTXO>>.value(<_i17.UTXO>[]),
-      ) as _i24.Future<List<_i17.UTXO>>);
+        returnValue: _i26.Future<List<_i18.UTXO>>.value(<_i18.UTXO>[]),
+      ) as _i26.Future<List<_i18.UTXO>>);
   @override
   set walletName(String? newName) => super.noSuchMethod(
         Invocation.setter(
@@ -3350,20 +3430,20 @@ class MockCoinServiceAPI extends _i1.Mock implements _i21.CoinServiceAPI {
         returnValue: '',
       ) as String);
   @override
-  _i24.Future<List<String>> get mnemonic => (super.noSuchMethod(
+  _i26.Future<List<String>> get mnemonic => (super.noSuchMethod(
         Invocation.getter(#mnemonic),
-        returnValue: _i24.Future<List<String>>.value(<String>[]),
-      ) as _i24.Future<List<String>>);
+        returnValue: _i26.Future<List<String>>.value(<String>[]),
+      ) as _i26.Future<List<String>>);
   @override
-  _i24.Future<String?> get mnemonicString => (super.noSuchMethod(
+  _i26.Future<String?> get mnemonicString => (super.noSuchMethod(
         Invocation.getter(#mnemonicString),
-        returnValue: _i24.Future<String?>.value(),
-      ) as _i24.Future<String?>);
+        returnValue: _i26.Future<String?>.value(),
+      ) as _i26.Future<String?>);
   @override
-  _i24.Future<String?> get mnemonicPassphrase => (super.noSuchMethod(
+  _i26.Future<String?> get mnemonicPassphrase => (super.noSuchMethod(
         Invocation.getter(#mnemonicPassphrase),
-        returnValue: _i24.Future<String?>.value(),
-      ) as _i24.Future<String?>);
+        returnValue: _i26.Future<String?>.value(),
+      ) as _i26.Future<String?>);
   @override
   bool get hasCalledExit => (super.noSuchMethod(
         Invocation.getter(#hasCalledExit),
@@ -3380,7 +3460,7 @@ class MockCoinServiceAPI extends _i1.Mock implements _i21.CoinServiceAPI {
         returnValue: 0,
       ) as int);
   @override
-  _i24.Future<Map<String, dynamic>> prepareSend({
+  _i26.Future<Map<String, dynamic>> prepareSend({
     required String? address,
     required _i14.Amount? amount,
     Map<String, dynamic>? args,
@@ -3396,36 +3476,36 @@ class MockCoinServiceAPI extends _i1.Mock implements _i21.CoinServiceAPI {
           },
         ),
         returnValue:
-            _i24.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
-      ) as _i24.Future<Map<String, dynamic>>);
+            _i26.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
+      ) as _i26.Future<Map<String, dynamic>>);
   @override
-  _i24.Future<String> confirmSend({required Map<String, dynamic>? txData}) =>
+  _i26.Future<String> confirmSend({required Map<String, dynamic>? txData}) =>
       (super.noSuchMethod(
         Invocation.method(
           #confirmSend,
           [],
           {#txData: txData},
         ),
-        returnValue: _i24.Future<String>.value(''),
-      ) as _i24.Future<String>);
+        returnValue: _i26.Future<String>.value(''),
+      ) as _i26.Future<String>);
   @override
-  _i24.Future<void> refresh() => (super.noSuchMethod(
+  _i26.Future<void> refresh() => (super.noSuchMethod(
         Invocation.method(
           #refresh,
           [],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
-  _i24.Future<void> updateNode(bool? shouldRefresh) => (super.noSuchMethod(
+  _i26.Future<void> updateNode(bool? shouldRefresh) => (super.noSuchMethod(
         Invocation.method(
           #updateNode,
           [shouldRefresh],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
   bool validateAddress(String? address) => (super.noSuchMethod(
         Invocation.method(
@@ -3435,15 +3515,15 @@ class MockCoinServiceAPI extends _i1.Mock implements _i21.CoinServiceAPI {
         returnValue: false,
       ) as bool);
   @override
-  _i24.Future<bool> testNetworkConnection() => (super.noSuchMethod(
+  _i26.Future<bool> testNetworkConnection() => (super.noSuchMethod(
         Invocation.method(
           #testNetworkConnection,
           [],
         ),
-        returnValue: _i24.Future<bool>.value(false),
-      ) as _i24.Future<bool>);
+        returnValue: _i26.Future<bool>.value(false),
+      ) as _i26.Future<bool>);
   @override
-  _i24.Future<void> recoverFromMnemonic({
+  _i26.Future<void> recoverFromMnemonic({
     required String? mnemonic,
     String? mnemonicPassphrase,
     required int? maxUnusedAddressGap,
@@ -3462,40 +3542,40 @@ class MockCoinServiceAPI extends _i1.Mock implements _i21.CoinServiceAPI {
             #height: height,
           },
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
-  _i24.Future<void> initializeNew(
+  _i26.Future<void> initializeNew(
           ({String mnemonicPassphrase, int wordCount})? data) =>
       (super.noSuchMethod(
         Invocation.method(
           #initializeNew,
           [data],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
-  _i24.Future<void> initializeExisting() => (super.noSuchMethod(
+  _i26.Future<void> initializeExisting() => (super.noSuchMethod(
         Invocation.method(
           #initializeExisting,
           [],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
-  _i24.Future<void> exit() => (super.noSuchMethod(
+  _i26.Future<void> exit() => (super.noSuchMethod(
         Invocation.method(
           #exit,
           [],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
-  _i24.Future<void> fullRescan(
+  _i26.Future<void> fullRescan(
     int? maxUnusedAddressGap,
     int? maxNumberOfIndexesToCheck,
   ) =>
@@ -3507,11 +3587,11 @@ class MockCoinServiceAPI extends _i1.Mock implements _i21.CoinServiceAPI {
             maxNumberOfIndexesToCheck,
           ],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
   @override
-  _i24.Future<_i14.Amount> estimateFeeFor(
+  _i26.Future<_i14.Amount> estimateFeeFor(
     _i14.Amount? amount,
     int? feeRate,
   ) =>
@@ -3523,7 +3603,7 @@ class MockCoinServiceAPI extends _i1.Mock implements _i21.CoinServiceAPI {
             feeRate,
           ],
         ),
-        returnValue: _i24.Future<_i14.Amount>.value(_FakeAmount_12(
+        returnValue: _i26.Future<_i14.Amount>.value(_FakeAmount_12(
           this,
           Invocation.method(
             #estimateFeeFor,
@@ -3533,23 +3613,23 @@ class MockCoinServiceAPI extends _i1.Mock implements _i21.CoinServiceAPI {
             ],
           ),
         )),
-      ) as _i24.Future<_i14.Amount>);
+      ) as _i26.Future<_i14.Amount>);
   @override
-  _i24.Future<bool> generateNewAddress() => (super.noSuchMethod(
+  _i26.Future<bool> generateNewAddress() => (super.noSuchMethod(
         Invocation.method(
           #generateNewAddress,
           [],
         ),
-        returnValue: _i24.Future<bool>.value(false),
-      ) as _i24.Future<bool>);
+        returnValue: _i26.Future<bool>.value(false),
+      ) as _i26.Future<bool>);
   @override
-  _i24.Future<void> updateSentCachedTxData(Map<String, dynamic>? txData) =>
+  _i26.Future<void> updateSentCachedTxData(Map<String, dynamic>? txData) =>
       (super.noSuchMethod(
         Invocation.method(
           #updateSentCachedTxData,
           [txData],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i26.Future<void>.value(),
+        returnValueForMissingStub: _i26.Future<void>.value(),
+      ) as _i26.Future<void>);
 }
diff --git a/test/widget_tests/node_options_sheet_test.mocks.dart b/test/widget_tests/node_options_sheet_test.mocks.dart
index 42528b822..4b245f310 100644
--- a/test/widget_tests/node_options_sheet_test.mocks.dart
+++ b/test/widget_tests/node_options_sheet_test.mocks.dart
@@ -3,30 +3,32 @@
 // Do not manually edit this file.
 
 // ignore_for_file: no_leading_underscores_for_library_prefixes
-import 'dart:async' as _i12;
-import 'dart:io' as _i8;
-import 'dart:ui' as _i14;
+import 'dart:async' as _i13;
+import 'dart:io' as _i9;
+import 'dart:ui' as _i15;
 
 import 'package:flutter/foundation.dart' as _i4;
 import 'package:flutter_riverpod/flutter_riverpod.dart' as _i5;
 import 'package:mockito/mockito.dart' as _i1;
-import 'package:stackwallet/models/node_model.dart' as _i18;
+import 'package:stackwallet/models/node_model.dart' as _i19;
 import 'package:stackwallet/services/coins/manager.dart' as _i6;
 import 'package:stackwallet/services/event_bus/events/global/tor_connection_status_changed_event.dart'
-    as _i20;
-import 'package:stackwallet/services/node_service.dart' as _i3;
-import 'package:stackwallet/services/tor_service.dart' as _i19;
-import 'package:stackwallet/services/wallets.dart' as _i9;
-import 'package:stackwallet/services/wallets_service.dart' as _i2;
-import 'package:stackwallet/utilities/amount/amount_unit.dart' as _i17;
-import 'package:stackwallet/utilities/enums/backup_frequency_type.dart' as _i16;
-import 'package:stackwallet/utilities/enums/coin_enum.dart' as _i10;
-import 'package:stackwallet/utilities/enums/sync_type_enum.dart' as _i15;
-import 'package:stackwallet/utilities/flutter_secure_storage_interface.dart'
+    as _i21;
+import 'package:stackwallet/services/mixins/fusion_wallet_interface.dart'
     as _i7;
-import 'package:stackwallet/utilities/prefs.dart' as _i13;
-import 'package:tor_ffi_plugin/tor_ffi_plugin.dart' as _i21;
-import 'package:tuple/tuple.dart' as _i11;
+import 'package:stackwallet/services/node_service.dart' as _i3;
+import 'package:stackwallet/services/tor_service.dart' as _i20;
+import 'package:stackwallet/services/wallets.dart' as _i10;
+import 'package:stackwallet/services/wallets_service.dart' as _i2;
+import 'package:stackwallet/utilities/amount/amount_unit.dart' as _i18;
+import 'package:stackwallet/utilities/enums/backup_frequency_type.dart' as _i17;
+import 'package:stackwallet/utilities/enums/coin_enum.dart' as _i11;
+import 'package:stackwallet/utilities/enums/sync_type_enum.dart' as _i16;
+import 'package:stackwallet/utilities/flutter_secure_storage_interface.dart'
+    as _i8;
+import 'package:stackwallet/utilities/prefs.dart' as _i14;
+import 'package:tor_ffi_plugin/tor_ffi_plugin.dart' as _i22;
+import 'package:tuple/tuple.dart' as _i12;
 
 // ignore_for_file: type=lint
 // ignore_for_file: avoid_redundant_argument_values
@@ -81,9 +83,8 @@ class _FakeManager_3 extends _i1.SmartFake implements _i6.Manager {
         );
 }
 
-class _FakeSecureStorageInterface_4 extends _i1.SmartFake
-    implements _i7.SecureStorageInterface {
-  _FakeSecureStorageInterface_4(
+class _FakeFusionInfo_4 extends _i1.SmartFake implements _i7.FusionInfo {
+  _FakeFusionInfo_4(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -92,9 +93,20 @@ class _FakeSecureStorageInterface_4 extends _i1.SmartFake
         );
 }
 
-class _FakeInternetAddress_5 extends _i1.SmartFake
-    implements _i8.InternetAddress {
-  _FakeInternetAddress_5(
+class _FakeSecureStorageInterface_5 extends _i1.SmartFake
+    implements _i8.SecureStorageInterface {
+  _FakeSecureStorageInterface_5(
+    Object parent,
+    Invocation parentInvocation,
+  ) : super(
+          parent,
+          parentInvocation,
+        );
+}
+
+class _FakeInternetAddress_6 extends _i1.SmartFake
+    implements _i9.InternetAddress {
+  _FakeInternetAddress_6(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -106,7 +118,7 @@ class _FakeInternetAddress_5 extends _i1.SmartFake
 /// A class which mocks [Wallets].
 ///
 /// See the documentation for Mockito's code generation for more information.
-class MockWallets extends _i1.Mock implements _i9.Wallets {
+class MockWallets extends _i1.Mock implements _i10.Wallets {
   MockWallets() {
     _i1.throwOnMissingStub(this);
   }
@@ -173,7 +185,7 @@ class MockWallets extends _i1.Mock implements _i9.Wallets {
         returnValueForMissingStub: null,
       );
   @override
-  List<String> getWalletIdsFor({required _i10.Coin? coin}) =>
+  List<String> getWalletIdsFor({required _i11.Coin? coin}) =>
       (super.noSuchMethod(
         Invocation.method(
           #getWalletIdsFor,
@@ -183,20 +195,20 @@ class MockWallets extends _i1.Mock implements _i9.Wallets {
         returnValue: <String>[],
       ) as List<String>);
   @override
-  List<_i11.Tuple2<_i10.Coin, List<_i5.ChangeNotifierProvider<_i6.Manager>>>>
+  List<_i12.Tuple2<_i11.Coin, List<_i5.ChangeNotifierProvider<_i6.Manager>>>>
       getManagerProvidersByCoin() => (super.noSuchMethod(
             Invocation.method(
               #getManagerProvidersByCoin,
               [],
             ),
-            returnValue: <_i11.Tuple2<_i10.Coin,
+            returnValue: <_i12.Tuple2<_i11.Coin,
                 List<_i5.ChangeNotifierProvider<_i6.Manager>>>>[],
           ) as List<
-              _i11.Tuple2<_i10.Coin,
+              _i12.Tuple2<_i11.Coin,
                   List<_i5.ChangeNotifierProvider<_i6.Manager>>>>);
   @override
   List<_i5.ChangeNotifierProvider<_i6.Manager>> getManagerProvidersForCoin(
-          _i10.Coin? coin) =>
+          _i11.Coin? coin) =>
       (super.noSuchMethod(
         Invocation.method(
           #getManagerProvidersForCoin,
@@ -260,17 +272,17 @@ class MockWallets extends _i1.Mock implements _i9.Wallets {
         returnValueForMissingStub: null,
       );
   @override
-  _i12.Future<void> load(_i13.Prefs? prefs) => (super.noSuchMethod(
+  _i13.Future<void> load(_i14.Prefs? prefs) => (super.noSuchMethod(
         Invocation.method(
           #load,
           [prefs],
         ),
-        returnValue: _i12.Future<void>.value(),
-        returnValueForMissingStub: _i12.Future<void>.value(),
-      ) as _i12.Future<void>);
+        returnValue: _i13.Future<void>.value(),
+        returnValueForMissingStub: _i13.Future<void>.value(),
+      ) as _i13.Future<void>);
   @override
-  _i12.Future<void> loadAfterStackRestore(
-    _i13.Prefs? prefs,
+  _i13.Future<void> loadAfterStackRestore(
+    _i14.Prefs? prefs,
     List<_i6.Manager>? managers,
   ) =>
       (super.noSuchMethod(
@@ -281,11 +293,11 @@ class MockWallets extends _i1.Mock implements _i9.Wallets {
             managers,
           ],
         ),
-        returnValue: _i12.Future<void>.value(),
-        returnValueForMissingStub: _i12.Future<void>.value(),
-      ) as _i12.Future<void>);
+        returnValue: _i13.Future<void>.value(),
+        returnValueForMissingStub: _i13.Future<void>.value(),
+      ) as _i13.Future<void>);
   @override
-  void addListener(_i14.VoidCallback? listener) => super.noSuchMethod(
+  void addListener(_i15.VoidCallback? listener) => super.noSuchMethod(
         Invocation.method(
           #addListener,
           [listener],
@@ -293,7 +305,7 @@ class MockWallets extends _i1.Mock implements _i9.Wallets {
         returnValueForMissingStub: null,
       );
   @override
-  void removeListener(_i14.VoidCallback? listener) => super.noSuchMethod(
+  void removeListener(_i15.VoidCallback? listener) => super.noSuchMethod(
         Invocation.method(
           #removeListener,
           [listener],
@@ -313,7 +325,7 @@ class MockWallets extends _i1.Mock implements _i9.Wallets {
 /// A class which mocks [Prefs].
 ///
 /// See the documentation for Mockito's code generation for more information.
-class MockPrefs extends _i1.Mock implements _i13.Prefs {
+class MockPrefs extends _i1.Mock implements _i14.Prefs {
   MockPrefs() {
     _i1.throwOnMissingStub(this);
   }
@@ -369,12 +381,12 @@ class MockPrefs extends _i1.Mock implements _i13.Prefs {
         returnValueForMissingStub: null,
       );
   @override
-  _i15.SyncingType get syncType => (super.noSuchMethod(
+  _i16.SyncingType get syncType => (super.noSuchMethod(
         Invocation.getter(#syncType),
-        returnValue: _i15.SyncingType.currentWalletOnly,
-      ) as _i15.SyncingType);
+        returnValue: _i16.SyncingType.currentWalletOnly,
+      ) as _i16.SyncingType);
   @override
-  set syncType(_i15.SyncingType? syncType) => super.noSuchMethod(
+  set syncType(_i16.SyncingType? syncType) => super.noSuchMethod(
         Invocation.setter(
           #syncType,
           syncType,
@@ -533,12 +545,12 @@ class MockPrefs extends _i1.Mock implements _i13.Prefs {
         returnValueForMissingStub: null,
       );
   @override
-  _i16.BackupFrequencyType get backupFrequencyType => (super.noSuchMethod(
+  _i17.BackupFrequencyType get backupFrequencyType => (super.noSuchMethod(
         Invocation.getter(#backupFrequencyType),
-        returnValue: _i16.BackupFrequencyType.everyTenMinutes,
-      ) as _i16.BackupFrequencyType);
+        returnValue: _i17.BackupFrequencyType.everyTenMinutes,
+      ) as _i17.BackupFrequencyType);
   @override
-  set backupFrequencyType(_i16.BackupFrequencyType? backupFrequencyType) =>
+  set backupFrequencyType(_i17.BackupFrequencyType? backupFrequencyType) =>
       super.noSuchMethod(
         Invocation.setter(
           #backupFrequencyType,
@@ -684,66 +696,82 @@ class MockPrefs extends _i1.Mock implements _i13.Prefs {
         returnValueForMissingStub: null,
       );
   @override
+  _i7.FusionInfo get fusionServerInfo => (super.noSuchMethod(
+        Invocation.getter(#fusionServerInfo),
+        returnValue: _FakeFusionInfo_4(
+          this,
+          Invocation.getter(#fusionServerInfo),
+        ),
+      ) as _i7.FusionInfo);
+  @override
+  set fusionServerInfo(_i7.FusionInfo? fusionServerInfo) => super.noSuchMethod(
+        Invocation.setter(
+          #fusionServerInfo,
+          fusionServerInfo,
+        ),
+        returnValueForMissingStub: null,
+      );
+  @override
   bool get hasListeners => (super.noSuchMethod(
         Invocation.getter(#hasListeners),
         returnValue: false,
       ) as bool);
   @override
-  _i12.Future<void> init() => (super.noSuchMethod(
+  _i13.Future<void> init() => (super.noSuchMethod(
         Invocation.method(
           #init,
           [],
         ),
-        returnValue: _i12.Future<void>.value(),
-        returnValueForMissingStub: _i12.Future<void>.value(),
-      ) as _i12.Future<void>);
+        returnValue: _i13.Future<void>.value(),
+        returnValueForMissingStub: _i13.Future<void>.value(),
+      ) as _i13.Future<void>);
   @override
-  _i12.Future<void> incrementCurrentNotificationIndex() => (super.noSuchMethod(
+  _i13.Future<void> incrementCurrentNotificationIndex() => (super.noSuchMethod(
         Invocation.method(
           #incrementCurrentNotificationIndex,
           [],
         ),
-        returnValue: _i12.Future<void>.value(),
-        returnValueForMissingStub: _i12.Future<void>.value(),
-      ) as _i12.Future<void>);
+        returnValue: _i13.Future<void>.value(),
+        returnValueForMissingStub: _i13.Future<void>.value(),
+      ) as _i13.Future<void>);
   @override
-  _i12.Future<bool> isExternalCallsSet() => (super.noSuchMethod(
+  _i13.Future<bool> isExternalCallsSet() => (super.noSuchMethod(
         Invocation.method(
           #isExternalCallsSet,
           [],
         ),
-        returnValue: _i12.Future<bool>.value(false),
-      ) as _i12.Future<bool>);
+        returnValue: _i13.Future<bool>.value(false),
+      ) as _i13.Future<bool>);
   @override
-  _i12.Future<void> saveUserID(String? userId) => (super.noSuchMethod(
+  _i13.Future<void> saveUserID(String? userId) => (super.noSuchMethod(
         Invocation.method(
           #saveUserID,
           [userId],
         ),
-        returnValue: _i12.Future<void>.value(),
-        returnValueForMissingStub: _i12.Future<void>.value(),
-      ) as _i12.Future<void>);
+        returnValue: _i13.Future<void>.value(),
+        returnValueForMissingStub: _i13.Future<void>.value(),
+      ) as _i13.Future<void>);
   @override
-  _i12.Future<void> saveSignupEpoch(int? signupEpoch) => (super.noSuchMethod(
+  _i13.Future<void> saveSignupEpoch(int? signupEpoch) => (super.noSuchMethod(
         Invocation.method(
           #saveSignupEpoch,
           [signupEpoch],
         ),
-        returnValue: _i12.Future<void>.value(),
-        returnValueForMissingStub: _i12.Future<void>.value(),
-      ) as _i12.Future<void>);
+        returnValue: _i13.Future<void>.value(),
+        returnValueForMissingStub: _i13.Future<void>.value(),
+      ) as _i13.Future<void>);
   @override
-  _i17.AmountUnit amountUnit(_i10.Coin? coin) => (super.noSuchMethod(
+  _i18.AmountUnit amountUnit(_i11.Coin? coin) => (super.noSuchMethod(
         Invocation.method(
           #amountUnit,
           [coin],
         ),
-        returnValue: _i17.AmountUnit.normal,
-      ) as _i17.AmountUnit);
+        returnValue: _i18.AmountUnit.normal,
+      ) as _i18.AmountUnit);
   @override
   void updateAmountUnit({
-    required _i10.Coin? coin,
-    required _i17.AmountUnit? amountUnit,
+    required _i11.Coin? coin,
+    required _i18.AmountUnit? amountUnit,
   }) =>
       super.noSuchMethod(
         Invocation.method(
@@ -757,7 +785,7 @@ class MockPrefs extends _i1.Mock implements _i13.Prefs {
         returnValueForMissingStub: null,
       );
   @override
-  int maxDecimals(_i10.Coin? coin) => (super.noSuchMethod(
+  int maxDecimals(_i11.Coin? coin) => (super.noSuchMethod(
         Invocation.method(
           #maxDecimals,
           [coin],
@@ -766,7 +794,7 @@ class MockPrefs extends _i1.Mock implements _i13.Prefs {
       ) as int);
   @override
   void updateMaxDecimals({
-    required _i10.Coin? coin,
+    required _i11.Coin? coin,
     required int? maxDecimals,
   }) =>
       super.noSuchMethod(
@@ -781,7 +809,7 @@ class MockPrefs extends _i1.Mock implements _i13.Prefs {
         returnValueForMissingStub: null,
       );
   @override
-  void addListener(_i14.VoidCallback? listener) => super.noSuchMethod(
+  void addListener(_i15.VoidCallback? listener) => super.noSuchMethod(
         Invocation.method(
           #addListener,
           [listener],
@@ -789,7 +817,7 @@ class MockPrefs extends _i1.Mock implements _i13.Prefs {
         returnValueForMissingStub: null,
       );
   @override
-  void removeListener(_i14.VoidCallback? listener) => super.noSuchMethod(
+  void removeListener(_i15.VoidCallback? listener) => super.noSuchMethod(
         Invocation.method(
           #removeListener,
           [listener],
@@ -823,41 +851,41 @@ class MockNodeService extends _i1.Mock implements _i3.NodeService {
   }
 
   @override
-  _i7.SecureStorageInterface get secureStorageInterface => (super.noSuchMethod(
+  _i8.SecureStorageInterface get secureStorageInterface => (super.noSuchMethod(
         Invocation.getter(#secureStorageInterface),
-        returnValue: _FakeSecureStorageInterface_4(
+        returnValue: _FakeSecureStorageInterface_5(
           this,
           Invocation.getter(#secureStorageInterface),
         ),
-      ) as _i7.SecureStorageInterface);
+      ) as _i8.SecureStorageInterface);
   @override
-  List<_i18.NodeModel> get primaryNodes => (super.noSuchMethod(
+  List<_i19.NodeModel> get primaryNodes => (super.noSuchMethod(
         Invocation.getter(#primaryNodes),
-        returnValue: <_i18.NodeModel>[],
-      ) as List<_i18.NodeModel>);
+        returnValue: <_i19.NodeModel>[],
+      ) as List<_i19.NodeModel>);
   @override
-  List<_i18.NodeModel> get nodes => (super.noSuchMethod(
+  List<_i19.NodeModel> get nodes => (super.noSuchMethod(
         Invocation.getter(#nodes),
-        returnValue: <_i18.NodeModel>[],
-      ) as List<_i18.NodeModel>);
+        returnValue: <_i19.NodeModel>[],
+      ) as List<_i19.NodeModel>);
   @override
   bool get hasListeners => (super.noSuchMethod(
         Invocation.getter(#hasListeners),
         returnValue: false,
       ) as bool);
   @override
-  _i12.Future<void> updateDefaults() => (super.noSuchMethod(
+  _i13.Future<void> updateDefaults() => (super.noSuchMethod(
         Invocation.method(
           #updateDefaults,
           [],
         ),
-        returnValue: _i12.Future<void>.value(),
-        returnValueForMissingStub: _i12.Future<void>.value(),
-      ) as _i12.Future<void>);
+        returnValue: _i13.Future<void>.value(),
+        returnValueForMissingStub: _i13.Future<void>.value(),
+      ) as _i13.Future<void>);
   @override
-  _i12.Future<void> setPrimaryNodeFor({
-    required _i10.Coin? coin,
-    required _i18.NodeModel? node,
+  _i13.Future<void> setPrimaryNodeFor({
+    required _i11.Coin? coin,
+    required _i19.NodeModel? node,
     bool? shouldNotifyListeners = false,
   }) =>
       (super.noSuchMethod(
@@ -870,44 +898,44 @@ class MockNodeService extends _i1.Mock implements _i3.NodeService {
             #shouldNotifyListeners: shouldNotifyListeners,
           },
         ),
-        returnValue: _i12.Future<void>.value(),
-        returnValueForMissingStub: _i12.Future<void>.value(),
-      ) as _i12.Future<void>);
+        returnValue: _i13.Future<void>.value(),
+        returnValueForMissingStub: _i13.Future<void>.value(),
+      ) as _i13.Future<void>);
   @override
-  _i18.NodeModel? getPrimaryNodeFor({required _i10.Coin? coin}) =>
+  _i19.NodeModel? getPrimaryNodeFor({required _i11.Coin? coin}) =>
       (super.noSuchMethod(Invocation.method(
         #getPrimaryNodeFor,
         [],
         {#coin: coin},
-      )) as _i18.NodeModel?);
+      )) as _i19.NodeModel?);
   @override
-  List<_i18.NodeModel> getNodesFor(_i10.Coin? coin) => (super.noSuchMethod(
+  List<_i19.NodeModel> getNodesFor(_i11.Coin? coin) => (super.noSuchMethod(
         Invocation.method(
           #getNodesFor,
           [coin],
         ),
-        returnValue: <_i18.NodeModel>[],
-      ) as List<_i18.NodeModel>);
+        returnValue: <_i19.NodeModel>[],
+      ) as List<_i19.NodeModel>);
   @override
-  _i18.NodeModel? getNodeById({required String? id}) =>
+  _i19.NodeModel? getNodeById({required String? id}) =>
       (super.noSuchMethod(Invocation.method(
         #getNodeById,
         [],
         {#id: id},
-      )) as _i18.NodeModel?);
+      )) as _i19.NodeModel?);
   @override
-  List<_i18.NodeModel> failoverNodesFor({required _i10.Coin? coin}) =>
+  List<_i19.NodeModel> failoverNodesFor({required _i11.Coin? coin}) =>
       (super.noSuchMethod(
         Invocation.method(
           #failoverNodesFor,
           [],
           {#coin: coin},
         ),
-        returnValue: <_i18.NodeModel>[],
-      ) as List<_i18.NodeModel>);
+        returnValue: <_i19.NodeModel>[],
+      ) as List<_i19.NodeModel>);
   @override
-  _i12.Future<void> add(
-    _i18.NodeModel? node,
+  _i13.Future<void> add(
+    _i19.NodeModel? node,
     String? password,
     bool? shouldNotifyListeners,
   ) =>
@@ -920,11 +948,11 @@ class MockNodeService extends _i1.Mock implements _i3.NodeService {
             shouldNotifyListeners,
           ],
         ),
-        returnValue: _i12.Future<void>.value(),
-        returnValueForMissingStub: _i12.Future<void>.value(),
-      ) as _i12.Future<void>);
+        returnValue: _i13.Future<void>.value(),
+        returnValueForMissingStub: _i13.Future<void>.value(),
+      ) as _i13.Future<void>);
   @override
-  _i12.Future<void> delete(
+  _i13.Future<void> delete(
     String? id,
     bool? shouldNotifyListeners,
   ) =>
@@ -936,11 +964,11 @@ class MockNodeService extends _i1.Mock implements _i3.NodeService {
             shouldNotifyListeners,
           ],
         ),
-        returnValue: _i12.Future<void>.value(),
-        returnValueForMissingStub: _i12.Future<void>.value(),
-      ) as _i12.Future<void>);
+        returnValue: _i13.Future<void>.value(),
+        returnValueForMissingStub: _i13.Future<void>.value(),
+      ) as _i13.Future<void>);
   @override
-  _i12.Future<void> setEnabledState(
+  _i13.Future<void> setEnabledState(
     String? id,
     bool? enabled,
     bool? shouldNotifyListeners,
@@ -954,12 +982,12 @@ class MockNodeService extends _i1.Mock implements _i3.NodeService {
             shouldNotifyListeners,
           ],
         ),
-        returnValue: _i12.Future<void>.value(),
-        returnValueForMissingStub: _i12.Future<void>.value(),
-      ) as _i12.Future<void>);
+        returnValue: _i13.Future<void>.value(),
+        returnValueForMissingStub: _i13.Future<void>.value(),
+      ) as _i13.Future<void>);
   @override
-  _i12.Future<void> edit(
-    _i18.NodeModel? editedNode,
+  _i13.Future<void> edit(
+    _i19.NodeModel? editedNode,
     String? password,
     bool? shouldNotifyListeners,
   ) =>
@@ -972,20 +1000,20 @@ class MockNodeService extends _i1.Mock implements _i3.NodeService {
             shouldNotifyListeners,
           ],
         ),
-        returnValue: _i12.Future<void>.value(),
-        returnValueForMissingStub: _i12.Future<void>.value(),
-      ) as _i12.Future<void>);
+        returnValue: _i13.Future<void>.value(),
+        returnValueForMissingStub: _i13.Future<void>.value(),
+      ) as _i13.Future<void>);
   @override
-  _i12.Future<void> updateCommunityNodes() => (super.noSuchMethod(
+  _i13.Future<void> updateCommunityNodes() => (super.noSuchMethod(
         Invocation.method(
           #updateCommunityNodes,
           [],
         ),
-        returnValue: _i12.Future<void>.value(),
-        returnValueForMissingStub: _i12.Future<void>.value(),
-      ) as _i12.Future<void>);
+        returnValue: _i13.Future<void>.value(),
+        returnValueForMissingStub: _i13.Future<void>.value(),
+      ) as _i13.Future<void>);
   @override
-  void addListener(_i14.VoidCallback? listener) => super.noSuchMethod(
+  void addListener(_i15.VoidCallback? listener) => super.noSuchMethod(
         Invocation.method(
           #addListener,
           [listener],
@@ -993,7 +1021,7 @@ class MockNodeService extends _i1.Mock implements _i3.NodeService {
         returnValueForMissingStub: null,
       );
   @override
-  void removeListener(_i14.VoidCallback? listener) => super.noSuchMethod(
+  void removeListener(_i15.VoidCallback? listener) => super.noSuchMethod(
         Invocation.method(
           #removeListener,
           [listener],
@@ -1021,24 +1049,24 @@ class MockNodeService extends _i1.Mock implements _i3.NodeService {
 /// A class which mocks [TorService].
 ///
 /// See the documentation for Mockito's code generation for more information.
-class MockTorService extends _i1.Mock implements _i19.TorService {
+class MockTorService extends _i1.Mock implements _i20.TorService {
   MockTorService() {
     _i1.throwOnMissingStub(this);
   }
 
   @override
-  _i20.TorConnectionStatus get status => (super.noSuchMethod(
+  _i21.TorConnectionStatus get status => (super.noSuchMethod(
         Invocation.getter(#status),
-        returnValue: _i20.TorConnectionStatus.disconnected,
-      ) as _i20.TorConnectionStatus);
+        returnValue: _i21.TorConnectionStatus.disconnected,
+      ) as _i21.TorConnectionStatus);
   @override
-  ({_i8.InternetAddress host, int port}) getProxyInfo() => (super.noSuchMethod(
+  ({_i9.InternetAddress host, int port}) getProxyInfo() => (super.noSuchMethod(
         Invocation.method(
           #getProxyInfo,
           [],
         ),
         returnValue: (
-          host: _FakeInternetAddress_5(
+          host: _FakeInternetAddress_6(
             this,
             Invocation.method(
               #getProxyInfo,
@@ -1047,11 +1075,11 @@ class MockTorService extends _i1.Mock implements _i19.TorService {
           ),
           port: 0
         ),
-      ) as ({_i8.InternetAddress host, int port}));
+      ) as ({_i9.InternetAddress host, int port}));
   @override
   void init({
     required String? torDataDirPath,
-    _i21.Tor? mockableOverride,
+    _i22.Tor? mockableOverride,
   }) =>
       super.noSuchMethod(
         Invocation.method(
@@ -1065,21 +1093,21 @@ class MockTorService extends _i1.Mock implements _i19.TorService {
         returnValueForMissingStub: null,
       );
   @override
-  _i12.Future<void> start() => (super.noSuchMethod(
+  _i13.Future<void> start() => (super.noSuchMethod(
         Invocation.method(
           #start,
           [],
         ),
-        returnValue: _i12.Future<void>.value(),
-        returnValueForMissingStub: _i12.Future<void>.value(),
-      ) as _i12.Future<void>);
+        returnValue: _i13.Future<void>.value(),
+        returnValueForMissingStub: _i13.Future<void>.value(),
+      ) as _i13.Future<void>);
   @override
-  _i12.Future<void> disable() => (super.noSuchMethod(
+  _i13.Future<void> disable() => (super.noSuchMethod(
         Invocation.method(
           #disable,
           [],
         ),
-        returnValue: _i12.Future<void>.value(),
-        returnValueForMissingStub: _i12.Future<void>.value(),
-      ) as _i12.Future<void>);
+        returnValue: _i13.Future<void>.value(),
+        returnValueForMissingStub: _i13.Future<void>.value(),
+      ) as _i13.Future<void>);
 }
diff --git a/test/widget_tests/table_view/table_view_row_test.mocks.dart b/test/widget_tests/table_view/table_view_row_test.mocks.dart
index afb3f48c9..6ca13d318 100644
--- a/test/widget_tests/table_view/table_view_row_test.mocks.dart
+++ b/test/widget_tests/table_view/table_view_row_test.mocks.dart
@@ -3,12 +3,12 @@
 // Do not manually edit this file.
 
 // ignore_for_file: no_leading_underscores_for_library_prefixes
-import 'dart:async' as _i23;
-import 'dart:typed_data' as _i28;
-import 'dart:ui' as _i25;
+import 'dart:async' as _i24;
+import 'dart:typed_data' as _i29;
+import 'dart:ui' as _i26;
 
-import 'package:bip32/bip32.dart' as _i17;
-import 'package:bip47/bip47.dart' as _i19;
+import 'package:bip32/bip32.dart' as _i18;
+import 'package:bip47/bip47.dart' as _i20;
 import 'package:bitcoindart/bitcoindart.dart' as _i14;
 import 'package:flutter/foundation.dart' as _i4;
 import 'package:flutter_riverpod/flutter_riverpod.dart' as _i5;
@@ -17,27 +17,29 @@ import 'package:stackwallet/db/isar/main_db.dart' as _i8;
 import 'package:stackwallet/electrumx_rpc/cached_electrumx.dart' as _i12;
 import 'package:stackwallet/electrumx_rpc/electrumx.dart' as _i11;
 import 'package:stackwallet/models/balance.dart' as _i13;
-import 'package:stackwallet/models/isar/models/isar_models.dart' as _i18;
-import 'package:stackwallet/models/isar/stack_theme.dart' as _i27;
+import 'package:stackwallet/models/isar/models/blockchain_data/v2/transaction_v2.dart'
+    as _i16;
+import 'package:stackwallet/models/isar/models/isar_models.dart' as _i19;
+import 'package:stackwallet/models/isar/stack_theme.dart' as _i28;
 import 'package:stackwallet/models/paymint/fee_object_model.dart' as _i10;
-import 'package:stackwallet/models/signing_data.dart' as _i31;
+import 'package:stackwallet/models/signing_data.dart' as _i32;
 import 'package:stackwallet/networking/http.dart' as _i7;
-import 'package:stackwallet/services/coins/bitcoin/bitcoin_wallet.dart' as _i29;
-import 'package:stackwallet/services/coins/coin_service.dart' as _i20;
+import 'package:stackwallet/services/coins/bitcoin/bitcoin_wallet.dart' as _i30;
+import 'package:stackwallet/services/coins/coin_service.dart' as _i21;
 import 'package:stackwallet/services/coins/manager.dart' as _i6;
 import 'package:stackwallet/services/node_service.dart' as _i3;
 import 'package:stackwallet/services/transaction_notification_tracker.dart'
     as _i9;
-import 'package:stackwallet/services/wallets.dart' as _i21;
+import 'package:stackwallet/services/wallets.dart' as _i22;
 import 'package:stackwallet/services/wallets_service.dart' as _i2;
-import 'package:stackwallet/themes/theme_service.dart' as _i26;
+import 'package:stackwallet/themes/theme_service.dart' as _i27;
 import 'package:stackwallet/utilities/amount/amount.dart' as _i15;
-import 'package:stackwallet/utilities/enums/coin_enum.dart' as _i22;
-import 'package:stackwallet/utilities/enums/derive_path_type_enum.dart' as _i30;
+import 'package:stackwallet/utilities/enums/coin_enum.dart' as _i23;
+import 'package:stackwallet/utilities/enums/derive_path_type_enum.dart' as _i31;
 import 'package:stackwallet/utilities/flutter_secure_storage_interface.dart'
-    as _i32;
-import 'package:stackwallet/utilities/prefs.dart' as _i24;
-import 'package:tuple/tuple.dart' as _i16;
+    as _i33;
+import 'package:stackwallet/utilities/prefs.dart' as _i25;
+import 'package:tuple/tuple.dart' as _i17;
 
 // ignore_for_file: type=lint
 // ignore_for_file: avoid_redundant_argument_values
@@ -195,9 +197,9 @@ class _FakeAmount_13 extends _i1.SmartFake implements _i15.Amount {
         );
 }
 
-class _FakeTuple2_14<T1, T2> extends _i1.SmartFake
-    implements _i16.Tuple2<T1, T2> {
-  _FakeTuple2_14(
+class _FakeTransactionV2_14 extends _i1.SmartFake
+    implements _i16.TransactionV2 {
+  _FakeTransactionV2_14(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -206,8 +208,9 @@ class _FakeTuple2_14<T1, T2> extends _i1.SmartFake
         );
 }
 
-class _FakeBIP32_15 extends _i1.SmartFake implements _i17.BIP32 {
-  _FakeBIP32_15(
+class _FakeTuple2_15<T1, T2> extends _i1.SmartFake
+    implements _i17.Tuple2<T1, T2> {
+  _FakeTuple2_15(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -216,8 +219,8 @@ class _FakeBIP32_15 extends _i1.SmartFake implements _i17.BIP32 {
         );
 }
 
-class _FakeAddress_16 extends _i1.SmartFake implements _i18.Address {
-  _FakeAddress_16(
+class _FakeBIP32_16 extends _i1.SmartFake implements _i18.BIP32 {
+  _FakeBIP32_16(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -226,8 +229,8 @@ class _FakeAddress_16 extends _i1.SmartFake implements _i18.Address {
         );
 }
 
-class _FakePaymentCode_17 extends _i1.SmartFake implements _i19.PaymentCode {
-  _FakePaymentCode_17(
+class _FakeAddress_17 extends _i1.SmartFake implements _i19.Address {
+  _FakeAddress_17(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -236,9 +239,19 @@ class _FakePaymentCode_17 extends _i1.SmartFake implements _i19.PaymentCode {
         );
 }
 
-class _FakeCoinServiceAPI_18 extends _i1.SmartFake
-    implements _i20.CoinServiceAPI {
-  _FakeCoinServiceAPI_18(
+class _FakePaymentCode_18 extends _i1.SmartFake implements _i20.PaymentCode {
+  _FakePaymentCode_18(
+    Object parent,
+    Invocation parentInvocation,
+  ) : super(
+          parent,
+          parentInvocation,
+        );
+}
+
+class _FakeCoinServiceAPI_19 extends _i1.SmartFake
+    implements _i21.CoinServiceAPI {
+  _FakeCoinServiceAPI_19(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -250,7 +263,7 @@ class _FakeCoinServiceAPI_18 extends _i1.SmartFake
 /// A class which mocks [Wallets].
 ///
 /// See the documentation for Mockito's code generation for more information.
-class MockWallets extends _i1.Mock implements _i21.Wallets {
+class MockWallets extends _i1.Mock implements _i22.Wallets {
   MockWallets() {
     _i1.throwOnMissingStub(this);
   }
@@ -317,7 +330,7 @@ class MockWallets extends _i1.Mock implements _i21.Wallets {
         returnValueForMissingStub: null,
       );
   @override
-  List<String> getWalletIdsFor({required _i22.Coin? coin}) =>
+  List<String> getWalletIdsFor({required _i23.Coin? coin}) =>
       (super.noSuchMethod(
         Invocation.method(
           #getWalletIdsFor,
@@ -327,20 +340,20 @@ class MockWallets extends _i1.Mock implements _i21.Wallets {
         returnValue: <String>[],
       ) as List<String>);
   @override
-  List<_i16.Tuple2<_i22.Coin, List<_i5.ChangeNotifierProvider<_i6.Manager>>>>
+  List<_i17.Tuple2<_i23.Coin, List<_i5.ChangeNotifierProvider<_i6.Manager>>>>
       getManagerProvidersByCoin() => (super.noSuchMethod(
             Invocation.method(
               #getManagerProvidersByCoin,
               [],
             ),
-            returnValue: <_i16.Tuple2<_i22.Coin,
+            returnValue: <_i17.Tuple2<_i23.Coin,
                 List<_i5.ChangeNotifierProvider<_i6.Manager>>>>[],
           ) as List<
-              _i16.Tuple2<_i22.Coin,
+              _i17.Tuple2<_i23.Coin,
                   List<_i5.ChangeNotifierProvider<_i6.Manager>>>>);
   @override
   List<_i5.ChangeNotifierProvider<_i6.Manager>> getManagerProvidersForCoin(
-          _i22.Coin? coin) =>
+          _i23.Coin? coin) =>
       (super.noSuchMethod(
         Invocation.method(
           #getManagerProvidersForCoin,
@@ -404,17 +417,17 @@ class MockWallets extends _i1.Mock implements _i21.Wallets {
         returnValueForMissingStub: null,
       );
   @override
-  _i23.Future<void> load(_i24.Prefs? prefs) => (super.noSuchMethod(
+  _i24.Future<void> load(_i25.Prefs? prefs) => (super.noSuchMethod(
         Invocation.method(
           #load,
           [prefs],
         ),
-        returnValue: _i23.Future<void>.value(),
-        returnValueForMissingStub: _i23.Future<void>.value(),
-      ) as _i23.Future<void>);
+        returnValue: _i24.Future<void>.value(),
+        returnValueForMissingStub: _i24.Future<void>.value(),
+      ) as _i24.Future<void>);
   @override
-  _i23.Future<void> loadAfterStackRestore(
-    _i24.Prefs? prefs,
+  _i24.Future<void> loadAfterStackRestore(
+    _i25.Prefs? prefs,
     List<_i6.Manager>? managers,
   ) =>
       (super.noSuchMethod(
@@ -425,11 +438,11 @@ class MockWallets extends _i1.Mock implements _i21.Wallets {
             managers,
           ],
         ),
-        returnValue: _i23.Future<void>.value(),
-        returnValueForMissingStub: _i23.Future<void>.value(),
-      ) as _i23.Future<void>);
+        returnValue: _i24.Future<void>.value(),
+        returnValueForMissingStub: _i24.Future<void>.value(),
+      ) as _i24.Future<void>);
   @override
-  void addListener(_i25.VoidCallback? listener) => super.noSuchMethod(
+  void addListener(_i26.VoidCallback? listener) => super.noSuchMethod(
         Invocation.method(
           #addListener,
           [listener],
@@ -437,7 +450,7 @@ class MockWallets extends _i1.Mock implements _i21.Wallets {
         returnValueForMissingStub: null,
       );
   @override
-  void removeListener(_i25.VoidCallback? listener) => super.noSuchMethod(
+  void removeListener(_i26.VoidCallback? listener) => super.noSuchMethod(
         Invocation.method(
           #removeListener,
           [listener],
@@ -463,19 +476,19 @@ class MockWalletsService extends _i1.Mock implements _i2.WalletsService {
   }
 
   @override
-  _i23.Future<Map<String, _i2.WalletInfo>> get walletNames =>
+  _i24.Future<Map<String, _i2.WalletInfo>> get walletNames =>
       (super.noSuchMethod(
         Invocation.getter(#walletNames),
-        returnValue: _i23.Future<Map<String, _i2.WalletInfo>>.value(
+        returnValue: _i24.Future<Map<String, _i2.WalletInfo>>.value(
             <String, _i2.WalletInfo>{}),
-      ) as _i23.Future<Map<String, _i2.WalletInfo>>);
+      ) as _i24.Future<Map<String, _i2.WalletInfo>>);
   @override
   bool get hasListeners => (super.noSuchMethod(
         Invocation.getter(#hasListeners),
         returnValue: false,
       ) as bool);
   @override
-  _i23.Future<bool> renameWallet({
+  _i24.Future<bool> renameWallet({
     required String? from,
     required String? to,
     required bool? shouldNotifyListeners,
@@ -490,8 +503,8 @@ class MockWalletsService extends _i1.Mock implements _i2.WalletsService {
             #shouldNotifyListeners: shouldNotifyListeners,
           },
         ),
-        returnValue: _i23.Future<bool>.value(false),
-      ) as _i23.Future<bool>);
+        returnValue: _i24.Future<bool>.value(false),
+      ) as _i24.Future<bool>);
   @override
   Map<String, _i2.WalletInfo> fetchWalletsData() => (super.noSuchMethod(
         Invocation.method(
@@ -501,10 +514,10 @@ class MockWalletsService extends _i1.Mock implements _i2.WalletsService {
         returnValue: <String, _i2.WalletInfo>{},
       ) as Map<String, _i2.WalletInfo>);
   @override
-  _i23.Future<void> addExistingStackWallet({
+  _i24.Future<void> addExistingStackWallet({
     required String? name,
     required String? walletId,
-    required _i22.Coin? coin,
+    required _i23.Coin? coin,
     required bool? shouldNotifyListeners,
   }) =>
       (super.noSuchMethod(
@@ -518,13 +531,13 @@ class MockWalletsService extends _i1.Mock implements _i2.WalletsService {
             #shouldNotifyListeners: shouldNotifyListeners,
           },
         ),
-        returnValue: _i23.Future<void>.value(),
-        returnValueForMissingStub: _i23.Future<void>.value(),
-      ) as _i23.Future<void>);
+        returnValue: _i24.Future<void>.value(),
+        returnValueForMissingStub: _i24.Future<void>.value(),
+      ) as _i24.Future<void>);
   @override
-  _i23.Future<String?> addNewWallet({
+  _i24.Future<String?> addNewWallet({
     required String? name,
-    required _i22.Coin? coin,
+    required _i23.Coin? coin,
     required bool? shouldNotifyListeners,
   }) =>
       (super.noSuchMethod(
@@ -537,46 +550,46 @@ class MockWalletsService extends _i1.Mock implements _i2.WalletsService {
             #shouldNotifyListeners: shouldNotifyListeners,
           },
         ),
-        returnValue: _i23.Future<String?>.value(),
-      ) as _i23.Future<String?>);
+        returnValue: _i24.Future<String?>.value(),
+      ) as _i24.Future<String?>);
   @override
-  _i23.Future<List<String>> getFavoriteWalletIds() => (super.noSuchMethod(
+  _i24.Future<List<String>> getFavoriteWalletIds() => (super.noSuchMethod(
         Invocation.method(
           #getFavoriteWalletIds,
           [],
         ),
-        returnValue: _i23.Future<List<String>>.value(<String>[]),
-      ) as _i23.Future<List<String>>);
+        returnValue: _i24.Future<List<String>>.value(<String>[]),
+      ) as _i24.Future<List<String>>);
   @override
-  _i23.Future<void> saveFavoriteWalletIds(List<String>? walletIds) =>
+  _i24.Future<void> saveFavoriteWalletIds(List<String>? walletIds) =>
       (super.noSuchMethod(
         Invocation.method(
           #saveFavoriteWalletIds,
           [walletIds],
         ),
-        returnValue: _i23.Future<void>.value(),
-        returnValueForMissingStub: _i23.Future<void>.value(),
-      ) as _i23.Future<void>);
+        returnValue: _i24.Future<void>.value(),
+        returnValueForMissingStub: _i24.Future<void>.value(),
+      ) as _i24.Future<void>);
   @override
-  _i23.Future<void> addFavorite(String? walletId) => (super.noSuchMethod(
+  _i24.Future<void> addFavorite(String? walletId) => (super.noSuchMethod(
         Invocation.method(
           #addFavorite,
           [walletId],
         ),
-        returnValue: _i23.Future<void>.value(),
-        returnValueForMissingStub: _i23.Future<void>.value(),
-      ) as _i23.Future<void>);
+        returnValue: _i24.Future<void>.value(),
+        returnValueForMissingStub: _i24.Future<void>.value(),
+      ) as _i24.Future<void>);
   @override
-  _i23.Future<void> removeFavorite(String? walletId) => (super.noSuchMethod(
+  _i24.Future<void> removeFavorite(String? walletId) => (super.noSuchMethod(
         Invocation.method(
           #removeFavorite,
           [walletId],
         ),
-        returnValue: _i23.Future<void>.value(),
-        returnValueForMissingStub: _i23.Future<void>.value(),
-      ) as _i23.Future<void>);
+        returnValue: _i24.Future<void>.value(),
+        returnValueForMissingStub: _i24.Future<void>.value(),
+      ) as _i24.Future<void>);
   @override
-  _i23.Future<void> moveFavorite({
+  _i24.Future<void> moveFavorite({
     required int? fromIndex,
     required int? toIndex,
   }) =>
@@ -589,48 +602,48 @@ class MockWalletsService extends _i1.Mock implements _i2.WalletsService {
             #toIndex: toIndex,
           },
         ),
-        returnValue: _i23.Future<void>.value(),
-        returnValueForMissingStub: _i23.Future<void>.value(),
-      ) as _i23.Future<void>);
+        returnValue: _i24.Future<void>.value(),
+        returnValueForMissingStub: _i24.Future<void>.value(),
+      ) as _i24.Future<void>);
   @override
-  _i23.Future<bool> checkForDuplicate(String? name) => (super.noSuchMethod(
+  _i24.Future<bool> checkForDuplicate(String? name) => (super.noSuchMethod(
         Invocation.method(
           #checkForDuplicate,
           [name],
         ),
-        returnValue: _i23.Future<bool>.value(false),
-      ) as _i23.Future<bool>);
+        returnValue: _i24.Future<bool>.value(false),
+      ) as _i24.Future<bool>);
   @override
-  _i23.Future<String?> getWalletId(String? walletName) => (super.noSuchMethod(
+  _i24.Future<String?> getWalletId(String? walletName) => (super.noSuchMethod(
         Invocation.method(
           #getWalletId,
           [walletName],
         ),
-        returnValue: _i23.Future<String?>.value(),
-      ) as _i23.Future<String?>);
+        returnValue: _i24.Future<String?>.value(),
+      ) as _i24.Future<String?>);
   @override
-  _i23.Future<bool> isMnemonicVerified({required String? walletId}) =>
+  _i24.Future<bool> isMnemonicVerified({required String? walletId}) =>
       (super.noSuchMethod(
         Invocation.method(
           #isMnemonicVerified,
           [],
           {#walletId: walletId},
         ),
-        returnValue: _i23.Future<bool>.value(false),
-      ) as _i23.Future<bool>);
+        returnValue: _i24.Future<bool>.value(false),
+      ) as _i24.Future<bool>);
   @override
-  _i23.Future<void> setMnemonicVerified({required String? walletId}) =>
+  _i24.Future<void> setMnemonicVerified({required String? walletId}) =>
       (super.noSuchMethod(
         Invocation.method(
           #setMnemonicVerified,
           [],
           {#walletId: walletId},
         ),
-        returnValue: _i23.Future<void>.value(),
-        returnValueForMissingStub: _i23.Future<void>.value(),
-      ) as _i23.Future<void>);
+        returnValue: _i24.Future<void>.value(),
+        returnValueForMissingStub: _i24.Future<void>.value(),
+      ) as _i24.Future<void>);
   @override
-  _i23.Future<int> deleteWallet(
+  _i24.Future<int> deleteWallet(
     String? name,
     bool? shouldNotifyListeners,
   ) =>
@@ -642,20 +655,20 @@ class MockWalletsService extends _i1.Mock implements _i2.WalletsService {
             shouldNotifyListeners,
           ],
         ),
-        returnValue: _i23.Future<int>.value(0),
-      ) as _i23.Future<int>);
+        returnValue: _i24.Future<int>.value(0),
+      ) as _i24.Future<int>);
   @override
-  _i23.Future<void> refreshWallets(bool? shouldNotifyListeners) =>
+  _i24.Future<void> refreshWallets(bool? shouldNotifyListeners) =>
       (super.noSuchMethod(
         Invocation.method(
           #refreshWallets,
           [shouldNotifyListeners],
         ),
-        returnValue: _i23.Future<void>.value(),
-        returnValueForMissingStub: _i23.Future<void>.value(),
-      ) as _i23.Future<void>);
+        returnValue: _i24.Future<void>.value(),
+        returnValueForMissingStub: _i24.Future<void>.value(),
+      ) as _i24.Future<void>);
   @override
-  void addListener(_i25.VoidCallback? listener) => super.noSuchMethod(
+  void addListener(_i26.VoidCallback? listener) => super.noSuchMethod(
         Invocation.method(
           #addListener,
           [listener],
@@ -663,7 +676,7 @@ class MockWalletsService extends _i1.Mock implements _i2.WalletsService {
         returnValueForMissingStub: null,
       );
   @override
-  void removeListener(_i25.VoidCallback? listener) => super.noSuchMethod(
+  void removeListener(_i26.VoidCallback? listener) => super.noSuchMethod(
         Invocation.method(
           #removeListener,
           [listener],
@@ -691,7 +704,7 @@ class MockWalletsService extends _i1.Mock implements _i2.WalletsService {
 /// A class which mocks [ThemeService].
 ///
 /// See the documentation for Mockito's code generation for more information.
-class MockThemeService extends _i1.Mock implements _i26.ThemeService {
+class MockThemeService extends _i1.Mock implements _i27.ThemeService {
   MockThemeService() {
     _i1.throwOnMissingStub(this);
   }
@@ -721,10 +734,10 @@ class MockThemeService extends _i1.Mock implements _i26.ThemeService {
         ),
       ) as _i8.MainDB);
   @override
-  List<_i27.StackTheme> get installedThemes => (super.noSuchMethod(
+  List<_i28.StackTheme> get installedThemes => (super.noSuchMethod(
         Invocation.getter(#installedThemes),
-        returnValue: <_i27.StackTheme>[],
-      ) as List<_i27.StackTheme>);
+        returnValue: <_i28.StackTheme>[],
+      ) as List<_i28.StackTheme>);
   @override
   void init(_i8.MainDB? db) => super.noSuchMethod(
         Invocation.method(
@@ -734,85 +747,85 @@ class MockThemeService extends _i1.Mock implements _i26.ThemeService {
         returnValueForMissingStub: null,
       );
   @override
-  _i23.Future<void> install({required _i28.Uint8List? themeArchiveData}) =>
+  _i24.Future<void> install({required _i29.Uint8List? themeArchiveData}) =>
       (super.noSuchMethod(
         Invocation.method(
           #install,
           [],
           {#themeArchiveData: themeArchiveData},
         ),
-        returnValue: _i23.Future<void>.value(),
-        returnValueForMissingStub: _i23.Future<void>.value(),
-      ) as _i23.Future<void>);
+        returnValue: _i24.Future<void>.value(),
+        returnValueForMissingStub: _i24.Future<void>.value(),
+      ) as _i24.Future<void>);
   @override
-  _i23.Future<void> remove({required String? themeId}) => (super.noSuchMethod(
+  _i24.Future<void> remove({required String? themeId}) => (super.noSuchMethod(
         Invocation.method(
           #remove,
           [],
           {#themeId: themeId},
         ),
-        returnValue: _i23.Future<void>.value(),
-        returnValueForMissingStub: _i23.Future<void>.value(),
-      ) as _i23.Future<void>);
+        returnValue: _i24.Future<void>.value(),
+        returnValueForMissingStub: _i24.Future<void>.value(),
+      ) as _i24.Future<void>);
   @override
-  _i23.Future<void> checkDefaultThemesOnStartup() => (super.noSuchMethod(
+  _i24.Future<void> checkDefaultThemesOnStartup() => (super.noSuchMethod(
         Invocation.method(
           #checkDefaultThemesOnStartup,
           [],
         ),
-        returnValue: _i23.Future<void>.value(),
-        returnValueForMissingStub: _i23.Future<void>.value(),
-      ) as _i23.Future<void>);
+        returnValue: _i24.Future<void>.value(),
+        returnValueForMissingStub: _i24.Future<void>.value(),
+      ) as _i24.Future<void>);
   @override
-  _i23.Future<bool> verifyInstalled({required String? themeId}) =>
+  _i24.Future<bool> verifyInstalled({required String? themeId}) =>
       (super.noSuchMethod(
         Invocation.method(
           #verifyInstalled,
           [],
           {#themeId: themeId},
         ),
-        returnValue: _i23.Future<bool>.value(false),
-      ) as _i23.Future<bool>);
+        returnValue: _i24.Future<bool>.value(false),
+      ) as _i24.Future<bool>);
   @override
-  _i23.Future<List<_i26.StackThemeMetaData>> fetchThemes() =>
+  _i24.Future<List<_i27.StackThemeMetaData>> fetchThemes() =>
       (super.noSuchMethod(
         Invocation.method(
           #fetchThemes,
           [],
         ),
-        returnValue: _i23.Future<List<_i26.StackThemeMetaData>>.value(
-            <_i26.StackThemeMetaData>[]),
-      ) as _i23.Future<List<_i26.StackThemeMetaData>>);
+        returnValue: _i24.Future<List<_i27.StackThemeMetaData>>.value(
+            <_i27.StackThemeMetaData>[]),
+      ) as _i24.Future<List<_i27.StackThemeMetaData>>);
   @override
-  _i23.Future<_i28.Uint8List> fetchTheme(
-          {required _i26.StackThemeMetaData? themeMetaData}) =>
+  _i24.Future<_i29.Uint8List> fetchTheme(
+          {required _i27.StackThemeMetaData? themeMetaData}) =>
       (super.noSuchMethod(
         Invocation.method(
           #fetchTheme,
           [],
           {#themeMetaData: themeMetaData},
         ),
-        returnValue: _i23.Future<_i28.Uint8List>.value(_i28.Uint8List(0)),
-      ) as _i23.Future<_i28.Uint8List>);
+        returnValue: _i24.Future<_i29.Uint8List>.value(_i29.Uint8List(0)),
+      ) as _i24.Future<_i29.Uint8List>);
   @override
-  _i27.StackTheme? getTheme({required String? themeId}) =>
+  _i28.StackTheme? getTheme({required String? themeId}) =>
       (super.noSuchMethod(Invocation.method(
         #getTheme,
         [],
         {#themeId: themeId},
-      )) as _i27.StackTheme?);
+      )) as _i28.StackTheme?);
 }
 
 /// A class which mocks [BitcoinWallet].
 ///
 /// See the documentation for Mockito's code generation for more information.
-class MockBitcoinWallet extends _i1.Mock implements _i29.BitcoinWallet {
+class MockBitcoinWallet extends _i1.Mock implements _i30.BitcoinWallet {
   MockBitcoinWallet() {
     _i1.throwOnMissingStub(this);
   }
 
   @override
-  set timer(_i23.Timer? _timer) => super.noSuchMethod(
+  set timer(_i24.Timer? _timer) => super.noSuchMethod(
         Invocation.setter(
           #timer,
           _timer,
@@ -889,74 +902,74 @@ class MockBitcoinWallet extends _i1.Mock implements _i29.BitcoinWallet {
         returnValue: false,
       ) as bool);
   @override
-  _i22.Coin get coin => (super.noSuchMethod(
+  _i23.Coin get coin => (super.noSuchMethod(
         Invocation.getter(#coin),
-        returnValue: _i22.Coin.bitcoin,
-      ) as _i22.Coin);
+        returnValue: _i23.Coin.bitcoin,
+      ) as _i23.Coin);
   @override
-  _i23.Future<List<_i18.UTXO>> get utxos => (super.noSuchMethod(
+  _i24.Future<List<_i19.UTXO>> get utxos => (super.noSuchMethod(
         Invocation.getter(#utxos),
-        returnValue: _i23.Future<List<_i18.UTXO>>.value(<_i18.UTXO>[]),
-      ) as _i23.Future<List<_i18.UTXO>>);
+        returnValue: _i24.Future<List<_i19.UTXO>>.value(<_i19.UTXO>[]),
+      ) as _i24.Future<List<_i19.UTXO>>);
   @override
-  _i23.Future<List<_i18.Transaction>> get transactions => (super.noSuchMethod(
+  _i24.Future<List<_i19.Transaction>> get transactions => (super.noSuchMethod(
         Invocation.getter(#transactions),
         returnValue:
-            _i23.Future<List<_i18.Transaction>>.value(<_i18.Transaction>[]),
-      ) as _i23.Future<List<_i18.Transaction>>);
+            _i24.Future<List<_i19.Transaction>>.value(<_i19.Transaction>[]),
+      ) as _i24.Future<List<_i19.Transaction>>);
   @override
-  _i23.Future<String> get currentReceivingAddress => (super.noSuchMethod(
+  _i24.Future<String> get currentReceivingAddress => (super.noSuchMethod(
         Invocation.getter(#currentReceivingAddress),
-        returnValue: _i23.Future<String>.value(''),
-      ) as _i23.Future<String>);
+        returnValue: _i24.Future<String>.value(''),
+      ) as _i24.Future<String>);
   @override
-  _i23.Future<String> get currentChangeAddress => (super.noSuchMethod(
+  _i24.Future<String> get currentChangeAddress => (super.noSuchMethod(
         Invocation.getter(#currentChangeAddress),
-        returnValue: _i23.Future<String>.value(''),
-      ) as _i23.Future<String>);
+        returnValue: _i24.Future<String>.value(''),
+      ) as _i24.Future<String>);
   @override
-  _i23.Future<String> get currentChangeAddressP2PKH => (super.noSuchMethod(
+  _i24.Future<String> get currentChangeAddressP2PKH => (super.noSuchMethod(
         Invocation.getter(#currentChangeAddressP2PKH),
-        returnValue: _i23.Future<String>.value(''),
-      ) as _i23.Future<String>);
+        returnValue: _i24.Future<String>.value(''),
+      ) as _i24.Future<String>);
   @override
   bool get hasCalledExit => (super.noSuchMethod(
         Invocation.getter(#hasCalledExit),
         returnValue: false,
       ) as bool);
   @override
-  _i23.Future<_i10.FeeObject> get fees => (super.noSuchMethod(
+  _i24.Future<_i10.FeeObject> get fees => (super.noSuchMethod(
         Invocation.getter(#fees),
-        returnValue: _i23.Future<_i10.FeeObject>.value(_FakeFeeObject_7(
+        returnValue: _i24.Future<_i10.FeeObject>.value(_FakeFeeObject_7(
           this,
           Invocation.getter(#fees),
         )),
-      ) as _i23.Future<_i10.FeeObject>);
+      ) as _i24.Future<_i10.FeeObject>);
   @override
-  _i23.Future<int> get maxFee => (super.noSuchMethod(
+  _i24.Future<int> get maxFee => (super.noSuchMethod(
         Invocation.getter(#maxFee),
-        returnValue: _i23.Future<int>.value(0),
-      ) as _i23.Future<int>);
+        returnValue: _i24.Future<int>.value(0),
+      ) as _i24.Future<int>);
   @override
-  _i23.Future<List<String>> get mnemonic => (super.noSuchMethod(
+  _i24.Future<List<String>> get mnemonic => (super.noSuchMethod(
         Invocation.getter(#mnemonic),
-        returnValue: _i23.Future<List<String>>.value(<String>[]),
-      ) as _i23.Future<List<String>>);
+        returnValue: _i24.Future<List<String>>.value(<String>[]),
+      ) as _i24.Future<List<String>>);
   @override
-  _i23.Future<String?> get mnemonicString => (super.noSuchMethod(
+  _i24.Future<String?> get mnemonicString => (super.noSuchMethod(
         Invocation.getter(#mnemonicString),
-        returnValue: _i23.Future<String?>.value(),
-      ) as _i23.Future<String?>);
+        returnValue: _i24.Future<String?>.value(),
+      ) as _i24.Future<String?>);
   @override
-  _i23.Future<String?> get mnemonicPassphrase => (super.noSuchMethod(
+  _i24.Future<String?> get mnemonicPassphrase => (super.noSuchMethod(
         Invocation.getter(#mnemonicPassphrase),
-        returnValue: _i23.Future<String?>.value(),
-      ) as _i23.Future<String?>);
+        returnValue: _i24.Future<String?>.value(),
+      ) as _i24.Future<String?>);
   @override
-  _i23.Future<int> get chainHeight => (super.noSuchMethod(
+  _i24.Future<int> get chainHeight => (super.noSuchMethod(
         Invocation.getter(#chainHeight),
-        returnValue: _i23.Future<int>.value(0),
-      ) as _i23.Future<int>);
+        returnValue: _i24.Future<int>.value(0),
+      ) as _i24.Future<int>);
   @override
   int get storedChainHeight => (super.noSuchMethod(
         Invocation.getter(#storedChainHeight),
@@ -1028,10 +1041,10 @@ class MockBitcoinWallet extends _i1.Mock implements _i29.BitcoinWallet {
         ),
       ) as _i13.Balance);
   @override
-  _i23.Future<String> get xpub => (super.noSuchMethod(
+  _i24.Future<String> get xpub => (super.noSuchMethod(
         Invocation.getter(#xpub),
-        returnValue: _i23.Future<String>.value(''),
-      ) as _i23.Future<String>);
+        returnValue: _i24.Future<String>.value(''),
+      ) as _i24.Future<String>);
   @override
   set onIsActiveWalletChanged(void Function(bool)? _onIsActiveWalletChanged) =>
       super.noSuchMethod(
@@ -1058,26 +1071,26 @@ class MockBitcoinWallet extends _i1.Mock implements _i29.BitcoinWallet {
         ),
       ) as _i14.NetworkType);
   @override
-  _i23.Future<void> exit() => (super.noSuchMethod(
+  _i24.Future<void> exit() => (super.noSuchMethod(
         Invocation.method(
           #exit,
           [],
         ),
-        returnValue: _i23.Future<void>.value(),
-        returnValueForMissingStub: _i23.Future<void>.value(),
-      ) as _i23.Future<void>);
+        returnValue: _i24.Future<void>.value(),
+        returnValueForMissingStub: _i24.Future<void>.value(),
+      ) as _i24.Future<void>);
   @override
-  _i30.DerivePathType addressType({required String? address}) =>
+  _i31.DerivePathType addressType({required String? address}) =>
       (super.noSuchMethod(
         Invocation.method(
           #addressType,
           [],
           {#address: address},
         ),
-        returnValue: _i30.DerivePathType.bip44,
-      ) as _i30.DerivePathType);
+        returnValue: _i31.DerivePathType.bip44,
+      ) as _i31.DerivePathType);
   @override
-  _i23.Future<void> recoverFromMnemonic({
+  _i24.Future<void> recoverFromMnemonic({
     required String? mnemonic,
     String? mnemonicPassphrase,
     required int? maxUnusedAddressGap,
@@ -1096,47 +1109,47 @@ class MockBitcoinWallet extends _i1.Mock implements _i29.BitcoinWallet {
             #height: height,
           },
         ),
-        returnValue: _i23.Future<void>.value(),
-        returnValueForMissingStub: _i23.Future<void>.value(),
-      ) as _i23.Future<void>);
+        returnValue: _i24.Future<void>.value(),
+        returnValueForMissingStub: _i24.Future<void>.value(),
+      ) as _i24.Future<void>);
   @override
-  _i23.Future<void> getTransactionCacheEarly(List<String>? allAddresses) =>
+  _i24.Future<void> getTransactionCacheEarly(List<String>? allAddresses) =>
       (super.noSuchMethod(
         Invocation.method(
           #getTransactionCacheEarly,
           [allAddresses],
         ),
-        returnValue: _i23.Future<void>.value(),
-        returnValueForMissingStub: _i23.Future<void>.value(),
-      ) as _i23.Future<void>);
+        returnValue: _i24.Future<void>.value(),
+        returnValueForMissingStub: _i24.Future<void>.value(),
+      ) as _i24.Future<void>);
   @override
-  _i23.Future<bool> refreshIfThereIsNewData() => (super.noSuchMethod(
+  _i24.Future<bool> refreshIfThereIsNewData() => (super.noSuchMethod(
         Invocation.method(
           #refreshIfThereIsNewData,
           [],
         ),
-        returnValue: _i23.Future<bool>.value(false),
-      ) as _i23.Future<bool>);
+        returnValue: _i24.Future<bool>.value(false),
+      ) as _i24.Future<bool>);
   @override
-  _i23.Future<void> getAllTxsToWatch() => (super.noSuchMethod(
+  _i24.Future<void> getAllTxsToWatch() => (super.noSuchMethod(
         Invocation.method(
           #getAllTxsToWatch,
           [],
         ),
-        returnValue: _i23.Future<void>.value(),
-        returnValueForMissingStub: _i23.Future<void>.value(),
-      ) as _i23.Future<void>);
+        returnValue: _i24.Future<void>.value(),
+        returnValueForMissingStub: _i24.Future<void>.value(),
+      ) as _i24.Future<void>);
   @override
-  _i23.Future<void> refresh() => (super.noSuchMethod(
+  _i24.Future<void> refresh() => (super.noSuchMethod(
         Invocation.method(
           #refresh,
           [],
         ),
-        returnValue: _i23.Future<void>.value(),
-        returnValueForMissingStub: _i23.Future<void>.value(),
-      ) as _i23.Future<void>);
+        returnValue: _i24.Future<void>.value(),
+        returnValueForMissingStub: _i24.Future<void>.value(),
+      ) as _i24.Future<void>);
   @override
-  _i23.Future<Map<String, dynamic>> prepareSend({
+  _i24.Future<Map<String, dynamic>> prepareSend({
     required String? address,
     required _i15.Amount? amount,
     Map<String, dynamic>? args,
@@ -1152,26 +1165,26 @@ class MockBitcoinWallet extends _i1.Mock implements _i29.BitcoinWallet {
           },
         ),
         returnValue:
-            _i23.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
-      ) as _i23.Future<Map<String, dynamic>>);
+            _i24.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
+      ) as _i24.Future<Map<String, dynamic>>);
   @override
-  _i23.Future<String> confirmSend({required Map<String, dynamic>? txData}) =>
+  _i24.Future<String> confirmSend({required Map<String, dynamic>? txData}) =>
       (super.noSuchMethod(
         Invocation.method(
           #confirmSend,
           [],
           {#txData: txData},
         ),
-        returnValue: _i23.Future<String>.value(''),
-      ) as _i23.Future<String>);
+        returnValue: _i24.Future<String>.value(''),
+      ) as _i24.Future<String>);
   @override
-  _i23.Future<bool> testNetworkConnection() => (super.noSuchMethod(
+  _i24.Future<bool> testNetworkConnection() => (super.noSuchMethod(
         Invocation.method(
           #testNetworkConnection,
           [],
         ),
-        returnValue: _i23.Future<bool>.value(false),
-      ) as _i23.Future<bool>);
+        returnValue: _i24.Future<bool>.value(false),
+      ) as _i24.Future<bool>);
   @override
   void startNetworkAlivePinging() => super.noSuchMethod(
         Invocation.method(
@@ -1189,35 +1202,35 @@ class MockBitcoinWallet extends _i1.Mock implements _i29.BitcoinWallet {
         returnValueForMissingStub: null,
       );
   @override
-  _i23.Future<void> initializeNew(
+  _i24.Future<void> initializeNew(
           ({String mnemonicPassphrase, int wordCount})? data) =>
       (super.noSuchMethod(
         Invocation.method(
           #initializeNew,
           [data],
         ),
-        returnValue: _i23.Future<void>.value(),
-        returnValueForMissingStub: _i23.Future<void>.value(),
-      ) as _i23.Future<void>);
+        returnValue: _i24.Future<void>.value(),
+        returnValueForMissingStub: _i24.Future<void>.value(),
+      ) as _i24.Future<void>);
   @override
-  _i23.Future<void> initializeExisting() => (super.noSuchMethod(
+  _i24.Future<void> initializeExisting() => (super.noSuchMethod(
         Invocation.method(
           #initializeExisting,
           [],
         ),
-        returnValue: _i23.Future<void>.value(),
-        returnValueForMissingStub: _i23.Future<void>.value(),
-      ) as _i23.Future<void>);
+        returnValue: _i24.Future<void>.value(),
+        returnValueForMissingStub: _i24.Future<void>.value(),
+      ) as _i24.Future<void>);
   @override
-  _i23.Future<void> updateSentCachedTxData(Map<String, dynamic>? txData) =>
+  _i24.Future<void> updateSentCachedTxData(Map<String, dynamic>? txData) =>
       (super.noSuchMethod(
         Invocation.method(
           #updateSentCachedTxData,
           [txData],
         ),
-        returnValue: _i23.Future<void>.value(),
-        returnValueForMissingStub: _i23.Future<void>.value(),
-      ) as _i23.Future<void>);
+        returnValue: _i24.Future<void>.value(),
+        returnValueForMissingStub: _i24.Future<void>.value(),
+      ) as _i24.Future<void>);
   @override
   bool validateAddress(String? address) => (super.noSuchMethod(
         Invocation.method(
@@ -1227,70 +1240,70 @@ class MockBitcoinWallet extends _i1.Mock implements _i29.BitcoinWallet {
         returnValue: false,
       ) as bool);
   @override
-  _i23.Future<void> updateNode(bool? shouldRefresh) => (super.noSuchMethod(
+  _i24.Future<void> updateNode(bool? shouldRefresh) => (super.noSuchMethod(
         Invocation.method(
           #updateNode,
           [shouldRefresh],
         ),
-        returnValue: _i23.Future<void>.value(),
-        returnValueForMissingStub: _i23.Future<void>.value(),
-      ) as _i23.Future<void>);
+        returnValue: _i24.Future<void>.value(),
+        returnValueForMissingStub: _i24.Future<void>.value(),
+      ) as _i24.Future<void>);
   @override
-  _i23.Future<_i11.ElectrumXNode> getCurrentNode() => (super.noSuchMethod(
+  _i24.Future<_i11.ElectrumXNode> getCurrentNode() => (super.noSuchMethod(
         Invocation.method(
           #getCurrentNode,
           [],
         ),
         returnValue:
-            _i23.Future<_i11.ElectrumXNode>.value(_FakeElectrumXNode_12(
+            _i24.Future<_i11.ElectrumXNode>.value(_FakeElectrumXNode_12(
           this,
           Invocation.method(
             #getCurrentNode,
             [],
           ),
         )),
-      ) as _i23.Future<_i11.ElectrumXNode>);
+      ) as _i24.Future<_i11.ElectrumXNode>);
   @override
-  _i23.Future<List<Map<String, dynamic>>> fastFetch(
+  _i24.Future<List<Map<String, dynamic>>> fastFetch(
           List<String>? allTxHashes) =>
       (super.noSuchMethod(
         Invocation.method(
           #fastFetch,
           [allTxHashes],
         ),
-        returnValue: _i23.Future<List<Map<String, dynamic>>>.value(
+        returnValue: _i24.Future<List<Map<String, dynamic>>>.value(
             <Map<String, dynamic>>[]),
-      ) as _i23.Future<List<Map<String, dynamic>>>);
+      ) as _i24.Future<List<Map<String, dynamic>>>);
   @override
-  _i23.Future<int> getTxCount({required String? address}) =>
+  _i24.Future<int> getTxCount({required String? address}) =>
       (super.noSuchMethod(
         Invocation.method(
           #getTxCount,
           [],
           {#address: address},
         ),
-        returnValue: _i23.Future<int>.value(0),
-      ) as _i23.Future<int>);
+        returnValue: _i24.Future<int>.value(0),
+      ) as _i24.Future<int>);
   @override
-  _i23.Future<void> checkCurrentReceivingAddressesForTransactions() =>
+  _i24.Future<void> checkCurrentReceivingAddressesForTransactions() =>
       (super.noSuchMethod(
         Invocation.method(
           #checkCurrentReceivingAddressesForTransactions,
           [],
         ),
-        returnValue: _i23.Future<void>.value(),
-        returnValueForMissingStub: _i23.Future<void>.value(),
-      ) as _i23.Future<void>);
+        returnValue: _i24.Future<void>.value(),
+        returnValueForMissingStub: _i24.Future<void>.value(),
+      ) as _i24.Future<void>);
   @override
-  _i23.Future<void> checkCurrentChangeAddressesForTransactions() =>
+  _i24.Future<void> checkCurrentChangeAddressesForTransactions() =>
       (super.noSuchMethod(
         Invocation.method(
           #checkCurrentChangeAddressesForTransactions,
           [],
         ),
-        returnValue: _i23.Future<void>.value(),
-        returnValueForMissingStub: _i23.Future<void>.value(),
-      ) as _i23.Future<void>);
+        returnValue: _i24.Future<void>.value(),
+        returnValueForMissingStub: _i24.Future<void>.value(),
+      ) as _i24.Future<void>);
   @override
   int estimateTxFee({
     required int? vSize,
@@ -1316,7 +1329,7 @@ class MockBitcoinWallet extends _i1.Mock implements _i29.BitcoinWallet {
     required bool? isSendAll,
     int? satsPerVByte,
     int? additionalOutputs = 0,
-    List<_i18.UTXO>? utxos,
+    List<_i19.UTXO>? utxos,
   }) =>
       super.noSuchMethod(Invocation.method(
         #coinSelection,
@@ -1333,19 +1346,19 @@ class MockBitcoinWallet extends _i1.Mock implements _i29.BitcoinWallet {
         },
       ));
   @override
-  _i23.Future<List<_i31.SigningData>> fetchBuildTxData(
-          List<_i18.UTXO>? utxosToUse) =>
+  _i24.Future<List<_i32.SigningData>> fetchBuildTxData(
+          List<_i19.UTXO>? utxosToUse) =>
       (super.noSuchMethod(
         Invocation.method(
           #fetchBuildTxData,
           [utxosToUse],
         ),
         returnValue:
-            _i23.Future<List<_i31.SigningData>>.value(<_i31.SigningData>[]),
-      ) as _i23.Future<List<_i31.SigningData>>);
+            _i24.Future<List<_i32.SigningData>>.value(<_i32.SigningData>[]),
+      ) as _i24.Future<List<_i32.SigningData>>);
   @override
-  _i23.Future<Map<String, dynamic>> buildTransaction({
-    required List<_i31.SigningData>? utxoSigningData,
+  _i24.Future<Map<String, dynamic>> buildTransaction({
+    required List<_i32.SigningData>? utxoSigningData,
     required List<String>? recipients,
     required List<int>? satoshiAmounts,
   }) =>
@@ -1360,10 +1373,10 @@ class MockBitcoinWallet extends _i1.Mock implements _i29.BitcoinWallet {
           },
         ),
         returnValue:
-            _i23.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
-      ) as _i23.Future<Map<String, dynamic>>);
+            _i24.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
+      ) as _i24.Future<Map<String, dynamic>>);
   @override
-  _i23.Future<void> fullRescan(
+  _i24.Future<void> fullRescan(
     int? maxUnusedAddressGap,
     int? maxNumberOfIndexesToCheck,
   ) =>
@@ -1375,11 +1388,11 @@ class MockBitcoinWallet extends _i1.Mock implements _i29.BitcoinWallet {
             maxNumberOfIndexesToCheck,
           ],
         ),
-        returnValue: _i23.Future<void>.value(),
-        returnValueForMissingStub: _i23.Future<void>.value(),
-      ) as _i23.Future<void>);
+        returnValue: _i24.Future<void>.value(),
+        returnValueForMissingStub: _i24.Future<void>.value(),
+      ) as _i24.Future<void>);
   @override
-  _i23.Future<_i15.Amount> estimateFeeFor(
+  _i24.Future<_i15.Amount> estimateFeeFor(
     _i15.Amount? amount,
     int? feeRate,
   ) =>
@@ -1391,7 +1404,7 @@ class MockBitcoinWallet extends _i1.Mock implements _i29.BitcoinWallet {
             feeRate,
           ],
         ),
-        returnValue: _i23.Future<_i15.Amount>.value(_FakeAmount_13(
+        returnValue: _i24.Future<_i15.Amount>.value(_FakeAmount_13(
           this,
           Invocation.method(
             #estimateFeeFor,
@@ -1401,7 +1414,7 @@ class MockBitcoinWallet extends _i1.Mock implements _i29.BitcoinWallet {
             ],
           ),
         )),
-      ) as _i23.Future<_i15.Amount>);
+      ) as _i24.Future<_i15.Amount>);
   @override
   _i15.Amount roughFeeEstimate(
     int? inputCount,
@@ -1430,32 +1443,32 @@ class MockBitcoinWallet extends _i1.Mock implements _i29.BitcoinWallet {
         ),
       ) as _i15.Amount);
   @override
-  _i23.Future<_i15.Amount> sweepAllEstimate(int? feeRate) =>
+  _i24.Future<_i15.Amount> sweepAllEstimate(int? feeRate) =>
       (super.noSuchMethod(
         Invocation.method(
           #sweepAllEstimate,
           [feeRate],
         ),
-        returnValue: _i23.Future<_i15.Amount>.value(_FakeAmount_13(
+        returnValue: _i24.Future<_i15.Amount>.value(_FakeAmount_13(
           this,
           Invocation.method(
             #sweepAllEstimate,
             [feeRate],
           ),
         )),
-      ) as _i23.Future<_i15.Amount>);
+      ) as _i24.Future<_i15.Amount>);
   @override
-  _i23.Future<bool> generateNewAddress() => (super.noSuchMethod(
+  _i24.Future<bool> generateNewAddress() => (super.noSuchMethod(
         Invocation.method(
           #generateNewAddress,
           [],
         ),
-        returnValue: _i23.Future<bool>.value(false),
-      ) as _i23.Future<bool>);
+        returnValue: _i24.Future<bool>.value(false),
+      ) as _i24.Future<bool>);
   @override
   void initCache(
     String? walletId,
-    _i22.Coin? coin,
+    _i23.Coin? coin,
   ) =>
       super.noSuchMethod(
         Invocation.method(
@@ -1468,14 +1481,14 @@ class MockBitcoinWallet extends _i1.Mock implements _i29.BitcoinWallet {
         returnValueForMissingStub: null,
       );
   @override
-  _i23.Future<void> updateCachedId(String? id) => (super.noSuchMethod(
+  _i24.Future<void> updateCachedId(String? id) => (super.noSuchMethod(
         Invocation.method(
           #updateCachedId,
           [id],
         ),
-        returnValue: _i23.Future<void>.value(),
-        returnValueForMissingStub: _i23.Future<void>.value(),
-      ) as _i23.Future<void>);
+        returnValue: _i24.Future<void>.value(),
+        returnValueForMissingStub: _i24.Future<void>.value(),
+      ) as _i24.Future<void>);
   @override
   int getCachedChainHeight() => (super.noSuchMethod(
         Invocation.method(
@@ -1485,14 +1498,14 @@ class MockBitcoinWallet extends _i1.Mock implements _i29.BitcoinWallet {
         returnValue: 0,
       ) as int);
   @override
-  _i23.Future<void> updateCachedChainHeight(int? height) => (super.noSuchMethod(
+  _i24.Future<void> updateCachedChainHeight(int? height) => (super.noSuchMethod(
         Invocation.method(
           #updateCachedChainHeight,
           [height],
         ),
-        returnValue: _i23.Future<void>.value(),
-        returnValueForMissingStub: _i23.Future<void>.value(),
-      ) as _i23.Future<void>);
+        returnValue: _i24.Future<void>.value(),
+        returnValueForMissingStub: _i24.Future<void>.value(),
+      ) as _i24.Future<void>);
   @override
   bool getCachedIsFavorite() => (super.noSuchMethod(
         Invocation.method(
@@ -1502,15 +1515,15 @@ class MockBitcoinWallet extends _i1.Mock implements _i29.BitcoinWallet {
         returnValue: false,
       ) as bool);
   @override
-  _i23.Future<void> updateCachedIsFavorite(bool? isFavorite) =>
+  _i24.Future<void> updateCachedIsFavorite(bool? isFavorite) =>
       (super.noSuchMethod(
         Invocation.method(
           #updateCachedIsFavorite,
           [isFavorite],
         ),
-        returnValue: _i23.Future<void>.value(),
-        returnValueForMissingStub: _i23.Future<void>.value(),
-      ) as _i23.Future<void>);
+        returnValue: _i24.Future<void>.value(),
+        returnValueForMissingStub: _i24.Future<void>.value(),
+      ) as _i24.Future<void>);
   @override
   _i13.Balance getCachedBalance() => (super.noSuchMethod(
         Invocation.method(
@@ -1526,15 +1539,15 @@ class MockBitcoinWallet extends _i1.Mock implements _i29.BitcoinWallet {
         ),
       ) as _i13.Balance);
   @override
-  _i23.Future<void> updateCachedBalance(_i13.Balance? balance) =>
+  _i24.Future<void> updateCachedBalance(_i13.Balance? balance) =>
       (super.noSuchMethod(
         Invocation.method(
           #updateCachedBalance,
           [balance],
         ),
-        returnValue: _i23.Future<void>.value(),
-        returnValueForMissingStub: _i23.Future<void>.value(),
-      ) as _i23.Future<void>);
+        returnValue: _i24.Future<void>.value(),
+        returnValueForMissingStub: _i24.Future<void>.value(),
+      ) as _i24.Future<void>);
   @override
   _i13.Balance getCachedBalanceSecondary() => (super.noSuchMethod(
         Invocation.method(
@@ -1550,15 +1563,15 @@ class MockBitcoinWallet extends _i1.Mock implements _i29.BitcoinWallet {
         ),
       ) as _i13.Balance);
   @override
-  _i23.Future<void> updateCachedBalanceSecondary(_i13.Balance? balance) =>
+  _i24.Future<void> updateCachedBalanceSecondary(_i13.Balance? balance) =>
       (super.noSuchMethod(
         Invocation.method(
           #updateCachedBalanceSecondary,
           [balance],
         ),
-        returnValue: _i23.Future<void>.value(),
-        returnValueForMissingStub: _i23.Future<void>.value(),
-      ) as _i23.Future<void>);
+        returnValue: _i24.Future<void>.value(),
+        returnValueForMissingStub: _i24.Future<void>.value(),
+      ) as _i24.Future<void>);
   @override
   List<String> getWalletTokenContractAddresses() => (super.noSuchMethod(
         Invocation.method(
@@ -1568,16 +1581,16 @@ class MockBitcoinWallet extends _i1.Mock implements _i29.BitcoinWallet {
         returnValue: <String>[],
       ) as List<String>);
   @override
-  _i23.Future<void> updateWalletTokenContractAddresses(
+  _i24.Future<void> updateWalletTokenContractAddresses(
           List<String>? contractAddresses) =>
       (super.noSuchMethod(
         Invocation.method(
           #updateWalletTokenContractAddresses,
           [contractAddresses],
         ),
-        returnValue: _i23.Future<void>.value(),
-        returnValueForMissingStub: _i23.Future<void>.value(),
-      ) as _i23.Future<void>);
+        returnValue: _i24.Future<void>.value(),
+        returnValueForMissingStub: _i24.Future<void>.value(),
+      ) as _i24.Future<void>);
   @override
   void initWalletDB({_i8.MainDB? mockableOverride}) => super.noSuchMethod(
         Invocation.method(
@@ -1588,11 +1601,45 @@ class MockBitcoinWallet extends _i1.Mock implements _i29.BitcoinWallet {
         returnValueForMissingStub: null,
       );
   @override
-  _i23.Future<_i16.Tuple2<_i18.Transaction, _i18.Address>> parseTransaction(
+  _i24.Future<_i16.TransactionV2> getTransaction(
+    String? txHash,
+    _i23.Coin? coin,
+    String? walletId,
+    _i12.CachedElectrumX? cachedElectrumX, [
+    String? debugTitle,
+  ]) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #getTransaction,
+          [
+            txHash,
+            coin,
+            walletId,
+            cachedElectrumX,
+            debugTitle,
+          ],
+        ),
+        returnValue:
+            _i24.Future<_i16.TransactionV2>.value(_FakeTransactionV2_14(
+          this,
+          Invocation.method(
+            #getTransaction,
+            [
+              txHash,
+              coin,
+              walletId,
+              cachedElectrumX,
+              debugTitle,
+            ],
+          ),
+        )),
+      ) as _i24.Future<_i16.TransactionV2>);
+  @override
+  _i24.Future<_i17.Tuple2<_i19.Transaction, _i19.Address>> parseTransaction(
     Map<String, dynamic>? txData,
     dynamic electrumxClient,
-    List<_i18.Address>? myAddresses,
-    _i22.Coin? coin,
+    List<_i19.Address>? myAddresses,
+    _i23.Coin? coin,
     int? minConfirms,
     String? walletId,
   ) =>
@@ -1609,8 +1656,8 @@ class MockBitcoinWallet extends _i1.Mock implements _i29.BitcoinWallet {
           ],
         ),
         returnValue:
-            _i23.Future<_i16.Tuple2<_i18.Transaction, _i18.Address>>.value(
-                _FakeTuple2_14<_i18.Transaction, _i18.Address>(
+            _i24.Future<_i17.Tuple2<_i19.Transaction, _i19.Address>>.value(
+                _FakeTuple2_15<_i19.Transaction, _i19.Address>(
           this,
           Invocation.method(
             #parseTransaction,
@@ -1624,37 +1671,37 @@ class MockBitcoinWallet extends _i1.Mock implements _i29.BitcoinWallet {
             ],
           ),
         )),
-      ) as _i23.Future<_i16.Tuple2<_i18.Transaction, _i18.Address>>);
+      ) as _i24.Future<_i17.Tuple2<_i19.Transaction, _i19.Address>>);
   @override
   void initPaynymWalletInterface({
     required String? walletId,
     required String? walletName,
     required _i14.NetworkType? network,
-    required _i22.Coin? coin,
+    required _i23.Coin? coin,
     required _i8.MainDB? db,
     required _i11.ElectrumX? electrumXClient,
-    required _i32.SecureStorageInterface? secureStorage,
+    required _i33.SecureStorageInterface? secureStorage,
     required int? dustLimit,
     required int? dustLimitP2PKH,
     required int? minConfirms,
-    required _i23.Future<String?> Function()? getMnemonicString,
-    required _i23.Future<String?> Function()? getMnemonicPassphrase,
-    required _i23.Future<int> Function()? getChainHeight,
-    required _i23.Future<String> Function()? getCurrentChangeAddress,
+    required _i24.Future<String?> Function()? getMnemonicString,
+    required _i24.Future<String?> Function()? getMnemonicPassphrase,
+    required _i24.Future<int> Function()? getChainHeight,
+    required _i24.Future<String> Function()? getCurrentChangeAddress,
     required int Function({
       required int feeRatePerKB,
       required int vSize,
     })? estimateTxFee,
-    required _i23.Future<Map<String, dynamic>> Function({
+    required _i24.Future<Map<String, dynamic>> Function({
       required String address,
       required _i15.Amount amount,
       Map<String, dynamic>? args,
     })? prepareSend,
-    required _i23.Future<int> Function({required String address})? getTxCount,
-    required _i23.Future<List<_i31.SigningData>> Function(List<_i18.UTXO>)?
+    required _i24.Future<int> Function({required String address})? getTxCount,
+    required _i24.Future<List<_i32.SigningData>> Function(List<_i19.UTXO>)?
         fetchBuildTxData,
-    required _i23.Future<void> Function()? refresh,
-    required _i23.Future<void> Function()? checkChangeAddressForTransactions,
+    required _i24.Future<void> Function()? refresh,
+    required _i24.Future<void> Function()? checkChangeAddressForTransactions,
   }) =>
       super.noSuchMethod(
         Invocation.method(
@@ -1687,21 +1734,21 @@ class MockBitcoinWallet extends _i1.Mock implements _i29.BitcoinWallet {
         returnValueForMissingStub: null,
       );
   @override
-  _i23.Future<_i17.BIP32> getBip47BaseNode() => (super.noSuchMethod(
+  _i24.Future<_i18.BIP32> getBip47BaseNode() => (super.noSuchMethod(
         Invocation.method(
           #getBip47BaseNode,
           [],
         ),
-        returnValue: _i23.Future<_i17.BIP32>.value(_FakeBIP32_15(
+        returnValue: _i24.Future<_i18.BIP32>.value(_FakeBIP32_16(
           this,
           Invocation.method(
             #getBip47BaseNode,
             [],
           ),
         )),
-      ) as _i23.Future<_i17.BIP32>);
+      ) as _i24.Future<_i18.BIP32>);
   @override
-  _i23.Future<_i28.Uint8List> getPrivateKeyForPaynymReceivingAddress({
+  _i24.Future<_i29.Uint8List> getPrivateKeyForPaynymReceivingAddress({
     required String? paymentCodeString,
     required int? index,
   }) =>
@@ -1714,11 +1761,11 @@ class MockBitcoinWallet extends _i1.Mock implements _i29.BitcoinWallet {
             #index: index,
           },
         ),
-        returnValue: _i23.Future<_i28.Uint8List>.value(_i28.Uint8List(0)),
-      ) as _i23.Future<_i28.Uint8List>);
+        returnValue: _i24.Future<_i29.Uint8List>.value(_i29.Uint8List(0)),
+      ) as _i24.Future<_i29.Uint8List>);
   @override
-  _i23.Future<_i18.Address> currentReceivingPaynymAddress({
-    required _i19.PaymentCode? sender,
+  _i24.Future<_i19.Address> currentReceivingPaynymAddress({
+    required _i20.PaymentCode? sender,
     required bool? isSegwit,
   }) =>
       (super.noSuchMethod(
@@ -1730,7 +1777,7 @@ class MockBitcoinWallet extends _i1.Mock implements _i29.BitcoinWallet {
             #isSegwit: isSegwit,
           },
         ),
-        returnValue: _i23.Future<_i18.Address>.value(_FakeAddress_16(
+        returnValue: _i24.Future<_i19.Address>.value(_FakeAddress_17(
           this,
           Invocation.method(
             #currentReceivingPaynymAddress,
@@ -1741,10 +1788,10 @@ class MockBitcoinWallet extends _i1.Mock implements _i29.BitcoinWallet {
             },
           ),
         )),
-      ) as _i23.Future<_i18.Address>);
+      ) as _i24.Future<_i19.Address>);
   @override
-  _i23.Future<void> checkCurrentPaynymReceivingAddressForTransactions({
-    required _i19.PaymentCode? sender,
+  _i24.Future<void> checkCurrentPaynymReceivingAddressForTransactions({
+    required _i20.PaymentCode? sender,
     required bool? isSegwit,
   }) =>
       (super.noSuchMethod(
@@ -1756,42 +1803,42 @@ class MockBitcoinWallet extends _i1.Mock implements _i29.BitcoinWallet {
             #isSegwit: isSegwit,
           },
         ),
-        returnValue: _i23.Future<void>.value(),
-        returnValueForMissingStub: _i23.Future<void>.value(),
-      ) as _i23.Future<void>);
+        returnValue: _i24.Future<void>.value(),
+        returnValueForMissingStub: _i24.Future<void>.value(),
+      ) as _i24.Future<void>);
   @override
-  _i23.Future<void> checkAllCurrentReceivingPaynymAddressesForTransactions() =>
+  _i24.Future<void> checkAllCurrentReceivingPaynymAddressesForTransactions() =>
       (super.noSuchMethod(
         Invocation.method(
           #checkAllCurrentReceivingPaynymAddressesForTransactions,
           [],
         ),
-        returnValue: _i23.Future<void>.value(),
-        returnValueForMissingStub: _i23.Future<void>.value(),
-      ) as _i23.Future<void>);
+        returnValue: _i24.Future<void>.value(),
+        returnValueForMissingStub: _i24.Future<void>.value(),
+      ) as _i24.Future<void>);
   @override
-  _i23.Future<_i17.BIP32> deriveNotificationBip32Node() => (super.noSuchMethod(
+  _i24.Future<_i18.BIP32> deriveNotificationBip32Node() => (super.noSuchMethod(
         Invocation.method(
           #deriveNotificationBip32Node,
           [],
         ),
-        returnValue: _i23.Future<_i17.BIP32>.value(_FakeBIP32_15(
+        returnValue: _i24.Future<_i18.BIP32>.value(_FakeBIP32_16(
           this,
           Invocation.method(
             #deriveNotificationBip32Node,
             [],
           ),
         )),
-      ) as _i23.Future<_i17.BIP32>);
+      ) as _i24.Future<_i18.BIP32>);
   @override
-  _i23.Future<_i19.PaymentCode> getPaymentCode({required bool? isSegwit}) =>
+  _i24.Future<_i20.PaymentCode> getPaymentCode({required bool? isSegwit}) =>
       (super.noSuchMethod(
         Invocation.method(
           #getPaymentCode,
           [],
           {#isSegwit: isSegwit},
         ),
-        returnValue: _i23.Future<_i19.PaymentCode>.value(_FakePaymentCode_17(
+        returnValue: _i24.Future<_i20.PaymentCode>.value(_FakePaymentCode_18(
           this,
           Invocation.method(
             #getPaymentCode,
@@ -1799,28 +1846,28 @@ class MockBitcoinWallet extends _i1.Mock implements _i29.BitcoinWallet {
             {#isSegwit: isSegwit},
           ),
         )),
-      ) as _i23.Future<_i19.PaymentCode>);
+      ) as _i24.Future<_i20.PaymentCode>);
   @override
-  _i23.Future<_i28.Uint8List> signWithNotificationKey(_i28.Uint8List? data) =>
+  _i24.Future<_i29.Uint8List> signWithNotificationKey(_i29.Uint8List? data) =>
       (super.noSuchMethod(
         Invocation.method(
           #signWithNotificationKey,
           [data],
         ),
-        returnValue: _i23.Future<_i28.Uint8List>.value(_i28.Uint8List(0)),
-      ) as _i23.Future<_i28.Uint8List>);
+        returnValue: _i24.Future<_i29.Uint8List>.value(_i29.Uint8List(0)),
+      ) as _i24.Future<_i29.Uint8List>);
   @override
-  _i23.Future<String> signStringWithNotificationKey(String? data) =>
+  _i24.Future<String> signStringWithNotificationKey(String? data) =>
       (super.noSuchMethod(
         Invocation.method(
           #signStringWithNotificationKey,
           [data],
         ),
-        returnValue: _i23.Future<String>.value(''),
-      ) as _i23.Future<String>);
+        returnValue: _i24.Future<String>.value(''),
+      ) as _i24.Future<String>);
   @override
-  _i23.Future<Map<String, dynamic>> preparePaymentCodeSend({
-    required _i19.PaymentCode? paymentCode,
+  _i24.Future<Map<String, dynamic>> preparePaymentCodeSend({
+    required _i20.PaymentCode? paymentCode,
     required bool? isSegwit,
     required _i15.Amount? amount,
     Map<String, dynamic>? args,
@@ -1837,13 +1884,13 @@ class MockBitcoinWallet extends _i1.Mock implements _i29.BitcoinWallet {
           },
         ),
         returnValue:
-            _i23.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
-      ) as _i23.Future<Map<String, dynamic>>);
+            _i24.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
+      ) as _i24.Future<Map<String, dynamic>>);
   @override
-  _i23.Future<_i18.Address> nextUnusedSendAddressFrom({
-    required _i19.PaymentCode? pCode,
+  _i24.Future<_i19.Address> nextUnusedSendAddressFrom({
+    required _i20.PaymentCode? pCode,
     required bool? isSegwit,
-    required _i17.BIP32? privateKeyNode,
+    required _i18.BIP32? privateKeyNode,
     int? startIndex = 0,
   }) =>
       (super.noSuchMethod(
@@ -1857,7 +1904,7 @@ class MockBitcoinWallet extends _i1.Mock implements _i29.BitcoinWallet {
             #startIndex: startIndex,
           },
         ),
-        returnValue: _i23.Future<_i18.Address>.value(_FakeAddress_16(
+        returnValue: _i24.Future<_i19.Address>.value(_FakeAddress_17(
           this,
           Invocation.method(
             #nextUnusedSendAddressFrom,
@@ -1870,13 +1917,13 @@ class MockBitcoinWallet extends _i1.Mock implements _i29.BitcoinWallet {
             },
           ),
         )),
-      ) as _i23.Future<_i18.Address>);
+      ) as _i24.Future<_i19.Address>);
   @override
-  _i23.Future<Map<String, dynamic>> prepareNotificationTx({
+  _i24.Future<Map<String, dynamic>> prepareNotificationTx({
     required int? selectedTxFeeRate,
     required String? targetPaymentCodeString,
     int? additionalOutputs = 0,
-    List<_i18.UTXO>? utxos,
+    List<_i19.UTXO>? utxos,
   }) =>
       (super.noSuchMethod(
         Invocation.method(
@@ -1890,10 +1937,10 @@ class MockBitcoinWallet extends _i1.Mock implements _i29.BitcoinWallet {
           },
         ),
         returnValue:
-            _i23.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
-      ) as _i23.Future<Map<String, dynamic>>);
+            _i24.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
+      ) as _i24.Future<Map<String, dynamic>>);
   @override
-  _i23.Future<String> broadcastNotificationTx(
+  _i24.Future<String> broadcastNotificationTx(
           {required Map<String, dynamic>? preparedTx}) =>
       (super.noSuchMethod(
         Invocation.method(
@@ -1901,62 +1948,62 @@ class MockBitcoinWallet extends _i1.Mock implements _i29.BitcoinWallet {
           [],
           {#preparedTx: preparedTx},
         ),
-        returnValue: _i23.Future<String>.value(''),
-      ) as _i23.Future<String>);
+        returnValue: _i24.Future<String>.value(''),
+      ) as _i24.Future<String>);
   @override
-  _i23.Future<bool> hasConnected(String? paymentCodeString) =>
+  _i24.Future<bool> hasConnected(String? paymentCodeString) =>
       (super.noSuchMethod(
         Invocation.method(
           #hasConnected,
           [paymentCodeString],
         ),
-        returnValue: _i23.Future<bool>.value(false),
-      ) as _i23.Future<bool>);
+        returnValue: _i24.Future<bool>.value(false),
+      ) as _i24.Future<bool>);
   @override
-  _i23.Future<_i19.PaymentCode?> unBlindedPaymentCodeFromTransaction(
-          {required _i18.Transaction? transaction}) =>
+  _i24.Future<_i20.PaymentCode?> unBlindedPaymentCodeFromTransaction(
+          {required _i19.Transaction? transaction}) =>
       (super.noSuchMethod(
         Invocation.method(
           #unBlindedPaymentCodeFromTransaction,
           [],
           {#transaction: transaction},
         ),
-        returnValue: _i23.Future<_i19.PaymentCode?>.value(),
-      ) as _i23.Future<_i19.PaymentCode?>);
+        returnValue: _i24.Future<_i20.PaymentCode?>.value(),
+      ) as _i24.Future<_i20.PaymentCode?>);
   @override
-  _i23.Future<_i19.PaymentCode?> unBlindedPaymentCodeFromTransactionBad(
-          {required _i18.Transaction? transaction}) =>
+  _i24.Future<_i20.PaymentCode?> unBlindedPaymentCodeFromTransactionBad(
+          {required _i19.Transaction? transaction}) =>
       (super.noSuchMethod(
         Invocation.method(
           #unBlindedPaymentCodeFromTransactionBad,
           [],
           {#transaction: transaction},
         ),
-        returnValue: _i23.Future<_i19.PaymentCode?>.value(),
-      ) as _i23.Future<_i19.PaymentCode?>);
+        returnValue: _i24.Future<_i20.PaymentCode?>.value(),
+      ) as _i24.Future<_i20.PaymentCode?>);
   @override
-  _i23.Future<List<_i19.PaymentCode>>
+  _i24.Future<List<_i20.PaymentCode>>
       getAllPaymentCodesFromNotificationTransactions() => (super.noSuchMethod(
             Invocation.method(
               #getAllPaymentCodesFromNotificationTransactions,
               [],
             ),
             returnValue:
-                _i23.Future<List<_i19.PaymentCode>>.value(<_i19.PaymentCode>[]),
-          ) as _i23.Future<List<_i19.PaymentCode>>);
+                _i24.Future<List<_i20.PaymentCode>>.value(<_i20.PaymentCode>[]),
+          ) as _i24.Future<List<_i20.PaymentCode>>);
   @override
-  _i23.Future<void> checkForNotificationTransactionsTo(
+  _i24.Future<void> checkForNotificationTransactionsTo(
           Set<String>? otherCodeStrings) =>
       (super.noSuchMethod(
         Invocation.method(
           #checkForNotificationTransactionsTo,
           [otherCodeStrings],
         ),
-        returnValue: _i23.Future<void>.value(),
-        returnValueForMissingStub: _i23.Future<void>.value(),
-      ) as _i23.Future<void>);
+        returnValue: _i24.Future<void>.value(),
+        returnValueForMissingStub: _i24.Future<void>.value(),
+      ) as _i24.Future<void>);
   @override
-  _i23.Future<void> restoreAllHistory({
+  _i24.Future<void> restoreAllHistory({
     required int? maxUnusedAddressGap,
     required int? maxNumberOfIndexesToCheck,
     required Set<String>? paymentCodeStrings,
@@ -1971,12 +2018,12 @@ class MockBitcoinWallet extends _i1.Mock implements _i29.BitcoinWallet {
             #paymentCodeStrings: paymentCodeStrings,
           },
         ),
-        returnValue: _i23.Future<void>.value(),
-        returnValueForMissingStub: _i23.Future<void>.value(),
-      ) as _i23.Future<void>);
+        returnValue: _i24.Future<void>.value(),
+        returnValueForMissingStub: _i24.Future<void>.value(),
+      ) as _i24.Future<void>);
   @override
-  _i23.Future<void> restoreHistoryWith({
-    required _i19.PaymentCode? other,
+  _i24.Future<void> restoreHistoryWith({
+    required _i20.PaymentCode? other,
     required bool? checkSegwitAsWell,
     required int? maxUnusedAddressGap,
     required int? maxNumberOfIndexesToCheck,
@@ -1992,58 +2039,58 @@ class MockBitcoinWallet extends _i1.Mock implements _i29.BitcoinWallet {
             #maxNumberOfIndexesToCheck: maxNumberOfIndexesToCheck,
           },
         ),
-        returnValue: _i23.Future<void>.value(),
-        returnValueForMissingStub: _i23.Future<void>.value(),
-      ) as _i23.Future<void>);
+        returnValue: _i24.Future<void>.value(),
+        returnValueForMissingStub: _i24.Future<void>.value(),
+      ) as _i24.Future<void>);
   @override
-  _i23.Future<_i18.Address> getMyNotificationAddress() => (super.noSuchMethod(
+  _i24.Future<_i19.Address> getMyNotificationAddress() => (super.noSuchMethod(
         Invocation.method(
           #getMyNotificationAddress,
           [],
         ),
-        returnValue: _i23.Future<_i18.Address>.value(_FakeAddress_16(
+        returnValue: _i24.Future<_i19.Address>.value(_FakeAddress_17(
           this,
           Invocation.method(
             #getMyNotificationAddress,
             [],
           ),
         )),
-      ) as _i23.Future<_i18.Address>);
+      ) as _i24.Future<_i19.Address>);
   @override
-  _i23.Future<List<String>> lookupKey(String? paymentCodeString) =>
+  _i24.Future<List<String>> lookupKey(String? paymentCodeString) =>
       (super.noSuchMethod(
         Invocation.method(
           #lookupKey,
           [paymentCodeString],
         ),
-        returnValue: _i23.Future<List<String>>.value(<String>[]),
-      ) as _i23.Future<List<String>>);
+        returnValue: _i24.Future<List<String>>.value(<String>[]),
+      ) as _i24.Future<List<String>>);
   @override
-  _i23.Future<String?> paymentCodeStringByKey(String? key) =>
+  _i24.Future<String?> paymentCodeStringByKey(String? key) =>
       (super.noSuchMethod(
         Invocation.method(
           #paymentCodeStringByKey,
           [key],
         ),
-        returnValue: _i23.Future<String?>.value(),
-      ) as _i23.Future<String?>);
+        returnValue: _i24.Future<String?>.value(),
+      ) as _i24.Future<String?>);
   @override
-  _i23.Future<String> storeCode(String? paymentCodeString) =>
+  _i24.Future<String> storeCode(String? paymentCodeString) =>
       (super.noSuchMethod(
         Invocation.method(
           #storeCode,
           [paymentCodeString],
         ),
-        returnValue: _i23.Future<String>.value(''),
-      ) as _i23.Future<String>);
+        returnValue: _i24.Future<String>.value(''),
+      ) as _i24.Future<String>);
   @override
   void initCoinControlInterface({
     required String? walletId,
     required String? walletName,
-    required _i22.Coin? coin,
+    required _i23.Coin? coin,
     required _i8.MainDB? db,
-    required _i23.Future<int> Function()? getChainHeight,
-    required _i23.Future<void> Function(_i13.Balance)? refreshedBalanceCallback,
+    required _i24.Future<int> Function()? getChainHeight,
+    required _i24.Future<void> Function(_i13.Balance)? refreshedBalanceCallback,
   }) =>
       super.noSuchMethod(
         Invocation.method(
@@ -2061,16 +2108,16 @@ class MockBitcoinWallet extends _i1.Mock implements _i29.BitcoinWallet {
         returnValueForMissingStub: null,
       );
   @override
-  _i23.Future<void> refreshBalance({bool? notify = false}) =>
+  _i24.Future<void> refreshBalance({bool? notify = false}) =>
       (super.noSuchMethod(
         Invocation.method(
           #refreshBalance,
           [],
           {#notify: notify},
         ),
-        returnValue: _i23.Future<void>.value(),
-        returnValueForMissingStub: _i23.Future<void>.value(),
-      ) as _i23.Future<void>);
+        returnValue: _i24.Future<void>.value(),
+        returnValueForMissingStub: _i24.Future<void>.value(),
+      ) as _i24.Future<void>);
 }
 
 /// A class which mocks [Manager].
@@ -2091,23 +2138,23 @@ class MockManager extends _i1.Mock implements _i6.Manager {
         returnValueForMissingStub: null,
       );
   @override
-  _i20.CoinServiceAPI get wallet => (super.noSuchMethod(
+  _i21.CoinServiceAPI get wallet => (super.noSuchMethod(
         Invocation.getter(#wallet),
-        returnValue: _FakeCoinServiceAPI_18(
+        returnValue: _FakeCoinServiceAPI_19(
           this,
           Invocation.getter(#wallet),
         ),
-      ) as _i20.CoinServiceAPI);
+      ) as _i21.CoinServiceAPI);
   @override
   bool get hasBackgroundRefreshListener => (super.noSuchMethod(
         Invocation.getter(#hasBackgroundRefreshListener),
         returnValue: false,
       ) as bool);
   @override
-  _i22.Coin get coin => (super.noSuchMethod(
+  _i23.Coin get coin => (super.noSuchMethod(
         Invocation.getter(#coin),
-        returnValue: _i22.Coin.bitcoin,
-      ) as _i22.Coin);
+        returnValue: _i23.Coin.bitcoin,
+      ) as _i23.Coin);
   @override
   bool get isRefreshing => (super.noSuchMethod(
         Invocation.getter(#isRefreshing),
@@ -2140,23 +2187,23 @@ class MockManager extends _i1.Mock implements _i6.Manager {
         returnValueForMissingStub: null,
       );
   @override
-  _i23.Future<_i10.FeeObject> get fees => (super.noSuchMethod(
+  _i24.Future<_i10.FeeObject> get fees => (super.noSuchMethod(
         Invocation.getter(#fees),
-        returnValue: _i23.Future<_i10.FeeObject>.value(_FakeFeeObject_7(
+        returnValue: _i24.Future<_i10.FeeObject>.value(_FakeFeeObject_7(
           this,
           Invocation.getter(#fees),
         )),
-      ) as _i23.Future<_i10.FeeObject>);
+      ) as _i24.Future<_i10.FeeObject>);
   @override
-  _i23.Future<int> get maxFee => (super.noSuchMethod(
+  _i24.Future<int> get maxFee => (super.noSuchMethod(
         Invocation.getter(#maxFee),
-        returnValue: _i23.Future<int>.value(0),
-      ) as _i23.Future<int>);
+        returnValue: _i24.Future<int>.value(0),
+      ) as _i24.Future<int>);
   @override
-  _i23.Future<String> get currentReceivingAddress => (super.noSuchMethod(
+  _i24.Future<String> get currentReceivingAddress => (super.noSuchMethod(
         Invocation.getter(#currentReceivingAddress),
-        returnValue: _i23.Future<String>.value(''),
-      ) as _i23.Future<String>);
+        returnValue: _i24.Future<String>.value(''),
+      ) as _i24.Future<String>);
   @override
   _i13.Balance get balance => (super.noSuchMethod(
         Invocation.getter(#balance),
@@ -2166,16 +2213,16 @@ class MockManager extends _i1.Mock implements _i6.Manager {
         ),
       ) as _i13.Balance);
   @override
-  _i23.Future<List<_i18.Transaction>> get transactions => (super.noSuchMethod(
+  _i24.Future<List<_i19.Transaction>> get transactions => (super.noSuchMethod(
         Invocation.getter(#transactions),
         returnValue:
-            _i23.Future<List<_i18.Transaction>>.value(<_i18.Transaction>[]),
-      ) as _i23.Future<List<_i18.Transaction>>);
+            _i24.Future<List<_i19.Transaction>>.value(<_i19.Transaction>[]),
+      ) as _i24.Future<List<_i19.Transaction>>);
   @override
-  _i23.Future<List<_i18.UTXO>> get utxos => (super.noSuchMethod(
+  _i24.Future<List<_i19.UTXO>> get utxos => (super.noSuchMethod(
         Invocation.getter(#utxos),
-        returnValue: _i23.Future<List<_i18.UTXO>>.value(<_i18.UTXO>[]),
-      ) as _i23.Future<List<_i18.UTXO>>);
+        returnValue: _i24.Future<List<_i19.UTXO>>.value(<_i19.UTXO>[]),
+      ) as _i24.Future<List<_i19.UTXO>>);
   @override
   set walletName(String? newName) => super.noSuchMethod(
         Invocation.setter(
@@ -2195,15 +2242,15 @@ class MockManager extends _i1.Mock implements _i6.Manager {
         returnValue: '',
       ) as String);
   @override
-  _i23.Future<List<String>> get mnemonic => (super.noSuchMethod(
+  _i24.Future<List<String>> get mnemonic => (super.noSuchMethod(
         Invocation.getter(#mnemonic),
-        returnValue: _i23.Future<List<String>>.value(<String>[]),
-      ) as _i23.Future<List<String>>);
+        returnValue: _i24.Future<List<String>>.value(<String>[]),
+      ) as _i24.Future<List<String>>);
   @override
-  _i23.Future<String?> get mnemonicPassphrase => (super.noSuchMethod(
+  _i24.Future<String?> get mnemonicPassphrase => (super.noSuchMethod(
         Invocation.getter(#mnemonicPassphrase),
-        returnValue: _i23.Future<String?>.value(),
-      ) as _i23.Future<String?>);
+        returnValue: _i24.Future<String?>.value(),
+      ) as _i24.Future<String?>);
   @override
   bool get isConnected => (super.noSuchMethod(
         Invocation.getter(#isConnected),
@@ -2240,6 +2287,11 @@ class MockManager extends _i1.Mock implements _i6.Manager {
         returnValue: false,
       ) as bool);
   @override
+  bool get hasFusionSupport => (super.noSuchMethod(
+        Invocation.getter(#hasFusionSupport),
+        returnValue: false,
+      ) as bool);
+  @override
   int get rescanOnOpenVersion => (super.noSuchMethod(
         Invocation.getter(#rescanOnOpenVersion),
         returnValue: 0,
@@ -2250,24 +2302,24 @@ class MockManager extends _i1.Mock implements _i6.Manager {
         returnValue: false,
       ) as bool);
   @override
-  _i23.Future<String> get xpub => (super.noSuchMethod(
+  _i24.Future<String> get xpub => (super.noSuchMethod(
         Invocation.getter(#xpub),
-        returnValue: _i23.Future<String>.value(''),
-      ) as _i23.Future<String>);
+        returnValue: _i24.Future<String>.value(''),
+      ) as _i24.Future<String>);
   @override
   bool get hasListeners => (super.noSuchMethod(
         Invocation.getter(#hasListeners),
         returnValue: false,
       ) as bool);
   @override
-  _i23.Future<void> updateNode(bool? shouldRefresh) => (super.noSuchMethod(
+  _i24.Future<void> updateNode(bool? shouldRefresh) => (super.noSuchMethod(
         Invocation.method(
           #updateNode,
           [shouldRefresh],
         ),
-        returnValue: _i23.Future<void>.value(),
-        returnValueForMissingStub: _i23.Future<void>.value(),
-      ) as _i23.Future<void>);
+        returnValue: _i24.Future<void>.value(),
+        returnValueForMissingStub: _i24.Future<void>.value(),
+      ) as _i24.Future<void>);
   @override
   void dispose() => super.noSuchMethod(
         Invocation.method(
@@ -2277,7 +2329,7 @@ class MockManager extends _i1.Mock implements _i6.Manager {
         returnValueForMissingStub: null,
       );
   @override
-  _i23.Future<Map<String, dynamic>> prepareSend({
+  _i24.Future<Map<String, dynamic>> prepareSend({
     required String? address,
     required _i15.Amount? amount,
     Map<String, dynamic>? args,
@@ -2293,27 +2345,27 @@ class MockManager extends _i1.Mock implements _i6.Manager {
           },
         ),
         returnValue:
-            _i23.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
-      ) as _i23.Future<Map<String, dynamic>>);
+            _i24.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
+      ) as _i24.Future<Map<String, dynamic>>);
   @override
-  _i23.Future<String> confirmSend({required Map<String, dynamic>? txData}) =>
+  _i24.Future<String> confirmSend({required Map<String, dynamic>? txData}) =>
       (super.noSuchMethod(
         Invocation.method(
           #confirmSend,
           [],
           {#txData: txData},
         ),
-        returnValue: _i23.Future<String>.value(''),
-      ) as _i23.Future<String>);
+        returnValue: _i24.Future<String>.value(''),
+      ) as _i24.Future<String>);
   @override
-  _i23.Future<void> refresh() => (super.noSuchMethod(
+  _i24.Future<void> refresh() => (super.noSuchMethod(
         Invocation.method(
           #refresh,
           [],
         ),
-        returnValue: _i23.Future<void>.value(),
-        returnValueForMissingStub: _i23.Future<void>.value(),
-      ) as _i23.Future<void>);
+        returnValue: _i24.Future<void>.value(),
+        returnValueForMissingStub: _i24.Future<void>.value(),
+      ) as _i24.Future<void>);
   @override
   bool validateAddress(String? address) => (super.noSuchMethod(
         Invocation.method(
@@ -2323,35 +2375,35 @@ class MockManager extends _i1.Mock implements _i6.Manager {
         returnValue: false,
       ) as bool);
   @override
-  _i23.Future<bool> testNetworkConnection() => (super.noSuchMethod(
+  _i24.Future<bool> testNetworkConnection() => (super.noSuchMethod(
         Invocation.method(
           #testNetworkConnection,
           [],
         ),
-        returnValue: _i23.Future<bool>.value(false),
-      ) as _i23.Future<bool>);
+        returnValue: _i24.Future<bool>.value(false),
+      ) as _i24.Future<bool>);
   @override
-  _i23.Future<void> initializeNew(
+  _i24.Future<void> initializeNew(
           ({String mnemonicPassphrase, int wordCount})? data) =>
       (super.noSuchMethod(
         Invocation.method(
           #initializeNew,
           [data],
         ),
-        returnValue: _i23.Future<void>.value(),
-        returnValueForMissingStub: _i23.Future<void>.value(),
-      ) as _i23.Future<void>);
+        returnValue: _i24.Future<void>.value(),
+        returnValueForMissingStub: _i24.Future<void>.value(),
+      ) as _i24.Future<void>);
   @override
-  _i23.Future<void> initializeExisting() => (super.noSuchMethod(
+  _i24.Future<void> initializeExisting() => (super.noSuchMethod(
         Invocation.method(
           #initializeExisting,
           [],
         ),
-        returnValue: _i23.Future<void>.value(),
-        returnValueForMissingStub: _i23.Future<void>.value(),
-      ) as _i23.Future<void>);
+        returnValue: _i24.Future<void>.value(),
+        returnValueForMissingStub: _i24.Future<void>.value(),
+      ) as _i24.Future<void>);
   @override
-  _i23.Future<void> recoverFromMnemonic({
+  _i24.Future<void> recoverFromMnemonic({
     required String? mnemonic,
     String? mnemonicPassphrase,
     required int? maxUnusedAddressGap,
@@ -2370,20 +2422,20 @@ class MockManager extends _i1.Mock implements _i6.Manager {
             #height: height,
           },
         ),
-        returnValue: _i23.Future<void>.value(),
-        returnValueForMissingStub: _i23.Future<void>.value(),
-      ) as _i23.Future<void>);
+        returnValue: _i24.Future<void>.value(),
+        returnValueForMissingStub: _i24.Future<void>.value(),
+      ) as _i24.Future<void>);
   @override
-  _i23.Future<void> exitCurrentWallet() => (super.noSuchMethod(
+  _i24.Future<void> exitCurrentWallet() => (super.noSuchMethod(
         Invocation.method(
           #exitCurrentWallet,
           [],
         ),
-        returnValue: _i23.Future<void>.value(),
-        returnValueForMissingStub: _i23.Future<void>.value(),
-      ) as _i23.Future<void>);
+        returnValue: _i24.Future<void>.value(),
+        returnValueForMissingStub: _i24.Future<void>.value(),
+      ) as _i24.Future<void>);
   @override
-  _i23.Future<void> fullRescan(
+  _i24.Future<void> fullRescan(
     int? maxUnusedAddressGap,
     int? maxNumberOfIndexesToCheck,
   ) =>
@@ -2395,11 +2447,11 @@ class MockManager extends _i1.Mock implements _i6.Manager {
             maxNumberOfIndexesToCheck,
           ],
         ),
-        returnValue: _i23.Future<void>.value(),
-        returnValueForMissingStub: _i23.Future<void>.value(),
-      ) as _i23.Future<void>);
+        returnValue: _i24.Future<void>.value(),
+        returnValueForMissingStub: _i24.Future<void>.value(),
+      ) as _i24.Future<void>);
   @override
-  _i23.Future<_i15.Amount> estimateFeeFor(
+  _i24.Future<_i15.Amount> estimateFeeFor(
     _i15.Amount? amount,
     int? feeRate,
   ) =>
@@ -2411,7 +2463,7 @@ class MockManager extends _i1.Mock implements _i6.Manager {
             feeRate,
           ],
         ),
-        returnValue: _i23.Future<_i15.Amount>.value(_FakeAmount_13(
+        returnValue: _i24.Future<_i15.Amount>.value(_FakeAmount_13(
           this,
           Invocation.method(
             #estimateFeeFor,
@@ -2421,26 +2473,26 @@ class MockManager extends _i1.Mock implements _i6.Manager {
             ],
           ),
         )),
-      ) as _i23.Future<_i15.Amount>);
+      ) as _i24.Future<_i15.Amount>);
   @override
-  _i23.Future<bool> generateNewAddress() => (super.noSuchMethod(
+  _i24.Future<bool> generateNewAddress() => (super.noSuchMethod(
         Invocation.method(
           #generateNewAddress,
           [],
         ),
-        returnValue: _i23.Future<bool>.value(false),
-      ) as _i23.Future<bool>);
+        returnValue: _i24.Future<bool>.value(false),
+      ) as _i24.Future<bool>);
   @override
-  _i23.Future<void> resetRescanOnOpen() => (super.noSuchMethod(
+  _i24.Future<void> resetRescanOnOpen() => (super.noSuchMethod(
         Invocation.method(
           #resetRescanOnOpen,
           [],
         ),
-        returnValue: _i23.Future<void>.value(),
-        returnValueForMissingStub: _i23.Future<void>.value(),
-      ) as _i23.Future<void>);
+        returnValue: _i24.Future<void>.value(),
+        returnValueForMissingStub: _i24.Future<void>.value(),
+      ) as _i24.Future<void>);
   @override
-  void addListener(_i25.VoidCallback? listener) => super.noSuchMethod(
+  void addListener(_i26.VoidCallback? listener) => super.noSuchMethod(
         Invocation.method(
           #addListener,
           [listener],
@@ -2448,7 +2500,7 @@ class MockManager extends _i1.Mock implements _i6.Manager {
         returnValueForMissingStub: null,
       );
   @override
-  void removeListener(_i25.VoidCallback? listener) => super.noSuchMethod(
+  void removeListener(_i26.VoidCallback? listener) => super.noSuchMethod(
         Invocation.method(
           #removeListener,
           [listener],
@@ -2468,7 +2520,7 @@ class MockManager extends _i1.Mock implements _i6.Manager {
 /// A class which mocks [CoinServiceAPI].
 ///
 /// See the documentation for Mockito's code generation for more information.
-class MockCoinServiceAPI extends _i1.Mock implements _i20.CoinServiceAPI {
+class MockCoinServiceAPI extends _i1.Mock implements _i21.CoinServiceAPI {
   @override
   set onIsActiveWalletChanged(void Function(bool)? _onIsActiveWalletChanged) =>
       super.noSuchMethod(
@@ -2479,10 +2531,10 @@ class MockCoinServiceAPI extends _i1.Mock implements _i20.CoinServiceAPI {
         returnValueForMissingStub: null,
       );
   @override
-  _i22.Coin get coin => (super.noSuchMethod(
+  _i23.Coin get coin => (super.noSuchMethod(
         Invocation.getter(#coin),
-        returnValue: _i22.Coin.bitcoin,
-      ) as _i22.Coin);
+        returnValue: _i23.Coin.bitcoin,
+      ) as _i23.Coin);
   @override
   bool get isRefreshing => (super.noSuchMethod(
         Invocation.getter(#isRefreshing),
@@ -2515,23 +2567,23 @@ class MockCoinServiceAPI extends _i1.Mock implements _i20.CoinServiceAPI {
         returnValueForMissingStub: null,
       );
   @override
-  _i23.Future<_i10.FeeObject> get fees => (super.noSuchMethod(
+  _i24.Future<_i10.FeeObject> get fees => (super.noSuchMethod(
         Invocation.getter(#fees),
-        returnValue: _i23.Future<_i10.FeeObject>.value(_FakeFeeObject_7(
+        returnValue: _i24.Future<_i10.FeeObject>.value(_FakeFeeObject_7(
           this,
           Invocation.getter(#fees),
         )),
-      ) as _i23.Future<_i10.FeeObject>);
+      ) as _i24.Future<_i10.FeeObject>);
   @override
-  _i23.Future<int> get maxFee => (super.noSuchMethod(
+  _i24.Future<int> get maxFee => (super.noSuchMethod(
         Invocation.getter(#maxFee),
-        returnValue: _i23.Future<int>.value(0),
-      ) as _i23.Future<int>);
+        returnValue: _i24.Future<int>.value(0),
+      ) as _i24.Future<int>);
   @override
-  _i23.Future<String> get currentReceivingAddress => (super.noSuchMethod(
+  _i24.Future<String> get currentReceivingAddress => (super.noSuchMethod(
         Invocation.getter(#currentReceivingAddress),
-        returnValue: _i23.Future<String>.value(''),
-      ) as _i23.Future<String>);
+        returnValue: _i24.Future<String>.value(''),
+      ) as _i24.Future<String>);
   @override
   _i13.Balance get balance => (super.noSuchMethod(
         Invocation.getter(#balance),
@@ -2541,16 +2593,16 @@ class MockCoinServiceAPI extends _i1.Mock implements _i20.CoinServiceAPI {
         ),
       ) as _i13.Balance);
   @override
-  _i23.Future<List<_i18.Transaction>> get transactions => (super.noSuchMethod(
+  _i24.Future<List<_i19.Transaction>> get transactions => (super.noSuchMethod(
         Invocation.getter(#transactions),
         returnValue:
-            _i23.Future<List<_i18.Transaction>>.value(<_i18.Transaction>[]),
-      ) as _i23.Future<List<_i18.Transaction>>);
+            _i24.Future<List<_i19.Transaction>>.value(<_i19.Transaction>[]),
+      ) as _i24.Future<List<_i19.Transaction>>);
   @override
-  _i23.Future<List<_i18.UTXO>> get utxos => (super.noSuchMethod(
+  _i24.Future<List<_i19.UTXO>> get utxos => (super.noSuchMethod(
         Invocation.getter(#utxos),
-        returnValue: _i23.Future<List<_i18.UTXO>>.value(<_i18.UTXO>[]),
-      ) as _i23.Future<List<_i18.UTXO>>);
+        returnValue: _i24.Future<List<_i19.UTXO>>.value(<_i19.UTXO>[]),
+      ) as _i24.Future<List<_i19.UTXO>>);
   @override
   set walletName(String? newName) => super.noSuchMethod(
         Invocation.setter(
@@ -2570,20 +2622,20 @@ class MockCoinServiceAPI extends _i1.Mock implements _i20.CoinServiceAPI {
         returnValue: '',
       ) as String);
   @override
-  _i23.Future<List<String>> get mnemonic => (super.noSuchMethod(
+  _i24.Future<List<String>> get mnemonic => (super.noSuchMethod(
         Invocation.getter(#mnemonic),
-        returnValue: _i23.Future<List<String>>.value(<String>[]),
-      ) as _i23.Future<List<String>>);
+        returnValue: _i24.Future<List<String>>.value(<String>[]),
+      ) as _i24.Future<List<String>>);
   @override
-  _i23.Future<String?> get mnemonicString => (super.noSuchMethod(
+  _i24.Future<String?> get mnemonicString => (super.noSuchMethod(
         Invocation.getter(#mnemonicString),
-        returnValue: _i23.Future<String?>.value(),
-      ) as _i23.Future<String?>);
+        returnValue: _i24.Future<String?>.value(),
+      ) as _i24.Future<String?>);
   @override
-  _i23.Future<String?> get mnemonicPassphrase => (super.noSuchMethod(
+  _i24.Future<String?> get mnemonicPassphrase => (super.noSuchMethod(
         Invocation.getter(#mnemonicPassphrase),
-        returnValue: _i23.Future<String?>.value(),
-      ) as _i23.Future<String?>);
+        returnValue: _i24.Future<String?>.value(),
+      ) as _i24.Future<String?>);
   @override
   bool get hasCalledExit => (super.noSuchMethod(
         Invocation.getter(#hasCalledExit),
@@ -2600,7 +2652,7 @@ class MockCoinServiceAPI extends _i1.Mock implements _i20.CoinServiceAPI {
         returnValue: 0,
       ) as int);
   @override
-  _i23.Future<Map<String, dynamic>> prepareSend({
+  _i24.Future<Map<String, dynamic>> prepareSend({
     required String? address,
     required _i15.Amount? amount,
     Map<String, dynamic>? args,
@@ -2616,36 +2668,36 @@ class MockCoinServiceAPI extends _i1.Mock implements _i20.CoinServiceAPI {
           },
         ),
         returnValue:
-            _i23.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
-      ) as _i23.Future<Map<String, dynamic>>);
+            _i24.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
+      ) as _i24.Future<Map<String, dynamic>>);
   @override
-  _i23.Future<String> confirmSend({required Map<String, dynamic>? txData}) =>
+  _i24.Future<String> confirmSend({required Map<String, dynamic>? txData}) =>
       (super.noSuchMethod(
         Invocation.method(
           #confirmSend,
           [],
           {#txData: txData},
         ),
-        returnValue: _i23.Future<String>.value(''),
-      ) as _i23.Future<String>);
+        returnValue: _i24.Future<String>.value(''),
+      ) as _i24.Future<String>);
   @override
-  _i23.Future<void> refresh() => (super.noSuchMethod(
+  _i24.Future<void> refresh() => (super.noSuchMethod(
         Invocation.method(
           #refresh,
           [],
         ),
-        returnValue: _i23.Future<void>.value(),
-        returnValueForMissingStub: _i23.Future<void>.value(),
-      ) as _i23.Future<void>);
+        returnValue: _i24.Future<void>.value(),
+        returnValueForMissingStub: _i24.Future<void>.value(),
+      ) as _i24.Future<void>);
   @override
-  _i23.Future<void> updateNode(bool? shouldRefresh) => (super.noSuchMethod(
+  _i24.Future<void> updateNode(bool? shouldRefresh) => (super.noSuchMethod(
         Invocation.method(
           #updateNode,
           [shouldRefresh],
         ),
-        returnValue: _i23.Future<void>.value(),
-        returnValueForMissingStub: _i23.Future<void>.value(),
-      ) as _i23.Future<void>);
+        returnValue: _i24.Future<void>.value(),
+        returnValueForMissingStub: _i24.Future<void>.value(),
+      ) as _i24.Future<void>);
   @override
   bool validateAddress(String? address) => (super.noSuchMethod(
         Invocation.method(
@@ -2655,15 +2707,15 @@ class MockCoinServiceAPI extends _i1.Mock implements _i20.CoinServiceAPI {
         returnValue: false,
       ) as bool);
   @override
-  _i23.Future<bool> testNetworkConnection() => (super.noSuchMethod(
+  _i24.Future<bool> testNetworkConnection() => (super.noSuchMethod(
         Invocation.method(
           #testNetworkConnection,
           [],
         ),
-        returnValue: _i23.Future<bool>.value(false),
-      ) as _i23.Future<bool>);
+        returnValue: _i24.Future<bool>.value(false),
+      ) as _i24.Future<bool>);
   @override
-  _i23.Future<void> recoverFromMnemonic({
+  _i24.Future<void> recoverFromMnemonic({
     required String? mnemonic,
     String? mnemonicPassphrase,
     required int? maxUnusedAddressGap,
@@ -2682,40 +2734,40 @@ class MockCoinServiceAPI extends _i1.Mock implements _i20.CoinServiceAPI {
             #height: height,
           },
         ),
-        returnValue: _i23.Future<void>.value(),
-        returnValueForMissingStub: _i23.Future<void>.value(),
-      ) as _i23.Future<void>);
+        returnValue: _i24.Future<void>.value(),
+        returnValueForMissingStub: _i24.Future<void>.value(),
+      ) as _i24.Future<void>);
   @override
-  _i23.Future<void> initializeNew(
+  _i24.Future<void> initializeNew(
           ({String mnemonicPassphrase, int wordCount})? data) =>
       (super.noSuchMethod(
         Invocation.method(
           #initializeNew,
           [data],
         ),
-        returnValue: _i23.Future<void>.value(),
-        returnValueForMissingStub: _i23.Future<void>.value(),
-      ) as _i23.Future<void>);
+        returnValue: _i24.Future<void>.value(),
+        returnValueForMissingStub: _i24.Future<void>.value(),
+      ) as _i24.Future<void>);
   @override
-  _i23.Future<void> initializeExisting() => (super.noSuchMethod(
+  _i24.Future<void> initializeExisting() => (super.noSuchMethod(
         Invocation.method(
           #initializeExisting,
           [],
         ),
-        returnValue: _i23.Future<void>.value(),
-        returnValueForMissingStub: _i23.Future<void>.value(),
-      ) as _i23.Future<void>);
+        returnValue: _i24.Future<void>.value(),
+        returnValueForMissingStub: _i24.Future<void>.value(),
+      ) as _i24.Future<void>);
   @override
-  _i23.Future<void> exit() => (super.noSuchMethod(
+  _i24.Future<void> exit() => (super.noSuchMethod(
         Invocation.method(
           #exit,
           [],
         ),
-        returnValue: _i23.Future<void>.value(),
-        returnValueForMissingStub: _i23.Future<void>.value(),
-      ) as _i23.Future<void>);
+        returnValue: _i24.Future<void>.value(),
+        returnValueForMissingStub: _i24.Future<void>.value(),
+      ) as _i24.Future<void>);
   @override
-  _i23.Future<void> fullRescan(
+  _i24.Future<void> fullRescan(
     int? maxUnusedAddressGap,
     int? maxNumberOfIndexesToCheck,
   ) =>
@@ -2727,11 +2779,11 @@ class MockCoinServiceAPI extends _i1.Mock implements _i20.CoinServiceAPI {
             maxNumberOfIndexesToCheck,
           ],
         ),
-        returnValue: _i23.Future<void>.value(),
-        returnValueForMissingStub: _i23.Future<void>.value(),
-      ) as _i23.Future<void>);
+        returnValue: _i24.Future<void>.value(),
+        returnValueForMissingStub: _i24.Future<void>.value(),
+      ) as _i24.Future<void>);
   @override
-  _i23.Future<_i15.Amount> estimateFeeFor(
+  _i24.Future<_i15.Amount> estimateFeeFor(
     _i15.Amount? amount,
     int? feeRate,
   ) =>
@@ -2743,7 +2795,7 @@ class MockCoinServiceAPI extends _i1.Mock implements _i20.CoinServiceAPI {
             feeRate,
           ],
         ),
-        returnValue: _i23.Future<_i15.Amount>.value(_FakeAmount_13(
+        returnValue: _i24.Future<_i15.Amount>.value(_FakeAmount_13(
           this,
           Invocation.method(
             #estimateFeeFor,
@@ -2753,23 +2805,23 @@ class MockCoinServiceAPI extends _i1.Mock implements _i20.CoinServiceAPI {
             ],
           ),
         )),
-      ) as _i23.Future<_i15.Amount>);
+      ) as _i24.Future<_i15.Amount>);
   @override
-  _i23.Future<bool> generateNewAddress() => (super.noSuchMethod(
+  _i24.Future<bool> generateNewAddress() => (super.noSuchMethod(
         Invocation.method(
           #generateNewAddress,
           [],
         ),
-        returnValue: _i23.Future<bool>.value(false),
-      ) as _i23.Future<bool>);
+        returnValue: _i24.Future<bool>.value(false),
+      ) as _i24.Future<bool>);
   @override
-  _i23.Future<void> updateSentCachedTxData(Map<String, dynamic>? txData) =>
+  _i24.Future<void> updateSentCachedTxData(Map<String, dynamic>? txData) =>
       (super.noSuchMethod(
         Invocation.method(
           #updateSentCachedTxData,
           [txData],
         ),
-        returnValue: _i23.Future<void>.value(),
-        returnValueForMissingStub: _i23.Future<void>.value(),
-      ) as _i23.Future<void>);
+        returnValue: _i24.Future<void>.value(),
+        returnValueForMissingStub: _i24.Future<void>.value(),
+      ) as _i24.Future<void>);
 }
diff --git a/test/widget_tests/transaction_card_test.mocks.dart b/test/widget_tests/transaction_card_test.mocks.dart
index 5ef7ef5a1..cc6b23b6f 100644
--- a/test/widget_tests/transaction_card_test.mocks.dart
+++ b/test/widget_tests/transaction_card_test.mocks.dart
@@ -3,45 +3,49 @@
 // Do not manually edit this file.
 
 // ignore_for_file: no_leading_underscores_for_library_prefixes
-import 'dart:async' as _i20;
-import 'dart:typed_data' as _i35;
-import 'dart:ui' as _i22;
+import 'dart:async' as _i21;
+import 'dart:typed_data' as _i36;
+import 'dart:ui' as _i23;
 
-import 'package:decimal/decimal.dart' as _i31;
+import 'package:decimal/decimal.dart' as _i32;
 import 'package:flutter/foundation.dart' as _i4;
 import 'package:flutter_riverpod/flutter_riverpod.dart' as _i5;
-import 'package:isar/isar.dart' as _i17;
+import 'package:isar/isar.dart' as _i18;
 import 'package:mockito/mockito.dart' as _i1;
 import 'package:stackwallet/db/isar/main_db.dart' as _i14;
 import 'package:stackwallet/electrumx_rpc/cached_electrumx.dart' as _i13;
 import 'package:stackwallet/electrumx_rpc/electrumx.dart' as _i12;
 import 'package:stackwallet/models/balance.dart' as _i9;
-import 'package:stackwallet/models/isar/models/block_explorer.dart' as _i37;
-import 'package:stackwallet/models/isar/models/contact_entry.dart' as _i36;
-import 'package:stackwallet/models/isar/models/isar_models.dart' as _i23;
-import 'package:stackwallet/models/isar/stack_theme.dart' as _i34;
+import 'package:stackwallet/models/isar/models/block_explorer.dart' as _i38;
+import 'package:stackwallet/models/isar/models/blockchain_data/v2/transaction_v2.dart'
+    as _i39;
+import 'package:stackwallet/models/isar/models/contact_entry.dart' as _i37;
+import 'package:stackwallet/models/isar/models/isar_models.dart' as _i24;
+import 'package:stackwallet/models/isar/stack_theme.dart' as _i35;
 import 'package:stackwallet/models/models.dart' as _i8;
-import 'package:stackwallet/models/signing_data.dart' as _i25;
-import 'package:stackwallet/networking/http.dart' as _i16;
+import 'package:stackwallet/models/signing_data.dart' as _i26;
+import 'package:stackwallet/networking/http.dart' as _i17;
 import 'package:stackwallet/services/coins/coin_service.dart' as _i7;
-import 'package:stackwallet/services/coins/firo/firo_wallet.dart' as _i24;
+import 'package:stackwallet/services/coins/firo/firo_wallet.dart' as _i25;
 import 'package:stackwallet/services/coins/manager.dart' as _i6;
-import 'package:stackwallet/services/locale_service.dart' as _i26;
+import 'package:stackwallet/services/locale_service.dart' as _i27;
+import 'package:stackwallet/services/mixins/fusion_wallet_interface.dart'
+    as _i15;
 import 'package:stackwallet/services/node_service.dart' as _i3;
-import 'package:stackwallet/services/notes_service.dart' as _i32;
-import 'package:stackwallet/services/price_service.dart' as _i30;
+import 'package:stackwallet/services/notes_service.dart' as _i33;
+import 'package:stackwallet/services/price_service.dart' as _i31;
 import 'package:stackwallet/services/transaction_notification_tracker.dart'
     as _i11;
-import 'package:stackwallet/services/wallets.dart' as _i18;
+import 'package:stackwallet/services/wallets.dart' as _i19;
 import 'package:stackwallet/services/wallets_service.dart' as _i2;
-import 'package:stackwallet/themes/theme_service.dart' as _i33;
+import 'package:stackwallet/themes/theme_service.dart' as _i34;
 import 'package:stackwallet/utilities/amount/amount.dart' as _i10;
-import 'package:stackwallet/utilities/amount/amount_unit.dart' as _i29;
-import 'package:stackwallet/utilities/enums/backup_frequency_type.dart' as _i28;
-import 'package:stackwallet/utilities/enums/coin_enum.dart' as _i19;
-import 'package:stackwallet/utilities/enums/sync_type_enum.dart' as _i27;
-import 'package:stackwallet/utilities/prefs.dart' as _i21;
-import 'package:tuple/tuple.dart' as _i15;
+import 'package:stackwallet/utilities/amount/amount_unit.dart' as _i30;
+import 'package:stackwallet/utilities/enums/backup_frequency_type.dart' as _i29;
+import 'package:stackwallet/utilities/enums/coin_enum.dart' as _i20;
+import 'package:stackwallet/utilities/enums/sync_type_enum.dart' as _i28;
+import 'package:stackwallet/utilities/prefs.dart' as _i22;
+import 'package:tuple/tuple.dart' as _i16;
 
 // ignore_for_file: type=lint
 // ignore_for_file: avoid_redundant_argument_values
@@ -179,8 +183,8 @@ class _FakeMainDB_11 extends _i1.SmartFake implements _i14.MainDB {
         );
 }
 
-class _FakeDuration_12 extends _i1.SmartFake implements Duration {
-  _FakeDuration_12(
+class _FakeFusionInfo_12 extends _i1.SmartFake implements _i15.FusionInfo {
+  _FakeFusionInfo_12(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -189,9 +193,8 @@ class _FakeDuration_12 extends _i1.SmartFake implements Duration {
         );
 }
 
-class _FakeTuple2_13<T1, T2> extends _i1.SmartFake
-    implements _i15.Tuple2<T1, T2> {
-  _FakeTuple2_13(
+class _FakeDuration_13 extends _i1.SmartFake implements Duration {
+  _FakeDuration_13(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -200,8 +203,9 @@ class _FakeTuple2_13<T1, T2> extends _i1.SmartFake
         );
 }
 
-class _FakeHTTP_14 extends _i1.SmartFake implements _i16.HTTP {
-  _FakeHTTP_14(
+class _FakeTuple2_14<T1, T2> extends _i1.SmartFake
+    implements _i16.Tuple2<T1, T2> {
+  _FakeTuple2_14(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -210,8 +214,8 @@ class _FakeHTTP_14 extends _i1.SmartFake implements _i16.HTTP {
         );
 }
 
-class _FakeIsar_15 extends _i1.SmartFake implements _i17.Isar {
-  _FakeIsar_15(
+class _FakeHTTP_15 extends _i1.SmartFake implements _i17.HTTP {
+  _FakeHTTP_15(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -220,9 +224,19 @@ class _FakeIsar_15 extends _i1.SmartFake implements _i17.Isar {
         );
 }
 
-class _FakeQueryBuilder_16<OBJ, R, S> extends _i1.SmartFake
-    implements _i17.QueryBuilder<OBJ, R, S> {
-  _FakeQueryBuilder_16(
+class _FakeIsar_16 extends _i1.SmartFake implements _i18.Isar {
+  _FakeIsar_16(
+    Object parent,
+    Invocation parentInvocation,
+  ) : super(
+          parent,
+          parentInvocation,
+        );
+}
+
+class _FakeQueryBuilder_17<OBJ, R, S> extends _i1.SmartFake
+    implements _i18.QueryBuilder<OBJ, R, S> {
+  _FakeQueryBuilder_17(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -234,7 +248,7 @@ class _FakeQueryBuilder_16<OBJ, R, S> extends _i1.SmartFake
 /// A class which mocks [Wallets].
 ///
 /// See the documentation for Mockito's code generation for more information.
-class MockWallets extends _i1.Mock implements _i18.Wallets {
+class MockWallets extends _i1.Mock implements _i19.Wallets {
   MockWallets() {
     _i1.throwOnMissingStub(this);
   }
@@ -301,7 +315,7 @@ class MockWallets extends _i1.Mock implements _i18.Wallets {
         returnValueForMissingStub: null,
       );
   @override
-  List<String> getWalletIdsFor({required _i19.Coin? coin}) =>
+  List<String> getWalletIdsFor({required _i20.Coin? coin}) =>
       (super.noSuchMethod(
         Invocation.method(
           #getWalletIdsFor,
@@ -311,20 +325,20 @@ class MockWallets extends _i1.Mock implements _i18.Wallets {
         returnValue: <String>[],
       ) as List<String>);
   @override
-  List<_i15.Tuple2<_i19.Coin, List<_i5.ChangeNotifierProvider<_i6.Manager>>>>
+  List<_i16.Tuple2<_i20.Coin, List<_i5.ChangeNotifierProvider<_i6.Manager>>>>
       getManagerProvidersByCoin() => (super.noSuchMethod(
             Invocation.method(
               #getManagerProvidersByCoin,
               [],
             ),
-            returnValue: <_i15.Tuple2<_i19.Coin,
+            returnValue: <_i16.Tuple2<_i20.Coin,
                 List<_i5.ChangeNotifierProvider<_i6.Manager>>>>[],
           ) as List<
-              _i15.Tuple2<_i19.Coin,
+              _i16.Tuple2<_i20.Coin,
                   List<_i5.ChangeNotifierProvider<_i6.Manager>>>>);
   @override
   List<_i5.ChangeNotifierProvider<_i6.Manager>> getManagerProvidersForCoin(
-          _i19.Coin? coin) =>
+          _i20.Coin? coin) =>
       (super.noSuchMethod(
         Invocation.method(
           #getManagerProvidersForCoin,
@@ -388,17 +402,17 @@ class MockWallets extends _i1.Mock implements _i18.Wallets {
         returnValueForMissingStub: null,
       );
   @override
-  _i20.Future<void> load(_i21.Prefs? prefs) => (super.noSuchMethod(
+  _i21.Future<void> load(_i22.Prefs? prefs) => (super.noSuchMethod(
         Invocation.method(
           #load,
           [prefs],
         ),
-        returnValue: _i20.Future<void>.value(),
-        returnValueForMissingStub: _i20.Future<void>.value(),
-      ) as _i20.Future<void>);
+        returnValue: _i21.Future<void>.value(),
+        returnValueForMissingStub: _i21.Future<void>.value(),
+      ) as _i21.Future<void>);
   @override
-  _i20.Future<void> loadAfterStackRestore(
-    _i21.Prefs? prefs,
+  _i21.Future<void> loadAfterStackRestore(
+    _i22.Prefs? prefs,
     List<_i6.Manager>? managers,
   ) =>
       (super.noSuchMethod(
@@ -409,11 +423,11 @@ class MockWallets extends _i1.Mock implements _i18.Wallets {
             managers,
           ],
         ),
-        returnValue: _i20.Future<void>.value(),
-        returnValueForMissingStub: _i20.Future<void>.value(),
-      ) as _i20.Future<void>);
+        returnValue: _i21.Future<void>.value(),
+        returnValueForMissingStub: _i21.Future<void>.value(),
+      ) as _i21.Future<void>);
   @override
-  void addListener(_i22.VoidCallback? listener) => super.noSuchMethod(
+  void addListener(_i23.VoidCallback? listener) => super.noSuchMethod(
         Invocation.method(
           #addListener,
           [listener],
@@ -421,7 +435,7 @@ class MockWallets extends _i1.Mock implements _i18.Wallets {
         returnValueForMissingStub: null,
       );
   @override
-  void removeListener(_i22.VoidCallback? listener) => super.noSuchMethod(
+  void removeListener(_i23.VoidCallback? listener) => super.noSuchMethod(
         Invocation.method(
           #removeListener,
           [listener],
@@ -473,10 +487,10 @@ class MockManager extends _i1.Mock implements _i6.Manager {
         returnValue: false,
       ) as bool);
   @override
-  _i19.Coin get coin => (super.noSuchMethod(
+  _i20.Coin get coin => (super.noSuchMethod(
         Invocation.getter(#coin),
-        returnValue: _i19.Coin.bitcoin,
-      ) as _i19.Coin);
+        returnValue: _i20.Coin.bitcoin,
+      ) as _i20.Coin);
   @override
   bool get isRefreshing => (super.noSuchMethod(
         Invocation.getter(#isRefreshing),
@@ -509,23 +523,23 @@ class MockManager extends _i1.Mock implements _i6.Manager {
         returnValueForMissingStub: null,
       );
   @override
-  _i20.Future<_i8.FeeObject> get fees => (super.noSuchMethod(
+  _i21.Future<_i8.FeeObject> get fees => (super.noSuchMethod(
         Invocation.getter(#fees),
-        returnValue: _i20.Future<_i8.FeeObject>.value(_FakeFeeObject_5(
+        returnValue: _i21.Future<_i8.FeeObject>.value(_FakeFeeObject_5(
           this,
           Invocation.getter(#fees),
         )),
-      ) as _i20.Future<_i8.FeeObject>);
+      ) as _i21.Future<_i8.FeeObject>);
   @override
-  _i20.Future<int> get maxFee => (super.noSuchMethod(
+  _i21.Future<int> get maxFee => (super.noSuchMethod(
         Invocation.getter(#maxFee),
-        returnValue: _i20.Future<int>.value(0),
-      ) as _i20.Future<int>);
+        returnValue: _i21.Future<int>.value(0),
+      ) as _i21.Future<int>);
   @override
-  _i20.Future<String> get currentReceivingAddress => (super.noSuchMethod(
+  _i21.Future<String> get currentReceivingAddress => (super.noSuchMethod(
         Invocation.getter(#currentReceivingAddress),
-        returnValue: _i20.Future<String>.value(''),
-      ) as _i20.Future<String>);
+        returnValue: _i21.Future<String>.value(''),
+      ) as _i21.Future<String>);
   @override
   _i9.Balance get balance => (super.noSuchMethod(
         Invocation.getter(#balance),
@@ -535,16 +549,16 @@ class MockManager extends _i1.Mock implements _i6.Manager {
         ),
       ) as _i9.Balance);
   @override
-  _i20.Future<List<_i23.Transaction>> get transactions => (super.noSuchMethod(
+  _i21.Future<List<_i24.Transaction>> get transactions => (super.noSuchMethod(
         Invocation.getter(#transactions),
         returnValue:
-            _i20.Future<List<_i23.Transaction>>.value(<_i23.Transaction>[]),
-      ) as _i20.Future<List<_i23.Transaction>>);
+            _i21.Future<List<_i24.Transaction>>.value(<_i24.Transaction>[]),
+      ) as _i21.Future<List<_i24.Transaction>>);
   @override
-  _i20.Future<List<_i23.UTXO>> get utxos => (super.noSuchMethod(
+  _i21.Future<List<_i24.UTXO>> get utxos => (super.noSuchMethod(
         Invocation.getter(#utxos),
-        returnValue: _i20.Future<List<_i23.UTXO>>.value(<_i23.UTXO>[]),
-      ) as _i20.Future<List<_i23.UTXO>>);
+        returnValue: _i21.Future<List<_i24.UTXO>>.value(<_i24.UTXO>[]),
+      ) as _i21.Future<List<_i24.UTXO>>);
   @override
   set walletName(String? newName) => super.noSuchMethod(
         Invocation.setter(
@@ -564,15 +578,15 @@ class MockManager extends _i1.Mock implements _i6.Manager {
         returnValue: '',
       ) as String);
   @override
-  _i20.Future<List<String>> get mnemonic => (super.noSuchMethod(
+  _i21.Future<List<String>> get mnemonic => (super.noSuchMethod(
         Invocation.getter(#mnemonic),
-        returnValue: _i20.Future<List<String>>.value(<String>[]),
-      ) as _i20.Future<List<String>>);
+        returnValue: _i21.Future<List<String>>.value(<String>[]),
+      ) as _i21.Future<List<String>>);
   @override
-  _i20.Future<String?> get mnemonicPassphrase => (super.noSuchMethod(
+  _i21.Future<String?> get mnemonicPassphrase => (super.noSuchMethod(
         Invocation.getter(#mnemonicPassphrase),
-        returnValue: _i20.Future<String?>.value(),
-      ) as _i20.Future<String?>);
+        returnValue: _i21.Future<String?>.value(),
+      ) as _i21.Future<String?>);
   @override
   bool get isConnected => (super.noSuchMethod(
         Invocation.getter(#isConnected),
@@ -609,6 +623,11 @@ class MockManager extends _i1.Mock implements _i6.Manager {
         returnValue: false,
       ) as bool);
   @override
+  bool get hasFusionSupport => (super.noSuchMethod(
+        Invocation.getter(#hasFusionSupport),
+        returnValue: false,
+      ) as bool);
+  @override
   int get rescanOnOpenVersion => (super.noSuchMethod(
         Invocation.getter(#rescanOnOpenVersion),
         returnValue: 0,
@@ -619,24 +638,24 @@ class MockManager extends _i1.Mock implements _i6.Manager {
         returnValue: false,
       ) as bool);
   @override
-  _i20.Future<String> get xpub => (super.noSuchMethod(
+  _i21.Future<String> get xpub => (super.noSuchMethod(
         Invocation.getter(#xpub),
-        returnValue: _i20.Future<String>.value(''),
-      ) as _i20.Future<String>);
+        returnValue: _i21.Future<String>.value(''),
+      ) as _i21.Future<String>);
   @override
   bool get hasListeners => (super.noSuchMethod(
         Invocation.getter(#hasListeners),
         returnValue: false,
       ) as bool);
   @override
-  _i20.Future<void> updateNode(bool? shouldRefresh) => (super.noSuchMethod(
+  _i21.Future<void> updateNode(bool? shouldRefresh) => (super.noSuchMethod(
         Invocation.method(
           #updateNode,
           [shouldRefresh],
         ),
-        returnValue: _i20.Future<void>.value(),
-        returnValueForMissingStub: _i20.Future<void>.value(),
-      ) as _i20.Future<void>);
+        returnValue: _i21.Future<void>.value(),
+        returnValueForMissingStub: _i21.Future<void>.value(),
+      ) as _i21.Future<void>);
   @override
   void dispose() => super.noSuchMethod(
         Invocation.method(
@@ -646,7 +665,7 @@ class MockManager extends _i1.Mock implements _i6.Manager {
         returnValueForMissingStub: null,
       );
   @override
-  _i20.Future<Map<String, dynamic>> prepareSend({
+  _i21.Future<Map<String, dynamic>> prepareSend({
     required String? address,
     required _i10.Amount? amount,
     Map<String, dynamic>? args,
@@ -662,27 +681,27 @@ class MockManager extends _i1.Mock implements _i6.Manager {
           },
         ),
         returnValue:
-            _i20.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
-      ) as _i20.Future<Map<String, dynamic>>);
+            _i21.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
+      ) as _i21.Future<Map<String, dynamic>>);
   @override
-  _i20.Future<String> confirmSend({required Map<String, dynamic>? txData}) =>
+  _i21.Future<String> confirmSend({required Map<String, dynamic>? txData}) =>
       (super.noSuchMethod(
         Invocation.method(
           #confirmSend,
           [],
           {#txData: txData},
         ),
-        returnValue: _i20.Future<String>.value(''),
-      ) as _i20.Future<String>);
+        returnValue: _i21.Future<String>.value(''),
+      ) as _i21.Future<String>);
   @override
-  _i20.Future<void> refresh() => (super.noSuchMethod(
+  _i21.Future<void> refresh() => (super.noSuchMethod(
         Invocation.method(
           #refresh,
           [],
         ),
-        returnValue: _i20.Future<void>.value(),
-        returnValueForMissingStub: _i20.Future<void>.value(),
-      ) as _i20.Future<void>);
+        returnValue: _i21.Future<void>.value(),
+        returnValueForMissingStub: _i21.Future<void>.value(),
+      ) as _i21.Future<void>);
   @override
   bool validateAddress(String? address) => (super.noSuchMethod(
         Invocation.method(
@@ -692,35 +711,35 @@ class MockManager extends _i1.Mock implements _i6.Manager {
         returnValue: false,
       ) as bool);
   @override
-  _i20.Future<bool> testNetworkConnection() => (super.noSuchMethod(
+  _i21.Future<bool> testNetworkConnection() => (super.noSuchMethod(
         Invocation.method(
           #testNetworkConnection,
           [],
         ),
-        returnValue: _i20.Future<bool>.value(false),
-      ) as _i20.Future<bool>);
+        returnValue: _i21.Future<bool>.value(false),
+      ) as _i21.Future<bool>);
   @override
-  _i20.Future<void> initializeNew(
+  _i21.Future<void> initializeNew(
           ({String mnemonicPassphrase, int wordCount})? data) =>
       (super.noSuchMethod(
         Invocation.method(
           #initializeNew,
           [data],
         ),
-        returnValue: _i20.Future<void>.value(),
-        returnValueForMissingStub: _i20.Future<void>.value(),
-      ) as _i20.Future<void>);
+        returnValue: _i21.Future<void>.value(),
+        returnValueForMissingStub: _i21.Future<void>.value(),
+      ) as _i21.Future<void>);
   @override
-  _i20.Future<void> initializeExisting() => (super.noSuchMethod(
+  _i21.Future<void> initializeExisting() => (super.noSuchMethod(
         Invocation.method(
           #initializeExisting,
           [],
         ),
-        returnValue: _i20.Future<void>.value(),
-        returnValueForMissingStub: _i20.Future<void>.value(),
-      ) as _i20.Future<void>);
+        returnValue: _i21.Future<void>.value(),
+        returnValueForMissingStub: _i21.Future<void>.value(),
+      ) as _i21.Future<void>);
   @override
-  _i20.Future<void> recoverFromMnemonic({
+  _i21.Future<void> recoverFromMnemonic({
     required String? mnemonic,
     String? mnemonicPassphrase,
     required int? maxUnusedAddressGap,
@@ -739,20 +758,20 @@ class MockManager extends _i1.Mock implements _i6.Manager {
             #height: height,
           },
         ),
-        returnValue: _i20.Future<void>.value(),
-        returnValueForMissingStub: _i20.Future<void>.value(),
-      ) as _i20.Future<void>);
+        returnValue: _i21.Future<void>.value(),
+        returnValueForMissingStub: _i21.Future<void>.value(),
+      ) as _i21.Future<void>);
   @override
-  _i20.Future<void> exitCurrentWallet() => (super.noSuchMethod(
+  _i21.Future<void> exitCurrentWallet() => (super.noSuchMethod(
         Invocation.method(
           #exitCurrentWallet,
           [],
         ),
-        returnValue: _i20.Future<void>.value(),
-        returnValueForMissingStub: _i20.Future<void>.value(),
-      ) as _i20.Future<void>);
+        returnValue: _i21.Future<void>.value(),
+        returnValueForMissingStub: _i21.Future<void>.value(),
+      ) as _i21.Future<void>);
   @override
-  _i20.Future<void> fullRescan(
+  _i21.Future<void> fullRescan(
     int? maxUnusedAddressGap,
     int? maxNumberOfIndexesToCheck,
   ) =>
@@ -764,11 +783,11 @@ class MockManager extends _i1.Mock implements _i6.Manager {
             maxNumberOfIndexesToCheck,
           ],
         ),
-        returnValue: _i20.Future<void>.value(),
-        returnValueForMissingStub: _i20.Future<void>.value(),
-      ) as _i20.Future<void>);
+        returnValue: _i21.Future<void>.value(),
+        returnValueForMissingStub: _i21.Future<void>.value(),
+      ) as _i21.Future<void>);
   @override
-  _i20.Future<_i10.Amount> estimateFeeFor(
+  _i21.Future<_i10.Amount> estimateFeeFor(
     _i10.Amount? amount,
     int? feeRate,
   ) =>
@@ -780,7 +799,7 @@ class MockManager extends _i1.Mock implements _i6.Manager {
             feeRate,
           ],
         ),
-        returnValue: _i20.Future<_i10.Amount>.value(_FakeAmount_7(
+        returnValue: _i21.Future<_i10.Amount>.value(_FakeAmount_7(
           this,
           Invocation.method(
             #estimateFeeFor,
@@ -790,26 +809,26 @@ class MockManager extends _i1.Mock implements _i6.Manager {
             ],
           ),
         )),
-      ) as _i20.Future<_i10.Amount>);
+      ) as _i21.Future<_i10.Amount>);
   @override
-  _i20.Future<bool> generateNewAddress() => (super.noSuchMethod(
+  _i21.Future<bool> generateNewAddress() => (super.noSuchMethod(
         Invocation.method(
           #generateNewAddress,
           [],
         ),
-        returnValue: _i20.Future<bool>.value(false),
-      ) as _i20.Future<bool>);
+        returnValue: _i21.Future<bool>.value(false),
+      ) as _i21.Future<bool>);
   @override
-  _i20.Future<void> resetRescanOnOpen() => (super.noSuchMethod(
+  _i21.Future<void> resetRescanOnOpen() => (super.noSuchMethod(
         Invocation.method(
           #resetRescanOnOpen,
           [],
         ),
-        returnValue: _i20.Future<void>.value(),
-        returnValueForMissingStub: _i20.Future<void>.value(),
-      ) as _i20.Future<void>);
+        returnValue: _i21.Future<void>.value(),
+        returnValueForMissingStub: _i21.Future<void>.value(),
+      ) as _i21.Future<void>);
   @override
-  void addListener(_i22.VoidCallback? listener) => super.noSuchMethod(
+  void addListener(_i23.VoidCallback? listener) => super.noSuchMethod(
         Invocation.method(
           #addListener,
           [listener],
@@ -817,7 +836,7 @@ class MockManager extends _i1.Mock implements _i6.Manager {
         returnValueForMissingStub: null,
       );
   @override
-  void removeListener(_i22.VoidCallback? listener) => super.noSuchMethod(
+  void removeListener(_i23.VoidCallback? listener) => super.noSuchMethod(
         Invocation.method(
           #removeListener,
           [listener],
@@ -852,10 +871,10 @@ class MockCoinServiceAPI extends _i1.Mock implements _i7.CoinServiceAPI {
         returnValueForMissingStub: null,
       );
   @override
-  _i19.Coin get coin => (super.noSuchMethod(
+  _i20.Coin get coin => (super.noSuchMethod(
         Invocation.getter(#coin),
-        returnValue: _i19.Coin.bitcoin,
-      ) as _i19.Coin);
+        returnValue: _i20.Coin.bitcoin,
+      ) as _i20.Coin);
   @override
   bool get isRefreshing => (super.noSuchMethod(
         Invocation.getter(#isRefreshing),
@@ -888,23 +907,23 @@ class MockCoinServiceAPI extends _i1.Mock implements _i7.CoinServiceAPI {
         returnValueForMissingStub: null,
       );
   @override
-  _i20.Future<_i8.FeeObject> get fees => (super.noSuchMethod(
+  _i21.Future<_i8.FeeObject> get fees => (super.noSuchMethod(
         Invocation.getter(#fees),
-        returnValue: _i20.Future<_i8.FeeObject>.value(_FakeFeeObject_5(
+        returnValue: _i21.Future<_i8.FeeObject>.value(_FakeFeeObject_5(
           this,
           Invocation.getter(#fees),
         )),
-      ) as _i20.Future<_i8.FeeObject>);
+      ) as _i21.Future<_i8.FeeObject>);
   @override
-  _i20.Future<int> get maxFee => (super.noSuchMethod(
+  _i21.Future<int> get maxFee => (super.noSuchMethod(
         Invocation.getter(#maxFee),
-        returnValue: _i20.Future<int>.value(0),
-      ) as _i20.Future<int>);
+        returnValue: _i21.Future<int>.value(0),
+      ) as _i21.Future<int>);
   @override
-  _i20.Future<String> get currentReceivingAddress => (super.noSuchMethod(
+  _i21.Future<String> get currentReceivingAddress => (super.noSuchMethod(
         Invocation.getter(#currentReceivingAddress),
-        returnValue: _i20.Future<String>.value(''),
-      ) as _i20.Future<String>);
+        returnValue: _i21.Future<String>.value(''),
+      ) as _i21.Future<String>);
   @override
   _i9.Balance get balance => (super.noSuchMethod(
         Invocation.getter(#balance),
@@ -914,16 +933,16 @@ class MockCoinServiceAPI extends _i1.Mock implements _i7.CoinServiceAPI {
         ),
       ) as _i9.Balance);
   @override
-  _i20.Future<List<_i23.Transaction>> get transactions => (super.noSuchMethod(
+  _i21.Future<List<_i24.Transaction>> get transactions => (super.noSuchMethod(
         Invocation.getter(#transactions),
         returnValue:
-            _i20.Future<List<_i23.Transaction>>.value(<_i23.Transaction>[]),
-      ) as _i20.Future<List<_i23.Transaction>>);
+            _i21.Future<List<_i24.Transaction>>.value(<_i24.Transaction>[]),
+      ) as _i21.Future<List<_i24.Transaction>>);
   @override
-  _i20.Future<List<_i23.UTXO>> get utxos => (super.noSuchMethod(
+  _i21.Future<List<_i24.UTXO>> get utxos => (super.noSuchMethod(
         Invocation.getter(#utxos),
-        returnValue: _i20.Future<List<_i23.UTXO>>.value(<_i23.UTXO>[]),
-      ) as _i20.Future<List<_i23.UTXO>>);
+        returnValue: _i21.Future<List<_i24.UTXO>>.value(<_i24.UTXO>[]),
+      ) as _i21.Future<List<_i24.UTXO>>);
   @override
   set walletName(String? newName) => super.noSuchMethod(
         Invocation.setter(
@@ -943,20 +962,20 @@ class MockCoinServiceAPI extends _i1.Mock implements _i7.CoinServiceAPI {
         returnValue: '',
       ) as String);
   @override
-  _i20.Future<List<String>> get mnemonic => (super.noSuchMethod(
+  _i21.Future<List<String>> get mnemonic => (super.noSuchMethod(
         Invocation.getter(#mnemonic),
-        returnValue: _i20.Future<List<String>>.value(<String>[]),
-      ) as _i20.Future<List<String>>);
+        returnValue: _i21.Future<List<String>>.value(<String>[]),
+      ) as _i21.Future<List<String>>);
   @override
-  _i20.Future<String?> get mnemonicString => (super.noSuchMethod(
+  _i21.Future<String?> get mnemonicString => (super.noSuchMethod(
         Invocation.getter(#mnemonicString),
-        returnValue: _i20.Future<String?>.value(),
-      ) as _i20.Future<String?>);
+        returnValue: _i21.Future<String?>.value(),
+      ) as _i21.Future<String?>);
   @override
-  _i20.Future<String?> get mnemonicPassphrase => (super.noSuchMethod(
+  _i21.Future<String?> get mnemonicPassphrase => (super.noSuchMethod(
         Invocation.getter(#mnemonicPassphrase),
-        returnValue: _i20.Future<String?>.value(),
-      ) as _i20.Future<String?>);
+        returnValue: _i21.Future<String?>.value(),
+      ) as _i21.Future<String?>);
   @override
   bool get hasCalledExit => (super.noSuchMethod(
         Invocation.getter(#hasCalledExit),
@@ -973,7 +992,7 @@ class MockCoinServiceAPI extends _i1.Mock implements _i7.CoinServiceAPI {
         returnValue: 0,
       ) as int);
   @override
-  _i20.Future<Map<String, dynamic>> prepareSend({
+  _i21.Future<Map<String, dynamic>> prepareSend({
     required String? address,
     required _i10.Amount? amount,
     Map<String, dynamic>? args,
@@ -989,36 +1008,36 @@ class MockCoinServiceAPI extends _i1.Mock implements _i7.CoinServiceAPI {
           },
         ),
         returnValue:
-            _i20.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
-      ) as _i20.Future<Map<String, dynamic>>);
+            _i21.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
+      ) as _i21.Future<Map<String, dynamic>>);
   @override
-  _i20.Future<String> confirmSend({required Map<String, dynamic>? txData}) =>
+  _i21.Future<String> confirmSend({required Map<String, dynamic>? txData}) =>
       (super.noSuchMethod(
         Invocation.method(
           #confirmSend,
           [],
           {#txData: txData},
         ),
-        returnValue: _i20.Future<String>.value(''),
-      ) as _i20.Future<String>);
+        returnValue: _i21.Future<String>.value(''),
+      ) as _i21.Future<String>);
   @override
-  _i20.Future<void> refresh() => (super.noSuchMethod(
+  _i21.Future<void> refresh() => (super.noSuchMethod(
         Invocation.method(
           #refresh,
           [],
         ),
-        returnValue: _i20.Future<void>.value(),
-        returnValueForMissingStub: _i20.Future<void>.value(),
-      ) as _i20.Future<void>);
+        returnValue: _i21.Future<void>.value(),
+        returnValueForMissingStub: _i21.Future<void>.value(),
+      ) as _i21.Future<void>);
   @override
-  _i20.Future<void> updateNode(bool? shouldRefresh) => (super.noSuchMethod(
+  _i21.Future<void> updateNode(bool? shouldRefresh) => (super.noSuchMethod(
         Invocation.method(
           #updateNode,
           [shouldRefresh],
         ),
-        returnValue: _i20.Future<void>.value(),
-        returnValueForMissingStub: _i20.Future<void>.value(),
-      ) as _i20.Future<void>);
+        returnValue: _i21.Future<void>.value(),
+        returnValueForMissingStub: _i21.Future<void>.value(),
+      ) as _i21.Future<void>);
   @override
   bool validateAddress(String? address) => (super.noSuchMethod(
         Invocation.method(
@@ -1028,15 +1047,15 @@ class MockCoinServiceAPI extends _i1.Mock implements _i7.CoinServiceAPI {
         returnValue: false,
       ) as bool);
   @override
-  _i20.Future<bool> testNetworkConnection() => (super.noSuchMethod(
+  _i21.Future<bool> testNetworkConnection() => (super.noSuchMethod(
         Invocation.method(
           #testNetworkConnection,
           [],
         ),
-        returnValue: _i20.Future<bool>.value(false),
-      ) as _i20.Future<bool>);
+        returnValue: _i21.Future<bool>.value(false),
+      ) as _i21.Future<bool>);
   @override
-  _i20.Future<void> recoverFromMnemonic({
+  _i21.Future<void> recoverFromMnemonic({
     required String? mnemonic,
     String? mnemonicPassphrase,
     required int? maxUnusedAddressGap,
@@ -1055,40 +1074,40 @@ class MockCoinServiceAPI extends _i1.Mock implements _i7.CoinServiceAPI {
             #height: height,
           },
         ),
-        returnValue: _i20.Future<void>.value(),
-        returnValueForMissingStub: _i20.Future<void>.value(),
-      ) as _i20.Future<void>);
+        returnValue: _i21.Future<void>.value(),
+        returnValueForMissingStub: _i21.Future<void>.value(),
+      ) as _i21.Future<void>);
   @override
-  _i20.Future<void> initializeNew(
+  _i21.Future<void> initializeNew(
           ({String mnemonicPassphrase, int wordCount})? data) =>
       (super.noSuchMethod(
         Invocation.method(
           #initializeNew,
           [data],
         ),
-        returnValue: _i20.Future<void>.value(),
-        returnValueForMissingStub: _i20.Future<void>.value(),
-      ) as _i20.Future<void>);
+        returnValue: _i21.Future<void>.value(),
+        returnValueForMissingStub: _i21.Future<void>.value(),
+      ) as _i21.Future<void>);
   @override
-  _i20.Future<void> initializeExisting() => (super.noSuchMethod(
+  _i21.Future<void> initializeExisting() => (super.noSuchMethod(
         Invocation.method(
           #initializeExisting,
           [],
         ),
-        returnValue: _i20.Future<void>.value(),
-        returnValueForMissingStub: _i20.Future<void>.value(),
-      ) as _i20.Future<void>);
+        returnValue: _i21.Future<void>.value(),
+        returnValueForMissingStub: _i21.Future<void>.value(),
+      ) as _i21.Future<void>);
   @override
-  _i20.Future<void> exit() => (super.noSuchMethod(
+  _i21.Future<void> exit() => (super.noSuchMethod(
         Invocation.method(
           #exit,
           [],
         ),
-        returnValue: _i20.Future<void>.value(),
-        returnValueForMissingStub: _i20.Future<void>.value(),
-      ) as _i20.Future<void>);
+        returnValue: _i21.Future<void>.value(),
+        returnValueForMissingStub: _i21.Future<void>.value(),
+      ) as _i21.Future<void>);
   @override
-  _i20.Future<void> fullRescan(
+  _i21.Future<void> fullRescan(
     int? maxUnusedAddressGap,
     int? maxNumberOfIndexesToCheck,
   ) =>
@@ -1100,11 +1119,11 @@ class MockCoinServiceAPI extends _i1.Mock implements _i7.CoinServiceAPI {
             maxNumberOfIndexesToCheck,
           ],
         ),
-        returnValue: _i20.Future<void>.value(),
-        returnValueForMissingStub: _i20.Future<void>.value(),
-      ) as _i20.Future<void>);
+        returnValue: _i21.Future<void>.value(),
+        returnValueForMissingStub: _i21.Future<void>.value(),
+      ) as _i21.Future<void>);
   @override
-  _i20.Future<_i10.Amount> estimateFeeFor(
+  _i21.Future<_i10.Amount> estimateFeeFor(
     _i10.Amount? amount,
     int? feeRate,
   ) =>
@@ -1116,7 +1135,7 @@ class MockCoinServiceAPI extends _i1.Mock implements _i7.CoinServiceAPI {
             feeRate,
           ],
         ),
-        returnValue: _i20.Future<_i10.Amount>.value(_FakeAmount_7(
+        returnValue: _i21.Future<_i10.Amount>.value(_FakeAmount_7(
           this,
           Invocation.method(
             #estimateFeeFor,
@@ -1126,37 +1145,37 @@ class MockCoinServiceAPI extends _i1.Mock implements _i7.CoinServiceAPI {
             ],
           ),
         )),
-      ) as _i20.Future<_i10.Amount>);
+      ) as _i21.Future<_i10.Amount>);
   @override
-  _i20.Future<bool> generateNewAddress() => (super.noSuchMethod(
+  _i21.Future<bool> generateNewAddress() => (super.noSuchMethod(
         Invocation.method(
           #generateNewAddress,
           [],
         ),
-        returnValue: _i20.Future<bool>.value(false),
-      ) as _i20.Future<bool>);
+        returnValue: _i21.Future<bool>.value(false),
+      ) as _i21.Future<bool>);
   @override
-  _i20.Future<void> updateSentCachedTxData(Map<String, dynamic>? txData) =>
+  _i21.Future<void> updateSentCachedTxData(Map<String, dynamic>? txData) =>
       (super.noSuchMethod(
         Invocation.method(
           #updateSentCachedTxData,
           [txData],
         ),
-        returnValue: _i20.Future<void>.value(),
-        returnValueForMissingStub: _i20.Future<void>.value(),
-      ) as _i20.Future<void>);
+        returnValue: _i21.Future<void>.value(),
+        returnValueForMissingStub: _i21.Future<void>.value(),
+      ) as _i21.Future<void>);
 }
 
 /// A class which mocks [FiroWallet].
 ///
 /// See the documentation for Mockito's code generation for more information.
-class MockFiroWallet extends _i1.Mock implements _i24.FiroWallet {
+class MockFiroWallet extends _i1.Mock implements _i25.FiroWallet {
   MockFiroWallet() {
     _i1.throwOnMissingStub(this);
   }
 
   @override
-  set timer(_i20.Timer? _timer) => super.noSuchMethod(
+  set timer(_i21.Timer? _timer) => super.noSuchMethod(
         Invocation.setter(
           #timer,
           _timer,
@@ -1246,48 +1265,48 @@ class MockFiroWallet extends _i1.Mock implements _i24.FiroWallet {
         returnValue: false,
       ) as bool);
   @override
-  _i19.Coin get coin => (super.noSuchMethod(
+  _i20.Coin get coin => (super.noSuchMethod(
         Invocation.getter(#coin),
-        returnValue: _i19.Coin.bitcoin,
-      ) as _i19.Coin);
+        returnValue: _i20.Coin.bitcoin,
+      ) as _i20.Coin);
   @override
-  _i20.Future<List<String>> get mnemonic => (super.noSuchMethod(
+  _i21.Future<List<String>> get mnemonic => (super.noSuchMethod(
         Invocation.getter(#mnemonic),
-        returnValue: _i20.Future<List<String>>.value(<String>[]),
-      ) as _i20.Future<List<String>>);
+        returnValue: _i21.Future<List<String>>.value(<String>[]),
+      ) as _i21.Future<List<String>>);
   @override
-  _i20.Future<String?> get mnemonicString => (super.noSuchMethod(
+  _i21.Future<String?> get mnemonicString => (super.noSuchMethod(
         Invocation.getter(#mnemonicString),
-        returnValue: _i20.Future<String?>.value(),
-      ) as _i20.Future<String?>);
+        returnValue: _i21.Future<String?>.value(),
+      ) as _i21.Future<String?>);
   @override
-  _i20.Future<String?> get mnemonicPassphrase => (super.noSuchMethod(
+  _i21.Future<String?> get mnemonicPassphrase => (super.noSuchMethod(
         Invocation.getter(#mnemonicPassphrase),
-        returnValue: _i20.Future<String?>.value(),
-      ) as _i20.Future<String?>);
+        returnValue: _i21.Future<String?>.value(),
+      ) as _i21.Future<String?>);
   @override
-  _i20.Future<int> get maxFee => (super.noSuchMethod(
+  _i21.Future<int> get maxFee => (super.noSuchMethod(
         Invocation.getter(#maxFee),
-        returnValue: _i20.Future<int>.value(0),
-      ) as _i20.Future<int>);
+        returnValue: _i21.Future<int>.value(0),
+      ) as _i21.Future<int>);
   @override
-  _i20.Future<_i8.FeeObject> get fees => (super.noSuchMethod(
+  _i21.Future<_i8.FeeObject> get fees => (super.noSuchMethod(
         Invocation.getter(#fees),
-        returnValue: _i20.Future<_i8.FeeObject>.value(_FakeFeeObject_5(
+        returnValue: _i21.Future<_i8.FeeObject>.value(_FakeFeeObject_5(
           this,
           Invocation.getter(#fees),
         )),
-      ) as _i20.Future<_i8.FeeObject>);
+      ) as _i21.Future<_i8.FeeObject>);
   @override
-  _i20.Future<String> get currentReceivingAddress => (super.noSuchMethod(
+  _i21.Future<String> get currentReceivingAddress => (super.noSuchMethod(
         Invocation.getter(#currentReceivingAddress),
-        returnValue: _i20.Future<String>.value(''),
-      ) as _i20.Future<String>);
+        returnValue: _i21.Future<String>.value(''),
+      ) as _i21.Future<String>);
   @override
-  _i20.Future<String> get currentChangeAddress => (super.noSuchMethod(
+  _i21.Future<String> get currentChangeAddress => (super.noSuchMethod(
         Invocation.getter(#currentChangeAddress),
-        returnValue: _i20.Future<String>.value(''),
-      ) as _i20.Future<String>);
+        returnValue: _i21.Future<String>.value(''),
+      ) as _i21.Future<String>);
   @override
   String get walletName => (super.noSuchMethod(
         Invocation.getter(#walletName),
@@ -1343,10 +1362,10 @@ class MockFiroWallet extends _i1.Mock implements _i24.FiroWallet {
         returnValue: false,
       ) as bool);
   @override
-  _i20.Future<int> get chainHeight => (super.noSuchMethod(
+  _i21.Future<int> get chainHeight => (super.noSuchMethod(
         Invocation.getter(#chainHeight),
-        returnValue: _i20.Future<int>.value(0),
-      ) as _i20.Future<int>);
+        returnValue: _i21.Future<int>.value(0),
+      ) as _i21.Future<int>);
   @override
   int get storedChainHeight => (super.noSuchMethod(
         Invocation.getter(#storedChainHeight),
@@ -1369,21 +1388,21 @@ class MockFiroWallet extends _i1.Mock implements _i24.FiroWallet {
         ),
       ) as _i9.Balance);
   @override
-  _i20.Future<List<_i23.UTXO>> get utxos => (super.noSuchMethod(
+  _i21.Future<List<_i24.UTXO>> get utxos => (super.noSuchMethod(
         Invocation.getter(#utxos),
-        returnValue: _i20.Future<List<_i23.UTXO>>.value(<_i23.UTXO>[]),
-      ) as _i20.Future<List<_i23.UTXO>>);
+        returnValue: _i21.Future<List<_i24.UTXO>>.value(<_i24.UTXO>[]),
+      ) as _i21.Future<List<_i24.UTXO>>);
   @override
-  _i20.Future<List<_i23.Transaction>> get transactions => (super.noSuchMethod(
+  _i21.Future<List<_i24.Transaction>> get transactions => (super.noSuchMethod(
         Invocation.getter(#transactions),
         returnValue:
-            _i20.Future<List<_i23.Transaction>>.value(<_i23.Transaction>[]),
-      ) as _i20.Future<List<_i23.Transaction>>);
+            _i21.Future<List<_i24.Transaction>>.value(<_i24.Transaction>[]),
+      ) as _i21.Future<List<_i24.Transaction>>);
   @override
-  _i20.Future<String> get xpub => (super.noSuchMethod(
+  _i21.Future<String> get xpub => (super.noSuchMethod(
         Invocation.getter(#xpub),
-        returnValue: _i20.Future<String>.value(''),
-      ) as _i20.Future<String>);
+        returnValue: _i21.Future<String>.value(''),
+      ) as _i21.Future<String>);
   @override
   set onIsActiveWalletChanged(void Function(bool)? _onIsActiveWalletChanged) =>
       super.noSuchMethod(
@@ -1410,23 +1429,23 @@ class MockFiroWallet extends _i1.Mock implements _i24.FiroWallet {
         returnValue: false,
       ) as bool);
   @override
-  _i20.Future<void> updateSentCachedTxData(Map<String, dynamic>? txData) =>
+  _i21.Future<void> updateSentCachedTxData(Map<String, dynamic>? txData) =>
       (super.noSuchMethod(
         Invocation.method(
           #updateSentCachedTxData,
           [txData],
         ),
-        returnValue: _i20.Future<void>.value(),
-        returnValueForMissingStub: _i20.Future<void>.value(),
-      ) as _i20.Future<void>);
+        returnValue: _i21.Future<void>.value(),
+        returnValueForMissingStub: _i21.Future<void>.value(),
+      ) as _i21.Future<void>);
   @override
-  _i20.Future<bool> testNetworkConnection() => (super.noSuchMethod(
+  _i21.Future<bool> testNetworkConnection() => (super.noSuchMethod(
         Invocation.method(
           #testNetworkConnection,
           [],
         ),
-        returnValue: _i20.Future<bool>.value(false),
-      ) as _i20.Future<bool>);
+        returnValue: _i21.Future<bool>.value(false),
+      ) as _i21.Future<bool>);
   @override
   void startNetworkAlivePinging() => super.noSuchMethod(
         Invocation.method(
@@ -1444,7 +1463,7 @@ class MockFiroWallet extends _i1.Mock implements _i24.FiroWallet {
         returnValueForMissingStub: null,
       );
   @override
-  _i20.Future<Map<String, dynamic>> prepareSendPublic({
+  _i21.Future<Map<String, dynamic>> prepareSendPublic({
     required String? address,
     required _i10.Amount? amount,
     Map<String, dynamic>? args,
@@ -1460,20 +1479,20 @@ class MockFiroWallet extends _i1.Mock implements _i24.FiroWallet {
           },
         ),
         returnValue:
-            _i20.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
-      ) as _i20.Future<Map<String, dynamic>>);
+            _i21.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
+      ) as _i21.Future<Map<String, dynamic>>);
   @override
-  _i20.Future<String> confirmSendPublic({dynamic txData}) =>
+  _i21.Future<String> confirmSendPublic({dynamic txData}) =>
       (super.noSuchMethod(
         Invocation.method(
           #confirmSendPublic,
           [],
           {#txData: txData},
         ),
-        returnValue: _i20.Future<String>.value(''),
-      ) as _i20.Future<String>);
+        returnValue: _i21.Future<String>.value(''),
+      ) as _i21.Future<String>);
   @override
-  _i20.Future<Map<String, dynamic>> prepareSend({
+  _i21.Future<Map<String, dynamic>> prepareSend({
     required String? address,
     required _i10.Amount? amount,
     Map<String, dynamic>? args,
@@ -1489,18 +1508,18 @@ class MockFiroWallet extends _i1.Mock implements _i24.FiroWallet {
           },
         ),
         returnValue:
-            _i20.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
-      ) as _i20.Future<Map<String, dynamic>>);
+            _i21.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
+      ) as _i21.Future<Map<String, dynamic>>);
   @override
-  _i20.Future<String> confirmSend({required Map<String, dynamic>? txData}) =>
+  _i21.Future<String> confirmSend({required Map<String, dynamic>? txData}) =>
       (super.noSuchMethod(
         Invocation.method(
           #confirmSend,
           [],
           {#txData: txData},
         ),
-        returnValue: _i20.Future<String>.value(''),
-      ) as _i20.Future<String>);
+        returnValue: _i21.Future<String>.value(''),
+      ) as _i21.Future<String>);
   @override
   int estimateTxFee({
     required int? vSize,
@@ -1525,7 +1544,7 @@ class MockFiroWallet extends _i1.Mock implements _i24.FiroWallet {
     bool? isSendAll, {
     int? satsPerVByte,
     int? additionalOutputs = 0,
-    List<_i23.UTXO>? utxos,
+    List<_i24.UTXO>? utxos,
   }) =>
       super.noSuchMethod(Invocation.method(
         #coinSelection,
@@ -1542,19 +1561,19 @@ class MockFiroWallet extends _i1.Mock implements _i24.FiroWallet {
         },
       ));
   @override
-  _i20.Future<List<_i25.SigningData>> fetchBuildTxData(
-          List<_i23.UTXO>? utxosToUse) =>
+  _i21.Future<List<_i26.SigningData>> fetchBuildTxData(
+          List<_i24.UTXO>? utxosToUse) =>
       (super.noSuchMethod(
         Invocation.method(
           #fetchBuildTxData,
           [utxosToUse],
         ),
         returnValue:
-            _i20.Future<List<_i25.SigningData>>.value(<_i25.SigningData>[]),
-      ) as _i20.Future<List<_i25.SigningData>>);
+            _i21.Future<List<_i26.SigningData>>.value(<_i26.SigningData>[]),
+      ) as _i21.Future<List<_i26.SigningData>>);
   @override
-  _i20.Future<Map<String, dynamic>> buildTransaction({
-    required List<_i25.SigningData>? utxoSigningData,
+  _i21.Future<Map<String, dynamic>> buildTransaction({
+    required List<_i26.SigningData>? utxoSigningData,
     required List<String>? recipients,
     required List<int>? satoshiAmounts,
   }) =>
@@ -1569,111 +1588,111 @@ class MockFiroWallet extends _i1.Mock implements _i24.FiroWallet {
           },
         ),
         returnValue:
-            _i20.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
-      ) as _i20.Future<Map<String, dynamic>>);
+            _i21.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
+      ) as _i21.Future<Map<String, dynamic>>);
   @override
-  _i20.Future<void> updateNode(bool? shouldRefresh) => (super.noSuchMethod(
+  _i21.Future<void> updateNode(bool? shouldRefresh) => (super.noSuchMethod(
         Invocation.method(
           #updateNode,
           [shouldRefresh],
         ),
-        returnValue: _i20.Future<void>.value(),
-        returnValueForMissingStub: _i20.Future<void>.value(),
-      ) as _i20.Future<void>);
+        returnValue: _i21.Future<void>.value(),
+        returnValueForMissingStub: _i21.Future<void>.value(),
+      ) as _i21.Future<void>);
   @override
-  _i20.Future<void> initializeNew(
+  _i21.Future<void> initializeNew(
           ({String mnemonicPassphrase, int wordCount})? data) =>
       (super.noSuchMethod(
         Invocation.method(
           #initializeNew,
           [data],
         ),
-        returnValue: _i20.Future<void>.value(),
-        returnValueForMissingStub: _i20.Future<void>.value(),
-      ) as _i20.Future<void>);
+        returnValue: _i21.Future<void>.value(),
+        returnValueForMissingStub: _i21.Future<void>.value(),
+      ) as _i21.Future<void>);
   @override
-  _i20.Future<void> setLelantusCoinIsarRescanRequiredDone() =>
+  _i21.Future<void> setLelantusCoinIsarRescanRequiredDone() =>
       (super.noSuchMethod(
         Invocation.method(
           #setLelantusCoinIsarRescanRequiredDone,
           [],
         ),
-        returnValue: _i20.Future<void>.value(),
-        returnValueForMissingStub: _i20.Future<void>.value(),
-      ) as _i20.Future<void>);
+        returnValue: _i21.Future<void>.value(),
+        returnValueForMissingStub: _i21.Future<void>.value(),
+      ) as _i21.Future<void>);
   @override
-  _i20.Future<bool> firoRescanRecovery() => (super.noSuchMethod(
+  _i21.Future<bool> firoRescanRecovery() => (super.noSuchMethod(
         Invocation.method(
           #firoRescanRecovery,
           [],
         ),
-        returnValue: _i20.Future<bool>.value(false),
-      ) as _i20.Future<bool>);
+        returnValue: _i21.Future<bool>.value(false),
+      ) as _i21.Future<bool>);
   @override
-  _i20.Future<void> initializeExisting() => (super.noSuchMethod(
+  _i21.Future<void> initializeExisting() => (super.noSuchMethod(
         Invocation.method(
           #initializeExisting,
           [],
         ),
-        returnValue: _i20.Future<void>.value(),
-        returnValueForMissingStub: _i20.Future<void>.value(),
-      ) as _i20.Future<void>);
+        returnValue: _i21.Future<void>.value(),
+        returnValueForMissingStub: _i21.Future<void>.value(),
+      ) as _i21.Future<void>);
   @override
-  _i20.Future<bool> refreshIfThereIsNewData() => (super.noSuchMethod(
+  _i21.Future<bool> refreshIfThereIsNewData() => (super.noSuchMethod(
         Invocation.method(
           #refreshIfThereIsNewData,
           [],
         ),
-        returnValue: _i20.Future<bool>.value(false),
-      ) as _i20.Future<bool>);
+        returnValue: _i21.Future<bool>.value(false),
+      ) as _i21.Future<bool>);
   @override
-  _i20.Future<void> getAllTxsToWatch() => (super.noSuchMethod(
+  _i21.Future<void> getAllTxsToWatch() => (super.noSuchMethod(
         Invocation.method(
           #getAllTxsToWatch,
           [],
         ),
-        returnValue: _i20.Future<void>.value(),
-        returnValueForMissingStub: _i20.Future<void>.value(),
-      ) as _i20.Future<void>);
+        returnValue: _i21.Future<void>.value(),
+        returnValueForMissingStub: _i21.Future<void>.value(),
+      ) as _i21.Future<void>);
   @override
-  _i20.Future<void> refresh() => (super.noSuchMethod(
+  _i21.Future<void> refresh() => (super.noSuchMethod(
         Invocation.method(
           #refresh,
           [],
         ),
-        returnValue: _i20.Future<void>.value(),
-        returnValueForMissingStub: _i20.Future<void>.value(),
-      ) as _i20.Future<void>);
+        returnValue: _i21.Future<void>.value(),
+        returnValueForMissingStub: _i21.Future<void>.value(),
+      ) as _i21.Future<void>);
   @override
-  _i20.Future<void> anonymizeAllPublicFunds() => (super.noSuchMethod(
+  _i21.Future<void> anonymizeAllPublicFunds() => (super.noSuchMethod(
         Invocation.method(
           #anonymizeAllPublicFunds,
           [],
         ),
-        returnValue: _i20.Future<void>.value(),
-        returnValueForMissingStub: _i20.Future<void>.value(),
-      ) as _i20.Future<void>);
+        returnValue: _i21.Future<void>.value(),
+        returnValueForMissingStub: _i21.Future<void>.value(),
+      ) as _i21.Future<void>);
   @override
-  _i20.Future<List<Map<String, dynamic>>> createMintsFromAmount(int? total) =>
+  _i21.Future<List<Map<String, dynamic>>> createMintsFromAmount(int? total) =>
       (super.noSuchMethod(
         Invocation.method(
           #createMintsFromAmount,
           [total],
         ),
-        returnValue: _i20.Future<List<Map<String, dynamic>>>.value(
+        returnValue: _i21.Future<List<Map<String, dynamic>>>.value(
             <Map<String, dynamic>>[]),
-      ) as _i20.Future<List<Map<String, dynamic>>>);
+      ) as _i21.Future<List<Map<String, dynamic>>>);
   @override
-  _i20.Future<String> submitHexToNetwork(String? hex) => (super.noSuchMethod(
+  _i21.Future<String> submitHexToNetwork(String? hex) => (super.noSuchMethod(
         Invocation.method(
           #submitHexToNetwork,
           [hex],
         ),
-        returnValue: _i20.Future<String>.value(''),
-      ) as _i20.Future<String>);
+        returnValue: _i21.Future<String>.value(''),
+      ) as _i21.Future<String>);
   @override
-  _i20.Future<Map<String, dynamic>> buildMintTransaction(
-    List<_i23.UTXO>? utxosToUse,
+  _i21.Future<Map<String, dynamic>> buildMintTransaction(
+    List<_i24.UTXO>? utxosToUse,
     int? satoshisPerRecipient,
     List<Map<String, dynamic>>? mintsMap,
   ) =>
@@ -1687,29 +1706,29 @@ class MockFiroWallet extends _i1.Mock implements _i24.FiroWallet {
           ],
         ),
         returnValue:
-            _i20.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
-      ) as _i20.Future<Map<String, dynamic>>);
+            _i21.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
+      ) as _i21.Future<Map<String, dynamic>>);
   @override
-  _i20.Future<void> checkReceivingAddressForTransactions() =>
+  _i21.Future<void> checkReceivingAddressForTransactions() =>
       (super.noSuchMethod(
         Invocation.method(
           #checkReceivingAddressForTransactions,
           [],
         ),
-        returnValue: _i20.Future<void>.value(),
-        returnValueForMissingStub: _i20.Future<void>.value(),
-      ) as _i20.Future<void>);
+        returnValue: _i21.Future<void>.value(),
+        returnValueForMissingStub: _i21.Future<void>.value(),
+      ) as _i21.Future<void>);
   @override
-  _i20.Future<void> checkChangeAddressForTransactions() => (super.noSuchMethod(
+  _i21.Future<void> checkChangeAddressForTransactions() => (super.noSuchMethod(
         Invocation.method(
           #checkChangeAddressForTransactions,
           [],
         ),
-        returnValue: _i20.Future<void>.value(),
-        returnValueForMissingStub: _i20.Future<void>.value(),
-      ) as _i20.Future<void>);
+        returnValue: _i21.Future<void>.value(),
+        returnValueForMissingStub: _i21.Future<void>.value(),
+      ) as _i21.Future<void>);
   @override
-  _i20.Future<void> fullRescan(
+  _i21.Future<void> fullRescan(
     int? maxUnusedAddressGap,
     int? maxNumberOfIndexesToCheck,
   ) =>
@@ -1721,11 +1740,11 @@ class MockFiroWallet extends _i1.Mock implements _i24.FiroWallet {
             maxNumberOfIndexesToCheck,
           ],
         ),
-        returnValue: _i20.Future<void>.value(),
-        returnValueForMissingStub: _i20.Future<void>.value(),
-      ) as _i20.Future<void>);
+        returnValue: _i21.Future<void>.value(),
+        returnValueForMissingStub: _i21.Future<void>.value(),
+      ) as _i21.Future<void>);
   @override
-  _i20.Future<void> recoverFromMnemonic({
+  _i21.Future<void> recoverFromMnemonic({
     required String? mnemonic,
     String? mnemonicPassphrase,
     required int? maxUnusedAddressGap,
@@ -1744,74 +1763,74 @@ class MockFiroWallet extends _i1.Mock implements _i24.FiroWallet {
             #height: height,
           },
         ),
-        returnValue: _i20.Future<void>.value(),
-        returnValueForMissingStub: _i20.Future<void>.value(),
-      ) as _i20.Future<void>);
+        returnValue: _i21.Future<void>.value(),
+        returnValueForMissingStub: _i21.Future<void>.value(),
+      ) as _i21.Future<void>);
   @override
-  _i20.Future<Map<int, dynamic>> getSetDataMap(int? latestSetId) =>
+  _i21.Future<Map<int, dynamic>> getSetDataMap(int? latestSetId) =>
       (super.noSuchMethod(
         Invocation.method(
           #getSetDataMap,
           [latestSetId],
         ),
-        returnValue: _i20.Future<Map<int, dynamic>>.value(<int, dynamic>{}),
-      ) as _i20.Future<Map<int, dynamic>>);
+        returnValue: _i21.Future<Map<int, dynamic>>.value(<int, dynamic>{}),
+      ) as _i21.Future<Map<int, dynamic>>);
   @override
-  _i20.Future<void> getTransactionCacheEarly(List<String>? allAddresses) =>
+  _i21.Future<void> getTransactionCacheEarly(List<String>? allAddresses) =>
       (super.noSuchMethod(
         Invocation.method(
           #getTransactionCacheEarly,
           [allAddresses],
         ),
-        returnValue: _i20.Future<void>.value(),
-        returnValueForMissingStub: _i20.Future<void>.value(),
-      ) as _i20.Future<void>);
+        returnValue: _i21.Future<void>.value(),
+        returnValueForMissingStub: _i21.Future<void>.value(),
+      ) as _i21.Future<void>);
   @override
-  _i20.Future<List<Map<String, dynamic>>> fetchAnonymitySets() =>
+  _i21.Future<List<Map<String, dynamic>>> fetchAnonymitySets() =>
       (super.noSuchMethod(
         Invocation.method(
           #fetchAnonymitySets,
           [],
         ),
-        returnValue: _i20.Future<List<Map<String, dynamic>>>.value(
+        returnValue: _i21.Future<List<Map<String, dynamic>>>.value(
             <Map<String, dynamic>>[]),
-      ) as _i20.Future<List<Map<String, dynamic>>>);
+      ) as _i21.Future<List<Map<String, dynamic>>>);
   @override
-  _i20.Future<int> getLatestSetId() => (super.noSuchMethod(
+  _i21.Future<int> getLatestSetId() => (super.noSuchMethod(
         Invocation.method(
           #getLatestSetId,
           [],
         ),
-        returnValue: _i20.Future<int>.value(0),
-      ) as _i20.Future<int>);
+        returnValue: _i21.Future<int>.value(0),
+      ) as _i21.Future<int>);
   @override
-  _i20.Future<List<String>> getUsedCoinSerials() => (super.noSuchMethod(
+  _i21.Future<List<String>> getUsedCoinSerials() => (super.noSuchMethod(
         Invocation.method(
           #getUsedCoinSerials,
           [],
         ),
-        returnValue: _i20.Future<List<String>>.value(<String>[]),
-      ) as _i20.Future<List<String>>);
+        returnValue: _i21.Future<List<String>>.value(<String>[]),
+      ) as _i21.Future<List<String>>);
   @override
-  _i20.Future<void> exit() => (super.noSuchMethod(
+  _i21.Future<void> exit() => (super.noSuchMethod(
         Invocation.method(
           #exit,
           [],
         ),
-        returnValue: _i20.Future<void>.value(),
-        returnValueForMissingStub: _i20.Future<void>.value(),
-      ) as _i20.Future<void>);
+        returnValue: _i21.Future<void>.value(),
+        returnValueForMissingStub: _i21.Future<void>.value(),
+      ) as _i21.Future<void>);
   @override
-  _i20.Future<int> estimateJoinSplitFee(int? spendAmount) =>
+  _i21.Future<int> estimateJoinSplitFee(int? spendAmount) =>
       (super.noSuchMethod(
         Invocation.method(
           #estimateJoinSplitFee,
           [spendAmount],
         ),
-        returnValue: _i20.Future<int>.value(0),
-      ) as _i20.Future<int>);
+        returnValue: _i21.Future<int>.value(0),
+      ) as _i21.Future<int>);
   @override
-  _i20.Future<_i10.Amount> estimateFeeFor(
+  _i21.Future<_i10.Amount> estimateFeeFor(
     _i10.Amount? amount,
     int? feeRate,
   ) =>
@@ -1823,7 +1842,7 @@ class MockFiroWallet extends _i1.Mock implements _i24.FiroWallet {
             feeRate,
           ],
         ),
-        returnValue: _i20.Future<_i10.Amount>.value(_FakeAmount_7(
+        returnValue: _i21.Future<_i10.Amount>.value(_FakeAmount_7(
           this,
           Invocation.method(
             #estimateFeeFor,
@@ -1833,9 +1852,9 @@ class MockFiroWallet extends _i1.Mock implements _i24.FiroWallet {
             ],
           ),
         )),
-      ) as _i20.Future<_i10.Amount>);
+      ) as _i21.Future<_i10.Amount>);
   @override
-  _i20.Future<_i10.Amount> estimateFeeForPublic(
+  _i21.Future<_i10.Amount> estimateFeeForPublic(
     _i10.Amount? amount,
     int? feeRate,
   ) =>
@@ -1847,7 +1866,7 @@ class MockFiroWallet extends _i1.Mock implements _i24.FiroWallet {
             feeRate,
           ],
         ),
-        returnValue: _i20.Future<_i10.Amount>.value(_FakeAmount_7(
+        returnValue: _i21.Future<_i10.Amount>.value(_FakeAmount_7(
           this,
           Invocation.method(
             #estimateFeeForPublic,
@@ -1857,7 +1876,7 @@ class MockFiroWallet extends _i1.Mock implements _i24.FiroWallet {
             ],
           ),
         )),
-      ) as _i20.Future<_i10.Amount>);
+      ) as _i21.Future<_i10.Amount>);
   @override
   _i10.Amount roughFeeEstimate(
     int? inputCount,
@@ -1886,36 +1905,36 @@ class MockFiroWallet extends _i1.Mock implements _i24.FiroWallet {
         ),
       ) as _i10.Amount);
   @override
-  _i20.Future<_i10.Amount> sweepAllEstimate(int? feeRate) =>
+  _i21.Future<_i10.Amount> sweepAllEstimate(int? feeRate) =>
       (super.noSuchMethod(
         Invocation.method(
           #sweepAllEstimate,
           [feeRate],
         ),
-        returnValue: _i20.Future<_i10.Amount>.value(_FakeAmount_7(
+        returnValue: _i21.Future<_i10.Amount>.value(_FakeAmount_7(
           this,
           Invocation.method(
             #sweepAllEstimate,
             [feeRate],
           ),
         )),
-      ) as _i20.Future<_i10.Amount>);
+      ) as _i21.Future<_i10.Amount>);
   @override
-  _i20.Future<List<Map<String, dynamic>>> fastFetch(
+  _i21.Future<List<Map<String, dynamic>>> fastFetch(
           List<String>? allTxHashes) =>
       (super.noSuchMethod(
         Invocation.method(
           #fastFetch,
           [allTxHashes],
         ),
-        returnValue: _i20.Future<List<Map<String, dynamic>>>.value(
+        returnValue: _i21.Future<List<Map<String, dynamic>>>.value(
             <Map<String, dynamic>>[]),
-      ) as _i20.Future<List<Map<String, dynamic>>>);
+      ) as _i21.Future<List<Map<String, dynamic>>>);
   @override
-  _i20.Future<Map<_i23.Address, _i23.Transaction>> getJMintTransactions(
+  _i21.Future<Map<_i24.Address, _i24.Transaction>> getJMintTransactions(
     _i13.CachedElectrumX? cachedClient,
     List<String>? transactions,
-    _i19.Coin? coin,
+    _i20.Coin? coin,
   ) =>
       (super.noSuchMethod(
         Invocation.method(
@@ -1926,17 +1945,17 @@ class MockFiroWallet extends _i1.Mock implements _i24.FiroWallet {
             coin,
           ],
         ),
-        returnValue: _i20.Future<Map<_i23.Address, _i23.Transaction>>.value(
-            <_i23.Address, _i23.Transaction>{}),
-      ) as _i20.Future<Map<_i23.Address, _i23.Transaction>>);
+        returnValue: _i21.Future<Map<_i24.Address, _i24.Transaction>>.value(
+            <_i24.Address, _i24.Transaction>{}),
+      ) as _i21.Future<Map<_i24.Address, _i24.Transaction>>);
   @override
-  _i20.Future<bool> generateNewAddress() => (super.noSuchMethod(
+  _i21.Future<bool> generateNewAddress() => (super.noSuchMethod(
         Invocation.method(
           #generateNewAddress,
           [],
         ),
-        returnValue: _i20.Future<bool>.value(false),
-      ) as _i20.Future<bool>);
+        returnValue: _i21.Future<bool>.value(false),
+      ) as _i21.Future<bool>);
   @override
   _i10.Amount availablePrivateBalance() => (super.noSuchMethod(
         Invocation.method(
@@ -1968,7 +1987,7 @@ class MockFiroWallet extends _i1.Mock implements _i24.FiroWallet {
   @override
   void initCache(
     String? walletId,
-    _i19.Coin? coin,
+    _i20.Coin? coin,
   ) =>
       super.noSuchMethod(
         Invocation.method(
@@ -1981,14 +2000,14 @@ class MockFiroWallet extends _i1.Mock implements _i24.FiroWallet {
         returnValueForMissingStub: null,
       );
   @override
-  _i20.Future<void> updateCachedId(String? id) => (super.noSuchMethod(
+  _i21.Future<void> updateCachedId(String? id) => (super.noSuchMethod(
         Invocation.method(
           #updateCachedId,
           [id],
         ),
-        returnValue: _i20.Future<void>.value(),
-        returnValueForMissingStub: _i20.Future<void>.value(),
-      ) as _i20.Future<void>);
+        returnValue: _i21.Future<void>.value(),
+        returnValueForMissingStub: _i21.Future<void>.value(),
+      ) as _i21.Future<void>);
   @override
   int getCachedChainHeight() => (super.noSuchMethod(
         Invocation.method(
@@ -1998,14 +2017,14 @@ class MockFiroWallet extends _i1.Mock implements _i24.FiroWallet {
         returnValue: 0,
       ) as int);
   @override
-  _i20.Future<void> updateCachedChainHeight(int? height) => (super.noSuchMethod(
+  _i21.Future<void> updateCachedChainHeight(int? height) => (super.noSuchMethod(
         Invocation.method(
           #updateCachedChainHeight,
           [height],
         ),
-        returnValue: _i20.Future<void>.value(),
-        returnValueForMissingStub: _i20.Future<void>.value(),
-      ) as _i20.Future<void>);
+        returnValue: _i21.Future<void>.value(),
+        returnValueForMissingStub: _i21.Future<void>.value(),
+      ) as _i21.Future<void>);
   @override
   bool getCachedIsFavorite() => (super.noSuchMethod(
         Invocation.method(
@@ -2015,15 +2034,15 @@ class MockFiroWallet extends _i1.Mock implements _i24.FiroWallet {
         returnValue: false,
       ) as bool);
   @override
-  _i20.Future<void> updateCachedIsFavorite(bool? isFavorite) =>
+  _i21.Future<void> updateCachedIsFavorite(bool? isFavorite) =>
       (super.noSuchMethod(
         Invocation.method(
           #updateCachedIsFavorite,
           [isFavorite],
         ),
-        returnValue: _i20.Future<void>.value(),
-        returnValueForMissingStub: _i20.Future<void>.value(),
-      ) as _i20.Future<void>);
+        returnValue: _i21.Future<void>.value(),
+        returnValueForMissingStub: _i21.Future<void>.value(),
+      ) as _i21.Future<void>);
   @override
   _i9.Balance getCachedBalance() => (super.noSuchMethod(
         Invocation.method(
@@ -2039,15 +2058,15 @@ class MockFiroWallet extends _i1.Mock implements _i24.FiroWallet {
         ),
       ) as _i9.Balance);
   @override
-  _i20.Future<void> updateCachedBalance(_i9.Balance? balance) =>
+  _i21.Future<void> updateCachedBalance(_i9.Balance? balance) =>
       (super.noSuchMethod(
         Invocation.method(
           #updateCachedBalance,
           [balance],
         ),
-        returnValue: _i20.Future<void>.value(),
-        returnValueForMissingStub: _i20.Future<void>.value(),
-      ) as _i20.Future<void>);
+        returnValue: _i21.Future<void>.value(),
+        returnValueForMissingStub: _i21.Future<void>.value(),
+      ) as _i21.Future<void>);
   @override
   _i9.Balance getCachedBalanceSecondary() => (super.noSuchMethod(
         Invocation.method(
@@ -2063,15 +2082,15 @@ class MockFiroWallet extends _i1.Mock implements _i24.FiroWallet {
         ),
       ) as _i9.Balance);
   @override
-  _i20.Future<void> updateCachedBalanceSecondary(_i9.Balance? balance) =>
+  _i21.Future<void> updateCachedBalanceSecondary(_i9.Balance? balance) =>
       (super.noSuchMethod(
         Invocation.method(
           #updateCachedBalanceSecondary,
           [balance],
         ),
-        returnValue: _i20.Future<void>.value(),
-        returnValueForMissingStub: _i20.Future<void>.value(),
-      ) as _i20.Future<void>);
+        returnValue: _i21.Future<void>.value(),
+        returnValueForMissingStub: _i21.Future<void>.value(),
+      ) as _i21.Future<void>);
   @override
   List<String> getWalletTokenContractAddresses() => (super.noSuchMethod(
         Invocation.method(
@@ -2081,16 +2100,16 @@ class MockFiroWallet extends _i1.Mock implements _i24.FiroWallet {
         returnValue: <String>[],
       ) as List<String>);
   @override
-  _i20.Future<void> updateWalletTokenContractAddresses(
+  _i21.Future<void> updateWalletTokenContractAddresses(
           List<String>? contractAddresses) =>
       (super.noSuchMethod(
         Invocation.method(
           #updateWalletTokenContractAddresses,
           [contractAddresses],
         ),
-        returnValue: _i20.Future<void>.value(),
-        returnValueForMissingStub: _i20.Future<void>.value(),
-      ) as _i20.Future<void>);
+        returnValue: _i21.Future<void>.value(),
+        returnValueForMissingStub: _i21.Future<void>.value(),
+      ) as _i21.Future<void>);
   @override
   void initWalletDB({_i14.MainDB? mockableOverride}) => super.noSuchMethod(
         Invocation.method(
@@ -2105,7 +2124,7 @@ class MockFiroWallet extends _i1.Mock implements _i24.FiroWallet {
 /// A class which mocks [LocaleService].
 ///
 /// See the documentation for Mockito's code generation for more information.
-class MockLocaleService extends _i1.Mock implements _i26.LocaleService {
+class MockLocaleService extends _i1.Mock implements _i27.LocaleService {
   MockLocaleService() {
     _i1.throwOnMissingStub(this);
   }
@@ -2121,17 +2140,17 @@ class MockLocaleService extends _i1.Mock implements _i26.LocaleService {
         returnValue: false,
       ) as bool);
   @override
-  _i20.Future<void> loadLocale({bool? notify = true}) => (super.noSuchMethod(
+  _i21.Future<void> loadLocale({bool? notify = true}) => (super.noSuchMethod(
         Invocation.method(
           #loadLocale,
           [],
           {#notify: notify},
         ),
-        returnValue: _i20.Future<void>.value(),
-        returnValueForMissingStub: _i20.Future<void>.value(),
-      ) as _i20.Future<void>);
+        returnValue: _i21.Future<void>.value(),
+        returnValueForMissingStub: _i21.Future<void>.value(),
+      ) as _i21.Future<void>);
   @override
-  void addListener(_i22.VoidCallback? listener) => super.noSuchMethod(
+  void addListener(_i23.VoidCallback? listener) => super.noSuchMethod(
         Invocation.method(
           #addListener,
           [listener],
@@ -2139,7 +2158,7 @@ class MockLocaleService extends _i1.Mock implements _i26.LocaleService {
         returnValueForMissingStub: null,
       );
   @override
-  void removeListener(_i22.VoidCallback? listener) => super.noSuchMethod(
+  void removeListener(_i23.VoidCallback? listener) => super.noSuchMethod(
         Invocation.method(
           #removeListener,
           [listener],
@@ -2167,7 +2186,7 @@ class MockLocaleService extends _i1.Mock implements _i26.LocaleService {
 /// A class which mocks [Prefs].
 ///
 /// See the documentation for Mockito's code generation for more information.
-class MockPrefs extends _i1.Mock implements _i21.Prefs {
+class MockPrefs extends _i1.Mock implements _i22.Prefs {
   MockPrefs() {
     _i1.throwOnMissingStub(this);
   }
@@ -2223,12 +2242,12 @@ class MockPrefs extends _i1.Mock implements _i21.Prefs {
         returnValueForMissingStub: null,
       );
   @override
-  _i27.SyncingType get syncType => (super.noSuchMethod(
+  _i28.SyncingType get syncType => (super.noSuchMethod(
         Invocation.getter(#syncType),
-        returnValue: _i27.SyncingType.currentWalletOnly,
-      ) as _i27.SyncingType);
+        returnValue: _i28.SyncingType.currentWalletOnly,
+      ) as _i28.SyncingType);
   @override
-  set syncType(_i27.SyncingType? syncType) => super.noSuchMethod(
+  set syncType(_i28.SyncingType? syncType) => super.noSuchMethod(
         Invocation.setter(
           #syncType,
           syncType,
@@ -2387,12 +2406,12 @@ class MockPrefs extends _i1.Mock implements _i21.Prefs {
         returnValueForMissingStub: null,
       );
   @override
-  _i28.BackupFrequencyType get backupFrequencyType => (super.noSuchMethod(
+  _i29.BackupFrequencyType get backupFrequencyType => (super.noSuchMethod(
         Invocation.getter(#backupFrequencyType),
-        returnValue: _i28.BackupFrequencyType.everyTenMinutes,
-      ) as _i28.BackupFrequencyType);
+        returnValue: _i29.BackupFrequencyType.everyTenMinutes,
+      ) as _i29.BackupFrequencyType);
   @override
-  set backupFrequencyType(_i28.BackupFrequencyType? backupFrequencyType) =>
+  set backupFrequencyType(_i29.BackupFrequencyType? backupFrequencyType) =>
       super.noSuchMethod(
         Invocation.setter(
           #backupFrequencyType,
@@ -2538,66 +2557,82 @@ class MockPrefs extends _i1.Mock implements _i21.Prefs {
         returnValueForMissingStub: null,
       );
   @override
+  _i15.FusionInfo get fusionServerInfo => (super.noSuchMethod(
+        Invocation.getter(#fusionServerInfo),
+        returnValue: _FakeFusionInfo_12(
+          this,
+          Invocation.getter(#fusionServerInfo),
+        ),
+      ) as _i15.FusionInfo);
+  @override
+  set fusionServerInfo(_i15.FusionInfo? fusionServerInfo) => super.noSuchMethod(
+        Invocation.setter(
+          #fusionServerInfo,
+          fusionServerInfo,
+        ),
+        returnValueForMissingStub: null,
+      );
+  @override
   bool get hasListeners => (super.noSuchMethod(
         Invocation.getter(#hasListeners),
         returnValue: false,
       ) as bool);
   @override
-  _i20.Future<void> init() => (super.noSuchMethod(
+  _i21.Future<void> init() => (super.noSuchMethod(
         Invocation.method(
           #init,
           [],
         ),
-        returnValue: _i20.Future<void>.value(),
-        returnValueForMissingStub: _i20.Future<void>.value(),
-      ) as _i20.Future<void>);
+        returnValue: _i21.Future<void>.value(),
+        returnValueForMissingStub: _i21.Future<void>.value(),
+      ) as _i21.Future<void>);
   @override
-  _i20.Future<void> incrementCurrentNotificationIndex() => (super.noSuchMethod(
+  _i21.Future<void> incrementCurrentNotificationIndex() => (super.noSuchMethod(
         Invocation.method(
           #incrementCurrentNotificationIndex,
           [],
         ),
-        returnValue: _i20.Future<void>.value(),
-        returnValueForMissingStub: _i20.Future<void>.value(),
-      ) as _i20.Future<void>);
+        returnValue: _i21.Future<void>.value(),
+        returnValueForMissingStub: _i21.Future<void>.value(),
+      ) as _i21.Future<void>);
   @override
-  _i20.Future<bool> isExternalCallsSet() => (super.noSuchMethod(
+  _i21.Future<bool> isExternalCallsSet() => (super.noSuchMethod(
         Invocation.method(
           #isExternalCallsSet,
           [],
         ),
-        returnValue: _i20.Future<bool>.value(false),
-      ) as _i20.Future<bool>);
+        returnValue: _i21.Future<bool>.value(false),
+      ) as _i21.Future<bool>);
   @override
-  _i20.Future<void> saveUserID(String? userId) => (super.noSuchMethod(
+  _i21.Future<void> saveUserID(String? userId) => (super.noSuchMethod(
         Invocation.method(
           #saveUserID,
           [userId],
         ),
-        returnValue: _i20.Future<void>.value(),
-        returnValueForMissingStub: _i20.Future<void>.value(),
-      ) as _i20.Future<void>);
+        returnValue: _i21.Future<void>.value(),
+        returnValueForMissingStub: _i21.Future<void>.value(),
+      ) as _i21.Future<void>);
   @override
-  _i20.Future<void> saveSignupEpoch(int? signupEpoch) => (super.noSuchMethod(
+  _i21.Future<void> saveSignupEpoch(int? signupEpoch) => (super.noSuchMethod(
         Invocation.method(
           #saveSignupEpoch,
           [signupEpoch],
         ),
-        returnValue: _i20.Future<void>.value(),
-        returnValueForMissingStub: _i20.Future<void>.value(),
-      ) as _i20.Future<void>);
+        returnValue: _i21.Future<void>.value(),
+        returnValueForMissingStub: _i21.Future<void>.value(),
+      ) as _i21.Future<void>);
   @override
-  _i29.AmountUnit amountUnit(_i19.Coin? coin) => (super.noSuchMethod(
+  _i30.AmountUnit amountUnit(_i20.Coin? coin) => (super.noSuchMethod(
         Invocation.method(
           #amountUnit,
           [coin],
         ),
-        returnValue: _i29.AmountUnit.normal,
-      ) as _i29.AmountUnit);
+        returnValue: _i30.AmountUnit.normal,
+      ) as _i30.AmountUnit);
   @override
   void updateAmountUnit({
-    required _i19.Coin? coin,
-    required _i29.AmountUnit? amountUnit,
+    required _i20.Coin? coin,
+    required _i30.AmountUnit? amountUnit,
   }) =>
       super.noSuchMethod(
         Invocation.method(
@@ -2611,7 +2646,7 @@ class MockPrefs extends _i1.Mock implements _i21.Prefs {
         returnValueForMissingStub: null,
       );
   @override
-  int maxDecimals(_i19.Coin? coin) => (super.noSuchMethod(
+  int maxDecimals(_i20.Coin? coin) => (super.noSuchMethod(
         Invocation.method(
           #maxDecimals,
           [coin],
@@ -2620,7 +2655,7 @@ class MockPrefs extends _i1.Mock implements _i21.Prefs {
       ) as int);
   @override
   void updateMaxDecimals({
-    required _i19.Coin? coin,
+    required _i20.Coin? coin,
     required int? maxDecimals,
   }) =>
       super.noSuchMethod(
@@ -2635,7 +2670,7 @@ class MockPrefs extends _i1.Mock implements _i21.Prefs {
         returnValueForMissingStub: null,
       );
   @override
-  void addListener(_i22.VoidCallback? listener) => super.noSuchMethod(
+  void addListener(_i23.VoidCallback? listener) => super.noSuchMethod(
         Invocation.method(
           #addListener,
           [listener],
@@ -2643,7 +2678,7 @@ class MockPrefs extends _i1.Mock implements _i21.Prefs {
         returnValueForMissingStub: null,
       );
   @override
-  void removeListener(_i22.VoidCallback? listener) => super.noSuchMethod(
+  void removeListener(_i23.VoidCallback? listener) => super.noSuchMethod(
         Invocation.method(
           #removeListener,
           [listener],
@@ -2671,7 +2706,7 @@ class MockPrefs extends _i1.Mock implements _i21.Prefs {
 /// A class which mocks [PriceService].
 ///
 /// See the documentation for Mockito's code generation for more information.
-class MockPriceService extends _i1.Mock implements _i30.PriceService {
+class MockPriceService extends _i1.Mock implements _i31.PriceService {
   MockPriceService() {
     _i1.throwOnMissingStub(this);
   }
@@ -2697,7 +2732,7 @@ class MockPriceService extends _i1.Mock implements _i30.PriceService {
   @override
   Duration get updateInterval => (super.noSuchMethod(
         Invocation.getter(#updateInterval),
-        returnValue: _FakeDuration_12(
+        returnValue: _FakeDuration_13(
           this,
           Invocation.getter(#updateInterval),
         ),
@@ -2708,44 +2743,44 @@ class MockPriceService extends _i1.Mock implements _i30.PriceService {
         returnValue: false,
       ) as bool);
   @override
-  _i15.Tuple2<_i31.Decimal, double> getPrice(_i19.Coin? coin) =>
+  _i16.Tuple2<_i32.Decimal, double> getPrice(_i20.Coin? coin) =>
       (super.noSuchMethod(
         Invocation.method(
           #getPrice,
           [coin],
         ),
-        returnValue: _FakeTuple2_13<_i31.Decimal, double>(
+        returnValue: _FakeTuple2_14<_i32.Decimal, double>(
           this,
           Invocation.method(
             #getPrice,
             [coin],
           ),
         ),
-      ) as _i15.Tuple2<_i31.Decimal, double>);
+      ) as _i16.Tuple2<_i32.Decimal, double>);
   @override
-  _i15.Tuple2<_i31.Decimal, double> getTokenPrice(String? contractAddress) =>
+  _i16.Tuple2<_i32.Decimal, double> getTokenPrice(String? contractAddress) =>
       (super.noSuchMethod(
         Invocation.method(
           #getTokenPrice,
           [contractAddress],
         ),
-        returnValue: _FakeTuple2_13<_i31.Decimal, double>(
+        returnValue: _FakeTuple2_14<_i32.Decimal, double>(
           this,
           Invocation.method(
             #getTokenPrice,
             [contractAddress],
           ),
         ),
-      ) as _i15.Tuple2<_i31.Decimal, double>);
+      ) as _i16.Tuple2<_i32.Decimal, double>);
   @override
-  _i20.Future<void> updatePrice() => (super.noSuchMethod(
+  _i21.Future<void> updatePrice() => (super.noSuchMethod(
         Invocation.method(
           #updatePrice,
           [],
         ),
-        returnValue: _i20.Future<void>.value(),
-        returnValueForMissingStub: _i20.Future<void>.value(),
-      ) as _i20.Future<void>);
+        returnValue: _i21.Future<void>.value(),
+        returnValueForMissingStub: _i21.Future<void>.value(),
+      ) as _i21.Future<void>);
   @override
   void cancel() => super.noSuchMethod(
         Invocation.method(
@@ -2771,7 +2806,7 @@ class MockPriceService extends _i1.Mock implements _i30.PriceService {
         returnValueForMissingStub: null,
       );
   @override
-  void addListener(_i22.VoidCallback? listener) => super.noSuchMethod(
+  void addListener(_i23.VoidCallback? listener) => super.noSuchMethod(
         Invocation.method(
           #addListener,
           [listener],
@@ -2779,7 +2814,7 @@ class MockPriceService extends _i1.Mock implements _i30.PriceService {
         returnValueForMissingStub: null,
       );
   @override
-  void removeListener(_i22.VoidCallback? listener) => super.noSuchMethod(
+  void removeListener(_i23.VoidCallback? listener) => super.noSuchMethod(
         Invocation.method(
           #removeListener,
           [listener],
@@ -2799,7 +2834,7 @@ class MockPriceService extends _i1.Mock implements _i30.PriceService {
 /// A class which mocks [NotesService].
 ///
 /// See the documentation for Mockito's code generation for more information.
-class MockNotesService extends _i1.Mock implements _i32.NotesService {
+class MockNotesService extends _i1.Mock implements _i33.NotesService {
   MockNotesService() {
     _i1.throwOnMissingStub(this);
   }
@@ -2815,35 +2850,35 @@ class MockNotesService extends _i1.Mock implements _i32.NotesService {
         returnValue: <String, String>{},
       ) as Map<String, String>);
   @override
-  _i20.Future<Map<String, String>> get notes => (super.noSuchMethod(
+  _i21.Future<Map<String, String>> get notes => (super.noSuchMethod(
         Invocation.getter(#notes),
-        returnValue: _i20.Future<Map<String, String>>.value(<String, String>{}),
-      ) as _i20.Future<Map<String, String>>);
+        returnValue: _i21.Future<Map<String, String>>.value(<String, String>{}),
+      ) as _i21.Future<Map<String, String>>);
   @override
   bool get hasListeners => (super.noSuchMethod(
         Invocation.getter(#hasListeners),
         returnValue: false,
       ) as bool);
   @override
-  _i20.Future<Map<String, String>> search(String? text) => (super.noSuchMethod(
+  _i21.Future<Map<String, String>> search(String? text) => (super.noSuchMethod(
         Invocation.method(
           #search,
           [text],
         ),
-        returnValue: _i20.Future<Map<String, String>>.value(<String, String>{}),
-      ) as _i20.Future<Map<String, String>>);
+        returnValue: _i21.Future<Map<String, String>>.value(<String, String>{}),
+      ) as _i21.Future<Map<String, String>>);
   @override
-  _i20.Future<String> getNoteFor({required String? txid}) =>
+  _i21.Future<String> getNoteFor({required String? txid}) =>
       (super.noSuchMethod(
         Invocation.method(
           #getNoteFor,
           [],
           {#txid: txid},
         ),
-        returnValue: _i20.Future<String>.value(''),
-      ) as _i20.Future<String>);
+        returnValue: _i21.Future<String>.value(''),
+      ) as _i21.Future<String>);
   @override
-  _i20.Future<void> editOrAddNote({
+  _i21.Future<void> editOrAddNote({
     required String? txid,
     required String? note,
   }) =>
@@ -2856,21 +2891,21 @@ class MockNotesService extends _i1.Mock implements _i32.NotesService {
             #note: note,
           },
         ),
-        returnValue: _i20.Future<void>.value(),
-        returnValueForMissingStub: _i20.Future<void>.value(),
-      ) as _i20.Future<void>);
+        returnValue: _i21.Future<void>.value(),
+        returnValueForMissingStub: _i21.Future<void>.value(),
+      ) as _i21.Future<void>);
   @override
-  _i20.Future<void> deleteNote({required String? txid}) => (super.noSuchMethod(
+  _i21.Future<void> deleteNote({required String? txid}) => (super.noSuchMethod(
         Invocation.method(
           #deleteNote,
           [],
           {#txid: txid},
         ),
-        returnValue: _i20.Future<void>.value(),
-        returnValueForMissingStub: _i20.Future<void>.value(),
-      ) as _i20.Future<void>);
+        returnValue: _i21.Future<void>.value(),
+        returnValueForMissingStub: _i21.Future<void>.value(),
+      ) as _i21.Future<void>);
   @override
-  void addListener(_i22.VoidCallback? listener) => super.noSuchMethod(
+  void addListener(_i23.VoidCallback? listener) => super.noSuchMethod(
         Invocation.method(
           #addListener,
           [listener],
@@ -2878,7 +2913,7 @@ class MockNotesService extends _i1.Mock implements _i32.NotesService {
         returnValueForMissingStub: null,
       );
   @override
-  void removeListener(_i22.VoidCallback? listener) => super.noSuchMethod(
+  void removeListener(_i23.VoidCallback? listener) => super.noSuchMethod(
         Invocation.method(
           #removeListener,
           [listener],
@@ -2906,21 +2941,21 @@ class MockNotesService extends _i1.Mock implements _i32.NotesService {
 /// A class which mocks [ThemeService].
 ///
 /// See the documentation for Mockito's code generation for more information.
-class MockThemeService extends _i1.Mock implements _i33.ThemeService {
+class MockThemeService extends _i1.Mock implements _i34.ThemeService {
   MockThemeService() {
     _i1.throwOnMissingStub(this);
   }
 
   @override
-  _i16.HTTP get client => (super.noSuchMethod(
+  _i17.HTTP get client => (super.noSuchMethod(
         Invocation.getter(#client),
-        returnValue: _FakeHTTP_14(
+        returnValue: _FakeHTTP_15(
           this,
           Invocation.getter(#client),
         ),
-      ) as _i16.HTTP);
+      ) as _i17.HTTP);
   @override
-  set client(_i16.HTTP? _client) => super.noSuchMethod(
+  set client(_i17.HTTP? _client) => super.noSuchMethod(
         Invocation.setter(
           #client,
           _client,
@@ -2936,10 +2971,10 @@ class MockThemeService extends _i1.Mock implements _i33.ThemeService {
         ),
       ) as _i14.MainDB);
   @override
-  List<_i34.StackTheme> get installedThemes => (super.noSuchMethod(
+  List<_i35.StackTheme> get installedThemes => (super.noSuchMethod(
         Invocation.getter(#installedThemes),
-        returnValue: <_i34.StackTheme>[],
-      ) as List<_i34.StackTheme>);
+        returnValue: <_i35.StackTheme>[],
+      ) as List<_i35.StackTheme>);
   @override
   void init(_i14.MainDB? db) => super.noSuchMethod(
         Invocation.method(
@@ -2949,73 +2984,73 @@ class MockThemeService extends _i1.Mock implements _i33.ThemeService {
         returnValueForMissingStub: null,
       );
   @override
-  _i20.Future<void> install({required _i35.Uint8List? themeArchiveData}) =>
+  _i21.Future<void> install({required _i36.Uint8List? themeArchiveData}) =>
       (super.noSuchMethod(
         Invocation.method(
           #install,
           [],
           {#themeArchiveData: themeArchiveData},
         ),
-        returnValue: _i20.Future<void>.value(),
-        returnValueForMissingStub: _i20.Future<void>.value(),
-      ) as _i20.Future<void>);
+        returnValue: _i21.Future<void>.value(),
+        returnValueForMissingStub: _i21.Future<void>.value(),
+      ) as _i21.Future<void>);
   @override
-  _i20.Future<void> remove({required String? themeId}) => (super.noSuchMethod(
+  _i21.Future<void> remove({required String? themeId}) => (super.noSuchMethod(
         Invocation.method(
           #remove,
           [],
           {#themeId: themeId},
         ),
-        returnValue: _i20.Future<void>.value(),
-        returnValueForMissingStub: _i20.Future<void>.value(),
-      ) as _i20.Future<void>);
+        returnValue: _i21.Future<void>.value(),
+        returnValueForMissingStub: _i21.Future<void>.value(),
+      ) as _i21.Future<void>);
   @override
-  _i20.Future<void> checkDefaultThemesOnStartup() => (super.noSuchMethod(
+  _i21.Future<void> checkDefaultThemesOnStartup() => (super.noSuchMethod(
         Invocation.method(
           #checkDefaultThemesOnStartup,
           [],
         ),
-        returnValue: _i20.Future<void>.value(),
-        returnValueForMissingStub: _i20.Future<void>.value(),
-      ) as _i20.Future<void>);
+        returnValue: _i21.Future<void>.value(),
+        returnValueForMissingStub: _i21.Future<void>.value(),
+      ) as _i21.Future<void>);
   @override
-  _i20.Future<bool> verifyInstalled({required String? themeId}) =>
+  _i21.Future<bool> verifyInstalled({required String? themeId}) =>
       (super.noSuchMethod(
         Invocation.method(
           #verifyInstalled,
           [],
           {#themeId: themeId},
         ),
-        returnValue: _i20.Future<bool>.value(false),
-      ) as _i20.Future<bool>);
+        returnValue: _i21.Future<bool>.value(false),
+      ) as _i21.Future<bool>);
   @override
-  _i20.Future<List<_i33.StackThemeMetaData>> fetchThemes() =>
+  _i21.Future<List<_i34.StackThemeMetaData>> fetchThemes() =>
       (super.noSuchMethod(
         Invocation.method(
           #fetchThemes,
           [],
         ),
-        returnValue: _i20.Future<List<_i33.StackThemeMetaData>>.value(
-            <_i33.StackThemeMetaData>[]),
-      ) as _i20.Future<List<_i33.StackThemeMetaData>>);
+        returnValue: _i21.Future<List<_i34.StackThemeMetaData>>.value(
+            <_i34.StackThemeMetaData>[]),
+      ) as _i21.Future<List<_i34.StackThemeMetaData>>);
   @override
-  _i20.Future<_i35.Uint8List> fetchTheme(
-          {required _i33.StackThemeMetaData? themeMetaData}) =>
+  _i21.Future<_i36.Uint8List> fetchTheme(
+          {required _i34.StackThemeMetaData? themeMetaData}) =>
       (super.noSuchMethod(
         Invocation.method(
           #fetchTheme,
           [],
           {#themeMetaData: themeMetaData},
         ),
-        returnValue: _i20.Future<_i35.Uint8List>.value(_i35.Uint8List(0)),
-      ) as _i20.Future<_i35.Uint8List>);
+        returnValue: _i21.Future<_i36.Uint8List>.value(_i36.Uint8List(0)),
+      ) as _i21.Future<_i36.Uint8List>);
   @override
-  _i34.StackTheme? getTheme({required String? themeId}) =>
+  _i35.StackTheme? getTheme({required String? themeId}) =>
       (super.noSuchMethod(Invocation.method(
         #getTheme,
         [],
         {#themeId: themeId},
-      )) as _i34.StackTheme?);
+      )) as _i35.StackTheme?);
 }
 
 /// A class which mocks [MainDB].
@@ -3027,131 +3062,131 @@ class MockMainDB extends _i1.Mock implements _i14.MainDB {
   }
 
   @override
-  _i17.Isar get isar => (super.noSuchMethod(
+  _i18.Isar get isar => (super.noSuchMethod(
         Invocation.getter(#isar),
-        returnValue: _FakeIsar_15(
+        returnValue: _FakeIsar_16(
           this,
           Invocation.getter(#isar),
         ),
-      ) as _i17.Isar);
+      ) as _i18.Isar);
   @override
-  _i20.Future<bool> initMainDB({_i17.Isar? mock}) => (super.noSuchMethod(
+  _i21.Future<bool> initMainDB({_i18.Isar? mock}) => (super.noSuchMethod(
         Invocation.method(
           #initMainDB,
           [],
           {#mock: mock},
         ),
-        returnValue: _i20.Future<bool>.value(false),
-      ) as _i20.Future<bool>);
+        returnValue: _i21.Future<bool>.value(false),
+      ) as _i21.Future<bool>);
   @override
-  List<_i36.ContactEntry> getContactEntries() => (super.noSuchMethod(
+  List<_i37.ContactEntry> getContactEntries() => (super.noSuchMethod(
         Invocation.method(
           #getContactEntries,
           [],
         ),
-        returnValue: <_i36.ContactEntry>[],
-      ) as List<_i36.ContactEntry>);
+        returnValue: <_i37.ContactEntry>[],
+      ) as List<_i37.ContactEntry>);
   @override
-  _i20.Future<bool> deleteContactEntry({required String? id}) =>
+  _i21.Future<bool> deleteContactEntry({required String? id}) =>
       (super.noSuchMethod(
         Invocation.method(
           #deleteContactEntry,
           [],
           {#id: id},
         ),
-        returnValue: _i20.Future<bool>.value(false),
-      ) as _i20.Future<bool>);
+        returnValue: _i21.Future<bool>.value(false),
+      ) as _i21.Future<bool>);
   @override
-  _i20.Future<bool> isContactEntryExists({required String? id}) =>
+  _i21.Future<bool> isContactEntryExists({required String? id}) =>
       (super.noSuchMethod(
         Invocation.method(
           #isContactEntryExists,
           [],
           {#id: id},
         ),
-        returnValue: _i20.Future<bool>.value(false),
-      ) as _i20.Future<bool>);
+        returnValue: _i21.Future<bool>.value(false),
+      ) as _i21.Future<bool>);
   @override
-  _i36.ContactEntry? getContactEntry({required String? id}) =>
+  _i37.ContactEntry? getContactEntry({required String? id}) =>
       (super.noSuchMethod(Invocation.method(
         #getContactEntry,
         [],
         {#id: id},
-      )) as _i36.ContactEntry?);
+      )) as _i37.ContactEntry?);
   @override
-  _i20.Future<bool> putContactEntry(
-          {required _i36.ContactEntry? contactEntry}) =>
+  _i21.Future<bool> putContactEntry(
+          {required _i37.ContactEntry? contactEntry}) =>
       (super.noSuchMethod(
         Invocation.method(
           #putContactEntry,
           [],
           {#contactEntry: contactEntry},
         ),
-        returnValue: _i20.Future<bool>.value(false),
-      ) as _i20.Future<bool>);
+        returnValue: _i21.Future<bool>.value(false),
+      ) as _i21.Future<bool>);
   @override
-  _i37.TransactionBlockExplorer? getTransactionBlockExplorer(
-          {required _i19.Coin? coin}) =>
+  _i38.TransactionBlockExplorer? getTransactionBlockExplorer(
+          {required _i20.Coin? coin}) =>
       (super.noSuchMethod(Invocation.method(
         #getTransactionBlockExplorer,
         [],
         {#coin: coin},
-      )) as _i37.TransactionBlockExplorer?);
+      )) as _i38.TransactionBlockExplorer?);
   @override
-  _i20.Future<int> putTransactionBlockExplorer(
-          _i37.TransactionBlockExplorer? explorer) =>
+  _i21.Future<int> putTransactionBlockExplorer(
+          _i38.TransactionBlockExplorer? explorer) =>
       (super.noSuchMethod(
         Invocation.method(
           #putTransactionBlockExplorer,
           [explorer],
         ),
-        returnValue: _i20.Future<int>.value(0),
-      ) as _i20.Future<int>);
+        returnValue: _i21.Future<int>.value(0),
+      ) as _i21.Future<int>);
   @override
-  _i17.QueryBuilder<_i23.Address, _i23.Address, _i17.QAfterWhereClause>
+  _i18.QueryBuilder<_i24.Address, _i24.Address, _i18.QAfterWhereClause>
       getAddresses(String? walletId) => (super.noSuchMethod(
             Invocation.method(
               #getAddresses,
               [walletId],
             ),
-            returnValue: _FakeQueryBuilder_16<_i23.Address, _i23.Address,
-                _i17.QAfterWhereClause>(
+            returnValue: _FakeQueryBuilder_17<_i24.Address, _i24.Address,
+                _i18.QAfterWhereClause>(
               this,
               Invocation.method(
                 #getAddresses,
                 [walletId],
               ),
             ),
-          ) as _i17.QueryBuilder<_i23.Address, _i23.Address,
-              _i17.QAfterWhereClause>);
+          ) as _i18.QueryBuilder<_i24.Address, _i24.Address,
+              _i18.QAfterWhereClause>);
   @override
-  _i20.Future<int> putAddress(_i23.Address? address) => (super.noSuchMethod(
+  _i21.Future<int> putAddress(_i24.Address? address) => (super.noSuchMethod(
         Invocation.method(
           #putAddress,
           [address],
         ),
-        returnValue: _i20.Future<int>.value(0),
-      ) as _i20.Future<int>);
+        returnValue: _i21.Future<int>.value(0),
+      ) as _i21.Future<int>);
   @override
-  _i20.Future<List<int>> putAddresses(List<_i23.Address>? addresses) =>
+  _i21.Future<List<int>> putAddresses(List<_i24.Address>? addresses) =>
       (super.noSuchMethod(
         Invocation.method(
           #putAddresses,
           [addresses],
         ),
-        returnValue: _i20.Future<List<int>>.value(<int>[]),
-      ) as _i20.Future<List<int>>);
+        returnValue: _i21.Future<List<int>>.value(<int>[]),
+      ) as _i21.Future<List<int>>);
   @override
-  _i20.Future<List<int>> updateOrPutAddresses(List<_i23.Address>? addresses) =>
+  _i21.Future<List<int>> updateOrPutAddresses(List<_i24.Address>? addresses) =>
       (super.noSuchMethod(
         Invocation.method(
           #updateOrPutAddresses,
           [addresses],
         ),
-        returnValue: _i20.Future<List<int>>.value(<int>[]),
-      ) as _i20.Future<List<int>>);
+        returnValue: _i21.Future<List<int>>.value(<int>[]),
+      ) as _i21.Future<List<int>>);
   @override
-  _i20.Future<_i23.Address?> getAddress(
+  _i21.Future<_i24.Address?> getAddress(
     String? walletId,
     String? address,
   ) =>
@@ -3163,12 +3198,12 @@ class MockMainDB extends _i1.Mock implements _i14.MainDB {
             address,
           ],
         ),
-        returnValue: _i20.Future<_i23.Address?>.value(),
-      ) as _i20.Future<_i23.Address?>);
+        returnValue: _i21.Future<_i24.Address?>.value(),
+      ) as _i21.Future<_i24.Address?>);
   @override
-  _i20.Future<int> updateAddress(
-    _i23.Address? oldAddress,
-    _i23.Address? newAddress,
+  _i21.Future<int> updateAddress(
+    _i24.Address? oldAddress,
+    _i24.Address? newAddress,
   ) =>
       (super.noSuchMethod(
         Invocation.method(
@@ -3178,46 +3213,46 @@ class MockMainDB extends _i1.Mock implements _i14.MainDB {
             newAddress,
           ],
         ),
-        returnValue: _i20.Future<int>.value(0),
-      ) as _i20.Future<int>);
+        returnValue: _i21.Future<int>.value(0),
+      ) as _i21.Future<int>);
   @override
-  _i17.QueryBuilder<_i23.Transaction, _i23.Transaction, _i17.QAfterWhereClause>
+  _i18.QueryBuilder<_i24.Transaction, _i24.Transaction, _i18.QAfterWhereClause>
       getTransactions(String? walletId) => (super.noSuchMethod(
             Invocation.method(
               #getTransactions,
               [walletId],
             ),
-            returnValue: _FakeQueryBuilder_16<_i23.Transaction,
-                _i23.Transaction, _i17.QAfterWhereClause>(
+            returnValue: _FakeQueryBuilder_17<_i24.Transaction,
+                _i24.Transaction, _i18.QAfterWhereClause>(
               this,
               Invocation.method(
                 #getTransactions,
                 [walletId],
               ),
             ),
-          ) as _i17.QueryBuilder<_i23.Transaction, _i23.Transaction,
-              _i17.QAfterWhereClause>);
+          ) as _i18.QueryBuilder<_i24.Transaction, _i24.Transaction,
+              _i18.QAfterWhereClause>);
   @override
-  _i20.Future<int> putTransaction(_i23.Transaction? transaction) =>
+  _i21.Future<int> putTransaction(_i24.Transaction? transaction) =>
       (super.noSuchMethod(
         Invocation.method(
           #putTransaction,
           [transaction],
         ),
-        returnValue: _i20.Future<int>.value(0),
-      ) as _i20.Future<int>);
+        returnValue: _i21.Future<int>.value(0),
+      ) as _i21.Future<int>);
   @override
-  _i20.Future<List<int>> putTransactions(
-          List<_i23.Transaction>? transactions) =>
+  _i21.Future<List<int>> putTransactions(
+          List<_i24.Transaction>? transactions) =>
       (super.noSuchMethod(
         Invocation.method(
           #putTransactions,
           [transactions],
         ),
-        returnValue: _i20.Future<List<int>>.value(<int>[]),
-      ) as _i20.Future<List<int>>);
+        returnValue: _i21.Future<List<int>>.value(<int>[]),
+      ) as _i21.Future<List<int>>);
   @override
-  _i20.Future<_i23.Transaction?> getTransaction(
+  _i21.Future<_i24.Transaction?> getTransaction(
     String? walletId,
     String? txid,
   ) =>
@@ -3229,10 +3264,10 @@ class MockMainDB extends _i1.Mock implements _i14.MainDB {
             txid,
           ],
         ),
-        returnValue: _i20.Future<_i23.Transaction?>.value(),
-      ) as _i20.Future<_i23.Transaction?>);
+        returnValue: _i21.Future<_i24.Transaction?>.value(),
+      ) as _i21.Future<_i24.Transaction?>);
   @override
-  _i20.Stream<_i23.Transaction?> watchTransaction({
+  _i21.Stream<_i24.Transaction?> watchTransaction({
     required int? id,
     bool? fireImmediately = false,
   }) =>
@@ -3245,10 +3280,10 @@ class MockMainDB extends _i1.Mock implements _i14.MainDB {
             #fireImmediately: fireImmediately,
           },
         ),
-        returnValue: _i20.Stream<_i23.Transaction?>.empty(),
-      ) as _i20.Stream<_i23.Transaction?>);
+        returnValue: _i21.Stream<_i24.Transaction?>.empty(),
+      ) as _i21.Stream<_i24.Transaction?>);
   @override
-  _i17.QueryBuilder<_i23.UTXO, _i23.UTXO, _i17.QAfterWhereClause> getUTXOs(
+  _i18.QueryBuilder<_i24.UTXO, _i24.UTXO, _i18.QAfterWhereClause> getUTXOs(
           String? walletId) =>
       (super.noSuchMethod(
         Invocation.method(
@@ -3256,36 +3291,63 @@ class MockMainDB extends _i1.Mock implements _i14.MainDB {
           [walletId],
         ),
         returnValue:
-            _FakeQueryBuilder_16<_i23.UTXO, _i23.UTXO, _i17.QAfterWhereClause>(
+            _FakeQueryBuilder_17<_i24.UTXO, _i24.UTXO, _i18.QAfterWhereClause>(
           this,
           Invocation.method(
             #getUTXOs,
             [walletId],
           ),
         ),
-      ) as _i17.QueryBuilder<_i23.UTXO, _i23.UTXO, _i17.QAfterWhereClause>);
+      ) as _i18.QueryBuilder<_i24.UTXO, _i24.UTXO, _i18.QAfterWhereClause>);
   @override
-  _i20.Future<void> putUTXO(_i23.UTXO? utxo) => (super.noSuchMethod(
+  _i18.QueryBuilder<_i24.UTXO, _i24.UTXO, _i18.QAfterFilterCondition>
+      getUTXOsByAddress(
+    String? walletId,
+    String? address,
+  ) =>
+          (super.noSuchMethod(
+            Invocation.method(
+              #getUTXOsByAddress,
+              [
+                walletId,
+                address,
+              ],
+            ),
+            returnValue: _FakeQueryBuilder_17<_i24.UTXO, _i24.UTXO,
+                _i18.QAfterFilterCondition>(
+              this,
+              Invocation.method(
+                #getUTXOsByAddress,
+                [
+                  walletId,
+                  address,
+                ],
+              ),
+            ),
+          ) as _i18
+              .QueryBuilder<_i24.UTXO, _i24.UTXO, _i18.QAfterFilterCondition>);
+  @override
+  _i21.Future<void> putUTXO(_i24.UTXO? utxo) => (super.noSuchMethod(
         Invocation.method(
           #putUTXO,
           [utxo],
         ),
-        returnValue: _i20.Future<void>.value(),
-        returnValueForMissingStub: _i20.Future<void>.value(),
-      ) as _i20.Future<void>);
+        returnValue: _i21.Future<void>.value(),
+        returnValueForMissingStub: _i21.Future<void>.value(),
+      ) as _i21.Future<void>);
   @override
-  _i20.Future<void> putUTXOs(List<_i23.UTXO>? utxos) => (super.noSuchMethod(
+  _i21.Future<void> putUTXOs(List<_i24.UTXO>? utxos) => (super.noSuchMethod(
         Invocation.method(
           #putUTXOs,
           [utxos],
         ),
-        returnValue: _i20.Future<void>.value(),
-        returnValueForMissingStub: _i20.Future<void>.value(),
-      ) as _i20.Future<void>);
+        returnValue: _i21.Future<void>.value(),
+        returnValueForMissingStub: _i21.Future<void>.value(),
+      ) as _i21.Future<void>);
   @override
-  _i20.Future<bool> updateUTXOs(
+  _i21.Future<bool> updateUTXOs(
     String? walletId,
-    List<_i23.UTXO>? utxos,
+    List<_i24.UTXO>? utxos,
   ) =>
       (super.noSuchMethod(
         Invocation.method(
@@ -3295,10 +3357,10 @@ class MockMainDB extends _i1.Mock implements _i14.MainDB {
             utxos,
           ],
         ),
-        returnValue: _i20.Future<bool>.value(false),
-      ) as _i20.Future<bool>);
+        returnValue: _i21.Future<bool>.value(false),
+      ) as _i21.Future<bool>);
   @override
-  _i20.Stream<_i23.UTXO?> watchUTXO({
+  _i21.Stream<_i24.UTXO?> watchUTXO({
     required int? id,
     bool? fireImmediately = false,
   }) =>
@@ -3311,50 +3373,50 @@ class MockMainDB extends _i1.Mock implements _i14.MainDB {
             #fireImmediately: fireImmediately,
           },
         ),
-        returnValue: _i20.Stream<_i23.UTXO?>.empty(),
-      ) as _i20.Stream<_i23.UTXO?>);
+        returnValue: _i21.Stream<_i24.UTXO?>.empty(),
+      ) as _i21.Stream<_i24.UTXO?>);
   @override
-  _i17.QueryBuilder<_i23.TransactionNote, _i23.TransactionNote,
-      _i17.QAfterWhereClause> getTransactionNotes(
+  _i18.QueryBuilder<_i24.TransactionNote, _i24.TransactionNote,
+      _i18.QAfterWhereClause> getTransactionNotes(
           String? walletId) =>
       (super.noSuchMethod(
         Invocation.method(
           #getTransactionNotes,
           [walletId],
         ),
-        returnValue: _FakeQueryBuilder_16<_i23.TransactionNote,
-            _i23.TransactionNote, _i17.QAfterWhereClause>(
+        returnValue: _FakeQueryBuilder_17<_i24.TransactionNote,
+            _i24.TransactionNote, _i18.QAfterWhereClause>(
           this,
           Invocation.method(
             #getTransactionNotes,
             [walletId],
           ),
         ),
-      ) as _i17.QueryBuilder<_i23.TransactionNote, _i23.TransactionNote,
-          _i17.QAfterWhereClause>);
+      ) as _i18.QueryBuilder<_i24.TransactionNote, _i24.TransactionNote,
+          _i18.QAfterWhereClause>);
   @override
-  _i20.Future<void> putTransactionNote(_i23.TransactionNote? transactionNote) =>
+  _i21.Future<void> putTransactionNote(_i24.TransactionNote? transactionNote) =>
       (super.noSuchMethod(
         Invocation.method(
           #putTransactionNote,
           [transactionNote],
         ),
-        returnValue: _i20.Future<void>.value(),
-        returnValueForMissingStub: _i20.Future<void>.value(),
-      ) as _i20.Future<void>);
+        returnValue: _i21.Future<void>.value(),
+        returnValueForMissingStub: _i21.Future<void>.value(),
+      ) as _i21.Future<void>);
   @override
-  _i20.Future<void> putTransactionNotes(
-          List<_i23.TransactionNote>? transactionNotes) =>
+  _i21.Future<void> putTransactionNotes(
+          List<_i24.TransactionNote>? transactionNotes) =>
       (super.noSuchMethod(
         Invocation.method(
           #putTransactionNotes,
           [transactionNotes],
         ),
-        returnValue: _i20.Future<void>.value(),
-        returnValueForMissingStub: _i20.Future<void>.value(),
-      ) as _i20.Future<void>);
+        returnValue: _i21.Future<void>.value(),
+        returnValueForMissingStub: _i21.Future<void>.value(),
+      ) as _i21.Future<void>);
   @override
-  _i20.Future<_i23.TransactionNote?> getTransactionNote(
+  _i21.Future<_i24.TransactionNote?> getTransactionNote(
     String? walletId,
     String? txid,
   ) =>
@@ -3366,10 +3428,10 @@ class MockMainDB extends _i1.Mock implements _i14.MainDB {
             txid,
           ],
         ),
-        returnValue: _i20.Future<_i23.TransactionNote?>.value(),
-      ) as _i20.Future<_i23.TransactionNote?>);
+        returnValue: _i21.Future<_i24.TransactionNote?>.value(),
+      ) as _i21.Future<_i24.TransactionNote?>);
   @override
-  _i20.Stream<_i23.TransactionNote?> watchTransactionNote({
+  _i21.Stream<_i24.TransactionNote?> watchTransactionNote({
     required int? id,
     bool? fireImmediately = false,
   }) =>
@@ -3382,38 +3444,38 @@ class MockMainDB extends _i1.Mock implements _i14.MainDB {
             #fireImmediately: fireImmediately,
           },
         ),
-        returnValue: _i20.Stream<_i23.TransactionNote?>.empty(),
-      ) as _i20.Stream<_i23.TransactionNote?>);
+        returnValue: _i21.Stream<_i24.TransactionNote?>.empty(),
+      ) as _i21.Stream<_i24.TransactionNote?>);
   @override
-  _i17.QueryBuilder<_i23.AddressLabel, _i23.AddressLabel,
-      _i17.QAfterWhereClause> getAddressLabels(
+  _i18.QueryBuilder<_i24.AddressLabel, _i24.AddressLabel,
+      _i18.QAfterWhereClause> getAddressLabels(
           String? walletId) =>
       (super.noSuchMethod(
         Invocation.method(
           #getAddressLabels,
           [walletId],
         ),
-        returnValue: _FakeQueryBuilder_16<_i23.AddressLabel, _i23.AddressLabel,
-            _i17.QAfterWhereClause>(
+        returnValue: _FakeQueryBuilder_17<_i24.AddressLabel, _i24.AddressLabel,
+            _i18.QAfterWhereClause>(
           this,
           Invocation.method(
             #getAddressLabels,
             [walletId],
           ),
         ),
-      ) as _i17.QueryBuilder<_i23.AddressLabel, _i23.AddressLabel,
-          _i17.QAfterWhereClause>);
+      ) as _i18.QueryBuilder<_i24.AddressLabel, _i24.AddressLabel,
+          _i18.QAfterWhereClause>);
   @override
-  _i20.Future<int> putAddressLabel(_i23.AddressLabel? addressLabel) =>
+  _i21.Future<int> putAddressLabel(_i24.AddressLabel? addressLabel) =>
       (super.noSuchMethod(
         Invocation.method(
           #putAddressLabel,
           [addressLabel],
         ),
-        returnValue: _i20.Future<int>.value(0),
-      ) as _i20.Future<int>);
+        returnValue: _i21.Future<int>.value(0),
+      ) as _i21.Future<int>);
   @override
-  int putAddressLabelSync(_i23.AddressLabel? addressLabel) =>
+  int putAddressLabelSync(_i24.AddressLabel? addressLabel) =>
       (super.noSuchMethod(
         Invocation.method(
           #putAddressLabelSync,
@@ -3422,17 +3484,17 @@ class MockMainDB extends _i1.Mock implements _i14.MainDB {
         returnValue: 0,
       ) as int);
   @override
-  _i20.Future<void> putAddressLabels(List<_i23.AddressLabel>? addressLabels) =>
+  _i21.Future<void> putAddressLabels(List<_i24.AddressLabel>? addressLabels) =>
       (super.noSuchMethod(
         Invocation.method(
           #putAddressLabels,
           [addressLabels],
         ),
-        returnValue: _i20.Future<void>.value(),
-        returnValueForMissingStub: _i20.Future<void>.value(),
-      ) as _i20.Future<void>);
+        returnValue: _i21.Future<void>.value(),
+        returnValueForMissingStub: _i21.Future<void>.value(),
+      ) as _i21.Future<void>);
   @override
-  _i20.Future<_i23.AddressLabel?> getAddressLabel(
+  _i21.Future<_i24.AddressLabel?> getAddressLabel(
     String? walletId,
     String? addressString,
   ) =>
@@ -3444,10 +3506,10 @@ class MockMainDB extends _i1.Mock implements _i14.MainDB {
             addressString,
           ],
         ),
-        returnValue: _i20.Future<_i23.AddressLabel?>.value(),
-      ) as _i20.Future<_i23.AddressLabel?>);
+        returnValue: _i21.Future<_i24.AddressLabel?>.value(),
+      ) as _i21.Future<_i24.AddressLabel?>);
   @override
-  _i23.AddressLabel? getAddressLabelSync(
+  _i24.AddressLabel? getAddressLabelSync(
     String? walletId,
     String? addressString,
   ) =>
@@ -3457,9 +3519,9 @@ class MockMainDB extends _i1.Mock implements _i14.MainDB {
           walletId,
           addressString,
         ],
-      )) as _i23.AddressLabel?);
+      )) as _i24.AddressLabel?);
   @override
-  _i20.Stream<_i23.AddressLabel?> watchAddressLabel({
+  _i21.Stream<_i24.AddressLabel?> watchAddressLabel({
     required int? id,
     bool? fireImmediately = false,
   }) =>
@@ -3472,50 +3534,50 @@ class MockMainDB extends _i1.Mock implements _i14.MainDB {
             #fireImmediately: fireImmediately,
           },
         ),
-        returnValue: _i20.Stream<_i23.AddressLabel?>.empty(),
-      ) as _i20.Stream<_i23.AddressLabel?>);
+        returnValue: _i21.Stream<_i24.AddressLabel?>.empty(),
+      ) as _i21.Stream<_i24.AddressLabel?>);
   @override
-  _i20.Future<int> updateAddressLabel(_i23.AddressLabel? addressLabel) =>
+  _i21.Future<int> updateAddressLabel(_i24.AddressLabel? addressLabel) =>
       (super.noSuchMethod(
         Invocation.method(
           #updateAddressLabel,
           [addressLabel],
         ),
-        returnValue: _i20.Future<int>.value(0),
-      ) as _i20.Future<int>);
+        returnValue: _i21.Future<int>.value(0),
+      ) as _i21.Future<int>);
   @override
-  _i20.Future<void> deleteWalletBlockchainData(String? walletId) =>
+  _i21.Future<void> deleteWalletBlockchainData(String? walletId) =>
       (super.noSuchMethod(
         Invocation.method(
           #deleteWalletBlockchainData,
           [walletId],
         ),
-        returnValue: _i20.Future<void>.value(),
-        returnValueForMissingStub: _i20.Future<void>.value(),
-      ) as _i20.Future<void>);
+        returnValue: _i21.Future<void>.value(),
+        returnValueForMissingStub: _i21.Future<void>.value(),
+      ) as _i21.Future<void>);
   @override
-  _i20.Future<void> deleteAddressLabels(String? walletId) =>
+  _i21.Future<void> deleteAddressLabels(String? walletId) =>
       (super.noSuchMethod(
         Invocation.method(
           #deleteAddressLabels,
           [walletId],
         ),
-        returnValue: _i20.Future<void>.value(),
-        returnValueForMissingStub: _i20.Future<void>.value(),
-      ) as _i20.Future<void>);
+        returnValue: _i21.Future<void>.value(),
+        returnValueForMissingStub: _i21.Future<void>.value(),
+      ) as _i21.Future<void>);
   @override
-  _i20.Future<void> deleteTransactionNotes(String? walletId) =>
+  _i21.Future<void> deleteTransactionNotes(String? walletId) =>
       (super.noSuchMethod(
         Invocation.method(
           #deleteTransactionNotes,
           [walletId],
         ),
-        returnValue: _i20.Future<void>.value(),
-        returnValueForMissingStub: _i20.Future<void>.value(),
-      ) as _i20.Future<void>);
+        returnValue: _i21.Future<void>.value(),
+        returnValueForMissingStub: _i21.Future<void>.value(),
+      ) as _i21.Future<void>);
   @override
-  _i20.Future<void> addNewTransactionData(
-    List<_i15.Tuple2<_i23.Transaction, _i23.Address?>>? transactionsData,
+  _i21.Future<void> addNewTransactionData(
+    List<_i16.Tuple2<_i24.Transaction, _i24.Address?>>? transactionsData,
     String? walletId,
   ) =>
       (super.noSuchMethod(
@@ -3526,76 +3588,86 @@ class MockMainDB extends _i1.Mock implements _i14.MainDB {
             walletId,
           ],
         ),
-        returnValue: _i20.Future<void>.value(),
-        returnValueForMissingStub: _i20.Future<void>.value(),
-      ) as _i20.Future<void>);
+        returnValue: _i21.Future<void>.value(),
+        returnValueForMissingStub: _i21.Future<void>.value(),
+      ) as _i21.Future<void>);
   @override
-  _i17.QueryBuilder<_i23.EthContract, _i23.EthContract, _i17.QWhere>
+  _i21.Future<List<int>> updateOrPutTransactionV2s(
+          List<_i39.TransactionV2>? transactions) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #updateOrPutTransactionV2s,
+          [transactions],
+        ),
+        returnValue: _i21.Future<List<int>>.value(<int>[]),
+      ) as _i21.Future<List<int>>);
+  @override
+  _i18.QueryBuilder<_i24.EthContract, _i24.EthContract, _i18.QWhere>
       getEthContracts() => (super.noSuchMethod(
             Invocation.method(
               #getEthContracts,
               [],
             ),
-            returnValue: _FakeQueryBuilder_16<_i23.EthContract,
-                _i23.EthContract, _i17.QWhere>(
+            returnValue: _FakeQueryBuilder_17<_i24.EthContract,
+                _i24.EthContract, _i18.QWhere>(
               this,
               Invocation.method(
                 #getEthContracts,
                 [],
               ),
             ),
-          ) as _i17
-              .QueryBuilder<_i23.EthContract, _i23.EthContract, _i17.QWhere>);
+          ) as _i18
+              .QueryBuilder<_i24.EthContract, _i24.EthContract, _i18.QWhere>);
   @override
-  _i20.Future<_i23.EthContract?> getEthContract(String? contractAddress) =>
+  _i21.Future<_i24.EthContract?> getEthContract(String? contractAddress) =>
       (super.noSuchMethod(
         Invocation.method(
           #getEthContract,
           [contractAddress],
         ),
-        returnValue: _i20.Future<_i23.EthContract?>.value(),
-      ) as _i20.Future<_i23.EthContract?>);
+        returnValue: _i21.Future<_i24.EthContract?>.value(),
+      ) as _i21.Future<_i24.EthContract?>);
   @override
-  _i23.EthContract? getEthContractSync(String? contractAddress) =>
+  _i24.EthContract? getEthContractSync(String? contractAddress) =>
       (super.noSuchMethod(Invocation.method(
         #getEthContractSync,
         [contractAddress],
-      )) as _i23.EthContract?);
+      )) as _i24.EthContract?);
   @override
-  _i20.Future<int> putEthContract(_i23.EthContract? contract) =>
+  _i21.Future<int> putEthContract(_i24.EthContract? contract) =>
       (super.noSuchMethod(
         Invocation.method(
           #putEthContract,
           [contract],
         ),
-        returnValue: _i20.Future<int>.value(0),
-      ) as _i20.Future<int>);
+        returnValue: _i21.Future<int>.value(0),
+      ) as _i21.Future<int>);
   @override
-  _i20.Future<void> putEthContracts(List<_i23.EthContract>? contracts) =>
+  _i21.Future<void> putEthContracts(List<_i24.EthContract>? contracts) =>
       (super.noSuchMethod(
         Invocation.method(
           #putEthContracts,
           [contracts],
         ),
-        returnValue: _i20.Future<void>.value(),
-        returnValueForMissingStub: _i20.Future<void>.value(),
-      ) as _i20.Future<void>);
+        returnValue: _i21.Future<void>.value(),
+        returnValueForMissingStub: _i21.Future<void>.value(),
+      ) as _i21.Future<void>);
   @override
-  _i20.Future<int?> getHighestUsedMintIndex({required String? walletId}) =>
+  _i21.Future<int?> getHighestUsedMintIndex({required String? walletId}) =>
       (super.noSuchMethod(
         Invocation.method(
           #getHighestUsedMintIndex,
           [],
           {#walletId: walletId},
         ),
-        returnValue: _i20.Future<int?>.value(),
-      ) as _i20.Future<int?>);
+        returnValue: _i21.Future<int?>.value(),
+      ) as _i21.Future<int?>);
 }
 
 /// A class which mocks [IThemeAssets].
 ///
 /// See the documentation for Mockito's code generation for more information.
-class MockIThemeAssets extends _i1.Mock implements _i34.IThemeAssets {
+class MockIThemeAssets extends _i1.Mock implements _i35.IThemeAssets {
   MockIThemeAssets() {
     _i1.throwOnMissingStub(this);
   }
diff --git a/test/widget_tests/wallet_card_test.mocks.dart b/test/widget_tests/wallet_card_test.mocks.dart
index 5ed295d28..675c27561 100644
--- a/test/widget_tests/wallet_card_test.mocks.dart
+++ b/test/widget_tests/wallet_card_test.mocks.dart
@@ -3,12 +3,12 @@
 // Do not manually edit this file.
 
 // ignore_for_file: no_leading_underscores_for_library_prefixes
-import 'dart:async' as _i22;
-import 'dart:typed_data' as _i29;
-import 'dart:ui' as _i24;
+import 'dart:async' as _i23;
+import 'dart:typed_data' as _i30;
+import 'dart:ui' as _i25;
 
-import 'package:bip32/bip32.dart' as _i16;
-import 'package:bip47/bip47.dart' as _i18;
+import 'package:bip32/bip32.dart' as _i17;
+import 'package:bip47/bip47.dart' as _i19;
 import 'package:bitcoindart/bitcoindart.dart' as _i13;
 import 'package:flutter/foundation.dart' as _i4;
 import 'package:flutter_riverpod/flutter_riverpod.dart' as _i5;
@@ -17,27 +17,29 @@ import 'package:stackwallet/db/isar/main_db.dart' as _i12;
 import 'package:stackwallet/electrumx_rpc/cached_electrumx.dart' as _i10;
 import 'package:stackwallet/electrumx_rpc/electrumx.dart' as _i9;
 import 'package:stackwallet/models/balance.dart' as _i11;
-import 'package:stackwallet/models/isar/models/isar_models.dart' as _i17;
-import 'package:stackwallet/models/isar/stack_theme.dart' as _i32;
+import 'package:stackwallet/models/isar/models/blockchain_data/v2/transaction_v2.dart'
+    as _i15;
+import 'package:stackwallet/models/isar/models/isar_models.dart' as _i18;
+import 'package:stackwallet/models/isar/stack_theme.dart' as _i33;
 import 'package:stackwallet/models/paymint/fee_object_model.dart' as _i8;
-import 'package:stackwallet/models/signing_data.dart' as _i27;
-import 'package:stackwallet/networking/http.dart' as _i19;
-import 'package:stackwallet/services/coins/bitcoin/bitcoin_wallet.dart' as _i25;
+import 'package:stackwallet/models/signing_data.dart' as _i28;
+import 'package:stackwallet/networking/http.dart' as _i20;
+import 'package:stackwallet/services/coins/bitcoin/bitcoin_wallet.dart' as _i26;
 import 'package:stackwallet/services/coins/manager.dart' as _i6;
-import 'package:stackwallet/services/locale_service.dart' as _i30;
+import 'package:stackwallet/services/locale_service.dart' as _i31;
 import 'package:stackwallet/services/node_service.dart' as _i3;
 import 'package:stackwallet/services/transaction_notification_tracker.dart'
     as _i7;
-import 'package:stackwallet/services/wallets.dart' as _i20;
+import 'package:stackwallet/services/wallets.dart' as _i21;
 import 'package:stackwallet/services/wallets_service.dart' as _i2;
-import 'package:stackwallet/themes/theme_service.dart' as _i31;
+import 'package:stackwallet/themes/theme_service.dart' as _i32;
 import 'package:stackwallet/utilities/amount/amount.dart' as _i14;
-import 'package:stackwallet/utilities/enums/coin_enum.dart' as _i21;
-import 'package:stackwallet/utilities/enums/derive_path_type_enum.dart' as _i26;
+import 'package:stackwallet/utilities/enums/coin_enum.dart' as _i22;
+import 'package:stackwallet/utilities/enums/derive_path_type_enum.dart' as _i27;
 import 'package:stackwallet/utilities/flutter_secure_storage_interface.dart'
-    as _i28;
-import 'package:stackwallet/utilities/prefs.dart' as _i23;
-import 'package:tuple/tuple.dart' as _i15;
+    as _i29;
+import 'package:stackwallet/utilities/prefs.dart' as _i24;
+import 'package:tuple/tuple.dart' as _i16;
 
 // ignore_for_file: type=lint
 // ignore_for_file: avoid_redundant_argument_values
@@ -184,9 +186,9 @@ class _FakeAmount_12 extends _i1.SmartFake implements _i14.Amount {
         );
 }
 
-class _FakeTuple2_13<T1, T2> extends _i1.SmartFake
-    implements _i15.Tuple2<T1, T2> {
-  _FakeTuple2_13(
+class _FakeTransactionV2_13 extends _i1.SmartFake
+    implements _i15.TransactionV2 {
+  _FakeTransactionV2_13(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -195,8 +197,9 @@ class _FakeTuple2_13<T1, T2> extends _i1.SmartFake
         );
 }
 
-class _FakeBIP32_14 extends _i1.SmartFake implements _i16.BIP32 {
-  _FakeBIP32_14(
+class _FakeTuple2_14<T1, T2> extends _i1.SmartFake
+    implements _i16.Tuple2<T1, T2> {
+  _FakeTuple2_14(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -205,8 +208,8 @@ class _FakeBIP32_14 extends _i1.SmartFake implements _i16.BIP32 {
         );
 }
 
-class _FakeAddress_15 extends _i1.SmartFake implements _i17.Address {
-  _FakeAddress_15(
+class _FakeBIP32_15 extends _i1.SmartFake implements _i17.BIP32 {
+  _FakeBIP32_15(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -215,8 +218,8 @@ class _FakeAddress_15 extends _i1.SmartFake implements _i17.Address {
         );
 }
 
-class _FakePaymentCode_16 extends _i1.SmartFake implements _i18.PaymentCode {
-  _FakePaymentCode_16(
+class _FakeAddress_16 extends _i1.SmartFake implements _i18.Address {
+  _FakeAddress_16(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -225,8 +228,18 @@ class _FakePaymentCode_16 extends _i1.SmartFake implements _i18.PaymentCode {
         );
 }
 
-class _FakeHTTP_17 extends _i1.SmartFake implements _i19.HTTP {
-  _FakeHTTP_17(
+class _FakePaymentCode_17 extends _i1.SmartFake implements _i19.PaymentCode {
+  _FakePaymentCode_17(
+    Object parent,
+    Invocation parentInvocation,
+  ) : super(
+          parent,
+          parentInvocation,
+        );
+}
+
+class _FakeHTTP_18 extends _i1.SmartFake implements _i20.HTTP {
+  _FakeHTTP_18(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -238,7 +251,7 @@ class _FakeHTTP_17 extends _i1.SmartFake implements _i19.HTTP {
 /// A class which mocks [Wallets].
 ///
 /// See the documentation for Mockito's code generation for more information.
-class MockWallets extends _i1.Mock implements _i20.Wallets {
+class MockWallets extends _i1.Mock implements _i21.Wallets {
   MockWallets() {
     _i1.throwOnMissingStub(this);
   }
@@ -305,7 +318,7 @@ class MockWallets extends _i1.Mock implements _i20.Wallets {
         returnValueForMissingStub: null,
       );
   @override
-  List<String> getWalletIdsFor({required _i21.Coin? coin}) =>
+  List<String> getWalletIdsFor({required _i22.Coin? coin}) =>
       (super.noSuchMethod(
         Invocation.method(
           #getWalletIdsFor,
@@ -315,20 +328,20 @@ class MockWallets extends _i1.Mock implements _i20.Wallets {
         returnValue: <String>[],
       ) as List<String>);
   @override
-  List<_i15.Tuple2<_i21.Coin, List<_i5.ChangeNotifierProvider<_i6.Manager>>>>
+  List<_i16.Tuple2<_i22.Coin, List<_i5.ChangeNotifierProvider<_i6.Manager>>>>
       getManagerProvidersByCoin() => (super.noSuchMethod(
             Invocation.method(
               #getManagerProvidersByCoin,
               [],
             ),
-            returnValue: <_i15.Tuple2<_i21.Coin,
+            returnValue: <_i16.Tuple2<_i22.Coin,
                 List<_i5.ChangeNotifierProvider<_i6.Manager>>>>[],
           ) as List<
-              _i15.Tuple2<_i21.Coin,
+              _i16.Tuple2<_i22.Coin,
                   List<_i5.ChangeNotifierProvider<_i6.Manager>>>>);
   @override
   List<_i5.ChangeNotifierProvider<_i6.Manager>> getManagerProvidersForCoin(
-          _i21.Coin? coin) =>
+          _i22.Coin? coin) =>
       (super.noSuchMethod(
         Invocation.method(
           #getManagerProvidersForCoin,
@@ -392,17 +405,17 @@ class MockWallets extends _i1.Mock implements _i20.Wallets {
         returnValueForMissingStub: null,
       );
   @override
-  _i22.Future<void> load(_i23.Prefs? prefs) => (super.noSuchMethod(
+  _i23.Future<void> load(_i24.Prefs? prefs) => (super.noSuchMethod(
         Invocation.method(
           #load,
           [prefs],
         ),
-        returnValue: _i22.Future<void>.value(),
-        returnValueForMissingStub: _i22.Future<void>.value(),
-      ) as _i22.Future<void>);
+        returnValue: _i23.Future<void>.value(),
+        returnValueForMissingStub: _i23.Future<void>.value(),
+      ) as _i23.Future<void>);
   @override
-  _i22.Future<void> loadAfterStackRestore(
-    _i23.Prefs? prefs,
+  _i23.Future<void> loadAfterStackRestore(
+    _i24.Prefs? prefs,
     List<_i6.Manager>? managers,
   ) =>
       (super.noSuchMethod(
@@ -413,11 +426,11 @@ class MockWallets extends _i1.Mock implements _i20.Wallets {
             managers,
           ],
         ),
-        returnValue: _i22.Future<void>.value(),
-        returnValueForMissingStub: _i22.Future<void>.value(),
-      ) as _i22.Future<void>);
+        returnValue: _i23.Future<void>.value(),
+        returnValueForMissingStub: _i23.Future<void>.value(),
+      ) as _i23.Future<void>);
   @override
-  void addListener(_i24.VoidCallback? listener) => super.noSuchMethod(
+  void addListener(_i25.VoidCallback? listener) => super.noSuchMethod(
         Invocation.method(
           #addListener,
           [listener],
@@ -425,7 +438,7 @@ class MockWallets extends _i1.Mock implements _i20.Wallets {
         returnValueForMissingStub: null,
       );
   @override
-  void removeListener(_i24.VoidCallback? listener) => super.noSuchMethod(
+  void removeListener(_i25.VoidCallback? listener) => super.noSuchMethod(
         Invocation.method(
           #removeListener,
           [listener],
@@ -445,13 +458,13 @@ class MockWallets extends _i1.Mock implements _i20.Wallets {
 /// A class which mocks [BitcoinWallet].
 ///
 /// See the documentation for Mockito's code generation for more information.
-class MockBitcoinWallet extends _i1.Mock implements _i25.BitcoinWallet {
+class MockBitcoinWallet extends _i1.Mock implements _i26.BitcoinWallet {
   MockBitcoinWallet() {
     _i1.throwOnMissingStub(this);
   }
 
   @override
-  set timer(_i22.Timer? _timer) => super.noSuchMethod(
+  set timer(_i23.Timer? _timer) => super.noSuchMethod(
         Invocation.setter(
           #timer,
           _timer,
@@ -528,74 +541,74 @@ class MockBitcoinWallet extends _i1.Mock implements _i25.BitcoinWallet {
         returnValue: false,
       ) as bool);
   @override
-  _i21.Coin get coin => (super.noSuchMethod(
+  _i22.Coin get coin => (super.noSuchMethod(
         Invocation.getter(#coin),
-        returnValue: _i21.Coin.bitcoin,
-      ) as _i21.Coin);
+        returnValue: _i22.Coin.bitcoin,
+      ) as _i22.Coin);
   @override
-  _i22.Future<List<_i17.UTXO>> get utxos => (super.noSuchMethod(
+  _i23.Future<List<_i18.UTXO>> get utxos => (super.noSuchMethod(
         Invocation.getter(#utxos),
-        returnValue: _i22.Future<List<_i17.UTXO>>.value(<_i17.UTXO>[]),
-      ) as _i22.Future<List<_i17.UTXO>>);
+        returnValue: _i23.Future<List<_i18.UTXO>>.value(<_i18.UTXO>[]),
+      ) as _i23.Future<List<_i18.UTXO>>);
   @override
-  _i22.Future<List<_i17.Transaction>> get transactions => (super.noSuchMethod(
+  _i23.Future<List<_i18.Transaction>> get transactions => (super.noSuchMethod(
         Invocation.getter(#transactions),
         returnValue:
-            _i22.Future<List<_i17.Transaction>>.value(<_i17.Transaction>[]),
-      ) as _i22.Future<List<_i17.Transaction>>);
+            _i23.Future<List<_i18.Transaction>>.value(<_i18.Transaction>[]),
+      ) as _i23.Future<List<_i18.Transaction>>);
   @override
-  _i22.Future<String> get currentReceivingAddress => (super.noSuchMethod(
+  _i23.Future<String> get currentReceivingAddress => (super.noSuchMethod(
         Invocation.getter(#currentReceivingAddress),
-        returnValue: _i22.Future<String>.value(''),
-      ) as _i22.Future<String>);
+        returnValue: _i23.Future<String>.value(''),
+      ) as _i23.Future<String>);
   @override
-  _i22.Future<String> get currentChangeAddress => (super.noSuchMethod(
+  _i23.Future<String> get currentChangeAddress => (super.noSuchMethod(
         Invocation.getter(#currentChangeAddress),
-        returnValue: _i22.Future<String>.value(''),
-      ) as _i22.Future<String>);
+        returnValue: _i23.Future<String>.value(''),
+      ) as _i23.Future<String>);
   @override
-  _i22.Future<String> get currentChangeAddressP2PKH => (super.noSuchMethod(
+  _i23.Future<String> get currentChangeAddressP2PKH => (super.noSuchMethod(
         Invocation.getter(#currentChangeAddressP2PKH),
-        returnValue: _i22.Future<String>.value(''),
-      ) as _i22.Future<String>);
+        returnValue: _i23.Future<String>.value(''),
+      ) as _i23.Future<String>);
   @override
   bool get hasCalledExit => (super.noSuchMethod(
         Invocation.getter(#hasCalledExit),
         returnValue: false,
       ) as bool);
   @override
-  _i22.Future<_i8.FeeObject> get fees => (super.noSuchMethod(
+  _i23.Future<_i8.FeeObject> get fees => (super.noSuchMethod(
         Invocation.getter(#fees),
-        returnValue: _i22.Future<_i8.FeeObject>.value(_FakeFeeObject_5(
+        returnValue: _i23.Future<_i8.FeeObject>.value(_FakeFeeObject_5(
           this,
           Invocation.getter(#fees),
         )),
-      ) as _i22.Future<_i8.FeeObject>);
+      ) as _i23.Future<_i8.FeeObject>);
   @override
-  _i22.Future<int> get maxFee => (super.noSuchMethod(
+  _i23.Future<int> get maxFee => (super.noSuchMethod(
         Invocation.getter(#maxFee),
-        returnValue: _i22.Future<int>.value(0),
-      ) as _i22.Future<int>);
+        returnValue: _i23.Future<int>.value(0),
+      ) as _i23.Future<int>);
   @override
-  _i22.Future<List<String>> get mnemonic => (super.noSuchMethod(
+  _i23.Future<List<String>> get mnemonic => (super.noSuchMethod(
         Invocation.getter(#mnemonic),
-        returnValue: _i22.Future<List<String>>.value(<String>[]),
-      ) as _i22.Future<List<String>>);
+        returnValue: _i23.Future<List<String>>.value(<String>[]),
+      ) as _i23.Future<List<String>>);
   @override
-  _i22.Future<String?> get mnemonicString => (super.noSuchMethod(
+  _i23.Future<String?> get mnemonicString => (super.noSuchMethod(
         Invocation.getter(#mnemonicString),
-        returnValue: _i22.Future<String?>.value(),
-      ) as _i22.Future<String?>);
+        returnValue: _i23.Future<String?>.value(),
+      ) as _i23.Future<String?>);
   @override
-  _i22.Future<String?> get mnemonicPassphrase => (super.noSuchMethod(
+  _i23.Future<String?> get mnemonicPassphrase => (super.noSuchMethod(
         Invocation.getter(#mnemonicPassphrase),
-        returnValue: _i22.Future<String?>.value(),
-      ) as _i22.Future<String?>);
+        returnValue: _i23.Future<String?>.value(),
+      ) as _i23.Future<String?>);
   @override
-  _i22.Future<int> get chainHeight => (super.noSuchMethod(
+  _i23.Future<int> get chainHeight => (super.noSuchMethod(
         Invocation.getter(#chainHeight),
-        returnValue: _i22.Future<int>.value(0),
-      ) as _i22.Future<int>);
+        returnValue: _i23.Future<int>.value(0),
+      ) as _i23.Future<int>);
   @override
   int get storedChainHeight => (super.noSuchMethod(
         Invocation.getter(#storedChainHeight),
@@ -667,10 +680,10 @@ class MockBitcoinWallet extends _i1.Mock implements _i25.BitcoinWallet {
         ),
       ) as _i11.Balance);
   @override
-  _i22.Future<String> get xpub => (super.noSuchMethod(
+  _i23.Future<String> get xpub => (super.noSuchMethod(
         Invocation.getter(#xpub),
-        returnValue: _i22.Future<String>.value(''),
-      ) as _i22.Future<String>);
+        returnValue: _i23.Future<String>.value(''),
+      ) as _i23.Future<String>);
   @override
   set onIsActiveWalletChanged(void Function(bool)? _onIsActiveWalletChanged) =>
       super.noSuchMethod(
@@ -697,26 +710,26 @@ class MockBitcoinWallet extends _i1.Mock implements _i25.BitcoinWallet {
         ),
       ) as _i13.NetworkType);
   @override
-  _i22.Future<void> exit() => (super.noSuchMethod(
+  _i23.Future<void> exit() => (super.noSuchMethod(
         Invocation.method(
           #exit,
           [],
         ),
-        returnValue: _i22.Future<void>.value(),
-        returnValueForMissingStub: _i22.Future<void>.value(),
-      ) as _i22.Future<void>);
+        returnValue: _i23.Future<void>.value(),
+        returnValueForMissingStub: _i23.Future<void>.value(),
+      ) as _i23.Future<void>);
   @override
-  _i26.DerivePathType addressType({required String? address}) =>
+  _i27.DerivePathType addressType({required String? address}) =>
       (super.noSuchMethod(
         Invocation.method(
           #addressType,
           [],
           {#address: address},
         ),
-        returnValue: _i26.DerivePathType.bip44,
-      ) as _i26.DerivePathType);
+        returnValue: _i27.DerivePathType.bip44,
+      ) as _i27.DerivePathType);
   @override
-  _i22.Future<void> recoverFromMnemonic({
+  _i23.Future<void> recoverFromMnemonic({
     required String? mnemonic,
     String? mnemonicPassphrase,
     required int? maxUnusedAddressGap,
@@ -735,47 +748,47 @@ class MockBitcoinWallet extends _i1.Mock implements _i25.BitcoinWallet {
             #height: height,
           },
         ),
-        returnValue: _i22.Future<void>.value(),
-        returnValueForMissingStub: _i22.Future<void>.value(),
-      ) as _i22.Future<void>);
+        returnValue: _i23.Future<void>.value(),
+        returnValueForMissingStub: _i23.Future<void>.value(),
+      ) as _i23.Future<void>);
   @override
-  _i22.Future<void> getTransactionCacheEarly(List<String>? allAddresses) =>
+  _i23.Future<void> getTransactionCacheEarly(List<String>? allAddresses) =>
       (super.noSuchMethod(
         Invocation.method(
           #getTransactionCacheEarly,
           [allAddresses],
         ),
-        returnValue: _i22.Future<void>.value(),
-        returnValueForMissingStub: _i22.Future<void>.value(),
-      ) as _i22.Future<void>);
+        returnValue: _i23.Future<void>.value(),
+        returnValueForMissingStub: _i23.Future<void>.value(),
+      ) as _i23.Future<void>);
   @override
-  _i22.Future<bool> refreshIfThereIsNewData() => (super.noSuchMethod(
+  _i23.Future<bool> refreshIfThereIsNewData() => (super.noSuchMethod(
         Invocation.method(
           #refreshIfThereIsNewData,
           [],
         ),
-        returnValue: _i22.Future<bool>.value(false),
-      ) as _i22.Future<bool>);
+        returnValue: _i23.Future<bool>.value(false),
+      ) as _i23.Future<bool>);
   @override
-  _i22.Future<void> getAllTxsToWatch() => (super.noSuchMethod(
+  _i23.Future<void> getAllTxsToWatch() => (super.noSuchMethod(
         Invocation.method(
           #getAllTxsToWatch,
           [],
         ),
-        returnValue: _i22.Future<void>.value(),
-        returnValueForMissingStub: _i22.Future<void>.value(),
-      ) as _i22.Future<void>);
+        returnValue: _i23.Future<void>.value(),
+        returnValueForMissingStub: _i23.Future<void>.value(),
+      ) as _i23.Future<void>);
   @override
-  _i22.Future<void> refresh() => (super.noSuchMethod(
+  _i23.Future<void> refresh() => (super.noSuchMethod(
         Invocation.method(
           #refresh,
           [],
         ),
-        returnValue: _i22.Future<void>.value(),
-        returnValueForMissingStub: _i22.Future<void>.value(),
-      ) as _i22.Future<void>);
+        returnValue: _i23.Future<void>.value(),
+        returnValueForMissingStub: _i23.Future<void>.value(),
+      ) as _i23.Future<void>);
   @override
-  _i22.Future<Map<String, dynamic>> prepareSend({
+  _i23.Future<Map<String, dynamic>> prepareSend({
     required String? address,
     required _i14.Amount? amount,
     Map<String, dynamic>? args,
@@ -791,26 +804,26 @@ class MockBitcoinWallet extends _i1.Mock implements _i25.BitcoinWallet {
           },
         ),
         returnValue:
-            _i22.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
-      ) as _i22.Future<Map<String, dynamic>>);
+            _i23.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
+      ) as _i23.Future<Map<String, dynamic>>);
   @override
-  _i22.Future<String> confirmSend({required Map<String, dynamic>? txData}) =>
+  _i23.Future<String> confirmSend({required Map<String, dynamic>? txData}) =>
       (super.noSuchMethod(
         Invocation.method(
           #confirmSend,
           [],
           {#txData: txData},
         ),
-        returnValue: _i22.Future<String>.value(''),
-      ) as _i22.Future<String>);
+        returnValue: _i23.Future<String>.value(''),
+      ) as _i23.Future<String>);
   @override
-  _i22.Future<bool> testNetworkConnection() => (super.noSuchMethod(
+  _i23.Future<bool> testNetworkConnection() => (super.noSuchMethod(
         Invocation.method(
           #testNetworkConnection,
           [],
         ),
-        returnValue: _i22.Future<bool>.value(false),
-      ) as _i22.Future<bool>);
+        returnValue: _i23.Future<bool>.value(false),
+      ) as _i23.Future<bool>);
   @override
   void startNetworkAlivePinging() => super.noSuchMethod(
         Invocation.method(
@@ -828,35 +841,35 @@ class MockBitcoinWallet extends _i1.Mock implements _i25.BitcoinWallet {
         returnValueForMissingStub: null,
       );
   @override
-  _i22.Future<void> initializeNew(
+  _i23.Future<void> initializeNew(
           ({String mnemonicPassphrase, int wordCount})? data) =>
       (super.noSuchMethod(
         Invocation.method(
           #initializeNew,
           [data],
         ),
-        returnValue: _i22.Future<void>.value(),
-        returnValueForMissingStub: _i22.Future<void>.value(),
-      ) as _i22.Future<void>);
+        returnValue: _i23.Future<void>.value(),
+        returnValueForMissingStub: _i23.Future<void>.value(),
+      ) as _i23.Future<void>);
   @override
-  _i22.Future<void> initializeExisting() => (super.noSuchMethod(
+  _i23.Future<void> initializeExisting() => (super.noSuchMethod(
         Invocation.method(
           #initializeExisting,
           [],
         ),
-        returnValue: _i22.Future<void>.value(),
-        returnValueForMissingStub: _i22.Future<void>.value(),
-      ) as _i22.Future<void>);
+        returnValue: _i23.Future<void>.value(),
+        returnValueForMissingStub: _i23.Future<void>.value(),
+      ) as _i23.Future<void>);
   @override
-  _i22.Future<void> updateSentCachedTxData(Map<String, dynamic>? txData) =>
+  _i23.Future<void> updateSentCachedTxData(Map<String, dynamic>? txData) =>
       (super.noSuchMethod(
         Invocation.method(
           #updateSentCachedTxData,
           [txData],
         ),
-        returnValue: _i22.Future<void>.value(),
-        returnValueForMissingStub: _i22.Future<void>.value(),
-      ) as _i22.Future<void>);
+        returnValue: _i23.Future<void>.value(),
+        returnValueForMissingStub: _i23.Future<void>.value(),
+      ) as _i23.Future<void>);
   @override
   bool validateAddress(String? address) => (super.noSuchMethod(
         Invocation.method(
@@ -866,69 +879,69 @@ class MockBitcoinWallet extends _i1.Mock implements _i25.BitcoinWallet {
         returnValue: false,
       ) as bool);
   @override
-  _i22.Future<void> updateNode(bool? shouldRefresh) => (super.noSuchMethod(
+  _i23.Future<void> updateNode(bool? shouldRefresh) => (super.noSuchMethod(
         Invocation.method(
           #updateNode,
           [shouldRefresh],
         ),
-        returnValue: _i22.Future<void>.value(),
-        returnValueForMissingStub: _i22.Future<void>.value(),
-      ) as _i22.Future<void>);
+        returnValue: _i23.Future<void>.value(),
+        returnValueForMissingStub: _i23.Future<void>.value(),
+      ) as _i23.Future<void>);
   @override
-  _i22.Future<_i9.ElectrumXNode> getCurrentNode() => (super.noSuchMethod(
+  _i23.Future<_i9.ElectrumXNode> getCurrentNode() => (super.noSuchMethod(
         Invocation.method(
           #getCurrentNode,
           [],
         ),
-        returnValue: _i22.Future<_i9.ElectrumXNode>.value(_FakeElectrumXNode_11(
+        returnValue: _i23.Future<_i9.ElectrumXNode>.value(_FakeElectrumXNode_11(
           this,
           Invocation.method(
             #getCurrentNode,
             [],
           ),
         )),
-      ) as _i22.Future<_i9.ElectrumXNode>);
+      ) as _i23.Future<_i9.ElectrumXNode>);
   @override
-  _i22.Future<List<Map<String, dynamic>>> fastFetch(
+  _i23.Future<List<Map<String, dynamic>>> fastFetch(
           List<String>? allTxHashes) =>
       (super.noSuchMethod(
         Invocation.method(
           #fastFetch,
           [allTxHashes],
         ),
-        returnValue: _i22.Future<List<Map<String, dynamic>>>.value(
+        returnValue: _i23.Future<List<Map<String, dynamic>>>.value(
             <Map<String, dynamic>>[]),
-      ) as _i22.Future<List<Map<String, dynamic>>>);
+      ) as _i23.Future<List<Map<String, dynamic>>>);
   @override
-  _i22.Future<int> getTxCount({required String? address}) =>
+  _i23.Future<int> getTxCount({required String? address}) =>
       (super.noSuchMethod(
         Invocation.method(
           #getTxCount,
           [],
           {#address: address},
         ),
-        returnValue: _i22.Future<int>.value(0),
-      ) as _i22.Future<int>);
+        returnValue: _i23.Future<int>.value(0),
+      ) as _i23.Future<int>);
   @override
-  _i22.Future<void> checkCurrentReceivingAddressesForTransactions() =>
+  _i23.Future<void> checkCurrentReceivingAddressesForTransactions() =>
       (super.noSuchMethod(
         Invocation.method(
           #checkCurrentReceivingAddressesForTransactions,
           [],
         ),
-        returnValue: _i22.Future<void>.value(),
-        returnValueForMissingStub: _i22.Future<void>.value(),
-      ) as _i22.Future<void>);
+        returnValue: _i23.Future<void>.value(),
+        returnValueForMissingStub: _i23.Future<void>.value(),
+      ) as _i23.Future<void>);
   @override
-  _i22.Future<void> checkCurrentChangeAddressesForTransactions() =>
+  _i23.Future<void> checkCurrentChangeAddressesForTransactions() =>
       (super.noSuchMethod(
         Invocation.method(
           #checkCurrentChangeAddressesForTransactions,
           [],
         ),
-        returnValue: _i22.Future<void>.value(),
-        returnValueForMissingStub: _i22.Future<void>.value(),
-      ) as _i22.Future<void>);
+        returnValue: _i23.Future<void>.value(),
+        returnValueForMissingStub: _i23.Future<void>.value(),
+      ) as _i23.Future<void>);
   @override
   int estimateTxFee({
     required int? vSize,
@@ -954,7 +967,7 @@ class MockBitcoinWallet extends _i1.Mock implements _i25.BitcoinWallet {
     required bool? isSendAll,
     int? satsPerVByte,
     int? additionalOutputs = 0,
-    List<_i17.UTXO>? utxos,
+    List<_i18.UTXO>? utxos,
   }) =>
       super.noSuchMethod(Invocation.method(
         #coinSelection,
@@ -971,19 +984,19 @@ class MockBitcoinWallet extends _i1.Mock implements _i25.BitcoinWallet {
         },
       ));
   @override
-  _i22.Future<List<_i27.SigningData>> fetchBuildTxData(
-          List<_i17.UTXO>? utxosToUse) =>
+  _i23.Future<List<_i28.SigningData>> fetchBuildTxData(
+          List<_i18.UTXO>? utxosToUse) =>
       (super.noSuchMethod(
         Invocation.method(
           #fetchBuildTxData,
           [utxosToUse],
         ),
         returnValue:
-            _i22.Future<List<_i27.SigningData>>.value(<_i27.SigningData>[]),
-      ) as _i22.Future<List<_i27.SigningData>>);
+            _i23.Future<List<_i28.SigningData>>.value(<_i28.SigningData>[]),
+      ) as _i23.Future<List<_i28.SigningData>>);
   @override
-  _i22.Future<Map<String, dynamic>> buildTransaction({
-    required List<_i27.SigningData>? utxoSigningData,
+  _i23.Future<Map<String, dynamic>> buildTransaction({
+    required List<_i28.SigningData>? utxoSigningData,
     required List<String>? recipients,
     required List<int>? satoshiAmounts,
   }) =>
@@ -998,10 +1011,10 @@ class MockBitcoinWallet extends _i1.Mock implements _i25.BitcoinWallet {
           },
         ),
         returnValue:
-            _i22.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
-      ) as _i22.Future<Map<String, dynamic>>);
+            _i23.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
+      ) as _i23.Future<Map<String, dynamic>>);
   @override
-  _i22.Future<void> fullRescan(
+  _i23.Future<void> fullRescan(
     int? maxUnusedAddressGap,
     int? maxNumberOfIndexesToCheck,
   ) =>
@@ -1013,11 +1026,11 @@ class MockBitcoinWallet extends _i1.Mock implements _i25.BitcoinWallet {
             maxNumberOfIndexesToCheck,
           ],
         ),
-        returnValue: _i22.Future<void>.value(),
-        returnValueForMissingStub: _i22.Future<void>.value(),
-      ) as _i22.Future<void>);
+        returnValue: _i23.Future<void>.value(),
+        returnValueForMissingStub: _i23.Future<void>.value(),
+      ) as _i23.Future<void>);
   @override
-  _i22.Future<_i14.Amount> estimateFeeFor(
+  _i23.Future<_i14.Amount> estimateFeeFor(
     _i14.Amount? amount,
     int? feeRate,
   ) =>
@@ -1029,7 +1042,7 @@ class MockBitcoinWallet extends _i1.Mock implements _i25.BitcoinWallet {
             feeRate,
           ],
         ),
-        returnValue: _i22.Future<_i14.Amount>.value(_FakeAmount_12(
+        returnValue: _i23.Future<_i14.Amount>.value(_FakeAmount_12(
           this,
           Invocation.method(
             #estimateFeeFor,
@@ -1039,7 +1052,7 @@ class MockBitcoinWallet extends _i1.Mock implements _i25.BitcoinWallet {
             ],
           ),
         )),
-      ) as _i22.Future<_i14.Amount>);
+      ) as _i23.Future<_i14.Amount>);
   @override
   _i14.Amount roughFeeEstimate(
     int? inputCount,
@@ -1068,32 +1081,32 @@ class MockBitcoinWallet extends _i1.Mock implements _i25.BitcoinWallet {
         ),
       ) as _i14.Amount);
   @override
-  _i22.Future<_i14.Amount> sweepAllEstimate(int? feeRate) =>
+  _i23.Future<_i14.Amount> sweepAllEstimate(int? feeRate) =>
       (super.noSuchMethod(
         Invocation.method(
           #sweepAllEstimate,
           [feeRate],
         ),
-        returnValue: _i22.Future<_i14.Amount>.value(_FakeAmount_12(
+        returnValue: _i23.Future<_i14.Amount>.value(_FakeAmount_12(
           this,
           Invocation.method(
             #sweepAllEstimate,
             [feeRate],
           ),
         )),
-      ) as _i22.Future<_i14.Amount>);
+      ) as _i23.Future<_i14.Amount>);
   @override
-  _i22.Future<bool> generateNewAddress() => (super.noSuchMethod(
+  _i23.Future<bool> generateNewAddress() => (super.noSuchMethod(
         Invocation.method(
           #generateNewAddress,
           [],
         ),
-        returnValue: _i22.Future<bool>.value(false),
-      ) as _i22.Future<bool>);
+        returnValue: _i23.Future<bool>.value(false),
+      ) as _i23.Future<bool>);
   @override
   void initCache(
     String? walletId,
-    _i21.Coin? coin,
+    _i22.Coin? coin,
   ) =>
       super.noSuchMethod(
         Invocation.method(
@@ -1106,14 +1119,14 @@ class MockBitcoinWallet extends _i1.Mock implements _i25.BitcoinWallet {
         returnValueForMissingStub: null,
       );
   @override
-  _i22.Future<void> updateCachedId(String? id) => (super.noSuchMethod(
+  _i23.Future<void> updateCachedId(String? id) => (super.noSuchMethod(
         Invocation.method(
           #updateCachedId,
           [id],
         ),
-        returnValue: _i22.Future<void>.value(),
-        returnValueForMissingStub: _i22.Future<void>.value(),
-      ) as _i22.Future<void>);
+        returnValue: _i23.Future<void>.value(),
+        returnValueForMissingStub: _i23.Future<void>.value(),
+      ) as _i23.Future<void>);
   @override
   int getCachedChainHeight() => (super.noSuchMethod(
         Invocation.method(
@@ -1123,14 +1136,14 @@ class MockBitcoinWallet extends _i1.Mock implements _i25.BitcoinWallet {
         returnValue: 0,
       ) as int);
   @override
-  _i22.Future<void> updateCachedChainHeight(int? height) => (super.noSuchMethod(
+  _i23.Future<void> updateCachedChainHeight(int? height) => (super.noSuchMethod(
         Invocation.method(
           #updateCachedChainHeight,
           [height],
         ),
-        returnValue: _i22.Future<void>.value(),
-        returnValueForMissingStub: _i22.Future<void>.value(),
-      ) as _i22.Future<void>);
+        returnValue: _i23.Future<void>.value(),
+        returnValueForMissingStub: _i23.Future<void>.value(),
+      ) as _i23.Future<void>);
   @override
   bool getCachedIsFavorite() => (super.noSuchMethod(
         Invocation.method(
@@ -1140,15 +1153,15 @@ class MockBitcoinWallet extends _i1.Mock implements _i25.BitcoinWallet {
         returnValue: false,
       ) as bool);
   @override
-  _i22.Future<void> updateCachedIsFavorite(bool? isFavorite) =>
+  _i23.Future<void> updateCachedIsFavorite(bool? isFavorite) =>
       (super.noSuchMethod(
         Invocation.method(
           #updateCachedIsFavorite,
           [isFavorite],
         ),
-        returnValue: _i22.Future<void>.value(),
-        returnValueForMissingStub: _i22.Future<void>.value(),
-      ) as _i22.Future<void>);
+        returnValue: _i23.Future<void>.value(),
+        returnValueForMissingStub: _i23.Future<void>.value(),
+      ) as _i23.Future<void>);
   @override
   _i11.Balance getCachedBalance() => (super.noSuchMethod(
         Invocation.method(
@@ -1164,15 +1177,15 @@ class MockBitcoinWallet extends _i1.Mock implements _i25.BitcoinWallet {
         ),
       ) as _i11.Balance);
   @override
-  _i22.Future<void> updateCachedBalance(_i11.Balance? balance) =>
+  _i23.Future<void> updateCachedBalance(_i11.Balance? balance) =>
       (super.noSuchMethod(
         Invocation.method(
           #updateCachedBalance,
           [balance],
         ),
-        returnValue: _i22.Future<void>.value(),
-        returnValueForMissingStub: _i22.Future<void>.value(),
-      ) as _i22.Future<void>);
+        returnValue: _i23.Future<void>.value(),
+        returnValueForMissingStub: _i23.Future<void>.value(),
+      ) as _i23.Future<void>);
   @override
   _i11.Balance getCachedBalanceSecondary() => (super.noSuchMethod(
         Invocation.method(
@@ -1188,15 +1201,15 @@ class MockBitcoinWallet extends _i1.Mock implements _i25.BitcoinWallet {
         ),
       ) as _i11.Balance);
   @override
-  _i22.Future<void> updateCachedBalanceSecondary(_i11.Balance? balance) =>
+  _i23.Future<void> updateCachedBalanceSecondary(_i11.Balance? balance) =>
       (super.noSuchMethod(
         Invocation.method(
           #updateCachedBalanceSecondary,
           [balance],
         ),
-        returnValue: _i22.Future<void>.value(),
-        returnValueForMissingStub: _i22.Future<void>.value(),
-      ) as _i22.Future<void>);
+        returnValue: _i23.Future<void>.value(),
+        returnValueForMissingStub: _i23.Future<void>.value(),
+      ) as _i23.Future<void>);
   @override
   List<String> getWalletTokenContractAddresses() => (super.noSuchMethod(
         Invocation.method(
@@ -1206,16 +1219,16 @@ class MockBitcoinWallet extends _i1.Mock implements _i25.BitcoinWallet {
         returnValue: <String>[],
       ) as List<String>);
   @override
-  _i22.Future<void> updateWalletTokenContractAddresses(
+  _i23.Future<void> updateWalletTokenContractAddresses(
           List<String>? contractAddresses) =>
       (super.noSuchMethod(
         Invocation.method(
           #updateWalletTokenContractAddresses,
           [contractAddresses],
         ),
-        returnValue: _i22.Future<void>.value(),
-        returnValueForMissingStub: _i22.Future<void>.value(),
-      ) as _i22.Future<void>);
+        returnValue: _i23.Future<void>.value(),
+        returnValueForMissingStub: _i23.Future<void>.value(),
+      ) as _i23.Future<void>);
   @override
   void initWalletDB({_i12.MainDB? mockableOverride}) => super.noSuchMethod(
         Invocation.method(
@@ -1226,11 +1239,45 @@ class MockBitcoinWallet extends _i1.Mock implements _i25.BitcoinWallet {
         returnValueForMissingStub: null,
       );
   @override
-  _i22.Future<_i15.Tuple2<_i17.Transaction, _i17.Address>> parseTransaction(
+  _i23.Future<_i15.TransactionV2> getTransaction(
+    String? txHash,
+    _i22.Coin? coin,
+    String? walletId,
+    _i10.CachedElectrumX? cachedElectrumX, [
+    String? debugTitle,
+  ]) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #getTransaction,
+          [
+            txHash,
+            coin,
+            walletId,
+            cachedElectrumX,
+            debugTitle,
+          ],
+        ),
+        returnValue:
+            _i23.Future<_i15.TransactionV2>.value(_FakeTransactionV2_13(
+          this,
+          Invocation.method(
+            #getTransaction,
+            [
+              txHash,
+              coin,
+              walletId,
+              cachedElectrumX,
+              debugTitle,
+            ],
+          ),
+        )),
+      ) as _i23.Future<_i15.TransactionV2>);
+  @override
+  _i23.Future<_i16.Tuple2<_i18.Transaction, _i18.Address>> parseTransaction(
     Map<String, dynamic>? txData,
     dynamic electrumxClient,
-    List<_i17.Address>? myAddresses,
-    _i21.Coin? coin,
+    List<_i18.Address>? myAddresses,
+    _i22.Coin? coin,
     int? minConfirms,
     String? walletId,
   ) =>
@@ -1247,8 +1294,8 @@ class MockBitcoinWallet extends _i1.Mock implements _i25.BitcoinWallet {
           ],
         ),
         returnValue:
-            _i22.Future<_i15.Tuple2<_i17.Transaction, _i17.Address>>.value(
-                _FakeTuple2_13<_i17.Transaction, _i17.Address>(
+            _i23.Future<_i16.Tuple2<_i18.Transaction, _i18.Address>>.value(
+                _FakeTuple2_14<_i18.Transaction, _i18.Address>(
           this,
           Invocation.method(
             #parseTransaction,
@@ -1262,37 +1309,37 @@ class MockBitcoinWallet extends _i1.Mock implements _i25.BitcoinWallet {
             ],
           ),
         )),
-      ) as _i22.Future<_i15.Tuple2<_i17.Transaction, _i17.Address>>);
+      ) as _i23.Future<_i16.Tuple2<_i18.Transaction, _i18.Address>>);
   @override
   void initPaynymWalletInterface({
     required String? walletId,
     required String? walletName,
     required _i13.NetworkType? network,
-    required _i21.Coin? coin,
+    required _i22.Coin? coin,
     required _i12.MainDB? db,
     required _i9.ElectrumX? electrumXClient,
-    required _i28.SecureStorageInterface? secureStorage,
+    required _i29.SecureStorageInterface? secureStorage,
     required int? dustLimit,
     required int? dustLimitP2PKH,
     required int? minConfirms,
-    required _i22.Future<String?> Function()? getMnemonicString,
-    required _i22.Future<String?> Function()? getMnemonicPassphrase,
-    required _i22.Future<int> Function()? getChainHeight,
-    required _i22.Future<String> Function()? getCurrentChangeAddress,
+    required _i23.Future<String?> Function()? getMnemonicString,
+    required _i23.Future<String?> Function()? getMnemonicPassphrase,
+    required _i23.Future<int> Function()? getChainHeight,
+    required _i23.Future<String> Function()? getCurrentChangeAddress,
     required int Function({
       required int feeRatePerKB,
       required int vSize,
     })? estimateTxFee,
-    required _i22.Future<Map<String, dynamic>> Function({
+    required _i23.Future<Map<String, dynamic>> Function({
       required String address,
       required _i14.Amount amount,
       Map<String, dynamic>? args,
     })? prepareSend,
-    required _i22.Future<int> Function({required String address})? getTxCount,
-    required _i22.Future<List<_i27.SigningData>> Function(List<_i17.UTXO>)?
+    required _i23.Future<int> Function({required String address})? getTxCount,
+    required _i23.Future<List<_i28.SigningData>> Function(List<_i18.UTXO>)?
         fetchBuildTxData,
-    required _i22.Future<void> Function()? refresh,
-    required _i22.Future<void> Function()? checkChangeAddressForTransactions,
+    required _i23.Future<void> Function()? refresh,
+    required _i23.Future<void> Function()? checkChangeAddressForTransactions,
   }) =>
       super.noSuchMethod(
         Invocation.method(
@@ -1325,21 +1372,21 @@ class MockBitcoinWallet extends _i1.Mock implements _i25.BitcoinWallet {
         returnValueForMissingStub: null,
       );
   @override
-  _i22.Future<_i16.BIP32> getBip47BaseNode() => (super.noSuchMethod(
+  _i23.Future<_i17.BIP32> getBip47BaseNode() => (super.noSuchMethod(
         Invocation.method(
           #getBip47BaseNode,
           [],
         ),
-        returnValue: _i22.Future<_i16.BIP32>.value(_FakeBIP32_14(
+        returnValue: _i23.Future<_i17.BIP32>.value(_FakeBIP32_15(
           this,
           Invocation.method(
             #getBip47BaseNode,
             [],
           ),
         )),
-      ) as _i22.Future<_i16.BIP32>);
+      ) as _i23.Future<_i17.BIP32>);
   @override
-  _i22.Future<_i29.Uint8List> getPrivateKeyForPaynymReceivingAddress({
+  _i23.Future<_i30.Uint8List> getPrivateKeyForPaynymReceivingAddress({
     required String? paymentCodeString,
     required int? index,
   }) =>
@@ -1352,11 +1399,11 @@ class MockBitcoinWallet extends _i1.Mock implements _i25.BitcoinWallet {
             #index: index,
           },
         ),
-        returnValue: _i22.Future<_i29.Uint8List>.value(_i29.Uint8List(0)),
-      ) as _i22.Future<_i29.Uint8List>);
+        returnValue: _i23.Future<_i30.Uint8List>.value(_i30.Uint8List(0)),
+      ) as _i23.Future<_i30.Uint8List>);
   @override
-  _i22.Future<_i17.Address> currentReceivingPaynymAddress({
-    required _i18.PaymentCode? sender,
+  _i23.Future<_i18.Address> currentReceivingPaynymAddress({
+    required _i19.PaymentCode? sender,
     required bool? isSegwit,
   }) =>
       (super.noSuchMethod(
@@ -1368,7 +1415,7 @@ class MockBitcoinWallet extends _i1.Mock implements _i25.BitcoinWallet {
             #isSegwit: isSegwit,
           },
         ),
-        returnValue: _i22.Future<_i17.Address>.value(_FakeAddress_15(
+        returnValue: _i23.Future<_i18.Address>.value(_FakeAddress_16(
           this,
           Invocation.method(
             #currentReceivingPaynymAddress,
@@ -1379,10 +1426,10 @@ class MockBitcoinWallet extends _i1.Mock implements _i25.BitcoinWallet {
             },
           ),
         )),
-      ) as _i22.Future<_i17.Address>);
+      ) as _i23.Future<_i18.Address>);
   @override
-  _i22.Future<void> checkCurrentPaynymReceivingAddressForTransactions({
-    required _i18.PaymentCode? sender,
+  _i23.Future<void> checkCurrentPaynymReceivingAddressForTransactions({
+    required _i19.PaymentCode? sender,
     required bool? isSegwit,
   }) =>
       (super.noSuchMethod(
@@ -1394,42 +1441,42 @@ class MockBitcoinWallet extends _i1.Mock implements _i25.BitcoinWallet {
             #isSegwit: isSegwit,
           },
         ),
-        returnValue: _i22.Future<void>.value(),
-        returnValueForMissingStub: _i22.Future<void>.value(),
-      ) as _i22.Future<void>);
+        returnValue: _i23.Future<void>.value(),
+        returnValueForMissingStub: _i23.Future<void>.value(),
+      ) as _i23.Future<void>);
   @override
-  _i22.Future<void> checkAllCurrentReceivingPaynymAddressesForTransactions() =>
+  _i23.Future<void> checkAllCurrentReceivingPaynymAddressesForTransactions() =>
       (super.noSuchMethod(
         Invocation.method(
           #checkAllCurrentReceivingPaynymAddressesForTransactions,
           [],
         ),
-        returnValue: _i22.Future<void>.value(),
-        returnValueForMissingStub: _i22.Future<void>.value(),
-      ) as _i22.Future<void>);
+        returnValue: _i23.Future<void>.value(),
+        returnValueForMissingStub: _i23.Future<void>.value(),
+      ) as _i23.Future<void>);
   @override
-  _i22.Future<_i16.BIP32> deriveNotificationBip32Node() => (super.noSuchMethod(
+  _i23.Future<_i17.BIP32> deriveNotificationBip32Node() => (super.noSuchMethod(
         Invocation.method(
           #deriveNotificationBip32Node,
           [],
         ),
-        returnValue: _i22.Future<_i16.BIP32>.value(_FakeBIP32_14(
+        returnValue: _i23.Future<_i17.BIP32>.value(_FakeBIP32_15(
           this,
           Invocation.method(
             #deriveNotificationBip32Node,
             [],
           ),
         )),
-      ) as _i22.Future<_i16.BIP32>);
+      ) as _i23.Future<_i17.BIP32>);
   @override
-  _i22.Future<_i18.PaymentCode> getPaymentCode({required bool? isSegwit}) =>
+  _i23.Future<_i19.PaymentCode> getPaymentCode({required bool? isSegwit}) =>
       (super.noSuchMethod(
         Invocation.method(
           #getPaymentCode,
           [],
           {#isSegwit: isSegwit},
         ),
-        returnValue: _i22.Future<_i18.PaymentCode>.value(_FakePaymentCode_16(
+        returnValue: _i23.Future<_i19.PaymentCode>.value(_FakePaymentCode_17(
           this,
           Invocation.method(
             #getPaymentCode,
@@ -1437,28 +1484,28 @@ class MockBitcoinWallet extends _i1.Mock implements _i25.BitcoinWallet {
             {#isSegwit: isSegwit},
           ),
         )),
-      ) as _i22.Future<_i18.PaymentCode>);
+      ) as _i23.Future<_i19.PaymentCode>);
   @override
-  _i22.Future<_i29.Uint8List> signWithNotificationKey(_i29.Uint8List? data) =>
+  _i23.Future<_i30.Uint8List> signWithNotificationKey(_i30.Uint8List? data) =>
       (super.noSuchMethod(
         Invocation.method(
           #signWithNotificationKey,
           [data],
         ),
-        returnValue: _i22.Future<_i29.Uint8List>.value(_i29.Uint8List(0)),
-      ) as _i22.Future<_i29.Uint8List>);
+        returnValue: _i23.Future<_i30.Uint8List>.value(_i30.Uint8List(0)),
+      ) as _i23.Future<_i30.Uint8List>);
   @override
-  _i22.Future<String> signStringWithNotificationKey(String? data) =>
+  _i23.Future<String> signStringWithNotificationKey(String? data) =>
       (super.noSuchMethod(
         Invocation.method(
           #signStringWithNotificationKey,
           [data],
         ),
-        returnValue: _i22.Future<String>.value(''),
-      ) as _i22.Future<String>);
+        returnValue: _i23.Future<String>.value(''),
+      ) as _i23.Future<String>);
   @override
-  _i22.Future<Map<String, dynamic>> preparePaymentCodeSend({
-    required _i18.PaymentCode? paymentCode,
+  _i23.Future<Map<String, dynamic>> preparePaymentCodeSend({
+    required _i19.PaymentCode? paymentCode,
     required bool? isSegwit,
     required _i14.Amount? amount,
     Map<String, dynamic>? args,
@@ -1475,13 +1522,13 @@ class MockBitcoinWallet extends _i1.Mock implements _i25.BitcoinWallet {
           },
         ),
         returnValue:
-            _i22.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
-      ) as _i22.Future<Map<String, dynamic>>);
+            _i23.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
+      ) as _i23.Future<Map<String, dynamic>>);
   @override
-  _i22.Future<_i17.Address> nextUnusedSendAddressFrom({
-    required _i18.PaymentCode? pCode,
+  _i23.Future<_i18.Address> nextUnusedSendAddressFrom({
+    required _i19.PaymentCode? pCode,
     required bool? isSegwit,
-    required _i16.BIP32? privateKeyNode,
+    required _i17.BIP32? privateKeyNode,
     int? startIndex = 0,
   }) =>
       (super.noSuchMethod(
@@ -1495,7 +1542,7 @@ class MockBitcoinWallet extends _i1.Mock implements _i25.BitcoinWallet {
             #startIndex: startIndex,
           },
         ),
-        returnValue: _i22.Future<_i17.Address>.value(_FakeAddress_15(
+        returnValue: _i23.Future<_i18.Address>.value(_FakeAddress_16(
           this,
           Invocation.method(
             #nextUnusedSendAddressFrom,
@@ -1508,13 +1555,13 @@ class MockBitcoinWallet extends _i1.Mock implements _i25.BitcoinWallet {
             },
           ),
         )),
-      ) as _i22.Future<_i17.Address>);
+      ) as _i23.Future<_i18.Address>);
   @override
-  _i22.Future<Map<String, dynamic>> prepareNotificationTx({
+  _i23.Future<Map<String, dynamic>> prepareNotificationTx({
     required int? selectedTxFeeRate,
     required String? targetPaymentCodeString,
     int? additionalOutputs = 0,
-    List<_i17.UTXO>? utxos,
+    List<_i18.UTXO>? utxos,
   }) =>
       (super.noSuchMethod(
         Invocation.method(
@@ -1528,10 +1575,10 @@ class MockBitcoinWallet extends _i1.Mock implements _i25.BitcoinWallet {
           },
         ),
         returnValue:
-            _i22.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
-      ) as _i22.Future<Map<String, dynamic>>);
+            _i23.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
+      ) as _i23.Future<Map<String, dynamic>>);
   @override
-  _i22.Future<String> broadcastNotificationTx(
+  _i23.Future<String> broadcastNotificationTx(
           {required Map<String, dynamic>? preparedTx}) =>
       (super.noSuchMethod(
         Invocation.method(
@@ -1539,62 +1586,62 @@ class MockBitcoinWallet extends _i1.Mock implements _i25.BitcoinWallet {
           [],
           {#preparedTx: preparedTx},
         ),
-        returnValue: _i22.Future<String>.value(''),
-      ) as _i22.Future<String>);
+        returnValue: _i23.Future<String>.value(''),
+      ) as _i23.Future<String>);
   @override
-  _i22.Future<bool> hasConnected(String? paymentCodeString) =>
+  _i23.Future<bool> hasConnected(String? paymentCodeString) =>
       (super.noSuchMethod(
         Invocation.method(
           #hasConnected,
           [paymentCodeString],
         ),
-        returnValue: _i22.Future<bool>.value(false),
-      ) as _i22.Future<bool>);
+        returnValue: _i23.Future<bool>.value(false),
+      ) as _i23.Future<bool>);
   @override
-  _i22.Future<_i18.PaymentCode?> unBlindedPaymentCodeFromTransaction(
-          {required _i17.Transaction? transaction}) =>
+  _i23.Future<_i19.PaymentCode?> unBlindedPaymentCodeFromTransaction(
+          {required _i18.Transaction? transaction}) =>
       (super.noSuchMethod(
         Invocation.method(
           #unBlindedPaymentCodeFromTransaction,
           [],
           {#transaction: transaction},
         ),
-        returnValue: _i22.Future<_i18.PaymentCode?>.value(),
-      ) as _i22.Future<_i18.PaymentCode?>);
+        returnValue: _i23.Future<_i19.PaymentCode?>.value(),
+      ) as _i23.Future<_i19.PaymentCode?>);
   @override
-  _i22.Future<_i18.PaymentCode?> unBlindedPaymentCodeFromTransactionBad(
-          {required _i17.Transaction? transaction}) =>
+  _i23.Future<_i19.PaymentCode?> unBlindedPaymentCodeFromTransactionBad(
+          {required _i18.Transaction? transaction}) =>
       (super.noSuchMethod(
         Invocation.method(
           #unBlindedPaymentCodeFromTransactionBad,
           [],
           {#transaction: transaction},
         ),
-        returnValue: _i22.Future<_i18.PaymentCode?>.value(),
-      ) as _i22.Future<_i18.PaymentCode?>);
+        returnValue: _i23.Future<_i19.PaymentCode?>.value(),
+      ) as _i23.Future<_i19.PaymentCode?>);
   @override
-  _i22.Future<List<_i18.PaymentCode>>
+  _i23.Future<List<_i19.PaymentCode>>
       getAllPaymentCodesFromNotificationTransactions() => (super.noSuchMethod(
             Invocation.method(
               #getAllPaymentCodesFromNotificationTransactions,
               [],
             ),
             returnValue:
-                _i22.Future<List<_i18.PaymentCode>>.value(<_i18.PaymentCode>[]),
-          ) as _i22.Future<List<_i18.PaymentCode>>);
+                _i23.Future<List<_i19.PaymentCode>>.value(<_i19.PaymentCode>[]),
+          ) as _i23.Future<List<_i19.PaymentCode>>);
   @override
-  _i22.Future<void> checkForNotificationTransactionsTo(
+  _i23.Future<void> checkForNotificationTransactionsTo(
           Set<String>? otherCodeStrings) =>
       (super.noSuchMethod(
         Invocation.method(
           #checkForNotificationTransactionsTo,
           [otherCodeStrings],
         ),
-        returnValue: _i22.Future<void>.value(),
-        returnValueForMissingStub: _i22.Future<void>.value(),
-      ) as _i22.Future<void>);
+        returnValue: _i23.Future<void>.value(),
+        returnValueForMissingStub: _i23.Future<void>.value(),
+      ) as _i23.Future<void>);
   @override
-  _i22.Future<void> restoreAllHistory({
+  _i23.Future<void> restoreAllHistory({
     required int? maxUnusedAddressGap,
     required int? maxNumberOfIndexesToCheck,
     required Set<String>? paymentCodeStrings,
@@ -1609,12 +1656,12 @@ class MockBitcoinWallet extends _i1.Mock implements _i25.BitcoinWallet {
             #paymentCodeStrings: paymentCodeStrings,
           },
         ),
-        returnValue: _i22.Future<void>.value(),
-        returnValueForMissingStub: _i22.Future<void>.value(),
-      ) as _i22.Future<void>);
+        returnValue: _i23.Future<void>.value(),
+        returnValueForMissingStub: _i23.Future<void>.value(),
+      ) as _i23.Future<void>);
   @override
-  _i22.Future<void> restoreHistoryWith({
-    required _i18.PaymentCode? other,
+  _i23.Future<void> restoreHistoryWith({
+    required _i19.PaymentCode? other,
     required bool? checkSegwitAsWell,
     required int? maxUnusedAddressGap,
     required int? maxNumberOfIndexesToCheck,
@@ -1630,58 +1677,58 @@ class MockBitcoinWallet extends _i1.Mock implements _i25.BitcoinWallet {
             #maxNumberOfIndexesToCheck: maxNumberOfIndexesToCheck,
           },
         ),
-        returnValue: _i22.Future<void>.value(),
-        returnValueForMissingStub: _i22.Future<void>.value(),
-      ) as _i22.Future<void>);
+        returnValue: _i23.Future<void>.value(),
+        returnValueForMissingStub: _i23.Future<void>.value(),
+      ) as _i23.Future<void>);
   @override
-  _i22.Future<_i17.Address> getMyNotificationAddress() => (super.noSuchMethod(
+  _i23.Future<_i18.Address> getMyNotificationAddress() => (super.noSuchMethod(
         Invocation.method(
           #getMyNotificationAddress,
           [],
         ),
-        returnValue: _i22.Future<_i17.Address>.value(_FakeAddress_15(
+        returnValue: _i23.Future<_i18.Address>.value(_FakeAddress_16(
           this,
           Invocation.method(
             #getMyNotificationAddress,
             [],
           ),
         )),
-      ) as _i22.Future<_i17.Address>);
+      ) as _i23.Future<_i18.Address>);
   @override
-  _i22.Future<List<String>> lookupKey(String? paymentCodeString) =>
+  _i23.Future<List<String>> lookupKey(String? paymentCodeString) =>
       (super.noSuchMethod(
         Invocation.method(
           #lookupKey,
           [paymentCodeString],
         ),
-        returnValue: _i22.Future<List<String>>.value(<String>[]),
-      ) as _i22.Future<List<String>>);
+        returnValue: _i23.Future<List<String>>.value(<String>[]),
+      ) as _i23.Future<List<String>>);
   @override
-  _i22.Future<String?> paymentCodeStringByKey(String? key) =>
+  _i23.Future<String?> paymentCodeStringByKey(String? key) =>
       (super.noSuchMethod(
         Invocation.method(
           #paymentCodeStringByKey,
           [key],
         ),
-        returnValue: _i22.Future<String?>.value(),
-      ) as _i22.Future<String?>);
+        returnValue: _i23.Future<String?>.value(),
+      ) as _i23.Future<String?>);
   @override
-  _i22.Future<String> storeCode(String? paymentCodeString) =>
+  _i23.Future<String> storeCode(String? paymentCodeString) =>
       (super.noSuchMethod(
         Invocation.method(
           #storeCode,
           [paymentCodeString],
         ),
-        returnValue: _i22.Future<String>.value(''),
-      ) as _i22.Future<String>);
+        returnValue: _i23.Future<String>.value(''),
+      ) as _i23.Future<String>);
   @override
   void initCoinControlInterface({
     required String? walletId,
     required String? walletName,
-    required _i21.Coin? coin,
+    required _i22.Coin? coin,
     required _i12.MainDB? db,
-    required _i22.Future<int> Function()? getChainHeight,
-    required _i22.Future<void> Function(_i11.Balance)? refreshedBalanceCallback,
+    required _i23.Future<int> Function()? getChainHeight,
+    required _i23.Future<void> Function(_i11.Balance)? refreshedBalanceCallback,
   }) =>
       super.noSuchMethod(
         Invocation.method(
@@ -1699,22 +1746,22 @@ class MockBitcoinWallet extends _i1.Mock implements _i25.BitcoinWallet {
         returnValueForMissingStub: null,
       );
   @override
-  _i22.Future<void> refreshBalance({bool? notify = false}) =>
+  _i23.Future<void> refreshBalance({bool? notify = false}) =>
       (super.noSuchMethod(
         Invocation.method(
           #refreshBalance,
           [],
           {#notify: notify},
         ),
-        returnValue: _i22.Future<void>.value(),
-        returnValueForMissingStub: _i22.Future<void>.value(),
-      ) as _i22.Future<void>);
+        returnValue: _i23.Future<void>.value(),
+        returnValueForMissingStub: _i23.Future<void>.value(),
+      ) as _i23.Future<void>);
 }
 
 /// A class which mocks [LocaleService].
 ///
 /// See the documentation for Mockito's code generation for more information.
-class MockLocaleService extends _i1.Mock implements _i30.LocaleService {
+class MockLocaleService extends _i1.Mock implements _i31.LocaleService {
   MockLocaleService() {
     _i1.throwOnMissingStub(this);
   }
@@ -1730,17 +1777,17 @@ class MockLocaleService extends _i1.Mock implements _i30.LocaleService {
         returnValue: false,
       ) as bool);
   @override
-  _i22.Future<void> loadLocale({bool? notify = true}) => (super.noSuchMethod(
+  _i23.Future<void> loadLocale({bool? notify = true}) => (super.noSuchMethod(
         Invocation.method(
           #loadLocale,
           [],
           {#notify: notify},
         ),
-        returnValue: _i22.Future<void>.value(),
-        returnValueForMissingStub: _i22.Future<void>.value(),
-      ) as _i22.Future<void>);
+        returnValue: _i23.Future<void>.value(),
+        returnValueForMissingStub: _i23.Future<void>.value(),
+      ) as _i23.Future<void>);
   @override
-  void addListener(_i24.VoidCallback? listener) => super.noSuchMethod(
+  void addListener(_i25.VoidCallback? listener) => super.noSuchMethod(
         Invocation.method(
           #addListener,
           [listener],
@@ -1748,7 +1795,7 @@ class MockLocaleService extends _i1.Mock implements _i30.LocaleService {
         returnValueForMissingStub: null,
       );
   @override
-  void removeListener(_i24.VoidCallback? listener) => super.noSuchMethod(
+  void removeListener(_i25.VoidCallback? listener) => super.noSuchMethod(
         Invocation.method(
           #removeListener,
           [listener],
@@ -1776,21 +1823,21 @@ class MockLocaleService extends _i1.Mock implements _i30.LocaleService {
 /// A class which mocks [ThemeService].
 ///
 /// See the documentation for Mockito's code generation for more information.
-class MockThemeService extends _i1.Mock implements _i31.ThemeService {
+class MockThemeService extends _i1.Mock implements _i32.ThemeService {
   MockThemeService() {
     _i1.throwOnMissingStub(this);
   }
 
   @override
-  _i19.HTTP get client => (super.noSuchMethod(
+  _i20.HTTP get client => (super.noSuchMethod(
         Invocation.getter(#client),
-        returnValue: _FakeHTTP_17(
+        returnValue: _FakeHTTP_18(
           this,
           Invocation.getter(#client),
         ),
-      ) as _i19.HTTP);
+      ) as _i20.HTTP);
   @override
-  set client(_i19.HTTP? _client) => super.noSuchMethod(
+  set client(_i20.HTTP? _client) => super.noSuchMethod(
         Invocation.setter(
           #client,
           _client,
@@ -1806,10 +1853,10 @@ class MockThemeService extends _i1.Mock implements _i31.ThemeService {
         ),
       ) as _i12.MainDB);
   @override
-  List<_i32.StackTheme> get installedThemes => (super.noSuchMethod(
+  List<_i33.StackTheme> get installedThemes => (super.noSuchMethod(
         Invocation.getter(#installedThemes),
-        returnValue: <_i32.StackTheme>[],
-      ) as List<_i32.StackTheme>);
+        returnValue: <_i33.StackTheme>[],
+      ) as List<_i33.StackTheme>);
   @override
   void init(_i12.MainDB? db) => super.noSuchMethod(
         Invocation.method(
@@ -1819,71 +1866,71 @@ class MockThemeService extends _i1.Mock implements _i31.ThemeService {
         returnValueForMissingStub: null,
       );
   @override
-  _i22.Future<void> install({required _i29.Uint8List? themeArchiveData}) =>
+  _i23.Future<void> install({required _i30.Uint8List? themeArchiveData}) =>
       (super.noSuchMethod(
         Invocation.method(
           #install,
           [],
           {#themeArchiveData: themeArchiveData},
         ),
-        returnValue: _i22.Future<void>.value(),
-        returnValueForMissingStub: _i22.Future<void>.value(),
-      ) as _i22.Future<void>);
+        returnValue: _i23.Future<void>.value(),
+        returnValueForMissingStub: _i23.Future<void>.value(),
+      ) as _i23.Future<void>);
   @override
-  _i22.Future<void> remove({required String? themeId}) => (super.noSuchMethod(
+  _i23.Future<void> remove({required String? themeId}) => (super.noSuchMethod(
         Invocation.method(
           #remove,
           [],
           {#themeId: themeId},
         ),
-        returnValue: _i22.Future<void>.value(),
-        returnValueForMissingStub: _i22.Future<void>.value(),
-      ) as _i22.Future<void>);
+        returnValue: _i23.Future<void>.value(),
+        returnValueForMissingStub: _i23.Future<void>.value(),
+      ) as _i23.Future<void>);
   @override
-  _i22.Future<void> checkDefaultThemesOnStartup() => (super.noSuchMethod(
+  _i23.Future<void> checkDefaultThemesOnStartup() => (super.noSuchMethod(
         Invocation.method(
           #checkDefaultThemesOnStartup,
           [],
         ),
-        returnValue: _i22.Future<void>.value(),
-        returnValueForMissingStub: _i22.Future<void>.value(),
-      ) as _i22.Future<void>);
+        returnValue: _i23.Future<void>.value(),
+        returnValueForMissingStub: _i23.Future<void>.value(),
+      ) as _i23.Future<void>);
   @override
-  _i22.Future<bool> verifyInstalled({required String? themeId}) =>
+  _i23.Future<bool> verifyInstalled({required String? themeId}) =>
       (super.noSuchMethod(
         Invocation.method(
           #verifyInstalled,
           [],
           {#themeId: themeId},
         ),
-        returnValue: _i22.Future<bool>.value(false),
-      ) as _i22.Future<bool>);
+        returnValue: _i23.Future<bool>.value(false),
+      ) as _i23.Future<bool>);
   @override
-  _i22.Future<List<_i31.StackThemeMetaData>> fetchThemes() =>
+  _i23.Future<List<_i32.StackThemeMetaData>> fetchThemes() =>
       (super.noSuchMethod(
         Invocation.method(
           #fetchThemes,
           [],
         ),
-        returnValue: _i22.Future<List<_i31.StackThemeMetaData>>.value(
-            <_i31.StackThemeMetaData>[]),
-      ) as _i22.Future<List<_i31.StackThemeMetaData>>);
+        returnValue: _i23.Future<List<_i32.StackThemeMetaData>>.value(
+            <_i32.StackThemeMetaData>[]),
+      ) as _i23.Future<List<_i32.StackThemeMetaData>>);
   @override
-  _i22.Future<_i29.Uint8List> fetchTheme(
-          {required _i31.StackThemeMetaData? themeMetaData}) =>
+  _i23.Future<_i30.Uint8List> fetchTheme(
+          {required _i32.StackThemeMetaData? themeMetaData}) =>
       (super.noSuchMethod(
         Invocation.method(
           #fetchTheme,
           [],
           {#themeMetaData: themeMetaData},
         ),
-        returnValue: _i22.Future<_i29.Uint8List>.value(_i29.Uint8List(0)),
-      ) as _i22.Future<_i29.Uint8List>);
+        returnValue: _i23.Future<_i30.Uint8List>.value(_i30.Uint8List(0)),
+      ) as _i23.Future<_i30.Uint8List>);
   @override
-  _i32.StackTheme? getTheme({required String? themeId}) =>
+  _i33.StackTheme? getTheme({required String? themeId}) =>
       (super.noSuchMethod(Invocation.method(
         #getTheme,
         [],
         {#themeId: themeId},
-      )) as _i32.StackTheme?);
+      )) as _i33.StackTheme?);
 }
diff --git a/test/widget_tests/wallet_info_row/sub_widgets/wallet_info_row_balance_future_test.mocks.dart b/test/widget_tests/wallet_info_row/sub_widgets/wallet_info_row_balance_future_test.mocks.dart
index ef519d4c9..392c6df41 100644
--- a/test/widget_tests/wallet_info_row/sub_widgets/wallet_info_row_balance_future_test.mocks.dart
+++ b/test/widget_tests/wallet_info_row/sub_widgets/wallet_info_row_balance_future_test.mocks.dart
@@ -3,12 +3,12 @@
 // Do not manually edit this file.
 
 // ignore_for_file: no_leading_underscores_for_library_prefixes
-import 'dart:async' as _i23;
-import 'dart:typed_data' as _i29;
-import 'dart:ui' as _i25;
+import 'dart:async' as _i24;
+import 'dart:typed_data' as _i30;
+import 'dart:ui' as _i26;
 
-import 'package:bip32/bip32.dart' as _i16;
-import 'package:bip47/bip47.dart' as _i18;
+import 'package:bip32/bip32.dart' as _i17;
+import 'package:bip47/bip47.dart' as _i19;
 import 'package:bitcoindart/bitcoindart.dart' as _i13;
 import 'package:flutter/foundation.dart' as _i4;
 import 'package:flutter_riverpod/flutter_riverpod.dart' as _i5;
@@ -17,25 +17,27 @@ import 'package:stackwallet/db/isar/main_db.dart' as _i12;
 import 'package:stackwallet/electrumx_rpc/cached_electrumx.dart' as _i10;
 import 'package:stackwallet/electrumx_rpc/electrumx.dart' as _i9;
 import 'package:stackwallet/models/balance.dart' as _i11;
-import 'package:stackwallet/models/isar/models/isar_models.dart' as _i17;
-import 'package:stackwallet/models/node_model.dart' as _i30;
+import 'package:stackwallet/models/isar/models/blockchain_data/v2/transaction_v2.dart'
+    as _i15;
+import 'package:stackwallet/models/isar/models/isar_models.dart' as _i18;
+import 'package:stackwallet/models/node_model.dart' as _i31;
 import 'package:stackwallet/models/paymint/fee_object_model.dart' as _i8;
-import 'package:stackwallet/models/signing_data.dart' as _i28;
-import 'package:stackwallet/services/coins/bitcoin/bitcoin_wallet.dart' as _i26;
-import 'package:stackwallet/services/coins/coin_service.dart' as _i20;
+import 'package:stackwallet/models/signing_data.dart' as _i29;
+import 'package:stackwallet/services/coins/bitcoin/bitcoin_wallet.dart' as _i27;
+import 'package:stackwallet/services/coins/coin_service.dart' as _i21;
 import 'package:stackwallet/services/coins/manager.dart' as _i6;
 import 'package:stackwallet/services/node_service.dart' as _i3;
 import 'package:stackwallet/services/transaction_notification_tracker.dart'
     as _i7;
-import 'package:stackwallet/services/wallets.dart' as _i21;
+import 'package:stackwallet/services/wallets.dart' as _i22;
 import 'package:stackwallet/services/wallets_service.dart' as _i2;
 import 'package:stackwallet/utilities/amount/amount.dart' as _i14;
-import 'package:stackwallet/utilities/enums/coin_enum.dart' as _i22;
-import 'package:stackwallet/utilities/enums/derive_path_type_enum.dart' as _i27;
+import 'package:stackwallet/utilities/enums/coin_enum.dart' as _i23;
+import 'package:stackwallet/utilities/enums/derive_path_type_enum.dart' as _i28;
 import 'package:stackwallet/utilities/flutter_secure_storage_interface.dart'
-    as _i19;
-import 'package:stackwallet/utilities/prefs.dart' as _i24;
-import 'package:tuple/tuple.dart' as _i15;
+    as _i20;
+import 'package:stackwallet/utilities/prefs.dart' as _i25;
+import 'package:tuple/tuple.dart' as _i16;
 
 // ignore_for_file: type=lint
 // ignore_for_file: avoid_redundant_argument_values
@@ -182,9 +184,9 @@ class _FakeAmount_12 extends _i1.SmartFake implements _i14.Amount {
         );
 }
 
-class _FakeTuple2_13<T1, T2> extends _i1.SmartFake
-    implements _i15.Tuple2<T1, T2> {
-  _FakeTuple2_13(
+class _FakeTransactionV2_13 extends _i1.SmartFake
+    implements _i15.TransactionV2 {
+  _FakeTransactionV2_13(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -193,8 +195,9 @@ class _FakeTuple2_13<T1, T2> extends _i1.SmartFake
         );
 }
 
-class _FakeBIP32_14 extends _i1.SmartFake implements _i16.BIP32 {
-  _FakeBIP32_14(
+class _FakeTuple2_14<T1, T2> extends _i1.SmartFake
+    implements _i16.Tuple2<T1, T2> {
+  _FakeTuple2_14(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -203,8 +206,8 @@ class _FakeBIP32_14 extends _i1.SmartFake implements _i16.BIP32 {
         );
 }
 
-class _FakeAddress_15 extends _i1.SmartFake implements _i17.Address {
-  _FakeAddress_15(
+class _FakeBIP32_15 extends _i1.SmartFake implements _i17.BIP32 {
+  _FakeBIP32_15(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -213,8 +216,8 @@ class _FakeAddress_15 extends _i1.SmartFake implements _i17.Address {
         );
 }
 
-class _FakePaymentCode_16 extends _i1.SmartFake implements _i18.PaymentCode {
-  _FakePaymentCode_16(
+class _FakeAddress_16 extends _i1.SmartFake implements _i18.Address {
+  _FakeAddress_16(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -223,9 +226,8 @@ class _FakePaymentCode_16 extends _i1.SmartFake implements _i18.PaymentCode {
         );
 }
 
-class _FakeSecureStorageInterface_17 extends _i1.SmartFake
-    implements _i19.SecureStorageInterface {
-  _FakeSecureStorageInterface_17(
+class _FakePaymentCode_17 extends _i1.SmartFake implements _i19.PaymentCode {
+  _FakePaymentCode_17(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -234,9 +236,20 @@ class _FakeSecureStorageInterface_17 extends _i1.SmartFake
         );
 }
 
-class _FakeCoinServiceAPI_18 extends _i1.SmartFake
-    implements _i20.CoinServiceAPI {
-  _FakeCoinServiceAPI_18(
+class _FakeSecureStorageInterface_18 extends _i1.SmartFake
+    implements _i20.SecureStorageInterface {
+  _FakeSecureStorageInterface_18(
+    Object parent,
+    Invocation parentInvocation,
+  ) : super(
+          parent,
+          parentInvocation,
+        );
+}
+
+class _FakeCoinServiceAPI_19 extends _i1.SmartFake
+    implements _i21.CoinServiceAPI {
+  _FakeCoinServiceAPI_19(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -248,7 +261,7 @@ class _FakeCoinServiceAPI_18 extends _i1.SmartFake
 /// A class which mocks [Wallets].
 ///
 /// See the documentation for Mockito's code generation for more information.
-class MockWallets extends _i1.Mock implements _i21.Wallets {
+class MockWallets extends _i1.Mock implements _i22.Wallets {
   MockWallets() {
     _i1.throwOnMissingStub(this);
   }
@@ -315,7 +328,7 @@ class MockWallets extends _i1.Mock implements _i21.Wallets {
         returnValueForMissingStub: null,
       );
   @override
-  List<String> getWalletIdsFor({required _i22.Coin? coin}) =>
+  List<String> getWalletIdsFor({required _i23.Coin? coin}) =>
       (super.noSuchMethod(
         Invocation.method(
           #getWalletIdsFor,
@@ -325,20 +338,20 @@ class MockWallets extends _i1.Mock implements _i21.Wallets {
         returnValue: <String>[],
       ) as List<String>);
   @override
-  List<_i15.Tuple2<_i22.Coin, List<_i5.ChangeNotifierProvider<_i6.Manager>>>>
+  List<_i16.Tuple2<_i23.Coin, List<_i5.ChangeNotifierProvider<_i6.Manager>>>>
       getManagerProvidersByCoin() => (super.noSuchMethod(
             Invocation.method(
               #getManagerProvidersByCoin,
               [],
             ),
-            returnValue: <_i15.Tuple2<_i22.Coin,
+            returnValue: <_i16.Tuple2<_i23.Coin,
                 List<_i5.ChangeNotifierProvider<_i6.Manager>>>>[],
           ) as List<
-              _i15.Tuple2<_i22.Coin,
+              _i16.Tuple2<_i23.Coin,
                   List<_i5.ChangeNotifierProvider<_i6.Manager>>>>);
   @override
   List<_i5.ChangeNotifierProvider<_i6.Manager>> getManagerProvidersForCoin(
-          _i22.Coin? coin) =>
+          _i23.Coin? coin) =>
       (super.noSuchMethod(
         Invocation.method(
           #getManagerProvidersForCoin,
@@ -402,17 +415,17 @@ class MockWallets extends _i1.Mock implements _i21.Wallets {
         returnValueForMissingStub: null,
       );
   @override
-  _i23.Future<void> load(_i24.Prefs? prefs) => (super.noSuchMethod(
+  _i24.Future<void> load(_i25.Prefs? prefs) => (super.noSuchMethod(
         Invocation.method(
           #load,
           [prefs],
         ),
-        returnValue: _i23.Future<void>.value(),
-        returnValueForMissingStub: _i23.Future<void>.value(),
-      ) as _i23.Future<void>);
+        returnValue: _i24.Future<void>.value(),
+        returnValueForMissingStub: _i24.Future<void>.value(),
+      ) as _i24.Future<void>);
   @override
-  _i23.Future<void> loadAfterStackRestore(
-    _i24.Prefs? prefs,
+  _i24.Future<void> loadAfterStackRestore(
+    _i25.Prefs? prefs,
     List<_i6.Manager>? managers,
   ) =>
       (super.noSuchMethod(
@@ -423,11 +436,11 @@ class MockWallets extends _i1.Mock implements _i21.Wallets {
             managers,
           ],
         ),
-        returnValue: _i23.Future<void>.value(),
-        returnValueForMissingStub: _i23.Future<void>.value(),
-      ) as _i23.Future<void>);
+        returnValue: _i24.Future<void>.value(),
+        returnValueForMissingStub: _i24.Future<void>.value(),
+      ) as _i24.Future<void>);
   @override
-  void addListener(_i25.VoidCallback? listener) => super.noSuchMethod(
+  void addListener(_i26.VoidCallback? listener) => super.noSuchMethod(
         Invocation.method(
           #addListener,
           [listener],
@@ -435,7 +448,7 @@ class MockWallets extends _i1.Mock implements _i21.Wallets {
         returnValueForMissingStub: null,
       );
   @override
-  void removeListener(_i25.VoidCallback? listener) => super.noSuchMethod(
+  void removeListener(_i26.VoidCallback? listener) => super.noSuchMethod(
         Invocation.method(
           #removeListener,
           [listener],
@@ -461,19 +474,19 @@ class MockWalletsService extends _i1.Mock implements _i2.WalletsService {
   }
 
   @override
-  _i23.Future<Map<String, _i2.WalletInfo>> get walletNames =>
+  _i24.Future<Map<String, _i2.WalletInfo>> get walletNames =>
       (super.noSuchMethod(
         Invocation.getter(#walletNames),
-        returnValue: _i23.Future<Map<String, _i2.WalletInfo>>.value(
+        returnValue: _i24.Future<Map<String, _i2.WalletInfo>>.value(
             <String, _i2.WalletInfo>{}),
-      ) as _i23.Future<Map<String, _i2.WalletInfo>>);
+      ) as _i24.Future<Map<String, _i2.WalletInfo>>);
   @override
   bool get hasListeners => (super.noSuchMethod(
         Invocation.getter(#hasListeners),
         returnValue: false,
       ) as bool);
   @override
-  _i23.Future<bool> renameWallet({
+  _i24.Future<bool> renameWallet({
     required String? from,
     required String? to,
     required bool? shouldNotifyListeners,
@@ -488,8 +501,8 @@ class MockWalletsService extends _i1.Mock implements _i2.WalletsService {
             #shouldNotifyListeners: shouldNotifyListeners,
           },
         ),
-        returnValue: _i23.Future<bool>.value(false),
-      ) as _i23.Future<bool>);
+        returnValue: _i24.Future<bool>.value(false),
+      ) as _i24.Future<bool>);
   @override
   Map<String, _i2.WalletInfo> fetchWalletsData() => (super.noSuchMethod(
         Invocation.method(
@@ -499,10 +512,10 @@ class MockWalletsService extends _i1.Mock implements _i2.WalletsService {
         returnValue: <String, _i2.WalletInfo>{},
       ) as Map<String, _i2.WalletInfo>);
   @override
-  _i23.Future<void> addExistingStackWallet({
+  _i24.Future<void> addExistingStackWallet({
     required String? name,
     required String? walletId,
-    required _i22.Coin? coin,
+    required _i23.Coin? coin,
     required bool? shouldNotifyListeners,
   }) =>
       (super.noSuchMethod(
@@ -516,13 +529,13 @@ class MockWalletsService extends _i1.Mock implements _i2.WalletsService {
             #shouldNotifyListeners: shouldNotifyListeners,
           },
         ),
-        returnValue: _i23.Future<void>.value(),
-        returnValueForMissingStub: _i23.Future<void>.value(),
-      ) as _i23.Future<void>);
+        returnValue: _i24.Future<void>.value(),
+        returnValueForMissingStub: _i24.Future<void>.value(),
+      ) as _i24.Future<void>);
   @override
-  _i23.Future<String?> addNewWallet({
+  _i24.Future<String?> addNewWallet({
     required String? name,
-    required _i22.Coin? coin,
+    required _i23.Coin? coin,
     required bool? shouldNotifyListeners,
   }) =>
       (super.noSuchMethod(
@@ -535,46 +548,46 @@ class MockWalletsService extends _i1.Mock implements _i2.WalletsService {
             #shouldNotifyListeners: shouldNotifyListeners,
           },
         ),
-        returnValue: _i23.Future<String?>.value(),
-      ) as _i23.Future<String?>);
+        returnValue: _i24.Future<String?>.value(),
+      ) as _i24.Future<String?>);
   @override
-  _i23.Future<List<String>> getFavoriteWalletIds() => (super.noSuchMethod(
+  _i24.Future<List<String>> getFavoriteWalletIds() => (super.noSuchMethod(
         Invocation.method(
           #getFavoriteWalletIds,
           [],
         ),
-        returnValue: _i23.Future<List<String>>.value(<String>[]),
-      ) as _i23.Future<List<String>>);
+        returnValue: _i24.Future<List<String>>.value(<String>[]),
+      ) as _i24.Future<List<String>>);
   @override
-  _i23.Future<void> saveFavoriteWalletIds(List<String>? walletIds) =>
+  _i24.Future<void> saveFavoriteWalletIds(List<String>? walletIds) =>
       (super.noSuchMethod(
         Invocation.method(
           #saveFavoriteWalletIds,
           [walletIds],
         ),
-        returnValue: _i23.Future<void>.value(),
-        returnValueForMissingStub: _i23.Future<void>.value(),
-      ) as _i23.Future<void>);
+        returnValue: _i24.Future<void>.value(),
+        returnValueForMissingStub: _i24.Future<void>.value(),
+      ) as _i24.Future<void>);
   @override
-  _i23.Future<void> addFavorite(String? walletId) => (super.noSuchMethod(
+  _i24.Future<void> addFavorite(String? walletId) => (super.noSuchMethod(
         Invocation.method(
           #addFavorite,
           [walletId],
         ),
-        returnValue: _i23.Future<void>.value(),
-        returnValueForMissingStub: _i23.Future<void>.value(),
-      ) as _i23.Future<void>);
+        returnValue: _i24.Future<void>.value(),
+        returnValueForMissingStub: _i24.Future<void>.value(),
+      ) as _i24.Future<void>);
   @override
-  _i23.Future<void> removeFavorite(String? walletId) => (super.noSuchMethod(
+  _i24.Future<void> removeFavorite(String? walletId) => (super.noSuchMethod(
         Invocation.method(
           #removeFavorite,
           [walletId],
         ),
-        returnValue: _i23.Future<void>.value(),
-        returnValueForMissingStub: _i23.Future<void>.value(),
-      ) as _i23.Future<void>);
+        returnValue: _i24.Future<void>.value(),
+        returnValueForMissingStub: _i24.Future<void>.value(),
+      ) as _i24.Future<void>);
   @override
-  _i23.Future<void> moveFavorite({
+  _i24.Future<void> moveFavorite({
     required int? fromIndex,
     required int? toIndex,
   }) =>
@@ -587,48 +600,48 @@ class MockWalletsService extends _i1.Mock implements _i2.WalletsService {
             #toIndex: toIndex,
           },
         ),
-        returnValue: _i23.Future<void>.value(),
-        returnValueForMissingStub: _i23.Future<void>.value(),
-      ) as _i23.Future<void>);
+        returnValue: _i24.Future<void>.value(),
+        returnValueForMissingStub: _i24.Future<void>.value(),
+      ) as _i24.Future<void>);
   @override
-  _i23.Future<bool> checkForDuplicate(String? name) => (super.noSuchMethod(
+  _i24.Future<bool> checkForDuplicate(String? name) => (super.noSuchMethod(
         Invocation.method(
           #checkForDuplicate,
           [name],
         ),
-        returnValue: _i23.Future<bool>.value(false),
-      ) as _i23.Future<bool>);
+        returnValue: _i24.Future<bool>.value(false),
+      ) as _i24.Future<bool>);
   @override
-  _i23.Future<String?> getWalletId(String? walletName) => (super.noSuchMethod(
+  _i24.Future<String?> getWalletId(String? walletName) => (super.noSuchMethod(
         Invocation.method(
           #getWalletId,
           [walletName],
         ),
-        returnValue: _i23.Future<String?>.value(),
-      ) as _i23.Future<String?>);
+        returnValue: _i24.Future<String?>.value(),
+      ) as _i24.Future<String?>);
   @override
-  _i23.Future<bool> isMnemonicVerified({required String? walletId}) =>
+  _i24.Future<bool> isMnemonicVerified({required String? walletId}) =>
       (super.noSuchMethod(
         Invocation.method(
           #isMnemonicVerified,
           [],
           {#walletId: walletId},
         ),
-        returnValue: _i23.Future<bool>.value(false),
-      ) as _i23.Future<bool>);
+        returnValue: _i24.Future<bool>.value(false),
+      ) as _i24.Future<bool>);
   @override
-  _i23.Future<void> setMnemonicVerified({required String? walletId}) =>
+  _i24.Future<void> setMnemonicVerified({required String? walletId}) =>
       (super.noSuchMethod(
         Invocation.method(
           #setMnemonicVerified,
           [],
           {#walletId: walletId},
         ),
-        returnValue: _i23.Future<void>.value(),
-        returnValueForMissingStub: _i23.Future<void>.value(),
-      ) as _i23.Future<void>);
+        returnValue: _i24.Future<void>.value(),
+        returnValueForMissingStub: _i24.Future<void>.value(),
+      ) as _i24.Future<void>);
   @override
-  _i23.Future<int> deleteWallet(
+  _i24.Future<int> deleteWallet(
     String? name,
     bool? shouldNotifyListeners,
   ) =>
@@ -640,20 +653,20 @@ class MockWalletsService extends _i1.Mock implements _i2.WalletsService {
             shouldNotifyListeners,
           ],
         ),
-        returnValue: _i23.Future<int>.value(0),
-      ) as _i23.Future<int>);
+        returnValue: _i24.Future<int>.value(0),
+      ) as _i24.Future<int>);
   @override
-  _i23.Future<void> refreshWallets(bool? shouldNotifyListeners) =>
+  _i24.Future<void> refreshWallets(bool? shouldNotifyListeners) =>
       (super.noSuchMethod(
         Invocation.method(
           #refreshWallets,
           [shouldNotifyListeners],
         ),
-        returnValue: _i23.Future<void>.value(),
-        returnValueForMissingStub: _i23.Future<void>.value(),
-      ) as _i23.Future<void>);
+        returnValue: _i24.Future<void>.value(),
+        returnValueForMissingStub: _i24.Future<void>.value(),
+      ) as _i24.Future<void>);
   @override
-  void addListener(_i25.VoidCallback? listener) => super.noSuchMethod(
+  void addListener(_i26.VoidCallback? listener) => super.noSuchMethod(
         Invocation.method(
           #addListener,
           [listener],
@@ -661,7 +674,7 @@ class MockWalletsService extends _i1.Mock implements _i2.WalletsService {
         returnValueForMissingStub: null,
       );
   @override
-  void removeListener(_i25.VoidCallback? listener) => super.noSuchMethod(
+  void removeListener(_i26.VoidCallback? listener) => super.noSuchMethod(
         Invocation.method(
           #removeListener,
           [listener],
@@ -689,13 +702,13 @@ class MockWalletsService extends _i1.Mock implements _i2.WalletsService {
 /// A class which mocks [BitcoinWallet].
 ///
 /// See the documentation for Mockito's code generation for more information.
-class MockBitcoinWallet extends _i1.Mock implements _i26.BitcoinWallet {
+class MockBitcoinWallet extends _i1.Mock implements _i27.BitcoinWallet {
   MockBitcoinWallet() {
     _i1.throwOnMissingStub(this);
   }
 
   @override
-  set timer(_i23.Timer? _timer) => super.noSuchMethod(
+  set timer(_i24.Timer? _timer) => super.noSuchMethod(
         Invocation.setter(
           #timer,
           _timer,
@@ -772,74 +785,74 @@ class MockBitcoinWallet extends _i1.Mock implements _i26.BitcoinWallet {
         returnValue: false,
       ) as bool);
   @override
-  _i22.Coin get coin => (super.noSuchMethod(
+  _i23.Coin get coin => (super.noSuchMethod(
         Invocation.getter(#coin),
-        returnValue: _i22.Coin.bitcoin,
-      ) as _i22.Coin);
+        returnValue: _i23.Coin.bitcoin,
+      ) as _i23.Coin);
   @override
-  _i23.Future<List<_i17.UTXO>> get utxos => (super.noSuchMethod(
+  _i24.Future<List<_i18.UTXO>> get utxos => (super.noSuchMethod(
         Invocation.getter(#utxos),
-        returnValue: _i23.Future<List<_i17.UTXO>>.value(<_i17.UTXO>[]),
-      ) as _i23.Future<List<_i17.UTXO>>);
+        returnValue: _i24.Future<List<_i18.UTXO>>.value(<_i18.UTXO>[]),
+      ) as _i24.Future<List<_i18.UTXO>>);
   @override
-  _i23.Future<List<_i17.Transaction>> get transactions => (super.noSuchMethod(
+  _i24.Future<List<_i18.Transaction>> get transactions => (super.noSuchMethod(
         Invocation.getter(#transactions),
         returnValue:
-            _i23.Future<List<_i17.Transaction>>.value(<_i17.Transaction>[]),
-      ) as _i23.Future<List<_i17.Transaction>>);
+            _i24.Future<List<_i18.Transaction>>.value(<_i18.Transaction>[]),
+      ) as _i24.Future<List<_i18.Transaction>>);
   @override
-  _i23.Future<String> get currentReceivingAddress => (super.noSuchMethod(
+  _i24.Future<String> get currentReceivingAddress => (super.noSuchMethod(
         Invocation.getter(#currentReceivingAddress),
-        returnValue: _i23.Future<String>.value(''),
-      ) as _i23.Future<String>);
+        returnValue: _i24.Future<String>.value(''),
+      ) as _i24.Future<String>);
   @override
-  _i23.Future<String> get currentChangeAddress => (super.noSuchMethod(
+  _i24.Future<String> get currentChangeAddress => (super.noSuchMethod(
         Invocation.getter(#currentChangeAddress),
-        returnValue: _i23.Future<String>.value(''),
-      ) as _i23.Future<String>);
+        returnValue: _i24.Future<String>.value(''),
+      ) as _i24.Future<String>);
   @override
-  _i23.Future<String> get currentChangeAddressP2PKH => (super.noSuchMethod(
+  _i24.Future<String> get currentChangeAddressP2PKH => (super.noSuchMethod(
         Invocation.getter(#currentChangeAddressP2PKH),
-        returnValue: _i23.Future<String>.value(''),
-      ) as _i23.Future<String>);
+        returnValue: _i24.Future<String>.value(''),
+      ) as _i24.Future<String>);
   @override
   bool get hasCalledExit => (super.noSuchMethod(
         Invocation.getter(#hasCalledExit),
         returnValue: false,
       ) as bool);
   @override
-  _i23.Future<_i8.FeeObject> get fees => (super.noSuchMethod(
+  _i24.Future<_i8.FeeObject> get fees => (super.noSuchMethod(
         Invocation.getter(#fees),
-        returnValue: _i23.Future<_i8.FeeObject>.value(_FakeFeeObject_5(
+        returnValue: _i24.Future<_i8.FeeObject>.value(_FakeFeeObject_5(
           this,
           Invocation.getter(#fees),
         )),
-      ) as _i23.Future<_i8.FeeObject>);
+      ) as _i24.Future<_i8.FeeObject>);
   @override
-  _i23.Future<int> get maxFee => (super.noSuchMethod(
+  _i24.Future<int> get maxFee => (super.noSuchMethod(
         Invocation.getter(#maxFee),
-        returnValue: _i23.Future<int>.value(0),
-      ) as _i23.Future<int>);
+        returnValue: _i24.Future<int>.value(0),
+      ) as _i24.Future<int>);
   @override
-  _i23.Future<List<String>> get mnemonic => (super.noSuchMethod(
+  _i24.Future<List<String>> get mnemonic => (super.noSuchMethod(
         Invocation.getter(#mnemonic),
-        returnValue: _i23.Future<List<String>>.value(<String>[]),
-      ) as _i23.Future<List<String>>);
+        returnValue: _i24.Future<List<String>>.value(<String>[]),
+      ) as _i24.Future<List<String>>);
   @override
-  _i23.Future<String?> get mnemonicString => (super.noSuchMethod(
+  _i24.Future<String?> get mnemonicString => (super.noSuchMethod(
         Invocation.getter(#mnemonicString),
-        returnValue: _i23.Future<String?>.value(),
-      ) as _i23.Future<String?>);
+        returnValue: _i24.Future<String?>.value(),
+      ) as _i24.Future<String?>);
   @override
-  _i23.Future<String?> get mnemonicPassphrase => (super.noSuchMethod(
+  _i24.Future<String?> get mnemonicPassphrase => (super.noSuchMethod(
         Invocation.getter(#mnemonicPassphrase),
-        returnValue: _i23.Future<String?>.value(),
-      ) as _i23.Future<String?>);
+        returnValue: _i24.Future<String?>.value(),
+      ) as _i24.Future<String?>);
   @override
-  _i23.Future<int> get chainHeight => (super.noSuchMethod(
+  _i24.Future<int> get chainHeight => (super.noSuchMethod(
         Invocation.getter(#chainHeight),
-        returnValue: _i23.Future<int>.value(0),
-      ) as _i23.Future<int>);
+        returnValue: _i24.Future<int>.value(0),
+      ) as _i24.Future<int>);
   @override
   int get storedChainHeight => (super.noSuchMethod(
         Invocation.getter(#storedChainHeight),
@@ -911,10 +924,10 @@ class MockBitcoinWallet extends _i1.Mock implements _i26.BitcoinWallet {
         ),
       ) as _i11.Balance);
   @override
-  _i23.Future<String> get xpub => (super.noSuchMethod(
+  _i24.Future<String> get xpub => (super.noSuchMethod(
         Invocation.getter(#xpub),
-        returnValue: _i23.Future<String>.value(''),
-      ) as _i23.Future<String>);
+        returnValue: _i24.Future<String>.value(''),
+      ) as _i24.Future<String>);
   @override
   set onIsActiveWalletChanged(void Function(bool)? _onIsActiveWalletChanged) =>
       super.noSuchMethod(
@@ -941,26 +954,26 @@ class MockBitcoinWallet extends _i1.Mock implements _i26.BitcoinWallet {
         ),
       ) as _i13.NetworkType);
   @override
-  _i23.Future<void> exit() => (super.noSuchMethod(
+  _i24.Future<void> exit() => (super.noSuchMethod(
         Invocation.method(
           #exit,
           [],
         ),
-        returnValue: _i23.Future<void>.value(),
-        returnValueForMissingStub: _i23.Future<void>.value(),
-      ) as _i23.Future<void>);
+        returnValue: _i24.Future<void>.value(),
+        returnValueForMissingStub: _i24.Future<void>.value(),
+      ) as _i24.Future<void>);
   @override
-  _i27.DerivePathType addressType({required String? address}) =>
+  _i28.DerivePathType addressType({required String? address}) =>
       (super.noSuchMethod(
         Invocation.method(
           #addressType,
           [],
           {#address: address},
         ),
-        returnValue: _i27.DerivePathType.bip44,
-      ) as _i27.DerivePathType);
+        returnValue: _i28.DerivePathType.bip44,
+      ) as _i28.DerivePathType);
   @override
-  _i23.Future<void> recoverFromMnemonic({
+  _i24.Future<void> recoverFromMnemonic({
     required String? mnemonic,
     String? mnemonicPassphrase,
     required int? maxUnusedAddressGap,
@@ -979,47 +992,47 @@ class MockBitcoinWallet extends _i1.Mock implements _i26.BitcoinWallet {
             #height: height,
           },
         ),
-        returnValue: _i23.Future<void>.value(),
-        returnValueForMissingStub: _i23.Future<void>.value(),
-      ) as _i23.Future<void>);
+        returnValue: _i24.Future<void>.value(),
+        returnValueForMissingStub: _i24.Future<void>.value(),
+      ) as _i24.Future<void>);
   @override
-  _i23.Future<void> getTransactionCacheEarly(List<String>? allAddresses) =>
+  _i24.Future<void> getTransactionCacheEarly(List<String>? allAddresses) =>
       (super.noSuchMethod(
         Invocation.method(
           #getTransactionCacheEarly,
           [allAddresses],
         ),
-        returnValue: _i23.Future<void>.value(),
-        returnValueForMissingStub: _i23.Future<void>.value(),
-      ) as _i23.Future<void>);
+        returnValue: _i24.Future<void>.value(),
+        returnValueForMissingStub: _i24.Future<void>.value(),
+      ) as _i24.Future<void>);
   @override
-  _i23.Future<bool> refreshIfThereIsNewData() => (super.noSuchMethod(
+  _i24.Future<bool> refreshIfThereIsNewData() => (super.noSuchMethod(
         Invocation.method(
           #refreshIfThereIsNewData,
           [],
         ),
-        returnValue: _i23.Future<bool>.value(false),
-      ) as _i23.Future<bool>);
+        returnValue: _i24.Future<bool>.value(false),
+      ) as _i24.Future<bool>);
   @override
-  _i23.Future<void> getAllTxsToWatch() => (super.noSuchMethod(
+  _i24.Future<void> getAllTxsToWatch() => (super.noSuchMethod(
         Invocation.method(
           #getAllTxsToWatch,
           [],
         ),
-        returnValue: _i23.Future<void>.value(),
-        returnValueForMissingStub: _i23.Future<void>.value(),
-      ) as _i23.Future<void>);
+        returnValue: _i24.Future<void>.value(),
+        returnValueForMissingStub: _i24.Future<void>.value(),
+      ) as _i24.Future<void>);
   @override
-  _i23.Future<void> refresh() => (super.noSuchMethod(
+  _i24.Future<void> refresh() => (super.noSuchMethod(
         Invocation.method(
           #refresh,
           [],
         ),
-        returnValue: _i23.Future<void>.value(),
-        returnValueForMissingStub: _i23.Future<void>.value(),
-      ) as _i23.Future<void>);
+        returnValue: _i24.Future<void>.value(),
+        returnValueForMissingStub: _i24.Future<void>.value(),
+      ) as _i24.Future<void>);
   @override
-  _i23.Future<Map<String, dynamic>> prepareSend({
+  _i24.Future<Map<String, dynamic>> prepareSend({
     required String? address,
     required _i14.Amount? amount,
     Map<String, dynamic>? args,
@@ -1035,26 +1048,26 @@ class MockBitcoinWallet extends _i1.Mock implements _i26.BitcoinWallet {
           },
         ),
         returnValue:
-            _i23.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
-      ) as _i23.Future<Map<String, dynamic>>);
+            _i24.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
+      ) as _i24.Future<Map<String, dynamic>>);
   @override
-  _i23.Future<String> confirmSend({required Map<String, dynamic>? txData}) =>
+  _i24.Future<String> confirmSend({required Map<String, dynamic>? txData}) =>
       (super.noSuchMethod(
         Invocation.method(
           #confirmSend,
           [],
           {#txData: txData},
         ),
-        returnValue: _i23.Future<String>.value(''),
-      ) as _i23.Future<String>);
+        returnValue: _i24.Future<String>.value(''),
+      ) as _i24.Future<String>);
   @override
-  _i23.Future<bool> testNetworkConnection() => (super.noSuchMethod(
+  _i24.Future<bool> testNetworkConnection() => (super.noSuchMethod(
         Invocation.method(
           #testNetworkConnection,
           [],
         ),
-        returnValue: _i23.Future<bool>.value(false),
-      ) as _i23.Future<bool>);
+        returnValue: _i24.Future<bool>.value(false),
+      ) as _i24.Future<bool>);
   @override
   void startNetworkAlivePinging() => super.noSuchMethod(
         Invocation.method(
@@ -1072,35 +1085,35 @@ class MockBitcoinWallet extends _i1.Mock implements _i26.BitcoinWallet {
         returnValueForMissingStub: null,
       );
   @override
-  _i23.Future<void> initializeNew(
+  _i24.Future<void> initializeNew(
           ({String mnemonicPassphrase, int wordCount})? data) =>
       (super.noSuchMethod(
         Invocation.method(
           #initializeNew,
           [data],
         ),
-        returnValue: _i23.Future<void>.value(),
-        returnValueForMissingStub: _i23.Future<void>.value(),
-      ) as _i23.Future<void>);
+        returnValue: _i24.Future<void>.value(),
+        returnValueForMissingStub: _i24.Future<void>.value(),
+      ) as _i24.Future<void>);
   @override
-  _i23.Future<void> initializeExisting() => (super.noSuchMethod(
+  _i24.Future<void> initializeExisting() => (super.noSuchMethod(
         Invocation.method(
           #initializeExisting,
           [],
         ),
-        returnValue: _i23.Future<void>.value(),
-        returnValueForMissingStub: _i23.Future<void>.value(),
-      ) as _i23.Future<void>);
+        returnValue: _i24.Future<void>.value(),
+        returnValueForMissingStub: _i24.Future<void>.value(),
+      ) as _i24.Future<void>);
   @override
-  _i23.Future<void> updateSentCachedTxData(Map<String, dynamic>? txData) =>
+  _i24.Future<void> updateSentCachedTxData(Map<String, dynamic>? txData) =>
       (super.noSuchMethod(
         Invocation.method(
           #updateSentCachedTxData,
           [txData],
         ),
-        returnValue: _i23.Future<void>.value(),
-        returnValueForMissingStub: _i23.Future<void>.value(),
-      ) as _i23.Future<void>);
+        returnValue: _i24.Future<void>.value(),
+        returnValueForMissingStub: _i24.Future<void>.value(),
+      ) as _i24.Future<void>);
   @override
   bool validateAddress(String? address) => (super.noSuchMethod(
         Invocation.method(
@@ -1110,69 +1123,69 @@ class MockBitcoinWallet extends _i1.Mock implements _i26.BitcoinWallet {
         returnValue: false,
       ) as bool);
   @override
-  _i23.Future<void> updateNode(bool? shouldRefresh) => (super.noSuchMethod(
+  _i24.Future<void> updateNode(bool? shouldRefresh) => (super.noSuchMethod(
         Invocation.method(
           #updateNode,
           [shouldRefresh],
         ),
-        returnValue: _i23.Future<void>.value(),
-        returnValueForMissingStub: _i23.Future<void>.value(),
-      ) as _i23.Future<void>);
+        returnValue: _i24.Future<void>.value(),
+        returnValueForMissingStub: _i24.Future<void>.value(),
+      ) as _i24.Future<void>);
   @override
-  _i23.Future<_i9.ElectrumXNode> getCurrentNode() => (super.noSuchMethod(
+  _i24.Future<_i9.ElectrumXNode> getCurrentNode() => (super.noSuchMethod(
         Invocation.method(
           #getCurrentNode,
           [],
         ),
-        returnValue: _i23.Future<_i9.ElectrumXNode>.value(_FakeElectrumXNode_11(
+        returnValue: _i24.Future<_i9.ElectrumXNode>.value(_FakeElectrumXNode_11(
           this,
           Invocation.method(
             #getCurrentNode,
             [],
           ),
         )),
-      ) as _i23.Future<_i9.ElectrumXNode>);
+      ) as _i24.Future<_i9.ElectrumXNode>);
   @override
-  _i23.Future<List<Map<String, dynamic>>> fastFetch(
+  _i24.Future<List<Map<String, dynamic>>> fastFetch(
           List<String>? allTxHashes) =>
       (super.noSuchMethod(
         Invocation.method(
           #fastFetch,
           [allTxHashes],
         ),
-        returnValue: _i23.Future<List<Map<String, dynamic>>>.value(
+        returnValue: _i24.Future<List<Map<String, dynamic>>>.value(
             <Map<String, dynamic>>[]),
-      ) as _i23.Future<List<Map<String, dynamic>>>);
+      ) as _i24.Future<List<Map<String, dynamic>>>);
   @override
-  _i23.Future<int> getTxCount({required String? address}) =>
+  _i24.Future<int> getTxCount({required String? address}) =>
       (super.noSuchMethod(
         Invocation.method(
           #getTxCount,
           [],
           {#address: address},
         ),
-        returnValue: _i23.Future<int>.value(0),
-      ) as _i23.Future<int>);
+        returnValue: _i24.Future<int>.value(0),
+      ) as _i24.Future<int>);
   @override
-  _i23.Future<void> checkCurrentReceivingAddressesForTransactions() =>
+  _i24.Future<void> checkCurrentReceivingAddressesForTransactions() =>
       (super.noSuchMethod(
         Invocation.method(
           #checkCurrentReceivingAddressesForTransactions,
           [],
         ),
-        returnValue: _i23.Future<void>.value(),
-        returnValueForMissingStub: _i23.Future<void>.value(),
-      ) as _i23.Future<void>);
+        returnValue: _i24.Future<void>.value(),
+        returnValueForMissingStub: _i24.Future<void>.value(),
+      ) as _i24.Future<void>);
   @override
-  _i23.Future<void> checkCurrentChangeAddressesForTransactions() =>
+  _i24.Future<void> checkCurrentChangeAddressesForTransactions() =>
       (super.noSuchMethod(
         Invocation.method(
           #checkCurrentChangeAddressesForTransactions,
           [],
         ),
-        returnValue: _i23.Future<void>.value(),
-        returnValueForMissingStub: _i23.Future<void>.value(),
-      ) as _i23.Future<void>);
+        returnValue: _i24.Future<void>.value(),
+        returnValueForMissingStub: _i24.Future<void>.value(),
+      ) as _i24.Future<void>);
   @override
   int estimateTxFee({
     required int? vSize,
@@ -1198,7 +1211,7 @@ class MockBitcoinWallet extends _i1.Mock implements _i26.BitcoinWallet {
     required bool? isSendAll,
     int? satsPerVByte,
     int? additionalOutputs = 0,
-    List<_i17.UTXO>? utxos,
+    List<_i18.UTXO>? utxos,
   }) =>
       super.noSuchMethod(Invocation.method(
         #coinSelection,
@@ -1215,19 +1228,19 @@ class MockBitcoinWallet extends _i1.Mock implements _i26.BitcoinWallet {
         },
       ));
   @override
-  _i23.Future<List<_i28.SigningData>> fetchBuildTxData(
-          List<_i17.UTXO>? utxosToUse) =>
+  _i24.Future<List<_i29.SigningData>> fetchBuildTxData(
+          List<_i18.UTXO>? utxosToUse) =>
       (super.noSuchMethod(
         Invocation.method(
           #fetchBuildTxData,
           [utxosToUse],
         ),
         returnValue:
-            _i23.Future<List<_i28.SigningData>>.value(<_i28.SigningData>[]),
-      ) as _i23.Future<List<_i28.SigningData>>);
+            _i24.Future<List<_i29.SigningData>>.value(<_i29.SigningData>[]),
+      ) as _i24.Future<List<_i29.SigningData>>);
   @override
-  _i23.Future<Map<String, dynamic>> buildTransaction({
-    required List<_i28.SigningData>? utxoSigningData,
+  _i24.Future<Map<String, dynamic>> buildTransaction({
+    required List<_i29.SigningData>? utxoSigningData,
     required List<String>? recipients,
     required List<int>? satoshiAmounts,
   }) =>
@@ -1242,10 +1255,10 @@ class MockBitcoinWallet extends _i1.Mock implements _i26.BitcoinWallet {
           },
         ),
         returnValue:
-            _i23.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
-      ) as _i23.Future<Map<String, dynamic>>);
+            _i24.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
+      ) as _i24.Future<Map<String, dynamic>>);
   @override
-  _i23.Future<void> fullRescan(
+  _i24.Future<void> fullRescan(
     int? maxUnusedAddressGap,
     int? maxNumberOfIndexesToCheck,
   ) =>
@@ -1257,11 +1270,11 @@ class MockBitcoinWallet extends _i1.Mock implements _i26.BitcoinWallet {
             maxNumberOfIndexesToCheck,
           ],
         ),
-        returnValue: _i23.Future<void>.value(),
-        returnValueForMissingStub: _i23.Future<void>.value(),
-      ) as _i23.Future<void>);
+        returnValue: _i24.Future<void>.value(),
+        returnValueForMissingStub: _i24.Future<void>.value(),
+      ) as _i24.Future<void>);
   @override
-  _i23.Future<_i14.Amount> estimateFeeFor(
+  _i24.Future<_i14.Amount> estimateFeeFor(
     _i14.Amount? amount,
     int? feeRate,
   ) =>
@@ -1273,7 +1286,7 @@ class MockBitcoinWallet extends _i1.Mock implements _i26.BitcoinWallet {
             feeRate,
           ],
         ),
-        returnValue: _i23.Future<_i14.Amount>.value(_FakeAmount_12(
+        returnValue: _i24.Future<_i14.Amount>.value(_FakeAmount_12(
           this,
           Invocation.method(
             #estimateFeeFor,
@@ -1283,7 +1296,7 @@ class MockBitcoinWallet extends _i1.Mock implements _i26.BitcoinWallet {
             ],
           ),
         )),
-      ) as _i23.Future<_i14.Amount>);
+      ) as _i24.Future<_i14.Amount>);
   @override
   _i14.Amount roughFeeEstimate(
     int? inputCount,
@@ -1312,32 +1325,32 @@ class MockBitcoinWallet extends _i1.Mock implements _i26.BitcoinWallet {
         ),
       ) as _i14.Amount);
   @override
-  _i23.Future<_i14.Amount> sweepAllEstimate(int? feeRate) =>
+  _i24.Future<_i14.Amount> sweepAllEstimate(int? feeRate) =>
       (super.noSuchMethod(
         Invocation.method(
           #sweepAllEstimate,
           [feeRate],
         ),
-        returnValue: _i23.Future<_i14.Amount>.value(_FakeAmount_12(
+        returnValue: _i24.Future<_i14.Amount>.value(_FakeAmount_12(
           this,
           Invocation.method(
             #sweepAllEstimate,
             [feeRate],
           ),
         )),
-      ) as _i23.Future<_i14.Amount>);
+      ) as _i24.Future<_i14.Amount>);
   @override
-  _i23.Future<bool> generateNewAddress() => (super.noSuchMethod(
+  _i24.Future<bool> generateNewAddress() => (super.noSuchMethod(
         Invocation.method(
           #generateNewAddress,
           [],
         ),
-        returnValue: _i23.Future<bool>.value(false),
-      ) as _i23.Future<bool>);
+        returnValue: _i24.Future<bool>.value(false),
+      ) as _i24.Future<bool>);
   @override
   void initCache(
     String? walletId,
-    _i22.Coin? coin,
+    _i23.Coin? coin,
   ) =>
       super.noSuchMethod(
         Invocation.method(
@@ -1350,14 +1363,14 @@ class MockBitcoinWallet extends _i1.Mock implements _i26.BitcoinWallet {
         returnValueForMissingStub: null,
       );
   @override
-  _i23.Future<void> updateCachedId(String? id) => (super.noSuchMethod(
+  _i24.Future<void> updateCachedId(String? id) => (super.noSuchMethod(
         Invocation.method(
           #updateCachedId,
           [id],
         ),
-        returnValue: _i23.Future<void>.value(),
-        returnValueForMissingStub: _i23.Future<void>.value(),
-      ) as _i23.Future<void>);
+        returnValue: _i24.Future<void>.value(),
+        returnValueForMissingStub: _i24.Future<void>.value(),
+      ) as _i24.Future<void>);
   @override
   int getCachedChainHeight() => (super.noSuchMethod(
         Invocation.method(
@@ -1367,14 +1380,14 @@ class MockBitcoinWallet extends _i1.Mock implements _i26.BitcoinWallet {
         returnValue: 0,
       ) as int);
   @override
-  _i23.Future<void> updateCachedChainHeight(int? height) => (super.noSuchMethod(
+  _i24.Future<void> updateCachedChainHeight(int? height) => (super.noSuchMethod(
         Invocation.method(
           #updateCachedChainHeight,
           [height],
         ),
-        returnValue: _i23.Future<void>.value(),
-        returnValueForMissingStub: _i23.Future<void>.value(),
-      ) as _i23.Future<void>);
+        returnValue: _i24.Future<void>.value(),
+        returnValueForMissingStub: _i24.Future<void>.value(),
+      ) as _i24.Future<void>);
   @override
   bool getCachedIsFavorite() => (super.noSuchMethod(
         Invocation.method(
@@ -1384,15 +1397,15 @@ class MockBitcoinWallet extends _i1.Mock implements _i26.BitcoinWallet {
         returnValue: false,
       ) as bool);
   @override
-  _i23.Future<void> updateCachedIsFavorite(bool? isFavorite) =>
+  _i24.Future<void> updateCachedIsFavorite(bool? isFavorite) =>
       (super.noSuchMethod(
         Invocation.method(
           #updateCachedIsFavorite,
           [isFavorite],
         ),
-        returnValue: _i23.Future<void>.value(),
-        returnValueForMissingStub: _i23.Future<void>.value(),
-      ) as _i23.Future<void>);
+        returnValue: _i24.Future<void>.value(),
+        returnValueForMissingStub: _i24.Future<void>.value(),
+      ) as _i24.Future<void>);
   @override
   _i11.Balance getCachedBalance() => (super.noSuchMethod(
         Invocation.method(
@@ -1408,15 +1421,15 @@ class MockBitcoinWallet extends _i1.Mock implements _i26.BitcoinWallet {
         ),
       ) as _i11.Balance);
   @override
-  _i23.Future<void> updateCachedBalance(_i11.Balance? balance) =>
+  _i24.Future<void> updateCachedBalance(_i11.Balance? balance) =>
       (super.noSuchMethod(
         Invocation.method(
           #updateCachedBalance,
           [balance],
         ),
-        returnValue: _i23.Future<void>.value(),
-        returnValueForMissingStub: _i23.Future<void>.value(),
-      ) as _i23.Future<void>);
+        returnValue: _i24.Future<void>.value(),
+        returnValueForMissingStub: _i24.Future<void>.value(),
+      ) as _i24.Future<void>);
   @override
   _i11.Balance getCachedBalanceSecondary() => (super.noSuchMethod(
         Invocation.method(
@@ -1432,15 +1445,15 @@ class MockBitcoinWallet extends _i1.Mock implements _i26.BitcoinWallet {
         ),
       ) as _i11.Balance);
   @override
-  _i23.Future<void> updateCachedBalanceSecondary(_i11.Balance? balance) =>
+  _i24.Future<void> updateCachedBalanceSecondary(_i11.Balance? balance) =>
       (super.noSuchMethod(
         Invocation.method(
           #updateCachedBalanceSecondary,
           [balance],
         ),
-        returnValue: _i23.Future<void>.value(),
-        returnValueForMissingStub: _i23.Future<void>.value(),
-      ) as _i23.Future<void>);
+        returnValue: _i24.Future<void>.value(),
+        returnValueForMissingStub: _i24.Future<void>.value(),
+      ) as _i24.Future<void>);
   @override
   List<String> getWalletTokenContractAddresses() => (super.noSuchMethod(
         Invocation.method(
@@ -1450,16 +1463,16 @@ class MockBitcoinWallet extends _i1.Mock implements _i26.BitcoinWallet {
         returnValue: <String>[],
       ) as List<String>);
   @override
-  _i23.Future<void> updateWalletTokenContractAddresses(
+  _i24.Future<void> updateWalletTokenContractAddresses(
           List<String>? contractAddresses) =>
       (super.noSuchMethod(
         Invocation.method(
           #updateWalletTokenContractAddresses,
           [contractAddresses],
         ),
-        returnValue: _i23.Future<void>.value(),
-        returnValueForMissingStub: _i23.Future<void>.value(),
-      ) as _i23.Future<void>);
+        returnValue: _i24.Future<void>.value(),
+        returnValueForMissingStub: _i24.Future<void>.value(),
+      ) as _i24.Future<void>);
   @override
   void initWalletDB({_i12.MainDB? mockableOverride}) => super.noSuchMethod(
         Invocation.method(
@@ -1470,11 +1483,45 @@ class MockBitcoinWallet extends _i1.Mock implements _i26.BitcoinWallet {
         returnValueForMissingStub: null,
       );
   @override
-  _i23.Future<_i15.Tuple2<_i17.Transaction, _i17.Address>> parseTransaction(
+  _i24.Future<_i15.TransactionV2> getTransaction(
+    String? txHash,
+    _i23.Coin? coin,
+    String? walletId,
+    _i10.CachedElectrumX? cachedElectrumX, [
+    String? debugTitle,
+  ]) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #getTransaction,
+          [
+            txHash,
+            coin,
+            walletId,
+            cachedElectrumX,
+            debugTitle,
+          ],
+        ),
+        returnValue:
+            _i24.Future<_i15.TransactionV2>.value(_FakeTransactionV2_13(
+          this,
+          Invocation.method(
+            #getTransaction,
+            [
+              txHash,
+              coin,
+              walletId,
+              cachedElectrumX,
+              debugTitle,
+            ],
+          ),
+        )),
+      ) as _i24.Future<_i15.TransactionV2>);
+  @override
+  _i24.Future<_i16.Tuple2<_i18.Transaction, _i18.Address>> parseTransaction(
     Map<String, dynamic>? txData,
     dynamic electrumxClient,
-    List<_i17.Address>? myAddresses,
-    _i22.Coin? coin,
+    List<_i18.Address>? myAddresses,
+    _i23.Coin? coin,
     int? minConfirms,
     String? walletId,
   ) =>
@@ -1491,8 +1538,8 @@ class MockBitcoinWallet extends _i1.Mock implements _i26.BitcoinWallet {
           ],
         ),
         returnValue:
-            _i23.Future<_i15.Tuple2<_i17.Transaction, _i17.Address>>.value(
-                _FakeTuple2_13<_i17.Transaction, _i17.Address>(
+            _i24.Future<_i16.Tuple2<_i18.Transaction, _i18.Address>>.value(
+                _FakeTuple2_14<_i18.Transaction, _i18.Address>(
           this,
           Invocation.method(
             #parseTransaction,
@@ -1506,37 +1553,37 @@ class MockBitcoinWallet extends _i1.Mock implements _i26.BitcoinWallet {
             ],
           ),
         )),
-      ) as _i23.Future<_i15.Tuple2<_i17.Transaction, _i17.Address>>);
+      ) as _i24.Future<_i16.Tuple2<_i18.Transaction, _i18.Address>>);
   @override
   void initPaynymWalletInterface({
     required String? walletId,
     required String? walletName,
     required _i13.NetworkType? network,
-    required _i22.Coin? coin,
+    required _i23.Coin? coin,
     required _i12.MainDB? db,
     required _i9.ElectrumX? electrumXClient,
-    required _i19.SecureStorageInterface? secureStorage,
+    required _i20.SecureStorageInterface? secureStorage,
     required int? dustLimit,
     required int? dustLimitP2PKH,
     required int? minConfirms,
-    required _i23.Future<String?> Function()? getMnemonicString,
-    required _i23.Future<String?> Function()? getMnemonicPassphrase,
-    required _i23.Future<int> Function()? getChainHeight,
-    required _i23.Future<String> Function()? getCurrentChangeAddress,
+    required _i24.Future<String?> Function()? getMnemonicString,
+    required _i24.Future<String?> Function()? getMnemonicPassphrase,
+    required _i24.Future<int> Function()? getChainHeight,
+    required _i24.Future<String> Function()? getCurrentChangeAddress,
     required int Function({
       required int feeRatePerKB,
       required int vSize,
     })? estimateTxFee,
-    required _i23.Future<Map<String, dynamic>> Function({
+    required _i24.Future<Map<String, dynamic>> Function({
       required String address,
       required _i14.Amount amount,
       Map<String, dynamic>? args,
     })? prepareSend,
-    required _i23.Future<int> Function({required String address})? getTxCount,
-    required _i23.Future<List<_i28.SigningData>> Function(List<_i17.UTXO>)?
+    required _i24.Future<int> Function({required String address})? getTxCount,
+    required _i24.Future<List<_i29.SigningData>> Function(List<_i18.UTXO>)?
         fetchBuildTxData,
-    required _i23.Future<void> Function()? refresh,
-    required _i23.Future<void> Function()? checkChangeAddressForTransactions,
+    required _i24.Future<void> Function()? refresh,
+    required _i24.Future<void> Function()? checkChangeAddressForTransactions,
   }) =>
       super.noSuchMethod(
         Invocation.method(
@@ -1569,21 +1616,21 @@ class MockBitcoinWallet extends _i1.Mock implements _i26.BitcoinWallet {
         returnValueForMissingStub: null,
       );
   @override
-  _i23.Future<_i16.BIP32> getBip47BaseNode() => (super.noSuchMethod(
+  _i24.Future<_i17.BIP32> getBip47BaseNode() => (super.noSuchMethod(
         Invocation.method(
           #getBip47BaseNode,
           [],
         ),
-        returnValue: _i23.Future<_i16.BIP32>.value(_FakeBIP32_14(
+        returnValue: _i24.Future<_i17.BIP32>.value(_FakeBIP32_15(
           this,
           Invocation.method(
             #getBip47BaseNode,
             [],
           ),
         )),
-      ) as _i23.Future<_i16.BIP32>);
+      ) as _i24.Future<_i17.BIP32>);
   @override
-  _i23.Future<_i29.Uint8List> getPrivateKeyForPaynymReceivingAddress({
+  _i24.Future<_i30.Uint8List> getPrivateKeyForPaynymReceivingAddress({
     required String? paymentCodeString,
     required int? index,
   }) =>
@@ -1596,11 +1643,11 @@ class MockBitcoinWallet extends _i1.Mock implements _i26.BitcoinWallet {
             #index: index,
           },
         ),
-        returnValue: _i23.Future<_i29.Uint8List>.value(_i29.Uint8List(0)),
-      ) as _i23.Future<_i29.Uint8List>);
+        returnValue: _i24.Future<_i30.Uint8List>.value(_i30.Uint8List(0)),
+      ) as _i24.Future<_i30.Uint8List>);
   @override
-  _i23.Future<_i17.Address> currentReceivingPaynymAddress({
-    required _i18.PaymentCode? sender,
+  _i24.Future<_i18.Address> currentReceivingPaynymAddress({
+    required _i19.PaymentCode? sender,
     required bool? isSegwit,
   }) =>
       (super.noSuchMethod(
@@ -1612,7 +1659,7 @@ class MockBitcoinWallet extends _i1.Mock implements _i26.BitcoinWallet {
             #isSegwit: isSegwit,
           },
         ),
-        returnValue: _i23.Future<_i17.Address>.value(_FakeAddress_15(
+        returnValue: _i24.Future<_i18.Address>.value(_FakeAddress_16(
           this,
           Invocation.method(
             #currentReceivingPaynymAddress,
@@ -1623,10 +1670,10 @@ class MockBitcoinWallet extends _i1.Mock implements _i26.BitcoinWallet {
             },
           ),
         )),
-      ) as _i23.Future<_i17.Address>);
+      ) as _i24.Future<_i18.Address>);
   @override
-  _i23.Future<void> checkCurrentPaynymReceivingAddressForTransactions({
-    required _i18.PaymentCode? sender,
+  _i24.Future<void> checkCurrentPaynymReceivingAddressForTransactions({
+    required _i19.PaymentCode? sender,
     required bool? isSegwit,
   }) =>
       (super.noSuchMethod(
@@ -1638,42 +1685,42 @@ class MockBitcoinWallet extends _i1.Mock implements _i26.BitcoinWallet {
             #isSegwit: isSegwit,
           },
         ),
-        returnValue: _i23.Future<void>.value(),
-        returnValueForMissingStub: _i23.Future<void>.value(),
-      ) as _i23.Future<void>);
+        returnValue: _i24.Future<void>.value(),
+        returnValueForMissingStub: _i24.Future<void>.value(),
+      ) as _i24.Future<void>);
   @override
-  _i23.Future<void> checkAllCurrentReceivingPaynymAddressesForTransactions() =>
+  _i24.Future<void> checkAllCurrentReceivingPaynymAddressesForTransactions() =>
       (super.noSuchMethod(
         Invocation.method(
           #checkAllCurrentReceivingPaynymAddressesForTransactions,
           [],
         ),
-        returnValue: _i23.Future<void>.value(),
-        returnValueForMissingStub: _i23.Future<void>.value(),
-      ) as _i23.Future<void>);
+        returnValue: _i24.Future<void>.value(),
+        returnValueForMissingStub: _i24.Future<void>.value(),
+      ) as _i24.Future<void>);
   @override
-  _i23.Future<_i16.BIP32> deriveNotificationBip32Node() => (super.noSuchMethod(
+  _i24.Future<_i17.BIP32> deriveNotificationBip32Node() => (super.noSuchMethod(
         Invocation.method(
           #deriveNotificationBip32Node,
           [],
         ),
-        returnValue: _i23.Future<_i16.BIP32>.value(_FakeBIP32_14(
+        returnValue: _i24.Future<_i17.BIP32>.value(_FakeBIP32_15(
           this,
           Invocation.method(
             #deriveNotificationBip32Node,
             [],
           ),
         )),
-      ) as _i23.Future<_i16.BIP32>);
+      ) as _i24.Future<_i17.BIP32>);
   @override
-  _i23.Future<_i18.PaymentCode> getPaymentCode({required bool? isSegwit}) =>
+  _i24.Future<_i19.PaymentCode> getPaymentCode({required bool? isSegwit}) =>
       (super.noSuchMethod(
         Invocation.method(
           #getPaymentCode,
           [],
           {#isSegwit: isSegwit},
         ),
-        returnValue: _i23.Future<_i18.PaymentCode>.value(_FakePaymentCode_16(
+        returnValue: _i24.Future<_i19.PaymentCode>.value(_FakePaymentCode_17(
           this,
           Invocation.method(
             #getPaymentCode,
@@ -1681,28 +1728,28 @@ class MockBitcoinWallet extends _i1.Mock implements _i26.BitcoinWallet {
             {#isSegwit: isSegwit},
           ),
         )),
-      ) as _i23.Future<_i18.PaymentCode>);
+      ) as _i24.Future<_i19.PaymentCode>);
   @override
-  _i23.Future<_i29.Uint8List> signWithNotificationKey(_i29.Uint8List? data) =>
+  _i24.Future<_i30.Uint8List> signWithNotificationKey(_i30.Uint8List? data) =>
       (super.noSuchMethod(
         Invocation.method(
           #signWithNotificationKey,
           [data],
         ),
-        returnValue: _i23.Future<_i29.Uint8List>.value(_i29.Uint8List(0)),
-      ) as _i23.Future<_i29.Uint8List>);
+        returnValue: _i24.Future<_i30.Uint8List>.value(_i30.Uint8List(0)),
+      ) as _i24.Future<_i30.Uint8List>);
   @override
-  _i23.Future<String> signStringWithNotificationKey(String? data) =>
+  _i24.Future<String> signStringWithNotificationKey(String? data) =>
       (super.noSuchMethod(
         Invocation.method(
           #signStringWithNotificationKey,
           [data],
         ),
-        returnValue: _i23.Future<String>.value(''),
-      ) as _i23.Future<String>);
+        returnValue: _i24.Future<String>.value(''),
+      ) as _i24.Future<String>);
   @override
-  _i23.Future<Map<String, dynamic>> preparePaymentCodeSend({
-    required _i18.PaymentCode? paymentCode,
+  _i24.Future<Map<String, dynamic>> preparePaymentCodeSend({
+    required _i19.PaymentCode? paymentCode,
     required bool? isSegwit,
     required _i14.Amount? amount,
     Map<String, dynamic>? args,
@@ -1719,13 +1766,13 @@ class MockBitcoinWallet extends _i1.Mock implements _i26.BitcoinWallet {
           },
         ),
         returnValue:
-            _i23.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
-      ) as _i23.Future<Map<String, dynamic>>);
+            _i24.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
+      ) as _i24.Future<Map<String, dynamic>>);
   @override
-  _i23.Future<_i17.Address> nextUnusedSendAddressFrom({
-    required _i18.PaymentCode? pCode,
+  _i24.Future<_i18.Address> nextUnusedSendAddressFrom({
+    required _i19.PaymentCode? pCode,
     required bool? isSegwit,
-    required _i16.BIP32? privateKeyNode,
+    required _i17.BIP32? privateKeyNode,
     int? startIndex = 0,
   }) =>
       (super.noSuchMethod(
@@ -1739,7 +1786,7 @@ class MockBitcoinWallet extends _i1.Mock implements _i26.BitcoinWallet {
             #startIndex: startIndex,
           },
         ),
-        returnValue: _i23.Future<_i17.Address>.value(_FakeAddress_15(
+        returnValue: _i24.Future<_i18.Address>.value(_FakeAddress_16(
           this,
           Invocation.method(
             #nextUnusedSendAddressFrom,
@@ -1752,13 +1799,13 @@ class MockBitcoinWallet extends _i1.Mock implements _i26.BitcoinWallet {
             },
           ),
         )),
-      ) as _i23.Future<_i17.Address>);
+      ) as _i24.Future<_i18.Address>);
   @override
-  _i23.Future<Map<String, dynamic>> prepareNotificationTx({
+  _i24.Future<Map<String, dynamic>> prepareNotificationTx({
     required int? selectedTxFeeRate,
     required String? targetPaymentCodeString,
     int? additionalOutputs = 0,
-    List<_i17.UTXO>? utxos,
+    List<_i18.UTXO>? utxos,
   }) =>
       (super.noSuchMethod(
         Invocation.method(
@@ -1772,10 +1819,10 @@ class MockBitcoinWallet extends _i1.Mock implements _i26.BitcoinWallet {
           },
         ),
         returnValue:
-            _i23.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
-      ) as _i23.Future<Map<String, dynamic>>);
+            _i24.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
+      ) as _i24.Future<Map<String, dynamic>>);
   @override
-  _i23.Future<String> broadcastNotificationTx(
+  _i24.Future<String> broadcastNotificationTx(
           {required Map<String, dynamic>? preparedTx}) =>
       (super.noSuchMethod(
         Invocation.method(
@@ -1783,62 +1830,62 @@ class MockBitcoinWallet extends _i1.Mock implements _i26.BitcoinWallet {
           [],
           {#preparedTx: preparedTx},
         ),
-        returnValue: _i23.Future<String>.value(''),
-      ) as _i23.Future<String>);
+        returnValue: _i24.Future<String>.value(''),
+      ) as _i24.Future<String>);
   @override
-  _i23.Future<bool> hasConnected(String? paymentCodeString) =>
+  _i24.Future<bool> hasConnected(String? paymentCodeString) =>
       (super.noSuchMethod(
         Invocation.method(
           #hasConnected,
           [paymentCodeString],
         ),
-        returnValue: _i23.Future<bool>.value(false),
-      ) as _i23.Future<bool>);
+        returnValue: _i24.Future<bool>.value(false),
+      ) as _i24.Future<bool>);
   @override
-  _i23.Future<_i18.PaymentCode?> unBlindedPaymentCodeFromTransaction(
-          {required _i17.Transaction? transaction}) =>
+  _i24.Future<_i19.PaymentCode?> unBlindedPaymentCodeFromTransaction(
+          {required _i18.Transaction? transaction}) =>
       (super.noSuchMethod(
         Invocation.method(
           #unBlindedPaymentCodeFromTransaction,
           [],
           {#transaction: transaction},
         ),
-        returnValue: _i23.Future<_i18.PaymentCode?>.value(),
-      ) as _i23.Future<_i18.PaymentCode?>);
+        returnValue: _i24.Future<_i19.PaymentCode?>.value(),
+      ) as _i24.Future<_i19.PaymentCode?>);
   @override
-  _i23.Future<_i18.PaymentCode?> unBlindedPaymentCodeFromTransactionBad(
-          {required _i17.Transaction? transaction}) =>
+  _i24.Future<_i19.PaymentCode?> unBlindedPaymentCodeFromTransactionBad(
+          {required _i18.Transaction? transaction}) =>
       (super.noSuchMethod(
         Invocation.method(
           #unBlindedPaymentCodeFromTransactionBad,
           [],
           {#transaction: transaction},
         ),
-        returnValue: _i23.Future<_i18.PaymentCode?>.value(),
-      ) as _i23.Future<_i18.PaymentCode?>);
+        returnValue: _i24.Future<_i19.PaymentCode?>.value(),
+      ) as _i24.Future<_i19.PaymentCode?>);
   @override
-  _i23.Future<List<_i18.PaymentCode>>
+  _i24.Future<List<_i19.PaymentCode>>
       getAllPaymentCodesFromNotificationTransactions() => (super.noSuchMethod(
             Invocation.method(
               #getAllPaymentCodesFromNotificationTransactions,
               [],
             ),
             returnValue:
-                _i23.Future<List<_i18.PaymentCode>>.value(<_i18.PaymentCode>[]),
-          ) as _i23.Future<List<_i18.PaymentCode>>);
+                _i24.Future<List<_i19.PaymentCode>>.value(<_i19.PaymentCode>[]),
+          ) as _i24.Future<List<_i19.PaymentCode>>);
   @override
-  _i23.Future<void> checkForNotificationTransactionsTo(
+  _i24.Future<void> checkForNotificationTransactionsTo(
           Set<String>? otherCodeStrings) =>
       (super.noSuchMethod(
         Invocation.method(
           #checkForNotificationTransactionsTo,
           [otherCodeStrings],
         ),
-        returnValue: _i23.Future<void>.value(),
-        returnValueForMissingStub: _i23.Future<void>.value(),
-      ) as _i23.Future<void>);
+        returnValue: _i24.Future<void>.value(),
+        returnValueForMissingStub: _i24.Future<void>.value(),
+      ) as _i24.Future<void>);
   @override
-  _i23.Future<void> restoreAllHistory({
+  _i24.Future<void> restoreAllHistory({
     required int? maxUnusedAddressGap,
     required int? maxNumberOfIndexesToCheck,
     required Set<String>? paymentCodeStrings,
@@ -1853,12 +1900,12 @@ class MockBitcoinWallet extends _i1.Mock implements _i26.BitcoinWallet {
             #paymentCodeStrings: paymentCodeStrings,
           },
         ),
-        returnValue: _i23.Future<void>.value(),
-        returnValueForMissingStub: _i23.Future<void>.value(),
-      ) as _i23.Future<void>);
+        returnValue: _i24.Future<void>.value(),
+        returnValueForMissingStub: _i24.Future<void>.value(),
+      ) as _i24.Future<void>);
   @override
-  _i23.Future<void> restoreHistoryWith({
-    required _i18.PaymentCode? other,
+  _i24.Future<void> restoreHistoryWith({
+    required _i19.PaymentCode? other,
     required bool? checkSegwitAsWell,
     required int? maxUnusedAddressGap,
     required int? maxNumberOfIndexesToCheck,
@@ -1874,58 +1921,58 @@ class MockBitcoinWallet extends _i1.Mock implements _i26.BitcoinWallet {
             #maxNumberOfIndexesToCheck: maxNumberOfIndexesToCheck,
           },
         ),
-        returnValue: _i23.Future<void>.value(),
-        returnValueForMissingStub: _i23.Future<void>.value(),
-      ) as _i23.Future<void>);
+        returnValue: _i24.Future<void>.value(),
+        returnValueForMissingStub: _i24.Future<void>.value(),
+      ) as _i24.Future<void>);
   @override
-  _i23.Future<_i17.Address> getMyNotificationAddress() => (super.noSuchMethod(
+  _i24.Future<_i18.Address> getMyNotificationAddress() => (super.noSuchMethod(
         Invocation.method(
           #getMyNotificationAddress,
           [],
         ),
-        returnValue: _i23.Future<_i17.Address>.value(_FakeAddress_15(
+        returnValue: _i24.Future<_i18.Address>.value(_FakeAddress_16(
           this,
           Invocation.method(
             #getMyNotificationAddress,
             [],
           ),
         )),
-      ) as _i23.Future<_i17.Address>);
+      ) as _i24.Future<_i18.Address>);
   @override
-  _i23.Future<List<String>> lookupKey(String? paymentCodeString) =>
+  _i24.Future<List<String>> lookupKey(String? paymentCodeString) =>
       (super.noSuchMethod(
         Invocation.method(
           #lookupKey,
           [paymentCodeString],
         ),
-        returnValue: _i23.Future<List<String>>.value(<String>[]),
-      ) as _i23.Future<List<String>>);
+        returnValue: _i24.Future<List<String>>.value(<String>[]),
+      ) as _i24.Future<List<String>>);
   @override
-  _i23.Future<String?> paymentCodeStringByKey(String? key) =>
+  _i24.Future<String?> paymentCodeStringByKey(String? key) =>
       (super.noSuchMethod(
         Invocation.method(
           #paymentCodeStringByKey,
           [key],
         ),
-        returnValue: _i23.Future<String?>.value(),
-      ) as _i23.Future<String?>);
+        returnValue: _i24.Future<String?>.value(),
+      ) as _i24.Future<String?>);
   @override
-  _i23.Future<String> storeCode(String? paymentCodeString) =>
+  _i24.Future<String> storeCode(String? paymentCodeString) =>
       (super.noSuchMethod(
         Invocation.method(
           #storeCode,
           [paymentCodeString],
         ),
-        returnValue: _i23.Future<String>.value(''),
-      ) as _i23.Future<String>);
+        returnValue: _i24.Future<String>.value(''),
+      ) as _i24.Future<String>);
   @override
   void initCoinControlInterface({
     required String? walletId,
     required String? walletName,
-    required _i22.Coin? coin,
+    required _i23.Coin? coin,
     required _i12.MainDB? db,
-    required _i23.Future<int> Function()? getChainHeight,
-    required _i23.Future<void> Function(_i11.Balance)? refreshedBalanceCallback,
+    required _i24.Future<int> Function()? getChainHeight,
+    required _i24.Future<void> Function(_i11.Balance)? refreshedBalanceCallback,
   }) =>
       super.noSuchMethod(
         Invocation.method(
@@ -1943,16 +1990,16 @@ class MockBitcoinWallet extends _i1.Mock implements _i26.BitcoinWallet {
         returnValueForMissingStub: null,
       );
   @override
-  _i23.Future<void> refreshBalance({bool? notify = false}) =>
+  _i24.Future<void> refreshBalance({bool? notify = false}) =>
       (super.noSuchMethod(
         Invocation.method(
           #refreshBalance,
           [],
           {#notify: notify},
         ),
-        returnValue: _i23.Future<void>.value(),
-        returnValueForMissingStub: _i23.Future<void>.value(),
-      ) as _i23.Future<void>);
+        returnValue: _i24.Future<void>.value(),
+        returnValueForMissingStub: _i24.Future<void>.value(),
+      ) as _i24.Future<void>);
 }
 
 /// A class which mocks [NodeService].
@@ -1960,41 +2007,41 @@ class MockBitcoinWallet extends _i1.Mock implements _i26.BitcoinWallet {
 /// See the documentation for Mockito's code generation for more information.
 class MockNodeService extends _i1.Mock implements _i3.NodeService {
   @override
-  _i19.SecureStorageInterface get secureStorageInterface => (super.noSuchMethod(
+  _i20.SecureStorageInterface get secureStorageInterface => (super.noSuchMethod(
         Invocation.getter(#secureStorageInterface),
-        returnValue: _FakeSecureStorageInterface_17(
+        returnValue: _FakeSecureStorageInterface_18(
           this,
           Invocation.getter(#secureStorageInterface),
         ),
-      ) as _i19.SecureStorageInterface);
+      ) as _i20.SecureStorageInterface);
   @override
-  List<_i30.NodeModel> get primaryNodes => (super.noSuchMethod(
+  List<_i31.NodeModel> get primaryNodes => (super.noSuchMethod(
         Invocation.getter(#primaryNodes),
-        returnValue: <_i30.NodeModel>[],
-      ) as List<_i30.NodeModel>);
+        returnValue: <_i31.NodeModel>[],
+      ) as List<_i31.NodeModel>);
   @override
-  List<_i30.NodeModel> get nodes => (super.noSuchMethod(
+  List<_i31.NodeModel> get nodes => (super.noSuchMethod(
         Invocation.getter(#nodes),
-        returnValue: <_i30.NodeModel>[],
-      ) as List<_i30.NodeModel>);
+        returnValue: <_i31.NodeModel>[],
+      ) as List<_i31.NodeModel>);
   @override
   bool get hasListeners => (super.noSuchMethod(
         Invocation.getter(#hasListeners),
         returnValue: false,
       ) as bool);
   @override
-  _i23.Future<void> updateDefaults() => (super.noSuchMethod(
+  _i24.Future<void> updateDefaults() => (super.noSuchMethod(
         Invocation.method(
           #updateDefaults,
           [],
         ),
-        returnValue: _i23.Future<void>.value(),
-        returnValueForMissingStub: _i23.Future<void>.value(),
-      ) as _i23.Future<void>);
+        returnValue: _i24.Future<void>.value(),
+        returnValueForMissingStub: _i24.Future<void>.value(),
+      ) as _i24.Future<void>);
   @override
-  _i23.Future<void> setPrimaryNodeFor({
-    required _i22.Coin? coin,
-    required _i30.NodeModel? node,
+  _i24.Future<void> setPrimaryNodeFor({
+    required _i23.Coin? coin,
+    required _i31.NodeModel? node,
     bool? shouldNotifyListeners = false,
   }) =>
       (super.noSuchMethod(
@@ -2007,44 +2054,44 @@ class MockNodeService extends _i1.Mock implements _i3.NodeService {
             #shouldNotifyListeners: shouldNotifyListeners,
           },
         ),
-        returnValue: _i23.Future<void>.value(),
-        returnValueForMissingStub: _i23.Future<void>.value(),
-      ) as _i23.Future<void>);
+        returnValue: _i24.Future<void>.value(),
+        returnValueForMissingStub: _i24.Future<void>.value(),
+      ) as _i24.Future<void>);
   @override
-  _i30.NodeModel? getPrimaryNodeFor({required _i22.Coin? coin}) =>
+  _i31.NodeModel? getPrimaryNodeFor({required _i23.Coin? coin}) =>
       (super.noSuchMethod(Invocation.method(
         #getPrimaryNodeFor,
         [],
         {#coin: coin},
-      )) as _i30.NodeModel?);
+      )) as _i31.NodeModel?);
   @override
-  List<_i30.NodeModel> getNodesFor(_i22.Coin? coin) => (super.noSuchMethod(
+  List<_i31.NodeModel> getNodesFor(_i23.Coin? coin) => (super.noSuchMethod(
         Invocation.method(
           #getNodesFor,
           [coin],
         ),
-        returnValue: <_i30.NodeModel>[],
-      ) as List<_i30.NodeModel>);
+        returnValue: <_i31.NodeModel>[],
+      ) as List<_i31.NodeModel>);
   @override
-  _i30.NodeModel? getNodeById({required String? id}) =>
+  _i31.NodeModel? getNodeById({required String? id}) =>
       (super.noSuchMethod(Invocation.method(
         #getNodeById,
         [],
         {#id: id},
-      )) as _i30.NodeModel?);
+      )) as _i31.NodeModel?);
   @override
-  List<_i30.NodeModel> failoverNodesFor({required _i22.Coin? coin}) =>
+  List<_i31.NodeModel> failoverNodesFor({required _i23.Coin? coin}) =>
       (super.noSuchMethod(
         Invocation.method(
           #failoverNodesFor,
           [],
           {#coin: coin},
         ),
-        returnValue: <_i30.NodeModel>[],
-      ) as List<_i30.NodeModel>);
+        returnValue: <_i31.NodeModel>[],
+      ) as List<_i31.NodeModel>);
   @override
-  _i23.Future<void> add(
-    _i30.NodeModel? node,
+  _i24.Future<void> add(
+    _i31.NodeModel? node,
     String? password,
     bool? shouldNotifyListeners,
   ) =>
@@ -2057,11 +2104,11 @@ class MockNodeService extends _i1.Mock implements _i3.NodeService {
             shouldNotifyListeners,
           ],
         ),
-        returnValue: _i23.Future<void>.value(),
-        returnValueForMissingStub: _i23.Future<void>.value(),
-      ) as _i23.Future<void>);
+        returnValue: _i24.Future<void>.value(),
+        returnValueForMissingStub: _i24.Future<void>.value(),
+      ) as _i24.Future<void>);
   @override
-  _i23.Future<void> delete(
+  _i24.Future<void> delete(
     String? id,
     bool? shouldNotifyListeners,
   ) =>
@@ -2073,11 +2120,11 @@ class MockNodeService extends _i1.Mock implements _i3.NodeService {
             shouldNotifyListeners,
           ],
         ),
-        returnValue: _i23.Future<void>.value(),
-        returnValueForMissingStub: _i23.Future<void>.value(),
-      ) as _i23.Future<void>);
+        returnValue: _i24.Future<void>.value(),
+        returnValueForMissingStub: _i24.Future<void>.value(),
+      ) as _i24.Future<void>);
   @override
-  _i23.Future<void> setEnabledState(
+  _i24.Future<void> setEnabledState(
     String? id,
     bool? enabled,
     bool? shouldNotifyListeners,
@@ -2091,12 +2138,12 @@ class MockNodeService extends _i1.Mock implements _i3.NodeService {
             shouldNotifyListeners,
           ],
         ),
-        returnValue: _i23.Future<void>.value(),
-        returnValueForMissingStub: _i23.Future<void>.value(),
-      ) as _i23.Future<void>);
+        returnValue: _i24.Future<void>.value(),
+        returnValueForMissingStub: _i24.Future<void>.value(),
+      ) as _i24.Future<void>);
   @override
-  _i23.Future<void> edit(
-    _i30.NodeModel? editedNode,
+  _i24.Future<void> edit(
+    _i31.NodeModel? editedNode,
     String? password,
     bool? shouldNotifyListeners,
   ) =>
@@ -2109,20 +2156,20 @@ class MockNodeService extends _i1.Mock implements _i3.NodeService {
             shouldNotifyListeners,
           ],
         ),
-        returnValue: _i23.Future<void>.value(),
-        returnValueForMissingStub: _i23.Future<void>.value(),
-      ) as _i23.Future<void>);
+        returnValue: _i24.Future<void>.value(),
+        returnValueForMissingStub: _i24.Future<void>.value(),
+      ) as _i24.Future<void>);
   @override
-  _i23.Future<void> updateCommunityNodes() => (super.noSuchMethod(
+  _i24.Future<void> updateCommunityNodes() => (super.noSuchMethod(
         Invocation.method(
           #updateCommunityNodes,
           [],
         ),
-        returnValue: _i23.Future<void>.value(),
-        returnValueForMissingStub: _i23.Future<void>.value(),
-      ) as _i23.Future<void>);
+        returnValue: _i24.Future<void>.value(),
+        returnValueForMissingStub: _i24.Future<void>.value(),
+      ) as _i24.Future<void>);
   @override
-  void addListener(_i25.VoidCallback? listener) => super.noSuchMethod(
+  void addListener(_i26.VoidCallback? listener) => super.noSuchMethod(
         Invocation.method(
           #addListener,
           [listener],
@@ -2130,7 +2177,7 @@ class MockNodeService extends _i1.Mock implements _i3.NodeService {
         returnValueForMissingStub: null,
       );
   @override
-  void removeListener(_i25.VoidCallback? listener) => super.noSuchMethod(
+  void removeListener(_i26.VoidCallback? listener) => super.noSuchMethod(
         Invocation.method(
           #removeListener,
           [listener],
@@ -2173,23 +2220,23 @@ class MockManager extends _i1.Mock implements _i6.Manager {
         returnValueForMissingStub: null,
       );
   @override
-  _i20.CoinServiceAPI get wallet => (super.noSuchMethod(
+  _i21.CoinServiceAPI get wallet => (super.noSuchMethod(
         Invocation.getter(#wallet),
-        returnValue: _FakeCoinServiceAPI_18(
+        returnValue: _FakeCoinServiceAPI_19(
           this,
           Invocation.getter(#wallet),
         ),
-      ) as _i20.CoinServiceAPI);
+      ) as _i21.CoinServiceAPI);
   @override
   bool get hasBackgroundRefreshListener => (super.noSuchMethod(
         Invocation.getter(#hasBackgroundRefreshListener),
         returnValue: false,
       ) as bool);
   @override
-  _i22.Coin get coin => (super.noSuchMethod(
+  _i23.Coin get coin => (super.noSuchMethod(
         Invocation.getter(#coin),
-        returnValue: _i22.Coin.bitcoin,
-      ) as _i22.Coin);
+        returnValue: _i23.Coin.bitcoin,
+      ) as _i23.Coin);
   @override
   bool get isRefreshing => (super.noSuchMethod(
         Invocation.getter(#isRefreshing),
@@ -2222,23 +2269,23 @@ class MockManager extends _i1.Mock implements _i6.Manager {
         returnValueForMissingStub: null,
       );
   @override
-  _i23.Future<_i8.FeeObject> get fees => (super.noSuchMethod(
+  _i24.Future<_i8.FeeObject> get fees => (super.noSuchMethod(
         Invocation.getter(#fees),
-        returnValue: _i23.Future<_i8.FeeObject>.value(_FakeFeeObject_5(
+        returnValue: _i24.Future<_i8.FeeObject>.value(_FakeFeeObject_5(
           this,
           Invocation.getter(#fees),
         )),
-      ) as _i23.Future<_i8.FeeObject>);
+      ) as _i24.Future<_i8.FeeObject>);
   @override
-  _i23.Future<int> get maxFee => (super.noSuchMethod(
+  _i24.Future<int> get maxFee => (super.noSuchMethod(
         Invocation.getter(#maxFee),
-        returnValue: _i23.Future<int>.value(0),
-      ) as _i23.Future<int>);
+        returnValue: _i24.Future<int>.value(0),
+      ) as _i24.Future<int>);
   @override
-  _i23.Future<String> get currentReceivingAddress => (super.noSuchMethod(
+  _i24.Future<String> get currentReceivingAddress => (super.noSuchMethod(
         Invocation.getter(#currentReceivingAddress),
-        returnValue: _i23.Future<String>.value(''),
-      ) as _i23.Future<String>);
+        returnValue: _i24.Future<String>.value(''),
+      ) as _i24.Future<String>);
   @override
   _i11.Balance get balance => (super.noSuchMethod(
         Invocation.getter(#balance),
@@ -2248,16 +2295,16 @@ class MockManager extends _i1.Mock implements _i6.Manager {
         ),
       ) as _i11.Balance);
   @override
-  _i23.Future<List<_i17.Transaction>> get transactions => (super.noSuchMethod(
+  _i24.Future<List<_i18.Transaction>> get transactions => (super.noSuchMethod(
         Invocation.getter(#transactions),
         returnValue:
-            _i23.Future<List<_i17.Transaction>>.value(<_i17.Transaction>[]),
-      ) as _i23.Future<List<_i17.Transaction>>);
+            _i24.Future<List<_i18.Transaction>>.value(<_i18.Transaction>[]),
+      ) as _i24.Future<List<_i18.Transaction>>);
   @override
-  _i23.Future<List<_i17.UTXO>> get utxos => (super.noSuchMethod(
+  _i24.Future<List<_i18.UTXO>> get utxos => (super.noSuchMethod(
         Invocation.getter(#utxos),
-        returnValue: _i23.Future<List<_i17.UTXO>>.value(<_i17.UTXO>[]),
-      ) as _i23.Future<List<_i17.UTXO>>);
+        returnValue: _i24.Future<List<_i18.UTXO>>.value(<_i18.UTXO>[]),
+      ) as _i24.Future<List<_i18.UTXO>>);
   @override
   set walletName(String? newName) => super.noSuchMethod(
         Invocation.setter(
@@ -2277,15 +2324,15 @@ class MockManager extends _i1.Mock implements _i6.Manager {
         returnValue: '',
       ) as String);
   @override
-  _i23.Future<List<String>> get mnemonic => (super.noSuchMethod(
+  _i24.Future<List<String>> get mnemonic => (super.noSuchMethod(
         Invocation.getter(#mnemonic),
-        returnValue: _i23.Future<List<String>>.value(<String>[]),
-      ) as _i23.Future<List<String>>);
+        returnValue: _i24.Future<List<String>>.value(<String>[]),
+      ) as _i24.Future<List<String>>);
   @override
-  _i23.Future<String?> get mnemonicPassphrase => (super.noSuchMethod(
+  _i24.Future<String?> get mnemonicPassphrase => (super.noSuchMethod(
         Invocation.getter(#mnemonicPassphrase),
-        returnValue: _i23.Future<String?>.value(),
-      ) as _i23.Future<String?>);
+        returnValue: _i24.Future<String?>.value(),
+      ) as _i24.Future<String?>);
   @override
   bool get isConnected => (super.noSuchMethod(
         Invocation.getter(#isConnected),
@@ -2322,6 +2369,11 @@ class MockManager extends _i1.Mock implements _i6.Manager {
         returnValue: false,
       ) as bool);
   @override
+  bool get hasFusionSupport => (super.noSuchMethod(
+        Invocation.getter(#hasFusionSupport),
+        returnValue: false,
+      ) as bool);
+  @override
   int get rescanOnOpenVersion => (super.noSuchMethod(
         Invocation.getter(#rescanOnOpenVersion),
         returnValue: 0,
@@ -2332,24 +2384,24 @@ class MockManager extends _i1.Mock implements _i6.Manager {
         returnValue: false,
       ) as bool);
   @override
-  _i23.Future<String> get xpub => (super.noSuchMethod(
+  _i24.Future<String> get xpub => (super.noSuchMethod(
         Invocation.getter(#xpub),
-        returnValue: _i23.Future<String>.value(''),
-      ) as _i23.Future<String>);
+        returnValue: _i24.Future<String>.value(''),
+      ) as _i24.Future<String>);
   @override
   bool get hasListeners => (super.noSuchMethod(
         Invocation.getter(#hasListeners),
         returnValue: false,
       ) as bool);
   @override
-  _i23.Future<void> updateNode(bool? shouldRefresh) => (super.noSuchMethod(
+  _i24.Future<void> updateNode(bool? shouldRefresh) => (super.noSuchMethod(
         Invocation.method(
           #updateNode,
           [shouldRefresh],
         ),
-        returnValue: _i23.Future<void>.value(),
-        returnValueForMissingStub: _i23.Future<void>.value(),
-      ) as _i23.Future<void>);
+        returnValue: _i24.Future<void>.value(),
+        returnValueForMissingStub: _i24.Future<void>.value(),
+      ) as _i24.Future<void>);
   @override
   void dispose() => super.noSuchMethod(
         Invocation.method(
@@ -2359,7 +2411,7 @@ class MockManager extends _i1.Mock implements _i6.Manager {
         returnValueForMissingStub: null,
       );
   @override
-  _i23.Future<Map<String, dynamic>> prepareSend({
+  _i24.Future<Map<String, dynamic>> prepareSend({
     required String? address,
     required _i14.Amount? amount,
     Map<String, dynamic>? args,
@@ -2375,27 +2427,27 @@ class MockManager extends _i1.Mock implements _i6.Manager {
           },
         ),
         returnValue:
-            _i23.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
-      ) as _i23.Future<Map<String, dynamic>>);
+            _i24.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
+      ) as _i24.Future<Map<String, dynamic>>);
   @override
-  _i23.Future<String> confirmSend({required Map<String, dynamic>? txData}) =>
+  _i24.Future<String> confirmSend({required Map<String, dynamic>? txData}) =>
       (super.noSuchMethod(
         Invocation.method(
           #confirmSend,
           [],
           {#txData: txData},
         ),
-        returnValue: _i23.Future<String>.value(''),
-      ) as _i23.Future<String>);
+        returnValue: _i24.Future<String>.value(''),
+      ) as _i24.Future<String>);
   @override
-  _i23.Future<void> refresh() => (super.noSuchMethod(
+  _i24.Future<void> refresh() => (super.noSuchMethod(
         Invocation.method(
           #refresh,
           [],
         ),
-        returnValue: _i23.Future<void>.value(),
-        returnValueForMissingStub: _i23.Future<void>.value(),
-      ) as _i23.Future<void>);
+        returnValue: _i24.Future<void>.value(),
+        returnValueForMissingStub: _i24.Future<void>.value(),
+      ) as _i24.Future<void>);
   @override
   bool validateAddress(String? address) => (super.noSuchMethod(
         Invocation.method(
@@ -2405,35 +2457,35 @@ class MockManager extends _i1.Mock implements _i6.Manager {
         returnValue: false,
       ) as bool);
   @override
-  _i23.Future<bool> testNetworkConnection() => (super.noSuchMethod(
+  _i24.Future<bool> testNetworkConnection() => (super.noSuchMethod(
         Invocation.method(
           #testNetworkConnection,
           [],
         ),
-        returnValue: _i23.Future<bool>.value(false),
-      ) as _i23.Future<bool>);
+        returnValue: _i24.Future<bool>.value(false),
+      ) as _i24.Future<bool>);
   @override
-  _i23.Future<void> initializeNew(
+  _i24.Future<void> initializeNew(
           ({String mnemonicPassphrase, int wordCount})? data) =>
       (super.noSuchMethod(
         Invocation.method(
           #initializeNew,
           [data],
         ),
-        returnValue: _i23.Future<void>.value(),
-        returnValueForMissingStub: _i23.Future<void>.value(),
-      ) as _i23.Future<void>);
+        returnValue: _i24.Future<void>.value(),
+        returnValueForMissingStub: _i24.Future<void>.value(),
+      ) as _i24.Future<void>);
   @override
-  _i23.Future<void> initializeExisting() => (super.noSuchMethod(
+  _i24.Future<void> initializeExisting() => (super.noSuchMethod(
         Invocation.method(
           #initializeExisting,
           [],
         ),
-        returnValue: _i23.Future<void>.value(),
-        returnValueForMissingStub: _i23.Future<void>.value(),
-      ) as _i23.Future<void>);
+        returnValue: _i24.Future<void>.value(),
+        returnValueForMissingStub: _i24.Future<void>.value(),
+      ) as _i24.Future<void>);
   @override
-  _i23.Future<void> recoverFromMnemonic({
+  _i24.Future<void> recoverFromMnemonic({
     required String? mnemonic,
     String? mnemonicPassphrase,
     required int? maxUnusedAddressGap,
@@ -2452,20 +2504,20 @@ class MockManager extends _i1.Mock implements _i6.Manager {
             #height: height,
           },
         ),
-        returnValue: _i23.Future<void>.value(),
-        returnValueForMissingStub: _i23.Future<void>.value(),
-      ) as _i23.Future<void>);
+        returnValue: _i24.Future<void>.value(),
+        returnValueForMissingStub: _i24.Future<void>.value(),
+      ) as _i24.Future<void>);
   @override
-  _i23.Future<void> exitCurrentWallet() => (super.noSuchMethod(
+  _i24.Future<void> exitCurrentWallet() => (super.noSuchMethod(
         Invocation.method(
           #exitCurrentWallet,
           [],
         ),
-        returnValue: _i23.Future<void>.value(),
-        returnValueForMissingStub: _i23.Future<void>.value(),
-      ) as _i23.Future<void>);
+        returnValue: _i24.Future<void>.value(),
+        returnValueForMissingStub: _i24.Future<void>.value(),
+      ) as _i24.Future<void>);
   @override
-  _i23.Future<void> fullRescan(
+  _i24.Future<void> fullRescan(
     int? maxUnusedAddressGap,
     int? maxNumberOfIndexesToCheck,
   ) =>
@@ -2477,11 +2529,11 @@ class MockManager extends _i1.Mock implements _i6.Manager {
             maxNumberOfIndexesToCheck,
           ],
         ),
-        returnValue: _i23.Future<void>.value(),
-        returnValueForMissingStub: _i23.Future<void>.value(),
-      ) as _i23.Future<void>);
+        returnValue: _i24.Future<void>.value(),
+        returnValueForMissingStub: _i24.Future<void>.value(),
+      ) as _i24.Future<void>);
   @override
-  _i23.Future<_i14.Amount> estimateFeeFor(
+  _i24.Future<_i14.Amount> estimateFeeFor(
     _i14.Amount? amount,
     int? feeRate,
   ) =>
@@ -2493,7 +2545,7 @@ class MockManager extends _i1.Mock implements _i6.Manager {
             feeRate,
           ],
         ),
-        returnValue: _i23.Future<_i14.Amount>.value(_FakeAmount_12(
+        returnValue: _i24.Future<_i14.Amount>.value(_FakeAmount_12(
           this,
           Invocation.method(
             #estimateFeeFor,
@@ -2503,26 +2555,26 @@ class MockManager extends _i1.Mock implements _i6.Manager {
             ],
           ),
         )),
-      ) as _i23.Future<_i14.Amount>);
+      ) as _i24.Future<_i14.Amount>);
   @override
-  _i23.Future<bool> generateNewAddress() => (super.noSuchMethod(
+  _i24.Future<bool> generateNewAddress() => (super.noSuchMethod(
         Invocation.method(
           #generateNewAddress,
           [],
         ),
-        returnValue: _i23.Future<bool>.value(false),
-      ) as _i23.Future<bool>);
+        returnValue: _i24.Future<bool>.value(false),
+      ) as _i24.Future<bool>);
   @override
-  _i23.Future<void> resetRescanOnOpen() => (super.noSuchMethod(
+  _i24.Future<void> resetRescanOnOpen() => (super.noSuchMethod(
         Invocation.method(
           #resetRescanOnOpen,
           [],
         ),
-        returnValue: _i23.Future<void>.value(),
-        returnValueForMissingStub: _i23.Future<void>.value(),
-      ) as _i23.Future<void>);
+        returnValue: _i24.Future<void>.value(),
+        returnValueForMissingStub: _i24.Future<void>.value(),
+      ) as _i24.Future<void>);
   @override
-  void addListener(_i25.VoidCallback? listener) => super.noSuchMethod(
+  void addListener(_i26.VoidCallback? listener) => super.noSuchMethod(
         Invocation.method(
           #addListener,
           [listener],
@@ -2530,7 +2582,7 @@ class MockManager extends _i1.Mock implements _i6.Manager {
         returnValueForMissingStub: null,
       );
   @override
-  void removeListener(_i25.VoidCallback? listener) => super.noSuchMethod(
+  void removeListener(_i26.VoidCallback? listener) => super.noSuchMethod(
         Invocation.method(
           #removeListener,
           [listener],
@@ -2550,7 +2602,7 @@ class MockManager extends _i1.Mock implements _i6.Manager {
 /// A class which mocks [CoinServiceAPI].
 ///
 /// See the documentation for Mockito's code generation for more information.
-class MockCoinServiceAPI extends _i1.Mock implements _i20.CoinServiceAPI {
+class MockCoinServiceAPI extends _i1.Mock implements _i21.CoinServiceAPI {
   @override
   set onIsActiveWalletChanged(void Function(bool)? _onIsActiveWalletChanged) =>
       super.noSuchMethod(
@@ -2561,10 +2613,10 @@ class MockCoinServiceAPI extends _i1.Mock implements _i20.CoinServiceAPI {
         returnValueForMissingStub: null,
       );
   @override
-  _i22.Coin get coin => (super.noSuchMethod(
+  _i23.Coin get coin => (super.noSuchMethod(
         Invocation.getter(#coin),
-        returnValue: _i22.Coin.bitcoin,
-      ) as _i22.Coin);
+        returnValue: _i23.Coin.bitcoin,
+      ) as _i23.Coin);
   @override
   bool get isRefreshing => (super.noSuchMethod(
         Invocation.getter(#isRefreshing),
@@ -2597,23 +2649,23 @@ class MockCoinServiceAPI extends _i1.Mock implements _i20.CoinServiceAPI {
         returnValueForMissingStub: null,
       );
   @override
-  _i23.Future<_i8.FeeObject> get fees => (super.noSuchMethod(
+  _i24.Future<_i8.FeeObject> get fees => (super.noSuchMethod(
         Invocation.getter(#fees),
-        returnValue: _i23.Future<_i8.FeeObject>.value(_FakeFeeObject_5(
+        returnValue: _i24.Future<_i8.FeeObject>.value(_FakeFeeObject_5(
           this,
           Invocation.getter(#fees),
         )),
-      ) as _i23.Future<_i8.FeeObject>);
+      ) as _i24.Future<_i8.FeeObject>);
   @override
-  _i23.Future<int> get maxFee => (super.noSuchMethod(
+  _i24.Future<int> get maxFee => (super.noSuchMethod(
         Invocation.getter(#maxFee),
-        returnValue: _i23.Future<int>.value(0),
-      ) as _i23.Future<int>);
+        returnValue: _i24.Future<int>.value(0),
+      ) as _i24.Future<int>);
   @override
-  _i23.Future<String> get currentReceivingAddress => (super.noSuchMethod(
+  _i24.Future<String> get currentReceivingAddress => (super.noSuchMethod(
         Invocation.getter(#currentReceivingAddress),
-        returnValue: _i23.Future<String>.value(''),
-      ) as _i23.Future<String>);
+        returnValue: _i24.Future<String>.value(''),
+      ) as _i24.Future<String>);
   @override
   _i11.Balance get balance => (super.noSuchMethod(
         Invocation.getter(#balance),
@@ -2623,16 +2675,16 @@ class MockCoinServiceAPI extends _i1.Mock implements _i20.CoinServiceAPI {
         ),
       ) as _i11.Balance);
   @override
-  _i23.Future<List<_i17.Transaction>> get transactions => (super.noSuchMethod(
+  _i24.Future<List<_i18.Transaction>> get transactions => (super.noSuchMethod(
         Invocation.getter(#transactions),
         returnValue:
-            _i23.Future<List<_i17.Transaction>>.value(<_i17.Transaction>[]),
-      ) as _i23.Future<List<_i17.Transaction>>);
+            _i24.Future<List<_i18.Transaction>>.value(<_i18.Transaction>[]),
+      ) as _i24.Future<List<_i18.Transaction>>);
   @override
-  _i23.Future<List<_i17.UTXO>> get utxos => (super.noSuchMethod(
+  _i24.Future<List<_i18.UTXO>> get utxos => (super.noSuchMethod(
         Invocation.getter(#utxos),
-        returnValue: _i23.Future<List<_i17.UTXO>>.value(<_i17.UTXO>[]),
-      ) as _i23.Future<List<_i17.UTXO>>);
+        returnValue: _i24.Future<List<_i18.UTXO>>.value(<_i18.UTXO>[]),
+      ) as _i24.Future<List<_i18.UTXO>>);
   @override
   set walletName(String? newName) => super.noSuchMethod(
         Invocation.setter(
@@ -2652,20 +2704,20 @@ class MockCoinServiceAPI extends _i1.Mock implements _i20.CoinServiceAPI {
         returnValue: '',
       ) as String);
   @override
-  _i23.Future<List<String>> get mnemonic => (super.noSuchMethod(
+  _i24.Future<List<String>> get mnemonic => (super.noSuchMethod(
         Invocation.getter(#mnemonic),
-        returnValue: _i23.Future<List<String>>.value(<String>[]),
-      ) as _i23.Future<List<String>>);
+        returnValue: _i24.Future<List<String>>.value(<String>[]),
+      ) as _i24.Future<List<String>>);
   @override
-  _i23.Future<String?> get mnemonicString => (super.noSuchMethod(
+  _i24.Future<String?> get mnemonicString => (super.noSuchMethod(
         Invocation.getter(#mnemonicString),
-        returnValue: _i23.Future<String?>.value(),
-      ) as _i23.Future<String?>);
+        returnValue: _i24.Future<String?>.value(),
+      ) as _i24.Future<String?>);
   @override
-  _i23.Future<String?> get mnemonicPassphrase => (super.noSuchMethod(
+  _i24.Future<String?> get mnemonicPassphrase => (super.noSuchMethod(
         Invocation.getter(#mnemonicPassphrase),
-        returnValue: _i23.Future<String?>.value(),
-      ) as _i23.Future<String?>);
+        returnValue: _i24.Future<String?>.value(),
+      ) as _i24.Future<String?>);
   @override
   bool get hasCalledExit => (super.noSuchMethod(
         Invocation.getter(#hasCalledExit),
@@ -2682,7 +2734,7 @@ class MockCoinServiceAPI extends _i1.Mock implements _i20.CoinServiceAPI {
         returnValue: 0,
       ) as int);
   @override
-  _i23.Future<Map<String, dynamic>> prepareSend({
+  _i24.Future<Map<String, dynamic>> prepareSend({
     required String? address,
     required _i14.Amount? amount,
     Map<String, dynamic>? args,
@@ -2698,36 +2750,36 @@ class MockCoinServiceAPI extends _i1.Mock implements _i20.CoinServiceAPI {
           },
         ),
         returnValue:
-            _i23.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
-      ) as _i23.Future<Map<String, dynamic>>);
+            _i24.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
+      ) as _i24.Future<Map<String, dynamic>>);
   @override
-  _i23.Future<String> confirmSend({required Map<String, dynamic>? txData}) =>
+  _i24.Future<String> confirmSend({required Map<String, dynamic>? txData}) =>
       (super.noSuchMethod(
         Invocation.method(
           #confirmSend,
           [],
           {#txData: txData},
         ),
-        returnValue: _i23.Future<String>.value(''),
-      ) as _i23.Future<String>);
+        returnValue: _i24.Future<String>.value(''),
+      ) as _i24.Future<String>);
   @override
-  _i23.Future<void> refresh() => (super.noSuchMethod(
+  _i24.Future<void> refresh() => (super.noSuchMethod(
         Invocation.method(
           #refresh,
           [],
         ),
-        returnValue: _i23.Future<void>.value(),
-        returnValueForMissingStub: _i23.Future<void>.value(),
-      ) as _i23.Future<void>);
+        returnValue: _i24.Future<void>.value(),
+        returnValueForMissingStub: _i24.Future<void>.value(),
+      ) as _i24.Future<void>);
   @override
-  _i23.Future<void> updateNode(bool? shouldRefresh) => (super.noSuchMethod(
+  _i24.Future<void> updateNode(bool? shouldRefresh) => (super.noSuchMethod(
         Invocation.method(
           #updateNode,
           [shouldRefresh],
         ),
-        returnValue: _i23.Future<void>.value(),
-        returnValueForMissingStub: _i23.Future<void>.value(),
-      ) as _i23.Future<void>);
+        returnValue: _i24.Future<void>.value(),
+        returnValueForMissingStub: _i24.Future<void>.value(),
+      ) as _i24.Future<void>);
   @override
   bool validateAddress(String? address) => (super.noSuchMethod(
         Invocation.method(
@@ -2737,15 +2789,15 @@ class MockCoinServiceAPI extends _i1.Mock implements _i20.CoinServiceAPI {
         returnValue: false,
       ) as bool);
   @override
-  _i23.Future<bool> testNetworkConnection() => (super.noSuchMethod(
+  _i24.Future<bool> testNetworkConnection() => (super.noSuchMethod(
         Invocation.method(
           #testNetworkConnection,
           [],
         ),
-        returnValue: _i23.Future<bool>.value(false),
-      ) as _i23.Future<bool>);
+        returnValue: _i24.Future<bool>.value(false),
+      ) as _i24.Future<bool>);
   @override
-  _i23.Future<void> recoverFromMnemonic({
+  _i24.Future<void> recoverFromMnemonic({
     required String? mnemonic,
     String? mnemonicPassphrase,
     required int? maxUnusedAddressGap,
@@ -2764,40 +2816,40 @@ class MockCoinServiceAPI extends _i1.Mock implements _i20.CoinServiceAPI {
             #height: height,
           },
         ),
-        returnValue: _i23.Future<void>.value(),
-        returnValueForMissingStub: _i23.Future<void>.value(),
-      ) as _i23.Future<void>);
+        returnValue: _i24.Future<void>.value(),
+        returnValueForMissingStub: _i24.Future<void>.value(),
+      ) as _i24.Future<void>);
   @override
-  _i23.Future<void> initializeNew(
+  _i24.Future<void> initializeNew(
           ({String mnemonicPassphrase, int wordCount})? data) =>
       (super.noSuchMethod(
         Invocation.method(
           #initializeNew,
           [data],
         ),
-        returnValue: _i23.Future<void>.value(),
-        returnValueForMissingStub: _i23.Future<void>.value(),
-      ) as _i23.Future<void>);
+        returnValue: _i24.Future<void>.value(),
+        returnValueForMissingStub: _i24.Future<void>.value(),
+      ) as _i24.Future<void>);
   @override
-  _i23.Future<void> initializeExisting() => (super.noSuchMethod(
+  _i24.Future<void> initializeExisting() => (super.noSuchMethod(
         Invocation.method(
           #initializeExisting,
           [],
         ),
-        returnValue: _i23.Future<void>.value(),
-        returnValueForMissingStub: _i23.Future<void>.value(),
-      ) as _i23.Future<void>);
+        returnValue: _i24.Future<void>.value(),
+        returnValueForMissingStub: _i24.Future<void>.value(),
+      ) as _i24.Future<void>);
   @override
-  _i23.Future<void> exit() => (super.noSuchMethod(
+  _i24.Future<void> exit() => (super.noSuchMethod(
         Invocation.method(
           #exit,
           [],
         ),
-        returnValue: _i23.Future<void>.value(),
-        returnValueForMissingStub: _i23.Future<void>.value(),
-      ) as _i23.Future<void>);
+        returnValue: _i24.Future<void>.value(),
+        returnValueForMissingStub: _i24.Future<void>.value(),
+      ) as _i24.Future<void>);
   @override
-  _i23.Future<void> fullRescan(
+  _i24.Future<void> fullRescan(
     int? maxUnusedAddressGap,
     int? maxNumberOfIndexesToCheck,
   ) =>
@@ -2809,11 +2861,11 @@ class MockCoinServiceAPI extends _i1.Mock implements _i20.CoinServiceAPI {
             maxNumberOfIndexesToCheck,
           ],
         ),
-        returnValue: _i23.Future<void>.value(),
-        returnValueForMissingStub: _i23.Future<void>.value(),
-      ) as _i23.Future<void>);
+        returnValue: _i24.Future<void>.value(),
+        returnValueForMissingStub: _i24.Future<void>.value(),
+      ) as _i24.Future<void>);
   @override
-  _i23.Future<_i14.Amount> estimateFeeFor(
+  _i24.Future<_i14.Amount> estimateFeeFor(
     _i14.Amount? amount,
     int? feeRate,
   ) =>
@@ -2825,7 +2877,7 @@ class MockCoinServiceAPI extends _i1.Mock implements _i20.CoinServiceAPI {
             feeRate,
           ],
         ),
-        returnValue: _i23.Future<_i14.Amount>.value(_FakeAmount_12(
+        returnValue: _i24.Future<_i14.Amount>.value(_FakeAmount_12(
           this,
           Invocation.method(
             #estimateFeeFor,
@@ -2835,23 +2887,23 @@ class MockCoinServiceAPI extends _i1.Mock implements _i20.CoinServiceAPI {
             ],
           ),
         )),
-      ) as _i23.Future<_i14.Amount>);
+      ) as _i24.Future<_i14.Amount>);
   @override
-  _i23.Future<bool> generateNewAddress() => (super.noSuchMethod(
+  _i24.Future<bool> generateNewAddress() => (super.noSuchMethod(
         Invocation.method(
           #generateNewAddress,
           [],
         ),
-        returnValue: _i23.Future<bool>.value(false),
-      ) as _i23.Future<bool>);
+        returnValue: _i24.Future<bool>.value(false),
+      ) as _i24.Future<bool>);
   @override
-  _i23.Future<void> updateSentCachedTxData(Map<String, dynamic>? txData) =>
+  _i24.Future<void> updateSentCachedTxData(Map<String, dynamic>? txData) =>
       (super.noSuchMethod(
         Invocation.method(
           #updateSentCachedTxData,
           [txData],
         ),
-        returnValue: _i23.Future<void>.value(),
-        returnValueForMissingStub: _i23.Future<void>.value(),
-      ) as _i23.Future<void>);
+        returnValue: _i24.Future<void>.value(),
+        returnValueForMissingStub: _i24.Future<void>.value(),
+      ) as _i24.Future<void>);
 }
diff --git a/test/widget_tests/wallet_info_row/wallet_info_row_test.mocks.dart b/test/widget_tests/wallet_info_row/wallet_info_row_test.mocks.dart
index 7a14a4547..475b3a4e4 100644
--- a/test/widget_tests/wallet_info_row/wallet_info_row_test.mocks.dart
+++ b/test/widget_tests/wallet_info_row/wallet_info_row_test.mocks.dart
@@ -3,12 +3,12 @@
 // Do not manually edit this file.
 
 // ignore_for_file: no_leading_underscores_for_library_prefixes
-import 'dart:async' as _i24;
-import 'dart:typed_data' as _i29;
-import 'dart:ui' as _i26;
+import 'dart:async' as _i25;
+import 'dart:typed_data' as _i30;
+import 'dart:ui' as _i27;
 
-import 'package:bip32/bip32.dart' as _i17;
-import 'package:bip47/bip47.dart' as _i19;
+import 'package:bip32/bip32.dart' as _i18;
+import 'package:bip47/bip47.dart' as _i20;
 import 'package:bitcoindart/bitcoindart.dart' as _i14;
 import 'package:flutter/foundation.dart' as _i4;
 import 'package:flutter_riverpod/flutter_riverpod.dart' as _i5;
@@ -17,28 +17,30 @@ import 'package:stackwallet/db/isar/main_db.dart' as _i8;
 import 'package:stackwallet/electrumx_rpc/cached_electrumx.dart' as _i12;
 import 'package:stackwallet/electrumx_rpc/electrumx.dart' as _i11;
 import 'package:stackwallet/models/balance.dart' as _i13;
-import 'package:stackwallet/models/isar/models/isar_models.dart' as _i18;
-import 'package:stackwallet/models/isar/stack_theme.dart' as _i28;
-import 'package:stackwallet/models/node_model.dart' as _i33;
+import 'package:stackwallet/models/isar/models/blockchain_data/v2/transaction_v2.dart'
+    as _i16;
+import 'package:stackwallet/models/isar/models/isar_models.dart' as _i19;
+import 'package:stackwallet/models/isar/stack_theme.dart' as _i29;
+import 'package:stackwallet/models/node_model.dart' as _i34;
 import 'package:stackwallet/models/paymint/fee_object_model.dart' as _i10;
-import 'package:stackwallet/models/signing_data.dart' as _i32;
+import 'package:stackwallet/models/signing_data.dart' as _i33;
 import 'package:stackwallet/networking/http.dart' as _i7;
-import 'package:stackwallet/services/coins/bitcoin/bitcoin_wallet.dart' as _i30;
-import 'package:stackwallet/services/coins/coin_service.dart' as _i21;
+import 'package:stackwallet/services/coins/bitcoin/bitcoin_wallet.dart' as _i31;
+import 'package:stackwallet/services/coins/coin_service.dart' as _i22;
 import 'package:stackwallet/services/coins/manager.dart' as _i6;
 import 'package:stackwallet/services/node_service.dart' as _i3;
 import 'package:stackwallet/services/transaction_notification_tracker.dart'
     as _i9;
-import 'package:stackwallet/services/wallets.dart' as _i22;
+import 'package:stackwallet/services/wallets.dart' as _i23;
 import 'package:stackwallet/services/wallets_service.dart' as _i2;
-import 'package:stackwallet/themes/theme_service.dart' as _i27;
+import 'package:stackwallet/themes/theme_service.dart' as _i28;
 import 'package:stackwallet/utilities/amount/amount.dart' as _i15;
-import 'package:stackwallet/utilities/enums/coin_enum.dart' as _i23;
-import 'package:stackwallet/utilities/enums/derive_path_type_enum.dart' as _i31;
+import 'package:stackwallet/utilities/enums/coin_enum.dart' as _i24;
+import 'package:stackwallet/utilities/enums/derive_path_type_enum.dart' as _i32;
 import 'package:stackwallet/utilities/flutter_secure_storage_interface.dart'
-    as _i20;
-import 'package:stackwallet/utilities/prefs.dart' as _i25;
-import 'package:tuple/tuple.dart' as _i16;
+    as _i21;
+import 'package:stackwallet/utilities/prefs.dart' as _i26;
+import 'package:tuple/tuple.dart' as _i17;
 
 // ignore_for_file: type=lint
 // ignore_for_file: avoid_redundant_argument_values
@@ -196,9 +198,9 @@ class _FakeAmount_13 extends _i1.SmartFake implements _i15.Amount {
         );
 }
 
-class _FakeTuple2_14<T1, T2> extends _i1.SmartFake
-    implements _i16.Tuple2<T1, T2> {
-  _FakeTuple2_14(
+class _FakeTransactionV2_14 extends _i1.SmartFake
+    implements _i16.TransactionV2 {
+  _FakeTransactionV2_14(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -207,8 +209,9 @@ class _FakeTuple2_14<T1, T2> extends _i1.SmartFake
         );
 }
 
-class _FakeBIP32_15 extends _i1.SmartFake implements _i17.BIP32 {
-  _FakeBIP32_15(
+class _FakeTuple2_15<T1, T2> extends _i1.SmartFake
+    implements _i17.Tuple2<T1, T2> {
+  _FakeTuple2_15(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -217,8 +220,8 @@ class _FakeBIP32_15 extends _i1.SmartFake implements _i17.BIP32 {
         );
 }
 
-class _FakeAddress_16 extends _i1.SmartFake implements _i18.Address {
-  _FakeAddress_16(
+class _FakeBIP32_16 extends _i1.SmartFake implements _i18.BIP32 {
+  _FakeBIP32_16(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -227,8 +230,8 @@ class _FakeAddress_16 extends _i1.SmartFake implements _i18.Address {
         );
 }
 
-class _FakePaymentCode_17 extends _i1.SmartFake implements _i19.PaymentCode {
-  _FakePaymentCode_17(
+class _FakeAddress_17 extends _i1.SmartFake implements _i19.Address {
+  _FakeAddress_17(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -237,9 +240,8 @@ class _FakePaymentCode_17 extends _i1.SmartFake implements _i19.PaymentCode {
         );
 }
 
-class _FakeSecureStorageInterface_18 extends _i1.SmartFake
-    implements _i20.SecureStorageInterface {
-  _FakeSecureStorageInterface_18(
+class _FakePaymentCode_18 extends _i1.SmartFake implements _i20.PaymentCode {
+  _FakePaymentCode_18(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -248,9 +250,20 @@ class _FakeSecureStorageInterface_18 extends _i1.SmartFake
         );
 }
 
-class _FakeCoinServiceAPI_19 extends _i1.SmartFake
-    implements _i21.CoinServiceAPI {
-  _FakeCoinServiceAPI_19(
+class _FakeSecureStorageInterface_19 extends _i1.SmartFake
+    implements _i21.SecureStorageInterface {
+  _FakeSecureStorageInterface_19(
+    Object parent,
+    Invocation parentInvocation,
+  ) : super(
+          parent,
+          parentInvocation,
+        );
+}
+
+class _FakeCoinServiceAPI_20 extends _i1.SmartFake
+    implements _i22.CoinServiceAPI {
+  _FakeCoinServiceAPI_20(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -262,7 +275,7 @@ class _FakeCoinServiceAPI_19 extends _i1.SmartFake
 /// A class which mocks [Wallets].
 ///
 /// See the documentation for Mockito's code generation for more information.
-class MockWallets extends _i1.Mock implements _i22.Wallets {
+class MockWallets extends _i1.Mock implements _i23.Wallets {
   MockWallets() {
     _i1.throwOnMissingStub(this);
   }
@@ -329,7 +342,7 @@ class MockWallets extends _i1.Mock implements _i22.Wallets {
         returnValueForMissingStub: null,
       );
   @override
-  List<String> getWalletIdsFor({required _i23.Coin? coin}) =>
+  List<String> getWalletIdsFor({required _i24.Coin? coin}) =>
       (super.noSuchMethod(
         Invocation.method(
           #getWalletIdsFor,
@@ -339,20 +352,20 @@ class MockWallets extends _i1.Mock implements _i22.Wallets {
         returnValue: <String>[],
       ) as List<String>);
   @override
-  List<_i16.Tuple2<_i23.Coin, List<_i5.ChangeNotifierProvider<_i6.Manager>>>>
+  List<_i17.Tuple2<_i24.Coin, List<_i5.ChangeNotifierProvider<_i6.Manager>>>>
       getManagerProvidersByCoin() => (super.noSuchMethod(
             Invocation.method(
               #getManagerProvidersByCoin,
               [],
             ),
-            returnValue: <_i16.Tuple2<_i23.Coin,
+            returnValue: <_i17.Tuple2<_i24.Coin,
                 List<_i5.ChangeNotifierProvider<_i6.Manager>>>>[],
           ) as List<
-              _i16.Tuple2<_i23.Coin,
+              _i17.Tuple2<_i24.Coin,
                   List<_i5.ChangeNotifierProvider<_i6.Manager>>>>);
   @override
   List<_i5.ChangeNotifierProvider<_i6.Manager>> getManagerProvidersForCoin(
-          _i23.Coin? coin) =>
+          _i24.Coin? coin) =>
       (super.noSuchMethod(
         Invocation.method(
           #getManagerProvidersForCoin,
@@ -416,17 +429,17 @@ class MockWallets extends _i1.Mock implements _i22.Wallets {
         returnValueForMissingStub: null,
       );
   @override
-  _i24.Future<void> load(_i25.Prefs? prefs) => (super.noSuchMethod(
+  _i25.Future<void> load(_i26.Prefs? prefs) => (super.noSuchMethod(
         Invocation.method(
           #load,
           [prefs],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i25.Future<void>.value(),
+        returnValueForMissingStub: _i25.Future<void>.value(),
+      ) as _i25.Future<void>);
   @override
-  _i24.Future<void> loadAfterStackRestore(
-    _i25.Prefs? prefs,
+  _i25.Future<void> loadAfterStackRestore(
+    _i26.Prefs? prefs,
     List<_i6.Manager>? managers,
   ) =>
       (super.noSuchMethod(
@@ -437,11 +450,11 @@ class MockWallets extends _i1.Mock implements _i22.Wallets {
             managers,
           ],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i25.Future<void>.value(),
+        returnValueForMissingStub: _i25.Future<void>.value(),
+      ) as _i25.Future<void>);
   @override
-  void addListener(_i26.VoidCallback? listener) => super.noSuchMethod(
+  void addListener(_i27.VoidCallback? listener) => super.noSuchMethod(
         Invocation.method(
           #addListener,
           [listener],
@@ -449,7 +462,7 @@ class MockWallets extends _i1.Mock implements _i22.Wallets {
         returnValueForMissingStub: null,
       );
   @override
-  void removeListener(_i26.VoidCallback? listener) => super.noSuchMethod(
+  void removeListener(_i27.VoidCallback? listener) => super.noSuchMethod(
         Invocation.method(
           #removeListener,
           [listener],
@@ -475,19 +488,19 @@ class MockWalletsService extends _i1.Mock implements _i2.WalletsService {
   }
 
   @override
-  _i24.Future<Map<String, _i2.WalletInfo>> get walletNames =>
+  _i25.Future<Map<String, _i2.WalletInfo>> get walletNames =>
       (super.noSuchMethod(
         Invocation.getter(#walletNames),
-        returnValue: _i24.Future<Map<String, _i2.WalletInfo>>.value(
+        returnValue: _i25.Future<Map<String, _i2.WalletInfo>>.value(
             <String, _i2.WalletInfo>{}),
-      ) as _i24.Future<Map<String, _i2.WalletInfo>>);
+      ) as _i25.Future<Map<String, _i2.WalletInfo>>);
   @override
   bool get hasListeners => (super.noSuchMethod(
         Invocation.getter(#hasListeners),
         returnValue: false,
       ) as bool);
   @override
-  _i24.Future<bool> renameWallet({
+  _i25.Future<bool> renameWallet({
     required String? from,
     required String? to,
     required bool? shouldNotifyListeners,
@@ -502,8 +515,8 @@ class MockWalletsService extends _i1.Mock implements _i2.WalletsService {
             #shouldNotifyListeners: shouldNotifyListeners,
           },
         ),
-        returnValue: _i24.Future<bool>.value(false),
-      ) as _i24.Future<bool>);
+        returnValue: _i25.Future<bool>.value(false),
+      ) as _i25.Future<bool>);
   @override
   Map<String, _i2.WalletInfo> fetchWalletsData() => (super.noSuchMethod(
         Invocation.method(
@@ -513,10 +526,10 @@ class MockWalletsService extends _i1.Mock implements _i2.WalletsService {
         returnValue: <String, _i2.WalletInfo>{},
       ) as Map<String, _i2.WalletInfo>);
   @override
-  _i24.Future<void> addExistingStackWallet({
+  _i25.Future<void> addExistingStackWallet({
     required String? name,
     required String? walletId,
-    required _i23.Coin? coin,
+    required _i24.Coin? coin,
     required bool? shouldNotifyListeners,
   }) =>
       (super.noSuchMethod(
@@ -530,13 +543,13 @@ class MockWalletsService extends _i1.Mock implements _i2.WalletsService {
             #shouldNotifyListeners: shouldNotifyListeners,
           },
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i25.Future<void>.value(),
+        returnValueForMissingStub: _i25.Future<void>.value(),
+      ) as _i25.Future<void>);
   @override
-  _i24.Future<String?> addNewWallet({
+  _i25.Future<String?> addNewWallet({
     required String? name,
-    required _i23.Coin? coin,
+    required _i24.Coin? coin,
     required bool? shouldNotifyListeners,
   }) =>
       (super.noSuchMethod(
@@ -549,46 +562,46 @@ class MockWalletsService extends _i1.Mock implements _i2.WalletsService {
             #shouldNotifyListeners: shouldNotifyListeners,
           },
         ),
-        returnValue: _i24.Future<String?>.value(),
-      ) as _i24.Future<String?>);
+        returnValue: _i25.Future<String?>.value(),
+      ) as _i25.Future<String?>);
   @override
-  _i24.Future<List<String>> getFavoriteWalletIds() => (super.noSuchMethod(
+  _i25.Future<List<String>> getFavoriteWalletIds() => (super.noSuchMethod(
         Invocation.method(
           #getFavoriteWalletIds,
           [],
         ),
-        returnValue: _i24.Future<List<String>>.value(<String>[]),
-      ) as _i24.Future<List<String>>);
+        returnValue: _i25.Future<List<String>>.value(<String>[]),
+      ) as _i25.Future<List<String>>);
   @override
-  _i24.Future<void> saveFavoriteWalletIds(List<String>? walletIds) =>
+  _i25.Future<void> saveFavoriteWalletIds(List<String>? walletIds) =>
       (super.noSuchMethod(
         Invocation.method(
           #saveFavoriteWalletIds,
           [walletIds],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i25.Future<void>.value(),
+        returnValueForMissingStub: _i25.Future<void>.value(),
+      ) as _i25.Future<void>);
   @override
-  _i24.Future<void> addFavorite(String? walletId) => (super.noSuchMethod(
+  _i25.Future<void> addFavorite(String? walletId) => (super.noSuchMethod(
         Invocation.method(
           #addFavorite,
           [walletId],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i25.Future<void>.value(),
+        returnValueForMissingStub: _i25.Future<void>.value(),
+      ) as _i25.Future<void>);
   @override
-  _i24.Future<void> removeFavorite(String? walletId) => (super.noSuchMethod(
+  _i25.Future<void> removeFavorite(String? walletId) => (super.noSuchMethod(
         Invocation.method(
           #removeFavorite,
           [walletId],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i25.Future<void>.value(),
+        returnValueForMissingStub: _i25.Future<void>.value(),
+      ) as _i25.Future<void>);
   @override
-  _i24.Future<void> moveFavorite({
+  _i25.Future<void> moveFavorite({
     required int? fromIndex,
     required int? toIndex,
   }) =>
@@ -601,48 +614,48 @@ class MockWalletsService extends _i1.Mock implements _i2.WalletsService {
             #toIndex: toIndex,
           },
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i25.Future<void>.value(),
+        returnValueForMissingStub: _i25.Future<void>.value(),
+      ) as _i25.Future<void>);
   @override
-  _i24.Future<bool> checkForDuplicate(String? name) => (super.noSuchMethod(
+  _i25.Future<bool> checkForDuplicate(String? name) => (super.noSuchMethod(
         Invocation.method(
           #checkForDuplicate,
           [name],
         ),
-        returnValue: _i24.Future<bool>.value(false),
-      ) as _i24.Future<bool>);
+        returnValue: _i25.Future<bool>.value(false),
+      ) as _i25.Future<bool>);
   @override
-  _i24.Future<String?> getWalletId(String? walletName) => (super.noSuchMethod(
+  _i25.Future<String?> getWalletId(String? walletName) => (super.noSuchMethod(
         Invocation.method(
           #getWalletId,
           [walletName],
         ),
-        returnValue: _i24.Future<String?>.value(),
-      ) as _i24.Future<String?>);
+        returnValue: _i25.Future<String?>.value(),
+      ) as _i25.Future<String?>);
   @override
-  _i24.Future<bool> isMnemonicVerified({required String? walletId}) =>
+  _i25.Future<bool> isMnemonicVerified({required String? walletId}) =>
       (super.noSuchMethod(
         Invocation.method(
           #isMnemonicVerified,
           [],
           {#walletId: walletId},
         ),
-        returnValue: _i24.Future<bool>.value(false),
-      ) as _i24.Future<bool>);
+        returnValue: _i25.Future<bool>.value(false),
+      ) as _i25.Future<bool>);
   @override
-  _i24.Future<void> setMnemonicVerified({required String? walletId}) =>
+  _i25.Future<void> setMnemonicVerified({required String? walletId}) =>
       (super.noSuchMethod(
         Invocation.method(
           #setMnemonicVerified,
           [],
           {#walletId: walletId},
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i25.Future<void>.value(),
+        returnValueForMissingStub: _i25.Future<void>.value(),
+      ) as _i25.Future<void>);
   @override
-  _i24.Future<int> deleteWallet(
+  _i25.Future<int> deleteWallet(
     String? name,
     bool? shouldNotifyListeners,
   ) =>
@@ -654,20 +667,20 @@ class MockWalletsService extends _i1.Mock implements _i2.WalletsService {
             shouldNotifyListeners,
           ],
         ),
-        returnValue: _i24.Future<int>.value(0),
-      ) as _i24.Future<int>);
+        returnValue: _i25.Future<int>.value(0),
+      ) as _i25.Future<int>);
   @override
-  _i24.Future<void> refreshWallets(bool? shouldNotifyListeners) =>
+  _i25.Future<void> refreshWallets(bool? shouldNotifyListeners) =>
       (super.noSuchMethod(
         Invocation.method(
           #refreshWallets,
           [shouldNotifyListeners],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i25.Future<void>.value(),
+        returnValueForMissingStub: _i25.Future<void>.value(),
+      ) as _i25.Future<void>);
   @override
-  void addListener(_i26.VoidCallback? listener) => super.noSuchMethod(
+  void addListener(_i27.VoidCallback? listener) => super.noSuchMethod(
         Invocation.method(
           #addListener,
           [listener],
@@ -675,7 +688,7 @@ class MockWalletsService extends _i1.Mock implements _i2.WalletsService {
         returnValueForMissingStub: null,
       );
   @override
-  void removeListener(_i26.VoidCallback? listener) => super.noSuchMethod(
+  void removeListener(_i27.VoidCallback? listener) => super.noSuchMethod(
         Invocation.method(
           #removeListener,
           [listener],
@@ -703,7 +716,7 @@ class MockWalletsService extends _i1.Mock implements _i2.WalletsService {
 /// A class which mocks [ThemeService].
 ///
 /// See the documentation for Mockito's code generation for more information.
-class MockThemeService extends _i1.Mock implements _i27.ThemeService {
+class MockThemeService extends _i1.Mock implements _i28.ThemeService {
   MockThemeService() {
     _i1.throwOnMissingStub(this);
   }
@@ -733,10 +746,10 @@ class MockThemeService extends _i1.Mock implements _i27.ThemeService {
         ),
       ) as _i8.MainDB);
   @override
-  List<_i28.StackTheme> get installedThemes => (super.noSuchMethod(
+  List<_i29.StackTheme> get installedThemes => (super.noSuchMethod(
         Invocation.getter(#installedThemes),
-        returnValue: <_i28.StackTheme>[],
-      ) as List<_i28.StackTheme>);
+        returnValue: <_i29.StackTheme>[],
+      ) as List<_i29.StackTheme>);
   @override
   void init(_i8.MainDB? db) => super.noSuchMethod(
         Invocation.method(
@@ -746,85 +759,85 @@ class MockThemeService extends _i1.Mock implements _i27.ThemeService {
         returnValueForMissingStub: null,
       );
   @override
-  _i24.Future<void> install({required _i29.Uint8List? themeArchiveData}) =>
+  _i25.Future<void> install({required _i30.Uint8List? themeArchiveData}) =>
       (super.noSuchMethod(
         Invocation.method(
           #install,
           [],
           {#themeArchiveData: themeArchiveData},
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i25.Future<void>.value(),
+        returnValueForMissingStub: _i25.Future<void>.value(),
+      ) as _i25.Future<void>);
   @override
-  _i24.Future<void> remove({required String? themeId}) => (super.noSuchMethod(
+  _i25.Future<void> remove({required String? themeId}) => (super.noSuchMethod(
         Invocation.method(
           #remove,
           [],
           {#themeId: themeId},
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i25.Future<void>.value(),
+        returnValueForMissingStub: _i25.Future<void>.value(),
+      ) as _i25.Future<void>);
   @override
-  _i24.Future<void> checkDefaultThemesOnStartup() => (super.noSuchMethod(
+  _i25.Future<void> checkDefaultThemesOnStartup() => (super.noSuchMethod(
         Invocation.method(
           #checkDefaultThemesOnStartup,
           [],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i25.Future<void>.value(),
+        returnValueForMissingStub: _i25.Future<void>.value(),
+      ) as _i25.Future<void>);
   @override
-  _i24.Future<bool> verifyInstalled({required String? themeId}) =>
+  _i25.Future<bool> verifyInstalled({required String? themeId}) =>
       (super.noSuchMethod(
         Invocation.method(
           #verifyInstalled,
           [],
           {#themeId: themeId},
         ),
-        returnValue: _i24.Future<bool>.value(false),
-      ) as _i24.Future<bool>);
+        returnValue: _i25.Future<bool>.value(false),
+      ) as _i25.Future<bool>);
   @override
-  _i24.Future<List<_i27.StackThemeMetaData>> fetchThemes() =>
+  _i25.Future<List<_i28.StackThemeMetaData>> fetchThemes() =>
       (super.noSuchMethod(
         Invocation.method(
           #fetchThemes,
           [],
         ),
-        returnValue: _i24.Future<List<_i27.StackThemeMetaData>>.value(
-            <_i27.StackThemeMetaData>[]),
-      ) as _i24.Future<List<_i27.StackThemeMetaData>>);
+        returnValue: _i25.Future<List<_i28.StackThemeMetaData>>.value(
+            <_i28.StackThemeMetaData>[]),
+      ) as _i25.Future<List<_i28.StackThemeMetaData>>);
   @override
-  _i24.Future<_i29.Uint8List> fetchTheme(
-          {required _i27.StackThemeMetaData? themeMetaData}) =>
+  _i25.Future<_i30.Uint8List> fetchTheme(
+          {required _i28.StackThemeMetaData? themeMetaData}) =>
       (super.noSuchMethod(
         Invocation.method(
           #fetchTheme,
           [],
           {#themeMetaData: themeMetaData},
         ),
-        returnValue: _i24.Future<_i29.Uint8List>.value(_i29.Uint8List(0)),
-      ) as _i24.Future<_i29.Uint8List>);
+        returnValue: _i25.Future<_i30.Uint8List>.value(_i30.Uint8List(0)),
+      ) as _i25.Future<_i30.Uint8List>);
   @override
-  _i28.StackTheme? getTheme({required String? themeId}) =>
+  _i29.StackTheme? getTheme({required String? themeId}) =>
       (super.noSuchMethod(Invocation.method(
         #getTheme,
         [],
         {#themeId: themeId},
-      )) as _i28.StackTheme?);
+      )) as _i29.StackTheme?);
 }
 
 /// A class which mocks [BitcoinWallet].
 ///
 /// See the documentation for Mockito's code generation for more information.
-class MockBitcoinWallet extends _i1.Mock implements _i30.BitcoinWallet {
+class MockBitcoinWallet extends _i1.Mock implements _i31.BitcoinWallet {
   MockBitcoinWallet() {
     _i1.throwOnMissingStub(this);
   }
 
   @override
-  set timer(_i24.Timer? _timer) => super.noSuchMethod(
+  set timer(_i25.Timer? _timer) => super.noSuchMethod(
         Invocation.setter(
           #timer,
           _timer,
@@ -901,74 +914,74 @@ class MockBitcoinWallet extends _i1.Mock implements _i30.BitcoinWallet {
         returnValue: false,
       ) as bool);
   @override
-  _i23.Coin get coin => (super.noSuchMethod(
+  _i24.Coin get coin => (super.noSuchMethod(
         Invocation.getter(#coin),
-        returnValue: _i23.Coin.bitcoin,
-      ) as _i23.Coin);
+        returnValue: _i24.Coin.bitcoin,
+      ) as _i24.Coin);
   @override
-  _i24.Future<List<_i18.UTXO>> get utxos => (super.noSuchMethod(
+  _i25.Future<List<_i19.UTXO>> get utxos => (super.noSuchMethod(
         Invocation.getter(#utxos),
-        returnValue: _i24.Future<List<_i18.UTXO>>.value(<_i18.UTXO>[]),
-      ) as _i24.Future<List<_i18.UTXO>>);
+        returnValue: _i25.Future<List<_i19.UTXO>>.value(<_i19.UTXO>[]),
+      ) as _i25.Future<List<_i19.UTXO>>);
   @override
-  _i24.Future<List<_i18.Transaction>> get transactions => (super.noSuchMethod(
+  _i25.Future<List<_i19.Transaction>> get transactions => (super.noSuchMethod(
         Invocation.getter(#transactions),
         returnValue:
-            _i24.Future<List<_i18.Transaction>>.value(<_i18.Transaction>[]),
-      ) as _i24.Future<List<_i18.Transaction>>);
+            _i25.Future<List<_i19.Transaction>>.value(<_i19.Transaction>[]),
+      ) as _i25.Future<List<_i19.Transaction>>);
   @override
-  _i24.Future<String> get currentReceivingAddress => (super.noSuchMethod(
+  _i25.Future<String> get currentReceivingAddress => (super.noSuchMethod(
         Invocation.getter(#currentReceivingAddress),
-        returnValue: _i24.Future<String>.value(''),
-      ) as _i24.Future<String>);
+        returnValue: _i25.Future<String>.value(''),
+      ) as _i25.Future<String>);
   @override
-  _i24.Future<String> get currentChangeAddress => (super.noSuchMethod(
+  _i25.Future<String> get currentChangeAddress => (super.noSuchMethod(
         Invocation.getter(#currentChangeAddress),
-        returnValue: _i24.Future<String>.value(''),
-      ) as _i24.Future<String>);
+        returnValue: _i25.Future<String>.value(''),
+      ) as _i25.Future<String>);
   @override
-  _i24.Future<String> get currentChangeAddressP2PKH => (super.noSuchMethod(
+  _i25.Future<String> get currentChangeAddressP2PKH => (super.noSuchMethod(
         Invocation.getter(#currentChangeAddressP2PKH),
-        returnValue: _i24.Future<String>.value(''),
-      ) as _i24.Future<String>);
+        returnValue: _i25.Future<String>.value(''),
+      ) as _i25.Future<String>);
   @override
   bool get hasCalledExit => (super.noSuchMethod(
         Invocation.getter(#hasCalledExit),
         returnValue: false,
       ) as bool);
   @override
-  _i24.Future<_i10.FeeObject> get fees => (super.noSuchMethod(
+  _i25.Future<_i10.FeeObject> get fees => (super.noSuchMethod(
         Invocation.getter(#fees),
-        returnValue: _i24.Future<_i10.FeeObject>.value(_FakeFeeObject_7(
+        returnValue: _i25.Future<_i10.FeeObject>.value(_FakeFeeObject_7(
           this,
           Invocation.getter(#fees),
         )),
-      ) as _i24.Future<_i10.FeeObject>);
+      ) as _i25.Future<_i10.FeeObject>);
   @override
-  _i24.Future<int> get maxFee => (super.noSuchMethod(
+  _i25.Future<int> get maxFee => (super.noSuchMethod(
         Invocation.getter(#maxFee),
-        returnValue: _i24.Future<int>.value(0),
-      ) as _i24.Future<int>);
+        returnValue: _i25.Future<int>.value(0),
+      ) as _i25.Future<int>);
   @override
-  _i24.Future<List<String>> get mnemonic => (super.noSuchMethod(
+  _i25.Future<List<String>> get mnemonic => (super.noSuchMethod(
         Invocation.getter(#mnemonic),
-        returnValue: _i24.Future<List<String>>.value(<String>[]),
-      ) as _i24.Future<List<String>>);
+        returnValue: _i25.Future<List<String>>.value(<String>[]),
+      ) as _i25.Future<List<String>>);
   @override
-  _i24.Future<String?> get mnemonicString => (super.noSuchMethod(
+  _i25.Future<String?> get mnemonicString => (super.noSuchMethod(
         Invocation.getter(#mnemonicString),
-        returnValue: _i24.Future<String?>.value(),
-      ) as _i24.Future<String?>);
+        returnValue: _i25.Future<String?>.value(),
+      ) as _i25.Future<String?>);
   @override
-  _i24.Future<String?> get mnemonicPassphrase => (super.noSuchMethod(
+  _i25.Future<String?> get mnemonicPassphrase => (super.noSuchMethod(
         Invocation.getter(#mnemonicPassphrase),
-        returnValue: _i24.Future<String?>.value(),
-      ) as _i24.Future<String?>);
+        returnValue: _i25.Future<String?>.value(),
+      ) as _i25.Future<String?>);
   @override
-  _i24.Future<int> get chainHeight => (super.noSuchMethod(
+  _i25.Future<int> get chainHeight => (super.noSuchMethod(
         Invocation.getter(#chainHeight),
-        returnValue: _i24.Future<int>.value(0),
-      ) as _i24.Future<int>);
+        returnValue: _i25.Future<int>.value(0),
+      ) as _i25.Future<int>);
   @override
   int get storedChainHeight => (super.noSuchMethod(
         Invocation.getter(#storedChainHeight),
@@ -1040,10 +1053,10 @@ class MockBitcoinWallet extends _i1.Mock implements _i30.BitcoinWallet {
         ),
       ) as _i13.Balance);
   @override
-  _i24.Future<String> get xpub => (super.noSuchMethod(
+  _i25.Future<String> get xpub => (super.noSuchMethod(
         Invocation.getter(#xpub),
-        returnValue: _i24.Future<String>.value(''),
-      ) as _i24.Future<String>);
+        returnValue: _i25.Future<String>.value(''),
+      ) as _i25.Future<String>);
   @override
   set onIsActiveWalletChanged(void Function(bool)? _onIsActiveWalletChanged) =>
       super.noSuchMethod(
@@ -1070,26 +1083,26 @@ class MockBitcoinWallet extends _i1.Mock implements _i30.BitcoinWallet {
         ),
       ) as _i14.NetworkType);
   @override
-  _i24.Future<void> exit() => (super.noSuchMethod(
+  _i25.Future<void> exit() => (super.noSuchMethod(
         Invocation.method(
           #exit,
           [],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i25.Future<void>.value(),
+        returnValueForMissingStub: _i25.Future<void>.value(),
+      ) as _i25.Future<void>);
   @override
-  _i31.DerivePathType addressType({required String? address}) =>
+  _i32.DerivePathType addressType({required String? address}) =>
       (super.noSuchMethod(
         Invocation.method(
           #addressType,
           [],
           {#address: address},
         ),
-        returnValue: _i31.DerivePathType.bip44,
-      ) as _i31.DerivePathType);
+        returnValue: _i32.DerivePathType.bip44,
+      ) as _i32.DerivePathType);
   @override
-  _i24.Future<void> recoverFromMnemonic({
+  _i25.Future<void> recoverFromMnemonic({
     required String? mnemonic,
     String? mnemonicPassphrase,
     required int? maxUnusedAddressGap,
@@ -1108,47 +1121,47 @@ class MockBitcoinWallet extends _i1.Mock implements _i30.BitcoinWallet {
             #height: height,
           },
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i25.Future<void>.value(),
+        returnValueForMissingStub: _i25.Future<void>.value(),
+      ) as _i25.Future<void>);
   @override
-  _i24.Future<void> getTransactionCacheEarly(List<String>? allAddresses) =>
+  _i25.Future<void> getTransactionCacheEarly(List<String>? allAddresses) =>
       (super.noSuchMethod(
         Invocation.method(
           #getTransactionCacheEarly,
           [allAddresses],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i25.Future<void>.value(),
+        returnValueForMissingStub: _i25.Future<void>.value(),
+      ) as _i25.Future<void>);
   @override
-  _i24.Future<bool> refreshIfThereIsNewData() => (super.noSuchMethod(
+  _i25.Future<bool> refreshIfThereIsNewData() => (super.noSuchMethod(
         Invocation.method(
           #refreshIfThereIsNewData,
           [],
         ),
-        returnValue: _i24.Future<bool>.value(false),
-      ) as _i24.Future<bool>);
+        returnValue: _i25.Future<bool>.value(false),
+      ) as _i25.Future<bool>);
   @override
-  _i24.Future<void> getAllTxsToWatch() => (super.noSuchMethod(
+  _i25.Future<void> getAllTxsToWatch() => (super.noSuchMethod(
         Invocation.method(
           #getAllTxsToWatch,
           [],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i25.Future<void>.value(),
+        returnValueForMissingStub: _i25.Future<void>.value(),
+      ) as _i25.Future<void>);
   @override
-  _i24.Future<void> refresh() => (super.noSuchMethod(
+  _i25.Future<void> refresh() => (super.noSuchMethod(
         Invocation.method(
           #refresh,
           [],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i25.Future<void>.value(),
+        returnValueForMissingStub: _i25.Future<void>.value(),
+      ) as _i25.Future<void>);
   @override
-  _i24.Future<Map<String, dynamic>> prepareSend({
+  _i25.Future<Map<String, dynamic>> prepareSend({
     required String? address,
     required _i15.Amount? amount,
     Map<String, dynamic>? args,
@@ -1164,26 +1177,26 @@ class MockBitcoinWallet extends _i1.Mock implements _i30.BitcoinWallet {
           },
         ),
         returnValue:
-            _i24.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
-      ) as _i24.Future<Map<String, dynamic>>);
+            _i25.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
+      ) as _i25.Future<Map<String, dynamic>>);
   @override
-  _i24.Future<String> confirmSend({required Map<String, dynamic>? txData}) =>
+  _i25.Future<String> confirmSend({required Map<String, dynamic>? txData}) =>
       (super.noSuchMethod(
         Invocation.method(
           #confirmSend,
           [],
           {#txData: txData},
         ),
-        returnValue: _i24.Future<String>.value(''),
-      ) as _i24.Future<String>);
+        returnValue: _i25.Future<String>.value(''),
+      ) as _i25.Future<String>);
   @override
-  _i24.Future<bool> testNetworkConnection() => (super.noSuchMethod(
+  _i25.Future<bool> testNetworkConnection() => (super.noSuchMethod(
         Invocation.method(
           #testNetworkConnection,
           [],
         ),
-        returnValue: _i24.Future<bool>.value(false),
-      ) as _i24.Future<bool>);
+        returnValue: _i25.Future<bool>.value(false),
+      ) as _i25.Future<bool>);
   @override
   void startNetworkAlivePinging() => super.noSuchMethod(
         Invocation.method(
@@ -1201,35 +1214,35 @@ class MockBitcoinWallet extends _i1.Mock implements _i30.BitcoinWallet {
         returnValueForMissingStub: null,
       );
   @override
-  _i24.Future<void> initializeNew(
+  _i25.Future<void> initializeNew(
           ({String mnemonicPassphrase, int wordCount})? data) =>
       (super.noSuchMethod(
         Invocation.method(
           #initializeNew,
           [data],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i25.Future<void>.value(),
+        returnValueForMissingStub: _i25.Future<void>.value(),
+      ) as _i25.Future<void>);
   @override
-  _i24.Future<void> initializeExisting() => (super.noSuchMethod(
+  _i25.Future<void> initializeExisting() => (super.noSuchMethod(
         Invocation.method(
           #initializeExisting,
           [],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i25.Future<void>.value(),
+        returnValueForMissingStub: _i25.Future<void>.value(),
+      ) as _i25.Future<void>);
   @override
-  _i24.Future<void> updateSentCachedTxData(Map<String, dynamic>? txData) =>
+  _i25.Future<void> updateSentCachedTxData(Map<String, dynamic>? txData) =>
       (super.noSuchMethod(
         Invocation.method(
           #updateSentCachedTxData,
           [txData],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i25.Future<void>.value(),
+        returnValueForMissingStub: _i25.Future<void>.value(),
+      ) as _i25.Future<void>);
   @override
   bool validateAddress(String? address) => (super.noSuchMethod(
         Invocation.method(
@@ -1239,70 +1252,70 @@ class MockBitcoinWallet extends _i1.Mock implements _i30.BitcoinWallet {
         returnValue: false,
       ) as bool);
   @override
-  _i24.Future<void> updateNode(bool? shouldRefresh) => (super.noSuchMethod(
+  _i25.Future<void> updateNode(bool? shouldRefresh) => (super.noSuchMethod(
         Invocation.method(
           #updateNode,
           [shouldRefresh],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i25.Future<void>.value(),
+        returnValueForMissingStub: _i25.Future<void>.value(),
+      ) as _i25.Future<void>);
   @override
-  _i24.Future<_i11.ElectrumXNode> getCurrentNode() => (super.noSuchMethod(
+  _i25.Future<_i11.ElectrumXNode> getCurrentNode() => (super.noSuchMethod(
         Invocation.method(
           #getCurrentNode,
           [],
         ),
         returnValue:
-            _i24.Future<_i11.ElectrumXNode>.value(_FakeElectrumXNode_12(
+            _i25.Future<_i11.ElectrumXNode>.value(_FakeElectrumXNode_12(
           this,
           Invocation.method(
             #getCurrentNode,
             [],
           ),
         )),
-      ) as _i24.Future<_i11.ElectrumXNode>);
+      ) as _i25.Future<_i11.ElectrumXNode>);
   @override
-  _i24.Future<List<Map<String, dynamic>>> fastFetch(
+  _i25.Future<List<Map<String, dynamic>>> fastFetch(
           List<String>? allTxHashes) =>
       (super.noSuchMethod(
         Invocation.method(
           #fastFetch,
           [allTxHashes],
         ),
-        returnValue: _i24.Future<List<Map<String, dynamic>>>.value(
+        returnValue: _i25.Future<List<Map<String, dynamic>>>.value(
             <Map<String, dynamic>>[]),
-      ) as _i24.Future<List<Map<String, dynamic>>>);
+      ) as _i25.Future<List<Map<String, dynamic>>>);
   @override
-  _i24.Future<int> getTxCount({required String? address}) =>
+  _i25.Future<int> getTxCount({required String? address}) =>
       (super.noSuchMethod(
         Invocation.method(
           #getTxCount,
           [],
           {#address: address},
         ),
-        returnValue: _i24.Future<int>.value(0),
-      ) as _i24.Future<int>);
+        returnValue: _i25.Future<int>.value(0),
+      ) as _i25.Future<int>);
   @override
-  _i24.Future<void> checkCurrentReceivingAddressesForTransactions() =>
+  _i25.Future<void> checkCurrentReceivingAddressesForTransactions() =>
       (super.noSuchMethod(
         Invocation.method(
           #checkCurrentReceivingAddressesForTransactions,
           [],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i25.Future<void>.value(),
+        returnValueForMissingStub: _i25.Future<void>.value(),
+      ) as _i25.Future<void>);
   @override
-  _i24.Future<void> checkCurrentChangeAddressesForTransactions() =>
+  _i25.Future<void> checkCurrentChangeAddressesForTransactions() =>
       (super.noSuchMethod(
         Invocation.method(
           #checkCurrentChangeAddressesForTransactions,
           [],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i25.Future<void>.value(),
+        returnValueForMissingStub: _i25.Future<void>.value(),
+      ) as _i25.Future<void>);
   @override
   int estimateTxFee({
     required int? vSize,
@@ -1328,7 +1341,7 @@ class MockBitcoinWallet extends _i1.Mock implements _i30.BitcoinWallet {
     required bool? isSendAll,
     int? satsPerVByte,
     int? additionalOutputs = 0,
-    List<_i18.UTXO>? utxos,
+    List<_i19.UTXO>? utxos,
   }) =>
       super.noSuchMethod(Invocation.method(
         #coinSelection,
@@ -1345,19 +1358,19 @@ class MockBitcoinWallet extends _i1.Mock implements _i30.BitcoinWallet {
         },
       ));
   @override
-  _i24.Future<List<_i32.SigningData>> fetchBuildTxData(
-          List<_i18.UTXO>? utxosToUse) =>
+  _i25.Future<List<_i33.SigningData>> fetchBuildTxData(
+          List<_i19.UTXO>? utxosToUse) =>
       (super.noSuchMethod(
         Invocation.method(
           #fetchBuildTxData,
           [utxosToUse],
         ),
         returnValue:
-            _i24.Future<List<_i32.SigningData>>.value(<_i32.SigningData>[]),
-      ) as _i24.Future<List<_i32.SigningData>>);
+            _i25.Future<List<_i33.SigningData>>.value(<_i33.SigningData>[]),
+      ) as _i25.Future<List<_i33.SigningData>>);
   @override
-  _i24.Future<Map<String, dynamic>> buildTransaction({
-    required List<_i32.SigningData>? utxoSigningData,
+  _i25.Future<Map<String, dynamic>> buildTransaction({
+    required List<_i33.SigningData>? utxoSigningData,
     required List<String>? recipients,
     required List<int>? satoshiAmounts,
   }) =>
@@ -1372,10 +1385,10 @@ class MockBitcoinWallet extends _i1.Mock implements _i30.BitcoinWallet {
           },
         ),
         returnValue:
-            _i24.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
-      ) as _i24.Future<Map<String, dynamic>>);
+            _i25.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
+      ) as _i25.Future<Map<String, dynamic>>);
   @override
-  _i24.Future<void> fullRescan(
+  _i25.Future<void> fullRescan(
     int? maxUnusedAddressGap,
     int? maxNumberOfIndexesToCheck,
   ) =>
@@ -1387,11 +1400,11 @@ class MockBitcoinWallet extends _i1.Mock implements _i30.BitcoinWallet {
             maxNumberOfIndexesToCheck,
           ],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i25.Future<void>.value(),
+        returnValueForMissingStub: _i25.Future<void>.value(),
+      ) as _i25.Future<void>);
   @override
-  _i24.Future<_i15.Amount> estimateFeeFor(
+  _i25.Future<_i15.Amount> estimateFeeFor(
     _i15.Amount? amount,
     int? feeRate,
   ) =>
@@ -1403,7 +1416,7 @@ class MockBitcoinWallet extends _i1.Mock implements _i30.BitcoinWallet {
             feeRate,
           ],
         ),
-        returnValue: _i24.Future<_i15.Amount>.value(_FakeAmount_13(
+        returnValue: _i25.Future<_i15.Amount>.value(_FakeAmount_13(
           this,
           Invocation.method(
             #estimateFeeFor,
@@ -1413,7 +1426,7 @@ class MockBitcoinWallet extends _i1.Mock implements _i30.BitcoinWallet {
             ],
           ),
         )),
-      ) as _i24.Future<_i15.Amount>);
+      ) as _i25.Future<_i15.Amount>);
   @override
   _i15.Amount roughFeeEstimate(
     int? inputCount,
@@ -1442,32 +1455,32 @@ class MockBitcoinWallet extends _i1.Mock implements _i30.BitcoinWallet {
         ),
       ) as _i15.Amount);
   @override
-  _i24.Future<_i15.Amount> sweepAllEstimate(int? feeRate) =>
+  _i25.Future<_i15.Amount> sweepAllEstimate(int? feeRate) =>
       (super.noSuchMethod(
         Invocation.method(
           #sweepAllEstimate,
           [feeRate],
         ),
-        returnValue: _i24.Future<_i15.Amount>.value(_FakeAmount_13(
+        returnValue: _i25.Future<_i15.Amount>.value(_FakeAmount_13(
           this,
           Invocation.method(
             #sweepAllEstimate,
             [feeRate],
           ),
         )),
-      ) as _i24.Future<_i15.Amount>);
+      ) as _i25.Future<_i15.Amount>);
   @override
-  _i24.Future<bool> generateNewAddress() => (super.noSuchMethod(
+  _i25.Future<bool> generateNewAddress() => (super.noSuchMethod(
         Invocation.method(
           #generateNewAddress,
           [],
         ),
-        returnValue: _i24.Future<bool>.value(false),
-      ) as _i24.Future<bool>);
+        returnValue: _i25.Future<bool>.value(false),
+      ) as _i25.Future<bool>);
   @override
   void initCache(
     String? walletId,
-    _i23.Coin? coin,
+    _i24.Coin? coin,
   ) =>
       super.noSuchMethod(
         Invocation.method(
@@ -1480,14 +1493,14 @@ class MockBitcoinWallet extends _i1.Mock implements _i30.BitcoinWallet {
         returnValueForMissingStub: null,
       );
   @override
-  _i24.Future<void> updateCachedId(String? id) => (super.noSuchMethod(
+  _i25.Future<void> updateCachedId(String? id) => (super.noSuchMethod(
         Invocation.method(
           #updateCachedId,
           [id],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i25.Future<void>.value(),
+        returnValueForMissingStub: _i25.Future<void>.value(),
+      ) as _i25.Future<void>);
   @override
   int getCachedChainHeight() => (super.noSuchMethod(
         Invocation.method(
@@ -1497,14 +1510,14 @@ class MockBitcoinWallet extends _i1.Mock implements _i30.BitcoinWallet {
         returnValue: 0,
       ) as int);
   @override
-  _i24.Future<void> updateCachedChainHeight(int? height) => (super.noSuchMethod(
+  _i25.Future<void> updateCachedChainHeight(int? height) => (super.noSuchMethod(
         Invocation.method(
           #updateCachedChainHeight,
           [height],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i25.Future<void>.value(),
+        returnValueForMissingStub: _i25.Future<void>.value(),
+      ) as _i25.Future<void>);
   @override
   bool getCachedIsFavorite() => (super.noSuchMethod(
         Invocation.method(
@@ -1514,15 +1527,15 @@ class MockBitcoinWallet extends _i1.Mock implements _i30.BitcoinWallet {
         returnValue: false,
       ) as bool);
   @override
-  _i24.Future<void> updateCachedIsFavorite(bool? isFavorite) =>
+  _i25.Future<void> updateCachedIsFavorite(bool? isFavorite) =>
       (super.noSuchMethod(
         Invocation.method(
           #updateCachedIsFavorite,
           [isFavorite],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i25.Future<void>.value(),
+        returnValueForMissingStub: _i25.Future<void>.value(),
+      ) as _i25.Future<void>);
   @override
   _i13.Balance getCachedBalance() => (super.noSuchMethod(
         Invocation.method(
@@ -1538,15 +1551,15 @@ class MockBitcoinWallet extends _i1.Mock implements _i30.BitcoinWallet {
         ),
       ) as _i13.Balance);
   @override
-  _i24.Future<void> updateCachedBalance(_i13.Balance? balance) =>
+  _i25.Future<void> updateCachedBalance(_i13.Balance? balance) =>
       (super.noSuchMethod(
         Invocation.method(
           #updateCachedBalance,
           [balance],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i25.Future<void>.value(),
+        returnValueForMissingStub: _i25.Future<void>.value(),
+      ) as _i25.Future<void>);
   @override
   _i13.Balance getCachedBalanceSecondary() => (super.noSuchMethod(
         Invocation.method(
@@ -1562,15 +1575,15 @@ class MockBitcoinWallet extends _i1.Mock implements _i30.BitcoinWallet {
         ),
       ) as _i13.Balance);
   @override
-  _i24.Future<void> updateCachedBalanceSecondary(_i13.Balance? balance) =>
+  _i25.Future<void> updateCachedBalanceSecondary(_i13.Balance? balance) =>
       (super.noSuchMethod(
         Invocation.method(
           #updateCachedBalanceSecondary,
           [balance],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i25.Future<void>.value(),
+        returnValueForMissingStub: _i25.Future<void>.value(),
+      ) as _i25.Future<void>);
   @override
   List<String> getWalletTokenContractAddresses() => (super.noSuchMethod(
         Invocation.method(
@@ -1580,16 +1593,16 @@ class MockBitcoinWallet extends _i1.Mock implements _i30.BitcoinWallet {
         returnValue: <String>[],
       ) as List<String>);
   @override
-  _i24.Future<void> updateWalletTokenContractAddresses(
+  _i25.Future<void> updateWalletTokenContractAddresses(
           List<String>? contractAddresses) =>
       (super.noSuchMethod(
         Invocation.method(
           #updateWalletTokenContractAddresses,
           [contractAddresses],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i25.Future<void>.value(),
+        returnValueForMissingStub: _i25.Future<void>.value(),
+      ) as _i25.Future<void>);
   @override
   void initWalletDB({_i8.MainDB? mockableOverride}) => super.noSuchMethod(
         Invocation.method(
@@ -1600,11 +1613,45 @@ class MockBitcoinWallet extends _i1.Mock implements _i30.BitcoinWallet {
         returnValueForMissingStub: null,
       );
   @override
-  _i24.Future<_i16.Tuple2<_i18.Transaction, _i18.Address>> parseTransaction(
+  _i25.Future<_i16.TransactionV2> getTransaction(
+    String? txHash,
+    _i24.Coin? coin,
+    String? walletId,
+    _i12.CachedElectrumX? cachedElectrumX, [
+    String? debugTitle,
+  ]) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #getTransaction,
+          [
+            txHash,
+            coin,
+            walletId,
+            cachedElectrumX,
+            debugTitle,
+          ],
+        ),
+        returnValue:
+            _i25.Future<_i16.TransactionV2>.value(_FakeTransactionV2_14(
+          this,
+          Invocation.method(
+            #getTransaction,
+            [
+              txHash,
+              coin,
+              walletId,
+              cachedElectrumX,
+              debugTitle,
+            ],
+          ),
+        )),
+      ) as _i25.Future<_i16.TransactionV2>);
+  @override
+  _i25.Future<_i17.Tuple2<_i19.Transaction, _i19.Address>> parseTransaction(
     Map<String, dynamic>? txData,
     dynamic electrumxClient,
-    List<_i18.Address>? myAddresses,
-    _i23.Coin? coin,
+    List<_i19.Address>? myAddresses,
+    _i24.Coin? coin,
     int? minConfirms,
     String? walletId,
   ) =>
@@ -1621,8 +1668,8 @@ class MockBitcoinWallet extends _i1.Mock implements _i30.BitcoinWallet {
           ],
         ),
         returnValue:
-            _i24.Future<_i16.Tuple2<_i18.Transaction, _i18.Address>>.value(
-                _FakeTuple2_14<_i18.Transaction, _i18.Address>(
+            _i25.Future<_i17.Tuple2<_i19.Transaction, _i19.Address>>.value(
+                _FakeTuple2_15<_i19.Transaction, _i19.Address>(
           this,
           Invocation.method(
             #parseTransaction,
@@ -1636,37 +1683,37 @@ class MockBitcoinWallet extends _i1.Mock implements _i30.BitcoinWallet {
             ],
           ),
         )),
-      ) as _i24.Future<_i16.Tuple2<_i18.Transaction, _i18.Address>>);
+      ) as _i25.Future<_i17.Tuple2<_i19.Transaction, _i19.Address>>);
   @override
   void initPaynymWalletInterface({
     required String? walletId,
     required String? walletName,
     required _i14.NetworkType? network,
-    required _i23.Coin? coin,
+    required _i24.Coin? coin,
     required _i8.MainDB? db,
     required _i11.ElectrumX? electrumXClient,
-    required _i20.SecureStorageInterface? secureStorage,
+    required _i21.SecureStorageInterface? secureStorage,
     required int? dustLimit,
     required int? dustLimitP2PKH,
     required int? minConfirms,
-    required _i24.Future<String?> Function()? getMnemonicString,
-    required _i24.Future<String?> Function()? getMnemonicPassphrase,
-    required _i24.Future<int> Function()? getChainHeight,
-    required _i24.Future<String> Function()? getCurrentChangeAddress,
+    required _i25.Future<String?> Function()? getMnemonicString,
+    required _i25.Future<String?> Function()? getMnemonicPassphrase,
+    required _i25.Future<int> Function()? getChainHeight,
+    required _i25.Future<String> Function()? getCurrentChangeAddress,
     required int Function({
       required int feeRatePerKB,
       required int vSize,
     })? estimateTxFee,
-    required _i24.Future<Map<String, dynamic>> Function({
+    required _i25.Future<Map<String, dynamic>> Function({
       required String address,
       required _i15.Amount amount,
       Map<String, dynamic>? args,
     })? prepareSend,
-    required _i24.Future<int> Function({required String address})? getTxCount,
-    required _i24.Future<List<_i32.SigningData>> Function(List<_i18.UTXO>)?
+    required _i25.Future<int> Function({required String address})? getTxCount,
+    required _i25.Future<List<_i33.SigningData>> Function(List<_i19.UTXO>)?
         fetchBuildTxData,
-    required _i24.Future<void> Function()? refresh,
-    required _i24.Future<void> Function()? checkChangeAddressForTransactions,
+    required _i25.Future<void> Function()? refresh,
+    required _i25.Future<void> Function()? checkChangeAddressForTransactions,
   }) =>
       super.noSuchMethod(
         Invocation.method(
@@ -1699,21 +1746,21 @@ class MockBitcoinWallet extends _i1.Mock implements _i30.BitcoinWallet {
         returnValueForMissingStub: null,
       );
   @override
-  _i24.Future<_i17.BIP32> getBip47BaseNode() => (super.noSuchMethod(
+  _i25.Future<_i18.BIP32> getBip47BaseNode() => (super.noSuchMethod(
         Invocation.method(
           #getBip47BaseNode,
           [],
         ),
-        returnValue: _i24.Future<_i17.BIP32>.value(_FakeBIP32_15(
+        returnValue: _i25.Future<_i18.BIP32>.value(_FakeBIP32_16(
           this,
           Invocation.method(
             #getBip47BaseNode,
             [],
           ),
         )),
-      ) as _i24.Future<_i17.BIP32>);
+      ) as _i25.Future<_i18.BIP32>);
   @override
-  _i24.Future<_i29.Uint8List> getPrivateKeyForPaynymReceivingAddress({
+  _i25.Future<_i30.Uint8List> getPrivateKeyForPaynymReceivingAddress({
     required String? paymentCodeString,
     required int? index,
   }) =>
@@ -1726,11 +1773,11 @@ class MockBitcoinWallet extends _i1.Mock implements _i30.BitcoinWallet {
             #index: index,
           },
         ),
-        returnValue: _i24.Future<_i29.Uint8List>.value(_i29.Uint8List(0)),
-      ) as _i24.Future<_i29.Uint8List>);
+        returnValue: _i25.Future<_i30.Uint8List>.value(_i30.Uint8List(0)),
+      ) as _i25.Future<_i30.Uint8List>);
   @override
-  _i24.Future<_i18.Address> currentReceivingPaynymAddress({
-    required _i19.PaymentCode? sender,
+  _i25.Future<_i19.Address> currentReceivingPaynymAddress({
+    required _i20.PaymentCode? sender,
     required bool? isSegwit,
   }) =>
       (super.noSuchMethod(
@@ -1742,7 +1789,7 @@ class MockBitcoinWallet extends _i1.Mock implements _i30.BitcoinWallet {
             #isSegwit: isSegwit,
           },
         ),
-        returnValue: _i24.Future<_i18.Address>.value(_FakeAddress_16(
+        returnValue: _i25.Future<_i19.Address>.value(_FakeAddress_17(
           this,
           Invocation.method(
             #currentReceivingPaynymAddress,
@@ -1753,10 +1800,10 @@ class MockBitcoinWallet extends _i1.Mock implements _i30.BitcoinWallet {
             },
           ),
         )),
-      ) as _i24.Future<_i18.Address>);
+      ) as _i25.Future<_i19.Address>);
   @override
-  _i24.Future<void> checkCurrentPaynymReceivingAddressForTransactions({
-    required _i19.PaymentCode? sender,
+  _i25.Future<void> checkCurrentPaynymReceivingAddressForTransactions({
+    required _i20.PaymentCode? sender,
     required bool? isSegwit,
   }) =>
       (super.noSuchMethod(
@@ -1768,42 +1815,42 @@ class MockBitcoinWallet extends _i1.Mock implements _i30.BitcoinWallet {
             #isSegwit: isSegwit,
           },
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i25.Future<void>.value(),
+        returnValueForMissingStub: _i25.Future<void>.value(),
+      ) as _i25.Future<void>);
   @override
-  _i24.Future<void> checkAllCurrentReceivingPaynymAddressesForTransactions() =>
+  _i25.Future<void> checkAllCurrentReceivingPaynymAddressesForTransactions() =>
       (super.noSuchMethod(
         Invocation.method(
           #checkAllCurrentReceivingPaynymAddressesForTransactions,
           [],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i25.Future<void>.value(),
+        returnValueForMissingStub: _i25.Future<void>.value(),
+      ) as _i25.Future<void>);
   @override
-  _i24.Future<_i17.BIP32> deriveNotificationBip32Node() => (super.noSuchMethod(
+  _i25.Future<_i18.BIP32> deriveNotificationBip32Node() => (super.noSuchMethod(
         Invocation.method(
           #deriveNotificationBip32Node,
           [],
         ),
-        returnValue: _i24.Future<_i17.BIP32>.value(_FakeBIP32_15(
+        returnValue: _i25.Future<_i18.BIP32>.value(_FakeBIP32_16(
           this,
           Invocation.method(
             #deriveNotificationBip32Node,
             [],
           ),
         )),
-      ) as _i24.Future<_i17.BIP32>);
+      ) as _i25.Future<_i18.BIP32>);
   @override
-  _i24.Future<_i19.PaymentCode> getPaymentCode({required bool? isSegwit}) =>
+  _i25.Future<_i20.PaymentCode> getPaymentCode({required bool? isSegwit}) =>
       (super.noSuchMethod(
         Invocation.method(
           #getPaymentCode,
           [],
           {#isSegwit: isSegwit},
         ),
-        returnValue: _i24.Future<_i19.PaymentCode>.value(_FakePaymentCode_17(
+        returnValue: _i25.Future<_i20.PaymentCode>.value(_FakePaymentCode_18(
           this,
           Invocation.method(
             #getPaymentCode,
@@ -1811,28 +1858,28 @@ class MockBitcoinWallet extends _i1.Mock implements _i30.BitcoinWallet {
             {#isSegwit: isSegwit},
           ),
         )),
-      ) as _i24.Future<_i19.PaymentCode>);
+      ) as _i25.Future<_i20.PaymentCode>);
   @override
-  _i24.Future<_i29.Uint8List> signWithNotificationKey(_i29.Uint8List? data) =>
+  _i25.Future<_i30.Uint8List> signWithNotificationKey(_i30.Uint8List? data) =>
       (super.noSuchMethod(
         Invocation.method(
           #signWithNotificationKey,
           [data],
         ),
-        returnValue: _i24.Future<_i29.Uint8List>.value(_i29.Uint8List(0)),
-      ) as _i24.Future<_i29.Uint8List>);
+        returnValue: _i25.Future<_i30.Uint8List>.value(_i30.Uint8List(0)),
+      ) as _i25.Future<_i30.Uint8List>);
   @override
-  _i24.Future<String> signStringWithNotificationKey(String? data) =>
+  _i25.Future<String> signStringWithNotificationKey(String? data) =>
       (super.noSuchMethod(
         Invocation.method(
           #signStringWithNotificationKey,
           [data],
         ),
-        returnValue: _i24.Future<String>.value(''),
-      ) as _i24.Future<String>);
+        returnValue: _i25.Future<String>.value(''),
+      ) as _i25.Future<String>);
   @override
-  _i24.Future<Map<String, dynamic>> preparePaymentCodeSend({
-    required _i19.PaymentCode? paymentCode,
+  _i25.Future<Map<String, dynamic>> preparePaymentCodeSend({
+    required _i20.PaymentCode? paymentCode,
     required bool? isSegwit,
     required _i15.Amount? amount,
     Map<String, dynamic>? args,
@@ -1849,13 +1896,13 @@ class MockBitcoinWallet extends _i1.Mock implements _i30.BitcoinWallet {
           },
         ),
         returnValue:
-            _i24.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
-      ) as _i24.Future<Map<String, dynamic>>);
+            _i25.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
+      ) as _i25.Future<Map<String, dynamic>>);
   @override
-  _i24.Future<_i18.Address> nextUnusedSendAddressFrom({
-    required _i19.PaymentCode? pCode,
+  _i25.Future<_i19.Address> nextUnusedSendAddressFrom({
+    required _i20.PaymentCode? pCode,
     required bool? isSegwit,
-    required _i17.BIP32? privateKeyNode,
+    required _i18.BIP32? privateKeyNode,
     int? startIndex = 0,
   }) =>
       (super.noSuchMethod(
@@ -1869,7 +1916,7 @@ class MockBitcoinWallet extends _i1.Mock implements _i30.BitcoinWallet {
             #startIndex: startIndex,
           },
         ),
-        returnValue: _i24.Future<_i18.Address>.value(_FakeAddress_16(
+        returnValue: _i25.Future<_i19.Address>.value(_FakeAddress_17(
           this,
           Invocation.method(
             #nextUnusedSendAddressFrom,
@@ -1882,13 +1929,13 @@ class MockBitcoinWallet extends _i1.Mock implements _i30.BitcoinWallet {
             },
           ),
         )),
-      ) as _i24.Future<_i18.Address>);
+      ) as _i25.Future<_i19.Address>);
   @override
-  _i24.Future<Map<String, dynamic>> prepareNotificationTx({
+  _i25.Future<Map<String, dynamic>> prepareNotificationTx({
     required int? selectedTxFeeRate,
     required String? targetPaymentCodeString,
     int? additionalOutputs = 0,
-    List<_i18.UTXO>? utxos,
+    List<_i19.UTXO>? utxos,
   }) =>
       (super.noSuchMethod(
         Invocation.method(
@@ -1902,10 +1949,10 @@ class MockBitcoinWallet extends _i1.Mock implements _i30.BitcoinWallet {
           },
         ),
         returnValue:
-            _i24.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
-      ) as _i24.Future<Map<String, dynamic>>);
+            _i25.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
+      ) as _i25.Future<Map<String, dynamic>>);
   @override
-  _i24.Future<String> broadcastNotificationTx(
+  _i25.Future<String> broadcastNotificationTx(
           {required Map<String, dynamic>? preparedTx}) =>
       (super.noSuchMethod(
         Invocation.method(
@@ -1913,62 +1960,62 @@ class MockBitcoinWallet extends _i1.Mock implements _i30.BitcoinWallet {
           [],
           {#preparedTx: preparedTx},
         ),
-        returnValue: _i24.Future<String>.value(''),
-      ) as _i24.Future<String>);
+        returnValue: _i25.Future<String>.value(''),
+      ) as _i25.Future<String>);
   @override
-  _i24.Future<bool> hasConnected(String? paymentCodeString) =>
+  _i25.Future<bool> hasConnected(String? paymentCodeString) =>
       (super.noSuchMethod(
         Invocation.method(
           #hasConnected,
           [paymentCodeString],
         ),
-        returnValue: _i24.Future<bool>.value(false),
-      ) as _i24.Future<bool>);
+        returnValue: _i25.Future<bool>.value(false),
+      ) as _i25.Future<bool>);
   @override
-  _i24.Future<_i19.PaymentCode?> unBlindedPaymentCodeFromTransaction(
-          {required _i18.Transaction? transaction}) =>
+  _i25.Future<_i20.PaymentCode?> unBlindedPaymentCodeFromTransaction(
+          {required _i19.Transaction? transaction}) =>
       (super.noSuchMethod(
         Invocation.method(
           #unBlindedPaymentCodeFromTransaction,
           [],
           {#transaction: transaction},
         ),
-        returnValue: _i24.Future<_i19.PaymentCode?>.value(),
-      ) as _i24.Future<_i19.PaymentCode?>);
+        returnValue: _i25.Future<_i20.PaymentCode?>.value(),
+      ) as _i25.Future<_i20.PaymentCode?>);
   @override
-  _i24.Future<_i19.PaymentCode?> unBlindedPaymentCodeFromTransactionBad(
-          {required _i18.Transaction? transaction}) =>
+  _i25.Future<_i20.PaymentCode?> unBlindedPaymentCodeFromTransactionBad(
+          {required _i19.Transaction? transaction}) =>
       (super.noSuchMethod(
         Invocation.method(
           #unBlindedPaymentCodeFromTransactionBad,
           [],
           {#transaction: transaction},
         ),
-        returnValue: _i24.Future<_i19.PaymentCode?>.value(),
-      ) as _i24.Future<_i19.PaymentCode?>);
+        returnValue: _i25.Future<_i20.PaymentCode?>.value(),
+      ) as _i25.Future<_i20.PaymentCode?>);
   @override
-  _i24.Future<List<_i19.PaymentCode>>
+  _i25.Future<List<_i20.PaymentCode>>
       getAllPaymentCodesFromNotificationTransactions() => (super.noSuchMethod(
             Invocation.method(
               #getAllPaymentCodesFromNotificationTransactions,
               [],
             ),
             returnValue:
-                _i24.Future<List<_i19.PaymentCode>>.value(<_i19.PaymentCode>[]),
-          ) as _i24.Future<List<_i19.PaymentCode>>);
+                _i25.Future<List<_i20.PaymentCode>>.value(<_i20.PaymentCode>[]),
+          ) as _i25.Future<List<_i20.PaymentCode>>);
   @override
-  _i24.Future<void> checkForNotificationTransactionsTo(
+  _i25.Future<void> checkForNotificationTransactionsTo(
           Set<String>? otherCodeStrings) =>
       (super.noSuchMethod(
         Invocation.method(
           #checkForNotificationTransactionsTo,
           [otherCodeStrings],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i25.Future<void>.value(),
+        returnValueForMissingStub: _i25.Future<void>.value(),
+      ) as _i25.Future<void>);
   @override
-  _i24.Future<void> restoreAllHistory({
+  _i25.Future<void> restoreAllHistory({
     required int? maxUnusedAddressGap,
     required int? maxNumberOfIndexesToCheck,
     required Set<String>? paymentCodeStrings,
@@ -1983,12 +2030,12 @@ class MockBitcoinWallet extends _i1.Mock implements _i30.BitcoinWallet {
             #paymentCodeStrings: paymentCodeStrings,
           },
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i25.Future<void>.value(),
+        returnValueForMissingStub: _i25.Future<void>.value(),
+      ) as _i25.Future<void>);
   @override
-  _i24.Future<void> restoreHistoryWith({
-    required _i19.PaymentCode? other,
+  _i25.Future<void> restoreHistoryWith({
+    required _i20.PaymentCode? other,
     required bool? checkSegwitAsWell,
     required int? maxUnusedAddressGap,
     required int? maxNumberOfIndexesToCheck,
@@ -2004,58 +2051,58 @@ class MockBitcoinWallet extends _i1.Mock implements _i30.BitcoinWallet {
             #maxNumberOfIndexesToCheck: maxNumberOfIndexesToCheck,
           },
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i25.Future<void>.value(),
+        returnValueForMissingStub: _i25.Future<void>.value(),
+      ) as _i25.Future<void>);
   @override
-  _i24.Future<_i18.Address> getMyNotificationAddress() => (super.noSuchMethod(
+  _i25.Future<_i19.Address> getMyNotificationAddress() => (super.noSuchMethod(
         Invocation.method(
           #getMyNotificationAddress,
           [],
         ),
-        returnValue: _i24.Future<_i18.Address>.value(_FakeAddress_16(
+        returnValue: _i25.Future<_i19.Address>.value(_FakeAddress_17(
           this,
           Invocation.method(
             #getMyNotificationAddress,
             [],
           ),
         )),
-      ) as _i24.Future<_i18.Address>);
+      ) as _i25.Future<_i19.Address>);
   @override
-  _i24.Future<List<String>> lookupKey(String? paymentCodeString) =>
+  _i25.Future<List<String>> lookupKey(String? paymentCodeString) =>
       (super.noSuchMethod(
         Invocation.method(
           #lookupKey,
           [paymentCodeString],
         ),
-        returnValue: _i24.Future<List<String>>.value(<String>[]),
-      ) as _i24.Future<List<String>>);
+        returnValue: _i25.Future<List<String>>.value(<String>[]),
+      ) as _i25.Future<List<String>>);
   @override
-  _i24.Future<String?> paymentCodeStringByKey(String? key) =>
+  _i25.Future<String?> paymentCodeStringByKey(String? key) =>
       (super.noSuchMethod(
         Invocation.method(
           #paymentCodeStringByKey,
           [key],
         ),
-        returnValue: _i24.Future<String?>.value(),
-      ) as _i24.Future<String?>);
+        returnValue: _i25.Future<String?>.value(),
+      ) as _i25.Future<String?>);
   @override
-  _i24.Future<String> storeCode(String? paymentCodeString) =>
+  _i25.Future<String> storeCode(String? paymentCodeString) =>
       (super.noSuchMethod(
         Invocation.method(
           #storeCode,
           [paymentCodeString],
         ),
-        returnValue: _i24.Future<String>.value(''),
-      ) as _i24.Future<String>);
+        returnValue: _i25.Future<String>.value(''),
+      ) as _i25.Future<String>);
   @override
   void initCoinControlInterface({
     required String? walletId,
     required String? walletName,
-    required _i23.Coin? coin,
+    required _i24.Coin? coin,
     required _i8.MainDB? db,
-    required _i24.Future<int> Function()? getChainHeight,
-    required _i24.Future<void> Function(_i13.Balance)? refreshedBalanceCallback,
+    required _i25.Future<int> Function()? getChainHeight,
+    required _i25.Future<void> Function(_i13.Balance)? refreshedBalanceCallback,
   }) =>
       super.noSuchMethod(
         Invocation.method(
@@ -2073,16 +2120,16 @@ class MockBitcoinWallet extends _i1.Mock implements _i30.BitcoinWallet {
         returnValueForMissingStub: null,
       );
   @override
-  _i24.Future<void> refreshBalance({bool? notify = false}) =>
+  _i25.Future<void> refreshBalance({bool? notify = false}) =>
       (super.noSuchMethod(
         Invocation.method(
           #refreshBalance,
           [],
           {#notify: notify},
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i25.Future<void>.value(),
+        returnValueForMissingStub: _i25.Future<void>.value(),
+      ) as _i25.Future<void>);
 }
 
 /// A class which mocks [NodeService].
@@ -2090,41 +2137,41 @@ class MockBitcoinWallet extends _i1.Mock implements _i30.BitcoinWallet {
 /// See the documentation for Mockito's code generation for more information.
 class MockNodeService extends _i1.Mock implements _i3.NodeService {
   @override
-  _i20.SecureStorageInterface get secureStorageInterface => (super.noSuchMethod(
+  _i21.SecureStorageInterface get secureStorageInterface => (super.noSuchMethod(
         Invocation.getter(#secureStorageInterface),
-        returnValue: _FakeSecureStorageInterface_18(
+        returnValue: _FakeSecureStorageInterface_19(
           this,
           Invocation.getter(#secureStorageInterface),
         ),
-      ) as _i20.SecureStorageInterface);
+      ) as _i21.SecureStorageInterface);
   @override
-  List<_i33.NodeModel> get primaryNodes => (super.noSuchMethod(
+  List<_i34.NodeModel> get primaryNodes => (super.noSuchMethod(
         Invocation.getter(#primaryNodes),
-        returnValue: <_i33.NodeModel>[],
-      ) as List<_i33.NodeModel>);
+        returnValue: <_i34.NodeModel>[],
+      ) as List<_i34.NodeModel>);
   @override
-  List<_i33.NodeModel> get nodes => (super.noSuchMethod(
+  List<_i34.NodeModel> get nodes => (super.noSuchMethod(
         Invocation.getter(#nodes),
-        returnValue: <_i33.NodeModel>[],
-      ) as List<_i33.NodeModel>);
+        returnValue: <_i34.NodeModel>[],
+      ) as List<_i34.NodeModel>);
   @override
   bool get hasListeners => (super.noSuchMethod(
         Invocation.getter(#hasListeners),
         returnValue: false,
       ) as bool);
   @override
-  _i24.Future<void> updateDefaults() => (super.noSuchMethod(
+  _i25.Future<void> updateDefaults() => (super.noSuchMethod(
         Invocation.method(
           #updateDefaults,
           [],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i25.Future<void>.value(),
+        returnValueForMissingStub: _i25.Future<void>.value(),
+      ) as _i25.Future<void>);
   @override
-  _i24.Future<void> setPrimaryNodeFor({
-    required _i23.Coin? coin,
-    required _i33.NodeModel? node,
+  _i25.Future<void> setPrimaryNodeFor({
+    required _i24.Coin? coin,
+    required _i34.NodeModel? node,
     bool? shouldNotifyListeners = false,
   }) =>
       (super.noSuchMethod(
@@ -2137,44 +2184,44 @@ class MockNodeService extends _i1.Mock implements _i3.NodeService {
             #shouldNotifyListeners: shouldNotifyListeners,
           },
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i25.Future<void>.value(),
+        returnValueForMissingStub: _i25.Future<void>.value(),
+      ) as _i25.Future<void>);
   @override
-  _i33.NodeModel? getPrimaryNodeFor({required _i23.Coin? coin}) =>
+  _i34.NodeModel? getPrimaryNodeFor({required _i24.Coin? coin}) =>
       (super.noSuchMethod(Invocation.method(
         #getPrimaryNodeFor,
         [],
         {#coin: coin},
-      )) as _i33.NodeModel?);
+      )) as _i34.NodeModel?);
   @override
-  List<_i33.NodeModel> getNodesFor(_i23.Coin? coin) => (super.noSuchMethod(
+  List<_i34.NodeModel> getNodesFor(_i24.Coin? coin) => (super.noSuchMethod(
         Invocation.method(
           #getNodesFor,
           [coin],
         ),
-        returnValue: <_i33.NodeModel>[],
-      ) as List<_i33.NodeModel>);
+        returnValue: <_i34.NodeModel>[],
+      ) as List<_i34.NodeModel>);
   @override
-  _i33.NodeModel? getNodeById({required String? id}) =>
+  _i34.NodeModel? getNodeById({required String? id}) =>
       (super.noSuchMethod(Invocation.method(
         #getNodeById,
         [],
         {#id: id},
-      )) as _i33.NodeModel?);
+      )) as _i34.NodeModel?);
   @override
-  List<_i33.NodeModel> failoverNodesFor({required _i23.Coin? coin}) =>
+  List<_i34.NodeModel> failoverNodesFor({required _i24.Coin? coin}) =>
       (super.noSuchMethod(
         Invocation.method(
           #failoverNodesFor,
           [],
           {#coin: coin},
         ),
-        returnValue: <_i33.NodeModel>[],
-      ) as List<_i33.NodeModel>);
+        returnValue: <_i34.NodeModel>[],
+      ) as List<_i34.NodeModel>);
   @override
-  _i24.Future<void> add(
-    _i33.NodeModel? node,
+  _i25.Future<void> add(
+    _i34.NodeModel? node,
     String? password,
     bool? shouldNotifyListeners,
   ) =>
@@ -2187,11 +2234,11 @@ class MockNodeService extends _i1.Mock implements _i3.NodeService {
             shouldNotifyListeners,
           ],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i25.Future<void>.value(),
+        returnValueForMissingStub: _i25.Future<void>.value(),
+      ) as _i25.Future<void>);
   @override
-  _i24.Future<void> delete(
+  _i25.Future<void> delete(
     String? id,
     bool? shouldNotifyListeners,
   ) =>
@@ -2203,11 +2250,11 @@ class MockNodeService extends _i1.Mock implements _i3.NodeService {
             shouldNotifyListeners,
           ],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i25.Future<void>.value(),
+        returnValueForMissingStub: _i25.Future<void>.value(),
+      ) as _i25.Future<void>);
   @override
-  _i24.Future<void> setEnabledState(
+  _i25.Future<void> setEnabledState(
     String? id,
     bool? enabled,
     bool? shouldNotifyListeners,
@@ -2221,12 +2268,12 @@ class MockNodeService extends _i1.Mock implements _i3.NodeService {
             shouldNotifyListeners,
           ],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i25.Future<void>.value(),
+        returnValueForMissingStub: _i25.Future<void>.value(),
+      ) as _i25.Future<void>);
   @override
-  _i24.Future<void> edit(
-    _i33.NodeModel? editedNode,
+  _i25.Future<void> edit(
+    _i34.NodeModel? editedNode,
     String? password,
     bool? shouldNotifyListeners,
   ) =>
@@ -2239,20 +2286,20 @@ class MockNodeService extends _i1.Mock implements _i3.NodeService {
             shouldNotifyListeners,
           ],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i25.Future<void>.value(),
+        returnValueForMissingStub: _i25.Future<void>.value(),
+      ) as _i25.Future<void>);
   @override
-  _i24.Future<void> updateCommunityNodes() => (super.noSuchMethod(
+  _i25.Future<void> updateCommunityNodes() => (super.noSuchMethod(
         Invocation.method(
           #updateCommunityNodes,
           [],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i25.Future<void>.value(),
+        returnValueForMissingStub: _i25.Future<void>.value(),
+      ) as _i25.Future<void>);
   @override
-  void addListener(_i26.VoidCallback? listener) => super.noSuchMethod(
+  void addListener(_i27.VoidCallback? listener) => super.noSuchMethod(
         Invocation.method(
           #addListener,
           [listener],
@@ -2260,7 +2307,7 @@ class MockNodeService extends _i1.Mock implements _i3.NodeService {
         returnValueForMissingStub: null,
       );
   @override
-  void removeListener(_i26.VoidCallback? listener) => super.noSuchMethod(
+  void removeListener(_i27.VoidCallback? listener) => super.noSuchMethod(
         Invocation.method(
           #removeListener,
           [listener],
@@ -2303,23 +2350,23 @@ class MockManager extends _i1.Mock implements _i6.Manager {
         returnValueForMissingStub: null,
       );
   @override
-  _i21.CoinServiceAPI get wallet => (super.noSuchMethod(
+  _i22.CoinServiceAPI get wallet => (super.noSuchMethod(
         Invocation.getter(#wallet),
-        returnValue: _FakeCoinServiceAPI_19(
+        returnValue: _FakeCoinServiceAPI_20(
           this,
           Invocation.getter(#wallet),
         ),
-      ) as _i21.CoinServiceAPI);
+      ) as _i22.CoinServiceAPI);
   @override
   bool get hasBackgroundRefreshListener => (super.noSuchMethod(
         Invocation.getter(#hasBackgroundRefreshListener),
         returnValue: false,
       ) as bool);
   @override
-  _i23.Coin get coin => (super.noSuchMethod(
+  _i24.Coin get coin => (super.noSuchMethod(
         Invocation.getter(#coin),
-        returnValue: _i23.Coin.bitcoin,
-      ) as _i23.Coin);
+        returnValue: _i24.Coin.bitcoin,
+      ) as _i24.Coin);
   @override
   bool get isRefreshing => (super.noSuchMethod(
         Invocation.getter(#isRefreshing),
@@ -2352,23 +2399,23 @@ class MockManager extends _i1.Mock implements _i6.Manager {
         returnValueForMissingStub: null,
       );
   @override
-  _i24.Future<_i10.FeeObject> get fees => (super.noSuchMethod(
+  _i25.Future<_i10.FeeObject> get fees => (super.noSuchMethod(
         Invocation.getter(#fees),
-        returnValue: _i24.Future<_i10.FeeObject>.value(_FakeFeeObject_7(
+        returnValue: _i25.Future<_i10.FeeObject>.value(_FakeFeeObject_7(
           this,
           Invocation.getter(#fees),
         )),
-      ) as _i24.Future<_i10.FeeObject>);
+      ) as _i25.Future<_i10.FeeObject>);
   @override
-  _i24.Future<int> get maxFee => (super.noSuchMethod(
+  _i25.Future<int> get maxFee => (super.noSuchMethod(
         Invocation.getter(#maxFee),
-        returnValue: _i24.Future<int>.value(0),
-      ) as _i24.Future<int>);
+        returnValue: _i25.Future<int>.value(0),
+      ) as _i25.Future<int>);
   @override
-  _i24.Future<String> get currentReceivingAddress => (super.noSuchMethod(
+  _i25.Future<String> get currentReceivingAddress => (super.noSuchMethod(
         Invocation.getter(#currentReceivingAddress),
-        returnValue: _i24.Future<String>.value(''),
-      ) as _i24.Future<String>);
+        returnValue: _i25.Future<String>.value(''),
+      ) as _i25.Future<String>);
   @override
   _i13.Balance get balance => (super.noSuchMethod(
         Invocation.getter(#balance),
@@ -2378,16 +2425,16 @@ class MockManager extends _i1.Mock implements _i6.Manager {
         ),
       ) as _i13.Balance);
   @override
-  _i24.Future<List<_i18.Transaction>> get transactions => (super.noSuchMethod(
+  _i25.Future<List<_i19.Transaction>> get transactions => (super.noSuchMethod(
         Invocation.getter(#transactions),
         returnValue:
-            _i24.Future<List<_i18.Transaction>>.value(<_i18.Transaction>[]),
-      ) as _i24.Future<List<_i18.Transaction>>);
+            _i25.Future<List<_i19.Transaction>>.value(<_i19.Transaction>[]),
+      ) as _i25.Future<List<_i19.Transaction>>);
   @override
-  _i24.Future<List<_i18.UTXO>> get utxos => (super.noSuchMethod(
+  _i25.Future<List<_i19.UTXO>> get utxos => (super.noSuchMethod(
         Invocation.getter(#utxos),
-        returnValue: _i24.Future<List<_i18.UTXO>>.value(<_i18.UTXO>[]),
-      ) as _i24.Future<List<_i18.UTXO>>);
+        returnValue: _i25.Future<List<_i19.UTXO>>.value(<_i19.UTXO>[]),
+      ) as _i25.Future<List<_i19.UTXO>>);
   @override
   set walletName(String? newName) => super.noSuchMethod(
         Invocation.setter(
@@ -2407,15 +2454,15 @@ class MockManager extends _i1.Mock implements _i6.Manager {
         returnValue: '',
       ) as String);
   @override
-  _i24.Future<List<String>> get mnemonic => (super.noSuchMethod(
+  _i25.Future<List<String>> get mnemonic => (super.noSuchMethod(
         Invocation.getter(#mnemonic),
-        returnValue: _i24.Future<List<String>>.value(<String>[]),
-      ) as _i24.Future<List<String>>);
+        returnValue: _i25.Future<List<String>>.value(<String>[]),
+      ) as _i25.Future<List<String>>);
   @override
-  _i24.Future<String?> get mnemonicPassphrase => (super.noSuchMethod(
+  _i25.Future<String?> get mnemonicPassphrase => (super.noSuchMethod(
         Invocation.getter(#mnemonicPassphrase),
-        returnValue: _i24.Future<String?>.value(),
-      ) as _i24.Future<String?>);
+        returnValue: _i25.Future<String?>.value(),
+      ) as _i25.Future<String?>);
   @override
   bool get isConnected => (super.noSuchMethod(
         Invocation.getter(#isConnected),
@@ -2452,6 +2499,11 @@ class MockManager extends _i1.Mock implements _i6.Manager {
         returnValue: false,
       ) as bool);
   @override
+  bool get hasFusionSupport => (super.noSuchMethod(
+        Invocation.getter(#hasFusionSupport),
+        returnValue: false,
+      ) as bool);
+  @override
   int get rescanOnOpenVersion => (super.noSuchMethod(
         Invocation.getter(#rescanOnOpenVersion),
         returnValue: 0,
@@ -2462,24 +2514,24 @@ class MockManager extends _i1.Mock implements _i6.Manager {
         returnValue: false,
       ) as bool);
   @override
-  _i24.Future<String> get xpub => (super.noSuchMethod(
+  _i25.Future<String> get xpub => (super.noSuchMethod(
         Invocation.getter(#xpub),
-        returnValue: _i24.Future<String>.value(''),
-      ) as _i24.Future<String>);
+        returnValue: _i25.Future<String>.value(''),
+      ) as _i25.Future<String>);
   @override
   bool get hasListeners => (super.noSuchMethod(
         Invocation.getter(#hasListeners),
         returnValue: false,
       ) as bool);
   @override
-  _i24.Future<void> updateNode(bool? shouldRefresh) => (super.noSuchMethod(
+  _i25.Future<void> updateNode(bool? shouldRefresh) => (super.noSuchMethod(
         Invocation.method(
           #updateNode,
           [shouldRefresh],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i25.Future<void>.value(),
+        returnValueForMissingStub: _i25.Future<void>.value(),
+      ) as _i25.Future<void>);
   @override
   void dispose() => super.noSuchMethod(
         Invocation.method(
@@ -2489,7 +2541,7 @@ class MockManager extends _i1.Mock implements _i6.Manager {
         returnValueForMissingStub: null,
       );
   @override
-  _i24.Future<Map<String, dynamic>> prepareSend({
+  _i25.Future<Map<String, dynamic>> prepareSend({
     required String? address,
     required _i15.Amount? amount,
     Map<String, dynamic>? args,
@@ -2505,27 +2557,27 @@ class MockManager extends _i1.Mock implements _i6.Manager {
           },
         ),
         returnValue:
-            _i24.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
-      ) as _i24.Future<Map<String, dynamic>>);
+            _i25.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
+      ) as _i25.Future<Map<String, dynamic>>);
   @override
-  _i24.Future<String> confirmSend({required Map<String, dynamic>? txData}) =>
+  _i25.Future<String> confirmSend({required Map<String, dynamic>? txData}) =>
       (super.noSuchMethod(
         Invocation.method(
           #confirmSend,
           [],
           {#txData: txData},
         ),
-        returnValue: _i24.Future<String>.value(''),
-      ) as _i24.Future<String>);
+        returnValue: _i25.Future<String>.value(''),
+      ) as _i25.Future<String>);
   @override
-  _i24.Future<void> refresh() => (super.noSuchMethod(
+  _i25.Future<void> refresh() => (super.noSuchMethod(
         Invocation.method(
           #refresh,
           [],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i25.Future<void>.value(),
+        returnValueForMissingStub: _i25.Future<void>.value(),
+      ) as _i25.Future<void>);
   @override
   bool validateAddress(String? address) => (super.noSuchMethod(
         Invocation.method(
@@ -2535,35 +2587,35 @@ class MockManager extends _i1.Mock implements _i6.Manager {
         returnValue: false,
       ) as bool);
   @override
-  _i24.Future<bool> testNetworkConnection() => (super.noSuchMethod(
+  _i25.Future<bool> testNetworkConnection() => (super.noSuchMethod(
         Invocation.method(
           #testNetworkConnection,
           [],
         ),
-        returnValue: _i24.Future<bool>.value(false),
-      ) as _i24.Future<bool>);
+        returnValue: _i25.Future<bool>.value(false),
+      ) as _i25.Future<bool>);
   @override
-  _i24.Future<void> initializeNew(
+  _i25.Future<void> initializeNew(
           ({String mnemonicPassphrase, int wordCount})? data) =>
       (super.noSuchMethod(
         Invocation.method(
           #initializeNew,
           [data],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i25.Future<void>.value(),
+        returnValueForMissingStub: _i25.Future<void>.value(),
+      ) as _i25.Future<void>);
   @override
-  _i24.Future<void> initializeExisting() => (super.noSuchMethod(
+  _i25.Future<void> initializeExisting() => (super.noSuchMethod(
         Invocation.method(
           #initializeExisting,
           [],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i25.Future<void>.value(),
+        returnValueForMissingStub: _i25.Future<void>.value(),
+      ) as _i25.Future<void>);
   @override
-  _i24.Future<void> recoverFromMnemonic({
+  _i25.Future<void> recoverFromMnemonic({
     required String? mnemonic,
     String? mnemonicPassphrase,
     required int? maxUnusedAddressGap,
@@ -2582,20 +2634,20 @@ class MockManager extends _i1.Mock implements _i6.Manager {
             #height: height,
           },
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i25.Future<void>.value(),
+        returnValueForMissingStub: _i25.Future<void>.value(),
+      ) as _i25.Future<void>);
   @override
-  _i24.Future<void> exitCurrentWallet() => (super.noSuchMethod(
+  _i25.Future<void> exitCurrentWallet() => (super.noSuchMethod(
         Invocation.method(
           #exitCurrentWallet,
           [],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i25.Future<void>.value(),
+        returnValueForMissingStub: _i25.Future<void>.value(),
+      ) as _i25.Future<void>);
   @override
-  _i24.Future<void> fullRescan(
+  _i25.Future<void> fullRescan(
     int? maxUnusedAddressGap,
     int? maxNumberOfIndexesToCheck,
   ) =>
@@ -2607,11 +2659,11 @@ class MockManager extends _i1.Mock implements _i6.Manager {
             maxNumberOfIndexesToCheck,
           ],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i25.Future<void>.value(),
+        returnValueForMissingStub: _i25.Future<void>.value(),
+      ) as _i25.Future<void>);
   @override
-  _i24.Future<_i15.Amount> estimateFeeFor(
+  _i25.Future<_i15.Amount> estimateFeeFor(
     _i15.Amount? amount,
     int? feeRate,
   ) =>
@@ -2623,7 +2675,7 @@ class MockManager extends _i1.Mock implements _i6.Manager {
             feeRate,
           ],
         ),
-        returnValue: _i24.Future<_i15.Amount>.value(_FakeAmount_13(
+        returnValue: _i25.Future<_i15.Amount>.value(_FakeAmount_13(
           this,
           Invocation.method(
             #estimateFeeFor,
@@ -2633,26 +2685,26 @@ class MockManager extends _i1.Mock implements _i6.Manager {
             ],
           ),
         )),
-      ) as _i24.Future<_i15.Amount>);
+      ) as _i25.Future<_i15.Amount>);
   @override
-  _i24.Future<bool> generateNewAddress() => (super.noSuchMethod(
+  _i25.Future<bool> generateNewAddress() => (super.noSuchMethod(
         Invocation.method(
           #generateNewAddress,
           [],
         ),
-        returnValue: _i24.Future<bool>.value(false),
-      ) as _i24.Future<bool>);
+        returnValue: _i25.Future<bool>.value(false),
+      ) as _i25.Future<bool>);
   @override
-  _i24.Future<void> resetRescanOnOpen() => (super.noSuchMethod(
+  _i25.Future<void> resetRescanOnOpen() => (super.noSuchMethod(
         Invocation.method(
           #resetRescanOnOpen,
           [],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i25.Future<void>.value(),
+        returnValueForMissingStub: _i25.Future<void>.value(),
+      ) as _i25.Future<void>);
   @override
-  void addListener(_i26.VoidCallback? listener) => super.noSuchMethod(
+  void addListener(_i27.VoidCallback? listener) => super.noSuchMethod(
         Invocation.method(
           #addListener,
           [listener],
@@ -2660,7 +2712,7 @@ class MockManager extends _i1.Mock implements _i6.Manager {
         returnValueForMissingStub: null,
       );
   @override
-  void removeListener(_i26.VoidCallback? listener) => super.noSuchMethod(
+  void removeListener(_i27.VoidCallback? listener) => super.noSuchMethod(
         Invocation.method(
           #removeListener,
           [listener],
@@ -2680,7 +2732,7 @@ class MockManager extends _i1.Mock implements _i6.Manager {
 /// A class which mocks [CoinServiceAPI].
 ///
 /// See the documentation for Mockito's code generation for more information.
-class MockCoinServiceAPI extends _i1.Mock implements _i21.CoinServiceAPI {
+class MockCoinServiceAPI extends _i1.Mock implements _i22.CoinServiceAPI {
   @override
   set onIsActiveWalletChanged(void Function(bool)? _onIsActiveWalletChanged) =>
       super.noSuchMethod(
@@ -2691,10 +2743,10 @@ class MockCoinServiceAPI extends _i1.Mock implements _i21.CoinServiceAPI {
         returnValueForMissingStub: null,
       );
   @override
-  _i23.Coin get coin => (super.noSuchMethod(
+  _i24.Coin get coin => (super.noSuchMethod(
         Invocation.getter(#coin),
-        returnValue: _i23.Coin.bitcoin,
-      ) as _i23.Coin);
+        returnValue: _i24.Coin.bitcoin,
+      ) as _i24.Coin);
   @override
   bool get isRefreshing => (super.noSuchMethod(
         Invocation.getter(#isRefreshing),
@@ -2727,23 +2779,23 @@ class MockCoinServiceAPI extends _i1.Mock implements _i21.CoinServiceAPI {
         returnValueForMissingStub: null,
       );
   @override
-  _i24.Future<_i10.FeeObject> get fees => (super.noSuchMethod(
+  _i25.Future<_i10.FeeObject> get fees => (super.noSuchMethod(
         Invocation.getter(#fees),
-        returnValue: _i24.Future<_i10.FeeObject>.value(_FakeFeeObject_7(
+        returnValue: _i25.Future<_i10.FeeObject>.value(_FakeFeeObject_7(
           this,
           Invocation.getter(#fees),
         )),
-      ) as _i24.Future<_i10.FeeObject>);
+      ) as _i25.Future<_i10.FeeObject>);
   @override
-  _i24.Future<int> get maxFee => (super.noSuchMethod(
+  _i25.Future<int> get maxFee => (super.noSuchMethod(
         Invocation.getter(#maxFee),
-        returnValue: _i24.Future<int>.value(0),
-      ) as _i24.Future<int>);
+        returnValue: _i25.Future<int>.value(0),
+      ) as _i25.Future<int>);
   @override
-  _i24.Future<String> get currentReceivingAddress => (super.noSuchMethod(
+  _i25.Future<String> get currentReceivingAddress => (super.noSuchMethod(
         Invocation.getter(#currentReceivingAddress),
-        returnValue: _i24.Future<String>.value(''),
-      ) as _i24.Future<String>);
+        returnValue: _i25.Future<String>.value(''),
+      ) as _i25.Future<String>);
   @override
   _i13.Balance get balance => (super.noSuchMethod(
         Invocation.getter(#balance),
@@ -2753,16 +2805,16 @@ class MockCoinServiceAPI extends _i1.Mock implements _i21.CoinServiceAPI {
         ),
       ) as _i13.Balance);
   @override
-  _i24.Future<List<_i18.Transaction>> get transactions => (super.noSuchMethod(
+  _i25.Future<List<_i19.Transaction>> get transactions => (super.noSuchMethod(
         Invocation.getter(#transactions),
         returnValue:
-            _i24.Future<List<_i18.Transaction>>.value(<_i18.Transaction>[]),
-      ) as _i24.Future<List<_i18.Transaction>>);
+            _i25.Future<List<_i19.Transaction>>.value(<_i19.Transaction>[]),
+      ) as _i25.Future<List<_i19.Transaction>>);
   @override
-  _i24.Future<List<_i18.UTXO>> get utxos => (super.noSuchMethod(
+  _i25.Future<List<_i19.UTXO>> get utxos => (super.noSuchMethod(
         Invocation.getter(#utxos),
-        returnValue: _i24.Future<List<_i18.UTXO>>.value(<_i18.UTXO>[]),
-      ) as _i24.Future<List<_i18.UTXO>>);
+        returnValue: _i25.Future<List<_i19.UTXO>>.value(<_i19.UTXO>[]),
+      ) as _i25.Future<List<_i19.UTXO>>);
   @override
   set walletName(String? newName) => super.noSuchMethod(
         Invocation.setter(
@@ -2782,20 +2834,20 @@ class MockCoinServiceAPI extends _i1.Mock implements _i21.CoinServiceAPI {
         returnValue: '',
       ) as String);
   @override
-  _i24.Future<List<String>> get mnemonic => (super.noSuchMethod(
+  _i25.Future<List<String>> get mnemonic => (super.noSuchMethod(
         Invocation.getter(#mnemonic),
-        returnValue: _i24.Future<List<String>>.value(<String>[]),
-      ) as _i24.Future<List<String>>);
+        returnValue: _i25.Future<List<String>>.value(<String>[]),
+      ) as _i25.Future<List<String>>);
   @override
-  _i24.Future<String?> get mnemonicString => (super.noSuchMethod(
+  _i25.Future<String?> get mnemonicString => (super.noSuchMethod(
         Invocation.getter(#mnemonicString),
-        returnValue: _i24.Future<String?>.value(),
-      ) as _i24.Future<String?>);
+        returnValue: _i25.Future<String?>.value(),
+      ) as _i25.Future<String?>);
   @override
-  _i24.Future<String?> get mnemonicPassphrase => (super.noSuchMethod(
+  _i25.Future<String?> get mnemonicPassphrase => (super.noSuchMethod(
         Invocation.getter(#mnemonicPassphrase),
-        returnValue: _i24.Future<String?>.value(),
-      ) as _i24.Future<String?>);
+        returnValue: _i25.Future<String?>.value(),
+      ) as _i25.Future<String?>);
   @override
   bool get hasCalledExit => (super.noSuchMethod(
         Invocation.getter(#hasCalledExit),
@@ -2812,7 +2864,7 @@ class MockCoinServiceAPI extends _i1.Mock implements _i21.CoinServiceAPI {
         returnValue: 0,
       ) as int);
   @override
-  _i24.Future<Map<String, dynamic>> prepareSend({
+  _i25.Future<Map<String, dynamic>> prepareSend({
     required String? address,
     required _i15.Amount? amount,
     Map<String, dynamic>? args,
@@ -2828,36 +2880,36 @@ class MockCoinServiceAPI extends _i1.Mock implements _i21.CoinServiceAPI {
           },
         ),
         returnValue:
-            _i24.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
-      ) as _i24.Future<Map<String, dynamic>>);
+            _i25.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
+      ) as _i25.Future<Map<String, dynamic>>);
   @override
-  _i24.Future<String> confirmSend({required Map<String, dynamic>? txData}) =>
+  _i25.Future<String> confirmSend({required Map<String, dynamic>? txData}) =>
       (super.noSuchMethod(
         Invocation.method(
           #confirmSend,
           [],
           {#txData: txData},
         ),
-        returnValue: _i24.Future<String>.value(''),
-      ) as _i24.Future<String>);
+        returnValue: _i25.Future<String>.value(''),
+      ) as _i25.Future<String>);
   @override
-  _i24.Future<void> refresh() => (super.noSuchMethod(
+  _i25.Future<void> refresh() => (super.noSuchMethod(
         Invocation.method(
           #refresh,
           [],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i25.Future<void>.value(),
+        returnValueForMissingStub: _i25.Future<void>.value(),
+      ) as _i25.Future<void>);
   @override
-  _i24.Future<void> updateNode(bool? shouldRefresh) => (super.noSuchMethod(
+  _i25.Future<void> updateNode(bool? shouldRefresh) => (super.noSuchMethod(
         Invocation.method(
           #updateNode,
           [shouldRefresh],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i25.Future<void>.value(),
+        returnValueForMissingStub: _i25.Future<void>.value(),
+      ) as _i25.Future<void>);
   @override
   bool validateAddress(String? address) => (super.noSuchMethod(
         Invocation.method(
@@ -2867,15 +2919,15 @@ class MockCoinServiceAPI extends _i1.Mock implements _i21.CoinServiceAPI {
         returnValue: false,
       ) as bool);
   @override
-  _i24.Future<bool> testNetworkConnection() => (super.noSuchMethod(
+  _i25.Future<bool> testNetworkConnection() => (super.noSuchMethod(
         Invocation.method(
           #testNetworkConnection,
           [],
         ),
-        returnValue: _i24.Future<bool>.value(false),
-      ) as _i24.Future<bool>);
+        returnValue: _i25.Future<bool>.value(false),
+      ) as _i25.Future<bool>);
   @override
-  _i24.Future<void> recoverFromMnemonic({
+  _i25.Future<void> recoverFromMnemonic({
     required String? mnemonic,
     String? mnemonicPassphrase,
     required int? maxUnusedAddressGap,
@@ -2894,40 +2946,40 @@ class MockCoinServiceAPI extends _i1.Mock implements _i21.CoinServiceAPI {
             #height: height,
           },
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i25.Future<void>.value(),
+        returnValueForMissingStub: _i25.Future<void>.value(),
+      ) as _i25.Future<void>);
   @override
-  _i24.Future<void> initializeNew(
+  _i25.Future<void> initializeNew(
           ({String mnemonicPassphrase, int wordCount})? data) =>
       (super.noSuchMethod(
         Invocation.method(
           #initializeNew,
           [data],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i25.Future<void>.value(),
+        returnValueForMissingStub: _i25.Future<void>.value(),
+      ) as _i25.Future<void>);
   @override
-  _i24.Future<void> initializeExisting() => (super.noSuchMethod(
+  _i25.Future<void> initializeExisting() => (super.noSuchMethod(
         Invocation.method(
           #initializeExisting,
           [],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i25.Future<void>.value(),
+        returnValueForMissingStub: _i25.Future<void>.value(),
+      ) as _i25.Future<void>);
   @override
-  _i24.Future<void> exit() => (super.noSuchMethod(
+  _i25.Future<void> exit() => (super.noSuchMethod(
         Invocation.method(
           #exit,
           [],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i25.Future<void>.value(),
+        returnValueForMissingStub: _i25.Future<void>.value(),
+      ) as _i25.Future<void>);
   @override
-  _i24.Future<void> fullRescan(
+  _i25.Future<void> fullRescan(
     int? maxUnusedAddressGap,
     int? maxNumberOfIndexesToCheck,
   ) =>
@@ -2939,11 +2991,11 @@ class MockCoinServiceAPI extends _i1.Mock implements _i21.CoinServiceAPI {
             maxNumberOfIndexesToCheck,
           ],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i25.Future<void>.value(),
+        returnValueForMissingStub: _i25.Future<void>.value(),
+      ) as _i25.Future<void>);
   @override
-  _i24.Future<_i15.Amount> estimateFeeFor(
+  _i25.Future<_i15.Amount> estimateFeeFor(
     _i15.Amount? amount,
     int? feeRate,
   ) =>
@@ -2955,7 +3007,7 @@ class MockCoinServiceAPI extends _i1.Mock implements _i21.CoinServiceAPI {
             feeRate,
           ],
         ),
-        returnValue: _i24.Future<_i15.Amount>.value(_FakeAmount_13(
+        returnValue: _i25.Future<_i15.Amount>.value(_FakeAmount_13(
           this,
           Invocation.method(
             #estimateFeeFor,
@@ -2965,23 +3017,23 @@ class MockCoinServiceAPI extends _i1.Mock implements _i21.CoinServiceAPI {
             ],
           ),
         )),
-      ) as _i24.Future<_i15.Amount>);
+      ) as _i25.Future<_i15.Amount>);
   @override
-  _i24.Future<bool> generateNewAddress() => (super.noSuchMethod(
+  _i25.Future<bool> generateNewAddress() => (super.noSuchMethod(
         Invocation.method(
           #generateNewAddress,
           [],
         ),
-        returnValue: _i24.Future<bool>.value(false),
-      ) as _i24.Future<bool>);
+        returnValue: _i25.Future<bool>.value(false),
+      ) as _i25.Future<bool>);
   @override
-  _i24.Future<void> updateSentCachedTxData(Map<String, dynamic>? txData) =>
+  _i25.Future<void> updateSentCachedTxData(Map<String, dynamic>? txData) =>
       (super.noSuchMethod(
         Invocation.method(
           #updateSentCachedTxData,
           [txData],
         ),
-        returnValue: _i24.Future<void>.value(),
-        returnValueForMissingStub: _i24.Future<void>.value(),
-      ) as _i24.Future<void>);
+        returnValue: _i25.Future<void>.value(),
+        returnValueForMissingStub: _i25.Future<void>.value(),
+      ) as _i25.Future<void>);
 }